Repository: latentcat/graphpu Branch: master Commit: d5a77c6dc545 Files: 527 Total size: 8.3 MB Directory structure: gitextract_tbwiaigk/ ├── .gitignore ├── Cargo.toml ├── README.md ├── build.rs ├── examples/ │ ├── dataset/ │ │ ├── email_data_edge.csv │ │ ├── small_data_edge.csv │ │ ├── small_data_edge_raw.csv │ │ ├── test_data_edge.csv │ │ ├── test_data_edge_single.csv │ │ ├── test_data_node.csv │ │ └── test_data_node_very_very_long_name.csv │ └── test_file.rs ├── lib/ │ └── naga/ │ ├── .github/ │ │ └── workflows/ │ │ ├── lazy.yml │ │ ├── pipeline.yml │ │ ├── validation-linux.yml │ │ ├── validation-macos.yml │ │ └── validation-windows.yml │ ├── .gitignore │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── Makefile │ ├── README.md │ ├── aa.metal │ ├── benches/ │ │ └── criterion.rs │ ├── cli/ │ │ ├── Cargo.toml │ │ └── src/ │ │ └── main.rs │ ├── debug/ │ │ ├── CS_boids.metal │ │ ├── CS_boids.spv │ │ ├── CS_boids.wgsl │ │ ├── atomic.metal │ │ ├── atomic.spv │ │ ├── atomic.spvasm │ │ └── atomic.wgsl │ ├── fuzz/ │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ └── fuzz_targets/ │ │ ├── glsl_parser.rs │ │ ├── ir.rs │ │ ├── spv_parser.rs │ │ └── wgsl_parser.rs │ ├── src/ │ │ ├── arena.rs │ │ ├── back/ │ │ │ ├── dot/ │ │ │ │ └── mod.rs │ │ │ ├── glsl/ │ │ │ │ ├── features.rs │ │ │ │ ├── keywords.rs │ │ │ │ └── mod.rs │ │ │ ├── hlsl/ │ │ │ │ ├── conv.rs │ │ │ │ ├── help.rs │ │ │ │ ├── keywords.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── storage.rs │ │ │ │ └── writer.rs │ │ │ ├── mod.rs │ │ │ ├── msl/ │ │ │ │ ├── keywords.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── sampler.rs │ │ │ │ └── writer.rs │ │ │ ├── spv/ │ │ │ │ ├── block.rs │ │ │ │ ├── helpers.rs │ │ │ │ ├── image.rs │ │ │ │ ├── index.rs │ │ │ │ ├── instructions.rs │ │ │ │ ├── layout.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── recyclable.rs │ │ │ │ ├── selection.rs │ │ │ │ └── writer.rs │ │ │ └── wgsl/ │ │ │ ├── mod.rs │ │ │ └── writer.rs │ │ ├── block.rs │ │ ├── front/ │ │ │ ├── glsl/ │ │ │ │ ├── ast.rs │ │ │ │ ├── builtins.rs │ │ │ │ ├── constants.rs │ │ │ │ ├── context.rs │ │ │ │ ├── error.rs │ │ │ │ ├── functions.rs │ │ │ │ ├── lex.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── offset.rs │ │ │ │ ├── parser/ │ │ │ │ │ ├── declarations.rs │ │ │ │ │ ├── expressions.rs │ │ │ │ │ ├── functions.rs │ │ │ │ │ └── types.rs │ │ │ │ ├── parser.rs │ │ │ │ ├── parser_tests.rs │ │ │ │ ├── token.rs │ │ │ │ ├── types.rs │ │ │ │ └── variables.rs │ │ │ ├── interpolator.rs │ │ │ ├── mod.rs │ │ │ ├── spv/ │ │ │ │ ├── convert.rs │ │ │ │ ├── error.rs │ │ │ │ ├── function.rs │ │ │ │ ├── image.rs │ │ │ │ ├── mod.rs │ │ │ │ └── null.rs │ │ │ └── wgsl/ │ │ │ ├── construction.rs │ │ │ ├── conv.rs │ │ │ ├── lexer.rs │ │ │ ├── mod.rs │ │ │ ├── number.rs │ │ │ └── tests.rs │ │ ├── keywords/ │ │ │ ├── mod.rs │ │ │ └── wgsl.rs │ │ ├── lib.rs │ │ ├── proc/ │ │ │ ├── index.rs │ │ │ ├── layouter.rs │ │ │ ├── mod.rs │ │ │ ├── namer.rs │ │ │ ├── terminator.rs │ │ │ └── typifier.rs │ │ ├── span.rs │ │ └── valid/ │ │ ├── analyzer.rs │ │ ├── compose.rs │ │ ├── expression.rs │ │ ├── function.rs │ │ ├── interface.rs │ │ ├── mod.rs │ │ └── type.rs │ └── tests/ │ ├── in/ │ │ ├── access.param.ron │ │ ├── access.wgsl │ │ ├── binding-arrays.param.ron │ │ ├── binding-arrays.wgsl │ │ ├── bitcast.params.ron │ │ ├── bitcast.wgsl │ │ ├── bits.param.ron │ │ ├── bits.wgsl │ │ ├── boids.param.ron │ │ ├── boids.wgsl │ │ ├── bounds-check-image-restrict.param.ron │ │ ├── bounds-check-image-restrict.wgsl │ │ ├── bounds-check-image-rzsw.param.ron │ │ ├── bounds-check-image-rzsw.wgsl │ │ ├── bounds-check-restrict.param.ron │ │ ├── bounds-check-restrict.wgsl │ │ ├── bounds-check-zero-atomic.param.ron │ │ ├── bounds-check-zero-atomic.wgsl │ │ ├── bounds-check-zero.param.ron │ │ ├── bounds-check-zero.wgsl │ │ ├── break-if.wgsl │ │ ├── collatz.param.ron │ │ ├── collatz.wgsl │ │ ├── control-flow.param.ron │ │ ├── control-flow.wgsl │ │ ├── cubeArrayShadow.wgsl │ │ ├── empty.param.ron │ │ ├── empty.wgsl │ │ ├── extra.param.ron │ │ ├── extra.wgsl │ │ ├── functions-webgl.param.ron │ │ ├── functions-webgl.wgsl │ │ ├── functions.param.ron │ │ ├── functions.wgsl │ │ ├── globals.param.ron │ │ ├── globals.wgsl │ │ ├── glsl/ │ │ │ ├── 210-bevy-2d-shader.frag │ │ │ ├── 210-bevy-2d-shader.vert │ │ │ ├── 210-bevy-shader.vert │ │ │ ├── 246-collatz.comp │ │ │ ├── 277-casting.vert │ │ │ ├── 280-matrix-cast.vert │ │ │ ├── 484-preprocessor-if.vert │ │ │ ├── 800-out-of-bounds-panic.vert │ │ │ ├── 896-push-constant.vert │ │ │ ├── 900-implicit-conversions.vert │ │ │ ├── 901-lhs-field-select.vert │ │ │ ├── 931-constant-emitting.vert │ │ │ ├── 932-for-loop-if.vert │ │ │ ├── bevy-pbr.frag │ │ │ ├── bevy-pbr.vert │ │ │ ├── bits_glsl.frag │ │ │ ├── bool-select.frag │ │ │ ├── buffer.frag │ │ │ ├── clamp-splat.vert │ │ │ ├── constant-array-size.vert │ │ │ ├── declarations.vert │ │ │ ├── expressions.frag │ │ │ ├── fma.frag │ │ │ ├── global-constant-array.vert │ │ │ ├── images.frag │ │ │ ├── long-form-matrix.vert │ │ │ ├── math-functions.vert │ │ │ ├── prepostfix.frag │ │ │ ├── quad_glsl.frag │ │ │ ├── quad_glsl.vert │ │ │ ├── sampler-functions.frag │ │ │ ├── samplers.frag │ │ │ ├── statements.frag │ │ │ └── swizzle_write.frag │ │ ├── image.param.ron │ │ ├── image.wgsl │ │ ├── interface.param.ron │ │ ├── interface.wgsl │ │ ├── interpolate.param.ron │ │ ├── interpolate.wgsl │ │ ├── lexical-scopes.wgsl │ │ ├── math-functions.param.ron │ │ ├── math-functions.wgsl │ │ ├── multiview.param.ron │ │ ├── multiview.wgsl │ │ ├── multiview_webgl.param.ron │ │ ├── multiview_webgl.wgsl │ │ ├── operators.param.ron │ │ ├── operators.wgsl │ │ ├── padding.param.ron │ │ ├── padding.wgsl │ │ ├── pointers.param.ron │ │ ├── pointers.wgsl │ │ ├── policy-mix.param.ron │ │ ├── policy-mix.wgsl │ │ ├── push-constants.param.ron │ │ ├── push-constants.wgsl │ │ ├── quad.param.ron │ │ ├── quad.wgsl │ │ ├── shadow.param.ron │ │ ├── shadow.wgsl │ │ ├── skybox.param.ron │ │ ├── skybox.wgsl │ │ ├── spv/ │ │ │ ├── degrees.spv │ │ │ ├── empty-global-name.spv │ │ │ ├── empty-global-name.spvasm │ │ │ ├── inv-hyperbolic-trig-functions.spv │ │ │ ├── quad-vert.spv │ │ │ └── shadow.spv │ │ ├── standard.param.ron │ │ ├── standard.wgsl │ │ ├── texture-arg.param.ron │ │ ├── texture-arg.wgsl │ │ └── variations.glsl │ ├── out/ │ │ ├── analysis/ │ │ │ ├── collatz.info.ron │ │ │ └── shadow.info.ron │ │ ├── dot/ │ │ │ └── quad.dot │ │ ├── glsl/ │ │ │ ├── access.assign_through_ptr.Compute.glsl │ │ │ ├── access.atomics.Compute.glsl │ │ │ ├── access.foo_frag.Fragment.glsl │ │ │ ├── access.foo_vert.Vertex.glsl │ │ │ ├── bitcast.main.Compute.glsl │ │ │ ├── bits.main.Compute.glsl │ │ │ ├── boids.main.Compute.glsl │ │ │ ├── bounds-check-image-restrict.fragment_shader.Fragment.glsl │ │ │ ├── bounds-check-image-rzsw.fragment_shader.Fragment.glsl │ │ │ ├── break-if.main.Compute.glsl │ │ │ ├── control-flow.main.Compute.glsl │ │ │ ├── cubeArrayShadow.fragment.Fragment.glsl │ │ │ ├── empty.main.Compute.glsl │ │ │ ├── functions-webgl.main.Vertex.glsl │ │ │ ├── functions.main.Compute.glsl │ │ │ ├── globals.main.Compute.glsl │ │ │ ├── image.gather.Fragment.glsl │ │ │ ├── image.main.Compute.glsl │ │ │ ├── image.queries.Vertex.glsl │ │ │ ├── image.texture_sample.Fragment.glsl │ │ │ ├── image.texture_sample_comparison.Fragment.glsl │ │ │ ├── interpolate.frag_main.Fragment.glsl │ │ │ ├── interpolate.vert_main.Vertex.glsl │ │ │ ├── math-functions.main.Vertex.glsl │ │ │ ├── multiview.main.Vertex.glsl │ │ │ ├── multiview_webgl.main.Vertex.glsl │ │ │ ├── operators.main.Compute.glsl │ │ │ ├── padding.vertex.Vertex.glsl │ │ │ ├── push-constants.main.Fragment.glsl │ │ │ ├── push-constants.vert_main.Vertex.glsl │ │ │ ├── quad-vert.main.Vertex.glsl │ │ │ ├── quad.frag_main.Fragment.glsl │ │ │ ├── quad.fs_extra.Fragment.glsl │ │ │ ├── quad.main.Fragment.glsl │ │ │ ├── quad.main.Vertex.glsl │ │ │ ├── quad.vert_main.Vertex.glsl │ │ │ ├── shadow.fs_main.Fragment.glsl │ │ │ ├── shadow.fs_main_without_storage.Fragment.glsl │ │ │ ├── shadow.vs_main.Vertex.glsl │ │ │ ├── skybox.fs_main.Fragment.glsl │ │ │ ├── skybox.vs_main.Vertex.glsl │ │ │ ├── standard.derivatives.Fragment.glsl │ │ │ ├── texture-arg.main.Fragment.glsl │ │ │ └── variations-glsl.main.Fragment.glsl │ │ ├── hlsl/ │ │ │ ├── access.hlsl │ │ │ ├── access.hlsl.config │ │ │ ├── binding-arrays.hlsl │ │ │ ├── binding-arrays.hlsl.config │ │ │ ├── boids.hlsl │ │ │ ├── boids.hlsl.config │ │ │ ├── break-if.hlsl │ │ │ ├── break-if.hlsl.config │ │ │ ├── collatz.hlsl │ │ │ ├── collatz.hlsl.config │ │ │ ├── control-flow.hlsl │ │ │ ├── control-flow.hlsl.config │ │ │ ├── empty-global-name.hlsl │ │ │ ├── empty-global-name.hlsl.config │ │ │ ├── empty.hlsl │ │ │ ├── empty.hlsl.config │ │ │ ├── functions.hlsl │ │ │ ├── functions.hlsl.config │ │ │ ├── globals.hlsl │ │ │ ├── globals.hlsl.config │ │ │ ├── image.hlsl │ │ │ ├── image.hlsl.config │ │ │ ├── interface.hlsl │ │ │ ├── interface.hlsl.config │ │ │ ├── interpolate.hlsl │ │ │ ├── interpolate.hlsl.config │ │ │ ├── inv-hyperbolic-trig-functions.hlsl │ │ │ ├── inv-hyperbolic-trig-functions.hlsl.config │ │ │ ├── math-functions.hlsl │ │ │ ├── math-functions.hlsl.config │ │ │ ├── operators.hlsl │ │ │ ├── operators.hlsl.config │ │ │ ├── padding.hlsl │ │ │ ├── padding.hlsl.config │ │ │ ├── push-constants.hlsl │ │ │ ├── push-constants.hlsl.config │ │ │ ├── quad-vert.hlsl │ │ │ ├── quad-vert.hlsl.config │ │ │ ├── quad.hlsl │ │ │ ├── quad.hlsl.config │ │ │ ├── shadow.hlsl │ │ │ ├── shadow.hlsl.config │ │ │ ├── skybox.hlsl │ │ │ ├── skybox.hlsl.config │ │ │ ├── standard.hlsl │ │ │ ├── standard.hlsl.config │ │ │ ├── texture-arg.hlsl │ │ │ └── texture-arg.hlsl.config │ │ ├── ir/ │ │ │ ├── collatz.ron │ │ │ └── shadow.ron │ │ ├── msl/ │ │ │ ├── access.msl │ │ │ ├── binding-arrays.msl │ │ │ ├── bitcast.msl │ │ │ ├── bits.msl │ │ │ ├── boids.msl │ │ │ ├── bounds-check-image-restrict.msl │ │ │ ├── bounds-check-image-rzsw.msl │ │ │ ├── bounds-check-restrict.msl │ │ │ ├── bounds-check-zero-atomic.msl │ │ │ ├── bounds-check-zero.msl │ │ │ ├── break-if.msl │ │ │ ├── collatz.msl │ │ │ ├── control-flow.msl │ │ │ ├── empty-global-name.msl │ │ │ ├── empty.msl │ │ │ ├── extra.msl │ │ │ ├── functions.msl │ │ │ ├── globals.msl │ │ │ ├── image.msl │ │ │ ├── interface.msl │ │ │ ├── interpolate.msl │ │ │ ├── math-functions.msl │ │ │ ├── operators.msl │ │ │ ├── padding.msl │ │ │ ├── policy-mix.msl │ │ │ ├── quad-vert.msl │ │ │ ├── quad.msl │ │ │ ├── shadow.msl │ │ │ ├── skybox.msl │ │ │ ├── standard.msl │ │ │ └── texture-arg.msl │ │ ├── spv/ │ │ │ ├── access.spvasm │ │ │ ├── binding-arrays.spvasm │ │ │ ├── bitcast.spvasm │ │ │ ├── bits.spvasm │ │ │ ├── boids.spvasm │ │ │ ├── bounds-check-image-restrict.spvasm │ │ │ ├── bounds-check-image-rzsw.spvasm │ │ │ ├── bounds-check-restrict.spvasm │ │ │ ├── bounds-check-zero.spvasm │ │ │ ├── break-if.spvasm │ │ │ ├── collatz.spvasm │ │ │ ├── control-flow.spvasm │ │ │ ├── empty.spvasm │ │ │ ├── extra.spvasm │ │ │ ├── functions.spvasm │ │ │ ├── globals.spvasm │ │ │ ├── image.spvasm │ │ │ ├── interface.compute.spvasm │ │ │ ├── interface.fragment.spvasm │ │ │ ├── interface.vertex.spvasm │ │ │ ├── interface.vertex_two_structs.spvasm │ │ │ ├── interpolate.spvasm │ │ │ ├── math-functions.spvasm │ │ │ ├── multiview.spvasm │ │ │ ├── operators.spvasm │ │ │ ├── padding.spvasm │ │ │ ├── pointer-access.spvasm │ │ │ ├── pointers.spvasm │ │ │ ├── policy-mix.spvasm │ │ │ ├── quad.spvasm │ │ │ ├── shadow.spvasm │ │ │ ├── skybox.spvasm │ │ │ ├── standard.spvasm │ │ │ └── texture-arg.spvasm │ │ └── wgsl/ │ │ ├── 210-bevy-2d-shader-frag.wgsl │ │ ├── 210-bevy-2d-shader-vert.wgsl │ │ ├── 210-bevy-shader-vert.wgsl │ │ ├── 246-collatz-comp.wgsl │ │ ├── 277-casting-vert.wgsl │ │ ├── 280-matrix-cast-vert.wgsl │ │ ├── 484-preprocessor-if-vert.wgsl │ │ ├── 800-out-of-bounds-panic-vert.wgsl │ │ ├── 896-push-constant-vert.wgsl │ │ ├── 900-implicit-conversions-vert.wgsl │ │ ├── 901-lhs-field-select-vert.wgsl │ │ ├── 931-constant-emitting-vert.wgsl │ │ ├── 932-for-loop-if-vert.wgsl │ │ ├── access.wgsl │ │ ├── bevy-pbr-frag.wgsl │ │ ├── bevy-pbr-vert.wgsl │ │ ├── binding-arrays.wgsl │ │ ├── binop-frag.wgsl │ │ ├── bitcast.wgsl │ │ ├── bits.wgsl │ │ ├── bits_glsl-frag.wgsl │ │ ├── boids.wgsl │ │ ├── bool-select-frag.wgsl │ │ ├── break-if.wgsl │ │ ├── buffer-frag.wgsl │ │ ├── clamp-splat-vert.wgsl │ │ ├── collatz.wgsl │ │ ├── constant-array-size-vert.wgsl │ │ ├── control-flow.wgsl │ │ ├── declarations-vert.wgsl │ │ ├── empty-global-name.wgsl │ │ ├── empty.wgsl │ │ ├── expressions-frag.wgsl │ │ ├── extra.wgsl │ │ ├── fma-frag.wgsl │ │ ├── functions.wgsl │ │ ├── global-constant-array-vert.wgsl │ │ ├── globals.wgsl │ │ ├── image.wgsl │ │ ├── images-frag.wgsl │ │ ├── interface.wgsl │ │ ├── interpolate.wgsl │ │ ├── inv-hyperbolic-trig-functions.wgsl │ │ ├── lexical-scopes.wgsl │ │ ├── long-form-matrix-vert.wgsl │ │ ├── math-functions-vert.wgsl │ │ ├── math-functions.wgsl │ │ ├── multiview.wgsl │ │ ├── operators.wgsl │ │ ├── padding.wgsl │ │ ├── pointers.wgsl │ │ ├── prepostfix-frag.wgsl │ │ ├── quad-vert.wgsl │ │ ├── quad.wgsl │ │ ├── quad_glsl-frag.wgsl │ │ ├── quad_glsl-vert.wgsl │ │ ├── sampler-functions-frag.wgsl │ │ ├── samplers-frag.wgsl │ │ ├── shadow.wgsl │ │ ├── skybox.wgsl │ │ ├── standard.wgsl │ │ ├── statements-frag.wgsl │ │ ├── swizzle_write-frag.wgsl │ │ └── texture-arg.wgsl │ ├── snapshots.rs │ ├── spirv-capabilities.rs │ └── wgsl-errors.rs ├── resources/ │ ├── Info.plist │ └── app.icns ├── scripts/ │ ├── create-dmg-1.1.0/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .this-is-the-create-dmg-repo │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── builder/ │ │ │ └── create-dmg.builder │ │ ├── create-dmg │ │ ├── doc-project/ │ │ │ ├── Developer Notes.md │ │ │ └── Release Checklist.md │ │ ├── examples/ │ │ │ └── 01-main-example/ │ │ │ ├── sample │ │ │ └── source_folder/ │ │ │ └── Application.app │ │ ├── support/ │ │ │ ├── eula-resources-template.xml │ │ │ └── template.applescript │ │ └── tests/ │ │ └── 007-space-in-dir-name/ │ │ ├── my files/ │ │ │ └── hello.txt │ │ └── run-test │ ├── macos_build.sh │ ├── macos_build_entry.sh │ ├── macos_cross_compile.sh │ ├── macos_launch.sh │ └── windows_build.sh └── src/ ├── app.rs ├── assets/ │ └── shaders/ │ ├── CS_graph_solver.wgsl │ ├── S_axis.wgsl │ ├── S_bounding_box.wgsl │ ├── S_edge.wgsl │ └── S_node.wgsl ├── bootstrap.rs ├── components/ │ ├── detail_view.rs │ ├── dock_view.rs │ ├── drawer_view.rs │ ├── drawers/ │ │ ├── kernel_view.rs │ │ ├── message_view.rs │ │ └── mod.rs │ ├── export_modal_view.rs │ ├── graphics_view.rs │ ├── import_modal_view/ │ │ ├── config_page.rs │ │ └── file_picker_page.rs │ ├── import_modal_view.rs │ ├── inspector_view.rs │ ├── menubar_view.rs │ ├── mod.rs │ ├── shortcuts.rs │ └── table_view.rs ├── lib.rs ├── main.rs ├── models/ │ ├── app_model.rs │ ├── data_model.rs │ ├── graphics_lib/ │ │ ├── bind_group_layout.rs │ │ ├── buffer_dimensions.rs │ │ ├── camera.rs │ │ ├── camera_controls.rs │ │ ├── compute_shader.rs │ │ ├── mod.rs │ │ ├── render_pipeline.rs │ │ ├── texture.rs │ │ └── unifrom.rs │ ├── graphics_model.rs │ └── mod.rs ├── utils/ │ ├── constant.rs │ ├── csv_loader.rs │ ├── file.rs │ ├── message.rs │ └── mod.rs └── widgets/ ├── frames.rs ├── mod.rs └── modal.rs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /target /.idea /.vscode .DS_Store # /lib /macos_build /windows_build ================================================ FILE: Cargo.toml ================================================ [package] name = "graphpu" version = "0.5.0" authors = ["Troy Ni <1272777550@qq.com>", "CPunisher <1343316114@qq.com>"] edition = "2021" description = "Next-Gen 3D GPU Graph-Vis App" documentation = "https://docs.graphpu.com/" readme = "README.md" homepage = "https://graphpu.com/" repository = "https://github.com/TO_BE_PUBLISHED" license-file = "LICENSE_TO_BE_WRITE.txt" build = "build.rs" [features] test-file = [] exe = [] [lib] [[example]] name = "test_file" test = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] egui = "0.20.1" egui_extras = { version = "0.20.0" } eframe = { version = "0.20.1", features = ["wgpu"] } egui-wgpu = "0.20.0" bytemuck = { version = "1.9.1" } wgpu = { version = "0.14", features = ["webgl"] } pollster = { version = "0.2.5" } glam = { version = "0.20.2" } image = "0.23" anyhow = "1.0" directories = "4.0.1" rayon = "1.5.3" png = "0.17" futures-intrusive = "0.4.0" nanorand = { version = "0.7", default-features = false, features = ["wyrand"] } rfd = "0.9.1" csv = "1.1.6" serde = { version = "1.0.140", features = ["derive"] } strum = { version = "0.24.1", features = ["derive"] } tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] } chrono = "0.4.22" lazy_static = "1.4.0" [target.'cfg(windows)'.build-dependencies] winres = "0.1" [patch.crates-io] naga = { path = "./lib/naga" } ================================================ FILE: README.md ================================================ # GraphPU "GraphPU" is a 3D GPU graph visualization application. We have developed a rendering framework and HPC algorithms based on Rust and WebGPU, allowing the application to simulate and render millions of nodes and edges in real-time on Vulkan and Metal platforms. The demo contains multiple large-scale graph datasets including movie semantics, emails, large website structures, personal WeChat relationships, and social media connections. The audience can interact with these data through a controller knob, experiencing social physics and complex networks in a particle universe. See more: [troyni.com/graphpu](https://troyni.com/graphpu) ![](github/screenshot_1.png) ================================================ FILE: build.rs ================================================ use std::io; #[cfg(target_os = "windows")] use winres::WindowsResource; fn main() -> io::Result<()> { #[cfg(target_os = "windows")] { WindowsResource::new() // This path can be absolute, or relative to your crate root. .set_icon("resources/app_icon.ico") .compile()?; } Ok(()) } ================================================ FILE: examples/dataset/email_data_edge.csv ================================================ start_id,end_id 0,1 0,4 0,5 0,8 0,11 0,20 0,48 0,130 0,160 0,430 0,668 0,736 0,3612 0,4252 0,16687 1,1 1,44 1,50 1,56 1,98 1,99 1,106 1,146 1,147 1,149 1,158 1,171 1,175 1,184 1,206 1,259 1,333 1,336 1,392 1,397 1,406 1,422 1,446 1,457 1,585 1,602 1,620 1,640 1,732 1,733 1,779 1,841 1,1033 1,1118 1,1261 1,1262 1,1290 1,1370 1,1425 1,1458 1,1515 1,1518 1,1521 1,1546 1,1619 1,1623 1,1776 1,1803 1,1966 1,1969 1,2014 1,2037 1,2058 1,2244 1,2356 1,2558 1,2874 1,2924 1,3449 1,4200 1,4681 1,5357 1,5592 1,5726 1,6044 1,6119 1,6962 1,7719 1,7723 1,7817 1,7998 1,8027 1,8109 1,8244 1,9394 1,14402 1,14507 1,15162 1,15439 1,16393 1,17166 1,19459 1,19578 1,20587 1,20833 1,21290 1,21442 1,22604 1,23384 1,23659 1,23783 1,23927 1,24137 1,24339 1,24466 1,26034 1,26354 1,27008 1,29534 1,30331 1,33287 1,33976 1,34212 1,34609 1,34630 1,34638 1,34710 1,34792 1,38060 1,38300 1,39437 1,39527 1,39532 1,39811 1,40430 1,40996 1,41040 1,42064 1,44877 1,45382 1,45461 1,48364 1,55144 1,55254 1,55820 1,59020 1,60576 1,63349 1,68370 1,69668 1,71303 1,74996 1,75557 1,75912 1,76060 1,78909 1,80266 1,85096 1,87870 1,89035 1,90487 1,92476 1,100276 1,102786 1,106504 1,112537 1,116750 1,118111 1,118141 1,118143 1,118336 1,119805 1,120469 1,121775 1,123130 1,123137 1,124889 1,126059 1,131939 1,132953 1,133046 1,133980 1,138471 1,147103 1,149018 1,149492 1,152509 1,152515 1,153875 1,154107 1,154878 1,155056 1,156456 1,156589 1,159346 1,161731 1,162025 1,164711 1,165851 1,166080 1,166461 1,166670 1,169210 1,170928 1,171259 1,171684 1,171937 1,171958 1,174815 1,176190 1,176396 1,176450 1,177363 1,177653 1,177659 1,177841 1,178424 1,178546 1,178562 1,178706 1,180487 1,181275 1,182927 1,188390 1,189573 1,189576 1,189577 1,189587 1,190518 1,190767 1,191825 1,198971 1,204314 1,214708 1,216812 1,218391 1,218757 1,220502 1,220570 1,220933 1,221270 1,221402 1,221403 1,222427 1,225795 1,226362 1,226381 1,229913 1,234502 1,234973 1,240052 1,240426 1,242495 1,242826 1,245501 1,246804 1,250192 1,250222 1,250353 1,253031 1,256213 1,256674 1,257105 1,258284 1,258560 1,259744 1,260325 1,261079 1,264679 2,3 3,3 3,10 3,175 3,313 3,314 3,347 3,388 3,389 3,457 3,509 3,510 3,653 3,808 3,1011 3,1043 3,1085 3,1184 3,1345 3,1417 3,1696 3,1869 3,1973 3,2045 3,2301 3,3932 3,4535 3,5646 3,6424 3,7926 3,8179 3,8508 3,13506 3,14747 3,15088 3,16176 3,16580 3,17071 3,18088 3,18457 3,18783 3,19673 3,20672 3,20836 3,21393 3,21396 3,21491 3,21847 3,21932 3,22181 3,25476 3,26092 3,26254 3,26259 3,26260 3,26263 3,26269 3,26278 3,26283 3,26955 3,28112 3,29739 3,30373 3,31080 3,31965 3,34577 3,34776 3,34846 3,36171 3,36831 3,36957 3,37203 3,37319 3,37522 3,37557 3,37571 3,38079 3,39085 3,40030 3,41136 3,41247 3,41533 3,41555 3,42684 3,42694 3,42877 3,43795 3,44574 3,45771 3,46064 3,46441 3,47049 3,48361 3,49478 3,49869 3,51980 3,54959 3,57206 3,57216 3,58529 3,59950 3,61506 3,63137 3,63603 3,67740 3,68212 3,68431 3,68492 3,68928 3,70737 3,72558 3,75407 3,75912 3,76810 3,76922 3,77837 3,79079 3,79714 3,79935 3,81350 3,81436 3,82702 3,82783 3,83230 3,83426 3,83427 3,83621 3,83896 3,84541 3,84780 3,85639 3,87426 3,88075 3,88102 3,90352 3,90921 3,91045 3,91528 3,91589 3,91732 3,93046 3,93124 3,93132 3,93764 3,94328 3,94468 3,95943 3,96600 3,97912 3,99112 3,99209 3,101587 3,102194 3,103388 3,103414 3,104845 3,105853 3,106493 3,106950 3,108105 3,109314 3,112497 3,112637 3,112790 3,112868 3,113012 3,115479 3,115570 3,116113 3,116547 3,116913 3,119500 3,120726 3,121611 3,121662 3,123003 3,128071 3,128243 3,130362 3,130895 3,131557 3,134313 3,135301 3,136097 3,137160 3,137238 3,140294 3,142169 3,142705 3,142742 3,144437 3,145766 3,145986 3,146749 3,148061 3,148091 3,148217 3,148890 3,150199 3,151073 3,151323 3,151493 3,152041 3,152691 3,152842 3,152931 3,154652 3,156915 3,157008 3,157488 3,158379 3,158565 3,159179 3,159885 3,160937 3,161434 3,161712 3,161874 3,162144 3,162548 3,162772 3,163382 3,163894 3,166993 3,167807 3,168388 3,168500 3,169001 3,169540 3,170783 3,170982 3,171927 3,172308 3,174392 3,174557 3,174843 3,175417 3,175464 3,175992 3,179142 3,179323 3,179391 3,180091 3,180657 3,181675 3,183072 3,183093 3,183376 3,183853 3,185045 3,185249 3,185681 3,186936 3,187073 3,188151 3,189805 3,190231 3,192150 3,192304 3,193279 3,194570 3,197863 3,198475 3,198482 3,199752 3,199766 3,201298 3,203481 3,203751 3,205083 3,206092 3,206648 3,207031 3,207609 3,212781 3,213294 3,213978 3,218747 3,219500 3,220356 3,222334 3,222717 3,236678 3,249762 3,255414 3,263806 5,4 5,5 5,10 5,26 5,47 5,59 5,143 5,171 5,292 5,355 5,430 5,527 5,740 5,741 5,743 5,865 5,885 5,887 5,994 5,1119 5,1235 5,1252 5,1253 5,1335 5,1432 5,1722 5,1983 5,2089 5,2469 5,2674 5,2926 5,2940 5,3949 5,4114 5,4748 5,4810 5,5881 5,6621 5,8714 5,15959 5,16614 5,16686 5,21059 5,21944 5,45140 5,95583 5,111142 5,234141 6,7 7,7 8,385 8,2159 8,2368 8,3393 8,3644 8,5034 8,5326 8,8220 8,18090 8,85685 8,86389 8,87005 8,89532 8,110485 8,118780 8,124319 8,171018 9,10 9,17521 10,5 10,10 10,30 10,34 10,35 10,37 10,38 10,56 10,65 10,73 10,77 10,87 10,94 10,97 10,106 10,107 10,124 10,140 10,141 10,146 10,147 10,152 10,161 10,175 10,182 10,192 10,195 10,198 10,202 10,206 10,211 10,213 10,222 10,233 10,247 10,251 10,255 10,264 10,275 10,292 10,294 10,309 10,310 10,313 10,328 10,333 10,336 10,366 10,389 10,393 10,417 10,422 10,444 10,446 10,457 10,467 10,485 10,493 10,500 10,505 10,510 10,512 10,535 10,595 10,605 10,615 10,626 10,628 10,634 10,638 10,640 10,671 10,677 10,693 10,704 10,726 10,733 10,746 10,760 10,784 10,788 10,795 10,818 10,838 10,841 10,859 10,877 10,907 10,911 10,920 10,929 10,937 10,949 10,957 10,972 10,991 10,999 10,1001 10,1010 10,1070 10,1085 10,1113 10,1117 10,1127 10,1175 10,1188 10,1191 10,1238 10,1240 10,1241 10,1247 10,1289 10,1293 10,1297 10,1298 10,1300 10,1306 10,1309 10,1319 10,1370 10,1417 10,1425 10,1430 10,1436 10,1509 10,1518 10,1566 10,1572 10,1623 10,1634 10,1715 10,1773 10,1801 10,1815 10,1844 10,1893 10,1955 10,1985 10,2083 10,2145 10,2244 10,2296 10,2304 10,2384 10,2427 10,2552 10,2580 10,2631 10,2750 10,2782 10,3009 10,3067 10,3094 10,3111 10,3135 10,3218 10,3285 10,3297 10,3422 10,3474 10,3507 10,3996 10,4006 10,4068 10,4220 10,4253 10,4260 10,4272 10,4672 10,4911 10,5050 10,5073 10,5100 10,5213 10,5265 10,5290 10,5382 10,5385 10,5401 10,5439 10,5440 10,5718 10,5725 10,5809 10,5835 10,5961 10,6173 10,6422 10,6490 10,6590 10,7117 10,7441 10,8285 10,8414 10,8520 10,8664 10,8805 10,8854 10,9015 10,9373 10,9394 10,9585 10,12747 10,13201 10,13345 10,13524 10,13991 10,14188 10,14193 10,14590 10,15344 10,15454 10,15476 10,15547 10,15610 10,15624 10,15795 10,16196 10,16859 10,17176 10,17304 10,17803 10,17837 10,18581 10,18718 10,18831 10,18868 10,19005 10,19183 10,19202 10,19216 10,19336 10,19469 10,19555 10,19993 10,20107 10,20351 10,20516 10,20854 10,20960 10,21061 10,21084 10,21567 10,21619 10,22513 10,22559 10,22712 10,23104 10,23217 10,23572 10,23595 10,24662 10,24805 10,25131 10,25348 10,25634 10,25671 10,25989 10,26358 10,26501 10,27834 10,27947 10,28002 10,28148 10,28149 10,28299 10,28396 10,28405 10,28514 10,28553 10,28702 10,29315 10,29403 10,29680 10,29921 10,29959 10,30089 10,30144 10,30734 10,30800 10,30946 10,31080 10,31300 10,31348 10,31419 10,31428 10,31934 10,32395 10,32402 10,32481 10,32699 10,32751 10,33117 10,33424 10,33630 10,33732 10,33854 10,34212 10,34539 10,34897 10,35353 10,35687 10,36237 10,36523 10,36995 10,37259 10,37484 10,37829 10,37953 10,38010 10,38121 10,38704 10,38799 10,38905 10,39039 10,39264 10,39368 10,39492 10,39700 10,39703 10,40432 10,40664 10,41041 10,41230 10,41348 10,41367 10,41561 10,42071 10,42109 10,42131 10,42134 10,42150 10,42328 10,42357 10,42819 10,42828 10,42900 10,43065 10,43141 10,43926 10,44370 10,44436 10,44728 10,45058 10,45817 10,45853 10,45929 10,46955 10,47471 10,47519 10,48274 10,48598 10,48839 10,49596 10,49857 10,49868 10,50548 10,50956 10,51618 10,51731 10,52189 10,52254 10,52489 10,52536 10,52604 10,53571 10,53887 10,54399 10,54616 10,55300 10,55437 10,55927 10,55994 10,56619 10,56811 10,57324 10,57737 10,58725 10,58836 10,59239 10,59248 10,59277 10,59355 10,59392 10,59424 10,59430 10,59965 10,59972 10,60199 10,60207 10,60547 10,60576 10,60585 10,60610 10,60613 10,60782 10,60902 10,61577 10,62023 10,62356 10,63664 10,65484 10,66002 10,66073 10,66176 10,66239 10,66542 10,66724 10,66954 10,66956 10,67343 10,67399 10,67400 10,67492 10,67568 10,67705 10,67769 10,68020 10,68069 10,68746 10,69507 10,69509 10,69778 10,69822 10,70459 10,72093 10,72748 10,72949 10,73055 10,73185 10,73700 10,73833 10,73955 10,74158 10,74315 10,75912 10,76082 10,77113 10,77132 10,77163 10,77273 10,77289 10,77957 10,78007 10,78259 10,78486 10,78933 10,79013 10,79559 10,79980 10,80478 10,80509 10,80746 10,80761 10,80832 10,80950 10,81233 10,81284 10,82103 10,82397 10,82592 10,82593 10,82711 10,83693 10,83938 10,84156 10,84527 10,84682 10,85165 10,85218 10,85979 10,86114 10,86303 10,86402 10,86612 10,86780 10,86782 10,86790 10,87393 10,87961 10,88127 10,88168 10,88172 10,88456 10,88578 10,88619 10,88641 10,89910 10,89945 10,90198 10,90375 10,90400 10,90538 10,90635 10,90732 10,90983 10,91339 10,92147 10,92343 10,92411 10,92476 10,92785 10,93310 10,93604 10,93737 10,93853 10,93890 10,94230 10,95438 10,95757 10,96146 10,96855 10,97462 10,97481 10,98291 10,99121 10,99138 10,99151 10,99156 10,99306 10,99809 10,100079 10,100467 10,100776 10,101572 10,102021 10,102415 10,102811 10,102821 10,102827 10,103335 10,103523 10,103534 10,103723 10,103963 10,104123 10,104647 10,106436 10,106635 10,106637 10,106648 10,106651 10,106653 10,106665 10,106971 10,107015 10,107060 10,107133 10,108231 10,109523 10,109945 10,110110 10,110256 10,110420 10,111550 10,112026 10,113140 10,113156 10,114766 10,115312 10,115357 10,116264 10,116662 10,116954 10,116997 10,117432 10,118518 10,118888 10,119058 10,119637 10,121109 10,121720 10,121723 10,122353 10,122749 10,123138 10,123189 10,123203 10,124315 10,125118 10,126031 10,126094 10,126161 10,126916 10,127071 10,127484 10,128906 10,130314 10,130491 10,130497 10,130500 10,130505 10,130908 10,131375 10,131891 10,132698 10,133171 10,133173 10,133191 10,133281 10,133602 10,133834 10,135141 10,135283 10,135585 10,135987 10,136139 10,136235 10,136640 10,136644 10,136793 10,136902 10,137239 10,139000 10,139001 10,139006 10,139028 10,139245 10,139451 10,140904 10,140958 10,140976 10,141288 10,142242 10,142935 10,143287 10,143446 10,144719 10,144761 10,144997 10,145069 10,145171 10,146134 10,146150 10,146602 10,147453 10,147638 10,150530 10,150608 10,152117 10,152716 10,152875 10,154713 10,154864 10,155915 10,156356 10,156369 10,156571 10,156825 10,157325 10,157607 10,157823 10,157900 10,157920 10,157955 10,158065 10,158465 10,158784 10,158824 10,161445 10,161675 10,162432 10,163401 10,165589 10,166378 10,166693 10,166817 10,167403 10,168936 10,169164 10,170833 10,171641 10,172008 10,172382 10,172718 10,174671 10,175082 10,175608 10,176565 10,176913 10,177112 10,177516 10,177541 10,177943 10,178811 10,178854 10,179170 10,181026 10,181992 10,182667 10,183339 10,183779 10,184373 10,185431 10,185579 10,185598 10,186029 10,186844 10,189270 10,189842 10,190245 10,191737 10,192592 10,192607 10,193708 10,193878 10,194664 10,195905 10,196557 10,197819 10,198723 10,199390 10,203861 10,206758 10,212086 10,213407 10,217533 10,218220 10,219559 10,219624 10,220445 10,221340 10,221365 10,223250 10,224068 10,224822 10,227061 10,229289 10,230509 10,230637 10,232166 10,233073 10,233515 10,233650 10,233856 10,236719 10,236795 10,239167 10,240174 10,240339 10,240413 10,240501 10,241885 10,242195 10,242535 10,242680 10,244472 10,244619 10,247527 10,248350 10,251600 10,251608 10,251902 10,252277 10,253026 10,253473 10,255030 10,256809 10,259716 10,261964 10,262561 11,11 11,20 11,68 11,86 11,111 11,167 11,192 11,207 11,209 11,240 11,259 11,264 11,292 11,301 11,314 11,333 11,336 11,366 11,479 11,510 11,516 11,599 11,604 11,613 11,622 11,668 11,673 11,710 11,779 11,801 11,872 11,911 11,918 11,972 11,1014 11,1085 11,1087 11,1130 11,1135 11,1147 11,1172 11,1204 11,1210 11,1284 11,1298 11,1309 11,1326 11,1370 11,1402 11,1434 11,1518 11,1531 11,1590 11,1655 11,1659 11,1724 11,1796 11,1803 11,1844 11,1891 11,1893 11,1992 11,2286 11,2373 11,2512 11,3392 11,3507 11,3555 11,3804 11,3967 11,4276 11,5213 11,5961 11,7750 11,13585 11,18880 11,62318 11,75912 11,118336 11,119273 11,125371 11,125844 11,129896 11,164399 11,182465 11,192040 11,215874 11,230304 11,234748 11,234886 11,241493 12,13 14,15 14,20 14,63 14,160 14,254 14,538 15,10 15,15 15,292 15,397 15,668 15,693 15,745 16,17 16,175 16,3155 16,20204 16,37138 16,38017 16,44450 16,53921 16,58072 16,67477 16,85023 16,85356 16,88234 16,92890 16,97834 16,103666 16,107114 16,107683 16,108332 16,108514 16,115604 16,117603 16,123877 16,124108 16,124311 16,125706 16,127926 16,131170 16,166102 16,185298 16,213368 16,215735 16,216570 16,216940 16,217417 16,217667 16,217748 16,218678 16,218770 16,218978 16,219361 16,219506 16,219525 16,219574 16,219731 16,220535 16,221400 16,221524 16,221604 16,221898 16,221948 16,222050 16,223400 16,225492 16,226249 16,227325 16,227893 16,227916 16,227920 16,227944 16,228035 16,228080 16,229304 16,230243 16,231481 16,231697 16,232731 16,233255 16,233532 16,234445 16,237058 16,237114 16,239282 16,239332 16,239377 16,239524 16,240109 16,240500 16,242098 16,242768 16,242944 16,242947 16,242950 16,242971 16,243495 16,245779 16,246597 16,246678 16,246732 16,258117 18,19 19,8 19,19 19,54 19,135 19,222 19,313 19,385 19,389 19,536 19,634 19,660 19,781 19,808 19,1192 19,1313 19,1571 19,1724 19,1756 19,1843 19,2159 19,2253 19,2266 19,2424 19,2646 19,2692 19,2944 19,3302 19,3475 19,5034 19,5326 19,5632 19,6419 19,6506 19,6979 19,7698 19,7768 19,9111 19,9379 19,13715 19,14593 19,14668 19,15494 19,15647 19,17346 19,17825 19,18592 19,18831 19,18880 19,19443 19,22429 19,23541 19,28511 19,30502 19,31074 19,32238 19,37088 19,42478 19,44714 19,44717 19,48201 19,60081 19,61625 19,61629 19,62539 19,62807 19,70263 19,74500 19,79404 19,79876 19,79966 19,92289 19,111267 19,113513 19,123639 19,134111 19,137089 19,156424 19,174541 19,178182 19,182382 19,191219 19,211889 19,212914 19,213089 19,221547 19,236122 19,251862 19,252788 19,253093 19,253094 19,253095 19,253096 19,253097 19,261754 20,10 20,11 20,20 20,126 20,178 20,182 20,259 20,314 20,315 20,346 20,406 20,435 20,439 20,440 20,447 20,452 20,457 20,497 20,512 20,538 20,671 20,673 20,675 20,676 20,693 20,766 20,794 20,808 20,844 20,849 20,929 20,934 20,939 20,996 20,1014 20,1033 20,1068 20,1118 20,1130 20,1191 20,1294 20,1370 20,1445 20,1474 20,1518 20,1531 20,1559 20,1566 20,1590 20,1612 20,1644 20,1651 20,1776 20,1789 20,1796 20,1877 20,1973 20,2085 20,2102 20,2216 20,2253 20,2353 20,3507 20,3524 20,4352 20,4376 20,6422 20,6607 20,6661 20,6824 20,6883 20,6904 20,6966 20,6971 20,6975 20,7117 20,9203 20,9654 20,13804 20,14145 20,15168 20,15179 20,15324 20,23803 20,24360 20,25282 20,35143 20,40551 20,42524 20,46154 20,46871 20,48331 20,61342 20,66545 20,69787 20,70337 20,70367 20,73282 20,75912 20,76060 20,81056 20,81061 20,86571 20,92945 20,93827 20,94123 20,94778 20,95005 20,98012 20,98608 20,98611 20,99503 20,106259 20,107926 20,110205 20,128144 20,131823 20,150809 20,158718 20,158989 20,166373 20,171034 20,179156 20,179644 20,184769 20,186675 20,189128 20,189560 20,190492 20,191917 20,215874 20,244053 20,249055 20,262341 21,22 22,22 22,127 22,182 22,207 22,227 22,255 22,287 22,314 22,358 22,433 22,446 22,599 22,673 22,752 22,791 22,818 22,861 22,862 22,874 22,920 22,1011 22,1023 22,1118 22,1133 22,1210 22,1284 22,1336 22,1367 22,1392 22,1459 22,1556 22,1634 22,1679 22,2016 22,2125 22,2182 22,2222 22,2224 22,2235 22,2276 22,2297 22,2314 22,2563 22,2652 22,2732 22,3174 22,3177 22,3228 22,3509 22,3696 22,3728 22,3829 22,3979 22,4015 22,4237 22,4272 22,4367 22,4565 22,5006 22,5050 22,5261 22,5282 22,5470 22,5507 22,6045 22,6361 22,6467 22,6719 22,7049 22,7456 22,7681 22,7781 22,8163 22,8226 22,8480 22,8805 22,9225 22,9367 22,9503 22,9679 22,13142 22,13552 22,13573 22,13905 22,14052 22,14546 22,15218 22,15540 22,15654 22,15813 22,17151 22,17241 22,18018 22,18028 22,18627 22,18657 22,19468 22,19494 22,19660 22,19740 22,19783 22,19830 22,20573 22,20779 22,21782 22,22928 22,24309 22,25168 22,25448 22,25640 22,27474 22,27880 22,28142 22,30271 22,30502 22,30542 22,30584 22,30922 22,30942 22,31431 22,32666 22,32694 22,33159 22,33483 22,34674 22,35204 22,37442 22,37581 22,38936 22,39101 22,40221 22,40839 22,41144 22,41300 22,41349 22,42112 22,43337 22,45026 22,45195 22,45980 22,45984 22,45985 22,45990 22,45992 22,45996 22,45999 22,46515 22,46857 22,47158 22,47502 22,48197 22,48202 22,48246 22,48294 22,48431 22,49037 22,49591 22,50166 22,51405 22,54599 22,57139 22,57788 22,57873 22,59174 22,59556 22,60500 22,60876 22,61133 22,61566 22,61645 22,61683 22,62095 22,62353 22,62501 22,62526 22,62563 22,62912 22,63624 22,63825 22,64742 22,64895 22,65748 22,68141 22,72834 22,73421 22,73445 22,73561 22,75754 22,77424 22,77672 22,77893 22,78257 22,78341 22,79055 22,79417 22,80013 22,81236 22,81278 22,81495 22,81759 22,82237 22,82712 22,83434 22,83448 22,83545 22,83806 22,83979 22,84333 22,85424 22,85461 22,85463 22,86090 22,86561 22,86852 22,88011 22,88043 22,88611 22,88967 22,90164 22,90336 22,91032 22,92139 22,92804 22,92909 22,93113 22,93157 22,93387 22,93860 22,94318 22,94866 22,94896 22,94897 22,96123 22,97304 22,97392 22,97569 22,98908 22,99401 22,99411 22,102014 22,102517 22,102695 22,102698 22,103466 22,103892 22,104152 22,106825 22,106826 22,106828 22,107291 22,107293 22,107552 22,107694 22,108568 22,109212 22,109451 22,109476 22,110517 22,112078 22,112442 22,115299 22,116654 22,116829 22,117571 22,117572 22,117573 22,118229 22,118674 22,119005 22,119437 22,119472 22,119839 22,122054 22,122092 22,122721 22,123205 22,123709 22,124458 22,124873 22,126571 22,126618 22,126802 22,127643 22,127648 22,127905 22,127978 22,130938 22,130971 22,134681 22,135146 22,135346 22,135955 22,137073 22,139152 22,139754 22,139755 22,142540 22,143609 22,146626 22,147131 22,147132 22,148182 22,148902 22,149017 22,149316 22,149382 22,151158 22,152195 22,152623 22,154491 22,154746 22,159347 22,161371 22,161409 22,162608 22,164947 22,164969 22,165350 22,165563 22,167049 22,168799 22,168809 22,168854 22,169574 22,169806 22,170543 22,170722 22,170814 22,171775 22,172528 22,172534 22,173145 22,173148 22,173164 22,173167 22,173625 22,174468 22,174811 22,175144 22,175145 22,176038 22,176360 22,178944 22,179173 22,179901 22,180127 22,180468 22,182028 22,182162 22,182262 22,183274 22,183321 22,184951 22,185871 22,185983 22,186788 22,188087 22,188770 22,188781 22,189247 22,191509 22,193625 22,197805 22,197853 22,205488 22,213977 22,215878 22,218074 22,218653 22,226564 22,226703 22,226894 22,226930 22,227699 22,229177 22,229208 22,231630 22,231972 22,235459 22,235706 22,236215 22,236664 22,238217 22,238347 22,238512 22,238776 22,239061 22,240173 22,241253 22,242363 22,243538 22,244680 22,250693 22,251805 22,253412 22,255573 22,255713 22,256784 22,257200 22,257204 22,261352 22,264030 23,24 23,25 23,26 23,28 23,33 23,40 23,47 23,59 23,60 23,117 23,143 23,885 23,887 23,1252 23,1253 23,1255 23,1432 23,1775 23,2088 23,2089 23,2469 23,2674 23,2701 23,2712 23,2867 23,3561 23,4079 23,4571 23,5708 23,5826 23,9343 23,9536 23,9537 23,9538 23,9539 23,9540 23,9541 23,9542 23,21944 23,22880 23,44244 23,50943 23,154690 23,171294 24,24 24,26 24,59 24,104 24,372 24,442 24,588 24,590 24,714 24,805 24,1252 24,1253 24,1962 24,2244 24,2775 24,4079 24,21944 25,25 25,2088 25,6208 25,6209 26,26 26,59 26,885 26,994 26,16153 26,21944 27,25 27,26 27,28 27,47 27,59 27,60 27,143 27,885 27,887 27,1432 27,1775 27,2088 27,2469 27,2674 27,3561 27,4571 27,5826 27,5871 27,9343 27,9537 27,9539 27,9542 27,21944 27,154690 28,28 28,143 28,4571 28,9343 28,21944 28,88820 29,30 30,10 30,30 30,47 30,104 30,134 30,135 30,137 30,175 30,200 30,211 30,225 30,248 30,327 30,328 30,333 30,364 30,440 30,446 30,622 30,685 30,693 30,704 30,772 30,837 30,898 30,903 30,911 30,950 30,954 30,981 30,1045 30,1179 30,1281 30,1305 30,1332 30,1415 30,1498 30,1708 30,1939 30,1980 30,2105 30,2418 30,2596 30,2710 30,3009 30,3067 30,3358 30,3538 30,3565 30,3727 30,4276 30,4354 30,4557 30,4939 30,4940 30,4941 30,5405 30,5472 30,5604 30,6062 30,6646 30,7182 30,8279 30,8414 30,13207 30,14975 30,15547 30,15553 30,15604 30,18194 30,18926 30,19457 30,20598 30,21081 30,21607 30,21746 30,21865 30,23502 30,23790 30,24826 30,26103 30,26388 30,27705 30,28203 30,29374 30,30557 30,31067 30,31300 30,31368 30,31453 30,31662 30,32174 30,32848 30,35047 30,37709 30,37730 30,37904 30,43239 30,44412 30,47400 30,47669 30,47672 30,55215 30,55316 30,55330 30,56071 30,57143 30,57838 30,58110 30,65864 30,66047 30,67812 30,70346 30,74315 30,77645 30,84588 30,85814 30,85829 30,88666 30,90361 30,90417 30,91460 30,93173 30,95042 30,96267 30,99125 30,99807 30,101145 30,103208 30,106366 30,106367 30,108208 30,108214 30,108644 30,109035 30,109077 30,109568 30,109655 30,110170 30,113536 30,114669 30,115501 30,115502 30,117183 30,117712 30,120029 30,121517 30,121899 30,123833 30,124658 30,124791 30,126642 30,127938 30,129175 30,129670 30,131650 30,135613 30,136093 30,141175 30,141355 30,149257 30,154786 30,161326 30,170503 30,171023 30,171042 30,171778 30,172542 30,172792 30,173774 30,173828 30,177712 30,186639 30,192121 30,199221 30,203015 30,203153 30,203978 30,204063 30,204065 30,207101 30,207116 30,207623 30,215501 30,217637 30,217658 30,218469 30,219793 30,224183 30,226564 30,231099 30,231192 30,235864 30,237617 30,257693 30,260264 31,32 32,87 32,356 32,392 32,509 32,510 32,623 32,644 32,676 32,685 32,697 32,809 32,872 32,875 32,1011 32,1240 32,1262 32,1465 32,1949 32,20757 33,206 33,2244 33,21826 34,10 34,34 34,35 34,83 34,313 34,455 34,536 34,589 34,599 34,634 34,818 34,1085 34,1284 34,1417 34,1860 34,2224 34,2646 34,4223 34,5326 34,75912 34,115474 34,127158 34,188791 35,10 35,34 35,35 35,83 35,120 35,175 35,222 35,240 35,278 35,283 35,304 35,313 35,314 35,389 35,392 35,439 35,440 35,455 35,536 35,589 35,599 35,623 35,634 35,656 35,814 35,818 35,852 35,949 35,951 35,1005 35,1011 35,1014 35,1085 35,1118 35,1218 35,1284 35,1313 35,1502 35,1724 35,1796 35,1844 35,1916 35,1973 35,1996 35,2046 35,2159 35,2224 35,2318 35,2420 35,2584 35,2615 35,2619 35,2646 35,2711 35,2997 35,3507 35,3672 35,4076 35,4081 35,4223 35,4532 35,5208 35,5326 35,5343 35,5619 35,5702 35,6012 35,6032 35,6064 35,6649 35,6754 35,6799 35,6828 35,6880 35,7020 35,7346 35,8478 35,8535 35,8653 35,9684 35,13622 35,14246 35,15931 35,16078 35,16381 35,17116 35,17151 35,18471 35,18541 35,18831 35,18881 35,19789 35,20199 35,20576 35,20672 35,21517 35,22119 35,23739 35,24274 35,25014 35,25534 35,25710 35,26935 35,27808 35,29595 35,30517 35,30601 35,30679 35,30709 35,30736 35,31248 35,32225 35,32820 35,33164 35,33593 35,35331 35,35688 35,36813 35,38348 35,38986 35,39618 35,39671 35,39677 35,40099 35,40136 35,40669 35,40790 35,41447 35,43136 35,45197 35,45666 35,46398 35,46478 35,48034 35,48082 35,48330 35,48578 35,48642 35,48656 35,48704 35,49551 35,49632 35,52100 35,54515 35,54611 35,56584 35,58395 35,59260 35,59344 35,59763 35,59809 35,60665 35,62088 35,62539 35,63362 35,63519 35,64752 35,64761 35,64770 35,68036 35,68219 35,70879 35,72080 35,72749 35,75347 35,75912 35,76895 35,77721 35,78402 35,80101 35,80548 35,81511 35,82029 35,82350 35,82916 35,88448 35,90388 35,90472 35,91522 35,91899 35,92046 35,93428 35,94299 35,95456 35,96831 35,97618 35,97636 35,99832 35,101828 35,105949 35,107100 35,107651 35,109318 35,112050 35,112729 35,115128 35,115474 35,115814 35,117993 35,117996 35,118461 35,118519 35,119618 35,120061 35,121116 35,121180 35,121892 35,123085 35,127158 35,127731 35,128185 35,131003 35,131196 35,131224 35,131822 35,132868 35,133488 35,133537 35,133629 35,133714 35,134205 35,137797 35,139444 35,139690 35,142552 35,143030 35,146484 35,149115 35,152166 35,152240 35,152703 35,153372 35,153658 35,154371 35,154400 35,155152 35,157691 35,158360 35,160428 35,160809 35,162637 35,163404 35,163419 35,165341 35,165358 35,168404 35,169212 35,173293 35,175385 35,176486 35,176779 35,177833 35,182308 35,183880 35,186608 35,186766 35,191376 35,192107 35,194063 35,204259 35,205889 35,206167 35,214977 35,217691 35,218193 35,221168 35,223933 35,224783 35,224977 35,227361 35,229773 35,234800 35,234907 35,241848 35,242350 35,243449 35,243599 35,244069 35,244193 35,246916 35,249055 35,264610 36,37 37,10 37,36 37,37 37,106 37,301 37,425 37,518 37,599 37,604 37,615 37,663 37,685 37,698 37,717 37,937 37,968 37,1014 37,1124 37,1145 37,1231 37,1293 37,1359 37,1370 37,1566 37,1740 37,1782 37,1849 37,1973 37,2689 37,3422 37,3469 37,4253 37,4270 37,4514 37,4683 37,6398 37,6612 37,6702 37,7222 37,8445 37,9365 37,13309 37,13454 37,13565 37,13991 37,14598 37,14916 37,19343 37,19501 37,19729 37,19953 37,20550 37,21701 37,21765 37,25169 37,26034 37,26161 37,26287 37,34162 37,35527 37,36957 37,37061 37,37628 37,39650 37,41778 37,45195 37,46868 37,46881 37,48089 37,48238 37,48304 37,48305 37,48339 37,48510 37,48516 37,49121 37,49700 37,52112 37,55618 37,56324 37,60375 37,60733 37,62739 37,62916 37,64674 37,69988 37,76900 37,76980 37,76997 37,77473 37,77789 37,85968 37,111032 37,111083 37,111258 37,111348 37,113886 37,114085 37,115479 37,119014 37,119479 37,128986 37,130738 37,133297 37,136226 37,137752 37,140353 37,141961 37,142594 37,147411 37,163742 37,163898 37,163979 37,169480 37,174781 37,177964 37,180986 37,188553 37,188664 37,188819 37,189303 37,214997 37,216052 37,221828 37,221920 37,227376 37,237557 37,243369 37,244041 37,255021 39,10 40,134 40,289 40,442 40,631 40,714 40,784 40,887 40,1282 40,2286 40,2775 40,88820 40,94134 41,41 41,42 41,68 41,139 41,233 41,255 41,261 41,289 41,290 41,298 41,314 41,373 41,417 41,431 41,534 41,573 41,589 41,590 41,599 41,612 41,631 41,632 41,677 41,694 41,714 41,715 41,760 41,784 41,797 41,805 41,823 41,852 41,862 41,911 41,1004 41,1012 41,1080 41,1085 41,1119 41,1132 41,1149 41,1177 41,1195 41,1209 41,1285 41,1459 41,1462 41,1580 41,1608 41,1631 41,1641 41,1663 41,1745 41,1867 41,1888 41,1962 41,2089 41,2296 41,2338 41,2417 41,2572 41,2747 41,2775 41,2940 41,2991 41,2995 41,3135 41,3623 41,4114 41,4115 41,4222 41,4258 41,4532 41,4547 41,5261 41,5331 41,5472 41,5935 41,6068 41,7194 41,8208 41,8246 41,8537 41,13563 41,13931 41,14723 41,15109 41,15233 41,15614 41,18533 41,18933 41,19502 41,19617 41,20986 41,21591 41,23784 41,24613 41,24842 41,25385 41,25664 41,25800 41,26061 41,28442 41,28636 41,30505 41,31300 41,31302 41,33995 41,35500 41,36245 41,37422 41,43394 41,44725 41,46874 41,49309 41,51972 41,54421 41,54666 41,54693 41,56629 41,58145 41,58911 41,59067 41,60603 41,62964 41,64631 41,64840 41,65681 41,67479 41,70784 41,71757 41,71873 41,72625 41,72821 41,73745 41,75184 41,75912 41,78891 41,79619 41,79901 41,80402 41,83498 41,87507 41,88146 41,89584 41,94134 41,95327 41,95537 41,96606 41,98080 41,98263 41,100232 41,101473 41,105327 41,106234 41,110092 41,113982 41,114092 41,117118 41,119919 41,121919 41,122587 41,122914 41,123778 41,124856 41,127158 41,127207 41,127754 41,127759 41,127829 41,128342 41,129660 41,131294 41,133582 41,133812 41,134685 41,135107 41,135180 41,135991 41,137096 41,138057 41,139522 41,140180 41,147443 41,148333 41,150762 41,152589 41,154567 41,155183 41,155999 41,156898 41,156957 41,159712 41,159757 41,160478 41,160860 41,162402 41,162485 41,163316 41,163370 41,164846 41,165233 41,165765 41,166983 41,167758 41,168377 41,169337 41,170595 41,171587 41,172521 41,173229 41,173427 41,176883 41,176944 41,180954 41,181841 41,182836 41,182924 41,183401 41,183764 41,185877 41,186065 41,187322 41,195468 41,197703 41,198775 41,199918 41,200563 41,203094 41,206230 41,207051 41,207126 41,211936 41,212360 41,213154 41,214900 41,214906 41,214918 41,214923 41,214925 41,216016 41,216137 41,217446 41,217623 41,217625 41,217628 41,217640 41,217642 41,217659 41,218110 41,218111 41,218508 41,218518 41,218576 41,220811 41,220954 41,220961 41,220965 41,220967 41,220970 41,220977 41,220979 41,221089 41,221090 41,221701 41,221709 41,221712 41,222390 41,222391 41,222394 41,222397 41,222402 41,222404 41,222417 41,222721 41,222724 41,223824 41,223827 41,223828 41,223859 41,223875 41,223892 41,223950 41,223958 41,223965 41,223972 41,223987 41,224090 41,224500 41,224514 41,224515 41,224522 41,224561 41,224566 41,224619 41,224655 41,224716 41,224723 41,224741 41,225565 41,225566 41,225572 41,225597 41,225678 41,225845 41,225846 41,225847 41,225853 41,228884 41,228892 41,228894 41,228897 41,228919 41,229229 41,229676 41,229725 41,229783 41,229862 41,230360 41,230484 41,230679 41,230681 41,230683 41,230684 41,230686 41,230696 41,231219 41,231258 41,236126 41,247980 41,255068 41,258887 41,262906 41,263838 42,41 42,42 42,233 42,1177 42,1195 42,1608 42,23784 42,23789 43,44 44,44 45,46 45,58 46,45 46,46 46,58 46,301 46,444 46,459 46,567 46,615 46,663 46,664 46,665 46,744 46,783 46,801 46,877 46,937 46,968 46,973 46,994 46,1117 46,1122 46,1125 46,1128 46,1160 46,1231 46,1241 46,1284 46,1293 46,1300 46,1436 46,1732 46,2217 46,2373 46,2595 46,2747 46,3422 46,3488 46,3575 46,3630 46,4046 46,4128 46,5662 46,6411 46,6434 46,17894 46,21060 46,23574 46,26042 46,26198 46,37355 46,37610 46,38769 46,42595 46,49469 46,52528 46,55868 46,67818 46,68893 46,70314 46,74691 46,75912 46,76679 46,80996 46,83034 46,90254 46,97867 46,102565 46,103860 46,121863 46,122665 46,123105 46,126090 46,138324 46,138679 46,138738 46,139613 46,143372 46,145984 46,149246 46,152469 46,172017 46,173791 46,176327 46,186657 46,189303 46,214863 46,216626 46,216740 46,218050 46,218884 46,221828 46,223970 46,228883 46,236836 46,253410 46,254449 46,254577 46,255500 46,255794 46,263082 47,5 47,30 47,47 47,94 47,111 47,1235 47,2089 47,2469 47,2867 47,2868 47,4748 47,5700 47,5871 47,5889 47,6569 47,7271 47,7469 47,19994 47,20007 48,48 48,911 48,1204 48,3538 48,4039 49,50 49,240 49,127158 50,1 50,49 50,50 50,56 50,79 50,99 50,146 50,147 50,149 50,158 50,175 50,192 50,240 50,325 50,333 50,336 50,406 50,620 50,622 50,640 50,778 50,779 50,809 50,818 50,841 50,861 50,1163 50,1210 50,1218 50,1370 50,1425 50,1515 50,1521 50,1562 50,1623 50,1873 50,2014 50,2234 50,2235 50,2365 50,2374 50,2431 50,2539 50,2540 50,2710 50,2741 50,2792 50,3449 50,3868 50,3895 50,4190 50,4260 50,4465 50,4684 50,5049 50,5472 50,5644 50,7494 50,8055 50,8538 50,9171 50,9479 50,13197 50,13390 50,13589 50,14040 50,14345 50,14566 50,14570 50,14584 50,15054 50,15770 50,16322 50,16890 50,17151 50,18194 50,18646 50,18697 50,19385 50,20494 50,20662 50,21092 50,21751 50,23999 50,24778 50,24837 50,26139 50,26415 50,28799 50,29252 50,29941 50,30331 50,31186 50,31228 50,31524 50,33435 50,35000 50,35447 50,35518 50,35844 50,36082 50,36534 50,38104 50,40646 50,40757 50,40910 50,41166 50,42508 50,42585 50,42606 50,44344 50,44369 50,46185 50,47095 50,48738 50,51424 50,56406 50,56505 50,57646 50,58265 50,58378 50,58653 50,59072 50,59168 50,59401 50,59425 50,59740 50,60152 50,60649 50,61259 50,61684 50,64515 50,64684 50,65078 50,66352 50,66533 50,66602 50,66655 50,66923 50,67209 50,67280 50,68069 50,68333 50,69471 50,72614 50,72744 50,75309 50,79954 50,80058 50,80973 50,81052 50,82787 50,82886 50,86360 50,92476 50,92927 50,93943 50,118336 50,119643 50,120060 50,121306 50,121361 50,122134 50,134286 50,134581 50,137302 50,141168 50,141912 50,144895 50,145024 50,145083 50,146029 50,146458 50,147458 50,148839 50,158924 50,160210 50,161080 50,164004 50,164426 50,165135 50,167033 50,170818 50,170828 50,172200 50,174273 50,174952 50,181458 50,183890 50,189569 50,193175 50,194936 50,195454 50,212898 50,212909 50,215219 50,215881 50,216743 50,217069 50,217318 50,217873 50,217987 50,219616 50,220968 50,220973 50,221264 50,221696 50,221859 50,222019 50,222099 50,222387 50,223373 50,223473 50,223479 50,223760 50,223878 50,225089 50,227175 50,227698 50,228079 50,228718 50,230441 50,230528 50,230575 50,237623 50,242613 50,243182 50,243288 50,244664 50,245445 50,245983 50,247346 51,52 53,54 53,87 53,207 53,255 54,54 54,135 54,222 54,278 54,283 54,313 54,385 54,401 54,455 54,657 54,660 54,718 54,784 54,814 54,830 54,1011 54,1019 54,1539 54,1724 54,1756 54,1784 54,1843 54,1861 54,2159 54,2253 54,2388 54,2421 54,2424 54,2553 54,2619 54,2646 54,2775 54,2866 54,2944 54,4377 54,5428 54,5435 54,5591 54,5933 54,6079 54,6506 54,6789 54,7698 54,7768 54,8427 54,9134 54,9874 54,13276 54,14447 54,14511 54,15028 54,15261 54,15694 54,15711 54,16772 54,18835 54,18903 54,19349 54,19352 54,20200 54,21037 54,21382 54,22552 54,24934 54,25069 54,25615 54,25670 54,26801 54,28528 54,28933 54,34603 54,37055 54,37088 54,37708 54,39537 54,39561 54,41330 54,41494 54,42831 54,54550 54,59690 54,61645 54,62305 54,62518 54,62705 54,63629 54,64713 54,66671 54,66703 54,69696 54,79966 54,82311 54,82882 54,90178 54,90872 54,94340 54,98218 54,102682 54,107641 54,107642 54,108206 54,115474 54,118044 54,118942 54,125482 54,131004 54,131497 54,137217 54,147183 54,151133 54,151136 54,151142 54,156412 54,159372 54,159406 54,164007 54,164888 54,165814 54,171796 54,175332 54,178969 54,179002 54,179270 54,179764 54,179834 54,179881 54,180134 54,180192 54,183172 54,183176 54,183179 54,183203 54,188052 54,212118 54,222196 54,224200 54,224203 54,234354 54,240074 54,260637 55,55 55,56 55,147 55,158 55,192 55,422 55,1181 55,4536 55,5821 55,14091 55,18519 55,18525 55,19751 55,21263 55,21329 55,23783 55,30331 55,32973 55,34362 55,34863 55,35327 55,37983 55,39652 55,41191 55,46087 55,58147 55,60395 55,60576 55,62784 55,66671 55,75114 55,75841 55,79598 55,81076 55,86566 55,94776 55,104347 55,120932 55,121013 55,122086 55,135983 55,137002 55,141964 55,143306 55,159392 55,187148 55,204124 55,217888 55,232652 55,238055 55,240949 55,260143 55,261987 56,1 56,10 56,55 56,56 56,99 56,146 56,147 56,158 56,175 56,192 56,256 56,314 56,333 56,336 56,406 56,421 56,422 56,425 56,446 56,602 56,663 56,780 56,841 56,843 56,920 56,1011 56,1089 56,1181 56,1218 56,1425 56,1464 56,1491 56,1566 56,1619 56,1623 56,1825 56,1993 56,2032 56,2224 56,3370 56,3571 56,3877 56,3895 56,5357 56,5373 56,6119 56,7296 56,7968 56,8078 56,8662 56,9394 56,13636 56,18519 56,18557 56,18638 56,18997 56,19571 56,19751 56,20375 56,20757 56,20982 56,21329 56,22616 56,23783 56,25550 56,26234 56,26414 56,26453 56,27175 56,28354 56,30331 56,34320 56,34362 56,34863 56,34963 56,36411 56,36417 56,38834 56,38857 56,43608 56,44242 56,45808 56,46087 56,48320 56,50602 56,50603 56,53993 56,54582 56,55036 56,55075 56,56259 56,56972 56,57014 56,57037 56,57648 56,58446 56,59852 56,59861 56,60395 56,60576 56,66097 56,66378 56,71746 56,73348 56,77906 56,78814 56,79768 56,81153 56,81403 56,82644 56,87210 56,89968 56,91296 56,92476 56,101863 56,102621 56,102726 56,104317 56,104347 56,111312 56,115812 56,116103 56,118890 56,119170 56,122941 56,124847 56,127422 56,132904 56,135736 56,137015 56,137016 56,137812 56,140470 56,141823 56,144849 56,147327 56,147624 56,148601 56,151137 56,153226 56,153775 56,168629 56,173561 56,174534 56,175376 56,175379 56,177227 56,177713 56,180986 56,182762 56,183501 56,183872 56,191465 56,194768 56,195576 56,202215 56,203971 56,204124 56,206552 56,207659 56,220074 56,230455 56,230458 56,230471 56,230480 56,230513 56,230521 56,230641 56,231978 56,242910 56,245033 56,246479 56,249202 56,254023 56,258375 56,261965 57,58 58,45 58,46 58,58 58,111 58,292 58,402 58,441 58,442 58,534 58,572 58,589 58,676 58,749 58,801 58,821 58,852 58,1011 58,1124 58,1125 58,1128 58,1130 58,1140 58,1146 58,1177 58,1238 58,1449 58,1482 58,2163 58,2334 58,3407 58,3474 58,3488 58,4128 58,4485 58,4771 58,5456 58,5471 58,5473 58,5547 58,5914 58,6070 58,6087 58,6411 58,6434 58,7167 58,7207 58,8059 58,8177 58,13173 58,13361 58,13538 58,14118 58,14132 58,14565 58,14633 58,14948 58,16141 58,18482 58,18838 58,19061 58,19142 58,20663 58,21060 58,23365 58,23835 58,24089 58,24326 58,26042 58,26162 58,26904 58,28229 58,29012 58,30491 58,32867 58,33406 58,33422 58,33977 58,34099 58,37355 58,38769 58,44202 58,45785 58,51967 58,52976 58,53400 58,54972 58,61912 58,62778 58,67101 58,70756 58,72892 58,73409 58,75418 58,75912 58,76815 58,80464 58,83034 58,85929 58,87306 58,90735 58,97867 58,98339 58,99760 58,101634 58,101646 58,101669 58,101731 58,102061 58,102064 58,102578 58,102694 58,102713 58,103067 58,103072 58,105650 58,105765 58,117887 58,118954 58,119306 58,125053 58,127538 58,128801 58,130778 58,135095 58,135981 58,136072 58,136445 58,136666 58,136763 58,142505 58,142729 58,142785 58,145984 58,147413 58,147646 58,157033 58,159359 58,160450 58,170774 58,171631 58,174877 58,183474 58,185463 58,185487 58,192474 58,207000 58,228763 58,231015 58,237080 58,245982 58,258145 58,259062 59,10 59,59 59,446 59,3794 59,67397 60,26 60,59 60,117 60,994 60,1212 60,2674 60,2712 61,58 62,10 62,206 62,306 62,307 63,63 63,146 63,192 63,202 63,203 63,251 63,252 63,275 63,389 63,446 63,471 63,493 63,516 63,685 63,794 63,1011 63,1220 63,1222 63,1243 63,1512 63,2232 63,5060 63,5992 63,6325 63,7186 63,7295 63,7388 63,7755 63,8764 63,9107 63,13242 63,13944 63,16519 63,17312 63,20295 63,24623 63,26179 63,27175 63,28782 63,28957 63,30691 63,31087 63,31218 63,33195 63,33261 63,33491 63,35475 63,35679 63,38999 63,39032 63,40658 63,48781 63,59509 63,63626 63,67110 63,70404 63,83442 63,86329 63,91219 63,92476 63,94906 63,104537 63,113341 63,118360 63,120001 63,123247 63,124353 63,126920 63,128132 63,128222 63,131718 63,139526 63,141855 63,142802 63,148980 63,149244 63,153196 63,153824 63,155082 63,156992 63,160848 63,163415 63,167700 63,170551 63,172549 63,179103 63,189842 63,215276 63,222573 63,229210 63,229675 63,242201 63,245294 63,250716 64,65 64,66 64,868 65,65 65,66 65,79 65,147 65,171 65,184 65,186 65,203 65,207 65,240 65,252 65,256 65,314 65,438 65,466 65,467 65,495 65,571 65,726 65,868 65,1247 65,1427 65,1433 65,1586 65,1747 65,1797 65,2363 65,2414 65,2467 65,2561 65,3439 65,3506 65,3569 65,3744 65,3884 65,4159 65,4446 65,5179 65,5244 65,6921 65,6990 65,7129 65,7178 65,7880 65,9448 65,13181 65,13233 65,13243 65,13693 65,14245 65,14501 65,15199 65,15394 65,15780 65,18242 65,18252 65,18264 65,18271 65,18372 65,18397 65,20323 65,20873 65,23699 65,24575 65,24607 65,26133 65,28360 65,29641 65,30502 65,31250 65,32626 65,32667 65,32725 65,33523 65,34209 65,36682 65,37479 65,37963 65,38412 65,41996 65,42473 65,42521 65,42529 65,43366 65,44155 65,44157 65,44825 65,44826 65,44837 65,44843 65,46172 65,47022 65,48128 65,48315 65,49000 65,49011 65,49221 65,50229 65,54791 65,55735 65,68613 65,70236 65,70908 65,71649 65,72488 66,65 66,66 66,79 66,126 66,186 66,203 66,314 66,466 66,467 66,495 66,570 66,788 66,868 66,1011 66,1151 66,1235 66,1351 66,1433 66,1855 66,2177 66,2343 66,2403 66,2445 66,2561 66,2585 66,3436 66,3569 66,3691 66,3744 66,4089 66,4239 66,4446 66,6602 66,6706 66,6761 66,7037 66,7205 66,7949 66,8409 66,13160 66,13233 66,13519 66,14645 66,14654 66,15212 66,15866 66,17022 66,18169 66,18244 66,18250 66,18532 66,18834 66,20786 66,21409 66,21563 66,22015 66,22127 66,22327 66,23514 66,23616 66,26919 66,28266 66,28951 66,29641 66,34117 66,35264 66,35539 66,36729 66,36823 66,37479 66,41930 66,42451 66,43166 66,43366 66,44195 66,51884 66,54035 66,54520 66,54608 66,57182 66,58420 66,61137 66,63992 66,64075 66,64168 66,65665 66,65916 66,66617 66,75883 66,78616 66,78906 66,85733 66,85979 66,88083 66,91513 66,96593 66,96733 66,105687 66,106301 66,111165 66,116088 67,68 68,41 68,67 68,68 68,126 68,175 68,178 68,186 68,192 68,240 68,255 68,261 68,301 68,314 68,326 68,356 68,387 68,393 68,397 68,431 68,433 68,440 68,467 68,516 68,588 68,590 68,599 68,631 68,673 68,677 68,693 68,694 68,765 68,775 68,794 68,805 68,823 68,843 68,849 68,852 68,872 68,911 68,1004 68,1011 68,1085 68,1119 68,1133 68,1210 68,1240 68,1284 68,1285 68,1326 68,1332 68,1400 68,1466 68,1566 68,1608 68,1634 68,1663 68,1738 68,1782 68,1796 68,1844 68,1853 68,1912 68,1973 68,2036 68,2164 68,2285 68,2307 68,2358 68,2512 68,2556 68,2590 68,2635 68,3407 68,3467 68,3804 68,4190 68,4220 68,4605 68,4751 68,5361 68,5382 68,5390 68,5563 68,5958 68,5991 68,6579 68,6856 68,7170 68,7348 68,8107 68,8246 68,8488 68,9176 68,9228 68,12878 68,13176 68,13265 68,13318 68,13327 68,13563 68,13947 68,15206 68,15991 68,17073 68,18543 68,18667 68,19682 68,19798 68,19815 68,19960 68,19968 68,20301 68,20787 68,20803 68,21645 68,22071 68,22450 68,22711 68,23491 68,23850 68,24989 68,25282 68,25430 68,25800 68,26041 68,26093 68,30042 68,30901 68,31003 68,31302 68,31493 68,33703 68,34828 68,35500 68,38990 68,40942 68,44832 68,45914 68,46165 68,46387 68,47793 68,47805 68,48182 68,48601 68,49752 68,50259 68,50440 68,50442 68,50540 68,50551 68,50552 68,50559 68,50865 68,52585 68,56710 68,58563 68,58975 68,60908 68,62329 68,63035 68,64294 68,65449 68,65877 68,66297 68,66641 68,72733 68,73313 68,76237 68,80194 68,80782 68,83314 68,86101 68,87929 68,88415 68,93691 68,94251 68,94357 68,96789 68,102152 68,103543 68,103566 68,106613 68,107962 68,113353 68,113940 68,117841 68,118367 68,118671 68,119645 68,119863 68,124265 68,124375 68,128171 68,128421 68,129929 68,129964 68,134023 68,137124 68,137767 68,138347 68,138353 68,138743 68,138755 68,140523 68,144231 68,148112 68,148697 68,150593 68,150739 68,155482 68,159742 68,160548 68,160895 68,165015 68,170765 68,174604 68,176485 68,179865 68,182628 68,182810 68,183986 68,185728 68,193763 68,193871 68,194303 68,194449 68,200276 68,201999 68,205222 68,212567 68,213170 68,222688 68,227145 68,228629 68,229194 68,230329 68,230334 68,230902 68,232296 68,232490 68,238565 68,243075 68,245706 68,249905 69,10 70,71 70,72 70,280 70,364 70,485 70,611 70,859 70,920 70,1612 70,2590 70,4220 70,17245 70,66297 70,193129 70,255750 71,372 71,431 71,631 71,676 71,685 71,693 71,911 71,985 71,1113 71,1504 71,1715 71,2989 71,2991 71,3724 71,5356 71,5836 71,7921 71,14633 71,15772 71,15988 71,16497 71,20308 71,20664 71,24600 71,24808 71,26041 71,26450 71,31290 71,37771 71,38176 71,38183 71,59931 71,62483 71,65876 71,76905 71,78746 71,87769 71,90845 71,101818 71,112902 71,116093 71,122905 71,128269 71,131755 71,152181 71,164448 71,185742 71,187523 71,189236 71,191969 71,218524 71,258859 71,258877 71,258880 71,263024 72,72 72,285 72,390 72,510 72,1309 72,1796 72,3507 72,4771 73,113156 74,75 76,20 76,77 76,85 76,86 76,119 76,120 76,142430 77,10 77,2422 77,5259 77,6834 77,7150 77,7763 77,7877 77,9684 77,12743 77,15183 77,16481 77,21522 77,28132 77,29595 77,30556 77,33151 77,34185 77,34726 77,39521 77,39599 77,41621 77,42803 77,43261 77,43349 77,43354 77,45398 77,45664 77,57856 77,61211 77,64066 77,67328 77,70850 77,75180 77,82911 77,87691 77,94256 77,99633 77,126851 77,133674 77,136600 77,138283 77,140390 77,142634 77,145546 77,163919 77,169029 77,169862 77,170043 77,171045 77,181000 77,194424 77,194477 77,212588 77,214103 77,223708 78,79 79,50 79,79 79,99 79,146 79,147 79,175 79,192 79,333 79,336 79,421 79,422 79,425 79,602 79,620 79,622 79,779 79,915 79,1089 79,1181 79,1198 79,1464 79,1562 79,1619 79,1623 79,4534 79,5152 79,6119 79,6492 79,6519 79,7791 79,7948 79,14432 79,15102 79,15770 79,16322 79,16421 79,16563 79,17363 79,18619 79,19555 79,21442 79,22494 79,23157 79,23465 79,23633 79,23783 79,24150 79,24770 79,28107 79,32529 79,34237 79,35581 79,37124 79,37441 79,37480 79,38688 79,39645 79,40612 79,40937 79,42870 79,44118 79,47500 79,51169 79,51260 79,54876 79,74447 79,77105 79,78843 79,79814 79,83314 79,90886 79,92476 79,110128 79,117818 79,117917 79,119341 79,121159 79,121594 79,122526 79,124710 79,129097 79,129839 79,133553 79,137302 79,139004 79,142626 79,152310 79,161733 79,162672 79,165823 79,171024 79,172381 79,172412 79,175962 79,192424 79,193076 79,194459 79,197507 79,201179 79,201977 79,202318 79,205015 79,205270 79,206842 79,207693 79,222543 79,223487 79,228462 79,228981 79,230569 79,230940 79,232881 79,234682 79,234784 79,235936 79,236022 79,238785 79,239963 79,241069 79,241164 79,241911 79,242226 79,242839 79,243246 79,244153 79,245448 79,247337 79,247477 79,247898 79,248318 79,249683 79,250184 79,252472 79,253163 79,253436 79,254755 79,255063 79,255082 79,256229 79,256413 79,256484 79,258786 79,259171 79,259884 79,261014 79,261487 79,262335 79,262380 79,263917 79,264452 80,81 81,10 81,80 81,81 81,215 81,676 81,693 81,704 81,911 81,1003 81,1011 81,1149 81,1212 81,1282 81,1392 81,1402 81,2105 81,2118 81,2210 81,2580 81,4237 81,4367 81,5181 81,5645 81,6247 81,6467 81,6715 81,6976 81,8079 81,8654 81,16511 81,17410 81,17777 81,18590 81,21373 81,21596 81,22470 81,24729 81,26244 81,26486 81,27069 81,29595 81,30232 81,32496 81,36743 81,37224 81,38379 81,41223 81,41232 81,41480 81,42554 81,43315 81,45316 81,46453 81,49247 81,50348 81,52960 81,53929 81,54630 81,55327 81,55328 81,57173 81,65746 81,65880 81,71160 81,75277 81,77695 81,82037 81,83292 81,84022 81,84519 81,84663 81,85777 81,88062 81,91495 81,92141 81,93558 81,95117 81,96614 81,99674 81,105311 81,107981 81,108083 81,110941 81,113178 81,116094 81,119134 81,121424 81,121472 81,122043 81,122093 81,129071 81,133067 81,137941 81,140687 81,141048 81,141914 81,143585 81,144502 81,145649 81,146110 81,146253 81,146924 81,147511 81,148131 81,159005 81,160845 81,161914 81,162884 81,163873 81,165819 81,172115 81,172624 81,173284 81,176905 81,180330 81,180359 81,182162 81,182698 81,182856 81,183687 81,184014 81,187447 81,188081 81,190368 81,190520 81,190595 81,191266 81,191269 81,191271 81,193311 81,197902 81,198433 81,205630 81,217534 81,217536 81,217904 81,218127 81,220417 81,220419 81,220420 81,220422 81,220424 81,220430 81,220994 81,221245 81,228321 81,229271 81,230442 81,232791 81,238460 81,240455 81,257753 81,262451 81,263419 82,83 83,34 83,35 83,83 83,147 83,192 83,217 83,222 83,228 83,283 83,313 83,314 83,356 83,385 83,389 83,397 83,446 83,455 83,457 83,477 83,497 83,536 83,599 83,634 83,676 83,682 83,685 83,693 83,843 83,849 83,852 83,911 83,949 83,1011 83,1118 83,1276 83,1313 83,1417 83,1724 83,1756 83,1770 83,1881 83,1891 83,2000 83,2290 83,2373 83,2421 83,2507 83,2553 83,2646 83,2709 83,2779 83,2784 83,2997 83,3018 83,3603 83,3933 83,3993 83,4109 83,4207 83,4234 83,4295 83,4501 83,5046 83,5270 83,5591 83,5873 83,5906 83,6064 83,6085 83,6112 83,6476 83,6552 83,7430 83,7698 83,7831 83,8097 83,8926 83,9084 83,9212 83,9484 83,9756 83,13397 83,13804 83,13980 83,14262 83,14358 83,16287 83,16537 83,16652 83,16760 83,17121 83,17151 83,17346 83,17488 83,17489 83,17496 83,17498 83,17608 83,17630 83,17638 83,18248 83,18827 83,18831 83,19117 83,19823 83,19903 83,21547 83,21563 83,21677 83,22254 83,22379 83,22382 83,22407 83,22438 83,22455 83,22499 83,22500 83,22501 83,22506 83,22508 83,22511 83,23089 83,23287 83,23547 83,23550 83,23777 83,23866 83,25513 83,26034 83,26879 83,27827 83,27965 83,28130 83,28152 83,28516 83,28659 83,29072 83,29167 83,29461 83,29767 83,30507 83,30678 83,30736 83,31365 83,31379 83,31708 83,31791 83,31881 83,31905 83,31908 83,31910 83,31911 83,31913 83,31916 83,31918 83,32007 83,32011 83,32193 83,32203 83,32442 83,32444 83,32447 83,32449 83,32450 83,32457 83,32463 83,32662 83,32742 83,32749 83,32970 83,33105 83,33246 83,33374 83,33885 83,33972 83,34246 83,34285 83,34290 83,34292 83,34294 83,34297 83,34305 83,34309 83,34315 83,34319 83,34324 83,34349 83,34371 83,35032 83,36796 83,36834 83,36857 83,36859 83,37060 83,37080 83,37738 83,37851 83,38453 83,39067 83,39138 83,39141 83,39144 83,39148 83,39149 83,39151 83,39157 83,39467 83,39496 83,39518 83,40667 83,40785 83,41025 83,41103 83,41124 83,41233 83,41241 83,41377 83,41383 83,41386 83,41399 83,41405 83,41408 83,41409 83,41842 83,41857 83,43299 83,43300 83,43316 83,44048 83,44250 83,44270 83,44287 83,44296 83,44300 83,44302 83,44304 83,44404 83,44408 83,44409 83,44680 83,45321 83,45982 83,46165 83,46392 83,48193 83,48209 83,48258 83,48262 83,48269 83,48273 83,48284 83,48297 83,48300 83,48309 83,48338 83,48342 83,48350 83,48404 83,48426 83,48430 83,48431 83,48434 83,48438 83,48780 83,48783 83,48875 83,49169 83,49262 83,49263 83,50077 83,50098 83,50124 83,50419 83,50590 83,51918 83,51974 83,51993 83,52000 83,52835 83,53141 83,53187 83,53477 83,53720 83,54208 83,54646 83,54669 83,54676 83,54700 83,54707 83,54709 83,54784 83,55012 83,55225 83,55657 83,55716 83,55729 83,56419 83,57007 83,57182 83,59108 83,59788 83,60539 83,62286 83,62347 83,62874 83,63629 83,69329 83,72395 83,72837 83,75295 83,75466 83,77002 83,77005 83,77034 83,77050 83,77495 83,77502 83,77509 83,77513 83,77519 83,77523 83,77527 83,77531 83,77533 83,77735 83,78635 83,78985 83,79665 83,80015 83,80018 83,80020 83,80045 83,80480 83,81067 83,86570 83,87240 83,87878 83,87977 83,87988 83,88325 83,88918 83,89056 83,90938 83,93704 83,96788 83,106309 83,108559 83,108730 83,108972 83,111167 83,111184 83,111423 83,111426 83,111545 83,111901 83,111903 83,111912 83,111921 83,111925 83,112735 83,112837 83,112839 83,112842 83,113087 83,113356 83,113357 83,113505 83,114621 83,114624 83,114628 83,114635 83,114655 83,114787 83,114802 83,114809 83,114810 83,114817 83,114822 83,114827 83,114828 83,114831 83,114832 83,114834 83,114835 83,114837 83,114922 83,114997 83,114998 83,115013 83,115474 83,115503 83,115928 83,115930 83,115931 83,115937 83,115947 83,116369 83,116376 83,117480 83,118378 83,118785 83,118786 83,118787 83,118788 83,118812 83,119256 83,119353 83,119894 83,119955 83,120462 83,120556 83,120677 83,121296 83,121297 83,121303 83,121307 83,121325 83,121327 83,121960 83,122338 83,122375 83,122394 83,122397 83,122457 83,122493 83,122616 83,123027 83,125136 83,126563 83,126564 83,126565 83,126568 83,126570 83,126580 83,126590 83,126592 83,126593 83,126594 83,126673 83,126674 83,126675 83,126676 83,126677 83,126679 83,126681 83,126682 83,126683 83,126685 83,127607 83,127609 83,127776 83,128630 83,129345 83,129714 83,129720 83,129723 83,129897 83,130170 83,130246 83,130684 83,130781 83,130858 83,130877 83,130902 83,131238 83,131297 83,131313 83,131315 83,131638 83,132176 83,132177 83,132186 83,132477 83,132768 83,132962 83,132965 83,132967 83,133021 83,133085 83,133100 83,133103 83,133365 83,133366 83,133485 83,134101 83,134544 83,134553 83,134636 83,134639 83,134644 83,134646 83,134649 83,134693 83,134749 83,134754 83,134758 83,134760 83,134770 83,134788 83,135085 83,135124 83,135132 83,135686 83,135797 83,135892 83,135935 83,135938 83,136201 83,136876 83,139370 83,139401 83,139918 83,139946 83,140700 83,140701 83,140702 83,140703 83,140706 83,140707 83,140708 83,140709 83,140711 83,140715 83,141002 83,141017 83,141020 83,141058 83,141071 83,141320 83,141322 83,141325 83,141329 83,141332 83,141335 83,141336 83,141340 83,141341 83,141342 83,141345 83,141346 83,141348 83,141530 83,141533 83,141548 83,141549 83,141550 83,141556 83,141557 83,141558 83,141561 83,141565 83,141567 83,141570 83,141579 83,141729 83,141764 83,141789 83,141792 83,141962 83,142227 83,142228 83,142229 83,142723 83,142902 83,143080 83,143246 83,143330 83,143439 83,143723 83,144143 83,144159 83,144160 83,144166 83,144633 83,144634 83,144636 83,144637 83,144641 83,144642 83,144645 83,144646 83,144647 83,144652 83,144653 83,144657 83,144670 83,144671 83,144681 83,144685 83,144686 83,144692 83,144695 83,144832 83,144875 83,145153 83,145154 83,145814 83,145820 83,145821 83,145828 83,145833 83,145849 83,145850 83,145879 83,146072 83,146080 83,146081 83,146084 83,146087 83,146091 83,146094 83,146098 83,146099 83,146103 83,146104 83,146639 83,147022 83,147438 83,147441 83,147444 83,147456 83,147459 83,147460 83,147464 83,147469 83,147473 83,147474 83,147486 83,147487 83,147488 83,148663 83,148741 83,148747 83,148755 83,148810 83,148815 83,149141 83,149802 83,149803 83,149804 83,149806 83,149808 83,149809 83,149810 83,149811 83,149812 83,149813 83,149820 83,149821 83,149822 83,149823 83,149825 83,149827 83,149828 83,149831 83,149832 83,149833 83,149834 83,149835 83,149836 83,149837 83,149838 83,149996 83,150489 83,150718 83,150731 83,151849 83,151860 83,151991 83,152434 83,152565 83,161519 83,165229 83,165421 83,165732 83,165733 83,165737 83,165742 83,165893 83,165904 83,165908 83,165910 83,165911 83,165915 83,165926 83,165928 83,165934 83,165936 83,165938 83,165941 83,165946 83,166455 83,166486 83,166492 83,166532 83,168709 83,168917 83,170377 83,170382 83,170388 83,170389 83,170395 83,170396 83,170526 83,171008 83,171075 83,171508 83,171531 83,171566 83,171570 83,171572 83,171573 83,171574 83,174383 83,174464 83,174733 83,174773 83,175726 83,175847 83,176131 83,176134 83,176140 83,176364 83,176475 83,176482 83,176774 83,177345 83,177423 83,177640 83,177987 83,178136 83,178137 83,178141 83,178146 83,178147 83,178148 83,178150 83,178152 83,178325 83,179273 83,179842 83,181041 83,181063 83,181606 83,182798 83,183653 83,186901 83,186904 83,186989 83,186990 83,188245 83,188260 83,188397 83,189261 83,190359 83,195218 83,199143 83,203502 83,203793 83,204122 83,207537 83,213453 83,213472 83,213680 83,213681 83,213682 83,213684 83,213704 83,213707 83,213711 83,213719 83,213720 83,213722 83,213724 83,213728 83,213730 83,213735 83,213736 83,213737 83,213741 83,213742 83,213747 83,213748 83,213941 83,213942 83,214018 83,214022 83,214031 83,214122 83,214126 83,214175 83,214548 83,215874 83,217443 83,217577 83,217579 83,217621 83,217624 83,217629 83,217631 83,217648 83,217649 83,217893 83,217898 83,217996 83,218000 83,218047 83,218049 83,218054 83,218056 83,218064 83,218071 83,218072 83,218081 83,218090 83,218092 83,218097 83,218099 83,218100 83,218390 83,218771 83,218785 83,218854 83,218860 83,218874 83,219160 83,219164 83,221810 83,221947 83,221984 83,222374 83,222381 83,222384 83,222545 83,222560 83,222583 83,223707 83,223955 83,224040 83,224547 83,226231 83,226243 83,227937 83,227938 83,228542 83,228586 83,228589 83,229042 83,229099 83,229105 83,229620 83,229625 83,229630 83,229639 83,233384 83,233503 83,235887 83,241723 83,241739 83,242342 83,242410 83,243487 83,244662 83,244667 83,244668 83,244671 83,244676 83,244686 83,244687 83,244688 83,244695 83,244698 83,245301 83,245394 83,245480 83,246700 83,246723 83,246725 83,246730 83,246733 83,246736 83,246737 83,246739 83,246742 83,246754 83,246766 83,246767 83,246769 83,246771 83,246772 83,246774 83,247758 83,249036 83,249667 83,250290 83,250508 83,250509 83,250511 83,250512 83,250525 83,250631 83,250785 83,250788 83,250819 83,250827 83,250850 83,250853 83,251197 83,251201 83,251828 83,251847 83,251863 83,251867 83,251872 83,257690 83,257711 83,258383 83,258559 83,258823 83,261385 83,261386 83,261394 83,261517 83,261522 83,264736 83,264742 83,264743 83,264751 83,264754 83,264820 84,44 86,11 86,86 86,167 86,255 86,256 86,299 86,314 86,563 86,589 86,663 86,673 86,783 86,794 86,838 86,907 86,932 86,941 86,972 86,1014 86,1117 86,1130 86,1133 86,1167 86,1192 86,1241 86,1262 86,1284 86,1298 86,1319 86,1337 86,1436 86,1522 86,1544 86,1629 86,1796 86,1837 86,1849 86,2083 86,2372 86,2557 86,2767 86,2840 86,2979 86,3207 86,3392 86,5146 86,5301 86,5662 86,6123 86,7164 86,7792 86,7881 86,8023 86,8534 86,10363 86,12077 86,15182 86,16127 86,16626 86,16660 86,16663 86,18249 86,19339 86,19413 86,19637 86,19742 86,19745 86,22441 86,23857 86,29060 86,32532 86,32591 86,32651 86,32799 86,34017 86,35036 86,38383 86,38994 86,40963 86,41388 86,42157 86,42882 86,45881 86,56023 86,57048 86,62206 86,62797 86,64223 86,65843 86,68175 86,68313 86,68645 86,70940 86,73355 86,77716 86,79580 86,81160 86,82207 86,89659 86,90379 86,90380 86,90810 86,91860 86,97364 86,98409 86,101796 86,102671 86,103058 86,116265 86,120830 86,128516 86,148824 86,155682 86,158326 86,175433 86,176402 86,176484 86,193533 86,234106 86,247906 86,255646 86,259653 87,10 87,111 87,510 87,623 87,685 87,808 87,852 87,872 87,919 87,1118 87,1240 87,1653 87,1860 87,1973 87,2253 87,2697 87,3507 87,4039 87,4760 88,89 90,91 92,93 92,94 94,25 94,26 94,47 94,59 94,93 94,94 94,116 94,147 94,250 94,430 94,609 94,885 94,886 94,887 94,994 94,1085 94,1235 94,1255 94,1335 94,1432 94,1684 94,1882 94,1888 94,2087 94,2088 94,2244 94,2469 94,2787 94,4748 94,6556 94,9542 94,16153 94,21944 94,39455 94,50943 94,89035 95,58 96,7 96,97 97,10 97,96 97,97 97,147 97,175 97,186 97,192 97,217 97,240 97,327 97,328 97,397 97,440 97,452 97,467 97,485 97,510 97,516 97,563 97,640 97,693 97,808 97,838 97,841 97,872 97,920 97,1014 97,1096 97,1118 97,1217 97,1417 97,1485 97,1796 97,2496 97,3009 97,3134 97,3144 97,3378 97,4337 97,5401 97,5420 97,6590 97,6790 97,6811 97,6904 97,6956 97,7087 97,7117 97,7796 97,7929 97,8144 97,8216 97,8520 97,14017 97,14287 97,14939 97,15351 97,15692 97,16374 97,16525 97,17348 97,17535 97,17942 97,18602 97,19487 97,19555 97,21394 97,22163 97,23104 97,25425 97,30460 97,31300 97,32402 97,36132 97,38342 97,38361 97,40116 97,40988 97,41252 97,42031 97,42776 97,45541 97,45618 97,46637 97,50571 97,51361 97,55023 97,56409 97,58297 97,59556 97,60885 97,62421 97,68075 97,68317 97,70518 97,71736 97,72555 97,73793 97,77836 97,79283 97,79555 97,81118 97,82974 97,87846 97,87852 97,87910 97,90704 97,90713 97,91008 97,91587 97,96633 97,96663 97,98178 97,98832 97,99661 97,101851 97,103125 97,105566 97,109945 97,109951 97,110719 97,111793 97,116055 97,117770 97,119977 97,122063 97,123849 97,124114 97,124339 97,129614 97,131277 97,131644 97,135258 97,138093 97,138152 97,141479 97,142388 97,142786 97,145137 97,149675 97,150471 97,153128 97,155079 97,159424 97,161193 97,168329 97,171137 97,178687 97,183832 97,184268 97,185944 97,189171 97,192978 97,197819 97,213521 97,214666 97,218122 97,219905 97,220851 97,223780 97,227904 97,229675 97,232734 97,236047 97,241713 97,243737 97,245558 97,247213 97,247738 97,248504 97,251595 97,253929 97,257201 97,258901 97,259788 97,263067 97,263150 97,263960 98,1 98,99 98,1181 98,240174 99,1 99,50 99,56 99,79 99,98 99,146 99,147 99,149 99,158 99,192 99,285 99,333 99,336 99,406 99,446 99,505 99,602 99,620 99,640 99,779 99,841 99,852 99,1011 99,1198 99,1218 99,1276 99,1425 99,1973 99,2374 99,3507 99,3895 99,3970 99,3997 99,4601 99,4685 99,5822 99,8070 99,9394 99,13221 99,14570 99,15192 99,17151 99,17280 99,19385 99,35577 99,36370 99,38834 99,39646 99,39652 99,39654 99,39659 99,41385 99,44344 99,46291 99,49553 99,55075 99,57820 99,60576 99,65809 99,67213 99,68069 99,74700 99,79768 99,80307 99,84689 99,90871 99,92476 99,93073 99,93331 99,95413 99,97286 99,106502 99,106987 99,107342 99,109367 99,118022 99,118224 99,122702 99,136603 99,140569 99,141823 99,141945 99,144849 99,146743 99,147458 99,152139 99,157417 99,170656 99,170693 99,180327 99,180487 99,180944 99,181806 99,184259 99,206263 99,212528 99,229958 99,240174 99,247337 99,250870 99,251497 99,252657 99,254963 100,72 101,102 101,2416 101,2417 102,102 102,518 102,852 102,911 102,1113 102,1323 102,1326 102,3193 102,8054 102,15849 102,21970 102,21989 102,23079 102,28400 102,30386 102,31103 102,31989 102,32066 102,32067 102,34823 102,37717 102,41966 102,43085 102,47739 102,50723 102,62871 102,63049 102,65681 102,66502 102,68913 102,71872 102,74523 102,77643 102,77648 102,80951 102,84063 102,86651 102,95539 102,102531 102,105153 102,164292 102,174006 102,174401 102,188749 102,191379 102,215213 102,241180 102,260246 103,104 104,24 104,30 104,87 104,103 104,104 104,107 104,108 104,111 104,116 104,134 104,135 104,136 104,137 104,138 104,200 104,215 104,217 104,225 104,227 104,240 104,248 104,254 104,264 104,289 104,290 104,298 104,304 104,312 104,323 104,327 104,328 104,332 104,364 104,372 104,373 104,420 104,502 104,503 104,557 104,572 104,588 104,590 104,596 104,599 104,609 104,612 104,621 104,631 104,632 104,636 104,677 104,714 104,715 104,760 104,761 104,772 104,797 104,805 104,849 104,850 104,851 104,852 104,862 104,903 104,943 104,953 104,954 104,999 104,1011 104,1016 104,1045 104,1046 104,1085 104,1119 104,1149 104,1179 104,1212 104,1235 104,1257 104,1267 104,1282 104,1309 104,1332 104,1335 104,1346 104,1365 104,1368 104,1381 104,1415 104,1416 104,1417 104,1432 104,1459 104,1462 104,1505 104,1511 104,1572 104,1608 104,1631 104,1641 104,1659 104,1663 104,1690 104,1704 104,1715 104,1745 104,1749 104,1758 104,1771 104,1808 104,1818 104,1844 104,1882 104,1939 104,1955 104,1980 104,2008 104,2052 104,2069 104,2105 104,2205 104,2206 104,2208 104,2210 104,2376 104,2384 104,2417 104,2443 104,2572 104,2587 104,2596 104,2620 104,2927 104,2934 104,2991 104,3085 104,3247 104,3474 104,3508 104,3585 104,3586 104,3590 104,3613 104,3840 104,3944 104,4024 104,4141 104,4218 104,4220 104,4222 104,4237 104,4276 104,4308 104,4355 104,4367 104,4520 104,4565 104,4574 104,4692 104,4712 104,4919 104,5011 104,5053 104,5155 104,5258 104,5372 104,5405 104,5439 104,5622 104,5702 104,5809 104,5876 104,5902 104,6023 104,6078 104,6136 104,6312 104,6569 104,6674 104,6818 104,6853 104,6856 104,7194 104,7432 104,7507 104,7879 104,8049 104,8180 104,8243 104,8279 104,8537 104,8622 104,8632 104,9391 104,9397 104,9700 104,9739 104,12747 104,13205 104,13207 104,13273 104,13539 104,13717 104,13912 104,13928 104,13969 104,14080 104,14193 104,14536 104,14820 104,14998 104,15010 104,15091 104,15163 104,15221 104,15229 104,15277 104,15337 104,15413 104,15470 104,15654 104,15658 104,15673 104,15782 104,16263 104,16294 104,16551 104,16552 104,16617 104,16640 104,16709 104,17137 104,17214 104,17217 104,17461 104,18013 104,18142 104,18175 104,18656 104,18673 104,18844 104,18877 104,18933 104,18965 104,19090 104,19278 104,19566 104,19617 104,19690 104,19798 104,20025 104,20164 104,20741 104,20749 104,20757 104,20781 104,20787 104,20813 104,20899 104,21608 104,21669 104,22081 104,22090 104,22098 104,22149 104,22173 104,22268 104,22288 104,22866 104,23269 104,23270 104,23808 104,24243 104,24739 104,24839 104,25138 104,25385 104,25432 104,25479 104,25571 104,26116 104,26241 104,26244 104,26257 104,26546 104,26682 104,26729 104,26881 104,27050 104,27084 104,27797 104,28042 104,28191 104,28706 104,28746 104,28891 104,28956 104,28967 104,29562 104,29662 104,30197 104,30209 104,30210 104,30268 104,30373 104,30733 104,30997 104,31159 104,31236 104,31302 104,31358 104,31474 104,31963 104,31964 104,32057 104,32576 104,32643 104,32810 104,32981 104,33424 104,33567 104,33602 104,34097 104,34100 104,34531 104,34820 104,34951 104,35318 104,35337 104,35348 104,35388 104,35530 104,35614 104,37063 104,37424 104,37492 104,37515 104,37816 104,38463 104,38612 104,38822 104,40813 104,41078 104,41314 104,41501 104,41871 104,43257 104,43678 104,43903 104,44084 104,44122 104,44266 104,44268 104,44271 104,44396 104,44407 104,44725 104,45010 104,45296 104,45527 104,45763 104,46750 104,46783 104,46874 104,48532 104,48602 104,48620 104,49053 104,49064 104,49617 104,50353 104,50745 104,51663 104,51667 104,51670 104,51671 104,52056 104,52103 104,52210 104,52282 104,54615 104,54904 104,55107 104,55160 104,55168 104,57583 104,57606 104,57711 104,57714 104,58093 104,59123 104,59646 104,59675 104,59680 104,59832 104,59960 104,59998 104,60886 104,62192 104,62204 104,62210 104,62556 104,63279 104,65088 104,65152 104,65510 104,65525 104,65593 104,65681 104,65864 104,65995 104,65997 104,66041 104,66071 104,66157 104,66343 104,66894 104,67812 104,68464 104,70637 104,70970 104,71385 104,71650 104,71825 104,71862 104,74387 104,74423 104,74696 104,76180 104,78772 104,78891 104,78923 104,79975 104,81508 104,81703 104,82758 104,83325 104,83496 104,83737 104,84116 104,84501 104,84551 104,85501 104,85726 104,85804 104,87929 104,88062 104,88133 104,88469 104,89637 104,89662 104,89847 104,90048 104,90161 104,91952 104,92047 104,92048 104,93110 104,94134 104,94779 104,96657 104,98275 104,99504 104,99611 104,101981 104,102250 104,102570 104,102712 104,103189 104,103778 104,104630 104,106130 104,107959 104,111142 104,111252 104,112361 104,112909 104,113559 104,113636 104,114540 104,115397 104,118503 104,118634 104,119584 104,121033 104,121156 104,121653 104,121750 104,121752 104,123185 104,123547 104,123914 104,124140 104,124460 104,125967 104,126377 104,126407 104,126971 104,126983 104,127164 104,127318 104,127639 104,128118 104,128156 104,128439 104,130731 104,130771 104,131218 104,131219 104,131220 104,131226 104,131308 104,132008 104,132244 104,132884 104,133368 104,133457 104,133546 104,136072 104,136194 104,138586 104,139100 104,139111 104,140085 104,140289 104,140773 104,141203 104,142258 104,142516 104,143402 104,143738 104,143961 104,145056 104,145081 104,145625 104,146137 104,146249 104,147433 104,148063 104,149790 104,149863 104,155441 104,156571 104,156951 104,158354 104,159100 104,159391 104,159451 104,159722 104,160450 104,160727 104,161315 104,161658 104,163279 104,164267 104,165302 104,166638 104,167029 104,167414 104,167537 104,167581 104,167846 104,168456 104,168797 104,168961 104,168971 104,169350 104,169802 104,169818 104,170026 104,170245 104,171231 104,171599 104,172218 104,172616 104,172624 104,173268 104,173967 104,174508 104,174910 104,175354 104,175967 104,176782 104,178253 104,178828 104,179132 104,180226 104,180390 104,181056 104,181187 104,181883 104,181977 104,182162 104,182217 104,182345 104,182606 104,183839 104,185545 104,185666 104,185910 104,185943 104,186065 104,187682 104,189754 104,190217 104,190276 104,191899 104,193093 104,194832 104,194984 104,195140 104,196458 104,198387 104,203275 104,203276 104,203282 104,203362 104,204014 104,207051 104,213156 104,214427 104,214979 104,215821 104,216645 104,217537 104,218348 104,218481 104,222145 104,222366 104,223682 104,223737 104,224063 104,225656 104,234874 104,237226 104,238005 104,238726 104,239571 104,241228 104,243079 104,243325 104,245910 104,247787 104,248191 104,249447 104,249576 104,251609 104,254010 104,254932 104,257366 104,259431 104,259720 104,260906 104,261214 104,263048 104,264438 104,265127 105,106 106,1 106,37 106,106 106,146 106,147 106,149 106,158 106,192 106,207 106,287 106,301 106,333 106,336 106,337 106,388 106,406 106,446 106,505 106,506 106,586 106,599 106,640 106,663 106,664 106,693 106,698 106,720 106,818 106,841 106,874 106,877 106,879 106,911 106,1010 106,1027 106,1118 106,1220 106,1222 106,1284 106,1293 106,1370 106,1425 106,1515 106,1568 106,1572 106,1619 106,1623 106,1848 106,1849 106,1888 106,1973 106,1985 106,2077 106,2169 106,2759 106,2782 106,3448 106,3718 106,4272 106,4342 106,5204 106,6119 106,6634 106,6813 106,6998 106,7532 106,8170 106,8867 106,13227 106,13621 106,14396 106,20557 106,21202 106,21268 106,23147 106,24242 106,24566 106,24659 106,25309 106,26034 106,28794 106,28795 106,29578 106,29760 106,30518 106,30713 106,30887 106,34247 106,34773 106,36602 106,37530 106,39549 106,40440 106,41288 106,41723 106,42787 106,43005 106,50280 106,50281 106,50398 106,53032 106,53726 106,54434 106,55440 106,56298 106,56896 106,59021 106,60352 106,60576 106,60701 106,62589 106,64200 106,64865 106,65844 106,67164 106,71802 106,72575 106,75783 106,79752 106,84519 106,87282 106,87285 106,87976 106,92476 106,93515 106,94037 106,100060 106,102560 106,103447 106,110506 106,115961 106,119502 106,122159 106,122606 106,123860 106,123890 106,125539 106,130180 106,131031 106,131267 106,139522 106,145003 106,146800 106,150038 106,157007 106,157382 106,158590 106,168463 106,168465 106,173297 106,176964 106,182491 106,182745 106,182903 106,183481 106,186657 106,187065 106,189303 106,190492 106,214152 106,216518 106,227954 106,237274 106,237280 106,238773 106,247056 106,249816 106,252320 106,259125 106,264510 107,10 107,104 107,107 107,108 107,111 107,112 107,175 107,182 107,292 107,338 107,364 107,441 107,442 107,462 107,502 107,503 107,557 107,586 107,609 107,626 107,660 107,682 107,685 107,693 107,715 107,745 107,749 107,795 107,801 107,849 107,1015 107,1146 107,1238 107,1368 107,1388 107,1572 107,1584 107,1652 107,1677 107,1722 107,1738 107,1844 107,1939 107,2237 107,2315 107,2395 107,2451 107,2646 107,2678 107,2802 107,2874 107,3538 107,3830 107,3856 107,3951 107,4039 107,4520 107,4771 107,4781 107,4783 107,4839 107,5423 107,5574 107,6139 107,6398 107,6569 107,6792 107,7074 107,7087 107,7348 107,7486 107,7731 107,8180 107,8557 107,9303 107,13506 107,14193 107,15331 107,15447 107,15513 107,16306 107,17315 107,18632 107,18933 107,20612 107,21330 107,23126 107,23468 107,23609 107,23817 107,24760 107,24834 107,25529 107,25728 107,26097 107,28244 107,29312 107,29907 107,30493 107,32740 107,35335 107,35614 107,36279 107,37414 107,38856 107,41824 107,43647 107,45744 107,50553 107,50846 107,53333 107,55989 107,56288 107,56358 107,56463 107,57211 107,57872 107,58918 107,62349 107,62351 107,63132 107,63494 107,63802 107,64514 107,64603 107,69423 107,72439 107,73337 107,75319 107,77588 107,78663 107,79541 107,80474 107,80797 107,81453 107,81546 107,82244 107,88273 107,89915 107,97506 107,104590 107,111279 107,111367 107,113500 107,114415 107,114575 107,118678 107,120855 107,121002 107,121125 107,121187 107,124448 107,125331 107,126201 107,126393 107,128728 107,130357 107,130513 107,132232 107,135257 107,137182 107,138491 107,139385 107,140928 107,141125 107,142519 107,142770 107,144902 107,144917 107,147355 107,147492 107,148425 107,150358 107,151040 107,152184 107,158642 107,162741 107,164052 107,168830 107,169882 107,170204 107,170604 107,171090 107,172701 107,175221 107,176994 107,180990 107,181248 107,181250 107,181251 107,181252 107,181732 107,182430 107,184832 107,185002 107,185523 107,189827 107,190341 107,192643 107,211977 107,212462 107,217246 107,217374 107,218124 107,219220 107,220452 107,221062 107,228709 107,230610 107,239475 107,243702 107,244938 107,247882 107,248721 107,249055 107,250832 107,251998 107,256475 107,258942 107,259514 107,261484 107,263183 107,263256 108,104 108,107 108,111 108,248 108,760 108,1149 108,1631 108,2867 108,22880 109,109 109,110 109,257 109,366 109,500 109,718 109,1063 109,1518 109,1623 109,1847 109,2004 109,2592 109,2593 109,2597 109,2598 109,2601 109,2602 109,2606 109,4003 109,4275 109,4375 109,4446 109,4871 109,5174 109,5351 109,5401 109,5462 109,5467 109,5851 109,6547 109,6614 109,6858 109,7417 109,7739 109,7766 109,8069 109,9093 109,13854 109,14457 109,14647 109,14817 109,15560 109,16227 109,16228 109,16301 109,16324 109,16361 109,16425 109,17922 109,18984 109,19012 109,19029 109,19030 109,19537 109,19847 109,20403 109,20431 109,21158 109,21920 109,22296 109,23461 109,25388 109,25996 109,27065 109,28158 109,28220 109,28851 109,28983 109,31432 109,32279 109,32293 109,33375 109,35501 109,35537 109,35567 109,36565 109,36807 109,36860 109,37369 109,38194 109,38853 109,40035 109,43429 109,43666 109,43714 109,43752 109,43753 109,51257 109,54645 109,55046 109,55047 109,55049 109,55182 109,55183 109,55470 109,61913 109,61982 109,61983 109,61984 109,63628 109,66479 109,66501 109,67267 109,70014 109,70016 109,70017 109,70018 109,70435 109,75088 109,75883 109,76313 109,78682 109,78683 109,78684 109,78739 109,78740 109,80383 109,80387 109,81117 109,81997 109,81998 109,81999 109,82253 109,82652 109,82894 109,82895 109,82896 109,83205 109,84487 109,84488 109,85821 109,85822 109,85875 109,85888 109,89146 109,92386 109,96590 109,97672 109,101085 109,101958 109,101964 109,104338 109,104637 109,105002 109,105651 109,111820 109,128662 109,129212 109,129213 109,129214 109,129215 109,129216 109,130535 109,135947 109,135948 109,135949 109,136027 109,137031 109,141850 109,141851 109,141892 109,141974 109,142530 109,142761 109,142762 109,147566 109,151995 109,153446 109,154850 109,159439 109,159783 109,159784 109,159940 109,159941 109,159942 109,159943 109,159944 109,160340 109,162565 109,162567 109,163103 109,164977 109,164978 109,166690 109,169327 109,171335 109,172138 109,172471 109,172472 109,173189 109,173463 109,175020 109,175021 109,175029 109,175191 109,176318 109,176408 109,176751 109,182308 109,182656 109,182657 109,182658 109,183848 109,183924 109,184939 109,185278 109,185366 109,185367 109,185368 109,185369 109,185691 109,187029 109,187193 109,190297 109,191268 109,191331 109,191476 109,191829 109,192936 109,192937 109,193940 109,212177 109,212178 109,214052 109,215794 109,217900 109,219172 109,219281 109,219282 109,219291 109,219294 109,220046 109,220047 109,220383 109,220441 109,220446 111,111 113,26 113,114 113,115 113,116 113,117 113,118 113,430 113,885 113,994 113,2087 113,13704 113,21944 113,54870 113,67397 114,26 114,59 114,994 115,115 115,118 116,26 116,59 116,114 116,116 116,117 116,135 116,138 116,430 116,588 116,590 116,885 116,994 116,1204 116,1235 116,1335 116,2087 116,2674 116,2712 116,13704 116,16153 116,21944 118,4 118,5 118,94 118,115 118,116 118,118 118,330 118,430 118,886 118,994 118,1235 118,1335 118,2087 118,2787 118,3795 118,3796 118,3816 118,3817 118,4597 118,39455 118,260833 119,872 119,1063 119,4139 119,13199 119,17273 119,21678 119,23424 119,24360 119,30745 119,31591 119,35079 119,38117 119,38430 119,39475 119,39554 119,40252 119,45299 119,76642 119,101953 119,119158 119,127144 119,132935 119,148485 120,34 120,35 120,85 120,119 120,120 120,217 120,240 120,261 120,332 120,372 120,503 120,588 120,590 120,694 120,728 120,814 120,818 120,838 120,918 120,949 120,978 120,1011 120,1118 120,1203 120,1353 120,1417 120,1419 120,1466 120,1505 120,1608 120,1808 120,1879 120,2511 120,2512 120,2619 120,2797 120,2812 120,2824 120,2989 120,2991 120,3115 120,3319 120,3504 120,3955 120,4109 120,4132 120,4137 120,4194 120,4377 120,4486 120,4549 120,4752 120,5223 120,5294 120,5331 120,5346 120,5451 120,5702 120,6773 120,6853 120,6856 120,7041 120,7087 120,7196 120,7221 120,7266 120,7944 120,8156 120,9005 120,9021 120,9463 120,11147 120,13251 120,13328 120,13334 120,13549 120,13664 120,14126 120,14358 120,14820 120,15283 120,15339 120,15397 120,15562 120,15574 120,15580 120,15604 120,15653 120,15673 120,15693 120,15732 120,15741 120,15767 120,15799 120,15931 120,16505 120,16661 120,17297 120,18142 120,18387 120,18586 120,18606 120,18641 120,19415 120,19528 120,19561 120,19622 120,19660 120,19857 120,20284 120,20525 120,20535 120,20540 120,20603 120,20686 120,20747 120,22029 120,22233 120,22279 120,22939 120,23625 120,23634 120,23683 120,24360 120,26242 120,26441 120,27041 120,28338 120,28844 120,28857 120,29038 120,29741 120,31517 120,31729 120,31737 120,32288 120,32688 120,32824 120,32854 120,33519 120,34112 120,34380 120,35021 120,35464 120,35546 120,36483 120,36813 120,37857 120,37895 120,38111 120,38318 120,38974 120,40025 120,40699 120,40828 120,41124 120,41169 120,41951 120,42070 120,42454 120,42762 120,43223 120,43341 120,44256 120,45079 120,46321 120,46391 120,46799 120,46918 120,47247 120,48177 120,48299 120,48372 120,48437 120,48478 120,48620 120,48639 120,48892 120,49104 120,49570 120,49647 120,49653 120,49655 120,49685 120,49691 120,49695 120,50209 120,50440 120,51206 120,51211 120,51465 120,51503 120,51505 120,53495 120,53623 120,54571 120,55672 120,55681 120,55924 120,56346 120,59211 120,59245 120,61211 120,61411 120,61943 120,62262 120,63179 120,63244 120,66468 120,67266 120,72100 120,72701 120,74533 120,78951 120,79533 120,80488 120,82162 120,82169 120,83927 120,84677 120,85859 120,96782 120,98788 120,99387 120,99878 120,102273 120,104536 120,109819 120,116590 120,118425 120,118459 120,119102 120,119625 120,120508 120,120526 120,123007 120,123960 120,124822 120,125133 120,125445 120,126049 120,130275 120,130866 120,131034 120,131043 120,131216 120,131224 120,132973 120,133113 120,133440 120,135270 120,135285 120,136482 120,136483 120,136484 120,136485 120,136486 120,136487 120,136488 120,136489 120,136490 120,136491 120,136492 120,136493 120,136494 120,136495 120,136496 120,136497 120,136498 120,136499 120,136500 120,136501 120,136502 120,136503 120,136504 120,136505 120,136506 120,136507 120,136508 120,136509 120,136510 120,136617 120,137791 120,138035 120,139587 120,142088 120,142883 120,143282 120,143413 120,144072 120,144375 120,146410 120,154154 120,155520 120,157303 120,159495 120,159690 120,161191 120,167130 120,170647 120,172784 120,174548 120,174584 120,174585 120,174588 120,174608 120,174609 120,174610 120,174611 120,174612 120,175380 120,175390 120,176926 120,177312 120,178805 120,179129 120,179155 120,179158 120,179161 120,179162 120,179195 120,179204 120,179206 120,179210 120,179211 120,179213 120,179351 120,179362 120,179367 120,179371 120,179372 120,179722 120,180095 120,180346 120,180616 120,182308 120,183860 120,184020 120,184908 120,185653 120,187527 120,194481 120,194586 120,198253 120,202348 120,202462 120,204022 120,204041 120,205903 120,206457 120,207126 120,208036 120,211967 120,212426 120,213051 120,216204 120,217087 120,218013 120,218406 120,218468 120,219794 120,219903 120,220551 120,221165 120,222127 120,223690 120,224281 120,224567 120,228497 120,230436 120,230496 120,231090 120,231309 120,232056 120,232274 120,233700 120,234933 120,240396 120,241317 120,242376 120,242384 120,243627 120,244021 120,244070 120,247355 120,250584 120,252078 120,252648 120,252895 120,253260 120,257256 120,257662 120,258108 120,258862 120,261825 120,263110 121,122 123,102 123,2416 123,2417 124,10 124,113156 125,126 126,20 126,66 126,68 126,125 126,126 126,158 126,207 126,259 126,301 126,336 126,366 126,397 126,441 126,452 126,457 126,505 126,509 126,510 126,535 126,604 126,676 126,849 126,852 126,868 126,872 126,911 126,918 126,972 126,1011 126,1014 126,1118 126,1135 126,1147 126,1151 126,1204 126,1267 126,1293 126,1298 126,1370 126,1402 126,1417 126,1453 126,1566 126,1619 126,1655 126,1663 126,1796 126,1844 126,1893 126,1949 126,2373 126,2511 126,2520 126,3182 126,3392 126,3524 126,3999 126,4165 126,4276 126,4514 126,4769 126,5851 126,6801 126,6824 126,7530 126,8055 126,14196 126,14652 126,16201 126,17551 126,18583 126,20071 126,20757 126,22214 126,25532 126,28340 126,29154 126,29757 126,31280 126,33326 126,33672 126,34320 126,35006 126,35543 126,38259 126,38261 126,38273 126,42928 126,48799 126,55298 126,62428 126,63095 126,64715 126,68887 126,70044 126,70395 126,74122 126,75295 126,76802 126,76815 126,80425 126,81233 126,84719 126,88389 126,89035 126,94175 126,94249 126,94741 126,98181 126,99916 126,103934 126,109434 126,122620 126,122623 126,137819 126,141846 126,142362 126,144932 126,146311 126,146757 126,158950 126,160834 126,163802 126,163884 126,168823 126,168886 126,170610 126,170947 126,172628 126,173295 126,174408 126,175245 126,175326 126,177015 126,178701 126,181932 126,190566 126,207659 126,214734 126,241534 126,263881 127,22 128,1 129,130 130,48 130,87 130,130 130,135 130,431 130,676 130,808 130,843 130,919 130,1192 130,1860 130,3538 130,6824 130,7768 130,60576 131,30 131,328 131,1179 131,1305 132,4 132,5 133,104 133,134 133,135 133,136 133,137 133,138 133,1368 133,2105 134,30 134,40 134,104 134,134 134,135 134,136 134,137 134,138 134,175 134,200 134,225 134,233 134,248 134,254 134,298 134,327 134,328 134,332 134,364 134,372 134,373 134,431 134,446 134,502 134,557 134,590 134,636 134,677 134,685 134,693 134,714 134,715 134,772 134,800 134,805 134,850 134,953 134,1001 134,1011 134,1119 134,1179 134,1212 134,1282 134,1332 134,1359 134,1368 134,1415 134,1432 134,1459 134,1844 134,1882 134,1939 134,2105 134,2208 134,2209 134,2210 134,2237 134,2376 134,3032 134,3135 134,3246 134,3247 134,3508 134,3535 134,3672 134,3840 134,3944 134,4237 134,4276 134,4355 134,4367 134,4524 134,4919 134,5011 134,5405 134,5439 134,5573 134,6668 134,6828 134,6881 134,6908 134,7124 134,7270 134,7879 134,8049 134,8133 134,8275 134,8285 134,8414 134,8994 134,9739 134,9790 134,11346 134,13207 134,13356 134,13408 134,14597 134,15292 134,15337 134,15470 134,15721 134,16361 134,16382 134,17076 134,17461 134,18515 134,18965 134,19798 134,20164 134,20781 134,21533 134,21591 134,22169 134,22288 134,23452 134,24243 134,24781 134,24791 134,26682 134,26729 134,28112 134,28191 134,28442 134,28787 134,29595 134,30201 134,30210 134,30268 134,30373 134,30733 134,31159 134,31963 134,32057 134,32478 134,34920 134,34951 134,36939 134,36954 134,37612 134,37651 134,40169 134,41314 134,43394 134,45763 134,47805 134,48188 134,49035 134,50745 134,52150 134,52202 134,52282 134,54587 134,54904 134,55808 134,56454 134,56537 134,56968 134,57604 134,59006 134,59154 134,59208 134,59832 134,60506 134,60886 134,62087 134,62192 134,62419 134,63728 134,63741 134,65864 134,66637 134,67812 134,70637 134,71093 134,71123 134,72021 134,72639 134,72796 134,73745 134,73938 134,74423 134,74942 134,75187 134,78772 134,79020 134,79320 134,79524 134,79723 134,80272 134,80725 134,80899 134,81102 134,82125 134,82375 134,83135 134,83496 134,83899 134,84518 134,87451 134,89662 134,90468 134,93597 134,95520 134,96589 134,96794 134,98113 134,99611 134,101851 134,106130 134,106171 134,107959 134,107987 134,108002 134,110043 134,114508 134,116613 134,117589 134,118359 134,118968 134,119987 134,123899 134,124460 134,125476 134,128234 134,129534 134,129608 134,129957 134,130731 134,131216 134,131381 134,131993 134,132040 134,132884 134,132921 134,133316 134,133833 134,135096 134,135984 134,136278 134,137069 134,139250 134,139522 134,139710 134,140072 134,142808 134,143646 134,144726 134,145092 134,146218 134,146563 134,147891 134,148265 134,150312 134,152138 134,154179 134,154375 134,154795 134,156118 134,156127 134,156132 134,157332 134,163891 134,164502 134,165097 134,166290 134,167344 134,167688 134,169011 134,169314 134,170233 134,171104 134,171175 134,171258 134,171722 134,171736 134,172703 134,172713 134,173827 134,176599 134,179777 134,180954 134,182345 134,183299 134,187851 134,190239 134,191241 134,193936 134,194711 134,200655 134,200660 134,201016 134,201718 134,201946 134,202182 134,203076 134,205627 134,207051 134,207454 134,207659 134,217537 134,217836 134,219141 134,223686 134,226416 134,227565 134,236060 134,238220 134,243418 134,243491 134,247642 134,250984 134,254706 134,257287 134,262203 135,19 135,30 135,54 135,104 135,116 135,130 135,134 135,135 135,136 135,137 135,138 135,144 135,200 135,225 135,248 135,298 135,304 135,327 135,328 135,364 135,372 135,373 135,431 135,455 135,557 135,631 135,636 135,660 135,693 135,715 135,784 135,932 135,943 135,953 135,954 135,1011 135,1052 135,1118 135,1282 135,1305 135,1332 135,1368 135,1415 135,1684 135,1843 135,1882 135,1973 135,2105 135,2159 135,2210 135,2224 135,2253 135,2286 135,2315 135,2424 135,2646 135,2775 135,2944 135,3504 135,3565 135,3613 135,4024 135,4086 135,4237 135,4276 135,4799 135,5405 135,5439 135,5467 135,5541 135,5573 135,6011 135,6324 135,7457 135,7460 135,7757 135,7768 135,7879 135,7979 135,8049 135,8279 135,8424 135,8483 135,8835 135,9471 135,13207 135,13538 135,13700 135,13928 135,13949 135,15010 135,15163 135,15470 135,16103 135,16309 135,17346 135,18837 135,18860 135,18885 135,18934 135,19559 135,20110 135,20164 135,20173 135,21111 135,21254 135,21436 135,22417 135,23420 135,24243 135,24251 135,24635 135,24839 135,26682 135,26748 135,26923 135,28747 135,28758 135,29098 135,29572 135,30209 135,30210 135,31236 135,31963 135,33567 135,34032 135,34130 135,40922 135,44185 135,45751 135,48188 135,49035 135,50440 135,50675 135,50745 135,58940 135,59043 135,60886 135,63279 135,63639 135,65152 135,65864 135,66157 135,67812 135,70292 135,71770 135,74717 135,76180 135,78772 135,79314 135,79966 135,87892 135,102377 135,107959 135,110527 135,111269 135,111420 135,112533 135,115036 135,116041 135,117415 135,118359 135,131308 135,132884 135,136072 135,137170 135,138586 135,140176 135,145605 135,149863 135,151500 135,157332 135,157957 135,158872 135,159777 135,160928 135,162633 135,162944 135,163279 135,163504 135,169506 135,171726 135,172218 135,172704 135,172792 135,172894 135,180026 135,185910 135,185919 135,194141 135,197076 135,197371 135,198254 135,199231 135,200912 135,200921 135,203189 135,208029 135,219113 135,219114 135,220537 135,222061 135,222064 135,227599 135,228519 135,232999 135,237226 135,237654 135,246172 135,246518 135,246919 135,251047 135,251958 135,253201 135,260436 135,261443 135,262365 135,262636 135,263019 136,104 136,134 136,135 136,136 136,137 136,138 136,442 136,446 136,557 136,966 136,1282 136,1332 136,1368 136,1939 136,2105 136,4024 136,4086 136,4276 136,4355 136,5405 136,7921 136,15314 136,15782 136,16552 136,22836 136,25787 136,31980 136,32778 136,35131 136,41357 136,52401 136,52958 136,55826 136,58964 136,60704 136,65864 136,66541 136,68113 136,69461 136,69762 136,71777 136,77663 136,77708 136,78772 136,78934 136,82873 136,83392 136,86551 136,90807 136,90936 136,91044 136,91274 136,91900 136,92371 136,92422 136,103093 136,106515 136,109339 136,112083 136,112617 136,118976 136,123547 136,128283 136,131308 136,131800 136,132909 136,133078 136,134270 136,142344 136,144105 136,151402 136,160433 136,162994 136,164931 136,165042 136,165261 136,165698 136,165731 136,165766 136,165771 136,165949 136,165962 136,167693 136,173545 136,173818 136,176773 136,177258 136,181778 136,190276 136,191380 136,251858 137,30 137,104 137,133 137,134 137,135 137,136 137,137 137,138 137,200 137,225 137,294 137,431 137,446 137,557 137,573 137,636 137,772 137,817 137,850 137,865 137,866 137,1011 137,1282 137,1368 137,1415 137,1432 137,1564 137,1648 137,1882 137,1939 137,2095 137,2105 137,2156 137,2596 137,2874 137,3246 137,3247 137,3486 137,3504 137,3590 137,3613 137,4024 137,4086 137,4276 137,4919 137,5405 137,5573 137,6023 137,6448 137,7182 137,7879 137,8243 137,8576 137,9343 137,13207 137,13359 137,13434 137,13928 137,13969 137,15369 137,15470 137,15559 137,16263 137,16516 137,16966 137,18625 137,18731 137,22301 137,22836 137,23270 137,24521 137,24618 137,25496 137,26136 137,26682 137,26729 137,27796 137,28042 137,28191 137,28747 137,29020 137,29131 137,29560 137,29561 137,29562 137,29563 137,29564 137,29565 137,29566 137,29661 137,30373 137,30691 137,35413 137,38107 137,40551 137,40841 137,41357 137,43727 137,45751 137,45763 137,48188 137,50745 137,52357 137,52358 137,52499 137,54398 137,58093 137,60704 137,60886 137,62210 137,65558 137,65562 137,65864 137,67254 137,68113 137,68819 137,71385 137,71777 137,73745 137,76704 137,78772 137,79314 137,85814 137,89724 137,89730 137,89909 137,90118 137,90936 137,91274 137,91389 137,96720 137,97112 137,97903 137,99611 137,102505 137,102712 137,103730 137,105650 137,107416 137,108101 137,111424 137,112346 137,114000 137,114361 137,115025 137,116041 137,116881 137,117896 137,117956 137,118690 137,119255 137,119444 137,119627 137,121695 137,124460 137,127070 137,131188 137,131892 137,132509 137,132564 137,133016 137,135603 137,135722 137,136576 137,139519 137,139648 137,140317 137,140773 137,140879 137,141546 137,141775 137,141853 137,142335 137,142343 137,142497 137,143526 137,145840 137,147310 137,147881 137,150811 137,154785 137,155432 137,156748 137,156753 137,162994 137,164336 137,164392 137,164931 137,165688 137,167439 137,167477 137,170594 137,170768 137,171557 137,172894 137,174706 137,175465 137,175975 137,176055 137,176261 137,176290 137,176317 137,176826 137,177283 137,178373 137,179167 137,182162 137,183703 137,186994 137,190276 137,191072 137,192977 137,193384 137,195013 137,196684 137,197571 137,197576 137,197726 137,198680 137,198759 137,198816 137,198872 137,204978 137,205627 137,206820 137,207412 137,207454 137,214250 137,214564 137,216551 137,222307 137,222592 137,225203 137,228052 137,230322 137,235583 137,249820 137,250519 137,251186 137,251245 137,254256 137,255449 137,260128 137,263810 138,26 138,30 138,59 138,81 138,104 138,116 138,134 138,135 138,136 138,137 138,138 138,200 138,220 138,225 138,248 138,304 138,338 138,364 138,557 138,609 138,636 138,715 138,734 138,784 138,792 138,943 138,1011 138,1212 138,1235 138,1242 138,1332 138,1368 138,1432 138,1663 138,1844 138,1882 138,1939 138,2087 138,2105 138,2205 138,2206 138,2253 138,2384 138,2679 138,2720 138,2775 138,2939 138,3794 138,3820 138,3840 138,4114 138,4276 138,4919 138,6661 138,7303 138,7879 138,8049 138,13207 138,13912 138,13928 138,13969 138,14209 138,14224 138,15091 138,15470 138,15782 138,16103 138,16153 138,16263 138,16551 138,16966 138,17461 138,18837 138,18933 138,20741 138,22643 138,24635 138,24747 138,26181 138,26347 138,26729 138,27396 138,28042 138,28322 138,29566 138,29572 138,29733 138,30471 138,30997 138,31159 138,31684 138,33424 138,33840 138,33895 138,37157 138,38245 138,39486 138,40169 138,40922 138,41023 138,42390 138,43983 138,45763 138,46874 138,47095 138,48188 138,48450 138,58587 138,63939 138,65864 138,66276 138,70637 138,71385 138,71770 138,72765 138,74423 138,76704 138,78772 138,78923 138,79314 138,79524 138,79616 138,84476 138,89662 138,93920 138,106721 138,109505 138,109688 138,112489 138,119242 138,119653 138,120155 138,124333 138,124460 138,125353 138,131374 138,133553 138,135909 138,136265 138,136397 138,138577 138,140030 138,140317 138,140773 138,143401 138,143526 138,144713 138,149266 138,155460 138,159072 138,165128 138,165434 138,165755 138,169802 138,170609 138,172894 138,173264 138,174841 138,178980 138,179054 138,182606 138,183299 138,183703 138,185239 138,185306 138,185910 138,186052 138,192943 138,192977 138,194337 138,195070 138,195086 138,198617 138,201710 138,202036 138,205627 138,214802 138,233484 138,244332 138,245162 138,252526 138,254319 138,259280 138,261902 138,263589 139,41 139,140 139,609 139,1132 139,1608 139,240174 140,10 140,140 140,292 140,314 140,509 140,510 140,599 140,794 140,809 140,838 140,1014 140,1293 140,1844 140,2253 140,3507 140,43613 141,10 142,143 143,5 143,143 143,165 143,430 143,3118 143,3530 143,5207 143,5389 143,5763 143,7285 143,8669 143,8671 143,8690 143,8716 143,9119 143,9411 143,9480 143,9484 143,9490 143,13249 143,14981 143,15896 143,16004 143,17982 143,25740 143,26381 143,27980 143,28168 143,28515 143,28566 144,135 145,146 146,1 146,10 146,44 146,50 146,56 146,63 146,99 146,106 146,146 146,147 146,149 146,158 146,175 146,192 146,195 146,206 146,285 146,333 146,336 146,406 146,422 146,446 146,505 146,602 146,620 146,622 146,640 146,647 146,663 146,664 146,685 146,693 146,733 146,779 146,841 146,1011 146,1163 146,1181 146,1331 146,1370 146,1425 146,1458 146,1502 146,1515 146,1619 146,1623 146,1825 146,1848 146,2244 146,2539 146,2782 146,2874 146,2903 146,3370 146,3513 146,3895 146,4066 146,4353 146,4617 146,5307 146,5356 146,5401 146,5424 146,6119 146,6883 146,7006 146,7087 146,8031 146,8971 146,13197 146,13286 146,13636 146,14453 146,15229 146,15304 146,15332 146,16019 146,18997 146,20494 146,21442 146,23000 146,26172 146,26321 146,26450 146,27145 146,28927 146,29703 146,30331 146,30557 146,33287 146,35549 146,40021 146,43175 146,44806 146,45759 146,46337 146,50422 146,56567 146,60526 146,60576 146,62530 146,65809 146,66534 146,68932 146,70939 146,71662 146,74700 146,76058 146,82739 146,83306 146,86083 146,88867 146,92476 146,92535 146,99101 146,105739 146,106306 146,106502 146,109367 146,110229 146,112335 146,112380 146,112958 146,112980 146,113412 146,113485 146,113843 146,116202 146,117771 146,118224 146,118336 146,118353 146,119629 146,121954 146,122441 146,122608 146,122974 146,126752 146,131430 146,137143 146,138815 146,141912 146,148791 146,149317 146,150539 146,150555 146,153650 146,156404 146,168245 146,169549 146,176558 146,178673 146,179147 146,180376 146,186194 146,195228 146,198194 146,202140 146,204124 146,220045 146,222432 146,223890 146,228296 146,228327 146,238166 146,239897 146,240090 146,241161 146,241218 146,247337 146,247391 146,247393 146,249772 146,252757 146,263264 147,1 147,10 147,50 147,55 147,56 147,65 147,83 147,94 147,97 147,99 147,106 147,146 147,147 147,148 147,149 147,158 147,171 147,175 147,184 147,192 147,195 147,206 147,211 147,238 147,285 147,314 147,333 147,336 147,406 147,422 147,425 147,505 147,602 147,606 147,620 147,622 147,628 147,638 147,640 147,664 147,682 147,779 147,841 147,852 147,859 147,868 147,920 147,947 147,957 147,1011 147,1089 147,1118 147,1181 147,1189 147,1262 147,1276 147,1293 147,1328 147,1366 147,1417 147,1425 147,1458 147,1464 147,1497 147,1515 147,1517 147,1518 147,1521 147,1546 147,1566 147,1619 147,1623 147,1696 147,1729 147,1776 147,1786 147,1803 147,1815 147,1825 147,1833 147,1844 147,1877 147,1921 147,2032 147,2132 147,2231 147,2244 147,2374 147,2400 147,2451 147,2528 147,2552 147,2571 147,2609 147,2741 147,2772 147,2792 147,2867 147,2875 147,2903 147,3070 147,3199 147,3449 147,3539 147,3571 147,3895 147,4060 147,4103 147,4114 147,4164 147,4391 147,4468 147,4627 147,5048 147,5357 147,5360 147,5401 147,5521 147,5592 147,5666 147,5726 147,5864 147,5874 147,5916 147,5972 147,5981 147,6268 147,6557 147,6635 147,6863 147,7862 147,7909 147,7970 147,7998 147,8027 147,8055 147,8098 147,8223 147,8285 147,8333 147,8514 147,8755 147,8867 147,8904 147,9166 147,9282 147,9371 147,9394 147,9579 147,9582 147,9590 147,9599 147,13520 147,13556 147,13687 147,13994 147,14445 147,14446 147,14666 147,15203 147,15275 147,15319 147,15330 147,15439 147,15629 147,15795 147,16003 147,16083 147,16408 147,16409 147,16482 147,16753 147,16803 147,16891 147,16935 147,16946 147,16980 147,17151 147,17285 147,17551 147,17621 147,17761 147,18114 147,18705 147,18760 147,18997 147,19238 147,19413 147,19457 147,19555 147,19577 147,19578 147,19590 147,19792 147,19936 147,20094 147,20152 147,20168 147,20570 147,21092 147,21442 147,21826 147,21908 147,22102 147,22126 147,22231 147,22237 147,22335 147,22341 147,22397 147,22616 147,22699 147,22880 147,22954 147,23783 147,23908 147,23941 147,23954 147,24073 147,24174 147,24176 147,24206 147,24209 147,24230 147,24432 147,25073 147,25348 147,25817 147,25838 147,26234 147,26354 147,26414 147,26434 147,26435 147,26688 147,26689 147,26841 147,27495 147,28002 147,28037 147,28040 147,28041 147,28969 147,29334 147,29634 147,29803 147,29845 147,29856 147,30331 147,30943 147,31946 147,32764 147,32958 147,33447 147,35265 147,35493 147,35614 147,36436 147,36760 147,37150 147,39010 147,39235 147,39437 147,39519 147,39994 147,40451 147,40874 147,41385 147,41515 147,41774 147,42064 147,42493 147,42564 147,43955 147,44225 147,44654 147,44877 147,46135 147,46703 147,47124 147,47309 147,48119 147,48320 147,48452 147,48611 147,49075 147,49182 147,49791 147,49811 147,50824 147,51260 147,52555 147,53247 147,53919 147,53923 147,54562 147,54775 147,54833 147,54911 147,55585 147,56006 147,56259 147,57133 147,57844 147,58552 147,58612 147,60496 147,60576 147,62530 147,63585 147,65723 147,65809 147,66378 147,66548 147,66549 147,66721 147,67445 147,67866 147,68695 147,69519 147,69527 147,70092 147,70220 147,70475 147,70494 147,70725 147,71028 147,71225 147,71303 147,71366 147,71835 147,72116 147,72439 147,72586 147,72736 147,72874 147,73906 147,73955 147,73958 147,73960 147,74604 147,75539 147,75550 147,75557 147,75876 147,75935 147,76164 147,76893 147,77310 147,77378 147,77743 147,77889 147,78023 147,78872 147,79792 147,80058 147,80099 147,80225 147,80266 147,80455 147,80802 147,80913 147,81153 147,81185 147,81200 147,81201 147,81403 147,83401 147,83483 147,83865 147,84519 147,84590 147,85001 147,85979 147,87164 147,87799 147,87870 147,88099 147,88600 147,88604 147,88641 147,89035 147,89133 147,89763 147,90365 147,90455 147,90717 147,91014 147,91385 147,91833 147,92476 147,93174 147,93649 147,93781 147,93884 147,94190 147,94578 147,94597 147,96018 147,96300 147,97289 147,98183 147,98192 147,98663 147,99219 147,99819 147,100239 147,102560 147,102595 147,102621 147,102684 147,102743 147,103546 147,103687 147,104317 147,104926 147,105392 147,105704 147,107818 147,109686 147,110570 147,112173 147,112469 147,112537 147,112591 147,113709 147,114969 147,115067 147,115341 147,115487 147,115743 147,115749 147,116270 147,116651 147,116835 147,117057 147,117168 147,117429 147,117720 147,117881 147,118063 147,118336 147,118904 147,123481 147,124473 147,124497 147,124889 147,125561 147,125678 147,126095 147,126292 147,126368 147,126374 147,126604 147,127210 147,127703 147,128344 147,128486 147,128589 147,128591 147,128904 147,129086 147,129104 147,130431 147,131905 147,132007 147,132404 147,133536 147,133980 147,134420 147,136185 147,136377 147,136732 147,138243 147,138471 147,138831 147,139423 147,139504 147,139521 147,141075 147,141618 147,142689 147,142749 147,143607 147,144035 147,145244 147,145916 147,146705 147,147103 147,147568 147,147690 147,147718 147,148193 147,148510 147,149079 147,149473 147,149534 147,154479 147,154480 147,155266 147,157289 147,158121 147,161423 147,162168 147,162837 147,163555 147,163992 147,164100 147,164523 147,164548 147,164572 147,164803 147,165961 147,166335 147,166395 147,166499 147,166893 147,169385 147,169478 147,169507 147,170782 147,171116 147,171261 147,173156 147,173272 147,173328 147,174420 147,174534 147,175156 147,175159 147,175771 147,176421 147,177470 147,177975 147,178085 147,179005 147,180187 147,181210 147,181260 147,181440 147,181752 147,182092 147,182699 147,182855 147,182883 147,183209 147,183528 147,183885 147,185677 147,186042 147,186168 147,186539 147,186679 147,187605 147,188668 147,190898 147,191531 147,191892 147,192449 147,193170 147,193347 147,194962 147,196382 147,199280 147,204215 147,204227 147,206699 147,207055 147,212439 147,212494 147,212573 147,212694 147,212911 147,213273 147,213317 147,214374 147,215157 147,215336 147,215762 147,216457 147,216463 147,217383 147,219752 147,220502 147,220617 147,221660 147,224102 147,224753 147,224918 147,226483 147,227757 147,228908 147,228982 147,229047 147,230229 147,230279 147,231663 147,232474 147,232739 147,232743 147,232755 147,233876 147,235705 147,238433 147,240052 147,240174 147,240877 147,241805 147,242662 147,242937 147,243354 147,243357 147,244134 147,244444 147,244485 147,245565 147,247263 147,250758 147,251240 147,251505 147,251530 147,251531 147,251746 147,252294 147,253987 147,254224 147,254921 147,257852 147,258284 147,258317 147,258809 147,259829 147,261854 147,261966 147,262194 147,262511 147,262529 147,262882 148,147 148,158 148,195 148,406 148,422 148,640 148,1803 149,1 149,50 149,106 149,146 149,147 149,149 149,158 149,171 149,175 149,182 149,184 149,195 149,206 149,252 149,285 149,314 149,336 149,406 149,467 149,493 149,505 149,599 149,606 149,620 149,622 149,640 149,685 149,779 149,808 149,818 149,859 149,1181 149,1189 149,1370 149,1425 149,1458 149,1464 149,1515 149,1518 149,1521 149,1546 149,1619 149,1623 149,1776 149,1803 149,2244 149,2333 149,2365 149,2394 149,2400 149,2438 149,2609 149,3145 149,3895 149,4684 149,4706 149,5421 149,5625 149,7087 149,7862 149,7998 149,9371 149,9394 149,9518 149,9554 149,9689 149,13226 149,13274 149,13993 149,14040 149,14166 149,14402 149,15261 149,15439 149,16409 149,16775 149,18256 149,18646 149,18692 149,19238 149,19250 149,19555 149,19783 149,19847 149,20433 149,20503 149,20515 149,20588 149,20680 149,21442 149,21675 149,22210 149,22231 149,24106 149,24607 149,24743 149,25046 149,25387 149,26318 149,26362 149,26450 149,26841 149,27184 149,28361 149,29249 149,30035 149,30468 149,35336 149,35616 149,35672 149,39437 149,39643 149,41429 149,42130 149,42606 149,43534 149,46135 149,46360 149,48364 149,48908 149,52601 149,54958 149,58267 149,59020 149,59156 149,65723 149,68695 149,70748 149,71303 149,73232 149,75557 149,76835 149,77571 149,79532 149,84606 149,85817 149,85979 149,87870 149,88348 149,89035 149,89900 149,90993 149,91055 149,92476 149,93181 149,94190 149,98889 149,100409 149,101770 149,103240 149,103551 149,105612 149,107700 149,109369 149,112061 149,112537 149,114019 149,115333 149,116068 149,116158 149,116479 149,117059 149,117060 149,118336 149,119438 149,119547 149,120892 149,121417 149,121587 149,121977 149,122032 149,124097 149,124816 149,125754 149,127158 149,129650 149,129853 149,138831 149,141912 149,142151 149,143399 149,144071 149,146838 149,147380 149,149755 149,153457 149,153630 149,154480 149,154547 149,154721 149,154726 149,159028 149,159133 149,159874 149,163519 149,164308 149,164316 149,166395 149,168397 149,169385 149,170928 149,171761 149,171795 149,174449 149,181163 149,181752 149,182240 149,186878 149,187293 149,195835 149,197609 149,198677 149,198709 149,204103 149,212439 149,213853 149,214780 149,215685 149,218391 149,218830 149,219087 149,219885 149,220502 149,228516 149,228703 149,229093 149,229362 149,234266 149,238139 149,238937 149,239922 149,240174 149,240619 149,241227 149,241248 149,241557 149,243555 149,244128 149,244600 149,244738 149,244942 149,244986 149,245004 149,245463 149,247210 149,250672 149,255299 149,256405 149,256939 149,257183 149,259944 149,261388 149,262050 149,262110 150,151 151,151 151,1457 151,3780 151,7107 151,8237 151,18822 151,25666 151,44961 151,83981 151,89406 151,94990 151,118264 151,118308 151,128878 151,163429 151,163430 151,179911 151,212762 151,228376 152,10 152,175 152,176 152,55927 153,154 155,104 155,134 155,135 155,136 155,137 155,138 155,557 155,1368 155,1939 155,2105 156,157 158,1 158,50 158,56 158,99 158,106 158,146 158,147 158,148 158,149 158,158 158,175 158,184 158,192 158,195 158,206 158,252 158,285 158,301 158,314 158,333 158,336 158,406 158,422 158,425 158,467 158,505 158,599 158,618 158,640 158,673 158,676 158,778 158,779 158,794 158,818 158,838 158,841 158,859 158,929 158,1003 158,1011 158,1014 158,1089 158,1130 158,1163 158,1181 158,1189 158,1328 158,1419 158,1425 158,1458 158,1515 158,1518 158,1521 158,1546 158,1548 158,1554 158,1619 158,1623 158,1729 158,1776 158,1796 158,1803 158,1825 158,1833 158,1834 158,1844 158,1901 158,1921 158,1973 158,2101 158,2132 158,2244 158,2333 158,2365 158,2394 158,2400 158,2438 158,2528 158,2571 158,2609 158,2741 158,2745 158,2752 158,2792 158,2875 158,3449 158,3571 158,3895 158,3993 158,4159 158,4164 158,4310 158,4405 158,4468 158,4627 158,4684 158,4706 158,4802 158,5048 158,5184 158,5334 158,5360 158,5401 158,5592 158,5725 158,5726 158,5729 158,5874 158,6474 158,6508 158,6635 158,7087 158,7216 158,7970 158,7998 158,8027 158,8055 158,8098 158,8764 158,8867 158,9005 158,9371 158,9394 158,9582 158,13493 158,13520 158,13657 158,14445 158,14637 158,14913 158,15330 158,15795 158,16183 158,16409 158,16482 158,16980 158,17079 158,17285 158,18377 158,18705 158,18984 158,19238 158,19413 158,19544 158,19854 158,19936 158,20864 158,20942 158,21112 158,22210 158,22231 158,22392 158,22616 158,22954 158,23783 158,23941 158,23978 158,24045 158,24056 158,24065 158,24129 158,24161 158,24164 158,24186 158,24188 158,24219 158,24221 158,25817 158,25838 158,26282 158,26435 158,26496 158,26689 158,26727 158,27435 158,27462 158,27572 158,27811 158,27878 158,28037 158,28250 158,28259 158,28364 158,28539 158,28667 158,28969 158,29180 158,29803 158,30331 158,30374 158,30498 158,30515 158,30943 158,31433 158,31585 158,32661 158,32958 158,33332 158,33699 158,33991 158,35265 158,35614 158,35672 158,36494 158,36512 158,37218 158,37669 158,39010 158,39078 158,39129 158,39290 158,39684 158,41774 158,41890 158,43670 158,43891 158,45634 158,46334 158,47309 158,48320 158,50061 158,50161 158,50991 158,54775 158,54800 158,54833 158,55849 158,56006 158,56622 158,57030 158,57133 158,57753 158,58261 158,58401 158,58422 158,58612 158,59748 158,59896 158,59967 158,59997 158,60576 158,60683 158,61508 158,62686 158,63585 158,64568 158,65629 158,65809 158,65907 158,65938 158,66549 158,67445 158,68695 158,69599 158,70258 158,71028 158,71303 158,71830 158,71834 158,71845 158,72736 158,72874 158,73232 158,73348 158,73960 158,74656 158,75876 158,77259 158,77511 158,78023 158,80266 158,80565 158,80802 158,81200 158,83401 158,83483 158,84606 158,87164 158,87825 158,87870 158,88012 158,88099 158,89035 158,89748 158,89763 158,90717 158,91518 158,92476 158,92634 158,93649 158,93650 158,93781 158,93999 158,95391 158,97649 158,98337 158,102560 158,103687 158,104417 158,104926 158,105120 158,106208 158,109931 158,110812 158,110839 158,111280 158,111411 158,112173 158,115487 158,115743 158,116651 158,116972 158,117072 158,117742 158,118154 158,118336 158,119661 158,120273 158,124136 158,126764 158,127158 158,127703 158,128046 158,128344 158,129030 158,132299 158,133561 158,133706 158,133778 158,135184 158,136052 158,136073 158,137109 158,137130 158,137131 158,137132 158,137133 158,138471 158,138472 158,139504 158,140441 158,142646 158,144035 158,145955 158,147103 158,148808 158,149227 158,149288 158,149473 158,151755 158,152787 158,153777 158,154712 158,155266 158,155656 158,157035 158,157289 158,157338 158,157353 158,158637 158,160390 158,162435 158,162599 158,163045 158,163079 158,163732 158,164300 158,165340 158,167438 158,168384 158,168624 158,168967 158,169107 158,170010 158,171116 158,171677 158,173495 158,175156 158,175159 158,175341 158,175711 158,175901 158,177054 158,177975 158,181059 158,182092 158,182883 158,183347 158,186878 158,187610 158,188230 158,189146 158,189330 158,189651 158,190306 158,190312 158,190315 158,191236 158,191396 158,193170 158,193292 158,194169 158,195052 158,196382 158,197742 158,198939 158,199280 158,203012 158,204908 158,206835 158,208041 158,212494 158,212590 158,212600 158,212606 158,212722 158,213177 158,213198 158,213296 158,213317 158,213815 158,216366 158,220502 158,220617 158,222507 158,223124 158,223197 158,224102 158,224753 158,225880 158,227757 158,227810 158,228136 158,229415 158,234304 158,236183 158,239883 158,240174 158,241012 158,245944 158,245979 158,247337 158,247366 158,248019 158,251530 158,252689 158,252810 158,253211 158,254224 158,254921 158,257153 158,257852 158,258187 158,258317 158,260337 158,260838 158,261074 158,261414 158,261975 158,262416 158,264407 158,265139 159,160 160,160 160,314 160,515 160,599 160,673 160,992 160,1058 160,1130 160,1623 160,1891 160,1973 160,4066 160,20757 162,163 162,187 162,676 163,104 163,287 163,673 163,849 163,911 163,1130 163,1204 163,1293 163,1417 163,1844 163,2173 163,2373 163,4823 163,6027 163,6303 164,143 165,143 166,167 167,86 167,166 167,167 167,186 167,217 167,240 167,263 167,299 167,301 167,314 167,350 167,372 167,392 167,397 167,435 167,452 167,457 167,459 167,467 167,468 167,509 167,510 167,522 167,536 167,563 167,589 167,599 167,663 167,744 167,794 167,803 167,808 167,818 167,852 167,941 167,968 167,972 167,973 167,1010 167,1011 167,1012 167,1013 167,1045 167,1085 167,1118 167,1167 167,1210 167,1241 167,1284 167,1298 167,1319 167,1326 167,1417 167,1479 167,1522 167,1544 167,1545 167,1566 167,1627 167,1678 167,1729 167,1732 167,1796 167,1837 167,1849 167,1853 167,1973 167,2083 167,2127 167,2173 167,2193 167,2205 167,2206 167,2252 167,2372 167,2479 167,2480 167,2556 167,2557 167,2588 167,2840 167,2979 167,3049 167,3138 167,3207 167,3218 167,3497 167,3507 167,3582 167,3630 167,3809 167,3820 167,3871 167,4213 167,4286 167,4291 167,5301 167,5544 167,6710 167,6712 167,6869 167,7011 167,7057 167,7176 167,7204 167,7759 167,8504 167,8534 167,9250 167,9433 167,9603 167,9640 167,9702 167,13252 167,13470 167,13771 167,14246 167,14498 167,15073 167,15303 167,15380 167,16182 167,16192 167,16463 167,17161 167,19525 167,20327 167,20597 167,22062 167,23848 167,24627 167,24815 167,25606 167,25662 167,26958 167,27095 167,27650 167,28305 167,28774 167,30253 167,30373 167,31746 167,32704 167,32784 167,32967 167,32975 167,33527 167,35891 167,37808 167,39011 167,39013 167,40513 167,41528 167,43235 167,43346 167,44105 167,44403 167,44480 167,44972 167,45510 167,46805 167,47051 167,48282 167,48545 167,50023 167,50423 167,50565 167,50987 167,51143 167,51889 167,54966 167,55028 167,59157 167,59269 167,59581 167,62402 167,64070 167,67132 167,69704 167,73378 167,73570 167,75295 167,75794 167,76096 167,77678 167,83761 167,87886 167,90466 167,93031 167,93590 167,93835 167,94276 167,94745 167,94938 167,97330 167,99136 167,99759 167,102646 167,103198 167,103524 167,106724 167,110575 167,116543 167,116590 167,118510 167,119610 167,127158 167,127227 167,128516 167,130965 167,133122 167,134179 167,136363 167,136569 167,138864 167,139919 167,140458 167,141050 167,143481 167,143746 167,146067 167,147883 167,148098 167,150840 167,153180 167,153348 167,158528 167,167521 167,168411 167,170643 167,170803 167,170984 167,171148 167,173330 167,176027 167,176115 167,178573 167,179575 167,181431 167,181852 167,182015 167,182086 167,182589 167,182990 167,187176 167,188282 167,188587 167,190527 167,192191 167,192767 167,194481 167,194925 167,195944 167,195984 167,207045 167,207837 167,213750 167,213752 167,213755 167,213756 167,213761 167,213796 167,216586 167,217992 167,218050 167,218884 167,221176 167,221724 167,223028 167,223818 167,228928 167,229082 167,229101 167,229203 167,229230 167,229593 167,236264 167,237503 167,238142 167,239101 167,239915 167,244184 167,244197 167,247668 167,249055 167,250468 167,250803 167,251511 167,251923 167,253150 167,256907 167,258341 167,258750 167,262019 167,263812 168,169 170,171 171,1 171,5 171,10 171,65 171,66 171,147 171,149 171,171 171,175 171,184 171,330 171,467 171,693 171,726 171,788 171,859 171,868 171,882 171,902 171,957 171,980 171,1247 171,1388 171,1433 171,1815 171,2126 171,2344 171,2574 171,4161 171,4215 171,4289 171,4446 171,4724 171,5133 171,5812 171,6138 171,6209 171,6759 171,12395 171,13335 171,14588 171,14679 171,16359 171,19785 171,20886 171,21442 171,25561 171,28360 171,33503 171,33517 171,34189 171,38308 171,38688 171,40501 171,41907 171,43214 171,43219 171,43884 171,45626 171,46706 171,55144 171,55351 171,58420 171,58432 171,58876 171,62485 171,64032 171,65723 171,65738 171,71303 171,72084 171,73232 171,74646 171,74711 171,76835 171,83458 171,84021 171,84082 171,85979 171,89035 171,91075 171,99849 171,102786 171,104013 171,108067 171,125238 171,128975 171,130520 171,136313 171,138831 171,147380 171,164572 171,215157 171,238800 171,244134 171,251240 172,173 174,173 175,1 175,3 175,10 175,30 175,34 175,35 175,41 175,52 175,56 175,68 175,79 175,97 175,106 175,107 175,134 175,146 175,147 175,149 175,158 175,171 175,175 175,178 175,192 175,195 175,198 175,200 175,206 175,211 175,212 175,233 175,275 175,277 175,285 175,287 175,309 175,310 175,313 175,328 175,336 175,346 175,387 175,406 175,422 175,446 175,447 175,485 175,500 175,505 175,510 175,512 175,566 175,602 175,620 175,640 175,663 175,664 175,671 175,685 175,693 175,704 175,760 175,772 175,775 175,779 175,784 175,808 175,818 175,841 175,859 175,907 175,911 175,919 175,920 175,957 175,1010 175,1085 175,1113 175,1149 175,1188 175,1240 175,1243 175,1247 175,1281 175,1285 175,1309 175,1425 175,1458 175,1465 175,1515 175,1529 175,1566 175,1592 175,1623 175,1708 175,1728 175,1773 175,1803 175,1807 175,1815 175,1849 175,1860 175,1888 175,1912 175,1949 175,2244 175,2254 175,2528 175,2775 175,2782 175,3009 175,3067 175,3115 175,3538 175,3565 175,4114 175,4260 175,4337 175,4507 175,5100 175,5356 175,5401 175,5405 175,6556 175,6837 175,7117 175,7194 175,7318 175,7645 175,8285 175,8488 175,9585 175,13094 175,13352 175,13687 175,14483 175,15112 175,15330 175,15547 175,15552 175,15624 175,17352 175,17797 175,17803 175,17886 175,19336 175,19555 175,19578 175,19894 175,21944 175,23104 175,24150 175,25852 175,25857 175,26414 175,26972 175,30331 175,30999 175,31300 175,31414 175,33437 175,36402 175,36761 175,38524 175,39386 175,39589 175,40797 175,41230 175,41603 175,43141 175,46227 175,51170 175,58836 175,62135 175,64854 175,67055 175,67536 175,69668 175,76082 175,76749 175,77056 175,77176 175,77181 175,80266 175,80311 175,81624 175,81625 175,81676 175,82036 175,82103 175,82918 175,82974 175,85751 175,85814 175,87813 175,87870 175,89194 175,89313 175,89434 175,89442 175,89465 175,89469 175,90822 175,90827 175,92141 175,92476 175,93113 175,95784 175,102560 175,109426 175,112699 175,113156 175,118248 175,118336 175,126161 175,126942 175,128586 175,130136 175,132412 175,135585 175,139245 175,139465 175,141912 175,142048 175,142317 175,142405 175,143446 175,144245 175,148488 175,148601 175,149534 175,153912 175,167540 175,167542 175,167543 175,177483 175,178514 175,180187 175,180487 175,195398 175,204124 175,212573 175,217701 175,227204 175,227644 175,233964 175,237575 175,249580 175,259829 177,178 177,289 177,290 178,20 178,68 178,175 178,178 178,366 178,387 178,434 178,435 178,439 178,447 178,500 178,510 178,538 178,668 178,671 178,724 178,766 178,818 178,934 178,935 178,939 178,996 178,1033 178,1185 178,1238 178,1276 178,1294 178,1434 178,1474 178,1590 178,1611 178,1619 178,1644 178,1789 178,1877 178,1891 178,1953 178,2102 178,2334 178,2400 178,2540 178,2556 178,2653 178,2677 178,3212 178,3987 178,4310 178,4317 178,4646 178,4689 178,5012 178,6059 178,6109 178,6422 178,6950 178,8510 178,8513 178,8807 178,9786 178,13690 178,13987 178,14111 178,15141 178,15440 178,16283 178,16561 178,16873 178,17220 178,17932 178,18256 178,19117 178,19392 178,19413 178,19813 178,19904 178,21346 178,21442 178,22071 178,23740 178,24878 178,25345 178,25765 178,26034 178,26272 178,26452 178,26477 178,27848 178,28371 178,29638 178,29680 178,30080 178,30442 178,30704 178,31222 178,31966 178,32468 178,32511 178,33413 178,35015 178,35460 178,36853 178,37086 178,37275 178,37771 178,38426 178,40212 178,41175 178,41337 178,41374 178,41385 178,41548 178,42454 178,42506 178,42785 178,42960 178,46838 178,47113 178,47272 178,47446 178,48364 178,49896 178,50246 178,50606 178,52437 178,52550 178,54980 178,58964 178,63130 178,63501 178,64028 178,64220 178,64623 178,66689 178,66702 178,67231 178,68481 178,68816 178,72627 178,74526 178,74578 178,76632 178,83473 178,84498 178,86533 178,92951 178,92985 178,93830 178,95166 178,102232 178,104433 178,109228 178,110645 178,116286 178,118219 178,119927 178,121577 178,122318 178,124583 178,125563 178,126190 178,126760 178,128831 178,128884 178,132029 178,133112 178,134035 178,135992 178,137735 178,137748 178,140512 178,141973 178,152916 178,157077 178,159085 178,169048 178,174461 178,174860 178,175308 178,176145 178,177879 178,184958 178,187206 178,187335 178,188215 178,189251 178,189350 178,189812 178,195711 178,198860 178,206309 178,212437 178,212537 178,215402 178,215961 178,216068 178,219206 178,219288 178,221346 178,221860 178,225545 178,228931 178,229927 178,234759 178,234959 178,236061 178,241536 178,241773 178,242469 178,244822 178,245366 178,245376 178,252767 178,256645 178,257991 178,258792 178,264493 179,180 181,160 181,182 181,188 181,7652 182,10 182,20 182,22 182,192 182,240 182,256 182,259 182,264 182,301 182,302 182,314 182,327 182,336 182,366 182,397 182,406 182,417 182,438 182,440 182,441 182,452 182,467 182,500 182,510 182,512 182,536 182,599 182,604 182,626 182,673 182,722 182,773 182,801 182,818 182,838 182,881 182,972 182,1011 182,1019 182,1085 182,1118 182,1147 182,1172 182,1181 182,1191 182,1192 182,1204 182,1417 182,1445 182,1472 182,1553 182,1566 182,1659 182,1663 182,1682 182,1796 182,1825 182,1844 182,1874 182,1876 182,1893 182,2173 182,2211 182,2253 182,2373 182,2400 182,2607 182,3199 182,3507 182,3533 182,3557 182,4066 182,4165 182,4231 182,4274 182,4466 182,5370 182,5584 182,5956 182,6452 182,6734 182,7070 182,7087 182,7178 182,8419 182,9104 182,13207 182,13373 182,19413 182,20635 182,20738 182,21547 182,22063 182,22296 182,22434 182,23482 182,28348 182,29026 182,29902 182,30307 182,30455 182,30502 182,33607 182,41893 182,42761 182,45481 182,48307 182,48331 182,49377 182,50190 183,184 184,1 184,147 184,149 184,158 184,184 184,206 184,336 184,859 184,920 184,957 184,1235 184,1247 184,1335 184,1458 184,1619 184,1623 184,1815 184,2244 184,2868 184,7817 184,26841 184,40514 184,68249 184,179365 184,213476 184,215157 184,252734 184,254248 184,258989 185,186 185,1118 185,6695 185,6837 186,10 186,65 186,68 186,97 186,167 186,182 186,185 186,186 186,192 186,207 186,217 186,240 186,248 186,264 186,290 186,292 186,301 186,332 186,360 186,366 186,392 186,406 186,431 186,433 186,442 186,467 186,479 186,500 186,512 186,518 186,536 186,538 186,631 186,668 186,693 186,765 186,775 186,808 186,818 186,862 186,868 186,872 186,874 186,918 186,929 186,1010 186,1014 186,1019 186,1085 186,1089 186,1096 186,1118 186,1133 186,1191 186,1203 186,1210 186,1235 186,1240 186,1293 186,1298 186,1326 186,1388 186,1402 186,1411 186,1417 186,1531 186,1545 186,1566 186,1635 186,1659 186,1782 186,1796 186,1893 186,1955 186,1985 186,2036 186,2205 186,2512 186,2812 186,3193 186,3455 186,3504 186,3582 186,3718 186,3745 186,3804 186,3866 186,4066 186,4109 186,4213 186,4286 186,5008 186,5129 186,5130 186,5186 186,5250 186,5382 186,5385 186,5388 186,5718 186,6526 186,6545 186,6695 186,6754 186,6904 186,7170 186,7959 186,8261 186,8435 186,8686 186,9015 186,13217 186,13624 186,15109 186,15313 186,15407 186,15454 186,15474 186,15633 186,17116 186,18451 186,22296 186,23850 186,29871 186,30373 186,31802 186,33424 186,34053 186,35598 186,42254 186,43183 186,44269 186,45865 186,46046 186,47114 186,47805 186,48006 186,48505 186,48909 186,51719 186,51977 186,55104 186,57205 186,58450 186,59226 186,59597 186,65681 186,70136 186,92849 186,92935 186,94134 186,94882 186,98275 186,106089 186,114616 186,116903 186,118327 186,119853 186,119854 186,120155 186,121903 186,126620 186,127158 186,133358 186,136761 186,146463 186,147446 186,163399 186,168499 186,176908 186,177720 186,177807 186,182779 186,183300 186,185378 186,185894 186,185912 186,188232 186,192062 186,192911 186,193606 186,195211 186,205273 186,212913 186,213979 186,215874 186,216703 186,218367 186,218370 186,219185 186,242183 186,242246 187,8 187,162 187,313 187,532 187,634 187,657 187,777 187,1083 187,1313 187,1871 187,2266 187,2421 187,2424 187,6032 187,6353 187,7894 187,7903 187,8060 187,8431 187,13416 187,14009 187,20633 187,21206 187,23417 187,23442 187,28803 187,31039 187,33338 187,33459 187,33981 187,35356 187,59881 187,65799 187,68327 187,74327 187,119275 187,123949 187,128133 187,150084 187,161862 187,165558 187,175222 187,181012 187,182307 187,192563 187,211707 187,223694 187,224576 187,230422 187,245243 187,262325 187,264382 189,190 191,192 192,10 192,22 192,50 192,55 192,56 192,63 192,65 192,68 192,79 192,83 192,97 192,99 192,109 192,146 192,147 192,158 192,175 192,182 192,186 192,192 192,195 192,202 192,203 192,206 192,211 192,240 192,256 192,283 192,287 192,289 192,290 192,301 192,302 192,314 192,325 192,333 192,336 192,337 192,338 192,366 192,389 192,406 192,421 192,422 192,425 192,435 192,440 192,452 192,467 192,500 192,505 192,510 192,515 192,516 192,536 192,538 192,557 192,580 192,599 192,601 192,602 192,620 192,622 192,638 192,640 192,663 192,664 192,668 192,681 192,682 192,693 192,702 192,779 192,780 192,794 192,808 192,818 192,838 192,841 192,843 192,872 192,920 192,937 192,939 192,947 192,949 192,991 192,998 192,1003 192,1010 192,1014 192,1087 192,1089 192,1118 192,1181 192,1192 192,1198 192,1204 192,1205 192,1210 192,1218 192,1293 192,1366 192,1370 192,1392 192,1414 192,1417 192,1456 192,1464 192,1518 192,1531 192,1559 192,1568 192,1572 192,1619 192,1623 192,1663 192,1697 192,1715 192,1796 192,1825 192,1837 192,1844 192,1878 192,1955 192,1973 192,1992 192,1993 192,2032 192,2069 192,2173 192,2234 192,2307 192,2374 192,2471 192,2540 192,2556 192,2574 192,2665 192,2797 192,2880 192,2903 192,2931 192,3185 192,3370 192,3407 192,3507 192,3571 192,3582 192,3609 192,3681 192,3843 192,3872 192,3895 192,3933 192,3962 192,4066 192,4084 192,4272 192,4306 192,4308 192,4324 192,4367 192,4462 192,4611 192,4623 192,4637 192,4661 192,4701 192,4802 192,5052 192,5104 192,5155 192,5173 192,5353 192,5357 192,5376 192,5401 192,5494 192,5495 192,5498 192,5563 192,5718 192,5726 192,5729 192,5809 192,5834 192,5849 192,5864 192,5866 192,5971 192,5991 192,6119 192,6452 192,6519 192,6670 192,6671 192,6684 192,6772 192,6904 192,6918 192,6959 192,7007 192,7087 192,7152 192,7178 192,7186 192,7226 192,7296 192,7794 192,7862 192,7880 192,7891 192,8013 192,8070 192,8100 192,8128 192,8180 192,8214 192,8270 192,8309 192,8583 192,8764 192,9213 192,9367 192,9379 192,9394 192,9505 192,9679 192,9747 192,11890 192,12112 192,12263 192,13185 192,13260 192,13270 192,13385 192,13428 192,13435 192,13464 192,13478 192,13633 192,13687 192,13771 192,13941 192,14432 192,14433 192,14453 192,14534 192,14799 192,14829 192,14830 192,14833 192,14854 192,14913 192,15319 192,15365 192,15388 192,15558 192,15560 192,15582 192,15636 192,15770 192,15980 192,16010 192,16191 192,16226 192,16411 192,16496 192,16563 192,16572 192,16774 192,16949 192,17116 192,17151 192,17432 192,18249 192,18261 192,18281 192,18638 192,18640 192,18924 192,18997 192,19025 192,19182 192,19205 192,19250 192,19435 192,19592 192,19651 192,19859 192,20035 192,20559 192,20615 192,20738 192,20982 192,21350 192,21528 192,21605 192,21706 192,21799 192,22015 192,22372 192,22395 192,22616 192,23517 192,23662 192,23698 192,23771 192,23783 192,23987 192,24066 192,24137 192,24150 192,24222 192,24372 192,24691 192,24695 192,24741 192,24770 192,24783 192,24900 192,25370 192,25487 192,25555 192,25627 192,25813 192,25881 192,26133 192,26139 192,26395 192,26414 192,26425 192,26943 192,27148 192,27495 192,27772 192,28142 192,28259 192,28354 192,28539 192,28579 192,28851 192,28997 192,29056 192,29083 192,29721 192,29830 192,29837 192,29890 192,30331 192,31170 192,31186 192,32172 192,32529 192,33764 192,33816 192,33821 192,33991 192,34014 192,34103 192,34237 192,34253 192,34341 192,34626 192,35045 192,35336 192,35614 192,36008 192,36056 192,36256 192,36297 192,36411 192,36417 192,36420 192,36421 192,36425 192,36434 192,36435 192,36457 192,36512 192,37224 192,37441 192,37629 192,37844 192,38001 192,38688 192,38903 192,38950 192,39684 192,40971 192,41146 192,41273 192,41385 192,41987 192,42033 192,43290 192,43364 192,43439 192,43559 192,43608 192,43885 192,44798 192,45543 192,45656 192,45791 192,45846 192,46486 192,47106 192,48119 192,48320 192,48619 192,48909 192,49317 192,49373 192,49791 192,50107 192,50279 192,50666 192,50683 192,51126 192,51260 192,52339 192,52342 192,52560 192,53472 192,54955 192,55034 192,55036 192,55075 192,55124 192,55294 192,55456 192,55602 192,55933 192,56387 192,57912 192,58203 192,58484 192,58550 192,58763 192,58860 192,59183 192,59544 192,59749 192,59780 192,59844 192,60304 192,60379 192,60421 192,60576 192,62469 192,62632 192,62672 192,63126 192,63580 192,63933 192,64025 192,64153 192,64353 192,65396 192,65770 192,65809 192,66710 192,67078 192,67229 192,67367 192,68082 192,68183 192,68816 192,69419 192,69958 192,70051 192,70367 192,71119 192,72428 192,72439 192,72950 192,72995 192,73201 192,73348 192,73693 192,73966 192,74542 192,75226 192,75972 192,76228 192,76820 192,76896 192,77198 192,77813 192,77835 192,78991 192,79768 192,79967 192,79973 192,80043 192,80529 192,80656 192,80973 192,80974 192,81052 192,81280 192,82108 192,82242 192,83029 192,83035 192,83314 192,84590 192,84659 192,84663 192,84685 192,88062 192,88467 192,88936 192,91792 192,92036 192,92140 192,92476 192,92732 192,93199 192,93778 192,93780 192,94134 192,96335 192,96637 192,96773 192,99777 192,101667 192,102560 192,102727 192,103254 192,103831 192,104039 192,104317 192,104339 192,104659 192,104720 192,105704 192,107093 192,107181 192,107754 192,108250 192,109154 192,109318 192,109384 192,109401 192,109403 192,109409 192,109572 192,109690 192,109955 192,110033 192,110295 192,110370 192,110496 192,110672 192,111250 192,111280 192,112024 192,116030 192,116197 192,116210 192,116522 192,117148 192,117480 192,118079 192,118336 192,119496 192,119650 192,119651 192,119663 192,119664 192,119665 192,119666 192,119667 192,119692 192,119693 192,119694 192,119697 192,119698 192,119701 192,119707 192,119708 192,119709 192,120050 192,120994 192,120998 192,121110 192,121306 192,121594 192,121986 192,122429 192,123025 192,123668 192,124386 192,124473 192,125357 192,125370 192,125854 192,125920 192,125921 192,126061 192,126841 192,127158 192,127175 192,127192 192,127372 192,127514 192,127555 192,127920 192,128004 192,128666 192,128917 192,128918 192,130815 192,130905 192,131080 192,131277 192,131408 192,131429 192,131846 192,131907 192,132541 192,132899 192,132903 192,133238 192,133306 192,133558 192,133961 192,134581 192,134772 192,134779 192,134864 192,134865 192,134869 192,134873 192,134906 192,135062 192,135098 192,135166 192,135167 192,135168 192,135169 192,135170 192,135171 192,135172 192,135173 192,135237 192,135253 192,136034 192,136463 192,136667 192,136670 192,137900 192,138064 192,138564 192,139768 192,140083 192,140208 192,140475 192,140482 192,142115 192,143575 192,143644 192,144142 192,144473 192,144849 192,146029 192,146869 192,147309 192,147467 192,148970 192,149013 192,149022 192,149324 192,149326 192,149379 192,149397 192,150740 192,150746 192,154486 192,154972 192,155518 192,155711 192,156021 192,156266 192,156392 192,156635 192,158700 192,158847 192,160530 192,160739 192,161002 192,161571 192,162008 192,162010 192,162537 192,163003 192,163019 192,163426 192,163978 192,164004 192,165030 192,165462 192,166275 192,167348 192,168594 192,169532 192,169554 192,169555 192,169558 192,169560 192,169561 192,169562 192,169565 192,169627 192,169846 192,169887 192,169900 192,169939 192,169981 192,170723 192,170779 192,171015 192,172174 192,174244 192,174369 192,174534 192,174835 192,174855 192,175432 192,176115 192,176444 192,176460 192,176835 192,177363 192,178871 192,179286 192,179627 192,179775 192,180661 192,180976 192,181759 192,181775 192,181790 192,182308 192,182890 192,184736 192,185057 192,185476 192,186174 192,186328 192,187400 192,189790 192,193100 192,193520 192,194131 192,194467 192,195285 192,195287 192,198153 192,199805 192,204124 192,205075 192,206552 192,207253 192,212092 192,212353 192,212606 192,214030 192,214269 192,215384 192,215874 192,215878 192,216383 192,217591 192,218016 192,219009 192,220010 192,222055 192,222672 192,223095 192,223635 192,224217 192,224460 192,224774 192,224779 192,224939 192,225050 192,225467 192,226515 192,228688 192,228858 192,230307 192,230730 192,232684 192,232857 192,233154 192,233504 192,233701 192,233753 192,234845 192,236301 192,237396 192,237901 192,238336 192,238431 192,240174 192,241005 192,242264 192,243125 192,244152 192,244699 192,244834 192,245199 192,245935 192,246480 192,247366 192,247911 192,248363 192,248510 192,248667 192,249287 192,250184 192,250304 192,250639 192,250733 192,252464 192,252465 192,252572 192,252643 192,252690 192,252830 192,254083 192,254091 192,254520 192,254535 192,255249 192,255676 192,256626 192,257250 192,257275 192,257799 192,259815 192,260375 192,260939 192,261380 192,261762 192,262438 192,263577 192,263841 192,264020 192,264070 193,52 193,140269 194,195 195,1 195,10 195,44 195,50 195,56 195,146 195,147 195,148 195,149 195,158 195,175 195,192 195,195 195,206 195,285 195,314 195,336 195,356 195,406 195,425 195,440 195,505 195,599 195,602 195,620 195,622 195,640 195,681 195,701 195,779 195,794 195,818 195,838 195,841 195,1011 195,1014 195,1033 195,1181 195,1293 195,1366 195,1464 195,1515 195,1518 195,1619 195,1623 195,1825 195,1842 195,1952 195,1973 195,2071 195,2139 195,2161 195,2287 195,2288 195,2511 195,2690 195,2768 195,2903 195,3759 195,3895 195,4110 195,4159 195,4310 195,4324 195,4332 195,4514 195,4529 195,4626 195,5100 195,5495 195,5523 195,5527 195,5550 195,5750 195,6647 195,6824 195,6902 195,7296 195,7909 195,8002 195,8055 195,8067 195,8330 195,8426 195,8969 195,9394 195,10406 195,11054 195,12724 195,13204 195,13464 195,13654 195,13687 195,13722 195,14241 195,14433 195,14637 195,15319 195,15365 195,15450 195,15795 195,16322 195,16853 195,17323 195,18736 195,18895 195,18953 195,19842 195,20032 195,20088 195,20540 195,20552 195,20555 195,20570 195,20795 195,21382 195,21385 195,22287 195,22358 195,22369 195,22677 195,23783 195,24182 195,24198 195,24648 195,24649 195,25067 195,25348 195,27310 195,27834 195,28888 195,28962 195,28985 195,29615 195,30331 195,30418 195,31140 195,31164 195,31346 195,31349 195,31582 195,31585 195,32617 195,32680 195,32958 195,33559 195,33648 195,33665 195,33666 195,33717 195,33988 195,34441 195,34867 195,36416 195,36443 195,36483 195,36492 195,36494 195,36528 195,36544 195,36555 195,36558 195,36565 195,37059 195,37499 195,38276 195,38300 195,38883 195,38976 195,39014 195,42138 195,43260 195,43263 195,43422 195,44353 195,46890 195,49581 195,50191 195,51019 195,53236 195,54431 195,54487 195,54512 195,54540 195,54937 195,55031 195,55305 195,55849 195,57051 195,57826 195,59698 195,59828 195,60045 195,60667 195,62862 195,64246 195,65809 195,66008 195,68346 195,72504 195,73440 195,74530 195,74584 195,74718 195,76893 195,77650 195,79465 195,79466 195,80503 195,82026 195,83583 195,84751 195,85872 195,86435 195,86505 195,87244 195,89882 195,91862 195,92476 195,93177 195,93829 195,94053 195,94243 195,94886 195,94913 195,95012 195,96664 195,96774 195,98340 195,99054 195,102560 195,103122 195,105854 195,106254 195,106505 195,107376 195,109500 195,111225 195,114551 195,115788 195,116033 195,117136 195,118336 195,120075 195,120088 195,122104 195,125274 195,126096 195,126159 195,127158 195,131203 195,131593 195,132535 195,133511 195,133728 195,134880 195,135322 195,138149 195,138249 195,138827 195,138828 195,139521 195,139554 195,141376 195,141833 195,141912 195,142424 195,142836 195,143042 195,146181 195,146814 195,148606 195,150046 195,150163 195,150210 195,152697 195,153770 195,154327 195,155157 195,155195 195,155380 195,155636 195,159128 195,159807 195,159812 195,162581 195,163783 195,164323 195,167723 195,168594 195,169067 195,169079 195,169468 195,170789 195,171757 195,172529 195,173776 195,175196 195,176095 195,177038 195,181498 195,181709 195,182052 195,182053 195,182145 195,182907 195,183350 195,183364 195,185989 195,187467 195,189295 195,189408 195,191274 195,191300 195,194689 195,197649 195,198703 195,200630 195,202408 195,204079 195,204124 195,204160 195,204642 195,204764 195,207483 195,207484 195,207929 195,207930 195,213250 195,213477 195,215874 195,216045 195,216334 195,217624 195,217914 195,219461 195,219960 195,219973 195,219976 195,220583 195,223053 195,223339 195,224007 195,229954 195,230328 195,231548 195,234816 195,235354 195,238369 195,240174 195,240394 195,240759 195,243082 195,243085 195,244029 195,244589 195,248780 195,249124 195,251948 195,255754 195,258788 195,259604 195,259714 195,260372 195,260801 195,261849 195,262652 196,52 196,9598 196,140269 196,206059 197,52 197,198 199,81 199,135 199,137 199,200 199,215 199,227 199,230 199,233 199,289 199,290 199,304 199,328 199,372 199,417 199,431 199,592 199,704 199,714 199,760 199,932 199,1016 199,1082 199,1085 199,1212 199,1257 199,1392 199,1608 199,1818 199,1882 199,1962 199,2105 199,2205 199,2210 199,2286 199,2296 199,2315 199,3069 199,3085 199,3507 199,4218 199,4237 199,33424 199,94134 199,144988 199,182162 199,198174 199,245910 200,30 200,104 200,134 200,135 200,138 200,175 200,200 200,215 200,248 200,364 200,442 200,502 200,557 200,632 200,677 200,693 200,715 200,772 200,911 200,953 200,1011 200,1016 200,1188 200,1282 200,1415 200,1462 200,1844 200,2105 200,2376 200,4276 200,4308 200,4398 200,4448 200,4478 200,4613 200,4939 200,4940 200,4941 200,5393 200,5399 200,5405 200,8126 200,8133 200,8537 200,9529 200,13207 200,14674 200,15646 200,15807 200,18515 200,18673 200,19617 200,23755 200,24341 200,24789 200,25041 200,26980 200,28203 200,29740 200,31243 200,32244 200,32630 200,32722 200,34358 200,34828 200,34883 200,34920 200,34951 200,37741 200,39770 200,41391 200,42541 200,43327 200,43352 200,44947 200,45546 200,49745 200,57910 200,58894 200,59208 200,62480 200,71048 200,72922 200,81508 200,85814 200,88354 200,90147 200,90210 200,90274 200,90417 200,90683 200,90943 200,91923 200,93173 200,95554 200,95570 200,95571 200,97367 200,98833 200,99125 200,99146 200,99807 200,101890 200,109568 200,113968 200,114064 200,114090 200,115317 200,116712 200,120092 200,126009 200,126032 200,126377 200,128866 200,129813 200,129919 200,130243 200,130820 200,133538 200,141745 200,145039 200,145341 200,148929 200,155021 200,157043 200,157690 200,161973 200,162573 200,163744 200,164945 200,168362 200,169148 200,169155 200,171293 200,171298 200,173863 200,174323 200,178253 200,179065 200,179208 200,179338 200,180899 200,182852 200,183802 200,183839 200,188747 200,190369 200,197671 200,197779 200,198024 200,198205 200,199668 200,199836 200,201893 200,214652 200,224299 200,228149 200,228318 200,228425 200,229893 200,230537 200,230541 200,231099 200,231929 200,231991 200,234839 200,237260 200,237687 200,245926 200,247093 200,248568 200,251601 200,255105 200,259037 200,261804 201,160 201,202 201,203 201,206 202,10 202,50 202,63 202,79 202,192 202,202 202,203 202,217 202,251 202,252 202,275 202,314 202,333 202,336 202,356 202,389 202,406 202,425 202,440 202,493 202,505 202,516 202,535 202,599 202,620 202,622 202,638 202,663 202,664 202,668 202,671 202,673 202,685 202,693 202,701 202,713 202,733 202,794 202,818 202,826 202,843 202,849 202,911 202,1007 202,1011 202,1014 202,1085 202,1175 202,1191 202,1192 202,1204 202,1220 202,1222 202,1243 202,1265 202,1266 202,1370 202,1417 202,1512 202,1517 202,1518 202,1619 202,1623 202,1655 202,1659 202,1663 202,1702 202,1844 202,1877 202,1927 202,1973 202,2152 202,2400 202,2427 202,2689 202,2989 202,2991 202,3148 202,3452 202,3507 202,4286 202,4702 202,5070 202,5145 202,5189 202,5357 202,5495 202,5719 202,5729 202,5971 202,5992 202,6464 202,6684 202,7025 202,7052 202,7265 202,7862 202,7884 202,8285 202,8515 202,8764 202,8867 202,9579 202,13242 202,13270 202,14064 202,14577 202,14829 202,14830 202,16368 202,16563 202,16610 202,16619 202,16652 202,16894 202,17801 202,18172 202,18192 202,18237 202,18457 202,20313 202,20738 202,20931 202,21081 202,21416 202,21442 202,21706 202,24150 202,24590 202,24875 202,24934 202,25627 202,26179 202,26340 202,26450 202,27495 202,29814 202,29889 202,30458 202,30540 202,33332 202,33441 202,34010 202,34445 202,34963 202,38883 202,39173 202,39792 202,40571 202,41136 202,41200 202,41594 202,42479 202,42580 202,42974 202,43670 202,45649 202,45791 202,46183 202,48030 202,48033 202,48035 202,48042 202,48047 202,48049 202,48057 202,48073 202,48444 202,48465 202,48572 202,48781 202,48911 202,49050 202,49121 202,49342 202,50157 202,54292 202,55034 202,55939 202,56586 202,56801 202,58892 202,58914 202,59883 202,60638 202,62854 202,63581 202,63916 202,64317 202,69916 202,70725 202,72439 202,73938 202,75198 202,78717 202,80396 202,89742 202,90335 202,90337 202,92970 202,93774 202,93792 202,95480 202,95781 202,96498 202,99703 202,100218 202,102560 202,102618 202,103532 202,103715 202,103771 202,105566 202,106789 202,107574 202,109201 202,109318 202,109685 202,110719 202,114119 202,114666 202,114840 202,115471 202,116118 202,116413 202,116495 202,116503 202,116539 202,117615 202,119249 202,120002 202,120155 202,120182 202,122916 202,124077 202,124421 202,124435 202,124478 202,125554 202,126040 202,127158 202,128114 202,128116 202,130897 202,131014 202,131206 202,133101 202,133294 202,134252 202,134507 202,137271 202,137330 202,138663 202,144164 202,144849 202,147406 202,149235 202,150519 202,150832 202,161856 202,164760 202,165646 202,170070 202,171601 202,171659 202,174738 202,175961 202,176115 202,176396 202,179635 202,179804 202,181090 202,181095 202,181559 202,182465 202,182478 202,182482 202,183545 202,185403 202,185406 202,185409 202,185411 202,185851 202,186118 202,186127 202,186435 202,187528 202,188888 202,189297 202,190301 202,191355 202,199365 202,201377 202,201698 202,203254 202,203743 202,203948 202,203985 202,206989 202,212620 202,213814 202,214035 202,214107 202,214287 202,215276 202,215800 202,215801 202,215803 202,216159 202,218923 202,219773 202,222576 202,224300 202,228943 202,229223 202,229408 202,230328 202,230567 202,231813 202,232155 202,237605 202,242400 202,243086 202,243295 202,243301 202,244097 202,245197 202,245599 202,245995 202,247132 202,249519 202,251492 202,252974 202,253524 202,253908 202,255576 202,255899 202,257289 202,257295 202,257303 202,257497 202,258147 202,258284 202,259270 202,259805 202,260413 202,262328 203,63 203,192 203,202 203,203 203,251 203,252 203,275 203,333 203,425 203,460 203,465 203,493 203,516 203,638 203,663 203,701 203,826 203,843 203,911 203,1014 203,1192 203,1266 203,1400 203,1456 203,1568 203,1619 203,1655 203,1794 203,1877 203,2085 203,2100 203,2125 203,2152 203,2400 203,2427 203,2666 203,2689 203,3905 203,5181 203,5189 203,5495 203,5877 203,6464 203,6467 203,6684 203,6818 203,7036 203,7052 203,7064 203,7265 203,7862 203,8062 203,8392 203,8515 203,9725 203,13177 203,13687 203,14057 203,14829 203,15980 203,16368 203,16619 203,16652 203,16894 203,17856 203,18172 203,18192 203,18355 203,18391 203,18573 203,20484 203,20577 203,20714 203,20738 203,21210 203,21981 203,22642 203,25839 203,28797 203,29889 203,29928 203,33288 203,33441 203,34096 203,35063 203,36795 203,36997 203,38131 203,38154 203,38883 203,38886 203,40238 203,40333 203,40471 203,40571 203,41594 203,42479 203,42580 203,42974 203,43120 203,43670 203,45531 203,45649 203,46183 203,47420 203,48073 203,48290 203,48444 203,48506 203,48911 203,49050 203,49071 203,49247 203,50157 203,50394 203,50533 203,50534 203,52400 203,54292 203,54327 203,55939 203,56320 203,56558 203,56651 203,56938 203,58425 203,58892 203,59206 203,59224 203,62854 203,63581 203,63916 203,64317 203,65698 203,67861 203,68200 203,68224 203,68603 203,69916 203,78940 203,80552 203,80956 203,83190 203,86191 203,86441 203,87273 203,87321 203,88575 203,93061 203,93770 203,95539 203,95588 203,95781 203,96498 203,96540 203,96543 203,99128 203,103170 203,103171 203,103172 203,103175 203,103176 203,103178 203,104312 203,104366 203,104629 203,105504 203,106164 203,107009 203,107014 203,107574 203,107593 203,109318 203,109419 203,109945 203,110719 203,111259 203,111298 203,112226 203,112227 203,112238 203,113437 203,116201 203,116652 203,119249 203,120096 203,120155 203,120192 203,121095 203,121108 203,122031 203,122163 203,124478 203,124958 203,128005 203,128114 203,128116 203,130897 203,131209 203,134507 203,135130 203,135137 203,136163 203,136518 203,144152 203,144980 203,145390 203,145584 203,145608 203,147329 203,148822 203,149235 203,150080 203,153617 203,153814 203,155028 203,158136 203,164211 203,164760 203,165046 203,165218 203,167623 203,168256 203,168990 203,168991 203,169058 203,169358 203,169820 203,169998 203,170001 203,170037 203,170540 203,170699 203,170700 203,170701 203,170702 203,170703 203,172646 203,176894 203,180224 203,181731 203,182325 203,182412 203,182482 203,183458 203,185023 203,187778 203,189297 203,190434 203,190501 203,190529 203,192559 203,192890 203,194257 203,194502 203,195019 203,195067 203,195115 203,195727 203,196152 203,200581 203,201377 203,201698 203,203193 203,203196 203,203199 203,203200 203,203894 203,203983 203,204170 203,204763 203,204765 203,206342 203,207048 203,208624 203,212030 203,215276 203,215527 203,215528 203,215923 203,216651 203,217891 203,218413 203,220029 203,221247 203,221946 203,223740 203,224042 203,224684 203,230328 203,232238 203,232565 203,241964 203,243469 203,243471 203,244793 203,259433 203,260989 203,262338 203,264026 203,264539 204,205 205,205 206,1 206,10 206,146 206,147 206,149 206,158 206,175 206,184 206,206 206,336 206,406 206,505 206,622 206,841 206,957 206,1011 206,1181 206,1262 206,1290 206,1425 206,1458 206,1464 206,1515 206,1554 206,1815 206,1825 206,2244 206,2444 206,2451 206,2487 206,2558 206,2609 206,2637 206,2875 206,2903 206,3150 206,3444 206,3895 206,4507 206,4611 206,5073 206,5357 206,5401 206,5592 206,5896 206,6119 206,6222 206,6736 206,6766 206,6995 206,7128 206,7142 206,7336 206,7923 206,8070 206,8904 206,9394 206,13687 206,13906 206,15613 206,15795 206,16554 206,16891 206,16980 206,17551 206,17573 206,18489 206,19578 206,19854 206,19936 206,21123 206,21169 206,21905 206,22148 206,22199 206,22616 206,22843 206,23798 206,24060 206,25073 206,25697 206,26435 206,30331 206,30564 206,31183 206,31352 206,35284 206,35477 206,36667 206,38960 206,41050 206,41210 206,41385 206,42064 206,43255 206,43272 206,44313 206,44877 206,45422 206,46550 206,47434 206,47748 206,47772 206,48094 206,49472 206,49553 206,50320 206,51170 206,51260 206,51274 206,56527 206,57228 206,58960 206,59997 206,60496 206,60576 206,60795 206,70931 206,71835 206,71845 206,77014 206,77041 206,77646 206,80266 206,81456 206,82411 206,85752 206,88523 206,89035 206,89600 206,89952 206,92476 206,106494 206,107635 206,107780 206,109411 206,109835 206,115357 206,115749 206,117558 206,118336 206,121289 206,121699 206,124497 206,124687 206,124772 206,125775 206,128063 206,128078 206,129030 206,129512 206,137704 206,138867 206,142378 206,147078 206,147594 206,148256 206,148488 206,148744 206,159178 206,159258 206,159271 206,164560 206,167353 206,170367 206,170368 206,172817 206,172997 206,175649 206,177975 206,181676 206,182145 206,183726 206,188541 206,190898 206,193746 206,206868 206,212333 206,221682 206,226218 206,230914 206,231168 206,241391 206,246807 206,246852 206,248340 206,255719 206,257972 206,261999 207,11 207,20 207,22 207,65 207,182 207,186 207,207 207,259 207,287 207,299 207,314 207,326 207,338 207,347 207,356 207,392 207,397 207,424 207,425 207,433 207,452 207,457 207,535 207,599 207,663 207,668 207,673 207,676 207,702 207,752 207,818 207,849 207,873 207,874 207,911 207,918 207,1011 207,1014 207,1085 207,1118 207,1130 207,1133 207,1210 207,1276 207,1326 207,1417 207,1434 207,1559 207,1566 207,1607 207,1634 207,1655 207,1663 207,1796 207,1973 207,2373 207,2512 207,2580 207,3018 207,3582 207,4272 207,4514 207,5192 207,5667 207,6824 207,6891 207,6904 207,7759 207,13198 207,17897 207,19010 207,19413 207,23056 207,26058 207,31731 207,45574 207,46992 207,47158 207,49373 207,56410 207,60986 207,61270 207,65724 207,70871 207,79920 207,82237 207,86641 207,91933 207,96711 207,99027 207,102698 207,106135 207,116878 207,118336 207,118363 207,121007 207,127978 207,128825 207,139793 207,145707 207,147515 207,152893 207,167684 207,175756 207,182465 207,182498 207,185472 207,187139 207,189742 207,192320 207,207659 207,211883 207,215874 207,220937 208,209 209,192 209,256 209,314 209,397 209,440 209,452 209,457 209,599 209,673 209,676 209,685 209,843 209,849 209,852 209,929 209,1011 209,1014 209,1118 209,1130 209,1172 209,1191 209,1566 209,1796 209,1844 209,1973 209,2373 209,3524 209,6904 209,9457 209,14674 209,19413 209,215874 209,234257 210,211 211,175 211,192 211,211 211,240 211,327 211,356 211,440 211,441 211,500 211,510 211,685 211,718 211,794 211,849 211,911 211,949 211,1001 211,1010 211,1014 211,1118 211,1163 211,1235 211,1305 211,1332 211,1335 211,1412 211,1623 211,1796 211,1844 211,1849 211,1855 211,2105 211,2665 211,2867 211,2868 211,3407 211,3933 211,5174 211,5700 211,6292 211,6556 211,6637 211,7487 211,8287 211,8700 211,8805 211,13357 211,14024 211,14403 211,14726 211,15087 211,15230 211,15414 211,15560 211,15621 211,15834 211,15958 211,17151 211,17679 211,18025 211,18108 211,18256 211,18667 211,19505 211,19783 211,20890 211,22261 211,22296 211,22476 211,22880 211,24358 211,24924 211,26345 211,27149 211,28407 211,28424 211,28428 211,29114 211,30613 211,30746 211,31229 211,31382 211,31802 211,33487 211,38429 211,38860 211,38934 211,39621 211,41136 211,43744 211,44949 211,45149 211,45195 211,45577 211,49507 211,49531 211,49552 211,49594 211,49610 211,49626 211,49650 211,49725 211,50573 211,54621 211,57978 211,59083 211,61677 211,64687 211,66831 211,71770 211,72888 211,74065 211,74716 211,76234 211,82122 211,84903 211,85994 211,86004 211,86017 211,86361 211,87789 211,88467 211,88630 211,89306 211,92985 211,103236 211,106247 211,112548 211,114193 211,114211 211,117716 211,122318 211,127103 211,130143 211,130431 211,134779 211,142481 211,143107 211,160336 211,163150 211,164396 211,170750 211,171346 211,177981 211,178478 211,182037 211,185596 211,185615 211,185833 211,186229 211,186247 211,187271 211,196133 211,212650 211,216834 211,216853 211,218584 211,220478 211,221179 211,226195 211,228518 211,229809 211,229987 211,236154 211,236192 211,236196 211,237443 211,242288 211,255930 211,256527 211,259479 211,261835 212,52 212,1773 212,9598 212,140269 214,215 215,81 215,215 215,373 215,502 215,503 215,590 215,704 215,715 215,1257 215,1282 215,1402 215,1850 215,2052 215,2210 215,3085 215,3866 215,4032 215,4367 215,5278 215,13860 215,14204 215,14850 215,15221 215,16511 215,16755 215,17163 215,17172 215,18673 215,34330 215,35429 215,37488 215,39307 215,45061 215,45064 215,45068 215,45069 215,45070 215,45071 215,45074 215,45076 215,45078 215,45081 215,45083 215,45084 215,45089 215,45091 215,45122 215,45123 215,48146 215,48599 215,49603 215,54398 215,59273 215,64984 215,66334 215,66348 215,70062 215,70065 215,70068 215,70069 215,70072 215,72819 215,74505 215,78941 215,92055 215,97526 215,103964 215,104465 215,110620 215,112510 215,113622 215,120989 215,129071 215,130973 215,136125 215,136224 215,136227 215,142939 215,150439 215,157598 215,161968 215,162695 215,176473 215,176782 215,181187 215,182124 215,182162 215,191338 215,194505 215,195564 215,220541 215,239150 215,245556 215,247863 215,247876 215,247888 215,254556 215,255028 215,255099 215,255906 216,217 217,187 217,217 218,219 219,218 219,219 219,2624 219,2920 219,3823 219,7942 219,8035 219,8440 219,14235 219,14466 219,16106 219,18584 219,18762 219,21688 219,22422 219,25807 219,27039 219,28080 219,32339 219,33102 219,37678 219,39682 219,40777 219,40870 219,41541 219,42194 219,42952 219,47552 219,48189 219,49814 219,50634 219,50635 219,50855 219,51738 219,53497 219,61714 219,62609 219,62971 219,64096 219,64634 219,65421 219,69769 219,69776 219,73972 219,75400 219,76857 219,77968 219,80930 219,86560 219,92342 219,106117 219,106129 219,107181 219,107455 219,112375 219,117278 219,123568 219,124071 219,126643 219,129558 219,133143 219,134774 219,135302 219,135303 219,135304 219,135305 219,135306 219,136149 219,141591 219,142019 219,149678 219,150097 219,150813 219,154103 220,138 220,2674 220,16153 221,222 222,10 222,19 222,34 222,35 222,83 222,187 222,217 222,222 222,278 222,283 222,313 222,379 222,389 222,404 222,452 222,455 222,477 222,536 222,562 222,599 222,634 222,657 222,781 222,814 222,852 222,891 222,923 222,929 222,949 222,1005 222,1019 222,1052 222,1069 222,1072 222,1274 222,1367 222,1417 222,1467 222,1525 222,1566 222,1571 222,1607 222,1618 222,1663 222,1698 222,1722 222,1756 222,1871 222,1905 222,1995 222,2092 222,2103 222,2159 222,2168 222,2224 222,2266 222,2290 222,2318 222,2319 222,2322 222,2418 222,2421 222,2619 222,2646 222,2652 222,2784 222,2815 222,2944 222,3234 222,3507 222,3527 222,3542 222,3646 222,3672 222,3686 222,4007 222,4076 222,4207 222,4321 222,4377 222,4388 222,4440 222,4457 222,4637 222,4672 222,5178 222,5208 222,5265 222,5307 222,5326 222,5343 222,5458 222,5591 222,5702 222,5711 222,5887 222,6032 222,6240 222,6437 222,6506 222,6789 222,6828 222,6890 222,6913 222,6960 222,7075 222,7092 222,7301 222,7347 222,7698 222,7768 222,8140 222,8156 222,8431 222,8435 222,9756 222,13137 222,13240 222,13328 222,13549 222,13597 222,13607 222,13622 222,13980 222,14068 222,14303 222,14311 222,14384 222,14410 222,14507 222,14511 222,14517 222,14604 222,15325 222,15698 222,15708 222,16357 222,16412 222,16420 222,16676 222,17223 222,17811 222,17837 222,18165 222,18344 222,18433 222,18572 222,18650 222,18832 222,19352 222,19358 222,19420 222,19542 222,19552 222,19660 222,19681 222,19797 222,19818 222,19823 222,19829 222,19831 222,19845 222,20309 222,20393 222,20426 222,20583 222,20603 222,20723 222,20747 222,21233 222,21414 222,21449 222,21519 222,21548 222,21561 222,21612 222,21639 222,22172 222,23520 222,23839 222,24628 222,24672 222,24696 222,24917 222,25069 222,25521 222,25670 222,26804 222,28116 222,28373 222,28511 222,28533 222,28671 222,28724 222,28800 222,29177 222,29260 222,30328 222,31738 222,31801 222,31903 222,32238 222,32462 222,32742 222,32962 222,33508 222,34390 222,34401 222,34504 222,34742 222,34756 222,35695 222,36308 222,36594 222,36626 222,36692 222,36813 222,36980 222,37088 222,37095 222,37254 222,38030 222,38153 222,38972 222,40099 222,40500 222,40671 222,41333 222,41443 222,41490 222,41951 222,41981 222,42691 222,42854 222,43273 222,43303 222,43573 222,43660 222,44077 222,44135 222,44301 222,44329 222,44624 222,44750 222,44886 222,44915 222,44973 222,45197 222,48208 222,48515 222,49113 222,49177 222,49363 222,49379 222,49385 222,49388 222,49753 222,49948 222,50851 222,51126 222,51652 222,54328 222,54484 222,54948 222,55035 222,55123 222,55195 222,55201 222,55248 222,55329 222,55371 222,55412 222,55608 222,55984 222,56584 222,56600 222,57105 222,57419 222,57907 222,59109 222,59805 222,61355 222,62286 222,62459 222,63016 222,63032 222,63065 222,63410 222,63510 222,63519 222,64479 222,64611 222,65965 222,66703 222,66885 222,67931 222,68068 222,68164 222,68173 222,68207 222,68646 222,68704 222,70106 222,70228 222,70295 222,70888 222,74600 222,74658 222,75094 222,76971 222,77098 222,77659 222,79327 222,79589 222,79840 222,80949 222,80993 222,81135 222,81194 222,82150 222,82313 222,82570 222,82628 222,82718 222,82779 222,82922 222,83314 222,83451 222,83550 222,83745 222,84404 222,84452 222,86180 222,86730 222,90076 222,91396 222,91398 222,91790 222,91814 222,91816 222,93041 222,93158 222,93636 222,94342 222,95226 222,96240 222,96266 222,96788 222,96913 222,97393 222,97910 222,98329 222,101649 222,101851 222,102372 222,102569 222,104228 222,104691 222,105198 222,106104 222,106112 222,107167 222,107199 222,107356 222,107458 222,107598 222,107954 222,107999 222,109036 222,109537 222,109894 222,109967 222,110484 222,110725 222,110757 222,111089 222,112466 222,113277 222,113481 222,113496 222,113506 222,113738 222,113863 222,114314 222,114748 222,115139 222,115188 222,115294 222,115297 222,115352 222,115474 222,115672 222,115775 222,115804 222,115806 222,116074 222,116271 222,116497 222,116541 222,116649 222,116790 222,116809 222,117030 222,117083 222,117135 222,117142 222,117144 222,117151 222,117308 222,117680 222,117994 222,118872 222,119557 222,120840 222,121095 222,121179 222,121569 222,121599 222,121724 222,123104 222,124066 222,124390 222,124644 222,124650 222,124970 222,125046 222,125340 222,125588 222,125589 222,125848 222,125877 222,125963 222,125980 222,126060 222,126953 222,126989 222,127011 222,127504 222,127656 222,127876 222,128718 222,129236 222,130275 222,130415 222,130529 222,130732 222,130861 222,131216 222,131521 222,131652 222,131748 222,132868 222,133075 222,133086 222,133105 222,134058 222,134174 222,134597 222,134631 222,135129 222,136063 222,136077 222,138731 222,139685 222,140179 222,140342 222,142259 222,144323 222,144729 222,144771 222,145333 222,145720 222,146304 222,148837 222,148942 222,149115 222,149153 222,149223 222,149695 222,150058 222,150445 222,150858 222,151603 222,152583 222,152592 222,152915 222,153273 222,154192 222,154198 222,156296 222,157003 222,157899 222,158614 222,159824 222,159983 222,160398 222,160975 222,161203 222,161990 222,162448 222,162755 222,163160 222,164358 222,166019 222,167588 222,169212 222,169377 222,169947 222,171300 222,173482 222,174955 222,175919 222,177718 222,178208 222,179678 222,181063 222,182424 222,182467 222,183462 222,183555 222,183855 222,183873 222,184611 222,184641 222,185439 222,186319 222,186643 222,186645 222,186647 222,186648 222,186900 222,189443 222,190932 222,191378 222,192652 222,193446 222,194923 222,195047 222,195735 222,198688 222,203906 222,205816 222,212154 222,216666 222,216852 222,217532 222,219838 222,220296 222,220369 222,221547 222,221664 222,221679 222,223336 222,223656 222,224100 222,224807 222,224858 222,227164 222,227167 222,227656 222,228277 222,228604 222,229596 222,229714 222,229754 222,229812 222,229995 222,230590 222,231037 222,231936 222,232159 222,234026 222,236791 222,237497 222,241507 222,244642 222,244732 222,245262 222,245496 222,248493 222,248715 222,252306 222,252552 222,252750 222,254306 222,254892 222,258112 222,258309 222,258342 222,258357 222,261990 223,224 223,13955 223,16895 223,17960 223,22651 223,24921 223,35973 223,37286 225,30 225,104 225,134 225,135 225,137 225,211 225,225 225,226 225,248 225,288 225,364 225,431 225,462 225,557 225,599 225,636 225,772 225,850 225,943 225,954 225,989 225,1058 225,1332 225,1412 225,1415 225,1831 225,1849 225,1867 225,1980 225,2596 225,2689 225,3585 225,3633 225,4039 225,5215 225,5405 225,6231 225,6828 225,7414 225,8285 225,13207 225,13380 225,13506 225,13522 225,14134 225,14417 225,14516 225,14820 225,14945 225,15078 225,18803 225,19888 225,20357 225,20391 225,20645 225,23799 225,26431 225,26432 225,26436 225,26459 225,26481 225,26840 225,28112 225,35685 225,37651 225,38347 225,39579 225,40842 225,42762 225,42807 225,45149 225,45550 225,45602 225,46152 225,46776 225,48920 225,59006 225,60464 225,67067 225,71584 225,73441 225,79928 225,81703 225,84695 225,85814 225,87889 225,88561 225,92928 225,93104 225,96589 225,97195 225,104555 225,105641 225,114508 225,131216 225,132900 225,142367 225,146431 225,148297 225,151495 225,152127 225,154795 225,159110 225,164844 225,167698 225,185379 225,196128 225,197801 225,200539 225,201718 225,229092 225,229139 225,231489 225,235262 225,235660 225,238506 225,243521 226,225 228,83 229,81 231,4 231,5 231,94 231,6621 231,19466 231,79521 232,3 232,233 232,347 232,932 232,230509 232,230517 233,10 233,41 233,42 233,134 233,175 233,233 233,289 233,290 233,328 233,372 233,457 233,510 233,589 233,677 233,685 233,704 233,714 233,911 233,966 233,1001 233,1045 233,1085 233,1165 233,1195 233,1276 233,1285 233,1343 233,1402 233,1608 233,2193 233,2205 233,2286 233,2747 233,3135 233,3565 233,4308 233,5265 233,5706 233,6748 233,7975 233,8229 233,16545 233,19721 233,22168 233,28224 233,33424 233,33660 233,34921 233,35095 233,35704 233,41154 233,41247 233,41463 233,42952 233,44380 233,47706 233,47709 233,47710 233,48975 233,49879 233,55006 233,55007 233,55813 233,57634 233,61110 233,62393 233,63409 233,64840 233,75383 233,75754 233,75795 233,75912 233,77006 233,81018 233,88120 233,94134 233,110011 233,110136 233,120157 233,120925 233,135944 233,136146 233,140679 233,150593 233,165086 233,173388 233,178600 233,212626 233,216704 233,216763 233,217836 233,236126 233,238333 233,240864 233,245910 234,235 236,10 236,236 236,2681 236,3316 236,9598 236,140269 237,52 237,175 237,140269 237,178458 237,206059 237,227644 238,147 238,333 238,622 239,240 240,34 240,35 240,49 240,50 240,68 240,104 240,120 240,167 240,182 240,186 240,192 240,211 240,217 240,240 240,248 240,255 240,261 240,264 240,289 240,290 240,301 240,314 240,332 240,372 240,387 240,390 240,392 240,397 240,406 240,413 240,435 240,444 240,452 240,457 240,467 240,495 240,500 240,510 240,512 240,515 240,535 240,536 240,586 240,590 240,592 240,599 240,611 240,631 240,673 240,676 240,677 240,685 240,693 240,715 240,784 240,805 240,808 240,818 240,819 240,823 240,849 240,872 240,973 240,1001 240,1010 240,1011 240,1014 240,1019 240,1082 240,1085 240,1118 240,1151 240,1181 240,1203 240,1210 240,1262 240,1284 240,1285 240,1309 240,1326 240,1353 240,1359 240,1361 240,1370 240,1402 240,1417 240,1434 240,1462 240,1466 240,1518 240,1531 240,1564 240,1566 240,1608 240,1663 240,1705 240,1715 240,1779 240,1785 240,1796 240,1807 240,1808 240,1818 240,1853 240,1888 240,1945 240,1955 240,2069 240,2083 240,2142 240,2173 240,2235 240,2252 240,2411 240,2511 240,2512 240,2590 240,2620 240,2729 240,2775 240,2812 240,2838 240,2841 240,2989 240,2991 240,3028 240,3094 240,3115 240,3135 240,3250 240,3328 240,3397 240,3504 240,3508 240,3524 240,3580 240,3738 240,3810 240,3814 240,3832 240,3838 240,3879 240,3937 240,3942 240,4179 240,4220 240,4267 240,4514 240,4532 240,4540 240,4759 240,4771 240,5192 240,5228 240,5278 240,5361 240,5412 240,5654 240,5718 240,5765 240,5876 240,6004 240,6525 240,6556 240,6562 240,6824 240,6837 240,6853 240,6856 240,6895 240,6904 240,6995 240,7041 240,7076 240,7338 240,7344 240,7481 240,7880 240,8064 240,8243 240,8322 240,8323 240,8535 240,8537 240,9015 240,9025 240,9178 240,9457 240,11952 240,12871 240,13198 240,13207 240,13274 240,13524 240,13637 240,13641 240,14243 240,14286 240,14398 240,14405 240,14484 240,14554 240,14613 240,14874 240,15169 240,15206 240,15277 240,15424 240,15556 240,15648 240,15658 240,15763 240,15840 240,15931 240,16401 240,16414 240,16518 240,16653 240,17173 240,17207 240,17535 240,17848 240,18245 240,18299 240,18440 240,18528 240,18601 240,18620 240,18629 240,18647 240,18795 240,19468 240,19474 240,19592 240,19617 240,19859 240,20190 240,20350 240,20560 240,20609 240,20747 240,20757 240,20810 240,20947 240,21420 240,21580 240,21589 240,22029 240,22062 240,22281 240,22318 240,22337 240,22339 240,22440 240,22808 240,23069 240,23102 240,23683 240,24307 240,24815 240,24851 240,24896 240,25417 240,25685 240,26133 240,26228 240,26318 240,26362 240,26789 240,27041 240,27116 240,27242 240,27827 240,27903 240,28545 240,28553 240,28573 240,29079 240,29120 240,29132 240,29133 240,29595 240,29684 240,29787 240,30051 240,30502 240,30577 240,31729 240,32650 240,32906 240,33424 240,33608 240,33968 240,34515 240,34921 240,35304 240,35612 240,35855 240,36992 240,37407 240,37483 240,37509 240,37764 240,38353 240,38743 240,39046 240,39300 240,39673 240,39682 240,39684 240,39687 240,39690 240,39691 240,39697 240,39698 240,40531 240,40824 240,42545 240,42895 240,42977 240,43194 240,43264 240,43305 240,43407 240,43846 240,44191 240,44809 240,44869 240,44904 240,44932 240,45231 240,45760 240,46293 240,46316 240,46499 240,46614 240,46979 240,47371 240,47760 240,48418 240,48612 240,48718 240,48845 240,49297 240,49337 240,49570 240,49627 240,49741 240,50203 240,51359 240,51431 240,51434 240,52539 240,52585 240,54060 240,54551 240,55149 240,55168 240,55977 240,56455 240,56465 240,56469 240,58290 240,58331 240,58382 240,58489 240,58564 240,58990 240,59012 240,59058 240,59222 240,59226 240,59368 240,59657 240,59706 240,60463 240,61064 240,61261 240,61324 240,62431 240,62970 240,63054 240,63081 240,63102 240,63107 240,64341 240,64720 240,65767 240,65856 240,65860 240,65914 240,66404 240,66618 240,66774 240,67185 240,67220 240,68057 240,68219 240,69133 240,69854 240,70886 240,71294 240,71708 240,71851 240,72639 240,72684 240,72889 240,72907 240,73264 240,73287 240,73387 240,73400 240,75382 240,75912 240,76732 240,79642 240,80131 240,80378 240,80488 240,81006 240,81123 240,82887 240,83301 240,83343 240,83406 240,83434 240,83651 240,83766 240,87929 240,91505 240,93399 240,93566 240,93959 240,94134 240,94315 240,95616 240,96320 240,96686 240,96782 240,97766 240,98275 240,102687 240,102797 240,103356 240,104590 240,104825 240,105006 240,106613 240,107181 240,108020 240,109999 240,110126 240,110155 240,110217 240,112508 240,112906 240,113147 240,113557 240,114675 240,114738 240,114908 240,115608 240,115670 240,116567 240,116572 240,116637 240,117799 240,118377 240,118425 240,118490 240,118523 240,118678 240,120136 240,120239 240,121664 240,122051 240,122120 240,122572 240,122667 240,123007 240,123049 240,124472 240,124872 240,125604 240,126053 240,127025 240,127026 240,127158 240,127771 240,130889 240,133118 240,134904 240,135821 240,136232 240,137820 240,139659 240,139943 240,140337 240,140594 240,140928 240,141377 240,141625 240,142005 240,143740 240,145107 240,145639 240,145977 240,146001 240,146180 240,148115 240,148128 240,148275 240,149632 240,150015 240,150211 240,150358 240,150770 240,152152 240,152436 240,152447 240,152551 240,153008 240,155021 240,156679 240,158349 240,158684 240,158955 240,159483 240,160394 240,160505 240,160820 240,160861 240,160922 240,161534 240,161940 240,162654 240,162844 240,163610 240,164235 240,164246 240,164301 240,164371 240,165012 240,166329 240,166667 240,166704 240,168271 240,168587 240,169076 240,169444 240,169685 240,170032 240,170647 240,171090 240,171648 240,172101 240,173686 240,173698 240,173907 240,173956 240,174910 240,175488 240,177026 240,177455 240,178060 240,179804 240,181581 240,181913 240,181922 240,181945 240,182308 240,182631 240,183577 240,185974 240,186020 240,186398 240,186576 240,188732 240,188791 240,188887 240,189724 240,189980 240,191389 240,192119 240,192191 240,192903 240,193046 240,193485 240,193634 240,194481 240,195629 240,195664 240,202661 240,204423 240,212906 240,215874 240,216237 240,216525 240,216688 240,217316 240,218790 240,218884 240,219229 240,219266 240,226253 240,226398 240,226520 240,227199 240,228081 240,228844 240,229795 240,231911 240,232503 240,232887 240,232893 240,233480 240,233483 240,233632 240,233670 240,234072 240,234214 240,236551 240,237501 240,238532 240,239004 240,241022 240,242290 240,243193 240,243376 240,243467 240,243937 240,244050 240,246163 240,247042 240,247075 240,248733 240,249055 240,250713 240,251481 240,253226 240,255113 240,256470 240,258045 240,263869 241,83 242,1 242,20 242,48 242,63 242,72 242,81 242,86 242,107 242,130 242,135 242,137 242,146 242,149 242,151 242,163 242,182 242,184 242,192 242,207 242,209 242,247 242,250 242,251 242,252 242,254 242,256 242,258 242,259 242,262 242,264 242,272 242,273 242,274 242,275 242,278 242,280 242,283 242,289 242,290 242,299 242,302 242,305 242,306 242,307 242,309 242,310 242,313 242,314 242,315 242,326 242,337 242,338 242,347 242,352 242,356 242,406 242,581 242,626 242,647 242,668 242,736 242,805 242,843 242,852 242,861 242,893 242,920 242,934 242,972 242,1147 242,1220 242,1222 242,1247 242,1309 242,1381 242,1449 242,1465 242,1684 242,1707 242,1796 242,1818 242,1844 242,2048 242,2244 242,2837 242,3989 242,8993 242,9457 243,26 243,59 244,245 246,30 247,10 247,247 248,30 248,104 248,134 248,248 248,249 248,314 248,364 248,450 248,457 248,557 248,599 248,714 248,772 248,850 248,1179 248,1329 248,1332 248,1462 248,1796 248,2069 248,2206 248,3020 248,3031 248,3719 248,4276 248,7059 248,8200 248,13207 248,13220 248,20604 248,22776 248,29831 248,33302 248,62323 249,248 250,1557 251,10 251,63 251,202 251,203 251,251 251,252 251,275 251,316 251,318 251,425 251,446 251,457 251,460 251,464 251,465 251,493 251,516 251,599 251,682 251,685 251,733 251,911 251,920 251,1014 251,1220 251,1222 251,1243 251,1385 251,1512 251,1568 251,1702 251,1794 251,1899 251,2125 251,2427 251,2782 251,4273 251,4492 251,5307 251,5992 251,6075 251,7103 251,7532 251,7863 251,8106 251,13720 251,14507 251,15055 251,16010 251,16014 251,16497 251,18733 251,19651 251,20295 251,21081 251,21210 251,24237 251,24600 251,24934 251,28354 251,30393 251,34908 251,38899 251,39012 251,39063 251,39178 251,41170 251,44196 251,45663 251,46870 251,48040 251,49172 251,50116 251,50396 251,50855 251,51961 251,54438 251,55663 251,56801 251,57487 251,61007 251,62854 251,62902 251,66033 251,69713 251,70432 251,70930 251,72439 251,72644 251,79359 251,80206 251,81121 251,83338 251,91359 251,91865 251,92881 251,93206 251,93311 251,94906 251,112246 251,113341 251,113408 251,114177 251,117851 251,117926 251,123103 251,128170 251,129716 251,130897 251,135904 251,136163 251,138169 251,142478 251,142971 251,144827 251,144940 251,147559 251,153212 251,159387 251,159390 251,159392 251,161959 251,166572 251,166576 251,166584 251,168250 251,168374 251,171375 251,171497 251,176019 251,176976 251,177321 251,182433 251,189788 251,191780 251,191984 251,193079 251,193092 251,197603 251,199656 251,201025 251,201028 251,201723 251,201825 251,201866 251,202086 251,204466 251,205307 251,206236 251,206241 251,207522 251,207549 251,207565 251,212288 251,212289 251,212290 251,212291 251,212370 251,212411 251,214552 251,215596 251,216633 251,217905 251,226288 251,228201 251,234097 251,234688 251,235721 251,245805 251,249210 251,251255 251,255768 251,255896 251,259550 252,63 252,65 252,106 252,147 252,149 252,158 252,202 252,203 252,251 252,252 252,275 252,314 252,316 252,318 252,336 252,406 252,457 252,465 252,493 252,516 252,599 252,622 252,682 252,685 252,733 252,911 252,920 252,1014 252,1118 252,1220 252,1222 252,1243 252,1263 252,1266 252,1385 252,1472 252,1512 252,1517 252,1568 252,1655 252,1702 252,1927 252,2400 252,2874 252,3158 252,3199 252,3582 252,3866 252,4150 252,4539 252,4612 252,5762 252,5816 252,5991 252,5992 252,6075 252,7103 252,7532 252,8606 252,9107 252,13226 252,13269 252,13374 252,13436 252,13525 252,13607 252,13720 252,14203 252,15467 252,15624 252,15733 252,16010 252,16014 252,16298 252,17884 252,19651 252,20295 252,21409 252,22013 252,22204 252,22528 252,22553 252,23341 252,23650 252,23734 252,24933 252,26034 252,27003 252,27006 252,29246 252,29960 252,30551 252,30682 252,30990 252,31148 252,31152 252,31433 252,32166 252,33354 252,34899 252,35830 252,36967 252,37033 252,37034 252,37366 252,37697 252,37698 252,37771 252,38458 252,38899 252,38922 252,39012 252,39034 252,41170 252,41230 252,41236 252,41986 252,44390 252,44859 252,45002 252,46169 252,47318 252,47555 252,48162 252,48524 252,49172 252,49195 252,50356 252,50434 252,50454 252,50476 252,50484 252,50608 252,50626 252,54361 252,54365 252,55663 252,56616 252,56992 252,57093 252,59729 252,63387 252,64563 252,64598 252,68109 252,70404 252,70901 252,71985 252,72043 252,72439 252,72582 252,73510 252,74457 252,74514 252,74759 252,75799 252,76137 252,77909 252,78872 252,78883 252,78892 252,78975 252,79018 252,79522 252,82349 252,84005 252,84626 252,85979 252,87830 252,88636 252,94931 252,94982 252,96615 252,97075 252,97530 252,98227 252,102789 252,104605 252,106917 252,106960 252,106961 252,107426 252,108042 252,110768 252,112905 252,113855 252,116534 252,116692 252,116908 252,117075 252,117123 252,117720 252,117959 252,118394 252,125564 252,127491 252,127705 252,131893 252,138344 252,143560 252,145026 252,145106 252,146794 252,150052 252,151519 252,153212 252,154376 252,155009 252,155011 252,156729 252,157974 252,160511 252,160512 252,163543 252,164225 252,164860 252,165021 252,165762 252,166363 252,166370 252,166733 252,167061 252,169865 252,171059 252,171333 252,171375 252,172171 252,172766 252,175294 252,175611 252,175779 252,176794 252,176993 252,177397 252,179164 252,184953 252,189788 252,189794 252,189839 252,189842 252,190413 252,193255 252,201285 252,201922 252,202996 252,203242 252,204475 252,204476 252,204477 252,204542 252,207064 252,207184 252,207185 252,211826 252,212381 252,215276 252,216035 252,216895 252,218862 252,219788 252,221240 252,224825 252,225397 252,228185 252,234275 252,234286 252,236036 252,236997 252,238167 252,238788 252,239038 252,240695 252,241083 252,242508 252,244156 252,244659 252,246181 252,247867 252,248592 252,249198 252,250694 252,254923 252,255355 252,255866 252,259550 252,260725 252,260726 253,254 253,349 253,596 253,605 253,1149 253,1179 253,1414 253,2367 253,2379 254,104 254,134 254,254 254,503 254,557 254,636 254,704 254,715 254,772 254,953 254,954 254,1016 254,1149 254,1213 254,1282 254,1332 254,1368 254,1572 254,1690 254,1882 254,1939 254,1973 254,1980 254,2727 254,2934 254,3590 254,4276 254,4341 254,5189 254,5405 254,5830 254,6023 254,6674 254,6732 254,7917 254,8351 254,14638 254,14670 254,15320 254,15515 254,15579 254,17116 254,17214 254,17217 254,18549 254,19500 254,20899 254,22090 254,24739 254,25520 254,28194 254,28367 254,28536 254,31358 254,38428 254,42784 254,42962 254,43142 254,46567 254,50313 254,58053 254,64575 254,67105 254,86929 254,90799 254,93252 254,107562 254,107969 254,108787 254,112505 254,117741 254,119018 254,121969 254,131785 254,135286 254,136580 254,136581 254,142446 254,152601 254,159825 254,160941 254,162981 254,164706 254,168909 254,172624 254,173566 254,175384 254,176833 254,180988 254,189729 254,198162 254,201055 254,216195 255,10 255,22 255,86 255,186 255,240 255,255 255,450 255,534 255,563 255,693 255,818 255,911 255,1085 255,1118 255,1210 255,1284 255,1285 255,1459 255,1462 255,1740 255,8686 255,13712 255,15570 255,15648 255,20724 255,22543 255,23693 255,31312 255,34524 255,39951 255,40236 255,41160 255,58115 255,64003 255,75912 255,87193 255,105657 255,113723 255,115101 255,115479 255,116135 255,116165 255,118018 255,119008 255,126954 255,129371 255,137726 255,138879 255,144131 255,147957 255,168955 255,169043 255,201406 255,235276 255,240338 255,242202 255,246612 255,260703 256,11 256,65 256,86 256,192 256,209 256,256 256,259 256,283 256,299 256,314 256,333 256,336 256,349 256,352 256,360 256,392 256,439 256,442 256,444 256,457 256,497 256,505 256,512 256,557 256,567 256,575 256,622 256,623 256,668 256,673 256,676 256,685 256,702 256,715 256,764 256,775 256,801 256,838 256,841 256,843 256,849 256,852 256,900 256,918 256,968 256,972 256,991 256,992 256,999 256,1014 256,1072 256,1118 256,1135 256,1143 256,1147 256,1172 256,1191 256,1192 256,1204 256,1298 256,1345 256,1363 256,1402 256,1417 256,1449 256,1499 256,1566 256,1619 256,1623 256,1655 256,1663 256,1724 256,1805 256,1837 256,1844 256,1858 256,1860 256,1877 256,1891 256,1973 256,2173 256,2253 256,2605 256,2779 256,3258 256,3524 256,3555 256,3582 256,3962 256,3999 256,4066 256,4165 256,4190 256,4276 256,4637 256,4760 256,5052 256,5155 256,5405 256,5466 256,5591 256,5718 256,7152 256,8055 256,8214 256,14674 256,16332 256,18298 256,22395 256,27014 256,29909 256,29943 256,39730 256,42006 256,46486 256,54616 256,59197 256,61066 256,80279 256,95588 256,115222 256,123846 256,158318 256,161106 256,169979 256,176815 256,176940 256,182908 256,225404 256,250645 259,1 259,11 259,20 259,126 259,182 259,207 259,256 259,259 259,272 259,314 259,336 259,356 259,393 259,397 259,439 259,440 259,452 259,457 259,483 259,538 259,577 259,599 259,668 259,673 259,676 259,685 259,690 259,726 259,788 259,794 259,838 259,843 259,849 259,852 259,859 259,902 259,911 259,929 259,972 259,980 259,1011 259,1014 259,1070 259,1105 259,1118 259,1130 259,1172 259,1191 259,1204 259,1262 259,1345 259,1388 259,1433 259,1531 259,1566 259,1603 259,1634 259,1655 259,1663 259,1973 259,2178 259,2224 259,2253 259,2320 259,2460 259,2580 259,2599 259,2713 259,2923 259,3398 259,3417 259,3507 259,3524 259,3724 259,3951 259,3971 259,4152 259,4190 259,4203 259,4455 259,4545 259,4611 259,5192 259,5401 259,5492 259,5583 259,5726 259,6824 259,6904 259,8676 259,9457 259,14232 259,14674 259,15783 259,16609 259,17819 259,18108 259,19413 259,20686 259,20757 259,21286 259,21448 259,24375 259,25282 259,25332 259,26450 259,28312 259,31419 259,32585 259,34829 259,35486 259,37275 259,38132 259,38951 259,39453 259,40477 259,40591 259,42483 259,42488 259,44401 259,45983 259,46944 259,47650 259,48643 259,48963 259,54493 259,56150 259,57043 259,57143 259,57243 259,61176 259,64201 259,64746 259,65393 259,66323 259,67161 259,68150 259,68157 259,68206 259,68323 259,68741 259,68840 259,70998 259,71186 259,71981 259,72697 259,73517 259,73547 259,73569 259,75883 259,77850 259,80670 259,81995 259,84474 259,84738 259,85851 259,86491 259,87832 259,89558 259,93034 259,93057 259,93765 259,94301 259,95387 259,106218 259,106887 259,107496 259,108159 259,118792 259,125509 259,128634 259,133045 259,135182 259,138686 259,139010 259,145193 259,145862 259,149192 259,150719 259,150828 259,156796 259,159720 259,160312 259,162599 259,164298 259,171356 259,173769 259,176786 259,183584 259,183910 259,185149 259,185934 259,187099 259,189897 259,189899 259,189900 259,189901 259,189902 259,189909 259,189911 259,189914 259,190271 259,190273 259,190423 259,190756 259,191408 259,192515 259,192618 259,193578 259,206160 259,207659 259,212324 259,212407 259,212430 259,212448 259,215276 259,215874 259,220889 259,220891 259,225905 259,233108 259,236472 259,240038 259,241631 259,244720 259,247950 259,254154 259,263236 260,261 261,41 261,68 261,120 261,240 261,261 261,301 261,332 261,333 261,372 261,373 261,390 261,446 261,590 261,599 261,615 261,631 261,677 261,685 261,694 261,784 261,805 261,818 261,849 261,852 261,875 261,903 261,968 261,1001 261,1011 261,1014 261,1209 261,1231 261,1285 261,1309 261,1353 261,1395 261,1419 261,1466 261,1782 261,1801 261,1844 261,1955 261,2321 261,2512 261,2775 261,2824 261,3115 261,3328 261,3867 261,4532 261,4752 261,5208 261,5382 261,6437 261,6856 261,7196 261,13274 261,14080 261,14113 261,14371 261,14730 261,15397 261,15562 261,15693 261,15767 261,15931 261,17601 261,17838 261,18142 261,18802 261,19592 261,20540 261,20592 261,23625 261,31197 261,32751 261,32820 261,34335 261,35546 261,35961 261,36483 261,37407 261,39618 261,40682 261,41310 261,41938 261,41951 261,42070 261,42762 261,43223 261,48052 261,48291 261,49373 261,49784 261,50541 261,50546 261,51462 261,51463 261,51465 261,51471 261,51474 261,51505 261,52054 261,52192 261,62377 261,65209 261,65681 261,70127 261,71110 261,75233 261,77142 261,98915 261,105933 261,107761 261,109402 261,113643 261,115298 261,120931 261,123830 261,124070 261,124621 261,127158 261,129695 261,131926 261,134537 261,134891 261,136617 261,146476 261,150580 261,150741 261,153756 261,154450 261,154819 261,155336 261,156352 261,156637 261,157409 261,157706 261,159024 261,164386 261,171648 261,173956 261,174093 261,176333 261,179129 261,179155 261,179210 261,181945 261,185491 261,186482 261,206453 261,212914 261,217760 261,229823 261,236718 261,238996 261,241114 261,247366 261,247772 261,253774 261,256957 261,258680 261,259994 263,167 264,104 264,111 264,182 264,186 264,192 264,217 264,240 264,248 264,264 264,290 264,292 264,301 264,314 264,397 264,440 264,457 264,467 264,509 264,510 264,685 264,714 264,808 264,838 264,843 264,872 264,992 264,1010 264,1011 264,1085 264,1118 264,1181 264,1192 264,1210 264,1298 264,1381 264,1417 264,1433 264,1462 264,1531 264,1533 264,1551 264,1566 264,1796 264,1818 264,1844 264,1943 264,2173 264,2205 264,2206 264,2266 264,2671 264,2979 264,3744 264,4039 264,4066 264,16687 264,33424 265,187 266,267 268,269 269,269 269,467 269,693 269,2400 269,3927 269,5631 269,6895 269,33339 269,34298 269,36252 269,41538 269,45427 269,58422 269,67251 269,91678 269,96649 269,113068 269,113858 269,116479 269,120135 269,121481 269,121692 269,121852 269,122016 269,127315 269,128667 269,146256 269,146259 269,146747 269,150741 269,156719 269,158349 269,159160 269,160458 269,160887 269,162608 269,162858 269,162997 269,163330 269,163416 269,163455 269,163851 269,165512 269,168420 269,168506 269,169946 269,170727 269,173407 269,174629 269,174632 269,176189 269,177430 269,178563 269,178605 269,178653 269,179043 269,179387 269,179628 269,179717 269,180710 269,184538 269,186456 269,187793 269,187829 269,187830 269,190976 269,191303 269,191304 269,192117 269,192400 269,193840 269,194073 269,201366 269,204704 269,215532 269,216429 269,220733 269,221258 269,221259 269,223192 269,226559 269,227601 269,232609 269,232665 269,233523 269,233980 269,235889 269,235895 269,235917 269,236077 269,243872 269,243875 269,247827 269,253137 269,263224 270,271 271,271 272,259 272,272 272,290 272,346 272,447 272,467 272,538 272,673 272,685 272,690 272,693 272,726 272,794 272,849 272,859 272,911 272,921 272,980 272,1067 272,1068 272,1070 272,1130 272,1218 272,1474 272,1531 272,1559 272,1848 272,2178 272,2387 272,2427 272,2580 272,2782 272,3519 272,3735 272,4455 272,4545 272,8196 272,8425 272,8701 272,13374 272,14232 272,16231 272,16667 272,18124 272,21332 272,22088 272,22137 272,23039 272,24855 272,25686 272,26041 272,28773 272,30775 272,33604 272,35486 272,36733 272,38393 272,38822 272,38872 272,40077 272,45651 272,45761 272,45983 272,48169 272,48621 272,49247 272,50469 272,56150 272,57243 272,67395 272,70247 272,70842 272,75231 272,81172 272,82224 272,82232 272,83947 272,91541 272,94134 272,96703 272,97385 272,97394 272,97406 272,97408 272,97418 272,97432 272,97440 272,97934 272,105931 272,107215 272,108087 272,109592 272,109995 272,109999 272,112016 272,130951 272,135388 272,138686 272,139010 272,139502 272,154481 272,156379 272,166383 272,172601 272,175399 272,179778 272,179786 272,179996 272,180005 272,180016 272,183847 272,189176 272,190040 272,190343 272,213781 272,216154 272,216169 272,218512 272,220629 272,221216 272,229006 272,229366 272,233547 272,235891 272,240038 272,243731 272,244066 272,244815 272,246186 272,248445 272,248495 272,252199 272,253299 272,258807 273,273 273,274 273,446 273,1636 273,1839 273,5766 273,5994 273,10397 273,16126 273,19403 273,20547 273,22886 273,25070 273,33391 273,34160 273,35434 273,36975 273,39052 273,39568 273,44485 273,59899 273,66401 273,66552 273,66754 273,68022 273,68654 273,68711 273,87735 273,103239 273,107029 273,107908 273,110693 273,110718 273,112317 273,115324 273,116603 273,120673 273,122600 273,123931 273,129820 273,141813 273,159245 273,159488 273,167148 273,167729 273,168896 273,169003 273,170663 273,171766 273,173389 273,176705 273,179201 273,179236 273,182044 273,183353 273,184709 273,186254 273,206359 274,273 274,274 275,10 275,175 275,202 275,203 275,252 275,275 275,277 275,279 275,314 275,360 275,446 275,493 275,516 275,599 275,622 275,733 275,794 275,1220 275,1222 275,1243 275,1262 275,1265 275,1266 275,1512 275,1568 275,1927 275,2528 275,3485 275,5992 275,6402 275,7087 275,7161 275,8699 275,13529 275,14367 275,14507 275,15624 275,16454 275,17550 275,24066 275,26590 275,27986 275,32852 275,32884 275,41170 275,50420 275,59020 275,62481 275,72439 275,76813 275,80025 275,124587 275,127255 275,149241 275,157703 275,172596 275,175756 275,175998 275,176001 275,188211 275,188244 275,189788 275,189794 275,190442 275,193599 275,195438 275,195563 275,196711 275,202519 275,205336 275,212620 275,213717 275,215276 275,215900 275,223738 275,228457 275,236034 275,236035 275,236040 275,236050 275,247832 275,251388 276,277 276,279 278,19 278,34 278,35 278,54 278,217 278,222 278,278 278,313 278,338 278,379 278,389 278,425 278,431 278,455 278,536 278,571 278,599 278,634 278,657 278,660 278,685 278,818 278,838 278,852 278,903 278,949 278,951 278,1011 278,1019 278,1138 278,1198 278,1218 278,1274 278,1467 278,1525 278,1539 278,1700 278,1724 278,1735 278,1756 278,1881 278,1916 278,1995 278,2159 278,2207 278,2290 278,2418 278,2421 278,2424 278,2633 278,2646 278,2779 278,2802 278,3069 278,3252 278,3507 278,3743 278,3970 278,4190 278,4268 278,5208 278,5591 278,5604 278,6754 278,6789 278,6828 278,7075 278,7182 278,7768 278,7809 278,7839 278,7869 278,8156 278,9701 278,9729 278,13137 278,13240 278,13276 278,15171 278,15497 278,15502 278,16357 278,16410 278,16950 278,17811 278,18737 278,19349 278,19672 278,20498 278,21321 278,21411 278,21445 278,21563 278,21733 278,22172 278,24208 278,24340 278,25398 278,25508 278,25878 278,26056 278,29055 278,30373 278,30453 278,32929 278,34312 278,34415 278,35468 278,36594 278,37088 278,39461 278,40199 278,41136 278,41546 278,42682 278,49961 278,50018 278,51665 278,54196 278,54242 278,54484 278,54957 278,55871 278,56525 278,57025 278,57851 278,58370 278,59666 278,61089 278,62705 278,63410 278,63988 278,64108 278,64859 278,65913 278,72570 278,74555 278,74658 278,76915 278,79397 278,79966 278,83255 278,85449 278,85745 278,87025 278,88002 278,90959 278,92883 278,98226 278,106832 278,107369 278,107423 278,107762 278,109899 278,110016 278,115474 278,121197 278,125482 278,127158 278,130275 278,131216 278,131497 278,131822 278,135270 278,135319 278,136679 278,138036 278,140225 278,140832 278,141321 278,141840 278,145510 278,145534 278,145536 278,145537 278,145540 278,145541 278,145543 278,145544 278,145547 278,145552 278,145560 278,145561 278,145562 278,145563 278,145572 278,145695 278,145941 278,146453 278,147939 278,150775 278,151531 278,152540 278,152547 278,162507 278,163400 278,163718 278,164237 278,174955 278,177188 278,177486 278,182375 278,183059 278,185846 278,186508 278,186513 278,190491 278,192013 278,192901 278,195007 278,199472 278,203891 278,207836 278,219512 278,220896 278,224461 278,224738 278,225319 278,225570 278,230227 278,230295 278,238768 278,247959 278,248556 278,254201 278,256486 278,259001 278,260367 278,261498 278,263077 278,263848 279,275 279,277 279,195438 280,280 280,2782 280,7222 280,8438 280,17245 280,23057 280,72489 281,282 283,34 283,35 283,54 283,192 283,222 283,256 283,283 283,313 283,389 283,397 283,455 283,536 283,814 283,951 283,1014 283,1019 283,1201 283,1417 283,1467 283,1525 283,1539 283,1724 283,1756 283,1860 283,1881 283,1916 283,2092 283,2269 283,2424 283,2619 283,2689 283,2775 283,2874 283,3628 283,3646 283,3672 283,4039 283,4637 283,5343 283,5591 283,5758 283,5862 283,6032 283,6788 283,6789 283,6828 283,7768 283,8152 283,8410 283,8463 283,13137 283,13276 283,13549 283,13605 283,16186 283,18398 283,19352 283,21253 283,21561 283,22552 283,25382 283,26055 283,28353 283,29595 283,30549 283,30617 283,31397 283,31801 283,37088 283,38857 283,39570 283,43273 283,45647 283,48161 283,48497 283,50517 283,55677 283,57907 283,58403 283,58820 283,63988 283,67172 283,68173 283,81068 283,82101 283,92922 283,97392 283,103913 283,115474 283,118835 283,126282 283,127158 283,131216 283,131224 283,131390 283,133105 283,145368 283,148809 283,149361 283,151123 283,151157 283,151346 283,153219 283,153255 283,153257 283,153766 283,156575 283,157052 283,158199 283,158788 283,159016 283,159029 283,159037 283,159116 283,160975 283,162606 283,168165 283,169377 283,169564 283,190108 283,197856 283,211837 283,212976 283,214831 283,217509 283,223656 283,224098 283,226474 283,235959 283,241319 283,243506 283,248712 283,252750 283,256173 283,258236 284,285 285,72 285,99 285,146 285,158 285,175 285,195 285,285 285,336 285,391 285,392 285,406 285,422 285,438 285,602 285,620 285,622 285,640 285,644 285,654 285,779 285,841 285,875 285,918 285,944 285,1181 285,1425 285,1458 285,1502 285,1515 285,1776 285,1803 285,1825 285,2070 285,2374 285,3508 285,3895 285,4010 285,4087 285,7818 285,9394 285,13197 285,13493 285,14040 285,14136 285,14244 285,15112 285,19782 285,20031 285,23507 285,23991 285,24021 285,24835 285,25385 285,26249 285,26414 285,26972 285,28497 285,29289 285,30043 285,30330 285,31524 285,32741 285,32764 285,32789 285,32800 285,35497 285,35623 285,37695 285,43673 285,44379 285,44439 285,45102 285,46848 285,50165 285,50167 285,53010 285,57193 285,59556 285,59693 285,60576 285,62522 285,63650 285,64079 285,68069 285,68967 285,92476 285,94126 285,96816 285,102560 285,105692 285,106444 285,109367 285,118336 285,124682 285,131424 285,138859 285,139498 285,141912 285,144040 285,145405 285,148601 285,156449 285,162717 285,162958 285,166375 285,170149 285,177683 285,179278 285,191939 285,223938 285,240174 285,243738 285,247337 285,251628 285,252094 285,257056 286,287 287,106 287,140 287,175 287,207 287,287 287,301 287,314 287,326 287,347 287,349 287,392 287,433 287,440 287,446 287,457 287,510 287,663 287,664 287,673 287,685 287,702 287,733 287,794 287,809 287,818 287,824 287,874 287,911 287,937 287,1011 287,1058 287,1130 287,1133 287,1191 287,1210 287,1342 287,1368 287,1422 287,1607 287,1623 287,1634 287,1973 287,2053 287,2361 287,4272 287,4450 287,5165 287,6456 287,6632 287,9712 287,14304 287,14520 287,15527 287,18429 287,18757 287,19010 287,19359 287,19384 287,20428 287,20657 287,20757 287,21351 287,22293 287,22347 287,23338 287,24790 287,25519 287,29765 287,30233 287,31091 287,32729 287,33618 287,34775 287,34900 287,35460 287,35668 287,40558 287,40713 287,42779 287,43135 287,43889 287,44334 287,44734 287,45705 287,56397 287,56609 287,57788 287,64667 287,67141 287,67537 287,67891 287,67948 287,70741 287,72622 287,72816 287,77816 287,78912 287,79833 287,80667 287,83663 287,87273 287,87746 287,88661 287,89661 287,89802 287,91820 287,91980 287,93113 287,95509 287,95592 287,95957 287,98261 287,99096 287,107503 287,109274 287,109312 287,110150 287,110565 287,111406 287,114597 287,115066 287,118801 287,119295 287,122008 287,122085 287,122866 287,123542 287,124668 287,126781 287,127158 287,127720 287,127808 287,127864 287,128162 287,129091 287,130376 287,133478 287,134048 287,134067 287,134635 287,134643 287,134773 287,134777 287,135133 287,135228 287,135534 287,135535 287,135536 287,135537 287,135538 287,135539 287,135540 287,135541 287,135542 287,135543 287,135544 287,135545 287,135546 287,135547 287,135548 287,135549 287,135550 287,135551 287,135552 287,135553 287,135554 287,135555 287,135556 287,135557 287,135558 287,135559 287,135560 287,135561 287,135562 287,135920 287,135921 287,136107 287,136189 287,136651 287,136652 287,136993 287,137066 287,137145 287,138718 287,138719 287,139319 287,144887 287,146337 287,146690 287,148735 287,148895 287,152855 287,173423 287,175580 287,179220 287,186570 287,187321 287,188548 287,194025 287,196178 287,201947 287,212225 287,218626 287,224462 287,225654 287,233844 287,234160 287,254212 287,258180 287,259133 288,225 288,248 288,450 288,1332 288,5405 289,40 289,41 289,104 289,192 289,272 289,289 289,290 289,304 289,328 289,372 289,510 289,609 289,631 289,632 289,677 289,685 289,704 289,714 289,715 289,760 289,784 289,1082 289,1085 289,1118 289,1195 289,1282 289,1329 289,1359 289,1402 289,1416 289,1481 289,1505 289,1572 289,1641 289,1662 289,1962 289,1973 289,2008 289,2205 289,2206 289,2286 289,2296 289,2315 289,2572 289,2655 289,2918 289,3003 289,3028 289,3069 289,3565 289,3672 289,3843 289,4066 289,4417 289,4464 289,4879 289,5011 289,5278 289,7017 289,8454 289,8821 289,12747 289,13205 289,13657 289,13691 289,14156 289,17357 289,17452 289,18933 289,18965 289,21290 289,22268 289,23352 289,25571 289,26429 289,26460 289,26644 289,26781 289,28191 289,28785 289,29922 289,30443 289,31531 289,33424 289,33697 289,34820 289,35614 289,39307 289,40152 289,40867 289,42029 289,42582 289,43303 289,46874 289,50641 289,52964 289,54737 289,55261 289,55760 289,57047 289,59194 289,59212 289,60004 289,61974 289,62264 289,68006 289,74547 289,78891 289,80268 289,81065 289,82819 289,82869 289,83588 289,83899 289,85852 289,91257 289,91487 289,94134 289,98113 289,98403 289,102250 289,102705 289,105173 289,105174 289,105489 289,107123 289,108114 289,108117 289,110492 289,113097 289,114072 289,114414 289,118248 289,122396 289,123796 289,127158 289,130553 289,131487 289,132670 289,140120 289,141622 289,143393 289,143725 289,144988 289,150797 289,153739 289,154795 289,167123 289,171377 289,174910 289,180988 289,184149 289,191894 289,193698 289,217847 289,227798 289,230456 289,232286 289,233813 289,235034 289,237659 289,237706 289,239757 289,241091 289,245910 289,246850 289,247467 289,248555 289,251950 289,252001 289,253953 289,255577 289,258894 289,259432 291,292 292,5 292,11 292,15 292,58 292,107 292,111 292,186 292,227 292,256 292,292 292,314 292,338 292,349 292,373 292,397 292,420 292,441 292,442 292,446 292,457 292,461 292,462 292,487 292,495 292,502 292,509 292,510 292,518 292,535 292,595 292,599 292,626 292,673 292,677 292,685 292,693 292,703 292,745 292,746 292,749 292,794 292,801 292,805 292,846 292,849 292,852 292,872 292,911 292,973 292,978 292,1014 292,1025 292,1043 292,1046 292,1052 292,1058 292,1130 292,1151 292,1172 292,1177 292,1235 292,1238 292,1335 292,1424 292,1449 292,1453 292,1559 292,1572 292,1653 292,1668 292,1677 292,1688 292,1722 292,1758 292,1848 292,1849 292,1860 292,1948 292,1961 292,2089 292,2163 292,2209 292,2373 292,2580 292,2595 292,3367 292,3483 292,3496 292,3538 292,3545 292,3830 292,4039 292,4066 292,4114 292,4520 292,4565 292,4580 292,4771 292,5185 292,5423 292,5584 292,6476 292,6880 292,7530 292,7766 292,7993 292,8149 292,9655 292,9658 292,13324 292,13502 292,14135 292,14185 292,14188 292,14353 292,15339 292,16138 292,16614 292,19415 292,20673 292,21324 292,21944 292,22467 292,22535 292,24733 292,25646 292,26481 292,26906 292,28814 292,29061 292,29975 292,30373 292,30476 292,30770 292,31802 292,32630 292,32819 292,34705 292,34740 292,35175 292,37414 292,37418 292,38300 292,39109 292,39530 292,40442 292,42903 292,44095 292,44522 292,45047 292,45530 292,46484 292,47100 292,47278 292,49373 292,49692 292,52210 292,56422 292,59206 292,61083 292,61255 292,62383 292,62417 292,62824 292,62985 292,68811 292,79330 292,79369 292,79969 292,80188 292,80914 292,82114 292,87943 292,90325 292,97392 292,101907 292,110032 292,114446 292,114456 292,116017 292,116502 292,117034 292,117541 292,117775 292,122392 292,131876 292,132062 292,133594 292,134490 292,135919 292,137258 292,138704 292,139488 292,140786 292,143410 292,145104 292,147485 292,152767 292,153284 292,155786 292,156629 292,158309 292,161315 292,166339 292,167078 292,170189 292,171141 292,171810 292,173788 292,174312 292,175027 292,176347 292,181935 292,183480 292,185031 292,185543 292,185864 292,187985 292,187986 292,188837 292,190003 292,191143 292,192643 292,197680 292,206387 292,207659 292,208030 292,212367 292,213086 292,214500 292,216814 292,225741 292,226252 292,231006 292,231011 292,231019 292,231105 292,231143 292,232042 292,233458 292,235544 292,235814 292,237289 292,237646 292,238304 292,243501 292,243717 292,244838 292,258089 292,258097 292,258132 292,260782 292,264434 293,294 294,240 294,328 294,431 294,617 294,631 294,634 294,772 294,784 294,797 294,805 294,838 294,1052 294,1085 294,1118 294,1415 294,1572 294,2015 294,2346 294,2775 294,2834 294,3504 294,3507 294,5405 294,7087 294,7458 294,13359 294,13366 294,13626 294,14482 294,14605 294,16641 294,27126 294,28553 294,31785 294,75912 294,86102 294,89899 294,91540 294,102814 294,110717 294,127158 294,131038 294,131058 294,133764 294,245521 295,296 296,296 296,314 297,298 298,41 298,104 298,135 298,175 298,240 298,289 298,290 298,298 298,417 298,425 298,446 298,534 298,589 298,612 298,626 298,631 298,636 298,693 298,715 298,784 298,818 298,862 298,932 298,1016 298,1085 298,1119 298,1133 298,1195 298,1238 298,1459 298,1462 298,1580 298,1775 298,2205 298,2206 298,2296 298,2387 298,2572 298,2850 298,2995 298,3028 298,3944 298,4222 298,4540 298,5002 298,5011 298,5139 298,6068 298,6136 298,6139 298,6482 298,7180 298,7194 298,7268 298,7496 298,7887 298,7996 298,9202 298,9391 298,9529 298,11952 298,14080 298,14603 298,14827 298,16551 298,18515 298,18673 298,19617 298,19798 298,21742 298,22268 298,22467 298,24619 298,25452 298,27881 298,28191 298,29041 298,33424 298,33820 298,34874 298,35614 298,36666 298,38822 298,39595 298,40065 298,41475 298,41479 298,41849 298,42810 298,42918 298,45993 298,46327 298,47173 298,48278 298,49035 298,51972 298,54395 298,56273 298,57910 298,59043 298,60173 298,62160 298,62239 298,64487 298,65711 298,74148 298,74460 298,74547 298,75885 298,75912 298,78891 298,80055 298,81508 298,88108 298,91941 298,94134 298,96748 298,99723 298,102250 298,111366 298,112686 298,113932 298,116104 298,118678 298,121440 298,121441 298,121444 298,121446 298,122077 298,128144 298,129874 298,134329 298,141179 298,142369 298,155117 298,155406 298,156022 298,156916 298,163471 298,164267 298,172141 298,175331 298,175345 298,175463 298,178576 298,180602 298,182345 298,182393 298,185877 298,189709 298,190526 298,200878 298,205888 298,212917 298,216758 298,235112 298,236555 298,240296 298,242975 298,245910 298,250143 299,86 299,167 299,299 299,314 299,349 299,356 299,372 299,397 299,425 299,452 299,459 299,528 299,563 299,599 299,663 299,676 299,744 299,783 299,803 299,838 299,849 299,907 299,929 299,940 299,941 299,972 299,973 299,1011 299,1012 299,1013 299,1014 299,1117 299,1118 299,1122 299,1167 299,1241 299,1284 299,1293 299,1298 299,1300 299,1319 299,1360 299,1421 299,1436 299,1479 299,1522 299,1544 299,1566 299,1572 299,1678 299,1715 299,1849 299,1973 299,2083 299,2224 299,2372 299,2511 299,2557 299,2588 299,2979 299,3207 299,3218 299,3392 299,3422 299,3524 299,3630 299,4066 299,4286 299,4514 299,5301 299,6653 299,6844 299,6904 299,6929 299,7087 299,7818 299,8187 299,8534 299,9457 299,9603 299,12378 299,13252 299,14597 299,18832 299,20396 299,20757 299,21269 299,22454 299,23307 299,24668 299,28947 299,30373 299,34993 299,37419 299,37586 299,39110 299,40453 299,40513 299,48545 299,51143 299,58409 299,64494 299,66565 299,70028 299,70249 299,73355 299,73570 299,74635 299,75272 299,75912 299,78728 299,79393 299,79398 299,79528 299,81956 299,90247 299,90905 299,102646 299,109838 299,113981 299,116543 299,122451 299,124491 299,128516 299,129747 299,134068 299,135246 299,142574 299,146813 299,147883 299,152905 299,156333 299,156590 299,157593 299,176469 299,176876 299,185472 299,186621 299,190408 299,191477 299,194102 299,200408 299,203939 299,204791 299,204793 299,207045 299,215874 299,228443 299,232753 299,239007 299,254444 300,301 301,11 301,34 301,35 301,37 301,46 301,68 301,106 301,126 301,158 301,167 301,182 301,186 301,192 301,217 301,240 301,261 301,264 301,287 301,301 301,302 301,314 301,372 301,392 301,397 301,435 301,444 301,452 301,457 301,467 301,468 301,510 301,516 301,525 301,536 301,563 301,567 301,599 301,604 301,605 301,615 301,631 301,632 301,663 301,677 301,698 301,717 301,765 301,808 301,812 301,818 301,838 301,849 301,868 301,872 301,937 301,968 301,972 301,973 301,1001 301,1010 301,1011 301,1013 301,1014 301,1045 301,1046 301,1085 301,1118 301,1160 301,1172 301,1181 301,1192 301,1210 301,1231 301,1284 301,1285 301,1293 301,1298 301,1300 301,1319 301,1326 301,1355 301,1370 301,1411 301,1417 301,1518 301,1531 301,1545 301,1564 301,1623 301,1627 301,1635 301,1654 301,1715 301,1740 301,1782 301,1783 301,1796 301,1837 301,1844 301,1849 301,1853 301,1992 301,2173 301,2183 301,2235 301,2253 301,2263 301,2272 301,2307 301,2372 301,2373 301,2556 301,2557 301,2625 301,2642 301,2979 301,3149 301,3182 301,3379 301,3397 301,3422 301,3507 301,3560 301,3756 301,3804 301,3809 301,3866 301,3871 301,4159 301,4177 301,4213 301,4253 301,4286 301,4291 301,4308 301,4315 301,4446 301,4455 301,4598 301,4683 301,5181 301,5255 301,5376 301,5382 301,5388 301,5455 301,5472 301,5563 301,5625 301,5662 301,5850 301,5991 301,6250 301,6431 301,6470 301,6579 301,6712 301,6938 301,7222 301,7759 301,7766 301,7880 301,8107 301,8140 301,8253 301,9527 301,9561 301,9579 301,9708 301,13176 301,13296 301,13418 301,13523 301,13524 301,13771 301,14095 301,14119 301,14246 301,14484 301,14572 301,14614 301,14828 301,14916 301,15020 301,15109 301,15386 301,15588 301,15840 301,15845 301,16191 301,16192 301,16630 301,16675 301,17894 301,18129 301,18387 301,18524 301,18688 301,18920 301,19387 301,19517 301,19592 301,20072 301,20327 301,20550 301,20626 301,20756 301,20910 301,21411 301,21701 301,22062 301,22291 301,23799 301,23848 301,25062 301,25342 301,26133 301,26287 301,26789 301,27482 301,28011 301,28317 301,28354 301,28498 301,28924 301,28989 301,29890 301,29947 301,30396 301,30445 301,30452 301,30499 301,30717 301,31746 301,32784 301,32846 301,32898 301,33707 301,33730 301,33735 301,35046 301,36241 301,36421 301,36563 301,36736 301,37381 301,37826 301,38300 301,38517 301,38816 301,38937 301,38949 301,39011 301,39013 301,39123 301,39650 301,40513 301,40933 301,41230 301,41528 301,41963 301,42065 301,42424 301,43364 301,45080 301,45601 301,46584 301,46792 301,46820 301,47041 301,47074 301,47424 301,48002 301,48251 301,48260 301,48305 301,48314 301,48640 301,48832 301,48921 301,49101 301,49410 301,49866 301,49924 301,49977 301,50101 301,50503 301,50514 301,50714 301,51917 301,53717 301,54606 301,54751 301,55219 301,55683 301,55948 301,58820 301,59066 301,59162 301,59335 301,59516 301,60415 301,60541 301,60542 301,63081 301,63121 301,63976 301,66590 301,67132 301,67185 301,68248 301,68683 301,69907 301,71097 301,73237 301,73320 301,74415 301,75295 301,75394 301,75912 301,76235 301,77104 301,77127 301,77678 301,78717 301,79429 301,80062 301,80134 301,80378 301,80379 301,80666 301,81508 301,82092 301,82871 301,83493 301,83512 301,84818 301,86836 301,87287 301,92836 301,92935 301,93080 301,94906 301,94938 301,96266 301,96631 301,96752 301,96827 301,96914 301,97981 301,99781 301,101485 301,103860 301,104507 301,106267 301,106365 301,111348 301,113002 301,114445 301,114625 301,116590 301,117117 301,118510 301,118773 301,119949 301,121117 301,121163 301,122451 301,123168 301,123381 301,124614 301,126506 301,127158 301,127418 301,127441 301,127858 301,130889 301,131889 301,133606 301,136177 301,136545 301,136551 301,137752 301,137753 301,137765 301,140139 301,140193 301,142021 301,143313 301,144227 301,147311 301,147480 301,147484 301,148900 301,152468 301,158528 301,158801 301,160668 301,160923 301,161555 301,161622 301,162121 301,163943 301,164836 301,164905 301,164929 301,166021 301,167057 301,167819 301,168363 301,170729 301,171697 301,171969 301,172522 301,172598 301,173811 301,174498 301,174962 301,175325 301,175542 301,176469 301,176583 301,177514 301,178012 301,180551 301,181465 301,182334 301,182912 301,185418 301,185937 301,190314 301,191136 301,192191 301,200532 301,202496 301,204019 301,207757 301,212474 301,212728 301,213237 301,213915 301,214832 301,214997 301,215241 301,215243 301,215814 301,216085 301,216095 301,216811 301,218015 301,218884 301,220030 301,220326 301,220571 301,220653 301,221303 301,221828 301,221920 301,222392 301,223489 301,223600 301,224923 301,224966 301,225389 301,227330 301,227376 301,228311 301,229002 301,229005 301,231939 301,232143 301,233602 301,233670 301,238988 301,239022 301,239023 301,239024 301,239027 301,239029 301,239030 301,239034 301,239036 301,239037 301,239076 301,240326 301,241532 301,241582 301,241603 301,241841 301,242273 301,242886 301,243369 301,243389 301,244257 301,250797 301,252650 301,254391 301,255081 301,256476 301,257444 301,258368 301,261078 302,182 302,192 302,301 302,302 302,314 302,433 302,452 302,457 302,467 302,599 302,673 302,808 302,818 302,849 302,868 302,872 302,1010 302,1011 302,1085 302,1130 302,1172 302,1204 302,1210 302,1293 302,1370 302,1417 302,1445 302,1531 302,1559 302,1663 302,1796 302,1844 302,1893 302,3744 302,14674 302,127158 302,182489 303,207 303,255 303,843 304,40 304,104 304,135 304,138 304,289 304,290 304,304 304,328 304,372 304,444 304,446 304,518 304,631 304,685 304,714 304,715 304,784 304,801 304,968 304,1001 304,1119 304,1326 304,1715 304,1716 304,1962 304,2008 304,2205 304,2206 304,2209 304,2286 304,2315 304,2384 304,2572 304,2675 304,2965 304,3565 304,4145 304,4146 304,4308 304,4411 304,4532 304,5472 304,6552 304,7921 304,7996 304,9739 304,15107 304,15135 304,15633 304,16479 304,18501 304,18608 304,20813 304,21739 304,22467 304,23382 304,24600 304,24704 304,27899 304,28672 304,28691 304,28832 304,29588 304,32576 304,32815 304,33338 304,34077 304,35043 304,36272 304,36627 304,39770 304,41218 304,43893 304,45082 304,56644 304,57144 304,59702 304,59714 304,59812 304,63038 304,63604 304,74478 304,75153 304,75861 304,75982 304,78801 304,78917 304,82023 304,83496 304,83894 304,83965 304,84531 304,91346 304,91757 304,92057 304,94134 304,104030 304,111142 304,113009 304,120108 304,120145 304,120156 304,120159 304,120896 304,121422 304,122562 304,123111 304,123840 304,126721 304,128408 304,128420 304,128846 304,128872 304,131752 304,132216 304,134588 304,134845 304,136520 304,136759 304,140391 304,155783 304,156162 304,169724 304,169942 304,171927 304,173412 304,175431 304,177752 304,188566 304,198174 304,201857 304,243341 304,244048 304,245984 304,263143 305,1248 305,1382 305,1398 305,2025 305,2897 305,7023 305,11463 305,13531 305,14015 305,15434 305,15737 305,18714 305,19052 305,19053 305,19054 305,19055 305,19065 305,19066 305,19067 305,19101 305,19102 305,22686 305,23401 305,25108 305,26856 305,26859 305,29186 305,30883 305,32788 305,53420 305,54066 305,54074 305,54082 305,54366 305,54496 305,54567 305,54620 305,54645 305,55289 305,58188 305,61774 305,66075 305,66078 305,74639 305,74815 305,76255 305,76259 305,81574 305,87566 305,90253 305,90656 305,98379 305,131272 305,149839 305,150819 305,152403 305,173033 306,194518 306,194545 307,147 307,306 307,682 307,72439 308,151 308,309 308,310 309,10 309,175 309,309 309,310 309,483 309,693 309,880 309,1796 309,2312 309,4548 309,6556 309,6627 309,13524 309,14080 309,30497 309,38524 309,65681 309,176761 309,193486 309,206368 309,232766 309,255168 309,259622 309,265159 310,310 311,312 312,87 312,104 312,111 312,182 312,314 312,358 312,420 312,457 312,509 312,510 312,590 312,604 312,615 312,875 312,929 312,1010 312,1011 312,1085 312,1707 312,2253 312,2557 312,176942 313,3 313,10 313,19 313,34 313,35 313,83 313,175 313,217 313,222 313,278 313,283 313,313 313,314 313,379 313,389 313,392 313,431 313,446 313,455 313,536 313,589 313,599 313,634 313,660 313,685 313,693 313,781 313,784 313,849 313,852 313,911 313,949 313,1019 313,1021 313,1130 313,1201 313,1274 313,1281 313,1313 313,1417 313,1467 313,1472 313,1504 313,1571 313,1618 313,1708 313,1718 313,1770 313,1848 313,1849 313,1871 313,1881 313,2159 313,2168 313,2220 313,2224 313,2235 313,2253 313,2266 313,2290 313,2310 313,2419 313,2421 313,2424 313,2615 313,2619 313,2646 313,2649 313,2779 313,2784 313,2855 313,2874 313,2944 313,3507 313,3513 313,3643 313,4081 313,4127 313,4166 313,4224 313,4303 313,5173 313,5210 313,5326 313,5470 313,5591 313,5812 313,5859 313,5887 313,6012 313,6506 313,6605 313,6828 313,7318 313,7698 313,8097 313,8208 313,13240 313,13389 313,13420 313,13980 313,14556 313,14612 313,14856 313,15547 313,15694 313,17041 313,17273 313,18650 313,18881 313,19130 313,19886 313,19894 313,20723 313,21382 313,21414 313,22860 313,24889 313,25278 313,25384 313,25670 313,26034 313,27808 313,28605 313,30502 313,30559 313,31126 313,32630 313,33287 313,33437 313,33475 313,33534 313,33551 313,34013 313,35688 313,36850 313,37474 313,37570 313,39404 313,39444 313,39692 313,41520 313,44329 313,44442 313,48082 313,49774 313,55604 313,56978 313,57187 313,57266 313,58488 313,59260 313,60387 313,60590 313,61411 313,63362 313,64770 313,75121 313,77857 313,79609 313,79927 313,90377 313,90388 313,90653 313,94299 313,95793 313,98218 313,98940 313,106907 313,107100 313,115474 313,117112 313,117771 313,119275 313,122609 313,125756 313,126291 313,129782 313,131216 313,131418 313,133484 313,133629 313,135655 313,136513 313,136685 313,138205 313,138884 313,140055 313,146916 313,148908 313,148916 313,149357 313,150530 313,152975 313,154782 313,161597 313,169392 313,169396 313,169879 313,172062 313,172178 313,174944 313,175738 313,175996 313,176018 313,176351 313,176542 313,176588 313,181063 313,182538 313,186830 313,188817 313,189282 313,189286 313,189291 313,194221 313,194676 313,207135 313,211889 313,213089 313,213746 313,221815 313,222290 313,224607 313,224624 313,226276 313,226738 313,234809 313,236362 313,236740 313,241690 313,242337 313,243450 313,243468 313,243729 313,244806 313,250394 313,250816 313,251321 313,251922 313,252585 313,253696 313,253750 314,3 314,11 314,20 314,22 314,34 314,35 314,56 314,65 314,68 314,83 314,86 314,97 314,106 314,120 314,140 314,146 314,149 314,158 314,160 314,167 314,182 314,192 314,195 314,202 314,207 314,209 314,240 314,248 314,252 314,259 314,264 314,272 314,275 314,287 314,292 314,296 314,299 314,301 314,302 314,312 314,314 314,333 314,336 314,346 314,349 314,356 314,372 314,379 314,392 314,393 314,397 314,406 314,417 314,433 314,435 314,440 314,441 314,442 314,447 314,452 314,455 314,467 314,479 314,493 314,495 314,502 314,505 314,510 314,516 314,534 314,536 314,538 314,592 314,599 314,615 314,622 314,623 314,631 314,663 314,673 314,677 314,685 314,687 314,690 314,693 314,697 314,710 314,712 314,760 314,764 314,775 314,779 314,788 314,801 314,809 314,818 314,843 314,849 314,852 314,868 314,872 314,874 314,900 314,911 314,918 314,920 314,934 314,949 314,968 314,972 314,980 314,1001 314,1007 314,1010 314,1019 314,1033 314,1085 314,1089 314,1118 314,1127 314,1130 314,1140 314,1147 314,1151 314,1163 314,1172 314,1179 314,1204 314,1210 314,1235 314,1240 314,1262 314,1265 314,1266 314,1267 314,1284 314,1289 314,1293 314,1294 314,1298 314,1326 314,1332 314,1335 314,1345 314,1351 314,1370 314,1381 314,1402 314,1411 314,1417 314,1445 314,1465 314,1509 314,1518 314,1531 314,1590 314,1634 314,1655 314,1659 314,1724 314,1796 314,1801 314,1803 314,1805 314,1836 314,1837 314,1844 314,1849 314,1893 314,1955 314,1968 314,1989 314,1992 314,2032 314,2037 314,2083 314,2296 314,2348 314,2373 314,2400 314,2414 314,2512 314,2557 314,2571 314,2605 314,2979 314,3149 314,3182 314,3260 314,3367 314,3392 314,3422 314,3436 314,3507 314,3744 314,3804 314,4018 314,4039 314,4159 314,4276 314,4545 314,4771 314,5324 314,5388 314,5662 314,5880 314,6632 314,6837 314,6955 314,7890 314,8027 314,8342 314,13207 314,13670 314,14565 314,15206 314,15582 314,15609 314,19335 314,19340 314,19572 314,19682 314,19686 314,20359 314,21563 314,23487 314,23518 314,23754 314,26434 314,26737 314,31244 314,31363 314,32601 314,32626 314,34116 314,35435 314,37777 314,38300 314,40694 314,41170 314,41230 314,41359 314,41378 314,43422 314,49554 314,60576 314,65644 314,68946 314,71590 314,75912 314,81233 314,82232 314,88049 314,90885 314,93199 314,94134 314,97171 314,97286 314,99490 314,100984 314,109538 314,114620 314,116982 314,117480 314,118335 314,118336 314,124116 314,127420 314,134625 314,134729 314,139010 314,143424 314,148735 314,150027 314,150532 314,156949 314,158248 314,161320 314,162599 314,167089 314,172586 314,176871 314,177437 314,177971 314,187300 314,187438 314,191136 314,197805 314,202616 314,204093 314,205075 314,205281 314,205767 314,214897 314,215276 314,215874 314,220337 314,220617 314,223731 314,227675 314,228620 314,232307 314,243520 314,250545 314,252106 314,255659 314,257197 315,20 315,178 315,315 315,346 315,434 315,447 315,538 315,671 315,833 315,996 315,1068 315,1118 315,1294 315,1474 315,1651 315,1789 315,1877 315,2085 315,2253 315,2353 315,2730 315,3166 315,3726 315,4646 315,5482 315,6573 315,6622 315,7040 315,7470 315,7495 315,7778 315,8036 315,10186 315,13796 315,14221 315,14397 315,14428 315,14447 315,15563 315,16494 315,20526 315,22149 315,23138 315,23782 315,23809 315,26420 315,28139 315,29167 315,32791 315,33298 315,38158 315,41226 315,41378 315,46235 315,48103 315,50034 315,61719 315,63949 315,79518 315,80836 315,85859 315,88367 315,90933 315,103575 315,106939 315,118491 315,118917 315,126696 315,136105 315,137011 315,139652 315,140122 315,148843 315,157704 315,158729 315,161617 315,162620 315,163378 315,170181 315,170542 315,171870 315,173885 315,176155 315,176157 315,179202 315,179217 315,180474 315,182819 315,185430 315,187299 315,188866 315,190492 315,199287 315,199466 315,214195 315,216191 315,222010 315,247359 315,249731 315,253099 315,260155 316,251 316,252 316,318 316,516 316,1220 316,1222 316,41170 317,318 317,41170 318,252 318,314 318,516 318,1220 318,1222 319,320 321,320 322,323 324,323 325,192 325,202 325,203 325,333 325,336 325,422 325,516 325,602 326,22 326,68 326,207 326,287 326,326 326,347 326,381 326,390 326,424 326,433 326,579 326,623 326,693 326,702 326,703 326,752 326,808 326,818 326,845 326,868 326,873 326,874 326,908 326,955 326,1064 326,1133 326,1158 326,1192 326,1210 326,1276 326,1454 326,1607 326,1634 326,1805 326,1973 326,2182 326,2747 326,3101 326,3497 326,3507 326,3866 326,4127 326,4272 326,5250 326,5302 326,5937 326,6891 326,7300 326,7760 326,8288 326,14511 326,17116 326,17897 326,18398 326,18587 326,20661 326,21563 326,24666 326,25386 326,25397 326,28406 326,30198 326,30566 326,32625 326,34732 326,34963 326,44886 326,45109 326,46339 326,46965 326,48960 326,53650 326,54132 326,58161 326,58469 326,58474 326,60605 326,61694 326,62994 326,75937 326,80701 326,89556 326,89944 326,93113 326,94968 326,95637 326,96541 326,96789 326,97435 326,101551 326,105571 326,106298 326,106403 326,109820 326,111106 326,117552 326,117882 326,117983 326,120839 326,123834 326,125405 326,127158 326,132267 326,142895 326,148093 326,152451 326,159473 326,168167 326,168504 326,168524 326,182911 326,184921 326,186518 326,191246 326,198025 326,200657 326,204464 326,212406 326,214680 326,214836 326,214864 326,218050 326,222528 326,228199 326,231614 326,232655 326,245914 327,30 327,97 327,104 327,134 327,135 327,182 327,215 327,217 327,240 327,248 327,328 327,372 327,406 327,435 327,440 327,457 327,467 327,509 327,510 327,557 327,622 327,693 327,794 327,809 327,953 327,1011 327,1019 327,1033 327,1085 327,1119 327,1140 327,1179 327,1282 327,1332 327,1417 327,1429 327,1531 327,1749 327,1782 327,1844 327,2173 327,2443 327,3246 327,3247 327,4276 327,4355 327,75912 328,10 328,30 328,97 328,104 328,134 328,135 328,136 328,175 328,200 328,211 328,233 328,248 328,289 328,290 328,294 328,304 328,327 328,328 328,364 328,557 328,588 328,590 328,621 328,622 328,636 328,693 328,704 328,714 328,760 328,772 328,864 328,876 328,898 328,903 328,950 328,953 328,990 328,1008 328,1085 328,1149 328,1179 328,1212 328,1281 328,1282 328,1305 328,1332 328,1402 328,1415 328,1708 328,1818 328,2105 328,2205 328,2206 328,2210 328,2286 328,2315 328,2710 328,3009 328,3069 328,3358 328,3504 328,3565 328,3654 328,3743 328,4218 328,4237 328,4354 328,4355 328,4557 328,4578 328,4941 328,5354 328,5472 328,5828 328,5934 328,6062 328,6646 328,6711 328,7124 328,7757 328,8180 328,8279 328,12746 328,13427 328,14233 328,15547 328,15571 328,15768 328,17125 328,18194 328,21081 328,21626 328,21822 328,21865 328,24826 328,26924 328,27705 328,28203 328,29055 328,29374 328,31067 328,31368 328,31453 328,31662 328,31860 328,32848 328,33424 328,35231 328,36275 328,36586 328,36590 328,36632 328,36822 328,37730 328,43433 328,43893 328,43911 328,55929 328,57143 328,62335 328,70900 328,77758 328,85814 328,85829 328,86815 328,94134 328,95674 328,102866 328,108214 328,122157 328,122553 328,126162 328,127873 328,128215 328,129835 328,130507 328,131650 328,139700 328,140358 328,159154 328,159278 328,160517 328,161581 328,163733 328,163881 328,163906 328,164626 328,164633 328,164634 328,165083 328,165491 328,165506 328,165876 328,166407 328,167769 328,167770 328,167862 328,168391 328,168574 328,168586 328,168877 328,170086 328,170904 328,171712 328,173716 328,174511 328,176141 328,176974 328,177438 328,177517 328,178026 328,179425 328,180104 328,181293 328,181499 328,181856 328,182552 328,182616 328,185087 328,185314 328,186321 328,186609 328,186831 328,187182 328,190187 328,192057 328,194516 328,194542 328,202709 328,205114 328,206762 328,207116 328,207572 328,217657 328,217738 328,223797 328,224499 328,224534 328,231192 328,232810 328,233839 328,234085 328,239040 328,239046 328,241714 328,242503 328,244936 328,251892 328,261917 328,262188 328,262189 329,330 330,5 330,171 330,330 330,957 330,1815 330,4161 331,332 332,68 332,104 332,120 332,134 332,240 332,248 332,261 332,323 332,331 332,332 332,372 332,373 332,390 332,413 332,431 332,446 332,536 332,557 332,631 332,680 332,685 332,715 332,781 332,784 332,794 332,805 332,823 332,838 332,862 332,1014 332,1029 332,1085 332,1119 332,1203 332,1242 332,1285 332,1346 332,1353 332,1357 332,1459 332,1466 332,1608 332,1635 332,1807 332,1808 332,1888 332,1955 332,2408 332,2512 332,2619 332,2646 332,2775 332,2991 332,3328 332,4787 332,5053 332,5346 332,8276 332,8285 332,8712 332,9118 332,13207 332,13217 332,13478 332,14080 332,14364 332,14474 332,14547 332,14597 332,14934 332,15183 332,16481 332,17116 332,17882 332,18142 332,20823 332,21290 332,21449 332,22288 332,23474 332,27041 332,30268 332,32576 332,32751 332,33602 332,34515 332,34797 332,34881 332,36954 332,37100 332,37515 332,37816 332,37895 332,40723 332,41230 332,41871 332,42762 332,43394 332,45712 332,45714 332,46862 332,50152 332,51880 332,53004 332,56583 332,58027 332,62419 332,62964 332,63626 332,64145 332,66637 332,73979 332,78967 332,82114 332,83455 332,88074 332,93860 332,97607 332,97766 332,98236 332,102250 332,105581 332,109945 332,117816 332,120905 332,123007 332,124521 332,125061 332,125140 332,125659 332,126147 332,127158 332,127719 332,129085 332,132928 332,134115 332,139553 332,139649 332,140747 332,140917 332,142997 332,143961 332,147337 332,152311 332,162503 332,167342 332,180159 332,182308 332,182345 332,184908 332,186058 332,191967 332,200272 332,215188 332,215877 332,219068 332,224517 332,227227 332,228295 332,231693 332,231954 332,238996 332,247366 332,250800 332,251481 332,256947 332,260393 332,264582 333,1 333,10 333,11 333,44 333,50 333,56 333,99 333,106 333,146 333,147 333,158 333,192 333,195 333,202 333,238 333,240 333,256 333,261 333,314 333,325 333,333 333,336 333,337 333,406 333,422 333,439 333,457 333,469 333,505 333,585 333,586 333,599 333,602 333,621 333,622 333,640 333,663 333,664 333,779 333,818 333,841 333,843 333,849 333,920 333,939 333,1011 333,1027 333,1033 333,1089 333,1163 333,1181 333,1192 333,1218 333,1370 333,1464 333,1515 333,1521 333,1531 333,1562 333,1598 333,1619 333,1623 333,1825 333,1969 333,1973 333,1985 333,2014 333,2132 333,2183 333,2253 333,2374 333,2710 333,2811 333,2955 333,3507 333,3895 333,3897 333,3970 333,4190 333,4368 333,4752 333,5401 333,5480 333,6119 333,7182 333,7241 333,7296 333,7425 333,7766 333,7900 333,8606 333,9394 333,13430 333,13500 333,13576 333,14233 333,15087 333,15143 333,15216 333,15230 333,15313 333,16563 333,17151 333,17310 333,18487 333,18637 333,18761 333,18941 333,18997 333,19939 333,20598 333,21092 333,21442 333,21736 333,22241 333,22616 333,22788 333,22903 333,23478 333,23725 333,23783 333,23999 333,24162 333,24505 333,25302 333,25560 333,25673 333,26414 333,27310 333,28954 333,29334 333,29790 333,29895 333,29900 333,30331 333,30798 333,30806 333,31530 333,32174 333,32562 333,33305 333,33590 333,33672 333,33755 333,35577 333,36280 333,36411 333,36434 333,36444 333,36485 333,36502 333,36512 333,36519 333,36562 333,36676 333,36711 333,36783 333,38128 333,38419 333,39140 333,39618 333,39722 333,41381 333,41843 333,41892 333,46336 333,48301 333,48364 333,48403 333,50180 333,50250 333,50278 333,50283 333,50287 333,50376 333,50444 333,50712 333,54728 333,55326 333,56386 333,56667 333,57002 333,57624 333,59020 333,59021 333,60576 333,62151 333,62165 333,62208 333,62633 333,62890 333,63414 333,63508 333,63743 333,64157 333,64582 333,65809 333,66687 333,67148 333,69135 333,70166 333,70460 333,70711 333,71318 333,73327 333,73364 333,73553 333,73621 333,74165 333,74806 333,75783 333,75819 333,76325 333,76715 333,76867 333,80397 333,81787 333,84059 333,85566 333,87136 333,91833 333,92361 333,93728 333,94784 333,95392 333,95516 333,96660 333,97460 333,97537 333,97538 333,97567 333,97614 333,97880 333,101045 333,102862 333,103868 333,109411 333,110921 333,111311 333,112711 333,113680 333,116499 333,116711 333,117042 333,117058 333,117113 333,118849 333,120155 333,120406 333,121380 333,121754 333,122233 333,122451 333,124052 333,124621 333,124847 333,125290 333,127143 333,127158 333,127514 333,128295 333,128412 333,128966 333,133161 333,133983 333,135059 333,135761 333,136638 333,136979 333,138158 333,138159 333,138160 333,138161 333,138162 333,138163 333,138164 333,138165 333,138214 333,138215 333,138216 333,138217 333,138218 333,138219 333,138220 333,138221 333,138222 333,138223 333,138224 333,141155 333,142453 333,142896 333,143247 333,143338 333,147329 333,148090 333,151035 333,154392 333,156352 333,160341 333,166321 333,166369 333,167714 333,172151 333,174360 333,174389 333,174500 333,174596 333,174805 333,175312 333,175405 333,176820 333,177139 333,177354 333,178270 333,179594 333,180487 333,181560 333,184899 333,185878 333,188509 333,188596 333,190252 333,191806 333,192073 333,192468 333,192947 333,197205 333,198478 333,202943 333,204124 333,204415 333,213171 333,216580 333,220940 333,223446 333,224442 333,226813 333,228887 333,228943 333,230349 333,231077 333,231983 333,238753 333,240174 333,240940 333,242474 333,243368 333,243995 333,245464 333,245533 333,245719 333,246276 333,248747 333,253720 333,258310 333,260372 333,260774 333,261310 333,261866 333,262609 333,264150 334,335 334,8708 334,24244 334,31655 334,38511 334,66935 334,120731 336,1 336,10 336,11 336,50 336,56 336,79 336,99 336,106 336,126 336,146 336,147 336,149 336,158 336,175 336,182 336,192 336,195 336,202 336,203 336,206 336,252 336,256 336,259 336,285 336,314 336,325 336,333 336,336 336,337 336,397 336,406 336,422 336,425 336,438 336,452 336,457 336,497 336,500 336,505 336,512 336,516 336,586 336,599 336,602 336,620 336,622 336,638 336,640 336,663 336,664 336,668 336,673 336,676 336,685 336,733 336,778 336,779 336,794 336,818 336,838 336,841 336,843 336,849 336,852 336,857 336,900 336,920 336,929 336,972 336,998 336,1011 336,1014 336,1089 336,1118 336,1130 336,1152 336,1162 336,1181 336,1191 336,1198 336,1204 336,1218 336,1220 336,1222 336,1262 336,1293 336,1328 336,1331 336,1370 336,1417 336,1425 336,1430 336,1458 336,1512 336,1515 336,1521 336,1566 336,1572 336,1619 336,1623 336,1655 336,1663 336,1678 336,1776 336,1803 336,1825 336,1833 336,1844 336,1927 336,1940 336,1992 336,1993 336,2014 336,2022 336,2120 336,2125 336,2244 336,2253 336,2254 336,2288 336,2310 336,2373 336,2471 336,2528 336,2552 336,2574 336,2903 336,2923 336,3370 336,3398 336,3524 336,3813 336,3895 336,3933 336,4105 336,4164 336,4165 336,4190 336,4344 336,4529 336,4663 336,4751 336,5192 336,5386 336,5401 336,5495 336,5631 336,5666 336,5725 336,5900 336,5913 336,6119 336,6373 336,6393 336,6736 336,6824 336,7443 336,8127 336,8244 336,8520 336,8538 336,8641 336,8676 336,8971 336,9738 336,13197 336,13270 336,13289 336,13493 336,13556 336,14289 336,14433 336,14637 336,14674 336,14830 336,14833 336,15098 336,15560 336,15582 336,15795 336,15829 336,16010 336,16688 336,17151 336,18327 336,18761 336,18997 336,19413 336,19555 336,19578 336,19589 336,19899 336,20035 336,20071 336,20214 336,20535 336,20540 336,20757 336,21394 336,21442 336,21584 336,21623 336,22015 336,22367 336,22494 336,22616 336,23783 336,24832 336,26172 336,26414 336,26453 336,28364 336,28969 336,29195 336,29771 336,29890 336,30331 336,31151 336,31300 336,33672 336,34001 336,34259 336,34267 336,34512 336,34731 336,35561 336,40709 336,40782 336,41827 336,41844 336,42064 336,42290 336,43230 336,43885 336,44391 336,44484 336,44922 336,45509 336,45702 336,45993 336,46070 336,48999 336,49317 336,49762 336,49791 336,50422 336,51413 336,55254 336,55623 336,56958 336,59020 336,60576 336,61162 336,62801 336,62806 336,63569 336,63580 336,64049 336,64506 336,64620 336,65809 336,66348 336,70725 336,71998 336,72825 336,72855 336,76946 336,79749 336,79874 336,80266 336,83383 336,84078 336,85433 336,89035 336,89750 336,90760 336,90809 336,92476 336,93648 336,102560 336,102922 336,103833 336,103852 336,104926 336,106502 336,108062 336,110934 336,112555 336,116186 336,117269 336,118336 336,121110 336,124525 336,141883 336,141912 336,144429 336,145396 336,146917 336,148601 336,149251 336,150788 336,151061 336,152982 336,154479 336,157904 336,158847 336,160912 336,162001 336,162011 336,164572 336,167494 336,168804 336,168976 336,169488 336,170414 336,171114 336,171216 336,172555 336,174797 336,176057 336,177257 336,177828 336,179223 336,186151 336,189757 336,191313 336,192610 336,193462 336,205678 336,207659 336,216170 336,216546 336,227744 336,230021 336,238470 336,239555 336,239633 336,241720 336,261482 337,106 337,192 337,333 337,336 337,337 337,397 337,440 337,446 337,505 337,586 337,602 337,638 337,663 337,664 337,685 337,794 337,838 337,852 337,911 337,937 337,1107 337,1370 337,1619 337,1796 337,1821 337,1985 337,2077 337,2400 337,2580 337,2782 337,3507 337,3669 337,4245 337,6553 337,6585 337,7830 337,7897 337,8867 337,14198 337,16190 337,20168 337,20425 337,20438 337,21528 337,23103 337,24934 337,26034 337,26345 337,26849 337,31216 337,32658 337,32721 337,34094 337,36534 337,36611 337,43182 337,45716 337,49321 337,50090 337,50441 337,50507 337,50616 337,51884 337,55014 337,58853 337,59020 337,59115 337,60576 337,63662 337,64067 337,65640 337,71582 337,74315 337,75303 337,80966 337,82870 337,87762 337,87799 337,89752 337,90181 337,101056 337,104327 337,105526 337,115382 337,118221 337,118897 337,118901 337,118904 337,119870 337,120826 337,125027 337,135278 337,135954 337,136015 337,138665 337,138708 337,141949 337,145421 337,148822 337,150794 337,151087 337,161505 337,163840 337,167012 337,167018 337,167648 337,169426 337,169956 337,172052 337,172087 337,173706 337,174895 337,175277 337,175286 337,178551 337,178553 337,180261 337,182736 337,188665 337,188666 337,188667 337,188669 337,189138 337,199378 337,216569 337,221825 337,231052 338,34 338,35 338,107 338,111 338,138 338,192 338,207 338,256 338,278 338,292 338,309 338,310 338,535 338,668 338,673 338,745 338,783 338,872 338,911 338,1130 338,1204 338,1210 338,1241 338,1313 338,1332 338,1572 338,1688 338,1722 338,2201 338,2915 338,3538 338,4039 338,5662 338,115474 338,181063 338,188791 339,340 341,342 343,344 344,58 344,256 344,344 344,685 344,733 344,911 344,1559 344,4260 345,346 346,20 346,240 346,272 346,346 346,435 346,439 346,447 346,538 346,670 346,671 346,673 346,698 346,714 346,795 346,911 346,934 346,939 346,996 346,1033 346,1068 346,1155 346,1294 346,1474 346,1590 346,1612 346,1644 346,1789 346,1848 346,2094 346,2102 346,2152 346,2340 346,2352 346,2353 346,2427 346,2514 346,2770 346,3562 346,3626 346,3924 346,4205 346,4394 346,4399 346,4419 346,4426 346,4514 346,4646 346,5189 346,5962 346,6669 346,6672 346,6966 346,8374 346,9454 346,13255 346,13425 346,14076 346,14370 346,14380 346,14428 346,15141 346,15355 346,16677 346,18116 346,18394 346,18416 346,18689 346,19191 346,19445 346,19698 346,19699 346,20611 346,20722 346,20923 346,23569 346,23779 346,24507 346,24540 346,24544 346,25279 346,25482 346,26271 346,26652 346,26787 346,26814 346,26864 346,27992 346,29583 346,29870 346,30775 346,31170 346,32578 346,32795 346,33627 346,35497 346,38168 346,38201 346,38754 346,40346 346,40497 346,43317 346,44620 346,44990 346,47827 346,48649 346,49494 346,50034 346,52128 346,54295 346,54346 346,55298 346,55612 346,56408 346,56801 346,57124 346,58412 346,58594 346,58947 346,59630 346,63481 346,67564 346,70661 346,71901 346,71992 346,72137 346,73424 346,80668 346,81039 346,82624 346,86086 346,99694 346,101621 346,103772 346,104454 346,104747 346,109885 346,114276 346,124459 346,125231 346,126696 346,128831 346,129922 346,129928 346,130681 346,134698 346,136618 346,143610 346,144732 346,146610 346,148853 346,152485 346,152724 346,152983 346,153197 346,153237 346,155434 346,155724 346,157386 346,157401 346,157444 346,157584 346,157705 346,158173 346,158262 346,159497 346,159703 346,161047 346,162106 346,165728 346,166506 346,171152 346,172578 346,173779 346,176383 346,176468 346,177664 346,180938 346,181395 346,181701 346,182781 346,182844 346,184992 346,188806 346,190492 346,191456 346,193473 346,193856 346,195488 346,195641 346,195729 346,197782 346,203142 346,207560 346,212190 346,212853 346,212967 346,212987 346,213769 346,214565 346,214573 346,215345 346,215755 346,218784 346,218807 346,219914 346,219959 346,220289 346,230984 346,234084 346,236081 346,237522 346,238250 346,239600 346,239850 346,239914 346,241553 346,242357 346,244183 346,246021 346,247921 346,248717 346,249888 346,251896 346,251991 346,252097 346,252261 346,252268 346,252280 346,252557 346,257785 346,259052 346,259158 346,259553 346,259674 346,260254 346,260373 346,261692 347,207 347,287 347,326 347,347 347,751 347,752 347,873 347,874 347,1076 347,1133 347,1210 347,3570 347,4039 347,4081 347,6406 347,6880 347,9756 347,14684 347,14908 347,15232 347,20222 347,20870 347,21593 347,23390 347,27835 347,45050 347,60444 347,90681 347,94875 347,126815 347,126929 347,127477 348,349 349,34 349,35 349,192 349,256 349,287 349,292 349,314 349,349 349,356 349,433 349,509 349,510 349,623 349,673 349,685 349,809 349,818 349,849 349,852 349,872 349,875 349,911 349,919 349,1130 349,1133 349,1210 349,1240 349,1465 349,1805 349,1860 349,2372 349,2607 349,4760 349,6904 349,6955 349,26450 349,127158 350,167 350,676 350,3138 351,336 352,510 352,1021 352,1172 352,1518 352,6452 352,7880 352,13814 353,353 354,355 355,4 355,5 355,355 355,527 355,1219 355,4810 355,7506 355,14125 355,14316 355,16369 355,21944 355,37079 355,66672 355,69810 355,86111 355,97186 355,117850 355,118543 355,122196 355,122440 355,124443 355,143152 355,161997 355,172780 355,172980 355,182084 355,186672 355,192675 355,203447 355,217979 356,32 356,68 356,83 356,147 356,195 356,202 356,203 356,207 356,211 356,248 356,278 356,287 356,299 356,314 356,326 356,336 356,347 356,349 356,356 356,390 356,392 356,452 356,462 356,505 356,516 356,563 356,595 356,599 356,615 356,631 356,634 356,690 356,704 356,712 356,762 356,788 356,801 356,843 356,852 356,872 356,873 356,900 356,911 356,940 356,968 356,972 356,1011 356,1012 356,1014 356,1085 356,1148 356,1151 356,1172 356,1179 356,1243 356,1284 356,1285 356,1298 356,1309 356,1319 356,1326 356,1345 356,1436 356,1454 356,1479 356,1518 356,1531 356,1544 356,1572 356,1616 356,1715 356,1722 356,1805 356,1844 356,1849 356,1888 356,1955 356,2000 356,2006 356,2334 356,2372 356,2373 356,2436 356,2529 356,2590 356,2615 356,2784 356,2812 356,2913 356,2989 356,2991 356,3422 356,3474 356,4112 356,4222 356,4428 356,4660 356,5326 356,5591 356,6068 356,6473 356,6673 356,6676 356,6837 356,7774 356,8097 356,8276 356,8479 356,8563 356,13240 356,14534 356,14580 356,14667 356,15159 356,15227 356,15382 356,15651 356,17211 356,18345 356,18501 356,19490 356,19535 356,19572 356,19805 356,21589 356,21593 356,23481 356,23845 356,24583 356,24963 356,25480 356,25870 356,26202 356,26450 356,28487 356,29793 356,29985 356,30328 356,30450 356,30872 356,31365 356,33431 356,34013 356,34419 356,35040 356,35428 356,36685 356,36773 356,37503 356,38434 356,41147 356,41365 356,41567 356,41936 356,42590 356,42990 356,43342 356,44491 356,46165 356,46359 356,48101 356,48397 356,54402 356,55716 356,55947 356,56412 356,56587 356,56650 356,59702 356,59723 356,59755 356,61193 356,61194 356,61195 356,61196 356,61197 356,61200 356,61201 356,61285 356,61358 356,63582 356,63880 356,65832 356,66584 356,67154 356,67913 356,69119 356,70221 356,70792 356,71914 356,73265 356,74515 356,74583 356,75153 356,76134 356,76181 356,79613 356,80009 356,81993 356,83970 356,84505 356,87066 356,87112 356,87749 356,87759 356,87775 356,87962 356,88805 356,89638 356,91599 356,92883 356,93199 356,95380 356,96342 356,97607 356,98871 356,98874 356,102672 356,103194 356,103219 356,103395 356,103877 356,105686 356,105721 356,106255 356,107077 356,107452 356,109322 356,109479 356,110673 356,110678 356,112931 356,113061 356,115636 356,116087 356,116117 356,116606 356,118956 356,119156 356,119393 356,120987 356,121453 356,122984 356,123894 356,125755 356,126736 356,126908 356,127788 356,128951 356,129717 356,132891 356,134097 356,138782 356,139377 356,140127 356,140427 356,143371 356,145852 356,145963 356,147415 356,149275 356,149277 356,149293 356,150294 356,151552 356,152503 356,153877 356,154004 356,154772 356,154896 356,156304 356,156424 356,156691 356,157383 356,158604 356,159045 356,159048 356,159054 356,159800 356,162609 356,163874 356,165373 356,168385 356,168386 356,168390 356,168393 356,168402 356,169014 356,169480 356,169829 356,169942 356,171153 356,171277 356,172560 356,172572 356,172584 356,173352 356,173711 356,173836 356,174469 356,175304 356,175426 356,175515 356,175529 356,175957 356,176838 356,177952 356,179258 356,180159 356,180848 356,181851 356,182518 356,185033 356,185275 356,185884 356,185920 356,185991 356,187330 356,192617 356,193492 356,193521 356,193558 356,194602 356,195660 356,196848 356,197653 356,203174 356,204176 356,204780 356,205691 356,206022 356,214246 356,214572 356,215263 356,216032 356,216399 356,218659 356,221035 356,221672 356,222459 356,222495 356,223962 356,225811 356,228182 356,228263 356,228316 356,229077 356,229632 356,230287 356,239837 356,241788 356,242266 356,244870 356,251077 356,254312 356,255585 356,255705 356,256868 356,256901 356,258196 356,258761 356,263097 357,358 358,22 358,312 358,358 358,389 358,509 358,510 358,525 358,779 358,875 358,1192 358,1345 358,1515 358,1973 358,2083 358,29008 359,360 360,256 360,275 360,314 360,397 360,452 360,599 360,673 360,676 360,762 360,849 360,911 360,929 360,1014 360,1130 360,1262 360,1465 360,1805 360,2373 360,2460 360,4039 360,4190 360,4571 360,6824 360,6904 360,9457 360,20757 360,182465 360,215874 361,362 363,364 363,431 363,634 364,30 364,135 364,138 364,200 364,225 364,248 364,328 364,364 364,431 364,450 364,557 364,609 364,694 364,715 364,772 364,784 364,850 364,943 364,944 364,999 364,1011 364,1332 364,1340 364,1388 364,1415 364,1547 364,1737 364,1808 364,1844 364,2039 364,2315 364,2450 364,2629 364,2775 364,3010 364,3085 364,3099 364,3842 364,4276 364,4673 364,4713 364,5439 364,5716 364,6139 364,6572 364,7214 364,7809 364,8151 364,8197 364,8385 364,8458 364,8781 364,13207 364,13563 364,13567 364,14227 364,14535 364,14952 364,16351 364,18600 364,19110 364,19314 364,20356 364,20367 364,20510 364,21382 364,21545 364,22308 364,22327 364,22428 364,22444 364,23475 364,24886 364,24906 364,26425 364,26993 364,27002 364,27097 364,27433 364,30533 364,30548 364,32339 364,33586 364,34909 364,41895 364,44166 364,52543 364,55598 364,57372 364,62361 364,62612 364,63428 364,63435 364,63656 364,64284 364,64603 364,64640 364,64700 364,64857 364,65081 364,65626 364,67501 364,67890 364,70075 364,70111 364,70332 364,73312 364,78350 364,78877 364,79992 364,80229 364,80295 364,82647 364,85814 364,95521 364,98904 364,99043 364,112285 364,112897 364,113533 364,113560 364,125194 364,125195 364,126388 364,126390 364,127668 364,130513 364,130864 364,132584 364,133135 364,133388 364,133389 364,133394 364,138167 364,139764 364,141177 364,145165 364,147980 364,147981 364,156490 364,158803 364,159086 364,162591 364,180562 364,187480 364,190276 364,195087 364,195697 365,366 366,10 366,109 366,178 366,182 366,186 366,192 366,211 366,366 366,452 366,500 366,510 366,718 366,872 366,929 366,1014 366,1048 366,1107 366,1390 366,1417 366,1796 366,2175 366,2520 366,2531 366,2602 366,2606 366,2707 366,3087 366,3173 366,3727 366,4094 366,4101 366,4375 366,4871 366,5386 366,5401 366,5652 366,5681 366,5726 366,6583 366,6614 366,6987 366,7078 366,7413 366,7429 366,7758 366,7908 366,7941 366,7994 366,8069 366,9436 366,9721 366,13382 366,13763 366,14064 366,14122 366,14967 366,15560 366,16458 366,17021 366,17151 366,17356 366,18984 366,19396 366,19426 366,20035 366,20645 366,20760 366,21702 366,21920 366,22296 366,23623 366,23771 366,23819 366,24678 366,25165 366,25179 366,26006 366,26060 366,26249 366,28851 366,29031 366,29179 366,29924 366,30716 366,30903 366,31272 366,31874 366,32348 366,33042 366,35730 366,38194 366,38531 366,41594 366,42778 366,43304 366,43429 366,43740 366,43744 366,47484 366,48046 366,48383 366,48771 366,49257 366,52101 366,52102 366,52107 366,52108 366,52109 366,52110 366,52114 366,52115 366,52120 366,52121 366,52122 366,52126 366,52129 366,52131 366,53420 366,53860 366,56080 366,56098 366,56396 366,58121 366,64595 366,69672 366,69906 366,70723 366,70843 366,75316 366,76312 366,80065 366,81140 366,82151 366,85909 366,86369 366,86938 366,88467 366,89332 366,90935 366,91435 366,93702 366,95952 366,98513 366,99920 366,102796 366,104129 366,105319 366,106300 366,110905 366,111892 366,113574 366,117810 366,119165 366,119456 366,121093 366,126817 366,130976 366,131228 366,131246 366,132931 366,141024 366,142185 366,142915 366,148721 366,149752 366,150472 366,156526 366,156991 366,159103 366,159117 366,160241 366,160244 366,170010 366,170421 366,172165 366,176702 366,177487 366,177512 366,178882 366,181949 366,183955 366,185374 366,193270 366,199569 366,204846 366,216615 366,218170 366,218855 366,224650 366,226481 367,366 368,366 369,366 370,366 371,366 372,24 372,71 372,104 372,120 372,134 372,135 372,167 372,227 372,233 372,240 372,261 372,289 372,290 372,299 372,301 372,304 372,314 372,327 372,332 372,372 372,373 372,390 372,397 372,400 372,431 372,444 372,446 372,452 372,502 372,572 372,588 372,589 372,590 372,599 372,612 372,631 372,636 372,661 372,693 372,694 372,714 372,715 372,794 372,805 372,818 372,849 372,852 372,932 372,1001 372,1010 372,1061 372,1081 372,1082 372,1085 372,1118 372,1119 372,1122 372,1130 372,1133 372,1203 372,1285 372,1293 372,1309 372,1332 372,1353 372,1361 372,1459 372,1505 372,1635 372,1715 372,1775 372,1796 372,1807 372,1955 372,2008 372,2206 372,2208 372,2209 372,2296 372,2316 372,2443 372,2512 372,2657 372,2729 372,2747 372,2775 372,2812 372,2991 372,3328 372,3582 372,3607 372,3619 372,3866 372,3879 372,4308 372,4363 372,4540 372,4723 372,4886 372,5011 372,5186 372,5278 372,5472 372,5520 372,5646 372,5654 372,6004 372,6068 372,7182 372,7395 372,7759 372,7805 372,7852 372,7920 372,7966 372,8107 372,8180 372,8187 372,8446 372,9342 372,9391 372,9739 372,13274 372,13506 372,13524 372,13698 372,14080 372,14124 372,14597 372,14603 372,15226 372,15962 372,16192 372,16479 372,16955 372,17073 372,18515 372,18626 372,19798 372,19868 372,20560 372,22150 372,22509 372,24757 372,24839 372,24967 372,26905 372,27132 372,28940 372,29760 372,29854 372,30068 372,30373 372,30680 372,30733 372,31335 372,31796 372,32478 372,32634 372,32650 372,35802 372,36589 372,37368 372,37407 372,37599 372,38300 372,41169 372,41247 372,42839 372,43347 372,45407 372,46830 372,46874 372,47173 372,49035 372,52539 372,55568 372,59043 372,61896 372,62482 372,62591 372,63656 372,65326 372,65681 372,65909 372,69304 372,69322 372,69624 372,70048 372,70322 372,71078 372,71950 372,72639 372,72657 372,74148 372,74355 372,74696 372,75912 372,82801 372,83441 372,84750 372,85730 372,86390 372,94134 372,97597 372,98271 372,98284 372,98932 372,102250 372,103860 372,104590 372,106945 372,107096 372,107408 372,110217 372,111431 372,112504 372,112527 372,114064 372,114553 372,116102 372,118261 372,118374 372,118521 372,118678 372,121749 372,122448 372,123007 372,125592 372,127029 372,130278 372,131972 372,132005 372,132232 372,132604 372,132660 372,132823 372,133111 372,133309 372,135862 372,137069 372,137167 372,137261 372,138309 372,138310 372,138311 372,139652 372,139702 372,142066 372,142808 372,144988 372,145598 372,148763 372,150741 372,152226 372,153306 372,153931 372,154816 372,155547 372,159383 372,159425 372,159428 372,161383 372,162456 372,163351 372,163917 372,164706 372,167834 372,169103 372,169229 372,169420 372,169422 372,173359 372,174341 372,174479 372,174910 372,175315 372,175903 372,176944 372,181612 372,181945 372,182809 372,183366 372,186482 372,193018 372,196771 372,197762 372,198093 372,200655 372,204586 372,206387 372,219266 372,231469 372,236650 372,236703 372,243543 372,245421 372,245928 372,250304 372,262010 372,263829 372,263954 372,263957 372,263970 372,263978 373,26 373,59 373,104 373,134 373,135 373,211 373,215 373,261 373,292 373,294 373,298 373,310 373,332 373,372 373,417 373,431 373,440 373,557 373,588 373,590 373,631 373,636 373,714 373,760 373,805 373,862 373,932 373,943 373,1001 373,1085 373,1119 373,1149 373,1402 373,1417 373,1462 373,1631 373,1635 373,2089 373,2205 373,2206 373,2443 373,2940 373,3069 373,4237 373,4771 373,8537 373,9005 373,33424 373,182162 374,366 375,376 376,1801 376,14605 376,117586 376,118608 376,121370 377,366 378,233 379,19 379,222 379,278 379,283 379,313 379,379 379,380 379,385 379,389 379,401 379,404 379,536 379,634 379,657 379,685 379,852 379,911 379,1011 379,1274 379,1617 379,1618 379,1678 379,1724 379,1871 379,1973 379,2159 379,2464 379,2507 379,2619 379,2646 379,2784 379,2874 379,2944 379,3686 379,5356 379,5591 379,6290 379,6789 379,7109 379,7145 379,7698 379,7767 379,9729 379,13622 379,13868 379,13980 379,15233 379,15234 379,15249 379,16357 379,22455 379,24738 379,25670 379,26341 379,26965 379,27221 379,27659 379,28170 379,28401 379,28588 379,29400 379,34367 379,36338 379,37088 379,38251 379,38971 379,38998 379,42739 379,43390 379,46343 379,47550 379,49828 379,52751 379,52752 379,52753 379,55159 379,56040 379,56207 379,58224 379,58982 379,59830 379,60836 379,61121 379,63519 379,63755 379,66703 379,73297 379,73523 379,74720 379,75163 379,75787 379,81024 379,87918 379,90143 379,90246 379,90653 379,97934 379,106767 379,106787 379,110604 379,113606 379,115474 379,116998 379,119894 379,121971 379,123287 379,124106 379,125265 379,128770 379,131359 379,132085 379,136686 379,136695 379,142312 379,143037 379,146798 379,153671 379,154184 379,155136 379,159116 379,159505 379,163275 379,164306 379,169514 379,169595 379,173335 379,173544 379,174110 379,174115 379,174664 379,198176 379,207659 379,217870 379,238957 379,240995 379,241060 379,241181 379,242392 379,243477 379,243490 379,245312 379,259703 380,379 380,536 380,1608 380,13137 380,148742 381,326 382,383 384,366 385,8 385,19 385,54 385,83 385,283 385,379 385,385 385,455 385,536 385,657 385,660 385,976 385,1274 385,1571 385,1617 385,2159 385,2224 385,2290 385,2421 385,2424 385,2507 385,2646 385,2779 385,2944 385,3252 385,4166 385,4637 385,5325 385,5326 385,5781 385,6680 385,8152 385,8431 385,13154 385,13622 385,13868 385,15249 385,17273 385,18650 385,19443 385,20355 385,21382 385,23287 385,23839 385,25670 385,28130 385,29006 385,31039 385,37348 385,41450 385,54565 385,59013 385,63353 385,63519 385,72916 385,79836 385,95008 385,108420 385,114016 385,132085 385,138238 385,164434 385,173075 385,213089 385,221547 385,243506 385,258092 385,263587 386,68 386,387 386,390 387,68 387,175 387,178 387,240 387,356 387,387 387,390 387,431 387,838 387,852 387,985 387,1004 387,1715 387,1912 387,2285 387,2460 387,2512 387,2590 387,4190 387,4220 387,4605 387,5198 387,8488 387,8519 387,9727 387,9734 387,13947 387,17189 387,18465 387,19392 387,19815 387,20561 387,20865 387,22071 387,25734 387,26041 387,26286 387,26514 387,27066 387,28162 387,40888 387,58483 387,63375 387,65449 387,66297 387,72428 387,72837 387,81094 387,82217 387,83839 387,105041 387,106261 387,112806 387,113061 387,113355 387,115448 387,122797 387,167364 387,172383 387,183846 387,188706 387,189415 387,189806 387,189855 387,192343 387,192993 387,193129 387,193138 387,211934 387,221673 387,241527 387,244775 387,245317 387,245706 387,246778 388,3 388,389 388,425 388,457 388,466 388,467 388,509 388,510 388,623 388,663 388,673 388,685 388,693 388,838 388,852 388,1014 388,1072 388,1113 388,1118 388,1133 388,1208 388,1210 388,1326 388,1345 388,1424 388,1479 388,1566 388,1732 388,1796 388,1801 388,1853 388,2045 388,2153 388,2257 388,2373 388,2557 388,3182 388,4165 388,4315 388,4506 388,4760 388,5033 388,5186 388,5230 388,6032 388,6045 388,6596 388,6638 388,6641 388,7766 388,8097 388,8107 388,8860 388,9668 388,14009 388,14031 388,14572 388,15303 388,16192 388,17380 388,18387 388,18508 388,20228 388,20636 388,21182 388,22144 388,24328 388,27072 388,29760 388,30373 388,30502 388,31080 388,31335 388,34072 388,37733 388,38755 388,38861 388,38862 388,41180 388,41207 388,41208 388,41301 388,41532 388,44262 388,46761 388,46990 388,48505 388,49252 388,50149 388,50234 388,51963 388,55029 388,56542 388,56685 388,58424 388,59204 388,62346 388,62350 388,62439 388,62615 388,64577 388,64632 388,70048 388,81177 388,81480 388,81933 388,83567 388,87712 388,88667 388,88983 388,89604 388,92270 388,94744 388,97326 388,97904 388,101939 388,102803 388,107027 388,108075 388,109944 388,112840 388,114292 388,115955 388,117013 388,117505 388,118036 388,118338 388,121035 388,121451 388,122106 388,122376 388,123950 388,126662 388,128822 388,130795 388,131753 388,133077 388,133566 388,135233 388,136135 388,140750 388,144179 388,145447 388,148337 388,152914 388,154736 388,155108 388,155708 388,160330 388,160490 388,161236 388,161519 388,162861 388,163089 388,163450 388,163898 388,164401 388,165586 388,169934 388,182449 388,190239 388,190389 388,191913 388,193413 388,193641 388,213182 388,215180 388,215809 388,215848 388,216533 388,221231 388,221420 388,227315 388,229589 388,232630 388,232756 388,233774 388,237249 388,241090 388,241680 388,243369 388,248714 388,249420 388,250520 388,256461 389,3 389,19 389,34 389,35 389,63 389,83 389,192 389,202 389,203 389,222 389,240 389,278 389,283 389,313 389,358 389,379 389,388 389,389 389,404 389,477 389,509 389,510 389,536 389,634 389,660 389,680 389,692 389,693 389,814 389,818 389,868 389,873 389,874 389,875 389,911 389,949 389,1001 389,1005 389,1019 389,1072 389,1085 389,1118 389,1201 389,1204 389,1206 389,1208 389,1220 389,1222 389,1274 389,1313 389,1467 389,1566 389,1571 389,1618 389,1655 389,1724 389,1756 389,1785 389,1871 389,1881 389,1916 389,2133 389,2159 389,2176 389,2224 389,2266 389,2269 389,2322 389,2409 389,2421 389,2424 389,2458 389,2507 389,2580 389,2646 389,2784 389,3157 389,3367 389,3416 389,3507 389,3937 389,4109 389,4166 389,4223 389,4377 389,4637 389,4742 389,5326 389,5718 389,5933 389,6506 389,6828 389,6904 389,7092 389,7698 389,9743 389,13137 389,13240 389,13365 389,13549 389,13622 389,13624 389,14384 389,14494 389,15171 389,15183 389,15197 389,15397 389,15562 389,16186 389,16230 389,17273 389,18034 389,18387 389,18388 389,18481 389,18883 389,19443 389,19452 389,19660 389,19672 389,20852 389,21009 389,21733 389,22180 389,22874 389,23287 389,23431 389,23522 389,23553 389,23573 389,23702 389,24565 389,24642 389,24786 389,24836 389,25471 389,25513 389,25670 389,26182 389,26345 389,26801 389,27043 389,28145 389,28562 389,28685 389,28821 389,28844 389,28946 389,29008 389,29260 389,31729 389,31977 389,32780 389,33392 389,33451 389,33453 389,33519 389,34396 389,34725 389,34904 389,35464 389,35546 389,35619 389,35831 389,36813 389,37900 389,38139 389,38542 389,39480 389,39723 389,40566 389,41157 389,41305 389,42037 389,42592 389,43293 389,44397 389,45188 389,45511 389,45569 389,46790 389,47756 389,48253 389,48283 389,49379 389,49421 389,53781 389,54435 389,54464 389,54602 389,55202 389,55447 389,56584 389,56679 389,59787 389,61746 389,62459 389,63509 389,64314 389,66000 389,66468 389,67485 389,67886 389,68245 389,71266 389,79340 389,79432 389,79515 389,79614 389,81004 389,83340 389,85909 389,87841 389,89148 389,92237 389,94064 389,95504 389,96344 389,99530 389,99571 389,102631 389,103568 389,103913 389,104616 389,106930 389,108618 389,109028 389,109029 389,111461 389,112357 389,113585 389,115245 389,117915 389,118324 389,118530 389,120736 389,120956 389,122195 389,125008 389,125440 389,127082 389,127137 389,127158 389,127756 389,128337 389,129770 389,130275 389,131196 389,131216 389,131652 389,132062 389,132868 389,134042 389,134597 389,136707 389,136808 389,136860 389,138915 389,139375 389,140415 389,140460 389,142506 389,146472 389,146569 389,147923 389,147961 389,149252 389,149450 389,150448 389,154596 389,156820 389,158253 389,160076 389,160500 389,164511 389,164512 389,165470 389,165477 389,168336 389,169687 389,175968 389,177945 389,182488 389,183012 389,183272 389,183610 389,183742 389,183814 389,183822 389,183873 389,183891 389,186830 389,188067 389,189286 389,189972 389,190928 389,191148 389,195009 389,195528 389,203900 389,207000 389,212914 389,213152 389,213502 389,215382 389,215914 389,218039 389,218421 389,220180 389,221465 389,221470 389,221487 389,222223 389,222521 389,222568 389,222570 389,222599 389,223089 389,223855 389,225543 389,225591 389,225641 389,225752 389,225794 389,227230 389,227317 389,227337 389,227362 389,227367 389,227955 389,227969 389,228487 389,229165 389,229690 389,230102 389,231008 389,231306 389,231745 389,232245 389,235625 389,236141 389,236790 389,239683 389,240996 389,241612 389,243070 389,247059 389,249497 389,252037 389,253938 389,258527 389,261818 389,263935 390,72 390,240 390,261 390,298 390,326 390,356 390,372 390,387 390,390 390,400 390,417 390,431 390,440 390,494 390,511 390,522 390,534 390,573 390,589 390,599 390,631 390,679 390,685 390,693 390,781 390,782 390,783 390,794 390,808 390,818 390,852 390,1001 390,1014 390,1026 390,1081 390,1082 390,1085 390,1133 390,1284 390,1285 390,1309 390,1329 390,1411 390,1423 390,1424 390,1487 390,1544 390,1559 390,1580 390,1703 390,1715 390,1801 390,1849 390,1853 390,1888 390,1955 390,1973 390,2007 390,2512 390,2747 390,2812 390,2989 390,2991 390,3135 390,3406 390,3455 390,3793 390,4107 390,4190 390,5051 390,5052 390,5186 390,5299 390,5388 390,6068 390,6474 390,6552 390,7194 390,8107 390,8276 390,9015 390,13143 390,13274 390,13524 390,14236 390,14246 390,14311 390,14495 390,14597 390,14904 390,15254 390,15633 390,15651 390,16955 390,18526 390,19072 390,19252 390,20017 390,20222 390,20509 390,20519 390,23316 390,23372 390,24839 390,27041 390,28144 390,28269 390,30328 390,31741 390,32650 390,32814 390,32932 390,33338 390,34963 390,37368 390,37407 390,38474 390,40936 390,42335 390,42839 390,43394 390,44830 390,45126 390,49030 390,49104 390,49646 390,50559 390,51666 390,54504 390,61096 390,63375 390,64681 390,65771 390,70136 390,73570 390,74686 390,75184 390,82733 390,88306 390,90306 390,91182 390,91342 390,91946 390,94965 390,96685 390,101716 390,104565 390,106872 390,107408 390,107424 390,107730 390,109290 390,112328 390,117788 390,118971 390,119079 390,128244 390,133309 390,134473 390,135882 390,137980 390,137981 390,142456 390,143752 390,147515 390,147873 390,148742 390,150016 390,151108 390,152405 390,152631 390,158245 390,160910 390,161009 390,161299 390,161565 390,162521 390,167083 390,170531 390,174727 390,174769 390,174943 390,175903 390,176124 390,176314 390,189930 390,190504 390,191105 390,193632 390,195114 390,206189 390,218050 390,218363 390,218884 390,220389 390,225616 390,232900 390,233491 390,233497 390,237981 390,238759 390,253129 390,254389 390,258889 391,32 391,285 391,392 391,599 391,644 391,779 391,809 391,918 391,1151 391,1363 391,1836 391,2699 391,3003 392,1 392,34 392,35 392,87 392,126 392,167 392,186 392,192 392,217 392,240 392,256 392,285 392,287 392,301 392,314 392,356 392,392 392,397 392,406 392,433 392,440 392,452 392,457 392,467 392,509 392,510 392,535 392,599 392,623 392,657 392,752 392,779 392,808 392,809 392,818 392,838 392,849 392,852 392,872 392,919 392,1011 392,1014 392,1019 392,1085 392,1118 392,1130 392,1192 392,1204 392,1210 392,1240 392,1262 392,1417 392,1465 392,1566 392,1572 392,1634 392,1659 392,1796 392,1805 392,1844 392,1860 392,1949 392,1973 392,2173 392,2253 392,2697 392,3507 392,4066 392,6955 392,13136 392,15609 392,19010 392,20757 392,127158 392,138686 392,207837 392,215874 393,259 393,272 393,314 393,346 393,393 393,394 393,395 393,446 393,498 393,523 393,577 393,599 393,726 393,766 393,788 393,794 393,838 393,902 393,980 393,1044 393,1388 393,1531 393,1651 393,2023 393,2178 393,2459 393,3799 393,4009 393,4137 393,4611 393,5181 393,5565 393,6609 393,6645 393,7087 393,7780 393,8038 393,8438 393,8905 393,13394 393,14111 393,15312 393,16679 393,17245 393,17913 393,18108 393,18164 393,18449 393,18457 393,18818 393,20844 393,21627 393,21727 393,21736 393,22221 393,22686 393,23249 393,24937 393,25033 393,25302 393,25477 393,27913 393,28997 393,29301 393,29503 393,31251 393,32458 393,32905 393,33939 393,35360 393,35661 393,37445 393,39192 393,39257 393,40733 393,41168 393,41843 393,44116 393,44136 393,44847 393,45753 393,45983 393,48078 393,48864 393,48865 393,48869 393,48870 393,48871 393,48874 393,48877 393,48883 393,48888 393,48974 393,50271 393,50272 393,50276 393,52936 393,54996 393,55383 393,56150 393,56321 393,57167 393,58793 393,59416 393,60906 393,61548 393,61992 393,62562 393,63063 393,68816 393,68822 393,69282 393,69733 393,71437 393,71871 393,76993 393,78091 393,80680 393,81491 393,82523 393,84630 393,86288 393,91011 393,94451 393,95951 393,97595 393,99744 393,101995 393,102209 393,102792 393,108127 393,108399 393,109865 393,115196 393,117354 393,118086 393,118201 393,118350 393,118497 393,118669 393,122062 393,122699 393,123401 393,123937 393,124028 393,125437 393,130599 393,131133 393,132612 393,133734 393,134240 393,134519 393,135157 393,135645 393,138585 393,138912 393,139589 393,140730 393,140878 393,141397 393,141759 393,144338 393,144878 393,147008 393,147552 393,149054 393,154899 393,155333 393,155349 393,155709 393,156471 393,159849 393,160399 393,161937 393,163872 393,164001 393,167167 393,170509 393,171524 393,172033 393,172559 393,174215 393,175412 393,176185 393,177373 393,177561 393,178901 393,180033 393,180607 393,184231 393,187519 393,187973 393,189099 393,191360 393,192491 393,197534 393,229813 393,232500 393,233388 393,233608 393,234158 393,236852 393,237504 393,238465 393,239345 393,244313 393,246167 393,246609 393,247780 393,248785 393,249337 393,250237 393,251300 393,252505 393,254095 393,255452 393,256769 393,259095 393,259413 393,262330 394,393 396,397 397,1 397,15 397,20 397,22 397,68 397,83 397,126 397,167 397,182 397,192 397,207 397,209 397,240 397,259 397,261 397,292 397,299 397,314 397,336 397,337 397,396 397,397 397,420 397,425 397,441 397,452 397,457 397,479 397,481 397,493 397,500 397,505 397,509 397,510 397,512 397,516 397,534 397,535 397,538 397,577 397,581 397,604 397,631 397,668 397,673 397,676 397,677 397,733 397,764 397,779 397,808 397,818 397,838 397,843 397,849 397,868 397,872 397,911 397,918 397,920 397,950 397,969 397,972 397,1011 397,1019 397,1021 397,1085 397,1089 397,1118 397,1151 397,1160 397,1172 397,1181 397,1191 397,1192 397,1204 397,1210 397,1267 397,1293 397,1294 397,1345 397,1402 397,1417 397,1445 397,1454 397,1464 397,1518 397,1559 397,1566 397,1572 397,1655 397,1663 397,1688 397,1724 397,1753 397,1796 397,1803 397,1805 397,1825 397,1843 397,1845 397,1849 397,1992 397,2045 397,2141 397,2173 397,2205 397,2253 397,2308 397,2480 397,2512 397,2590 397,2605 397,2694 397,2810 397,2923 397,2989 397,2991 397,3182 397,3392 397,3487 397,3524 397,3529 397,3533 397,3559 397,3582 397,3790 397,3865 397,3881 397,3920 397,3958 397,4165 397,4190 397,4231 397,4259 397,4276 397,4438 397,4766 397,5061 397,5644 397,5833 397,6119 397,6452 397,6628 397,6695 397,6824 397,7978 397,9457 397,9603 397,14196 397,14353 397,14358 397,16123 397,16516 397,18346 397,19617 397,21442 397,22029 397,22262 397,26093 397,28142 397,28901 397,28907 397,28951 397,29786 397,33424 397,34359 397,44103 397,48307 397,49993 397,50358 397,55254 397,56294 397,56473 397,62417 397,70174 397,75292 397,75912 397,76860 397,79532 397,79818 397,81233 397,101652 397,103557 397,103714 397,109360 397,109802 397,114450 397,115474 397,116309 397,118336 397,119865 397,127158 397,136447 397,136623 397,136699 397,136700 397,140095 397,150787 397,165813 397,168301 397,169977 397,177371 397,177434 397,178632 397,179024 397,179804 397,181530 397,188700 397,189825 397,204093 397,215276 397,221068 397,221693 397,226977 397,228238 397,228994 397,230929 397,233432 397,237271 397,245910 398,399 398,7698 399,398 399,399 399,536 399,635 399,650 399,1843 399,2059 399,2159 399,2243 399,2247 399,2646 399,2672 399,2845 399,3686 399,4290 399,4295 399,4303 399,4477 399,5223 399,6395 399,7698 399,8463 399,14447 399,15645 399,15657 400,372 400,390 400,1082 400,1807 400,2315 401,379 401,1274 401,28107 402,58 402,403 402,586 402,693 402,1118 402,5250 402,113878 403,402 403,403 403,693 403,5847 403,6763 403,7795 403,20030 403,32268 403,32631 403,38896 403,55832 403,74151 403,91334 403,102096 403,107688 403,110798 403,113878 403,218524 403,225657 403,242913 403,254592 403,257673 404,222 404,379 404,389 404,1274 405,406 406,1 406,20 406,30 406,50 406,56 406,79 406,99 406,106 406,146 406,147 406,149 406,158 406,175 406,182 406,186 406,192 406,195 406,202 406,203 406,206 406,217 406,240 406,285 406,301 406,314 406,333 406,336 406,406 406,410 406,435 406,440 406,452 406,502 406,505 406,516 406,536 406,585 406,599 406,602 406,620 406,622 406,640 406,733 406,766 406,778 406,779 406,808 406,818 406,838 406,841 406,920 406,1003 406,1010 406,1011 406,1014 406,1072 406,1085 406,1089 406,1118 406,1163 406,1181 406,1204 406,1218 406,1262 406,1370 406,1417 406,1425 406,1456 406,1458 406,1464 406,1515 406,1518 406,1521 406,1531 406,1554 406,1619 406,1623 406,1655 406,1776 406,1796 406,1825 406,1844 406,1973 406,2173 406,2244 406,2253 406,2365 406,2373 406,2400 406,2556 406,2710 406,2741 406,2792 406,2875 406,2880 406,2938 406,2969 406,3027 406,3030 406,3060 406,3070 406,3199 406,3255 406,3361 406,3449 406,3507 406,3592 406,3895 406,4103 406,4426 406,4477 406,4684 406,4727 406,5048 406,5174 406,5401 406,5592 406,5601 406,5621 406,5726 406,5729 406,6066 406,6863 406,7766 406,7948 406,8055 406,8244 406,8764 406,8971 406,9394 406,9582 406,13283 406,13493 406,13592 406,13623 406,13771 406,13994 406,14040 406,14166 406,14913 406,15769 406,15795 406,15980 406,16019 406,16135 406,16563 406,16775 406,17151 406,17236 406,17248 406,17262 406,17551 406,18638 406,18692 406,18705 406,18931 406,19385 406,19457 406,19577 406,19586 406,19589 406,19690 406,19825 406,19936 406,20076 406,20160 406,20713 406,20896 406,20942 406,21528 406,21572 406,22296 406,22392 406,22699 406,23084 406,23098 406,23816 406,23926 406,23941 406,23953 406,23991 406,24056 406,24150 406,24161 406,24164 406,24166 406,24170 406,24181 406,24187 406,24233 406,25511 406,26197 406,26383 406,26434 406,28115 406,28364 406,28928 406,29638 406,30331 406,30673 406,30706 406,31573 406,31585 406,31946 406,32468 406,32661 406,32744 406,32958 406,32992 406,33339 406,35336 406,35672 406,36054 406,36082 406,36523 406,37669 406,37882 406,37978 406,38681 406,38688 406,39643 406,40283 406,41429 406,43281 406,43348 406,43670 406,43879 406,44500 406,46334 406,46336 406,47505 406,47648 406,47772 406,48452 406,48805 406,49563 406,49575 406,49711 406,49791 406,50210 406,51260 406,52550 406,52855 406,54653 406,54744 406,55254 406,55849 406,55974 406,56007 406,57133 406,58131 406,58169 406,58689 406,58820 406,59059 406,59077 406,59083 406,59360 406,59711 406,59746 406,60576 406,61993 406,62372 406,62530 406,62686 406,63126 406,63585 406,64598 406,65809 406,66011 406,66603 406,66710 406,67445 406,67605 406,68525 406,68902 406,69668 406,70723 406,70843 406,71873 406,72071 406,72505 406,72678 406,72825 406,73348 406,73815 406,75249 406,75876 406,76763 406,80058 406,80266 406,80650 406,82182 406,82792 406,83406 406,84126 406,84545 406,86174 406,86198 406,86532 406,88099 406,88572 406,88600 406,89035 406,92476 406,94986 406,96637 406,97423 406,98099 406,99606 406,99819 406,100875 406,102560 406,103852 406,104926 406,105747 406,106502 406,107102 406,109441 406,109934 406,110229 406,111151 406,114019 406,114641 406,114954 406,115648 406,118119 406,118336 406,118425 406,119438 406,120636 406,120637 406,121892 406,122217 406,123025 406,123648 406,123890 406,123926 406,124497 406,124889 406,125518 406,126107 406,126292 406,127158 406,128112 406,128572 406,128711 406,128976 406,129795 406,129982 406,130340 406,132929 406,133031 406,133174 406,133356 406,134036 406,136234 406,136986 406,138314 406,138860 406,138881 406,140474 406,141377 406,141618 406,141912 406,147467 406,147516 406,147614 406,148094 406,148143 406,148601 406,148606 406,148917 406,148970 406,150405 406,150788 406,150995 406,151986 406,153765 406,153930 406,154493 406,155513 406,156392 406,157720 406,158349 406,158706 406,158800 406,158816 406,158947 406,159530 406,159874 406,161596 406,163349 406,163732 406,164187 406,164572 406,164862 406,165944 406,165945 406,166569 406,166646 406,166748 406,167907 406,168976 406,169385 406,169456 406,170149 406,170484 406,170647 406,170782 406,171268 406,171938 406,173230 406,173443 406,174124 406,175324 406,176074 406,176287 406,176577 406,176653 406,176931 406,176933 406,176942 406,177368 406,177444 406,177975 406,178005 406,179515 406,179708 406,179935 406,180487 406,182526 406,183852 406,183885 406,186042 406,186073 406,187293 406,187792 406,188069 406,191963 406,193009 406,193180 406,193198 406,195222 406,198153 406,202496 406,205794 406,212502 406,214338 406,214342 406,215421 406,215490 406,215821 406,216215 406,217541 406,220502 406,220628 406,222527 406,227027 406,227200 406,227365 406,227954 406,228516 406,228583 406,228703 406,229956 406,231893 406,231978 406,232257 406,234222 406,234369 406,234397 406,241146 406,241274 406,241795 406,242414 406,248101 406,249249 406,250003 406,253986 406,254279 406,254703 406,259067 406,260977 407,408 408,102 408,407 408,518 408,655 408,852 408,1113 408,1323 408,1326 408,1483 408,1566 408,1603 408,2373 408,2737 408,2755 408,2923 408,3005 408,3193 408,3758 408,3792 408,3940 408,5749 408,6824 408,7866 408,7988 408,13308 408,13346 408,14020 408,15200 408,20663 408,22684 408,23340 408,26974 408,28432 408,28850 408,28885 408,28892 408,30567 408,31105 408,31203 408,31205 408,31217 408,31249 408,38301 408,40718 408,41966 408,41968 408,43085 408,44156 408,44260 408,44267 408,44699 408,44706 408,45401 408,45409 408,53250 408,68913 408,71872 408,72721 408,75931 408,78904 408,81023 408,83197 408,83796 408,93338 408,101723 408,103282 408,106157 408,110618 408,110644 408,111102 408,113867 408,113904 408,114446 408,117797 408,118960 408,120990 408,123891 408,125498 408,125547 408,127327 408,127342 408,127636 408,127722 408,127760 408,128144 408,133643 408,136054 408,138097 408,139531 408,155148 408,156338 408,156904 408,156935 408,168850 408,173701 408,177749 408,179156 408,181205 408,183414 408,183791 408,190457 408,191216 408,191379 408,194398 408,194971 408,195679 408,222625 408,223843 408,224693 408,225419 408,225449 408,226580 408,228157 408,228168 408,232023 408,234972 408,237281 408,237394 408,241487 408,243194 408,244007 408,247252 408,248518 408,248554 408,249056 408,250581 408,253224 408,258133 408,259541 408,264370 409,328 409,704 409,705 410,406 410,779 410,68069 411,376 412,163 413,240 413,332 413,818 414,415 414,673 414,893 415,87 415,770 415,911 415,996 416,417 417,10 417,41 417,182 417,255 417,298 417,373 417,390 417,417 417,534 417,557 417,589 417,599 417,626 417,631 417,632 417,677 417,685 417,693 417,714 417,715 417,765 417,784 417,818 417,838 417,849 417,852 417,862 417,911 417,970 417,1001 417,1010 417,1011 417,1014 417,1085 417,1119 417,1133 417,1179 417,1417 417,1459 417,1462 417,1470 417,1563 417,1564 417,1572 417,1573 417,1818 417,1844 417,1899 417,1962 417,2008 417,2097 417,2117 417,2184 417,2253 417,2296 417,2316 417,2357 417,2451 417,2572 417,2846 417,2850 417,2874 417,2995 417,3028 417,3094 417,3507 417,3623 417,3879 417,3953 417,3954 417,4214 417,4222 417,4406 417,4540 417,4879 417,5278 417,5321 417,5329 417,5330 417,5344 417,5439 417,5472 417,5778 417,5943 417,6038 417,6068 417,6203 417,6304 417,6570 417,6825 417,7238 417,8502 417,9292 417,9377 417,13271 417,13359 417,13433 417,13733 417,13756 417,13803 417,13828 417,13832 417,14438 417,14441 417,14603 417,15438 417,15452 417,15460 417,15468 417,15472 417,15477 417,15492 417,15496 417,15529 417,15541 417,15568 417,15739 417,16077 417,16167 417,16174 417,16215 417,16668 417,16963 417,17212 417,17218 417,17274 417,18379 417,18425 417,19798 417,19944 417,23710 417,24600 417,32604 417,32645 417,34093 417,38822 417,39300 417,39307 417,42029 417,42298 417,42323 417,43517 417,44489 417,44725 417,44951 417,45560 417,51972 417,52061 417,52083 417,52099 417,52116 417,54560 417,56485 417,56973 417,57042 417,57054 417,59754 417,60734 417,63066 417,63972 417,64033 417,65795 417,66023 417,68195 417,69119 417,70067 417,70195 417,71774 417,71869 417,72751 417,72755 417,75912 417,79507 417,79514 417,79961 417,80016 417,80047 417,80048 417,80055 417,81508 417,82284 417,84605 417,84727 417,85531 417,85544 417,86062 417,86130 417,89794 417,90945 417,91001 417,91109 417,91839 417,92911 417,92964 417,95757 417,96089 417,98152 417,105664 417,106177 417,107004 417,107155 417,107462 417,109602 417,113573 417,115466 417,116661 417,117480 417,118946 417,119463 417,127158 417,128521 417,130135 417,130423 417,130843 417,132660 417,133088 417,133461 417,135081 417,137195 417,137865 417,139620 417,141716 417,148536 417,152639 417,154335 417,158581 417,159672 417,160800 417,161532 417,162041 417,162676 417,163477 417,166485 417,167590 417,169113 417,172102 417,178576 417,179729 417,182027 417,182146 417,182345 417,182693 417,183366 417,219458 417,224932 417,227709 417,236379 417,242133 417,244359 417,244920 417,248729 417,249055 417,249401 417,251039 417,252106 417,258490 417,263369 417,263740 418,344 418,37414 419,420 420,420 421,56 421,79 421,192 421,422 421,994 422,1 422,56 422,79 422,146 422,147 422,148 422,149 422,175 422,192 422,285 422,314 422,333 422,336 422,421 422,422 422,602 422,620 422,645 422,841 422,849 422,852 422,1011 422,1089 422,1181 422,1425 422,1458 422,1469 422,1497 422,1515 422,1518 422,1582 422,1619 422,1623 422,1803 422,1825 422,1940 422,2032 422,2037 422,2132 422,2253 422,2574 422,3376 422,4388 422,4432 422,4441 422,5280 422,5360 422,5401 422,5916 422,5952 422,5957 422,6119 422,6575 422,7026 422,8244 422,8536 422,9064 422,9136 422,9379 422,9525 422,9819 422,12263 422,14053 422,14306 422,14446 422,14511 422,15098 422,15154 422,15297 422,16083 422,18638 422,18997 422,21219 422,21451 422,21503 422,21653 422,21904 422,22616 422,23633 422,23744 422,23753 422,23783 422,24150 422,26414 422,27834 422,28799 422,29334 422,30331 422,30943 422,32911 422,33036 422,36715 422,38489 422,48278 422,60576 422,62722 422,65809 422,68014 422,70913 422,81148 422,84458 422,92476 422,92994 422,98854 422,99780 422,101738 422,109686 422,112061 422,118021 422,118025 422,118915 422,119117 422,119482 422,120133 422,123084 422,123857 422,124426 422,124847 422,126987 422,127053 422,127298 422,127906 422,128904 422,133017 422,135126 422,135296 422,139936 422,139937 422,140335 422,140483 422,145825 422,146660 422,147392 422,150106 422,151347 422,152140 422,153385 422,155058 422,155403 422,155407 422,156272 422,158352 422,158656 422,160357 422,160951 422,162818 422,162890 422,163167 422,163483 422,163534 422,165007 422,166562 422,167509 422,174398 422,174534 422,183343 422,183382 422,186056 422,187477 422,189757 422,195132 422,204124 422,207440 422,207659 422,212656 422,216260 422,216273 422,221372 422,235567 422,241043 422,242264 422,243887 422,244928 422,249815 422,249908 422,251631 422,251648 422,252250 422,252830 422,253117 422,255207 422,256804 422,257231 422,258361 422,262368 422,262400 422,262566 423,424 424,287 424,326 424,424 424,702 424,873 424,874 424,3206 424,4272 424,6477 424,6832 424,9714 424,27456 424,29930 424,32620 424,36656 424,54334 424,85842 424,94874 424,125412 424,125510 424,126840 424,128157 424,131369 424,140098 424,140510 424,140531 424,144139 424,144175 424,145139 424,145897 424,145901 424,146756 424,146759 424,148339 424,149314 424,152513 424,153185 424,153577 424,162598 424,163931 424,170494 424,171698 424,171703 424,178814 424,190244 424,192371 424,198235 424,216683 424,245858 424,251878 424,263079 425,3 425,37 425,46 425,50 425,56 425,68 425,79 425,81 425,83 425,97 425,126 425,147 425,158 425,178 425,192 425,195 425,202 425,203 425,225 425,240 425,251 425,283 425,285 425,287 425,289 425,290 425,294 425,298 425,299 425,301 425,304 425,315 425,326 425,332 425,333 425,337 425,372 425,388 425,390 425,406 425,425 425,433 425,439 425,444 425,455 425,459 425,489 425,493 425,500 425,510 425,516 425,588 425,589 425,590 425,592 425,609 425,615 425,620 425,623 425,631 425,682 425,694 425,704 425,714 425,717 425,744 425,752 425,765 425,775 425,779 425,783 425,795 425,818 425,841 425,843 425,862 425,873 425,907 425,911 425,919 425,947 425,968 425,980 425,992 425,1012 425,1033 425,1085 425,1117 425,1146 425,1147 425,1210 425,1212 425,1235 425,1240 425,1241 425,1276 425,1282 425,1284 425,1285 425,1293 425,1298 425,1300 425,1309 425,1326 425,1335 425,1370 425,1381 425,1411 425,1454 425,1465 425,1479 425,1509 425,1515 425,1522 425,1531 425,1544 425,1604 425,1619 425,1634 425,1635 425,1644 425,1732 425,1782 425,1801 425,1805 425,1818 425,1877 425,1888 425,1893 425,1955 425,1962 425,1973 425,1985 425,1992 425,2019 425,2045 425,2083 425,2092 425,2191 425,2224 425,2296 425,2353 425,2372 425,2496 425,2557 425,2572 425,2590 425,2744 425,3093 425,3182 425,3207 425,3507 425,3630 425,3697 425,3752 425,3753 425,3830 425,4138 425,4177 425,4218 425,5130 425,5301 425,5385 425,5662 425,5961 425,6068 425,6119 425,6136 425,6519 425,6638 425,6661 425,6718 425,6955 425,6977 425,7760 425,8276 425,9036 425,13195 425,13302 425,14212 425,14432 425,15108 425,15184 425,16201 425,17927 425,19590 425,21442 425,22293 425,23370 425,23494 425,23783 425,25537 425,29704 425,31019 425,32566 425,32642 425,32751 425,32839 425,33424 425,35600 425,39570 425,41770 425,46631 425,48574 425,50194 425,54632 425,55174 425,56353 425,56931 425,58207 425,58221 425,59014 425,60560 425,60574 425,60576 425,62354 425,64475 425,64602 425,64626 425,65707 425,66343 425,70819 425,71993 425,75912 425,95563 425,95576 425,114397 425,117897 425,124932 425,127704 425,134047 425,136631 425,148700 425,149268 425,150358 425,151012 425,151430 425,153741 425,160945 425,168441 425,169326 425,171641 425,174451 425,177308 425,179214 425,181832 425,199738 425,200691 425,204124 425,212974 425,215210 425,227061 425,228840 425,233336 425,245966 425,254855 426,427 426,3285 426,3286 426,171365 426,245617 426,245777 428,312 429,430 430,26 430,59 430,852 430,1235 430,1335 430,2089 430,2940 431,41 431,58 431,68 431,130 431,134 431,135 431,137 431,186 431,225 431,240 431,261 431,278 431,294 431,313 431,332 431,363 431,364 431,372 431,373 431,390 431,431 431,442 431,444 431,446 431,518 431,557 431,589 431,590 431,612 431,631 431,676 431,677 431,693 431,715 431,761 431,775 431,784 431,797 431,800 431,805 431,823 431,852 431,949 431,989 431,1001 431,1004 431,1052 431,1085 431,1118 431,1119 431,1252 431,1253 431,1285 431,1368 431,1459 431,1462 431,1564 431,1566 431,1580 431,1631 431,1732 431,1796 431,1844 431,1879 431,1955 431,2015 431,2188 431,2315 431,2346 431,2512 431,2596 431,2646 431,2701 431,2834 431,3111 431,3115 431,3328 431,3474 431,3496 431,3504 431,3621 431,3715 431,3822 431,4222 431,4384 431,4411 431,4751 431,4771 431,5137 431,5405 431,5693 431,6828 431,6856 431,7225 431,7458 431,7809 431,8285 431,8632 431,13366 431,13563 431,13741 431,14134 431,14482 431,14564 431,14597 431,15106 431,15109 431,15271 431,15497 431,15502 431,16137 431,16641 431,18103 431,19510 431,19617 431,20027 431,20038 431,20288 431,20645 431,20787 431,21081 431,22058 431,22308 431,23077 431,24288 431,24618 431,25307 431,26041 431,27433 431,28112 431,32583 431,32949 431,33382 431,34205 431,35500 431,36250 431,36278 431,37651 431,37730 431,38275 431,38394 431,38491 431,38847 431,39244 431,41332 431,41527 431,43202 431,44725 431,46276 431,46776 431,47768 431,48889 431,49035 431,49254 431,49271 431,49483 431,50418 431,52543 431,56963 431,58224 431,59006 431,59043 431,60058 431,61089 431,62019 431,62439 431,63319 431,64625 431,64850 431,65101 431,68781 431,70111 431,70288 431,70332 431,70742 431,73334 431,78418 431,79397 431,79544 431,79619 431,80245 431,80295 431,80489 431,81207 431,82259 431,84133 431,86450 431,86725 431,87243 431,88928 431,90809 431,96483 431,97195 431,97772 431,103031 431,103526 431,103775 431,105728 431,105913 431,106143 431,108195 431,109301 431,109877 431,114508 431,116779 431,120149 431,122795 431,128042 431,130789 431,131216 431,131250 431,135318 431,135319 431,135320 431,135321 431,136425 431,136462 431,137752 431,146302 431,147400 431,147676 431,148297 431,154795 431,156699 431,158396 431,159116 431,161487 431,162577 431,163105 431,163933 431,165729 431,166953 431,166988 431,167150 431,168423 431,169339 431,169443 431,172036 431,173360 431,175643 431,176944 431,177909 431,178971 431,179057 431,182465 431,183823 431,186065 431,187182 431,188791 431,194926 431,195286 431,206230 431,215898 431,217559 431,218437 431,229659 431,238678 431,240472 431,242209 431,244582 431,255247 431,259545 431,261868 431,263305 432,433 432,571 432,1181 433,22 433,34 433,35 433,207 433,287 433,314 433,326 433,349 433,392 433,432 433,433 433,440 433,467 433,599 433,623 433,673 433,794 433,818 433,872 433,874 433,918 433,1011 433,1014 433,1130 433,1210 433,1422 433,1502 433,1634 433,1805 433,1824 433,1860 433,1973 433,2095 433,2373 433,2542 433,3443 433,4109 433,4450 433,5196 433,5208 433,5231 433,5320 433,5604 433,5646 433,5955 433,6578 433,6632 433,8041 433,8495 433,8562 433,9414 433,13142 433,13188 433,13223 433,13259 433,14128 433,14304 433,14452 433,15489 433,15635 433,16337 433,16522 433,16596 433,18136 433,18138 433,18245 433,18307 433,18333 433,18400 433,19413 433,19592 433,19627 433,23594 433,25395 433,25398 433,26301 433,28406 433,29871 433,31280 433,31765 433,33238 433,34775 433,35464 433,36003 433,36920 433,37692 433,39618 433,40240 433,40474 433,41242 433,41389 433,41867 433,41928 433,44895 433,46271 433,46321 433,47034 433,48192 433,48453 433,48461 433,48468 433,48474 433,48486 433,48489 433,48496 433,48498 433,48502 433,48511 433,49139 433,51543 433,52048 433,55224 433,55615 433,56365 433,56911 433,58372 433,59880 433,62859 433,64477 433,66368 433,66418 433,66425 433,66427 433,66428 433,66429 433,66641 433,66660 433,68113 433,71830 433,76989 433,77538 433,79673 433,80473 433,80490 433,80537 433,81233 433,82422 433,83384 433,84127 433,86087 433,89378 433,93113 433,95519 433,96608 433,99900 433,103192 433,110150 433,110200 433,112619 433,113832 433,115394 433,119943 433,121505 433,121598 433,125473 433,126706 433,127158 433,127818 433,129316 433,131348 433,131822 433,134700 433,135118 433,136458 433,136647 433,137020 433,139748 433,139947 433,140420 433,142250 433,142260 433,142970 433,145043 433,158572 433,160441 433,161289 433,161661 433,162599 433,167673 433,172641 433,172662 433,173319 433,176867 433,177989 433,185412 433,207084 433,211461 433,216997 433,222468 433,231159 433,237195 433,242217 433,242224 433,243342 433,253222 433,253725 433,253735 433,257819 433,262686 433,264869 434,65 434,315 434,346 434,435 434,447 434,571 434,622 434,671 434,868 434,934 434,1033 434,1294 434,1913 434,9476 435,20 435,178 435,182 435,240 435,301 435,302 435,315 435,327 435,346 435,406 435,434 435,435 435,439 435,440 435,447 435,467 435,510 435,516 435,538 435,622 435,663 435,671 435,766 435,794 435,868 435,872 435,920 435,934 435,939 435,950 435,996 435,1014 435,1033 435,1118 435,1192 435,1294 435,1474 435,1518 435,1531 435,1590 435,1612 435,1644 435,1651 435,1796 435,1844 435,1877 435,1913 435,2023 435,2030 435,2085 435,2094 435,2102 435,2106 435,2307 435,2352 435,2353 435,2710 435,3241 435,3512 435,3518 435,3903 435,4286 435,4315 435,4394 435,4646 435,5376 435,5996 435,6268 435,6452 435,6672 435,6853 435,6966 435,7186 435,8157 435,8374 435,8764 435,13506 435,14060 435,14111 435,14186 435,14358 435,14428 435,15141 435,16010 435,17337 435,17426 435,17429 435,17432 435,18116 435,18416 435,19191 435,19411 435,19592 435,20295 435,22221 435,22385 435,23122 435,26271 435,26302 435,26915 435,26972 435,27827 435,28545 435,29890 435,32468 435,32929 435,33326 435,34268 435,34304 435,38304 435,38439 435,38754 435,39684 435,41342 435,44345 435,45184 435,45848 435,48361 435,49069 435,49337 435,52127 435,55094 435,57040 435,63081 435,75139 435,104592 435,105614 435,112168 435,112985 435,116017 435,117157 435,117480 435,117974 435,120052 435,120155 435,120826 435,121505 435,121610 435,122675 435,123147 435,128831 435,131650 435,133112 435,147772 435,156939 435,162693 435,164696 435,166713 435,168380 435,168496 435,177555 435,178077 435,182308 435,188523 435,192089 435,192461 435,192504 435,193649 435,217522 435,218878 435,223791 435,223922 435,226228 435,228493 435,230495 435,230991 435,237119 435,244794 435,253085 435,256956 436,302 437,438 438,65 438,149 438,182 438,336 438,439 438,497 438,505 438,622 438,766 438,779 438,1163 438,1290 438,1354 438,1566 438,1665 438,1699 438,1714 438,1803 438,2102 438,2427 438,5305 438,9375 438,14040 438,18591 438,22221 438,23453 438,40072 438,48364 439,20 439,34 439,35 439,178 439,256 439,259 439,315 439,333 439,346 439,435 439,439 439,440 439,447 439,538 439,577 439,599 439,622 439,671 439,676 439,724 439,766 439,818 439,838 439,903 439,934 439,939 439,950 439,1011 439,1033 439,1068 439,1085 439,1262 439,1294 439,1369 439,1370 439,1474 439,1498 439,1565 439,1590 439,1612 439,1644 439,1651 439,1776 439,1789 439,2102 439,2152 439,2340 439,2352 439,2400 439,2418 439,2427 439,2511 439,2710 439,3241 439,3507 439,3555 439,3576 439,3831 439,3866 439,3903 439,3990 439,4102 439,4461 439,4514 439,5189 439,5212 439,5228 439,5376 439,5654 439,5731 439,5851 439,6422 439,6648 439,6966 439,8243 439,8273 439,8425 439,13547 439,13562 439,13713 439,14111 439,14233 439,15141 439,15238 439,15344 439,15355 439,16563 439,17426 439,18220 439,18309 439,18731 439,19191 439,19457 439,21255 439,21563 439,22902 439,24664 439,26038 439,26905 439,27167 439,29057 439,31222 439,31765 439,32468 439,32792 439,34342 439,35636 439,35672 439,36653 439,36786 439,37772 439,37870 439,38253 439,38270 439,38776 439,39578 439,40914 439,41353 439,43402 439,45101 439,46326 439,46989 439,48243 439,48364 439,48982 439,49088 439,53241 439,54798 439,55603 439,55958 439,58552 439,59020 439,59663 439,59741 439,62265 439,63166 439,63347 439,63425 439,63499 439,64235 439,64239 439,64572 439,64684 439,66258 439,68220 439,69883 439,70071 439,74234 439,75349 439,75912 439,82872 439,87729 439,89392 439,89752 439,92761 439,93146 439,100125 439,100573 439,100829 439,101516 439,103772 439,106377 439,107614 439,114840 439,122087 439,127158 439,130320 439,133112 439,133922 439,134844 439,135220 439,135221 439,135361 439,135905 439,135967 439,136841 439,140395 439,142109 439,142393 439,144849 439,146836 439,148970 439,150449 439,150741 439,152182 439,152888 439,153632 439,155404 439,156016 439,161611 439,162008 439,163945 439,164367 439,164387 439,167054 439,168310 439,169844 439,173556 439,174652 439,175056 439,178065 439,179823 439,183931 439,185895 439,190492 439,191503 439,212024 439,213512 439,216287 439,216507 439,217345 439,217986 439,228943 439,232288 439,232657 439,233392 439,238384 439,238932 439,239965 439,240395 439,243369 439,247224 439,247717 439,249251 439,250775 439,252900 439,253099 439,253917 439,258327 439,258421 439,263411 439,264118 439,264187 440,20 440,34 440,35 440,68 440,97 440,195 440,202 440,211 440,264 440,302 440,314 440,327 440,328 440,337 440,373 440,392 440,406 440,457 440,467 440,479 440,516 440,536 440,621 440,622 440,631 440,673 440,693 440,697 440,710 440,794 440,809 440,818 440,837 440,872 440,903 440,907 440,911 440,920 440,939 440,950 440,972 440,1014 440,1033 440,1085 440,1118 440,1204 440,1294 440,1298 440,1494 440,1653 440,1722 440,1729 440,1758 440,1837 440,1844 440,1855 440,1893 440,2085 440,2418 440,2438 440,2496 440,2683 440,2710 440,2979 440,3565 440,4175 440,4188 440,4354 440,4466 440,4771 440,5392 440,5472 440,5584 440,5604 440,5631 440,6422 440,8013 440,8041 440,8274 440,13235 440,13323 440,14040 440,15344 440,15686 440,17310 440,17337 440,18024 440,18194 440,20293 440,20539 440,20598 440,22048 440,36809 440,38105 440,38186 440,38355 440,43383 440,45453 440,46350 440,49420 440,52084 440,55287 440,57143 440,57633 440,60712 440,64610 440,67210 440,70133 440,71056 440,75139 440,75817 440,77035 440,81233 440,81787 440,84241 440,85829 440,88939 440,94242 440,104536 440,104569 440,106244 440,106305 440,107574 440,109468 440,120155 440,121131 440,122206 440,122266 440,122657 440,122675 440,122806 440,122890 440,123110 440,123163 440,123169 440,123187 440,123249 440,123833 440,123846 440,123912 440,124072 440,124492 440,125111 440,127419 440,127427 440,127909 440,131295 440,131650 440,133112 440,133462 440,134517 440,135099 440,135100 440,137255 440,140100 440,145520 440,149028 440,149233 440,158382 440,164727 440,166432 440,167676 440,170444 440,176362 440,176418 440,179726 440,181585 440,181771 440,181817 440,181838 440,182241 440,182431 440,183156 440,183532 440,184707 440,185837 440,186533 440,187430 440,190286 440,190342 440,190977 440,192483 440,193677 440,194079 440,194172 440,194200 440,194204 440,194332 440,194408 440,194443 440,194488 440,196031 440,196183 440,197165 440,197472 440,197633 440,198774 440,198829 440,199032 440,199568 440,199685 440,200143 440,201484 440,205599 440,222617 440,225403 440,231943 440,249273 440,253402 440,254643 440,257037 441,58 441,87 441,107 441,111 441,182 441,211 441,256 441,264 441,292 441,314 441,356 441,360 441,397 441,441 441,442 441,452 441,457 441,467 441,500 441,502 441,510 441,535 441,572 441,599 441,609 441,626 441,673 441,676 441,685 441,745 441,749 441,794 441,801 441,808 441,838 441,843 441,849 441,852 441,872 441,911 441,929 441,953 441,999 441,1011 441,1014 441,1025 441,1045 441,1046 441,1096 441,1118 441,1127 441,1130 441,1140 441,1146 441,1147 441,1177 441,1191 441,1192 441,1204 441,1235 441,1238 441,1262 441,1326 441,1332 441,1335 441,1417 441,1449 441,1566 441,1572 441,1653 441,1663 441,1677 441,1688 441,1722 441,1758 441,1836 441,1844 441,1893 441,1992 441,2065 441,2173 441,2201 441,2209 441,2253 441,2292 441,2310 441,2334 441,2373 441,2379 441,2436 441,2443 441,2889 441,3035 441,3474 441,3524 441,3538 441,3555 441,3830 441,4039 441,4114 441,4190 441,4276 441,4308 441,4520 441,4771 441,5068 441,5547 441,5679 441,6566 441,6569 441,6581 441,6824 441,6904 441,7921 441,8994 441,9457 441,9739 441,12752 441,13323 441,14674 441,15609 441,15658 441,18013 441,19413 441,20757 441,21589 441,22490 441,24500 441,25282 441,30770 441,32978 441,35402 441,37414 441,76815 441,77711 441,79369 441,97889 441,98967 441,114185 441,126278 441,136072 441,206387 441,207659 441,215874 441,231838 442,58 442,107 442,136 442,186 442,200 442,217 442,256 442,292 442,314 442,441 442,442 442,557 442,599 442,609 442,626 442,631 442,784 442,794 442,849 442,852 442,972 442,999 442,1001 442,1011 442,1014 442,1119 442,1252 442,1253 442,1332 442,1415 442,1572 442,1688 442,1722 442,1973 442,2089 442,2209 442,2253 442,2334 442,2373 442,2436 442,2940 442,3507 442,4771 442,21944 443,444 444,46 444,240 444,256 444,301 444,304 444,314 444,372 444,431 444,443 444,444 444,459 444,518 444,534 444,567 444,568 444,569 444,604 444,615 444,663 444,698 444,744 444,775 444,783 444,852 444,877 444,937 444,968 444,973 444,1011 444,1045 444,1046 444,1117 444,1122 444,1160 444,1285 444,1293 444,1732 444,1782 444,1810 444,2595 444,3122 444,3392 444,3397 444,3422 444,3463 444,3560 444,4517 444,5662 444,13296 444,14246 444,14636 444,15109 444,15588 444,17894 444,18098 444,18604 444,18672 444,22062 444,23848 444,23871 444,25273 444,26789 444,27458 444,30191 444,31784 444,37340 444,42598 444,48402 444,67185 444,75802 444,76632 444,79424 444,79427 444,82206 444,83369 444,83512 444,90254 444,90257 444,103860 444,112527 444,122451 444,136594 444,151103 444,152468 444,155401 444,180551 444,183305 444,189303 444,190242 444,238666 444,254468 444,262345 444,262346 444,262769 445,130 446,1 446,5 446,10 446,22 446,30 446,32 446,50 446,56 446,59 446,68 446,71 446,83 446,106 446,134 446,136 446,137 446,146 446,147 446,175 446,200 446,251 446,261 446,272 446,273 446,275 446,287 446,292 446,298 446,304 446,313 446,328 446,332 446,336 446,360 446,372 446,390 446,393 446,397 446,417 446,431 446,447 446,489 446,500 446,577 446,595 446,604 446,605 446,609 446,615 446,626 446,631 446,644 446,663 446,664 446,671 446,682 446,685 446,693 446,694 446,697 446,698 446,702 446,704 446,726 446,746 446,749 446,752 446,772 446,775 446,788 446,809 446,818 446,841 446,850 446,862 446,874 446,875 446,911 446,919 446,932 446,937 446,968 446,972 446,973 446,991 446,996 446,999 446,1070 446,1085 446,1113 446,1119 446,1127 446,1132 446,1175 446,1188 446,1210 446,1220 446,1222 446,1235 446,1238 446,1240 446,1243 446,1284 446,1285 446,1293 446,1298 446,1309 446,1319 446,1345 446,1353 446,1415 446,1436 446,1511 446,1551 446,1566 446,1571 446,1608 446,1619 446,1623 446,1634 446,1715 446,1789 446,1801 446,1803 446,1805 446,1807 446,1836 446,1844 446,1888 446,1927 446,1955 446,1985 446,2006 446,2045 446,2105 446,2201 446,2367 446,2411 446,2421 446,2572 446,2620 446,2775 446,2782 446,2995 446,3069 446,3422 446,3507 446,3538 446,3695 446,3794 446,4039 446,4146 446,4220 446,4222 446,4327 446,4455 446,4637 446,5265 446,5718 446,6424 446,6621 446,7092 446,7194 446,7530 446,8072 446,13207 446,13991 446,15553 446,15582 446,16014 446,17894 446,19010 446,21159 446,23783 446,27834 446,28553 446,30331 446,31893 446,32751 446,33354 446,41230 446,42581 446,45144 446,47805 446,48505 446,66348 446,66754 446,68069 446,72439 446,75912 446,79734 446,81233 446,87871 446,93113 446,95438 446,95823 446,96855 446,98813 446,102560 446,106810 446,114682 446,121109 446,139465 446,141452 446,144231 446,171641 446,176782 446,185877 446,189788 446,190492 446,215264 446,220083 446,221828 446,227376 446,241660 446,247075 447,20 447,175 447,272 447,314 447,315 447,346 447,434 447,435 447,439 447,447 447,538 447,671 447,766 447,788 447,849 447,911 447,934 447,939 447,996 447,1033 447,1294 447,1328 447,1333 447,1474 447,1590 447,1612 447,1644 447,1651 447,1773 447,1789 447,1877 447,1973 447,2023 447,2085 447,2094 447,2102 447,2427 447,3241 447,4046 447,4339 447,4375 447,4399 447,4557 447,4646 447,5083 447,5755 447,6440 447,6586 447,6622 447,6661 447,6966 447,8142 447,8374 447,13711 447,13766 447,13770 447,14831 447,15141 447,15196 447,15345 447,15802 447,17421 447,17423 447,17424 447,17432 447,17794 447,18124 447,22168 447,26787 447,30775 447,33085 447,35359 447,35661 447,36915 447,37315 447,39098 447,41378 447,43196 447,43372 447,43376 447,43787 447,46154 447,50212 447,50500 447,50967 447,51390 447,52196 447,54295 447,54688 447,56008 447,67290 447,71664 447,82098 447,87380 447,88371 447,90933 447,97023 447,101849 447,103107 447,105579 447,105617 447,106377 447,110761 447,117734 447,120052 447,120155 447,128831 447,133418 447,144011 447,144882 447,152128 447,158605 447,165373 447,185517 447,188787 447,190492 447,193204 447,214641 447,215318 447,220470 447,237482 447,238171 447,241266 447,241681 447,245895 447,250543 447,260234 448,240 449,450 450,136 450,225 450,248 450,255 450,288 450,328 450,364 450,449 450,450 450,563 450,630 450,850 450,953 450,1179 450,1332 450,1340 450,1368 450,1740 450,1882 450,1974 450,2036 450,2545 450,3565 450,3719 450,4072 450,4074 450,4276 450,4355 450,4509 450,4679 450,5405 450,5804 450,7059 450,7757 450,7912 450,7921 450,8093 450,8103 450,13207 450,13220 450,13544 450,13624 450,14565 450,15078 450,16143 450,16758 450,16785 450,19817 450,20357 450,20510 450,25600 450,25948 450,26195 450,27097 450,32778 450,32893 450,34724 450,34815 450,34938 450,37042 450,38650 450,41467 450,44416 450,47118 450,48276 450,48322 450,48324 450,48761 450,49009 450,49079 450,53398 450,59956 450,61320 450,62343 450,63507 450,65820 450,71793 450,75096 450,78764 450,79302 450,87762 450,87929 450,88611 450,93556 450,94330 450,102494 450,102777 450,102941 450,109281 450,110647 450,121900 450,122154 450,125373 450,125949 450,126698 450,126762 450,126838 450,136676 450,140433 450,140814 450,143153 450,152028 450,157501 450,158863 450,159730 450,161153 450,163752 450,166328 450,168792 450,174908 450,175899 450,176590 450,183878 450,195018 450,199534 450,207659 450,215361 450,215917 450,216106 450,222773 450,228647 450,237790 450,241368 450,247227 450,248446 451,452 451,918 452,20 452,97 452,126 452,167 452,182 452,192 452,222 452,240 452,256 452,259 452,292 452,301 452,302 452,336 452,352 452,360 452,366 452,392 452,397 452,406 452,441 452,452 452,457 452,462 452,467 452,479 452,497 452,505 452,510 452,512 452,516 452,534 452,536 452,567 452,604 452,623 452,640 452,658 452,673 452,676 452,685 452,693 452,697 452,704 452,712 452,764 452,801 452,818 452,838 452,843 452,872 452,874 452,911 452,918 452,972 452,1010 452,1011 452,1014 452,1021 452,1089 452,1127 452,1135 452,1147 452,1172 452,1204 452,1210 452,1262 452,1267 452,1284 452,1293 452,1298 452,1326 452,1345 452,1370 452,1402 452,1417 452,1445 452,1500 452,1551 452,1566 452,1623 452,1655 452,1663 452,1688 452,1796 452,1805 452,1844 452,1860 452,1893 452,1955 452,1968 452,1992 452,2512 452,2605 452,2979 452,3392 452,3507 452,3804 452,4276 452,4520 452,4760 452,5213 452,6452 452,6837 452,6955 452,7087 452,7731 452,9138 452,13207 452,18062 452,19404 452,19413 452,22148 452,23743 452,24759 452,26161 452,30449 452,31180 452,39482 452,41230 452,48978 452,48984 452,73399 452,75912 452,93679 452,94159 452,97536 452,115474 452,145312 452,212353 452,215874 452,242191 452,263110 452,263830 453,454 455,34 455,35 455,54 455,83 455,182 455,217 455,222 455,278 455,283 455,313 455,314 455,389 455,401 455,455 455,462 455,470 455,535 455,536 455,537 455,581 455,599 455,612 455,657 455,676 455,808 455,814 455,818 455,843 455,923 455,949 455,951 455,1005 455,1011 455,1014 455,1019 455,1069 455,1118 455,1130 455,1240 455,1274 455,1417 455,1467 455,1513 455,1539 455,1559 455,1618 455,1724 455,1860 455,1881 455,1916 455,2159 455,2176 455,2224 455,2253 455,2266 455,2269 455,2290 455,2322 455,2373 455,2421 455,2424 455,2507 455,2511 455,2619 455,2779 455,2944 455,3507 455,3672 455,3933 455,4039 455,4295 455,4377 455,4388 455,4514 455,4565 455,5343 455,5591 455,5758 455,6032 455,6788 455,6789 455,6828 455,6880 455,6955 455,6960 455,7075 455,7768 455,8097 455,8152 455,8535 455,9701 455,13276 455,13328 455,13389 455,13400 455,13549 455,13622 455,13657 455,14420 455,14922 455,15548 455,16186 455,16500 455,17116 455,17223 455,18165 455,18383 455,18650 455,19288 455,19349 455,19351 455,19352 455,21381 455,21414 455,21561 455,22130 455,22552 455,23520 455,24641 455,26034 455,26341 455,28169 455,28238 455,28282 455,29177 455,30459 455,30505 455,31436 455,31738 455,31801 455,32462 455,34509 455,35309 455,35401 455,36607 455,36813 455,37088 455,37095 455,37708 455,37895 455,40500 455,40540 455,41333 455,41341 455,42691 455,44329 455,46165 455,46886 455,48372 455,48515 455,48889 455,48891 455,48892 455,48895 455,51652 455,54208 455,54784 455,54948 455,55716 455,57839 455,60072 455,60742 455,61771 455,65958 455,65965 455,66062 455,66630 455,67589 455,68696 455,69250 455,70228 455,73451 455,74398 455,74600 455,75816 455,77600 455,79936 455,79966 455,79982 455,81842 455,82077 455,82562 455,82570 455,83630 455,83927 455,87709 455,90076 455,90755 455,91836 455,92237 455,97220 455,97910 455,98899 455,98931 455,98947 455,98961 455,99607 455,102698 455,106112 455,107889 455,109350 455,109537 455,112466 455,113506 455,115139 455,115474 455,115672 455,116845 455,117142 455,117680 455,117698 455,117994 455,121197 455,121371 455,121623 455,124576 455,124644 455,125340 455,125502 455,125848 455,126953 455,127895 455,130275 455,131216 455,131224 455,132868 455,135270 455,135391 455,136433 455,136496 455,140055 455,140767 455,142042 455,142988 455,143244 455,143294 455,144323 455,145420 455,145934 455,146100 455,147975 455,148809 455,148817 455,149153 455,149361 455,158324 455,158682 455,161961 455,163377 455,166078 455,166276 455,168165 455,169564 455,169687 455,176218 455,177486 455,179716 455,179839 455,180362 455,187035 455,189443 455,190108 455,191329 455,191385 455,191442 455,193427 455,194481 455,203034 455,213089 455,214655 455,215789 455,222460 455,229149 455,230227 455,230898 455,234714 455,237497 455,239321 455,243691 455,249055 455,258745 455,260090 456,457 456,2923 456,4190 457,1 457,10 457,20 457,34 457,35 457,126 457,167 457,186 457,195 457,207 457,209 457,233 457,251 457,252 457,256 457,259 457,264 457,287 457,301 457,302 457,333 457,336 457,388 457,392 457,397 457,440 457,441 457,452 457,456 457,457 457,467 457,500 457,505 457,510 457,534 457,535 457,536 457,567 457,604 457,657 457,658 457,673 457,676 457,693 457,715 457,733 457,794 457,801 457,808 457,809 457,818 457,838 457,843 457,852 457,862 457,872 457,875 457,911 457,918 457,919 457,972 457,1010 457,1014 457,1085 457,1118 457,1130 457,1147 457,1191 457,1204 457,1210 457,1240 457,1267 457,1293 457,1298 457,1370 457,1381 457,1402 457,1417 457,1445 457,1462 457,1518 457,1531 457,1566 457,1572 457,1634 457,1655 457,1724 457,1796 457,1805 457,1844 457,1893 457,1955 457,1968 457,1992 457,2173 457,2266 457,2310 457,2373 457,2512 457,2580 457,2605 457,2923 457,2989 457,2991 457,3367 457,3392 457,3507 457,3524 457,3578 457,3582 457,3744 457,3866 457,4070 457,4165 457,4190 457,4237 457,4276 457,4286 457,5213 457,5285 457,6452 457,6607 457,6641 457,6695 457,6837 457,6955 457,7124 457,7157 457,7698 457,8195 457,8535 457,13207 457,13275 457,13624 457,14674 457,16600 457,17535 457,19413 457,19442 457,19549 457,19784 457,20426 457,20724 457,22296 457,24847 457,26730 457,29595 457,31942 457,32929 457,37726 457,38273 457,38798 457,38815 457,38823 457,39446 457,39536 457,40256 457,46063 457,50083 457,51884 457,55665 457,57132 457,61209 457,68797 457,70395 457,75087 457,75144 457,75912 457,79528 457,80442 457,90300 457,90453 457,91289 457,91851 457,94077 457,94167 457,98181 457,104592 457,107525 457,118336 457,120958 457,121609 457,124378 457,132863 457,133099 457,139624 457,140133 457,156919 457,157657 457,161617 457,162952 457,170616 457,176950 457,182162 457,184790 457,185934 457,188689 457,188733 457,191956 457,192480 457,192510 457,212304 457,215871 457,216170 457,241658 457,242401 457,243365 457,245379 457,245510 457,258102 457,260890 458,459 459,167 459,299 459,444 459,458 459,459 459,569 459,744 459,783 459,815 459,1012 459,1092 459,1117 459,1122 459,1124 459,1241 459,1298 459,1319 459,1479 459,1496 459,1544 459,1575 459,1849 459,2083 459,2756 459,3207 459,3218 459,3630 459,3756 459,4240 459,7959 459,8187 459,14674 459,15277 459,16250 459,16253 459,19805 459,20326 459,21410 459,22128 459,24744 459,28833 459,29686 459,30267 459,32367 459,32603 459,32605 459,33995 459,34798 459,35545 459,38722 459,40714 459,40763 459,44922 459,49176 459,49444 459,49530 459,54931 459,56672 459,57125 459,57897 459,59644 459,60735 459,61346 459,65794 459,67350 459,69119 459,70314 459,72918 459,80173 459,88306 459,90120 459,90972 459,96685 459,113092 459,113451 459,113573 459,117763 459,139910 459,148473 459,150372 459,163011 459,177389 459,177682 459,194372 459,203021 459,204791 459,207045 459,224458 459,234137 459,243905 459,244692 459,255657 459,258135 459,258176 460,202 460,203 460,251 461,79 461,292 461,462 462,111 462,186 462,292 462,356 462,420 462,452 462,455 462,467 462,626 462,872 462,1011 462,1052 462,1238 462,1326 462,1332 462,1566 462,1572 462,1653 462,1688 462,1722 462,1860 462,1973 462,2224 462,3538 462,4039 462,4771 462,25573 462,37414 463,464 463,465 464,251 464,465 465,251 465,252 465,318 465,465 465,1220 465,1222 465,6075 465,113408 466,34 466,66 466,211 466,272 466,392 466,433 466,440 466,467 466,479 466,515 466,516 466,536 466,868 466,872 466,1085 466,1140 466,1151 466,1659 466,1796 466,2991 466,6904 466,81233 466,156379 467,10 467,34 467,65 467,66 467,68 467,79 467,97 467,126 467,158 467,167 467,171 467,186 467,211 467,217 467,240 467,252 467,264 467,269 467,272 467,301 467,314 467,326 467,327 467,337 467,349 467,388 467,397 467,433 467,435 467,439 467,440 467,466 467,467 467,479 467,495 467,497 467,510 467,516 467,535 467,536 467,599 467,673 467,685 467,693 467,818 467,843 467,868 467,872 467,881 467,911 467,920 467,939 467,950 467,973 467,1001 467,1007 467,1010 467,1011 467,1019 467,1085 467,1096 467,1133 467,1140 467,1151 467,1204 467,1210 467,1235 467,1262 467,1326 467,1345 467,1370 467,1381 467,1417 467,1422 467,1463 467,1494 467,1507 467,1517 467,1518 467,1531 467,1566 467,1659 467,1729 467,1749 467,1782 467,1796 467,1797 467,1844 467,1845 467,1849 467,1855 467,1916 467,2244 467,2348 467,2414 467,2438 467,2464 467,2561 467,2580 467,2583 467,2646 467,2907 467,2991 467,3035 467,3199 467,3569 467,3804 467,3866 467,3884 467,4159 467,4498 467,5388 467,5563 467,5578 467,5625 467,5654 467,5717 467,5827 467,6602 467,6761 467,6782 467,6921 467,6990 467,7186 467,7880 467,8535 467,8606 467,9527 467,9579 467,13233 467,13524 467,13538 467,14304 467,14414 467,14592 467,16010 467,16286 467,16357 467,16522 467,17022 467,18203 467,18224 467,18228 467,18244 467,18249 467,18250 467,18290 467,18397 467,18601 467,18731 467,18787 467,18834 467,19716 467,20261 467,20295 467,20323 467,20613 467,20873 467,22000 467,23514 467,23520 467,23754 467,24682 467,24761 467,24934 467,25249 467,25662 467,26034 467,26450 467,26516 467,27827 467,28317 467,28816 467,28955 467,29037 467,29064 467,29531 467,29713 467,30507 467,31280 467,31704 467,32626 467,32784 467,32978 467,33991 467,34039 467,35278 467,35435 467,35543 467,35672 467,36563 467,36920 467,37569 467,38605 467,40524 467,45427 467,46135 467,46839 467,46922 467,48051 467,48119 467,48404 467,48538 467,49631 467,49651 467,49692 467,49991 467,51884 467,54958 467,56334 467,56365 467,56668 467,56672 467,57182 467,57207 467,57800 467,57821 467,58420 467,59269 467,59658 467,59791 467,60467 467,62172 467,64722 467,64742 467,66290 467,67936 467,68034 467,68722 467,68888 467,68891 467,68906 467,68910 467,70616 467,72646 467,73702 467,73718 467,74770 467,75297 467,75354 467,75495 467,76091 467,76142 467,76219 467,76863 467,76921 467,76965 467,79528 467,79830 467,80440 467,80617 467,80760 467,81233 467,84739 467,86341 467,87800 467,88053 467,89617 467,89764 467,90628 467,91947 467,94881 467,94906 467,96325 467,97078 467,98275 467,98404 467,103195 467,106556 467,108084 467,108088 467,108426 467,109343 467,109555 467,110750 467,112460 467,112811 467,112819 467,113124 467,113354 467,114106 467,114219 467,114353 467,114535 467,114606 467,116044 467,116088 467,116262 467,116982 467,117060 467,119493 467,119970 467,120727 467,123074 467,123505 467,123608 467,124116 467,124942 467,124953 467,127021 467,127433 467,127935 467,128426 467,131224 467,131792 467,131808 467,133364 467,133466 467,134753 467,134798 467,134802 467,136349 467,136950 467,136990 467,136991 467,137420 467,140064 467,140068 467,141817 467,142411 467,143466 467,145636 467,145646 467,147616 467,148504 467,148518 467,150125 467,150469 467,150604 467,152212 467,152504 467,152604 467,152855 467,153601 467,155459 467,155463 467,155469 467,155706 467,155767 467,156264 467,156379 467,156602 467,156939 467,157246 467,160897 467,161289 467,161339 467,161482 467,162599 467,162682 467,163303 467,163729 467,163869 467,164698 467,165770 467,165796 467,165879 467,166069 467,167098 467,172654 467,174438 467,175439 467,177976 467,180347 467,181183 467,182902 467,185902 467,186620 467,187438 467,191339 467,191351 467,191635 467,195165 467,212070 467,212567 467,216100 467,216275 467,223854 467,223860 467,224069 467,225580 467,226266 467,226463 467,226985 467,236967 467,243609 467,250959 467,255856 467,257093 467,258313 467,258459 467,258839 467,259458 467,260251 467,260420 467,260428 467,262135 467,262610 468,167 468,2083 469,192 469,333 469,337 469,663 469,664 469,59021 470,455 471,63 472,473 472,8149 473,685 473,1011 473,1267 474,467 475,259 476,477 476,2168 477,83 477,389 477,476 477,477 477,536 477,1617 477,1618 477,1843 477,2159 477,2168 477,2553 477,2944 477,4030 477,4234 477,4295 477,5458 477,7698 477,13461 477,13980 477,18345 477,18685 477,18831 477,21015 477,23287 477,23481 477,29309 477,32749 477,34013 477,35956 477,37376 477,39537 477,41936 477,44080 477,48043 477,52378 477,52454 477,52459 477,58334 477,61171 477,61309 477,66703 477,67955 477,83988 477,107043 477,115440 477,118835 477,127307 477,128273 477,129258 477,130753 477,149462 477,151013 477,160474 477,162765 477,174370 477,177863 477,198176 477,198360 477,204050 477,215824 477,216248 477,218858 478,264 478,479 478,1381 479,186 479,440 479,452 479,479 479,510 479,535 479,872 479,1014 480,481 480,2083 480,4637 481,256 481,397 481,481 481,567 481,581 481,668 481,685 481,713 481,911 481,1021 481,1172 481,2217 481,2309 481,2310 481,3061 481,3435 481,3967 481,5356 481,6187 481,8419 481,13754 481,14674 481,16010 481,18473 481,21390 481,23311 481,24286 481,25282 481,30063 481,30299 481,33987 481,34709 481,34898 481,35453 481,56089 481,61084 481,66762 481,69680 481,79956 481,80032 481,88420 481,98032 481,102668 481,107328 481,119929 481,122391 481,122408 481,127653 481,131883 481,142771 481,145312 481,157561 481,205444 481,205737 481,212905 481,219812 481,228834 481,229771 481,230268 481,237362 482,298 483,259 483,309 483,310 483,483 483,714 483,718 483,1796 483,2784 483,6556 483,6627 483,177920 483,232766 484,485 485,10 485,97 485,175 485,485 485,685 485,693 485,704 485,841 485,1096 485,1619 485,2460 485,3017 485,3447 485,4869 485,5192 485,5356 485,5673 485,7117 485,7323 485,7757 485,8278 485,8805 485,9147 485,9164 485,9348 485,13424 485,14045 485,15528 485,17663 485,17839 485,17840 485,18187 485,18408 485,18633 485,19057 485,26197 485,26929 485,28294 485,30999 485,34188 485,34885 485,36708 485,38973 485,40613 485,42333 485,46348 485,48078 485,49972 485,50537 485,52392 485,57825 485,62205 485,63551 485,64569 485,65522 485,66537 485,68190 485,79919 485,81266 485,86520 485,87099 485,88390 485,89537 485,91192 485,91907 485,97360 485,97546 485,97893 485,103496 485,108998 485,109640 485,109932 485,116542 485,120495 485,122275 485,122789 485,124857 485,125096 485,125221 485,126011 485,127286 485,129881 485,131963 485,133956 485,138209 485,143270 485,143351 485,145095 485,147455 485,148284 485,148826 485,153564 485,158957 485,159993 485,161461 485,165207 485,173396 485,176000 485,178899 485,179704 485,181486 485,181909 485,184784 485,184893 485,188201 485,189848 485,192599 485,194174 485,197708 485,208040 485,214200 485,218566 485,219730 485,229220 485,230629 485,231709 485,243360 485,253370 485,255658 486,202 486,203 486,206 487,292 488,163 488,209 488,340 488,489 489,356 489,425 489,489 489,673 489,685 489,811 489,849 489,861 489,911 489,1130 489,1603 489,1844 489,2580 489,3804 489,19413 490,491 491,491 491,872 492,493 493,10 493,20 493,63 493,149 493,192 493,202 493,203 493,252 493,314 493,406 493,492 493,493 493,516 493,599 493,663 493,682 493,685 493,733 493,911 493,920 493,998 493,1014 493,1175 493,1181 493,1192 493,1220 493,1222 493,1243 493,1265 493,1266 493,1433 493,1494 493,1512 493,1531 493,1568 493,1594 493,1601 493,1655 493,1686 493,1825 493,1927 493,2033 493,2104 493,2154 493,2173 493,2348 493,2400 493,2455 493,2489 493,2528 493,2552 493,2666 493,3082 493,3651 493,3835 493,3905 493,3943 493,3955 493,4159 493,4342 493,4446 493,4752 493,4814 493,5682 493,5759 493,5798 493,5851 493,5992 493,6325 493,6454 493,6586 493,7731 493,7794 493,8764 493,13478 493,13494 493,13626 493,13659 493,14966 493,15344 493,16497 493,17583 493,18816 493,19486 493,20566 493,20916 493,21427 493,21528 493,22148 493,23053 493,23517 493,23655 493,23769 493,23791 493,24723 493,25952 493,26069 493,26331 493,26373 493,26570 493,26736 493,26774 493,26837 493,26839 493,27098 493,27104 493,27184 493,27495 493,27940 493,28211 493,28377 493,28390 493,28690 493,28836 493,30399 493,30615 493,30622 493,30669 493,31177 493,31374 493,31403 493,34090 493,34118 493,34885 493,35607 493,36196 493,36968 493,39618 493,40542 493,40547 493,41799 493,42787 493,42974 493,43256 493,43885 493,43990 493,48175 493,49960 493,50123 493,50432 493,52809 493,54988 493,55034 493,55097 493,55124 493,56225 493,57706 493,60710 493,61356 493,62086 493,64650 493,64843 493,65925 493,66387 493,67217 493,68268 493,68295 493,69075 493,71843 493,72068 493,72439 493,74422 493,75883 493,75951 493,75960 493,78879 493,79879 493,79922 493,81354 493,82245 493,82827 493,86765 493,87705 493,88430 493,95419 493,95823 493,99826 493,99990 493,101704 493,102153 493,102760 493,102766 493,103278 493,103925 493,106636 493,106887 493,109937 493,110621 493,112066 493,113621 493,114091 493,114239 493,115967 493,116644 493,116655 493,123141 493,124895 493,125401 493,125856 493,125982 493,126731 493,128254 493,129886 493,133981 493,134272 493,139801 493,143424 493,151030 493,153274 493,161210 493,161331 493,164225 493,169407 493,171056 493,173881 493,174940 493,177388 493,177558 493,177858 493,180378 493,182308 493,182330 493,184581 493,184761 493,185838 493,188050 493,189839 493,194635 493,196558 493,196712 493,196780 493,196782 493,196795 493,199885 493,200561 493,200782 493,201057 493,204071 493,214822 493,215276 493,222369 493,222526 493,225402 493,225690 493,225800 493,233977 493,236981 493,238349 493,241099 493,242274 493,243369 493,243781 493,244051 493,246087 493,247155 493,248064 493,249055 493,249098 493,250823 493,251239 493,251241 493,257986 493,258044 493,263358 494,390 495,65 495,66 495,217 495,240 495,292 495,314 495,467 495,536 495,868 495,1001 495,1345 495,1433 495,31206 495,156379 496,497 497,136 497,256 497,336 497,452 497,455 497,457 497,496 497,497 497,505 497,668 497,673 497,712 497,713 497,825 497,843 497,862 497,911 497,1058 497,1118 497,1172 497,1262 497,1293 497,1332 497,1494 497,1566 497,1603 497,1613 497,1655 497,1707 497,1808 497,1844 497,1860 497,2229 497,2294 497,2310 497,2355 497,3605 497,3967 497,4044 497,4250 497,5551 497,5829 497,6642 497,6861 497,7934 497,8055 497,8122 497,9457 497,13207 497,13538 497,14674 497,15150 497,19144 497,19276 497,23099 497,23560 497,23562 497,24634 497,25751 497,28970 497,28974 497,29100 497,35353 497,37510 497,42973 497,45658 497,47152 497,50157 497,50180 497,51904 497,58359 497,63476 497,75098 497,109996 497,118317 497,121930 497,136022 497,148226 497,164996 497,169567 497,169886 497,169955 497,173873 497,179406 497,181884 497,181951 499,500 499,808 499,1043 499,1117 499,1118 499,1240 499,1284 499,1732 500,10 500,109 500,175 500,178 500,182 500,186 500,192 500,211 500,240 500,366 500,397 500,500 500,512 500,676 500,693 500,718 500,784 500,808 500,818 500,875 500,911 500,918 500,1014 500,1048 500,1107 500,1118 500,1147 500,1204 500,1345 500,1445 500,1531 500,1566 500,1694 500,1796 500,1882 500,2083 500,2175 500,2191 500,2295 500,2512 500,2602 500,2606 500,2668 500,2775 500,3087 500,3164 500,3173 500,3543 500,3983 500,4066 500,4101 500,4238 500,4845 500,4871 500,5652 500,6614 500,6824 500,6962 500,7067 500,7078 500,7413 500,7430 500,8069 500,8808 500,9721 500,13257 500,14122 500,14315 500,14540 500,17356 500,18199 500,18637 500,19406 500,19413 500,19484 500,20645 500,21260 500,22267 500,22296 500,23425 500,23501 500,25179 500,27500 500,27939 500,28113 500,28220 500,28424 500,29944 500,30485 500,31171 500,31797 500,31874 500,32950 500,35730 500,36308 500,37275 500,38453 500,38531 500,39706 500,41096 500,41998 500,42466 500,42737 500,44056 500,44269 500,49904 500,50241 500,50712 500,53420 500,53510 500,56396 500,57065 500,59790 500,61696 500,62211 500,65706 500,68096 500,71622 500,72775 500,75040 500,76183 500,80007 500,80023 500,80065 500,80265 500,81796 500,82870 500,84625 500,86094 500,86425 500,88467 500,88702 500,88726 500,89682 500,89831 500,90935 500,91435 500,93628 500,94300 500,96537 500,97081 500,97273 500,97368 500,97372 500,97374 500,97375 500,97384 500,97388 500,97390 500,97391 500,97395 500,97397 500,97400 500,97404 500,97407 500,97413 500,97417 500,97419 500,97421 500,97426 500,97427 500,97428 500,97429 500,97430 500,97436 500,97437 500,97439 500,97894 500,98138 500,98141 500,98142 500,98144 500,98147 500,103722 500,103760 500,106205 500,107370 500,107377 500,109315 500,109319 500,113956 500,115168 500,117794 500,117928 500,118898 500,120412 500,120663 500,120902 500,120908 500,124869 500,125023 500,126899 500,129756 500,130903 500,131228 500,136722 500,136723 500,136757 500,138076 500,139516 500,139733 500,145880 500,145933 500,151081 500,152413 500,153199 500,156546 500,157077 500,166990 500,171709 500,171838 500,174329 500,174332 500,174355 500,174359 500,179196 500,188475 500,188479 500,188896 501,364 501,595 501,1252 501,1253 502,28 502,30 502,104 502,107 502,111 502,119 502,134 502,143 502,200 502,215 502,227 502,264 502,290 502,292 502,314 502,372 502,406 502,441 502,442 502,503 502,631 502,636 502,704 502,714 502,784 502,805 502,1011 502,1014 502,1016 502,1149 502,1177 502,1235 502,1238 502,1402 502,1462 502,1745 502,1973 502,2205 502,2379 502,3538 502,4571 502,4771 502,5265 502,6824 502,8180 502,8537 502,33424 502,88820 503,81 503,104 503,120 503,215 503,227 503,254 503,502 503,503 503,631 503,704 503,1118 503,1149 503,1257 503,1270 503,1279 503,1282 503,1346 503,1392 503,1402 503,2379 503,2436 503,2708 503,4216 503,4221 503,4261 503,4580 503,5283 503,5284 503,5552 503,5642 503,5809 503,6023 503,6674 503,8546 503,12747 503,13636 503,13730 503,14080 503,14150 503,14456 503,14638 503,15189 503,15579 503,15658 503,16306 503,16342 503,16401 503,16507 503,17607 503,18400 503,18942 503,19500 503,19634 503,20843 503,21253 503,22222 503,23851 503,25015 503,25814 503,28291 503,31162 503,32254 503,33938 503,34065 503,35475 503,36821 503,37562 503,37563 503,37573 503,37574 503,37575 503,37580 503,37582 503,37583 503,37584 503,37585 503,37588 503,37591 503,37592 503,37593 503,37594 503,37600 503,37604 503,37606 503,37607 503,37609 503,37619 503,37620 503,37621 503,37622 503,37623 503,37624 503,37625 503,37626 503,37627 503,37632 503,37633 503,37634 503,37635 503,37636 503,37638 503,37641 503,37642 503,37644 503,37645 503,37646 503,37715 503,37746 503,37748 503,37749 503,37752 503,37754 503,37757 503,37763 503,38195 503,38232 503,38810 503,38813 503,38814 503,38837 503,39118 503,39280 503,40053 503,40794 503,40795 503,40798 503,43090 503,43731 503,44256 503,46079 503,47770 503,49339 503,49921 503,50204 503,50518 503,51503 503,54408 503,60459 503,65681 503,69647 503,78907 503,82165 503,87800 503,90148 503,95107 503,97338 503,98940 503,99057 503,99059 503,99061 503,99062 503,99685 503,103281 503,103838 503,103916 503,103918 503,103920 503,103921 503,103922 503,103936 503,104102 503,106915 503,111633 503,113103 503,113105 503,114953 503,116749 503,120082 503,120083 503,120905 503,122438 503,122678 503,122679 503,124883 503,124899 503,126144 503,134164 503,168485 503,171109 503,173252 503,173679 503,176844 503,180272 503,182023 503,186188 503,187045 503,188234 503,189618 503,198381 503,200725 503,212503 503,212505 503,212506 503,212507 503,216645 503,216783 503,220403 503,220414 503,220415 503,221043 503,222629 503,224583 503,234916 503,242196 503,246740 503,254568 503,254571 503,254575 503,254850 503,255273 503,256852 503,256854 503,257946 503,260153 504,505 504,581 505,1 505,50 505,99 505,106 505,146 505,147 505,149 505,158 505,175 505,186 505,192 505,195 505,202 505,206 505,256 505,285 505,314 505,333 505,336 505,337 505,397 505,406 505,452 505,457 505,493 505,497 505,505 505,585 505,586 505,602 505,622 505,640 505,663 505,664 505,668 505,673 505,676 505,685 505,733 505,779 505,818 505,820 505,838 505,841 505,849 505,920 505,991 505,1011 505,1014 505,1027 505,1089 505,1107 505,1191 505,1222 505,1262 505,1293 505,1328 505,1370 505,1425 505,1458 505,1512 505,1515 505,1518 505,1521 505,1566 505,1619 505,1623 505,1655 505,1663 505,1844 505,1985 505,1992 505,2244 505,2253 505,2782 505,3392 505,3895 505,4190 505,4932 505,5533 505,7055 505,8443 505,9457 505,15330 505,15417 505,16019 505,18164 505,20757 505,21277 505,21442 505,21736 505,25388 505,26730 505,30331 505,40782 505,41103 505,48364 505,59020 505,60576 505,72439 505,76704 505,80058 505,80266 505,89035 505,92476 505,118336 505,124847 505,136022 505,141912 505,146917 505,154168 505,160515 505,160867 505,163335 505,163398 505,170478 505,173387 505,174124 505,181962 505,192979 505,211927 505,213782 505,215874 505,220455 505,227365 505,236489 505,244006 505,248475 505,250184 505,256831 505,259513 506,106 506,1707 506,1888 507,298 508,485 509,3 509,32 509,140 509,167 509,264 509,292 509,312 509,327 509,349 509,358 509,389 509,392 509,509 509,510 509,535 509,599 509,663 509,673 509,676 509,685 509,697 509,770 509,779 509,794 509,809 509,822 509,838 509,843 509,849 509,852 509,872 509,875 509,903 509,1011 509,1024 509,1025 509,1043 509,1130 509,1151 509,1173 509,1210 509,1276 509,1345 509,1424 509,1453 509,1507 509,1515 509,1566 509,1572 509,1619 509,1722 509,1973 509,2028 509,2150 509,2181 509,2230 509,2373 509,2418 509,2511 509,3003 509,3182 509,3367 509,3483 509,3743 509,4039 509,4382 509,4514 509,4565 509,4580 509,4722 509,5043 509,5057 509,5846 509,5926 509,6567 509,7050 509,7154 509,7993 509,8428 509,8658 509,9330 509,9742 509,13193 509,14010 509,14357 509,14891 509,15508 509,15525 509,15566 509,16455 509,16502 509,18029 509,20591 509,21607 509,22304 509,22806 509,23626 509,24686 509,26164 509,29008 509,29688 509,30373 509,31055 509,31080 509,31085 509,31933 509,32819 509,34381 509,34390 509,36171 509,36591 509,36720 509,38300 509,38906 509,38923 509,40691 509,41378 509,41478 509,41886 509,42114 509,45538 509,45695 509,46209 509,46947 509,47038 509,47973 509,47983 509,47990 509,47993 509,47998 509,49063 509,49376 509,49684 509,49708 509,50076 509,50388 509,50393 509,50397 509,50400 509,50404 509,50406 509,50455 509,50460 509,50568 509,50569 509,52443 509,53233 509,55603 509,59619 509,61255 509,66629 509,68811 509,71184 509,78932 509,79577 509,82567 509,83384 509,86012 509,87452 509,91655 509,97915 509,98135 509,99654 509,100219 509,107299 509,116985 509,117231 509,122265 509,125548 509,127898 509,127900 509,129975 509,131910 509,132870 509,133167 509,134105 509,136981 509,138035 509,140771 509,142541 509,143271 509,150022 509,150037 509,150856 509,154691 509,155357 509,160247 509,162323 509,163131 509,163449 509,163501 509,163898 509,164003 509,164121 509,165687 509,165787 509,168388 509,168537 509,170896 509,177681 509,180528 509,181603 509,181604 509,189988 509,190374 509,199799 509,212458 509,213974 509,215874 509,218545 509,221391 509,227227 509,236817 509,240416 509,250684 509,253347 509,261619 509,261922 509,262593 509,263529 510,3 510,10 510,11 510,32 510,72 510,87 510,97 510,111 510,126 510,140 510,167 510,175 510,178 510,182 510,192 510,211 510,240 510,248 510,264 510,287 510,289 510,290 510,292 510,301 510,302 510,312 510,314 510,327 510,349 510,352 510,358 510,360 510,366 510,388 510,389 510,392 510,397 510,425 510,435 510,441 510,452 510,457 510,467 510,479 510,509 510,510 510,512 510,515 510,516 510,525 510,534 510,535 510,536 510,595 510,599 510,622 510,631 510,663 510,664 510,673 510,676 510,693 510,697 510,723 510,725 510,769 510,770 510,779 510,794 510,795 510,809 510,818 510,822 510,838 510,843 510,849 510,852 510,872 510,875 510,903 510,929 510,972 510,992 510,1010 510,1011 510,1014 510,1025 510,1043 510,1045 510,1052 510,1073 510,1085 510,1118 510,1140 510,1146 510,1151 510,1172 510,1173 510,1184 510,1204 510,1210 510,1235 510,1240 510,1241 510,1276 510,1293 510,1335 510,1345 510,1370 510,1417 510,1424 510,1453 510,1487 510,1507 510,1515 510,1518 510,1531 510,1545 510,1559 510,1566 510,1584 510,1612 510,1634 510,1722 510,1749 510,1758 510,1801 510,1818 510,1836 510,1844 510,1973 510,2028 510,2045 510,2124 510,2150 510,2173 510,2181 510,2253 510,2301 510,2418 510,2557 510,2701 510,2744 510,2979 510,3182 510,3258 510,3367 510,3473 510,3497 510,3507 510,3599 510,3973 510,4039 510,4109 510,4140 510,4315 510,4417 510,4565 510,4580 510,5043 510,5255 510,5285 510,5387 510,5604 510,5827 510,5846 510,5851 510,6568 510,6824 510,6955 510,6990 510,7050 510,7154 510,7572 510,7993 510,8017 510,8177 510,8209 510,9579 510,9742 510,13193 510,13207 510,13235 510,13524 510,14010 510,14095 510,14109 510,14134 510,14414 510,15431 510,15525 510,15566 510,15655 510,15704 510,16455 510,16576 510,16667 510,19599 510,19777 510,19907 510,20159 510,20261 510,20306 510,20310 510,20591 510,22304 510,23038 510,23314 510,23580 510,23626 510,23800 510,24686 510,24836 510,25476 510,25685 510,26051 510,26164 510,28112 510,28213 510,28464 510,28814 510,29008 510,29037 510,29375 510,29688 510,30373 510,31080 510,31085 510,31771 510,31802 510,32445 510,32929 510,32978 510,33087 510,33245 510,33333 510,33529 510,33539 510,33545 510,33636 510,34390 510,34416 510,34694 510,34906 510,35480 510,35636 510,36171 510,36591 510,36712 510,37328 510,38079 510,38300 510,38906 510,38909 510,38935 510,39618 510,40644 510,40691 510,41378 510,41435 510,41521 510,41523 510,41886 510,42549 510,44073 510,45538 510,47006 510,47007 510,47008 510,47009 510,47014 510,47021 510,47023 510,47025 510,47028 510,47031 510,47038 510,47049 510,47050 510,47956 510,47959 510,47961 510,47969 510,47972 510,47973 510,47976 510,47977 510,47978 510,47983 510,47985 510,47988 510,47990 510,47993 510,47994 510,47996 510,47998 510,47999 510,48000 510,48002 510,48505 510,49153 510,49193 510,49684 510,50346 510,50406 510,52410 510,52411 510,52413 510,52414 510,53233 510,53307 510,54363 510,55751 510,59990 510,65152 510,66381 510,66440 510,67936 510,69907 510,70969 510,71184 510,75785 510,75912 510,78932 510,86012 510,86474 510,87729 510,94129 510,94174 510,94309 510,94706 510,94817 510,96108 510,98135 510,100219 510,102729 510,102730 510,102756 510,103718 510,103738 510,106136 510,107020 510,108274 510,108754 510,109285 510,110610 510,110916 510,111305 510,111728 510,112392 510,112433 510,113077 510,113454 510,115479 510,115908 510,115912 510,115913 510,116083 510,118344 510,119743 510,121386 510,121994 510,123003 510,124549 510,124551 510,125548 510,125884 510,125885 510,125981 510,126028 510,127158 510,127932 510,130182 510,131867 510,131910 510,133167 510,134492 510,135233 510,136486 510,138178 510,141969 510,142541 510,145823 510,147064 510,147270 510,147814 510,150856 510,153178 510,154183 510,154682 510,154795 510,154927 510,157552 510,159769 510,162569 510,162599 510,163898 510,165250 510,165319 510,165324 510,165328 510,165331 510,165687 510,167619 510,168375 510,168388 510,169124 510,169899 510,169935 510,170055 510,170471 510,172251 510,177024 510,181389 510,181675 510,182880 510,183743 510,183853 510,185537 510,186368 510,188151 510,203010 510,203114 510,204256 510,207142 510,213182 510,216556 510,216568 510,219003 510,219004 510,219015 510,223991 510,226114 510,230509 510,230517 510,230790 510,235716 510,237505 510,238251 511,390 512,10 512,20 512,106 512,175 512,182 512,186 512,222 512,256 512,259 512,299 512,336 512,389 512,397 512,452 512,457 512,499 512,500 512,509 512,510 512,512 512,513 512,533 512,586 512,589 512,599 512,676 512,685 512,693 512,718 512,755 512,808 512,838 512,843 512,894 512,911 512,929 512,972 512,1087 512,1096 512,1118 512,1141 512,1149 512,1191 512,1417 512,1434 512,1531 512,1566 512,1696 512,1795 512,1848 512,1926 512,1992 512,2112 512,2167 512,2253 512,2382 512,2460 512,2874 512,3202 512,3972 512,4006 512,4028 512,4276 512,4466 512,5022 512,5193 512,5222 512,5226 512,5352 512,5422 512,5506 512,5641 512,6405 512,6432 512,6652 512,6695 512,6760 512,6837 512,6998 512,7731 512,7754 512,7769 512,7770 512,7771 512,7954 512,8116 512,9457 512,9736 512,10639 512,13205 512,14054 512,14098 512,14258 512,15454 512,15691 512,16128 512,16217 512,16285 512,16533 512,17573 512,18112 512,18133 512,18298 512,18330 512,18485 512,18498 512,19493 512,19561 512,19668 512,19776 512,20269 512,20272 512,21226 512,21283 512,21494 512,21997 512,22006 512,22046 512,22047 512,22072 512,22092 512,22108 512,22148 512,22245 512,22274 512,22319 512,23740 512,24262 512,25666 512,26031 512,26033 512,26126 512,26127 512,26312 512,26976 512,27175 512,27639 512,28152 512,28291 512,29165 512,29557 512,30318 512,31013 512,31021 512,31376 512,32498 512,32499 512,32501 512,32502 512,32838 512,33268 512,33552 512,34714 512,34832 512,35315 512,35473 512,35476 512,35477 512,35492 512,35495 512,35506 512,37002 512,37423 512,37435 512,37526 512,38302 512,38312 512,38322 512,38352 512,39285 512,39454 512,40455 512,40458 512,40580 512,41299 512,41337 512,42903 512,44064 512,44272 512,44828 512,44853 512,44859 512,45038 512,49373 512,51954 512,54306 512,54352 512,54371 512,54420 512,54481 512,54928 512,54963 512,56412 512,57065 512,59597 512,62748 512,62938 512,63591 512,63699 512,64469 512,64845 512,64847 512,65617 512,66243 512,71935 512,71991 512,76048 512,78902 512,80610 512,80611 512,80612 512,82608 512,82824 512,83224 512,83816 512,84494 512,85742 512,85752 512,86254 512,86445 512,86631 512,87327 512,88321 512,89574 512,90662 512,91170 512,91231 512,91394 512,92000 512,93032 512,93606 512,94046 512,94069 512,94722 512,97373 512,97392 512,98884 512,99532 512,99557 512,99763 512,101116 512,103689 512,103897 512,104378 512,104390 512,104913 512,105494 512,108452 512,110051 512,110063 512,111126 512,112222 512,114570 512,114613 512,116588 512,116614 512,116877 512,120961 512,121037 512,121529 512,124704 512,125006 512,126034 512,127638 512,127647 512,128708 512,128825 512,129802 512,131835 512,132854 512,133368 512,135270 512,145078 512,145390 512,146253 512,149318 512,151040 512,151989 512,152532 512,152766 512,153130 512,153230 512,154765 512,155003 512,156379 512,157721 512,158979 512,159341 512,159682 512,159689 512,159756 512,160319 512,161518 512,161550 512,165807 512,168258 512,169815 512,170648 512,170685 512,170691 512,174277 512,177772 512,178551 512,178702 512,179048 512,179194 512,179221 512,183268 512,185266 512,186681 512,188591 512,188606 512,188756 512,189251 512,189650 512,189696 512,189725 512,191784 512,193571 512,194312 512,194930 512,212897 512,215416 512,215831 512,217557 512,219803 512,219837 512,219858 512,219950 512,220341 512,221078 512,221744 512,223794 512,226183 512,228305 512,232629 512,233999 512,234182 512,234183 512,234186 512,234187 512,234188 512,234191 512,234193 512,234194 512,234195 512,234200 512,234201 512,235869 512,235870 512,236789 512,237313 512,238740 512,242246 512,243291 512,243493 512,245221 512,245380 512,245410 512,247084 512,247086 512,247148 512,247663 512,249050 512,250535 512,251280 512,255135 512,255728 512,255731 512,256160 512,257969 512,259415 512,259475 512,261925 512,262312 513,292 514,515 515,58 515,87 515,160 515,192 515,217 515,240 515,420 515,467 515,509 515,510 515,515 515,818 515,872 515,1033 515,1043 515,1147 515,1417 515,1449 515,1722 515,2292 515,2443 515,2889 515,3538 515,4039 515,6695 515,8180 516,20 516,63 516,68 516,97 516,192 516,202 516,203 516,240 516,251 516,252 516,314 516,316 516,318 516,397 516,406 516,435 516,440 516,452 516,457 516,465 516,467 516,493 516,516 516,517 516,538 516,586 516,599 516,622 516,673 516,733 516,766 516,779 516,794 516,818 516,838 516,841 516,920 516,1011 516,1014 516,1085 516,1118 516,1130 516,1175 516,1181 516,1220 516,1222 516,1243 516,1292 516,1329 516,1370 516,1417 516,1456 516,1512 516,1518 516,1531 516,1559 516,1566 516,1619 516,1655 516,1702 516,1796 516,1825 516,1844 516,1927 516,2173 516,2307 516,2400 516,2556 516,2726 516,3507 516,3529 516,3582 516,4159 516,4165 516,4273 516,4286 516,4491 516,5353 516,5472 516,5696 516,5901 516,5921 516,5992 516,6075 516,6904 516,7103 516,7186 516,7532 516,7952 516,8106 516,8125 516,8313 516,9107 516,13326 516,13464 516,13561 516,13657 516,13720 516,13771 516,13791 516,14150 516,15990 516,16010 516,16014 516,16507 516,16542 516,17884 516,18256 516,19545 516,20337 516,20419 516,20598 516,20757 516,20923 516,21779 516,22204 516,22205 516,24770 516,24934 516,25484 516,26179 516,26768 516,26889 516,27003 516,28789 516,29890 516,31971 516,32700 516,32787 516,33354 516,33432 516,37171 516,37472 516,38300 516,39994 516,41170 516,44416 516,46185 516,46270 516,47128 516,47152 516,47995 516,48119 516,48672 516,49161 516,49172 516,50609 516,51347 516,52207 516,52551 516,53157 516,54373 516,54741 516,54982 516,55663 516,56509 516,59098 516,62942 516,63081 516,64598 516,64851 516,65870 516,66450 516,67088 516,68040 516,68373 516,68816 516,70404 516,71200 516,71737 516,72644 516,74390 516,74447 516,76660 516,78825 516,79359 516,79484 516,79910 516,80651 516,81315 516,81711 516,82349 516,83434 516,83921 516,87803 516,87830 516,92881 516,93311 516,94366 516,94906 516,96700 516,96896 516,109302 516,110181 516,110728 516,112246 516,112433 516,113408 516,116535 516,118360 516,121198 516,123782 516,126036 516,127158 516,127338 516,128970 516,129836 516,134487 516,135904 516,144849 516,146115 516,148758 516,148840 516,152018 516,158616 516,163898 516,164225 516,167032 516,170804 516,170812 516,177500 516,177708 516,177904 516,183937 516,185084 516,187118 516,187283 516,189788 516,189794 516,189842 516,193314 516,196071 516,196137 516,201102 516,201922 516,202497 516,204280 516,204524 516,205081 516,214174 516,215276 516,216181 516,217693 516,217897 516,219894 516,222047 516,222429 516,226246 516,229364 516,230367 516,231754 516,231777 516,232131 516,234674 516,236864 516,248916 516,251255 516,254180 516,254630 516,256161 516,256495 516,258024 516,258103 516,258710 516,260372 516,264355 517,516 517,1655 518,37 518,102 518,106 518,186 518,292 518,304 518,372 518,408 518,431 518,444 518,518 518,519 518,534 518,567 518,615 518,626 518,693 518,775 518,911 518,1113 518,1133 518,1194 518,1262 518,1268 518,1323 518,1326 518,1411 518,1545 518,1599 518,1635 518,1732 518,1849 518,1879 518,1955 518,1973 518,2443 518,2509 518,2747 518,3048 518,3166 518,3193 518,3407 518,3504 518,3694 518,3718 518,3804 518,3940 518,4222 518,4600 518,5129 518,5130 518,5268 518,5385 518,5388 518,5400 518,5623 518,6396 518,6400 518,6470 518,6638 518,6853 518,6880 518,6904 518,7840 518,7959 518,7985 518,8088 518,8104 518,8276 518,9674 518,9681 518,13274 518,13399 518,13521 518,13580 518,14000 518,14572 518,14644 518,14754 518,15109 518,16151 518,17607 518,19367 518,20350 518,20663 518,22293 518,22440 518,23526 518,24924 518,25337 518,28786 518,31117 518,31301 518,31731 518,32516 518,34014 518,34739 518,34767 518,35095 518,35948 518,36601 518,36602 518,36981 518,37332 518,37476 518,38957 518,39232 518,43751 518,45823 518,46165 518,46796 518,47114 518,48006 518,48505 518,54504 518,56456 518,59231 518,63583 518,64130 518,68026 518,68027 518,68913 518,70165 518,70578 518,75264 518,76008 518,77109 518,79869 518,80009 518,80980 518,82685 518,82782 518,83218 518,84860 518,87871 518,88120 518,88355 518,90149 518,90347 518,101776 518,102186 518,103309 518,106976 518,110011 518,110763 518,113451 518,118318 518,121366 518,127645 518,128703 518,130700 518,133566 518,133984 518,136054 518,140631 518,140634 518,142916 518,150747 518,156540 518,158707 518,163805 518,165077 518,168327 518,169811 518,171367 518,176024 518,180339 518,182819 518,185414 518,185987 518,196693 518,221065 518,222613 518,225762 518,232222 518,242324 518,263406 520,518 521,415 522,167 522,390 522,745 522,783 522,1436 522,1544 522,3218 522,4411 522,5662 524,312 524,525 525,301 525,358 525,510 525,1973 525,3804 526,527 527,740 527,741 527,743 527,4810 527,8714 527,21059 527,95152 527,151861 528,151 528,299 528,832 528,1241 528,1319 529,83 529,233 529,3209 530,531 530,115511 532,187 533,292 534,10 534,41 534,46 534,58 534,298 534,314 534,390 534,397 534,406 534,417 534,431 534,444 534,452 534,457 534,535 534,573 534,589 534,599 534,604 534,631 534,632 534,676 534,677 534,720 534,784 534,821 534,849 534,862 534,968 534,1001 534,1010 534,1014 534,1085 534,1118 534,1119 534,1128 534,1195 534,1284 534,1445 534,1459 534,1462 534,1566 534,1572 534,1580 534,1796 534,1962 534,2008 534,2296 534,2512 534,2562 534,2572 534,2995 534,3833 534,3841 534,3925 534,3944 534,4022 534,4066 534,4222 534,4434 534,6068 534,6087 534,8261 534,8537 534,9346 534,13173 534,13358 534,13412 534,13524 534,14007 534,14011 534,14236 534,14319 534,15290 534,16141 534,17116 534,18463 534,18482 534,19061 534,19423 534,19560 534,20504 534,21742 534,26450 534,28832 534,29866 534,31756 534,32584 534,34876 534,34879 534,36633 534,36646 534,40936 534,42928 534,44725 534,45427 534,51972 534,54474 534,75912 534,121863 534,235807 535,10 535,126 535,202 535,207 535,240 535,248 535,292 535,299 535,336 535,338 535,392 535,397 535,441 535,452 535,455 535,457 535,467 535,479 535,534 535,535 535,536 535,592 535,604 535,631 535,676 535,693 535,733 535,801 535,808 535,818 535,843 535,849 535,868 535,872 535,900 535,911 535,918 535,919 535,972 535,1011 535,1058 535,1085 535,1118 535,1133 535,1151 535,1210 535,1240 535,1355 535,1417 535,1445 535,1453 535,1454 535,1533 535,1566 535,1572 535,1845 535,2418 535,2511 535,2512 535,3524 535,3582 535,3750 535,4125 535,4140 535,5213 535,5851 535,6452 535,6695 535,6904 535,7891 535,8241 535,8442 535,14147 535,14163 535,14727 535,15290 535,15609 535,15612 535,16362 535,16565 535,17116 535,18442 535,19413 535,19512 535,20757 535,20985 535,21184 535,22045 535,22168 535,23669 535,26385 535,26816 535,28348 535,31267 535,33650 535,33991 535,34876 535,37413 535,75912 535,76086 535,76971 535,82568 535,93711 535,109030 535,112439 535,127158 535,161637 535,173297 535,175313 535,223738 535,226454 535,227441 535,231613 535,232830 535,235544 535,236687 535,242354 535,248643 535,250754 535,258264 536,34 536,35 536,83 536,186 536,192 536,217 536,222 536,240 536,256 536,278 536,283 536,313 536,314 536,332 536,379 536,385 536,389 536,399 536,440 536,452 536,455 536,457 536,466 536,467 536,477 536,495 536,536 536,589 536,599 536,657 536,781 536,794 536,818 536,838 536,849 536,852 536,872 536,891 536,927 536,949 536,951 536,1001 536,1011 536,1014 536,1019 536,1072 536,1085 536,1118 536,1192 536,1201 536,1208 536,1274 536,1299 536,1417 536,1522 536,1566 536,1617 536,1724 536,1843 536,1844 536,1853 536,1860 536,1881 536,1916 536,2159 536,2235 536,2266 536,2290 536,2318 536,2319 536,2341 536,2373 536,2380 536,2441 536,2507 536,2553 536,2784 536,2821 536,2853 536,2944 536,2963 536,3016 536,3297 536,3836 536,3853 536,4030 536,4039 536,4048 536,4109 536,4570 536,4787 536,5208 536,5326 536,5458 536,6012 536,6064 536,6085 536,6526 536,6532 536,6754 536,6799 536,6904 536,6940 536,6955 536,6997 536,7346 536,7698 536,7766 536,7944 536,8535 536,8703 536,13198 536,13328 536,13389 536,13622 536,14094 536,14246 536,14346 536,14369 536,14612 536,14742 536,14993 536,15017 536,15197 536,15884 536,15892 536,15931 536,16051 536,16357 536,16639 536,16760 536,18142 536,18248 536,18337 536,18388 536,18831 536,18832 536,18865 536,19008 536,19509 536,19823 536,19834 536,20201 536,20399 536,20875 536,21015 536,21249 536,21488 536,21563 536,21583 536,22290 536,23052 536,23287 536,23407 536,23550 536,23839 536,24885 536,26056 536,26341 536,26905 536,28130 536,28140 536,28600 536,29357 536,29595 536,29938 536,29940 536,30502 536,30601 536,30617 536,30702 536,30709 536,30711 536,30721 536,30735 536,30736 536,31360 536,31675 536,31729 536,32347 536,32447 536,32820 536,33374 536,33376 536,34281 536,34283 536,34287 536,34363 536,34849 536,34864 536,35899 536,36815 536,36834 536,36849 536,36855 536,37065 536,37110 536,38030 536,38203 536,38251 536,38966 536,39480 536,39537 536,39561 536,39737 536,39841 536,40099 536,40669 536,40790 536,41025 536,41653 536,42742 536,43339 536,44787 536,44972 536,45267 536,46343 536,46748 536,48034 536,48082 536,48193 536,48208 536,48427 536,48527 536,49113 536,49262 536,49642 536,49655 536,50018 536,53525 536,53927 536,56040 536,56267 536,56584 536,57187 536,58048 536,59344 536,59705 536,59788 536,59793 536,59799 536,59805 536,59809 536,59810 536,59814 536,59819 536,59958 536,60557 536,60665 536,60752 536,61094 536,61121 536,62350 536,62383 536,62539 536,62600 536,63519 536,63615 536,64269 536,64714 536,65892 536,66123 536,66703 536,66765 536,66805 536,68227 536,68975 536,69882 536,71161 536,71181 536,73867 536,80201 536,80335 536,80425 536,82176 536,82351 536,82570 536,85998 536,86767 536,87372 536,90800 536,91146 536,91340 536,91417 536,91522 536,91828 536,91890 536,93249 536,96266 536,97326 536,97825 536,97987 536,99736 536,100984 536,102167 536,105669 536,105719 536,106104 536,106246 536,107194 536,107720 536,109059 536,109352 536,109681 536,109706 536,112580 536,112964 536,113124 536,113152 536,114166 536,114456 536,115389 536,115474 536,115503 536,116549 536,117213 536,117480 536,117780 536,117817 536,118168 536,118835 536,119581 536,119589 536,120061 536,120449 536,120759 536,121132 536,121149 536,121160 536,121751 536,122035 536,122127 536,122173 536,124368 536,124593 536,124604 536,124639 536,125162 536,125980 536,127158 536,128273 536,131359 536,132868 536,133452 536,134168 536,134249 536,134267 536,135040 536,136496 536,137274 536,138016 536,138372 536,138720 536,138877 536,139850 536,142036 536,142552 536,142573 536,143511 536,143513 536,144121 536,146093 536,147608 536,149115 536,149228 536,149463 536,150470 536,152685 536,155381 536,156700 536,156920 536,156936 536,156949 536,157487 536,157839 536,157907 536,158212 536,158246 536,160436 536,161994 536,163038 536,163444 536,163823 536,163880 536,163898 536,166094 536,169743 536,171933 536,172657 536,172723 536,173547 536,174464 536,175235 536,175738 536,177805 536,177839 536,177863 536,179716 536,180036 536,180150 536,180557 536,181063 536,181989 536,182379 536,182524 536,182558 536,182860 536,183765 536,185745 536,186193 536,186578 536,187909 536,187912 536,187915 536,188323 536,188410 536,188685 536,188711 536,188715 536,188717 536,188719 536,188726 536,189124 536,189185 536,189312 536,189329 536,189335 536,189336 536,189340 536,189346 536,189351 536,189363 536,189426 536,189574 536,190139 536,191943 536,192007 536,192214 536,192678 536,194605 536,194903 536,195154 536,198176 536,211922 536,215269 536,216390 536,216581 536,216739 536,216749 536,216754 536,217618 536,217626 536,217638 536,217643 536,217646 536,217656 536,217941 536,217945 536,217948 536,217951 536,217953 536,217957 536,217962 536,218006 536,218086 536,218088 536,218106 536,220936 536,221547 536,227377 536,228300 536,229004 536,229861 536,232679 536,232697 536,233631 536,233682 536,236051 536,237592 536,243077 536,243369 536,243547 536,245047 536,245993 536,247366 536,248055 536,248691 536,249055 536,250675 536,250783 536,251191 536,253979 536,256168 536,258720 536,259580 536,260786 536,263384 537,134 537,313 537,431 537,455 538,20 538,178 538,186 538,259 538,272 538,314 538,315 538,346 538,435 538,439 538,440 538,447 538,467 538,538 538,599 538,671 538,673 538,766 538,794 538,868 538,934 538,939 538,996 538,1033 538,1068 538,1130 538,1262 538,1294 538,1590 538,1611 538,1612 538,1619 538,1651 538,1877 538,1973 538,1987 538,2085 538,2094 538,2106 538,2353 538,2540 538,3626 538,3744 538,3900 538,4137 538,4455 538,4646 538,5461 538,5961 538,6422 538,6586 538,6622 538,6637 538,6648 538,6717 538,6765 538,8157 538,14232 538,14422 538,15563 538,17421 538,17422 538,17423 538,17425 538,17426 538,17432 538,18124 538,18249 538,19651 538,22221 538,25575 538,29116 538,29870 538,31206 538,32468 538,32569 538,35572 538,38393 538,38948 538,41378 538,41504 538,42166 538,42785 538,44243 538,48864 538,49381 538,52325 538,52437 538,54552 538,55105 538,55668 538,56008 538,58295 538,59020 538,61089 538,61670 538,63735 538,63943 538,63949 538,66250 538,67047 538,68373 538,81061 538,87141 538,89578 538,89752 538,93005 538,94287 538,96694 538,99055 538,99689 538,103272 538,103291 538,103772 538,114282 538,120052 538,120155 538,120826 538,121505 538,127872 538,128831 538,132436 538,133112 538,140902 538,141780 538,145088 538,145968 538,145979 538,146647 538,147496 538,154413 538,156379 538,163378 538,175970 538,176520 538,176628 538,179872 538,188523 538,190492 538,191330 538,222354 538,241266 538,252022 538,253099 538,261314 538,263304 539,104 539,134 539,135 539,137 540,541 542,543 544,34 544,35 544,222 544,545 544,4377 544,5342 544,5343 544,5899 544,16410 544,21900 544,28533 544,28959 544,40148 544,43789 544,44907 546,547 548,549 550,551 552,553 554,555 556,557 557,104 557,107 557,135 557,136 557,137 557,138 557,225 557,248 557,254 557,332 557,557 557,612 557,636 557,685 557,715 557,784 557,850 557,852 557,953 557,954 557,1262 557,1282 557,1332 557,1368 557,1415 557,1572 557,1585 557,1690 557,1844 557,1939 557,1962 557,2105 557,2237 557,2600 557,2701 557,2794 557,2934 557,3473 557,3930 557,4276 557,4674 557,5307 557,5405 557,5622 557,5830 557,6023 557,6136 557,6455 557,6530 557,6674 557,7757 557,10318 557,13207 557,13530 557,14196 557,15782 557,15984 557,16321 557,16552 557,17214 557,17217 557,17935 557,18673 557,18965 557,20717 557,20741 557,22405 557,23611 557,23654 557,24739 557,24774 557,25015 557,25338 557,25520 557,26293 557,26842 557,28191 557,28194 557,29946 557,31334 557,32313 557,32459 557,32778 557,35614 557,38822 557,40220 557,40259 557,46874 557,48349 557,48599 557,49526 557,49663 557,50269 557,54307 557,54477 557,56310 557,56529 557,56659 557,57235 557,58715 557,59792 557,60095 557,60672 557,63744 557,66301 557,72017 557,74387 557,74417 557,75045 557,76764 557,76939 557,80156 557,90903 557,98218 557,117741 557,118260 557,119105 557,127804 557,130466 557,131339 557,134270 557,134281 557,138067 557,138675 557,138676 557,138680 557,138681 557,138684 557,138685 557,140005 557,142335 557,146467 557,148500 557,157206 557,158257 557,158579 557,159616 557,160720 557,162750 557,163014 557,163017 557,163756 557,164287 557,165399 557,165432 557,166402 557,167581 557,167746 557,167799 557,168935 557,169440 557,169598 557,172272 557,173786 557,173967 557,174457 557,176432 557,176442 557,176448 557,176518 557,176531 557,176532 557,176765 557,176768 557,176982 557,177025 557,178808 557,179250 557,179353 557,180309 557,185299 557,190276 558,559 560,561 562,10 562,44 562,50 562,56 562,79 562,146 562,147 562,158 562,178 562,182 562,192 562,195 562,206 562,222 562,256 562,285 562,333 562,406 562,422 562,434 562,435 562,439 562,447 562,535 562,538 562,563 562,585 562,602 562,620 562,622 562,638 562,640 562,671 562,704 562,766 562,779 562,841 562,920 562,939 562,972 562,1089 562,1181 562,1230 562,1247 562,1285 562,1294 562,1366 562,1414 562,1425 562,1464 562,1502 562,1515 562,1568 562,1619 562,1623 562,1651 562,1773 562,1825 562,1844 562,1905 562,1906 562,1909 562,1910 562,1995 562,2085 562,2094 562,2102 562,2132 562,2161 562,2244 562,2352 562,2374 562,2880 562,2903 562,2931 562,3241 562,3370 562,3449 562,3994 562,4310 562,4324 562,4646 562,5100 562,5357 562,5495 562,5874 562,6119 562,6531 562,6586 562,6622 562,6680 562,7532 562,7794 562,8067 562,8244 562,8270 562,8426 562,8477 562,8771 562,8868 562,9171 562,9371 562,9394 562,12724 562,13270 562,13464 562,13687 562,14226 562,14433 562,14453 562,14637 562,15330 562,15980 562,17151 562,17166 562,17421 562,17422 562,17423 562,17424 562,17425 562,17426 562,17427 562,17428 562,17429 562,17430 562,17431 562,17432 562,18640 562,18997 562,19025 562,20540 562,21487 562,21528 562,21687 562,24648 562,24783 562,25348 562,26972 562,27495 562,29649 562,31094 562,31582 562,31585 562,31994 562,32168 562,32724 562,33991 562,34554 562,35614 562,36350 562,36408 562,36409 562,36410 562,36411 562,36412 562,36413 562,36414 562,36415 562,36416 562,36417 562,36418 562,36419 562,36420 562,36421 562,36422 562,36423 562,36424 562,36425 562,36426 562,36427 562,36428 562,36429 562,36430 562,36431 562,36432 562,36433 562,36434 562,36435 562,36436 562,36437 562,36438 562,36439 562,36440 562,36441 562,36442 562,36443 562,36444 562,36445 562,36446 562,36447 562,36448 562,36449 562,36450 562,36451 562,36452 562,36453 562,36454 562,36455 562,36456 562,36457 562,36458 562,36459 562,36460 562,36461 562,36462 562,36463 562,36464 562,36465 562,36466 562,36467 562,36468 562,36469 562,36470 562,36471 562,36472 562,36473 562,36474 562,36475 562,36476 562,36477 562,36478 562,36479 562,36480 562,36481 562,36482 562,36483 562,36484 562,36485 562,36486 562,36487 562,36488 562,36489 562,36490 562,36491 562,36492 562,36493 562,36494 562,36495 562,36496 562,36497 562,36498 562,36499 562,36500 562,36501 562,36502 562,36503 562,36504 562,36505 562,36506 562,36507 562,36508 562,36509 562,36510 562,36511 562,36512 562,36513 562,36514 562,36515 562,36516 562,36517 562,36518 562,36519 562,36520 562,36521 562,36522 562,36523 562,36524 562,36525 562,36526 562,36527 562,36528 562,36529 562,36530 562,36531 562,36532 562,36533 562,36534 562,36535 562,36536 562,36537 562,36538 562,36539 562,36540 562,36542 562,36543 562,36544 562,36545 562,36546 562,36547 562,36548 562,36549 562,36550 562,36551 562,36552 562,36553 562,36554 562,36555 562,36556 562,36557 562,36558 562,36559 562,36560 562,36561 562,36562 562,36563 562,36564 562,36565 562,36566 562,43613 562,92476 563,86 563,97 563,167 563,255 563,256 563,301 563,356 563,446 563,450 563,563 563,567 563,609 563,668 563,693 563,750 563,818 563,904 563,941 563,972 563,1118 563,1133 563,1284 563,1298 563,1522 563,1559 563,1837 563,2372 563,2373 563,2513 563,3003 563,3666 563,3667 563,14633 563,19441 563,22174 563,26876 563,28201 563,30328 563,30390 563,31595 563,34724 563,35517 563,41160 563,44716 563,67995 563,72726 563,82119 563,91234 563,96680 563,98873 563,101757 563,103081 563,103891 563,104427 563,104549 563,109933 563,134085 563,171223 563,179752 563,192430 563,193496 563,220057 563,226496 563,261803 564,10 564,565 564,1190 566,10 566,52 566,175 566,693 566,177483 567,37 567,46 567,192 567,256 567,301 567,444 567,452 567,457 567,481 567,505 567,518 567,563 567,567 567,604 567,605 567,615 567,663 567,664 567,665 567,668 567,676 567,698 567,717 567,762 567,783 567,812 567,849 567,877 567,900 567,937 567,941 567,968 567,972 567,1026 567,1160 567,1167 567,1231 567,1284 567,1293 567,1300 567,1436 567,1544 567,1564 567,1740 567,1782 567,1837 567,2217 567,2372 567,2557 567,2595 567,2979 567,3392 567,3422 567,3564 567,3582 567,3756 567,3900 567,4190 567,5213 567,5540 567,5662 567,6552 567,7031 567,7986 567,9340 567,9457 567,13418 567,13991 567,14311 567,14674 567,15633 567,18093 567,18162 567,18526 567,22168 567,23597 567,24612 567,24615 567,24802 567,25243 567,25273 567,25282 567,29579 567,33479 567,34129 567,35505 567,36745 567,37679 567,38082 567,38349 567,39730 567,39930 567,41198 567,41821 567,42789 567,45195 567,46996 567,48017 567,62439 567,63491 567,79942 567,82206 567,90254 567,94845 567,102695 567,103860 567,104246 567,107521 567,112033 567,112950 567,118843 567,119808 567,121954 567,130442 567,133593 567,134098 567,142479 567,145952 567,165363 567,166328 567,168756 567,186622 567,211904 567,216540 567,221730 567,245950 567,249717 567,255572 567,263043 568,444 569,301 569,444 569,459 569,968 570,571 571,79 571,252 571,272 571,278 571,302 571,349 571,388 571,392 571,422 571,432 571,433 571,434 571,435 571,516 571,536 571,571 571,689 571,765 571,868 571,1010 571,1210 571,1264 571,1326 571,1373 571,1401 571,1494 571,1568 571,1693 571,1837 571,1968 571,2094 571,2400 571,2470 571,2567 571,2585 571,2840 571,3241 571,3866 571,4205 571,4455 571,6470 571,6742 571,6760 571,6761 571,6925 571,7897 571,8576 571,8606 571,9527 571,13130 571,13188 571,13233 571,13260 571,13320 571,13430 571,13519 571,14064 571,14158 571,14304 571,15525 571,16500 571,16638 571,18110 571,18200 571,18201 571,18202 571,18203 571,18204 571,18205 571,18206 571,18207 571,18208 571,18209 571,18210 571,18211 571,18212 571,18213 571,18214 571,18215 571,18216 571,18217 571,18218 571,18219 571,18220 571,18221 571,18222 571,18223 571,18224 571,18225 571,18226 571,18227 571,18228 571,18229 571,18230 571,18231 571,18232 571,18233 571,18234 571,18235 571,18236 571,18237 571,18238 571,18239 571,18240 571,18241 571,18242 571,18243 571,18244 571,18245 571,18246 571,18247 571,18248 571,18249 571,18250 571,18251 571,18252 571,18253 571,18254 571,18255 571,18256 571,18257 571,18258 571,18259 571,18260 571,18261 571,18262 571,18263 571,18264 571,18265 571,18266 571,18267 571,18268 571,18269 571,18270 571,18271 571,18272 571,18273 571,18274 571,18275 571,18276 571,18277 571,18278 571,18279 571,18280 571,18281 571,18282 571,18283 571,18284 571,18285 571,18286 571,18287 571,18288 571,18289 571,18290 571,18291 571,18292 571,18293 571,18294 571,18295 571,18296 571,18301 571,18302 571,18303 571,18304 571,18305 571,18306 571,18307 571,18308 571,18309 571,18310 571,18311 571,18312 571,18314 571,18315 571,18316 571,18317 571,18318 571,18319 571,18321 571,18322 571,18323 571,18324 571,18325 571,18326 571,18329 571,18331 571,18332 571,18333 571,18334 571,18335 571,18336 571,18350 571,18354 571,18356 571,18357 571,18358 571,18359 571,18360 571,18361 571,18362 571,18363 571,18364 571,18365 571,18366 571,18367 571,18368 571,18369 571,18370 571,18371 571,18372 571,18373 571,18374 571,18375 571,18376 571,18377 571,18378 571,18380 571,18381 571,18382 571,18383 571,18384 571,18385 571,18387 571,18388 571,18389 571,18390 571,18391 571,18392 571,18393 571,18395 571,18396 571,18397 571,18398 571,18399 571,18400 571,18401 571,18403 571,18404 571,18405 571,18406 571,18411 571,18412 571,18413 571,18414 571,18418 571,18419 571,18420 571,18421 571,18423 571,18430 571,18431 571,18432 571,18433 571,18436 571,18437 571,18438 571,18731 571,21409 571,23296 571,23643 571,29102 571,33991 571,35004 571,36643 571,36671 571,36679 571,36682 571,36683 571,36729 571,36789 571,36939 571,37572 571,37900 571,38432 571,41170 571,43366 571,44933 571,48413 571,57800 571,58420 571,62172 571,63184 571,63568 571,64069 571,64637 571,66507 571,68627 571,69947 571,70169 571,70205 571,70847 571,71647 571,71649 571,75315 571,85771 571,85772 571,85773 571,85774 571,85979 571,109343 571,109353 571,109355 571,110075 571,116399 571,117889 571,118454 571,124386 571,130248 571,137412 571,137552 571,137681 571,143466 571,143468 571,154791 571,156601 571,156602 571,156603 571,156604 571,156605 571,156606 571,156607 571,156608 571,156609 571,156610 571,156611 571,156612 571,156613 571,156619 571,156624 571,160897 571,161942 571,162599 571,163320 571,163321 571,164220 571,164224 571,165879 571,167043 571,172727 571,173878 571,176086 571,177246 571,180347 571,186555 571,189196 571,207035 571,214077 571,223822 571,223854 571,223860 571,227013 571,232714 571,251470 571,258355 571,260281 571,260282 571,260283 571,260291 572,104 572,111 572,312 572,372 572,441 572,442 572,518 572,631 572,676 572,714 572,720 572,801 572,805 572,1014 572,1140 572,1287 572,1659 572,2443 572,3474 572,3507 572,4771 572,5547 573,41 573,137 573,390 573,534 573,535 573,573 573,588 573,589 573,590 573,626 573,784 573,862 573,966 573,1119 573,1192 573,1195 573,1505 573,1580 573,2296 573,2490 573,2572 573,2747 573,4222 573,5340 573,5614 573,5828 573,5981 573,6000 573,6001 573,6692 573,7194 573,13198 573,15622 573,16175 573,16245 573,16510 573,20592 573,26130 573,26475 573,27132 573,29595 573,29872 573,30376 573,31106 573,32526 573,34055 573,36429 573,36761 573,37171 573,42841 573,50494 573,50857 573,55713 573,63906 573,72563 573,75912 573,82768 573,84658 573,87324 573,87715 573,87891 573,90906 573,90937 573,94127 573,94202 573,94338 573,98263 573,98925 573,105327 573,107024 573,115699 573,119265 573,131045 573,131252 573,131386 573,134576 573,137209 573,138127 573,139760 573,139963 573,140175 573,141858 573,142741 573,147394 573,168973 573,168992 573,169040 573,192924 573,192925 573,192926 573,221293 573,243391 573,243556 574,575 575,87 575,256 575,599 575,685 575,852 575,875 575,1043 575,1732 575,1973 575,2253 575,2775 576,577 577,259 577,272 577,393 577,397 577,439 577,446 577,577 577,676 577,685 577,715 577,726 577,788 577,818 577,852 577,859 577,863 577,902 577,980 577,1011 577,1014 577,1070 577,1105 577,1130 577,1208 577,1417 577,1429 577,1474 577,1531 577,1566 577,2049 577,2110 577,2178 577,2307 577,2362 577,3490 577,3514 577,3669 577,3937 577,3938 577,4091 577,4137 577,4159 577,4297 577,4299 577,4380 577,4545 577,4667 577,4692 577,5128 577,5241 577,5279 577,5690 577,5809 577,6381 577,6475 577,6477 577,6795 577,6796 577,6932 577,7076 577,7091 577,7125 577,7468 577,7944 577,8250 577,8397 577,9579 577,9614 577,13332 577,13466 577,13566 577,14089 577,14202 577,14232 577,14358 577,16669 577,17116 577,17563 577,18436 577,18445 577,18502 577,18658 577,18769 577,18807 577,19278 577,19279 577,19693 577,20686 577,20862 577,21286 577,21769 577,22835 577,23045 577,23236 577,24533 577,24934 577,26034 577,26233 577,26489 577,26778 577,26786 577,28010 577,28312 577,29963 577,30556 577,32366 577,33728 577,33985 577,37737 577,40720 577,41316 577,41402 577,41671 577,43443 577,44406 577,45213 577,47131 577,48078 577,48280 577,50690 577,51948 577,54186 577,54493 577,55174 577,56150 577,56316 577,56423 577,56544 577,57143 577,57861 577,59062 577,59636 577,60777 577,63200 577,63518 577,64767 577,65725 577,66543 577,67395 577,70443 577,71108 577,72100 577,74454 577,75279 577,75295 577,76174 577,78029 577,79003 577,79186 577,79367 577,79474 577,79591 577,80111 577,81142 577,81786 577,83695 577,84180 577,84465 577,84474 577,85460 577,87887 577,89341 577,89449 577,89558 577,90081 577,93498 577,93758 577,102585 577,102766 577,106868 577,107603 577,109352 577,110624 577,112433 577,113943 577,114282 577,117480 577,122101 577,124972 577,125899 577,126735 577,127158 577,127299 577,129823 577,129951 577,130943 577,133194 577,133387 577,133402 577,134290 577,134360 577,135086 577,135087 577,138280 577,138686 577,138833 577,139010 577,143358 577,143376 577,143479 577,144806 577,145399 577,145884 577,145887 577,146464 577,146545 577,146763 577,148307 577,148311 577,148865 577,150079 577,150403 577,151463 577,152419 577,152448 577,152818 577,155309 577,156165 577,156911 577,157585 577,158334 577,158453 577,161054 577,162605 577,166264 577,169024 577,169524 577,169527 577,169541 577,171561 577,174142 577,174645 577,175295 577,176020 577,180030 577,182004 577,182479 577,182839 577,183021 577,183056 577,183411 577,183658 577,185550 577,186243 577,186746 577,186776 577,186881 577,186902 577,187190 577,188123 577,190496 577,190756 577,192522 577,192769 577,193107 577,193154 577,193578 577,194578 577,200665 577,200832 577,203810 577,205917 577,206405 577,212174 577,212533 577,212955 577,213841 577,213960 577,215879 577,216427 577,216641 577,218905 577,219151 577,221230 577,221973 577,222367 577,225490 577,226421 577,226445 577,227041 577,228435 577,228661 577,229107 577,231024 577,231063 577,231958 577,232144 577,234705 577,234752 577,236129 577,236323 577,237668 577,238485 577,238790 577,239896 577,240909 577,240942 577,241951 577,243649 577,243977 577,244309 577,249318 577,251537 577,251582 577,253409 577,259028 577,261181 577,262665 578,147 578,579 579,326 579,589 579,599 579,2373 580,107 580,130 580,149 580,250 580,305 580,338 580,581 580,852 580,934 580,972 580,1381 580,1449 580,2244 580,9457 581,397 581,481 581,581 581,591 581,668 581,713 581,843 581,911 581,1524 581,1614 581,2513 581,2604 581,3967 581,4178 581,4186 581,6991 581,8044 581,10548 581,14273 581,16459 581,17497 581,19413 581,25282 581,34092 581,37787 581,45025 581,64736 581,66246 581,75786 581,87699 581,93720 581,103901 581,112954 581,163919 581,164571 581,175335 581,176360 581,176406 581,205769 581,207006 581,207456 581,246790 582,583 583,3538 584,50 584,79 584,393 584,406 584,493 584,585 584,586 584,592 584,704 584,1265 584,1266 584,1433 585,1521 585,2752 586,106 586,107 586,240 586,333 586,337 586,402 586,505 586,512 586,516 586,586 586,587 586,637 586,638 586,663 586,664 586,779 586,818 586,847 586,1027 586,1149 586,1370 586,1566 586,1821 586,1985 586,2560 586,2782 586,3202 586,4200 586,4315 586,4466 586,5311 586,5691 586,5713 586,6813 586,8157 586,8867 586,9686 586,15479 586,18327 586,18695 586,19287 586,19504 586,19585 586,19665 586,20418 586,20731 586,20956 586,21528 586,23517 586,24775 586,26181 586,26795 586,29747 586,31094 586,34065 586,34696 586,34728 586,34905 586,36788 586,38271 586,38433 586,45052 586,46874 586,48053 586,50123 586,52433 586,52453 586,54871 586,55014 586,55692 586,56209 586,56463 586,56885 586,59021 586,60576 586,60701 586,61053 586,61354 586,61985 586,62610 586,63012 586,64102 586,65640 586,67319 586,67750 586,71027 586,71582 586,79473 586,86255 586,86400 586,86421 586,86477 586,92846 586,99949 586,101653 586,104249 586,104456 586,104876 586,104913 586,105494 586,105640 586,106276 586,108018 586,109427 586,112099 586,112398 586,112633 586,113211 586,113461 586,113477 586,114240 586,114484 586,114840 586,115479 586,116456 586,117761 586,120155 586,122124 586,127158 586,130180 586,133460 586,140842 586,147079 586,147536 586,148006 586,148848 586,148849 586,162405 586,163798 586,170706 586,170726 586,172381 586,172525 586,173344 586,174389 586,175207 586,175483 586,176322 586,180233 586,182394 586,188594 586,188670 586,190720 586,206918 586,207015 586,221900 586,221932 586,227326 586,228140 586,234949 586,238410 586,244689 586,249346 586,249816 586,256165 586,257503 586,263069 587,586 588,588 588,590 589,34 589,35 589,58 589,167 589,272 589,287 589,298 589,301 589,313 589,390 589,417 589,512 589,534 589,536 589,573 589,579 589,589 589,612 589,631 589,693 589,765 589,775 589,782 589,784 589,788 589,795 589,838 589,862 589,894 589,968 589,992 589,1001 589,1011 589,1026 589,1085 589,1093 589,1133 589,1241 589,1276 589,1284 589,1409 589,1459 589,1522 589,1531 589,1544 589,1566 589,1580 589,1853 589,2083 589,2228 589,2646 589,2995 589,3093 589,3094 589,3101 589,3497 589,3623 589,4222 589,5091 589,5154 589,5186 589,5677 589,5961 589,6068 589,6394 589,6474 589,7388 589,8107 589,8152 589,8196 589,8435 589,9457 589,11952 589,13432 589,13524 589,14106 589,14311 589,14357 589,14413 589,15109 589,15873 589,16192 589,16524 589,16667 589,16955 589,17903 589,18558 589,19525 589,19592 589,19769 589,20519 589,21742 589,22032 589,22103 589,22274 589,22844 589,27041 589,28375 589,31741 589,31794 589,35458 589,36957 589,41211 589,41736 589,42841 589,44830 589,46717 589,48298 589,49733 589,53733 589,54510 589,64197 589,64525 589,73248 589,73307 589,74672 589,75912 589,80268 589,80459 589,80932 589,80981 589,84181 589,87288 589,88427 589,88515 589,90310 589,91815 589,95006 589,97300 589,103409 589,107428 589,108063 589,110634 589,111088 589,111764 589,121863 589,126773 589,136182 589,139061 589,141073 589,156349 589,159013 589,163856 589,164811 589,165157 589,168282 589,168283 589,168357 589,168360 589,169366 589,171053 589,177057 589,178602 589,185133 589,185874 589,204973 589,221178 589,224031 589,233324 589,241500 589,243115 589,247938 589,255435 589,255436 589,255539 589,258656 590,41 590,68 590,104 590,120 590,134 590,215 590,289 590,290 590,298 590,301 590,372 590,425 590,588 590,590 590,631 590,640 590,694 590,704 590,714 590,760 590,784 590,805 590,838 590,1011 590,1016 590,1085 590,1118 590,1119 590,1177 590,1192 590,1204 590,1282 590,1402 590,1419 590,1462 590,1466 590,1506 590,1608 590,1631 590,1796 590,1818 590,1973 590,2205 590,2253 590,2620 590,2989 590,2991 590,3507 590,4237 590,4355 590,5718 590,8537 590,22482 590,33424 590,44725 590,75912 590,88820 590,127158 590,182162 590,185877 590,232709 590,237709 590,261099 590,261163 591,581 592,289 592,592 592,704 592,818 592,1011 592,1085 592,1402 592,1403 592,1818 592,2252 592,2286 592,2296 592,2909 592,2982 592,3028 592,3069 592,3937 592,4062 592,4596 592,5278 592,5626 592,6643 592,8763 592,13281 592,13294 592,13506 592,13569 592,14261 592,14376 592,14554 592,15362 592,15882 592,17867 592,17875 592,18464 592,18603 592,18621 592,23421 592,25029 592,26789 592,27888 592,29175 592,32734 592,32770 592,32858 592,33557 592,33707 592,34344 592,35070 592,35378 592,36759 592,36801 592,37497 592,38142 592,39009 592,41865 592,43208 592,43364 592,43992 592,44215 592,46602 592,47810 592,48186 592,49389 592,50226 592,50910 592,51000 592,51560 592,52052 592,52266 592,52819 592,54570 592,55154 592,55678 592,56442 592,56782 592,62386 592,63066 592,64254 592,75912 592,78428 592,81184 592,86671 592,87115 592,87234 592,87262 592,87332 592,87774 592,91399 592,93067 592,93258 592,94134 592,103085 592,104011 592,107998 592,108993 592,111490 592,113433 592,114229 592,114848 592,116526 592,116611 592,116622 592,116669 592,117025 592,117711 592,120132 592,122451 592,124867 592,127158 592,128270 592,128325 592,130904 592,132927 592,134822 592,135138 592,138795 592,140095 592,140838 592,146300 592,146773 592,146778 592,146793 592,146807 592,146809 592,147874 592,149632 592,156640 592,157631 592,159352 592,159692 592,160854 592,160924 592,163522 592,163739 592,164064 592,165066 592,165803 592,166294 592,167312 592,167357 592,168175 592,168875 592,169015 592,169018 592,169135 592,169538 592,170912 592,174400 592,175289 592,176670 592,188226 592,188867 592,194067 592,196741 592,201767 592,214262 592,214336 592,214673 592,215433 592,215647 592,219897 592,226485 592,231085 592,231125 592,231128 592,231129 592,231131 592,231135 592,231136 592,231140 592,231141 592,231145 592,231148 592,231181 592,232896 592,235643 592,236106 592,238320 592,238343 592,238680 592,238924 592,238998 592,239947 592,239960 592,239971 592,240023 592,241585 592,241646 592,242250 592,243564 592,244774 592,254221 592,255514 592,256189 592,260656 592,261418 592,261658 592,262042 592,262494 592,262726 592,263197 592,264771 593,483 594,595 595,10 595,87 595,292 595,314 595,509 595,510 595,595 595,673 595,852 595,872 595,996 595,1011 595,1572 595,1722 595,1973 595,2373 595,3367 595,3538 595,13599 596,104 596,111 596,328 596,557 596,596 596,597 596,600 596,617 596,715 596,772 596,784 596,1052 596,1085 596,1131 596,1132 596,1140 596,1146 596,1209 596,1367 596,1368 596,1429 596,1973 596,2416 596,2417 596,2543 596,2547 596,2565 596,2596 596,2658 596,2814 596,3473 596,3504 596,3565 596,3759 596,4419 596,4520 596,4725 596,4771 596,5137 596,5279 596,5391 596,6023 596,6068 596,6433 596,7003 596,7458 596,7731 596,13132 596,13307 596,13541 596,13626 596,14473 596,15344 596,15500 596,15506 596,15515 596,15577 596,15658 596,15663 596,15747 596,16417 596,16520 596,18353 596,18511 596,19708 596,20858 596,21349 596,21382 596,22677 596,22835 596,23573 596,23863 596,25394 596,25452 596,26262 596,26857 596,28203 596,29841 596,30031 596,30527 596,32329 596,32504 596,33418 596,33567 596,34015 596,34917 596,34918 596,34919 596,35530 596,36413 596,38144 596,38394 596,38787 596,40053 596,41358 596,43151 596,46255 596,46841 596,48898 596,49802 596,49879 596,50890 596,52347 596,54121 596,54271 596,57143 596,60095 596,61902 596,63639 596,64543 596,65896 596,66348 596,74455 596,75912 596,79742 596,80004 596,80567 596,82687 596,83432 596,84019 596,84565 596,84566 596,84567 596,84568 596,85814 596,86039 596,86750 596,86866 596,87707 596,87883 596,87947 596,89400 596,89585 596,91424 596,91942 596,93109 596,98925 596,103216 596,103895 596,105561 596,105565 596,106152 596,106445 596,107234 596,109712 596,112686 596,116143 596,117318 596,117369 596,119153 596,119864 596,119877 596,119921 596,121863 596,122571 596,124186 596,124188 596,124268 596,124378 596,128242 596,128777 596,128786 596,128795 596,128972 596,129024 596,137126 596,137135 596,137799 596,139583 596,139782 596,140313 596,140788 596,140794 596,140941 596,141141 596,143136 596,143634 596,144070 596,144080 596,146814 596,149707 596,150675 596,154394 596,158300 596,159125 596,160105 596,161977 596,162435 596,165216 596,168874 596,169161 596,169646 596,169648 596,169649 596,169907 596,171753 596,172514 596,173783 596,174322 596,174999 596,175639 596,176803 596,177115 596,177134 596,179099 596,184726 596,185687 596,186524 596,186875 596,187410 596,187878 596,188564 596,188999 596,190799 596,191227 596,191302 596,191433 596,192769 596,193052 596,193068 596,193083 596,193452 596,193471 596,193537 596,194986 596,195023 596,195117 596,195119 596,197584 596,197807 596,197812 596,199218 596,200492 596,201532 596,202031 596,203804 596,204201 596,205249 596,205675 596,206453 596,207083 596,207142 596,207536 596,212107 596,212334 596,213049 596,213057 596,213399 596,215202 596,219225 596,219815 596,219819 596,223798 596,224081 596,224159 596,224168 596,224214 596,224368 596,224371 596,224448 596,224569 596,224597 596,224606 596,224734 596,225498 596,225921 596,225967 596,227496 596,227506 596,227507 596,229086 596,231555 596,231819 596,231845 596,233822 596,236033 596,236075 596,238252 596,238260 596,238276 596,238772 596,241247 596,241708 596,243084 596,245091 596,246484 596,247188 596,247190 596,247767 596,247788 596,248007 596,248009 596,248013 596,248029 596,248052 596,248400 596,248538 596,249229 596,249884 596,250251 596,255939 596,256335 596,256423 596,256427 596,257781 596,257782 596,258530 596,259722 596,260882 596,261264 596,261333 596,264745 598,264 598,304 598,599 598,1551 598,5308 599,11 599,20 599,22 599,34 599,35 599,41 599,65 599,68 599,83 599,104 599,106 599,140 599,149 599,158 599,167 599,182 599,186 599,192 599,202 599,203 599,207 599,209 599,215 599,222 599,225 599,240 599,248 599,252 599,259 599,261 599,264 599,275 599,278 599,287 599,299 599,301 599,302 599,313 599,314 599,318 599,333 599,336 599,349 599,356 599,360 599,372 599,379 599,391 599,392 599,393 599,397 599,406 599,408 599,417 599,433 599,439 599,441 599,442 599,455 599,467 599,493 599,510 599,512 599,516 599,534 599,536 599,538 599,599 599,604 599,622 599,631 599,676 599,682 599,690 599,693 599,697 599,710 599,712 599,714 599,752 599,764 599,765 599,775 599,779 599,801 599,809 599,811 599,818 599,838 599,843 599,852 599,861 599,868 599,872 599,873 599,900 599,911 599,918 599,920 599,949 599,968 599,972 599,980 599,1001 599,1010 599,1023 599,1033 599,1085 599,1118 599,1122 599,1130 599,1133 599,1140 599,1147 599,1151 599,1167 599,1172 599,1204 599,1210 599,1220 599,1222 599,1231 599,1235 599,1240 599,1241 599,1267 599,1282 599,1285 599,1289 599,1293 599,1294 599,1298 599,1309 599,1326 599,1332 599,1335 599,1345 599,1353 599,1363 599,1370 599,1381 599,1402 599,1411 599,1417 599,1445 599,1454 599,1462 599,1505 599,1509 599,1518 599,1522 599,1531 599,1556 599,1590 599,1634 599,1655 599,1663 599,1724 599,1782 599,1796 599,1805 599,1836 599,1837 599,1844 599,1893 599,1955 599,1989 599,1992 599,2008 599,2037 599,2083 599,2334 599,2373 599,2400 599,2512 599,2605 599,2646 599,2699 599,2979 599,3166 599,3193 599,3260 599,3392 599,3414 599,3422 599,3474 599,3804 599,3999 599,4039 599,4114 599,4140 599,4153 599,4276 599,4286 599,4514 599,4545 599,4637 599,4672 599,5388 599,5961 599,6837 599,6867 599,6904 599,7432 599,8055 599,8342 599,8463 599,8537 599,9028 599,9561 599,9698 599,13207 599,13229 599,13385 599,14104 599,14411 599,15838 599,15931 599,18129 599,18168 599,20382 599,20803 599,21173 599,22380 599,23437 599,23626 599,24676 599,24732 599,25553 599,26034 599,28911 599,30502 599,30551 599,37204 599,38135 599,41170 599,41230 599,41791 599,42727 599,44095 599,50316 599,52361 599,56520 599,59815 599,63069 599,64055 599,64570 599,67250 599,70987 599,72439 599,74696 599,75912 599,80483 599,88017 599,93729 599,98327 599,98785 599,99180 599,104407 599,108112 599,111422 599,112475 599,113931 599,113972 599,114620 599,115127 599,115155 599,115474 599,117994 599,118336 599,122439 599,124965 599,136724 599,138098 599,142866 599,151433 599,167089 599,180405 599,181800 599,183835 599,185422 600,596 601,79 601,192 601,30331 602,1 602,56 602,79 602,99 602,146 602,147 602,175 602,192 602,195 602,285 602,314 602,325 602,333 602,336 602,337 602,406 602,422 602,505 602,602 602,603 602,607 602,620 602,622 602,633 602,638 602,645 602,695 602,700 602,701 602,779 602,841 602,848 602,849 602,920 602,1089 602,1181 602,1218 602,1417 602,1425 602,1430 602,1469 602,1515 602,1560 602,1569 602,1582 602,1601 602,1619 602,1623 602,1786 602,1803 602,1825 602,1849 602,1993 602,2132 602,2244 602,2251 602,2325 602,2485 602,3218 602,3468 602,3895 602,3991 602,4447 602,4866 602,5073 602,5133 602,5495 602,5682 602,6119 602,6557 602,6619 602,6684 602,6719 602,6806 602,7241 602,7296 602,7736 602,7744 602,7968 602,8244 602,8854 602,9136 602,9394 602,12112 602,14046 602,14153 602,14433 602,15099 602,15795 602,16215 602,16995 602,17041 602,17084 602,18770 602,18919 602,18997 602,20315 602,21194 602,21442 602,22616 602,23778 602,23783 602,24572 602,26193 602,26414 602,26845 602,28109 602,28259 602,28817 602,28954 602,29334 602,29498 602,30331 602,30557 602,30775 602,32489 602,33083 602,34719 602,34751 602,35385 602,35439 602,36512 602,36623 602,37743 602,38489 602,38688 602,38883 602,40281 602,40675 602,41158 602,42064 602,42487 602,44292 602,45399 602,45419 602,46364 602,46644 602,46879 602,47661 602,48455 602,50201 602,50934 602,51260 602,52140 602,54295 602,55128 602,55456 602,55940 602,59971 602,60576 602,62588 602,65419 602,65809 602,66661 602,67848 602,70725 602,72603 602,72738 602,74321 602,75249 602,79394 602,80266 602,82089 602,83379 602,85895 602,87974 602,90645 602,92476 602,97423 602,98227 602,98820 602,99819 602,102401 602,105704 602,105829 602,109877 602,113954 602,116017 602,117480 602,118435 602,118822 602,119536 602,120026 602,121441 602,123112 602,124847 602,125099 602,125108 602,125443 602,127215 602,127236 602,127654 602,128222 602,129780 602,129785 602,131296 602,132881 602,134621 602,136167 602,138060 602,140091 602,140654 602,140697 602,140815 602,142343 602,142623 602,142759 602,143260 602,146253 602,148369 602,152411 602,155583 602,158693 602,158948 602,162640 602,162878 602,169320 602,176329 602,176331 602,178640 602,178894 602,179796 602,180343 602,190309 602,193604 602,194527 602,195132 602,196698 602,197583 602,197778 602,200506 602,204059 602,204124 602,216657 602,217715 602,223668 602,225974 602,226429 602,232411 602,232792 602,234757 602,237426 602,237506 602,237647 602,241203 602,242305 602,243083 602,243557 602,243966 602,245355 602,247438 602,249676 602,250295 602,250986 602,251464 602,251615 602,252041 602,253184 602,257799 602,258411 602,260939 602,261728 603,602 603,3218 604,37 604,126 604,182 604,299 604,301 604,312 604,397 604,444 604,446 604,452 604,457 604,535 604,563 604,567 604,599 604,604 604,605 604,615 604,673 604,676 604,698 604,717 604,750 604,762 604,812 604,843 604,929 604,937 604,968 604,972 604,1011 604,1027 604,1118 604,1130 604,1160 604,1231 604,1262 604,1284 604,1293 604,1300 604,1359 604,1411 604,1566 604,1627 604,1740 604,1782 604,1844 604,1849 604,1985 604,2253 604,2358 604,3379 604,3422 604,3756 604,3804 604,3809 604,3869 604,3883 604,4165 604,4514 604,5094 604,5376 604,5455 604,5662 604,6167 604,6398 604,6429 604,6981 604,7986 604,9340 604,13296 604,13563 604,16121 604,17894 604,18098 604,18129 604,18553 604,18565 604,19413 604,20517 604,20757 604,21193 604,21331 604,21589 604,22062 604,22352 604,22423 604,24675 604,25342 604,26201 604,28128 604,28455 604,28831 604,28847 604,30452 604,34227 604,34241 604,35505 604,38349 604,38938 604,39607 604,40806 604,40967 604,42595 604,44112 604,45478 604,45825 604,46091 604,46849 604,50213 604,50218 604,50220 604,50225 604,50227 604,50228 604,50231 604,54584 604,55372 604,56412 604,60542 604,65695 604,65749 604,65770 604,65804 604,66597 604,67158 604,68061 604,70028 604,70042 604,70698 604,72720 604,75394 604,75948 604,77127 604,80060 604,80062 604,82116 604,83003 604,83992 605,10 605,301 605,446 605,567 605,604 605,605 605,615 605,663 605,664 605,717 605,968 605,1160 605,1293 605,1752 605,2595 605,2937 605,3162 605,6926 605,7088 605,7400 605,9340 605,13483 605,15253 605,16247 605,17850 605,18993 605,18994 605,19947 605,20926 605,24338 605,26770 605,28455 605,29134 605,33128 605,35736 605,35737 605,36957 605,41632 605,43289 605,44915 605,45818 605,46800 605,55357 605,58335 605,60059 605,61914 605,61915 605,61965 605,64126 605,66530 605,66760 605,67574 605,68996 605,80281 605,81131 605,83955 605,84163 605,91861 605,97100 605,104074 605,104979 605,110935 605,126478 605,136106 605,155393 605,159568 605,161391 605,162145 605,162337 605,165725 605,184556 605,184723 605,193767 605,212565 605,213222 605,214983 605,215586 605,228983 605,244270 605,249421 605,255929 605,256619 605,260550 605,263061 606,147 606,149 606,171 606,184 606,859 606,1623 607,602 607,3218 608,360 609,10 609,94 609,104 609,107 609,138 609,290 609,292 609,364 609,441 609,442 609,563 609,609 609,610 609,626 609,636 609,677 609,693 609,749 609,765 609,784 609,805 609,849 609,852 609,966 609,968 609,969 609,1045 609,1046 609,1146 609,1238 609,1257 609,1276 609,1347 609,1359 609,1566 609,1572 609,1663 609,1688 609,1882 609,1888 609,2253 609,2315 609,2384 609,2572 609,2775 609,3830 609,3964 609,4039 609,4049 609,4135 609,4308 609,4771 609,5388 609,5439 609,5679 609,6647 609,6666 609,6714 609,6880 609,7182 609,8149 609,8261 609,8658 609,9202 609,12263 609,13563 609,14193 609,16248 609,17632 609,19754 609,19755 609,20704 609,21468 609,22490 609,23710 609,23835 609,26061 609,28442 609,31533 609,31796 609,34407 609,34440 609,36219 609,36939 609,40568 609,48456 609,50342 609,60651 609,74355 609,79410 609,81452 609,91355 609,102891 609,107712 609,109831 609,117887 609,129910 609,130794 609,139016 609,144129 609,189159 609,195505 609,216439 609,216440 609,219874 609,220293 610,609 611,240 611,611 611,612 611,852 611,1459 611,3944 611,5674 611,5718 611,5836 611,7087 611,7921 611,7972 611,8420 611,8510 611,9021 611,9630 611,12281 611,13133 611,14055 611,14070 611,15141 611,15988 611,16198 611,16449 611,18759 611,19303 611,19793 611,20664 611,21617 611,22354 611,22813 611,23353 611,23408 611,24538 611,28415 611,33335 611,33989 611,39402 611,40358 611,41621 611,46052 611,46243 611,49265 611,49270 611,49446 611,49985 611,54326 611,54347 611,55666 611,58183 611,58268 611,58428 611,58431 611,62832 611,63038 611,63582 611,63793 611,65901 611,78746 611,82255 611,87009 611,87868 611,90412 611,90722 611,95339 611,96485 611,97206 611,101818 611,101918 611,103219 611,103232 611,103845 611,104339 611,105500 611,108047 611,109272 611,109898 611,112798 611,113209 611,113914 611,119845 611,122506 611,122667 611,122905 611,124868 611,126056 611,126820 611,128245 611,135063 611,135068 611,136521 611,136585 611,148546 611,155165 611,168389 611,175939 611,180344 611,185313 611,190270 611,214596 611,217422 611,222495 611,226973 611,227224 611,227243 611,227294 611,233503 611,238746 611,247837 611,258267 611,260163 612,41 612,68 612,104 612,298 612,309 612,310 612,332 612,338 612,372 612,417 612,431 612,455 612,534 612,557 612,589 612,626 612,631 612,636 612,714 612,801 612,805 612,862 612,953 612,1016 612,1119 612,1235 612,1335 612,1368 612,1392 612,1411 612,1462 612,1608 612,2205 612,2617 612,2775 612,2995 612,8537 612,33424 612,75912 613,11 614,202 614,203 614,206 614,4453 615,10 615,37 615,261 615,301 615,312 615,314 615,356 615,444 615,518 615,567 615,604 615,605 615,615 615,616 615,677 615,685 615,693 615,698 615,783 615,794 615,818 615,838 615,852 615,937 615,968 615,972 615,1010 615,1011 615,1014 615,1231 615,1276 615,1293 615,1298 615,1300 615,1330 615,1442 615,1564 615,1566 615,1654 615,1782 615,1832 615,1837 615,1844 615,2217 615,2615 615,3106 615,3422 615,3507 615,3714 615,3809 615,4034 615,4253 615,4329 615,4598 615,4722 615,5472 615,6552 615,6824 615,6910 615,7170 615,7400 615,9340 615,9457 615,14440 615,19592 615,20327 615,20416 615,23799 615,23845 615,23863 615,24963 615,25302 615,27205 615,30328 615,30390 615,31175 615,31595 615,33505 615,33532 615,35046 615,35445 615,36241 615,36678 615,37381 615,39123 615,39429 615,39506 615,41147 615,41155 615,41567 615,46053 615,48278 615,49121 615,51497 615,55948 615,57111 615,61089 615,62983 615,63880 615,72726 615,74415 615,76235 615,77678 615,77789 615,80009 615,80062 615,84160 615,85750 615,96685 615,97147 615,98279 615,103960 615,106267 615,106365 615,112995 615,119164 615,119308 615,119339 615,124945 615,151457 615,152042 615,154395 615,155425 615,162882 615,164998 615,167565 615,169157 615,170729 615,171585 615,181765 615,182912 615,182949 615,183310 615,183909 615,183927 615,194189 615,216095 615,221637 615,224764 615,226270 615,228326 615,228883 615,231070 615,238085 615,247025 615,247902 615,253400 615,254424 615,255100 615,255631 615,256374 615,256916 616,615 617,135 617,294 617,304 617,596 617,660 617,784 617,1052 617,1368 617,2416 617,2417 617,2701 618,158 618,240 618,1118 618,2224 619,620 619,8244 620,1 620,50 620,79 620,99 620,106 620,146 620,147 620,149 620,158 620,175 620,192 620,202 620,285 620,336 620,406 620,422 620,602 620,620 620,647 620,663 620,664 620,701 620,779 620,841 620,1218 620,1370 620,1425 620,1492 620,1510 620,1515 620,1523 620,1582 620,1600 620,2093 620,2244 620,2260 620,2374 620,2782 620,2792 620,3449 620,3515 620,3895 620,4103 620,4447 620,4529 620,5133 620,5601 620,6546 620,6557 620,6571 620,6573 620,6577 620,6843 620,7971 620,8046 620,8244 620,13421 620,14153 620,14169 620,14455 620,15113 620,15229 620,15304 620,15769 620,17151 620,18997 620,19593 620,20713 620,23783 620,24166 620,24528 620,24999 620,26414 620,26424 620,27832 620,27834 620,30331 620,31585 620,33030 620,34153 620,34727 620,38688 620,38883 620,40570 620,42752 620,43281 620,46181 620,49439 620,55254 620,57944 620,60576 620,62530 620,62686 620,64669 620,65700 620,65809 620,67866 620,69916 620,72505 620,75249 620,75327 620,76476 620,79976 620,80863 620,83278 620,84753 620,87917 620,90238 620,92476 620,92792 620,98422 620,99606 620,103852 620,106502 620,109367 620,110995 620,116041 620,116849 620,117530 620,118336 620,120923 620,121956 620,124889 620,125875 620,126856 620,131296 620,131645 620,136030 620,141912 620,146712 620,150165 620,150405 620,151986 620,162972 620,166748 620,170149 620,176396 620,179278 620,180487 620,186305 620,187324 620,194950 620,214170 620,215058 620,255046 621,104 621,264 621,333 621,440 621,622 621,682 621,794 621,805 621,1033 621,1381 621,1551 621,1659 622,30 622,50 622,79 622,104 622,147 622,149 622,158 622,192 622,195 622,202 622,203 622,206 622,252 622,256 622,285 622,314 622,328 622,333 622,336 622,406 622,435 622,438 622,439 622,440 622,452 622,467 622,505 622,510 622,516 622,602 622,622 622,640 622,671 622,760 622,779 622,794 622,808 622,809 622,841 622,862 622,929 622,1014 622,1033 622,1179 622,1181 622,1370 622,1515 622,1531 622,1623 622,1776 622,1803 622,1844 622,1939 622,2371 622,3507 622,6904 622,21442 622,31207 622,68069 622,118336 622,127158 622,141912 623,32 623,34 623,35 623,87 623,256 623,313 623,314 623,326 623,349 623,388 623,392 623,397 623,424 623,425 623,433 623,452 623,457 623,577 623,623 623,624 623,658 623,661 623,673 623,676 623,685 623,693 623,697 623,794 623,808 623,809 623,818 623,852 623,903 623,911 623,918 623,919 623,1011 623,1043 623,1118 623,1137 623,1210 623,1240 623,1276 623,1345 623,1424 623,1454 623,1465 623,1502 623,1513 623,1590 623,1653 623,1678 623,1801 623,1805 623,1836 623,1860 623,1949 623,2045 623,2810 623,2902 623,3258 623,3260 623,3367 623,3507 623,3937 623,4118 623,4159 623,4759 623,4760 623,5285 623,5540 623,5624 623,6059 623,6247 623,6430 623,6474 623,6550 623,6552 623,6691 623,6818 623,6919 623,6955 623,7087 623,7890 623,8208 623,8236 623,8658 623,8860 623,9785 623,14503 623,15609 623,15674 623,15735 623,16500 623,17132 623,18137 623,18333 623,18526 623,18631 623,18693 623,18711 623,19299 623,19345 623,19427 623,19434 623,19609 623,19799 623,20427 623,22128 623,22293 623,24666 623,24801 623,25398 623,25404 623,26074 623,26161 623,28269 623,28982 623,29626 623,29677 623,29867 623,30373 623,31001 623,31765 623,32694 623,32929 623,33338 623,34129 623,34288 623,34694 623,34712 623,34799 623,34811 623,34851 623,34870 623,34996 623,35464 623,35569 623,35576 623,36124 623,36696 623,37219 623,37657 623,37670 623,38725 623,39633 623,40506 623,40610 623,40783 623,41136 623,44949 623,46237 623,48505 623,49218 623,49798 623,50288 623,51171 623,52356 623,54823 623,56242 623,56256 623,58697 623,58817 623,63451 623,64069 623,64589 623,67686 623,68103 623,68272 623,70309 623,71184 623,73649 623,74122 623,74462 623,75120 623,77769 623,77781 623,77814 623,77868 623,79528 623,83446 623,89674 623,89731 623,90144 623,90251 623,93798 623,95007 623,95009 623,95079 623,95308 623,95623 623,96654 623,97086 623,97088 623,99026 623,99720 623,99766 623,101551 623,101612 623,101901 623,102695 623,102698 623,102702 623,103896 623,104453 623,104507 623,104565 623,105718 623,109352 623,109908 623,110505 623,110527 623,110774 623,111042 623,112214 623,112234 623,112259 623,112896 623,112965 623,114080 623,114158 623,114608 623,115394 623,116510 623,117480 623,119644 623,119978 623,120853 623,122566 623,123141 623,124550 623,126813 623,127158 623,127834 623,128206 623,128221 623,129316 623,129335 623,130321 623,130966 623,132786 623,132800 623,134212 623,134538 623,134559 623,134808 623,135272 623,138819 623,139633 623,139748 623,140027 623,140704 623,142958 623,145700 623,146367 623,148044 623,152714 623,160789 623,161636 623,161853 623,162414 623,162696 623,162984 623,162985 623,163009 623,163071 623,165197 623,165586 623,165979 623,166082 623,168409 623,171105 623,171624 623,172168 623,172240 623,172698 623,176559 623,176907 623,178568 623,179320 623,181626 623,181643 623,182958 623,183825 623,186456 623,186786 623,189212 623,191365 623,194453 623,195298 623,195513 623,207837 623,212846 623,214131 623,214852 623,215001 623,219911 624,623 625,626 626,10 626,58 626,111 626,182 626,292 626,298 626,441 626,442 626,446 626,462 626,497 626,518 626,609 626,626 626,632 626,676 626,685 626,749 626,801 626,818 626,838 626,849 626,852 626,862 626,911 626,1001 626,1045 626,1046 626,1140 626,1177 626,1235 626,1326 626,1445 626,1462 626,1559 626,1572 626,1653 626,1688 626,1860 626,2065 626,2209 626,2373 626,2511 626,2557 626,2840 626,2874 626,2995 626,3474 626,4039 626,4303 626,4514 626,4771 626,5129 626,5186 626,7765 626,7766 626,7887 626,8107 626,8869 626,14117 626,14565 626,14575 626,14633 626,16330 626,16559 626,16581 626,17068 626,18472 626,19005 626,20430 626,20994 626,22023 626,22024 626,23664 626,23678 626,24500 626,26409 626,26905 626,28165 626,28850 626,28929 626,29044 626,29624 626,31335 626,31422 626,33339 626,33524 626,36780 626,39355 626,40580 626,44448 626,44882 626,45512 626,45730 626,45993 626,46708 626,47658 626,47934 626,47935 626,47937 626,48711 626,49686 626,50128 626,50157 626,51450 626,52996 626,55092 626,55156 626,55180 626,56357 626,60413 626,65861 626,71165 626,79369 626,82006 626,86555 626,87077 626,87981 626,87993 626,87996 626,87997 626,90216 626,91523 626,91852 626,93569 626,94854 626,97199 626,97264 626,98057 626,98923 626,99518 626,107405 626,108000 626,108066 626,108728 626,112232 626,113949 626,122881 626,124944 626,126013 626,126855 626,128254 626,128640 626,129774 626,133990 626,142757 626,146388 626,147249 626,148906 626,150016 626,150455 626,150492 626,150815 626,154331 626,159409 626,159677 626,159684 626,161521 626,164885 626,168573 626,169873 626,175309 626,175511 626,176400 626,176429 626,177844 626,181728 626,184541 626,212566 626,216558 626,216559 626,216560 626,237716 626,239918 626,242186 626,242327 626,247742 626,247906 626,247994 626,250626 626,252594 626,252633 626,255690 626,264389 627,20 627,182 627,628 627,1204 627,5725 628,10 628,147 628,638 628,2244 628,2451 628,5101 628,5725 628,6684 628,15119 628,25455 628,27110 628,38753 628,131827 628,179071 628,179072 628,215871 628,218372 628,254534 629,160 629,182 629,188 630,450 630,818 630,21944 631,40 631,41 631,68 631,71 631,104 631,186 631,240 631,248 631,261 631,289 631,290 631,294 631,298 631,301 631,304 631,314 631,356 631,372 631,373 631,397 631,417 631,425 631,431 631,442 631,502 631,510 631,534 631,535 631,588 631,589 631,590 631,599 631,612 631,631 631,632 631,677 631,714 631,715 631,760 631,761 631,784 631,794 631,797 631,805 631,808 631,823 631,838 631,843 631,852 631,862 631,968 631,972 631,973 631,1001 631,1004 631,1010 631,1011 631,1014 631,1085 631,1118 631,1119 631,1195 631,1213 631,1276 631,1282 631,1284 631,1285 631,1293 631,1298 631,1326 631,1416 631,1417 631,1459 631,1462 631,1505 631,1545 631,1608 631,1635 631,1715 631,1782 631,1785 631,1796 631,1808 631,1818 631,1844 631,1879 631,1955 631,2015 631,2173 631,2188 631,2205 631,2209 631,2346 631,2443 631,2512 631,2620 631,2775 631,2979 631,3028 631,3135 631,3504 631,3507 631,3508 631,3672 631,3694 631,3715 631,4265 631,4308 631,4355 631,4532 631,4549 631,4771 631,5011 631,5229 631,5472 631,6032 631,6908 631,7458 631,7759 631,7814 631,8064 631,8243 631,8261 631,8537 631,8632 631,9739 631,14482 631,15183 631,15277 631,15562 631,16192 631,18930 631,19566 631,19617 631,19622 631,20038 631,20596 631,20986 631,22335 631,22415 631,24839 631,24996 631,25664 631,29851 631,30405 631,30733 631,31160 631,31726 631,31729 631,31731 631,31785 631,33424 631,33496 631,34073 631,35500 631,38275 631,38300 631,39105 631,41334 631,42599 631,49247 631,49398 631,54391 631,54685 631,56470 631,56650 631,58289 631,59043 631,61089 631,61307 631,62019 631,65681 631,65769 631,66500 631,66639 631,67886 631,68248 631,70352 631,70877 631,70882 631,72639 631,73334 631,74482 631,75912 631,79619 631,80049 631,80432 631,82703 631,83314 631,83496 631,87246 631,87470 631,88306 631,88650 631,89584 631,90809 631,94134 631,97772 631,103526 631,107574 631,109624 631,111868 631,113451 631,118992 631,121033 631,122795 631,127158 631,132950 631,133111 631,136259 631,139321 631,141635 631,142476 631,142522 631,142580 631,142914 631,150186 631,156325 631,158197 631,158705 631,158859 631,160345 631,160724 631,160786 631,161093 631,161159 631,161402 631,162121 631,163014 631,163052 631,163082 631,163194 631,163786 631,163898 631,164267 631,164423 631,164586 631,164846 631,164891 631,165020 631,165074 631,165293 631,165993 631,166771 631,167429 631,169339 631,171409 631,171746 631,172706 631,175289 631,176511 631,176566 631,176944 631,178241 631,181841 631,186756 631,188791 631,188836 631,188883 631,189777 631,191596 631,191901 631,194426 631,214752 631,217559 631,219626 631,220939 631,222382 631,224887 631,228197 631,229659 631,236041 631,239047 631,239889 631,242879 631,243369 631,243584 631,252093 631,260342 632,22 632,104 632,200 632,289 632,290 632,301 632,417 632,442 632,534 632,599 632,626 632,631 632,714 632,760 632,794 632,805 632,862 632,1001 632,1085 632,1119 632,1368 632,1818 632,2205 632,2206 632,2253 632,2995 632,9028 632,33424 632,75912 633,422 633,602 633,3218 634,10 634,19 634,34 634,35 634,83 634,175 634,294 634,313 634,363 634,379 634,385 634,389 634,477 634,634 634,635 634,685 634,693 634,805 634,852 634,1011 634,1072 634,1313 634,1471 634,1539 634,1571 634,1617 634,1718 634,1724 634,2159 634,2224 634,2319 634,2424 634,2553 634,2646 634,2784 634,2834 634,3234 634,3504 634,3686 634,3729 634,4166 634,4190 634,4223 634,4392 634,4412 634,4637 634,5034 634,5326 634,5591 634,6506 634,6855 634,7092 634,7458 634,7698 634,12031 634,13240 634,13626 634,13661 634,14464 634,14486 634,16202 634,16223 634,18345 634,18831 634,19278 634,19286 634,20325 634,20618 634,24160 634,24274 634,25626 634,25880 634,26801 634,28671 634,28821 634,29556 634,30502 634,39537 634,42861 634,43893 634,45803 634,46880 634,47071 634,47464 634,48240 634,48398 634,49043 634,54631 634,55789 634,60343 634,62286 634,62459 634,62705 634,66703 634,66876 634,70312 634,74417 634,79966 634,81159 634,86064 634,90388 634,90969 634,92922 634,97111 634,101828 634,103403 634,107100 634,115474 634,119154 634,132085 634,134983 634,135622 634,136568 634,141128 634,143139 634,145915 634,147583 634,155726 634,156760 634,161155 634,161197 634,161392 634,161664 634,161667 634,162017 634,163013 634,168924 634,170660 634,172228 634,173293 634,173957 634,177623 634,177625 634,179918 634,180156 634,183456 634,191994 634,212575 634,214940 634,219218 634,219397 634,222525 634,223001 634,223876 634,225507 634,225528 634,225599 634,228560 634,228794 634,235887 634,236523 634,241819 634,241824 634,245482 634,247611 634,255045 634,255694 634,256350 634,258716 634,259059 634,259545 634,260873 634,260908 635,399 635,634 635,891 635,949 635,1274 635,1724 635,1871 635,2224 635,2646 635,7698 635,13661 635,115474 635,183456 635,188791 636,104 636,134 636,135 636,136 636,138 636,200 636,225 636,248 636,254 636,290 636,298 636,364 636,372 636,373 636,457 636,502 636,557 636,609 636,612 636,631 636,636 636,677 636,685 636,714 636,715 636,784 636,805 636,953 636,1001 636,1119 636,1258 636,1282 636,1332 636,1346 636,1432 636,1572 636,1704 636,1807 636,1844 636,1882 636,2008 636,2105 636,2209 636,2587 636,3508 636,3944 636,4318 636,4355 636,4524 636,5405 636,5439 636,6308 636,6667 636,7072 636,7935 636,8421 636,9529 636,9739 636,13207 636,13282 636,13333 636,14080 636,15721 636,15771 636,16382 636,19631 636,21449 636,24773 636,24774 636,24781 636,24791 636,25338 636,26873 636,26881 636,28112 636,29923 636,30268 636,32576 636,34828 636,34951 636,40220 636,44058 636,44797 636,44805 636,48532 636,49035 636,55416 636,57002 636,62280 636,62419 636,62503 636,63145 636,66511 636,74288 636,77534 636,78787 636,80049 636,80346 636,82016 636,85211 636,94134 636,103778 636,109831 636,109900 636,118514 636,123004 636,129185 636,130184 636,132241 636,134092 636,134817 636,135792 636,139696 636,140851 636,142296 636,143739 636,144921 636,148304 636,148378 636,149844 636,154301 636,156294 636,159219 636,159673 636,160410 636,160858 636,162614 636,162976 636,168576 636,168883 636,169335 636,171338 636,173954 636,175384 636,176511 636,180506 636,180954 636,180988 636,182345 636,185645 636,186058 636,190276 636,192684 636,193663 636,198695 636,200497 636,205627 636,207115 636,207201 636,226272 636,228170 636,228889 636,229799 636,233464 636,234868 636,238125 636,238415 636,240034 636,241365 636,248067 636,251507 636,256866 637,586 639,640 640,1 640,10 640,50 640,97 640,99 640,106 640,146 640,147 640,148 640,149 640,158 640,175 640,184 640,192 640,195 640,285 640,333 640,336 640,406 640,452 640,505 640,588 640,590 640,640 640,663 640,676 640,779 640,808 640,841 640,929 640,957 640,1181 640,1425 640,1458 640,1505 640,1515 640,1572 640,1619 640,1623 640,1815 640,2161 640,2253 640,2400 640,2706 640,2791 640,3507 640,3895 640,4306 640,4310 640,4543 640,4590 640,4706 640,5174 640,5401 640,5548 640,5726 640,6428 640,6904 640,7417 640,9394 640,9582 640,15560 640,20087 640,20642 640,20763 640,22568 640,22699 640,26414 640,26948 640,27047 640,27151 640,27217 640,27237 640,27310 640,27674 640,28489 640,28630 640,29083 640,29794 640,29973 640,35933 640,36578 640,36910 640,41378 640,41385 640,43852 640,45232 640,50221 640,54470 640,61324 640,62867 640,65809 640,69636 640,77157 640,80145 640,80266 640,82302 640,83892 640,85480 640,85778 640,86109 640,86205 640,86207 640,87333 640,88727 640,88744 640,88760 640,88817 640,88822 640,88826 640,89035 640,92386 640,92476 640,93689 640,96212 640,99889 640,101694 640,108146 640,108149 640,111382 640,116825 640,117746 640,118007 640,121482 640,127514 640,132940 640,135322 640,137292 640,140247 640,146499 640,148601 640,149534 640,151231 640,154712 640,156187 640,156370 640,159177 640,161986 640,162372 640,163617 640,163822 640,165496 640,168703 640,170149 640,172985 640,172986 640,172987 640,172988 640,173508 640,173799 640,175036 640,175138 640,177975 640,180151 640,181363 640,182193 640,189055 640,190079 640,190669 640,191666 640,207253 640,219207 640,220384 640,223940 640,224490 640,224842 640,240174 640,240671 640,251154 640,256111 640,262511 641,581 642,473 643,644 644,32 644,285 644,344 644,535 644,779 644,808 644,872 644,891 644,1240 644,1860 644,1949 644,1973 644,3003 644,3258 644,4903 645,184 645,422 645,602 645,620 645,4865 645,4866 645,8244 646,647 647,106 647,146 647,620 647,647 647,663 647,664 647,1130 647,1175 647,1370 647,1893 647,2782 647,4039 647,7155 647,8244 647,92476 647,106502 648,649 649,649 649,1011 649,1192 649,1262 649,2373 650,399 650,682 650,2646 650,72439 651,652 652,652 652,1893 653,3 653,654 653,16499 654,653 654,2045 654,201298 655,408 656,34 656,35 656,657 657,8 657,34 657,35 657,187 657,217 657,222 657,278 657,313 657,379 657,385 657,389 657,399 657,455 657,457 657,536 657,632 657,656 657,657 657,814 657,949 657,951 657,1005 657,1019 657,1069 657,1417 657,1525 657,1571 657,1724 657,1871 657,1914 657,1916 657,2092 657,2176 657,2266 657,2269 657,2290 657,2322 657,2361 657,2421 657,2451 657,2671 657,2779 657,2784 657,3636 657,3646 657,3672 657,3686 657,3880 657,4007 657,4076 657,4109 657,4166 657,4223 657,4377 657,4637 657,4723 657,4740 657,5135 657,5178 657,5208 657,5325 657,5702 657,5758 657,6032 657,6539 657,6789 657,6828 657,6890 657,6913 657,6960 657,7072 657,7109 657,7698 657,7759 657,7768 657,8140 657,8168 657,8290 657,9161 657,12112 657,13198 657,13240 657,13361 657,13479 657,13597 657,13607 657,14068 657,14348 657,14384 657,15303 657,15325 657,16230 657,16406 657,17655 657,18387 657,18577 657,18650 657,19286 657,20416 657,20747 657,20847 657,21212 657,21233 657,21382 657,21855 657,22119 657,23456 657,25670 657,25826 657,26140 657,26366 657,26374 657,26887 657,26888 657,28671 657,28844 657,30093 657,30502 657,30617 657,32269 657,32804 657,33508 657,34089 657,34183 657,34270 657,34509 657,36813 657,37726 657,38972 657,39523 657,40469 657,40732 657,40795 657,41854 657,42804 657,44068 657,44329 657,44442 657,46256 657,48372 657,48404 657,48729 657,49030 657,49127 657,49224 657,50018 657,51880 657,54425 657,55013 657,55195 657,55248 657,57354 657,58270 657,58490 657,59398 657,60472 657,61085 657,61243 657,62264 657,62459 657,62977 657,63392 657,63519 657,64288 657,64479 657,65100 657,66253 657,66273 657,67487 657,67668 657,67852 657,67952 657,68459 657,68646 657,68812 657,69105 657,69990 657,70334 657,71661 657,73279 657,75306 657,79040 657,79313 657,79396 657,79650 657,79680 657,80721 657,80966 657,81230 657,83571 657,83745 657,84149 657,84186 657,85727 657,85985 657,86060 657,87245 657,87978 657,88711 657,90016 657,90076 657,90984 657,91522 657,93636 657,96648 657,96794 657,96871 657,97220 657,98262 657,101649 657,101735 657,103726 657,104719 657,106813 657,106918 657,107066 657,109036 657,110527 657,112560 657,112786 657,113003 657,113898 657,115644 657,117965 657,119349 657,121160 657,121416 657,121979 657,123805 657,125242 657,126282 657,126841 657,127148 657,127504 657,128690 657,129942 657,131216 657,131224 657,133498 657,134530 657,137842 657,138136 657,139928 657,140055 657,140342 657,143586 657,143725 657,144323 657,144762 657,145042 657,145720 657,150016 657,150157 657,156488 657,157218 657,158682 657,158920 657,159386 657,160235 657,162767 657,165979 657,166288 657,167174 657,168445 657,169221 657,169966 657,169993 657,170239 657,171300 657,172051 657,174397 657,174591 657,174955 657,174959 657,178736 657,182332 657,183873 657,185439 657,185940 657,190137 657,191486 657,193664 657,194920 657,198246 657,198387 657,204259 657,213089 657,214664 657,216365 657,217583 657,218549 657,219511 657,220990 657,222100 657,223656 657,224777 657,224815 657,228276 657,228277 657,228354 657,228699 657,229179 657,229466 657,229784 657,229807 657,230075 657,230690 657,233524 657,234175 657,234493 657,235144 657,236696 657,238124 657,238309 657,239587 657,240895 657,240902 657,241149 657,241654 657,242478 657,243012 657,243287 657,243947 657,244079 657,244089 657,244102 657,244642 657,245386 657,247979 657,248555 657,249157 657,249281 657,250813 657,251283 657,251451 657,251885 657,252946 657,254908 657,255024 657,255627 657,258372 657,260170 657,260366 657,262504 657,264527 658,87 658,457 658,623 658,919 658,1805 658,1836 658,2373 658,4760 658,15609 658,162599 659,54 659,660 659,692 659,706 659,754 659,912 659,1193 659,1610 659,1770 659,1843 659,2253 659,2290 659,2424 659,5019 659,5085 659,5721 659,6506 659,9788 659,13240 659,13276 659,13781 659,15222 659,15289 659,15352 659,16146 659,17927 659,17930 659,18829 659,28282 659,34078 660,19 660,54 660,135 660,222 660,278 660,313 660,385 660,389 660,401 660,634 660,660 660,692 660,706 660,754 660,781 660,784 660,912 660,1069 660,1610 660,1618 660,1724 660,1843 660,1916 660,2159 660,2253 660,2290 660,2424 660,2516 660,2553 660,2646 660,2775 660,3252 660,4799 660,5019 660,5085 660,5721 660,5933 660,6506 660,7698 660,8431 660,9788 660,13240 660,13781 660,15352 660,16412 660,17573 660,17927 660,18831 660,19352 660,19443 660,21636 660,26161 660,30319 660,33792 660,34078 660,37048 660,37685 660,37952 660,37961 660,40450 660,40566 660,44351 660,45096 660,48085 660,50325 660,52749 660,62298 660,74555 660,76854 660,79940 660,79966 660,86118 660,86420 660,86433 660,86559 660,91260 660,101546 660,107528 660,107639 660,109298 660,113639 660,120877 660,121060 660,121379 660,122503 660,130927 660,136649 660,146358 660,147226 660,150584 660,150598 660,155806 660,174467 660,176464 660,177886 660,182507 660,190108 660,207659 660,218904 660,220888 660,225626 660,251986 660,252006 661,372 661,623 661,818 661,919 661,1805 661,1949 662,663 662,664 663,37 663,56 663,86 663,106 663,146 663,158 663,167 663,175 663,192 663,202 663,203 663,207 663,251 663,287 663,299 663,301 663,314 663,333 663,336 663,337 663,435 663,446 663,469 663,505 663,509 663,510 663,567 663,586 663,615 663,620 663,640 663,647 663,662 663,663 663,664 663,685 663,693 663,698 663,702 663,717 663,720 663,788 663,809 663,852 663,874 663,875 663,907 663,911 663,918 663,932 663,937 663,947 663,968 663,972 663,973 663,1010 663,1011 663,1014 663,1089 663,1117 663,1122 663,1124 663,1210 663,1231 663,1243 663,1284 663,1293 663,1298 663,1319 663,1326 663,1370 663,1388 663,1436 663,1493 663,1616 663,1623 663,1647 663,1732 663,1774 663,1821 663,1837 663,1848 663,1849 663,1985 663,1993 663,2045 663,2260 663,2400 663,2782 663,2903 663,3367 663,3370 663,3392 663,3422 663,3999 663,4272 663,4359 663,5356 663,5414 663,5662 663,6519 663,6625 663,6671 663,6684 663,7087 663,7349 663,7435 663,8244 663,8309 663,9213 663,11890 663,12112 663,13428 663,13435 663,13464 663,14060 663,14432 663,14448 663,14453 663,14483 663,14598 663,14752 663,15113 663,15229 663,15304 663,15313 663,15624 663,15770 663,16010 663,16572 663,16774 663,16866 663,16949 663,17249 663,18526 663,19863 663,21350 663,21528 663,22259 663,23517 663,24163 663,24173 663,24741 663,24825 663,26034 663,26080 663,27052 663,27495 663,28716 663,29008 663,29747 663,30999 663,31080 663,31094 663,31163 663,32784 663,33402 663,33410 663,33474 663,33537 663,33602 663,33988 663,34084 663,34178 663,34253 663,34267 663,36008 663,36100 663,36357 663,36444 663,36616 663,37359 663,37481 663,37486 663,37707 663,38140 663,38688 663,40782 663,41987 663,42491 663,43559 663,43885 663,46286 663,46995 663,48245 663,50683 663,51236 663,53977 663,54871 663,55917 663,58763 663,59454 663,59464 663,59544 663,59700 663,59844 663,60549 663,60558 663,60586 663,60601 663,61354 663,62851 663,62852 663,62904 663,63012 663,63634 663,64153 663,64396 663,66599 663,68082 663,69613 663,69871 663,71027 663,71968 663,72434 663,72764 663,73336 663,75236 663,75819 663,76106 663,76820 663,76844 663,77633 663,77728 663,78059 663,79359 663,79880 663,79881 663,82147 663,82794 663,85792 663,85871 663,88012 663,88936 663,89754 663,91985 663,92476 663,96724 663,101838 663,103860 663,104472 663,105746 663,106502 663,107992 663,108166 663,110115 663,110157 663,110690 663,112061 663,112812 663,112961 663,114448 663,114563 663,115479 663,115493 663,116210 663,116278 663,117974 663,120205 663,122661 663,124404 663,124468 663,127169 663,128783 663,128787 663,130340 663,131248 663,131289 663,132882 663,133892 663,134888 663,137054 663,138064 663,138472 663,139537 663,139562 663,139635 663,139638 663,139658 663,140409 663,140448 663,140518 663,140521 663,140757 663,140831 663,140835 663,140844 663,141151 663,141861 663,141866 663,141949 663,141953 663,142163 663,142268 663,142274 663,142546 663,142551 663,142787 663,142798 663,142805 663,143274 663,143340 663,143697 663,144900 663,145366 663,145369 663,145374 663,145387 663,145389 663,145403 663,145451 663,145452 663,145458 663,145464 663,145465 663,145472 663,145475 663,145486 663,145487 663,145517 663,145526 663,145528 663,145542 663,145545 663,145571 663,145573 663,145576 663,145580 663,145589 663,145590 663,145603 663,145604 663,145607 663,145611 663,145621 663,145623 663,145624 663,145635 663,145638 663,145642 663,145644 663,145648 663,145650 663,145995 663,145996 663,146027 663,146031 663,146299 663,146572 663,147347 663,147859 663,149173 663,152615 663,153234 663,153243 663,153253 663,153256 663,153262 663,153264 663,156224 663,156258 663,157393 663,158580 663,158582 663,161172 663,165442 663,167426 663,168463 663,169627 663,179780 663,179927 663,180661 663,180965 663,181832 663,185707 663,188782 663,188818 663,189915 663,189926 663,189945 663,191990 663,192493 663,205091 663,205673 663,211971 663,212313 663,215527 663,216584 663,218325 663,223807 663,229653 663,230416 663,230421 663,231721 663,233154 663,234100 663,236163 663,236724 663,238767 663,241064 663,244120 663,245901 663,247366 663,248800 663,253029 663,253162 663,253377 663,254314 665,666 665,744 665,750 665,762 665,1124 665,1167 666,665 666,750 666,762 666,854 666,1040 666,1167 666,1298 666,1616 666,2942 666,4359 666,8720 666,41877 666,72764 666,80505 666,88335 666,98279 666,124668 666,130442 666,149246 666,154325 666,171641 666,174776 666,177293 666,180227 666,192998 666,194929 666,217478 666,220315 666,220575 666,223112 666,224322 666,224765 666,225280 666,226310 666,227501 666,238128 666,248666 666,260783 667,668 668,11 668,15 668,20 668,102 668,146 668,178 668,186 668,207 668,256 668,259 668,336 668,338 668,397 668,481 668,497 668,505 668,516 668,567 668,581 668,611 668,622 668,667 668,668 668,673 668,676 668,685 668,690 668,712 668,713 668,717 668,750 668,762 668,799 668,838 668,841 668,843 668,849 668,859 668,911 668,918 668,972 668,992 668,1014 668,1021 668,1087 668,1130 668,1135 668,1172 668,1175 668,1262 668,1402 668,1419 668,1556 668,1559 668,1603 668,1607 668,1623 668,1655 668,1724 668,1785 668,1880 668,1925 668,2310 668,2411 668,2460 668,2512 668,2607 668,2626 668,2923 668,3597 668,3967 668,4190 668,4276 668,4806 668,5100 668,5129 668,5136 668,5213 668,5591 668,6588 668,6824 668,6861 668,6891 668,8150 668,9379 668,13661 668,14556 668,15135 668,15624 668,16538 668,18298 668,19413 668,19453 668,21260 668,23437 668,25646 668,26450 668,29823 668,32468 668,33595 668,33596 668,39473 668,40360 668,47826 668,48169 668,48943 668,48963 668,51905 668,52488 668,55566 668,56214 668,56215 668,56946 668,56948 668,58808 668,62417 668,63998 668,67898 668,68636 668,77743 668,82217 668,84039 668,84657 668,87310 668,92289 668,92476 668,92622 668,98798 668,105495 668,112706 668,112936 668,113513 668,120068 668,126876 668,131641 668,132938 668,140791 668,141903 668,144043 668,144837 668,146917 668,148346 668,148353 668,150756 668,156237 668,157045 668,173256 668,180662 668,187262 668,189710 668,191395 668,192911 668,211825 668,212315 668,214082 668,230435 668,232021 668,234653 668,234675 668,254473 668,256799 668,256822 668,256823 668,261684 668,263569 669,360 669,4252 670,346 670,671 671,10 671,20 671,175 671,178 671,315 671,346 671,434 671,435 671,439 671,446 671,447 671,538 671,622 671,670 671,671 671,673 671,676 671,685 671,693 671,911 671,934 671,939 671,996 671,1033 671,1068 671,1294 671,1328 671,1435 671,1474 671,1565 671,1590 671,1612 671,1644 671,1651 671,1789 671,1790 671,1848 671,1973 671,2094 671,2340 671,2352 671,2353 671,2427 671,2511 671,3241 671,3462 671,3626 671,4514 671,4646 671,5189 671,5900 671,6422 671,6533 671,6622 671,6966 671,7087 671,7117 671,7318 671,8128 671,13242 671,15141 671,15179 671,15345 671,17421 671,17423 671,17424 671,17425 671,17426 671,17432 671,17646 671,18011 671,18124 671,19930 671,23138 671,24511 671,24620 671,24934 671,26966 671,29057 671,30775 671,31170 671,32596 671,32630 671,32801 671,35498 671,37771 671,38158 671,38407 671,38779 671,39412 671,39460 671,40497 671,49479 671,54688 671,59177 671,62507 671,65311 671,66102 671,68887 671,68917 671,75045 671,77575 671,79861 671,81071 671,90657 671,92274 671,92926 671,96472 671,96789 671,98227 671,104347 671,106377 671,111275 671,111712 671,116017 671,119443 671,119561 671,120052 671,120155 671,125484 671,128397 671,129891 671,130206 671,133112 671,134185 671,138288 671,139474 671,139612 671,145088 671,146836 671,149267 671,156705 671,159089 671,159676 671,161038 671,163378 671,164266 671,167065 671,170873 671,179516 671,185287 671,189128 671,189246 671,191352 671,200344 671,213897 671,214641 671,217890 671,223876 671,230968 671,235867 671,236556 671,237301 671,238016 671,238660 671,253099 672,673 672,1130 673,11 673,20 673,22 673,68 673,86 673,120 673,158 673,160 673,167 673,182 673,202 673,203 673,207 673,209 673,240 673,256 673,259 673,287 673,292 673,302 673,314 673,336 673,338 673,346 673,356 673,360 673,388 673,397 673,414 673,433 673,440 673,441 673,446 673,452 673,462 673,467 673,489 673,497 673,500 673,505 673,509 673,516 673,534 673,538 673,599 673,604 673,615 673,622 673,626 673,631 673,668 673,672 673,676 673,685 673,690 673,693 673,694 673,697 673,704 673,710 673,764 673,775 673,794 673,801 673,809 673,818 673,849 673,872 673,893 673,911 673,918 673,920 673,929 673,972 673,1011 673,1012 673,1014 673,1021 673,1089 673,1090 673,1130 673,1204 673,1240 673,1243 673,1267 673,1293 673,1298 673,1326 673,1345 673,1417 673,1445 673,1453 673,1454 673,1531 673,1551 673,1566 673,1623 673,1634 673,1653 673,1655 673,1663 673,1677 673,1688 673,1715 673,1722 673,1724 673,1796 673,1803 673,1805 673,1844 673,1893 673,1968 673,1992 673,2083 673,2253 673,2373 673,2400 673,2436 673,2460 673,2512 673,2995 673,3392 673,3507 673,3690 673,3804 673,3937 673,4147 673,4190 673,4220 673,4276 673,5261 673,5300 673,5686 673,5726 673,6929 673,7973 673,8149 673,8370 673,9740 673,13323 673,15109 673,15344 673,15551 673,16208 673,18477 673,19413 673,19662 673,21382 673,21442 673,21462 673,21994 673,23471 673,23487 673,23646 673,24707 673,26156 673,26161 673,26767 673,26901 673,29165 673,32528 673,32532 673,35581 673,36741 673,37321 673,40337 673,42614 673,48441 673,48462 673,48898 673,50159 673,52193 673,56422 673,56567 673,57086 673,58898 673,72466 673,75912 673,78881 673,80956 673,82531 673,94910 673,94958 673,105695 673,115474 673,118331 673,119943 673,120927 673,121493 673,122975 673,123812 673,124374 673,134591 673,134599 673,138794 673,141912 673,152827 673,155445 673,155450 673,159855 673,165205 673,165361 673,165365 673,165367 673,165375 673,165376 673,165380 673,172513 673,177745 673,180260 673,180358 673,187221 673,189242 673,190373 673,191130 673,197935 673,202602 673,205104 673,215874 673,216616 673,216660 673,253104 673,253151 673,253195 674,83 674,675 674,143287 676,20 676,32 676,68 676,87 676,130 676,158 676,207 676,240 676,259 676,261 676,299 676,336 676,390 676,397 676,431 676,439 676,441 676,505 676,509 676,534 676,535 676,567 676,577 676,604 676,623 676,626 676,640 676,673 676,676 676,677 676,685 676,697 676,764 676,779 676,801 676,809 676,838 676,849 676,911 676,920 676,929 676,972 676,1014 676,1033 676,1118 676,1119 676,1140 676,1147 676,1191 676,1204 676,1240 676,1285 676,1293 676,1294 676,1326 676,1345 676,1402 676,1417 676,1419 676,1445 676,1566 676,1623 676,1653 676,1655 676,1724 676,1789 676,1992 676,2211 676,2373 676,2460 676,2480 676,2511 676,2512 676,2590 676,2620 676,3392 676,3474 676,3524 676,3653 676,3804 676,4276 676,4314 676,4336 676,5547 676,5833 676,6452 676,9457 676,18298 676,18964 676,19413 676,20757 676,21442 676,26190 676,38314 676,42064 676,50450 676,69997 676,75912 676,81233 676,99732 676,102518 676,106114 676,108058 676,112441 676,114751 676,115474 676,118336 676,124668 676,126097 676,128516 676,157727 676,162599 676,170665 676,179804 676,188530 676,200343 676,206098 676,207659 676,220910 677,10 677,30 677,35 677,41 677,47 677,68 677,72 677,81 677,85 677,104 677,107 677,111 677,116 677,120 677,134 677,135 677,136 677,137 677,138 677,151 677,167 677,188 677,200 677,211 677,215 677,217 677,225 677,227 677,233 677,240 677,248 677,254 677,258 677,261 677,264 677,289 677,290 677,292 677,294 677,298 677,301 677,304 677,312 677,314 677,323 677,328 677,332 677,364 677,372 677,383 677,390 677,392 677,397 677,406 677,417 677,420 677,431 677,442 677,450 677,455 677,479 677,503 677,518 677,525 677,534 677,557 677,588 677,589 677,590 677,592 677,596 677,609 677,615 677,626 677,631 677,636 677,676 677,694 677,704 677,714 677,749 677,760 677,772 677,784 677,801 677,805 677,818 677,838 677,850 677,862 677,872 677,943 677,953 677,954 677,968 677,1001 677,1007 677,1014 677,1016 677,1019 677,1046 677,1082 677,1085 677,1102 677,1119 677,1140 677,1149 677,1177 677,1179 677,1203 677,1204 677,1210 677,1212 677,1235 677,1238 677,1257 677,1267 677,1282 677,1285 677,1287 677,1305 677,1309 677,1326 677,1332 677,1335 677,1359 677,1368 677,1370 677,1381 677,1388 677,1402 677,1415 677,1432 677,1434 677,1445 677,1462 677,1466 677,1509 677,1511 677,1533 677,1564 677,1572 677,1579 677,1608 677,1631 677,1635 677,1653 677,1659 677,1688 677,1715 677,1722 677,1745 677,1749 677,1782 677,1785 677,1796 677,1807 677,1818 677,1844 677,1882 677,1888 677,1893 677,1939 677,1955 677,1962 677,1980 677,2008 677,2087 677,2105 677,2205 677,2206 677,2209 677,2210 677,2286 677,2296 677,2315 677,2334 677,2351 677,2379 677,2416 677,2417 677,2436 677,2443 677,2469 677,2512 677,2572 677,2590 677,2596 677,2620 677,2701 677,2775 677,2797 677,2807 677,2812 677,2889 677,2989 677,2991 677,2995 677,3069 677,3085 677,3115 677,3129 677,3135 677,3238 677,3246 677,3247 677,3319 677,3328 677,3467 677,3474 677,3538 677,3585 677,3623 677,3695 677,3804 677,4039 677,4146 677,4218 677,4220 677,4222 677,4237 677,4276 677,4355 677,4475 677,4549 677,4571 677,4771 677,5265 677,5405 677,5718 677,6068 677,6452 677,6837 677,7124 677,7155 677,7194 677,7270 677,8180 677,8537 677,8884 677,8989 677,8990 677,8991 677,8992 677,8993 677,8994 677,8995 677,8996 677,8997 677,8998 677,8999 677,9000 677,9001 677,9002 677,9003 677,9004 677,9005 677,9006 677,9007 677,9008 677,9009 677,9010 677,9011 677,9012 677,9013 677,9014 677,9015 677,9016 677,9017 677,9018 677,9019 677,9020 677,9021 677,9022 677,9023 677,9024 677,9025 677,9026 677,9027 677,9028 677,9029 677,9030 677,9031 677,9032 677,10318 677,11147 677,14819 677,20535 677,20813 677,27041 677,27550 677,31497 677,32914 677,33424 677,44725 677,66297 677,74696 677,76086 677,94134 677,95674 677,111142 677,127158 677,136072 677,172012 677,176782 677,178576 677,182162 677,185877 677,205488 677,245910 677,258887 678,4 678,5 679,390 680,389 681,79 681,149 681,195 682,1 682,83 682,106 682,107 682,147 682,192 682,251 682,252 682,306 682,307 682,493 682,516 682,599 682,621 682,650 682,682 682,683 682,685 682,693 682,733 682,852 682,911 682,998 682,1220 682,1222 682,1243 682,1353 682,1359 682,1504 682,1512 682,1568 682,1601 682,1618 682,1886 682,1927 682,1985 682,2033 682,2244 682,2374 682,2552 682,2646 682,2775 682,2944 682,3377 682,4234 682,4525 682,5356 682,5409 682,5682 682,5822 682,5992 682,9465 682,13137 682,13339 682,13538 682,13626 682,16201 682,16521 682,17573 682,18479 682,19854 682,20285 682,20780 682,21401 682,21528 682,22162 682,22939 682,23517 682,24242 682,24287 682,26061 682,26156 682,26450 682,27495 682,30939 682,35577 682,37440 682,39618 682,40542 682,40569 682,41096 682,41170 682,43776 682,44897 682,45684 682,50123 682,58820 682,60381 682,63434 682,63945 682,64555 682,65493 682,66559 682,66743 682,67885 682,70125 682,70356 682,70733 682,70896 682,72068 682,72439 682,75103 682,75992 682,77554 682,79879 682,82929 682,86765 682,88199 682,89843 682,91385 682,96288 682,99990 682,101741 682,106759 682,114523 682,124882 682,125401 682,131754 682,138816 682,142774 682,143341 682,143344 682,143424 682,145922 682,152437 682,156682 682,157209 682,162944 682,165676 682,168913 682,173713 682,174385 682,174386 682,175892 682,175999 682,189817 682,189819 682,189839 682,198338 682,201299 682,205637 682,215276 682,222369 682,224195 682,224205 682,229782 682,234079 682,234941 682,236520 682,244807 682,245912 682,261784 683,307 683,682 683,72439 684,685 684,827 684,1011 684,1243 684,4637 685,30 685,32 685,37 685,41 685,63 685,71 685,83 685,87 685,102 685,107 685,134 685,146 685,147 685,149 685,158 685,175 685,200 685,202 685,207 685,211 685,240 685,248 685,251 685,252 685,256 685,259 685,261 685,264 685,272 685,278 685,287 685,289 685,290 685,292 685,301 685,304 685,313 685,314 685,332 685,344 685,349 685,356 685,379 685,388 685,417 685,440 685,441 685,446 685,452 685,462 685,467 685,481 685,485 685,489 685,493 685,509 685,512 685,516 685,536 685,557 685,575 685,577 685,599 685,609 685,615 685,623 685,626 685,636 685,663 685,664 685,668 685,671 685,676 685,682 685,684 685,685 685,690 685,693 685,694 685,702 685,704 685,712 685,726 685,733 685,772 685,775 685,787 685,794 685,805 685,809 685,818 685,827 685,838 685,841 685,843 685,849 685,852 685,862 685,872 685,900 685,911 685,918 685,929 685,949 685,972 685,973 685,980 685,991 685,1001 685,1007 685,1010 685,1011 685,1014 685,1021 685,1058 685,1070 685,1087 685,1096 685,1113 685,1132 685,1133 685,1146 685,1151 685,1167 685,1172 685,1188 685,1192 685,1220 685,1222 685,1238 685,1240 685,1243 685,1267 685,1281 685,1285 685,1293 685,1298 685,1309 685,1319 685,1332 685,1345 685,1353 685,1368 685,1388 685,1402 685,1417 685,1434 685,1436 685,1465 685,1504 685,1515 685,1566 685,1580 685,1608 685,1619 685,1623 685,1634 685,1655 685,1663 685,1708 685,1715 685,1724 685,1732 685,1782 685,1801 685,1805 685,1807 685,1818 685,1836 685,1844 685,1848 685,1860 685,1881 685,1888 685,1893 685,1955 685,1985 685,1992 685,2006 685,2045 685,2296 685,2334 685,2367 685,2424 685,2460 685,2512 685,2572 685,2590 685,2607 685,2620 685,2779 685,2782 685,2784 685,2812 685,2874 685,2923 685,2944 685,2995 685,3069 685,3135 685,3182 685,3328 685,3422 685,3507 685,3509 685,3513 685,3538 685,3555 685,3564 685,3582 685,3595 685,3623 685,3967 685,4039 685,4123 685,4190 685,4220 685,4222 685,4257 685,4271 685,4276 685,4277 685,5213 685,5356 685,5405 685,5591 685,5647 685,5815 685,5961 685,6068 685,6430 685,6552 685,6638 685,6689 685,6883 685,7194 685,7318 685,7968 685,8149 685,8276 685,9015 685,9028 685,9457 685,13538 685,13576 685,14145 685,14519 685,14527 685,15128 685,15523 685,16201 685,16614 685,19010 685,19543 685,20539 685,21152 685,21442 685,22389 685,22711 685,23322 685,23437 685,23674 685,25526 685,25573 685,26450 685,26928 685,28141 685,30328 685,30331 685,30508 685,30557 685,32630 685,32976 685,33287 685,35497 685,38996 685,41230 685,41378 685,44725 685,44896 685,45028 685,48278 685,48505 685,54387 685,56567 685,57006 685,58527 685,62822 685,66297 685,70845 685,71610 685,72439 685,73216 685,73280 685,75045 685,75196 685,75912 685,76813 685,78130 685,80619 685,81233 685,81775 685,82739 685,90754 685,90756 685,90761 685,92476 685,93083 685,94134 685,97322 685,98239 685,99732 685,106261 685,107502 685,113021 685,114065 685,114539 685,117771 685,118254 685,118336 685,122905 685,130144 685,134298 685,135235 685,135236 685,145340 685,148362 685,148413 685,150430 685,151454 685,152460 685,152566 685,153710 685,155719 685,156931 685,162574 685,166981 685,169864 685,171778 685,173674 685,173684 685,174453 685,179252 685,185877 685,212455 685,214131 685,221828 685,263818 686,687 687,1374 688,626 689,163 689,467 689,571 689,690 689,788 689,868 690,259 690,314 690,356 690,446 690,599 690,668 690,673 690,685 690,689 690,690 690,788 690,796 690,849 690,852 690,859 690,1531 690,2373 690,3724 690,4446 690,6476 690,7921 690,14470 690,15510 690,15635 690,28813 690,37022 690,37809 690,41526 690,44209 690,48419 690,50332 690,54807 690,61213 690,62844 690,70994 690,71704 690,73350 690,75883 690,78678 690,79939 690,91897 690,103227 690,107466 690,107600 690,107984 690,109304 690,111792 690,112948 690,121385 690,126476 690,126619 690,127827 690,140354 690,140377 690,141773 690,173347 690,229580 691,32 691,87 691,392 691,697 691,872 691,1836 692,389 692,660 693,1 693,5 693,10 693,30 693,68 693,71 693,81 693,83 693,97 693,106 693,135 693,175 693,192 693,200 693,272 693,287 693,292 693,298 693,313 693,328 693,372 693,389 693,390 693,393 693,397 693,402 693,403 693,417 693,431 693,467 693,485 693,510 693,512 693,535 693,557 693,563 693,589 693,631 693,663 693,664 693,671 693,673 693,682 693,685 693,693 693,694 693,697 693,704 693,746 693,809 693,818 693,841 693,862 693,868 693,873 693,874 693,911 693,937 693,968 693,972 693,973 693,1001 693,1010 693,1085 693,1105 693,1113 693,1118 693,1149 693,1179 693,1188 693,1210 693,1238 693,1240 693,1243 693,1281 693,1284 693,1285 693,1298 693,1309 693,1319 693,1345 693,1417 693,1566 693,1590 693,1619 693,1623 693,1634 693,1688 693,1708 693,1722 693,1773 693,1776 693,1801 693,1803 693,1849 693,1888 693,1927 693,1985 693,2045 693,2379 693,2427 693,2496 693,2572 693,2620 693,2775 693,2979 693,2995 693,3009 693,3067 693,3422 693,3507 693,4220 693,4260 693,4455 693,4691 693,5213 693,5265 693,5718 693,6062 693,6068 693,6424 693,6621 693,7117 693,7318 693,7795 693,8414 693,13352 693,14415 693,14483 693,15528 693,15547 693,15552 693,15676 693,16014 693,17125 693,17942 693,19216 693,19877 693,19894 693,20004 693,20030 693,25857 693,26412 693,26450 693,30999 693,32268 693,32751 693,33354 693,34212 693,34295 693,34808 693,35400 693,35503 693,36924 693,41230 693,43141 693,45004 693,45140 693,48955 693,51933 693,58836 693,67536 693,70021 693,70212 693,70848 693,70997 693,75912 693,79032 693,81233 693,81262 693,82004 693,83416 693,83438 693,84748 693,85751 693,85814 693,89434 693,91008 693,93113 693,93311 693,98251 693,98384 693,99750 693,99807 693,100351 693,102096 693,102516 693,104354 693,113878 693,114600 693,121476 693,124608 693,133443 693,134706 693,144091 693,144231 693,144904 693,147518 693,164218 693,165748 693,167579 693,168388 693,185877 693,187176 693,189788 693,189793 693,193032 693,193578 693,207659 693,212015 693,217934 693,219984 693,233691 693,242913 693,245849 693,246818 693,254592 693,255502 693,259910 694,41 694,68 694,120 694,261 694,314 694,364 694,372 694,446 694,575 694,588 694,589 694,590 694,631 694,673 694,677 694,685 694,693 694,694 694,715 694,749 694,795 694,805 694,862 694,875 694,911 694,949 694,1010 694,1069 694,1118 694,1242 694,1353 694,1388 694,1466 694,1504 694,1512 694,1564 694,1566 694,1608 694,1634 694,1678 694,1808 694,1955 694,2045 694,2210 694,2253 694,2290 694,2373 694,2512 694,2646 694,2775 694,2812 694,2824 694,2991 694,3115 694,3517 694,3582 694,3623 694,3943 694,3964 694,3993 694,4231 694,4266 694,4377 694,4752 694,5186 694,5331 694,5935 694,6477 694,6773 694,6828 694,6856 694,7041 694,7196 694,7266 694,7896 694,7944 694,8535 694,9467 694,9756 694,13274 694,13304 694,13411 694,13657 694,14068 694,14109 694,14302 694,14358 694,14730 694,14820 694,15619 694,15711 694,15931 694,18746 694,19561 694,19857 694,20540 694,20723 694,21488 694,22168 694,22839 694,23334 694,24971 694,25272 694,26034 694,26341 694,27661 694,28338 694,28562 694,28812 694,29038 694,29741 694,30268 694,30328 694,31035 694,31397 694,32591 694,32751 694,32929 694,34013 694,34515 694,37730 694,38153 694,38316 694,38317 694,38318 694,40682 694,41124 694,41951 694,42070 694,42443 694,42762 694,42779 694,44293 694,44725 694,44838 694,45886 694,49239 694,49647 694,50318 694,50861 694,51505 694,52187 694,54979 694,57099 694,57351 694,59818 694,60079 694,60385 694,61205 694,61692 694,62286 694,63966 694,64108 694,66468 694,67266 694,67425 694,71031 694,74084 694,74419 694,75239 694,75971 694,80111 694,80944 694,82162 694,82169 694,82570 694,83379 694,86619 694,86659 694,91846 694,92237 694,97461 694,97545 694,103045 694,103052 694,106827 694,107062 694,107911 694,115972 694,117662 694,120186 694,123420 694,125056 694,127299 694,128888 694,129563 694,130891 694,131330 694,131876 694,131927 694,135270 694,136228 694,136507 694,136617 694,140100 694,141867 694,142422 694,142475 694,142558 694,146039 694,146401 694,146646 694,153336 694,154527 694,154686 694,155740 694,156226 694,156352 694,156693 694,157303 694,158212 694,163811 694,165262 694,165303 694,170010 694,172556 694,173477 694,175458 694,177237 694,181562 694,181788 694,181881 694,182162 694,184785 694,186482 694,189428 694,190239 694,190394 694,190412 694,191376 694,199645 694,206338 694,212327 694,212429 694,212438 694,212456 694,212465 694,212975 694,213080 694,214010 694,214810 694,215846 694,217836 694,217898 694,219908 694,224571 694,224631 694,224713 694,224728 694,224788 694,224827 694,225365 694,225408 694,225412 694,225415 694,225418 694,225422 694,225425 694,225431 694,225437 694,225438 694,225447 694,225458 694,225681 694,227209 694,228134 694,228210 694,228410 694,228943 694,229169 694,230488 694,230736 694,232104 694,232579 694,232580 694,232605 694,232811 694,232883 694,233339 694,233378 694,234132 694,235852 694,235876 694,236134 694,236142 694,236191 694,236915 694,237526 694,238921 694,240174 694,240995 694,241143 694,241640 694,242262 694,244593 694,245386 694,247187 694,247214 694,248593 694,250685 694,253182 694,253183 694,253482 694,254398 694,254410 694,254503 696,697 697,207 697,314 697,356 697,440 697,452 697,509 697,510 697,599 697,623 697,673 697,676 697,697 697,809 697,818 697,838 697,852 697,868 697,872 697,911 697,919 697,1011 697,1014 697,1046 697,1130 697,1210 697,1240 697,1345 697,1465 697,1634 697,1801 697,1805 697,1860 697,1973 697,2373 697,3507 697,4190 697,4760 697,19010 697,127158 697,138686 698,37 698,346 698,444 698,446 698,567 698,604 698,663 698,685 698,698 698,699 698,717 698,762 698,936 698,937 698,938 698,1136 698,1215 698,1231 698,1293 698,1740 698,1782 698,3422 698,4190 698,5262 698,7339 698,13353 698,13454 698,13991 698,24629 698,25255 698,34162 698,37362 698,42602 698,44808 698,46638 698,68131 698,77637 698,78868 698,85842 698,89522 698,137001 698,137150 698,151334 698,161560 698,164362 698,165989 698,170529 698,175322 698,194304 698,216642 698,222552 698,224111 698,237364 698,247098 699,698 700,602 700,42064 701,195 701,202 701,203 701,602 701,620 701,2244 701,8244 702,192 702,256 702,326 702,663 702,685 702,693 702,702 702,703 702,873 702,874 702,991 702,1146 702,1210 702,1607 702,4272 702,5667 702,17897 702,19422 702,24464 702,29937 702,37374 702,60444 702,64152 702,80555 702,91793 702,93113 702,103676 702,127637 702,127689 702,139584 702,143434 702,147515 702,168850 702,168882 702,179721 702,233090 702,234099 702,234260 703,87 703,292 703,702 703,852 703,1011 703,2253 704,10 704,30 704,81 704,175 704,215 704,233 704,254 704,289 704,290 704,328 704,452 704,485 704,502 704,503 704,588 704,590 704,592 704,673 704,677 704,685 704,693 704,704 704,705 704,714 704,760 704,797 704,805 704,843 704,849 704,852 704,911 704,1011 704,1016 704,1118 704,1130 704,1149 704,1212 704,1257 704,1281 704,1282 704,1402 704,1511 704,1631 704,1796 704,1818 704,1844 704,2205 704,2206 704,2210 704,2286 704,2580 704,3067 704,3069 704,3507 704,4218 704,4237 704,4286 704,4358 704,4980 704,5265 704,6723 704,8110 704,9001 704,13495 704,13506 704,13563 704,13704 704,14500 704,16755 704,17573 704,18603 704,18816 704,19575 704,22125 704,22482 704,25536 704,26450 704,26552 704,26836 704,26837 704,26838 704,27080 704,30124 704,30733 704,31193 704,33138 704,33424 704,35440 704,57896 704,61692 704,63909 704,63956 704,65683 704,72425 704,72742 704,74547 704,85752 704,92519 704,94134 704,111142 704,117692 704,127750 704,132410 704,134822 704,136194 704,139599 704,147095 704,158379 704,159147 704,159908 704,170061 704,170229 704,171420 704,172243 704,174552 704,174558 704,174942 704,176782 704,178715 704,182162 704,183615 704,185125 704,185499 704,194659 704,197555 704,201872 704,204159 704,204175 704,204613 704,218791 704,232709 704,234075 704,234300 704,236983 704,245910 704,249787 704,251719 704,256452 706,660 707,707 707,708 707,867 707,875 707,1030 707,1120 707,1345 707,1446 707,1696 707,1801 707,2440 707,3043 707,3182 707,3383 707,3468 707,3878 707,4099 707,5739 707,6424 707,6589 707,6979 707,7226 707,8177 707,9379 707,9743 707,13245 707,13477 707,13591 707,14061 707,14098 707,15187 707,15467 707,16559 707,16581 707,17569 707,19299 707,19550 707,23009 707,23311 707,24348 707,25580 707,28107 707,28199 707,29677 707,34889 707,37429 707,37471 707,41104 707,41174 707,44971 707,47095 707,48505 707,74953 707,79342 707,80946 707,98012 707,106259 707,124390 707,140229 707,151760 707,152125 707,159318 707,165369 707,165370 707,165440 707,165570 707,165829 707,166059 707,166504 707,166508 707,166807 707,167304 707,168982 707,170678 707,170679 707,170840 707,171029 707,171035 707,171111 707,171386 707,171693 707,171694 707,171695 707,172160 707,172355 707,172356 707,176315 707,178910 707,178912 707,179060 707,180477 707,181980 707,182100 707,182151 707,183498 707,183734 707,183879 707,184258 707,188302 707,189886 707,190452 707,190733 707,191001 707,192023 707,192666 707,193615 707,193617 707,193618 707,194178 707,194538 707,195075 707,195413 707,207438 707,212076 707,217572 707,217682 707,217910 707,232284 707,235620 707,245542 707,255538 707,255545 707,258143 707,264592 708,707 709,710 710,11 710,20 710,87 710,314 710,397 710,440 710,452 710,457 710,500 710,599 710,673 710,676 710,1011 710,1014 710,1118 710,1191 710,1368 710,1417 710,1655 710,19413 710,21589 711,48 712,356 712,452 712,497 712,599 712,668 712,713 712,843 712,1172 712,1402 712,1434 712,2310 712,2580 712,3535 712,3645 712,3967 712,6756 712,15359 712,25427 712,25531 712,25598 712,28331 712,86438 712,97445 712,108156 712,116879 712,124571 712,130733 712,145311 712,150112 712,183319 712,243502 713,481 713,581 713,668 713,712 713,713 713,911 713,1172 713,1262 713,1603 713,2310 713,3967 713,5785 713,6861 713,19413 713,20936 713,97337 713,98012 713,106259 713,136675 713,147849 714,24 714,104 714,240 714,264 714,289 714,290 714,304 714,314 714,328 714,346 714,372 714,373 714,441 714,483 714,502 714,534 714,588 714,590 714,599 714,612 714,631 714,677 714,704 714,714 714,715 714,760 714,797 714,805 714,862 714,1119 714,1147 714,1212 714,1252 714,1253 714,1282 714,1326 714,1402 714,1462 714,1511 714,1608 714,1641 714,1704 714,1738 714,1745 714,1962 714,2008 714,2193 714,2205 714,2206 714,2208 714,2286 714,2376 714,2443 714,2512 714,2572 714,2918 714,2965 714,3069 714,3508 714,4218 714,4222 714,4276 714,4308 714,4367 714,4402 714,5011 714,5225 714,5265 714,5574 714,6462 714,6856 714,6869 714,8012 714,8275 714,8279 714,9391 714,13207 714,14080 714,14603 714,15229 714,15397 714,15827 714,16210 714,16479 714,16709 714,18673 714,20869 714,22268 714,24839 714,26396 714,31893 714,32915 714,33424 714,33567 714,37741 714,39390 714,40589 714,43394 714,43878 714,44084 714,44725 714,46874 714,48451 714,48709 714,49035 714,55690 714,57910 714,59273 714,61004 714,61974 714,62361 714,65681 714,66868 714,67507 714,70305 714,71993 714,74547 714,74696 714,78696 714,87799 714,92656 714,94134 714,96712 714,104590 714,111142 714,112364 714,114064 714,116543 714,117695 714,119999 714,121616 714,127846 714,132240 714,132536 714,134329 714,134560 714,137957 714,138185 714,139848 714,140690 714,144988 714,145930 714,148090 714,159744 714,160101 714,160408 714,160484 714,161116 714,167063 714,173368 714,180972 714,182162 714,182606 714,185351 714,187955 714,190242 714,195069 714,198174 714,212302 714,220939 714,238366 714,244816 714,245910 714,250339 714,251212 714,256190 714,256953 714,257067 714,257129 714,264039 715,41 715,48 715,68 715,87 715,104 715,107 715,130 715,134 715,135 715,138 715,167 715,200 715,215 715,225 715,227 715,240 715,248 715,254 715,256 715,264 715,289 715,290 715,298 715,304 715,312 715,323 715,332 715,364 715,372 715,417 715,431 715,442 715,457 715,557 715,577 715,609 715,631 715,636 715,649 715,694 715,714 715,749 715,760 715,784 715,801 715,805 715,818 715,862 715,872 715,932 715,943 715,999 715,1001 715,1007 715,1012 715,1016 715,1052 715,1078 715,1082 715,1085 715,1119 715,1140 715,1147 715,1212 715,1282 715,1285 715,1326 715,1359 715,1368 715,1388 715,1392 715,1415 715,1432 715,1462 715,1466 715,1509 715,1631 715,1635 715,1659 715,1745 715,1749 715,1807 715,1818 715,1882 715,1888 715,1893 715,1939 715,1955 715,1962 715,2105 715,2205 715,2206 715,2209 715,2253 715,2286 715,2296 715,2315 715,2334 715,2572 715,2775 715,2995 715,3069 715,3115 715,3474 715,3623 715,3695 715,3769 715,4218 715,4220 715,4222 715,4355 715,4771 715,5405 715,6695 715,7194 715,8537 715,9025 715,33424 715,36819 715,54004 715,94134 715,136072 715,245910 716,717 716,1782 717,37 717,301 717,444 717,567 717,604 717,615 717,663 717,664 717,668 717,698 717,716 717,717 717,937 717,968 717,1145 717,1231 717,1293 717,1715 717,1740 717,1782 717,1849 717,1973 717,2236 717,2272 717,2278 717,3422 717,3437 717,4004 717,4270 717,5382 717,6398 717,7087 717,7222 717,13454 717,14677 717,15846 717,17569 717,18580 717,19409 717,19494 717,22148 717,23727 717,23774 717,24776 717,24990 717,25169 717,25759 717,26034 717,26433 717,30425 717,30445 717,32784 717,33726 717,33757 717,34193 717,34393 717,34966 717,35055 717,35591 717,37750 717,37753 717,38884 717,39080 717,43192 717,43197 717,43201 717,44235 717,44238 717,44411 717,46638 717,46868 717,48224 717,48294 717,49582 717,49700 717,51932 717,56427 717,62969 717,79528 717,85732 717,86429 717,97279 717,104401 717,104592 717,106213 717,106765 717,109840 717,110760 717,111348 717,114710 717,115997 717,119406 717,119479 717,119566 717,119852 717,130273 717,130279 717,130404 717,130958 717,131674 717,133557 717,136184 717,139951 717,140134 717,142070 717,144906 717,145327 717,145388 717,145391 717,145419 717,145728 717,150083 717,157333 717,157374 717,159034 717,159036 717,159059 717,163829 717,163847 717,163898 717,165674 717,165913 717,168433 717,168435 717,169480 717,169823 717,171052 717,179465 717,180218 717,181221 717,182857 717,186655 717,186656 717,187487 717,192906 717,194417 717,213990 717,217617 717,218906 717,222388 717,228186 717,232712 718,54 718,109 718,211 718,310 718,366 718,500 718,512 718,719 718,738 718,786 718,830 718,847 718,893 718,929 718,1110 718,1129 718,1358 718,1566 718,1657 718,1704 718,2151 718,2297 718,2540 718,2728 718,2968 718,3039 718,3087 718,3090 718,3614 718,3692 718,4036 718,4427 718,4595 718,5922 718,6112 718,6448 718,6500 718,6936 718,6988 718,7132 718,7748 718,7789 718,7981 718,8052 718,8808 718,8818 718,9072 718,9117 718,9375 718,9446 718,9545 718,11742 718,12278 718,13320 718,13749 718,13808 718,13898 718,14431 718,14540 718,14740 718,17642 718,19122 718,19493 718,19847 718,19954 718,20046 718,20069 718,20483 718,20638 718,20652 718,21551 718,21981 718,22523 718,22843 718,23476 718,23603 718,23755 718,23781 718,23874 718,24034 718,24574 718,24590 718,24965 718,25603 718,25731 718,26371 718,27828 718,27849 718,27915 718,28129 718,28218 718,28220 718,28313 718,28358 718,28393 718,28484 718,28624 718,28983 718,29071 718,30341 718,30903 718,31531 718,33311 718,33351 718,34087 718,34139 718,34326 718,34333 718,34404 718,34538 718,34778 718,34969 718,34992 718,35350 718,35358 718,35730 718,36296 718,36303 718,36558 718,36630 718,36680 718,37103 718,37233 718,37402 718,37422 718,38737 718,39560 718,39984 718,40000 718,42060 718,42334 718,42578 718,43404 718,43688 718,43691 718,43693 718,43696 718,43699 718,43735 718,43897 718,43972 718,44164 718,44452 718,44465 718,44715 718,44839 718,44873 718,44941 718,45669 718,45824 718,45831 718,45838 718,46473 718,46837 718,46850 718,46852 718,47715 718,47791 718,47792 718,47803 718,47821 718,47861 718,47954 718,48155 718,48285 718,48352 718,48386 718,48550 718,48553 718,48705 718,48728 718,48739 718,49010 718,49028 718,49119 718,49124 718,49128 718,49130 718,49140 718,49141 718,53420 718,54027 718,54262 718,54305 718,54527 718,54781 718,54949 718,55957 718,56480 718,57024 718,57035 718,57065 718,57226 718,57637 718,58101 718,58374 718,58666 718,58804 718,59232 718,59233 718,59236 718,61023 718,61034 718,61108 718,61112 718,61243 718,61351 718,61682 718,61923 718,65863 718,68096 718,71643 718,75235 718,76946 718,77805 718,78165 718,80969 718,82095 718,82208 718,82732 718,84694 718,85156 718,85882 718,88370 718,89032 718,89366 718,90711 718,90739 718,90912 718,92273 718,92971 718,93030 718,93986 718,95334 718,97639 718,102210 718,103218 718,103767 718,103793 718,104051 718,104918 718,105643 718,105658 718,105662 718,107208 718,107343 718,107975 718,108010 718,108096 718,108173 718,108270 718,108433 718,108516 718,108847 718,109008 718,109105 718,109289 718,109512 718,109588 718,109643 718,109947 718,111973 718,112468 718,112479 718,113358 718,114509 718,114547 718,115318 718,115721 718,117557 718,117787 718,117811 718,117928 718,118351 718,118820 718,118831 718,118842 718,118847 718,120960 718,122055 718,122403 718,122510 718,124007 718,124818 718,124887 718,125113 718,125188 718,126008 718,126969 718,127670 718,128129 718,128369 718,128635 718,129587 718,129856 718,130270 718,131318 718,131319 718,131323 718,131325 718,131964 718,132670 718,132918 718,133034 718,133221 718,134528 718,134548 718,134948 718,135625 718,135908 718,136211 718,136327 718,136436 718,136453 718,136566 718,136610 718,136653 718,136964 718,139273 718,139399 718,139520 718,139569 718,139938 718,140058 718,140328 718,140329 718,140519 718,140911 718,142460 718,142814 718,143567 718,144009 718,144774 718,145093 718,145400 718,145880 718,145994 718,146191 718,146272 718,147096 718,147250 718,150086 718,151470 718,151916 718,156128 718,156488 718,157327 718,158291 718,158654 718,159970 718,160745 718,160773 718,161100 718,161492 718,161955 718,161999 718,162275 718,162545 718,162559 718,162603 718,164057 718,165778 718,166620 718,166682 718,167060 718,169528 718,169990 718,170547 718,170683 718,170784 718,171031 718,171120 718,171652 718,172309 718,173762 718,174412 718,176428 718,178887 718,179174 718,179373 718,180239 718,180262 718,180375 718,181455 718,181730 718,181763 718,181766 718,181776 718,181827 718,182808 718,183407 718,183603 718,184319 718,185120 718,185711 718,186239 718,186681 718,187214 718,187699 719,718 720,106 720,534 720,720 720,721 720,877 720,907 720,937 720,972 720,973 720,1010 720,1117 720,1122 720,1284 720,1298 720,1360 720,1439 720,1544 720,1715 720,2063 720,3386 720,3477 720,3526 720,3677 720,4362 720,4779 720,5026 720,5138 720,5154 720,5662 720,6675 720,7234 720,8291 720,8435 720,13429 720,15202 720,15695 720,18570 720,18662 720,18666 720,18679 720,21095 720,22435 720,23693 720,25824 720,26829 720,28637 720,29673 720,29761 720,30549 720,35342 720,39445 720,39464 720,45853 720,121882 721,720 721,907 721,1117 722,182 723,509 723,510 723,872 723,1043 723,1267 723,1349 723,1653 723,1819 723,2245 723,2748 723,5846 723,8283 723,8321 723,14424 723,21183 723,22255 723,24306 723,24510 723,24511 723,24850 723,25305 723,25650 723,26667 723,26929 723,41211 723,42588 723,46217 724,178 724,439 724,1776 725,510 725,818 726,10 726,65 726,171 726,259 726,272 726,393 726,446 726,577 726,685 726,726 726,727 726,788 726,859 726,868 726,897 726,902 726,980 726,1068 726,1105 726,1118 726,1388 726,1429 726,1456 726,1460 726,1531 726,1640 726,1993 726,2023 726,2030 726,2107 726,2253 726,2255 726,2641 726,3011 726,3990 726,4174 726,4545 726,4611 726,5080 726,5395 726,5757 726,5766 726,7168 726,7388 726,7472 726,7802 726,13895 726,14280 726,14371 726,15074 726,15469 726,15980 726,17904 726,19419 726,19465 726,21286 726,21437 726,21578 726,24837 726,28312 726,32691 726,34746 726,35486 726,36617 726,37986 726,41352 726,41773 726,44350 726,44377 726,45993 726,48471 726,50327 726,50429 726,56246 726,56247 726,56934 726,61237 726,63636 726,68816 726,71821 726,76718 726,76883 726,78894 726,80741 726,81515 726,82819 726,85859 726,85979 726,86592 726,91988 726,93152 726,93822 726,98094 726,103086 726,107104 726,108156 726,108159 726,109870 726,110769 726,122174 726,122956 726,123088 726,126941 726,128145 726,139010 726,139512 726,139515 726,141248 726,152598 726,153690 726,154354 726,155135 726,155398 726,156655 726,157632 726,158980 726,159802 726,161746 726,162563 726,171608 726,171701 726,176404 726,176915 726,177002 726,177023 726,177337 726,180978 726,185904 726,188560 726,191135 726,203662 726,205639 726,213966 726,213976 726,214849 726,221661 726,221662 726,221840 726,234299 726,247257 726,247260 726,248077 726,256795 726,260156 726,263784 726,263786 727,726 728,120 729,364 729,431 730,20 730,86 730,481 730,644 730,731 730,18726 730,66500 731,731 731,1191 731,2356 731,4706 731,7605 731,7606 731,8419 731,13375 731,14958 731,14959 731,14960 731,24287 731,42963 731,46552 731,50694 731,52925 732,1 732,493 732,733 732,1052 733,1 733,146 733,202 733,251 733,252 733,275 733,287 733,336 733,344 733,397 733,406 733,493 733,505 733,516 733,535 733,682 733,685 733,693 733,732 733,733 733,809 733,841 733,849 733,911 733,920 733,1118 733,1175 733,1220 733,1222 733,1243 733,1265 733,1266 733,1512 733,1619 733,1623 733,1655 733,1707 733,2014 733,2460 733,2622 733,4156 733,4190 733,6824 733,7104 733,8491 733,16579 733,19340 733,21516 733,23861 733,26973 733,26975 733,36798 733,38517 733,41915 733,49373 733,56807 733,59206 733,64078 733,72439 733,72479 733,72664 733,73302 733,75912 733,78910 733,82252 733,83306 733,83379 733,83393 733,87245 733,87998 733,93206 733,97423 733,99101 733,103814 733,107600 733,114581 733,118336 733,118360 733,134695 733,144999 733,158148 733,159069 733,162893 733,167122 733,179797 733,181903 733,181905 733,181908 733,181910 733,189839 733,205404 733,207659 733,212381 733,215276 733,224010 734,138 735,736 736,160 736,626 736,673 736,736 736,1973 736,2373 737,140 737,264 737,338 737,1127 737,1147 737,1224 737,1893 737,2051 737,49057 739,4 739,5 739,527 739,740 739,741 739,743 739,1983 742,527 742,743 743,4 743,5 743,355 743,527 743,741 743,743 743,3108 743,4810 743,5208 743,5650 743,6209 743,8714 743,14316 743,95583 743,111321 743,113445 743,234141 744,46 744,167 744,299 744,444 744,459 744,522 744,567 744,665 744,744 744,783 744,852 744,968 744,973 744,1092 744,1124 744,1160 744,1231 744,1276 744,1284 744,1298 744,1300 744,1479 744,1522 744,1544 744,1732 744,1849 744,2083 744,3422 744,3556 744,3575 744,3630 744,4240 744,6357 744,6661 744,8658 744,18188 744,21230 744,26057 744,30324 744,32784 744,41835 744,46761 744,54637 744,63094 744,70314 744,96685 744,102698 744,103860 744,128516 744,149246 744,177053 744,214576 745,15 745,107 745,292 745,338 745,441 745,446 745,462 745,632 745,668 745,745 745,849 745,872 745,910 745,1043 745,1058 745,1238 745,1449 745,1572 745,1677 745,2163 745,2595 745,2646 745,3483 745,3538 745,3830 745,5738 745,6502 745,6880 745,7530 745,7698 745,7768 745,9070 745,15339 745,16527 745,16614 745,19687 745,25495 745,25646 745,34933 745,36358 745,37414 745,49692 745,61049 745,62417 745,74634 745,75211 745,75507 745,82217 745,84017 745,84632 745,119098 745,120680 745,122942 745,128150 745,135076 745,135078 745,135094 745,163863 745,169836 745,207659 745,236682 745,240875 746,292 746,446 746,745 747,4 747,5 747,527 747,740 747,741 747,743 747,827 747,8714 748,749 748,818 749,58 749,107 749,111 749,292 749,441 749,442 749,609 749,694 749,749 749,784 749,795 749,801 749,818 749,911 749,1140 749,1146 749,1188 749,1332 749,1368 749,1388 749,1572 749,1722 749,2334 749,2775 749,3474 749,4165 749,4771 750,1293 751,347 751,752 752,22 752,207 752,287 752,326 752,347 752,425 752,433 752,457 752,599 752,673 752,751 752,752 752,818 752,873 752,874 752,968 752,1011 752,1014 752,1049 752,1118 752,1133 752,1210 752,1359 752,1561 752,1634 752,1801 752,1853 752,2045 752,2182 752,2659 752,2989 752,2991 752,3407 752,4272 752,4388 752,5250 752,5851 752,7013 752,10216 752,14827 752,18587 752,19309 752,19823 752,26034 752,26081 752,26905 752,29009 752,38300 752,43095 752,44962 752,46165 752,47095 752,48109 752,55012 752,55019 752,55101 752,56430 752,62457 752,63990 752,76129 752,78679 752,87817 752,91322 752,93113 752,101551 752,103402 752,103409 752,109339 752,109948 752,114099 752,133784 752,143959 752,147446 752,147515 752,150105 752,158817 752,167592 752,168889 752,169070 752,173316 752,176059 752,182382 752,184759 752,187280 752,187285 752,191175 752,191244 752,191291 752,191831 752,191846 752,193425 752,212528 752,213985 752,215372 752,215540 752,220364 752,220475 752,221056 752,221951 752,224041 752,224727 752,226401 752,227348 752,231005 752,244360 752,249106 752,249663 752,250848 752,251238 752,252067 752,254389 752,255163 752,260370 753,255 754,660 756,298 757,758 757,1105 758,2520 758,9054 758,16338 758,16349 758,19127 758,30595 758,35836 758,37113 758,38296 759,485 760,10 760,41 760,104 760,108 760,111 760,175 760,289 760,290 760,314 760,328 760,373 760,431 760,479 760,588 760,590 760,622 760,631 760,632 760,638 760,677 760,685 760,704 760,714 760,715 760,760 760,761 760,784 760,791 760,805 760,1001 760,1004 760,1011 760,1048 760,1119 760,1149 760,1192 760,1213 760,1266 760,1285 760,1346 760,1402 760,1462 760,1489 760,1505 760,1631 760,1808 760,1818 760,1873 760,1893 760,1973 760,2008 760,2069 760,2175 760,2206 760,2348 760,2383 760,2408 760,2620 760,2982 760,3069 760,3407 760,3464 760,3508 760,3565 760,3566 760,3694 760,3760 760,3776 760,3867 760,3947 760,4063 760,4097 760,4265 760,4294 760,4308 760,4809 760,5265 760,5346 760,5351 760,5535 760,5545 760,5679 760,6574 760,6753 760,6821 760,6853 760,6858 760,6923 760,6928 760,7166 760,7739 760,7758 760,7790 760,7962 760,8180 760,8451 760,8537 760,8763 760,9028 760,9451 760,13166 760,13207 760,13303 760,13452 760,14080 760,14105 760,14414 760,14437 760,14487 760,14524 760,14538 760,14582 760,15397 760,15664 760,15952 760,16137 760,16173 760,16439 760,16448 760,18160 760,18450 760,18766 760,18793 760,19310 760,19454 760,19475 760,19617 760,19859 760,19868 760,20301 760,20484 760,20652 760,21187 760,21321 760,21541 760,21552 760,21732 760,22299 760,23294 760,24590 760,24613 760,24644 760,24672 760,24753 760,25597 760,25814 760,26110 760,26396 760,26813 760,26867 760,26937 760,27088 760,27432 760,27680 760,28136 760,28198 760,28310 760,28867 760,29018 760,29144 760,29310 760,30268 760,30405 760,30549 760,31474 760,32591 760,33085 760,33441 760,33506 760,33609 760,33750 760,34707 760,34962 760,34978 760,35371 760,35402 760,35416 760,35528 760,36256 760,36795 760,38300 760,38497 760,39526 760,40028 760,40071 760,40850 760,41382 760,41395 760,41682 760,43331 760,43647 760,44298 760,44341 760,44839 760,44863 760,46580 760,46698 760,48064 760,49346 760,49387 760,49657 760,50856 760,51883 760,51896 760,54572 760,55038 760,56412 760,57802 760,58074 760,58145 760,58964 760,59045 760,59088 760,59123 760,59208 760,60304 760,60356 760,60500 760,60548 760,61324 760,62273 760,62371 760,62526 760,62809 760,62921 760,63090 760,63909 760,65681 760,65747 760,65984 760,67381 760,68596 760,68771 760,68865 760,69916 760,71880 760,73414 760,73741 760,75207 760,75216 760,79619 760,82151 760,82371 760,87009 760,90418 760,91177 760,91976 760,92874 760,93029 760,94134 760,94703 760,94705 760,94814 760,95375 760,96719 760,98335 760,98492 760,98933 760,98967 760,99724 760,102116 760,102664 760,103366 760,103927 760,105221 760,106239 760,106299 760,106363 760,106924 760,106981 760,107386 760,109419 760,112570 760,112805 760,112919 760,113541 760,113969 760,114041 760,114445 760,114843 760,115849 760,117946 760,118020 760,118848 760,119316 760,119334 760,119415 760,119789 760,120875 760,121000 760,121531 760,121556 760,122440 760,124062 760,124519 760,125245 760,125713 760,125869 760,126026 760,127732 760,128666 760,129535 760,129805 760,129888 760,129916 760,130047 760,130269 760,130336 760,130878 760,131030 760,132005 760,133288 760,133828 760,134543 760,134691 760,134720 760,136297 760,136571 760,136722 760,137275 760,138246 760,138271 760,138308 760,139201 760,139527 760,139695 760,140342 760,141120 760,142568 760,142637 760,143064 760,143974 760,144098 760,146772 760,148090 760,149661 760,150456 760,154319 760,154324 760,154431 760,154711 760,157321 760,157324 760,159127 760,159908 760,159989 760,160397 760,160894 760,160939 760,161107 760,161108 760,161150 760,161627 760,161872 760,162409 760,162546 760,162645 760,163068 760,163270 760,163274 760,163288 760,164432 760,164926 760,164974 760,165318 760,165631 760,165730 760,166628 760,166680 760,166820 760,167798 760,169828 760,171322 760,171629 760,172094 760,173068 760,173288 760,173459 760,173574 760,173578 760,174304 760,175085 760,178446 760,178559 760,181633 760,181801 760,181845 760,182432 760,182718 760,182903 760,183764 760,189383 760,189947 760,191140 760,192946 760,197619 760,199008 760,202764 760,206880 760,212521 760,212567 760,212620 760,212908 760,213267 760,215412 760,215905 760,216016 760,217532 760,220766 760,221734 760,221901 760,221906 760,222603 760,224074 760,224096 760,224643 760,224877 760,225702 760,228257 760,228592 760,229592 760,229803 760,231171 760,238959 760,241036 760,243394 760,243921 760,245302 760,245322 760,246520 760,247781 760,248005 760,248617 760,255730 760,256408 760,256426 760,257918 760,260227 761,104 761,111 761,136 761,137 761,431 761,525 761,588 761,590 761,631 761,760 761,805 761,818 761,1011 761,1119 761,1285 761,1402 761,1462 761,1631 761,1955 761,8276 761,8537 761,232709 762,356 762,360 762,567 762,604 762,663 762,665 762,666 762,698 762,762 762,763 762,783 762,877 762,900 762,1117 762,1436 762,1616 762,1635 762,1692 762,1704 762,1732 762,2217 762,2557 762,2979 762,3392 762,3417 762,3869 762,4091 762,4998 762,6650 762,8011 762,13991 762,17662 762,19675 762,23031 762,30328 762,34721 762,35394 762,37534 762,38349 762,38959 762,43675 762,58173 762,62439 762,63491 762,65725 762,71969 762,82217 762,90253 762,94845 762,98965 762,105730 762,112883 762,116047 762,133545 762,135267 762,137059 762,139928 762,149246 762,161519 762,163010 762,170040 762,183843 762,216540 762,226176 762,238107 762,258281 763,762 764,314 764,452 764,457 764,599 764,676 764,765 764,775 764,795 764,849 764,1014 764,1411 764,1599 764,2006 764,3166 764,3804 764,5130 764,5169 764,5385 764,5388 764,5961 764,6904 764,9457 764,15109 764,23437 764,39618 764,193637 764,195467 764,201910 764,207659 764,212300 764,215874 764,249055 765,68 765,186 765,417 765,425 765,589 765,599 765,609 765,685 765,775 765,784 765,794 765,795 765,801 765,852 765,911 765,1001 765,1011 765,1085 765,1204 765,1326 765,1580 765,1796 765,1973 765,2334 765,3094 765,3804 765,5130 765,5961 765,26450 765,185874 766,151 766,178 766,217 766,346 766,393 766,406 766,435 766,438 766,439 766,447 766,457 766,516 766,538 766,671 766,980 766,1010 766,1033 766,1294 766,1417 766,1531 766,1590 766,1776 766,1877 766,1913 766,4611 766,6654 766,6661 766,13486 766,38439 767,302 768,160 769,87 769,264 769,479 769,510 769,515 769,647 769,697 769,770 769,872 769,991 769,1052 769,1146 769,1151 769,1267 769,1287 769,1381 769,1579 769,1659 769,1893 769,2260 769,2605 769,2626 769,3260 769,32673 769,49057 770,509 770,510 770,157095 771,772 771,1309 772,30 772,134 772,137 772,175 772,200 772,225 772,248 772,294 772,328 772,364 772,557 772,596 772,685 772,693 772,772 772,911 772,953 772,954 772,1016 772,1018 772,1213 772,1281 772,1282 772,1309 772,1332 772,1368 772,1663 772,1882 772,2105 772,3504 772,3565 772,3807 772,4078 772,4276 772,4315 772,4398 772,4613 772,4936 772,4941 772,5405 772,5439 772,8133 772,8757 772,9529 772,13207 772,15234 772,15807 772,17116 772,17125 772,17893 772,20604 772,20900 772,23665 772,23698 772,25041 772,26162 772,26250 772,26251 772,26261 772,26264 772,26265 772,26938 772,28203 772,32722 772,32968 772,36913 772,37545 772,40447 772,42541 772,53335 772,64247 772,64856 772,66155 772,70346 772,70970 772,72068 772,73958 772,74766 772,75126 772,75299 772,85814 772,86116 772,89783 772,90290 772,91622 772,94317 772,95554 772,99125 772,99408 772,99794 772,99807 772,99810 772,101950 772,107609 772,109568 772,109655 772,114669 772,117177 772,117183 772,117281 772,117376 772,117712 772,121517 772,123102 772,124967 772,125879 772,126032 772,126852 772,128313 772,128489 772,129534 772,130466 772,137101 772,141175 772,159746 772,161268 773,182 774,710 775,186 775,256 775,314 775,425 775,431 775,444 775,446 775,518 775,589 775,599 775,673 775,685 775,764 775,765 775,775 775,795 775,801 775,849 775,911 775,973 775,999 775,1001 775,1011 775,1056 775,1172 775,1262 775,1284 775,1326 775,1411 775,1504 775,1545 775,1732 775,2006 775,2209 775,2747 775,3094 775,3166 775,3407 775,3422 775,3507 775,3718 775,3804 775,4308 775,4407 775,4409 775,4499 775,5129 775,5130 775,5385 775,5388 775,5961 775,7959 775,8261 775,9739 775,13282 775,14193 775,14572 775,15109 775,15135 775,15226 775,15633 775,16122 775,19005 775,21362 775,21471 775,21712 775,22440 775,23437 775,26109 775,26450 775,27116 775,30557 775,31343 775,31454 775,31802 775,33016 775,34059 775,34863 775,34963 775,38337 775,38338 775,41139 775,43334 775,44792 775,45032 775,45968 775,46323 775,46690 775,46722 775,48006 775,55582 775,61105 775,63348 775,64681 775,67152 775,68086 775,68607 775,71688 775,73453 775,76186 775,78873 775,78898 775,79631 775,79942 775,82642 775,96704 775,99811 775,103035 775,107083 775,109838 775,122439 775,122905 775,122991 775,128872 775,129775 775,130335 775,135235 775,136515 775,140482 775,159720 775,174209 775,180240 775,191936 775,204692 775,224512 775,225527 775,227187 775,230919 775,241721 775,243883 775,248489 776,527 776,740 776,741 776,743 776,95152 777,187 778,50 778,158 778,406 778,779 778,1515 779,50 779,99 779,146 779,147 779,158 779,175 779,192 779,195 779,285 779,314 779,333 779,336 779,346 779,358 779,392 779,406 779,410 779,438 779,505 779,509 779,510 779,602 779,620 779,640 779,644 779,676 779,778 779,779 779,841 779,875 779,1014 779,1173 779,1181 779,1210 779,1218 779,1369 779,1370 779,1425 779,1456 779,1464 779,1502 779,1515 779,1518 779,1776 779,1825 779,1969 779,1973 779,2132 779,2307 779,2418 779,2452 779,2764 779,2792 779,2875 779,2880 779,2903 779,2969 779,3060 779,3070 779,3195 779,3255 779,3449 779,3507 779,3592 779,3895 779,4465 779,4558 779,4617 779,5360 779,5592 779,7006 779,7794 779,7818 779,7880 779,8055 779,8174 779,8244 779,9533 779,13589 779,13592 779,13623 779,13994 779,14040 779,14136 779,14700 779,16341 779,16563 779,17151 779,17236 779,17551 779,18457 779,18797 779,18931 779,19299 779,19825 779,19936 779,20160 779,20502 779,22135 779,22338 779,23669 779,23816 779,23926 779,23941 779,23954 779,23991 779,24021 779,24045 779,24056 779,24095 779,24153 779,24163 779,24166 779,24182 779,24183 779,24185 779,24187 779,24198 779,24203 779,24211 779,24229 779,24235 779,24835 779,24895 779,25125 779,25259 779,25694 779,26427 779,26434 779,26892 779,26972 779,27012 779,27326 779,28838 779,29037 779,30673 779,32768 779,33459 779,35549 779,36054 779,37387 779,38300 779,38359 779,40803 779,41055 779,41148 779,44247 779,46609 779,46844 779,47255 779,48715 779,49536 779,49547 779,49560 779,49561 779,49563 779,49564 779,49566 779,49567 779,49572 779,49573 779,49574 779,49575 779,49579 779,49580 779,49585 779,49586 779,49587 779,49589 779,51520 779,58131 779,58787 779,59655 779,62095 779,62890 779,63126 779,63522 779,63650 779,63942 779,64258 779,64966 779,65764 779,66011 779,66731 779,67422 779,68069 779,68525 779,69084 779,69209 779,71079 779,71080 779,71830 779,71917 779,75783 779,75798 779,77993 779,78463 779,79387 779,79639 779,80722 779,81127 779,82455 779,84144 779,86435 779,86686 779,87277 779,87824 779,87952 779,87975 779,88444 779,88692 779,88867 779,89761 779,90794 779,92476 779,92732 779,92984 779,93125 779,93693 779,93694 779,93715 779,93781 779,95154 779,95513 779,95517 779,95599 779,95768 779,96057 779,96097 779,96555 779,96816 779,97286 779,98928 779,99097 779,103223 779,103892 779,104759 779,106087 779,106502 779,106991 779,107044 779,107049 779,107977 779,108032 779,108477 779,109836 779,110229 779,111217 779,112380 779,113341 779,115183 779,115782 779,115868 779,116056 779,116103 779,117723 779,117892 779,118336 779,119454 779,119711 779,122437 779,122976 779,124488 779,126067 779,127206 779,129800 779,130107 779,130340 779,132238 779,134539 779,136159 779,136688 779,137870 779,138201 779,140010 779,140441 779,140817 779,141912 779,145007 779,145035 779,145405 779,147103 779,147172 779,148601 779,148606 779,151475 779,151485 779,151520 779,152864 779,153730 779,155513 779,156404 779,158297 779,158349 779,160350 779,163741 779,163903 779,166663 779,166674 779,166948 779,168245 779,170149 779,170184 779,170764 779,175324 779,176115 779,176567 779,176772 779,176878 779,177683 779,178573 779,181115 779,181820 779,182145 779,184847 779,184913 779,188610 779,189372 779,189927 779,190372 779,191939 779,191963 779,194917 779,194936 779,194964 779,194968 779,195098 779,196732 779,198771 779,214735 779,219974 779,221113 779,227027 779,227488 779,228282 779,230229 779,231893 779,232948 779,239362 779,241729 779,248115 779,249249 779,249270 779,249833 779,250577 779,250714 779,251860 779,253165 779,256689 780,178 780,192 780,314 780,781 780,1326 780,1359 780,1635 780,2334 781,222 781,313 781,332 781,356 781,477 781,536 781,780 781,911 781,951 781,1618 781,1808 781,1871 781,2159 781,2507 781,2784 781,4787 781,4958 781,5458 781,7698 781,15017 781,16297 781,21015 781,23839 781,25670 781,28343 781,31360 781,35536 781,39537 781,48404 781,62539 781,66703 781,74555 781,80360 781,82671 781,83745 781,92922 781,95588 781,134321 781,156968 781,156986 781,158767 781,169499 781,169925 781,186039 782,390 782,589 782,783 782,862 782,2572 782,4222 782,6068 782,7194 782,44725 783,46 783,86 783,167 783,299 783,338 783,390 783,444 783,459 783,522 783,567 783,615 783,666 783,744 783,750 783,762 783,782 783,783 783,941 783,968 783,1045 783,1083 783,1092 783,1117 783,1122 783,1124 783,1160 783,1167 783,1231 783,1241 783,1276 783,1294 783,1298 783,1300 783,1319 783,1320 783,1436 783,1479 783,1522 783,1544 783,1679 783,1849 783,2083 783,2148 783,2217 783,2253 783,2372 783,2480 783,2747 783,3049 783,3218 783,3404 783,3422 783,3525 783,3567 783,3630 783,5043 783,5301 783,5662 783,5740 783,6032 783,13667 783,18612 783,19534 783,29069 783,31310 783,34026 783,35545 783,35561 783,40228 783,40964 783,42598 783,42767 783,48886 783,57575 783,58173 783,60437 783,60458 783,60784 783,61376 783,68873 783,72764 783,91279 783,92976 783,96685 783,98279 783,102698 783,103860 783,122454 783,122935 783,122939 783,122953 783,123594 783,130238 783,130442 783,133545 783,133785 783,134079 783,134684 783,135152 783,138031 783,139289 783,152298 783,155027 783,155424 783,161548 783,161628 783,171641 783,180977 783,185874 783,186657 783,204840 783,207045 783,216668 783,220315 783,223942 783,236647 783,251442 784,10 784,40 784,41 784,54 784,111 784,135 784,138 784,175 784,261 784,289 784,294 784,304 784,313 784,332 784,364 784,417 784,431 784,442 784,500 784,502 784,534 784,557 784,573 784,589 784,590 784,596 784,609 784,617 784,631 784,636 784,660 784,677 784,693 784,694 784,715 784,749 784,760 784,765 784,772 784,784 784,785 784,790 784,797 784,801 784,805 784,808 784,954 784,966 784,968 784,972 784,999 784,1001 784,1014 784,1052 784,1119 784,1195 784,1209 784,1212 784,1213 784,1359 784,1368 784,1416 784,1511 784,1512 784,1526 784,1564 784,1608 784,1618 784,1631 784,1745 784,1782 784,1888 784,1923 784,1999 784,2015 784,2105 784,2209 784,2285 784,2315 784,2338 784,2419 784,2424 784,2519 784,2620 784,2646 784,2775 784,2797 784,2900 784,2974 784,2991 784,3094 784,3115 784,3135 784,3457 784,3473 784,3474 784,3504 784,3590 784,3759 784,4234 784,4411 784,4532 784,4557 784,4692 784,4799 784,5062 784,5472 784,5718 784,5992 784,6136 784,6146 784,6908 784,6986 784,7194 784,7242 784,7458 784,7698 784,7768 784,7878 784,8275 784,8276 784,8348 784,8549 784,8557 784,8632 784,9739 784,13336 784,13626 784,14482 784,14677 784,14820 784,15344 784,15747 784,16165 784,16192 784,17293 784,18479 784,18933 784,18965 784,19116 784,19617 784,20596 784,20858 784,22384 784,23329 784,24288 784,24887 784,24972 784,25293 784,26396 784,27120 784,27126 784,28317 784,28553 784,29310 784,30733 784,32629 784,32791 784,32894 784,33424 784,33637 784,36250 784,36647 784,41805 784,42462 784,44058 784,44117 784,44398 784,46276 784,51794 784,54615 784,55801 784,55905 784,56346 784,57354 784,59122 784,59747 784,61069 784,62334 784,63350 784,63639 784,63909 784,64739 784,64751 784,64869 784,65769 784,68480 784,69946 784,70151 784,70839 784,73925 784,74078 784,75130 784,75912 784,78623 784,79517 784,80402 784,80489 784,82980 784,84001 784,87715 784,88389 784,89585 784,91197 784,94134 784,98925 784,104000 784,120967 784,122439 784,123821 784,131286 784,131330 784,131371 784,133440 784,134145 784,135286 784,136072 784,136462 784,140006 784,140079 784,141834 784,143272 784,143381 784,145626 784,146842 784,147244 784,147366 784,147408 784,147922 784,148439 784,148461 784,150149 784,150577 784,151156 784,152586 784,152829 784,153181 784,159129 784,159421 784,159908 784,160377 784,160380 784,161841 784,162535 784,164238 784,167313 784,167770 784,170228 784,170653 784,171107 784,172012 784,173309 784,173427 784,175384 784,176328 784,176944 784,180954 784,180988 784,182162 784,186065 784,189815 784,206230 784,206351 784,206453 784,207051 784,207622 784,211936 784,211980 784,215862 784,224508 784,228009 784,239898 784,240876 784,244020 784,245910 784,247035 784,254989 784,258054 784,258237 784,259545 784,264451 785,784 787,685 788,10 788,66 788,171 788,215 788,259 788,272 788,314 788,356 788,393 788,446 788,447 788,577 788,589 788,599 788,663 788,664 788,689 788,726 788,788 788,789 788,794 788,859 788,875 788,902 788,911 788,980 788,991 788,1070 788,1105 788,1118 788,1130 788,1333 788,1388 788,1528 788,1531 788,1566 788,1597 788,1973 788,2057 788,2084 788,2106 788,2178 788,2320 788,2459 788,2959 788,3151 788,3603 788,3903 788,4339 788,4375 788,4446 788,4545 788,4611 788,6454 788,7165 788,7921 788,8078 788,8081 788,8128 788,13332 788,14202 788,14232 788,14679 788,14831 788,17354 788,18108 788,18823 788,19628 788,20686 788,21286 788,21552 788,22159 788,23487 788,26779 788,26786 788,28312 788,29116 788,30402 788,30840 788,30905 788,31278 788,32585 788,33085 788,33384 788,33985 788,34258 788,35398 788,38543 788,38544 788,39525 788,40723 788,41907 788,45398 788,45983 788,46444 788,48772 788,48865 788,49423 788,51274 788,54493 788,56150 788,56910 788,57143 788,59464 788,61213 788,66253 788,67108 788,67290 788,67395 788,73197 788,75102 788,75390 788,75883 788,75912 788,76958 788,86491 788,99003 788,101226 788,101819 788,109384 788,110050 788,112438 788,113018 788,118116 788,119325 788,124061 788,125855 788,126908 788,128216 788,138686 788,139010 788,140354 788,149192 788,152590 788,153373 788,153563 788,153634 788,153860 788,154396 788,155096 788,155353 788,160870 788,161334 788,161484 788,163355 788,164385 788,165040 788,169909 788,172543 788,174469 788,176375 788,176956 788,179831 788,181564 788,182649 788,185033 788,185701 788,186081 788,192522 788,193118 788,193578 788,195683 788,196627 788,220094 788,228127 788,231063 788,234287 788,234927 788,236057 788,237136 788,238189 788,238222 788,239308 788,259076 788,259509 788,263811 788,264560 789,788 790,784 791,22 791,163 791,209 791,302 791,433 791,579 791,687 791,760 791,818 791,861 791,893 791,1556 791,1631 791,1659 791,4453 792,138 792,1227 792,21442 792,86416 793,794 794,20 794,22 794,63 794,68 794,86 794,120 794,158 794,167 794,192 794,202 794,207 794,211 794,259 794,264 794,272 794,275 794,287 794,292 794,302 794,304 794,327 794,336 794,337 794,346 794,366 794,390 794,392 794,393 794,397 794,433 794,435 794,439 794,440 794,452 794,457 794,467 794,516 794,536 794,538 794,599 794,605 794,621 794,622 794,623 794,631 794,632 794,673 794,685 794,697 794,788 794,793 794,794 794,809 794,818 794,837 794,838 794,872 794,903 794,907 794,911 794,918 794,920 794,939 794,950 794,972 794,977 794,1011 794,1014 794,1021 794,1033 794,1070 794,1085 794,1118 794,1130 794,1147 794,1167 794,1179 794,1210 794,1294 794,1298 794,1326 794,1332 794,1370 794,1381 794,1411 794,1417 794,1452 794,1453 794,1522 794,1551 794,1566 794,1612 794,1634 794,1653 794,1655 794,1715 794,1722 794,1782 794,1796 794,1805 794,1844 794,1968 794,1992 794,2069 794,2085 794,2512 794,2710 794,2979 794,2989 794,2991 794,2995 794,3524 794,3538 794,4175 794,4276 794,5130 794,5382 794,5472 794,5604 794,5631 794,5833 794,5961 794,6119 794,7364 794,8041 794,8676 794,13323 794,13446 794,13538 794,15141 794,15686 794,16522 794,19413 794,20349 794,20598 794,22049 794,30331 794,31246 794,31282 794,32630 794,32978 794,34205 794,38140 794,38357 794,48290 794,48727 794,49295 794,50094 794,57143 794,59269 794,61822 794,70395 794,70919 794,73702 794,74436 794,75912 794,77035 794,83368 794,91348 794,107394 794,108160 794,109455 794,109468 794,120155 794,122657 794,124492 794,131650 794,139559 794,140084 794,140100 794,141912 794,162514 794,162925 794,163287 794,164917 794,165389 794,170444 794,174790 794,175282 794,176362 794,177440 794,207659 794,216170 794,226977 794,238719 794,238761 794,248486 794,249273 795,107 795,346 795,510 795,534 795,589 795,749 795,764 795,765 795,775 795,795 795,808 795,1001 795,1041 795,1073 795,1388 795,1545 795,1599 795,1955 795,1973 795,2253 795,2678 795,2913 795,3093 795,3094 795,3507 795,3623 795,3703 795,3804 795,5356 795,5385 795,5388 795,5587 795,5961 795,7194 795,7921 795,12728 795,12763 795,12875 795,13273 795,13629 795,14391 795,14633 795,15109 795,15727 795,15776 795,16192 795,16425 795,19228 795,22149 795,26011 795,26063 795,26070 795,27245 795,28221 795,28653 795,30357 795,30616 795,31777 795,34311 795,34963 795,37547 795,37706 795,38294 795,41107 795,43105 795,43237 795,44385 795,45429 795,47997 795,48006 795,49933 795,50248 795,51972 795,54309 795,60406 795,60418 795,60520 795,62509 795,65635 795,71770 795,74535 795,78746 795,79858 795,90721 795,91767 795,96471 795,97562 795,103770 795,107504 795,110691 795,112320 795,112503 795,114454 795,115990 795,117769 795,121916 795,122692 795,131744 795,136072 795,136515 795,142506 795,145539 795,147365 795,147375 795,147534 795,148624 795,148893 795,150322 795,151996 795,151997 795,153619 795,155740 795,161156 795,162869 795,165425 795,166695 795,167622 795,168261 795,168785 795,168793 795,169543 795,170053 795,170751 795,172494 795,179111 795,180340 795,191671 795,195015 795,223839 795,225385 795,228454 795,228867 795,229071 795,234683 795,234891 795,239866 795,245014 795,261853 795,261861 796,690 797,41 797,104 797,135 797,294 797,399 797,596 797,631 797,704 797,714 797,784 797,805 797,1052 797,1119 797,1177 797,1368 797,1462 797,1635 797,1962 797,2008 797,2210 797,2995 797,3115 797,4237 797,6556 797,8537 797,20813 797,182162 798,481 798,799 798,1021 798,204093 800,134 800,431 800,801 801,46 801,58 801,182 801,217 801,292 801,301 801,304 801,314 801,420 801,441 801,452 801,457 801,535 801,599 801,626 801,673 801,676 801,784 801,838 801,849 801,852 801,872 801,929 801,1014 801,1085 801,1118 801,1130 801,1204 801,1284 801,1326 801,1449 801,1531 801,1566 801,1796 801,1807 801,1844 801,1973 801,2253 801,2373 801,2443 801,2775 801,4039 801,4771 801,6904 801,156379 802,160 802,264 802,360 802,515 802,525 802,872 802,1127 802,1147 802,1151 802,1289 802,1551 802,1893 802,6695 803,167 803,1837 804,805 805,24 805,41 805,68 805,104 805,134 805,240 805,261 805,289 805,292 805,294 805,309 805,310 805,332 805,372 805,373 805,417 805,431 805,502 805,572 805,590 805,592 805,609 805,612 805,621 805,631 805,632 805,634 805,636 805,677 805,694 805,704 805,714 805,715 805,760 805,761 805,784 805,797 805,805 805,823 805,850 805,885 805,1004 805,1016 805,1052 805,1054 805,1118 805,1119 805,1209 805,1252 805,1253 805,1282 805,1285 805,1346 805,1353 805,1359 805,1402 805,1417 805,1459 805,1462 805,1505 805,1506 805,1509 805,1511 805,1631 805,1635 805,1701 805,1713 805,1745 805,1879 805,2092 805,2210 805,2316 805,2358 805,2383 805,2620 805,2644 805,2744 805,2771 805,2775 805,2823 805,2903 805,2982 805,2995 805,3085 805,3504 805,3539 805,3794 805,3867 805,3944 805,4115 805,4520 805,4524 805,4692 805,4821 805,5258 805,5331 805,5346 805,5809 805,5812 805,6136 805,6139 805,6607 805,6757 805,6908 805,7458 805,7790 805,8061 805,8184 805,8275 805,8537 805,8557 805,8632 805,9425 805,13704 805,14080 805,14156 805,14418 805,14447 805,15334 805,15397 805,15586 805,15604 805,17082 805,19278 805,19539 805,19617 805,20596 805,20907 805,20982 805,21398 805,21867 805,22058 805,22939 805,23539 805,23737 805,24736 805,24906 805,25328 805,27132 805,28824 805,29364 805,32526 805,32643 805,32810 805,32817 805,33424 805,34380 805,34778 805,34828 805,35648 805,36245 805,36300 805,36331 805,37171 805,38347 805,38394 805,39037 805,39042 805,40235 805,40267 805,42518 805,43676 805,44671 805,45485 805,46874 805,48310 805,48334 805,48451 805,48549 805,48609 805,49035 805,49092 805,50529 805,52033 805,52082 805,54625 805,55380 805,55598 805,55968 805,56346 805,57583 805,57872 805,59006 805,59194 805,59910 805,62482 805,62964 805,63909 805,64593 805,65326 805,65681 805,67179 805,69013 805,72639 805,72684 805,72907 805,75264 805,75341 805,75969 805,79485 805,79619 805,80049 805,82058 805,82852 805,83940 805,84658 805,86626 805,88062 805,90982 805,94134 805,95554 805,96748 805,97451 805,97850 805,98275 805,98925 805,100360 805,102250 805,103140 805,103356 805,104590 805,104621 805,107672 805,111147 805,112919 805,113500 805,113968 805,114508 805,115298 805,115699 805,118678 805,119080 805,120034 805,120044 805,120076 805,122808 805,125864 805,126292 805,126964 805,130357 805,131058 805,131371 805,132823 805,133408 805,133426 805,133440 805,133586 805,133648 805,135821 805,135955 805,136525 805,136529 805,137204 805,141179 805,142930 805,144515 805,146024 805,146520 805,147362 805,147887 805,148297 805,150358 805,152133 805,155021 805,155058 805,156939 805,158845 805,159383 805,159908 805,161111 805,161524 805,161589 805,166700 805,167770 805,168965 805,168969 805,169917 805,174282 805,176056 805,176944 805,177623 805,178485 805,182162 805,182345 805,182903 805,183366 805,185186 805,187447 805,189905 805,190134 805,192512 805,194298 805,196395 805,199845 805,201167 805,201754 805,201757 805,201758 805,202138 805,203088 805,203137 805,203139 805,203145 805,203214 805,203911 805,203953 805,204032 805,205072 805,205823 805,205831 805,205834 805,206328 805,206377 805,206453 805,207051 805,207130 805,207569 805,211829 805,211856 805,213954 805,214703 805,215713 805,216081 805,216860 805,218767 805,219162 805,226564 805,230547 805,230552 805,237709 805,238265 805,241114 805,241520 805,249783 805,249993 805,250900 805,251610 805,253252 805,261722 805,264554 806,731 807,808 808,1 808,3 808,20 808,34 808,87 808,97 808,149 808,167 808,175 808,186 808,192 808,254 808,301 808,302 808,313 808,326 808,390 808,392 808,397 808,406 808,417 808,441 808,455 808,479 808,499 808,500 808,512 808,536 808,622 808,623 808,644 808,652 808,784 808,795 808,807 808,808 808,809 808,818 808,849 808,867 808,872 808,903 808,911 808,918 808,919 808,968 808,972 808,973 808,996 808,997 808,1014 808,1052 808,1084 808,1094 808,1118 808,1147 808,1210 808,1240 808,1241 808,1267 808,1293 808,1326 808,1380 808,1417 808,1465 808,1479 808,1513 808,1522 808,1531 808,1566 808,1575 808,1623 808,1724 808,1796 808,1805 808,1848 808,1860 808,1949 808,1973 808,1992 808,2083 808,2480 808,2494 808,2512 808,2699 808,2810 808,3003 808,3182 808,3207 808,3392 808,3504 808,3804 808,4039 808,4066 808,4177 808,4276 808,4286 808,5052 808,5209 808,5632 808,6904 808,7008 808,7098 808,13222 808,14477 808,14594 808,15171 808,15313 808,15407 808,16110 808,18880 808,20012 808,22324 808,25422 808,31414 808,35063 808,39402 808,46648 808,49958 808,54279 808,62932 808,64541 808,65742 808,68677 808,68681 808,69986 808,69987 808,79590 808,102755 808,116177 808,120949 808,121416 808,137253 808,138700 808,139765 808,140293 808,140308 808,140320 808,142342 808,143332 808,146303 808,162985 808,165775 808,166313 808,166394 808,169843 808,170928 808,171017 808,171020 808,171388 808,175948 808,192872 808,192911 808,202664 808,215276 808,223674 808,224837 808,224849 808,224857 808,228163 808,228178 808,242189 808,261925 809,32 809,50 809,87 809,140 809,240 809,287 809,314 809,327 809,349 809,391 809,392 809,433 809,440 809,509 809,510 809,599 809,622 809,663 809,673 809,685 809,697 809,733 809,779 809,808 809,809 809,818 809,837 809,838 809,875 809,903 809,911 809,918 809,950 809,1014 809,1023 809,1130 809,1151 809,1179 809,1210 809,1607 809,1634 809,1659 809,1796 809,1949 809,2016 809,2129 809,2310 809,2361 809,2418 809,2475 809,2749 809,2819 809,3453 809,4039 809,4132 809,5065 809,5256 809,5259 809,5285 809,5827 809,6013 809,6456 809,6646 809,8041 809,9330 809,13279 809,13847 809,14040 809,14360 809,14621 809,15654 809,15806 809,17852 809,18295 809,18815 809,19010 809,19517 809,19618 809,19730 809,20798 809,20799 809,21139 809,21422 809,21914 809,22293 809,23338 809,23447 809,24790 809,25121 809,25803 809,25863 809,26145 809,26253 809,26516 809,27063 809,27827 809,28532 809,29458 809,31091 809,32645 809,32677 809,32897 809,33049 809,33802 809,34381 809,34694 809,35668 809,35959 809,37438 809,38896 809,39095 809,39690 809,40558 809,41866 809,42737 809,43239 809,43279 809,43305 809,45667 809,48031 809,48168 809,48390 809,48792 809,50367 809,54952 809,55041 809,55686 809,56539 809,56609 809,57873 809,58222 809,59108 809,59167 809,62943 809,63455 809,64667 809,64684 809,67172 809,68069 809,72048 809,72070 809,72467 809,74557 809,77816 809,80667 809,81555 809,82582 809,82900 809,84493 809,85802 809,85829 809,86733 809,88661 809,89378 809,89661 809,90327 809,91980 809,94161 809,94252 809,95066 809,97491 809,101588 809,102409 809,103032 809,103413 809,104403 809,109434 809,110486 809,112459 809,112722 809,114203 809,114597 809,115066 809,115698 809,116372 809,117019 809,118898 809,118939 809,119467 809,119527 809,122059 809,122545 809,122574 809,123542 809,123725 809,124896 809,126720 809,126781 809,127158 809,127720 809,127808 809,127841 809,128162 809,128783 809,129091 809,129851 809,130330 809,130337 809,130363 809,130376 809,134048 809,134067 809,134194 809,134672 809,134773 809,134777 809,135133 809,135228 809,135534 809,135535 809,135536 809,135537 809,135538 809,135539 809,135540 809,135541 809,135542 809,135543 809,135544 809,135545 809,135546 809,135547 809,135548 809,135549 809,135550 809,135551 809,135552 809,135553 809,135554 809,135555 809,135556 809,135557 809,135558 809,135559 809,135560 809,135561 809,135562 809,140117 809,140540 809,140736 809,141912 809,142688 809,143532 809,145395 809,146448 809,146708 809,148046 809,150160 809,150533 809,151398 809,152129 809,155405 809,156310 809,156652 809,158165 809,158990 809,159017 809,160487 809,160844 809,160870 809,161184 809,161217 809,162515 809,165296 809,167672 809,170077 809,172630 809,173895 809,175599 809,177379 809,178266 809,179135 809,182780 809,183812 809,183940 809,189275 809,189931 809,191939 809,200353 809,201733 809,207659 809,211927 809,214086 809,216512 809,220473 809,220486 809,226432 809,235623 809,241138 809,241660 809,244790 809,245699 809,253336 809,254949 809,256467 809,256828 809,256847 809,256869 809,256870 809,256900 809,258323 809,258778 809,260263 809,261693 809,263953 810,20 810,48 810,63 810,65 810,79 810,81 810,86 810,146 810,160 810,163 810,187 810,192 810,200 810,207 810,251 810,264 810,305 810,312 810,315 810,326 810,344 810,346 810,366 810,388 810,393 810,408 810,424 810,430 810,440 810,467 810,527 810,599 810,609 810,615 810,628 810,634 810,660 810,694 810,707 810,710 810,726 810,740 810,741 810,743 810,784 810,795 810,811 810,827 810,835 810,838 810,849 810,852 810,868 810,872 810,920 810,972 810,1052 810,1082 810,1118 810,1122 810,1127 810,1133 810,1146 810,1191 810,1282 810,1284 810,1298 810,1368 810,1381 810,1424 810,1509 810,1707 810,1796 810,1801 810,1837 810,2244 810,2373 810,3524 810,3653 810,3695 810,4355 810,4805 810,5326 810,6556 810,16196 810,19443 810,21442 810,23132 810,68140 810,75912 810,118336 810,142430 810,215276 810,257126 810,262457 811,811 811,911 811,1293 812,444 812,567 812,604 812,812 812,813 812,1027 812,1037 812,1258 812,1293 812,1407 812,1985 812,3869 812,4170 812,4173 812,4428 812,6833 812,6842 812,7087 812,7303 812,7986 812,8807 812,15329 812,19588 812,21316 812,26096 812,28128 812,28854 812,28884 812,29780 812,38349 812,40496 812,41947 812,42595 812,46755 812,57075 812,58925 812,62950 812,65685 812,65785 812,71711 812,72548 812,74577 812,79380 812,82099 812,83233 812,83240 812,83841 812,83959 812,85780 812,93767 812,94279 812,94845 812,95005 812,96635 812,96653 812,97103 812,98201 812,99691 812,107329 812,107917 812,108048 812,108141 812,109410 812,121895 812,122390 812,122870 812,123965 812,123969 812,126854 812,127341 812,128765 812,129843 812,135185 812,135186 812,135276 812,138009 812,146636 812,147497 812,150732 812,154282 812,157654 812,158263 812,158270 812,161085 812,183331 812,195533 812,199277 812,212380 812,221099 812,223653 812,225367 812,228475 812,249138 812,254178 812,254186 812,256169 813,1293 814,34 814,35 814,54 814,120 814,222 814,261 814,283 814,389 814,455 814,644 814,657 814,1019 814,1467 814,2266 814,2646 814,3115 814,8180 815,459 815,4223 816,668 816,798 817,137 818,10 818,22 818,34 818,35 818,50 818,68 818,120 818,149 818,158 818,167 818,178 818,182 818,186 818,192 818,195 818,202 818,203 818,217 818,240 818,255 818,261 818,278 818,294 818,298 818,301 818,302 818,314 818,326 818,333 818,336 818,349 818,372 818,389 818,390 818,392 818,397 818,406 818,413 818,417 818,433 818,440 818,446 818,452 818,455 818,467 818,493 818,500 818,505 818,510 818,515 818,536 818,577 818,586 818,592 818,599 818,615 818,623 818,626 818,631 818,661 818,673 818,677 818,685 818,693 818,697 818,725 818,748 818,749 818,752 818,761 818,779 818,794 818,808 818,809 818,818 818,819 818,823 818,838 818,861 818,872 818,873 818,874 818,918 818,949 818,968 818,973 818,1001 818,1010 818,1011 818,1014 818,1023 818,1058 818,1082 818,1085 818,1118 818,1130 818,1151 818,1172 818,1191 818,1192 818,1204 818,1210 818,1220 818,1222 818,1231 818,1238 818,1240 818,1241 818,1284 818,1285 818,1298 818,1309 818,1331 818,1361 818,1370 818,1417 818,1465 818,1515 818,1518 818,1531 818,1559 818,1564 818,1566 818,1572 818,1619 818,1623 818,1634 818,1635 818,1678 818,1688 818,1705 818,1726 818,1743 818,1785 818,1796 818,1805 818,1818 818,1853 818,1955 818,1973 818,1998 818,2221 818,2228 818,2235 818,2296 818,2348 818,2373 818,2470 818,2480 818,2512 818,2557 818,2620 818,2689 818,2732 818,2784 818,2797 818,2812 818,2819 818,2820 818,2895 818,2974 818,2989 818,2991 818,3115 818,3182 818,3577 818,3578 818,3590 818,3610 818,3629 818,3810 818,3867 818,3993 818,4066 818,4109 818,4223 818,4286 818,4562 818,4565 818,4585 818,4692 818,4701 818,4751 818,4787 818,5228 818,5231 818,5293 818,5322 818,5346 818,5361 818,5410 818,5433 818,5451 818,5510 818,5654 818,5818 818,6525 818,6526 818,6837 818,6895 818,6935 818,7338 818,7456 818,7473 818,7502 818,7891 818,8243 818,8323 818,8344 818,8537 818,8686 818,8861 818,8944 818,9361 818,13142 818,13274 818,13445 818,13524 818,13695 818,13712 818,13832 818,13840 818,14064 818,14121 818,14133 818,14158 818,14246 818,14358 818,14456 818,14546 818,15277 818,15454 818,15556 818,15648 818,15763 818,16190 818,16436 818,16518 818,16596 818,16653 818,18146 818,18240 818,18245 818,18409 818,18499 818,18925 818,18996 818,19388 818,19454 818,19617 818,19663 818,19817 818,20520 818,20560 818,20747 818,20757 818,20788 818,21173 818,21321 818,21366 818,21420 818,21422 818,21510 818,21547 818,21580 818,22277 818,22318 818,22337 818,22808 818,23354 818,23576 818,23683 818,24605 818,24757 818,24815 818,25662 818,25748 818,26034 818,26149 818,26362 818,26905 818,27041 818,27827 818,27903 818,28166 818,28310 818,28501 818,28545 818,28973 818,29089 818,30373 818,30577 818,30683 818,31207 818,31230 818,32819 818,33424 818,33506 818,34314 818,34418 818,34524 818,34817 818,34975 818,35672 818,37147 818,37171 818,37407 818,38446 818,38743 818,38936 818,39163 818,39690 818,39691 818,39692 818,39693 818,39695 818,40824 818,41106 818,41206 818,41860 818,42837 818,43231 818,43294 818,43750 818,44115 818,44416 818,45760 818,45985 818,46271 818,46894 818,46936 818,47371 818,47848 818,48253 818,49627 818,49699 818,49741 818,50386 818,50588 818,50828 818,50879 818,50987 818,51359 818,51727 818,51919 818,51921 818,52153 818,52539 818,54348 818,54684 818,54958 818,55138 818,55149 818,55764 818,55780 818,55918 818,56736 818,57583 818,58489 818,58564 818,58990 818,59097 818,59100 818,59148 818,59180 818,59226 818,59706 818,59953 818,59990 818,60410 818,60627 818,61089 818,61261 818,61324 818,63083 818,63107 818,63411 818,63962 818,64208 818,65747 818,65856 818,65860 818,65881 818,66013 818,66048 818,66297 818,66301 818,66367 818,66664 818,67185 818,67363 818,67442 818,67951 818,69947 818,69981 818,70127 818,70147 818,70226 818,70323 818,70398 818,70873 818,70961 818,71166 818,71204 818,71316 818,71678 818,71697 818,72840 818,72889 818,73260 818,74763 818,75208 818,75912 818,75936 818,76732 818,77817 818,77819 818,78623 818,78813 818,79306 818,79619 818,79625 818,79695 818,80425 818,80454 818,80751 818,81132 818,81133 818,82078 818,82667 818,82851 818,83217 818,84175 818,86760 818,87892 818,87924 818,89607 818,91051 818,91468 818,91505 818,91880 818,91993 818,93134 818,94077 818,94336 818,94877 818,95823 818,97248 818,98275 818,98451 818,99165 818,100139 818,101178 818,102508 818,102773 818,102778 818,105006 818,106250 818,107053 818,109539 818,109945 818,109999 818,111978 818,112032 818,112938 818,113249 818,113446 818,115251 818,115431 818,115479 818,118336 818,118490 818,119305 818,119394 818,119416 818,119692 818,120193 818,120683 818,120907 818,121209 818,121381 818,122136 818,122425 818,123007 818,123355 818,123396 818,123507 818,126298 818,127100 818,127158 818,127267 818,127718 818,127959 818,128320 818,128472 818,128870 818,128965 818,129101 818,129480 818,129880 818,130197 818,130761 818,130840 818,130898 818,130969 818,131360 818,131532 818,131784 818,131860 818,131861 818,131944 818,132068 818,133020 818,133118 818,134958 818,134967 818,134968 818,138139 818,138175 818,138244 818,139495 818,139550 818,139691 818,139994 818,140102 818,140547 818,144231 818,145049 818,145207 818,146413 818,146626 818,146748 818,146885 818,147034 818,147847 818,148352 818,150477 818,150741 818,150760 818,150764 818,151063 818,152152 818,154905 818,157024 818,158474 818,158475 818,158700 818,158847 818,159067 818,159400 818,160861 818,163326 818,163366 818,163856 818,164213 818,164490 818,165320 818,165952 818,165988 818,167737 818,168271 818,168309 818,168442 818,168454 818,168644 818,168979 818,169948 818,170239 818,170451 818,170734 818,171292 818,171483 818,171581 818,171641 818,174327 818,174842 818,174857 818,175184 818,175214 818,175993 818,176053 818,176115 818,176434 818,176830 818,177353 818,177511 818,177842 818,179804 818,179948 818,180465 818,181063 818,181439 818,182227 818,182506 818,183856 818,184795 818,185627 818,186263 818,187280 818,189327 818,189462 818,191066 818,194330 818,195835 818,198364 818,198442 818,201514 818,201854 818,205188 818,215286 818,216860 818,221029 818,221735 818,221843 818,221941 818,224740 818,224848 818,225336 818,225775 818,226520 818,227881 818,228492 818,229229 818,229898 818,232106 818,232939 818,233759 818,235568 818,236648 818,236973 818,237394 818,237679 818,239878 818,244131 818,245584 818,246565 818,247230 818,247338 818,249659 818,249940 818,249959 818,250718 818,251387 818,251918 818,251920 818,252562 818,252653 818,255555 818,255774 818,258961 818,261724 818,261800 818,262089 818,263088 818,264437 818,264646 819,240 819,622 819,818 820,505 821,58 821,534 822,358 822,509 822,510 823,10 823,41 823,68 823,240 823,332 823,431 823,626 823,631 823,805 823,818 823,1011 823,1119 823,1635 823,1955 823,2512 823,2620 823,2989 823,2991 823,2995 823,3135 823,6837 823,179804 824,287 825,497 826,202 827,491 827,685 827,827 827,849 827,3653 827,9457 828,687 828,1556 829,217 830,54 830,718 831,832 832,528 832,831 832,832 832,1319 832,1522 832,2470 832,2475 832,4288 832,6327 832,9327 832,13489 832,15281 832,22228 832,22642 832,22646 832,22653 832,22654 832,23008 832,23157 832,26402 832,26406 832,31314 832,31720 832,46271 832,47039 832,48928 832,50493 832,52205 832,53294 832,54111 832,55090 832,62006 832,72067 832,72763 832,102347 832,116857 832,130119 834,647 834,835 834,991 834,1102 834,1659 834,3177 835,4039 836,306 836,307 837,30 837,328 837,440 837,622 837,794 837,3247 838,3 838,10 838,20 838,32 838,34 838,35 838,68 838,72 838,86 838,87 838,97 838,104 838,111 838,120 838,126 838,136 838,140 838,158 838,167 838,186 838,192 838,200 838,202 838,203 838,207 838,240 838,248 838,256 838,259 838,261 838,264 838,272 838,278 838,289 838,290 838,292 838,294 838,299 838,301 838,302 838,312 838,314 838,323 838,332 838,336 838,337 838,356 838,387 838,388 838,390 838,392 838,397 838,406 838,417 838,420 838,433 838,435 838,441 838,452 838,457 838,479 838,481 838,493 838,505 838,509 838,510 838,516 838,536 838,577 838,589 838,590 838,599 838,615 838,631 838,663 838,668 838,673 838,676 838,677 838,697 838,718 838,764 838,794 838,801 838,809 838,818 838,838 838,839 838,843 838,849 838,850 838,852 838,855 838,861 838,862 838,872 838,907 838,911 838,918 838,920 838,932 838,933 838,972 838,973 838,1001 838,1014 838,1017 838,1019 838,1085 838,1089 838,1130 838,1133 838,1140 838,1143 838,1147 838,1151 838,1167 838,1172 838,1179 838,1191 838,1210 838,1231 838,1240 838,1243 838,1267 838,1282 838,1284 838,1285 838,1289 838,1293 838,1298 838,1309 838,1326 838,1332 838,1345 838,1368 838,1370 838,1381 838,1402 838,1411 838,1417 838,1434 838,1436 838,1445 838,1452 838,1454 838,1462 838,1466 838,1509 838,1511 838,1518 838,1522 838,1531 838,1544 838,1556 838,1564 838,1566 838,1631 838,1634 838,1655 838,1659 838,1663 838,1715 838,1722 838,1724 838,1749 838,1782 838,1796 838,1805 838,1837 838,1844 838,1860 838,1992 838,2045 838,2209 838,2286 838,2334 838,2373 838,2436 838,2443 838,2512 838,2556 838,2557 838,2605 838,2671 838,2713 838,2782 838,2979 838,2991 838,3182 838,3260 838,3392 838,3478 838,3507 838,3524 838,3804 838,3876 838,4177 838,4276 838,4315 838,4532 838,4545 838,4771 838,5388 838,5961 838,6119 838,6391 838,6452 838,6469 838,6837 838,6955 838,7024 838,7092 838,7862 838,8276 838,8537 838,9030 838,12747 838,13207 838,18013 838,18194 838,19413 838,19592 838,21589 838,24934 838,26161 838,26450 838,29595 838,30344 838,31207 838,32464 838,32819 838,39055 838,41230 838,41893 838,46803 838,48961 838,50174 838,50318 838,55763 838,56150 838,59914 838,66515 838,68772 838,75912 838,80966 838,82217 838,108048 838,109953 838,111370 838,115474 838,116898 838,117013 838,118372 838,122519 838,135130 838,136622 838,160490 838,164889 838,167601 838,176819 838,185268 838,193533 838,216170 838,217645 838,232051 838,232699 838,234116 838,249117 838,259530 838,263316 839,838 840,788 840,841 841,1 841,10 841,44 841,50 841,56 841,97 841,99 841,146 841,147 841,158 841,175 841,192 841,195 841,206 841,285 841,304 841,333 841,336 841,356 841,406 841,422 841,440 841,446 841,505 841,516 841,602 841,620 841,640 841,668 841,685 841,693 841,733 841,779 841,841 841,911 841,920 841,957 841,1089 841,1181 841,1198 841,1218 841,1425 841,1464 841,1498 841,1504 841,1515 841,1619 841,1623 841,1773 841,1815 841,1825 841,1848 841,1969 841,1993 841,2014 841,2244 841,2324 841,2386 841,2782 841,2874 841,3370 841,3507 841,3895 841,5313 841,5356 841,5401 841,5424 841,6119 841,7296 841,7318 841,9394 841,14136 841,14453 841,20375 841,22616 841,22699 841,23494 841,23783 841,26928 841,26939 841,27834 841,28002 841,29129 841,30331 841,30557 841,33287 841,41907 841,60576 841,64067 841,74338 841,75249 841,92476 841,101863 841,102560 841,103208 841,103852 841,106352 841,116131 841,117818 841,118068 841,119325 841,123797 841,124889 841,125018 841,135236 841,141912 841,176396 841,204124 841,240174 842,827 842,911 843,20 843,56 843,68 843,130 843,182 843,192 843,202 843,203 843,207 843,209 843,217 843,248 843,256 843,264 843,289 843,290 843,299 843,301 843,313 843,314 843,333 843,356 843,360 843,392 843,425 843,435 843,452 843,457 843,479 843,497 843,509 843,512 843,536 843,599 843,604 843,615 843,631 843,663 843,664 843,668 843,671 843,673 843,676 843,713 843,794 843,838 843,843 843,849 843,852 843,856 843,862 843,872 843,900 843,911 843,918 843,968 843,972 843,992 843,1001 843,1011 843,1014 843,1043 843,1085 843,1130 843,1133 843,1147 843,1148 843,1172 843,1174 843,1191 843,1204 843,1210 843,1262 843,1267 843,1285 843,1293 843,1313 843,1318 843,1326 843,1345 843,1368 843,1388 843,1402 843,1417 843,1445 843,1462 843,1518 843,1566 843,1655 843,1796 843,1818 843,1844 843,1877 843,1893 843,1955 843,1992 843,2253 843,2310 843,2373 843,2460 843,2580 843,2590 843,2605 843,2891 843,3094 843,3260 843,3507 843,3967 843,4152 843,4190 843,4271 843,4276 843,4365 843,4370 843,4389 843,4428 843,4771 843,5213 843,6568 843,6661 843,6824 843,7041 843,8165 843,9457 843,14383 843,14387 843,14674 843,14767 843,15348 843,15456 843,17626 843,19413 843,19572 843,21382 843,21442 843,21561 843,26034 843,26450 843,28994 843,29638 843,29890 843,31435 843,37073 843,38874 843,38994 843,40778 843,41632 843,43171 843,43762 843,46420 843,48023 843,48032 843,48144 843,48633 843,50197 843,52547 843,54369 843,55048 843,59054 843,59084 843,59101 843,61350 843,63566 843,75252 843,75467 843,75912 843,79638 843,82762 843,83262 843,83970 843,88005 843,89657 843,89946 843,90922 843,93136 843,96793 843,98358 843,104573 843,106318 843,106341 843,106530 843,107019 843,107061 843,107074 843,107983 843,109386 843,113576 843,113634 843,115474 843,117013 843,117480 843,118914 843,122015 843,122409 843,123970 843,126811 843,137248 843,137260 843,139377 843,139687 843,141873 843,142245 843,148924 843,149250 843,150434 843,151484 843,152299 843,158337 843,158929 843,159353 843,159861 843,161938 843,170725 843,172106 843,172284 843,173903 843,174367 843,174660 843,175971 843,176030 843,177817 843,179405 843,180389 843,181019 843,181900 843,182465 843,183381 843,186080 843,189140 843,189399 843,192024 843,192032 843,192033 843,193536 843,193675 843,195090 843,212051 843,212475 843,214331 843,215276 843,215874 843,216002 843,216170 843,221755 843,222655 843,225470 843,229026 843,233091 843,235877 843,236182 843,242994 843,247758 843,247873 843,253200 843,254490 843,256395 843,259732 843,260911 843,263352 844,20 844,175 845,326 845,37414 846,130 846,261 846,292 846,298 846,305 846,473 846,557 846,647 846,694 846,703 846,893 846,1058 846,1368 846,1388 846,1619 846,1767 846,2135 846,2353 846,3089 846,4172 846,5540 846,5658 846,6638 846,7614 847,586 847,718 849,20 849,68 849,83 849,104 849,107 849,134 849,135 849,147 849,149 849,158 849,167 849,200 849,202 849,203 849,240 849,248 849,251 849,252 849,254 849,256 849,259 849,261 849,278 849,289 849,290 849,292 849,299 849,301 849,302 849,312 849,313 849,314 849,336 849,346 849,364 849,390 849,392 849,397 849,415 849,422 849,447 849,452 849,455 849,467 849,489 849,505 849,509 849,516 849,535 849,536 849,575 849,577 849,602 849,622 849,623 849,626 849,668 849,671 849,673 849,676 849,685 849,693 849,733 849,779 849,794 849,827 849,838 849,843 849,849 849,852 849,868 849,893 849,911 849,918 849,920 849,972 849,1001 849,1011 849,1058 849,1085 849,1118 849,1130 849,1132 849,1133 849,1147 849,1151 849,1182 849,1212 849,1220 849,1222 849,1240 849,1243 849,1267 849,1274 849,1284 849,1285 849,1326 849,1345 849,1370 849,1417 849,1445 849,1467 849,1551 849,1566 849,1644 849,1688 849,1722 849,1786 849,1844 849,1899 849,1939 849,1992 849,2105 849,2205 849,2210 849,2228 849,2244 849,2310 849,2315 849,2373 849,2460 849,2512 849,3003 849,3247 849,3392 849,3524 849,3582 849,3820 849,4039 849,4123 849,4190 849,4237 849,4271 849,4276 849,4277 849,4771 849,5326 849,5718 849,8149 849,8276 849,8676 849,9457 849,13207 849,14232 849,14633 849,16537 849,20535 849,22389 849,25526 849,26450 849,27041 849,33424 849,41051 849,41378 849,42779 849,48292 849,48956 849,54004 849,67205 849,75196 849,75912 849,77679 849,82206 849,87709 849,93766 849,97104 849,99732 849,102518 849,110037 849,115474 849,116949 849,118950 849,138008 849,139929 849,141912 849,142472 849,144113 849,150027 849,162574 849,162692 849,165286 849,170652 849,172224 849,194909 849,201142 849,206098 849,207659 849,212455 849,212540 849,236087 849,238790 849,244684 849,250546 849,251959 849,256278 849,258887 850,104 850,200 850,225 850,248 850,364 850,450 850,557 850,805 850,850 850,851 850,953 850,1011 850,1179 850,1332 850,2212 850,2847 850,3247 850,3483 850,3496 850,4046 850,4105 850,4276 850,4713 850,4900 850,4961 850,5053 850,5852 850,6373 850,7214 850,7531 850,7982 850,7993 850,8085 850,9369 850,13207 850,13321 850,15344 850,16758 850,17250 850,18877 850,19123 850,19502 850,20510 850,23077 850,24360 850,26673 850,27097 850,27103 850,28800 850,34930 850,39091 850,41078 850,49249 850,49279 850,49282 850,49298 850,49307 850,49326 850,49347 850,49356 850,49369 850,49384 850,49400 850,49406 850,49409 850,49412 850,49418 850,49425 850,49427 850,49438 850,49440 850,49441 850,49448 850,49815 850,49963 850,51408 850,52157 850,52672 850,53347 850,54315 850,54462 850,57498 850,63175 850,69532 850,74755 850,76733 850,78729 850,78923 850,85234 850,90893 850,94124 850,101587 850,103208 850,110765 850,111139 850,113371 850,130762 850,142617 850,145625 850,146513 850,148762 850,155544 850,158430 850,160537 850,161374 850,165390 850,167794 850,170018 850,170902 850,176389 850,179543 850,183392 850,186076 850,187378 850,190561 850,191910 850,200279 850,203119 850,204673 850,215485 850,231999 850,244018 850,248497 851,248 851,338 851,850 852,34 852,35 852,41 852,54 852,58 852,68 852,83 852,87 852,99 852,102 852,104 852,167 852,222 852,240 852,256 852,259 852,261 852,278 852,292 852,301 852,313 852,314 852,332 852,336 852,337 852,347 852,349 852,356 852,372 852,379 852,387 852,388 852,392 852,408 852,417 852,422 852,430 852,431 852,442 852,444 852,452 852,455 852,457 852,493 852,509 852,510 852,516 852,525 852,534 852,535 852,536 852,557 852,577 852,595 852,599 852,609 852,611 852,615 852,623 852,626 852,631 852,634 852,663 852,664 852,666 852,668 852,676 852,677 852,682 852,690 852,694 852,697 852,703 852,704 852,744 852,775 852,794 852,801 852,811 852,838 852,843 852,849 852,852 852,853 852,872 852,873 852,875 852,900 852,911 852,918 852,920 852,941 852,967 852,968 852,980 852,991 852,1014 852,1043 852,1058 852,1070 852,1085 852,1089 852,1130 852,1133 852,1143 852,1167 852,1172 852,1179 852,1191 852,1204 852,1235 852,1240 852,1246 852,1274 852,1309 852,1323 852,1326 852,1332 852,1335 852,1353 852,1368 852,1400 852,1402 852,1419 852,1435 852,1436 852,1454 852,1462 852,1467 852,1503 852,1511 852,1513 852,1522 852,1572 852,1580 852,1612 852,1616 852,1618 852,1663 852,1684 852,1688 852,1722 852,1740 852,1782 852,1796 852,1801 852,1844 852,1849 852,1954 852,1955 852,1986 852,1992 852,2224 852,2253 852,2334 852,2373 852,2436 852,2557 852,2572 852,2590 852,2605 852,2646 852,2699 852,2784 852,2812 852,2891 852,2995 852,3003 852,3069 852,3182 852,3260 852,3367 852,3392 852,3422 852,3617 852,3630 852,3653 852,3713 852,3804 852,3830 852,4039 852,4112 852,4190 852,4220 852,4222 852,4238 852,4276 852,4545 852,4707 852,5301 852,5323 852,5426 852,5591 852,5726 852,5788 852,5961 852,6068 852,6676 852,7159 852,7757 852,7768 852,7774 852,8214 852,8435 852,8479 852,13240 852,14682 852,14816 852,15109 852,15293 852,15458 852,15463 852,15690 852,15764 852,18543 852,18626 852,18827 852,18844 852,18881 852,19335 852,19439 852,19443 852,19458 852,19535 852,19572 852,20749 852,20772 852,20803 852,21568 852,21593 852,21982 852,22071 852,22078 852,22433 852,23446 852,23517 852,24583 852,25399 852,25506 852,25593 852,26041 852,26450 852,26789 852,27067 852,28229 852,28263 852,28343 852,28487 852,29685 852,29692 852,30296 852,30450 852,30872 852,31003 852,31055 852,31216 852,32694 852,32751 852,32784 852,33522 852,34116 852,35625 852,36678 852,37503 852,37547 852,38335 852,38859 852,39111 852,41207 852,41272 852,41437 852,41936 852,42575 852,42590 852,42990 852,44518 852,44777 852,44926 852,45498 852,46082 852,46359 852,46807 852,47173 852,47990 852,48101 852,48475 852,50308 852,51972 852,55093 852,55715 852,56775 852,56903 852,57009 852,57125 852,57144 852,57192 852,57411 852,58431 852,59113 852,61089 852,62239 852,62316 852,62319 852,63075 852,63088 852,63159 852,63678 852,63880 852,66297 852,66350 852,67168 852,68046 852,68053 852,68064 852,68332 852,68383 852,68691 852,68742 852,69119 852,70029 852,71029 852,71914 852,72001 852,72395 852,72439 852,74410 852,74685 852,74790 852,75347 852,75355 852,75912 852,79609 852,80682 852,81508 852,87372 852,87898 852,89766 852,90187 852,90296 852,90348 852,91258 852,91309 852,92876 852,92883 852,94195 852,94308 852,95380 852,95418 852,95778 852,98321 852,99076 852,99707 852,99790 852,101738 852,101954 852,105567 852,105686 852,105824 852,106184 852,106255 852,106892 852,107561 852,110186 852,110214 852,110575 852,112874 852,113353 852,114158 852,114559 852,115740 852,115805 852,116902 852,116929 852,118261 852,118419 852,118956 852,119428 852,120061 852,121107 852,122795 852,125082 852,125102 852,125461 852,125500 852,125885 852,126808 852,127072 852,129924 852,129927 852,130228 852,130501 852,131279 852,131285 852,131389 852,131761 852,131782 852,133203 852,133576 852,133584 852,133599 852,134177 852,136674 852,139010 852,139787 852,140127 852,140427 852,140653 852,141248 852,142757 852,142859 852,142863 852,143495 852,144136 852,145149 852,145533 852,145852 852,145959 852,146450 852,146652 852,146844 852,147415 852,147510 852,147533 852,147537 852,147540 852,147542 852,147546 852,147962 852,148052 852,149277 852,151480 852,151482 852,151531 852,152503 852,152597 852,152858 852,153263 852,153746 852,153860 852,153877 852,154004 852,154464 852,154756 852,154772 852,154890 852,154896 852,155181 852,155334 852,155479 852,156691 852,157599 852,158976 852,159727 852,161685 852,162609 852,163400 852,163450 852,163451 852,163780 852,164994 852,164999 852,165105 852,165373 852,165767 852,167801 852,169024 852,169087 852,169602 852,169609 852,169773 852,169942 852,171183 852,171805 852,171814 852,172242 852,173314 852,173477 852,173496 852,173547 852,173814 852,173836 852,173841 852,173937 852,174142 852,174799 852,174987 852,175332 852,175426 852,176072 852,177329 852,177952 852,178856 852,179049 852,182407 852,183056 852,183933 852,184022 852,184781 852,184866 852,184977 852,184978 852,185312 852,185341 852,185564 852,186785 852,186860 852,187425 852,188799 852,188801 852,188835 852,188847 852,188903 852,189208 852,190706 852,191267 852,191348 852,191893 852,192046 852,192617 852,192635 852,193154 852,193598 852,194577 852,194583 852,194590 852,194923 852,195162 852,195755 852,197848 852,198170 852,198303 852,201318 852,201551 852,205691 852,207049 852,207248 852,207685 852,211896 852,211946 852,212052 852,212368 852,213221 852,214281 852,214307 852,214910 852,215518 852,215874 852,216297 852,217632 852,218436 852,219139 852,219985 852,224531 852,224778 852,226297 852,228260 852,228263 852,228266 852,229934 852,230592 852,232817 852,233053 852,236712 852,236817 852,236838 852,237462 852,238253 852,238715 852,240031 852,240041 852,240048 852,240401 852,240476 852,241181 852,241601 852,241877 852,244096 852,245865 852,245955 852,245967 852,247321 852,248362 852,251532 852,252140 852,255798 852,259792 852,261844 853,87 853,1579 854,666 855,838 855,2784 856,26 856,59 856,843 856,1844 857,336 858,859 859,10 859,65 859,147 859,149 859,158 859,171 859,175 859,184 859,259 859,272 859,393 859,577 859,606 859,685 859,726 859,788 859,859 859,882 859,897 859,902 859,911 859,980 859,996 859,1011 859,1028 859,1070 859,1105 859,1180 859,1262 859,1388 859,1429 859,1456 859,1531 859,1619 859,2085 859,2106 859,2459 859,2874 859,4137 859,4611 859,5080 859,5307 859,5361 859,6652 859,6903 859,7262 859,7826 859,8400 859,8567 859,13858 859,14217 859,14392 859,14674 859,15074 859,16458 859,16469 859,18452 859,18484 859,18559 859,18702 859,19463 859,21286 859,21437 859,21438 859,21630 859,23485 859,23810 859,24837 859,26104 859,26121 859,26309 859,26751 859,26762 859,27086 859,27152 859,28312 859,29894 859,29912 859,30322 859,34252 859,34974 859,35486 859,36987 859,38525 859,38724 859,42115 859,42333 859,43272 859,43318 859,44919 859,45520 859,45544 859,46093 859,49577 859,56150 859,56944 859,59894 859,59955 859,60223 859,60517 859,63391 859,66424 859,66471 859,66472 859,67360 859,68934 859,70948 859,73391 859,76944 859,76958 859,77786 859,79329 859,80994 859,82233 859,85817 859,85979 859,86063 859,86592 859,87271 859,87388 859,87870 859,88590 859,89676 859,90127 859,91768 859,93689 859,93968 859,96521 859,96639 859,99053 859,100179 859,100180 859,100181 859,100182 859,100183 859,100307 859,100374 859,101678 859,112537 859,112592 859,113966 859,120468 859,120651 859,122913 859,127914 859,128870 859,130185 859,135977 859,145382 859,145978 859,147380 859,148033 859,152027 859,152598 859,159262 859,174420 859,174896 859,175219 859,175982 859,176447 859,176550 859,176786 859,179150 859,182443 859,182806 859,188814 859,191188 859,192425 859,192492 859,192883 859,196381 859,202788 859,204677 859,213956 859,216209 859,217895 859,220284 859,220286 859,227968 859,228383 859,230477 859,231024 859,233328 859,237381 859,237413 859,238800 859,239272 859,239273 859,242798 859,247183 859,250737 859,255556 859,257292 859,263057 860,302 860,861 860,893 861,22 861,50 861,433 861,599 861,818 861,838 861,1210 861,1659 861,127158 862,22 862,41 862,104 862,111 862,248 862,256 862,290 862,294 862,298 862,332 862,373 862,417 862,446 862,457 862,497 862,534 862,589 862,612 862,622 862,626 862,631 862,632 862,685 862,693 862,694 862,714 862,862 862,863 862,903 862,911 862,966 862,1014 862,1045 862,1085 862,1118 862,1119 862,1195 862,1346 862,1459 862,1462 862,1669 862,1808 862,1818 862,1837 862,2296 862,2452 862,2587 862,2995 862,3504 862,3578 862,3586 862,3623 862,3820 862,3944 862,4222 862,4286 862,4475 862,4609 862,5378 862,5472 862,5488 862,5828 862,5902 862,5903 862,6077 862,7777 862,7790 862,8537 862,12886 862,13328 862,14507 862,14969 862,15290 862,17256 862,19278 862,19488 862,19617 862,19737 862,19798 862,20301 862,20587 862,21211 862,21552 862,25407 862,27041 862,29859 862,31109 862,33567 862,34205 862,34726 862,36599 862,38496 862,42581 862,44725 862,45714 862,45856 862,46486 862,49634 862,50737 862,51972 862,52488 862,52552 862,54291 862,54635 862,61324 862,65886 862,67867 862,72887 862,74608 862,75180 862,75912 862,76101 862,77122 862,82020 862,85460 862,87077 862,88308 862,90130 862,91782 862,94134 862,94289 862,95643 862,97400 862,97644 862,98108 862,98825 862,100034 862,101829 862,103177 862,103281 862,103853 862,104175 862,104583 862,104627 862,105216 862,105924 862,106431 862,107205 862,107770 862,108250 862,111226 862,111299 862,112081 862,112301 862,113671 862,113724 862,117579 862,118156 862,118815 862,119643 862,119957 862,120010 862,120068 862,121433 862,122980 862,122991 862,123116 862,124087 862,124881 862,133940 862,135286 862,142282 862,144079 862,147581 862,148255 862,162531 862,162532 862,162780 862,164373 862,165654 862,168262 862,171555 862,172715 862,173265 862,178576 862,181757 862,182391 862,215289 862,216407 862,217694 862,219553 862,220607 862,228943 862,231029 862,243202 862,244850 862,245046 862,247064 862,254364 862,262498 863,577 863,862 864,328 865,5 865,134 865,137 865,967 865,1235 865,1432 865,2205 865,4114 865,6054 865,6621 865,19466 865,26296 865,27489 865,33424 865,42601 865,71229 865,83268 865,92711 865,223023 866,137 867,707 868,20 868,65 868,66 868,79 868,126 868,147 868,171 868,186 868,203 868,272 868,302 868,314 868,318 868,326 868,388 868,389 868,392 868,397 868,432 868,434 868,435 868,466 868,467 868,495 868,535 868,538 868,599 868,673 868,689 868,693 868,697 868,717 868,726 868,788 868,801 868,859 868,868 868,869 868,872 868,911 868,942 868,992 868,1010 868,1011 868,1085 868,1118 868,1151 868,1210 868,1235 868,1264 868,1335 868,1345 868,1370 868,1373 868,1388 868,1422 868,1433 868,1517 868,1566 868,1568 868,1577 868,1586 868,1782 868,1797 868,1844 868,2125 868,2400 868,2470 868,2561 868,2585 868,2903 868,2979 868,2991 868,3199 868,3241 868,3436 868,3474 868,3519 868,3548 868,3559 868,3569 868,3603 868,3681 868,3744 868,3804 868,3836 868,3884 868,3955 868,4066 868,4109 868,4159 868,4202 868,4205 868,4231 868,4446 868,4476 868,4560 868,4563 868,4646 868,5537 868,5563 868,5623 868,5851 868,5853 868,6235 868,6452 868,6459 868,6470 868,6511 868,6602 868,6706 868,6760 868,6761 868,6807 868,6904 868,6921 868,6925 868,6964 868,6990 868,7037 868,7056 868,7082 868,7132 868,7572 868,7761 868,7801 868,7830 868,7842 868,7949 868,8099 868,8139 868,8274 868,8435 868,9290 868,9424 868,9737 868,12278 868,13130 868,13182 868,13200 868,13216 868,13222 868,13233 868,13260 868,13398 868,13519 868,13526 868,14108 868,14292 868,14304 868,14311 868,14465 868,14645 868,14651 868,15199 868,15467 868,16010 868,16239 868,16315 868,16336 868,16357 868,16358 868,16638 868,17022 868,17116 868,17241 868,18110 868,18203 868,18206 868,18208 868,18209 868,18212 868,18214 868,18218 868,18219 868,18221 868,18222 868,18224 868,18233 868,18240 868,18242 868,18244 868,18248 868,18249 868,18250 868,18256 868,18260 868,18261 868,18262 868,18266 868,18267 868,18268 868,18270 868,18271 868,18281 868,18284 868,18289 868,18303 868,18304 868,18308 868,18309 868,18321 868,18323 868,18326 868,18329 868,18333 868,18334 868,18350 868,18354 868,18357 868,18358 868,18361 868,18362 868,18367 868,18369 868,18371 868,18380 868,18387 868,18397 868,18398 868,18399 868,18413 868,18419 868,18532 868,18630 868,18649 868,18787 868,18834 868,19281 868,19347 868,19553 868,19639 868,19968 868,20323 868,20344 868,20419 868,20613 868,20757 868,20786 868,21409 868,21540 868,21563 868,22000 868,22066 868,22152 868,22391 868,22414 868,23296 868,23337 868,23514 868,24841 868,25395 868,25585 868,26034 868,27048 868,27919 868,28112 868,28172 868,28223 868,28241 868,28317 868,28562 868,28962 868,28984 868,29064 868,29076 868,29102 868,29103 868,29127 868,29611 868,29622 868,29624 868,29638 868,29659 868,29671 868,29713 868,29743 868,29777 868,29799 868,31051 868,31280 868,32205 868,32280 868,32514 868,32582 868,32667 868,32929 868,32978 868,33297 868,33515 868,34135 868,34353 868,34367 868,34417 868,34726 868,35004 868,35345 868,35435 868,35456 868,36425 868,36679 868,36682 868,36683 868,36729 868,36734 868,36823 868,36971 868,37479 868,37602 868,37672 868,37963 868,38300 868,38432 868,38437 868,38707 868,39403 868,39410 868,39683 868,40025 868,40457 868,41345 868,41898 868,41904 868,42524 868,43366 868,43826 868,44157 868,44195 868,44208 868,44391 868,44933 868,45427 868,46324 868,46727 868,47022 868,47057 868,48042 868,48364 868,48404 868,48413 868,48538 868,48855 868,49194 868,49221 868,49690 868,49790 868,50014 868,50229 868,51289 868,51873 868,52077 868,54520 868,54958 868,55595 868,56264 868,56334 868,56633 868,57159 868,57182 868,57624 868,58420 868,58876 868,59139 868,60598 868,61356 868,62172 868,62373 868,62479 868,63424 868,63568 868,63589 868,63635 868,63926 868,64069 868,64075 868,64630 868,65888 868,66235 868,66327 868,66335 868,66337 868,66349 868,66364 868,66372 868,66617 868,67309 868,67899 868,67964 868,68001 868,68034 868,68187 868,68217 868,68613 868,68627 868,68722 868,68730 868,68736 868,68774 868,68833 868,69947 868,70169 868,70236 868,70824 868,70828 868,70847 868,70870 868,70908 868,71647 868,71649 868,71671 868,71978 868,72402 868,72488 868,72594 868,72648 868,72724 868,72776 868,72788 868,74520 868,74574 868,74586 868,74639 868,75295 868,75386 868,75898 868,76095 868,76142 868,76219 868,76624 868,76785 868,76803 868,76847 868,76870 868,76921 868,76975 868,76979 868,76988 868,77562 868,78812 868,79335 868,79336 868,79374 868,79383 868,79392 868,79417 868,79630 868,80084 868,80440 868,81233 868,81986 868,83177 868,83225 868,83373 868,83542 868,83845 868,84799 868,85733 868,85774 868,85848 868,85979 868,86002 868,86402 868,86437 868,87761 868,87770 868,87823 868,87894 868,88053 868,88328 868,88611 868,89733 868,89753 868,90470 868,90666 868,90675 868,90884 868,91207 868,91300 868,91312 868,91429 868,91433 868,91513 868,91837 868,93602 868,93609 868,93653 868,93721 868,93728 868,93758 868,94214 868,94249 868,94872 868,94942 868,94950 868,96540 868,96670 868,96733 868,98096 868,98819 868,98895 868,99355 868,103371 868,103820 868,104266 868,104391 868,104592 868,105515 868,105518 868,105519 868,105520 868,105730 868,105733 868,106353 868,106448 868,106899 868,107330 868,107406 868,107901 868,107906 868,108062 868,109378 868,109452 868,109533 868,109923 868,109936 868,110151 868,110263 868,110512 868,110600 868,110713 868,111241 868,111459 868,111981 868,112217 868,112239 868,112243 868,112300 868,112378 868,113535 868,113596 868,113957 868,114606 868,116185 868,116189 868,116191 868,116193 868,116196 868,116202 868,116203 868,116403 868,116535 868,116538 868,116540 868,116570 868,116589 868,116895 868,116982 868,117073 868,117115 868,117835 868,117940 868,117980 868,118085 868,118092 868,119480 868,119871 868,120158 868,120449 868,121060 868,121384 868,121632 868,122606 868,124450 868,124462 868,124574 868,124905 868,124940 868,125014 868,125638 868,126079 868,126125 868,126925 868,126976 868,127021 868,127147 868,127433 868,130264 868,130268 868,130356 868,130446 868,130922 868,131791 868,131792 868,131808 868,132835 868,133327 868,133376 868,133379 868,133466 868,134009 868,134109 868,134487 868,134584 868,135208 868,136467 868,137265 868,137410 868,137412 868,137420 868,137502 868,137656 868,138030 868,138763 868,138874 868,141817 868,142410 868,143957 868,143964 868,143968 868,144010 868,144030 868,144051 868,144920 868,145969 868,145985 868,146427 868,146445 868,146446 868,146816 868,147360 868,147489 868,147815 868,147816 868,147819 868,147824 868,148400 868,148696 868,149151 868,150011 868,151438 868,152212 868,152855 868,154744 868,155439 868,155691 868,156300 868,156379 868,156624 868,157367 868,157601 868,158182 868,158273 868,158276 868,158640 868,158750 868,158751 868,159049 868,159459 868,159694 868,159696 868,159702 868,159704 868,159706 868,159762 868,160370 868,161160 868,161166 868,161585 868,161843 868,161942 868,161945 868,162549 868,162553 868,162562 868,162566 868,162599 868,162894 868,162903 868,162918 868,163000 868,163004 868,163005 868,163007 868,163609 868,164222 868,164825 868,166069 868,167641 868,167671 868,168510 868,168832 868,169162 868,169325 868,169401 868,170628 868,170795 868,171213 868,171259 868,171551 868,171552 868,171558 868,171625 868,171627 868,171640 868,171643 868,171644 868,172256 868,173675 868,173866 868,173878 868,174488 868,174491 868,175281 868,175993 868,176090 868,176757 868,176770 868,177246 868,178617 868,178626 868,178656 868,178734 868,178773 868,179467 868,179627 868,179652 868,179654 868,180221 868,180391 868,180961 868,180970 868,181040 868,181231 868,182326 868,182906 868,183325 868,183333 868,183390 868,183444 868,183806 868,184716 868,185539 868,185883 868,186085 868,186105 868,186555 868,186603 868,188278 868,188406 868,190254 868,191136 868,191141 868,191145 868,191895 868,191934 868,192085 868,193004 868,193431 868,193434 868,193635 868,193642 868,194325 868,194328 868,194331 868,194358 868,194368 868,194398 868,194455 868,194484 868,194539 868,194925 868,194928 868,195572 868,195582 868,198699 868,212565 868,212962 868,212997 868,213006 868,213010 868,213084 868,214002 868,214077 868,214135 868,214619 868,214625 868,214650 868,214660 868,214818 868,214865 868,214876 868,214877 868,215358 868,215403 868,216526 868,217641 868,217877 868,220302 868,220400 868,220918 868,223727 868,223735 868,223822 868,223923 868,223956 868,224457 868,224459 868,224472 868,226184 868,226974 868,227013 868,228648 868,228948 868,228950 868,228979 868,229081 868,230948 868,232608 868,232714 868,232718 868,232864 868,233335 868,233400 868,233457 868,241734 868,242254 868,243434 868,244592 868,244809 868,245459 868,245477 868,245878 868,245920 868,247147 868,247250 868,247734 868,247815 868,248034 868,248516 868,249059 868,249181 868,249290 868,249348 868,250544 868,251272 868,251330 868,251470 868,254353 868,255512 868,258001 868,258011 868,258137 868,258142 868,258274 868,258282 868,258801 868,260319 868,260368 868,260855 868,260957 868,261896 868,261906 868,262356 868,262367 868,262369 868,262371 868,262375 868,263791 868,264509 868,264518 868,264525 869,868 870,749 870,811 870,1619 871,872 872,10 872,32 872,65 872,87 872,119 872,126 872,167 872,182 872,186 872,192 872,217 872,240 872,264 872,292 872,314 872,338 872,366 872,392 872,397 872,433 872,435 872,440 872,441 872,452 872,462 872,466 872,467 872,479 872,509 872,510 872,535 872,536 872,595 872,599 872,644 872,673 872,685 872,715 872,745 872,794 872,802 872,808 872,809 872,818 872,843 872,868 872,872 872,881 872,900 872,911 872,918 872,920 872,929 872,1010 872,1011 872,1058 872,1111 872,1118 872,1130 872,1140 872,1151 872,1192 872,1197 872,1204 872,1210 872,1326 872,1332 872,1341 872,1355 872,1363 872,1370 872,1417 872,1453 872,1454 872,1472 872,1531 872,1551 872,1556 872,1566 872,1627 872,1634 872,1653 872,1659 872,1663 872,1688 872,1722 872,1749 872,1758 872,1796 872,1836 872,1844 872,1845 872,1860 872,1893 872,2181 872,2418 872,2464 872,2496 872,2580 872,3035 872,3199 872,3258 872,3494 872,3507 872,3648 872,3809 872,3866 872,4039 872,4125 872,4381 872,4444 872,4580 872,4771 872,5809 872,5827 872,5851 872,6452 872,6734 872,6782 872,6904 872,6955 872,7880 872,7987 872,8149 872,13193 872,14297 872,14727 872,15493 872,15608 872,15609 872,16231 872,16268 872,16293 872,16362 872,16455 872,16502 872,17813 872,18245 872,18309 872,18560 872,19777 872,20261 872,20544 872,20591 872,20613 872,22278 872,23478 872,24682 872,24934 872,25378 872,26164 872,26186 872,26905 872,27053 872,27516 872,28233 872,28814 872,28999 872,29040 872,29593 872,29635 872,29757 872,29853 872,31942 872,32819 872,32822 872,32978 872,34039 872,35543 872,35624 872,37304 872,38380 872,38386 872,39059 872,39439 872,39810 872,41267 872,41760 872,42834 872,43231 872,43233 872,43391 872,44095 872,44115 872,46839 872,46968 872,48022 872,49266 872,49355 872,50987 872,52289 872,54439 872,54447 872,54505 872,54530 872,54921 872,57850 872,59001 872,62894 872,62951 872,64072 872,64086 872,68669 872,68770 872,71856 872,72596 872,72618 872,73388 872,73481 872,75801 872,75912 872,76815 872,80425 872,80704 872,81233 872,83449 872,90213 872,94077 872,98072 872,99355 872,108754 872,109378 872,111715 872,113411 872,116015 872,116744 872,119313 872,120957 872,121080 872,122936 872,125517 872,125548 872,125673 872,126757 872,127158 872,127471 872,128325 872,133543 872,133556 872,137806 872,137819 872,138863 872,141878 872,150022 872,151489 872,154183 872,154432 872,156914 872,159452 872,159984 872,160247 872,161513 872,165879 872,170759 872,170813 872,171775 872,172687 872,173733 872,175284 872,177887 872,178701 872,178747 872,179636 872,179744 872,179930 872,180054 872,181911 872,182506 872,182841 872,186509 872,189190 872,190566 872,191954 872,192278 872,192406 872,192428 872,192603 872,194330 872,195025 872,195116 872,195648 872,196650 872,205047 872,206824 872,212665 872,214551 872,215092 872,216216 872,218711 872,219066 872,221695 872,222608 872,226286 872,231030 872,236707 872,238236 872,240926 872,241740 872,249192 872,249451 872,259705 873,207 873,314 873,326 873,347 873,389 873,424 873,425 873,446 873,599 873,702 873,752 873,818 873,852 873,872 873,873 873,874 873,1045 873,1046 873,1133 873,1210 873,1276 873,1419 873,1561 873,2509 873,4039 873,4272 873,5302 873,6477 873,6552 873,14597 873,15620 873,16151 873,18526 873,20575 873,24365 873,25022 873,26081 873,30328 873,34732 873,35327 873,39583 873,40657 873,40839 873,41083 873,41084 873,41086 873,41087 873,41088 873,42433 873,42447 873,44102 873,45574 873,47836 873,49627 873,51880 873,53650 873,54404 873,55552 873,56537 873,60444 873,62990 873,64761 873,67097 873,68787 873,70689 873,73421 873,79582 873,79588 873,80003 873,80151 873,82539 873,84635 873,85701 873,85842 873,93113 873,94875 873,96455 873,96557 873,100339 873,101551 873,101684 873,101686 873,113327 873,113328 873,113329 873,113331 873,114358 873,118263 873,122770 873,128738 873,130149 873,130228 873,132876 873,134199 873,135378 873,138118 873,139473 873,139573 873,140195 873,140357 873,140531 873,142833 873,142837 873,143959 873,147515 873,150064 873,150259 873,150651 873,156380 873,165675 873,165704 873,167591 873,167684 873,167730 873,173260 873,175903 873,178555 873,178557 873,178652 873,188564 873,217216 873,250122 874,22 874,106 874,186 874,207 874,287 874,314 874,326 874,347 874,389 874,424 874,452 874,663 874,693 874,702 874,752 874,818 874,873 874,874 874,911 874,1011 874,1133 874,1210 874,1566 874,1634 874,1642 874,1801 874,2509 874,3578 874,4272 874,5302 874,5667 874,6552 874,7087 874,8658 874,9295 874,13420 874,13448 874,13457 874,13538 874,17305 874,19422 874,26031 874,29937 874,30328 874,30485 874,36837 874,45710 874,46997 874,48109 874,60444 874,62990 874,64152 874,64508 874,70285 874,81012 874,81078 874,85842 874,93113 874,98646 874,116878 874,128461 874,136615 874,140195 874,142055 874,143463 874,147515 874,152451 874,156380 874,160834 874,161844 874,166985 874,176415 874,216478 874,219940 874,223844 874,223845 874,223848 874,228147 874,236180 874,236728 874,242194 875,32 875,261 875,285 875,312 875,358 875,389 875,446 875,457 875,500 875,509 875,510 875,575 875,663 875,664 875,682 875,694 875,697 875,707 875,723 875,779 875,788 875,809 875,822 875,852 875,875 875,1011 875,1043 875,1172 875,1173 875,1345 875,1424 875,1515 875,1559 875,1566 875,2019 875,2191 875,2460 875,2508 875,2646 875,2754 875,3182 875,3367 875,4722 875,5200 875,5267 875,5540 875,5800 875,6247 875,6408 875,7076 875,7154 875,7766 875,7818 875,7987 875,9742 875,13657 875,14102 875,15112 875,15439 875,15704 875,18485 875,18491 875,19441 875,20390 875,20757 875,20857 875,24687 875,25446 875,26926 875,26988 875,28107 875,28152 875,29034 875,29854 875,29857 875,30373 875,31055 875,31080 875,32647 875,34231 875,35338 875,36720 875,39290 875,39661 875,41378 875,44352 875,44982 875,47021 875,47993 875,48056 875,51922 875,51928 875,58225 875,58276 875,58904 875,62951 875,63081 875,63921 875,68069 875,70764 875,72439 875,82624 875,85826 875,88544 875,89611 875,92289 875,92863 875,94128 875,96512 875,97915 875,99656 875,102430 875,105675 875,105689 875,106121 875,106183 875,106812 875,117348 875,128122 875,128127 875,134750 875,142541 875,147079 875,148012 875,148601 875,150037 875,162619 875,164121 875,165787 875,168388 875,168537 875,168701 875,174372 875,174752 875,180962 875,184563 875,189869 875,190533 875,194442 875,213030 875,229953 875,229994 876,328 877,10 877,106 877,459 877,518 877,720 877,744 877,762 877,877 877,878 877,907 877,937 877,972 877,973 877,1010 877,1111 877,1117 877,1258 877,1284 877,1297 877,1375 877,1544 877,1732 877,1837 877,2063 877,2228 877,2239 877,3455 877,3804 877,3941 877,5032 877,5438 877,5662 877,6539 877,13217 877,15344 877,15633 877,17154 877,24926 877,26161 877,26341 877,28294 877,33466 877,36784 877,38284 877,39543 877,39730 877,41445 877,43407 877,45853 877,46200 877,54478 877,58476 877,59866 877,64492 877,70992 877,71761 877,99123 877,103736 877,112666 877,118425 877,119399 877,124668 877,135131 877,137059 877,145502 877,145568 877,153621 877,154095 877,155689 877,158786 877,158990 877,161523 877,161534 877,162739 877,163425 877,164951 877,169061 877,171131 877,171149 877,171641 877,173894 877,174424 877,179336 877,194407 877,194481 877,195649 877,205673 877,213953 877,214151 877,214161 877,225541 877,232771 877,233329 877,243279 877,244054 877,256180 877,262503 878,877 878,1284 879,106 879,330 879,1888 880,309 880,310 880,626 881,302 881,467 881,872 881,893 881,1010 881,1556 881,1659 881,1782 882,726 882,859 882,996 882,1147 883,26 883,59 883,884 883,885 883,886 883,887 883,994 883,1432 883,21944 885,26 885,59 885,805 885,885 885,1212 885,2674 885,4113 885,9542 885,21944 886,26 886,59 886,885 886,886 886,994 886,1212 886,2674 886,16153 886,21944 886,39455 886,111142 888,63 888,192 888,333 888,493 889,48 889,704 889,1381 889,1452 889,3999 890,891 890,2646 891,222 891,313 891,536 891,635 891,660 891,890 891,891 891,911 891,949 891,1670 891,1676 891,1756 891,2176 891,2224 891,2646 891,2944 891,3824 891,4579 891,5721 891,6506 891,9036 891,13661 891,18831 891,21414 891,27093 891,28130 891,28282 891,31738 891,34270 891,37983 891,39065 891,39572 891,45590 891,46842 891,54484 891,56584 891,59649 891,62327 891,62805 891,74625 891,84860 891,88347 891,115474 891,124007 891,149315 891,151760 891,155229 891,175259 891,187479 891,189137 891,194501 891,198176 891,228673 892,893 893,673 893,687 893,718 893,849 893,893 893,1011 893,1130 893,1204 893,1844 894,589 895,304 895,366 895,479 895,1257 896,32 897,726 897,859 897,1539 897,1849 898,30 898,328 898,440 898,1179 899,900 900,256 900,314 900,336 900,356 900,397 900,535 900,599 900,673 900,676 900,685 900,693 900,843 900,852 900,899 900,900 900,911 900,972 900,1014 900,1113 900,1504 900,1559 900,1844 900,2373 900,2447 900,2460 900,3207 900,3509 900,3513 900,3582 900,3967 900,7783 900,8395 900,13396 900,14385 900,19572 900,22505 900,43382 900,45028 900,64887 900,79117 900,85795 900,88518 900,142355 900,143417 900,151335 900,171206 900,173839 900,176939 900,205638 900,205940 900,214134 900,222379 900,224402 900,228231 900,232061 900,251853 900,259856 900,260144 901,209 901,302 901,579 901,3769 902,171 902,259 902,393 902,538 902,577 902,726 902,788 902,859 902,980 902,1070 902,1105 902,138686 903,30 903,87 903,104 903,261 903,278 903,328 903,332 903,349 903,392 903,406 903,439 903,440 903,509 903,510 903,595 903,622 903,623 903,697 903,703 903,779 903,794 903,808 903,809 903,862 903,872 903,968 903,1014 903,1033 903,1058 903,1118 903,1179 903,1240 903,1417 903,1453 903,1466 903,1805 903,1836 903,1844 903,1860 903,1949 903,2116 903,3367 903,3538 903,19010 903,20813 903,22293 903,32751 903,141912 904,563 905,10 906,907 906,932 907,10 907,175 907,299 907,440 907,663 907,664 907,720 907,794 907,838 907,877 907,907 907,932 907,972 907,973 907,1010 907,1011 907,1117 907,1231 907,1284 907,1298 907,1360 907,1405 907,1522 907,1544 907,1749 907,1837 907,1849 907,1853 907,1973 907,2007 907,2057 907,2191 907,2193 907,2477 907,2595 907,2979 907,3285 907,3407 907,3507 907,4362 907,5265 907,7440 907,13474 907,13576 907,14077 907,14088 907,14600 907,15272 907,15303 907,15666 907,16634 907,18265 907,18511 907,18679 907,21095 907,21182 907,23171 907,24107 907,25663 907,29595 907,30373 907,31176 907,31383 907,32794 907,33710 907,33802 907,35081 907,35181 907,36687 907,36720 907,38156 907,39570 907,43407 907,45853 907,50607 907,52773 907,53134 907,54083 907,57402 907,58820 907,59341 907,62338 907,67667 907,68839 907,69679 907,71133 907,80958 907,84542 907,84553 907,96685 907,103207 907,109838 907,117231 907,118955 907,124354 907,124362 907,124928 907,125505 907,127155 907,131669 907,135910 907,138253 907,142487 907,145367 907,146505 907,147859 907,148742 907,149169 907,154382 907,155530 907,158586 907,159803 907,160441 907,160961 907,161677 907,177708 907,177812 907,177836 907,177913 907,180499 907,181193 907,182759 907,185579 907,195645 907,202244 907,221176 907,228916 907,238469 907,243359 907,244713 907,249778 907,255958 907,255963 907,258156 907,259955 908,326 908,4260 909,415 910,745 910,3422 911,10 911,30 911,41 911,68 911,71 911,81 911,83 911,102 911,106 911,119 911,126 911,163 911,175 911,200 911,202 911,203 911,207 911,211 911,233 911,251 911,252 911,259 911,272 911,287 911,292 911,313 911,314 911,338 911,344 911,346 911,349 911,356 911,379 911,388 911,389 911,397 911,415 911,417 911,440 911,441 911,446 911,447 911,452 911,467 911,481 911,489 911,493 911,497 911,512 911,518 911,534 911,535 911,536 911,577 911,623 911,626 911,631 911,663 911,664 911,668 911,671 911,673 911,676 911,684 911,685 911,693 911,694 911,704 911,733 911,765 911,772 911,775 911,781 911,788 911,794 911,808 911,809 911,811 911,838 911,841 911,842 911,849 911,859 911,862 911,868 911,872 911,891 911,900 911,911 911,918 911,919 911,929 911,972 911,980 911,991 911,996 911,1021 911,1022 911,1058 911,1070 911,1085 911,1096 911,1113 911,1118 911,1127 911,1130 911,1132 911,1133 911,1135 911,1143 911,1151 911,1172 911,1177 911,1204 911,1220 911,1222 911,1240 911,1243 911,1285 911,1309 911,1319 911,1332 911,1345 911,1359 911,1402 911,1417 911,1434 911,1445 911,1449 911,1453 911,1504 911,1511 911,1566 911,1619 911,1623 911,1634 911,1644 911,1677 911,1688 911,1782 911,1796 911,1801 911,1807 911,1808 911,1818 911,1836 911,1844 911,1848 911,1860 911,1928 911,1955 911,1985 911,1992 911,2045 911,2205 911,2209 911,2253 911,2296 911,2367 911,2424 911,2436 911,2460 911,2590 911,2646 911,2704 911,2775 911,2874 911,3069 911,3258 911,3422 911,3474 911,3507 911,3524 911,3538 911,3582 911,3623 911,3724 911,3967 911,4013 911,4123 911,4190 911,4220 911,4222 911,4271 911,4411 911,4448 911,4565 911,4611 911,4701 911,4760 911,4998 911,5213 911,5265 911,5356 911,5540 911,5961 911,6068 911,6119 911,6424 911,6824 911,6837 911,6883 911,6904 911,7092 911,7194 911,7318 911,8149 911,9457 911,10559 911,13207 911,13361 911,13383 911,13538 911,14016 911,14489 911,18097 911,18106 911,18512 911,21152 911,21167 911,21222 911,23357 911,24822 911,25271 911,25356 911,25431 911,26100 911,26450 911,27550 911,28294 911,32227 911,32751 911,33287 911,33328 911,33424 911,33572 911,34076 911,35094 911,35382 911,35486 911,36731 911,38954 911,40122 911,42918 911,45065 911,48011 911,48505 911,53983 911,54390 911,56089 911,58238 911,58247 911,58424 911,59753 911,66059 911,66512 911,66578 911,67950 911,69884 911,75190 911,75912 911,79395 911,81233 911,84429 911,88423 911,93083 911,93517 911,96675 911,101493 911,101652 911,103747 911,103814 911,107421 911,117818 911,118224 911,118861 911,119455 911,119459 911,119476 911,140316 911,154332 911,154976 911,155158 911,155386 911,158576 911,159398 911,162599 911,178576 911,185877 911,186023 911,188593 911,193129 911,205627 911,215276 911,227376 911,229746 911,244591 911,244646 911,252674 911,256250 913,264 913,1551 913,1579 913,1659 913,1893 913,6695 914,338 915,79 915,509 916,917 918,87 918,120 918,126 918,186 918,207 918,256 918,314 918,397 918,433 918,452 918,457 918,500 918,535 918,599 918,623 918,668 918,673 918,676 918,685 918,808 918,809 918,818 918,849 918,852 918,872 918,911 918,919 918,972 918,1011 918,1014 918,1118 918,1130 918,1172 918,1240 918,1345 918,1417 918,1465 918,1566 918,1663 918,1805 918,1860 918,1949 918,1973 918,2310 918,2373 918,4190 918,4760 918,5833 918,6059 918,6904 918,6955 918,9457 918,15609 918,19010 918,19413 918,20757 918,22293 918,118336 918,127158 918,215874 919,175 919,349 919,392 919,446 919,457 919,623 919,661 919,911 919,918 919,941 919,1032 919,1085 919,1240 919,1805 919,1860 919,2252 919,3718 919,4118 919,4692 919,5659 919,6430 919,6955 919,7967 919,14042 919,14648 919,20573 919,22278 919,22471 919,23162 919,27005 919,29054 919,35093 919,43119 919,44347 919,47684 919,47832 919,48606 919,49222 919,52432 919,55741 919,55746 919,65663 919,65928 919,74716 919,80536 919,83380 919,93117 919,103564 919,107414 919,109809 919,121635 919,126735 919,127991 919,134229 919,136190 919,136191 919,136637 919,145129 919,145837 919,147503 919,151718 919,158338 919,160864 919,167612 919,172227 919,177575 919,185866 919,191337 919,192433 919,214298 919,220931 919,256177 919,259618 920,7 920,10 920,22 920,56 920,175 920,184 920,192 920,251 920,252 920,256 920,314 920,333 920,336 920,397 920,406 920,435 920,440 920,467 920,493 920,505 920,516 920,599 920,602 920,673 920,676 920,733 920,794 920,838 920,841 920,849 920,852 920,872 920,920 920,921 920,954 920,1011 920,1014 920,1053 920,1089 920,1118 920,1130 920,1163 920,1172 920,1181 920,1204 920,1243 920,1281 920,1385 920,1417 920,1464 920,1494 920,1498 920,1518 920,1531 920,1603 920,1619 920,1620 920,1623 920,1645 920,1689 920,1796 920,1825 920,1844 920,1973 920,2098 920,2106 920,2174 920,2244 920,2317 920,2373 920,2400 920,2471 920,2574 920,3828 920,3880 920,3946 920,4315 920,4344 920,4451 920,5018 920,5353 920,5514 920,5528 920,5696 920,5851 920,5945 920,6119 920,6311 920,6549 920,6576 920,6976 920,7087 920,7318 920,7921 920,8100 920,8515 920,8854 920,8956 920,9751 920,12112 920,13515 920,13560 920,13605 920,14168 920,14219 920,14247 920,14389 920,15736 920,15744 920,15753 920,16107 920,16129 920,16140 920,16703 920,16984 920,17046 920,18224 920,18272 920,18322 920,18465 920,18497 920,18878 920,19012 920,19447 920,19529 920,19554 920,19793 920,19859 920,19884 920,21239 920,21242 920,21281 920,21423 920,21517 920,21589 920,22128 920,22147 920,22206 920,22332 920,22349 920,22616 920,23283 920,23861 920,24595 920,24719 920,24748 920,24794 920,25007 920,25528 920,25668 920,26286 920,26831 920,26956 920,27771 920,28192 920,28383 920,28388 920,28529 920,28803 920,29076 920,29648 920,29917 920,30331 920,30424 920,30839 920,31172 920,31284 920,31340 920,31421 920,31460 920,31955 920,32276 920,32822 920,33246 920,33512 920,33648 920,34230 920,34893 920,35524 920,36218 920,36912 920,36973 920,37068 920,37123 920,37430 920,38926 920,39122 920,39629 920,39697 920,39727 920,39732 920,39736 920,39744 920,39765 920,39767 920,39983 920,40017 920,40692 920,40811 920,40909 920,41004 920,41039 920,41262 920,41452 920,41907 920,41915 920,42692 920,42865 920,43131 920,43510 920,43643 920,43644 920,43647 920,43649 920,43908 920,44228 920,44504 920,44506 920,44511 920,44824 920,44882 920,44963 920,45390 920,45723 920,45791 920,45878 920,46409 920,46416 920,46423 920,46840 920,47239 920,47697 920,48119 920,48207 920,48247 920,48272 920,48490 920,49150 920,50333 920,51483 920,52481 920,54320 920,54438 920,55933 920,56791 920,57000 920,57107 920,57724 920,58269 920,58361 920,58889 920,59183 920,59276 920,60576 920,61324 920,62162 920,62342 920,62408 920,62567 920,62576 920,62958 920,62963 920,63890 920,63985 920,65647 920,65744 920,65833 920,65957 920,65972 920,66290 920,66333 920,66416 920,67078 920,67371 920,67532 920,67538 920,68510 920,69798 920,70143 920,70896 920,71884 920,72381 920,72529 920,73332 920,73645 920,77511 920,79572 920,80059 920,80104 920,80190 920,80202 920,83294 920,83920 920,84480 920,84631 920,86402 920,87067 920,87102 920,90295 920,91307 920,91945 920,92257 920,93199 920,93268 920,93777 920,93821 920,93852 920,94095 920,94194 920,94228 920,94378 920,95020 920,95113 920,95476 920,95559 920,96280 920,96374 920,97240 920,97509 920,97514 920,98137 920,98424 920,98427 920,99480 920,101008 920,101997 920,102102 920,102106 920,102134 920,102550 920,103110 920,106246 920,106929 920,107492 920,109586 920,109590 920,109631 920,110034 920,110098 920,110189 920,110399 920,110523 920,111137 920,111171 920,112399 920,112436 920,112903 920,112974 920,112996 920,113095 920,113945 920,114271 920,114580 920,115284 920,115992 920,116410 920,116471 920,116536 920,117480 920,118336 920,118392 920,118402 920,118409 920,118431 920,118925 920,118930 920,119034 920,119049 920,119387 920,119388 920,119445 920,119496 920,120924 920,122198 920,123026 920,123148 920,123188 920,123192 920,123193 920,123200 920,123259 920,123376 920,123669 920,123823 920,123985 920,124329 920,125005 920,125372 920,126309 920,126533 920,127181 920,127854 920,128377 920,128869 920,129247 920,129796 920,130948 920,132593 920,133745 920,133747 920,133982 920,134006 920,136536 920,139503 920,139525 920,139552 920,140177 920,140224 920,140440 920,140526 920,140527 920,140541 920,140568 920,140818 920,142788 920,142882 920,142929 920,142962 920,143101 920,143105 920,143157 920,143269 920,143609 920,143999 920,146138 920,148297 920,155030 920,156582 920,159410 920,159417 920,159651 920,159792 920,159829 920,159969 920,160226 920,160437 920,161828 920,162953 920,162954 920,162957 920,165735 920,165950 920,167691 920,167696 920,167711 920,167775 920,169017 920,169023 920,169030 920,171199 920,172037 920,172100 920,172907 920,172962 920,173202 920,173625 920,174881 920,175928 920,176643 920,176842 920,176856 920,176868 920,177391 920,178229 920,179081 920,179182 920,179191 920,179237 920,179268 920,180032 920,180992 920,183550 920,184305 920,184606 920,187297 920,187981 920,188381 920,188891 920,191136 920,191165 920,191211 920,192724 920,194400 920,194622 920,196056 920,196355 920,196361 920,196362 920,196367 920,196368 920,196810 920,198770 920,198776 920,198803 920,199847 920,202380 920,204015 920,204188 920,204714 920,204781 920,205079 920,205122 920,205138 920,205152 920,205162 920,205734 920,206201 920,207141 920,207434 920,212001 920,212954 920,213955 920,216370 920,218827 920,220292 920,221037 920,226411 920,231048 920,231058 920,231073 920,231986 920,234358 920,234374 920,248692 920,251623 920,252699 920,253181 920,254246 920,254535 920,254993 920,258047 920,258962 920,259258 920,261887 920,262508 920,262697 920,262779 920,263107 920,264500 920,264519 920,264767 920,264770 921,272 921,920 922,72 922,312 922,3695 923,222 923,338 924,202 924,203 924,925 926,781 927,536 928,929 929,10 929,20 929,65 929,158 929,167 929,186 929,209 929,222 929,259 929,312 929,336 929,360 929,397 929,406 929,441 929,457 929,510 929,512 929,535 929,604 929,622 929,640 929,673 929,676 929,685 929,718 929,772 929,801 929,818 929,843 929,852 929,872 929,911 929,928 929,929 929,988 929,1087 929,1118 929,1267 929,1284 929,1370 929,1402 929,1559 929,1566 929,1655 929,1663 929,1671 929,1677 929,1762 929,1848 929,1992 929,2512 929,2923 929,3507 929,4039 929,4190 929,4200 929,5726 929,6418 929,6558 929,6604 929,6685 929,7087 929,7117 929,14478 929,14545 929,16222 929,16555 929,18696 929,20757 929,21264 929,25108 929,26083 929,26310 929,29002 929,37596 929,40588 929,41548 929,43308 929,43910 929,44778 929,44862 929,51954 929,52798 929,52824 929,56357 929,57052 929,62422 929,64031 929,64064 929,67311 929,79618 929,84629 929,84711 929,85061 929,87036 929,87141 929,87812 929,89561 929,91416 929,99788 929,105663 929,107259 929,119731 929,122982 929,123027 929,125947 929,133920 929,138155 929,146190 929,151465 929,161509 929,168464 929,170651 929,170719 929,171126 929,195687 929,216291 929,261534 930,931 930,1363 930,3507 932,86 932,135 932,298 932,372 932,373 932,446 932,534 932,663 932,664 932,715 932,907 932,932 932,937 932,972 932,973 932,1010 932,1016 932,1122 932,1284 932,1298 932,1402 932,1493 932,1511 932,1623 932,1651 932,1681 932,1732 932,1807 932,1831 932,1837 932,1849 932,1955 932,1985 932,3001 932,3069 932,3289 932,3507 932,3766 932,3957 932,4308 932,4540 932,6656 932,6947 932,7530 932,8045 932,8165 932,8494 932,9154 932,11173 932,13506 932,14497 932,14532 932,14603 932,14626 932,16693 932,17023 932,18672 932,20575 932,20843 932,22177 932,24238 932,24839 932,24967 932,26465 932,26781 932,29588 932,31528 932,32784 932,34515 932,37475 932,42335 932,43332 932,43778 932,44176 932,46883 932,47644 932,49035 932,49095 932,54649 932,55163 932,55923 932,58472 932,59043 932,59354 932,61213 932,61546 932,64808 932,64828 932,65053 932,70082 932,70458 932,70477 932,72425 932,78561 932,79626 932,89095 932,95722 932,97085 932,100785 932,104748 932,109656 932,112524 932,112540 932,115479 932,119666 932,121837 932,133434 932,138917 932,139020 932,139532 932,139646 932,140021 932,143725 932,148905 932,152211 932,156771 932,158752 932,171641 932,171801 932,174996 932,180617 932,186900 932,189741 932,201704 932,204791 932,220763 932,222883 932,227371 932,237320 932,238692 932,240495 932,243275 932,252818 932,260787 933,338 933,579 933,838 934,20 934,178 934,315 934,346 934,434 934,435 934,447 934,538 934,671 934,934 934,935 934,939 934,1033 934,1068 934,1393 934,1474 934,1612 934,1877 934,1891 934,1973 934,2353 934,2470 934,2625 934,3831 934,4646 934,5083 934,5186 934,5611 934,6440 934,6661 934,7128 934,8477 934,13506 934,14111 934,14393 934,15146 934,17050 934,17423 934,17425 934,18416 934,18613 934,23302 934,25384 934,25575 934,26785 934,28922 934,29868 934,33298 934,35176 934,36915 934,38407 934,39725 934,41378 934,41435 934,44249 934,46271 934,47137 934,56008 934,72409 934,79010 934,79945 934,93005 934,93671 934,96622 934,99721 934,113469 934,116095 934,119552 934,121505 934,122050 934,123133 934,126696 934,128835 934,128936 934,145017 934,148405 934,152182 934,154329 934,164822 934,166673 934,168339 934,168370 934,177897 934,190473 934,198805 934,205749 934,212894 934,214093 934,221902 934,227815 934,243522 934,253099 935,178 935,326 935,934 936,698 937,10 937,37 937,106 937,287 937,336 937,444 937,446 937,506 937,567 937,615 937,663 937,664 937,693 937,698 937,717 937,750 937,932 937,937 937,968 937,972 937,973 937,1010 937,1089 937,1122 937,1160 937,1231 937,1241 937,1293 937,1298 937,1300 937,1436 937,1715 937,1732 937,1740 937,1774 937,1782 937,1837 937,1848 937,1849 937,1985 937,2372 937,3422 937,5662 937,7400 937,7530 937,13991 937,16614 937,21249 937,34253 937,44937 937,103860 937,124668 937,127293 937,145366 937,170729 937,189303 937,221828 938,698 938,1782 939,20 939,163 939,178 939,192 939,264 939,302 939,346 939,435 939,439 939,440 939,447 939,467 939,516 939,538 939,671 939,934 939,1033 939,1294 939,1612 939,1877 939,1913 939,5996 939,6654 939,6966 939,15802 939,16881 939,38439 939,41767 939,81233 940,356 940,941 940,1849 941,86 941,167 941,299 941,522 941,563 941,567 941,663 941,664 941,744 941,852 941,919 941,932 941,940 941,941 941,1167 941,1319 941,1436 941,1479 941,1522 941,1607 941,1837 941,2083 941,2192 941,2372 941,2557 941,2888 941,3207 941,3218 941,4722 941,6467 941,7461 941,8097 941,8435 941,8534 941,8686 941,9457 941,15633 941,19966 941,21459 941,22177 941,26037 941,27432 941,30179 941,31175 941,31595 941,44518 941,46053 941,47103 941,48977 941,62943 941,62955 941,63038 941,63375 941,67147 941,67995 941,74631 941,79393 941,101995 941,103355 941,104418 941,106211 941,107592 941,113100 941,113530 941,114601 941,119894 941,122395 941,124911 941,128324 941,128889 941,129868 941,130854 941,130965 941,147410 941,155632 941,156243 941,171016 941,195102 941,225318 941,232816 941,234192 941,250629 942,571 942,868 943,135 943,138 943,225 943,364 943,373 943,943 943,944 943,1332 943,1368 943,1415 943,1737 943,2041 943,2105 943,4562 943,5405 943,8552 943,13374 943,15413 943,20432 943,26244 943,32816 943,44725 943,46276 943,82935 943,93707 943,96609 943,103123 943,119286 943,125867 943,177659 943,179565 943,190276 943,247154 943,248753 944,285 944,364 944,943 945,946 945,1050 945,1572 945,4581 945,15235 945,15612 945,16363 945,20324 945,21372 946,945 947,147 947,149 947,192 947,273 947,274 947,333 947,425 947,586 947,663 947,664 947,937 947,1149 947,1235 947,1335 947,2244 947,4060 947,8332 947,80266 947,94409 948,949 949,10 949,34 949,35 949,83 949,192 949,211 949,217 949,222 949,240 949,256 949,278 949,313 949,379 949,389 949,431 949,455 949,536 949,599 949,635 949,685 949,693 949,694 949,818 949,843 949,849 949,852 949,891 949,948 949,949 949,951 949,1011 949,1069 949,1085 949,1417 949,1587 949,1588 949,1623 949,1724 949,1996 949,2224 949,2253 949,2266 949,2348 949,2646 949,2665 949,2784 949,2906 949,2989 949,2991 949,3252 949,3507 949,3933 949,3937 949,4514 949,4579 949,4794 949,5312 949,6131 949,6828 949,6942 949,6960 949,7218 949,8070 949,8171 949,8628 949,8658 949,9328 949,13462 949,13571 949,13622 949,13980 949,14346 949,14414 949,14653 949,14833 949,16244 949,16620 949,17058 949,17151 949,18827 949,19005 949,20035 949,20862 949,24585 949,24758 949,25762 949,26140 949,28130 949,28605 949,28851 949,29595 949,29662 949,29760 949,30459 949,30617 949,31738 949,32804 949,38947 949,39366 949,39708 949,40809 949,40820 949,41053 949,41268 949,42070 949,42689 949,42737 949,43383 949,45258 949,45584 949,45590 949,46165 949,46783 949,47517 949,48783 949,49421 949,54784 949,55039 949,55983 949,56722 949,57354 949,59331 949,59788 949,62623 949,63201 949,64027 949,66703 949,69941 949,73310 949,74465 949,74553 949,75240 949,75343 949,80153 949,82350 949,86735 949,87763 949,93025 949,94298 949,96762 949,97988 949,101896 949,101967 949,102585 949,103532 949,106131 949,106292 949,109412 949,109706 949,111222 949,115474 949,117107 949,119978 949,121060 949,122230 949,122495 949,123390 949,123493 949,123627 949,127158 949,130275 949,130942 949,131216 949,131359 949,132508 949,134797 949,135575 949,136065 949,136530 949,136626 949,136733 949,137030 949,137042 949,138420 949,139173 949,140805 949,143368 949,143383 949,146537 949,146544 949,146746 949,147169 949,147429 949,147967 949,150746 949,151060 949,152685 949,153195 949,153774 949,153892 949,154019 949,154031 949,154042 949,155229 949,155397 949,156010 949,156436 949,156475 949,156790 949,157194 949,157196 949,158212 949,160975 949,163898 949,173685 949,174411 949,174850 949,178566 949,181899 949,182166 949,182540 949,183026 949,184837 949,186092 949,191138 949,191875 949,194645 949,195218 949,198862 949,199379 949,211850 949,212914 949,214005 949,217882 949,218195 949,219891 949,219967 949,222340 949,224871 949,225460 949,228458 949,231833 949,234800 949,238094 949,243017 949,246719 949,247410 949,249260 949,262393 949,262507 949,262545 949,263804 949,263969 949,263982 949,264477 949,264488 950,30 950,217 950,267 950,328 950,397 950,439 950,440 950,467 950,622 950,794 950,809 950,1033 950,1179 950,1429 950,1844 950,4276 950,4355 950,75912 951,34 951,35 951,217 951,222 951,278 951,283 951,455 951,536 951,657 951,781 951,949 951,1019 951,1467 951,1860 951,19443 951,127158 952,104 952,557 952,953 952,954 953,104 953,248 953,254 953,327 953,328 953,557 953,881 953,953 953,1085 953,1844 953,2053 953,4276 953,15782 953,20741 953,24689 953,28891 953,29905 953,31156 953,39528 953,62986 953,86482 953,94157 953,95317 953,99852 953,120879 953,152913 953,157940 953,220007 953,229748 954,104 954,557 954,920 954,954 954,1939 954,4276 954,10318 954,93095 955,326 956,620 956,957 956,1298 956,1359 956,1388 956,1623 956,6556 956,6695 956,66500 957,184 957,640 957,957 957,1247 957,1623 957,43853 957,43854 957,43855 957,43856 958,959 960,959 961,959 962,959 963,959 964,959 965,668 965,972 966,136 966,442 966,609 966,784 966,818 966,862 966,1046 967,5 967,25 967,26 967,47 967,59 967,114 967,117 967,430 967,852 967,865 967,885 967,887 967,994 967,1235 967,1335 967,1432 967,1775 967,2088 967,2089 967,2469 967,2712 967,2893 967,2940 967,3795 967,3796 967,4114 967,4571 967,5701 967,9542 967,14721 967,15959 967,16614 967,19697 967,19893 967,21944 967,34060 967,42601 967,88820 967,108056 967,154690 967,205627 968,37 968,46 968,167 968,182 968,186 968,256 968,261 968,299 968,301 968,314 968,356 968,444 968,459 968,534 968,567 968,569 968,589 968,599 968,604 968,605 968,609 968,615 968,631 968,663 968,664 968,668 968,717 968,752 968,783 968,808 968,818 968,852 968,903 968,929 968,937 968,968 968,972 968,973 968,1001 968,1010 968,1011 968,1045 968,1046 968,1160 968,1167 968,1210 968,1231 968,1285 968,1293 968,1300 968,1564 968,1566 968,1627 968,1732 968,1740 968,1782 968,1832 968,1837 968,1849 968,1852 968,1853 968,1939 968,1973 968,2217 968,2509 968,2557 968,2595 968,2642 968,2989 968,2991 968,3207 968,3275 968,3379 968,3422 968,3560 968,3582 968,3756 968,3871 968,3883 968,4213 968,4253 968,4291 968,4411 968,4517 968,4598 968,5094 968,5255 968,5382 968,5434 968,5455 968,5662 968,6167 968,7222 968,7530 968,9340 968,13296 968,13354 968,13418 968,14828 968,15588 968,16247 968,16630 968,17894 968,18098 968,18665 968,18688 968,20282 968,20287 968,20327 968,20328 968,20358 968,20407 968,20811 968,21701 968,22062 968,23728 968,23799 968,24627 968,24875 968,25022 968,25342 968,26034 968,26102 968,26201 968,28317 968,28455 968,28498 968,28859 968,28924 968,29759 968,29760 968,30328 968,31784 968,31785 968,32777 968,34064 968,35046 968,36988 968,37381 968,37453 968,37495 968,38178 968,38792 968,38893 968,39232 968,41332 968,42424 968,42598 968,45195 968,45480 968,46075 968,46667 968,46792 968,47424 968,48263 968,48545 968,48640 968,48886 968,50423 968,54606 968,55099 968,58820 968,59066 968,59143 968,59908 968,60088 968,60375 968,60541 968,60568 968,62983 968,63038 968,66644 968,72824 968,72915 968,73355 968,74415 968,74486 968,80494 968,82871 968,83174 968,83331 968,83493 968,84160 968,85983 968,86518 968,87287 968,87399 968,88173 968,90254 968,91079 968,94845 968,95400 968,96482 968,96685 968,96763 968,99802 968,101485 968,103860 968,109070 968,110186 968,110575 968,113093 968,116480 968,118326 968,120465 968,122132 968,122451 968,122880 968,123044 968,124017 968,124874 968,127158 968,127858 968,134363 968,135369 968,135370 968,137113 968,137149 968,148876 968,157413 968,158801 968,159454 968,163183 968,163454 968,163918 968,164836 968,167083 968,167565 968,173207 968,173663 968,175033 968,179007 968,179318 968,180551 968,181835 968,186657 968,187176 968,188664 968,189303 968,192191 968,195523 968,199424 968,207659 968,212312 968,212351 968,212474 968,215241 968,215802 968,217262 968,220492 968,221828 968,221920 968,222632 968,224451 968,226490 968,227376 968,228883 968,230690 968,231939 968,232175 968,247902 968,251473 968,252863 968,255081 968,258174 968,258354 968,260934 968,263126 969,397 969,415 969,694 969,2646 969,2775 969,3623 970,417 971,323 972,10 972,46 972,86 972,126 972,167 972,182 972,256 972,299 972,301 972,302 972,314 972,336 972,356 972,372 972,397 972,406 972,440 972,446 972,452 972,457 972,505 972,512 972,534 972,535 972,563 972,599 972,604 972,631 972,663 972,664 972,668 972,676 972,693 972,720 972,784 972,794 972,838 972,843 972,849 972,877 972,907 972,932 972,937 972,968 972,972 972,973 972,1010 972,1011 972,1013 972,1014 972,1085 972,1117 972,1118 972,1122 972,1123 972,1130 972,1172 972,1181 972,1192 972,1231 972,1240 972,1267 972,1271 972,1284 972,1293 972,1297 972,1298 972,1417 972,1436 972,1493 972,1522 972,1559 972,1566 972,1611 972,1623 972,1655 972,1663 972,1732 972,1749 972,1782 972,1837 972,1844 972,1849 972,1973 972,1992 972,2063 972,2173 972,2191 972,2224 972,2253 972,2263 972,2347 972,2373 972,2460 972,2511 972,2580 972,2728 972,3297 972,3392 972,3422 972,3507 972,3524 972,3687 972,3756 972,3804 972,3893 972,3992 972,4066 972,4190 972,4209 972,5213 972,5382 972,5794 972,5998 972,6518 972,6824 972,6857 972,6904 972,6987 972,7293 972,7303 972,7349 972,7530 972,7818 972,7908 972,7936 972,7941 972,8113 972,8132 972,8165 972,9375 972,9457 972,13447 972,14497 972,14572 972,14598 972,14652 972,15073 972,15203 972,16323 972,17021 972,17073 972,18604 972,18672 972,19334 972,19413 972,19525 972,19592 972,20396 972,20668 972,20709 972,20728 972,20803 972,21095 972,21249 972,21442 972,21459 972,23364 972,23565 972,24562 972,24924 972,24926 972,26302 972,26341 972,26948 972,27901 972,28254 972,28914 972,32497 972,32781 972,32784 972,33569 972,34928 972,35415 972,35623 972,35654 972,35658 972,37098 972,37343 972,38299 972,39053 972,39206 972,39536 972,39562 972,39704 972,42544 972,43193 972,43875 972,45423 972,45853 972,52528 972,52672 972,54297 972,54403 972,56365 972,58240 972,59920 972,61139 972,61555 972,62024 972,63408 972,64715 972,65913 972,66594 972,67090 972,67142 972,67789 972,68152 972,68178 972,68184 972,68186 972,68221 972,68769 972,68832 972,68893 972,70230 972,70350 972,70947 972,71078 972,71098 972,72764 972,73290 972,73333 972,74702 972,75057 972,75912 972,79528 972,80430 972,83321 972,86562 972,88498 972,90333 972,90334 972,90337 972,90692 972,92017 972,93717 972,95118 972,95361 972,97325 972,102507 972,104346 972,105319 972,105532 972,105780 972,107026 972,107162 972,107616 972,109838 972,111217 972,114682 972,117480 972,118484 972,124668 972,125841 972,131652 972,134628 972,136153 972,137058 972,137059 972,138823 972,148387 972,148742 972,153177 972,154887 972,155188 972,156340 972,157029 972,159117 972,160490 972,173435 972,176449 972,176469 972,178379 972,183102 972,186675 972,186900 972,187176 972,189560 972,191280 972,191381 972,192405 972,192419 972,204791 972,205673 972,214056 972,215874 972,216085 972,216170 972,223099 972,223693 972,226905 972,227669 972,234102 972,237320 972,240084 972,248536 972,248918 972,249055 972,249218 972,250835 972,258422 972,258463 972,261851 972,262384 973,46 973,167 973,240 973,292 973,299 973,301 973,444 973,446 973,631 973,663 973,664 973,666 973,685 973,720 973,744 973,775 973,818 973,877 973,907 973,932 973,937 973,968 973,972 973,973 973,982 973,983 973,984 973,992 973,1001 973,1010 973,1011 973,1085 973,1117 973,1118 973,1122 973,1124 973,1167 973,1231 973,1241 973,1271 973,1284 973,1297 973,1298 973,1300 973,1436 973,1522 973,1544 973,1559 973,1616 973,1623 973,1635 973,1715 973,1731 973,1732 973,1749 973,1782 973,1837 973,1849 973,2083 973,2191 973,2372 973,2625 973,2979 973,3207 973,3422 973,3507 973,3804 973,4066 973,4213 973,4329 973,5662 973,6474 973,6919 973,7222 973,7818 973,8261 973,8548 973,8658 973,13523 973,14414 973,14469 973,15109 973,15253 973,15277 973,16506 973,18526 973,20327 973,20704 973,23565 973,25802 973,31731 973,31802 973,32264 973,32784 973,34073 973,35415 973,35623 973,37771 973,39053 973,39562 973,39665 973,40606 973,40792 973,44385 973,44444 973,45853 973,49853 973,50402 973,50595 973,52403 973,52528 973,54403 973,54504 973,54983 973,57072 973,57082 973,57083 973,57084 973,57085 973,57088 973,57089 973,57091 973,57097 973,57098 973,57099 973,57100 973,57101 973,57102 973,57103 973,57104 973,57106 973,57108 973,57110 973,57111 973,57112 973,57113 973,57115 973,57121 973,57164 973,57276 973,57811 973,58444 973,58450 973,58515 973,59920 973,61139 973,62404 973,64226 973,66594 973,67090 973,67630 973,67789 973,68178 973,68184 973,68186 973,68221 973,68817 973,68893 973,68965 973,70230 973,70350 973,72764 973,73187 973,74082 973,74687 973,77473 973,80379 973,82739 973,83291 973,83321 973,86608 973,88306 973,90254 973,91998 973,95361 973,99907 973,103202 973,105157 973,108485 973,110322 973,111098 973,111553 973,111722 973,112338 973,112501 973,112722 973,113499 973,114682 973,115479 973,116443 973,116642 973,117609 973,117805 973,120451 973,127158 973,128733 973,128822 973,131928 973,131929 973,131934 973,134672 973,134724 973,135236 973,138953 973,142077 973,144110 973,148742 973,152298 973,158219 973,162702 973,162703 973,162704 973,164496 973,165919 973,174187 973,181145 973,182928 973,185612 973,186900 973,187176 973,188815 973,194470 973,195559 973,204791 973,212687 973,222652 973,228787 973,237320 973,258091 974,975 974,37363 974,52488 974,54401 976,385 977,4 977,5 977,134 977,527 977,743 977,794 977,1984 977,2674 977,8714 977,95583 978,87 978,111 978,292 978,314 978,323 978,338 978,392 978,462 978,595 978,1151 978,1238 978,1289 978,1453 978,1572 978,1653 978,1688 978,1722 978,1893 978,4039 978,4771 978,7270 978,8149 979,980 980,259 980,272 980,314 980,393 980,577 980,599 980,685 980,693 980,726 980,766 980,788 980,852 980,859 980,902 980,911 980,979 980,980 980,1044 980,1065 980,1070 980,1192 980,1531 980,1848 980,2023 980,2094 980,2106 980,2178 980,2404 980,3477 980,3799 980,3835 980,4137 980,4149 980,4545 980,6717 980,6870 980,6872 980,7115 980,7780 980,8438 980,8600 980,13678 980,13703 980,13725 980,14111 980,14422 980,14816 980,15282 980,15312 980,16679 980,17574 980,18164 980,18493 980,19191 980,20377 980,20712 980,20844 980,21323 980,21453 980,21627 980,21727 980,21736 980,22425 980,22431 980,22838 980,23033 980,23397 980,24162 980,29116 980,29532 980,30484 980,32492 980,32641 980,35593 980,36665 980,38122 980,38132 980,40332 980,40723 980,40763 980,41338 980,41829 980,41885 980,42533 980,42616 980,42683 980,45059 980,45753 980,45983 980,48165 980,48168 980,48173 980,48175 980,48178 980,48182 980,48183 980,49981 980,50154 980,50272 980,50276 980,50621 980,51955 980,51973 980,55743 980,56150 980,66292 980,68816 980,73492 980,76685 980,76993 980,78959 980,79004 980,83937 980,87216 980,89907 980,94456 980,94995 980,95598 980,103772 980,107348 980,109851 980,111324 980,113573 980,120612 980,122215 980,122968 980,124876 980,127314 980,128318 980,129735 980,129833 980,130231 980,130785 980,130814 980,131133 980,134523 980,135745 980,139489 980,139620 980,140073 980,140365 980,140487 980,140491 980,140695 980,140728 980,143983 980,143984 980,144878 980,146064 980,148358 980,148372 980,148390 980,148405 980,153114 980,158587 980,158699 980,158703 980,158982 980,164088 980,164259 980,164374 980,166627 980,169903 980,172494 980,175934 980,176386 980,177153 980,181752 980,182413 980,183540 980,186625 980,186735 980,186764 980,186771 980,192570 980,194341 980,197534 980,201182 980,207580 980,215874 980,216200 980,216602 980,217480 980,221004 980,221087 980,221130 980,225420 980,229281 980,235937 980,236494 980,238722 980,238733 980,243470 980,243968 980,245393 980,247328 980,247428 980,247766 980,247899 980,248440 980,249204 980,258918 980,258923 980,259094 980,262635 980,262639 980,262645 982,46 982,292 982,631 982,775 982,972 982,973 982,1010 982,1122 982,1284 982,1298 982,5662 982,72764 983,973 985,71 985,387 985,986 985,1021 985,2081 985,2227 985,2512 985,5092 985,8066 985,19464 985,21291 985,37743 985,41309 985,42470 985,46863 985,55167 985,73313 985,87347 985,87355 985,108148 985,115973 985,123941 985,127785 985,140315 985,144969 985,149572 985,153689 985,163921 985,164448 985,185482 985,189813 985,194910 985,206350 985,217880 985,218883 985,219870 985,227029 985,227264 985,233539 985,241675 985,243979 985,254862 985,260750 986,985 987,130 988,929 989,225 991,87 991,192 991,256 991,599 991,685 991,788 991,872 991,911 991,991 991,992 991,1011 991,1014 991,1276 991,1298 991,1688 991,2574 991,4066 992,160 992,202 992,203 992,256 992,264 992,425 992,450 992,509 992,510 992,589 992,668 992,818 992,843 992,868 992,919 992,920 992,973 992,991 992,992 992,1014 992,1058 992,1085 992,1276 992,1289 992,1381 992,1860 992,1891 992,1973 992,2019 992,3182 992,3507 992,4165 992,4354 992,5158 992,5265 992,7388 992,8243 992,14680 992,23669 992,23731 992,26247 992,29078 992,31258 992,31582 992,32566 992,32588 992,37529 992,38153 992,46846 992,48574 992,48982 992,50166 992,50170 992,54632 992,63363 992,63407 992,63444 992,73364 992,85829 992,90258 992,91812 992,101887 992,106815 992,109036 992,112841 992,118817 992,121443 992,124704 992,125101 992,125910 992,128765 992,141073 992,151462 992,157297 992,162941 992,164934 992,165371 992,179750 992,182896 992,186565 992,188521 992,210767 992,218308 992,220442 992,226440 992,233576 992,241051 992,254621 992,254851 992,254856 992,255540 992,255542 992,258050 992,259463 993,994 994,4 994,5 994,26 994,46 994,59 994,60 994,94 994,114 994,118 994,250 994,430 994,885 994,887 994,967 994,994 994,1124 994,1235 994,1334 994,1335 994,1684 994,2674 994,2787 994,2892 994,2893 994,3794 994,3795 994,3796 994,3816 994,3817 994,4114 994,4198 994,4571 994,4662 994,4748 994,5701 994,5803 994,5997 994,6208 994,6209 994,6462 994,6621 994,8092 994,8498 994,9358 994,13662 994,14187 994,14513 994,14720 994,14721 994,15378 994,15730 994,17140 994,18125 994,19889 994,20774 994,21042 994,21944 994,24626 994,24843 994,25540 994,28462 994,33444 994,34769 994,40392 994,41967 994,42743 994,42832 994,43215 994,47540 994,67988 994,88820 994,108056 995,697 996,20 996,178 996,315 996,346 996,415 996,435 996,447 996,538 996,595 996,599 996,670 996,671 996,808 996,859 996,911 996,934 996,996 996,997 996,1068 996,1242 996,1275 996,1294 996,1396 996,1474 996,1644 996,1877 996,1895 996,2040 996,2130 996,2255 996,2352 996,2646 996,2775 996,3154 996,3438 996,4298 996,4386 996,6564 996,6661 996,6663 996,7058 996,7848 996,7940 996,8359 996,8448 996,9337 996,13491 996,13548 996,14428 996,14655 996,15141 996,15531 996,17904 996,19191 996,19817 996,21280 996,23443 996,23444 996,24749 996,26896 996,30775 996,32249 996,33298 996,34150 996,34203 996,34247 996,34541 996,37070 996,37375 996,37395 996,37397 996,37408 996,37412 996,37434 996,37530 996,37613 996,38140 996,38141 996,38293 996,38426 996,41163 996,41224 996,43716 996,44835 996,44878 996,49878 996,50056 996,50064 996,50069 996,50073 996,50078 996,50081 996,50089 996,50093 996,50447 996,50470 996,50475 996,50478 996,50479 996,50480 996,50482 996,50485 996,50486 996,50487 996,50488 996,50489 996,50708 996,53224 996,55273 996,62984 996,63735 996,65757 996,66344 996,80166 996,82027 996,90933 996,95639 996,99725 996,101806 996,105401 996,106377 996,107533 996,109694 996,109885 996,110522 996,112683 996,112928 996,118124 996,120155 996,127946 996,133434 996,138727 996,139600 996,140512 996,144011 996,144433 996,145200 996,145463 996,150639 996,150723 996,150929 996,151040 996,151091 996,155509 996,156226 996,156318 996,157091 996,162117 996,162501 996,168508 996,168932 996,169059 996,173817 996,176759 996,176960 996,177750 996,182210 996,182474 996,182550 996,184882 996,186684 996,187802 996,190492 996,199953 996,199972 996,207690 996,211506 996,216274 996,216708 996,217083 996,217084 996,217085 996,217086 996,217171 996,217289 996,217330 996,217644 996,218506 996,218772 996,222400 996,229237 996,230903 996,234825 996,234827 996,237424 996,242248 996,245509 996,250717 996,251384 996,253319 996,253394 996,254416 996,257021 996,258744 996,262574 997,26 997,59 997,808 997,887 997,996 997,1019 997,1616 997,1949 997,2105 997,3258 997,44725 998,192 998,336 998,493 998,682 999,10 999,104 999,107 999,256 999,441 999,442 999,626 999,715 999,749 999,775 999,784 999,999 999,1001 999,1293 999,1388 999,1808 999,2572 999,5809 999,5876 999,9342 999,9739 999,13538 999,15226 999,15633 999,17575 999,18600 999,19119 999,19870 999,19875 999,19896 999,20769 999,21356 999,27513 999,28960 999,29653 999,32694 999,35521 999,36925 999,39559 999,39618 999,45891 999,58289 999,58921 999,63028 999,69624 999,69653 999,70320 999,73836 999,73872 999,74395 999,76329 999,76776 999,76872 999,79560 999,81452 999,89711 999,106986 999,118447 999,119179 999,128398 999,129516 999,130302 999,136520 999,150762 999,158571 999,160883 999,171249 999,177921 999,178620 999,178621 999,178622 999,179239 999,182345 999,192446 999,195076 999,204734 999,221342 999,226389 999,227975 999,228043 999,228387 999,232595 999,241061 999,243261 1000,1001 1000,3094 1001,10 1001,34 1001,35 1001,41 1001,104 1001,120 1001,134 1001,186 1001,211 1001,233 1001,240 1001,301 1001,314 1001,373 1001,388 1001,389 1001,390 1001,417 1001,431 1001,442 1001,467 1001,495 1001,534 1001,536 1001,573 1001,589 1001,596 1001,599 1001,617 1001,631 1001,632 1001,636 1001,677 1001,685 1001,693 1001,694 1001,715 1001,760 1001,765 1001,775 1001,784 1001,795 1001,818 1001,849 1001,872 1001,907 1001,966 1001,968 1001,973 1001,1001 1001,1011 1001,1029 1001,1085 1001,1104 1001,1119 1001,1133 1001,1160 1001,1177 1001,1181 1001,1192 1001,1262 1001,1282 1001,1284 1001,1285 1001,1293 1001,1298 1001,1326 1001,1392 1001,1410 1001,1489 1001,1522 1001,1545 1001,1715 1001,1796 1001,1844 1001,1853 1001,1942 1001,1988 1001,2193 1001,2235 1001,2400 1001,2512 1001,2614 1001,2747 1001,2833 1001,3093 1001,3094 1001,3135 1001,3328 1001,3367 1001,3455 1001,3507 1001,3774 1001,3791 1001,3804 1001,3866 1001,4109 1001,4163 1001,4265 1001,4387 1001,4565 1001,5129 1001,5186 1001,5231 1001,5725 1001,5828 1001,5961 1001,6017 1001,6474 1001,6569 1001,6837 1001,6856 1001,7534 1001,7766 1001,7844 1001,8107 1001,9025 1001,13274 1001,13328 1001,13433 1001,13718 1001,14193 1001,14554 1001,14572 1001,14820 1001,15109 1001,15503 1001,15608 1001,15931 1001,16192 1001,17040 1001,18661 1001,18694 1001,19471 1001,19525 1001,19941 1001,20607 1001,21051 1001,21245 1001,21395 1001,21488 1001,21742 1001,22233 1001,22296 1001,22440 1001,22562 1001,23710 1001,24851 1001,25233 1001,25272 1001,26341 1001,27041 1001,27903 1001,28191 1001,28442 1001,29038 1001,29288 1001,29760 1001,29870 1001,29898 1001,31294 1001,31785 1001,32497 1001,32516 1001,32613 1001,32890 1001,33591 1001,34346 1001,34515 1001,34881 1001,34963 1001,35233 1001,36969 1001,38822 1001,39618 1001,40524 1001,41824 1001,41862 1001,42810 1001,42951 1001,43394 1001,45710 1001,45827 1001,46128 1001,46284 1001,47786 1001,48531 1001,48716 1001,49247 1001,50561 1001,52206 1001,54615 1001,55080 1001,56715 1001,56724 1001,56984 1001,58449 1001,58921 1001,59928 1001,62334 1001,62511 1001,64526 1001,64570 1001,65635 1001,65797 1001,65953 1001,67591 1001,68345 1001,68946 1001,68963 1001,71770 1001,71864 1001,72639 1001,74576 1001,75295 1001,75883 1001,75912 1001,77697 1001,78668 1001,78805 1001,78973 1001,79431 1001,79528 1001,80172 1001,83940 1001,95382 1001,99937 1001,101671 1001,104592 1001,107758 1001,111082 1001,112315 1001,112475 1001,113616 1001,116543 1001,116590 1001,116599 1001,116600 1001,116741 1001,120132 1001,120152 1001,122575 1001,123176 1001,124424 1001,125079 1001,125406 1001,126764 1001,127158 1001,128978 1001,130168 1001,131374 1001,133399 1001,135285 1001,135286 1001,135287 1001,135288 1001,135289 1001,135290 1001,135309 1001,136784 1001,141919 1001,141985 1001,143348 1001,153306 1001,155576 1001,156443 1001,159430 1001,159432 1001,161618 1001,161782 1001,161930 1001,163890 1001,164365 1001,164396 1001,175000 1001,177927 1001,179071 1001,180954 1001,183316 1001,183392 1001,184500 1001,185102 1001,185151 1001,189881 1001,193101 1001,214197 1001,220460 1001,229225 1001,237548 1001,249064 1001,249301 1001,249306 1001,251511 1001,252099 1001,254511 1001,257924 1001,262757 1001,263782 1002,81 1002,1003 1002,6174 1002,16790 1003,79 1003,81 1003,158 1003,192 1003,406 1003,1107 1003,1515 1003,3051 1003,5357 1003,6771 1003,6850 1003,13381 1003,14913 1003,15206 1003,17116 1003,17117 1003,18590 1003,26950 1003,27065 1004,41 1004,68 1004,431 1004,631 1004,760 1004,805 1004,1119 1004,1285 1004,1955 1004,2995 1004,7194 1005,34 1005,35 1005,222 1005,455 1005,657 1005,1465 1005,33508 1006,1007 1006,3999 1006,36819 1007,134 1007,202 1007,254 1007,314 1007,346 1007,671 1007,1007 1007,1011 1007,1192 1007,1262 1007,1572 1007,2782 1007,3507 1007,5265 1007,20813 1008,328 1009,1010 1009,1011 1010,10 1010,68 1010,106 1010,167 1010,175 1010,186 1010,192 1010,211 1010,240 1010,256 1010,264 1010,287 1010,301 1010,302 1010,314 1010,352 1010,356 1010,372 1010,406 1010,417 1010,425 1010,440 1010,452 1010,457 1010,467 1010,505 1010,510 1010,516 1010,534 1010,563 1010,571 1010,599 1010,615 1010,631 1010,663 1010,664 1010,685 1010,693 1010,766 1010,809 1010,818 1010,838 1010,868 1010,872 1010,877 1010,881 1010,907 1010,911 1010,932 1010,937 1010,968 1010,972 1010,973 1010,982 1010,1001 1010,1009 1010,1010 1010,1011 1010,1012 1010,1013 1010,1014 1010,1085 1010,1117 1010,1118 1010,1122 1010,1210 1010,1241 1010,1262 1010,1271 1010,1284 1010,1293 1010,1297 1010,1298 1010,1307 1010,1355 1010,1360 1010,1370 1010,1417 1010,1436 1010,1518 1010,1522 1010,1531 1010,1545 1010,1715 1010,1732 1010,1749 1010,1757 1010,1782 1010,1796 1010,1798 1010,1837 1010,1849 1010,1853 1010,1955 1010,1965 1010,1973 1010,2007 1010,2063 1010,2083 1010,2173 1010,2191 1010,2193 1010,2252 1010,2307 1010,2373 1010,2557 1010,2595 1010,2728 1010,3172 1010,3392 1010,3495 1010,3687 1010,3734 1010,3761 1010,3804 1010,3866 1010,3893 1010,3937 1010,3992 1010,3993 1010,4066 1010,4213 1010,4240 1010,4286 1010,4308 1010,4381 1010,4446 1010,4482 1010,4514 1010,4696 1010,5376 1010,5382 1010,5536 1010,5625 1010,5654 1010,5923 1010,7087 1010,7534 1010,7969 1010,8180 1010,8187 1010,9374 1010,13513 1010,13699 1010,13732 1010,13734 1010,13764 1010,13771 1010,14449 1010,14497 1010,15061 1010,15409 1010,16151 1010,16638 1010,16869 1010,17078 1010,18377 1010,18570 1010,19426 1010,19798 1010,20396 1010,20668 1010,20722 1010,20728 1010,20803 1010,21127 1010,21349 1010,22423 1010,24771 1010,24924 1010,24962 1010,26034 1010,26409 1010,26786 1010,29378 1010,29842 1010,30389 1010,31003 1010,31746 1010,32655 1010,32697 1010,32704 1010,32723 1010,32784 1010,32975 1010,33799 1010,34073 1010,34543 1010,34721 1010,35065 1010,35142 1010,36662 1010,38300 1010,39558 1010,39618 1010,39708 1010,40480 1010,42789 1010,43408 1010,43875 1010,44182 1010,44713 1010,44937 1010,45853 1010,46699 1010,46830 1010,46995 1010,48225 1010,50542 1010,50633 1010,51884 1010,52067 1010,55231 1010,56365 1010,57071 1010,58284 1010,58505 1010,59726 1010,61411 1010,61511 1010,63081 1010,64182 1010,64685 1010,68152 1010,68914 1010,69978 1010,69994 1010,71267 1010,71697 1010,73216 1010,73220 1010,74505 1010,75195 1010,75883 1010,75912 1010,76150 1010,79379 1010,79563 1010,79942 1010,80659 1010,80985 1010,81233 1010,81803 1010,81937 1010,82582 1010,83321 1010,83336 1010,83544 1010,84667 1010,86234 1010,86439 1010,86440 1010,87452 1010,88593 1010,89703 1010,93065 1010,96685 1010,96690 1010,97515 1010,99885 1010,100275 1010,101578 1010,102040 1010,104112 1010,104648 1010,105157 1010,106767 1010,107109 1010,107113 1010,107616 1010,109430 1010,112266 1010,114638 1010,114682 1010,116275 1010,117749 1010,117963 1010,118028 1010,118033 1010,119993 1010,121162 1010,121205 1010,121471 1010,122194 1010,122203 1010,123041 1010,123851 1010,124545 1010,124610 1010,124668 1010,125035 1010,127158 1010,128174 1010,128287 1010,128733 1010,128807 1010,128870 1010,131531 1010,131652 1010,132620 1010,133434 1010,133888 1010,134672 1010,136077 1010,137058 1010,137108 1010,139958 1010,140021 1010,140163 1010,141960 1010,142750 1010,142892 1010,143927 1010,143928 1010,143929 1010,143930 1010,143931 1010,143932 1010,143933 1010,143934 1010,143935 1010,143936 1010,143937 1010,143938 1010,143939 1010,143940 1010,143941 1010,143942 1010,143952 1010,143953 1010,143954 1010,143955 1010,143956 1010,144033 1010,144034 1010,146073 1010,146641 1010,146675 1010,146917 1010,147118 1010,147351 1010,147872 1010,148387 1010,148967 1010,154004 1010,154385 1010,155818 1010,157061 1010,157415 1010,158335 1010,158976 1010,159171 1010,159436 1010,159510 1010,159692 1010,160409 1010,161637 1010,163898 1010,164470 1010,170620 1010,170676 1010,170874 1010,171641 1010,172522 1010,177463 1010,177946 1010,177971 1010,179154 1010,186652 1010,186790 1010,188709 1010,204791 1010,207076 1010,225395 1010,228293 1010,232159 1010,234766 1010,234910 1010,235971 1010,236038 1010,236039 1010,237320 1010,238981 1010,244104 1010,244180 1010,245211 1010,246550 1010,247138 1010,247820 1010,248536 1010,248577 1010,249055 1010,249906 1010,250660 1010,255483 1010,258573 1010,259457 1010,259743 1010,260412 1010,262455 1010,262841 1011,3 1011,20 1011,30 1011,34 1011,35 1011,37 1011,41 1011,50 1011,56 1011,58 1011,63 1011,66 1011,81 1011,87 1011,99 1011,104 1011,106 1011,120 1011,126 1011,134 1011,135 1011,136 1011,137 1011,138 1011,146 1011,147 1011,149 1011,158 1011,167 1011,195 1011,200 1011,202 1011,203 1011,206 1011,207 1011,209 1011,211 1011,215 1011,227 1011,233 1011,240 1011,248 1011,251 1011,252 1011,254 1011,256 1011,259 1011,261 1011,264 1011,275 1011,278 1011,287 1011,289 1011,290 1011,299 1011,301 1011,313 1011,314 1011,326 1011,327 1011,332 1011,333 1011,336 1011,346 1011,349 1011,364 1011,379 1011,388 1011,392 1011,397 1011,406 1011,417 1011,422 1011,433 1011,439 1011,441 1011,442 1011,444 1011,452 1011,455 1011,462 1011,467 1011,473 1011,477 1011,493 1011,502 1011,503 1011,505 1011,509 1011,510 1011,516 1011,534 1011,535 1011,536 1011,538 1011,557 1011,572 1011,573 1011,575 1011,577 1011,588 1011,589 1011,590 1011,592 1011,595 1011,602 1011,604 1011,615 1011,620 1011,623 1011,626 1011,631 1011,634 1011,644 1011,647 1011,663 1011,671 1011,673 1011,685 1011,694 1011,697 1011,702 1011,703 1011,704 1011,710 1011,714 1011,720 1011,752 1011,760 1011,772 1011,775 1011,779 1011,783 1011,784 1011,794 1011,801 1011,809 1011,811 1011,818 1011,823 1011,838 1011,843 1011,849 1011,850 1011,859 1011,861 1011,868 1011,872 1011,873 1011,874 1011,875 1011,907 1011,911 1011,918 1011,919 1011,920 1011,932 1011,934 1011,949 1011,968 1011,972 1011,973 1011,1001 1011,1007 1011,1010 1011,1011 1011,1019 1011,1033 1011,1082 1011,1085 1011,1089 1011,1117 1011,1122 1011,1130 1011,1132 1011,1133 1011,1140 1011,1147 1011,1149 1011,1151 1011,1172 1011,1182 1011,1210 1011,1212 1011,1220 1011,1222 1011,1231 1011,1240 1011,1241 1011,1262 1011,1265 1011,1266 1011,1267 1011,1274 1011,1282 1011,1284 1011,1293 1011,1294 1011,1298 1011,1300 1011,1309 1011,1326 1011,1345 1011,1363 1011,1368 1011,1370 1011,1381 1011,1402 1011,1411 1011,1417 1011,1425 1011,1436 1011,1453 1011,1454 1011,1458 1011,1465 1011,1467 1011,1474 1011,1479 1011,1509 1011,1511 1011,1515 1011,1518 1011,1522 1011,1531 1011,1544 1011,1551 1011,1556 1011,1564 1011,1580 1011,1590 1011,1608 1011,1644 1011,1655 1011,1688 1011,1715 1011,1722 1011,1724 1011,1732 1011,1749 1011,1782 1011,1785 1011,1801 1011,1805 1011,1807 1011,1818 1011,1836 1011,1837 1011,1844 1011,1848 1011,1860 1011,1882 1011,1893 1011,1939 1011,1962 1011,1968 1011,1985 1011,1992 1011,2006 1011,2037 1011,2083 1011,2105 1011,2191 1011,2205 1011,2210 1011,2228 1011,2244 1011,2253 1011,2286 1011,2296 1011,2310 1011,2312 1011,2334 1011,2379 1011,2421 1011,2452 1011,2512 1011,2557 1011,2590 1011,2605 1011,2620 1011,2775 1011,2784 1011,2979 1011,3069 1011,3094 1011,3115 1011,3182 1011,3258 1011,3367 1011,3392 1011,3422 1011,3474 1011,3538 1011,3623 1011,3820 1011,3999 1011,4234 1011,4237 1011,4276 1011,4355 1011,4771 1011,5213 1011,5326 1011,5385 1011,5388 1011,5405 1011,5662 1011,5718 1011,6068 1011,6119 1011,6689 1011,6955 1011,7968 1011,8132 1011,8276 1011,13207 1011,13361 1011,13980 1011,15397 1011,16503 1011,16659 1011,18732 1011,19010 1011,20736 1011,21442 1011,24838 1011,26414 1011,29714 1011,32630 1011,32731 1011,32819 1011,33298 1011,33424 1011,33622 1011,35397 1011,41051 1011,41230 1011,44725 1011,47010 1011,47013 1011,47045 1011,49341 1011,57354 1011,60576 1011,75196 1011,75912 1011,76704 1011,81233 1011,92476 1011,115474 1011,118950 1011,156379 1011,162599 1011,173625 1011,245910 1011,254264 1012,41 1012,42 1012,167 1012,299 1012,356 1012,673 1012,715 1012,1010 1012,1012 1012,1013 1012,1177 1012,1241 1012,1435 1012,1849 1012,1867 1012,1899 1012,2208 1012,2222 1012,2480 1012,2557 1012,3582 1012,4240 1012,4258 1012,6524 1012,6711 1012,7757 1012,8193 1012,8864 1012,9025 1012,13931 1012,15277 1012,15424 1012,28996 1012,29656 1012,30505 1012,31299 1012,32757 1012,32784 1012,32836 1012,35204 1012,35545 1012,40456 1012,42453 1012,56629 1012,58145 1012,59974 1012,62886 1012,64594 1012,68625 1012,70395 1012,78671 1012,78835 1012,86791 1012,91791 1012,96685 1012,105525 1012,105721 1012,105741 1012,105744 1012,106382 1012,107172 1012,116596 1012,133888 1012,135039 1012,140785 1012,143044 1012,143046 1012,163359 1012,164919 1012,169108 1012,171036 1012,183930 1012,183958 1012,184796 1012,185393 1012,186693 1012,194491 1012,203029 1012,216399 1012,217836 1012,233579 1012,234993 1012,241007 1012,241058 1012,254893 1012,259506 1012,260993 1012,263993 1013,86 1013,167 1013,299 1013,301 1013,818 1013,972 1013,1010 1013,1012 1013,1241 1013,1479 1013,1522 1013,1782 1013,1849 1013,2557 1013,32784 1013,75912 1014,20 1014,34 1014,35 1014,37 1014,68 1014,87 1014,97 1014,111 1014,126 1014,140 1014,158 1014,167 1014,192 1014,195 1014,202 1014,203 1014,207 1014,209 1014,211 1014,217 1014,227 1014,240 1014,248 1014,252 1014,256 1014,259 1014,261 1014,264 1014,278 1014,292 1014,299 1014,301 1014,312 1014,314 1014,333 1014,336 1014,349 1014,356 1014,366 1014,388 1014,390 1014,392 1014,393 1014,406 1014,433 1014,435 1014,439 1014,441 1014,442 1014,452 1014,455 1014,457 1014,479 1014,497 1014,500 1014,505 1014,510 1014,516 1014,534 1014,536 1014,572 1014,577 1014,586 1014,588 1014,589 1014,590 1014,604 1014,615 1014,622 1014,631 1014,663 1014,668 1014,673 1014,676 1014,677 1014,697 1014,713 1014,764 1014,779 1014,784 1014,794 1014,801 1014,808 1014,809 1014,818 1014,838 1014,843 1014,849 1014,900 1014,903 1014,911 1014,918 1014,920 1014,972 1014,973 1014,991 1014,992 1014,1010 1014,1011 1014,1014 1014,1017 1014,1021 1014,1048 1014,1072 1014,1085 1014,1089 1014,1109 1014,1118 1014,1127 1014,1130 1014,1133 1014,1147 1014,1151 1014,1167 1014,1172 1014,1179 1014,1181 1014,1191 1014,1204 1014,1210 1014,1240 1014,1243 1014,1267 1014,1284 1014,1285 1014,1293 1014,1309 1014,1326 1014,1345 1014,1368 1014,1370 1014,1381 1014,1402 1014,1411 1014,1417 1014,1419 1014,1434 1014,1436 1014,1445 1014,1454 1014,1459 1014,1462 1014,1464 1014,1466 1014,1515 1014,1518 1014,1522 1014,1531 1014,1544 1014,1566 1014,1572 1014,1603 1014,1623 1014,1634 1014,1655 1014,1659 1014,1663 1014,1688 1014,1722 1014,1724 1014,1782 1014,1796 1014,1837 1014,1844 1014,1849 1014,1891 1014,1893 1014,1916 1014,1992 1014,2209 1014,2253 1014,2286 1014,2373 1014,2512 1014,2556 1014,2557 1014,2605 1014,2903 1014,2979 1014,2991 1014,3182 1014,3260 1014,3318 1014,3392 1014,3507 1014,3538 1014,3609 1014,3804 1014,3857 1014,4165 1014,4276 1014,4315 1014,4532 1014,4769 1014,4771 1014,5129 1014,5161 1014,5351 1014,5467 1014,6119 1014,6427 1014,6452 1014,6726 1014,6814 1014,6837 1014,6861 1014,6891 1014,6955 1014,6970 1014,7024 1014,7076 1014,7718 1014,7862 1014,8261 1014,8537 1014,9579 1014,13207 1014,13661 1014,13771 1014,14354 1014,14674 1014,17151 1014,18013 1014,18298 1014,18434 1014,19413 1014,19592 1014,19798 1014,20788 1014,22296 1014,24656 1014,24934 1014,25662 1014,26326 1014,26450 1014,26632 1014,26849 1014,28203 1014,29595 1014,30344 1014,30899 1014,31781 1014,32819 1014,38888 1014,39618 1014,39621 1014,41230 1014,43330 1014,46775 1014,49026 1014,50430 1014,51218 1014,51994 1014,52016 1014,52021 1014,52524 1014,53158 1014,53478 1014,54131 1014,55479 1014,56612 1014,59083 1014,61089 1014,75912 1014,76086 1014,91678 1014,106815 1014,112410 1014,112807 1014,114518 1014,115222 1014,115474 1014,118336 1014,127726 1014,129908 1014,130341 1014,131821 1014,144002 1014,145513 1014,146364 1014,146468 1014,148678 1014,155977 1014,161488 1014,163332 1014,164375 1014,170632 1014,171232 1014,172493 1014,172531 1014,175917 1014,175933 1014,176011 1014,177835 1014,181942 1014,181956 1014,189544 1014,211918 1014,215276 1014,216170 1014,221118 1014,224796 1014,240867 1014,240869 1014,241658 1014,243269 1014,247739 1014,253189 1014,255703 1014,263190 1015,107 1015,483 1016,200 1016,227 1016,254 1016,267 1016,298 1016,502 1016,557 1016,588 1016,590 1016,612 1016,636 1016,704 1016,715 1016,772 1016,805 1016,932 1016,1016 1016,1119 1016,1212 1016,1282 1016,1285 1016,1402 1016,1505 1016,1623 1016,1739 1016,1888 1016,2205 1016,2206 1016,2210 1016,3001 1016,3085 1016,4054 1016,4237 1016,5011 1016,6656 1016,6908 1016,7619 1016,8275 1016,11173 1016,12747 1016,15746 1016,15768 1016,18000 1016,18965 1016,21495 1016,25652 1016,28191 1016,29110 1016,33424 1016,34778 1016,34951 1016,37741 1016,42792 1016,43332 1016,43778 1016,45516 1016,46874 1016,46883 1016,46957 1016,48135 1016,48146 1016,48760 1016,48764 1016,48794 1016,49286 1016,52124 1016,52623 1016,53060 1016,55163 1016,58472 1016,59043 1016,61546 1016,62982 1016,73209 1016,83899 1016,87983 1016,97406 1016,98491 1016,100943 1016,100944 1016,100973 1016,100985 1016,102170 1016,102717 1016,106438 1016,106449 1016,134284 1016,134984 1016,140919 1016,152958 1016,158082 1016,158084 1016,160065 1016,160450 1016,176373 1016,176883 1016,178762 1016,180954 1016,182162 1016,183392 1016,207051 1016,215414 1016,220939 1016,234870 1016,244763 1016,244766 1016,245910 1016,256802 1016,261957 1016,264491 1017,344 1017,838 1018,772 1018,15807 1019,54 1019,182 1019,222 1019,240 1019,278 1019,283 1019,313 1019,327 1019,397 1019,455 1019,466 1019,467 1019,536 1019,657 1019,677 1019,814 1019,951 1019,997 1019,1011 1019,1014 1019,1019 1019,1020 1019,1140 1019,1313 1019,1433 1019,1467 1019,1525 1019,1539 1019,1678 1019,1916 1019,2173 1019,2302 1019,2322 1019,2348 1019,2421 1019,2424 1019,2517 1019,2784 1019,4007 1019,4377 1019,5228 1019,5569 1019,5646 1019,5657 1019,5670 1019,5702 1019,5758 1019,6032 1019,6754 1019,7087 1019,7145 1019,7344 1019,7698 1019,7768 1019,7880 1019,8558 1019,8770 1019,13136 1019,13328 1019,13624 1019,14358 1019,14499 1019,14922 1019,15548 1019,16190 1019,16191 1019,16915 1019,17837 1019,18165 1019,18357 1019,18422 1019,18627 1019,18650 1019,18962 1019,19211 1019,19546 1019,20603 1019,20747 1019,20822 1019,21202 1019,21207 1019,21233 1019,21405 1019,21561 1019,21677 1019,22099 1019,22218 1019,22254 1019,23147 1019,23695 1019,24558 1019,24684 1019,25068 1019,25670 1019,28147 1019,28169 1019,28305 1019,29177 1019,29595 1019,30502 1019,30506 1019,30700 1019,31397 1019,31474 1019,31729 1019,31801 1019,31903 1019,32533 1019,32589 1019,32689 1019,33508 1019,37852 1019,39537 1019,39618 1019,40500 1019,40553 1019,40829 1019,41333 1019,42035 1019,43383 1019,44135 1019,44949 1019,46431 1019,48283 1019,48515 1019,48951 1019,49154 1019,49337 1019,49642 1019,50046 1019,50816 1019,51652 1019,53927 1019,54484 1019,54571 1019,54581 1019,56584 1019,58771 1019,59058 1019,60442 1019,61116 1019,61991 1019,63068 1019,63081 1019,63458 1019,63901 1019,65767 1019,65965 1019,66703 1019,66885 1019,67391 1019,67962 1019,68068 1019,68227 1019,68245 1019,70106 1019,70295 1019,70395 1019,74220 1019,75019 1019,75094 1019,75376 1019,77098 1019,77812 1019,79535 1019,79936 1019,79982 1019,82313 1019,82715 1019,82718 1019,82779 1019,82922 1019,83630 1019,83745 1019,83927 1019,90132 1019,90403 1019,91340 1019,91906 1019,94221 1019,96718 1019,96913 1019,97934 1019,99107 1019,99111 1019,104228 1019,112853 1019,112908 1019,112916 1019,112964 1019,113094 1019,113277 1019,113496 1019,113836 1019,115253 1019,116128 1019,117076 1019,119854 1019,121623 1019,123999 1019,125907 1019,127158 1019,131216 1019,131224 1019,131497 1019,136483 1019,139439 1019,140055 1019,140693 1019,143500 1019,143724 1019,145694 1019,146114 1019,148101 1019,153906 1019,157721 1019,158788 1019,159386 1019,163598 1019,164389 1019,169947 1019,170005 1019,171255 1019,171799 1019,173361 1019,176042 1019,182538 1019,183760 1019,184007 1019,186648 1019,187312 1019,190451 1019,198802 1019,206355 1019,211817 1019,215722 1019,216573 1019,216852 1019,232044 1019,232245 1019,236790 1019,239290 1019,255884 1019,262521 1021,313 1021,352 1021,397 1021,452 1021,481 1021,668 1021,684 1021,685 1021,838 1021,842 1021,849 1021,911 1021,985 1021,1021 1021,1022 1021,1085 1021,1096 1021,1118 1021,1130 1021,1135 1021,1345 1021,1394 1021,1434 1021,1504 1021,1559 1021,1696 1021,1844 1021,1848 1021,1928 1021,2209 1021,2373 1021,3465 1021,3507 1021,3537 1021,3555 1021,4013 1021,4701 1021,4998 1021,5213 1021,5356 1021,6405 1021,9739 1021,10559 1021,13282 1021,13383 1021,14016 1021,14489 1021,14510 1021,14596 1021,14620 1021,14628 1021,18091 1021,18097 1021,18106 1021,18198 1021,18512 1021,21167 1021,21222 1021,23357 1021,25360 1021,25431 1021,25538 1021,26090 1021,26928 1021,28825 1021,29433 1021,30998 1021,32227 1021,33287 1021,33328 1021,34119 1021,35382 1021,37474 1021,37608 1021,40511 1021,41843 1021,42543 1021,45489 1021,48505 1021,48876 1021,48912 1021,53983 1021,54390 1021,58238 1021,58247 1021,58424 1021,59753 1021,59886 1021,60160 1021,62858 1021,66059 1021,66508 1021,66520 1021,66563 1021,67082 1021,67950 1021,69884 1021,75190 1021,79269 1021,86677 1021,90082 1021,90619 1021,92898 1021,94121 1021,94238 1021,100209 1021,101493 1021,101652 1021,102413 1021,102453 1021,102537 1021,103279 1021,103813 1021,106514 1021,107421 1021,109403 1021,113110 1021,115212 1021,118861 1021,119455 1021,122254 1021,122557 1021,129233 1021,135962 1021,140316 1021,140646 1021,142472 1021,146012 1021,147048 1021,148844 1021,153118 1021,153537 1021,154976 1021,157291 1021,158576 1021,164378 1021,165246 1021,167194 1021,168766 1021,171544 1021,173369 1021,173659 1021,174330 1021,174357 1021,175305 1021,176877 1021,177382 1021,180300 1021,182530 1021,183720 1021,183740 1021,184780 1021,191903 1021,195158 1021,204093 1021,213050 1021,214814 1021,216236 1021,217603 1021,221655 1021,228934 1021,229070 1021,230241 1021,230912 1021,234675 1021,241635 1021,243170 1021,245837 1021,248399 1021,251278 1021,254810 1021,256250 1021,259564 1021,259638 1021,259640 1021,259642 1021,264328 1022,911 1023,22 1023,50 1023,163 1023,209 1023,302 1023,489 1023,579 1023,687 1023,809 1023,811 1023,818 1023,838 1023,861 1023,893 1023,1188 1023,1191 1023,1210 1023,1556 1023,1659 1023,1893 1023,2017 1023,2116 1023,2312 1023,3177 1023,3653 1023,3769 1023,4294 1023,4453 1023,127158 1023,258973 1024,509 1025,292 1025,338 1025,462 1025,509 1025,1238 1025,1453 1025,1572 1025,1722 1025,150022 1026,390 1026,567 1026,589 1026,685 1026,973 1026,1436 1026,1559 1026,1801 1026,3392 1026,5591 1026,20535 1027,106 1027,333 1027,505 1027,586 1027,812 1027,1027 1027,1293 1027,1441 1027,1848 1027,1849 1027,1985 1027,2782 1027,5630 1027,6667 1027,7087 1027,7731 1027,13931 1027,14066 1027,14100 1027,18456 1027,30544 1027,31046 1027,61784 1027,63423 1027,72548 1027,77770 1027,87540 1027,99538 1027,99542 1027,100237 1027,102423 1027,104268 1027,109922 1027,119418 1027,126794 1027,133672 1027,152118 1027,155471 1027,174800 1027,184740 1027,191822 1027,191834 1027,191961 1027,207240 1027,223960 1027,232959 1027,234887 1027,236573 1028,859 1029,332 1029,1001 1029,1955 1030,707 1031,1 1031,94 1031,184 1031,206 1031,2787 1032,919 1033,1 1033,20 1033,147 1033,178 1033,195 1033,267 1033,314 1033,315 1033,327 1033,346 1033,434 1033,435 1033,439 1033,440 1033,447 1033,515 1033,538 1033,599 1033,621 1033,622 1033,663 1033,671 1033,676 1033,693 1033,766 1033,779 1033,794 1033,903 1033,934 1033,996 1033,1011 1033,1033 1033,1034 1033,1045 1033,1067 1033,1068 1033,1103 1033,1179 1033,1294 1033,1298 1033,1381 1033,1474 1033,1515 1033,1590 1033,1644 1033,1651 1033,1789 1033,1791 1033,1877 1033,2023 1033,2085 1033,2102 1033,2348 1033,2352 1033,2400 1033,2710 1033,3247 1033,3403 1033,3552 1033,3924 1033,4137 1033,4188 1033,4298 1033,4354 1033,4368 1033,4426 1033,4588 1033,4646 1033,4666 1033,5108 1033,5678 1033,6638 1033,6654 1033,6661 1033,6801 1033,6966 1033,6982 1033,7032 1033,7040 1033,7321 1033,8132 1033,8374 1033,14111 1033,14186 1033,14225 1033,14233 1033,14378 1033,14428 1033,15141 1033,15355 1033,15553 1033,15737 1033,16605 1033,17045 1033,17302 1033,17421 1033,17723 1033,17904 1033,18416 1033,18733 1033,19182 1033,19191 1033,19506 1033,19835 1033,20341 1033,20598 1033,20757 1033,21081 1033,21635 1033,22385 1033,23071 1033,23337 1033,23349 1033,23467 1033,25038 1033,28354 1033,28794 1033,29116 1033,29649 1033,31300 1033,32468 1033,32721 1033,32801 1033,35661 1033,36037 1033,36634 1033,36713 1033,36737 1033,36915 1033,38158 1033,38871 1033,40713 1033,40924 1033,41284 1033,42815 1033,43196 1033,44791 1033,44917 1033,45719 1033,45890 1033,46838 1033,46844 1033,47113 1033,47137 1033,47412 1033,48290 1033,48343 1033,48346 1033,48347 1033,48351 1033,48356 1033,48359 1033,48363 1033,49470 1033,49548 1033,50034 1033,54808 1033,55564 1033,56637 1033,58139 1033,59663 1033,62195 1033,62416 1033,63255 1033,68887 1033,69710 1033,70667 1033,70900 1033,73361 1033,74760 1033,78887 1033,78922 1033,78940 1033,79368 1033,79516 1033,80394 1033,80662 1033,81787 1033,83947 1033,84563 1033,84634 1033,85744 1033,86574 1033,87813 1033,88082 1033,88615 1033,90191 1033,92871 1033,92959 1033,93573 1033,97511 1033,98194 1033,99694 1033,100060 1033,102572 1033,102612 1033,103251 1033,103772 1033,104161 1033,106396 1033,106404 1033,107210 1033,109885 1033,110133 1033,111059 1033,114220 1033,116095 1033,116791 1033,117678 1033,117764 1033,117781 1033,117974 1033,118089 1033,118101 1033,120155 1033,122165 1033,122225 1033,122657 1033,123833 1033,125020 1033,126519 1033,126696 1033,127419 1033,127855 1033,128123 1033,128239 1033,129737 1033,130320 1033,130638 1033,131295 1033,135310 1033,141137 1033,145066 1033,146674 1033,149137 1033,152596 1033,158970 1033,164262 1033,164981 1033,166432 1033,168784 1033,168886 1033,169386 1033,169931 1033,170669 1033,174461 1033,175321 1033,175343 1033,176336 1033,176456 1033,176457 1033,176458 1033,178909 1033,179781 1033,179793 1033,182431 1033,182485 1033,186107 1033,187106 1033,189128 1033,189754 1033,189898 1033,189921 1033,191164 1033,191190 1033,191201 1033,191797 1033,191937 1033,191950 1033,192077 1033,197472 1033,205749 1033,213045 1033,214094 1033,216770 1033,219969 1033,224499 1033,228888 1033,236593 1033,236700 1033,236814 1033,238202 1033,239613 1033,240108 1033,243165 1033,243940 1033,248483 1033,250550 1033,250575 1033,250689 1033,253099 1033,254200 1033,255505 1033,258069 1033,261043 1033,262699 1034,1033 1035,640 1036,640 1037,1293 1038,1039 1038,29187 1038,100147 1038,111964 1040,666 1041,795 1042,1043 1043,3 1043,106 1043,292 1043,312 1043,499 1043,509 1043,510 1043,575 1043,623 1043,723 1043,745 1043,843 1043,852 1043,872 1043,875 1043,1042 1043,1043 1043,1345 1043,1424 1043,1765 1043,1805 1043,1896 1043,3003 1043,3367 1043,3546 1043,4722 1043,4760 1043,5043 1043,5846 1043,6407 1043,8391 1043,8428 1043,14025 1043,20591 1043,22806 1043,23567 1043,31010 1043,31080 1043,34747 1043,46947 1043,48505 1043,68856 1043,71184 1043,78932 1043,82706 1043,94963 1043,96228 1043,107203 1043,110777 1043,136043 1043,154862 1043,155357 1043,214013 1043,253347 1044,393 1044,980 1045,30 1045,104 1045,215 1045,292 1045,309 1045,310 1045,328 1045,338 1045,372 1045,441 1045,442 1045,444 1045,510 1045,534 1045,599 1045,609 1045,622 1045,626 1045,697 1045,779 1045,783 1045,862 1045,873 1045,943 1045,968 1045,1001 1045,1033 1045,1046 1045,1085 1045,1179 1045,1238 1045,1284 1045,1285 1045,1293 1045,1305 1045,1411 1045,1522 1045,1688 1045,2083 1045,2209 1045,2443 1045,3474 1045,4771 1045,5662 1045,8180 1045,32751 1045,127158 1045,213953 1046,299 1046,441 1046,444 1046,609 1046,966 1046,1045 1046,1046 1046,1085 1046,1572 1046,1688 1046,1944 1046,4308 1046,5388 1046,25022 1046,85829 1047,160 1048,366 1048,500 1048,760 1048,1149 1049,163 1049,344 1049,626 1049,733 1049,752 1049,1579 1049,3695 1050,945 1050,5714 1051,1052 1052,58 1052,87 1052,111 1052,135 1052,222 1052,292 1052,294 1052,328 1052,420 1052,431 1052,557 1052,596 1052,733 1052,784 1052,805 1052,808 1052,1052 1052,1298 1052,1368 1052,1623 1052,1707 1052,2373 1052,2416 1052,2417 1052,4039 1052,4066 1053,920 1054,805 1055,671 1057,1058 1058,160 1058,225 1058,287 1058,292 1058,420 1058,462 1058,491 1058,535 1058,745 1058,818 1058,849 1058,852 1058,872 1058,911 1058,992 1058,1058 1058,1087 1058,1130 1058,1572 1058,1653 1058,1688 1058,1707 1058,2253 1058,2310 1058,2436 1058,4039 1058,127158 1059,775 1060,626 1060,775 1061,372 1061,1285 1061,7395 1061,14597 1061,175903 1061,187195 1061,189149 1062,48 1062,140 1062,264 1062,338 1062,710 1062,1052 1062,1127 1062,1147 1062,1289 1062,1893 1063,119 1063,366 1064,326 1064,579 1064,589 1065,980 1065,1332 1065,1955 1066,536 1066,697 1067,1068 1068,20 1068,272 1068,315 1068,346 1068,439 1068,447 1068,726 1068,996 1068,1033 1068,1067 1068,1068 1068,1294 1068,1474 1068,1612 1068,1789 1068,1990 1068,2030 1068,2085 1068,2094 1068,2253 1068,2255 1068,2358 1068,3831 1068,3903 1068,3990 1068,5212 1068,6607 1068,6966 1068,7040 1068,7532 1068,13374 1068,13563 1068,13636 1068,15148 1068,15563 1068,18507 1068,22333 1068,23544 1068,23563 1068,24906 1068,27511 1068,29116 1068,29760 1068,31195 1068,32538 1068,45073 1068,45723 1068,46929 1068,50034 1068,63425 1068,73404 1068,85913 1068,90933 1068,96789 1068,97647 1068,120052 1068,120155 1068,121657 1068,122562 1068,128831 1068,129891 1068,134081 1068,143333 1068,145051 1068,145085 1068,145088 1068,157331 1068,157858 1068,176949 1068,189128 1068,190492 1068,213950 1068,217420 1068,245025 1068,247224 1068,247358 1068,247511 1068,250586 1069,217 1069,222 1069,344 1069,455 1069,536 1069,657 1069,660 1069,694 1069,949 1069,1072 1069,1201 1069,1881 1069,2319 1069,2779 1069,2784 1069,5343 1069,6506 1069,212914 1070,10 1070,259 1070,393 1070,439 1070,446 1070,577 1070,599 1070,685 1070,726 1070,788 1070,794 1070,849 1070,859 1070,902 1070,911 1070,980 1070,1070 1070,1105 1070,1130 1070,1388 1070,1531 1070,1844 1070,3724 1070,4190 1070,4455 1070,4545 1070,7921 1070,8162 1070,8250 1070,9503 1070,13466 1070,13610 1070,15651 1070,15654 1070,18493 1070,18658 1070,19278 1070,22168 1070,25384 1070,36969 1070,42611 1070,45026 1070,45416 1070,45983 1070,46137 1070,50543 1070,54493 1070,56150 1070,57143 1070,60575 1070,63088 1070,70277 1070,70859 1070,74435 1070,74647 1070,75755 1070,80555 1070,81966 1070,87191 1070,89558 1070,89698 1070,89708 1070,94287 1070,97290 1070,102659 1070,104408 1070,104565 1070,118272 1070,120920 1070,122393 1070,123811 1070,123854 1070,128144 1070,128222 1070,128935 1070,139010 1070,139560 1070,140031 1070,140687 1070,142385 1070,144878 1070,146464 1070,149221 1070,152865 1070,156260 1070,157681 1070,159801 1070,173323 1070,173591 1070,174388 1070,175333 1070,176324 1070,177394 1070,177727 1070,177799 1070,179176 1070,188558 1070,193578 1070,193942 1070,194989 1070,212488 1070,216300 1070,216724 1070,217442 1070,218759 1070,222483 1070,222582 1070,226152 1070,227748 1070,231024 1070,232780 1070,238790 1070,247770 1070,249776 1070,254191 1071,1072 1071,3538 1072,8 1072,388 1072,389 1072,399 1072,406 1072,455 1072,536 1072,634 1072,1208 1072,1467 1072,1853 1072,1916 1072,2133 1072,2963 1072,4374 1072,5451 1072,7092 1072,13549 1072,15562 1072,17534 1072,18395 1072,19443 1072,20724 1072,20771 1072,22158 1072,23431 1072,28285 1072,28946 1072,30502 1072,34860 1072,34904 1072,35831 1072,37521 1072,37572 1072,37589 1072,37900 1072,42592 1072,49336 1072,55202 1072,56679 1072,59325 1072,62459 1072,66000 1072,67123 1072,67485 1072,68796 1072,68970 1072,78275 1072,85927 1072,87692 1072,89827 1072,97908 1072,101580 1072,104897 1072,106930 1072,117937 1072,117939 1072,117977 1072,118042 1072,120756 1072,128503 1072,128943 1072,128950 1072,129770 1072,131335 1072,139542 1072,149909 1072,149910 1072,151373 1072,169872 1072,169957 1072,172376 1072,173390 1072,203900 1072,246156 1073,510 1073,795 1073,3804 1074,83 1074,477 1074,2168 1074,2553 1074,13137 1074,23287 1075,439 1076,347 1077,1078 1077,4223 1078,111 1078,2105 1078,2253 1078,4039 1078,4223 1079,671 1080,41 1080,261 1080,596 1080,784 1080,805 1080,1119 1080,1285 1080,1368 1080,1429 1080,1462 1080,1635 1080,1888 1080,8537 1080,9015 1081,372 1081,390 1081,1082 1081,1522 1082,240 1082,289 1082,290 1082,372 1082,390 1082,715 1082,784 1082,1061 1082,1081 1082,1082 1082,1133 1082,1203 1082,1309 1082,1359 1082,1807 1082,1888 1082,1955 1082,2315 1082,2512 1082,2657 1082,2775 1082,3623 1082,3931 1082,4115 1082,4182 1082,5186 1082,5804 1082,5825 1082,6004 1082,7087 1082,8592 1082,9112 1082,12871 1082,13506 1082,13698 1082,14597 1082,16308 1082,16466 1082,16497 1082,16509 1082,17152 1082,17878 1082,17930 1082,20624 1082,20791 1082,24478 1082,25622 1082,26781 1082,26869 1082,28191 1082,30288 1082,31036 1082,31677 1082,32474 1082,33901 1082,34340 1082,34345 1082,34347 1082,34351 1082,34403 1082,34423 1082,34426 1082,34774 1082,35945 1082,40122 1082,40330 1082,44123 1082,45407 1082,55169 1082,56261 1082,56262 1082,56263 1082,56265 1082,56270 1082,56276 1082,56279 1082,56281 1082,56282 1082,56283 1082,56284 1082,56318 1082,56537 1082,56670 1082,56746 1082,56947 1082,56986 1082,56990 1082,58503 1082,59951 1082,60094 1082,64315 1082,76939 1082,79404 1082,79561 1082,79566 1082,80151 1082,82051 1082,82130 1082,82588 1082,83987 1082,84143 1082,93091 1082,93206 1082,94134 1082,99195 1082,104318 1082,105765 1082,110661 1082,110664 1082,110669 1082,110671 1082,110674 1082,110675 1082,110676 1082,110677 1082,111037 1082,111044 1082,111045 1082,111046 1082,111047 1082,111048 1082,111049 1082,111050 1082,111051 1082,123007 1082,125380 1082,126862 1082,126868 1082,126869 1082,126870 1082,126871 1082,126875 1082,126877 1082,126882 1082,126898 1082,126900 1082,137134 1082,140657 1082,155467 1082,158978 1082,159759 1082,160450 1082,166394 1082,170691 1082,174341 1082,175903 1082,183366 1082,190957 1082,195149 1082,195482 1082,205730 1082,214222 1082,224588 1082,224755 1082,224764 1082,225298 1082,225302 1082,226242 1082,226456 1082,229310 1082,230008 1082,232062 1082,232063 1082,232065 1082,232066 1082,232067 1082,232068 1082,232070 1082,232071 1082,232072 1082,232073 1082,232075 1082,232076 1082,233565 1082,236000 1082,243898 1082,243948 1082,244778 1082,249750 1082,254914 1082,255608 1082,263829 1083,459 1083,750 1083,783 1083,1117 1083,1313 1083,1319 1084,808 1084,48505 1085,10 1085,34 1085,35 1085,41 1085,68 1085,94 1085,104 1085,111 1085,167 1085,175 1085,186 1085,202 1085,207 1085,217 1085,233 1085,240 1085,289 1085,290 1085,294 1085,298 1085,299 1085,301 1085,314 1085,327 1085,328 1085,332 1085,356 1085,372 1085,389 1085,390 1085,392 1085,397 1085,406 1085,417 1085,425 1085,431 1085,439 1085,440 1085,446 1085,457 1085,467 1085,510 1085,516 1085,534 1085,535 1085,536 1085,589 1085,590 1085,592 1085,596 1085,599 1085,626 1085,631 1085,677 1085,693 1085,715 1085,765 1085,775 1085,818 1085,838 1085,849 1085,852 1085,862 1085,872 1085,911 1085,949 1085,953 1085,973 1085,992 1085,1001 1085,1010 1085,1011 1085,1046 1085,1085 1085,1118 1085,1119 1085,1133 1085,1172 1085,1192 1085,1195 1085,1213 1085,1235 1085,1284 1085,1326 1085,1332 1085,1346 1085,1417 1085,1462 1085,1505 1085,1518 1085,1522 1085,1531 1085,1545 1085,1561 1085,1572 1085,1580 1085,1659 1085,1796 1085,1844 1085,1853 1085,2173 1085,2184 1085,2193 1085,2204 1085,2296 1085,2572 1085,2747 1085,2874 1085,2995 1085,3028 1085,3093 1085,3094 1085,3507 1085,3565 1085,3623 1085,3832 1085,3833 1085,3841 1085,3866 1085,3937 1085,3944 1085,4022 1085,4213 1085,4222 1085,4286 1085,4308 1085,4315 1085,4355 1085,4520 1085,4540 1085,5186 1085,5278 1085,5472 1085,5494 1085,5543 1085,5578 1085,5654 1085,5717 1085,5902 1085,5961 1085,6004 1085,6038 1085,6068 1085,6139 1085,6556 1085,6695 1085,7017 1085,7161 1085,7194 1085,7268 1085,7386 1085,7534 1085,7819 1085,7880 1085,8180 1085,8276 1085,8451 1085,8537 1085,8867 1085,9342 1085,9343 1085,13207 1085,13433 1085,13524 1085,13637 1085,13657 1085,14011 1085,14411 1085,14565 1085,14597 1085,14603 1085,15100 1085,15221 1085,15259 1085,15277 1085,15386 1085,15413 1085,15446 1085,15477 1085,15658 1085,15667 1085,15967 1085,16191 1085,16192 1085,16355 1085,16428 1085,16551 1085,16955 1085,17116 1085,17212 1085,17241 1085,18433 1085,18627 1085,18726 1085,19525 1085,19560 1085,19592 1085,19594 1085,19798 1085,19859 1085,20190 1085,20375 1085,20487 1085,20560 1085,20803 1085,20816 1085,20880 1085,21414 1085,21620 1085,21706 1085,21721 1085,21742 1085,22291 1085,23206 1085,23556 1085,24803 1085,25766 1085,27827 1085,28182 1085,28317 1085,28832 1085,28886 1085,29595 1085,29619 1085,29633 1085,29817 1085,30816 1085,31110 1085,31302 1085,31746 1085,31756 1085,31802 1085,32604 1085,32692 1085,33611 1085,33633 1085,33695 1085,33702 1085,33938 1085,34062 1085,34271 1085,34360 1085,34830 1085,34921 1085,35497 1085,36015 1085,36635 1085,37991 1085,38356 1085,38822 1085,38932 1085,39142 1085,39307 1085,39534 1085,39746 1085,40267 1085,40313 1085,40690 1085,40936 1085,41772 1085,42029 1085,42582 1085,42725 1085,42810 1085,43297 1085,44444 1085,44951 1085,45066 1085,45427 1085,47947 1085,48933 1085,49554 1085,51666 1085,51972 1085,52539 1085,52676 1085,52984 1085,55350 1085,55792 1085,56966 1085,57579 1085,57939 1085,61744 1085,63066 1085,64026 1085,64197 1085,64525 1085,64592 1085,65142 1085,65824 1085,66554 1085,66587 1085,67146 1085,67210 1085,67462 1085,67519 1085,68955 1085,70195 1085,71708 1085,72677 1085,73248 1085,73557 1085,73570 1085,74144 1085,74153 1085,74822 1085,75912 1085,80268 1085,81508 1085,82525 1085,83301 1085,83940 1085,84176 1085,86337 1085,86836 1085,87121 1085,90034 1085,91488 1085,92153 1085,93488 1085,93691 1085,93752 1085,93850 1085,95301 1085,95757 1085,97928 1085,98445 1085,99681 1085,100313 1085,103432 1085,103433 1085,103458 1085,104536 1085,104726 1085,105496 1085,107004 1085,107341 1085,110154 1085,111430 1085,112253 1085,112727 1085,113066 1085,113759 1085,114422 1085,115479 1085,117060 1085,117293 1085,117480 1085,118559 1085,119654 1085,120157 1085,121090 1085,121395 1085,122172 1085,123191 1085,125290 1085,127158 1085,127901 1085,127925 1085,128222 1085,128666 1085,129832 1085,130054 1085,133044 1085,133309 1085,133364 1085,134672 1085,134907 1085,135060 1085,135061 1085,135062 1085,135738 1085,135821 1085,138017 1085,140497 1085,145128 1085,145301 1085,148052 1085,148247 1085,148387 1085,148426 1085,152859 1085,157345 1085,157502 1085,158604 1085,160344 1085,160387 1085,161242 1085,161532 1085,162049 1085,162183 1085,162574 1085,163780 1085,165071 1085,166832 1085,168436 1085,168470 1085,171641 1085,171893 1085,172253 1085,175803 1085,176551 1085,176871 1085,176920 1085,177111 1085,177437 1085,177937 1085,182603 1085,185874 1085,186601 1085,186866 1085,188310 1085,192640 1085,194013 1085,194027 1085,194202 1085,194481 1085,194573 1085,194640 1085,194883 1085,199161 1085,203249 1085,203582 1085,212692 1085,213215 1085,215450 1085,215874 1085,216639 1085,216967 1085,218296 1085,219868 1085,220265 1085,220268 1085,220939 1085,221024 1085,221068 1085,221164 1085,221176 1085,224895 1085,227709 1085,228841 1085,229559 1085,232315 1085,232483 1085,233011 1085,233338 1085,233493 1085,234082 1085,236130 1085,236611 1085,237448 1085,237997 1085,238002 1085,238151 1085,238328 1085,239953 1085,240195 1085,240884 1085,241174 1085,242325 1085,243483 1085,244789 1085,245400 1085,251894 1085,258647 1085,259496 1085,260421 1085,261490 1085,261788 1085,262823 1085,263308 1085,265013 1086,360 1087,111 1087,292 1087,500 1087,673 1087,849 1087,900 1087,918 1087,1088 1087,1118 1087,1434 1087,1486 1087,1559 1087,1566 1087,1572 1087,1722 1087,3653 1087,5192 1087,6573 1087,6685 1087,7035 1087,7303 1087,15344 1087,15550 1087,16561 1087,21442 1087,26730 1087,27100 1087,31280 1087,44073 1087,44962 1087,48278 1087,84500 1087,89720 1087,89728 1087,97247 1087,98092 1087,113035 1087,124547 1087,171202 1087,178609 1087,191453 1087,218850 1087,219825 1087,223969 1087,223999 1087,228614 1087,245826 1087,246999 1087,258319 1088,1087 1089,44 1089,56 1089,79 1089,146 1089,147 1089,186 1089,192 1089,333 1089,336 1089,397 1089,406 1089,422 1089,452 1089,505 1089,602 1089,663 1089,664 1089,673 1089,676 1089,693 1089,838 1089,841 1089,843 1089,920 1089,1011 1089,1014 1089,1089 1089,1163 1089,1181 1089,1267 1089,1417 1089,1464 1089,1498 1089,1619 1089,1620 1089,1623 1089,1689 1089,1825 1089,1844 1089,1993 1089,2174 1089,2367 1089,2373 1089,2460 1089,2471 1089,3370 1089,3524 1089,4451 1089,5495 1089,5689 1089,5726 1089,6119 1089,6625 1089,6904 1089,6976 1089,7494 1089,8426 1089,9510 1089,12112 1089,13687 1089,14389 1089,14453 1089,18483 1089,18997 1089,19413 1089,19806 1089,20402 1089,21281 1089,22616 1089,23517 1089,23783 1089,24150 1089,26080 1089,26286 1089,26716 1089,41796 1089,44151 1089,50331 1089,55594 1089,55807 1089,60576 1089,62852 1089,62890 1089,63634 1089,65809 1089,67341 1089,75294 1089,77020 1089,78059 1089,82974 1089,87448 1089,88356 1089,89035 1089,90158 1089,90810 1089,90854 1089,92476 1089,93063 1089,96616 1089,99017 1089,101906 1089,110029 1089,112526 1089,112904 1089,116023 1089,116278 1089,118336 1089,120962 1089,127393 1089,127740 1089,142882 1089,149327 1089,151428 1089,158285 1089,158356 1089,162277 1089,174783 1089,177926 1089,179775 1089,180992 1089,182464 1089,188301 1089,193054 1089,195285 1089,195287 1089,201302 1089,204124 1089,207659 1089,215276 1089,215874 1089,216114 1089,216170 1089,218456 1089,225050 1089,237625 1089,239408 1089,247010 1089,252958 1089,255085 1089,263063 1089,263066 1089,263071 1089,263072 1090,673 1091,323 1092,46 1092,459 1092,744 1092,783 1092,1479 1093,589 1093,991 1093,992 1094,808 1095,1096 1096,97 1096,186 1096,685 1096,693 1096,911 1096,1096 1096,1113 1096,1118 1096,1290 1096,1566 1096,1612 1096,1722 1096,2704 1096,2874 1096,3554 1096,3555 1096,4190 1096,5307 1096,6206 1096,6624 1096,6766 1096,7115 1096,13424 1096,13463 1096,14041 1096,15383 1096,16503 1096,16516 1096,16531 1096,18139 1096,18546 1096,18643 1096,20228 1096,20989 1096,28294 1096,30002 1096,32335 1096,34020 1096,34141 1096,35397 1096,38907 1096,40278 1096,40982 1096,44482 1096,45753 1096,50245 1096,54712 1096,54941 1096,55712 1096,56936 1096,57001 1096,57199 1096,60357 1096,62832 1096,63749 1096,63755 1096,64310 1096,68413 1096,68732 1096,75196 1096,76993 1096,78251 1096,83482 1096,84756 1096,105516 1096,106764 1096,110713 1096,111202 1096,111442 1096,114461 1096,120603 1096,121201 1096,125820 1096,131133 1096,135742 1096,139914 1096,140389 1096,146058 1096,146281 1096,146285 1096,150768 1096,162930 1096,166025 1096,166981 1096,167510 1096,167512 1096,167513 1096,167514 1096,167515 1096,175447 1096,177588 1096,179524 1096,184849 1096,192411 1096,206858 1096,207659 1096,213059 1096,225339 1096,228377 1096,229185 1096,232654 1096,233149 1096,233347 1096,243113 1096,247443 1096,250200 1096,250205 1096,250206 1096,250207 1096,255469 1096,256221 1096,261541 1097,120 1097,338 1097,392 1097,1118 1097,1240 1097,1465 1098,305 1099,79 1100,772 1101,296 1101,323 1101,479 1101,991 1101,1052 1101,1102 1101,1579 1101,1659 1102,1102 1103,1033 1104,1001 1105,577 1105,693 1105,726 1105,788 1105,859 1105,1105 1105,1106 1105,1388 1105,1429 1105,2024 1105,2362 1105,3815 1105,4297 1105,5782 1105,5795 1105,6477 1105,6796 1105,7109 1105,7811 1105,13405 1105,14090 1105,18516 1105,18534 1105,18559 1105,22835 1105,23236 1105,24533 1105,26233 1105,29021 1105,29811 1105,39549 1105,40698 1105,44295 1105,44894 1105,45412 1105,46475 1105,48412 1105,52523 1105,54493 1105,55904 1105,57143 1105,63077 1105,67395 1105,80226 1105,83199 1105,87856 1105,89558 1105,94771 1105,95477 1105,109583 1105,110608 1105,110624 1105,110687 1105,111073 1105,113879 1105,115965 1105,117702 1105,117997 1105,118892 1105,118894 1105,118990 1105,119013 1105,119043 1105,119124 1105,121086 1105,121620 1105,121624 1105,124444 1105,127740 1105,130438 1105,130452 1105,130454 1105,130802 1105,136593 1105,136801 1105,138686 1105,141814 1105,143479 1105,146846 1105,148437 1105,152448 1105,152552 1105,154442 1105,155075 1105,155492 1105,156844 1105,157680 1105,158630 1105,176118 1105,186682 1105,186687 1105,216714 1105,228221 1107,337 1107,500 1107,505 1108,184 1109,140 1109,710 1109,1014 1109,1968 1110,718 1111,126 1111,462 1111,872 1111,931 1111,1127 1111,1659 1111,4039 1112,772 1113,10 1113,71 1113,102 1113,175 1113,292 1113,388 1113,408 1113,446 1113,518 1113,685 1113,693 1113,900 1113,911 1113,1096 1113,1113 1113,1323 1113,1326 1113,1345 1113,1793 1113,1848 1113,2460 1113,2634 1113,3193 1113,3407 1113,5307 1113,6638 1113,7959 1113,9379 1113,14512 1113,14572 1113,18097 1113,19367 1113,19421 1113,19688 1113,21257 1113,29817 1113,29875 1113,31122 1113,31221 1113,37534 1113,39696 1113,42082 1113,48505 1113,49151 1113,62816 1113,63179 1113,68913 1113,78746 1113,87871 1113,94063 1113,95386 1113,108066 1113,112681 1113,113513 1113,118978 1113,119016 1113,128787 1113,132846 1113,143993 1113,163304 1113,163450 1113,166435 1113,168837 1113,169811 1113,173812 1113,174401 1113,174755 1113,179238 1113,182788 1113,183098 1113,191216 1113,194246 1113,194247 1113,194966 1113,212991 1113,213365 1113,235880 1113,243424 1113,252380 1113,255251 1114,273 1114,274 1114,313 1115,1116 1116,1115 1116,2460 1116,3513 1116,4468 1116,6101 1116,7474 1116,13769 1116,26617 1116,34601 1116,39010 1116,43869 1116,49905 1116,51185 1116,60862 1116,83222 1116,86144 1116,87389 1116,90904 1116,95136 1116,106312 1116,114928 1116,120102 1116,121578 1116,121776 1116,131517 1116,132307 1116,132545 1116,133270 1116,174122 1116,180951 1116,183395 1116,193766 1116,193768 1116,193769 1116,232902 1116,241229 1116,247949 1116,258056 1117,10 1117,46 1117,299 1117,499 1117,599 1117,663 1117,664 1117,720 1117,721 1117,762 1117,783 1117,877 1117,907 1117,937 1117,972 1117,973 1117,1083 1117,1117 1117,1122 1117,1258 1117,1276 1117,1284 1117,1360 1117,1439 1117,1493 1117,1732 1117,1837 1117,2035 1117,2111 1117,2191 1117,2595 1117,2747 1117,3477 1117,4397 1117,4755 1117,5127 1117,5587 1117,5662 1117,6552 1117,6591 1117,8303 1117,8464 1117,8530 1117,13217 1117,13429 1117,13806 1117,14600 1117,15633 1117,15876 1117,18410 1117,18491 1117,18570 1117,18674 1117,18679 1117,19418 1117,25350 1117,25824 1117,26148 1117,31033 1117,36720 1117,38791 1117,39661 1117,42302 1117,44937 1117,45853 1117,52528 1117,53985 1117,58820 1117,61753 1117,62204 1117,62675 1117,69679 1117,73680 1117,79930 1117,85868 1117,85869 1117,93400 1117,104682 1117,116205 1117,117099 1117,124668 1117,127872 1117,130957 1117,135812 1117,141724 1117,157308 1117,157438 1117,158323 1117,158365 1117,158412 1117,159747 1117,160402 1117,161931 1117,162739 1117,163735 1117,164397 1117,167847 1117,181193 1117,187176 1117,192899 1117,204791 1117,204801 1117,205673 1117,213766 1117,251059 1118,1 1118,20 1118,22 1118,34 1118,83 1118,87 1118,106 1118,120 1118,126 1118,135 1118,147 1118,182 1118,185 1118,186 1118,192 1118,207 1118,211 1118,217 1118,240 1118,248 1118,252 1118,255 1118,256 1118,259 1118,264 1118,289 1118,290 1118,294 1118,299 1118,301 1118,336 1118,372 1118,389 1118,392 1118,397 1118,402 1118,406 1118,433 1118,435 1118,440 1118,452 1118,455 1118,457 1118,467 1118,497 1118,499 1118,500 1118,503 1118,510 1118,512 1118,534 1118,535 1118,536 1118,563 1118,577 1118,590 1118,599 1118,604 1118,631 1118,673 1118,693 1118,694 1118,704 1118,726 1118,733 1118,752 1118,779 1118,788 1118,794 1118,801 1118,805 1118,808 1118,818 1118,849 1118,862 1118,872 1118,875 1118,903 1118,911 1118,918 1118,920 1118,929 1118,972 1118,973 1118,1014 1118,1085 1118,1087 1118,1096 1118,1118 1118,1135 1118,1140 1118,1147 1118,1151 1118,1172 1118,1181 1118,1191 1118,1197 1118,1204 1118,1210 1118,1220 1118,1222 1118,1285 1118,1293 1118,1298 1118,1326 1118,1332 1118,1370 1118,1417 1118,1445 1118,1462 1118,1464 1118,1518 1118,1522 1118,1531 1118,1566 1118,1572 1118,1623 1118,1655 1118,1659 1118,1696 1118,1724 1118,1796 1118,1805 1118,1825 1118,1836 1118,1837 1118,1844 1118,1888 1118,1955 1118,2021 1118,2083 1118,2085 1118,2105 1118,2173 1118,2224 1118,2253 1118,2310 1118,2312 1118,2348 1118,2512 1118,2775 1118,3169 1118,3199 1118,3202 1118,3504 1118,3507 1118,3582 1118,3623 1118,3804 1118,3828 1118,3836 1118,4039 1118,4066 1118,4231 1118,4286 1118,5052 1118,5185 1118,5186 1118,5214 1118,5379 1118,5498 1118,5524 1118,5625 1118,5646 1118,5777 1118,5827 1118,5839 1118,6394 1118,6452 1118,6472 1118,6685 1118,6695 1118,6837 1118,6904 1118,6935 1118,6955 1118,7118 1118,7766 1118,7885 1118,8000 1118,13657 1118,15290 1118,15608 1118,15629 1118,16231 1118,17116 1118,18627 1118,18671 1118,19413 1118,19488 1118,19764 1118,20439 1118,20499 1118,20686 1118,20738 1118,20757 1118,20792 1118,21563 1118,22232 1118,22296 1118,24757 1118,24760 1118,25511 1118,26133 1118,26239 1118,26815 1118,26831 1118,28409 1118,29595 1118,29757 1118,30455 1118,31280 1118,34181 1118,34820 1118,35480 1118,36820 1118,37497 1118,37517 1118,39687 1118,40604 1118,42327 1118,42749 1118,43107 1118,44073 1118,44609 1118,44785 1118,44846 1118,45129 1118,45381 1118,45427 1118,46841 1118,48909 1118,49280 1118,50285 1118,50347 1118,52772 1118,54445 1118,54616 1118,58292 1118,59206 1118,59727 1118,60060 1118,60436 1118,60896 1118,63006 1118,63628 1118,64513 1118,69647 1118,69910 1118,72100 1118,72512 1118,73392 1118,75118 1118,75912 1118,75936 1118,75959 1118,75962 1118,75964 1118,75966 1118,75967 1118,75969 1118,75972 1118,75975 1118,75977 1118,75979 1118,79968 1118,81233 1118,83812 1118,84934 1118,86398 1118,86399 1118,86454 1118,86462 1118,86478 1118,86493 1118,87158 1118,87171 1118,89599 1118,91577 1118,92141 1118,93037 1118,93042 1118,93171 1118,93707 1118,93711 1118,93714 1118,93716 1118,93771 1118,94151 1118,94281 1118,94336 1118,94842 1118,94945 1118,94946 1118,94953 1118,95014 1118,95411 1118,95609 1118,97451 1118,97714 1118,101698 1118,103105 1118,103156 1118,105552 1118,106820 1118,110527 1118,110557 1118,113971 1118,115283 1118,115474 1118,116116 1118,118336 1118,119117 1118,120155 1118,124475 1118,126029 1118,126555 1118,127191 1118,127794 1118,127861 1118,128753 1118,132813 1118,137223 1118,139967 1118,139977 1118,140516 1118,144121 1118,144444 1118,154987 1118,160479 1118,162481 1118,163852 1118,165016 1118,165342 1118,165453 1118,166652 1118,166658 1118,167052 1118,168304 1118,168499 1118,169387 1118,172184 1118,172185 1118,172618 1118,173822 1118,174403 1118,174911 1118,177343 1118,177898 1118,177900 1118,177903 1118,178787 1118,183274 1118,185420 1118,186078 1118,186644 1118,187325 1118,192911 1118,195116 1118,201846 1118,203169 1118,204133 1118,212944 1118,213965 1118,218632 1118,220915 1118,221930 1118,224492 1118,232252 1118,238376 1118,246887 1118,246892 1118,249798 1118,255883 1118,256371 1118,258400 1119,5 1119,41 1119,68 1119,104 1119,134 1119,227 1119,261 1119,290 1119,298 1119,304 1119,327 1119,332 1119,372 1119,373 1119,417 1119,431 1119,442 1119,446 1119,534 1119,573 1119,588 1119,589 1119,590 1119,626 1119,631 1119,632 1119,636 1119,676 1119,677 1119,714 1119,715 1119,760 1119,761 1119,784 1119,797 1119,805 1119,823 1119,862 1119,1001 1119,1004 1119,1016 1119,1085 1119,1119 1119,1149 1119,1209 1119,1284 1119,1285 1119,1326 1119,1346 1119,1415 1119,1459 1119,1462 1119,1631 1119,1635 1119,1678 1119,1701 1119,1704 1119,1732 1119,1745 1119,1888 1119,1955 1119,2097 1119,2188 1119,2205 1119,2206 1119,2237 1119,2316 1119,2346 1119,2408 1119,2417 1119,2620 1119,2991 1119,2995 1119,3507 1119,3566 1119,3585 1119,3715 1119,4066 1119,4114 1119,4220 1119,4619 1119,4739 1119,5011 1119,5346 1119,5439 1119,5574 1119,5578 1119,5828 1119,6068 1119,6069 1119,6185 1119,6792 1119,6856 1119,6908 1119,7077 1119,7194 1119,7227 1119,7728 1119,7790 1119,7962 1119,8246 1119,8275 1119,8401 1119,8529 1119,8537 1119,9342 1119,12747 1119,13198 1119,14080 1119,14487 1119,14507 1119,14597 1119,15206 1119,15277 1119,15952 1119,16137 1119,16164 1119,16306 1119,16309 1119,16370 1119,16510 1119,16551 1119,16709 1119,17116 1119,18543 1119,18965 1119,19617 1119,20592 1119,20787 1119,21384 1119,21867 1119,21944 1119,22081 1119,22440 1119,24996 1119,25048 1119,25385 1119,25664 1119,25800 1119,25814 1119,26475 1119,26513 1119,27126 1119,28191 1119,29898 1119,30268 1119,30733 1119,31001 1119,31746 1119,31785 1119,32218 1119,32692 1119,33424 1119,33567 1119,34828 1119,37100 1119,37771 1119,39618 1119,40220 1119,40267 1119,40993 1119,42841 1119,43394 1119,44989 1119,46874 1119,47770 1119,49457 1119,50440 1119,50494 1119,50857 1119,53530 1119,54391 1119,54421 1119,55146 1119,55658 1119,56650 1119,57910 1119,62855 1119,62886 1119,62964 1119,64150 1119,64197 1119,64631 1119,64840 1119,65681 1119,66868 1119,67507 1119,71110 1119,72564 1119,75183 1119,75912 1119,78891 1119,80049 1119,81135 1119,81508 1119,83314 1119,83496 1119,86791 1119,87507 1119,89711 1119,90140 1119,90925 1119,99147 1119,103524 1119,104630 1119,105327 1119,110509 1119,114843 1119,115705 1119,118020 1119,118248 1119,127323 1119,128361 1119,131371 1119,131880 1119,135105 1119,135950 1119,136462 1119,139522 1119,142040 1119,148018 1119,149304 1119,152605 1119,155073 1119,158269 1119,159712 1119,161874 1119,167770 1119,169337 1119,170914 1119,173427 1119,175384 1119,176866 1119,176944 1119,182344 1119,182345 1119,185877 1119,188256 1119,188555 1119,193994 1119,195069 1119,201654 1119,201743 1119,203174 1119,204567 1119,204640 1119,206740 1119,207051 1119,211855 1119,213669 1119,214733 1119,215413 1119,216205 1119,219068 1119,220939 1119,221176 1119,226397 1119,229229 1119,230379 1119,230934 1119,231195 1119,235275 1119,237302 1119,246120 1119,251019 1119,258779 1119,262570 1121,163 1122,299 1122,372 1122,444 1122,459 1122,599 1122,663 1122,664 1122,720 1122,783 1122,932 1122,937 1122,972 1122,973 1122,982 1122,1010 1122,1011 1122,1117 1122,1122 1122,1123 1122,1124 1122,1167 1122,1271 1122,1298 1122,1326 1122,1522 1122,1544 1122,1732 1122,1837 1122,1849 1122,2191 1122,2595 1122,3207 1122,3422 1122,3734 1122,5186 1122,5587 1122,5662 1122,6844 1122,7873 1122,8022 1122,8187 1122,14449 1122,14597 1122,16471 1122,16488 1122,17877 1122,18504 1122,21230 1122,28375 1122,32784 1122,32944 1122,35483 1122,36257 1122,40453 1122,42951 1122,45853 1122,46454 1122,46699 1122,49991 1122,50440 1122,52065 1122,52067 1122,54040 1122,54504 1122,57182 1122,59061 1122,59185 1122,59955 1122,69935 1122,78653 1122,87764 1122,87908 1122,105532 1122,109668 1122,115332 1122,124668 1122,127741 1122,127847 1122,131809 1122,140044 1122,145913 1122,148387 1122,152027 1122,164312 1122,167787 1122,168461 1122,170590 1122,171641 1122,172582 1122,172615 1122,175903 1122,177820 1122,186900 1122,187176 1122,204791 1123,972 1123,1122 1123,1849 1123,32784 1124,37 1124,45 1124,58 1124,444 1124,459 1124,567 1124,604 1124,744 1124,783 1124,801 1124,937 1124,968 1124,973 1124,994 1124,1125 1124,1128 1124,1160 1124,1167 1124,1293 1124,1479 1124,1544 1124,1832 1124,2217 1124,3422 1124,3488 1124,3575 1124,3869 1124,4128 1124,5662 1124,6434 1124,16697 1124,17894 1124,18098 1124,18482 1124,22267 1124,23574 1124,26042 1124,26198 1124,34099 1124,34263 1124,35542 1124,37355 1124,48886 1124,58820 1124,67818 1124,67988 1124,72709 1124,74687 1124,76679 1124,80060 1125,46 1125,58 1125,994 1125,1124 1126,1127 1127,10 1127,58 1127,111 1127,314 1127,441 1127,452 1127,673 1127,714 1127,872 1127,911 1127,1011 1127,1127 1127,1172 1127,1844 1127,1978 1128,46 1128,58 1128,534 1128,1124 1130,11 1130,20 1130,58 1130,86 1130,111 1130,126 1130,158 1130,160 1130,163 1130,167 1130,192 1130,207 1130,240 1130,248 1130,259 1130,272 1130,287 1130,292 1130,299 1130,304 1130,333 1130,336 1130,356 1130,372 1130,388 1130,392 1130,433 1130,435 1130,455 1130,457 1130,489 1130,500 1130,509 1130,516 1130,534 1130,536 1130,538 1130,577 1130,586 1130,599 1130,604 1130,631 1130,668 1130,672 1130,673 1130,685 1130,693 1130,697 1130,788 1130,794 1130,801 1130,809 1130,818 1130,838 1130,843 1130,849 1130,852 1130,868 1130,872 1130,911 1130,918 1130,919 1130,972 1130,1001 1130,1011 1130,1014 1130,1058 1130,1070 1130,1085 1130,1089 1130,1118 1130,1130 1130,1151 1130,1167 1130,1172 1130,1240 1130,1267 1130,1284 1130,1293 1130,1309 1130,1320 1130,1326 1130,1370 1130,1402 1130,1452 1130,1465 1130,1566 1130,1590 1130,1619 1130,1634 1130,1655 1130,1722 1130,1724 1130,1782 1130,1796 1130,1836 1130,1837 1130,1844 1130,1848 1130,1955 1130,1992 1130,2373 1130,2512 1130,2580 1130,2979 1130,3135 1130,3260 1130,3392 1130,3804 1130,4147 1130,4222 1130,4276 1130,4384 1130,4760 1130,5185 1130,5686 1130,7318 1130,7973 1130,8055 1130,8276 1130,15329 1130,16208 1130,16667 1130,16696 1130,19543 1130,20651 1130,21442 1130,24728 1130,25526 1130,26161 1130,28814 1130,29890 1130,30373 1130,37668 1130,39446 1130,41230 1130,47835 1130,56371 1130,70966 1130,70971 1130,75912 1130,82633 1130,92976 1130,93509 1130,94958 1130,104539 1130,105598 1130,105672 1130,106069 1130,106946 1130,109997 1130,110682 1130,110683 1130,113021 1130,113532 1130,113908 1130,114105 1130,115474 1130,115996 1130,116401 1130,117013 1130,118336 1130,134602 1130,140057 1130,140426 1130,140688 1130,140829 1130,144092 1130,146346 1130,158270 1130,160451 1130,160885 1130,161512 1130,162599 1130,163769 1130,163843 1130,165205 1130,175272 1130,189242 1130,189357 1130,195679 1130,215276 1130,215874 1130,219988 1130,247103 1130,247895 1130,254854 1130,258104 1130,259512 1130,262348 1130,262466 1131,1132 1132,41 1132,48 1132,87 1132,130 1132,685 1132,693 1132,911 1132,1132 1133,68 1133,207 1133,287 1133,349 1133,390 1133,518 1133,534 1133,589 1133,599 1133,849 1133,852 1133,873 1133,874 1133,911 1133,1001 1133,1082 1133,1133 1133,1210 1133,1326 1133,1634 1133,1749 1133,2182 1133,2252 1133,2479 1133,2590 1133,5578 1133,5851 1133,7087 1133,7222 1133,14092 1133,15421 1133,23421 1133,28093 1133,31066 1133,31308 1133,31311 1133,31731 1133,34303 1133,34720 1133,34767 1133,56083 1133,61467 1133,65663 1133,75287 1133,91394 1133,109560 1133,118725 1133,119003 1133,119667 1133,122451 1133,138330 1133,142807 1133,142919 1133,145082 1133,147515 1133,155658 1133,169180 1133,173242 1133,194989 1133,212971 1133,216333 1133,221273 1134,48 1134,178 1134,340 1134,647 1135,11 1135,126 1135,256 1135,849 1135,911 1135,1118 1135,1135 1135,1434 1135,1566 1135,1663 1135,1844 1135,3967 1135,4190 1135,4352 1135,5213 1135,8419 1135,13776 1135,14109 1135,15344 1135,22168 1135,34908 1135,38135 1135,79943 1135,90414 1135,94730 1135,106404 1135,114387 1135,128797 1135,142956 1135,164271 1135,168447 1135,171784 1135,171786 1135,171787 1135,171789 1135,171791 1135,194600 1135,223459 1135,224465 1135,252510 1135,252675 1136,698 1137,623 1138,278 1138,2646 1138,115659 1139,1140 1140,58 1140,87 1140,217 1140,264 1140,292 1140,314 1140,344 1140,441 1140,442 1140,457 1140,467 1140,510 1140,596 1140,599 1140,626 1140,676 1140,801 1140,849 1140,872 1140,929 1140,1011 1140,1019 1140,1118 1140,1127 1140,1140 1140,1235 1140,1240 1140,1284 1140,1326 1140,1332 1140,1335 1140,1449 1140,1465 1140,1566 1140,1572 1140,1722 1140,1796 1140,1844 1140,1893 1140,1973 1140,2173 1140,2209 1140,2334 1140,2436 1140,2443 1140,3474 1140,3507 1140,4771 1140,5547 1140,18832 1140,20813 1140,22765 1140,68302 1140,86165 1140,136072 1142,1143 1143,87 1143,256 1143,838 1143,911 1143,1240 1143,1805 1143,1860 1143,5833 1143,207837 1144,20 1144,1072 1144,1564 1144,1818 1144,4276 1145,37 1145,717 1145,1782 1146,58 1146,87 1146,107 1146,111 1146,392 1146,441 1146,442 1146,510 1146,596 1146,609 1146,685 1146,702 1146,703 1146,749 1146,801 1146,818 1146,849 1146,918 1146,999 1146,1011 1146,1146 1146,1147 1146,1151 1146,1368 1146,1949 1146,2253 1146,3538 1146,6824 1146,15523 1146,26450 1146,127158 1147,11 1147,20 1147,87 1147,111 1147,126 1147,182 1147,256 1147,314 1147,397 1147,425 1147,441 1147,452 1147,457 1147,500 1147,535 1147,599 1147,676 1147,685 1147,794 1147,808 1147,838 1147,843 1147,849 1147,872 1147,972 1147,1011 1147,1014 1147,1118 1147,1130 1147,1172 1147,1191 1147,1192 1147,1345 1147,1417 1147,1445 1147,1559 1147,1566 1147,1655 1147,1663 1147,1973 1147,2253 1147,2373 1147,3524 1147,4066 1147,4165 1147,5833 1147,6824 1147,6904 1147,7117 1147,9457 1147,19413 1147,20757 1147,118336 1147,215874 1148,843 1149,41 1149,81 1149,108 1149,175 1149,254 1149,328 1149,373 1149,502 1149,503 1149,512 1149,586 1149,693 1149,704 1149,760 1149,947 1149,1011 1149,1119 1149,1149 1149,1257 1149,1266 1149,1270 1149,1282 1149,1402 1149,1488 1149,1489 1149,1631 1149,1635 1149,1659 1149,1745 1149,1882 1149,2065 1149,2210 1149,2775 1149,3183 1149,3202 1149,3507 1149,3508 1149,3565 1149,3566 1149,3760 1149,3939 1149,4115 1149,4237 1149,4261 1149,4265 1149,4320 1149,4466 1149,4842 1149,5317 1149,5357 1149,5535 1149,5552 1149,5679 1149,6554 1149,6753 1149,6923 1149,6928 1149,6963 1149,7739 1149,7758 1149,7928 1149,9441 1149,12876 1149,13166 1149,13207 1149,13395 1149,13452 1149,14444 1149,14487 1149,14524 1149,14577 1149,15189 1149,15229 1149,15334 1149,15344 1149,15397 1149,15654 1149,15856 1149,16306 1149,16538 1149,18450 1149,18457 1149,18487 1149,19075 1149,20301 1149,20540 1149,22299 1149,22335 1149,23609 1149,24644 1149,25348 1149,25814 1149,27639 1149,28291 1149,30873 1149,33750 1149,34065 1149,34414 1149,34581 1149,35202 1149,35371 1149,37573 1149,37580 1149,37584 1149,37588 1149,38437 1149,39597 1149,41206 1149,43090 1149,44298 1149,44340 1149,44757 1149,46874 1149,47525 1149,49339 1149,49810 1149,50171 1149,50175 1149,50177 1149,50188 1149,50192 1149,50199 1149,50204 1149,50206 1149,50207 1149,50211 1149,50217 1149,51791 1149,54575 1149,56320 1149,56615 1149,58935 1149,59088 1149,59112 1149,60115 1149,60356 1149,60459 1149,60500 1149,60548 1149,63909 1149,65681 1149,70416 1149,76263 1149,76860 1149,78981 1149,82051 1149,82371 1149,85958 1149,86254 1149,86255 1149,86256 1149,86323 1149,86471 1149,86747 1149,86756 1149,87002 1149,87589 1149,88013 1149,91019 1149,91026 1149,91976 1149,92874 1149,97338 1149,99383 1149,99685 1149,101888 1149,102116 1149,103366 1149,109693 1149,119253 1149,121033 1149,122123 1149,131371 1149,132005 1149,133288 1149,134647 1149,137275 1149,137801 1149,138142 1149,138689 1149,139695 1149,140143 1149,141357 1149,141879 1149,142403 1149,143262 1149,145158 1149,145471 1149,145622 1149,148090 1149,149694 1149,158817 1149,158854 1149,158871 1149,159403 1149,159908 1149,160450 1149,160496 1149,160840 1149,162478 1149,162958 1149,163120 1149,163338 1149,163642 1149,165231 1149,165990 1149,168993 1149,169065 1149,169317 1149,170622 1149,170857 1149,171240 1149,171651 1149,173063 1149,176957 1149,177789 1149,178963 1149,183031 1149,187040 1149,187077 1149,192064 1149,192257 1149,194480 1149,195650 1149,196150 1149,197783 1149,199078 1149,202051 1149,205457 1149,205747 1149,212908 1149,215062 1149,216340 1149,216435 1149,221031 1149,225336 1149,228928 1149,232439 1149,234939 1149,239423 1149,241609 1149,243386 1149,252561 1149,257813 1149,260225 1149,260537 1149,262398 1150,1151 1151,66 1151,87 1151,111 1151,217 1151,240 1151,292 1151,314 1151,397 1151,440 1151,457 1151,467 1151,509 1151,510 1151,599 1151,685 1151,818 1151,849 1151,868 1151,872 1151,911 1151,919 1151,1011 1151,1014 1151,1118 1151,1130 1151,1192 1151,1210 1151,1240 1151,1572 1151,1663 1151,1722 1151,1844 1151,2173 1151,2253 1151,3538 1151,4039 1151,15609 1151,127158 1151,215874 1152,336 1153,422 1154,422 1155,346 1156,422 1157,422 1158,326 1159,422 1160,46 1160,301 1160,397 1160,444 1160,567 1160,604 1160,605 1160,783 1160,937 1160,968 1160,1001 1160,1124 1160,1160 1160,1161 1160,1293 1160,1300 1160,1326 1160,1732 1160,1782 1160,1853 1160,3422 1160,5197 1160,5662 1160,7257 1160,14246 1160,25273 1160,35545 1160,41528 1160,42598 1160,48317 1160,50522 1160,57125 1160,60568 1160,79971 1160,82909 1160,84069 1160,85459 1160,91427 1160,96685 1160,102575 1160,103860 1160,119842 1160,126956 1160,147481 1160,152468 1160,174279 1160,178012 1160,202294 1160,205018 1160,218884 1160,221671 1160,221687 1160,221716 1160,222348 1160,222415 1160,241013 1160,242399 1160,243286 1160,243792 1160,244725 1160,245264 1160,245365 1161,937 1161,968 1161,1160 1161,1282 1161,1732 1162,336 1162,1163 1163,1163 1164,422 1165,233 1166,422 1167,58 1167,167 1167,299 1167,356 1167,665 1167,666 1167,685 1167,720 1167,794 1167,852 1167,941 1167,1014 1167,1122 1167,1130 1167,1167 1167,1241 1167,1284 1167,1319 1167,1381 1167,1436 1167,1522 1167,1635 1167,1849 1167,2083 1167,2192 1167,2372 1167,2979 1167,3207 1167,3218 1167,3392 1167,3422 1167,3784 1167,5195 1167,5238 1167,5662 1167,5787 1167,6910 1167,7203 1167,7219 1167,7239 1167,7774 1167,8435 1167,9655 1167,13519 1167,13523 1167,14615 1167,15183 1167,15633 1167,18526 1167,20303 1167,21412 1167,23365 1167,23446 1167,23845 1167,24579 1167,25662 1167,29543 1167,29727 1167,29760 1167,30323 1167,30491 1167,32577 1167,32784 1167,35139 1167,35445 1167,36678 1167,37482 1167,38959 1167,45853 1167,49121 1167,49373 1167,56540 1167,56541 1167,56554 1167,56555 1167,56570 1167,56909 1167,57066 1167,59977 1167,60564 1167,61307 1167,62932 1167,64156 1167,68873 1167,71008 1167,72764 1167,73570 1167,79293 1167,79324 1167,82234 1167,85750 1167,91555 1167,96623 1167,96685 1167,101629 1167,103784 1167,109863 1167,114353 1167,120155 1167,120922 1167,122944 1167,126787 1167,135946 1167,141926 1167,142990 1167,146412 1167,148765 1167,148771 1167,149246 1167,152298 1167,153648 1167,158281 1167,162021 1167,165848 1167,177824 1167,179905 1167,179939 1167,179940 1167,179943 1167,184392 1167,187415 1167,194316 1167,213170 1167,218754 1167,234686 1167,235853 1167,241779 1167,248474 1167,254237 1167,258248 1167,258266 1167,260728 1167,261891 1167,261900 1168,422 1169,422 1170,422 1171,422 1172,20 1172,182 1172,209 1172,217 1172,259 1172,292 1172,301 1172,302 1172,314 1172,352 1172,356 1172,397 1172,452 1172,497 1172,510 1172,534 1172,581 1172,599 1172,668 1172,712 1172,775 1172,818 1172,838 1172,849 1172,875 1172,911 1172,920 1172,972 1172,973 1172,1011 1172,1014 1172,1147 1172,1151 1172,1179 1172,1191 1172,1204 1172,1293 1172,1309 1172,1326 1172,1445 1172,1518 1172,1619 1172,1796 1172,1836 1172,1844 1172,1989 1172,1992 1172,2310 1172,2373 1172,2775 1172,3967 1172,5213 1172,6452 1172,8419 1172,13207 1172,14658 1172,15109 1172,15310 1172,19413 1172,19592 1172,21590 1172,24491 1172,24707 1172,34971 1172,37370 1172,38159 1172,38326 1172,41893 1172,50375 1172,61220 1172,61285 1172,71166 1172,82598 1172,102738 1172,105584 1172,113959 1172,116879 1172,119511 1172,121893 1172,148226 1172,149144 1172,151086 1172,161239 1172,164363 1172,167026 1172,169481 1172,179751 1172,181951 1172,189903 1172,195032 1172,201143 1172,214092 1172,218762 1172,221847 1172,226510 1172,238987 1173,358 1173,510 1173,875 1173,1515 1173,1775 1173,2701 1173,171294 1174,843 1174,1175 1175,202 1175,203 1175,256 1175,446 1175,493 1175,516 1175,663 1175,664 1175,682 1175,733 1175,1222 1175,1243 1175,1265 1175,1266 1175,1292 1175,1370 1175,1655 1175,1927 1175,2033 1175,2266 1175,2307 1175,3507 1175,5696 1175,8400 1175,13636 1175,16610 1175,18185 1175,20295 1175,21706 1175,30317 1175,32792 1175,34874 1175,36439 1175,36636 1175,38844 1175,41057 1175,41602 1175,43365 1175,44043 1175,68373 1175,76704 1175,77049 1175,78631 1175,79359 1175,87708 1175,95823 1175,100218 1175,118895 1175,136042 1175,136087 1175,158299 1175,162613 1175,169627 1175,172552 1175,173519 1175,173669 1175,173672 1175,173678 1175,174474 1175,174490 1175,177885 1175,181759 1175,185084 1175,189839 1175,206096 1175,215276 1175,216167 1175,216604 1175,218925 1175,227700 1175,228830 1175,251234 1176,1177 1177,41 1177,42 1177,58 1177,200 1177,292 1177,301 1177,441 1177,442 1177,626 1177,797 1177,801 1177,911 1177,1012 1177,1052 1177,1140 1177,1177 1177,1188 1177,1804 1177,1973 1177,2210 1177,2334 1177,2395 1177,3407 1177,4237 1177,4258 1177,4265 1177,6556 1177,6569 1177,13506 1177,13931 1177,14132 1177,32666 1177,36778 1177,46749 1177,56629 1177,62597 1177,62886 1177,64594 1177,81832 1177,102506 1177,102509 1177,102513 1177,103270 1177,103524 1177,106187 1177,106340 1177,106348 1177,106356 1177,107465 1177,107648 1177,109414 1177,109920 1177,109926 1177,110195 1177,110735 1177,111100 1177,113402 1177,116641 1177,117231 1177,124479 1177,138058 1177,144087 1177,147502 1177,149188 1177,150762 1177,151040 1177,151409 1177,152563 1177,154768 1177,156298 1177,156958 1177,156967 1177,160083 1177,161479 1177,165883 1177,165903 1177,167035 1177,169318 1177,169665 1177,174920 1177,175054 1177,175513 1177,182162 1177,185980 1177,190262 1177,214550 1178,225 1178,248 1178,1179 1178,5405 1179,30 1179,134 1179,136 1179,200 1179,225 1179,248 1179,327 1179,328 1179,356 1179,417 1179,440 1179,622 1179,685 1179,693 1179,809 1179,838 1179,850 1179,852 1179,911 1179,950 1179,1014 1179,1033 1179,1179 1179,1279 1179,1305 1179,1329 1179,1332 1179,1368 1179,1939 1179,2119 1179,2596 1179,2710 1179,3565 1179,3654 1179,3944 1179,4276 1179,5405 1179,5453 1179,5472 1179,6062 1179,6136 1179,6646 1179,6901 1179,7790 1179,8075 1179,8279 1179,8378 1179,8511 1179,9342 1179,13207 1179,14975 1179,15553 1179,15571 1179,15604 1179,16468 1179,16638 1179,17175 1179,18194 1179,19784 1179,19798 1179,20488 1179,20598 1179,20729 1179,22776 1179,23868 1179,26969 1179,28203 1179,28263 1179,37912 1179,44970 1179,48040 1179,51571 1179,57143 1179,57910 1179,58871 1179,59080 1179,59774 1179,59889 1179,63187 1179,73745 1179,78891 1179,83496 1179,92972 1179,95605 1179,98240 1179,109077 1179,110076 1179,123833 1179,126715 1179,149284 1179,156624 1179,159820 1179,170162 1179,173841 1179,173872 1179,176323 1179,176345 1179,176357 1179,178576 1179,183362 1179,183844 1179,185282 1179,186525 1179,186552 1179,186612 1179,187303 1179,192506 1179,193739 1179,196017 1179,199342 1179,199381 1179,199391 1179,201877 1179,203015 1179,207182 1179,207194 1179,219793 1179,220449 1179,223682 1179,223797 1179,229432 1179,230462 1179,231192 1179,237259 1179,244256 1180,1181 1180,1531 1181,192 1181,1181 1181,1192 1181,1218 1181,1456 1181,1464 1181,1476 1181,1502 1181,1825 1181,2307 1181,2374 1181,9394 1181,21419 1181,23662 1181,24045 1181,25416 1181,31210 1181,36436 1181,39643 1181,74632 1181,77906 1181,91833 1181,136271 1181,160859 1181,171804 1182,1011 1182,1151 1183,209 1184,3 1184,510 1185,178 1186,349 1186,392 1186,644 1186,697 1186,1151 1187,489 1187,1188 1188,10 1188,87 1188,175 1188,200 1188,446 1188,609 1188,685 1188,693 1188,1449 1188,2915 1189,147 1189,149 1189,158 1191,1 1191,20 1191,72 1191,182 1191,202 1191,207 1191,256 1191,264 1191,301 1191,314 1191,397 1191,441 1191,457 1191,493 1191,505 1191,599 1191,673 1191,676 1191,710 1191,731 1191,818 1191,872 1191,911 1191,1021 1191,1023 1191,1118 1191,1191 1191,1192 1191,1196 1191,1204 1191,1345 1191,1559 1191,1566 1191,1663 1191,1992 1191,2143 1191,2173 1191,2253 1191,2356 1191,2512 1191,2923 1191,3524 1191,4165 1191,4276 1191,5213 1191,8419 1191,8676 1191,9457 1191,13375 1191,14481 1191,14674 1191,22020 1191,30596 1191,32616 1191,54616 1191,75912 1191,79620 1191,79844 1191,80954 1191,82217 1191,82598 1191,84506 1191,90298 1191,113959 1191,124907 1191,131650 1191,137013 1191,172497 1191,174786 1191,174787 1191,185281 1191,200454 1191,204093 1191,215276 1191,215874 1191,220187 1191,227952 1191,242216 1191,251849 1192,19 1192,86 1192,87 1192,104 1192,111 1192,126 1192,134 1192,136 1192,192 1192,202 1192,203 1192,209 1192,254 1192,256 1192,264 1192,298 1192,301 1192,326 1192,328 1192,333 1192,358 1192,392 1192,397 1192,435 1192,442 1192,447 1192,455 1192,493 1192,536 1192,573 1192,588 1192,590 1192,649 1192,760 1192,818 1192,872 1192,907 1192,980 1192,1007 1192,1085 1192,1147 1192,1151 1192,1181 1192,1191 1192,1204 1192,1235 1192,1335 1192,1345 1192,1430 1192,1453 1192,1464 1192,1505 1192,1515 1192,1564 1192,1572 1192,1616 1192,1635 1192,1663 1192,1688 1192,1825 1192,1916 1192,1968 1192,1973 1192,2014 1192,2173 1192,2206 1192,2274 1192,2671 1192,2726 1192,3182 1192,3507 1192,3835 1192,4222 1192,4231 1192,4276 1192,4771 1192,13478 1192,16019 1192,19996 1192,20396 1192,21982 1192,32819 1192,33424 1192,38394 1192,40344 1192,60528 1192,64567 1192,76096 1192,104567 1192,123978 1192,140826 1192,185281 1192,186777 1192,200454 1192,232683 1192,233462 1192,245910 1192,250521 1192,258219 1192,258739 1193,660 1194,518 1195,41 1195,42 1195,233 1195,289 1195,290 1195,298 1195,534 1195,631 1195,760 1195,784 1195,862 1195,1085 1195,1132 1195,1195 1195,1462 1195,1608 1195,2775 1195,2995 1195,3623 1195,4258 1195,8537 1195,13931 1195,25385 1195,30505 1195,54666 1195,56629 1195,58145 1195,58911 1195,60603 1195,64136 1195,65828 1195,65835 1195,67418 1195,68211 1195,75912 1195,94134 1195,98080 1195,109553 1195,110656 1196,1191 1197,48 1197,130 1197,140 1197,264 1197,292 1197,338 1197,392 1197,462 1197,479 1197,515 1197,710 1197,801 1197,872 1197,991 1197,1052 1197,1118 1197,1127 1197,1381 1197,1559 1197,1579 1197,1639 1197,1659 1197,1707 1197,1893 1197,1968 1197,2312 1197,3258 1197,3695 1197,4066 1197,5440 1197,6955 1197,13538 1197,25573 1197,36985 1197,54202 1197,54264 1197,54362 1198,79 1198,99 1198,192 1198,278 1198,336 1198,841 1198,1181 1198,23783 1199,336 1200,248 1201,83 1201,283 1201,379 1201,401 1201,536 1201,1069 1201,1201 1201,1973 1201,2319 1201,2944 1201,5326 1201,5458 1201,5737 1201,18831 1201,48360 1201,82197 1201,116687 1201,118835 1201,148636 1201,171193 1202,1203 1203,120 1203,240 1203,332 1203,372 1203,677 1203,818 1203,1082 1203,1285 1203,1807 1203,1808 1203,1955 1203,2510 1203,2991 1203,3135 1203,3607 1203,3770 1203,3771 1203,3814 1203,5825 1203,6840 1203,13698 1203,16335 1203,16571 1203,18528 1203,18647 1203,19431 1203,19622 1203,20609 1203,20624 1203,21964 1203,22328 1203,22331 1203,22337 1203,22339 1203,22353 1203,22359 1203,22360 1203,22365 1203,23102 1203,24766 1203,26513 1203,33412 1203,38111 1203,38910 1203,41012 1203,42545 1203,42677 1203,44227 1203,44232 1203,44236 1203,44237 1203,44273 1203,46309 1203,46668 1203,48975 1203,66736 1203,85936 1203,85941 1203,85951 1203,85955 1203,85961 1203,85965 1203,85966 1203,85967 1203,85970 1203,85972 1203,96546 1203,99012 1203,99013 1203,99056 1203,99149 1203,103256 1203,103269 1203,103277 1203,103634 1203,105593 1203,164417 1203,177286 1203,177475 1203,195053 1203,195056 1204,34 1204,35 1204,192 1204,256 1204,314 1204,336 1204,397 1204,440 1204,457 1204,500 1204,510 1204,673 1204,676 1204,685 1204,794 1204,801 1204,849 1204,852 1204,872 1204,893 1204,911 1204,920 1204,1014 1204,1118 1204,1151 1204,1191 1204,1192 1204,1204 1204,1345 1204,1417 1204,1445 1204,1472 1204,1559 1204,1619 1204,1663 1204,1758 1204,1796 1204,1844 1204,2206 1204,2253 1204,2496 1204,3524 1204,3533 1204,5709 1204,6452 1204,6523 1204,6824 1204,8021 1204,14232 1204,15397 1204,18688 1204,33424 1204,54616 1204,73399 1204,106176 1204,125548 1204,154769 1204,188951 1204,204093 1205,192 1205,622 1205,1619 1206,389 1207,160 1207,515 1208,388 1208,389 1208,577 1208,1072 1210,22 1210,50 1210,68 1210,167 1210,186 1210,192 1210,207 1210,217 1210,240 1210,255 1210,287 1210,301 1210,302 1210,314 1210,326 1210,347 1210,349 1210,392 1210,397 1210,425 1210,433 1210,435 1210,446 1210,457 1210,509 1210,510 1210,516 1210,535 1210,599 1210,623 1210,663 1210,697 1210,702 1210,752 1210,779 1210,809 1210,818 1210,843 1210,861 1210,868 1210,872 1210,873 1210,874 1210,968 1210,1010 1210,1011 1210,1023 1210,1118 1210,1133 1210,1151 1210,1181 1210,1210 1210,1211 1210,1240 1210,1370 1210,1417 1210,1454 1210,1466 1210,1494 1210,1518 1210,1561 1210,1564 1210,1634 1210,1705 1210,1738 1210,1844 1210,1853 1210,2173 1210,2193 1210,2205 1210,2206 1210,2235 1210,2297 1210,2307 1210,2470 1210,2659 1210,2979 1210,3497 1210,3866 1210,4130 1210,4272 1210,4417 1210,5178 1210,5250 1210,5376 1210,5646 1210,5937 1210,7759 1210,7760 1210,8261 1210,8276 1210,10216 1210,13198 1210,13298 1210,13901 1210,14155 1210,15303 1210,15344 1210,15609 1210,16357 1210,18587 1210,18756 1210,21663 1210,22790 1210,24365 1210,24787 1210,25625 1210,26081 1210,29595 1210,29890 1210,29937 1210,30373 1210,30674 1210,31318 1210,31474 1210,31790 1210,33703 1210,34073 1210,36941 1210,37726 1210,39583 1210,40657 1210,40678 1210,41106 1210,43762 1210,44172 1210,44416 1210,45195 1210,45574 1210,46271 1210,46515 1210,47106 1210,47236 1210,49337 1210,50169 1210,50305 1210,50359 1210,50903 1210,50987 1210,51109 1210,51359 1210,51880 1210,52408 1210,55552 1210,57873 1210,60794 1210,62990 1210,64152 1210,68006 1210,70689 1210,79193 1210,82217 1210,85800 1210,87245 1210,88569 1210,93113 1210,96557 1210,97543 1210,97638 1210,97667 1210,98646 1210,98872 1210,103750 1210,111297 1210,114459 1210,114462 1210,114643 1210,117969 1210,118281 1210,126050 1210,127158 1210,128733 1210,130241 1210,132917 1210,136630 1210,139793 1210,142055 1210,142855 1210,142895 1210,143117 1210,143463 1210,143959 1210,145640 1210,147767 1210,152751 1210,155069 1210,158268 1210,160117 1210,161245 1210,161626 1210,161630 1210,161633 1210,173807 1210,173859 1210,176059 1210,188727 1210,192076 1210,192368 1210,192388 1210,192807 1210,205031 1210,208017 1210,213173 1210,214073 1210,214636 1210,215633 1210,216478 1210,223842 1210,224846 1210,227074 1210,233477 1210,236180 1210,237460 1210,238422 1210,247074 1210,248125 1210,249055 1210,260220 1210,260980 1211,579 1211,1210 1211,1639 1212,26 1212,59 1212,81 1212,104 1212,138 1212,328 1212,704 1212,714 1212,784 1212,885 1212,886 1212,1016 1212,1282 1212,1402 1212,1882 1212,2008 1212,2286 1212,2384 1212,2893 1212,3794 1212,4308 1212,5137 1212,8180 1212,14133 1212,14500 1212,15768 1212,16491 1212,23423 1212,25306 1212,31173 1212,31893 1212,36819 1212,46806 1212,59273 1212,66383 1212,80265 1212,84476 1212,86674 1212,92141 1212,121378 1212,139002 1212,160343 1212,171620 1212,173296 1212,175722 1212,176782 1212,182606 1212,189802 1212,212515 1212,232709 1212,234870 1212,247699 1212,254305 1213,104 1213,111 1213,225 1213,254 1213,264 1213,557 1213,588 1213,590 1213,631 1213,736 1213,760 1213,772 1213,784 1213,1085 1213,1282 1213,1332 1213,1381 1213,1962 1213,3069 1214,111 1215,698 1216,163 1216,305 1216,447 1216,1132 1216,1201 1216,8501 1216,15573 1216,75912 1217,97 1217,269 1217,861 1218,34 1218,35 1218,50 1218,56 1218,79 1218,99 1218,192 1218,278 1218,333 1218,336 1218,406 1218,602 1218,620 1218,622 1218,779 1218,841 1218,1181 1218,1247 1218,1515 1218,2244 1218,2931 1218,23783 1218,240174 1219,134 1219,355 1219,527 1219,743 1219,1983 1219,4810 1219,8714 1219,95583 1220,63 1220,106 1220,202 1220,203 1220,251 1220,252 1220,275 1220,277 1220,318 1220,389 1220,457 1220,465 1220,493 1220,516 1220,599 1220,682 1220,685 1220,733 1220,849 1220,911 1220,1011 1220,1118 1220,1220 1220,1222 1220,1243 1220,1263 1220,1370 1220,1512 1220,1568 1220,1572 1220,1655 1220,1792 1220,1973 1220,2775 1220,2874 1220,4066 1220,4159 1220,5816 1220,5992 1220,6816 1220,7103 1220,7952 1220,9053 1220,9107 1220,13374 1220,13720 1220,15243 1220,15733 1220,16010 1220,16487 1220,17884 1220,19304 1220,19866 1220,19897 1220,20268 1220,20269 1220,20295 1220,21981 1220,21994 1220,22204 1220,23650 1220,23734 1220,25839 1220,26179 1220,26469 1220,26856 1220,26857 1220,26859 1220,26869 1220,26965 1220,27495 1220,29638 1220,34374 1220,37530 1220,38458 1220,38899 1220,39012 1220,39034 1220,40542 1220,40763 1220,41170 1220,46134 1220,47402 1220,47728 1220,49195 1220,49197 1220,49198 1220,54373 1220,54508 1220,56412 1220,61021 1220,64563 1220,71837 1220,72439 1220,73510 1220,75709 1220,75912 1220,78825 1220,81835 1220,82349 1220,82838 1220,84005 1220,85752 1220,87274 1220,90771 1220,91341 1220,101686 1220,102789 1220,103966 1220,104605 1220,107759 1220,108159 1220,111422 1220,113745 1220,116534 1220,118331 1220,118401 1220,133707 1220,135765 1220,136306 1220,138822 1220,138825 1220,149264 1220,157974 1220,161264 1220,164328 1220,165762 1220,167633 1220,168280 1220,168595 1220,174681 1220,174739 1220,175283 1220,176895 1220,176993 1220,178002 1220,178729 1220,182834 1220,185354 1220,189788 1220,189842 1220,197678 1220,199494 1220,201028 1220,201188 1220,203055 1220,205828 1220,206989 1220,207064 1220,215276 1220,215451 1220,219970 1220,223738 1220,229821 1220,229905 1220,230333 1220,230411 1220,231803 1220,239038 1220,249160 1220,249198 1220,249629 1220,252565 1220,254347 1220,255407 1220,259550 1221,178 1221,622 1221,1033 1221,2178 1221,4545 1222,1220 1222,1222 1223,1224 1225,710 1226,1227 1226,1229 1227,1227 1227,1229 1227,5156 1227,16050 1227,17114 1227,23713 1228,160 1230,1231 1230,1908 1231,37 1231,46 1231,301 1231,567 1231,599 1231,604 1231,615 1231,663 1231,664 1231,698 1231,717 1231,783 1231,818 1231,838 1231,907 1231,937 1231,968 1231,972 1231,973 1231,1011 1231,1210 1231,1230 1231,1231 1231,1284 1231,1293 1231,1300 1231,1564 1231,1782 1231,1837 1231,1973 1231,2217 1231,2509 1231,2595 1231,2689 1231,2979 1231,3182 1231,3351 1231,3379 1231,3422 1231,3756 1231,3809 1231,4683 1231,5662 1231,6398 1231,6712 1231,6778 1231,7222 1231,13523 1231,14916 1231,17894 1231,20628 1231,26433 1231,27003 1231,27031 1231,28317 1231,30253 1231,36033 1231,38921 1231,41878 1231,46804 1231,46868 1231,48121 1231,48218 1231,48305 1231,48380 1231,48672 1231,52547 1231,53203 1231,62449 1231,65930 1231,83262 1231,84719 1231,99626 1231,107973 1231,111348 1231,117480 1231,122159 1231,124607 1231,126475 1231,131033 1231,140705 1231,146979 1231,147311 1231,149320 1231,151552 1231,167732 1231,167790 1231,168843 1231,174621 1231,177514 1231,194560 1231,212010 1231,225463 1231,227376 1231,227459 1231,233481 1231,240422 1231,241077 1231,244037 1231,255100 1231,262517 1232,527 1233,158 1233,1235 1233,25573 1234,1179 1235,5 1235,25 1235,26 1235,47 1235,59 1235,60 1235,94 1235,104 1235,111 1235,116 1235,117 1235,118 1235,138 1235,184 1235,186 1235,211 1235,248 1235,292 1235,314 1235,323 1235,327 1235,330 1235,425 1235,430 1235,441 1235,446 1235,510 1235,599 1235,612 1235,868 1235,885 1235,886 1235,887 1235,947 1235,967 1235,994 1235,1011 1235,1085 1235,1140 1235,1233 1235,1235 1235,1329 1235,1334 1235,1335 1235,1346 1235,1432 1235,1494 1235,1684 1235,1775 1235,1921 1235,2089 1235,2231 1235,2436 1235,2451 1235,2469 1235,2587 1235,2674 1235,2701 1235,2867 1235,2868 1235,2893 1235,2940 1235,3247 1235,3473 1235,3794 1235,3795 1235,3796 1235,3839 1235,4114 1235,4286 1235,4571 1235,4662 1235,4748 1235,4771 1235,5112 1235,5375 1235,5388 1235,5574 1235,5627 1235,5700 1235,5701 1235,5803 1235,5871 1235,5889 1235,6012 1235,6208 1235,6209 1235,6621 1235,6824 1235,7084 1235,7124 1235,7144 1235,7206 1235,7222 1235,7263 1235,7271 1235,7766 1235,7779 1235,7880 1235,8092 1235,8281 1235,8355 1235,8356 1235,8357 1235,8557 1235,8801 1235,9156 1235,9355 1235,9356 1235,9357 1235,9358 1235,9359 1235,9542 1235,9787 1235,13131 1235,13644 1235,13662 1235,13704 1235,14080 1235,14220 1235,14372 1235,14373 1235,14755 1235,14863 1235,14864 1235,14866 1235,15370 1235,15378 1235,15675 1235,15682 1235,15730 1235,15737 1235,15742 1235,15795 1235,15957 1235,15959 1235,16099 1235,16386 1235,16775 1235,18125 1235,18158 1235,18484 1235,18518 1235,19203 1235,19558 1235,19798 1235,19893 1235,20111 1235,20227 1235,20294 1235,20485 1235,20486 1235,20611 1235,20676 1235,20828 1235,21559 1235,21944 1235,22643 1235,22781 1235,22851 1235,22880 1235,23111 1235,23704 1235,24843 1235,25120 1235,25636 1235,25707 1235,25764 1235,25821 1235,26061 1235,26908 1235,26946 1235,27013 1235,27656 1235,27695 1235,27886 1235,27985 1235,28403 1235,28408 1235,28462 1235,28650 1235,28651 1235,28679 1235,29047 1235,29386 1235,29387 1235,29421 1235,29423 1235,29713 1235,29982 1235,30111 1235,30350 1235,32278 1235,32280 1235,32365 1235,32754 1235,32755 1235,32938 1235,33155 1235,33158 1235,33383 1235,33444 1235,34060 1235,34986 1235,36637 1235,37595 1235,38258 1235,38437 1235,40282 1235,40367 1235,40370 1235,40461 1235,41493 1235,41954 1235,42601 1235,42679 1235,42813 1235,42814 1235,42935 1235,42989 1235,43172 1235,43173 1235,43983 1235,44136 1235,44244 1235,44380 1235,45090 1235,45701 1235,46873 1235,47808 1235,48344 1235,48770 1235,48974 1235,49320 1235,49498 1235,49811 1235,50323 1235,51146 1235,53829 1235,53885 1235,53886 1235,56274 1235,57249 1235,57330 1235,59523 1235,60435 1235,60625 1235,60724 1235,62624 1235,63565 1235,64526 1235,64583 1235,64584 1235,64587 1235,65681 1235,66716 1235,66794 1235,66795 1235,66909 1235,67717 1235,67927 1235,67999 1235,68000 1235,68393 1235,68947 1235,69723 1235,69790 1235,70324 1235,70485 1235,70486 1235,70488 1235,70491 1235,70506 1235,70927 1235,71229 1235,71809 1235,72011 1235,73582 1235,74210 1235,74211 1235,74231 1235,74745 1235,75281 1235,75295 1235,77101 1235,78745 1235,79775 1235,80265 1235,80631 1235,81293 1235,81294 1235,82164 1235,85629 1235,85719 1235,85779 1235,85830 1235,86222 1235,86380 1235,87835 1235,88820 1235,92787 1235,92788 1235,92789 1235,92790 1235,92791 1235,92792 1235,92793 1235,93839 1235,93974 1235,94209 1235,94438 1235,94906 1235,95171 1235,95172 1235,95499 1235,96315 1235,96687 1235,96914 1235,96915 1235,97495 1235,98884 1235,99328 1235,99332 1235,99728 1235,99729 1235,101130 1235,102248 1235,102561 1235,102842 1235,105748 1235,105811 1235,106520 1235,106617 1235,107040 1235,107212 1235,108642 1235,109498 1235,110008 1235,110377 1235,110378 1235,110381 1235,110386 1235,110387 1235,113783 1235,115688 1235,117293 1235,117581 1235,117583 1235,121825 1235,122149 1235,122746 1235,123689 1235,124939 1235,125650 1235,125651 1235,126005 1235,126831 1235,127725 1235,128054 1235,128055 1235,128057 1235,128262 1235,128525 1235,129728 1235,129740 1235,130260 1235,132593 1235,133831 1235,134297 1235,135202 1235,135203 1235,135204 1235,135205 1235,135206 1235,135207 1235,135208 1235,135209 1235,135210 1235,135211 1235,135212 1235,135213 1235,135214 1235,135307 1235,135308 1235,135450 1235,135769 1235,135778 1235,135779 1235,135863 1235,137782 1235,137783 1235,138553 1235,138554 1235,138568 1235,140579 1235,141140 1235,141160 1235,142094 1235,142095 1235,142439 1235,142591 1235,142850 1235,142853 1235,145186 1235,145221 1235,145529 1235,146174 1235,146524 1235,147641 1235,148076 1235,148077 1235,148697 1235,148907 1235,148987 1235,149565 1235,150009 1235,151515 1235,151516 1235,154571 1235,154572 1235,154690 1235,154903 1235,155054 1235,157376 1235,157456 1235,157531 1235,158473 1235,158870 1235,158961 1235,159939 1235,160275 1235,163645 1235,164100 1235,165141 1235,165345 1235,165346 1235,166622 1235,168101 1235,168102 1235,169275 1235,169276 1235,169277 1235,169762 1235,170177 1235,173188 1235,174282 1235,176692 1235,176836 1235,176855 1235,180856 1235,184272 1235,189844 1235,189905 1235,191046 1235,191047 1235,192533 1235,192667 1235,192779 1235,192989 1235,193108 1235,193535 1235,194996 1235,195061 1235,195834 1235,197474 1235,197483 1235,198284 1235,198476 1235,198477 1235,199304 1235,200793 1235,203198 1235,203764 1235,203765 1235,204734 1235,205222 1235,212541 1235,212542 1235,213541 1235,214461 1235,214462 1235,216234 1235,216235 1235,218687 1235,219054 1235,219373 1235,219466 1235,219467 1235,219468 1235,219469 1235,219524 1235,220176 1235,225949 1235,227746 1235,227791 1235,227886 1235,227887 1235,231835 1235,231836 1235,231837 1235,231838 1235,232229 1235,232230 1235,233810 1235,235702 1235,235703 1235,235704 1235,237111 1235,237899 1235,237929 1235,240700 1235,241353 1235,243692 1235,243730 1235,243732 1235,246280 1235,250340 1235,251101 1235,251708 1235,251730 1235,252276 1235,252769 1235,253331 1235,256255 1235,257139 1235,257521 1235,257522 1235,257599 1235,260145 1235,260595 1235,260596 1235,260856 1235,260857 1235,260983 1236,328 1237,1238 1238,10 1238,107 1238,178 1238,292 1238,441 1238,446 1238,462 1238,502 1238,685 1238,745 1238,818 1238,978 1238,1025 1238,1235 1238,1238 1238,1335 1238,1572 1238,1583 1238,1653 1238,1668 1238,1722 1238,2209 1238,2379 1238,3009 1238,3367 1238,3538 1238,3830 1238,4114 1238,4771 1238,5265 1238,6621 1238,6824 1238,7519 1238,16426 1238,21944 1238,26051 1238,29143 1238,29848 1238,32816 1238,32978 1238,39517 1238,40560 1238,41887 1238,42080 1238,42766 1238,43143 1238,44130 1238,44522 1238,47735 1238,47749 1238,47761 1238,48170 1238,48190 1238,49012 1238,49017 1238,49019 1238,49022 1238,51146 1238,52815 1238,54636 1238,55064 1238,56907 1238,61280 1238,66389 1238,67557 1238,68670 1238,69144 1238,69867 1238,74599 1238,74603 1238,74626 1238,76057 1238,79369 1238,80108 1238,95330 1238,98923 1238,101859 1238,101889 1238,105479 1238,107757 1238,121349 1238,124210 1238,126831 1238,136029 1238,136150 1238,168847 1238,183326 1238,186567 1238,205015 1238,212179 1238,212910 1238,218461 1238,218475 1238,219027 1238,219834 1238,219910 1238,219977 1238,219995 1238,221229 1238,221490 1238,231735 1238,236007 1238,236078 1238,236133 1238,238089 1238,238092 1238,238193 1238,238297 1238,239415 1238,246786 1238,251290 1238,257032 1239,1240 1240,10 1240,32 1240,87 1240,175 1240,217 1240,312 1240,314 1240,392 1240,425 1240,455 1240,457 1240,467 1240,499 1240,535 1240,599 1240,623 1240,644 1240,676 1240,685 1240,693 1240,697 1240,808 1240,809 1240,818 1240,838 1240,849 1240,852 1240,903 1240,911 1240,918 1240,919 1240,972 1240,1011 1240,1014 1240,1140 1240,1143 1240,1151 1240,1210 1240,1239 1240,1240 1240,1262 1240,1276 1240,1345 1240,1363 1240,1417 1240,1444 1240,1454 1240,1465 1240,1487 1240,1513 1240,1564 1240,1634 1240,1653 1240,1656 1240,1663 1240,1769 1240,1796 1240,1805 1240,1860 1240,1949 1240,1973 1240,1986 1240,2246 1240,2406 1240,2418 1240,2494 1240,2511 1240,2522 1240,2541 1240,2548 1240,2699 1240,2810 1240,3003 1240,3260 1240,3507 1240,3524 1240,3582 1240,3699 1240,3781 1240,3786 1240,3880 1240,3916 1240,4105 1240,4184 1240,4416 1240,4514 1240,4760 1240,5380 1240,5469 1240,5540 1240,5869 1240,5880 1240,6042 1240,6045 1240,6059 1240,6552 1240,6781 1240,6890 1240,6893 1240,7098 1240,7326 1240,7731 1240,7968 1240,8190 1240,8658 1240,8660 1240,9729 1240,13139 1240,13222 1240,13389 1240,13429 1240,13444 1240,14249 1240,15207 1240,15303 1240,15417 1240,15575 1240,16357 1240,16541 1240,16566 1240,16914 1240,17115 1240,17291 1240,18156 1240,18295 1240,18333 1240,18711 1240,18740 1240,18765 1240,18772 1240,18960 1240,19366 1240,19410 1240,19777 1240,19814 1240,20228 1240,20426 1240,20427 1240,20757 1240,21380 1240,21589 1240,22148 1240,22189 1240,22197 1240,22314 1240,22408 1240,23634 1240,23730 1240,24801 1240,26161 1240,26196 1240,27042 1240,28207 1240,28450 1240,29136 1240,29847 1240,31414 1240,32688 1240,32978 1240,37060 1240,37219 1240,37426 1240,37823 1240,38486 1240,40575 1240,44510 1240,44732 1240,44780 1240,44972 1240,46032 1240,46368 1240,47090 1240,48299 1240,50160 1240,50875 1240,53310 1240,54341 1240,54557 1240,55156 1240,56982 1240,58278 1240,59918 1240,61144 1240,62414 1240,63503 1240,64823 1240,65753 1240,67896 1240,68681 1240,70110 1240,70114 1240,70121 1240,70132 1240,70136 1240,70147 1240,70200 1240,70206 1240,70235 1240,70277 1240,70280 1240,70665 1240,70941 1240,70961 1240,71032 1240,71033 1240,71046 1240,71060 1240,71747 1240,71986 1240,71987 1240,72673 1240,72902 1240,73114 1240,73115 1240,73117 1240,73447 1240,73578 1240,76096 1240,76704 1240,76989 1240,77547 1240,79528 1240,79988 1240,80577 1240,82739 1240,83362 1240,83765 1240,86005 1240,86430 1240,86679 1240,86724 1240,87304 1240,87307 1240,87308 1240,87313 1240,87320 1240,87686 1240,88400 1240,89576 1240,89629 1240,89630 1240,90360 1240,90847 1240,91620 1240,93519 1240,94284 1240,94292 1240,94294 1240,94304 1240,94772 1240,94993 1240,95724 1240,96630 1240,99602 1240,99720 1240,101896 1240,103319 1240,103801 1240,103896 1240,104491 1240,104522 1240,106723 1240,107140 1240,108128 1240,110479 1240,111330 1240,112500 1240,112789 1240,112896 1240,112923 1240,113067 1240,113240 1240,113580 1240,113986 1240,114017 1240,114158 1240,115583 1240,116060 1240,116091 1240,116177 1240,116569 1240,116590 1240,117685 1240,119266 1240,119301 1240,119381 1240,119431 1240,119718 1240,119890 1240,121473 1240,122419 1240,122616 1240,125644 1240,125900 1240,127158 1240,128299 1240,129715 1240,129716 1240,129865 1240,130498 1240,131178 1240,131420 1240,136161 1240,136186 1240,136187 1240,142340 1240,142564 1240,142887 1240,148273 1240,150273 1240,152391 1240,152712 1240,153232 1240,153648 1240,154405 1240,154406 1240,154411 1240,155623 1240,156043 1240,156303 1240,156345 1240,157128 1240,157344 1240,158594 1240,158619 1240,158915 1240,158999 1240,159092 1240,160378 1240,160444 1240,161105 1240,161260 1240,161270 1240,162175 1240,162252 1240,162322 1240,162948 1240,163009 1240,163929 1240,164191 1240,165017 1240,165023 1240,167177 1240,169049 1240,169910 1240,169972 1240,171262 1240,172684 1240,177940 1240,178677 1240,179693 1240,179774 1240,179860 1240,179866 1240,183008 1240,185465 1240,188758 1240,189714 1240,195147 1240,195581 1240,201805 1240,203979 1240,204858 1240,205273 1240,214210 1240,215462 1240,216573 1240,217555 1240,219851 1240,222440 1240,224611 1240,227071 1240,228613 1240,232692 1240,237707 1240,238996 1240,240860 1240,245307 1240,246001 1240,246127 1240,247171 1240,249692 1240,254196 1240,255755 1240,256249 1240,257486 1240,257994 1240,258211 1240,259624 1240,260369 1240,262322 1240,264546 1240,264746 1241,10 1241,46 1241,86 1241,167 1241,299 1241,338 1241,459 1241,528 1241,563 1241,589 1241,599 1241,744 1241,783 1241,808 1241,818 1241,973 1241,1001 1241,1010 1241,1012 1241,1013 1241,1167 1241,1241 1241,1276 1241,1319 1241,1479 1241,1522 1241,1544 1241,1564 1241,1584 1241,1849 1241,1973 1241,2083 1241,2193 1241,2253 1241,2372 1241,2557 1241,2595 1241,2617 1241,2689 1241,2810 1241,2832 1241,2840 1241,3218 1241,3422 1241,3507 1241,3774 1241,3885 1241,4039 1241,4240 1241,4283 1241,4565 1241,5301 1241,5662 1241,6559 1241,6650 1241,6880 1241,7057 1241,7222 1241,8149 1241,8172 1241,8193 1241,8316 1241,13354 1241,13506 1241,13593 1241,14358 1241,14414 1241,16667 1241,17327 1241,17877 1241,18249 1241,18266 1241,18678 1241,19568 1241,20229 1241,23480 1241,24531 1241,26125 1241,26876 1241,27578 1241,29007 1241,29781 1241,30328 1241,31299 1241,31746 1241,32784 1241,32836 1241,33338 1241,33442 1241,33809 1241,34112 1241,34377 1241,35394 1241,36589 1241,37519 1241,37694 1241,38244 1241,38794 1241,48225 1241,49236 1241,51223 1241,54121 1241,54426 1241,56322 1241,57182 1241,59143 1241,60564 1241,62160 1241,62453 1241,63097 1241,63353 1241,68625 1241,72673 1241,72726 1241,73293 1241,73368 1241,73991 1241,75136 1241,76087 1241,76218 1241,80738 1241,81091 1241,82175 1241,87923 1241,93027 1241,96356 1241,99525 1241,99626 1241,100305 1241,101551 1241,106851 1241,107284 1241,109267 1241,116146 1241,121554 1241,123594 1241,127158 1241,131722 1241,131783 1241,132895 1241,133545 1241,134206 1241,135700 1241,140785 1241,141607 1241,143952 1241,145577 1241,149167 1241,149168 1241,150422 1241,151514 1241,152007 1241,155390 1241,157002 1241,157671 1241,158302 1241,159460 1241,163359 1241,166481 1241,169466 1241,171467 1241,177014 1241,178573 1241,182783 1241,185404 1241,185453 1241,192875 1241,195122 1241,197916 1241,199199 1241,200853 1241,214807 1241,215939 1241,215940 1241,215955 1241,219774 1241,231633 1241,233307 1241,236252 1241,236670 1241,236778 1241,247791 1241,249197 1241,258930 1242,138 1242,313 1242,332 1242,682 1242,694 1242,996 1242,1985 1242,2315 1242,2646 1242,2775 1242,3623 1242,8180 1242,72439 1243,10 1243,20 1243,63 1243,175 1243,202 1243,203 1243,251 1243,252 1243,275 1243,356 1243,446 1243,493 1243,516 1243,663 1243,673 1243,682 1243,685 1243,733 1243,838 1243,849 1243,852 1243,911 1243,1014 1243,1175 1243,1220 1243,1222 1243,1243 1243,1244 1243,1266 1243,1512 1243,1568 1243,1655 1243,1844 1243,1927 1243,2033 1243,2400 1243,2552 1243,2561 1243,3452 1243,4273 1243,4385 1243,5992 1243,6450 1243,6924 1243,7087 1243,7532 1243,7794 1243,7862 1243,9579 1243,13171 1243,13636 1243,14674 1243,16458 1243,16652 1243,18908 1243,19592 1243,20295 1243,20419 1243,20563 1243,21706 1243,22467 1243,23662 1243,26703 1243,26768 1243,27495 1243,28377 1243,30431 1243,31136 1243,31177 1243,31306 1243,32636 1243,34221 1243,39467 1243,40655 1243,42787 1243,44437 1243,44441 1243,47152 1243,56992 1243,67217 1243,70930 1243,71297 1243,72439 1243,74446 1243,78990 1243,79359 1243,89755 1243,90780 1243,91442 1243,91791 1243,91895 1243,92881 1243,93024 1243,94829 1243,94906 1243,101618 1243,101902 1243,106332 1243,107420 1243,107518 1243,111775 1243,111781 1243,113901 1243,113938 1243,116960 1243,123024 1243,124514 1243,124584 1243,129797 1243,141823 1243,141997 1243,145627 1243,147559 1243,147624 1243,148658 1243,148758 1243,153684 1243,159401 1243,164006 1243,165595 1243,168994 1243,169828 1243,179829 1243,189788 1243,189839 1243,189842 1243,193042 1243,198101 1243,200636 1243,206297 1243,212381 1243,214892 1243,215276 1243,248650 1245,626 1246,852 1246,957 1246,1247 1246,1815 1246,14650 1246,109503 1247,10 1247,171 1247,175 1247,184 1247,841 1247,957 1247,1218 1247,1246 1247,1247 1247,1815 1247,2244 1247,2559 1247,2866 1247,3037 1247,4384 1247,4388 1247,4391 1247,5244 1247,5288 1247,5377 1247,7159 1247,7241 1247,8176 1247,8198 1247,8982 1247,13556 1247,14507 1247,14650 1247,15003 1247,15236 1247,17356 1247,18919 1247,19458 1247,19624 1247,19662 1247,20772 1247,21853 1247,22389 1247,25599 1247,26744 1247,27890 1247,27912 1247,28222 1247,28235 1247,28932 1247,28953 1247,29027 1247,29058 1247,38836 1247,39532 1247,39994 1247,53167 1247,58476 1247,59133 1247,60699 1247,61071 1247,61645 1247,62153 1247,62903 1247,63104 1247,63167 1247,63629 1247,65198 1247,65725 1247,69585 1247,70981 1247,72864 1247,73386 1247,77020 1247,77107 1247,78661 1247,79654 1247,80427 1247,86343 1247,92378 1247,92380 1247,93562 1247,93577 1247,96322 1247,97549 1247,99834 1247,102431 1247,103409 1247,108102 1247,109503 1247,118357 1247,118784 1247,119603 1247,121536 1247,121928 1247,125525 1247,130240 1247,135585 1247,137830 1247,140811 1247,141578 1247,144691 1247,145491 1247,145569 1247,160746 1247,162276 1247,163588 1247,163793 1247,164572 1248,305 1249,422 1250,217 1250,1417 1251,24 1251,25 1251,26 1251,28 1251,33 1251,40 1251,47 1251,59 1251,60 1251,114 1251,115 1251,118 1251,330 1251,885 1251,886 1251,887 1251,994 1251,1235 1251,1252 1251,1253 1251,1254 1251,1255 1251,1432 1251,1775 1251,2088 1251,2469 1251,2674 1251,3561 1251,5708 1251,9343 1251,9537 1251,9539 1251,9540 1251,9541 1251,9542 1251,21944 1251,41967 1251,44244 1251,135232 1251,154690 1251,171294 1252,4 1252,5 1252,442 1252,714 1252,805 1252,1227 1252,1252 1252,1253 1252,21944 1252,86416 1253,330 1253,805 1253,1235 1253,1335 1254,2674 1254,21944 1255,1888 1256,1257 1257,81 1257,104 1257,215 1257,503 1257,609 1257,704 1257,805 1257,1149 1257,1212 1257,1256 1257,1257 1257,1270 1257,1359 1257,1402 1257,2315 1257,2429 1257,2708 1257,3084 1257,3623 1257,6171 1257,7366 1257,7423 1257,8546 1257,14148 1257,17681 1257,19804 1257,21867 1257,23710 1257,28287 1257,30598 1257,33383 1257,37575 1257,37607 1257,39083 1257,41319 1257,41889 1257,41969 1257,43859 1257,62596 1257,66348 1257,66806 1257,86042 1257,90326 1257,99197 1257,106381 1257,107640 1257,109842 1257,114581 1257,124864 1257,128728 1257,131713 1257,134164 1257,151352 1257,158049 1257,160450 1257,161718 1257,167343 1257,175416 1257,179267 1257,182162 1257,189618 1257,192587 1257,206272 1257,206276 1257,216645 1257,216783 1257,222629 1258,636 1258,877 1258,1117 1259,932 1259,1260 1261,1 1261,1167 1262,1 1262,86 1262,134 1262,138 1262,147 1262,206 1262,227 1262,259 1262,336 1262,360 1262,406 1262,439 1262,452 1262,481 1262,493 1262,497 1262,604 1262,668 1262,713 1262,859 1262,873 1262,911 1262,1001 1262,1007 1262,1010 1262,1163 1262,1240 1262,1267 1262,1293 1262,1332 1262,1417 1262,1434 1262,1454 1262,1518 1262,1650 1262,1808 1262,1844 1262,1860 1262,2580 1262,3260 1262,3721 1262,3967 1262,4276 1262,5192 1262,5213 1262,5276 1262,5405 1262,5551 1262,6423 1262,6852 1262,6861 1262,7022 1262,7905 1262,10792 1262,13207 1262,14674 1262,24734 1262,25282 1262,57851 1262,58455 1262,75912 1262,76704 1262,81508 1262,83875 1262,85979 1262,131274 1262,140019 1262,152533 1262,167007 1262,203230 1263,251 1263,252 1263,1220 1263,1222 1264,163 1264,209 1264,302 1264,579 1264,868 1264,893 1264,1556 1264,1849 1265,1265 1265,1266 1266,202 1266,203 1266,275 1266,277 1266,493 1266,733 1266,760 1266,1011 1266,1149 1266,1175 1266,1243 1266,1265 1266,1266 1266,1631 1267,10 1267,104 1267,182 1267,314 1267,397 1267,452 1267,457 1267,509 1267,535 1267,599 1267,673 1267,685 1267,723 1267,838 1267,843 1267,849 1267,872 1267,972 1267,1011 1267,1014 1267,1087 1267,1118 1267,1130 1267,1191 1267,1204 1267,1262 1267,1298 1267,1566 1267,1623 1267,1663 1267,2373 1267,3507 1267,4039 1267,4190 1267,6904 1267,9457 1267,19413 1267,25573 1267,26450 1267,28348 1267,215874 1267,223738 1267,229130 1268,518 1269,527 1270,503 1270,704 1270,1149 1271,972 1271,973 1271,1010 1271,1122 1271,1298 1271,69994 1271,90330 1271,90777 1271,90793 1272,130 1273,1274 1274,222 1274,278 1274,313 1274,379 1274,385 1274,389 1274,401 1274,404 1274,455 1274,536 1274,635 1274,849 1274,852 1274,1274 1274,1618 1274,1724 1274,1871 1274,2646 1274,4321 1274,5285 1274,5873 1274,6960 1274,7388 1274,7698 1274,8146 1274,8152 1274,8154 1274,8156 1274,8159 1274,8169 1274,8182 1274,9527 1274,13622 1274,20222 1274,25670 1274,32749 1274,32820 1274,33392 1274,40003 1274,41450 1274,43883 1274,46343 1274,55806 1274,57851 1274,66703 1274,66765 1274,73268 1274,74555 1274,75776 1274,78861 1274,84477 1274,94195 1274,98218 1274,103805 1274,110606 1274,114058 1274,141982 1274,142780 1274,147984 1274,148007 1274,148009 1274,148010 1274,148019 1274,148060 1274,149226 1274,149234 1274,158246 1274,159755 1274,159814 1274,159838 1274,159938 1274,160434 1274,160869 1274,161519 1274,164940 1274,168467 1274,169514 1274,171109 1274,171330 1274,171743 1274,172231 1274,173544 1274,180915 1274,181041 1274,186164 1274,192983 1274,193024 1274,200026 1274,207769 1274,211874 1274,219891 1274,219994 1274,220019 1274,220359 1274,220362 1274,220374 1274,221547 1274,221834 1274,231138 1274,232090 1274,235933 1274,236564 1274,236584 1274,236629 1274,238245 1274,249688 1274,259476 1275,439 1275,996 1276,46 1276,83 1276,99 1276,147 1276,167 1276,178 1276,207 1276,225 1276,233 1276,256 1276,299 1276,326 1276,388 1276,390 1276,392 1276,425 1276,444 1276,510 1276,589 1276,590 1276,609 1276,615 1276,623 1276,631 1276,671 1276,694 1276,744 1276,783 1276,795 1276,841 1276,873 1276,919 1276,934 1276,991 1276,992 1276,996 1276,1010 1276,1085 1276,1117 1276,1167 1276,1240 1276,1241 1276,1276 1276,1277 1276,1284 1276,1294 1276,1300 1276,1353 1276,1454 1276,1465 1276,1479 1276,1522 1276,1531 1276,1544 1276,1634 1276,1715 1276,1801 1276,1818 1276,1837 1276,1858 1276,1888 1276,1927 1276,1955 1276,2019 1276,2045 1276,2083 1276,2092 1276,2191 1276,2224 1276,2296 1276,2372 1276,2436 1276,2557 1276,2620 1276,2744 1276,2784 1276,3182 1276,3422 1276,3507 1276,3538 1276,3630 1276,4029 1276,4138 1276,4354 1276,4400 1276,5130 1276,5301 1276,5385 1276,6059 1276,6068 1276,6718 1276,7092 1276,8243 1276,9036 1276,13302 1276,14049 1276,14212 1276,14599 1276,15433 1276,18722 1276,19363 1276,23343 1276,24558 1276,25537 1276,25548 1276,26099 1276,26327 1276,30289 1276,32566 1276,32633 1276,33408 1276,33673 1276,35381 1276,35557 1276,35600 1276,37529 1276,42079 1276,44725 1276,46631 1276,46846 1276,46953 1276,48371 1276,49027 1276,50166 1276,54632 1276,55677 1276,59209 1276,60560 1276,64475 1276,65705 1276,74338 1276,74619 1276,76755 1276,85829 1276,89616 1276,95563 1276,96718 1276,98911 1276,106906 1276,112841 1276,133353 1276,137329 1276,157297 1276,186565 1276,201298 1276,238200 1276,248585 1276,259440 1277,209 1277,1276 1278,417 1279,503 1279,1052 1279,1179 1280,1147 1280,2989 1280,2991 1281,30 1281,34 1281,35 1281,175 1281,313 1281,328 1281,685 1281,693 1281,704 1281,772 1281,920 1281,1985 1281,3623 1281,4678 1281,7117 1281,81233 1282,40 1282,81 1282,104 1282,134 1282,135 1282,136 1282,137 1282,200 1282,215 1282,217 1282,289 1282,290 1282,327 1282,328 1282,557 1282,590 1282,631 1282,636 1282,677 1282,704 1282,714 1282,715 1282,760 1282,772 1282,953 1282,954 1282,1011 1282,1016 1282,1085 1282,1149 1282,1161 1282,1212 1282,1282 1282,1283 1282,1332 1282,1346 1282,1402 1282,1416 1282,1432 1282,1462 1282,1732 1282,1739 1282,1818 1282,1882 1282,2008 1282,2052 1282,2069 1282,2105 1282,2195 1282,2205 1282,2206 1282,2210 1282,2237 1282,2286 1282,2708 1282,2721 1282,3565 1282,3672 1282,4237 1282,4253 1282,4355 1282,4520 1282,4571 1282,5181 1282,5185 1282,6023 1282,6069 1282,7000 1282,7081 1282,8279 1282,8512 1282,9202 1282,9299 1282,9341 1282,13207 1282,14407 1282,14450 1282,14500 1282,14760 1282,15277 1282,15768 1282,16225 1282,16292 1282,16294 1282,18673 1282,18675 1282,20353 1282,20787 1282,21737 1282,22271 1282,22273 1282,22428 1282,23677 1282,26244 1282,27948 1282,28324 1282,32693 1282,32703 1282,32706 1282,33039 1282,33424 1282,34321 1282,37100 1282,37398 1282,37492 1282,39390 1282,40220 1282,42780 1282,43090 1282,43178 1282,48518 1282,49247 1282,49624 1282,50630 1282,54398 1282,57174 1282,58820 1282,59273 1282,59695 1282,72742 1282,73322 1282,74547 1282,74696 1282,75912 1282,83496 1282,84476 1282,88820 1282,91898 1282,93588 1282,94134 1282,98512 1282,101995 1282,102488 1282,102954 1282,103778 1282,105810 1282,105811 1282,107907 1282,118515 1282,119391 1282,121616 1282,123952 1282,124014 1282,124042 1282,125971 1282,128289 1282,128456 1282,129534 1282,133652 1282,137205 1282,140132 1282,141148 1282,143656 1282,147421 1282,147633 1282,152027 1282,152091 1282,152512 1282,152571 1282,160237 1282,160450 1282,161145 1282,161858 1282,164904 1282,164907 1282,165430 1282,169919 1282,170914 1282,171685 1282,172763 1282,176089 1282,182124 1282,182162 1282,196379 1282,204529 1282,206213 1282,212329 1282,213083 1282,217319 1282,219884 1282,220939 1282,231480 1282,237442 1282,237678 1282,240569 1282,245910 1282,247383 1282,249722 1282,250883 1282,251892 1282,253303 1283,1282 1284,34 1284,35 1284,46 1284,68 1284,86 1284,106 1284,167 1284,240 1284,299 1284,301 1284,314 1284,352 1284,356 1284,390 1284,425 1284,446 1284,452 1284,457 1284,518 1284,563 1284,567 1284,589 1284,631 1284,663 1284,693 1284,720 1284,750 1284,775 1284,801 1284,818 1284,838 1284,849 1284,852 1284,877 1284,878 1284,907 1284,929 1284,932 1284,972 1284,973 1284,982 1284,1001 1284,1010 1284,1011 1284,1014 1284,1045 1284,1085 1284,1117 1284,1119 1284,1122 1284,1130 1284,1210 1284,1276 1284,1284 1284,1298 1284,1300 1284,1317 1284,1326 1284,1360 1284,1434 1284,1436 1284,1479 1284,1487 1284,1522 1284,1544 1284,1566 1284,1659 1284,1715 1284,1732 1284,1796 1284,1837 1284,1849 1284,1853 1284,1889 1284,1957 1284,2063 1284,2083 1284,2191 1284,2193 1284,2252 1284,2253 1284,2372 1284,2479 1284,2480 1284,2557 1284,2840 1284,2979 1284,3207 1284,3218 1284,3422 1284,3455 1284,3507 1284,3804 1284,4043 1284,4213 1284,4286 1284,4362 1284,5181 1284,5213 1284,5662 1284,5949 1284,6539 1284,6822 1284,6904 1284,6955 1284,7234 1284,7303 1284,7440 1284,7530 1284,8032 1284,8272 1284,8617 1284,9640 1284,13217 1284,13252 1284,14290 1284,14565 1284,14572 1284,14681 1284,15073 1284,15159 1284,15202 1284,15272 1284,15630 1284,15633 1284,16869 1284,17154 1284,18570 1284,18679 1284,18717 1284,18742 1284,18832 1284,19525 1284,19701 1284,19943 1284,20055 1284,21095 1284,21249 1284,22544 1284,23565 1284,23850 1284,24107 1284,25350 1284,25413 1284,26341 1284,28114 1284,29757 1284,30373 1284,31294 1284,31785 1284,31796 1284,32688 1284,32784 1284,32863 1284,32939 1284,33466 1284,34296 1284,36805 1284,37328 1284,37503 1284,37735 1284,37857 1284,38299 1284,38319 1284,38959 1284,38974 1284,39562 1284,40547 1284,41588 1284,41900 1284,42528 1284,43394 1284,45195 1284,45853 1284,46165 1284,46250 1284,46323 1284,46742 1284,46825 1284,48545 1284,48895 1284,49125 1284,49247 1284,49512 1284,49647 1284,50522 1284,50585 1284,52528 1284,54504 1284,56445 1284,57085 1284,58224 1284,58289 1284,59264 1284,59361 1284,61089 1284,61121 1284,61411 1284,62439 1284,65897 1284,67151 1284,67936 1284,68839 1284,69679 1284,70154 1284,70376 1284,70435 1284,72764 1284,73570 1284,75912 1284,77844 1284,79533 1284,82113 1284,82745 1284,82763 1284,83345 1284,85873 1284,86488 1284,91842 1284,92017 1284,93607 1284,93624 1284,95118 1284,98219 1284,100233 1284,103207 1284,103735 1284,104253 1284,105780 1284,107162 1284,107616 1284,109838 1284,113124 1284,115681 1284,117099 1284,117480 1284,117735 1284,119510 1284,120449 1284,121425 1284,123105 1284,124668 1284,125400 1284,127158 1284,127872 1284,128382 1284,128742 1284,128934 1284,129477 1284,129776 1284,130442 1284,131399 1284,131778 1284,136182 1284,136192 1284,137058 1284,137059 1284,138084 1284,138136 1284,140052 1284,140115 1284,140116 1284,140379 1284,142985 1284,144332 1284,146047 1284,146505 1284,148742 1284,150114 1284,150116 1284,151676 1284,151933 1284,155145 1284,155708 1284,155827 1284,157108 1284,158261 1284,159116 1284,159723 1284,160490 1284,163057 1284,164915 1284,164918 1284,165669 1284,165894 1284,167395 1284,170349 1284,170742 1284,178252 1284,179336 1284,179392 1284,181948 1284,183747 1284,184496 1284,185467 1284,186690 1284,192627 1284,192629 1284,192668 1284,193765 1284,193978 1284,193980 1284,193981 1284,193982 1284,193983 1284,193985 1284,193988 1284,193991 1284,193992 1284,193993 1284,193995 1284,194147 1284,194149 1284,194150 1284,194151 1284,194152 1284,194153 1284,194154 1284,194155 1284,194157 1284,194158 1284,194159 1284,194160 1284,194369 1284,194371 1284,194373 1284,194374 1284,194386 1284,194388 1284,194407 1284,194532 1284,194533 1284,194537 1284,194540 1284,194543 1284,194546 1284,194547 1284,194645 1284,195028 1284,195168 1284,195169 1284,195172 1284,195173 1284,195180 1284,195188 1284,195197 1284,197614 1284,198244 1284,198700 1284,199273 1284,199511 1284,201880 1284,203986 1284,205673 1284,207175 1284,212321 1284,213069 1284,214246 1284,214718 1284,214862 1284,214949 1284,215429 1284,215432 1284,216050 1284,216148 1284,216155 1284,216172 1284,216175 1284,216185 1284,216778 1284,216782 1284,218867 1284,218869 1284,218870 1284,218873 1284,219808 1284,221176 1284,221896 1284,225694 1284,225738 1284,225747 1284,226221 1284,226885 1284,227207 1284,227333 1284,228269 1284,228439 1284,229230 1284,232032 1284,232219 1284,232220 1284,232234 1284,232235 1284,232236 1284,232237 1284,233472 1284,233869 1284,234140 1284,234171 1284,234803 1284,234804 1284,234807 1284,234976 1284,235263 1284,235955 1284,236014 1284,236150 1284,236341 1284,236448 1284,236982 1284,237464 1284,237465 1284,237466 1284,237467 1284,237468 1284,237469 1284,237470 1284,237471 1284,237529 1284,237530 1284,237531 1284,237532 1284,237533 1284,237534 1284,237535 1284,237559 1284,237565 1284,237717 1284,237718 1284,237719 1284,237720 1284,237917 1284,238074 1284,238079 1284,238122 1284,238174 1284,238176 1284,238177 1284,238179 1284,238180 1284,238183 1284,238223 1284,238227 1284,238241 1284,238246 1284,238247 1284,238277 1284,238285 1284,238286 1284,238287 1284,238288 1284,238290 1284,238291 1284,238292 1284,238293 1284,238295 1284,238296 1284,238355 1284,238685 1284,238782 1284,239915 1284,239934 1284,241944 1284,243328 1284,243333 1284,243340 1284,243344 1284,243346 1284,243348 1284,243349 1284,243351 1284,243352 1284,243540 1284,245377 1284,245413 1284,247838 1284,247843 1284,247844 1284,247845 1284,247846 1284,247847 1284,247849 1284,247851 1284,247853 1284,247854 1284,247856 1284,247859 1284,247860 1284,247864 1284,247866 1284,247869 1284,247870 1284,247872 1284,247874 1284,247903 1284,247904 1284,247907 1284,247909 1284,247910 1284,247914 1284,247915 1284,247917 1284,247918 1284,247919 1284,247920 1284,247922 1284,247925 1284,247926 1284,247927 1284,247928 1284,247929 1284,247930 1284,250760 1284,251511 1284,251538 1284,252543 1284,258952 1284,260158 1284,263792 1284,264489 1285,41 1285,68 1285,71 1285,175 1285,233 1285,240 1285,255 1285,261 1285,332 1285,356 1285,372 1285,390 1285,431 1285,444 1285,631 1285,677 1285,685 1285,715 1285,760 1285,794 1285,805 1285,818 1285,843 1285,849 1285,911 1285,968 1285,1001 1285,1004 1285,1011 1285,1045 1285,1061 1285,1080 1285,1082 1285,1085 1285,1118 1285,1119 1285,1203 1285,1209 1285,1285 1285,1309 1285,1361 1285,1462 1285,1564 1285,1807 1285,1818 1285,1888 1285,1935 1285,1955 1285,2208 1285,2417 1285,2512 1285,2518 1285,2590 1285,2620 1285,2775 1285,2991 1285,3028 1285,3135 1285,3585 1285,4179 1285,4308 1285,4619 1285,5242 1285,5278 1285,5398 1285,5407 1285,5412 1285,5693 1285,5718 1285,5765 1285,6824 1285,6837 1285,7728 1285,7812 1285,8537 1285,9015 1285,9178 1285,11147 1285,11952 1285,13296 1285,13478 1285,13637 1285,14195 1285,14243 1285,14487 1285,14723 1285,15169 1285,15325 1285,15952 1285,16684 1285,19617 1285,19868 1285,20038 1285,20287 1285,20813 1285,21964 1285,23102 1285,23382 1285,25800 1285,26781 1285,28289 1285,28314 1285,28553 1285,32751 1285,33147 1285,34139 1285,38232 1285,40850 1285,42599 1285,43247 1285,43846 1285,44330 1285,46302 1285,47173 1285,47750 1285,47751 1285,47753 1285,47757 1285,47758 1285,47760 1285,47766 1285,47767 1285,47768 1285,47770 1285,49671 1285,54551 1285,60385 1285,60467 1285,62823 1285,62903 1285,65769 1285,66572 1285,68058 1285,73231 1285,75184 1285,75912 1285,79619 1285,85931 1285,89690 1285,93959 1285,96342 1285,98922 1285,102001 1285,102797 1285,103052 1285,106214 1285,106222 1285,106224 1285,106229 1285,106234 1285,106245 1285,109587 1285,110070 1285,110088 1285,110092 1285,110100 1285,110105 1285,110555 1285,112530 1285,113760 1285,113939 1285,113982 1285,113987 1285,113989 1285,113991 1285,114092 1285,114127 1285,114135 1285,114679 1285,116598 1285,118144 1285,118224 1285,118362 1285,118523 1285,118542 1285,118544 1285,118548 1285,118552 1285,118560 1285,119064 1285,120199 1285,121573 1285,121921 1285,123439 1285,124651 1285,125115 1285,125953 1285,127158 1285,127414 1285,127424 1285,127429 1285,128159 1285,128163 1285,128752 1285,128769 1285,130463 1285,130546 1285,132604 1285,133955 1285,133988 1285,134140 1285,134276 1285,134576 1285,135072 1285,135083 1285,135107 1285,135216 1285,135957 1285,136529 1285,136737 1285,138318 1285,138335 1285,138349 1285,139543 1285,139652 1285,139981 1285,139993 1285,144998 1285,147812 1285,148116 1285,152960 1285,152978 1285,159425 1285,161624 1285,163961 1285,165387 1285,165451 1285,168497 1285,170032 1285,174543 1285,174987 1285,185067 1285,188887 1285,192129 1285,206230 1285,206453 1285,212899 1285,219904 1285,221666 1285,225852 1285,234745 1285,235798 1285,238121 1285,247366 1285,256802 1285,256986 1286,1287 1287,9005 1288,1289 1289,314 1289,599 1289,838 1289,992 1289,1011 1289,1289 1289,1293 1290,1 1290,206 1290,438 1290,996 1290,1096 1291,83 1292,516 1292,1175 1293,10 1293,20 1293,37 1293,46 1293,106 1293,126 1293,140 1293,163 1293,167 1293,186 1293,192 1293,195 1293,207 1293,259 1293,299 1293,301 1293,302 1293,314 1293,336 1293,372 1293,397 1293,441 1293,444 1293,446 1293,452 1293,457 1293,497 1293,505 1293,567 1293,599 1293,604 1293,605 1293,615 1293,631 1293,663 1293,668 1293,673 1293,676 1293,685 1293,698 1293,717 1293,764 1293,808 1293,811 1293,812 1293,813 1293,838 1293,843 1293,849 1293,918 1293,929 1293,937 1293,957 1293,968 1293,972 1293,1001 1293,1011 1293,1014 1293,1027 1293,1037 1293,1045 1293,1118 1293,1130 1293,1160 1293,1172 1293,1191 1293,1192 1293,1204 1293,1210 1293,1231 1293,1262 1293,1267 1293,1284 1293,1289 1293,1293 1293,1300 1293,1345 1293,1359 1293,1402 1293,1417 1293,1436 1293,1551 1293,1564 1293,1566 1293,1627 1293,1655 1293,1663 1293,1664 1293,1724 1293,1740 1293,1782 1293,1796 1293,1815 1293,1844 1293,1848 1293,1849 1293,1985 1293,1992 1293,2105 1293,2217 1293,2224 1293,2253 1293,2312 1293,2373 1293,2470 1293,2511 1293,2512 1293,2699 1293,3370 1293,3392 1293,3422 1293,3524 1293,3756 1293,3804 1293,3809 1293,3871 1293,4066 1293,4159 1293,4165 1293,4170 1293,4173 1293,4190 1293,4253 1293,4276 1293,4286 1293,4303 1293,4514 1293,4598 1293,5213 1293,5376 1293,5662 1293,5809 1293,5851 1293,6431 1293,6470 1293,6833 1293,6904 1293,6938 1293,7140 1293,7222 1293,7986 1293,8107 1293,9340 1293,9457 1293,13523 1293,14196 1293,14414 1293,14598 1293,14674 1293,15588 1293,16192 1293,16667 1293,17073 1293,17894 1293,18098 1293,18688 1293,20327 1293,20328 1293,20550 1293,20757 1293,21528 1293,21589 1293,22423 1293,23848 1293,25062 1293,25273 1293,26201 1293,26450 1293,28128 1293,28266 1293,28348 1293,28498 1293,28854 1293,30396 1293,33735 1293,34162 1293,34193 1293,37453 1293,38349 1293,38994 1293,41871 1293,42206 1293,42595 1293,42598 1293,46792 1293,48130 1293,50559 1293,59066 1293,60375 1293,62983 1293,63081 1293,63491 1293,70028 1293,70395 1293,72548 1293,72720 1293,73355 1293,74577 1293,75144 1293,75394 1293,75912 1293,76208 1293,76704 1293,76971 1293,79528 1293,80060 1293,80062 1293,80379 1293,82099 1293,83174 1293,83233 1293,84160 1293,88469 1293,90762 1293,92836 1293,94845 1293,96631 1293,96827 1293,99802 1293,102698 1293,103860 1293,108048 1293,109815 1293,110616 1293,111170 1293,111239 1293,117480 1293,119246 1293,119327 1293,120115 1293,120174 1293,121920 1293,121978 1293,122870 1293,122934 1293,124017 1293,124070 1293,124495 1293,124512 1293,124874 1293,126854 1293,127418 1293,128253 1293,130762 1293,130765 1293,133992 1293,134656 1293,135274 1293,136545 1293,136551 1293,145407 1293,146306 1293,147924 1293,148796 1293,149258 1293,150434 1293,150732 1293,154993 1293,155453 1293,158153 1293,158219 1293,158247 1293,158950 1293,159728 1293,160373 1293,160739 1293,160834 1293,160923 1293,170729 1293,171626 1293,171969 1293,175033 1293,175325 1293,176407 1293,178012 1293,180244 1293,181853 1293,182334 1293,182861 1293,185320 1293,189303 1293,191785 1293,193976 1293,194616 1293,195174 1293,199277 1293,207659 1293,207757 1293,211882 1293,212380 1293,215874 1293,216095 1293,216540 1293,217511 1293,219847 1293,221063 1293,221688 1293,221700 1293,221828 1293,221920 1293,222652 1293,224497 1293,226275 1293,226292 1293,227376 1293,231939 1293,234257 1293,236866 1293,237391 1293,241511 1293,241697 1293,243178 1293,247100 1293,247366 1293,247902 1293,248638 1293,252650 1293,254822 1293,257364 1293,258165 1293,260874 1293,261678 1293,263043 1294,20 1294,178 1294,314 1294,315 1294,346 1294,356 1294,397 1294,434 1294,435 1294,439 1294,440 1294,447 1294,538 1294,599 1294,671 1294,676 1294,766 1294,783 1294,934 1294,939 1294,996 1294,1033 1294,1068 1294,1294 1294,1295 1294,1328 1294,1409 1294,1474 1294,1590 1294,1612 1294,1619 1294,1644 1294,1651 1294,1789 1294,1877 1294,2030 1294,2085 1294,2094 1294,2102 1294,2224 1294,2352 1294,2353 1294,2427 1294,2590 1294,2777 1294,2782 1294,3990 1294,4190 1294,4461 1294,4646 1294,5078 1294,5189 1294,5460 1294,5563 1294,6268 1294,6422 1294,6586 1294,6607 1294,6648 1294,6661 1294,6883 1294,8196 1294,8477 1294,14111 1294,14428 1294,14739 1294,15141 1294,15179 1294,15355 1294,15563 1294,17423 1294,17427 1294,18124 1294,18613 1294,19191 1294,20539 1294,21152 1294,21442 1294,24934 1294,25384 1294,26972 1294,28425 1294,30775 1294,32468 1294,32745 1294,34935 1294,35082 1294,37000 1294,38158 1294,38420 1294,41449 1294,41804 1294,41926 1294,44348 1294,44990 1294,46171 1294,46717 1294,48290 1294,52792 1294,54295 1294,56474 1294,58239 1294,58820 1294,62984 1294,64061 1294,65709 1294,103720 1294,103772 1294,103860 1294,105721 1294,106377 1294,113469 1294,114282 1294,120155 1294,120826 1294,122562 1294,123594 1294,124440 1294,126696 1294,128831 1294,128874 1294,129955 1294,133112 1294,135980 1294,135992 1294,135993 1294,135994 1294,135995 1294,135996 1294,135997 1294,135998 1294,136000 1294,136005 1294,136006 1294,136007 1294,136008 1294,136010 1294,138019 1294,138020 1294,138021 1294,138022 1294,138023 1294,138024 1294,138025 1294,138026 1294,138027 1294,146396 1294,160834 1294,163378 1294,169627 1294,170478 1294,171015 1294,176816 1294,177776 1294,189147 1294,189169 1294,189814 1294,190182 1294,190242 1294,190456 1294,190492 1294,192036 1294,192451 1294,194457 1294,205359 1294,211944 1294,213607 1294,213890 1294,214042 1294,214160 1294,214872 1294,214878 1294,215226 1294,215262 1294,216376 1294,218112 1294,221094 1294,223355 1294,226393 1294,227172 1294,228310 1294,231001 1294,233562 1294,243353 1294,244189 1294,247107 1294,249749 1295,1294 1296,611 1296,255750 1297,907 1297,972 1297,973 1297,1010 1297,1298 1297,1749 1297,1849 1297,72764 1298,10 1298,11 1298,86 1298,126 1298,167 1298,186 1298,256 1298,264 1298,299 1298,301 1298,314 1298,356 1298,440 1298,446 1298,452 1298,457 1298,459 1298,563 1298,599 1298,631 1298,663 1298,664 1298,666 1298,673 1298,693 1298,720 1298,744 1298,783 1298,818 1298,907 1298,937 1298,972 1298,973 1298,982 1298,991 1298,1001 1298,1010 1298,1011 1298,1033 1298,1052 1298,1118 1298,1122 1298,1167 1298,1267 1298,1284 1298,1297 1298,1298 1298,1360 1298,1370 1298,1436 1298,1453 1298,1531 1298,1559 1298,1566 1298,1591 1298,1616 1298,1659 1298,1732 1298,1740 1298,1749 1298,1796 1298,1837 1298,1849 1298,1853 1298,1973 1298,1991 1298,2191 1298,2253 1298,2263 1298,2266 1298,2307 1298,2312 1298,2334 1298,2595 1298,2610 1298,2625 1298,2728 1298,2747 1298,2979 1298,2989 1298,2991 1298,3023 1298,3392 1298,3585 1298,3756 1298,3838 1298,3965 1298,4066 1298,4183 1298,4243 1298,4286 1298,4315 1298,4359 1298,4381 1298,4413 1298,4696 1298,5130 1298,5185 1298,5654 1298,5747 1298,5851 1298,6194 1298,6685 1298,6695 1298,7130 1298,7349 1298,7388 1298,7530 1298,7936 1298,8051 1298,8240 1298,9766 1298,13657 1298,13761 1298,13771 1298,14484 1298,14497 1298,15183 1298,15253 1298,15330 1298,15409 1298,15674 1298,15754 1298,16320 1298,17840 1298,19874 1298,21753 1298,22148 1298,23844 1298,24579 1298,26219 1298,26409 1298,28716 1298,28785 1298,30376 1298,30484 1298,31283 1298,31900 1298,32784 1298,33083 1298,34073 1298,34140 1298,34282 1298,35065 1298,35470 1298,36652 1298,36662 1298,36670 1298,37556 1298,37771 1298,38996 1298,39047 1298,39979 1298,41315 1298,41549 1298,41880 1298,42158 1298,42803 1298,43137 1298,43193 1298,43207 1298,43288 1298,43875 1298,44738 1298,45448 1298,46236 1298,48662 1298,49005 1298,49023 1298,49024 1298,49031 1298,49057 1298,49105 1298,49116 1298,51684 1298,52539 1298,55222 1298,55231 1298,56365 1298,56370 1298,56520 1298,57158 1298,57209 1298,58282 1298,58486 1298,58547 1298,59162 1298,59226 1298,59675 1298,59934 1298,62814 1298,64154 1298,64457 1298,65379 1298,68700 1298,70237 1298,72764 1298,73827 1298,80137 1298,80659 1298,80771 1298,82055 1298,82257 1298,86478 1298,89937 1298,90183 1298,91190 1298,91488 1298,95576 1298,97423 1298,98227 1298,99642 1298,99825 1298,100376 1298,101681 1298,105731 1298,106153 1298,106253 1298,107162 1298,110813 1298,114583 1298,114682 1298,114852 1298,114862 1298,117090 1298,118710 1298,118806 1298,124503 1298,127919 1298,128822 1298,130455 1298,131652 1298,132012 1298,136233 1298,136560 1298,136654 1298,138914 1298,139389 1298,140331 1298,142287 1298,142532 1298,143094 1298,146671 1298,146893 1298,148438 1298,154490 1298,156994 1298,157760 1298,158335 1298,159873 1298,160409 1298,161385 1298,163898 1298,167096 1298,167161 1298,173373 1298,174022 1298,174470 1298,175268 1298,175902 1298,175907 1298,175979 1298,177030 1298,177044 1298,177463 1298,179141 1298,179169 1298,179409 1298,181145 1298,182091 1298,182520 1298,187176 1298,193022 1298,193096 1298,197475 1298,201086 1298,201938 1298,202770 1298,203168 1298,212969 1298,214648 1298,214698 1298,216659 1298,216692 1298,216699 1298,216702 1298,217340 1298,222723 1298,222834 1298,223438 1298,224496 1298,224767 1298,231339 1298,233614 1298,237320 1298,237621 1298,243971 1298,244191 1298,247201 1298,253723 1298,254445 1298,257027 1298,258952 1298,261572 1299,536 1299,1571 1299,2979 1300,10 1300,299 1300,301 1300,372 1300,459 1300,534 1300,604 1300,615 1300,693 1300,744 1300,783 1300,937 1300,968 1300,973 1300,1011 1300,1160 1300,1231 1300,1284 1300,1293 1300,1300 1300,1436 1300,1853 1300,1949 1300,1973 1300,3422 1300,3630 1300,5186 1300,5662 1300,6711 1300,13523 1300,15277 1300,15511 1300,15588 1300,15665 1300,17894 1300,20327 1300,23669 1300,23848 1300,25685 1300,31208 1300,31414 1300,40541 1300,42598 1300,47767 1300,50503 1300,59188 1300,66594 1300,73342 1300,80009 1300,83512 1300,84160 1300,85174 1300,96685 1300,101551 1300,103860 1300,122451 1300,127858 1300,131355 1300,140756 1300,142645 1300,143411 1300,145126 1300,145127 1300,145130 1300,146801 1300,148427 1300,169482 1300,171626 1300,172943 1300,174279 1300,174834 1300,174838 1300,174839 1300,183990 1300,185398 1300,189711 1300,218884 1300,222652 1300,224021 1300,225329 1300,226604 1300,228288 1300,231070 1300,239076 1300,243076 1300,244594 1300,245287 1300,249217 1301,563 1302,392 1302,644 1302,779 1302,918 1303,313 1303,788 1304,1305 1305,30 1305,6084 1305,23555 1305,27892 1305,28049 1306,10 1306,113156 1308,1309 1309,10 1309,11 1309,72 1309,104 1309,175 1309,240 1309,261 1309,356 1309,372 1309,446 1309,599 1309,611 1309,631 1309,677 1309,685 1309,693 1309,771 1309,772 1309,818 1309,838 1309,852 1309,911 1309,1011 1309,1082 1309,1130 1309,1172 1309,1203 1309,1285 1309,1308 1309,1309 1309,1435 1309,1807 1309,1822 1309,1888 1309,1955 1309,2208 1309,2228 1309,2512 1309,2729 1309,2775 1309,2812 1309,2841 1309,2989 1309,2991 1309,3135 1309,3370 1309,3507 1309,3570 1309,3619 1309,4190 1309,4267 1309,6822 1309,6856 1309,7718 1309,7915 1309,8619 1309,9015 1309,9025 1309,11346 1309,13395 1309,14207 1309,14511 1309,14613 1309,15227 1309,16310 1309,17073 1309,18013 1309,18890 1309,19168 1309,19622 1309,20803 1309,22272 1309,23382 1309,23496 1309,23634 1309,23735 1309,24814 1309,24839 1309,25631 1309,26018 1309,26267 1309,26905 1309,26967 1309,28553 1309,29854 1309,31777 1309,32721 1309,34149 1309,34515 1309,45507 1309,46199 1309,47173 1309,48965 1309,49283 1309,49350 1309,52539 1309,55873 1309,56979 1309,66918 1309,69019 1309,78199 1309,88328 1309,97934 1309,100139 1309,101862 1309,102747 1309,104585 1309,105721 1309,113137 1309,116613 1309,116995 1309,119939 1309,121445 1309,121809 1309,128121 1309,161642 1309,164964 1309,171027 1309,173397 1309,173398 1309,174543 1309,174987 1309,179049 1309,179395 1309,182465 1309,182913 1309,183871 1309,186113 1309,190162 1309,206022 1309,212603 1309,212899 1309,214154 1309,215186 1309,223889 1309,224533 1309,233743 1309,245155 1309,247075 1309,247214 1309,249062 1309,249502 1309,261795 1309,263991 1310,54 1310,385 1310,1539 1310,2421 1311,252 1311,41170 1312,50 1312,273 1312,274 1312,333 1312,457 1312,459 1312,483 1312,668 1312,673 1312,707 1312,712 1312,713 1312,784 1312,808 1312,838 1312,852 1312,980 1312,1122 1312,1130 1312,1285 1312,1313 1312,1718 1312,1837 1312,1927 1312,2744 1312,3967 1312,30331 1312,66552 1313,34 1313,35 1313,83 1313,187 1313,313 1313,338 1313,389 1313,462 1313,634 1313,693 1313,1083 1313,1313 1313,1718 1313,2159 1313,2224 1313,2488 1313,2646 1313,4039 1313,4223 1313,5326 1313,6900 1313,14107 1313,14857 1313,15427 1313,15545 1313,16598 1313,21382 1313,21589 1313,23442 1313,25563 1313,25569 1313,25572 1313,25574 1313,25577 1313,26072 1313,32050 1313,32479 1313,32535 1313,34863 1313,34910 1313,35462 1313,39462 1313,41281 1313,55225 1313,56533 1313,66360 1313,76960 1313,81511 1313,81947 1313,82029 1313,82556 1313,115128 1313,122941 1313,161588 1313,161948 1313,172062 1313,172192 1313,186608 1313,197791 1313,236740 1313,241969 1313,242337 1313,243997 1313,248582 1313,257251 1313,259005 1313,259027 1313,260330 1314,1315 1316,1 1316,107 1316,151 1316,187 1316,313 1316,347 1316,424 1316,467 1316,736 1316,795 1316,920 1316,957 1316,980 1316,1012 1316,1133 1316,1140 1316,1370 1316,1815 1316,1955 1318,843 1319,86 1319,167 1319,299 1319,301 1319,356 1319,446 1319,528 1319,632 1319,663 1319,664 1319,685 1319,693 1319,715 1319,783 1319,832 1319,911 1319,941 1319,1167 1319,1241 1319,1319 1319,1436 1319,1459 1319,1479 1319,1522 1319,1544 1319,1623 1319,1848 1319,2083 1319,2372 1319,2775 1319,2874 1319,3207 1319,3218 1319,5301 1319,5356 1319,6883 1319,7087 1319,8386 1319,13252 1319,14080 1319,14674 1319,15264 1319,15380 1319,18668 1319,21249 1319,23755 1319,27166 1319,28289 1319,29758 1319,32810 1319,34234 1319,34515 1319,35531 1319,36685 1319,38167 1319,38212 1319,39111 1319,41621 1319,42779 1319,43686 1319,45585 1319,45623 1319,48345 1319,58173 1319,58208 1319,61167 1319,61213 1319,63193 1319,63421 1319,65681 1319,65951 1319,67588 1319,68369 1319,70249 1319,73570 1319,78746 1319,82031 1319,82039 1319,91791 1319,109945 1319,110118 1319,117290 1319,117818 1319,125962 1319,130798 1319,143993 1319,147726 1319,150458 1319,152511 1319,158242 1319,169002 1319,169071 1319,170040 1319,176836 1319,176916 1319,181729 1319,199199 1319,207045 1319,217503 1319,237322 1319,244566 1320,783 1320,1130 1320,1849 1321,32 1321,140 1321,515 1321,1381 1321,2017 1321,2626 1322,1323 1323,102 1323,408 1323,518 1323,852 1323,1113 1323,1323 1323,1326 1323,19274 1323,63049 1323,81693 1323,131908 1323,160846 1323,164530 1323,169085 1323,176474 1323,234673 1323,262612 1323,264549 1324,102 1325,1326 1326,68 1326,102 1326,167 1326,186 1326,240 1326,287 1326,292 1326,301 1326,314 1326,356 1326,388 1326,408 1326,435 1326,440 1326,452 1326,457 1326,467 1326,518 1326,599 1326,626 1326,631 1326,673 1326,676 1326,765 1326,775 1326,780 1326,808 1326,838 1326,843 1326,849 1326,852 1326,1001 1326,1011 1326,1014 1326,1085 1326,1096 1326,1113 1326,1118 1326,1119 1326,1122 1326,1130 1326,1133 1326,1140 1326,1160 1326,1282 1326,1284 1326,1293 1326,1323 1326,1326 1326,1345 1326,1411 1326,1417 1326,1531 1326,1545 1326,1566 1326,1599 1326,1603 1326,1612 1326,1663 1326,1715 1326,1732 1326,1746 1326,1796 1326,1849 1326,1853 1326,1955 1326,1986 1326,2045 1326,2334 1326,2511 1326,2733 1326,3166 1326,3193 1326,3351 1326,3407 1326,3455 1326,3555 1326,3718 1326,3804 1326,4165 1326,4213 1326,4222 1326,4514 1326,4602 1326,4614 1326,5008 1326,5129 1326,5130 1326,5382 1326,5385 1326,5388 1326,5623 1326,5851 1326,6400 1326,6579 1326,6587 1326,6638 1326,6904 1326,7170 1326,7431 1326,7548 1326,7766 1326,7776 1326,7840 1326,7842 1326,7959 1326,8011 1326,8435 1326,8923 1326,13217 1326,13624 1326,13787 1326,14158 1326,14196 1326,14311 1326,14563 1326,14572 1326,14674 1326,14754 1326,15109 1326,16551 1326,16681 1326,17607 1326,18137 1326,18167 1326,18186 1326,18221 1326,18249 1326,19290 1326,19421 1326,19598 1326,20020 1326,20339 1326,20350 1326,20426 1326,20663 1326,21607 1326,21783 1326,22440 1326,22450 1326,23050 1326,23337 1326,23437 1326,23526 1326,23850 1326,24924 1326,25573 1326,25657 1326,25687 1326,26129 1326,26754 1326,30567 1326,31402 1326,32516 1326,32870 1326,34417 1326,34767 1326,35361 1326,35948 1326,36969 1326,37602 1326,37674 1326,38280 1326,38300 1326,38475 1326,38956 1326,39112 1326,39232 1326,40457 1326,41345 1326,41394 1326,42432 1326,43150 1326,46796 1326,46807 1326,47114 1326,47708 1326,48006 1326,48505 1326,49102 1326,49576 1326,52163 1326,52945 1326,52955 1326,55060 1326,55185 1326,55639 1326,55816 1326,57058 1326,57073 1326,58289 1326,60598 1326,62331 1326,62616 1326,62753 1326,62758 1326,63049 1326,63372 1326,63483 1326,63979 1326,64130 1326,64682 1326,64685 1326,65420 1326,65842 1326,66486 1326,67172 1326,68337 1326,68913 1326,71725 1326,75323 1326,76008 1326,76999 1326,78749 1326,78750 1326,79942 1326,81017 1326,81042 1326,81135 1326,82757 1326,83218 1326,84860 1326,86540 1326,86759 1326,87871 1326,88120 1326,88306 1326,88355 1326,89638 1326,90347 1326,90873 1326,91488 1326,91778 1326,92039 1326,93499 1326,98507 1326,101547 1326,101573 1326,102648 1326,102659 1326,103282 1326,103692 1326,103822 1326,105731 1326,106175 1326,106190 1326,106982 1326,107067 1326,110044 1326,111207 1326,113848 1326,114232 1326,114749 1326,116260 1326,118465 1326,118904 1326,121615 1326,124957 1326,127342 1326,128147 1326,128174 1326,128787 1326,128822 1326,128865 1326,128870 1326,128872 1326,129787 1326,130352 1326,130467 1326,130914 1326,131354 1326,131371 1326,131854 1326,132992 1326,133623 1326,133984 1326,135045 1326,137768 1326,138030 1326,138331 1326,140694 1326,145008 1326,145320 1326,146661 1326,147387 1326,147390 1326,147391 1326,147430 1326,147434 1326,147436 1326,147440 1326,147446 1326,147449 1326,147450 1326,147463 1326,147466 1326,147494 1326,149247 1326,152048 1326,152272 1326,152568 1326,152933 1326,153718 1326,153768 1326,155708 1326,156727 1326,157027 1326,157030 1326,157082 1326,159334 1326,160834 1326,161190 1326,161949 1326,162708 1326,164946 1326,167083 1326,168327 1326,169685 1326,170785 1326,171341 1326,171367 1326,171368 1326,172058 1326,172194 1326,172507 1326,172602 1326,172746 1326,174992 1326,175356 1326,176024 1326,176451 1326,176838 1326,179205 1326,179375 1326,179378 1326,179783 1326,180957 1326,185048 1326,185414 1326,185933 1326,187008 1326,188232 1326,188791 1326,188925 1326,190345 1326,192558 1326,193277 1326,194074 1326,196693 1326,207516 1326,212083 1326,212711 1326,214934 1326,215874 1326,216674 1326,220093 1326,223355 1326,224407 1326,225762 1326,228045 1326,229621 1326,229634 1326,230347 1326,230396 1326,232222 1326,233518 1326,233998 1326,235995 1326,236064 1326,236690 1326,237981 1326,238995 1326,241647 1326,245246 1326,245842 1326,247323 1326,248507 1326,248517 1326,250888 1326,251898 1326,252499 1326,252566 1326,253224 1326,256554 1326,258440 1326,258889 1326,259022 1326,261503 1326,261777 1326,261839 1326,263127 1326,263254 1327,408 1328,106 1328,336 1328,447 1328,505 1328,752 1328,1294 1328,1370 1328,1644 1328,2775 1328,2782 1329,248 1329,251 1329,289 1329,290 1329,372 1329,516 1329,1179 1329,1332 1329,1531 1329,1572 1329,94134 1329,144988 1330,615 1331,336 1331,818 1332,30 1332,68 1332,104 1332,134 1332,135 1332,136 1332,138 1332,200 1332,211 1332,225 1332,248 1332,288 1332,314 1332,327 1332,328 1332,338 1332,364 1332,372 1332,408 1332,442 1332,446 1332,450 1332,462 1332,497 1332,557 1332,599 1332,636 1332,685 1332,749 1332,772 1332,794 1332,838 1332,850 1332,852 1332,872 1332,911 1332,943 1332,953 1332,1065 1332,1118 1332,1140 1332,1179 1332,1262 1332,1329 1332,1332 1332,1368 1332,1415 1332,1572 1332,1653 1332,1808 1332,1844 1332,1882 1332,1893 1332,1955 1332,1980 1332,2105 1332,2123 1332,2367 1332,2580 1332,2596 1332,3247 1332,3496 1332,3606 1332,3633 1332,3719 1332,3930 1332,3975 1332,4039 1332,4072 1332,4276 1332,4294 1332,4388 1332,4509 1332,4565 1332,4679 1332,5053 1332,5215 1332,5405 1332,5423 1332,5470 1332,5472 1332,5551 1332,5579 1332,5773 1332,6308 1332,6826 1332,6880 1332,7059 1332,7214 1332,7757 1332,7806 1332,7912 1332,8133 1332,8200 1332,8276 1332,8284 1332,11147 1332,13207 1332,13220 1332,13327 1332,15078 1332,16143 1332,16309 1332,18194 1332,18465 1332,20100 1332,20357 1332,20604 1332,20717 1332,24840 1332,25229 1332,26286 1332,28244 1332,28311 1332,28346 1332,29595 1332,29736 1332,29956 1332,31889 1332,32659 1332,32778 1332,32824 1332,33279 1332,33621 1332,33753 1332,34920 1332,34938 1332,34951 1332,37414 1332,37424 1332,38650 1332,38796 1332,39500 1332,40355 1332,41912 1332,41991 1332,42006 1332,45535 1332,46261 1332,46683 1332,48425 1332,48532 1332,49372 1332,54723 1332,55416 1332,56319 1332,57222 1332,58580 1332,59877 1332,59956 1332,63532 1332,64666 1332,68779 1332,70743 1332,71770 1332,71803 1332,78650 1332,78787 1332,80168 1332,80500 1332,83523 1332,83858 1332,84640 1332,85157 1332,85767 1332,85814 1332,86050 1332,87433 1332,90903 1332,92057 1332,98818 1332,99573 1332,103533 1332,103858 1332,106361 1332,108035 1332,108087 1332,110214 1332,112975 1332,114497 1332,114928 1332,118485 1332,118581 1332,119120 1332,120155 1332,121897 1332,124074 1332,128691 1332,128897 1332,130424 1332,130890 1332,130912 1332,132879 1332,133167 1332,135426 1332,136085 1332,136086 1332,136288 1332,136661 1332,136816 1332,140008 1332,141061 1332,143982 1332,144133 1332,145383 1332,145658 1332,145917 1332,145920 1332,150931 1332,152179 1332,153660 1332,156591 1332,160450 1332,160996 1332,163390 1332,165750 1332,168331 1332,168359 1332,169624 1332,169994 1332,170858 1332,171023 1332,171772 1332,172223 1332,174128 1332,175938 1332,182158 1332,190276 1332,192894 1332,192951 1332,194354 1332,194912 1332,205825 1332,215059 1332,217982 1332,223363 1332,226502 1332,229059 1332,232744 1332,232950 1332,235857 1332,241193 1332,241868 1332,243519 1332,247232 1332,257009 1332,263021 1333,447 1333,788 1334,26 1334,59 1334,885 1334,994 1334,1235 1334,1335 1334,2674 1334,21944 1335,441 1335,446 1335,673 1335,25908 1335,70403 1335,70506 1335,91406 1335,165141 1336,22 1336,515 1337,86 1338,1339 1340,364 1340,450 1341,140 1341,338 1341,515 1341,647 1341,872 1341,918 1341,991 1341,1052 1341,1127 1341,1224 1341,1267 1341,1509 1341,1551 1341,1579 1341,1707 1341,2605 1341,3367 1341,49057 1341,81070 1342,287 1342,809 1343,233 1344,702 1344,703 1345,3 1345,79 1345,182 1345,256 1345,259 1345,292 1345,314 1345,356 1345,358 1345,388 1345,397 1345,452 1345,457 1345,467 1345,500 1345,509 1345,510 1345,534 1345,599 1345,623 1345,673 1345,676 1345,685 1345,697 1345,822 1345,843 1345,849 1345,852 1345,868 1345,875 1345,911 1345,918 1345,1011 1345,1014 1345,1021 1345,1043 1345,1113 1345,1191 1345,1192 1345,1204 1345,1222 1345,1235 1345,1326 1345,1345 1345,1417 1345,1424 1345,1559 1345,1566 1345,1584 1345,1655 1345,1663 1345,1801 1345,1860 1345,1891 1345,1973 1345,1992 1345,2045 1345,2373 1345,3182 1345,3367 1345,3732 1345,3804 1345,4231 1345,5467 1345,6638 1345,6990 1345,8063 1345,8190 1345,8483 1345,9457 1345,19413 1345,19777 1345,20695 1345,20757 1345,21267 1345,26161 1345,27060 1345,28107 1345,29102 1345,29688 1345,31080 1345,36591 1345,48505 1345,49004 1345,52453 1345,58420 1345,58735 1345,79502 1345,84559 1345,102704 1345,112033 1345,118336 1345,125054 1345,127158 1345,131808 1345,137284 1345,156379 1345,162599 1345,172614 1345,176911 1345,185281 1345,187386 1345,189762 1345,191332 1345,207659 1345,215236 1345,215874 1345,216100 1345,216170 1345,217465 1345,221055 1345,221058 1345,221067 1345,221252 1345,255494 1345,263118 1346,41 1346,104 1346,248 1346,309 1346,310 1346,332 1346,483 1346,503 1346,588 1346,590 1346,636 1346,714 1346,760 1346,805 1346,1119 1346,1235 1346,1282 1346,1335 1346,1462 1346,1635 1346,2205 1346,2206 1346,2209 1346,8537 1348,217 1348,2266 1349,723 1350,149 1350,859 1350,932 1350,155481 1351,66 1351,1433 1352,1353 1353,71 1353,120 1353,332 1353,446 1353,599 1353,682 1353,685 1353,694 1353,805 1353,852 1353,875 1353,1352 1353,1353 1353,1466 1353,1608 1353,2224 1353,2512 1353,2775 1353,3115 1353,3867 1353,4234 1353,6068 1353,8152 1353,8156 1353,9463 1353,13251 1353,14482 1353,14820 1353,15562 1353,15587 1353,15653 1353,15673 1353,15931 1353,16102 1353,16661 1353,17159 1353,18327 1353,19857 1353,20540 1353,20757 1353,22168 1353,22939 1353,27041 1353,28338 1353,28844 1353,29038 1353,30623 1353,30939 1353,32751 1353,37440 1353,41124 1353,48254 1353,48277 1353,49647 1353,49685 1353,51794 1353,53495 1353,55681 1353,56589 1353,57583 1353,68582 1353,68708 1353,72439 1353,77554 1353,77679 1353,79286 1353,79307 1353,79966 1353,80003 1353,85859 1353,91430 1353,92867 1353,98788 1353,106759 1353,119102 1353,119625 1353,124882 1353,134118 1353,134493 1353,136501 1353,138915 1353,146825 1353,146889 1353,148835 1353,155763 1353,156432 1353,157050 1353,164424 1353,164877 1353,168263 1353,169160 1353,169582 1353,172384 1353,174612 1353,176119 1353,179722 1353,180633 1353,207126 1353,216204 1353,216645 1353,226986 1353,241113 1353,241114 1353,241179 1353,241520 1353,248420 1353,251999 1353,253109 1354,438 1355,97 1355,301 1355,535 1355,1010 1356,292 1358,718 1358,142409 1359,37 1359,240 1359,289 1359,290 1359,604 1359,609 1359,615 1359,677 1359,682 1359,715 1359,752 1359,780 1359,784 1359,805 1359,911 1359,1082 1359,1257 1359,1293 1359,1359 1359,1564 1359,1566 1359,1882 1359,1888 1359,2315 1359,2316 1359,2620 1359,2775 1359,3422 1359,3672 1359,3964 1359,4222 1359,4234 1359,4532 1359,4618 1359,5439 1359,5718 1359,6178 1359,6800 1359,7220 1359,8276 1359,9550 1359,13296 1359,14139 1359,15604 1359,17210 1359,18965 1359,19755 1359,20840 1359,23710 1359,24906 1359,25467 1359,26061 1359,27949 1359,36727 1359,36939 1359,46640 1359,48589 1359,55598 1359,57354 1359,58883 1359,63102 1359,64001 1359,64855 1359,66649 1359,70395 1359,72439 1359,73355 1359,74122 1359,79412 1359,89551 1359,91974 1359,93142 1359,93148 1359,104604 1359,104608 1359,113065 1359,116935 1359,119020 1359,119923 1359,125034 1359,125042 1359,133440 1359,136012 1359,139987 1359,140326 1359,148065 1359,148066 1359,148325 1359,149279 1359,150510 1359,151051 1359,156308 1359,166704 1359,168361 1359,168365 1359,168366 1359,197730 1359,204209 1359,212354 1359,215348 1359,217507 1359,219795 1359,219807 1359,222433 1359,231533 1359,236619 1359,260216 1360,299 1360,720 1360,907 1360,1010 1360,1117 1360,1284 1360,1298 1360,2191 1361,240 1361,372 1361,1285 1361,1361 1361,1955 1361,3328 1361,3770 1362,1363 1363,87 1363,256 1363,599 1363,668 1363,808 1363,872 1363,919 1363,1011 1363,1363 1363,1465 1363,2253 1364,3 1364,304 1364,230509 1364,230517 1365,104 1365,557 1365,953 1365,954 1365,1939 1366,147 1366,192 1366,195 1366,336 1367,22 1367,222 1367,596 1367,1368 1367,1429 1368,30 1368,104 1368,111 1368,134 1368,136 1368,137 1368,138 1368,200 1368,254 1368,287 1368,431 1368,450 1368,557 1368,596 1368,612 1368,617 1368,632 1368,685 1368,715 1368,749 1368,772 1368,784 1368,843 1368,852 1368,911 1368,1011 1368,1052 1368,1146 1368,1332 1368,1367 1368,1368 1368,1416 1368,1432 1368,1459 1368,1607 1368,1807 1368,1973 1368,2105 1368,2373 1368,2543 1368,2565 1368,2775 1368,3247 1368,3473 1368,3504 1368,3613 1368,4024 1368,4086 1368,4276 1368,4725 1368,4761 1368,7458 1368,7757 1368,7921 1368,8599 1368,13207 1368,13506 1368,15344 1368,15470 1368,15744 1368,15764 1368,16166 1368,16263 1368,16552 1368,19786 1368,19798 1368,20515 1368,20858 1368,22105 1368,22551 1368,26051 1368,26546 1368,28191 1368,28746 1368,33406 1368,33422 1368,34963 1368,37144 1368,37771 1368,37816 1368,38144 1368,38612 1368,39618 1368,42092 1368,42918 1368,45763 1368,46687 1368,48599 1368,50745 1368,58569 1368,60095 1368,60886 1368,62239 1368,63038 1368,65995 1368,70970 1368,71385 1368,71893 1368,72639 1368,72657 1368,73380 1368,73745 1368,74387 1368,76181 1368,76704 1368,78772 1368,80935 1368,81508 1368,83737 1368,84551 1368,85814 1368,87377 1368,90903 1368,94726 1368,95554 1368,95597 1368,97196 1368,99611 1368,103216 1368,104541 1368,105591 1368,105941 1368,106152 1368,108836 1368,109528 1368,110742 1368,111340 1368,113541 1368,114064 1368,118359 1368,120155 1368,122488 1368,123121 1368,125948 1368,126995 1368,128037 1368,128144 1368,128813 1368,129762 1368,129950 1368,131952 1368,133292 1368,133619 1368,134270 1368,139782 1368,140093 1368,147433 1368,150212 1368,150625 1368,150675 1368,151595 1368,152531 1368,153068 1368,153072 1368,155226 1368,156815 1368,159071 1368,159383 1368,160501 1368,162435 1368,162599 1368,163867 1368,163887 1368,163967 1368,165701 1368,165905 1368,167644 1368,167799 1368,168841 1368,169002 1368,169350 1368,170906 1368,171886 1368,172071 1368,174964 1368,174999 1368,175964 1368,180939 1368,182345 1368,184348 1368,187334 1368,188564 1368,190276 1368,192694 1368,192769 1368,192953 1368,193195 1368,194871 1368,201799 1368,206389 1368,206453 1368,208170 1368,211745 1368,211847 1368,211871 1368,213057 1368,214733 1368,216585 1368,216656 1368,216789 1368,223781 1368,223799 1368,224168 1368,230456 1368,231033 1368,233473 1368,233603 1368,233703 1368,233984 1368,234002 1368,234067 1368,234184 1368,236308 1368,238262 1368,247521 1368,248451 1368,249092 1368,250008 1368,251331 1368,253571 1368,255567 1368,255666 1368,255669 1368,255671 1368,255672 1368,255811 1368,260925 1368,261708 1368,264017 1368,264027 1369,79 1369,439 1369,779 1370,1 1370,10 1370,34 1370,37 1370,50 1370,106 1370,149 1370,192 1370,202 1370,203 1370,240 1370,251 1370,280 1370,301 1370,302 1370,333 1370,336 1370,337 1370,392 1370,397 1370,406 1370,421 1370,425 1370,435 1370,439 1370,452 1370,457 1370,467 1370,493 1370,505 1370,510 1370,516 1370,586 1370,599 1370,622 1370,663 1370,664 1370,779 1370,794 1370,809 1370,818 1370,838 1370,849 1370,868 1370,929 1370,1014 1370,1118 1370,1175 1370,1210 1370,1220 1370,1222 1370,1298 1370,1326 1370,1328 1370,1371 1370,1417 1370,1456 1370,1531 1370,1566 1370,1619 1370,1623 1370,1796 1370,1817 1370,1821 1370,1844 1370,1973 1370,1985 1370,2173 1370,2260 1370,2400 1370,2782 1370,3258 1370,4315 1370,4514 1370,5361 1370,5563 1370,6711 1370,6904 1370,7222 1370,7243 1370,8100 1370,8244 1370,8274 1370,8854 1370,9547 1370,9579 1370,14181 1370,14396 1370,14414 1370,15113 1370,15229 1370,17245 1370,18240 1370,18698 1370,19205 1370,19863 1370,20824 1370,21264 1370,21382 1370,21387 1370,21634 1370,21736 1370,23618 1370,27573 1370,28354 1370,28545 1370,28788 1370,29854 1370,32707 1370,33584 1370,36512 1370,37769 1370,39618 1370,40782 1370,40807 1370,41535 1370,42735 1370,43238 1370,43350 1370,46325 1370,46927 1370,49121 1370,50556 1370,53726 1370,55775 1370,55917 1370,58386 1370,58820 1370,66296 1370,66527 1370,67906 1370,72575 1370,72663 1370,73442 1370,74650 1370,78905 1370,80528 1370,82255 1370,82673 1370,82747 1370,87705 1370,92476 1370,94881 1370,95677 1370,99665 1370,102560 1370,102955 1370,106502 1370,107042 1370,108135 1370,110506 1370,113517 1370,114840 1370,115127 1370,119091 1370,120155 1370,120814 1370,122404 1370,122940 1370,123970 1370,127158 1370,128803 1370,129761 1370,130059 1370,131050 1370,131248 1370,133539 1370,133549 1370,135334 1370,136303 1370,138033 1370,138034 1370,141828 1370,141949 1370,144849 1370,146001 1370,154340 1370,161255 1370,161505 1370,161631 1370,162008 1370,162599 1370,169927 1370,176524 1370,178825 1370,179804 1370,183758 1370,184043 1370,184845 1370,191355 1370,192999 1370,196377 1370,199301 1370,200644 1370,204148 1370,204645 1370,207659 1370,215408 1370,217868 1370,220905 1370,225344 1370,227385 1370,232162 1370,234832 1370,238340 1370,244572 1370,245442 1370,246029 1370,249055 1370,249680 1370,250536 1370,251857 1370,254263 1371,1370 1372,1127 1373,22 1373,65 1373,163 1373,240 1373,269 1373,346 1373,438 1373,571 1373,687 1373,809 1373,818 1373,861 1373,893 1373,1363 1373,1374 1373,1433 1373,1659 1373,1782 1373,1803 1373,2017 1373,2073 1373,2312 1373,4823 1373,17309 1373,21442 1373,141912 1373,162599 1375,877 1376,346 1377,143 1377,1052 1377,142433 1378,203 1378,1379 1379,1379 1380,808 1381,66 1381,104 1381,240 1381,314 1381,435 1381,440 1381,457 1381,467 1381,599 1381,794 1381,868 1381,1011 1381,1014 1381,1033 1381,1167 1381,1345 1381,1381 1381,1415 1381,1639 1381,1722 1381,1844 1381,2178 1381,2371 1381,2979 1381,4066 1381,4545 1381,56150 1381,176041 1382,305 1382,35092 1383,200 1383,772 1384,693 1385,56 1385,203 1385,252 1385,664 1385,920 1385,1181 1385,1266 1385,1386 1385,1568 1385,1678 1385,2178 1385,3569 1385,3866 1385,4476 1385,5353 1385,5631 1385,6470 1385,6501 1385,8100 1385,8606 1385,9351 1385,13226 1385,13242 1385,18234 1385,18239 1385,19457 1385,20295 1385,21944 1385,22259 1385,30514 1385,34943 1385,38300 1385,39552 1385,41170 1385,46202 1385,53472 1385,57624 1385,70146 1385,73281 1385,74481 1385,111194 1385,113709 1385,116077 1385,117889 1385,117974 1385,121910 1385,137399 1385,137724 1385,146671 1385,148143 1385,148240 1385,165354 1385,172278 1385,189842 1385,193255 1385,194749 1385,194757 1385,194759 1385,199419 1385,203883 1385,204734 1385,207087 1385,224070 1385,225080 1385,233430 1385,238788 1385,238942 1385,240667 1385,241163 1386,1385 1386,44370 1387,1388 1388,186 1388,192 1388,259 1388,272 1388,364 1388,577 1388,663 1388,685 1388,694 1388,715 1388,726 1388,749 1388,788 1388,795 1388,843 1388,859 1388,980 1388,999 1388,1070 1388,1089 1388,1192 1388,1387 1388,1388 1388,1531 1388,1697 1388,1808 1388,1947 1388,1995 1388,2085 1388,2802 1388,3682 1388,3740 1388,4137 1388,5106 1388,5491 1388,6154 1388,8014 1388,13481 1388,14193 1388,14571 1388,15447 1388,15462 1388,15980 1388,20283 1388,20608 1388,29885 1388,30490 1388,30684 1388,31199 1388,35486 1388,35621 1388,39245 1388,45425 1388,48883 1388,48974 1388,54578 1388,54652 1388,56971 1388,69996 1388,71022 1388,71976 1388,78667 1388,79876 1388,93659 1388,109507 1388,117031 1388,117132 1388,119368 1388,120720 1388,124972 1388,126901 1388,128378 1388,128728 1388,129954 1388,135635 1388,155659 1388,161196 1388,163037 1388,163053 1388,163384 1388,177714 1388,180386 1388,181952 1388,183979 1388,186829 1388,190043 1388,198248 1388,201265 1388,204734 1388,224763 1389,861 1389,1390 1390,5652 1390,8069 1391,1293 1391,1392 1392,1392 1393,934 1395,261 1395,590 1395,1466 1396,996 1397,209 1398,305 1399,171 1400,68 1400,1400 1400,1401 1400,1408 1400,2404 1400,2430 1400,2640 1400,3887 1400,4074 1400,4200 1400,4201 1400,7780 1400,8062 1400,8186 1400,13327 1400,21343 1400,21730 1400,25531 1400,28830 1400,28939 1400,36665 1400,40039 1400,41840 1400,43157 1400,47011 1400,48629 1400,59899 1400,64040 1400,72473 1400,73384 1400,76813 1400,93605 1400,93667 1400,94357 1400,98333 1400,107446 1400,124417 1400,125887 1400,128679 1400,128920 1400,136344 1400,142052 1400,148414 1400,153573 1400,153576 1400,166439 1400,169044 1400,191788 1400,216589 1400,217434 1400,217853 1400,219523 1400,219826 1400,223921 1400,224430 1400,225734 1400,225782 1400,228123 1400,229706 1400,230389 1400,230403 1400,230449 1400,231053 1400,240482 1400,261731 1400,261755 1401,868 1401,1400 1402,81 1402,126 1402,186 1402,215 1402,227 1402,233 1402,240 1402,256 1402,289 1402,290 1402,314 1402,328 1402,372 1402,397 1402,452 1402,457 1402,502 1402,503 1402,588 1402,590 1402,592 1402,599 1402,676 1402,685 1402,704 1402,714 1402,760 1402,761 1402,805 1402,838 1402,849 1402,911 1402,929 1402,1014 1402,1016 1402,1085 1402,1118 1402,1149 1402,1212 1402,1257 1402,1262 1402,1282 1402,1402 1402,1417 1402,1505 1402,1511 1402,1566 1402,1631 1402,1796 1402,1818 1402,1879 1402,1882 1402,1962 1402,1973 1402,2008 1402,2205 1402,2206 1402,2210 1402,2224 1402,2286 1402,2315 1402,2373 1402,2512 1402,3069 1402,3507 1402,3513 1402,3967 1402,4165 1402,4190 1402,4218 1402,4237 1402,4276 1402,4514 1402,4532 1402,4766 1402,5116 1402,5121 1402,5192 1402,5346 1402,6824 1402,6904 1402,7117 1402,8763 1402,9001 1402,9457 1402,14459 1402,14476 1402,15397 1402,18151 1402,21290 1402,22389 1402,24561 1402,30292 1402,32939 1402,33424 1402,33672 1402,37741 1402,38394 1402,39618 1402,41395 1402,43364 1402,62482 1402,68205 1402,69440 1402,74547 1402,76704 1402,77743 1402,83899 1402,92141 1402,94134 1402,96254 1402,106274 1402,109960 1402,112503 1402,127158 1402,133652 1402,136127 1402,136437 1402,139939 1402,140556 1402,143193 1402,144988 1402,165000 1402,170732 1402,172983 1402,174315 1402,177324 1402,182162 1402,184371 1402,200770 1402,201109 1402,201118 1402,201222 1402,207659 1402,215874 1402,218497 1402,245910 1402,249055 1402,255543 1402,255549 1404,422 1405,907 1406,217 1408,1400 1409,589 1409,1294 1410,1001 1410,1177 1410,1300 1410,1411 1412,211 1412,225 1412,349 1413,1414 1414,1414 1415,19 1415,30 1415,104 1415,135 1415,137 1415,138 1415,200 1415,225 1415,294 1415,328 1415,364 1415,442 1415,446 1415,557 1415,943 1415,1119 1415,1332 1415,1415 1415,1432 1415,1545 1415,2105 1415,2205 1415,2418 1415,3565 1415,4114 1415,4223 1415,4276 1415,4322 1415,4941 1415,5405 1415,5423 1415,6569 1415,9529 1415,15277 1415,16309 1415,21944 1415,22148 1415,22201 1415,22243 1415,28203 1415,31215 1415,33424 1415,37771 1415,61806 1415,67127 1415,73186 1415,74071 1415,74077 1415,80711 1415,82663 1415,93168 1415,94830 1415,103749 1415,103769 1415,106392 1415,129534 1415,130857 1415,132512 1415,134704 1415,134769 1415,136072 1415,170561 1415,176032 1415,176451 1415,192367 1415,215436 1415,219799 1415,220379 1415,220615 1415,220946 1415,225316 1415,238102 1415,238997 1415,243081 1415,258347 1415,262642 1416,104 1416,264 1416,557 1416,631 1416,1282 1416,16687 1417,3 1417,10 1417,34 1417,35 1417,83 1417,97 1417,104 1417,120 1417,126 1417,147 1417,163 1417,167 1417,182 1417,186 1417,192 1417,207 1417,209 1417,216 1417,217 1417,222 1417,240 1417,256 1417,264 1417,278 1417,283 1417,301 1417,302 1417,313 1417,314 1417,327 1417,336 1417,366 1417,372 1417,373 1417,392 1417,397 1417,406 1417,417 1417,440 1417,441 1417,452 1417,455 1417,457 1417,467 1417,493 1417,495 1417,500 1417,505 1417,510 1417,512 1417,515 1417,516 1417,535 1417,536 1417,577 1417,599 1417,602 1417,631 1417,657 1417,668 1417,673 1417,676 1417,685 1417,693 1417,710 1417,733 1417,766 1417,779 1417,781 1417,794 1417,808 1417,818 1417,838 1417,843 1417,849 1417,872 1417,903 1417,911 1417,918 1417,920 1417,949 1417,972 1417,1007 1417,1010 1417,1011 1417,1014 1417,1019 1417,1085 1417,1089 1417,1118 1417,1130 1417,1147 1417,1151 1417,1172 1417,1181 1417,1191 1417,1192 1417,1204 1417,1210 1417,1220 1417,1222 1417,1240 1417,1250 1417,1262 1417,1282 1417,1293 1417,1298 1417,1326 1417,1348 1417,1370 1417,1402 1417,1417 1417,1445 1417,1462 1417,1472 1417,1518 1417,1531 1417,1559 1417,1566 1417,1572 1417,1586 1417,1634 1417,1705 1417,1715 1417,1722 1417,1724 1417,1749 1417,1758 1417,1796 1417,1818 1417,1825 1417,1843 1417,1844 1417,1849 1417,1853 1417,1893 1417,1916 1417,1968 1417,1973 1417,1997 1417,2069 1417,2173 1417,2181 1417,2224 1417,2228 1417,2235 1417,2253 1417,2302 1417,2307 1417,2310 1417,2334 1417,2348 1417,2373 1417,2418 1417,2512 1417,2517 1417,2775 1417,2821 1417,2989 1417,2991 1417,2992 1417,2997 1417,3035 1417,3072 1417,3199 1417,3260 1417,3330 1417,3392 1417,3436 1417,3507 1417,3582 1417,3629 1417,3672 1417,3744 1417,3804 1417,3828 1417,3866 1417,3937 1417,4066 1417,4076 1417,4166 1417,4213 1417,4223 1417,4234 1417,4244 1417,4286 1417,4355 1417,4565 1417,4672 1417,4771 1417,5061 1417,5163 1417,5178 1417,5192 1417,5208 1417,5494 1417,5631 1417,5646 1417,5656 1417,5670 1417,5827 1417,6032 1417,6452 1417,6695 1417,6790 1417,6869 1417,6955 1417,7041 1417,7118 1417,7287 1417,7301 1417,7440 1417,7775 1417,7880 1417,7891 1417,8463 1417,8606 1417,9093 1417,9138 1417,9457 1417,9484 1417,9743 1417,13306 1417,13524 1417,13606 1417,13712 1417,13980 1417,14246 1417,14410 1417,14612 1417,14623 1417,15135 1417,15245 1417,15454 1417,16357 1417,17116 1417,17318 1417,17608 1417,17837 1417,18313 1417,18433 1417,18627 1417,18956 1417,18962 1417,19005 1417,19139 1417,19307 1417,19509 1417,19716 1417,19844 1417,19859 1417,20686 1417,20738 1417,20757 1417,21382 1417,21414 1417,21825 1417,22063 1417,22378 1417,22401 1417,22430 1417,22808 1417,23087 1417,23231 1417,23407 1417,23461 1417,24632 1417,24646 1417,24653 1417,24824 1417,25469 1417,25654 1417,26133 1417,26268 1417,26479 1417,26696 1417,27808 1417,28130 1417,28353 1417,28553 1417,28977 1417,29743 1417,29828 1417,30373 1417,30478 1417,30507 1417,30601 1417,30617 1417,30735 1417,30736 1417,30843 1417,31246 1417,31280 1417,31358 1417,31963 1417,32347 1417,32625 1417,32929 1417,33135 1417,33332 1417,33558 1417,34183 1417,34390 1417,34820 1417,35963 1417,36042 1417,36978 1417,36989 1417,37852 1417,38203 1417,38565 1417,38966 1417,39537 1417,39591 1417,39684 1417,39759 1417,40531 1417,40669 1417,41019 1417,41136 1417,41258 1417,41893 1417,42186 1417,42685 1417,42761 1417,42800 1417,43225 1417,43236 1417,44304 1417,44380 1417,45229 1417,45427 1417,45492 1417,45502 1417,45639 1417,46748 1417,46839 1417,47106 1417,47121 1417,47193 1417,48034 1417,48099 1417,48124 1417,48208 1417,48564 1417,48612 1417,48718 1417,48902 1417,48951 1417,49183 1417,49753 1417,50241 1417,51126 1417,51799 1417,52539 1417,52572 1417,53927 1417,54489 1417,54543 1417,54616 1417,54910 1417,55665 1417,56791 1417,58175 1417,59012 1417,59328 1417,59344 1417,59632 1417,59805 1417,59807 1417,59809 1417,59872 1417,59998 1417,61411 1417,61425 1417,62078 1417,62241 1417,62256 1417,62261 1417,62286 1417,62289 1417,62322 1417,62405 1417,62420 1417,62477 1417,62563 1417,63458 1417,63628 1417,63683 1417,66025 1417,66703 1417,67339 1417,67391 1417,68036 1417,68126 1417,68131 1417,68164 1417,68208 1417,68229 1417,68230 1417,68241 1417,69941 1417,71668 1417,73256 1417,73287 1417,74818 1417,75295 1417,75383 1417,75912 1417,76079 1417,76305 1417,76968 1417,77563 1417,78798 1417,78911 1417,80425 1417,80488 1417,80697 1417,80948 1417,80970 1417,80975 1417,81060 1417,81062 1417,81146 1417,82217 1417,83301 1417,85710 1417,86530 1417,86673 1417,86767 1417,87839 1417,88606 1417,89055 1417,89613 1417,89722 1417,89803 1417,90389 1417,90556 1417,90959 1417,91043 1417,91398 1417,92989 1417,93662 1417,94077 1417,95030 1417,95606 1417,96520 1417,97185 1417,97309 1417,97536 1417,97540 1417,97619 1417,97825 1417,98116 1417,98275 1417,98341 1417,98603 1417,98940 1417,99873 1417,101667 1417,101735 1417,102167 1417,102495 1417,102600 1417,102604 1417,102656 1417,103529 1417,105770 1417,106874 1417,107080 1417,107081 1417,107187 1417,107194 1417,107369 1417,107610 1417,107645 1417,108565 1417,109059 1417,109953 1417,110114 1417,111164 1417,111429 1417,113305 1417,115157 1417,115296 1417,115474 1417,117015 1417,117720 1417,118057 1417,118312 1417,118835 1417,118950 1417,119053 1417,119345 1417,119666 1417,120094 1417,120155 1417,120255 1417,120449 1417,121161 1417,121213 1417,121226 1417,121619 1417,122494 1417,124469 1417,124639 1417,124709 1417,124904 1417,124977 1417,124981 1417,124983 1417,124986 1417,124991 1417,124995 1417,124999 1417,125086 1417,125150 1417,125990 1417,127102 1417,127158 1417,127237 1417,128252 1417,128770 1417,130288 1417,130819 1417,130990 1417,131452 1417,131902 1417,131936 1417,132868 1417,132878 1417,132889 1417,133580 1417,134428 1417,134633 1417,134745 1417,134929 1417,136478 1417,136781 1417,138053 1417,138631 1417,138877 1417,140021 1417,140393 1417,140650 1417,141315 1417,141868 1417,142395 1417,143424 1417,144121 1417,144925 1417,144931 1417,144958 1417,145210 1417,146294 1417,147353 1417,147513 1417,147773 1417,147901 1417,147915 1417,147998 1417,149051 1417,150867 1417,151049 1417,151067 1417,151168 1417,151666 1417,151962 1417,152717 1417,153067 1417,153619 1417,154198 1417,154404 1417,155229 1417,157487 1417,158248 1417,158286 1417,158324 1417,158349 1417,158597 1417,158788 1417,158956 1417,159033 1417,159754 1417,160353 1417,160436 1417,161017 1417,161354 1417,161753 1417,161906 1417,161924 1417,161958 1417,162026 1417,162174 1417,163128 1417,163239 1417,164282 1417,165320 1417,165599 1417,166349 1417,167629 1417,167668 1417,168979 1417,169367 1417,169743 1417,170890 1417,171291 1417,171799 1417,172111 1417,172296 1417,172512 1417,172720 1417,172723 1417,173898 1417,174188 1417,174371 1417,174655 1417,175035 1417,176370 1417,176492 1417,176835 1417,176950 1417,178718 1417,178807 1417,179033 1417,180093 1417,180908 1417,182798 1417,182816 1417,182859 1417,183813 1417,183873 1417,183920 1417,184000 1417,185436 1417,185472 1417,185717 1417,186092 1417,188733 1417,189239 1417,189291 1417,190519 1417,191420 1417,191700 1417,191876 1417,193606 1417,193672 1417,194481 1417,195271 1417,198628 1417,203890 1417,204362 1417,205273 1417,205854 1417,207610 1417,207659 1417,212432 1417,212461 1417,215110 1417,215287 1417,215933 1417,216139 1417,216622 1417,216630 1417,216723 1417,216735 1417,216744 1417,216872 1417,217210 1417,217980 1417,218877 1417,219887 1417,220376 1417,220936 1417,220939 1417,222480 1417,224327 1417,228413 1417,228741 1417,229278 1417,232148 1417,232209 1417,232215 1417,233101 1417,234244 1417,234291 1417,234862 1417,239905 1417,241028 1417,243485 1417,245364 1417,249151 1417,249928 1417,252088 1417,252514 1417,254593 1417,255398 1417,258179 1417,258499 1417,263748 1417,264410 1417,264413 1417,264542 1418,34 1418,35 1418,217 1418,222 1418,283 1418,455 1418,536 1418,862 1418,996 1418,1274 1418,1419 1418,1465 1418,1466 1418,1467 1418,2274 1418,3135 1419,85 1419,120 1419,158 1419,240 1419,261 1419,332 1419,588 1419,590 1419,676 1419,694 1419,814 1419,852 1419,873 1419,949 1419,978 1419,1353 1419,1419 1419,1466 1419,1559 1419,1608 1419,1796 1419,1808 1419,1879 1419,2619 1419,2797 1419,2812 1419,2989 1419,2991 1419,3115 1419,3319 1419,3328 1419,3467 1419,3504 1419,4109 1419,4137 1419,4377 1419,4486 1419,4549 1419,5223 1419,5331 1419,5346 1419,5451 1419,5702 1419,6552 1419,6773 1419,7266 1419,7944 1419,8097 1419,9021 1419,13328 1419,13334 1419,14126 1419,14578 1419,15339 1419,15397 1419,15562 1419,15580 1419,15604 1419,15693 1419,15931 1419,16218 1419,16505 1419,18142 1419,18746 1419,19415 1419,19622 1419,19660 1419,20525 1419,20535 1419,20540 1419,20747 1419,20757 1419,22029 1419,22340 1419,22363 1419,23625 1419,26242 1419,28509 1419,29038 1419,29741 1419,31517 1419,31737 1419,32824 1419,33519 1419,34994 1419,35546 1419,38111 1419,38318 1419,38974 1419,40025 1419,41951 1419,42762 1419,45524 1419,46391 1419,46969 1419,48372 1419,48437 1419,48620 1419,49135 1419,49647 1419,49655 1419,50440 1419,55681 1419,56346 1419,61009 1419,61211 1419,62787 1419,66468 1419,72100 1419,72701 1419,79533 1419,80003 1419,84048 1419,88400 1419,102695 1419,104536 1419,108022 1419,109819 1419,123057 1419,124822 1419,125445 1419,130866 1419,133440 1419,136482 1419,136483 1419,136484 1419,136485 1419,136486 1419,136487 1419,136488 1419,136489 1419,136490 1419,136491 1419,136492 1419,136493 1419,136494 1419,136495 1419,136496 1419,136497 1419,136498 1419,136499 1419,136500 1419,136501 1419,136502 1419,136503 1419,136504 1419,136505 1419,136506 1419,136507 1419,136508 1419,136509 1419,136510 1419,147541 1419,153221 1419,243627 1419,252542 1419,254160 1420,147 1420,158 1420,195 1420,206 1420,422 1420,640 1420,1458 1420,1803 1420,2244 1420,80266 1420,89035 1421,167 1421,299 1421,1433 1422,287 1422,392 1422,433 1422,1634 1423,390 1423,1424 1423,4760 1424,106 1424,292 1424,390 1424,623 1424,1043 1424,1423 1424,1424 1424,1653 1424,1677 1424,1805 1424,2045 1424,2191 1424,3367 1424,3406 1424,3830 1424,4151 1424,4760 1424,5003 1424,5043 1424,5447 1424,6880 1424,7882 1424,14251 1424,31080 1424,31202 1424,41378 1424,41939 1424,60699 1424,71184 1424,94033 1424,131662 1424,157263 1424,206085 1424,207659 1424,221643 1424,235898 1425,1 1425,10 1425,50 1425,55 1425,56 1425,99 1425,106 1425,146 1425,147 1425,149 1425,158 1425,175 1425,184 1425,206 1425,285 1425,333 1425,336 1425,406 1425,422 1425,505 1425,602 1425,620 1425,640 1425,663 1425,664 1425,779 1425,841 1425,920 1425,1011 1425,1425 1425,1426 1425,1455 1425,1515 1425,2132 1425,2149 1425,2244 1425,2365 1425,2374 1425,3681 1425,3895 1425,4405 1425,4468 1425,4543 1425,4684 1425,5424 1425,5601 1425,6957 1425,7657 1425,8244 1425,9394 1425,9532 1425,9757 1425,13827 1425,14461 1425,14627 1425,15229 1425,15385 1425,15800 1425,18173 1425,18815 1425,19684 1425,21361 1425,21442 1425,21493 1425,22012 1425,23783 1425,24131 1425,24835 1425,25531 1425,26414 1425,26903 1425,27008 1425,27572 1425,28212 1425,28327 1425,28497 1425,30331 1425,38238 1425,38639 1425,43287 1425,43351 1425,44264 1425,44833 1425,49210 1425,49419 1425,55254 1425,55585 1425,58991 1425,59147 1425,60576 1425,65809 1425,67445 1425,67978 1425,73323 1425,76206 1425,77486 1425,77555 1425,77763 1425,82974 1425,84693 1425,87384 1425,91426 1425,92476 1425,92792 1425,94237 1425,94331 1425,97392 1425,97650 1425,99787 1425,99789 1425,99819 1425,102560 1425,103852 1425,104926 1425,106502 1425,109367 1425,109369 1425,109538 1425,118038 1425,118336 1425,120634 1425,123890 1425,124889 1425,125462 1425,125754 1425,126059 1425,126085 1425,132860 1425,135111 1425,140017 1425,141790 1425,144895 1425,148601 1425,158589 1425,165311 1425,165327 1425,165456 1425,165457 1425,165865 1425,167051 1425,167620 1425,170562 1425,170644 1425,170928 1425,173272 1425,173443 1425,175925 1425,180367 1425,181836 1425,183768 1425,187293 1425,187391 1425,193044 1425,220502 1425,230310 1425,230572 1425,240174 1425,247337 1425,254450 1425,260752 1426,1425 1427,65 1427,500 1428,736 1429,259 1429,327 1429,577 1429,596 1429,726 1429,859 1429,950 1429,1105 1429,1209 1429,1367 1429,1678 1429,1858 1429,2178 1429,2253 1429,2362 1429,3490 1429,3587 1429,5279 1429,5690 1429,13413 1429,14678 1429,15386 1429,16790 1429,18502 1429,18559 1429,20493 1429,22835 1429,23045 1429,23863 1429,24551 1429,30229 1429,34656 1429,36257 1429,38160 1429,38869 1429,39048 1429,39545 1429,41282 1429,43244 1429,43258 1429,43278 1429,43326 1429,43329 1429,43355 1429,43449 1429,45724 1429,45731 1429,45749 1429,45758 1429,46285 1429,57143 1429,58505 1429,58507 1429,66696 1429,76944 1429,77108 1430,10 1430,146 1430,336 1430,602 1430,16019 1430,106502 1431,1432 1431,2372 1432,5 1432,26 1432,59 1432,94 1432,104 1432,134 1432,137 1432,138 1432,636 1432,715 1432,967 1432,1001 1432,1212 1432,1235 1432,1282 1432,1368 1432,1415 1432,1431 1432,1432 1432,1684 1432,2205 1432,2674 1432,2893 1432,3794 1432,4114 1432,4276 1432,5700 1432,5871 1432,6054 1432,6621 1432,7084 1432,7263 1432,7958 1432,12556 1432,15742 1432,21205 1432,21944 1432,25636 1432,25847 1432,26296 1432,27886 1432,28126 1432,28133 1432,31893 1432,33424 1432,34060 1432,58533 1432,59273 1432,71229 1432,71809 1432,84390 1432,84411 1432,92711 1432,99756 1432,109269 1432,133458 1432,148076 1432,161590 1432,161648 1432,182606 1432,183262 1432,188873 1432,189406 1432,190400 1432,191955 1432,194896 1432,195049 1432,205627 1432,219770 1432,223023 1432,244401 1433,65 1433,66 1433,171 1433,217 1433,259 1433,264 1433,314 1433,577 1433,788 1433,868 1433,1019 1433,1421 1433,1433 1433,1494 1433,1531 1433,1586 1433,1844 1433,2666 1433,2895 1433,2908 1433,3436 1433,3569 1433,3744 1433,3853 1433,3927 1433,4446 1433,5494 1433,5596 1433,5625 1433,7165 1433,7178 1433,7880 1433,8183 1433,8535 1433,15199 1433,18601 1433,19538 1433,19716 1433,20496 1433,20619 1433,21231 1433,21411 1433,21413 1433,21520 1433,23616 1433,23699 1433,28362 1433,29585 1433,29870 1433,30402 1433,31144 1433,31268 1433,32585 1433,34232 1433,35435 1433,35539 1434,11 1434,240 1434,512 1434,572 1434,599 1434,685 1434,712 1434,838 1434,911 1434,1014 1434,1087 1434,1172 1434,1284 1434,1434 1434,1566 1434,1659 1434,1844 1434,1955 1434,2173 1434,2286 1434,3507 1434,3804 1434,3967 1434,4158 1434,14674 1434,20757 1434,23740 1434,37124 1434,38908 1434,39380 1434,43243 1434,62318 1434,62337 1434,96478 1434,104627 1434,127726 1434,142126 1434,143528 1434,151093 1434,174274 1434,181637 1434,183312 1434,183805 1434,215874 1434,216044 1435,356 1435,393 1435,671 1435,852 1435,893 1435,1012 1435,1243 1435,1309 1436,167 1436,356 1436,522 1436,567 1436,589 1436,663 1436,664 1436,666 1436,685 1436,750 1436,762 1436,838 1436,937 1436,972 1436,973 1436,1011 1436,1014 1436,1167 1436,1241 1436,1284 1436,1298 1436,1300 1436,1436 1436,1437 1436,1522 1436,1544 1436,1566 1436,1635 1436,1849 1436,2083 1436,2979 1436,3207 1436,3392 1436,3774 1436,5153 1436,5382 1436,5563 1436,6904 1436,7980 1436,15318 1436,20747 1436,21981 1436,25662 1436,26859 1436,28295 1436,28802 1436,30328 1436,32577 1436,32967 1436,33295 1436,35063 1436,36745 1436,38994 1436,44082 1436,46268 1436,46425 1436,49020 1436,59143 1436,60500 1436,61213 1436,62759 1436,63081 1436,64154 1436,68088 1436,72726 1436,77675 1436,85916 1436,87100 1436,87350 1436,88173 1436,92922 1436,96510 1436,96574 1436,96685 1436,97423 1436,98111 1436,101833 1436,102755 1436,104522 1436,106142 1436,111319 1436,112264 1436,118315 1436,120155 1436,121516 1436,123936 1436,126863 1436,126866 1436,130817 1436,135333 1436,143752 1436,145057 1436,146645 1436,150861 1436,152298 1436,152606 1436,157029 1436,158915 1436,159724 1436,160371 1436,160376 1436,176967 1436,180397 1436,180609 1436,182523 1436,183887 1436,185020 1436,185292 1436,185884 1436,193022 1436,193559 1436,199852 1436,221734 1436,221910 1436,222482 1436,227061 1436,232079 1436,234073 1436,236698 1436,237319 1436,237381 1436,243369 1436,244717 1436,244775 1436,247366 1436,249055 1437,1436 1437,1801 1438,72 1439,720 1439,1117 1440,252 1440,318 1440,41170 1442,615 1443,151 1444,1240 1446,1447 1448,306 1448,307 1449,58 1449,111 1449,256 1449,292 1449,441 1449,801 1449,911 1449,1235 1449,1238 1449,1450 1449,1688 1449,2163 1449,2334 1449,2373 1449,3241 1449,3474 1449,4190 1449,4771 1449,5741 1449,7087 1449,7921 1449,14344 1449,14633 1449,18386 1449,18838 1449,19777 1449,25646 1449,37042 1449,56089 1449,58916 1449,68006 1449,82114 1449,99133 1449,107974 1451,1452 1452,440 1452,838 1452,1191 1452,3507 1452,5440 1452,14674 1453,87 1453,126 1453,264 1453,292 1453,509 1453,510 1453,535 1453,673 1453,818 1453,872 1453,911 1453,919 1453,1192 1453,1204 1453,1298 1453,1572 1453,1653 1453,1722 1453,2173 1453,2253 1453,2373 1453,3507 1453,4039 1453,127158 1454,87 1454,182 1454,248 1454,326 1454,397 1454,425 1454,440 1454,457 1454,535 1454,599 1454,623 1454,673 1454,808 1454,852 1454,872 1454,1011 1454,1014 1454,1240 1454,1262 1454,1465 1454,1653 1454,1805 1454,1949 1454,2253 1454,2373 1454,3507 1454,4039 1456,79 1456,192 1456,202 1456,203 1456,406 1456,516 1456,726 1456,980 1456,1181 1456,1370 1456,1531 1456,1659 1457,151 1458,1 1458,147 1458,158 1458,175 1458,206 1458,336 1458,422 1458,640 1458,1458 1458,1623 1458,2244 1458,3071 1458,3895 1458,5592 1458,7128 1458,9394 1458,15795 1458,16891 1458,17139 1458,21826 1458,71835 1458,79715 1458,80266 1458,89035 1458,89448 1458,92476 1458,118336 1458,138472 1458,149534 1458,166338 1458,172229 1458,173692 1458,182606 1458,193680 1458,199280 1458,212056 1458,232147 1458,240174 1458,253353 1458,258978 1458,259774 1458,261402 1460,726 1461,483 1463,264 1463,467 1463,525 1463,1381 1463,1531 1463,1551 1464,56 1464,79 1464,146 1464,147 1464,149 1464,158 1464,192 1464,206 1464,278 1464,333 1464,336 1464,397 1464,406 1464,422 1464,525 1464,602 1464,779 1464,841 1464,920 1464,1001 1464,1089 1464,1118 1464,1181 1464,1192 1464,1210 1464,1515 1464,1531 1464,1663 1464,2173 1464,2244 1464,2867 1464,2868 1464,3585 1464,3895 1464,18638 1464,30331 1464,65809 1464,68069 1464,75912 1464,92476 1465,32 1465,175 1465,392 1465,599 1465,623 1465,685 1465,697 1465,808 1465,818 1465,918 1465,1005 1465,1130 1465,1140 1465,1240 1465,1363 1465,1454 1465,1513 1465,1805 1465,1836 1465,1860 1465,1949 1465,2246 1465,2494 1465,3260 1465,3432 1465,4601 1465,4692 1465,4759 1465,5433 1465,5880 1465,6059 1465,6883 1465,7098 1465,7731 1465,8156 1465,8661 1465,15673 1465,16969 1465,20426 1465,22148 1465,22506 1465,26058 1465,26484 1465,27030 1465,27042 1465,28450 1465,30591 1465,31414 1465,34863 1465,35562 1465,37016 1465,46032 1465,46368 1465,48827 1465,60500 1465,61144 1465,65650 1465,68677 1465,68681 1465,71573 1465,89962 1465,92938 1465,93000 1465,94772 1465,94993 1465,95039 1465,97351 1465,99438 1465,99602 1465,102557 1465,102606 1465,102607 1465,102610 1465,102611 1465,102613 1465,102615 1465,102617 1465,103319 1465,104522 1465,112321 1465,112789 1465,115361 1465,115479 1465,118893 1465,121950 1465,122398 1465,127158 1465,132857 1465,134619 1465,134750 1465,138737 1465,140656 1465,142340 1465,156672 1465,158592 1465,160309 1465,160514 1465,162950 1465,175997 1465,176795 1465,193689 1465,194922 1465,194933 1465,202767 1465,205710 1465,212889 1465,216777 1465,217836 1465,218429 1465,221702 1465,230283 1465,231299 1465,231917 1465,234781 1465,238650 1465,241678 1465,244672 1465,254409 1465,262322 1465,263216 1465,263708 1465,263788 1466,68 1466,111 1466,120 1466,182 1466,240 1466,261 1466,332 1466,392 1466,588 1466,590 1466,694 1466,715 1466,903 1466,1014 1466,1210 1466,1285 1466,1309 1466,1353 1466,1395 1466,1419 1466,1466 1466,1505 1466,1634 1466,1796 1466,1955 1466,2418 1466,2512 1466,3115 1466,3650 1466,4520 1466,5346 1466,7041 1466,7221 1466,7266 1466,11147 1466,15183 1466,15424 1466,15693 1466,15931 1466,19525 1466,19528 1466,20525 1466,20592 1466,22233 1466,23507 1466,28282 1466,30545 1466,33703 1466,35454 1466,35546 1466,43223 1466,43341 1466,44158 1466,46234 1466,48660 1466,59787 1466,63070 1466,85724 1466,93556 1466,95653 1466,97545 1466,109819 1466,111330 1466,114165 1466,116590 1466,116629 1466,131810 1466,131926 1466,132930 1466,154819 1466,160450 1466,162919 1466,183873 1466,189754 1466,189837 1466,191376 1466,191883 1466,194920 1466,213725 1466,223714 1466,238996 1466,249055 1466,249209 1467,34 1467,35 1467,222 1467,278 1467,283 1467,313 1467,389 1467,455 1467,599 1467,814 1467,852 1467,951 1467,1019 1467,1467 1467,1539 1467,1696 1467,1724 1467,1871 1467,1894 1467,2421 1467,2507 1467,2979 1467,3499 1467,5178 1467,5905 1467,7902 1467,13540 1467,18572 1467,18650 1467,22184 1467,23636 1467,25670 1467,29691 1467,32462 1467,35695 1467,36600 1467,37088 1467,37354 1467,39561 1467,42032 1467,42674 1467,43204 1467,43216 1467,43660 1467,48487 1467,50816 1467,60457 1467,61761 1467,62829 1467,66804 1467,68245 1467,71064 1467,72820 1467,76209 1467,76971 1467,77702 1467,78644 1467,79289 1467,79982 1467,83301 1467,83340 1467,83882 1467,87906 1467,89673 1467,91765 1467,93636 1467,94901 1467,103326 1467,105317 1467,107169 1467,112930 1467,115474 1467,117231 1467,124572 1467,125229 1467,130531 1467,131216 1467,132587 1467,141567 1467,147504 1467,148867 1467,149255 1467,150850 1467,150853 1467,161203 1467,163392 1467,163394 1467,163541 1467,164283 1467,174823 1467,175306 1467,175955 1467,175989 1467,178473 1467,178657 1467,180502 1467,182481 1467,182647 1467,191530 1467,207679 1467,211889 1467,219670 1467,219671 1467,221753 1467,221855 1467,223656 1467,224792 1467,228472 1467,232245 1467,236740 1467,236790 1467,238077 1467,238274 1467,247454 1467,255033 1467,255079 1467,257784 1467,259912 1467,262584 1467,263207 1468,811 1469,79 1469,211 1469,422 1469,602 1469,1151 1469,152855 1470,215 1470,240 1470,298 1470,372 1470,417 1470,631 1470,760 1470,932 1470,1082 1470,1085 1470,1285 1470,1608 1470,1715 1470,1785 1470,1818 1470,1955 1470,1962 1470,2205 1470,2296 1470,33424 1471,634 1472,167 1472,182 1472,217 1472,252 1472,467 1472,516 1472,571 1472,599 1472,631 1472,872 1472,1085 1472,1204 1472,1417 1472,1663 1472,1796 1472,3507 1473,65 1473,66 1473,143 1473,1052 1474,20 1474,346 1474,435 1474,439 1474,447 1474,671 1474,788 1474,996 1474,1011 1474,1033 1474,1068 1474,1294 1474,1474 1474,1475 1474,1612 1474,1644 1474,1721 1474,1789 1474,1897 1474,1923 1474,2094 1474,2138 1474,2354 1474,3588 1474,3831 1474,3844 1474,3903 1474,4074 1474,4160 1474,4246 1474,4426 1474,6546 1474,6661 1474,7087 1474,8094 1474,13402 1474,14633 1474,15355 1474,16218 1474,17957 1474,24659 1474,26785 1474,31195 1474,31593 1474,35412 1474,36626 1474,38822 1474,45721 1474,46838 1474,48237 1474,53306 1474,54613 1474,57059 1474,58203 1474,62195 1474,62937 1474,65853 1474,68142 1474,80984 1474,82872 1474,90933 1474,99778 1474,106984 1474,114008 1474,114881 1474,119352 1474,119468 1474,120155 1474,122003 1474,130432 1474,131353 1474,131673 1474,159075 1474,159460 1474,164017 1474,165064 1474,173226 1474,173700 1474,177571 1474,190492 1474,191210 1474,191468 1474,192370 1474,215464 1474,226655 1474,233983 1474,242199 1474,248933 1474,251344 1475,1474 1476,1181 1477,104 1477,136 1477,850 1478,843 1478,1479 1479,299 1479,388 1479,459 1479,744 1479,808 1479,1001 1479,1012 1479,1013 1479,1092 1479,1319 1479,1522 1479,1575 1479,1849 1479,1973 1479,2252 1479,2480 1479,2557 1479,2840 1479,3218 1479,3766 1479,3871 1479,4039 1479,4206 1479,4329 1479,4433 1479,5662 1479,6637 1479,6780 1479,8187 1479,13506 1479,13593 1479,14674 1479,16260 1479,20396 1479,20575 1479,20757 1479,24579 1479,26166 1479,27118 1479,29849 1479,31785 1479,32226 1479,32784 1479,36589 1479,37523 1479,41798 1479,42773 1479,46091 1479,56672 1479,58985 1479,60477 1479,62983 1479,68674 1479,80982 1479,83830 1479,98076 1479,102698 1479,129942 1479,130211 1479,130935 1479,130941 1479,138108 1479,138111 1479,138112 1479,144907 1479,146074 1479,158585 1479,164380 1479,178541 1479,180038 1479,182786 1479,184757 1479,184915 1479,189798 1479,195485 1479,221904 1479,256396 1479,256401 1479,258378 1479,260118 1480,406 1481,289 1481,290 1481,94134 1481,144988 1482,58 1483,408 1484,835 1485,97 1486,137 1486,298 1486,302 1486,340 1486,479 1486,563 1486,736 1486,827 1486,919 1486,1058 1486,1087 1486,5192 1486,7757 1486,13538 1486,90845 1487,390 1487,510 1487,1284 1487,5366 1488,72 1488,704 1488,1149 1489,760 1489,1149 1490,328 1491,56 1492,620 1492,8244 1493,663 1493,664 1493,932 1493,1849 1493,3207 1493,5662 1494,217 1494,440 1494,452 1494,467 1494,493 1494,497 1494,1010 1494,1085 1494,1433 1494,1844 1494,3804 1495,24 1495,25 1495,26 1495,28 1495,33 1495,40 1495,47 1495,59 1495,60 1495,117 1495,143 1495,885 1495,887 1495,1235 1495,1255 1495,1335 1495,1432 1495,1684 1495,1775 1495,2088 1495,2469 1495,2674 1495,2712 1495,3561 1495,4079 1495,4571 1495,5826 1495,9539 1495,9541 1495,9542 1495,21944 1495,44244 1495,50943 1495,154690 1495,171294 1496,459 1497,422 1498,30 1498,184 1498,328 1498,439 1498,920 1498,1089 1498,1370 1498,1619 1498,8854 1499,1500 1500,203 1500,256 1500,277 1500,438 1500,664 1500,1222 1500,1501 1500,1511 1500,1512 1500,3194 1500,8244 1500,21736 1500,72439 1500,92476 1500,106502 1502,34 1502,35 1502,146 1502,285 1502,349 1502,392 1502,433 1502,623 1502,718 1502,779 1502,1181 1502,1515 1502,1590 1502,1644 1502,1805 1502,1844 1502,21442 1502,68069 1502,141912 1503,852 1504,146 1504,313 1504,682 1504,685 1504,775 1504,841 1504,862 1504,900 1504,911 1504,918 1504,1608 1504,1888 1504,1985 1504,2310 1504,2590 1504,56150 1504,72439 1504,92476 1504,189839 1505,104 1505,120 1505,248 1505,289 1505,290 1505,372 1505,599 1505,631 1505,640 1505,714 1505,760 1505,805 1505,1016 1505,1085 1505,1192 1505,1282 1505,1402 1505,1419 1505,1462 1505,1505 1505,1506 1505,1608 1505,1818 1505,1973 1505,2205 1505,2206 1505,2286 1505,2620 1505,2989 1505,2991 1505,4752 1505,8537 1505,15397 1505,17607 1505,52523 1505,57801 1505,57802 1505,96238 1505,115979 1505,127781 1505,143413 1505,143414 1505,143415 1506,588 1506,590 1506,805 1506,1505 1506,1519 1506,6025 1506,6133 1506,7294 1506,9380 1506,15638 1506,16483 1506,16485 1506,16486 1506,16504 1506,16515 1506,17678 1506,19026 1506,24697 1506,35463 1506,37050 1506,37736 1506,37761 1506,40903 1506,42587 1506,43877 1506,47881 1506,59786 1506,62304 1506,64544 1506,66197 1506,78834 1506,78965 1506,81458 1506,82669 1507,358 1507,467 1508,264 1508,1127 1508,1381 1508,1509 1508,1893 1509,10 1509,192 1509,227 1509,314 1509,425 1509,599 1509,805 1509,838 1509,1011 1509,1509 1509,1973 1509,4066 1510,620 1510,8244 1511,805 1511,932 1511,1511 1511,2210 1511,2376 1511,3069 1511,4237 1511,14603 1511,22524 1511,33727 1511,35876 1511,46736 1511,57722 1511,58475 1511,58557 1511,73485 1511,77878 1511,103366 1511,116266 1511,137941 1511,160544 1511,163540 1511,179928 1511,186589 1511,197972 1511,213860 1511,229234 1511,230529 1511,234853 1511,242293 1511,243036 1511,243037 1511,243038 1511,243039 1511,243040 1511,243041 1511,243042 1511,243043 1511,243044 1511,244669 1511,249364 1511,256625 1511,259623 1511,261042 1512,251 1512,252 1512,493 1512,516 1512,682 1512,733 1512,1220 1512,1222 1512,1243 1512,1474 1512,1512 1512,1568 1512,2528 1512,2775 1512,2944 1512,5353 1512,5992 1512,6075 1512,7385 1512,7952 1512,9717 1512,14037 1512,16906 1512,19467 1512,21435 1512,22204 1512,32636 1512,34619 1512,41170 1512,45462 1512,50980 1512,72439 1512,131756 1512,134525 1512,135524 1512,174982 1512,186147 1512,189794 1512,212381 1512,217581 1512,223738 1512,243272 1512,261872 1513,83 1513,392 1513,455 1513,623 1513,697 1513,808 1513,852 1513,1240 1513,1454 1513,1465 1513,1805 1513,2572 1513,6059 1514,1515 1515,1 1515,10 1515,50 1515,99 1515,146 1515,147 1515,149 1515,158 1515,175 1515,195 1515,285 1515,333 1515,336 1515,358 1515,406 1515,422 1515,425 1515,505 1515,509 1515,510 1515,602 1515,620 1515,622 1515,640 1515,685 1515,778 1515,779 1515,818 1515,841 1515,849 1515,875 1515,1003 1515,1011 1515,1033 1515,1181 1515,1192 1515,1218 1515,1370 1515,1425 1515,1464 1515,1502 1515,1514 1515,1515 1515,1825 1515,1848 1515,2132 1515,2374 1515,2792 1515,3009 1515,3442 1515,3539 1515,3544 1515,3895 1515,3922 1515,4663 1515,4977 1515,5049 1515,5246 1515,5333 1515,5356 1515,5601 1515,5660 1515,6343 1515,6346 1515,7494 1515,8055 1515,8067 1515,8244 1515,8680 1515,8971 1515,9394 1515,13197 1515,13283 1515,13493 1515,13687 1515,13975 1515,13994 1515,14023 1515,14065 1515,14345 1515,14700 1515,15039 1515,15112 1515,15800 1515,16307 1515,16341 1515,16870 1515,17116 1515,17984 1515,19584 1515,19690 1515,19782 1515,19919 1515,20160 1515,20642 1515,20942 1515,21121 1515,21442 1515,23953 1515,23991 1515,24113 1515,24148 1515,24164 1515,24172 1515,24185 1515,24187 1515,24198 1515,24835 1515,25649 1515,26414 1515,26415 1515,26972 1515,26992 1515,27012 1515,28489 1515,28954 1515,28969 1515,30331 1515,30570 1515,31434 1515,34088 1515,34670 1515,35000 1515,36535 1515,37720 1515,40045 1515,40889 1515,41385 1515,42508 1515,43239 1515,44110 1515,45495 1515,47255 1515,56242 1515,56461 1515,56519 1515,56557 1515,58131 1515,62378 1515,62530 1515,63126 1515,63585 1515,66548 1515,66767 1515,67150 1515,68012 1515,68069 1515,70201 1515,77172 1515,79690 1515,82886 1515,82901 1515,83890 1515,87063 1515,88798 1515,89035 1515,89256 1515,89960 1515,92476 1515,94092 1515,94353 1515,98615 1515,99005 1515,102560 1515,104657 1515,105204 1515,107017 1515,107021 1515,107379 1515,112559 1515,113623 1515,115854 1515,115868 1515,116718 1515,118049 1515,118336 1515,119454 1515,120006 1515,121337 1515,125583 1515,126214 1515,129926 1515,131083 1515,132609 1515,134846 1515,134856 1515,134965 1515,136159 1515,137786 1515,137790 1515,137795 1515,139835 1515,141913 1515,141924 1515,142881 1515,143568 1515,147614 1515,147698 1515,148601 1515,153410 1515,158571 1515,161362 1515,170562 1515,170782 1515,173720 1515,175324 1515,178876 1515,180187 1515,180376 1515,182535 1515,187910 1515,191249 1515,191666 1515,191963 1515,194968 1515,216403 1515,219724 1515,220502 1515,222136 1515,224739 1515,229292 1515,237013 1515,237502 1515,237571 1515,239553 1515,242826 1515,243361 1515,249279 1515,251496 1515,254002 1515,259317 1515,260886 1515,260902 1515,262017 1515,263754 1516,1181 1517,1 1517,50 1517,147 1517,202 1517,252 1517,868 1517,1181 1517,21944 1518,10 1518,63 1518,79 1518,140 1518,147 1518,149 1518,158 1518,167 1518,192 1518,217 1518,240 1518,248 1518,264 1518,301 1518,302 1518,314 1518,333 1518,349 1518,352 1518,356 1518,392 1518,397 1518,406 1518,435 1518,439 1518,457 1518,467 1518,479 1518,493 1518,497 1518,505 1518,510 1518,516 1518,586 1518,599 1518,622 1518,673 1518,676 1518,697 1518,779 1518,818 1518,838 1518,849 1518,872 1518,920 1518,1010 1518,1011 1518,1014 1518,1019 1518,1085 1518,1118 1518,1172 1518,1204 1518,1210 1518,1240 1518,1262 1518,1298 1518,1370 1518,1417 1518,1425 1518,1433 1518,1462 1518,1531 1518,1612 1518,1619 1518,1634 1518,1796 1518,1805 1518,1844 1518,1860 1518,1893 1518,1943 1518,2173 1518,2205 1518,2206 1518,2253 1518,3321 1518,3744 1518,3804 1518,4165 1518,6452 1518,7124 1518,8537 1518,19413 1518,30331 1518,42064 1518,102560 1518,118336 1518,127158 1518,215874 1519,1506 1520,450 1520,1332 1521,1 1521,50 1521,79 1521,147 1521,149 1521,158 1521,252 1521,333 1521,336 1521,406 1521,622 1521,141912 1522,86 1522,167 1522,240 1522,299 1522,372 1522,528 1522,534 1522,536 1522,589 1522,599 1522,794 1522,832 1522,838 1522,852 1522,907 1522,972 1522,1001 1522,1010 1522,1011 1522,1013 1522,1014 1522,1045 1522,1081 1522,1085 1522,1122 1522,1167 1522,1241 1522,1284 1522,1319 1522,1436 1522,1479 1522,1522 1522,1544 1522,1663 1522,1732 1522,1782 1522,1849 1522,1869 1522,2083 1522,2095 1522,2372 1522,2373 1522,2479 1522,2557 1522,2588 1522,2840 1522,2979 1522,3207 1522,4159 1522,4308 1522,4514 1522,5185 1522,5186 1522,5382 1522,5562 1522,6650 1522,7017 1522,8107 1522,8317 1522,8436 1522,8534 1522,13489 1522,13505 1522,14572 1522,16192 1522,16428 1522,18433 1522,18859 1522,20813 1522,22062 1522,22654 1522,24924 1522,25523 1522,26950 1522,31231 1522,31785 1522,32784 1522,34355 1522,35545 1522,35684 1522,36589 1522,36694 1522,37617 1522,37745 1522,38300 1522,43288 1522,45427 1522,47153 1522,49125 1522,49176 1522,49178 1522,52912 1522,58450 1522,63203 1522,64708 1522,67060 1522,67995 1522,73570 1522,75912 1522,76978 1522,77716 1522,79734 1522,82234 1522,84611 1522,85956 1522,86488 1522,109279 1522,109352 1522,111316 1522,114607 1522,116780 1522,122558 1522,122690 1522,123381 1522,127158 1522,127858 1522,128471 1522,128929 1522,129942 1522,133386 1522,135145 1522,140785 1522,140898 1522,141809 1522,145407 1522,146023 1522,146688 1522,151498 1522,151522 1522,152039 1522,152185 1522,153648 1522,153859 1522,160490 1522,163898 1522,164368 1522,165282 1522,165428 1522,165435 1522,165888 1522,168394 1522,170091 1522,170098 1522,170596 1522,172908 1522,177923 1522,179037 1522,179061 1522,180837 1522,192093 1522,216392 1522,217265 1522,222950 1522,225518 1522,227890 1522,229082 1522,236194 1522,255235 1522,255747 1522,257036 1522,260072 1522,261346 1523,620 1524,581 1525,222 1525,278 1525,283 1525,657 1525,1019 1525,1860 1525,33508 1526,634 1526,784 1526,1052 1526,2701 1526,29008 1527,10 1527,72 1527,333 1527,652 1529,175 1529,704 1529,1572 1530,1531 1531,182 1531,186 1531,192 1531,217 1531,240 1531,259 1531,264 1531,272 1531,301 1531,302 1531,327 1531,333 1531,393 1531,397 1531,406 1531,425 1531,435 1531,452 1531,457 1531,467 1531,493 1531,497 1531,500 1531,510 1531,516 1531,577 1531,589 1531,599 1531,622 1531,673 1531,726 1531,766 1531,779 1531,788 1531,794 1531,808 1531,818 1531,859 1531,872 1531,920 1531,939 1531,980 1531,1010 1531,1011 1531,1014 1531,1085 1531,1118 1531,1180 1531,1181 1531,1192 1531,1204 1531,1298 1531,1326 1531,1370 1531,1388 1531,1417 1531,1433 1531,1456 1531,1463 1531,1464 1531,1518 1531,1530 1531,1531 1531,1545 1531,1659 1531,1796 1531,1825 1531,1853 1531,1947 1531,1992 1531,2099 1531,2106 1531,2119 1531,2173 1531,2178 1531,2266 1531,2307 1531,2400 1531,2459 1531,2556 1531,2710 1531,2959 1531,3407 1531,3694 1531,4137 1531,4165 1531,4315 1531,4446 1531,4455 1531,4545 1531,4611 1531,5563 1531,5654 1531,6088 1531,6473 1531,6853 1531,6904 1531,7018 1531,7076 1531,7165 1531,7344 1531,7880 1531,8157 1531,9111 1531,9527 1531,9579 1531,9719 1531,13207 1531,13328 1531,13382 1531,13771 1531,13862 1531,14140 1531,14232 1531,14246 1531,14506 1531,14574 1531,15386 1531,15423 1531,15980 1531,17310 1531,17837 1531,17913 1531,18102 1531,19318 1531,19691 1531,19694 1531,19695 1531,19696 1531,19859 1531,20559 1531,20598 1531,20618 1531,21648 1531,22138 1531,24565 1531,24875 1531,24934 1531,25685 1531,26133 1531,26786 1531,28312 1531,28545 1531,28895 1531,29185 1531,29407 1531,29722 1531,29926 1531,29927 1531,30164 1531,30373 1531,33424 1531,37095 1531,37149 1531,37470 1531,37727 1531,37852 1531,38391 1531,38393 1531,42492 1531,43364 1531,44377 1531,47502 1531,47953 1531,48026 1531,48362 1531,48506 1531,49337 1531,50113 1531,50127 1531,50129 1531,50131 1531,50144 1531,50154 1531,50155 1531,50233 1531,50335 1531,51087 1531,51417 1531,51971 1531,52539 1531,52646 1531,53091 1531,53482 1531,54765 1531,55879 1531,56150 1531,56338 1531,56413 1531,56576 1531,56584 1531,56801 1531,57012 1531,57169 1531,58338 1531,58943 1531,59093 1531,59127 1531,59297 1531,59391 1531,59423 1531,59691 1531,59795 1531,59834 1531,59863 1531,59897 1531,59944 1531,59969 1531,60014 1531,60016 1531,60044 1531,60046 1531,60161 1531,60172 1531,60223 1531,60396 1531,60439 1531,60517 1531,60551 1531,60609 1531,60685 1531,60746 1531,60847 1531,60861 1531,60884 1531,60912 1531,60927 1531,61013 1531,61086 1531,61159 1531,61326 1531,61331 1531,62758 1531,62959 1531,63081 1531,64765 1531,64768 1531,65651 1531,66783 1531,67093 1531,67166 1531,67207 1531,67208 1531,67227 1531,67243 1531,67246 1531,67256 1531,67263 1531,67264 1531,67282 1531,67289 1531,67291 1531,67302 1531,67303 1531,67304 1531,67316 1531,67373 1531,67382 1531,67844 1531,68137 1531,68676 1531,68727 1531,70853 1531,71163 1531,71696 1531,72876 1531,75883 1531,76085 1531,78458 1531,79391 1531,81218 1531,83501 1531,85028 1531,85473 1531,85752 1531,86840 1531,87767 1531,87869 1531,88001 1531,88571 1531,88584 1531,89273 1531,89449 1531,89497 1531,89565 1531,90546 1531,90649 1531,90668 1531,90705 1531,90706 1531,91016 1531,91048 1531,93845 1531,94824 1531,94825 1531,94843 1531,94844 1531,94852 1531,95013 1531,96714 1531,96716 1531,96717 1531,96723 1531,98152 1531,98817 1531,102759 1531,103287 1531,110982 1531,112016 1531,115679 1531,120045 1531,121274 1531,121769 1531,124508 1531,126841 1531,127158 1531,128043 1531,134650 1531,136590 1531,138053 1531,144916 1531,148327 1531,152598 1531,157686 1531,157749 1531,163016 1531,171648 1531,176498 1531,177561 1531,177917 1531,178231 1531,179222 1531,180969 1531,182308 1531,194951 1531,212567 1531,213185 1531,222463 1531,224764 1531,224923 1531,225309 1531,229252 1531,232126 1531,232678 1531,238441 1531,243369 1531,247184 1531,257370 1531,257502 1531,261047 1531,261738 1532,1227 1532,1229 1532,1252 1532,1253 1532,21944 1532,86416 1533,305 1533,352 1533,599 1533,872 1533,1181 1533,1433 1533,1534 1533,1825 1533,1844 1533,3744 1533,232709 1535,68 1535,302 1535,344 1535,577 1535,794 1535,919 1536,305 1537,10 1537,137 1537,195 1537,217 1537,222 1537,301 1537,302 1537,455 1537,972 1537,1033 1537,1265 1537,1266 1537,2371 1537,5343 1538,1539 1539,54 1539,135 1539,278 1539,455 1539,660 1539,1310 1539,1538 1539,1539 1539,1843 1539,2423 1539,2424 1539,2646 1539,6506 1539,13276 1539,13328 1539,13384 1539,13400 1539,19349 1539,33118 1539,37828 1540,1541 1542,1 1543,215 1544,86 1544,167 1544,299 1544,356 1544,390 1544,459 1544,522 1544,589 1544,599 1544,720 1544,744 1544,783 1544,877 1544,941 1544,973 1544,1014 1544,1117 1544,1124 1544,1284 1544,1319 1544,1436 1544,1479 1544,1522 1544,1544 1544,1849 1544,1973 1544,2083 1544,2372 1544,2747 1544,3207 1544,3218 1544,5186 1544,5301 1544,5662 1544,6068 1544,6712 1544,7087 1544,13523 1544,14615 1544,15073 1544,17877 1544,20017 1544,20303 1544,20773 1544,28381 1544,28916 1544,33706 1544,33726 1544,34933 1544,34966 1544,35049 1544,36684 1544,36686 1544,36698 1544,36701 1544,36705 1544,38942 1544,44940 1544,45128 1544,45532 1544,45853 1544,46805 1544,53037 1544,56415 1544,58515 1544,60900 1544,61996 1544,63704 1544,71934 1544,75480 1544,77488 1544,79357 1544,81011 1544,98215 1544,106176 1544,116543 1544,117480 1544,120155 1544,122563 1544,124539 1544,126991 1544,128922 1544,129517 1544,130965 1544,140665 1544,148713 1544,148742 1544,148898 1544,155710 1544,163925 1544,163928 1544,167762 1544,170984 1544,175782 1544,176822 1544,182477 1544,191911 1544,193745 1544,200539 1544,213953 1544,217268 1544,217269 1544,217270 1544,217271 1544,217273 1544,217521 1544,217523 1544,217524 1544,217526 1544,217527 1544,217530 1544,218093 1544,218094 1544,218095 1544,218353 1544,218354 1544,218355 1544,218356 1544,218357 1544,218358 1544,218359 1544,218361 1544,218362 1544,218364 1544,218365 1544,218366 1544,218438 1544,219641 1544,221176 1544,229230 1544,235820 1544,235821 1544,235824 1544,235827 1544,235829 1544,235831 1544,235832 1544,235833 1544,235834 1544,235837 1544,235839 1544,235840 1544,235897 1544,243257 1544,247346 1544,252466 1544,252467 1544,252469 1544,252473 1544,252474 1544,252475 1544,252476 1544,252580 1544,252581 1544,252582 1544,252584 1544,252586 1544,252588 1544,252589 1544,252590 1544,252591 1544,252592 1544,252597 1544,252598 1544,252599 1544,252600 1544,252601 1544,252602 1544,252603 1544,252604 1544,252605 1544,252606 1544,252607 1544,252608 1544,252610 1544,252611 1544,252612 1544,252613 1544,252614 1544,252616 1544,252617 1544,252618 1544,252619 1544,252620 1544,252621 1544,252622 1544,252623 1544,252624 1544,252625 1544,252626 1544,252627 1544,252628 1544,252629 1544,252630 1544,252631 1544,252632 1544,252634 1544,252635 1544,252636 1544,252637 1544,252638 1544,252639 1545,167 1545,186 1545,301 1545,510 1545,518 1545,631 1545,775 1545,795 1545,968 1545,1001 1545,1085 1545,1326 1545,1411 1545,1415 1545,1531 1545,1688 1545,3804 1545,5130 1545,5961 1545,9017 1546,147 1546,158 1546,1803 1546,80266 1546,89035 1547,364 1548,158 1548,1001 1549,32 1550,264 1550,1509 1550,1551 1551,111 1551,446 1551,673 1551,838 1551,849 1551,872 1551,1007 1551,1011 1551,1267 1551,1293 1551,1381 1551,1531 1551,1551 1551,1973 1551,3041 1551,3507 1551,5440 1552,1319 1553,182 1554,158 1554,206 1554,1801 1555,1556 1556,87 1556,314 1556,599 1556,838 1556,872 1556,1011 1556,1634 1557,250 1557,887 1557,1684 1558,1559 1559,209 1559,217 1559,256 1559,292 1559,366 1559,397 1559,455 1559,462 1559,479 1559,510 1559,516 1559,626 1559,685 1559,702 1559,849 1559,875 1559,911 1559,929 1559,972 1559,973 1559,1021 1559,1026 1559,1087 1559,1147 1559,1191 1559,1197 1559,1204 1559,1326 1559,1345 1559,1370 1559,1558 1559,1566 1559,1611 1559,1619 1559,1635 1559,1659 1559,1722 1559,1805 1559,3260 1559,3263 1559,4039 1559,4361 1559,6452 1559,7883 1559,8477 1559,14009 1559,14312 1559,14569 1559,15101 1559,16568 1559,16759 1559,20709 1559,21589 1559,21668 1559,23615 1559,25388 1559,25658 1559,26347 1559,26421 1559,26865 1559,28348 1559,30121 1559,36819 1559,37191 1559,37934 1559,39700 1559,46326 1559,46950 1559,50094 1559,50096 1559,55565 1559,56890 1559,63350 1559,68271 1559,75095 1559,76636 1559,79872 1559,85979 1559,88577 1559,91917 1559,96621 1559,99646 1559,104298 1559,104385 1559,104406 1559,122449 1559,122494 1559,128120 1559,136115 1559,136116 1559,137181 1559,138890 1559,142250 1559,158249 1559,158571 1559,158631 1559,160722 1559,160849 1559,162639 1559,175274 1559,177905 1559,179789 1559,180009 1559,181394 1559,181631 1559,217680 1559,219222 1559,229128 1559,229130 1559,232842 1559,243276 1559,247515 1559,247923 1559,249673 1559,250537 1559,255534 1559,258270 1559,258284 1561,752 1561,873 1561,1085 1561,1210 1562,50 1562,79 1562,333 1563,47 1563,417 1563,1564 1563,2469 1563,2867 1563,2868 1564,3 1564,10 1564,34 1564,35 1564,137 1564,167 1564,240 1564,261 1564,301 1564,392 1564,417 1564,536 1564,589 1564,615 1564,631 1564,784 1564,818 1564,911 1564,968 1564,972 1564,1210 1564,1240 1564,1241 1564,1285 1564,1293 1564,1309 1564,1359 1564,1370 1564,1470 1564,1563 1564,1564 1564,1660 1564,1782 1564,1787 1564,1818 1564,1832 1564,2620 1564,2812 1564,3457 1564,3504 1564,3879 1564,4107 1564,4532 1564,5278 1564,5718 1564,5814 1564,6800 1564,7999 1564,8821 1564,13296 1564,13359 1564,13637 1564,14139 1564,14587 1564,14603 1564,15164 1564,16167 1564,16174 1564,17173 1564,18569 1564,18571 1564,20535 1564,27832 1564,35343 1564,35538 1564,35541 1564,39045 1564,45693 1564,52862 1564,57054 1564,57136 1564,59205 1564,59215 1564,60814 1564,62886 1564,64594 1564,65864 1564,75912 1564,80988 1564,93099 1564,94182 1564,104745 1564,105740 1564,110219 1564,110358 1564,110699 1564,110704 1564,111147 1564,127158 1564,127798 1564,135081 1564,135082 1564,135183 1564,135970 1564,138698 1564,139956 1564,140011 1564,144978 1564,145630 1564,145631 1564,145986 1564,150081 1564,154892 1564,157922 1564,160521 1564,160820 1564,163454 1564,173907 1564,181565 1564,191168 1564,193012 1564,193501 1564,194375 1564,220343 1564,226684 1564,228652 1564,229795 1564,229815 1564,235292 1564,235305 1564,235309 1564,236859 1564,237146 1564,237496 1564,238532 1564,247366 1564,252103 1564,254435 1564,255180 1564,261820 1565,439 1565,671 1566,1 1566,10 1566,20 1566,37 1566,68 1566,126 1566,147 1566,167 1566,175 1566,182 1566,186 1566,207 1566,209 1566,222 1566,240 1566,256 1566,259 1566,299 1566,314 1566,336 1566,388 1566,389 1566,392 1566,397 1566,408 1566,438 1566,441 1566,452 1566,457 1566,467 1566,500 1566,502 1566,510 1566,512 1566,516 1566,518 1566,534 1566,535 1566,536 1566,577 1566,586 1566,589 1566,599 1566,615 1566,676 1566,685 1566,693 1566,694 1566,718 1566,755 1566,764 1566,788 1566,808 1566,809 1566,818 1566,843 1566,849 1566,862 1566,868 1566,872 1566,874 1566,875 1566,911 1566,915 1566,918 1566,929 1566,968 1566,972 1566,1014 1566,1085 1566,1087 1566,1096 1566,1113 1566,1118 1566,1140 1566,1141 1566,1147 1566,1191 1566,1204 1566,1284 1566,1293 1566,1298 1566,1326 1566,1417 1566,1434 1566,1445 1566,1559 1566,1566 1566,1572 1566,1655 1566,1663 1566,1696 1566,1724 1566,1749 1566,1796 1566,1848 1566,1992 1566,2037 1566,2112 1566,2167 1566,2253 1566,2460 1566,2512 1566,2605 1566,2874 1566,3392 1566,3422 1566,3507 1566,3582 1566,3744 1566,3804 1566,3972 1566,4028 1566,4094 1566,4165 1566,4190 1566,4200 1566,4276 1566,4381 1566,5022 1566,5193 1566,5226 1566,5356 1566,5422 1566,5641 1566,6405 1566,6685 1566,6695 1566,6824 1566,6837 1566,7117 1566,8055 1566,9457 1566,13207 1566,13622 1566,14304 1566,15608 1566,15691 1566,18133 1566,19668 1566,20792 1566,21283 1566,21442 1566,21494 1566,23740 1566,26126 1566,26127 1566,26312 1566,26450 1566,26928 1566,26976 1566,28799 1566,29076 1566,30318 1566,30617 1566,31021 1566,31280 1566,32747 1566,32838 1566,33287 1566,35315 1566,37479 1566,40588 1566,44272 1566,44828 1566,46947 1566,50285 1566,51954 1566,54352 1566,54371 1566,54928 1566,55828 1566,63591 1566,64845 1566,64847 1566,66243 1566,75363 1566,75912 1566,79835 1566,83224 1566,91231 1566,94069 1566,99532 1566,115283 1566,115474 1566,120961 1566,127646 1566,127648 1566,133368 1566,133464 1566,154765 1566,154855 1566,156379 1566,158979 1566,168300 1566,172629 1566,175986 1566,176757 1566,177720 1566,177772 1566,178610 1566,186681 1566,189650 1566,203169 1566,215874 1566,230384 1566,237573 1566,242246 1566,243493 1566,249620 1567,1452 1568,106 1568,192 1568,202 1568,203 1568,252 1568,275 1568,307 1568,467 1568,493 1568,516 1568,571 1568,602 1568,682 1568,733 1568,868 1568,1220 1568,1222 1568,1243 1568,1385 1568,1512 1568,1655 1568,1927 1568,5992 1568,21944 1568,41170 1568,72439 1568,189839 1569,602 1570,19 1570,83 1570,313 1570,1010 1570,1571 1570,2266 1570,211889 1571,8 1571,19 1571,222 1571,313 1571,385 1571,389 1571,536 1571,634 1571,657 1571,911 1571,1299 1571,1313 1571,1571 1571,1576 1571,1618 1571,1843 1571,2046 1571,2092 1571,2159 1571,2168 1571,2224 1571,2253 1571,2266 1571,2290 1571,2421 1571,2424 1571,2646 1571,2784 1571,2944 1571,4085 1571,4321 1571,5326 1571,9111 1571,9379 1571,13328 1571,14675 1571,17811 1571,17825 1571,18831 1571,18887 1571,19913 1571,19916 1571,20926 1571,22816 1571,23287 1571,23813 1571,24922 1571,25647 1571,26058 1571,28511 1571,31771 1571,32774 1571,33274 1571,37908 1571,38218 1571,39618 1571,45993 1571,48278 1571,60081 1571,71690 1571,81993 1571,94195 1571,96835 1571,97393 1571,98218 1571,123517 1571,160975 1571,163291 1571,168580 1571,171780 1571,174955 1571,180853 1571,184755 1571,190576 1571,202044 1571,211889 1571,222130 1571,223132 1571,223656 1571,224113 1571,228360 1572,10 1572,107 1572,111 1572,248 1572,254 1572,289 1572,292 1572,301 1572,336 1572,338 1572,397 1572,417 1572,441 1572,462 1572,535 1572,595 1572,609 1572,626 1572,636 1572,693 1572,702 1572,745 1572,749 1572,818 1572,838 1572,911 1572,945 1572,978 1572,1007 1572,1014 1572,1025 1572,1045 1572,1046 1572,1058 1572,1085 1572,1087 1572,1118 1572,1140 1572,1151 1572,1192 1572,1220 1572,1222 1572,1238 1572,1326 1572,1329 1572,1332 1572,1417 1572,1453 1572,1529 1572,1566 1572,1572 1572,1623 1572,1653 1572,1677 1572,1688 1572,1722 1572,1801 1572,1844 1572,1860 1572,1968 1572,1973 1572,2123 1572,2124 1572,2367 1572,2373 1572,2582 1572,3035 1572,3367 1572,3483 1572,3494 1572,3538 1572,4039 1572,4066 1572,4114 1572,4580 1572,4581 1572,4771 1572,5053 1572,5258 1572,5265 1572,5551 1572,5935 1572,6068 1572,6569 1572,6880 1572,6896 1572,7022 1572,7806 1572,13193 1572,14353 1572,15386 1572,15612 1572,17352 1572,21442 1572,25497 1572,26288 1572,26404 1572,30763 1572,32819 1572,33279 1572,35913 1572,36788 1572,37414 1572,40442 1572,42113 1572,44522 1572,49062 1572,50474 1572,50711 1572,55416 1572,55538 1572,61083 1572,71988 1572,75912 1572,78696 1572,88705 1572,94134 1572,94801 1572,97392 1572,112922 1572,122042 1572,126377 1572,130424 1572,138239 1572,159753 1572,160339 1572,161947 1572,163015 1572,167626 1572,182162 1572,185283 1572,187284 1572,192643 1572,202597 1572,205259 1572,205825 1572,218763 1572,239389 1572,245924 1573,417 1574,309 1574,310 1575,808 1575,1479 1575,2480 1575,124668 1577,66 1577,467 1577,868 1578,1579 1579,87 1579,292 1579,673 1579,1579 1580,304 1580,372 1580,390 1580,431 1580,685 1580,765 1580,775 1580,852 1580,1085 1580,1581 1580,2572 1580,3093 1580,4222 1580,6004 1580,14011 1580,28832 1580,49373 1580,49469 1580,58503 1580,61272 1580,64026 1580,75912 1580,81091 1580,82733 1580,87292 1580,87754 1580,93563 1580,93652 1580,93760 1580,93763 1580,93769 1580,94367 1580,95469 1580,96280 1580,101746 1580,103860 1580,107495 1580,115674 1580,115675 1580,116102 1580,116504 1580,116506 1580,116507 1580,116508 1580,117798 1580,123800 1580,123825 1580,123838 1580,124512 1580,125993 1580,127158 1580,134090 1580,134097 1580,134579 1580,141848 1580,156574 1580,161299 1580,168921 1580,178576 1580,181028 1580,185874 1580,212692 1580,250601 1580,252676 1582,422 1582,602 1582,620 1582,3148 1582,8244 1583,1238 1584,32 1584,107 1584,338 1584,344 1584,349 1584,510 1584,575 1584,673 1584,801 1584,835 1584,991 1584,1345 1584,1722 1584,2605 1584,3003 1584,3367 1584,4039 1584,6638 1585,557 1586,65 1586,868 1587,949 1588,949 1589,302 1590,11 1590,20 1590,314 1590,346 1590,435 1590,439 1590,447 1590,538 1590,599 1590,671 1590,693 1590,766 1590,844 1590,1033 1590,1130 1590,1294 1590,1474 1590,1502 1590,1590 1590,1644 1590,1973 1590,2085 1590,2138 1590,2352 1590,2418 1590,3626 1590,3936 1590,6216 1590,6427 1590,6586 1590,6661 1590,6801 1590,7087 1590,8444 1590,13224 1590,13946 1590,14233 1590,15141 1590,16357 1590,16581 1590,17016 1590,17424 1590,19191 1590,19728 1590,24801 1590,26163 1590,26787 1590,29105 1590,30775 1590,31788 1590,36982 1590,38209 1590,38300 1590,39624 1590,40575 1590,44492 1590,44624 1590,45460 1590,48290 1590,48394 1590,49470 1590,50354 1590,54960 1590,55040 1590,55427 1590,67823 1590,70737 1590,75867 1590,76989 1590,88437 1590,90226 1590,102496 1590,106083 1590,106377 1590,110504 1590,112965 1590,117480 1590,118651 1590,120155 1590,122007 1590,122110 1590,122117 1590,124361 1590,128345 1590,128823 1590,128880 1590,138125 1590,155116 1590,163898 1590,165022 1590,192004 1590,212498 1590,214542 1590,224775 1590,225323 1590,225592 1590,229745 1590,247302 1590,247686 1590,248859 1590,251188 1590,253099 1590,255162 1590,256346 1590,263622 1590,263942 1591,1298 1592,175 1592,215 1592,309 1592,310 1592,483 1592,1177 1592,1882 1592,2210 1592,6556 1593,481 1594,493 1595,209 1596,48 1596,130 1596,160 1597,788 1598,333 1599,68 1599,217 1599,518 1599,764 1599,775 1599,1326 1599,3804 1599,5130 1599,23437 1600,620 1600,8244 1601,306 1601,307 1601,493 1601,602 1601,682 1601,30331 1601,72439 1602,323 1603,259 1603,481 1603,497 1603,668 1603,712 1603,713 1603,911 1603,1014 1603,1262 1603,2373 1603,3967 1603,6861 1603,6948 1603,13291 1603,19413 1603,32013 1603,62676 1603,82217 1603,127826 1603,241573 1603,245369 1603,258471 1605,65 1605,66 1605,467 1605,868 1605,1345 1605,156379 1605,162599 1606,1607 1607,287 1607,326 1607,433 1607,1368 1607,1606 1607,1607 1607,1634 1607,3423 1607,3582 1607,4272 1607,5192 1607,6456 1607,15152 1607,19302 1607,19453 1607,20529 1607,26833 1607,32358 1607,34208 1607,34721 1607,34770 1607,39473 1607,42731 1607,62606 1607,83619 1607,88661 1607,107957 1607,109671 1607,112844 1607,120129 1607,121505 1607,127132 1607,130828 1607,133384 1607,142717 1607,161289 1607,169585 1607,172551 1607,177825 1607,183386 1607,183391 1607,214082 1607,221708 1607,226165 1607,238760 1608,41 1608,42 1608,68 1608,104 1608,139 1608,233 1608,240 1608,290 1608,332 1608,446 1608,590 1608,612 1608,631 1608,677 1608,685 1608,714 1608,784 1608,911 1608,1195 1608,1353 1608,1459 1608,1462 1608,1505 1608,1608 1608,1609 1608,1973 1608,2512 1608,2989 1608,2991 1608,3135 1608,4220 1608,4532 1608,5331 1608,5736 1608,8245 1608,9087 1608,9397 1608,9509 1608,14211 1608,15169 1608,15586 1608,17674 1608,18755 1608,19126 1608,19502 1608,19664 1608,19723 1608,19798 1608,20676 1608,20708 1608,23697 1608,24698 1608,24842 1608,25046 1608,25348 1608,25597 1608,25808 1608,26304 1608,26310 1608,26660 1608,26773 1608,27108 1608,27109 1608,28008 1608,29081 1608,29115 1608,29764 1608,33385 1608,33550 1608,35514 1608,36829 1608,37688 1608,37771 1608,38222 1608,39481 1608,39639 1608,39756 1608,41472 1608,41497 1608,41499 1608,42564 1608,43749 1608,44232 1608,48185 1608,48236 1608,48719 1608,49568 1608,50536 1608,50564 1608,50576 1608,50589 1608,55061 1608,55332 1608,55656 1608,55659 1608,56351 1608,56648 1608,57109 1608,57188 1608,57206 1608,57634 1608,58301 1608,60603 1608,62327 1608,62542 1608,63201 1608,64174 1608,64704 1608,68237 1608,71916 1608,72086 1608,72905 1608,72969 1608,73638 1608,73908 1608,76276 1608,77263 1608,77315 1608,80730 1608,81483 1608,81602 1608,82065 1608,82404 1608,82427 1608,82466 1608,82912 1608,84052 1608,86827 1608,88216 1608,88980 1608,89826 1608,92083 1608,92992 1608,94134 1608,94891 1608,105791 1608,106197 1608,109562 1608,109564 1608,112117 1608,113563 1608,114269 1608,115387 1608,115967 1608,118918 1608,120925 1608,121476 1608,121730 1608,122602 1608,124855 1608,124856 1608,125150 1608,125701 1608,125711 1608,127689 1608,128741 1608,129085 1608,129923 1608,130451 1608,130776 1608,130779 1608,134597 1608,134692 1608,134696 1608,135357 1608,136462 1608,137096 1608,140341 1608,142524 1608,142889 1608,144155 1608,146106 1608,149872 1608,150371 1608,151918 1608,153356 1608,155183 1608,155887 1608,156351 1608,156999 1608,160407 1608,162428 1608,162990 1608,164013 1608,169338 1608,171785 1608,171816 1608,172112 1608,172364 1608,173834 1608,176543 1608,179852 1608,179936 1608,180954 1608,181591 1608,181691 1608,192919 1608,195763 1608,199401 1608,200030 1608,200381 1608,204171 1608,207126 1608,215985 1608,216813 1608,216854 1608,217702 1608,217703 1608,221721 1608,222621 1608,224501 1608,228152 1608,229798 1608,232151 1608,244494 1608,244613 1608,255629 1608,257033 1609,1608 1609,77315 1610,46 1610,660 1611,178 1611,538 1611,972 1611,1313 1611,1559 1611,1612 1612,20 1612,346 1612,435 1612,439 1612,510 1612,538 1612,671 1612,939 1612,1096 1612,1474 1612,1611 1612,3831 1612,4646 1612,5078 1612,5189 1612,5659 1612,7060 1612,7921 1612,7993 1612,13657 1612,14578 1612,18220 1612,22221 1612,26850 1612,32773 1612,34935 1612,50246 1612,50285 1612,54458 1612,54808 1612,55580 1612,56140 1612,62001 1612,75242 1612,81554 1612,82872 1612,86375 1612,98880 1612,104339 1612,107358 1612,128250 1612,136009 1612,140150 1612,140776 1612,145030 1612,151150 1612,155224 1612,164226 1612,164232 1612,166443 1612,170684 1612,172083 1612,175311 1612,178066 1612,178067 1612,178931 1612,193659 1612,197782 1612,214186 1612,215464 1612,238505 1613,497 1614,581 1615,1616 1616,182 1616,356 1616,522 1616,663 1616,666 1616,750 1616,852 1616,937 1616,973 1616,1167 1616,1192 1616,1298 1616,1436 1616,1591 1616,1615 1616,1616 1616,1635 1616,1849 1616,1853 1616,1937 1616,2038 1616,2979 1616,3392 1616,3630 1616,4169 1616,14165 1616,14246 1616,15663 1616,20335 1616,23480 1616,25286 1616,33442 1616,38959 1616,42767 1616,45448 1616,46995 1616,51684 1616,58135 1616,73570 1616,76704 1616,76953 1616,82257 1616,96685 1616,97193 1616,97318 1616,108559 1616,111043 1616,119349 1616,127650 1616,127866 1616,128654 1616,129746 1616,130455 1616,133587 1616,144092 1616,147476 1616,148319 1616,153619 1616,162608 1616,163363 1616,163370 1616,168315 1616,178810 1616,178943 1616,179794 1616,180319 1616,180321 1616,184339 1616,187176 1616,187611 1616,188325 1616,190277 1616,212734 1616,216799 1616,217459 1616,219372 1616,236487 1616,237319 1616,247767 1616,248796 1616,257977 1616,263731 1617,34 1617,35 1617,135 1617,222 1617,379 1617,385 1617,455 1617,477 1617,536 1617,634 1617,1274 1617,1571 1617,1618 1617,2168 1617,2266 1617,2646 1617,2944 1617,4223 1617,5591 1617,6556 1617,7698 1617,23287 1617,28130 1618,313 1618,379 1618,385 1618,389 1618,477 1618,536 1618,660 1618,682 1618,781 1618,852 1618,1571 1618,1618 1618,2159 1618,2168 1618,2224 1618,2424 1618,2553 1618,2784 1618,2944 1618,5458 1618,5591 1618,7698 1618,8152 1618,8463 1618,13622 1618,14556 1618,18831 1618,19998 1618,20265 1618,20279 1618,23287 1618,30617 1618,38859 1618,54564 1618,56040 1618,59794 1618,72439 1618,94195 1618,111222 1618,169212 1618,202044 1618,211889 1618,217889 1618,252188 1619,1 1619,56 1619,126 1619,146 1619,147 1619,149 1619,158 1619,178 1619,184 1619,192 1619,195 1619,202 1619,203 1619,256 1619,333 1619,336 1619,406 1619,422 1619,425 1619,435 1619,485 1619,505 1619,516 1619,602 1619,640 1619,673 1619,693 1619,733 1619,779 1619,809 1619,818 1619,841 1619,859 1619,911 1619,920 1619,1089 1619,1130 1619,1172 1619,1204 1619,1205 1619,1294 1619,1370 1619,1469 1619,1498 1619,1518 1619,1559 1619,1619 1619,1620 1619,1623 1619,1844 1619,1848 1619,1870 1619,1973 1619,2014 1619,2080 1619,2174 1619,2367 1619,2373 1619,2374 1619,2471 1619,2540 1619,3367 1619,4099 1619,4227 1619,4262 1619,4317 1619,5018 1619,5495 1619,5514 1619,5908 1619,6119 1619,6311 1619,7921 1619,13140 1619,14389 1619,14511 1619,14830 1619,16703 1619,18851 1619,19806 1619,19884 1619,20664 1619,22616 1619,23783 1619,23861 1619,24808 1619,27057 1619,28192 1619,28803 1619,29917 1619,30331 1619,30841 1619,34195 1619,36420 1619,37430 1619,38954 1619,41230 1619,47095 1619,48278 1619,49373 1619,50037 1619,50363 1619,54326 1619,60576 1619,61320 1619,62471 1619,63038 1619,63504 1619,65862 1619,65901 1619,65911 1619,65972 1619,66412 1619,67368 1619,67898 1619,70850 1619,70852 1619,71083 1619,71303 1619,73288 1619,74535 1619,75783 1619,77511 1619,77650 1619,80059 1619,87870 1619,88594 1619,89691 1619,92476 1619,94095 1619,94955 1619,95346 1619,98811 1619,103878 1619,105259 1619,107083 1619,109560 1619,109898 1619,110032 1619,118336 1619,121110 1619,121606 1619,122192 1619,122905 1619,125093 1619,125912 1619,127158 1619,129775 1619,129981 1619,136463 1619,138830 1619,138831 1619,142882 1619,149312 1619,155030 1619,159676 1619,165029 1619,165509 1619,165823 1619,166541 1619,168867 1619,169373 1619,172131 1619,173949 1619,193679 1619,195107 1619,198268 1619,204124 1619,207671 1619,208015 1619,216180 1619,221899 1619,225050 1619,227294 1619,238421 1619,241660 1619,244129 1619,248667 1619,256586 1619,258209 1619,258938 1619,259810 1619,260336 1621,1289 1622,1619 1622,1623 1623,1 1623,10 1623,44 1623,50 1623,56 1623,79 1623,106 1623,146 1623,147 1623,149 1623,158 1623,175 1623,184 1623,192 1623,195 1623,202 1623,211 1623,256 1623,287 1623,301 1623,333 1623,336 1623,337 1623,406 1623,422 1623,446 1623,467 1623,505 1623,586 1623,602 1623,606 1623,615 1623,638 1623,640 1623,663 1623,673 1623,676 1623,693 1623,733 1623,818 1623,841 1623,849 1623,920 1623,932 1623,937 1623,949 1623,957 1623,973 1623,1089 1623,1118 1623,1181 1623,1267 1623,1293 1623,1298 1623,1319 1623,1370 1623,1414 1623,1458 1623,1566 1623,1572 1623,1619 1623,1620 1623,1623 1623,1815 1623,1844 1623,1848 1623,2174 1623,2244 1623,2367 1623,2451 1623,2471 1623,2580 1623,2903 1623,3370 1623,3895 1623,4272 1623,4344 1623,5265 1623,5486 1623,5804 1623,6119 1623,6549 1623,6684 1623,6685 1623,7731 1623,8285 1623,9510 1623,14145 1623,14389 1623,14453 1623,15556 1623,15560 1623,15587 1623,15829 1623,16561 1623,16703 1623,17151 1623,17166 1623,19884 1623,20035 1623,20439 1623,21589 1623,22206 1623,22616 1623,23783 1623,24066 1623,25555 1623,25668 1623,26716 1623,26841 1623,27057 1623,30331 1623,31080 1623,31172 1623,31421 1623,33383 1623,35561 1623,36420 1623,36973 1623,37123 1623,37430 1623,37771 1623,38634 1623,39285 1623,39437 1623,40514 1623,44567 1623,50083 1623,52021 1623,54340 1623,56119 1623,60576 1623,61320 1623,64353 1623,65809 1623,68177 1623,68629 1623,68632 1623,71303 1623,72764 1623,76081 1623,76835 1623,79882 1623,83014 1623,83314 1623,83320 1623,85817 1623,87744 1623,87843 1623,87870 1623,88348 1623,91055 1623,92476 1623,101906 1623,104288 1623,104631 1623,105535 1623,105750 1623,112537 1623,116536 1623,117881 1623,121110 1623,122406 1623,123587 1623,127158 1623,128783 1623,128787 1623,130938 1623,140760 1623,146001 1623,150746 1623,151428 1623,157378 1623,159069 1623,168271 1623,168804 1623,170834 1623,170846 1623,170848 1623,170849 1623,170854 1623,171641 1623,177257 1623,177708 1623,177828 1623,179157 1623,184742 1623,185927 1623,194467 1623,194645 1623,194938 1623,194939 1623,195737 1623,201302 1623,204124 1623,219169 1623,221828 1623,222867 1623,225050 1623,225482 1623,227376 1623,230555 1623,237291 1623,237319 1623,237320 1623,237322 1623,238076 1623,241660 1623,241698 1623,242859 1623,242976 1623,244960 1623,246801 1623,261466 1623,264369 1624,255 1624,450 1625,640 1626,861 1627,167 1627,299 1627,301 1627,604 1627,615 1627,872 1627,968 1627,1293 1627,2083 1627,2557 1627,103860 1628,415 1629,86 1630,248 1631,41 1631,108 1631,248 1631,289 1631,290 1631,373 1631,431 1631,588 1631,590 1631,631 1631,760 1631,761 1631,784 1631,791 1631,805 1631,1119 1631,1346 1631,1402 1631,1462 1631,1631 1631,1808 1631,1879 1631,1888 1631,2383 1631,3566 1631,3694 1631,3914 1631,3974 1631,4265 1631,4619 1631,5021 1631,5529 1631,5535 1631,5545 1631,5679 1631,6853 1631,7739 1631,7790 1631,8150 1631,8537 1631,8763 1631,9078 1631,13207 1631,14112 1631,14487 1631,15339 1631,15397 1631,15856 1631,16137 1631,16306 1631,19454 1631,22299 1631,22490 1631,24839 1631,25591 1631,25814 1631,33750 1631,34707 1631,35202 1631,35371 1631,35528 1631,41395 1631,41871 1631,43217 1631,44298 1631,44839 1631,45398 1631,45422 1631,47454 1631,49398 1631,49657 1631,54575 1631,55022 1631,56406 1631,61318 1631,61961 1631,62802 1631,63909 1631,65681 1631,66519 1631,68310 1631,76263 1631,78154 1631,79619 1631,82095 1631,82352 1631,82869 1631,88605 1631,89924 1631,90237 1631,99544 1631,103366 1631,105221 1631,106402 1631,118020 1631,121119 1631,123359 1631,123852 1631,127715 1631,136095 1631,137009 1631,137022 1631,137045 1631,137046 1631,152695 1631,159709 1631,159717 1631,160155 1631,160999 1631,161872 1631,165334 1631,166442 1631,167440 1631,169330 1631,179877 1631,183733 1631,196801 1631,197787 1631,197930 1631,200794 1631,207583 1631,212333 1631,213954 1631,229229 1631,233452 1631,244205 1631,244551 1631,244714 1631,244984 1631,245285 1631,251913 1631,255014 1631,256176 1631,258042 1631,259407 1631,261674 1631,261843 1632,32 1632,392 1632,697 1632,1769 1632,2699 1632,3003 1633,1433 1633,1634 1634,10 1634,22 1634,68 1634,207 1634,287 1634,314 1634,326 1634,349 1634,392 1634,432 1634,433 1634,440 1634,446 1634,452 1634,457 1634,510 1634,599 1634,673 1634,685 1634,693 1634,697 1634,752 1634,794 1634,809 1634,818 1634,838 1634,872 1634,874 1634,911 1634,935 1634,1014 1634,1130 1634,1133 1634,1210 1634,1240 1634,1422 1634,1466 1634,1607 1634,1634 1634,1796 1634,1799 1634,1824 1634,1874 1634,1876 1634,1968 1634,1973 1634,1992 1634,3443 1634,3874 1634,4390 1634,4450 1634,5073 1634,5181 1634,5196 1634,5231 1634,5324 1634,5381 1634,5633 1634,5939 1634,5942 1634,5955 1634,6824 1634,7818 1634,8339 1634,8425 1634,8562 1634,9414 1634,12818 1634,13188 1634,13228 1634,13259 1634,14128 1634,14304 1634,15180 1634,15609 1634,16337 1634,18138 1634,18387 1634,19384 1634,20389 1634,20409 1634,21174 1634,21244 1634,23363 1634,23456 1634,23773 1634,24922 1634,26301 1634,29580 1634,30328 1634,33425 1634,33433 1634,33703 1634,34128 1634,34775 1634,36003 1634,36421 1634,37371 1634,37692 1634,40442 1634,40474 1634,41242 1634,41867 1634,41928 1634,42011 1634,42725 1634,48502 1634,48895 1634,49041 1634,49247 1634,49301 1634,55212 1634,55674 1634,59744 1634,60400 1634,61251 1634,62329 1634,63422 1634,64477 1634,65814 1634,66660 1634,67141 1634,67354 1634,67392 1634,67574 1634,78382 1634,79673 1634,82056 1634,83990 1634,84172 1634,84528 1634,84686 1634,85786 1634,86679 1634,86724 1634,91511 1634,92311 1634,93113 1634,93565 1634,95386 1634,97392 1634,103537 1634,103747 1634,104447 1634,104565 1634,105553 1634,105557 1634,108066 1634,108705 1634,108991 1634,110200 1634,110320 1634,110649 1634,110708 1634,111266 1634,112052 1634,112053 1634,112054 1634,112055 1634,112056 1634,112057 1634,112058 1634,112619 1634,112937 1634,115949 1634,117552 1634,119477 1634,119586 1634,120114 1634,120602 1634,121040 1634,122515 1634,123067 1634,124375 1634,125108 1634,127158 1634,130342 1634,130924 1634,130937 1634,131345 1634,134193 1634,138485 1634,139529 1634,139955 1634,142812 1634,144004 1634,145429 1634,145864 1634,148699 1634,152175 1634,158572 1634,160545 1634,162626 1634,163328 1634,164832 1634,164834 1634,164861 1634,165727 1634,167883 1634,169960 1634,171304 1634,173319 1634,175858 1634,176644 1634,180900 1634,182199 1634,183494 1634,188329 1634,189946 1634,191398 1634,195416 1634,208017 1634,213800 1634,217358 1634,221143 1634,221799 1634,225393 1634,229658 1634,229712 1634,236888 1634,241356 1634,245396 1634,247366 1634,248696 1634,256429 1634,256960 1634,260909 1635,167 1635,186 1635,301 1635,372 1635,373 1635,631 1635,677 1635,715 1635,780 1635,797 1635,805 1635,818 1635,823 1635,941 1635,1119 1635,1149 1635,1167 1635,1209 1635,1300 1635,1309 1635,1436 1635,1616 1635,1635 1635,1688 1635,1849 1635,1973 1635,2083 1635,2974 1635,2979 1635,2982 1635,3392 1635,4723 1635,7349 1635,8686 1635,13166 1635,13443 1635,13549 1635,14456 1635,15857 1635,18856 1635,21299 1635,22299 1635,23478 1635,24839 1635,25439 1635,26308 1635,27056 1635,34307 1635,35371 1635,39047 1635,40776 1635,50104 1635,64205 1635,66766 1635,68310 1635,74717 1635,86591 1635,93313 1635,95048 1635,98922 1635,109863 1635,113444 1635,116739 1635,118451 1635,124527 1635,124911 1635,126123 1635,126189 1635,129269 1635,130275 1635,131371 1635,136259 1635,136462 1635,136631 1635,138318 1635,141894 1635,142361 1635,142513 1635,142522 1635,148111 1635,152298 1635,162663 1635,163120 1635,175912 1635,186129 1635,194731 1635,195020 1635,214886 1635,217349 1635,219496 1635,220144 1635,225934 1635,229228 1635,229599 1635,262448 1636,273 1636,274 1637,305 1638,1639 1639,41 1639,1707 1639,3538 1640,726 1641,41 1641,104 1641,289 1641,290 1641,534 1641,714 1641,1085 1641,2253 1641,4218 1641,4220 1641,44725 1641,94134 1642,874 1643,1644 1644,20 1644,178 1644,346 1644,439 1644,447 1644,538 1644,671 1644,911 1644,996 1644,1294 1644,1474 1644,1590 1644,1644 1644,1973 1644,2030 1644,2138 1644,2427 1644,3936 1644,6661 1644,13224 1644,13805 1644,14511 1644,15141 1644,17016 1644,17116 1644,19728 1644,19817 1644,23787 1644,26972 1644,30043 1644,30775 1644,40575 1644,43328 1644,48394 1644,49470 1644,54701 1644,59685 1644,67823 1644,68347 1644,69600 1644,73508 1644,105578 1644,106377 1644,107601 1644,107705 1644,110254 1644,110504 1644,112965 1644,114587 1644,117157 1644,120155 1644,122110 1644,128880 1644,139748 1644,140081 1644,142968 1644,150153 1644,150318 1644,155116 1644,182180 1644,184989 1644,195156 1645,920 1646,160 1647,663 1647,664 1648,280 1648,827 1649,209 1650,1262 1651,439 1651,447 1651,671 1651,932 1651,1033 1651,1294 1651,1612 1651,1849 1651,6654 1651,13486 1651,15802 1651,32784 1652,107 1653,292 1653,356 1653,440 1653,441 1653,462 1653,626 1653,745 1653,794 1653,872 1653,978 1653,1058 1653,1096 1653,1238 1653,1240 1653,1424 1653,1453 1653,1454 1653,1572 1653,1677 1653,1722 1653,1848 1653,1973 1653,2436 1653,3507 1653,3830 1653,4039 1653,4565 1653,5258 1653,6581 1653,7530 1653,8096 1653,8149 1653,13193 1653,14010 1653,15575 1653,18631 1653,19635 1653,19908 1653,23527 1653,23664 1653,27030 1653,33734 1653,33977 1653,34761 1653,44522 1653,45523 1653,45698 1653,67354 1653,70604 1653,102192 1653,116874 1653,128641 1653,128762 1653,134634 1653,135981 1653,137563 1653,172220 1653,174747 1653,207000 1653,224735 1653,238175 1654,301 1654,615 1655,63 1655,126 1655,182 1655,202 1655,203 1655,252 1655,256 1655,259 1655,275 1655,277 1655,318 1655,336 1655,406 1655,452 1655,457 1655,465 1655,493 1655,497 1655,500 1655,516 1655,517 1655,586 1655,676 1655,682 1655,733 1655,838 1655,843 1655,1011 1655,1014 1655,1118 1655,1163 1655,1220 1655,1222 1655,1328 1655,1388 1655,1445 1655,1512 1655,1566 1655,1568 1655,1655 1655,2090 1655,2108 1655,2373 1655,4066 1655,5992 1655,16201 1655,18298 1655,18347 1655,19413 1655,19468 1655,20757 1655,21500 1655,21501 1655,21516 1655,23099 1655,23773 1655,28852 1655,30398 1655,30467 1655,30469 1655,30521 1655,32625 1655,39485 1655,39626 1655,41170 1655,47007 1655,47152 1655,47728 1655,49174 1655,54364 1655,62170 1655,65393 1655,66351 1655,71946 1655,72439 1655,77660 1655,77664 1655,79356 1655,80008 1655,80396 1655,80604 1655,81233 1655,84660 1655,91367 1655,93576 1655,95422 1655,96666 1655,97352 1655,98180 1655,98302 1655,101810 1655,105759 1655,107736 1655,113450 1655,118404 1655,118405 1655,118406 1655,118407 1655,118408 1655,118845 1655,118923 1656,1240 1657,718 1658,509 1658,1659 1658,4771 1659,104 1659,182 1659,186 1659,202 1659,203 1659,240 1659,433 1659,467 1659,809 1659,838 1659,872 1659,1014 1659,1085 1659,1118 1659,1149 1659,1204 1659,1332 1659,1531 1659,1659 1659,1796 1659,3507 1659,3582 1659,4039 1659,4066 1659,6695 1660,1564 1660,1660 1660,39045 1660,84466 1660,84639 1660,99200 1660,112398 1660,113392 1660,113417 1660,113421 1660,118638 1660,124704 1660,151076 1661,344 1662,289 1662,290 1662,94134 1663,20 1663,34 1663,35 1663,68 1663,104 1663,126 1663,138 1663,160 1663,178 1663,182 1663,192 1663,202 1663,207 1663,240 1663,252 1663,259 1663,299 1663,302 1663,336 1663,366 1663,397 1663,452 1663,505 1663,516 1663,536 1663,676 1663,764 1663,801 1663,809 1663,827 1663,838 1663,872 1663,911 1663,918 1663,929 1663,972 1663,1014 1663,1135 1663,1147 1663,1151 1663,1181 1663,1191 1663,1192 1663,1204 1663,1231 1663,1240 1663,1267 1663,1293 1663,1326 1663,1417 1663,1445 1663,1472 1663,1522 1663,1559 1663,1566 1663,1655 1663,1659 1663,1663 1663,1664 1663,1796 1663,1805 1663,1825 1663,1893 1663,1992 1663,2085 1663,2253 1663,2512 1663,2726 1663,3370 1663,3392 1663,3524 1663,3555 1663,3952 1663,4165 1663,4276 1663,4322 1663,4475 1663,4760 1663,4771 1663,5212 1663,5296 1663,5495 1663,6824 1663,9690 1663,12263 1663,13478 1663,14453 1663,18298 1663,21442 1663,23772 1663,26122 1663,26179 1663,26546 1663,28107 1663,29593 1663,36819 1663,38362 1663,40566 1663,44147 1663,54103 1663,54383 1663,54616 1663,55205 1663,58910 1663,62431 1663,64622 1663,70395 1663,75292 1663,75912 1663,81233 1663,82659 1663,88389 1663,94151 1663,97442 1663,113959 1663,115474 1663,120155 1663,121469 1663,136037 1663,144059 1663,155461 1663,166969 1663,166975 1663,173053 1663,175915 1663,183361 1663,193129 1663,204093 1663,215276 1663,226478 1663,233470 1664,1293 1664,1663 1665,438 1666,32 1667,104 1667,134 1667,135 1667,136 1667,137 1667,138 1667,850 1667,1939 1667,2105 1668,292 1668,1238 1669,862 1670,891 1671,929 1672,1673 1674,252 1674,1220 1674,1222 1675,178 1676,891 1677,107 1677,292 1677,441 1677,745 1677,900 1677,911 1677,1130 1677,1238 1677,2163 1677,2373 1677,2923 1677,3089 1677,3830 1677,4039 1677,4190 1677,4771 1677,5192 1677,6581 1677,16614 1677,19413 1677,24500 1677,36358 1677,64447 1677,75191 1677,79117 1677,87888 1677,88390 1677,177225 1678,272 1678,309 1678,310 1678,336 1678,379 1678,392 1678,483 1678,694 1678,697 1678,779 1678,818 1678,1019 1678,1119 1678,1429 1678,1782 1678,1796 1678,1801 1678,3585 1678,76096 1679,22 1679,783 1680,1267 1680,3999 1682,182 1683,1414 1684,5 1684,26 1684,47 1684,59 1684,94 1684,116 1684,117 1684,135 1684,250 1684,852 1684,885 1684,887 1684,994 1684,997 1684,1235 1684,1252 1684,1253 1684,1432 1684,1557 1684,1684 1684,1775 1684,2469 1684,2674 1684,2712 1684,2893 1684,2926 1684,3794 1684,4114 1684,5700 1684,5701 1684,5803 1684,6209 1684,7271 1684,7538 1684,8233 1684,8289 1684,8355 1684,9071 1684,9103 1684,9358 1684,9542 1684,9787 1684,13662 1684,15300 1684,15378 1684,15675 1684,15730 1684,15742 1684,15959 1684,20486 1684,21192 1684,21944 1684,25540 1684,30871 1684,32278 1684,33804 1684,34060 1684,35596 1684,35709 1684,41942 1684,42813 1684,45701 1684,45737 1684,48344 1684,48345 1684,70486 1684,85431 1684,94438 1684,95995 1684,95996 1684,96002 1684,100889 1684,107212 1684,108970 1684,117581 1684,127266 1684,135213 1684,141140 1684,146524 1684,148076 1684,152517 1684,152935 1684,164100 1684,167977 1684,171294 1684,184602 1684,187092 1684,192945 1684,194198 1684,217447 1684,217450 1684,217455 1685,299 1685,379 1685,1618 1685,2646 1685,30331 1686,493 1687,1688 1688,107 1688,217 1688,227 1688,292 1688,338 1688,397 1688,441 1688,442 1688,452 1688,457 1688,462 1688,502 1688,509 1688,572 1688,609 1688,626 1688,673 1688,685 1688,693 1688,843 1688,849 1688,852 1688,872 1688,911 1688,978 1688,991 1688,1011 1688,1014 1688,1045 1688,1130 1688,1140 1688,1172 1688,1204 1688,1279 1688,1449 1688,1545 1688,1572 1688,1653 1688,1687 1688,1688 1688,1722 1688,1796 1688,1845 1688,2181 1688,2373 1688,2436 1688,2443 1688,2744 1688,4039 1688,4565 1688,4580 1688,4771 1688,5053 1688,5258 1688,5420 1688,6880 1688,7033 1688,7085 1688,7766 1688,7880 1688,9093 1688,9423 1688,13502 1688,13538 1688,14135 1688,14374 1688,15293 1688,15339 1688,15341 1688,15386 1688,15604 1688,15691 1688,15699 1688,16431 1688,16614 1688,17565 1688,17857 1688,19413 1688,19415 1688,19859 1688,20261 1688,23863 1688,26161 1688,26288 1688,28315 1688,28404 1688,28451 1688,28814 1688,28977 1688,29099 1688,29848 1688,32978 1688,34407 1688,37414 1688,37511 1688,37637 1688,39005 1688,40532 1688,40776 1688,41134 1688,41837 1688,45092 1688,46282 1688,46825 1688,48256 1688,48259 1688,50020 1688,52389 1688,52397 1688,56449 1688,56923 1688,64161 1688,64504 1688,64571 1688,65824 1688,68329 1688,68878 1688,78717 1688,79334 1688,80188 1688,80709 1688,81834 1688,87480 1688,88132 1688,89666 1688,91444 1688,92020 1688,92892 1688,95025 1688,95409 1688,103844 1688,105656 1688,107539 1688,108134 1688,109440 1688,112832 1688,113538 1688,117775 1688,118246 1688,119975 1688,127372 1688,127633 1688,135317 1688,136133 1688,138210 1688,138213 1688,138225 1688,138226 1688,138227 1688,138228 1688,138231 1688,138232 1688,138234 1688,143370 1688,147339 1688,147523 1688,164344 1688,167000 1688,169403 1688,169405 1688,169421 1688,169454 1688,169861 1688,170689 1688,179829 1688,183660 1688,185856 1688,195162 1688,197848 1688,208030 1688,213175 1688,213206 1688,213322 1688,226504 1688,229986 1688,237375 1688,237646 1688,238684 1688,245488 1688,245493 1688,245498 1688,245503 1688,245967 1688,248570 1688,253411 1688,253414 1688,256937 1688,261976 1688,263333 1689,920 1689,1089 1690,104 1690,254 1690,557 1690,953 1690,954 1690,1939 1690,10318 1691,151 1691,292 1691,390 1691,1363 1691,3003 1691,221293 1692,762 1693,140 1693,1659 1694,500 1695,346 1696,1 1696,3 1696,147 1696,406 1696,707 1696,1118 1696,1345 1696,1467 1696,1572 1696,1696 1696,1697 1696,1698 1696,1792 1696,1801 1696,2092 1696,2421 1696,3182 1696,3258 1696,3611 1696,3672 1696,3683 1696,3836 1696,4007 1696,4419 1696,5178 1696,5182 1696,5384 1696,5685 1696,6032 1696,6178 1696,6424 1696,6890 1696,6913 1696,6926 1696,9361 1696,13136 1696,13245 1696,13299 1696,13301 1696,13414 1696,13441 1696,13450 1696,13488 1696,14061 1696,14098 1696,14285 1696,14379 1696,14425 1696,15303 1696,15367 1696,15684 1696,16378 1696,16528 1696,16558 1696,17569 1696,18582 1696,19285 1696,19881 1696,21292 1696,21665 1696,22351 1696,23311 1696,23398 1696,23520 1696,23755 1696,25381 1696,25395 1696,26216 1696,26220 1696,26227 1696,26229 1696,28107 1696,28193 1696,28196 1696,28384 1696,28387 1696,28486 1696,29647 1696,29664 1696,31018 1696,32462 1696,32533 1696,32563 1696,32845 1696,32872 1696,35316 1696,37710 1696,38181 1696,38202 1696,38360 1696,38446 1696,38711 1696,38972 1696,41877 1696,43216 1696,45125 1696,50000 1696,50016 1696,50153 1696,58212 1696,58280 1696,58281 1696,58283 1696,58287 1696,58291 1696,59047 1696,59608 1696,63917 1696,66240 1696,67865 1696,67867 1696,76992 1696,80519 1696,82739 1696,95386 1696,98329 1696,103275 1696,104321 1696,108066 1696,112786 1696,117738 1696,122160 1696,123704 1696,123811 1696,125011 1696,152572 1696,156296 1696,162975 1696,165993 1696,166933 1696,189266 1696,193602 1696,233343 1697,192 1697,1388 1697,1803 1699,438 1700,278 1700,1019 1701,41 1701,289 1701,290 1701,417 1701,631 1701,805 1701,999 1701,1119 1701,1359 1701,1635 1701,7194 1702,202 1702,251 1702,252 1702,516 1702,1512 1702,1983 1702,5992 1702,189788 1703,390 1704,104 1704,200 1704,215 1704,636 1704,714 1704,718 1704,750 1704,762 1704,1119 1704,1462 1704,1745 1704,8537 1705,217 1705,240 1705,818 1705,1210 1705,1417 1705,127158 1706,1707 1707,491 1707,497 1707,733 1707,991 1707,1707 1707,3260 1707,135500 1708,30 1708,146 1708,175 1708,313 1708,328 1708,485 1708,493 1708,685 1708,693 1708,704 1708,772 1708,920 1708,1619 1708,92476 1709,130 1710,1711 1711,87 1712,1374 1713,631 1713,805 1714,438 1715,71 1715,104 1715,192 1715,240 1715,304 1715,356 1715,390 1715,446 1715,534 1715,631 1715,677 1715,685 1715,717 1715,794 1715,818 1715,838 1715,907 1715,937 1715,973 1715,1010 1715,1011 1715,1085 1715,1276 1715,1284 1715,1326 1715,1715 1715,1716 1715,1837 1715,1955 1715,1957 1715,2083 1715,2512 1715,3483 1715,4039 1715,4145 1715,4146 1715,4411 1715,4577 1715,4655 1715,5155 1715,5718 1715,6880 1715,7170 1715,9391 1715,9726 1715,13217 1715,15272 1715,15277 1715,16038 1715,17154 1715,18145 1715,18457 1715,18608 1715,21469 1715,23423 1715,26054 1715,27119 1715,29546 1715,29595 1715,30577 1715,31474 1715,32222 1715,32576 1715,34965 1715,35095 1715,37816 1715,38284 1715,39520 1715,39706 1715,40051 1715,42320 1715,43248 1715,43394 1715,43830 1715,45032 1715,47549 1715,48353 1715,48867 1715,49893 1715,49917 1715,50005 1715,52532 1715,52558 1715,52779 1715,52942 1715,52945 1715,55868 1715,58515 1715,66515 1715,71177 1715,73570 1715,75912 1715,78790 1715,78891 1715,80449 1715,81944 1715,83496 1715,86402 1715,88120 1715,89557 1715,93074 1715,101716 1715,104541 1715,106786 1715,107988 1715,109352 1715,112935 1715,115681 1715,116543 1715,124745 1715,127158 1715,128143 1715,128287 1715,133946 1715,133975 1715,135098 1715,136635 1715,140370 1715,151104 1715,151698 1715,157385 1715,157617 1715,157689 1715,158145 1715,158236 1715,158274 1715,158928 1715,159422 1715,159857 1715,163898 1715,165607 1715,169908 1715,172029 1715,173876 1715,176407 1715,178504 1715,189942 1715,190242 1715,191124 1715,193373 1715,193422 1715,194333 1715,194420 1715,214958 1715,215313 1715,219889 1715,224531 1715,242008 1715,242753 1715,245154 1715,260771 1715,261840 1715,263285 1715,263496 1716,304 1716,1715 1717,611 1717,1718 1718,34 1718,35 1718,313 1718,1026 1718,1313 1718,1869 1718,2223 1718,2944 1718,4352 1718,5034 1718,5326 1718,8435 1718,15633 1718,18577 1718,19286 1718,23669 1718,70738 1718,74555 1718,82659 1718,128748 1718,161519 1718,189121 1718,195578 1718,195583 1718,205745 1718,223410 1718,225290 1718,226207 1718,233508 1718,260102 1718,260121 1719,1058 1720,920 1721,1474 1722,5 1722,107 1722,111 1722,217 1722,292 1722,314 1722,338 1722,441 1722,442 1722,462 1722,509 1722,510 1722,595 1722,652 1722,673 1722,852 1722,872 1722,978 1722,1025 1722,1130 1722,1151 1722,1235 1722,1238 1722,1453 1722,1559 1722,1572 1722,1584 1722,1653 1722,1688 1722,1722 1722,1758 1722,1845 1722,1893 1722,1973 1722,2124 1722,2181 1722,2697 1722,2889 1722,2991 1722,3367 1722,3538 1722,3713 1722,4039 1722,4520 1722,4565 1722,4580 1722,4660 1722,4771 1722,5053 1722,5258 1722,5608 1722,6621 1722,6695 1722,7379 1722,7993 1722,9354 1722,13323 1722,13389 1722,13444 1722,15612 1722,16624 1722,18131 1722,18838 1722,19466 1722,19579 1722,20556 1722,23439 1722,25502 1722,26051 1722,26084 1722,26369 1722,26986 1722,28233 1722,28442 1722,28814 1722,28977 1722,29760 1722,29887 1722,32819 1722,32978 1722,33968 1722,34906 1722,35435 1722,40734 1722,41197 1722,41470 1722,44522 1722,45140 1722,46340 1722,49352 1722,50474 1722,50678 1722,52811 1722,55151 1722,55964 1722,58560 1722,61083 1722,62944 1722,65824 1722,71936 1722,78717 1722,80559 1722,80599 1722,82043 1722,84071 1722,86685 1722,88475 1722,91967 1722,93126 1722,97359 1722,109518 1722,114634 1722,115326 1722,119911 1722,122371 1722,122671 1722,125218 1722,130271 1722,130707 1722,133004 1722,133188 1722,133476 1722,141965 1722,141981 1722,142339 1722,147951 1722,157713 1722,167710 1722,176814 1722,178596 1722,181039 1722,185537 1722,203514 1722,213805 1722,220927 1722,221242 1722,222364 1722,235909 1722,243650 1722,243664 1722,247096 1722,258745 1722,261761 1723,1724 1724,34 1724,35 1724,54 1724,83 1724,278 1724,314 1724,379 1724,397 1724,455 1724,457 1724,512 1724,536 1724,635 1724,657 1724,673 1724,676 1724,685 1724,849 1724,852 1724,1014 1724,1019 1724,1072 1724,1118 1724,1566 1724,1655 1724,1663 1724,1843 1724,1871 1724,1916 1724,2159 1724,2266 1724,2319 1724,2373 1724,2516 1724,2646 1724,4234 1724,5326 1724,8152 1724,13240 1724,17273 1724,17837 1724,20757 1724,21589 1724,25670 1724,26161 1724,29944 1724,30583 1724,50501 1724,66703 1724,82217 1724,107100 1724,257589 1725,24 1725,26 1725,59 1725,885 1725,887 1725,2674 1725,5162 1726,79 1726,192 1726,525 1726,818 1726,868 1727,250 1727,1684 1728,175 1728,527 1729,147 1729,158 1729,167 1729,440 1729,493 1729,516 1729,571 1729,764 1729,3804 1729,21944 1730,292 1731,973 1731,1732 1732,46 1732,388 1732,431 1732,499 1732,575 1732,663 1732,664 1732,685 1732,744 1732,775 1732,877 1732,907 1732,937 1732,968 1732,972 1732,973 1732,1010 1732,1117 1732,1119 1732,1122 1732,1124 1732,1160 1732,1161 1732,1167 1732,1231 1732,1282 1732,1284 1732,1298 1732,1326 1732,1436 1732,1544 1732,1715 1732,1732 1732,1837 1732,1849 1732,2372 1732,3504 1732,3609 1732,3818 1732,4043 1732,5662 1732,5792 1732,8632 1732,15159 1732,20350 1732,28114 1732,28815 1732,29795 1732,31255 1732,31278 1732,31766 1732,34296 1732,37631 1732,41304 1732,41308 1732,41317 1732,41897 1732,41901 1732,46167 1732,50522 1732,64457 1732,67886 1732,74355 1732,75296 1732,78882 1732,83321 1732,87192 1732,90183 1732,90294 1732,93007 1732,96501 1732,110322 1732,114862 1732,127756 1732,130807 1732,148742 1732,229212 1732,237320 1732,243317 1732,249206 1732,254424 1733,26 1733,59 1733,1235 1733,1335 1733,21944 1734,15 1735,278 1736,264 1736,1127 1736,1147 1736,1289 1736,2051 1737,364 1737,943 1738,68 1738,107 1738,264 1738,714 1738,1210 1738,1400 1738,2436 1738,2590 1738,4220 1738,66297 1738,193129 1739,1016 1739,1282 1739,1882 1740,37 1740,255 1740,292 1740,301 1740,450 1740,567 1740,604 1740,676 1740,698 1740,717 1740,849 1740,852 1740,937 1740,968 1740,1293 1740,1298 1740,1740 1740,1741 1740,1782 1740,2323 1740,3422 1740,3756 1740,4175 1740,18218 1740,23728 1740,26433 1740,28319 1740,33479 1740,37857 1740,46638 1740,49420 1740,50248 1740,52932 1740,62509 1740,65806 1740,77473 1740,80062 1740,105686 1740,107073 1740,110525 1740,114840 1740,156313 1740,156621 1740,157034 1740,157315 1740,159431 1740,159491 1740,173711 1740,183453 1740,185290 1740,187456 1740,195547 1740,214896 1740,215971 1740,228880 1740,237662 1740,253219 1740,253225 1740,253400 1741,1740 1742,710 1744,111 1744,1745 1746,1326 1748,1749 1749,104 1749,111 1749,217 1749,240 1749,435 1749,467 1749,510 1749,666 1749,872 1749,973 1749,1010 1749,1118 1749,1133 1749,1172 1749,1298 1749,1326 1749,1411 1749,1462 1749,1531 1749,1566 1749,1796 1749,1818 1749,1844 1749,1882 1749,3804 1749,4039 1749,5130 1749,6695 1749,8537 1749,21944 1750,1751 1750,5448 1750,43064 1752,605 1753,397 1754,1284 1755,48 1755,130 1755,160 1755,462 1755,515 1755,835 1755,991 1755,1381 1755,1579 1755,1639 1755,1707 1755,54264 1756,83 1756,222 1756,283 1756,389 1756,455 1756,891 1756,1539 1756,2646 1756,3860 1756,7768 1756,13137 1756,13328 1756,19351 1756,37095 1756,39572 1757,1010 1758,104 1758,107 1758,111 1758,160 1758,292 1758,338 1758,440 1758,441 1758,462 1758,510 1758,515 1758,872 1758,1058 1758,1140 1758,1151 1758,1204 1758,1722 1758,1893 1758,2436 1758,3538 1758,4039 1758,4771 1759,907 1759,932 1760,710 1761,425 1762,622 1762,929 1762,2353 1763,479 1763,647 1763,991 1763,1052 1763,1102 1763,1579 1763,1659 1763,2312 1763,49057 1764,516 1764,3872 1765,1043 1766,1767 1768,1769 1769,1240 1769,1805 1770,83 1770,660 1770,1539 1771,104 1771,1284 1771,1801 1772,1773 1773,10 1773,175 1773,485 1773,1651 1773,1773 1773,3067 1773,9039 1773,15547 1773,20874 1773,31934 1773,48508 1773,51581 1773,51803 1773,52203 1773,53934 1773,56110 1773,66203 1773,80297 1773,80298 1773,80731 1773,80737 1773,87571 1773,100093 1773,101985 1773,104227 1773,108291 1773,110882 1773,112699 1773,120247 1773,122484 1773,126562 1773,128389 1773,129589 1773,129615 1773,130050 1773,132423 1773,143637 1773,145310 1773,146134 1773,151773 1773,151776 1773,151808 1773,152309 1773,154513 1773,155537 1773,157217 1773,158283 1773,159584 1773,159815 1773,159833 1773,160039 1773,160040 1773,160482 1773,160662 1773,160963 1773,161254 1773,162016 1773,162361 1773,163255 1773,164141 1773,165689 1773,167031 1773,167499 1773,167767 1773,167816 1773,169182 1773,170167 1773,171297 1773,171445 1773,171798 1773,172787 1773,175942 1773,177919 1773,182294 1773,183193 1773,187889 1773,187891 1773,190154 1773,191767 1773,192290 1773,192910 1773,193263 1773,194179 1773,199081 1773,213363 1773,222239 1773,224242 1773,224356 1773,228720 1773,229480 1773,231744 1773,231817 1773,235400 1773,237252 1773,239538 1773,239701 1773,240624 1773,244899 1773,245452 1773,245462 1773,246694 1773,247229 1773,248032 1773,248993 1773,250262 1773,252392 1773,253017 1773,254123 1773,255413 1773,255472 1773,257721 1773,257803 1773,257809 1773,257888 1773,259057 1773,259374 1773,262198 1773,263606 1774,663 1774,664 1774,937 1775,298 1776,1 1776,20 1776,147 1776,149 1776,158 1776,285 1776,336 1776,397 1776,406 1776,435 1776,439 1776,452 1776,599 1776,622 1776,693 1776,724 1776,766 1776,779 1776,849 1776,1033 1776,1651 1776,1776 1776,1777 1776,1803 1776,1832 1776,2102 1776,2217 1776,2352 1776,2373 1776,2400 1776,3576 1776,4102 1776,4684 1776,8273 1776,9394 1776,9457 1776,14111 1776,14436 1776,17423 1776,18124 1776,19191 1776,20694 1776,21442 1776,22357 1776,23854 1776,26038 1776,28377 1776,28425 1776,31222 1776,38407 1776,59020 1776,62265 1776,62313 1776,63347 1776,64580 1776,66258 1776,68069 1776,68149 1776,69883 1776,70071 1776,70138 1776,73231 1776,74526 1776,74697 1776,79528 1776,91285 1776,93860 1776,95822 1776,96658 1776,106377 1776,113468 1776,113469 1776,118336 1776,121001 1776,124347 1776,125750 1776,126717 1776,126804 1776,127907 1776,128338 1776,134142 1776,147485 1776,147811 1776,154670 1776,160787 1776,170671 1776,176961 1776,222842 1776,227249 1776,242157 1776,249784 1777,1776 1778,344 1778,1711 1778,1836 1779,240 1780,1509 1781,97 1781,175 1781,1287 1781,2719 1782,37 1782,68 1782,186 1782,261 1782,301 1782,327 1782,440 1782,467 1782,567 1782,599 1782,604 1782,615 1782,631 1782,663 1782,664 1782,677 1782,685 1782,698 1782,716 1782,717 1782,784 1782,838 1782,881 1782,911 1782,937 1782,968 1782,972 1782,1010 1782,1011 1782,1014 1782,1145 1782,1167 1782,1231 1782,1293 1782,1300 1782,1564 1782,1612 1782,1623 1782,1782 1782,1783 1782,1837 1782,1844 1782,1849 1782,1973 1782,2217 1782,2263 1782,2272 1782,2369 1782,2452 1782,3187 1782,3379 1782,3422 1782,3437 1782,3756 1782,3804 1782,4159 1782,4253 1782,4270 1782,4286 1782,4315 1782,4422 1782,4598 1782,4683 1782,5194 1782,5262 1782,5382 1782,5563 1782,5662 1782,6167 1782,6398 1782,6431 1782,6460 1782,6470 1782,6612 1782,6938 1782,7087 1782,7140 1782,7222 1782,7444 1782,9239 1782,9555 1782,9579 1782,9655 1782,13319 1782,13454 1782,14916 1782,15635 1782,16150 1782,18129 1782,18861 1782,19343 1782,19494 1782,19592 1782,20327 1782,20550 1782,20756 1782,20803 1782,22391 1782,22450 1782,23799 1782,25062 1782,25169 1782,25527 1782,26034 1782,26287 1782,26393 1782,26433 1782,28317 1782,28450 1782,28512 1782,28989 1782,30265 1782,30717 1782,30839 1782,34162 1782,34193 1782,36563 1782,37362 1782,38300 1782,38816 1782,38860 1782,38878 1782,38937 1782,39650 1782,40932 1782,40933 1782,41778 1782,41781 1782,42602 1782,42786 1782,42868 1782,46638 1782,46792 1782,46868 1782,46881 1782,48072 1782,48111 1782,48112 1782,48114 1782,48123 1782,48130 1782,48131 1782,48138 1782,48139 1782,48206 1782,48210 1782,48211 1782,48212 1782,48213 1782,48214 1782,48215 1782,48216 1782,48217 1782,48218 1782,48219 1782,48220 1782,48221 1782,48222 1782,48223 1782,48224 1782,48225 1782,48226 1782,48227 1782,48229 1782,48230 1782,48231 1782,48238 1782,48303 1782,48304 1782,48305 1782,48419 1782,48420 1782,48421 1782,48422 1782,48424 1782,48529 1782,48577 1782,48640 1782,48900 1782,50132 1782,50490 1782,52123 1782,52908 1782,54285 1782,54456 1782,55695 1782,55776 1782,57182 1782,58377 1782,60375 1782,62739 1782,67493 1782,68131 1782,76051 1782,77104 1782,77525 1782,77789 1782,78173 1782,78823 1782,79086 1782,83493 1782,85968 1782,85983 1782,87287 1782,87399 1782,92836 1782,92844 1782,96513 1782,97082 1782,97190 1782,101485 1782,103860 1782,104592 1782,107492 1782,107973 1782,110528 1782,111170 1782,111258 1782,111348 1782,112539 1782,113886 1782,116198 1782,119479 1782,120449 1782,121028 1782,123631 1782,127418 1782,133557 1782,135773 1782,135774 1782,135775 1782,135776 1782,135777 1782,135958 1782,135990 1782,137001 1782,137752 1782,140456 1782,142312 1782,145029 1782,147311 1782,147374 1782,147947 1782,156961 1782,160704 1782,163272 1782,164186 1782,165625 1782,165656 1782,170729 1782,175993 1782,178846 1782,180218 1782,186184 1782,189303 1782,192793 1782,194417 1782,195174 1782,212010 1782,212495 1782,216545 1782,216554 1782,216562 1782,216582 1782,216590 1782,216597 1782,218414 1782,221192 1782,221828 1782,221920 1782,223784 1782,224683 1782,225340 1782,227376 1782,227672 1782,233468 1782,245433 1782,247366 1782,247902 1782,247969 1782,248760 1782,248936 1782,262749 1783,1782 1785,167 1785,240 1785,631 1785,818 1785,1564 1785,1818 1785,3532 1785,4179 1785,4540 1785,5278 1785,5718 1785,6821 1785,14139 1785,14155 1785,15164 1785,17848 1785,46574 1785,60814 1785,64594 1785,65841 1785,75300 1785,85961 1785,103274 1785,103524 1785,103856 1785,113430 1785,127158 1785,138698 1785,162121 1785,165283 1786,147 1786,602 1786,849 1786,1973 1787,1564 1788,130 1789,20 1789,315 1789,346 1789,435 1789,439 1789,446 1789,671 1789,676 1789,1033 1789,1068 1789,1294 1789,1474 1789,1612 1789,1789 1789,1790 1789,2211 1789,3224 1789,3903 1789,4324 1789,4692 1789,4785 1789,5307 1789,6661 1789,7087 1789,13506 1789,13551 1789,18220 1789,20742 1789,22052 1789,24603 1789,25067 1789,32791 1789,34963 1789,37329 1789,45721 1789,46966 1789,48103 1789,49283 1789,49504 1789,54566 1789,54582 1789,54798 1789,54934 1789,82872 1789,90933 1789,92944 1789,93741 1789,97647 1789,112202 1789,128247 1789,138052 1789,144045 1789,147400 1789,147525 1789,148725 1789,149064 1789,160423 1789,160728 1789,165881 1789,174461 1789,189128 1789,190492 1789,199156 1789,232172 1789,237016 1789,241213 1789,246009 1789,255513 1789,259726 1790,439 1790,671 1790,1068 1790,1789 1791,439 1791,1033 1792,6424 1793,1113 1794,202 1794,203 1794,251 1794,465 1795,15 1795,106 1795,147 1795,151 1795,163 1795,206 1795,217 1795,298 1795,305 1795,309 1795,310 1795,344 1795,346 1795,366 1795,420 1795,489 1795,493 1795,563 1795,671 1795,775 1795,911 1795,929 1795,991 1795,1085 1795,1096 1795,1132 1795,1201 1795,1285 1795,1623 1795,2889 1795,5911 1795,7117 1795,75912 1796,97 1796,158 1796,182 1796,192 1796,207 1796,217 1796,248 1796,264 1796,301 1796,302 1796,314 1796,337 1796,392 1796,397 1796,452 1796,457 1796,467 1796,599 1796,631 1796,704 1796,818 1796,838 1796,872 1796,920 1796,1001 1796,1010 1796,1014 1796,1085 1796,1172 1796,1191 1796,1204 1796,1298 1796,1417 1796,1419 1796,1434 1796,1518 1796,1533 1796,1634 1796,1678 1796,1796 1796,1844 1796,2037 1796,2512 1796,2797 1796,3094 1796,3397 1796,3804 1796,5538 1796,5596 1796,6525 1796,6890 1796,7076 1796,7880 1796,12752 1796,13478 1796,13771 1796,19874 1796,20757 1796,23461 1796,24934 1796,25551 1796,26133 1796,52769 1796,56612 1796,60160 1796,75271 1796,97536 1796,97934 1796,108491 1796,172497 1796,182308 1796,260895 1797,65 1797,467 1797,868 1797,1433 1797,156379 1798,1010 1798,3182 1799,433 1799,1634 1800,1801 1801,34 1801,314 1801,446 1801,510 1801,589 1801,599 1801,623 1801,685 1801,693 1801,697 1801,707 1801,752 1801,852 1801,874 1801,911 1801,968 1801,1011 1801,1345 1801,1437 1801,1572 1801,1678 1801,1696 1801,1796 1801,1801 1801,1805 1801,2045 1801,2054 1801,2165 1801,2348 1801,2373 1801,3182 1801,3387 1801,3396 1801,3497 1801,4159 1801,5185 1801,5265 1801,5568 1801,6156 1801,6424 1801,6430 1801,6474 1801,6652 1801,7087 1801,7718 1801,9748 1801,13154 1801,13158 1801,13245 1801,14061 1801,14098 1801,14536 1801,15691 1801,18191 1801,26480 1801,28107 1801,29293 1801,29677 1801,31080 1801,31106 1801,33442 1801,35094 1801,38300 1801,39618 1801,40022 1801,40729 1801,41393 1801,44127 1801,45710 1801,45886 1801,47095 1801,48002 1801,48109 1801,50143 1801,51348 1801,54714 1801,54948 1801,59121 1801,59144 1801,59908 1801,62983 1801,64570 1801,64882 1801,67867 1801,68656 1801,70126 1801,71845 1801,73204 1801,74445 1801,75844 1801,78804 1801,78919 1801,78949 1801,80519 1801,85842 1801,88418 1801,90383 1801,91158 1801,91453 1801,97147 1801,98852 1801,102008 1801,102695 1801,102754 1801,102893 1801,103355 1801,104275 1801,104572 1801,105722 1801,105775 1801,106255 1801,113618 1801,114428 1801,121381 1801,125163 1801,128733 1801,131643 1801,132917 1801,133644 1801,134184 1801,145515 1801,150337 1801,150379 1801,157071 1801,158939 1801,158944 1801,159366 1801,160494 1801,163632 1801,164906 1801,165929 1801,167757 1801,167820 1801,168885 1801,169062 1801,171699 1801,173363 1801,175486 1801,177309 1801,178857 1801,183356 1801,185860 1801,185962 1801,186634 1801,188527 1801,192884 1801,192895 1801,193078 1801,194985 1801,195076 1801,196739 1801,198886 1801,217519 1801,220281 1801,220288 1801,220317 1801,222523 1801,225463 1801,226179 1801,232118 1801,237561 1801,237566 1801,237570 1801,237574 1801,238983 1801,241594 1801,243433 1801,243437 1801,243444 1801,243566 1801,244096 1801,244650 1801,248585 1801,253998 1801,258685 1801,258891 1801,258991 1801,262340 1801,262564 1802,1803 1803,1 1803,11 1803,147 1803,148 1803,149 1803,158 1803,175 1803,178 1803,285 1803,336 1803,406 1803,422 1803,438 1803,452 1803,621 1803,622 1803,779 1803,1014 1803,1130 1803,1370 1803,1546 1803,1623 1803,1802 1803,1803 1803,1940 1803,1969 1803,2102 1803,3578 1803,3813 1803,5118 1803,5148 1803,6817 1803,8477 1803,9305 1803,14111 1803,15408 1803,20071 1803,20495 1803,20585 1803,20598 1803,20694 1803,21217 1803,21442 1803,21837 1803,22027 1803,22357 1803,25426 1803,25489 1803,26453 1803,33672 1803,34880 1803,35368 1803,35561 1803,37502 1803,37512 1803,40521 1803,40840 1803,41221 1803,41541 1803,43007 1803,43276 1803,45013 1803,45427 1803,46182 1803,48364 1803,50586 1803,55689 1803,56006 1803,59020 1803,59855 1803,59864 1803,59887 1803,60698 1803,61224 1803,61626 1803,64572 1803,66106 1803,68695 1803,68841 1803,69923 1803,70081 1803,70138 1803,72874 1803,73422 1803,73960 1803,74416 1803,79528 1803,83467 1803,83483 1803,91397 1803,93649 1803,93884 1803,94898 1803,95391 1803,98902 1803,99655 1803,99848 1803,107482 1803,108041 1803,108093 1803,118336 1803,124409 1803,125840 1804,143 1804,1052 1804,1177 1805,32 1805,87 1805,314 1805,349 1805,360 1805,388 1805,392 1805,425 1805,446 1805,452 1805,599 1805,658 1805,661 1805,697 1805,818 1805,838 1805,903 1805,918 1805,919 1805,1011 1805,1043 1805,1204 1805,1240 1805,1424 1805,1454 1805,1465 1805,1502 1805,1513 1805,1559 1805,1663 1805,1769 1805,1801 1805,1805 1805,1860 1805,1986 1805,2045 1805,3367 1805,3507 1805,4159 1805,4760 1805,5470 1805,5540 1805,5568 1805,5624 1805,6059 1805,6430 1805,6691 1805,6818 1805,7766 1805,7890 1805,8208 1805,8236 1805,8860 1805,9785 1805,15609 1805,18575 1805,19299 1805,19609 1805,21245 1805,21380 1805,22363 1805,24801 1805,26074 1805,26161 1805,28982 1805,30705 1805,31001 1805,32613 1805,33674 1805,34811 1805,34851 1805,34870 1805,35464 1805,35576 1805,36124 1805,37219 1805,37657 1805,40610 1805,41880 1805,54823 1805,56242 1805,56256 1805,67686 1805,73194 1805,74122 1805,75120 1805,77769 1805,77868 1805,89731 1805,90144 1805,101612 1805,101901 1805,103896 1805,110807 1805,112234 1805,112259 1805,114080 1805,121505 1805,126813 1805,127158 1805,135272 1805,138686 1805,139633 1805,139748 1805,142958 1805,146367 1805,147071 1805,147082 1805,147562 1805,147871 1805,148044 1805,148830 1805,148845 1805,150585 1805,150710 1805,151529 1805,152694 1805,152714 1805,153319 1805,155369 1805,155396 1805,155905 1805,160789 1805,161636 1805,176559 1805,179320 1805,182958 1805,185454 1805,186786 1805,189212 1805,207837 1805,212498 1805,212846 1805,214131 1805,220947 1805,228303 1805,229063 1805,236546 1805,236550 1805,238787 1805,241496 1805,243369 1805,255064 1806,160 1806,1058 1807,94 1807,240 1807,332 1807,372 1807,400 1807,446 1807,612 1807,636 1807,685 1807,715 1807,784 1807,801 1807,852 1807,911 1807,1011 1807,1082 1807,1203 1807,1285 1807,1309 1807,1368 1807,1459 1807,1807 1807,1808 1807,1888 1807,1955 1807,2225 1807,2315 1807,2512 1807,2648 1807,2775 1807,3115 1807,3619 1807,4115 1807,5265 1807,5439 1807,5654 1807,14133 1807,14597 1807,16271 1807,21290 1807,21635 1807,26498 1807,33833 1807,39258 1807,42951 1807,44114 1807,44393 1807,49795 1807,50682 1807,58503 1807,65827 1807,66500 1807,70318 1807,71819 1807,72809 1807,77105 1807,79875 1807,84519 1807,84535 1807,86451 1807,91450 1807,98195 1807,98201 1807,98206 1807,104630 1807,106890 1807,106990 1807,115251 1807,115455 1807,118819 1807,123007 1807,124756 1807,126048 1807,129993 1807,133532 1807,133977 1807,136035 1807,138845 1807,143071 1807,144748 1807,156202 1807,157602 1807,157708 1807,158342 1807,160410 1807,160810 1807,163825 1807,174910 1807,174990 1807,175903 1807,202621 1807,214733 1807,238622 1807,247325 1807,247612 1807,248443 1807,248783 1808,68 1808,104 1808,136 1808,240 1808,248 1808,310 1808,332 1808,364 1808,497 1808,588 1808,590 1808,631 1808,694 1808,714 1808,749 1808,760 1808,781 1808,805 1808,911 1808,999 1808,1203 1808,1262 1808,1285 1808,1332 1808,1388 1808,1631 1808,1844 1808,1860 1808,1888 1808,2205 1808,2266 1808,2512 1808,3135 1808,3328 1808,4475 1808,7124 1808,11147 1808,27041 1808,33424 1809,195 1810,444 1811,349 1811,697 1812,1623 1813,1287 1814,1801 1815,10 1815,147 1815,171 1815,175 1815,184 1815,206 1815,330 1815,640 1815,841 1815,957 1815,1246 1815,1247 1815,1293 1815,1623 1815,1815 1815,2344 1815,3037 1815,4289 1815,5073 1815,5244 1815,6138 1815,7159 1815,7518 1815,8982 1815,14588 1815,15236 1815,16359 1815,16497 1815,16706 1815,17356 1815,19301 1815,19624 1815,22711 1815,23104 1815,25869 1815,26982 1815,27467 1815,28360 1815,29979 1815,41205 1815,41244 1815,43312 1815,43847 1815,43853 1815,46172 1815,52201 1815,52888 1815,54157 1815,57412 1815,57415 1815,57417 1815,57451 1815,57929 1815,62011 1815,63734 1815,64743 1815,64745 1815,65742 1815,72116 1815,76060 1815,78875 1815,85979 1815,95054 1815,98039 1815,102786 1815,104229 1815,106938 1815,109503 1815,110049 1815,110934 1815,113242 1815,129852 1815,129988 1815,138489 1815,140449 1815,144001 1815,148499 1815,149239 1815,150988 1815,152981 1815,156778 1815,163588 1815,163793 1815,163924 1815,164572 1815,164781 1815,168962 1815,175492 1815,176012 1815,177336 1815,177581 1815,180276 1815,181895 1815,183118 1815,186191 1815,204687 1815,214415 1815,221358 1815,222281 1815,225655 1815,244977 1816,424 1817,1370 1817,1821 1818,167 1818,217 1818,240 1818,264 1818,289 1818,290 1818,328 1818,588 1818,590 1818,592 1818,704 1818,760 1818,818 1818,872 1818,911 1818,1011 1818,1014 1818,1085 1818,1282 1818,1285 1818,1402 1818,1505 1818,1511 1818,1564 1818,1796 1818,1818 1818,1973 1818,2173 1818,2205 1818,2206 1818,2286 1818,2512 1818,2620 1818,2874 1818,3028 1818,3069 1818,3507 1818,3565 1818,3738 1818,3832 1818,3879 1818,3937 1818,4237 1818,4352 1818,4540 1818,5278 1818,5346 1818,5626 1818,5718 1818,5789 1818,6651 1818,6856 1818,7481 1818,8763 1818,9015 1818,13965 1818,14603 1818,15397 1818,16289 1818,16684 1818,17848 1818,18603 1818,20072 1818,22281 1818,23102 1818,24896 1818,26410 1818,26460 1818,26781 1818,33424 1818,34752 1818,35304 1818,37202 1818,37224 1818,38984 1818,39618 1818,43364 1818,45532 1818,47810 1818,49074 1818,50540 1818,52862 1818,58206 1818,62482 1818,63102 1818,64594 1818,69440 1818,77679 1818,80149 1818,82579 1818,82731 1818,83766 1818,92242 1818,94134 1818,95060 1818,103524 1818,104536 1818,105263 1818,112364 1818,114908 1818,115293 1818,116694 1818,117141 1818,119203 1818,119860 1818,120093 1818,127158 1818,130889 1818,131371 1818,135138 1818,139943 1818,140095 1818,140454 1818,141563 1818,143052 1818,144988 1818,147955 1818,148287 1818,149323 1818,150051 1818,150522 1818,150593 1818,157729 1818,158581 1818,167312 1818,170061 1818,171308 1818,178576 1818,178651 1818,182162 1818,195758 1818,197837 1818,215433 1818,229795 1818,236111 1818,238532 1818,245559 1818,245910 1818,246095 1818,246474 1818,247924 1818,249309 1818,249437 1818,251385 1819,723 1819,1267 1820,151 1821,106 1821,280 1821,337 1821,586 1821,663 1821,664 1821,1370 1821,2782 1821,17245 1822,1309 1823,868 1824,433 1824,1634 1825,56 1825,79 1825,147 1825,192 1825,206 1825,333 1825,779 1825,1089 1825,1118 1825,1181 1825,1192 1825,1619 1825,2173 1825,2244 1825,3895 1825,8055 1825,68069 1825,75912 1826,843 1827,1143 1827,1363 1828,30 1829,592 1830,1010 1831,225 1831,248 1831,379 1831,390 1831,431 1831,932 1831,941 1831,968 1831,1274 1831,1832 1831,22799 1832,968 1832,1124 1832,1231 1832,2217 1832,23031 1833,1 1833,147 1833,158 1833,336 1833,1833 1833,1834 1833,2101 1833,2244 1833,3785 1833,5401 1833,7169 1833,7909 1833,8053 1833,9394 1833,15569 1833,16183 1833,22531 1833,24636 1833,24954 1833,25274 1833,25458 1833,28503 1833,28872 1833,29645 1833,32809 1833,34043 1833,35571 1833,35731 1834,158 1835,843 1836,58 1836,87 1836,314 1836,509 1836,510 1836,599 1836,685 1836,849 1836,852 1836,872 1836,911 1836,1011 1836,1118 1836,1130 1836,1172 1836,1465 1836,1722 1836,1805 1836,4039 1836,4066 1836,21944 1837,86 1837,167 1837,192 1837,256 1837,301 1837,314 1837,440 1837,505 1837,563 1837,567 1837,599 1837,615 1837,663 1837,803 1837,818 1837,907 1837,932 1837,937 1837,941 1837,968 1837,972 1837,973 1837,1010 1837,1011 1837,1014 1837,1117 1837,1118 1837,1231 1837,1284 1837,1298 1837,1732 1837,1740 1837,1782 1837,1796 1837,1838 1837,1849 1837,1853 1837,2083 1837,2191 1837,2246 1837,2263 1837,2473 1837,2689 1837,2979 1837,3207 1837,3455 1837,3507 1837,3718 1837,3754 1837,4253 1837,4291 1837,4932 1837,5292 1837,5382 1837,5502 1837,5625 1837,6909 1837,7222 1837,7995 1837,14414 1837,16192 1837,16489 1837,16601 1837,18356 1837,18667 1837,18880 1837,19592 1837,19791 1837,20075 1837,20327 1837,20590 1837,20593 1837,21563 1837,21565 1837,21866 1837,24579 1837,25802 1837,29714 1837,29760 1837,29947 1837,30373 1837,30410 1837,32899 1837,33552 1837,37795 1837,38860 1837,39285 1837,43928 1837,44403 1837,47450 1837,48238 1837,49445 1837,50423 1837,50522 1837,53512 1837,66590 1837,67116 1837,70028 1837,71868 1837,73355 1837,76704 1837,77858 1837,80659 1837,82907 1837,84458 1837,85758 1837,85783 1837,88299 1837,88611 1837,91999 1837,92003 1837,93065 1837,93300 1837,93327 1837,99626 1837,102397 1837,113093 1837,114464 1837,115239 1837,115479 1837,115667 1837,116513 1837,116560 1837,118200 1837,124689 1837,126939 1837,127158 1837,136226 1837,138007 1837,144029 1837,145979 1837,154367 1837,157363 1837,157566 1837,162977 1837,164427 1837,164448 1837,165872 1837,172278 1837,173260 1837,180462 1837,180509 1837,181875 1837,182446 1837,183352 1837,190250 1837,191011 1837,196029 1837,216706 1837,224304 1837,237320 1837,239311 1837,239660 1837,259524 1837,262708 1838,457 1838,1837 1838,2310 1839,273 1839,274 1839,66754 1840,1058 1841,349 1842,195 1843,19 1843,54 1843,135 1843,217 1843,397 1843,477 1843,536 1843,660 1843,1417 1843,1539 1843,1571 1843,1724 1843,2168 1843,2421 1843,2424 1843,2553 1843,2646 1843,2944 1843,5326 1843,5591 1843,6506 1843,17346 1844,10 1844,30 1844,68 1844,104 1844,107 1844,134 1844,138 1844,147 1844,158 1844,163 1844,182 1844,192 1844,200 1844,209 1844,211 1844,217 1844,256 1844,261 1844,264 1844,301 1844,302 1844,314 1844,327 1844,336 1844,356 1844,360 1844,392 1844,406 1844,417 1844,435 1844,440 1844,446 1844,457 1844,467 1844,497 1844,505 1844,510 1844,516 1844,536 1844,557 1844,599 1844,604 1844,622 1844,631 1844,636 1844,673 1844,677 1844,685 1844,794 1844,838 1844,843 1844,849 1844,852 1844,856 1844,872 1844,900 1844,911 1844,920 1844,1001 1844,1011 1844,1014 1844,1070 1844,1085 1844,1089 1844,1118 1844,1127 1844,1130 1844,1140 1844,1151 1844,1172 1844,1204 1844,1210 1844,1243 1844,1262 1844,1293 1844,1332 1844,1370 1844,1417 1844,1445 1844,1518 1844,1531 1844,1533 1844,1572 1844,1623 1844,1749 1844,1796 1844,1808 1844,1844 1844,1893 1844,1968 1844,1992 1844,2037 1844,2105 1844,2373 1844,2460 1844,2512 1844,2580 1844,2605 1844,2867 1844,2868 1844,3507 1844,3744 1844,3930 1844,3944 1844,4190 1844,4276 1844,4355 1844,4771 1844,5213 1844,5551 1844,5578 1844,5596 1844,5833 1844,6452 1844,6752 1844,7022 1844,7178 1844,7879 1844,13207 1844,13538 1844,14024 1844,14220 1844,14379 1844,15275 1844,15454 1844,19335 1844,19543 1844,19592 1844,19783 1844,19784 1844,22880 1844,25108 1844,25526 1844,26450 1844,26860 1844,26873 1844,30507 1844,30557 1844,31706 1844,32824 1844,34124 1844,34949 1844,35706 1844,38300 1844,42735 1844,43358 1844,45404 1844,47106 1844,54285 1844,54616 1844,55105 1844,55416 1844,56906 1844,57182 1844,57222 1844,58405 1844,59833 1844,62322 1844,63018 1844,64722 1844,65733 1844,68006 1844,71039 1844,71770 1844,73313 1844,73475 1844,74745 1844,75912 1844,76969 1844,78772 1844,79669 1844,80482 1844,83379 1844,85867 1844,86055 1844,86494 1844,89929 1844,90389 1844,93199 1844,93766 1844,94906 1844,97536 1844,99160 1844,104539 1844,106361 1844,109266 1844,109385 1844,112767 1844,113060 1844,114497 1844,114928 1844,117013 1844,117309 1844,117480 1844,120258 1844,120927 1844,121455 1844,122637 1844,122758 1844,123792 1844,124939 1844,128733 1844,131419 1844,131890 1844,131965 1844,135279 1844,136701 1844,140745 1844,149373 1844,155201 1844,157683 1844,158327 1844,158336 1844,158350 1844,159872 1844,169624 1844,177802 1844,179739 1844,183938 1844,187340 1844,192452 1844,196116 1844,212173 1844,215059 1844,218340 1844,224097 1844,224863 1844,227995 1844,228949 1844,232307 1844,234886 1844,238321 1844,244646 1844,247221 1844,255194 1844,258385 1844,259479 1845,126 1845,130 1845,140 1845,264 1845,292 1845,338 1845,349 1845,397 1845,462 1845,467 1845,535 1845,649 1845,697 1845,710 1845,801 1845,872 1845,918 1845,1052 1845,1151 1845,1289 1845,1454 1845,1579 1845,1659 1845,1688 1845,1722 1845,1893 1845,2443 1845,2626 1845,3260 1845,3367 1845,4039 1845,5540 1846,160 1846,794 1846,1345 1846,1847 1847,1847 1847,17886 1848,1 1848,106 1848,272 1848,292 1848,313 1848,346 1848,489 1848,626 1848,663 1848,664 1848,671 1848,685 1848,808 1848,841 1848,849 1848,911 1848,929 1848,937 1848,980 1848,1011 1848,1113 1848,1293 1848,1319 1848,1515 1848,1566 1848,1623 1848,1888 1848,1985 1848,2436 1848,3258 1848,3507 1848,26450 1849,10 1849,37 1849,86 1849,106 1849,167 1849,175 1849,211 1849,217 1849,225 1849,292 1849,299 1849,301 1849,313 1849,314 1849,356 1849,390 1849,397 1849,459 1849,467 1849,518 1849,602 1849,604 1849,663 1849,664 1849,693 1849,717 1849,744 1849,783 1849,852 1849,897 1849,907 1849,932 1849,937 1849,940 1849,968 1849,972 1849,973 1849,1010 1849,1012 1849,1013 1849,1027 1849,1122 1849,1123 1849,1167 1849,1241 1849,1264 1849,1284 1849,1293 1849,1297 1849,1298 1849,1320 1849,1326 1849,1436 1849,1479 1849,1493 1849,1522 1849,1544 1849,1575 1849,1591 1849,1616 1849,1623 1849,1635 1849,1651 1849,1732 1849,1782 1849,1837 1849,1849 1849,1955 1849,1985 1849,2007 1849,2083 1849,2102 1849,2191 1849,2285 1849,2336 1849,2345 1849,2347 1849,2375 1849,2480 1849,2557 1849,2625 1849,2652 1849,2775 1849,2840 1849,2979 1849,3115 1849,3207 1849,3218 1849,3422 1849,3630 1849,3687 1849,3761 1849,3801 1849,3804 1849,3820 1849,3937 1849,4182 1849,4213 1849,4324 1849,5133 1849,5137 1849,5159 1849,5301 1849,5361 1849,5388 1849,5563 1849,5601 1849,5607 1849,5662 1849,6533 1849,6698 1849,6712 1849,7333 1849,7530 1849,7959 1849,7969 1849,8022 1849,8132 1849,8165 1849,8534 1849,8864 1849,12112 1849,13148 1849,13262 1849,13506 1849,13518 1849,14111 1849,14158 1849,14358 1849,14428 1849,14497 1849,14572 1849,14597 1849,15141 1849,15678 1849,16614 1849,17877 1849,18116 1849,18320 1849,18340 1849,18625 1849,18782 1849,19191 1849,19952 1849,20297 1849,20396 1849,20575 1849,20668 1849,21635 1849,21726 1849,21998 1849,22493 1849,23402 1849,24580 1849,24620 1849,24719 1849,24924 1849,24926 1849,25067 1849,25447 1849,26366 1849,27043 1849,28115 1849,28254 1849,28323 1849,28377 1849,30591 1849,32784 1849,32975 1849,33988 1849,34242 1849,35329 1849,35545 1849,35948 1849,36589 1849,36840 1849,37602 1849,38247 1849,38294 1849,38733 1849,40122 1849,40476 1849,40590 1849,40614 1849,42728 1849,43213 1849,45853 1849,46165 1849,46699 1849,46851 1849,47114 1849,48051 1849,48237 1849,48659 1849,48959 1849,48964 1849,48972 1849,49373 1849,49549 1849,50542 1849,52067 1849,54504 1849,58203 1849,59658 1849,62195 1849,62487 1849,63138 1849,64182 1849,64212 1849,70166 1849,70314 1849,73237 1849,73473 1849,75862 1849,76106 1849,76938 1849,76943 1849,77694 1849,78460 1849,79849 1849,84288 1849,86515 1849,87746 1849,87841 1849,90208 1849,92934 1849,93096 1849,93599 1849,93703 1849,93706 1849,94946 1849,99003 1849,99837 1849,102361 1849,102507 1849,102798 1849,103725 1849,106382 1849,107693 1849,109508 1849,110575 1849,111292 1849,111306 1849,112567 1849,113020 1849,114531 1849,116759 1849,120982 1849,121574 1849,122580 1849,124668 1849,125625 1849,126110 1849,127403 1849,127404 1849,127421 1849,127741 1849,127807 1849,127883 1849,128822 1849,129579 1849,130193 1849,130238 1849,130239 1849,133575 1849,137033 1849,138062 1849,139171 1849,140056 1849,140729 1849,140733 1849,141763 1849,142029 1849,142275 1849,142501 1849,142854 1849,143082 1849,143337 1849,143927 1849,144179 1849,147367 1849,150073 1849,151126 1849,151464 1849,151554 1849,151867 1849,152298 1849,155094 1849,155818 1849,156379 1849,159492 1849,160814 1849,161915 1849,164950 1849,165298 1849,166949 1849,169415 1849,170811 1849,171641 1849,173351 1849,177014 1849,182414 1849,182915 1849,185148 1849,186900 1849,187064 1849,187127 1849,189548 1849,190466 1849,194609 1849,196836 1849,198780 1849,204791 1849,205157 1849,207495 1849,214971 1849,219861 1849,220239 1849,223073 1849,226390 1849,228541 1849,230978 1849,231989 1849,236819 1849,237320 1849,239576 1849,239810 1849,240663 1849,241396 1849,241661 1849,246550 1849,247820 1849,248511 1849,249102 1849,250784 1849,251427 1849,254315 1849,256521 1849,259688 1849,260142 1849,260402 1849,260478 1849,262172 1849,262406 1850,215 1851,209 1851,302 1851,687 1851,1556 1852,968 1853,34 1853,35 1853,68 1853,167 1853,217 1853,240 1853,301 1853,388 1853,390 1853,392 1853,536 1853,589 1853,657 1853,752 1853,818 1853,907 1853,968 1853,1010 1853,1085 1853,1160 1853,1210 1853,1284 1853,1298 1853,1300 1853,1326 1853,1417 1853,1531 1853,1796 1853,2557 1853,2979 1853,3193 1853,3630 1853,4411 1853,187176 1854,1400 1855,66 1855,211 1855,440 1855,467 1855,1433 1856,309 1856,310 1857,1858 1858,32 1858,1429 1858,2253 1858,6824 1859,1860 1860,34 1860,111 1860,175 1860,256 1860,283 1860,292 1860,349 1860,392 1860,433 1860,452 1860,455 1860,536 1860,623 1860,626 1860,644 1860,685 1860,693 1860,697 1860,808 1860,809 1860,838 1860,872 1860,903 1860,911 1860,918 1860,919 1860,951 1860,992 1860,1240 1860,1262 1860,1345 1860,1363 1860,1465 1860,1572 1860,1612 1860,1805 1860,1808 1860,1860 1860,2045 1860,2124 1860,2274 1860,2418 1860,2699 1860,2714 1860,3182 1860,3880 1860,4066 1860,4118 1860,4399 1860,4759 1860,4760 1860,4771 1860,5540 1860,5604 1860,6893 1860,6955 1860,7155 1860,15344 1860,15795 1860,18436 1860,20426 1860,21343 1860,21982 1860,24592 1860,25398 1860,25573 1860,26366 1860,29054 1860,30617 1860,32819 1860,33519 1860,34716 1860,35439 1860,37219 1860,37474 1860,44754 1860,45026 1860,46165 1860,46938 1860,47131 1860,47649 1860,47959 1860,48264 1860,48842 1860,49027 1860,49252 1860,50079 1860,50142 1860,50325 1860,51171 1860,51924 1860,52351 1860,54924 1860,59245 1860,60167 1860,64146 1860,64656 1860,65940 1860,68096 1860,75787 1860,84734 1860,95540 1860,96578 1860,98792 1860,104565 1860,110166 1860,114613 1860,115394 1860,115479 1860,117480 1860,117707 1860,117714 1860,117738 1860,121355 1860,123118 1860,124576 1860,125844 1860,127158 1860,130739 1860,131890 1860,132930 1860,134495 1860,134497 1860,137734 1860,138037 1860,138038 1860,138039 1860,138040 1860,138041 1860,138042 1860,138043 1860,138044 1860,138045 1860,138046 1860,138047 1860,138048 1860,138049 1860,145871 1860,145873 1860,145875 1860,145926 1860,146303 1860,146305 1860,146312 1860,147324 1860,154655 1860,154927 1860,155020 1860,155705 1860,155751 1860,157221 1860,159103 1860,160527 1860,161947 1860,163405 1860,165075 1860,171577 1860,176471 1860,176559 1860,177400 1860,177940 1860,179046 1860,180346 1860,180963 1860,181106 1860,181840 1860,182926 1860,185899 1860,192600 1860,217491 1860,220336 1860,226528 1860,233377 1860,236016 1860,237474 1860,237484 1860,238996 1860,243262 1860,246125 1860,249296 1860,259503 1860,264379 1861,54 1862,102 1862,393 1862,980 1863,1509 1864,298 1865,485 1866,1 1866,130 1866,138 1866,160 1866,163 1866,256 1866,287 1866,294 1866,299 1866,305 1866,459 1866,596 1866,634 1866,663 1866,664 1866,668 1866,690 1866,718 1866,832 1866,968 1866,1298 1866,1345 1866,1381 1866,1454 1866,1837 1866,1860 1866,1871 1866,1891 1867,225 1867,435 1867,1012 1867,1177 1867,3585 1867,7757 1868,647 1869,3 1869,1058 1869,1522 1869,1718 1870,79 1870,1619 1871,187 1871,222 1871,313 1871,379 1871,389 1871,399 1871,635 1871,657 1871,1120 1871,1467 1871,1756 1871,2159 1871,2421 1871,3234 1871,3758 1871,3820 1871,4419 1871,5406 1871,6032 1871,6739 1871,6754 1871,6793 1871,8030 1871,13422 1871,14839 1871,14840 1871,14849 1871,15303 1871,15306 1871,15325 1871,15605 1871,16340 1871,16470 1871,16569 1871,20934 1871,26056 1871,26801 1871,26804 1871,29666 1871,30366 1871,38153 1871,39537 1871,41024 1871,45224 1871,48393 1871,50357 1871,50431 1871,54618 1871,55143 1871,56323 1871,56362 1871,60619 1871,60714 1872,1711 1873,50 1873,79 1873,760 1874,182 1874,1634 1875,32 1877,20 1877,147 1877,158 1877,202 1877,203 1877,256 1877,315 1877,346 1877,435 1877,447 1877,538 1877,671 1877,766 1877,934 1877,939 1877,996 1877,1294 1877,1612 1877,1619 1877,1877 1877,1878 1877,1973 1877,1987 1877,2102 1877,2217 1877,2352 1877,2353 1877,2427 1877,3576 1877,3626 1877,4646 1877,5460 1877,6586 1877,6622 1877,6653 1877,6661 1877,9744 1877,14111 1877,14240 1877,14428 1877,15141 1877,15146 1877,15563 1877,17423 1877,17424 1877,18507 1877,18784 1877,21322 1877,21442 1877,22202 1877,25596 1877,26038 1877,28425 1877,28981 1877,29660 1877,29868 1877,30775 1877,32728 1877,37315 1877,41747 1877,44806 1877,46859 1877,49592 1877,53733 1877,63425 1877,68838 1877,83947 1877,86851 1877,93043 1877,96640 1877,101874 1877,117966 1877,117974 1877,120052 1877,128831 1877,134567 1877,135992 1877,138125 1877,150001 1877,164611 1877,168530 1877,171607 1877,175605 1877,193534 1877,194432 1877,237359 1877,247278 1877,256231 1877,256367 1877,260148 1877,261687 1878,192 1878,1623 1878,1877 1881,83 1881,217 1881,283 1881,313 1881,379 1881,389 1881,455 1881,536 1881,685 1881,1618 1881,1881 1881,2266 1881,2319 1881,2784 1881,4166 1881,4637 1881,5325 1881,8431 1881,9743 1881,14094 1881,18614 1881,19563 1881,20677 1881,28130 1881,30502 1881,30541 1881,34293 1881,41450 1881,41854 1881,41905 1881,46564 1881,61355 1881,61370 1881,70361 1881,76991 1881,79579 1881,108029 1881,110599 1881,115474 1881,119000 1881,127386 1881,127439 1881,127931 1881,153498 1881,169027 1881,176802 1881,178875 1881,180036 1881,180464 1882,94 1882,104 1882,134 1882,135 1882,137 1882,138 1882,254 1882,525 1882,609 1882,636 1882,715 1882,772 1882,1011 1882,1149 1882,1212 1882,1257 1882,1282 1882,1359 1882,1402 1882,1592 1882,1739 1882,1749 1882,1882 1882,1883 1882,1888 1882,2105 1882,2384 1882,3590 1882,4276 1882,4330 1882,4341 1882,4366 1882,5439 1882,5801 1882,5947 1882,7000 1882,7081 1882,18094 1882,19755 1882,24265 1882,26306 1882,28324 1882,30437 1882,33567 1882,36939 1882,43178 1882,65681 1882,68373 1882,74423 1882,76190 1882,76990 1882,84476 1882,102891 1882,109831 1882,122993 1882,123914 1882,127667 1882,128449 1882,128450 1882,128453 1882,128454 1882,128455 1882,128456 1882,128457 1882,137886 1882,145992 1882,157186 1882,157783 1882,161145 1882,170012 1882,171613 1882,179730 1882,179900 1882,182870 1882,188374 1882,189859 1882,190536 1882,190739 1882,191294 1882,192147 1882,192162 1882,192241 1882,192620 1882,192729 1882,192780 1882,193715 1882,193783 1882,194092 1882,194166 1882,194243 1882,194300 1882,194606 1882,196109 1882,196733 1882,197277 1882,198238 1882,198263 1882,198764 1882,200920 1882,201099 1882,201897 1882,202060 1882,202761 1882,206987 1882,217507 1882,217885 1882,218164 1882,223998 1882,224016 1882,225799 1882,227234 1882,227808 1882,232763 1882,234387 1882,239044 1882,239841 1882,239899 1882,241219 1882,241596 1882,242287 1882,244003 1882,245911 1882,246084 1882,246164 1882,247022 1882,247424 1882,247684 1882,247913 1882,248053 1882,250723 1882,251855 1882,252952 1882,257913 1882,259000 1882,260094 1882,261260 1884,1885 1886,682 1887,1888 1888,41 1888,68 1888,175 1888,240 1888,356 1888,372 1888,390 1888,446 1888,506 1888,609 1888,677 1888,685 1888,693 1888,715 1888,784 1888,879 1888,911 1888,1004 1888,1016 1888,1080 1888,1082 1888,1119 1888,1285 1888,1309 1888,1359 1888,1631 1888,1785 1888,1807 1888,1808 1888,1887 1888,1888 1888,1955 1888,2085 1888,2384 1888,2512 1888,2518 1888,2590 1888,2620 1888,2775 1888,2802 1888,3457 1888,5299 1888,5412 1888,5439 1888,5727 1888,5765 1888,8147 1888,13621 1888,13637 1888,14511 1888,15792 1888,15793 1888,17139 1888,18965 1888,22152 1888,22168 1888,22461 1888,23474 1888,23710 1888,25009 1888,26027 1888,27500 1888,29002 1888,30333 1888,33338 1888,34139 1888,37558 1888,43247 1888,44330 1888,44962 1888,45721 1888,46132 1888,47186 1888,48741 1888,49114 1888,58275 1888,60463 1888,63036 1888,70332 1888,73337 1888,78987 1888,80167 1888,82744 1888,83441 1888,84264 1888,88794 1888,89820 1888,92057 1888,96353 1888,108066 1888,109546 1888,118383 1888,118419 1888,118889 1888,118890 1888,118891 1888,119057 1888,119759 1888,121075 1888,123813 1888,123989 1888,124877 1888,125829 1888,127326 1888,127665 1888,128728 1888,130567 1888,132015 1888,134140 1888,138782 1888,138967 1888,139652 1888,142806 1888,148277 1888,151131 1888,151132 1888,151171 1888,157599 1888,164925 1888,165087 1888,175253 1888,180304 1888,182036 1888,188739 1888,189160 1888,191463 1888,194299 1888,214267 1888,214431 1888,215187 1888,216207 1888,216965 1888,221079 1888,244629 1888,245068 1888,246512 1888,253777 1888,259011 1888,259578 1888,262450 1888,263908 1890,104 1890,442 1890,1659 1891,11 1891,147 1891,178 1891,992 1891,1118 1891,1345 1891,1663 1891,1891 1891,1926 1891,1973 1891,2744 1891,3507 1891,5265 1891,6517 1891,25500 1891,26437 1891,31083 1891,31084 1891,31095 1891,32173 1891,39570 1891,42012 1891,42464 1891,43221 1891,44183 1891,50041 1891,50146 1891,52987 1891,53223 1891,54250 1891,64071 1891,72485 1891,76050 1891,79637 1891,80183 1891,87736 1891,89835 1891,96247 1891,105493 1891,105498 1891,105981 1891,158774 1891,173232 1891,183263 1891,194032 1891,199286 1891,202415 1891,207659 1891,228861 1891,233398 1891,234077 1891,238727 1891,239551 1891,246849 1892,340 1892,360 1892,1127 1892,1224 1892,1893 1892,3177 1893,10 1893,111 1893,182 1893,186 1893,192 1893,301 1893,314 1893,440 1893,452 1893,457 1893,467 1893,535 1893,599 1893,673 1893,760 1893,794 1893,843 1893,872 1893,1011 1893,1118 1893,1172 1893,1210 1893,1417 1893,1572 1893,1722 1893,1796 1893,1893 1893,1978 1893,2173 1893,2224 1893,2373 1893,2480 1893,4294 1893,6695 1893,6904 1893,9005 1893,20757 1894,1467 1895,996 1896,868 1896,1043 1896,1424 1897,1474 1898,634 1899,251 1899,364 1899,417 1899,442 1899,749 1899,1612 1900,473 1900,8149 1901,158 1901,118336 1902,1903 1904,1905 1904,2903 1904,8067 1904,27366 1904,27367 1904,28962 1904,29615 1904,30760 1904,31498 1904,32344 1904,32345 1905,222 1905,1572 1905,1796 1905,5101 1906,1907 1908,1909 1908,1910 1908,3994 1908,4933 1908,6531 1908,6680 1908,31993 1908,36427 1908,36446 1909,775 1909,1907 1911,1912 1912,68 1912,175 1912,387 1912,1911 1912,1912 1912,4605 1912,8488 1912,8519 1912,17278 1912,22071 1912,27307 1912,39953 1912,40279 1912,46704 1912,49762 1912,90401 1912,96291 1912,105041 1912,185410 1912,215522 1912,219764 1912,220715 1912,221446 1912,221475 1912,245706 1912,250625 1914,657 1914,811 1915,435 1915,766 1915,939 1915,4646 1915,188523 1916,34 1916,35 1916,217 1916,240 1916,278 1916,283 1916,389 1916,442 1916,455 1916,467 1916,536 1916,657 1916,660 1916,781 1916,1014 1916,1019 1916,1072 1916,1192 1916,1392 1916,1417 1916,1724 1916,3252 1916,4637 1916,6506 1916,7092 1916,19443 1916,115474 1916,156379 1917,143 1918,256 1918,515 1919,1858 1920,1860 1921,158 1921,994 1921,1227 1921,1229 1921,1252 1921,1253 1921,1532 1921,1922 1921,3132 1921,4114 1921,4537 1921,5156 1921,5843 1921,6580 1921,6582 1921,16050 1921,17114 1921,21944 1921,27955 1921,49744 1921,50929 1921,65106 1921,65197 1921,86416 1922,1227 1922,1229 1922,21944 1922,86416 1923,784 1923,859 1923,1474 1923,1631 1923,3148 1924,1392 1926,1927 1927,202 1927,252 1927,275 1927,446 1927,493 1927,500 1927,505 1927,516 1927,682 1927,733 1927,1175 1927,1243 1927,1266 1927,1276 1927,1568 1927,1655 1927,1926 1927,1927 1927,1973 1927,3082 1927,3507 1927,3524 1927,3539 1927,4066 1927,4814 1927,6458 1927,6824 1927,8037 1927,13659 1927,18185 1927,20400 1927,21007 1927,23008 1927,23861 1927,26181 1927,26286 1927,26303 1927,31378 1927,32778 1927,33553 1927,42525 1927,43320 1927,44859 1927,47033 1927,48944 1927,54376 1927,54945 1927,56225 1927,58020 1927,58846 1927,58849 1927,64478 1927,67324 1927,72068 1927,72439 1927,74179 1927,78879 1927,93330 1927,95496 1927,96693 1927,109444 1927,112921 1927,113371 1927,113625 1927,118311 1927,118806 1927,119252 1927,127740 1927,127887 1927,154434 1927,159460 1927,165837 1927,166348 1927,168595 1927,169334 1927,170637 1927,172651 1927,173881 1927,176792 1927,179287 1927,181569 1927,181625 1927,181632 1927,181634 1927,194459 1927,196051 1927,196242 1927,198493 1927,199326 1927,200679 1927,200680 1927,202482 1927,204003 1927,212620 1927,215276 1927,227067 1927,230925 1927,232016 1927,245319 1927,247040 1927,247146 1927,247295 1927,256610 1927,258123 1927,260307 1927,260796 1927,260802 1928,911 1929,344 1930,1858 1931,1860 1932,1858 1933,1860 1934,536 1935,1285 1936,182 1938,20 1939,104 1939,107 1939,111 1939,134 1939,137 1939,138 1939,254 1939,328 1939,557 1939,622 1939,715 1939,954 1939,968 1939,1011 1939,1179 1939,1690 1939,1939 1939,2105 1939,2206 1939,2587 1939,2727 1939,2934 1939,3247 1939,3565 1939,4024 1939,4276 1939,5472 1939,5830 1939,6023 1939,6674 1939,6894 1939,7879 1939,10318 1939,14056 1939,15470 1939,17214 1939,17217 1939,18194 1939,18549 1939,18665 1939,20781 1939,20899 1939,21608 1939,23630 1939,24739 1939,26194 1939,28705 1939,28746 1939,30373 1939,31358 1939,32643 1939,36241 1939,41508 1939,45261 1939,50399 1939,56435 1939,60095 1939,65391 1939,65864 1939,70900 1939,71025 1939,74387 1939,78772 1939,88690 1939,90799 1939,94355 1939,97324 1939,97365 1939,97441 1939,98356 1939,117741 1939,123547 1939,124850 1939,129539 1939,163183 1939,164945 1939,167537 1939,168909 1939,177069 1939,183902 1939,189590 1939,190276 1939,191858 1939,255255 1940,336 1940,422 1940,1163 1940,1803 1940,21442 1941,104 1941,136 1941,254 1941,557 1941,596 1941,685 1941,715 1941,749 1941,784 1941,943 1941,953 1941,1209 1941,1367 1941,1368 1941,1980 1941,2543 1941,2565 1941,2617 1941,3504 1941,4276 1941,4725 1941,4761 1941,5279 1941,5478 1941,6732 1941,13207 1941,13626 1941,14827 1941,16552 1941,19489 1941,20515 1941,26262 1941,26703 1941,33345 1941,33525 1941,40220 1941,42092 1941,42918 1941,54271 1941,56303 1941,56328 1942,1001 1944,87 1944,1046 1944,1143 1944,1363 1944,1836 1945,818 1945,1946 1947,1388 1947,1531 1948,292 1949,32 1949,175 1949,392 1949,808 1949,809 1949,903 1949,918 1949,997 1949,1146 1949,1240 1949,1300 1949,1454 1949,1465 1949,1663 1949,1805 1949,1949 1949,2494 1949,2548 1949,3258 1949,3630 1949,3788 1949,3880 1949,4759 1949,6045 1949,6059 1949,6711 1949,7098 1949,13137 1949,14290 1949,17894 1949,19366 1949,21982 1949,28256 1949,29095 1949,31414 1949,40697 1949,61148 1949,84133 1949,86512 1949,104537 1949,104542 1949,111131 1949,130297 1949,160892 1949,212958 1949,216781 1949,219851 1949,226835 1949,227227 1949,228597 1949,228613 1949,232250 1949,242266 1949,254443 1949,261806 1950,483 1951,264 1951,1147 1951,1968 1951,16687 1952,195 1953,178 1954,852 1954,1955 1955,10 1955,104 1955,111 1955,186 1955,192 1955,240 1955,261 1955,289 1955,290 1955,298 1955,332 1955,372 1955,390 1955,425 1955,431 1955,446 1955,452 1955,457 1955,518 1955,599 1955,611 1955,631 1955,677 1955,693 1955,694 1955,714 1955,715 1955,761 1955,784 1955,795 1955,818 1955,823 1955,838 1955,852 1955,911 1955,932 1955,1004 1955,1010 1955,1011 1955,1029 1955,1065 1955,1082 1955,1085 1955,1118 1955,1119 1955,1130 1955,1203 1955,1210 1955,1285 1955,1309 1955,1326 1955,1332 1955,1359 1955,1361 1955,1434 1955,1466 1955,1715 1955,1796 1955,1807 1955,1849 1955,1888 1955,1954 1955,1955 1955,2208 1955,2443 1955,2512 1955,2560 1955,2620 1955,2729 1955,2775 1955,2838 1955,2989 1955,2991 1955,3028 1955,3135 1955,3168 1955,3507 1955,3607 1955,3771 1955,3814 1955,3837 1955,3879 1955,4190 1955,4195 1955,4415 1955,4540 1955,4621 1955,4692 1955,5011 1955,5185 1955,5192 1955,5268 1955,5278 1955,5346 1955,5407 1955,5503 1955,5656 1955,5718 1955,5825 1955,6537 1955,6837 1955,6856 1955,7266 1955,7522 1955,7915 1955,8422 1955,8683 1955,8778 1955,12747 1955,12871 1955,13198 1955,13207 1955,13217 1955,13274 1955,13411 1955,13521 1955,13555 1955,13580 1955,13698 1955,14133 1955,14553 1955,14597 1955,14603 1955,16335 1955,16401 1955,16430 1955,16551 1955,16571 1955,17920 1955,18647 1955,18673 1955,18782 1955,19387 1955,19431 1955,19440 1955,19622 1955,20426 1955,20609 1955,21593 1955,21964 1955,22331 1955,22337 1955,23102 1955,23474 1955,23735 1955,23820 1955,24766 1955,26513 1955,26848 1955,26855 1955,26880 1955,27041 1955,28191 1955,28221 1955,29089 1955,29684 1955,29965 1955,30376 1955,31413 1955,31995 1955,32900 1955,32921 1955,33003 1955,33147 1955,33330 1955,33412 1955,33660 1955,34752 1955,35428 1955,36666 1955,36719 1955,38300 1955,38910 1955,39595 1955,40876 1955,41012 1955,41871 1955,42545 1955,42794 1955,42795 1955,43343 1955,43394 1955,43630 1955,44182 1955,44237 1955,44314 1955,44393 1955,44395 1955,44870 1955,44951 1955,45278 1955,46271 1955,46316 1955,46375 1955,46821 1955,46874 1955,47173 1955,47643 1955,48369 1955,48503 1955,48965 1955,49035 1955,49297 1955,49456 1955,50104 1955,52585 1955,53421 1955,56537 1955,56636 1955,57205 1955,58414 1955,59043 1955,60432 1955,60897 1955,61356 1955,62983 1955,63054 1955,63965 1955,64130 1955,66500 1955,66736 1955,66918 1955,71048 1955,74564 1955,74576 1955,75264 1955,76022 1955,79869 1955,82564 1955,83306 1955,83379 1955,83498 1955,85813 1955,86050 1955,86626 1955,87383 1955,87986 1955,88505 1955,91311 1955,91450 1955,94134 1955,97766 1955,98917 1955,99012 1955,101551 1955,102698 1955,103755 1955,104389 1955,105586 1955,106374 1955,106408 1955,106492 1955,107157 1955,107464 1955,110763 1955,113550 1955,114675 1955,115251 1955,116014 1955,116037 1955,117003 1955,117860 1955,121664 1955,124102 1955,125604 1955,126952 1955,127158 1955,130465 1955,133463 1955,133606 1955,136414 1955,137104 1955,141133 1955,141597 1955,141613 1955,142123 1955,142606 1955,144209 1955,145086 1955,145639 1955,148607 1955,150770 1955,158707 1955,160450 1955,161586 1955,161928 1955,163805 1955,163808 1955,163830 1955,163898 1955,164417 1955,165077 1955,166331 1955,166667 1955,169431 1955,170728 1955,170841 1955,170907 1955,171571 1955,173905 1955,174910 1955,175903 1955,176758 1955,177475 1955,177827 1955,180223 1955,182387 1955,182628 1955,183436 1955,183963 1955,188890 1955,188911 1955,189820 1955,191975 1955,192616 1955,197671 1955,214643 1955,215874 1955,216860 1955,218778 1955,219981 1955,222539 1955,222544 1955,222549 1955,222551 1955,225600 1955,229159 1955,229345 1955,234146 1955,235925 1955,241335 1955,241603 1955,252110 1955,254441 1955,256331 1955,258749 1956,1454 1957,1284 1957,1715 1958,3 1958,54 1958,140 1958,206 1958,718 1958,1033 1958,1871 1958,1959 1958,1963 1958,2434 1958,3209 1958,55849 1958,142433 1960,1172 1962,24 1962,41 1962,233 1962,289 1962,290 1962,304 1962,534 1962,636 1962,714 1962,715 1962,797 1962,1402 1962,1511 1962,1663 1962,1962 1962,2008 1962,2205 1962,2206 1962,2210 1962,2286 1962,2315 1962,2376 1962,2419 1962,2965 1962,3069 1962,3085 1962,3993 1962,4084 1962,4141 1962,4218 1962,4237 1962,9015 1962,14693 1962,15107 1962,18515 1962,18673 1962,21321 1962,26513 1962,27321 1962,28553 1962,33160 1962,33424 1962,34828 1962,34874 1962,37816 1962,39088 1962,39660 1962,39669 1962,45648 1962,53192 1962,55146 1962,55814 1962,55951 1962,56709 1962,57148 1962,58460 1962,60804 1962,61949 1962,62248 1962,63604 1962,65711 1962,69787 1962,70305 1962,71999 1962,72907 1962,74148 1962,78405 1962,78867 1962,78891 1962,82464 1962,84264 1962,88820 1962,91585 1962,94134 1962,98284 1962,102250 1962,105163 1962,110093 1962,110509 1962,110541 1962,111142 1962,116043 1962,119649 1962,127029 1962,129722 1962,131729 1962,136607 1962,137099 1962,137201 1962,142333 1962,142620 1962,143395 1962,144988 1962,145398 1962,158292 1962,158638 1962,160450 1962,162573 1962,162902 1962,178391 1962,180270 1962,184490 1962,197473 1962,201884 1962,201960 1962,207443 1962,219920 1962,219936 1962,223998 1962,226470 1962,233982 1962,246828 1962,248927 1963,57875 1964,1821 1965,1010 1966,1 1967,1707 1968,452 1968,457 1968,673 1968,794 1968,1011 1968,1130 1968,1417 1968,1572 1968,1619 1968,1634 1968,1844 1968,1968 1968,3367 1968,3582 1968,4039 1968,6695 1969,1 1969,56 1969,94 1969,146 1969,192 1969,333 1969,336 1969,779 1969,841 1969,1803 1969,1969 1969,1970 1969,1994 1969,2166 1969,2217 1969,12263 1969,13187 1969,13221 1969,14091 1969,15437 1969,16493 1969,17139 1969,18637 1969,18761 1969,19430 1969,21382 1969,23031 1969,23783 1969,25467 1969,26730 1969,28171 1969,28195 1969,28350 1969,29895 1969,36674 1969,38177 1969,41153 1969,41366 1969,46144 1969,60576 1969,62226 1969,69932 1969,82627 1969,91355 1969,117726 1969,244750 1971,781 1972,1973 1973,3 1973,20 1973,34 1973,35 1973,37 1973,68 1973,87 1973,99 1973,135 1973,138 1973,158 1973,160 1973,167 1973,192 1973,195 1973,202 1973,203 1973,207 1973,215 1973,289 1973,290 1973,326 1973,328 1973,333 1973,358 1973,379 1973,390 1973,392 1973,406 1973,425 1973,462 1973,502 1973,510 1973,518 1973,575 1973,590 1973,596 1973,736 1973,760 1973,765 1973,779 1973,788 1973,795 1973,808 1973,818 1973,849 1973,862 1973,907 1973,920 1973,934 1973,968 1973,992 1973,1010 1973,1140 1973,1147 1973,1192 1973,1201 1973,1220 1973,1222 1973,1240 1973,1241 1973,1285 1973,1298 1973,1326 1973,1345 1973,1368 1973,1402 1973,1445 1973,1479 1973,1505 1973,1551 1973,1566 1973,1590 1973,1608 1973,1635 1973,1677 1973,1786 1973,1891 1973,1927 1973,1972 1973,1973 1973,1992 1973,2037 1973,2083 1973,2178 1973,2436 1973,2443 1973,2557 1973,2726 1973,2744 1973,3260 1973,3474 1973,3507 1973,3565 1973,3944 1973,4276 1973,4354 1973,5265 1973,5961 1973,9030 1973,9457 1973,11147 1973,13151 1973,13440 1973,13451 1973,14109 1973,15344 1973,18327 1973,18344 1973,21693 1973,22045 1973,28142 1973,28291 1973,30770 1973,31419 1973,34320 1973,35402 1973,39570 1973,40441 1973,40498 1973,41230 1973,44221 1973,45853 1973,54004 1973,56150 1973,60576 1973,62457 1973,66343 1973,75091 1973,77671 1973,77717 1973,114188 1973,115474 1973,122692 1973,136165 1973,158762 1973,170626 1973,171178 1973,172555 1973,189839 1973,189842 1973,205673 1973,215276 1973,234357 1973,256409 1973,256827 1974,450 1975,740 1975,741 1976,1977 1976,1978 1978,3538 1979,1359 1980,134 1980,225 1980,1368 1981,149 1981,622 1981,1803 1982,666 1982,1983 1982,1984 1983,4 1983,5 1983,1219 1983,1702 1983,1983 1983,4388 1983,5695 1983,5820 1983,5842 1983,5861 1983,5895 1983,5979 1983,6120 1983,6142 1983,7385 1983,7388 1983,9197 1983,20320 1983,20419 1983,23860 1983,24746 1983,24854 1983,29015 1983,32340 1983,33292 1983,36507 1983,38857 1983,39538 1983,40292 1983,44207 1983,53859 1983,56112 1983,56326 1983,58922 1983,58963 1983,59898 1983,74850 1983,76235 1983,76320 1983,76869 1983,84828 1983,87830 1983,107801 1983,109097 1983,116535 1983,124952 1983,127154 1983,134425 1983,138245 1983,138757 1983,141722 1983,147086 1983,151524 1983,151533 1983,155899 1983,159955 1983,159958 1983,159967 1983,159972 1983,159979 1983,159981 1983,160069 1983,160070 1983,162018 1983,167454 1983,169377 1983,170289 1983,170615 1983,175043 1983,175619 1983,175905 1983,182213 1983,196146 1983,199055 1983,202732 1983,206955 1983,211813 1983,217267 1983,220500 1983,223372 1983,225866 1983,225889 1983,235348 1983,236211 1983,242502 1983,244450 1983,246042 1983,246225 1983,247782 1983,248048 1983,248062 1983,248981 1983,255186 1985,10 1985,106 1985,186 1985,333 1985,337 1985,446 1985,505 1985,586 1985,604 1985,663 1985,664 1985,682 1985,685 1985,812 1985,818 1985,911 1985,932 1985,937 1985,1011 1985,1027 1985,1242 1985,1281 1985,1293 1985,1370 1985,1504 1985,1848 1985,1849 1985,1985 1985,2782 1985,5630 1985,7794 1985,13506 1985,14066 1985,14100 1985,19486 1985,21528 1985,31046 1985,31198 1985,31254 1985,35084 1985,44459 1985,48053 1985,59616 1985,60576 1985,60701 1985,67918 1985,72068 1985,72439 1985,74777 1985,83905 1985,100237 1985,104268 1985,109922 1985,110546 1985,116938 1985,119418 1985,127158 1985,127740 1985,134764 1985,152984 1985,172381 1985,174800 1985,180916 1985,191414 1985,213749 1985,249720 1986,415 1986,801 1986,849 1986,852 1986,1240 1986,1326 1986,1353 1986,1411 1986,1454 1986,1805 1986,5961 1987,538 1987,1381 1987,1877 1987,40497 1988,1001 1989,314 1989,599 1989,668 1989,1172 1989,1844 1989,2373 1989,3744 1989,221334 1990,1068 1991,1298 1992,11 1992,147 1992,182 1992,186 1992,192 1992,207 1992,256 1992,301 1992,314 1992,336 1992,392 1992,397 1992,440 1992,452 1992,457 1992,505 1992,510 1992,599 1992,673 1992,676 1992,685 1992,794 1992,838 1992,843 1992,849 1992,852 1992,911 1992,929 1992,972 1992,1011 1992,1014 1992,1085 1992,1130 1992,1172 1992,1191 1992,1262 1992,1345 1992,1370 1992,1417 1992,1531 1992,1566 1992,1619 1992,1634 1992,1796 1992,1844 1992,1973 1992,2253 1992,2580 1992,3582 1992,4190 1992,6824 1992,6904 1992,9457 1992,19413 1992,20757 1992,30331 1992,75912 1992,207659 1992,215874 1993,149 1993,192 1993,333 1993,336 1993,602 1993,663 1993,664 1993,726 1993,788 1993,841 1993,1052 1993,1089 1993,1411 1993,1619 1993,1623 1993,2006 1993,2244 1993,3895 1993,5130 1993,7757 1993,22317 1994,60576 1995,222 1995,278 1995,1181 1995,1388 1995,2244 1996,34 1996,35 1996,217 1996,949 1996,2646 1996,127158 1997,217 1997,1417 1997,2671 1997,3252 1998,389 1998,772 1998,818 1998,841 1998,843 1998,1458 1998,1849 1999,784 1999,1707 2000,83 2000,356 2001,182 2002,261 2002,818 2002,843 2002,991 2002,1458 2002,1818 2002,2646 2002,3115 2002,19010 2002,67873 2002,68259 2002,82976 2002,84341 2002,91133 2002,91338 2002,111031 2002,111855 2002,119753 2002,121235 2002,126444 2003,1608 2005,2006 2006,446 2006,685 2006,1011 2006,1411 2006,2315 2006,5388 2006,5851 2006,5884 2006,7109 2006,8525 2006,13605 2006,23329 2006,23809 2006,24886 2006,24906 2006,29404 2006,58984 2006,59151 2006,64257 2006,108282 2007,390 2007,459 2007,615 2007,744 2007,783 2007,907 2007,968 2007,1010 2007,1012 2007,1160 2007,1167 2007,1300 2007,1436 2007,1479 2007,1849 2007,2191 2007,2480 2007,3422 2007,3630 2007,32784 2007,48505 2007,72764 2008,104 2008,289 2008,290 2008,328 2008,372 2008,373 2008,417 2008,534 2008,572 2008,588 2008,590 2008,599 2008,631 2008,677 2008,704 2008,714 2008,715 2008,760 2008,1212 2008,1282 2008,1346 2008,1402 2008,1462 2008,1572 2008,1631 2008,1641 2008,1962 2008,2008 2008,2069 2008,2205 2008,2206 2008,2286 2008,2965 2008,3507 2008,4520 2008,6447 2008,8279 2008,8867 2008,13506 2008,14080 2008,14582 2008,15103 2008,15520 2008,16192 2008,16210 2008,19566 2008,20869 2008,21187 2008,24546 2008,26396 2008,27088 2008,28191 2008,28877 2008,30707 2008,33424 2008,34707 2008,35614 2008,37444 2008,37485 2008,40644 2008,48709 2008,49035 2008,59194 2008,61004 2008,62248 2008,63361 2008,67210 2008,72639 2008,75754 2008,80049 2008,80387 2008,94134 2008,96712 2008,102664 2008,106331 2008,111142 2008,134620 2008,140827 2008,141836 2008,141971 2008,144988 2008,160450 2008,166287 2008,167749 2008,168587 2008,207051 2008,220939 2008,238354 2008,256953 2008,257051 2008,258382 2009,143 2010,1749 2011,298 2012,72 2012,312 2012,1052 2012,1267 2012,2605 2012,3695 2013,485 2014,1 2014,50 2014,333 2014,336 2014,733 2014,788 2014,841 2014,1192 2014,1619 2015,294 2015,431 2015,631 2016,22 2016,302 2016,622 2016,809 2016,861 2016,2017 2016,2312 2016,17309 2016,22293 2017,255 2017,819 2017,2017 2017,2563 2017,15556 2017,20779 2017,40824 2017,66301 2018,107 2018,111 2018,760 2018,1149 2019,875 2019,1276 2019,2744 2019,4411 2020,1 2021,1118 2022,336 2023,393 2023,435 2023,447 2023,726 2023,980 2023,1033 2024,1105 2025,305 2026,130 2027,233 2028,509 2028,510 2029,202 2029,269 2029,294 2029,309 2029,310 2029,389 2029,424 2029,640 2029,772 2029,818 2029,843 2029,1085 2029,1415 2029,1544 2029,1801 2029,1849 2029,2411 2029,2744 2029,7155 2030,346 2030,726 2030,1068 2030,1294 2030,1644 2030,1849 2030,1888 2030,2353 2030,13486 2030,189128 2031,143 2032,56 2032,147 2032,192 2032,422 2032,60576 2034,1175 2034,1243 2034,72439 2034,189839 2036,68 2036,186 2036,450 2036,7155 2037,1 2037,192 2037,314 2037,422 2037,457 2037,516 2037,599 2037,808 2037,1014 2037,1118 2037,1509 2037,1531 2037,1566 2037,1796 2037,1844 2037,1973 2037,6904 2037,42064 2038,1078 2038,1616 2039,364 2042,312 2042,2944 2043,818 2044,68 2045,3 2045,388 2045,510 2045,623 2045,654 2045,663 2045,664 2045,685 2045,694 2045,838 2045,911 2045,1133 2045,1345 2045,1424 2045,1566 2045,1805 2045,2045 2045,2046 2045,4752 2045,6641 2045,6960 2045,7753 2045,8177 2045,13506 2045,14494 2045,15116 2045,16192 2045,20228 2045,21328 2045,22095 2045,30115 2045,32309 2045,34416 2045,35704 2045,42871 2045,43325 2045,47006 2045,47759 2045,49452 2045,49491 2045,49978 2045,50105 2045,55945 2045,58381 2045,61212 2045,63601 2045,70702 2045,81193 2045,109561 2045,112814 2045,119320 2045,128704 2045,128956 2045,160490 2045,169817 2045,183853 2045,189834 2045,190402 2045,190435 2045,201298 2045,213886 2045,234149 2045,241142 2045,241689 2045,248442 2045,258145 2046,34 2046,35 2046,510 2046,1571 2046,2045 2046,4223 2047,182 2047,2048 2048,139116 2048,139117 2049,577 2050,2051 2050,49057 2051,87 2051,2292 2052,104 2052,215 2052,1282 2053,287 2053,953 2055,143 2056,980 2058,1 2059,399 2060,50 2060,79 2061,54 2061,83 2061,140 2061,752 2061,919 2061,1287 2061,1309 2061,1479 2061,1871 2061,2424 2062,1 2062,32 2062,50 2062,79 2062,147 2062,160 2062,392 2062,424 2062,577 2062,602 2062,644 2062,697 2062,809 2062,985 2062,1363 2062,1619 2062,1858 2062,2274 2062,2699 2062,76096 2063,720 2063,877 2063,972 2063,1010 2063,1284 2064,66 2064,3744 2065,760 2065,805 2065,1631 2066,781 2067,158 2067,406 2068,749 2069,104 2069,134 2069,240 2069,248 2069,264 2069,289 2069,290 2069,298 2069,457 2069,489 2069,631 2069,636 2069,714 2069,760 2069,794 2069,1014 2069,1016 2069,1119 2069,1282 2069,1417 2069,1631 2069,1745 2069,1955 2069,2209 2069,2373 2069,75912 2069,94134 2070,392 2070,1151 2071,147 2071,195 2072,2073 2074,392 2074,1454 2074,1572 2075,63 2075,602 2076,305 2077,106 2077,337 2078,209 2079,850 2081,985 2082,4 2082,5 2083,10 2083,86 2083,167 2083,240 2083,299 2083,301 2083,314 2083,431 2083,459 2083,468 2083,500 2083,528 2083,589 2083,599 2083,808 2083,929 2083,1014 2083,1045 2083,1085 2083,1118 2083,1167 2083,1241 2083,1284 2083,1285 2083,1298 2083,1319 2083,1436 2083,1522 2083,1544 2083,1564 2083,1627 2083,1635 2083,1715 2083,1837 2083,1849 2083,1973 2083,2083 2083,2085 2083,2095 2083,2193 2083,2372 2083,2557 2083,2588 2083,2979 2083,3207 2083,3218 2083,3774 2083,3944 2083,4271 2083,4283 2083,4291 2083,5185 2083,5301 2083,6712 2083,6930 2083,6989 2083,7011 2083,7057 2083,8386 2083,13470 2083,13480 2083,13489 2083,13657 2083,14264 2083,16484 2083,16594 2083,16667 2083,16965 2083,17327 2083,17636 2083,18249 2083,18668 2083,18724 2083,20289 2083,20628 2083,22062 2083,22116 2083,22157 2083,23069 2083,24627 2083,26078 2083,27053 2083,27095 2083,28785 2083,29760 2083,30253 2083,31419 2083,32784 2083,33282 2083,33527 2083,34174 2083,34820 2083,38994 2083,39618 2083,41854 2083,43235 2083,43346 2083,44105 2083,44480 2083,47051 2083,50423 2083,50525 2083,50567 2083,51889 2083,55028 2083,55878 2083,62160 2083,64070 2083,66515 2083,67074 2083,73342 2083,73355 2083,73570 2083,75794 2083,77678 2083,80615 2083,86558 2083,89837 2083,92859 2083,93835 2083,94745 2083,94978 2083,100305 2083,108543 2083,109258 2083,110118 2083,115249 2083,116178 2083,116543 2083,122159 2083,122735 2083,127158 2083,127187 2083,127224 2083,127227 2083,127588 2083,128293 2083,128922 2083,130099 2083,134179 2083,134871 2083,140687 2083,142569 2083,146438 2083,146751 2083,147179 2083,147548 2083,148320 2083,150859 2083,153233 2083,157410 2083,157443 2083,157563 2083,158669 2083,158862 2083,159888 2083,160668 2083,161915 2083,163719 2083,164276 2083,166385 2083,167497 2083,169231 2083,171578 2083,171580 2083,171583 2083,172678 2083,173927 2083,174669 2083,175940 2083,177014 2083,178012 2083,178543 2083,178659 2083,178670 2083,178695 2083,178897 2083,179030 2083,179629 2083,180265 2083,180982 2083,181530 2083,183722 2083,184373 2083,184814 2083,189281 2083,190527 2083,191073 2083,191572 2083,194967 2083,195555 2083,213319 2083,214197 2083,214981 2083,217998 2083,219854 2083,221176 2083,227286 2083,232753 2083,240769 2083,245848 2083,249357 2084,392 2085,203 2085,292 2085,315 2085,333 2085,358 2085,435 2085,439 2085,440 2085,447 2085,538 2085,579 2085,589 2085,710 2085,794 2085,1118 2085,1294 2085,1888 2085,2083 2085,2373 2085,2572 2085,3422 2085,3582 2085,3876 2085,4823 2085,5662 2085,6298 2085,35486 2086,4 2086,5 2086,25 2086,26 2086,47 2086,59 2086,116 2086,117 2086,171 2086,250 2086,330 2086,430 2086,743 2086,885 2086,1432 2086,1684 2086,2087 2086,2088 2086,2089 2086,2469 2086,3794 2086,5871 2086,9536 2086,9538 2086,13704 2086,21059 2086,21944 2086,54870 2086,67397 2086,71961 2086,136284 2086,136285 2089,25 2089,26 2089,59 2089,292 2089,885 2089,887 2089,1227 2089,1229 2089,1238 2089,1432 2089,1775 2089,2088 2089,2089 2089,2674 2089,2940 2089,4113 2089,4748 2089,6621 2089,17140 2089,21944 2089,47540 2089,48673 2090,209 2090,736 2090,1655 2090,1659 2091,206 2092,222 2092,657 2092,805 2092,1019 2092,1276 2092,1571 2092,2266 2092,2480 2092,6424 2093,620 2094,346 2094,435 2094,447 2094,538 2094,980 2094,1068 2094,1294 2094,1474 2094,4611 2095,136 2095,137 2095,1522 2095,2083 2095,2557 2096,202 2096,203 2096,269 2096,389 2096,640 2096,657 2096,841 2096,843 2096,1458 2096,1544 2096,1849 2096,2411 2096,6955 2097,417 2097,442 2097,1001 2097,1119 2098,920 2099,1531 2100,1392 2101,158 2102,178 2102,346 2102,435 2102,439 2102,447 2102,1033 2102,1803 2102,1849 2102,1877 2102,13486 2102,21442 2102,32784 2103,222 2104,493 2105,19 2105,30 2105,81 2105,104 2105,134 2105,135 2105,136 2105,137 2105,138 2105,248 2105,328 2105,446 2105,557 2105,636 2105,772 2105,784 2105,943 2105,997 2105,1011 2105,1078 2105,1118 2105,1212 2105,1282 2105,1293 2105,1332 2105,1368 2105,1415 2105,1844 2105,1882 2105,1939 2105,2105 2105,2205 2105,2206 2105,2384 2105,2572 2105,2638 2105,2675 2105,2804 2105,3246 2105,3247 2105,3678 2105,3794 2105,4086 2105,4208 2105,4218 2105,4222 2105,4276 2105,4919 2105,5405 2105,5694 2105,5703 2105,6152 2105,6455 2105,7178 2105,7879 2105,7938 2105,8049 2105,8180 2105,13246 2105,13928 2105,13969 2105,14150 2105,14164 2105,14177 2105,14402 2105,15459 2105,15470 2105,16235 2105,16717 2105,16966 2105,19523 2105,19643 2105,20164 2105,21101 2105,21867 2105,22268 2105,26266 2105,26729 2105,27861 2105,27862 2105,28042 2105,29572 2105,29729 2105,31093 2105,31963 2105,32522 2105,33424 2105,33491 2105,36250 2105,36618 2105,37329 2105,38410 2105,38795 2105,39302 2105,40641 2105,40742 2105,40774 2105,41507 2105,42848 2105,43134 2105,43262 2105,43918 2105,45426 2105,46766 2105,46874 2105,48188 2105,49353 2105,53404 2105,53604 2105,54288 2105,57825 2105,59596 2105,60387 2105,61101 2105,62192 2105,63521 2105,64996 2105,65864 2105,67812 2105,71770 2105,72021 2105,74547 2105,76044 2105,77793 2105,78772 2105,80080 2105,80603 2105,80760 2105,81452 2105,82875 2105,89710 2105,89715 2105,90337 2105,90829 2105,91206 2105,93110 2105,94074 2105,101440 2105,101639 2105,109339 2105,113735 2105,116041 2105,121076 2105,123899 2105,123959 2105,126030 2105,126537 2105,127602 2105,128166 2105,128906 2105,137881 2105,139464 2105,140687 2105,140798 2105,145092 2105,146487 2105,147433 2105,149683 2105,150312 2105,152040 2105,152138 2105,153336 2105,155460 2105,155667 2105,156265 2105,157213 2105,157332 2105,157803 2105,160784 2105,160971 2105,163737 2105,170237 2105,172669 2105,172676 2105,172894 2105,173214 2105,174032 2105,174313 2105,174393 2105,188225 2105,188454 2105,191219 2105,191229 2105,194245 2105,196008 2105,196067 2105,198217 2105,200595 2105,200603 2105,202092 2105,202147 2105,203406 2105,203654 2105,214180 2105,214320 2105,222464 2105,223722 2105,225292 2105,225293 2105,225549 2105,228831 2105,229709 2105,231060 2105,237818 2105,246117 2105,251033 2105,256878 2105,258878 2105,259507 2105,259510 2105,259511 2105,260164 2105,260679 2105,263323 2105,264494 2106,393 2106,406 2106,435 2106,455 2106,538 2106,788 2106,859 2106,920 2106,980 2106,1531 2106,4611 2107,726 2108,1655 2109,583 2110,577 2111,392 2111,644 2111,697 2111,1117 2112,1566 2113,63 2114,79 2114,130 2115,2116 2117,417 2118,81 2119,622 2119,1179 2119,1531 2120,336 2120,1163 2121,160 2122,1821 2122,21736 2123,1572 2124,87 2124,338 2124,392 2124,510 2124,1151 2124,1453 2124,1572 2124,1722 2124,1836 2124,1860 2125,22 2125,202 2125,203 2125,251 2125,310 2125,336 2125,467 2125,868 2125,2371 2127,167 2127,3218 2128,1983 2129,340 2129,809 2130,415 2130,996 2131,1058 2132,1 2132,79 2132,147 2132,158 2132,192 2132,206 2132,333 2132,406 2132,422 2132,602 2132,779 2132,1181 2132,1425 2132,1515 2132,2244 2132,18638 2132,68069 2132,142879 2132,240174 2133,389 2133,1072 2134,2135 2135,16503 2135,19948 2135,19949 2135,19950 2135,19951 2135,20648 2135,24465 2135,25050 2135,28294 2135,47762 2135,47763 2135,47764 2135,47765 2135,60058 2135,68086 2135,79030 2135,80346 2135,109630 2135,117363 2135,120658 2135,120672 2135,125202 2135,160907 2135,162167 2135,162169 2135,162171 2135,170304 2135,188322 2135,198641 2135,228638 2135,229329 2135,230022 2135,235644 2135,236127 2135,251627 2135,256978 2136,1858 2137,1860 2138,346 2138,1474 2138,1590 2138,1644 2138,2353 2138,6661 2139,195 2140,433 2140,758 2140,920 2140,1177 2140,1634 2140,8270 2140,182162 2141,397 2143,143 2143,1052 2143,1191 2143,3182 2143,189266 2144,850 2145,10 2145,2146 2146,2146 2147,48 2147,647 2147,1509 2147,1551 2147,1893 2147,3041 2147,49057 2148,783 2149,1425 2150,509 2150,510 2151,718 2152,202 2152,203 2152,254 2152,346 2152,439 2152,1007 2152,1612 2153,388 2153,6638 2154,493 2154,1411 2155,557 2155,1363 2156,28 2156,40 2156,137 2156,2157 2156,5627 2156,5819 2156,9342 2156,9516 2156,16709 2156,19466 2156,28474 2156,33029 2156,33160 2156,34060 2156,57910 2156,73745 2156,78972 2156,83496 2156,109499 2156,118034 2156,123175 2156,160836 2156,168165 2156,170109 2156,170483 2156,248039 2157,994 2157,2156 2157,2674 2157,16153 2158,968 2160,34 2160,399 2160,477 2160,1571 2160,5034 2160,5906 2160,5933 2160,17837 2160,19809 2160,29475 2161,195 2161,640 2162,649 2162,1132 2163,58 2163,292 2163,745 2163,1127 2163,1140 2163,1177 2163,1677 2163,3474 2163,3830 2164,68 2167,1566 2168,19 2168,71 2168,476 2168,477 2168,536 2168,1618 2168,1843 2168,2159 2168,2224 2168,2553 2168,2784 2168,4030 2168,4234 2168,5034 2168,5326 2168,6064 2168,6506 2168,7698 2168,7768 2168,13461 2168,18831 2168,19443 2168,23287 2168,34757 2168,39537 2168,52378 2168,63961 2168,66703 2168,81840 2168,85919 2168,90092 2168,90297 2168,90845 2168,91398 2168,102584 2168,117817 2168,121449 2168,138016 2168,143033 2168,155029 2168,161519 2168,171354 2168,176094 2168,179394 2168,179850 2168,184041 2168,198176 2168,201364 2168,215339 2168,215391 2168,216248 2168,230233 2169,106 2170,192 2171,167 2171,720 2171,1167 2171,1436 2171,1544 2172,2173 2173,163 2173,167 2173,192 2173,283 2173,327 2173,352 2173,397 2173,406 2173,440 2173,493 2173,631 2173,1019 2173,1085 2173,1118 2173,1140 2173,1181 2173,1191 2173,1192 2173,1204 2173,1284 2173,1370 2173,1518 2173,1531 2173,1572 2173,1796 2173,1818 2173,1825 2173,1844 2173,2172 2173,2205 2173,2206 2173,3524 2173,3528 2173,3804 2173,4165 2173,4190 2173,4377 2173,4760 2173,5061 2173,5451 2173,5702 2173,6452 2173,7124 2173,15344 2173,18298 2173,20535 2173,24779 2173,25374 2173,25491 2173,28374 2173,32752 2173,33424 2173,40644 2173,41916 2173,41995 2173,58413 2173,61231 2173,76086 2173,87844 2173,88410 2173,107919 2173,112864 2175,500 2175,760 2177,65 2177,66 2177,206 2178,259 2178,272 2178,393 2178,577 2178,788 2178,980 2178,1381 2178,1531 2178,2178 2178,4545 2179,422 2180,56 2181,48 2181,140 2181,160 2181,217 2181,264 2181,338 2181,340 2181,344 2181,360 2181,392 2181,420 2181,440 2181,467 2181,479 2181,510 2181,515 2181,647 2181,652 2181,710 2181,872 2181,1052 2181,1127 2181,1140 2181,1151 2181,1224 2181,1289 2181,1551 2181,1579 2181,1659 2181,1673 2181,1722 2181,1893 2181,1968 2181,2367 2181,4039 2182,22 2182,326 2182,752 2182,1133 2182,1151 2182,5250 2183,333 2184,289 2184,290 2184,417 2184,1085 2184,2296 2184,94134 2185,660 2186,83 2186,1983 2187,417 2188,631 2188,1119 2189,1287 2189,1289 2190,861 2190,2116 2191,500 2191,534 2191,631 2191,668 2191,875 2191,907 2191,972 2191,973 2191,1010 2191,1117 2191,1122 2191,1284 2191,1298 2191,1360 2191,1424 2191,1544 2191,1740 2191,1837 2191,1849 2191,1853 2191,2007 2191,2191 2191,3367 2191,3629 2191,4696 2191,7440 2191,9702 2191,13483 2191,13706 2191,14381 2191,16634 2191,21095 2191,24107 2191,26338 2191,26397 2191,29595 2191,30549 2191,31255 2191,31766 2191,31796 2191,36720 2191,36918 2191,45590 2191,45853 2191,46995 2191,51684 2191,54642 2191,57182 2191,59335 2191,59341 2191,74355 2191,75302 2191,80777 2191,87046 2191,96685 2191,119857 2191,142487 2191,142810 2191,143285 2191,147097 2191,147925 2191,148127 2191,148742 2191,154382 2191,176410 2191,178012 2191,186772 2191,191333 2191,192982 2191,195645 2191,213009 2191,235803 2192,615 2192,941 2192,1167 2193,167 2193,233 2193,372 2193,589 2193,714 2193,783 2193,907 2193,1001 2193,1010 2193,1085 2193,1210 2193,1241 2193,1284 2193,2083 2193,2266 2193,2372 2193,3218 2193,3422 2194,1453 2194,3538 2196,1858 2197,1860 2198,83 2198,86 2198,87 2198,178 2198,340 2198,595 2198,985 2198,1313 2198,53536 2198,88084 2198,90845 2199,586 2200,211 2201,292 2201,1238 2201,1572 2201,1653 2201,1677 2201,1722 2201,3538 2201,3830 2201,196147 2202,158 2202,209 2202,252 2202,622 2202,1433 2202,1844 2203,1707 2204,1085 2204,1432 2204,2205 2204,2206 2204,4222 2204,75912 2204,136072 2204,185877 2204,221068 2205,10 2205,104 2205,138 2205,167 2205,186 2205,289 2205,290 2205,298 2205,328 2205,397 2205,502 2205,590 2205,631 2205,632 2205,677 2205,704 2205,714 2205,715 2205,760 2205,865 2205,911 2205,1016 2205,1119 2205,1192 2205,1210 2205,1282 2205,1346 2205,1402 2205,1432 2205,1462 2205,1505 2205,1745 2205,1818 2205,1962 2205,2008 2205,2105 2205,2173 2205,2205 2205,2206 2205,2237 2205,2286 2205,2315 2205,2376 2205,2918 2205,3028 2205,3507 2205,3619 2205,3675 2205,4159 2205,4218 2205,4532 2205,4540 2205,5278 2205,5935 2205,6792 2205,7072 2205,7268 2205,7880 2205,8243 2205,8821 2205,9529 2205,13433 2205,13506 2205,14156 2205,14603 2205,14630 2205,15277 2205,15413 2205,15827 2205,16526 2205,16680 2205,16709 2205,17219 2205,19278 2205,19617 2205,19888 2205,21495 2205,22098 2205,22428 2205,25339 2205,25385 2205,26228 2205,26244 2205,27887 2205,29091 2205,32810 2205,33424 2205,37100 2205,39232 2205,40220 2205,40993 2205,43394 2205,43878 2205,44382 2205,53737 2205,55163 2205,59194 2205,60612 2205,60780 2205,62303 2205,62843 2205,63076 2205,63078 2205,63361 2205,63676 2205,64653 2205,64815 2205,65681 2205,65711 2205,70195 2205,79486 2205,79839 2205,81508 2205,84577 2205,84612 2205,84727 2205,88398 2205,90301 2205,94134 2205,94152 2205,106252 2205,112247 2205,112679 2205,118839 2205,119340 2205,119391 2205,121940 2205,122177 2205,123935 2205,123952 2205,124010 2205,125658 2205,126982 2205,127378 2205,127505 2205,128161 2205,128229 2205,131371 2205,136357 2205,138262 2205,139522 2205,139593 2205,140977 2205,141179 2205,142451 2205,142772 2205,143944 2205,144003 2205,148631 2205,155467 2205,156339 2205,156435 2205,157216 2205,163888 2205,165864 2205,170914 2205,172450 2205,176725 2205,176870 2205,177906 2205,178779 2205,180251 2205,182308 2205,182967 2205,202021 2205,207079 2205,207439 2205,221234 2205,221817 2205,221849 2205,232781 2205,236242 2205,240050 2205,240526 2207,278 2208,104 2208,134 2208,240 2208,372 2208,442 2208,714 2208,862 2208,1285 2208,1309 2208,2209 2208,2286 2208,2512 2208,2989 2208,2991 2208,9025 2208,66500 2209,636 2209,715 2209,775 2209,5286 2209,8388 2209,9739 2209,18030 2209,18819 2209,26785 2209,27513 2209,75318 2209,98959 2210,4 2210,5 2210,81 2210,104 2210,135 2210,215 2210,328 2210,704 2210,805 2210,1011 2210,1016 2210,1177 2210,1282 2210,1402 2210,1882 2210,1962 2210,2210 2210,4237 2211,182 2211,676 2211,1789 2211,2775 2212,104 2212,136 2212,850 2212,2105 2213,697 2214,135 2215,392 2216,20 2216,68 2217,46 2217,615 2217,762 2217,783 2217,968 2217,1231 2217,1293 2217,1776 2217,1782 2217,1832 2217,1877 2217,3756 2217,60576 2217,103860 2217,204124 2218,1858 2219,1860 2220,313 2221,818 2222,22 2222,861 2222,1012 2222,1143 2222,1374 2222,4252 2223,2224 2223,45437 2224,19 2224,34 2224,35 2224,56 2224,217 2224,222 2224,462 2224,634 2224,635 2224,852 2224,1118 2224,1313 2224,1618 2224,1916 2224,2085 2224,2223 2224,2224 2224,3729 2224,4611 2224,5034 2224,5090 2224,5326 2224,6831 2224,6939 2224,6949 2224,7109 2224,7480 2224,13389 2224,18345 2224,18831 2224,19508 2224,21382 2224,24274 2224,27115 2224,28130 2224,32510 2224,33336 2224,36699 2224,36951 2224,36952 2224,39561 2224,46800 2224,46834 2224,49632 2224,55065 2224,60636 2224,62286 2224,65796 2224,66550 2224,68117 2224,79722 2224,85696 2224,88448 2224,95456 2224,97292 2224,97630 2224,98373 2224,99832 2224,105813 2224,115474 2224,124926 2224,126607 2224,129246 2224,133700 2224,133807 2224,136260 2224,136279 2224,136290 2224,139750 2224,140118 2224,140140 2224,141117 2224,143449 2224,147583 2224,147603 2224,148163 2224,148445 2224,149453 2224,149457 2224,149471 2224,151039 2224,156309 2224,157319 2224,162331 2224,169212 2224,176648 2224,191401 2224,191405 2224,193400 2224,205382 2224,215352 2224,220995 2224,230908 2224,253708 2224,254302 2224,254304 2224,259098 2224,260741 2224,262324 2225,1807 2226,87 2226,344 2226,392 2226,1143 2226,1151 2226,1722 2226,1836 2227,985 2228,248 2228,289 2228,290 2228,406 2228,685 2228,818 2228,849 2228,877 2228,1011 2228,1127 2228,1151 2228,1267 2228,1309 2228,1417 2228,1522 2228,1715 2228,1893 2228,2205 2228,3367 2228,3695 2228,33424 2228,94134 2229,497 2230,338 2230,360 2230,467 2230,509 2230,515 2230,1052 2230,2051 2230,3695 2230,13538 2230,49057 2231,147 2231,184 2231,2244 2231,21826 2232,63 2233,527 2233,743 2233,994 2233,1070 2234,192 2235,22 2235,50 2235,167 2235,240 2235,301 2235,313 2235,392 2235,536 2235,818 2235,1001 2235,1210 2235,1240 2235,1417 2235,127158 2236,717 2237,4 2237,5 2237,107 2237,134 2237,136 2237,442 2237,557 2237,588 2237,590 2237,592 2237,1119 2237,1282 2237,1411 2237,1745 2237,2205 2237,2206 2237,33424 2237,88820 2237,178576 2238,1068 2239,877 2240,1639 2241,298 2242,485 2243,399 2243,1509 2244,1 2244,10 2244,24 2244,94 2244,147 2244,158 2244,175 2244,206 2244,285 2244,406 2244,422 2244,602 2244,620 2244,628 2244,779 2244,841 2244,920 2244,1181 2244,1218 2244,1247 2244,1458 2244,1464 2244,1623 2244,1825 2244,1833 2244,2132 2244,2231 2244,2244 2244,2451 2244,2552 2244,2609 2244,3895 2244,4187 2244,4627 2244,5401 2244,5592 2244,5666 2244,5725 2244,8285 2244,8867 2244,9146 2244,9320 2244,9394 2244,9487 2244,14226 2244,14622 2244,15795 2244,16891 2244,17036 2244,19578 2244,21826 2244,21828 2244,22399 2244,23783 2244,25073 2244,25348 2244,26414 2244,27495 2244,27497 2244,27499 2244,27771 2244,31356 2244,35614 2244,36436 2244,44216 2244,44225 2244,44877 2244,45225 2244,58640 2244,58856 2244,65809 2244,67380 2244,68069 2244,72439 2244,79559 2244,80266 2244,85001 2244,92444 2244,94190 2244,98928 2244,99215 2244,103786 2244,105253 2244,105256 2244,105257 2244,105727 2244,105813 2244,109160 2244,118090 2244,118336 2244,120385 2244,124889 2244,143241 2244,144524 2244,145022 2244,146029 2244,149362 2244,149534 2244,155092 2244,163965 2244,164572 2244,185918 2244,220719 2244,240174 2244,247132 2244,252689 2244,254921 2244,261074 2245,160 2245,723 2246,392 2246,1240 2246,1453 2246,1454 2246,1465 2246,1837 2247,54 2247,399 2247,660 2247,781 2247,1539 2247,2168 2247,2247 2247,2424 2247,2646 2247,2944 2247,7698 2247,76060 2247,87372 2247,122160 2247,214233 2247,220902 2247,224495 2247,227002 2247,248626 2247,263022 2248,206 2248,145240 2249,1858 2250,1860 2251,602 2251,3218 2251,4865 2251,4866 2252,167 2252,240 2252,592 2252,919 2252,1010 2252,1133 2252,1284 2252,1479 2252,1522 2252,2083 2252,2480 2252,2557 2252,2979 2253,19 2253,20 2253,34 2253,35 2253,68 2253,120 2253,126 2253,158 2253,182 2253,215 2253,240 2253,251 2253,299 2253,313 2253,315 2253,333 2253,336 2253,372 2253,392 2253,397 2253,406 2253,417 2253,435 2253,439 2253,441 2253,442 2253,455 2253,493 2253,500 2253,505 2253,509 2253,516 2253,536 2253,575 2253,586 2253,631 2253,632 2253,640 2253,660 2253,703 2253,714 2253,726 2253,795 2253,808 2253,838 2253,859 2253,911 2253,918 2253,919 2253,949 2253,972 2253,973 2253,1007 2253,1010 2253,1014 2253,1033 2253,1078 2253,1118 2253,1147 2253,1151 2253,1191 2253,1204 2253,1243 2253,1284 2253,1285 2253,1309 2253,1345 2253,1353 2253,1363 2253,1370 2253,1402 2253,1417 2253,1434 2253,1445 2253,1453 2253,1454 2253,1479 2253,1515 2253,1518 2253,1531 2253,1566 2253,1724 2253,1801 2253,1888 2253,1992 2253,2083 2253,2254 2253,2266 2253,2334 2253,2424 2253,2512 2253,2572 2253,2646 2253,2775 2253,2784 2253,3115 2253,3182 2253,4220 2253,4234 2253,4276 2253,4706 2253,4760 2253,5326 2253,5662 2253,6452 2253,6695 2253,6734 2253,7296 2253,8276 2253,9743 2253,12263 2253,18604 2253,24585 2253,25870 2253,26414 2253,28289 2253,28353 2253,30596 2253,45666 2253,48307 2253,66297 2253,70395 2253,75912 2253,76086 2253,76096 2253,78932 2253,85979 2253,95823 2253,115474 2253,135158 2253,138205 2253,189277 2253,200454 2253,207659 2254,175 2254,446 2254,602 2254,2253 2254,23783 2255,726 2255,996 2255,1068 2256,240 2257,388 2258,171 2259,264 2259,649 2259,2260 2260,10 2260,106 2260,146 2260,620 2260,663 2260,664 2260,1370 2260,1707 2260,2782 2261,1858 2262,1860 2263,301 2263,968 2263,972 2263,1782 2263,1837 2263,75912 2264,1014 2265,1509 2265,1551 2266,19 2266,222 2266,313 2266,389 2266,455 2266,457 2266,656 2266,657 2266,814 2266,1175 2266,1298 2266,1531 2266,1571 2266,1617 2266,1881 2266,2092 2266,2193 2266,2253 2266,2266 2266,2424 2266,2511 2266,2556 2266,2646 2266,3672 2266,3880 2266,4321 2266,4377 2266,5208 2266,6642 2266,6789 2266,6890 2266,6913 2266,9111 2266,13771 2266,17825 2266,17837 2266,21249 2266,21381 2266,23520 2266,24917 2266,26161 2266,28511 2266,33508 2266,34287 2266,37852 2266,45666 2266,50018 2266,50147 2266,56451 2266,56518 2266,56600 2266,57907 2266,67339 2266,68173 2266,72592 2266,79857 2266,86840 2266,93636 2266,94229 2266,96240 2266,107356 2266,107598 2266,107999 2266,109537 2266,110484 2266,110932 2266,113003 2266,117817 2266,119349 2266,126282 2266,127148 2266,142450 2266,144323 2266,158788 2266,163718 2266,168165 2266,171300 2266,177294 2266,177486 2266,179137 2266,191520 2266,198387 2266,214655 2266,243069 2266,243506 2266,246800 2266,247786 2267,195 2267,693 2268,918 2268,2605 2269,283 2269,389 2269,455 2269,657 2269,1454 2270,1227 2270,1229 2270,86416 2271,358 2272,301 2272,717 2272,1782 2273,2274 2274,87 2274,919 2274,1192 2275,312 2277,439 2278,717 2279,48 2279,130 2279,160 2279,515 2279,736 2279,827 2279,3653 2280,41 2281,2282 2283,811 2284,273 2284,274 2285,68 2285,292 2285,1402 2285,1462 2285,1849 2285,2286 2285,2620 2285,3467 2285,4220 2285,8537 2285,22071 2285,44725 2286,135 2286,215 2286,233 2286,289 2286,290 2286,304 2286,328 2286,588 2286,590 2286,592 2286,704 2286,714 2286,715 2286,1172 2286,1282 2286,1402 2286,1796 2286,1962 2286,2205 2286,2206 2286,2285 2286,2286 2286,2315 2286,3565 2286,4218 2286,4571 2286,5563 2286,9202 2286,9529 2286,13867 2286,14476 2286,19449 2286,20787 2286,21382 2286,22168 2286,23482 2286,26244 2286,32359 2286,33424 2286,43394 2286,45863 2286,58402 2286,62198 2286,65905 2286,66714 2286,67080 2286,68006 2286,74547 2286,75417 2286,81002 2286,83498 2286,87131 2286,88820 2286,92919 2286,94134 2286,108159 2286,110228 2286,143393 2286,144988 2286,147433 2286,148067 2286,160325 2286,223779 2286,245910 2287,195 2288,195 2288,336 2289,209 2289,302 2289,893 2289,2116 2290,34 2290,83 2290,222 2290,278 2290,283 2290,313 2290,385 2290,455 2290,536 2290,660 2290,781 2290,1201 2290,1419 2290,1718 2290,1881 2290,2319 2290,2421 2290,2784 2290,3252 2290,5326 2290,5591 2290,6068 2290,6506 2290,7092 2290,13980 2290,19443 2290,37088 2291,579 2291,2292 2293,932 2294,497 2295,500 2296,10 2296,298 2296,314 2296,372 2296,417 2296,534 2296,573 2296,592 2296,818 2296,862 2296,911 2296,1011 2296,1085 2296,2184 2296,2296 2296,2345 2296,2357 2296,2850 2296,4022 2296,4463 2296,4540 2296,5278 2296,6068 2296,13641 2296,13756 2296,13965 2296,21742 2296,26061 2296,26488 2296,26781 2296,28886 2296,31137 2296,34522 2296,42029 2296,42555 2296,42582 2296,49554 2296,49615 2296,49962 2296,49998 2296,70195 2296,75912 2296,80268 2296,83020 2296,87077 2296,96046 2296,101934 2296,102705 2296,108020 2296,111138 2296,118804 2296,121502 2296,127158 2296,131818 2296,135771 2296,136692 2296,139965 2296,142417 2296,142431 2296,146665 2296,148714 2296,148719 2296,156143 2296,164011 2296,166722 2296,168470 2296,177728 2296,177729 2296,178397 2296,194601 2296,224667 2296,227086 2296,232698 2296,240195 2296,243458 2296,243460 2296,244621 2296,251579 2296,264429 2297,22 2297,718 2297,1210 2298,147 2299,3 2299,30 2299,50 2299,79 2299,104 2299,134 2299,137 2299,147 2299,202 2299,203 2299,215 2299,233 2299,248 2299,252 2299,318 2299,330 2299,336 2299,337 2299,346 2299,406 2299,439 2299,442 2299,447 2299,493 2299,503 2299,516 2299,525 2299,538 2299,585 2299,586 2299,588 2299,590 2299,592 2299,609 2299,694 2299,760 2299,779 2299,788 2299,805 2299,925 2299,980 2299,994 2299,1085 2299,1133 2299,1175 2299,1220 2299,1222 2299,1247 2299,1265 2299,1266 2299,1309 2299,1326 2299,1411 2299,1425 2299,1722 2299,1782 2299,1939 2299,2205 2299,2206 2299,2210 2299,2620 2299,2701 2299,2793 2299,3085 2299,3115 2299,3148 2299,4237 2299,4355 2299,6119 2299,7270 2299,15573 2300,209 2300,302 2300,2116 2301,3 2301,510 2301,2045 2302,1019 2302,1417 2303,86 2304,10 2305,1433 2306,8 2306,273 2306,274 2306,372 2306,581 2306,647 2306,668 2306,675 2306,827 2306,1058 2306,1313 2306,3612 2307,20 2307,68 2307,192 2307,264 2307,301 2307,435 2307,516 2307,953 2307,1010 2307,1085 2307,1181 2307,1210 2307,1298 2307,1326 2307,1531 2307,7124 2307,8868 2308,397 2309,481 2310,158 2310,481 2310,668 2310,713 2310,809 2310,849 2310,900 2310,911 2310,1011 2310,1172 2310,1603 2310,2310 2310,4199 2310,6948 2310,26161 2310,46915 2310,58467 2310,62676 2310,123128 2310,168383 2310,216113 2310,222533 2310,228822 2310,247057 2310,247060 2311,2312 2312,182 2312,309 2312,310 2312,808 2312,1011 2312,1118 2312,1293 2312,1298 2312,1796 2312,1893 2312,2224 2312,4294 2312,6695 2312,15609 2313,973 2313,1117 2314,22 2314,217 2314,599 2315,107 2315,289 2315,290 2315,304 2315,328 2315,364 2315,609 2315,704 2315,714 2315,715 2315,784 2315,805 2315,1082 2315,1242 2315,1257 2315,1359 2315,1402 2315,1701 2315,1745 2315,1807 2315,2205 2315,2206 2315,2286 2315,2315 2315,2316 2315,2646 2315,2775 2315,3069 2315,3565 2315,3623 2315,3709 2315,3964 2315,4218 2315,4227 2315,4262 2315,4367 2315,4408 2315,4532 2315,4618 2315,5439 2315,13563 2315,14511 2315,14523 2315,15827 2315,16562 2315,19755 2315,22893 2315,23710 2315,24886 2315,25393 2315,25416 2315,26781 2315,29922 2315,33424 2315,34963 2315,36841 2315,37527 2315,39588 2315,49373 2315,60081 2315,63592 2315,63945 2315,66394 2315,67126 2315,68123 2315,77808 2315,79243 2315,86447 2315,90680 2315,90788 2315,90791 2315,94134 2315,95379 2315,107087 2315,114414 2315,115584 2315,115901 2315,117818 2315,122427 2315,122452 2315,136012 2315,143456 2315,144988 2315,158762 2315,158803 2315,163127 2315,167312 2315,167890 2315,167896 2315,168425 2315,186627 2315,187482 2315,204537 2315,217880 2315,218444 2315,218775 2315,218796 2315,219721 2315,234172 2315,234173 2315,240388 2317,920 2318,34 2318,35 2318,217 2318,222 2318,536 2318,2319 2318,18831 2319,10 2319,222 2319,536 2319,849 2319,1069 2319,1201 2319,1724 2319,2318 2319,2319 2319,2523 2319,3484 2319,4349 2319,5326 2319,5458 2319,5797 2319,6785 2319,13169 2319,16604 2319,16612 2319,16615 2319,16623 2319,16627 2319,16632 2319,16658 2319,18880 2319,19569 2319,19587 2319,19850 2319,21321 2319,23683 2319,24274 2319,24794 2319,26085 2319,32271 2319,32276 2319,32347 2319,33427 2319,33965 2319,34251 2319,34265 2319,34313 2319,34348 2319,34363 2319,35627 2319,37110 2319,37611 2319,39663 2319,46582 2319,50401 2319,52113 2319,60994 2319,62297 2319,62300 2319,68121 2319,68129 2319,68144 2319,89868 2319,91850 2319,91854 2319,93306 2319,98367 2319,106104 2319,110483 2320,788 2320,1388 2321,261 2322,222 2322,389 2322,455 2322,657 2322,891 2322,1019 2322,2266 2323,1740 2324,841 2325,602 2326,298 2327,485 2328,195 2329,54 2330,710 2330,67594 2331,149 2331,406 2332,136 2333,147 2333,149 2333,158 2334,58 2334,111 2334,178 2334,217 2334,314 2334,356 2334,441 2334,442 2334,457 2334,599 2334,685 2334,795 2334,838 2334,1011 2334,1298 2334,1326 2334,1411 2334,1417 2334,1449 2334,2373 2334,4771 2334,5961 2334,37414 2334,215874 2335,298 2336,160 2336,827 2336,1849 2337,485 2338,41 2338,784 2338,805 2339,1 2339,26 2339,59 2339,147 2339,149 2339,158 2339,21944 2340,346 2340,439 2340,671 2341,536 2342,991 2344,957 2344,1815 2345,1849 2345,32784 2346,41 2346,294 2346,431 2346,631 2346,1119 2346,1462 2346,8537 2347,301 2347,972 2347,1010 2347,1849 2347,2979 2348,217 2348,301 2348,309 2348,310 2348,314 2348,328 2348,483 2348,493 2348,760 2348,818 2348,868 2348,949 2348,1019 2348,1033 2348,1085 2348,1118 2348,1220 2348,1417 2348,1801 2348,3999 2348,6556 2349,304 2349,682 2349,772 2349,72439 2350,2351 2351,2351 2352,346 2352,435 2352,439 2352,671 2352,996 2352,1033 2352,1068 2352,1181 2352,1294 2352,1590 2352,1612 2352,1776 2352,1849 2352,1877 2352,2353 2352,6661 2352,13486 2353,20 2353,178 2353,315 2353,346 2353,425 2353,435 2353,538 2353,671 2353,766 2353,934 2353,992 2353,996 2353,1068 2353,1474 2353,1644 2353,1697 2353,1762 2353,1877 2353,2030 2353,2138 2353,2253 2353,2352 2353,2353 2353,2427 2353,2744 2353,3540 2353,3658 2353,3659 2353,3661 2353,3662 2353,3663 2353,3664 2353,3665 2353,3666 2353,3667 2353,5356 2353,5481 2353,5483 2353,5513 2353,5617 2353,6672 2353,6703 2353,6804 2353,6966 2353,7731 2353,7981 2353,14422 2353,14428 2353,20292 2353,21164 2353,21181 2353,21224 2353,21227 2353,21240 2353,21248 2353,21442 2353,22148 2353,23138 2353,23450 2353,23509 2353,23518 2353,23718 2353,23724 2353,23840 2353,25373 2353,26023 2353,26252 2353,26730 2353,26785 2353,26787 2353,27054 2353,28205 2353,28339 2353,28802 2353,32468 2353,33397 2353,33552 2353,38158 2353,38468 2353,40497 2353,40763 2353,41318 2353,43268 2353,44221 2353,45492 2353,46147 2353,46148 2353,46149 2353,46151 2353,46158 2353,46210 2353,46265 2353,46266 2353,46379 2353,54295 2353,54355 2353,56430 2353,56472 2353,60058 2353,60505 2353,65759 2353,67389 2353,67972 2353,68611 2353,70703 2353,75230 2353,78717 2353,78823 2353,80956 2353,83222 2353,83461 2353,93044 2353,93082 2353,93094 2353,93135 2353,93495 2353,96465 2353,96477 2353,96479 2353,96537 2353,97920 2353,98182 2353,98208 2353,99678 2353,99689 2353,99743 2353,102673 2353,106083 2353,106092 2353,106106 2353,106349 2353,107564 2353,109249 2353,109282 2353,109283 2353,109286 2353,109287 2353,109288 2353,109303 2353,110341 2353,111251 2353,112233 2353,112330 2353,112393 2353,113466 2353,114431 2353,116875 2353,116920 2353,118307 2353,120089 2353,120155 2353,121067 2353,122411 2353,122412 2353,122413 2353,122414 2353,122415 2353,122416 2353,122417 2353,122424 2353,124678 2353,127136 2353,127330 2353,129715 2353,129716 2353,132820 2353,132821 2353,132822 2353,132863 2353,132864 2353,136437 2353,139453 2353,140080 2353,148789 2353,148794 2353,148795 2353,148859 2353,150043 2353,151352 2353,153176 2353,153227 2353,153250 2353,156266 2353,156302 2353,165647 2353,165653 2353,166568 2353,166570 2353,166572 2353,166576 2353,166577 2353,166578 2353,166579 2353,166580 2353,166581 2353,166582 2353,166583 2353,166584 2353,166585 2353,166586 2353,166587 2353,166588 2353,166589 2353,166590 2353,166591 2353,166592 2353,166593 2353,166595 2353,166596 2353,166597 2353,166697 2353,166930 2353,167712 2353,170559 2353,170732 2353,170736 2353,171176 2353,173741 2353,173742 2353,173743 2353,173789 2353,173913 2353,174717 2353,175954 2353,176748 2353,177256 2353,181990 2353,182390 2353,182405 2353,183748 2353,188694 2353,188730 2353,189755 2353,191458 2353,192508 2353,192524 2353,194293 2353,212912 2353,214120 2353,214817 2353,214829 2353,215251 2353,220519 2353,221857 2353,230306 2353,230387 2353,232572 2353,232585 2353,232586 2353,232587 2353,232588 2353,232589 2353,232590 2353,232591 2353,232717 2353,238160 2354,1474 2355,497 2356,1 2356,1191 2356,6682 2357,240 2357,417 2357,2296 2358,41 2358,68 2358,135 2358,364 2358,431 2358,583 2358,604 2358,609 2358,805 2358,1068 2358,1635 2358,2006 2358,2315 2358,2572 2358,2775 2358,3135 2358,4220 2358,66297 2359,200 2360,1143 2361,287 2361,657 2361,809 2362,577 2362,1105 2362,1429 2363,206 2363,217 2363,571 2363,827 2364,827 2365,1 2365,50 2365,106 2365,147 2365,149 2365,158 2365,192 2365,406 2365,422 2365,585 2365,622 2365,1181 2365,1425 2366,2367 2367,685 2367,872 2367,911 2367,1572 2367,2367 2367,4039 2367,27057 2368,8 2369,1782 2370,2371 2371,22 2371,65 2371,79 2371,147 2371,158 2371,195 2371,202 2371,203 2371,217 2371,252 2371,278 2371,301 2371,305 2371,337 2371,349 2371,388 2371,392 2371,406 2371,433 2371,434 2371,525 2371,571 2371,622 2371,765 2371,814 2371,818 2371,915 2371,939 2371,950 2371,1033 2371,1181 2371,1246 2371,1326 2371,1370 2371,1381 2371,1401 2371,1454 2371,1463 2371,1464 2371,1517 2371,1521 2371,1726 2371,1782 2371,1794 2371,1837 2371,1968 2371,2094 2371,2106 2371,2125 2371,2152 2371,2348 2371,2371 2371,2400 2371,2470 2371,2840 2371,2880 2371,3449 2371,3609 2371,3718 2371,3745 2371,3866 2371,3973 2371,4159 2371,4164 2371,4455 2371,4565 2371,4702 2371,5061 2371,5178 2371,5353 2371,5361 2371,5495 2371,5563 2371,5583 2371,5625 2371,5631 2371,5670 2371,5696 2371,6761 2371,7076 2371,7132 2371,7242 2371,7265 2371,7344 2371,7897 2371,7983 2371,8100 2371,8128 2371,8157 2371,8190 2371,8243 2371,8411 2371,8606 2371,9527 2371,9738 2371,9768 2371,13130 2371,13260 2371,13270 2371,13274 2371,13336 2371,13430 2371,13464 2371,13519 2371,13524 2371,13771 2371,14064 2371,14158 2371,14429 2371,14623 2371,14632 2371,14680 2371,14830 2371,15109 2371,15240 2371,15566 2371,15636 2371,15693 2371,15770 2371,17115 2371,18102 2371,18110 2371,18172 2371,18200 2371,18201 2371,18202 2371,18203 2371,18209 2371,18213 2371,18214 2371,18229 2371,18235 2371,18236 2371,18237 2371,18238 2371,18239 2371,18240 2371,18246 2371,18248 2371,18249 2371,18252 2371,18258 2371,18259 2371,18260 2371,18261 2371,18263 2371,18265 2371,18266 2371,18268 2371,18270 2371,18272 2371,18274 2371,18275 2371,18277 2371,18278 2371,18289 2371,18292 2371,18295 2371,18310 2371,18311 2371,18312 2371,18317 2371,18321 2371,18322 2371,18329 2371,18331 2371,18333 2371,18334 2371,18335 2371,18350 2371,18354 2371,18357 2371,18360 2371,18364 2371,18366 2371,18368 2371,18372 2371,18374 2371,18377 2371,18382 2371,18384 2371,18387 2371,18388 2371,18389 2371,18390 2371,18392 2371,18396 2371,18397 2371,18399 2371,18400 2371,18404 2371,18405 2371,18406 2371,18411 2371,18418 2371,18419 2371,18423 2371,18430 2371,18436 2371,18438 2371,19457 2371,20419 2371,20737 2371,21322 2371,21411 2371,21547 2371,21563 2371,22015 2371,22221 2371,22277 2371,22341 2371,22543 2371,23212 2371,23337 2371,23465 2371,23616 2371,23633 2371,24150 2371,25395 2371,25575 2371,25662 2371,26905 2371,28266 2371,28317 2371,28962 2371,28968 2371,29092 2371,29102 2371,29334 2371,29849 2371,29889 2371,30459 2371,30514 2371,31343 2371,32820 2371,33519 2371,33991 2371,34055 2371,34137 2371,35661 2371,35672 2371,35720 2371,36439 2371,36458 2371,36468 2371,36563 2371,36643 2371,36655 2371,36671 2371,36729 2371,37441 2371,38861 2371,38870 2371,38950 2371,39173 2371,39552 2371,42803 2371,44158 2371,48047 2371,48049 2371,48057 2371,48444 2371,48506 2371,49001 2371,49342 2371,52292 2371,52560 2371,53472 2371,54234 2371,54958 2371,55148 2371,58893 2371,60356 2371,61211 2371,63184 2371,65652 2371,66548 2371,66617 2371,66664 2371,67267 2371,67931 2371,68150 2371,68627 2371,70236 2371,73281 2371,73958 2371,74152 2371,76095 2371,76803 2371,76870 2371,76958 2371,77550 2371,77562 2371,78470 2371,79359 2371,79630 2371,82921 2371,90030 2371,91976 2371,93721 2371,93792 2371,98923 2371,103337 2371,103348 2371,103357 2371,103361 2371,103762 2371,110151 2371,110713 2371,110741 2371,110921 2371,111192 2371,111194 2371,111195 2371,111199 2371,111201 2371,111203 2371,111207 2371,111981 2371,114641 2371,116088 2371,116189 2371,116196 2371,116895 2371,117974 2371,118010 2371,118092 2371,119666 2371,119698 2371,119906 2371,122911 2371,129099 2371,129933 2371,130890 2371,130993 2371,131875 2371,132186 2371,133589 2371,133729 2371,134236 2371,134252 2371,134394 2371,134487 2371,134906 2371,136272 2371,137017 2371,137018 2371,137019 2371,137266 2371,137267 2371,137268 2371,137269 2371,137270 2371,137271 2371,137280 2371,137281 2371,137282 2371,137283 2371,137284 2371,137285 2371,137286 2371,137287 2371,137288 2371,137289 2371,137290 2371,137291 2371,137292 2371,137293 2371,137294 2371,137295 2371,137296 2371,137297 2371,137298 2371,137299 2371,137300 2371,137301 2371,137302 2371,137303 2371,137304 2371,137305 2371,137306 2371,137307 2371,137308 2371,137309 2371,137310 2371,137311 2371,137312 2371,137313 2371,137314 2371,137315 2371,137316 2371,137317 2371,137318 2371,137319 2371,137320 2371,137321 2371,137322 2371,137323 2371,137324 2371,137325 2371,137326 2371,137327 2371,137328 2371,137330 2371,137331 2371,137332 2371,137333 2371,137334 2371,137335 2371,137336 2371,137337 2371,137338 2371,137339 2371,137340 2371,137341 2371,137342 2371,137343 2371,137344 2371,137345 2371,137346 2371,137347 2371,137348 2371,137349 2371,137350 2371,137351 2371,137352 2371,137353 2371,137354 2371,137355 2371,137356 2371,137357 2371,137358 2371,137359 2371,137360 2371,137361 2371,137362 2371,137363 2371,137364 2371,137365 2371,137366 2371,137367 2371,137368 2371,137369 2371,137370 2371,137371 2371,137372 2371,137373 2371,137374 2371,137375 2371,137376 2371,137377 2371,137378 2371,137379 2371,137380 2371,137381 2371,137382 2371,137383 2371,137384 2371,137385 2371,137386 2371,137387 2371,137388 2371,137389 2371,137390 2371,137391 2371,137392 2371,137393 2371,137394 2371,137395 2371,137396 2371,137397 2371,137398 2371,137399 2371,137400 2371,137401 2371,137402 2371,137403 2371,137404 2371,137405 2371,137406 2371,137407 2371,137408 2371,137409 2371,137410 2371,137411 2371,137412 2371,137413 2371,137414 2371,137415 2371,137416 2371,137417 2371,137418 2371,137419 2371,137420 2371,137421 2371,137422 2371,137423 2371,137424 2371,137425 2371,137426 2371,137427 2371,137428 2371,137429 2371,137430 2371,137431 2371,137432 2371,137433 2371,137434 2371,137435 2371,137436 2371,137437 2371,137438 2371,137439 2371,137440 2371,137441 2371,137442 2371,137443 2371,137444 2371,137445 2371,137446 2371,137447 2371,137448 2371,137449 2371,137450 2371,137451 2371,137452 2371,137453 2371,137454 2371,137455 2371,137456 2371,137457 2371,137458 2371,137459 2371,137460 2371,137461 2371,137462 2371,137463 2371,137464 2371,137465 2371,137466 2371,137467 2371,137468 2371,137469 2371,137470 2371,137471 2371,137472 2371,137473 2371,137474 2371,137475 2371,137476 2371,137477 2371,137478 2371,137479 2371,137480 2371,137481 2371,137482 2371,137483 2371,137484 2371,137485 2371,137486 2371,137487 2371,137488 2371,137489 2371,137490 2371,137491 2371,137492 2371,137493 2371,137494 2371,137495 2371,137496 2371,137497 2371,137498 2371,137500 2371,137501 2371,137502 2371,137503 2371,137504 2371,137505 2371,137506 2371,137507 2371,137508 2371,137509 2371,137510 2371,137511 2371,137512 2371,137513 2371,137514 2371,137515 2371,137516 2371,137517 2371,137518 2371,137519 2371,137520 2371,137521 2371,137522 2371,137523 2371,137524 2371,137525 2371,137526 2371,137527 2371,137528 2371,137529 2371,137530 2371,137531 2371,137532 2371,137533 2371,137534 2371,137535 2371,137536 2371,137537 2371,137538 2371,137539 2371,137541 2371,137542 2371,137543 2371,137544 2371,137545 2371,137546 2371,137547 2371,137548 2371,137549 2371,137550 2371,137551 2371,137552 2371,137553 2371,137554 2371,137555 2371,137556 2371,137557 2371,137558 2371,137559 2371,137560 2371,137561 2371,137562 2371,137563 2371,137564 2371,137565 2371,137566 2371,137567 2371,137568 2371,137569 2371,137570 2371,137571 2371,137572 2371,137573 2371,137574 2371,137575 2371,137576 2371,137577 2371,137578 2371,137579 2371,137580 2371,137581 2371,137582 2371,137583 2371,137584 2371,137585 2371,137586 2371,137587 2371,137588 2371,137590 2371,137591 2371,137592 2371,137593 2371,137594 2371,137595 2371,137596 2371,137597 2371,137598 2371,137599 2371,137600 2371,137601 2371,137602 2371,137603 2371,137604 2371,137605 2371,137606 2371,137607 2371,137608 2371,137609 2371,137610 2371,137611 2371,137612 2371,137613 2371,137614 2371,137615 2371,137616 2371,137617 2371,137618 2371,137619 2371,137620 2371,137621 2371,137622 2371,137623 2371,137624 2371,137625 2371,137626 2371,137627 2371,137628 2371,137629 2371,137630 2371,137631 2371,137632 2371,137633 2371,137634 2371,137635 2371,137636 2371,137637 2371,137638 2371,137639 2371,137640 2371,137641 2371,137642 2371,137643 2371,137644 2371,137645 2371,137646 2371,137647 2371,137648 2371,137649 2371,137650 2371,137651 2371,137652 2371,137653 2371,137654 2371,137655 2371,137656 2371,137657 2371,137658 2371,137659 2371,137660 2371,137661 2371,137662 2371,137663 2371,137664 2371,137665 2371,137666 2371,137667 2371,137668 2371,137669 2371,137670 2371,137671 2371,137672 2371,137673 2371,137674 2371,137675 2371,137676 2371,137677 2371,137678 2371,137679 2371,137680 2371,137681 2371,137682 2371,137683 2371,137684 2371,137685 2371,137686 2371,137687 2371,137688 2371,137689 2371,137690 2371,137691 2371,137692 2371,137693 2371,137694 2371,137695 2371,137696 2371,137697 2371,137698 2371,137699 2371,137700 2371,137701 2371,137702 2371,137703 2371,137704 2371,137705 2371,137706 2371,137707 2371,137708 2371,137709 2371,137710 2371,137711 2371,137712 2371,137713 2371,137714 2371,137715 2371,137716 2371,137717 2371,137718 2371,137719 2371,137720 2371,137721 2371,137722 2371,137723 2371,137724 2371,137725 2371,137726 2371,137727 2371,137728 2371,137729 2371,137730 2371,137731 2371,137732 2371,138303 2371,148802 2371,148970 2371,152690 2371,167760 2371,168942 2371,173829 2371,207225 2372,167 2372,256 2372,299 2372,301 2372,349 2372,356 2372,783 2372,852 2372,877 2372,937 2372,1241 2372,1284 2372,1431 2372,1544 2372,2083 2372,2193 2372,2372 2372,2663 2372,3218 2372,3848 2372,8032 2372,9340 2372,13804 2372,14095 2372,16505 2372,17116 2372,17389 2372,17877 2372,17986 2372,23351 2372,25662 2372,31231 2372,31741 2372,31785 2372,43341 2372,46805 2372,47125 2372,51252 2372,57208 2372,68063 2372,82843 2372,98315 2372,128516 2372,130238 2372,136084 2372,148742 2372,163898 2372,168657 2372,180609 2372,221176 2372,236049 2372,236108 2372,257630 2373,46 2373,68 2373,140 2373,207 2373,292 2373,314 2373,333 2373,336 2373,356 2373,360 2373,388 2373,406 2373,408 2373,433 2373,442 2373,455 2373,457 2373,509 2373,563 2373,579 2373,599 2373,626 2373,649 2373,658 2373,673 2373,676 2373,690 2373,694 2373,697 2373,736 2373,794 2373,801 2373,818 2373,838 2373,841 2373,849 2373,900 2373,911 2373,918 2373,972 2373,1010 2373,1011 2373,1014 2373,1087 2373,1089 2373,1113 2373,1130 2373,1147 2373,1151 2373,1172 2373,1204 2373,1240 2373,1243 2373,1284 2373,1293 2373,1368 2373,1402 2373,1445 2373,1449 2373,1453 2373,1454 2373,1522 2373,1572 2373,1653 2373,1655 2373,1724 2373,1796 2373,1844 2373,1893 2373,1989 2373,2069 2373,2085 2373,2334 2373,2373 2373,2775 2373,2979 2373,3474 2373,3804 2373,4190 2373,4428 2373,4514 2373,5686 2373,6999 2373,7272 2373,8127 2373,8128 2373,8131 2373,8425 2373,8426 2373,9457 2373,13538 2373,14652 2373,15587 2373,16985 2373,18140 2373,19589 2373,20369 2373,21442 2373,22015 2373,24703 2373,24707 2373,26905 2373,28284 2373,34074 2373,38140 2373,43220 2373,44586 2373,44859 2373,50467 2373,53420 2373,55479 2373,61089 2373,75992 2373,77000 2373,77743 2373,94958 2373,101898 2373,109278 2373,115474 2373,116517 2373,118336 2373,121794 2373,121878 2373,122604 2373,122607 2373,137992 2373,139647 2373,140688 2373,158959 2373,161512 2373,170623 2373,170629 2373,170649 2373,170655 2373,170665 2373,170668 2373,207659 2373,223947 2373,228852 2373,243432 2373,243479 2373,243877 2373,247671 2373,249139 2373,261871 2374,50 2374,79 2374,99 2374,147 2374,192 2374,206 2374,285 2374,306 2374,307 2374,333 2374,682 2374,779 2374,1181 2374,1425 2374,1512 2374,23783 2374,30331 2374,68069 2374,72439 2375,1849 2377,2051 2378,2379 2379,111 2379,227 2379,502 2379,693 2379,1011 2379,1238 2379,2379 2379,7519 2379,8327 2379,8390 2379,8412 2379,8758 2379,29524 2379,65971 2379,175162 2379,175623 2379,176932 2379,198490 2379,238779 2379,248912 2380,536 2381,135 2383,309 2383,310 2383,760 2383,805 2383,1631 2384,104 2384,609 2384,1807 2384,1882 2384,1888 2384,2105 2384,2146 2384,4220 2385,1639 2387,272 2388,54 2389,2390 2389,3193 2389,9267 2389,21718 2389,45168 2389,69724 2389,99985 2389,103129 2389,109005 2391,247 2392,151 2393,850 2394,149 2394,158 2394,406 2394,779 2395,107 2395,1052 2395,1177 2396,1782 2397,801 2397,991 2398,298 2399,485 2400,147 2400,149 2400,158 2400,182 2400,202 2400,203 2400,217 2400,252 2400,269 2400,314 2400,318 2400,337 2400,406 2400,439 2400,493 2400,516 2400,599 2400,663 2400,664 2400,673 2400,832 2400,868 2400,872 2400,920 2400,1001 2400,1033 2400,1181 2400,1243 2400,1370 2400,1531 2400,1782 2400,1796 2400,1801 2400,2178 2400,4545 2400,41170 2400,118336 2401,2402 2401,3861 2401,7382 2401,50373 2401,117061 2403,66 2403,467 2404,980 2404,1070 2404,1400 2405,1240 2406,1240 2407,1370 2408,104 2408,332 2408,483 2408,760 2408,1119 2408,1635 2408,3328 2408,6556 2408,27041 2410,2411 2410,6837 2411,240 2411,446 2411,638 2411,668 2411,1285 2411,2410 2411,2411 2411,2512 2411,3574 2411,4190 2411,6552 2411,9379 2411,15964 2411,21458 2411,21841 2411,25055 2411,26041 2411,26480 2411,28305 2411,44962 2411,58413 2411,76704 2411,76971 2411,82217 2411,121373 2411,153632 2411,186632 2411,200741 2411,214687 2412,247 2413,417 2414,65 2414,217 2414,314 2414,467 2414,868 2415,358 2415,2116 2415,2416 2415,2417 2418,30 2418,72 2418,217 2418,222 2418,267 2418,278 2418,285 2418,328 2418,349 2418,420 2418,439 2418,440 2418,509 2418,510 2418,622 2418,703 2418,779 2418,794 2418,808 2418,809 2418,1179 2418,1415 2418,1417 2418,1466 2418,1590 2418,1836 2418,2116 2418,2697 2418,5469 2418,19010 2418,21442 2418,22293 2418,31207 2418,32751 2418,141912 2419,134 2419,200 2419,636 2419,704 2419,714 2419,1402 2419,1511 2419,1962 2419,2205 2419,2206 2419,3069 2419,4571 2419,33424 2419,88820 2420,34 2420,35 2421,19 2421,54 2421,83 2421,187 2421,222 2421,283 2421,313 2421,379 2421,385 2421,389 2421,399 2421,446 2421,455 2421,657 2421,1019 2421,1274 2421,1310 2421,1467 2421,1571 2421,1843 2421,1871 2421,2159 2421,2224 2421,2266 2421,2290 2421,2421 2421,2424 2421,2461 2421,2646 2421,2944 2421,3507 2421,3643 2421,3646 2421,3758 2421,4127 2421,4166 2421,4234 2421,4740 2421,5034 2421,5173 2421,5178 2421,5307 2421,5326 2421,6506 2421,6789 2421,7087 2421,8140 2421,13137 2421,13556 2421,13661 2421,13868 2421,14447 2421,15694 2421,15700 2421,17273 2421,18808 2421,18914 2421,18969 2421,19130 2421,19321 2421,19349 2421,25670 2421,26094 2421,26812 2421,28671 2421,30502 2421,33287 2421,37088 2421,37762 2421,37774 2421,38893 2421,39444 2421,42032 2421,42121 2421,43216 2421,46165 2421,48960 2421,50384 2421,53789 2421,54631 2421,55265 2421,57354 2421,58488 2421,62270 2421,62496 2421,62516 2421,64155 2421,65929 2421,65975 2421,66703 2421,67153 2421,67533 2421,68198 2421,68245 2421,68716 2421,68872 2421,68920 2421,68926 2421,71620 2421,74679 2421,75045 2421,75426 2421,76077 2421,76125 2421,77111 2421,79313 2421,80460 2421,80621 2421,81077 2421,81273 2421,81993 2421,82818 2421,82834 2421,82841 2421,83340 2421,83553 2421,83579 2421,83607 2421,83745 2421,84042 2421,84046 2421,84047 2421,84049 2421,84115 2421,88667 2421,90432 2421,93271 2421,93279 2421,93636 2421,94979 2421,97599 2421,98381 2421,115474 2421,119068 2421,119624 2421,123077 2421,123916 2421,126618 2421,129608 2421,131216 2421,133464 2421,140055 2421,140832 2421,141321 2421,143725 2421,145991 2421,151358 2421,153310 2421,154792 2421,156424 2421,156488 2421,164413 2421,167058 2421,170536 2421,171794 2421,173777 2421,177294 2421,178545 2421,189465 2421,194666 2421,195208 2421,212423 2421,212698 2421,213266 2421,214235 2421,217887 2421,217968 2421,218008 2421,218845 2421,219843 2421,220641 2421,220648 2421,220655 2421,222100 2421,223684 2421,223689 2421,224777 2421,227384 2421,228358 2421,228371 2421,228429 2421,228434 2421,228557 2421,231169 2421,232178 2421,232186 2421,232245 2421,232263 2421,232659 2421,232852 2421,233336 2421,236686 2421,236709 2421,236714 2421,236740 2421,236790 2421,243327 2421,243506 2421,247239 2421,247249 2421,247458 2421,247464 2421,247484 2421,247816 2421,249875 2421,251394 2421,253360 2421,255508 2421,256961 2421,259697 2421,260861 2421,261897 2422,77 2423,1539 2424,19 2424,54 2424,135 2424,187 2424,222 2424,278 2424,283 2424,313 2424,379 2424,385 2424,389 2424,455 2424,660 2424,685 2424,781 2424,784 2424,911 2424,1019 2424,1539 2424,1571 2424,1618 2424,1843 2424,2159 2424,2247 2424,2253 2424,2266 2424,2421 2424,2424 2424,2553 2424,2633 2424,2646 2424,2779 2424,4799 2424,5232 2424,5306 2424,5326 2424,6506 2424,6789 2424,6828 2424,7075 2424,7092 2424,7767 2424,7768 2424,9788 2424,13276 2424,15694 2424,16412 2424,17346 2424,17810 2424,17811 2424,19349 2424,26058 2424,37088 2424,56378 2424,56395 2424,70920 2424,79655 2424,79966 2424,90076 2424,95490 2424,96383 2424,98164 2424,98890 2424,104980 2424,109391 2424,109967 2424,115474 2424,118295 2424,122636 2424,125482 2424,128319 2424,130275 2424,131224 2424,131497 2424,140055 2424,147408 2424,154330 2424,164883 2424,167340 2424,190108 2424,213089 2424,225319 2424,232546 2424,234354 2424,243506 2424,249239 2424,261858 2425,957 2425,1815 2426,417 2427,10 2427,202 2427,251 2427,272 2427,346 2427,439 2427,447 2427,671 2427,693 2427,934 2427,996 2427,1033 2427,1294 2427,1877 2427,2353 2427,21442 2427,33298 2427,40497 2428,192 2429,1257 2430,68 2430,1400 2431,50 2432,304 2433,2434 2435,2436 2436,87 2436,111 2436,292 2436,356 2436,441 2436,442 2436,673 2436,801 2436,852 2436,911 2436,1235 2436,1276 2436,1572 2436,1653 2436,1738 2436,1844 2436,1848 2436,1973 2436,2436 2436,3474 2436,4037 2436,4039 2436,4066 2436,4771 2436,5185 2436,6415 2436,6581 2436,6880 2436,13444 2436,18444 2436,18574 2436,19635 2436,20426 2436,23634 2436,23793 2436,26051 2436,26232 2436,27030 2436,31784 2436,32819 2436,33977 2436,34111 2436,34982 2436,36821 2436,37222 2436,38329 2436,44349 2436,45523 2436,45892 2436,46028 2436,48328 2436,48417 2436,54485 2436,58953 2436,68002 2436,80477 2436,93621 2436,97336 2436,97383 2436,97738 2436,99085 2436,99775 2436,101954 2436,106831 2436,106892 2436,107077 2436,112528 2436,118485 2436,118975 2436,119011 2436,119156 2436,119514 2436,122017 2436,130778 2436,134095 2436,135981 2436,145645 2436,146353 2436,155064 2436,168890 2436,170969 2436,171821 2436,175023 2436,200424 2436,204007 2436,213187 2436,214317 2436,215225 2436,244555 2437,557 2438,26 2438,59 2438,147 2438,149 2438,158 2438,440 2438,467 2438,868 2438,1796 2438,3804 2438,6695 2438,21944 2439,1711 2440,707 2441,536 2442,2443 2443,104 2443,166388 2443,166465 2445,66 2446,206 2446,221305 2447,900 2448,875 2449,175 2450,364 2450,1673 2451,107 2451,147 2451,206 2451,417 2451,628 2451,657 2451,994 2451,1458 2451,2244 2451,2775 2451,21826 2451,89035 2451,98192 2451,240174 2452,302 2452,849 2452,862 2452,1011 2453,215 2454,227 2455,493 2456,184 2457,356 2458,389 2459,393 2459,788 2459,859 2459,1531 2460,56 2460,63 2460,336 2460,360 2460,390 2460,485 2460,631 2460,673 2460,676 2460,685 2460,733 2460,838 2460,843 2460,849 2460,875 2460,900 2460,911 2460,918 2460,972 2460,1001 2460,1014 2460,1089 2460,1096 2460,1113 2460,1116 2460,1240 2460,1402 2460,1566 2460,1607 2460,1623 2460,1653 2460,1801 2460,1844 2460,1888 2460,2244 2460,2460 2460,2580 2460,2812 2460,3507 2460,3509 2460,3513 2460,3595 2460,4190 2460,4760 2460,6068 2460,6119 2460,8055 2460,9437 2460,16201 2460,18119 2460,21442 2460,22363 2460,26041 2460,28141 2460,28306 2460,52405 2460,56567 2460,80057 2460,87224 2460,95073 2460,103747 2460,117795 2460,117808 2460,118164 2460,118809 2460,128003 2460,130144 2460,131102 2460,158288 2460,169381 2460,172224 2460,172612 2460,191403 2460,193039 2460,199199 2460,230425 2460,230426 2460,231937 2460,245889 2460,245890 2460,248615 2460,254171 2461,2421 2462,25 2462,26 2462,59 2462,60 2462,114 2462,115 2462,118 2462,885 2462,887 2462,9539 2462,21944 2463,557 2463,954 2463,1939 2464,379 2464,535 2464,1345 2464,1659 2464,2496 2465,32 2466,143 2467,65 2468,47 2468,2469 2470,571 2470,832 2470,934 2470,5250 2472,192 2472,1619 2472,1623 2472,17166 2472,21938 2473,1453 2473,1572 2473,1837 2474,178 2475,809 2475,832 2475,19010 2475,22293 2476,143 2477,907 2478,415 2479,167 2479,301 2479,1133 2479,1284 2479,1479 2479,1522 2479,2480 2479,2557 2479,2979 2479,3507 2480,167 2480,299 2480,366 2480,459 2480,808 2480,818 2480,1241 2480,1479 2480,1575 2480,1849 2480,2252 2480,2479 2480,2557 2480,2840 2480,4286 2480,4462 2480,5255 2480,13506 2480,13593 2480,14358 2480,15277 2480,20575 2480,26876 2480,30502 2480,34253 2480,36589 2480,46631 2480,52975 2480,55898 2480,67111 2480,67555 2480,72039 2480,74498 2480,76973 2480,80060 2480,80562 2480,89754 2480,93651 2480,93736 2480,93754 2480,96685 2480,96855 2480,112362 2480,112432 2480,127158 2480,128392 2480,128761 2480,130267 2480,131969 2480,133471 2480,139984 2480,144231 2480,145728 2480,153861 2480,171271 2480,175403 2480,176816 2480,185959 2480,220597 2480,225421 2480,227349 2480,231014 2480,235904 2480,236914 2480,236918 2480,236968 2480,237326 2480,246929 2480,256924 2480,261790 2480,264430 2481,264 2481,1289 2482,422 2483,56 2484,160 2486,887 2487,206 2488,1313 2489,493 2490,136 2490,137 2490,1381 2491,143 2491,1052 2492,2493 2494,392 2494,697 2494,808 2494,1240 2494,1465 2494,1949 2495,649 2497,2493 2498,79 2499,2334 2500,2501 2500,56240 2500,58220 2500,68069 2500,79026 2500,94562 2500,98185 2500,98407 2500,98620 2502,1370 2503,72 2503,83 2503,119 2503,134 2503,278 2503,285 2503,347 2503,364 2503,372 2503,389 2503,417 2503,442 2503,455 2503,525 2503,626 2503,795 2503,805 2503,907 2503,972 2503,1019 2503,1085 2503,1274 2503,1298 2503,1309 2503,1363 2503,1465 2503,1467 2503,1718 2503,1756 2503,1801 2503,1881 2503,2266 2503,2286 2503,2434 2503,2553 2503,2590 2503,2646 2503,2779 2503,2784 2503,3507 2503,4172 2503,4903 2503,13575 2503,141912 2504,527 2505,2506 2507,83 2507,222 2507,385 2507,389 2507,455 2507,536 2507,781 2507,1467 2507,5906 2507,7698 2507,19443 2508,312 2508,875 2509,518 2509,873 2509,874 2509,968 2509,1210 2509,1231 2509,1300 2509,1326 2509,1411 2509,2006 2509,2784 2510,1203 2511,37 2511,87 2511,120 2511,126 2511,195 2511,207 2511,240 2511,299 2511,346 2511,439 2511,442 2511,455 2511,509 2511,535 2511,604 2511,626 2511,671 2511,676 2511,801 2511,918 2511,972 2511,1143 2511,1240 2511,1267 2511,1293 2511,1326 2511,1370 2511,1402 2511,1522 2511,2266 2511,2334 2511,2512 2511,2605 2511,2620 2511,3474 2511,75912 2511,118336 2511,127158 2512,11 2512,68 2512,71 2512,120 2512,186 2512,240 2512,261 2512,314 2512,332 2512,372 2512,387 2512,390 2512,397 2512,431 2512,452 2512,457 2512,500 2512,534 2512,599 2512,631 2512,668 2512,673 2512,676 2512,677 2512,694 2512,794 2512,808 2512,818 2512,823 2512,838 2512,849 2512,929 2512,985 2512,1001 2512,1014 2512,1082 2512,1118 2512,1285 2512,1309 2512,1353 2512,1402 2512,1417 2512,1419 2512,1466 2512,1566 2512,1608 2512,1715 2512,1796 2512,1807 2512,1808 2512,1844 2512,1888 2512,1955 2512,2411 2512,2511 2512,2775 2512,2989 2512,2991 2512,3135 2512,3504 2512,3524 2512,4066 2512,4220 2512,4514 2512,5718 2512,6824 2512,7915 2512,13478 2512,15169 2512,15183 2512,15931 2512,18681 2512,19662 2512,20757 2512,25347 2512,27041 2512,27550 2512,28553 2512,30577 2512,38281 2512,56953 2512,60908 2512,75912 2512,77773 2512,82217 2512,97536 2512,124433 2512,146001 2512,152580 2512,154508 2512,179804 2512,182546 2512,185911 2512,218509 2512,245487 2512,247136 2513,563 2513,581 2514,346 2515,72 2515,83 2515,119 2515,134 2515,248 2515,278 2515,285 2515,364 2515,372 2515,389 2515,442 2515,455 2515,525 2515,626 2515,972 2515,1298 2515,1309 2515,1718 2515,1756 2515,2286 2515,2553 2515,2590 2516,660 2516,1724 2517,217 2517,455 2517,1019 2517,1417 2518,1285 2518,1888 2519,1462 2519,8537 2520,366 2520,758 2521,609 2521,859 2522,1240 2523,536 2523,2319 2524,202 2524,586 2525,2526 2526,1796 2526,2525 2526,2775 2526,6623 2526,6837 2526,63367 2527,4 2527,5 2527,26 2527,59 2527,175 2527,184 2527,200 2527,273 2527,274 2527,285 2527,294 2527,304 2527,313 2527,347 2527,704 2527,784 2527,887 2527,994 2527,1149 2527,1188 2527,1305 2527,1515 2527,1571 2527,1821 2527,2367 2527,2528 2527,3069 2527,19031 2527,21944 2528,147 2528,149 2528,158 2528,336 2528,493 2528,2244 2528,2552 2528,24242 2528,24725 2528,27010 2528,30431 2528,89035 2529,356 2530,1235 2530,1335 2531,366 2532,209 2533,422 2534,56 2535,115 2535,118 2535,143 2535,202 2535,206 2535,211 2535,273 2535,280 2535,285 2535,315 2535,333 2535,602 2535,620 2535,788 2535,859 2535,994 2535,1068 2535,1181 2535,1983 2535,1985 2535,2528 2535,2567 2535,2867 2535,2868 2535,16331 2535,23783 2535,63502 2536,718 2536,893 2537,344 2537,415 2537,1454 2537,1711 2537,1836 2538,527 2538,743 2539,146 2539,779 2539,68069 2539,86832 2539,92476 2540,50 2540,79 2540,178 2540,192 2540,538 2540,718 2540,1619 2541,1240 2542,433 2542,918 2543,596 2543,1368 2544,83 2544,278 2544,2784 2544,28130 2545,450 2546,861 2548,392 2548,1146 2548,1240 2548,1465 2548,1949 2548,3260 2549,1711 2549,1836 2550,217 2551,83 2552,147 2552,158 2552,493 2552,682 2552,1181 2552,1243 2552,2244 2552,72439 2553,54 2553,83 2553,313 2553,536 2553,634 2553,657 2553,1843 2553,4109 2553,5232 2553,5306 2553,57354 2553,119840 2553,131816 2553,135043 2553,140685 2553,216248 2553,218136 2553,221547 2554,581 2555,422 2556,68 2556,79 2556,111 2556,158 2556,167 2556,178 2556,192 2556,264 2556,301 2556,393 2556,406 2556,435 2556,479 2556,493 2556,516 2556,604 2556,838 2556,1010 2556,1014 2556,1151 2556,1181 2556,1298 2556,1370 2556,1522 2556,1531 2556,1551 2556,1659 2556,2266 2556,2557 2556,2931 2556,2979 2556,3804 2557,86 2557,167 2557,240 2557,299 2557,388 2557,510 2557,567 2557,818 2557,968 2557,1010 2557,1012 2557,1013 2557,1014 2557,1241 2557,1284 2557,1479 2557,1522 2557,1627 2557,1849 2557,1853 2557,2095 2557,2252 2557,2479 2557,2480 2557,2557 2557,2840 2557,2979 2557,4159 2557,4286 2557,5061 2557,6777 2557,6853 2557,7222 2557,9527 2557,13354 2557,13480 2557,13593 2557,14597 2557,16428 2557,16874 2557,20575 2557,21289 2557,24924 2557,25171 2557,29842 2557,31231 2557,31746 2557,31784 2557,34234 2557,36662 2557,39618 2557,42433 2557,42980 2557,45080 2557,47153 2557,57036 2557,59066 2557,60564 2557,68070 2557,72726 2557,73161 2557,75296 2557,83546 2557,96206 2557,98040 2557,99626 2557,113092 2557,116618 2557,119627 2557,122451 2557,125041 2557,125369 2557,131765 2557,132788 2557,133606 2557,134148 2557,145964 2557,147548 2557,158660 2557,158668 2557,159461 2557,166707 2557,183905 2557,204019 2557,204602 2557,264726 2558,1 2558,206 2559,147 2559,1247 2560,104 2560,111 2560,158 2560,192 2560,248 2560,289 2560,290 2560,372 2560,586 2560,588 2560,590 2560,631 2560,636 2560,714 2560,1181 2560,1282 2560,1462 2560,1745 2560,1955 2560,2205 2560,2443 2560,3804 2560,8180 2560,8537 2560,33424 2560,94134 2561,65 2561,66 2561,171 2561,314 2561,435 2561,467 2561,868 2561,1243 2561,6303 2562,278 2562,360 2562,534 2562,697 2562,75912 2563,22 2563,861 2563,2017 2564,2436 2565,596 2565,1368 2566,2567 2567,2567 2568,1821 2569,302 2570,247 2570,1379 2571,147 2571,158 2572,41 2572,104 2572,289 2572,290 2572,298 2572,304 2572,356 2572,417 2572,534 2572,573 2572,609 2572,626 2572,677 2572,685 2572,714 2572,715 2572,782 2572,852 2572,862 2572,999 2572,1085 2572,1513 2572,1564 2572,1580 2572,1608 2572,2085 2572,2105 2572,2205 2572,2253 2572,2296 2572,2572 2572,2747 2572,2775 2572,2874 2572,3563 2572,3623 2572,4222 2572,4532 2572,5935 2572,7194 2572,9180 2572,14820 2572,16668 2572,19755 2572,21742 2572,22057 2572,22093 2572,23619 2572,26322 2572,32991 2572,33424 2572,33567 2572,33702 2572,38822 2572,42581 2572,44725 2572,49535 2572,50739 2572,51972 2572,55252 2572,56377 2572,69119 2572,72955 2572,74547 2572,75912 2572,78792 2572,80405 2572,80470 2572,82114 2572,82618 2572,91791 2572,94134 2572,98259 2572,103765 2572,113380 2572,119958 2572,120926 2572,121562 2572,122622 2572,122796 2572,122955 2572,125472 2572,128130 2572,128420 2572,133974 2572,145456 2572,146394 2572,150527 2572,158785 2572,165048 2572,172974 2572,175792 2572,175898 2572,178576 2572,185874 2572,185877 2572,189435 2572,198303 2572,212692 2572,213968 2572,218050 2572,221068 2572,252816 2572,252823 2572,259621 2573,2574 2574,175 2574,63274 2574,133602 2574,136368 2574,142014 2574,142074 2575,919 2576,392 2577,195 2578,868 2579,1392 2579,1745 2581,1298 2581,1849 2582,87 2582,595 2582,1151 2582,1453 2582,1572 2582,2697 2582,3538 2583,467 2583,1659 2584,34 2584,35 2585,66 2585,467 2585,571 2585,868 2586,647 2587,72 2587,87 2587,104 2587,111 2587,248 2587,264 2587,323 2587,467 2587,479 2587,636 2587,647 2587,862 2587,991 2587,1052 2587,1188 2587,1267 2587,1287 2587,1332 2587,1579 2587,1659 2587,1707 2587,1939 2587,2205 2587,2206 2587,2605 2587,2744 2587,9005 2588,167 2588,299 2588,1522 2588,2083 2588,5301 2588,128922 2589,1962 2590,68 2590,240 2590,356 2590,387 2590,397 2590,676 2590,677 2590,685 2590,693 2590,843 2590,852 2590,911 2590,1133 2590,1285 2590,1294 2590,1888 2590,2580 2590,2590 2590,2591 2590,2620 2590,4220 2590,4494 2590,6260 2590,6552 2590,7155 2590,7348 2590,12878 2590,14507 2590,17906 2590,24906 2590,28963 2590,28966 2590,29692 2590,29773 2590,30751 2590,31005 2590,32779 2590,34129 2590,35694 2590,43247 2590,45067 2590,45114 2590,46165 2590,47173 2590,48475 2590,49049 2590,55198 2590,56949 2590,57638 2590,58975 2590,59275 2590,59743 2590,62221 2590,63404 2590,63974 2590,64221 2590,66297 2590,75209 2590,76914 2590,82114 2590,82703 2590,82744 2590,87708 2590,95098 2590,97517 2590,100218 2590,104981 2590,107690 2590,112546 2590,113353 2590,114676 2590,118419 2590,123035 2590,123050 2590,124265 2590,134600 2590,136575 2590,163460 2590,163474 2590,163784 2590,163874 2590,164353 2590,165121 2590,167731 2590,169071 2590,171030 2590,179343 2590,179344 2590,179746 2590,186694 2590,187442 2590,189153 2590,190362 2590,191973 2590,192114 2590,193001 2590,193156 2590,195524 2590,202514 2590,205671 2590,224845 2590,224851 2590,226253 2590,241008 2590,242499 2590,247195 2590,249060 2590,252337 2590,261550 2591,2590 2592,1146 2593,1623 2593,4691 2594,136 2595,46 2595,292 2595,444 2595,567 2595,605 2595,615 2595,744 2595,745 2595,907 2595,968 2595,1010 2595,1117 2595,1122 2595,1124 2595,1160 2595,1231 2595,1241 2595,1298 2595,1300 2595,1479 2595,1837 2595,2083 2595,2191 2595,2372 2595,3630 2595,3756 2595,5662 2596,104 2596,225 2599,83 2599,178 2599,259 2600,557 2600,1127 2601,5101 2602,366 2602,500 2603,83 2604,581 2605,87 2605,182 2605,256 2605,397 2605,452 2605,457 2605,599 2605,604 2605,685 2605,843 2605,849 2605,852 2605,918 2605,1011 2605,1014 2605,1119 2605,1130 2605,1298 2605,1566 2605,1579 2605,1663 2605,1844 2605,1893 2605,1973 2605,2605 2605,3507 2605,4039 2605,4190 2605,4294 2605,6695 2605,6824 2605,6904 2605,14674 2605,215874 2607,182 2607,349 2607,668 2607,2607 2607,2608 2607,2621 2607,3185 2607,3507 2607,4003 2607,6053 2607,6583 2607,6824 2607,8266 2607,15388 2607,16582 2607,17922 2607,20102 2607,28272 2607,36677 2607,42276 2607,45387 2607,45866 2607,46741 2607,47720 2607,48540 2607,48541 2607,48542 2607,48543 2607,48544 2607,48545 2607,51885 2607,59453 2607,72210 2607,168622 2607,216553 2607,217356 2607,243419 2607,256368 2608,2607 2609,147 2609,149 2609,158 2609,206 2609,2244 2609,73906 2609,118336 2610,302 2610,861 2610,893 2610,1298 2610,2116 2610,4453 2610,4823 2611,247 2612,1381 2613,143 2615,34 2615,35 2615,46 2615,313 2615,356 2615,615 2615,634 2615,968 2615,1313 2615,1718 2615,2224 2615,2646 2615,5326 2616,158 2616,206 2616,406 2616,760 2616,1955 2616,2617 2616,2626 2618,207 2619,34 2619,35 2619,120 2619,222 2619,283 2619,313 2619,332 2619,379 2619,455 2620,71 2620,104 2620,240 2620,261 2620,446 2620,590 2620,599 2620,631 2620,677 2620,685 2620,760 2620,784 2620,805 2620,823 2620,843 2620,1001 2620,1285 2620,1359 2620,1505 2620,1564 2620,1888 2620,1955 2620,2285 2620,2511 2620,2512 2620,2590 2620,2620 2620,2747 2620,2838 2620,2982 2620,2989 2620,2991 2620,3457 2620,3610 2620,4190 2620,5412 2620,5545 2620,5563 2620,5718 2620,6800 2620,8763 2620,15952 2620,17848 2620,23171 2620,26781 2620,29310 2620,32576 2620,32597 2620,37547 2620,37816 2620,39045 2620,41247 2620,41395 2620,50062 2620,50068 2620,62482 2620,66297 2620,68310 2620,79660 2620,105207 2620,106214 2620,109808 2620,116543 2620,117231 2620,120694 2620,122795 2620,124517 2620,127158 2620,127771 2620,127802 2620,139854 2620,147416 2620,147419 2620,147420 2620,147425 2620,147428 2620,147431 2620,147435 2620,147439 2620,147443 2620,147445 2620,147448 2620,147452 2620,147457 2620,150054 2620,153190 2620,154573 2620,207659 2620,230460 2620,239795 2620,241044 2620,246020 2620,258887 2622,733 2623,83 2624,219 2625,934 2625,973 2625,1085 2625,1298 2625,1849 2625,2979 2625,32784 2626,4039 2627,1433 2628,151 2628,272 2628,304 2628,306 2628,307 2628,422 2628,726 2628,736 2628,827 2628,1127 2628,2367 2628,3582 2628,3999 2628,9457 2629,364 2630,731 2631,10 2632,358 2633,278 2634,192 2634,1113 2635,68 2635,186 2635,7155 2636,346 2636,932 2636,1085 2637,206 2638,2105 2639,1984 2640,1400 2641,726 2642,301 2642,444 2642,968 2643,710 2644,805 2645,34 2645,35 2645,2646 2646,19 2646,34 2646,35 2646,54 2646,83 2646,107 2646,222 2646,278 2646,292 2646,313 2646,332 2646,336 2646,379 2646,385 2646,389 2646,399 2646,431 2646,467 2646,477 2646,536 2646,589 2646,634 2646,635 2646,650 2646,657 2646,660 2646,682 2646,693 2646,694 2646,707 2646,745 2646,784 2646,808 2646,814 2646,852 2646,875 2646,890 2646,891 2646,911 2646,949 2646,969 2646,996 2646,1011 2646,1138 2646,1242 2646,1274 2646,1313 2646,1512 2646,1571 2646,1580 2646,1623 2646,1644 2646,1718 2646,1724 2646,1756 2646,1843 2646,1881 2646,1996 2646,2159 2646,2168 2646,2224 2646,2266 2646,2315 2646,2421 2646,2424 2646,2553 2646,2711 2646,2775 2646,2944 2646,3115 2646,3455 2646,3623 2646,3672 2646,3686 2646,3729 2646,3866 2646,3933 2646,3951 2646,4039 2646,4213 2646,4222 2646,4223 2646,4234 2646,4238 2646,4579 2646,5034 2646,5326 2646,5704 2646,5933 2646,5992 2646,6059 2646,6064 2646,6068 2646,6506 2646,7008 2646,7385 2646,7698 2646,7959 2646,8554 2646,9752 2646,13657 2646,14572 2646,14612 2646,14636 2646,15451 2646,16906 2646,18265 2646,18654 2646,18831 2646,18894 2646,19286 2646,19443 2646,19590 2646,19854 2646,20417 2646,22420 2646,22423 2646,22424 2646,23407 2646,23518 2646,26034 2646,26282 2646,28130 2646,30331 2646,32820 2646,34619 2646,37771 2646,39537 2646,39561 2646,40099 2646,40637 2646,40829 2646,41281 2646,41890 2646,44329 2646,45511 2646,46238 2646,47439 2646,48082 2646,48639 2646,49170 2646,49173 2646,49551 2646,49632 2646,49715 2646,50059 2646,50161 2646,50886 2646,57354 2646,58453 2646,62539 2646,63132 2646,64514 2646,66703 2646,67877 2646,68097 2646,69954 2646,70989 2646,72439 2646,76186 2646,77569 2646,77759 2646,77821 2646,77832 2646,79503 2646,79517 2646,79966 2646,82029 2646,82868 2646,84860 2646,90299 2646,92099 2646,93092 2646,98453 2646,102503 2646,102504 2646,102573 2646,103193 2646,103630 2646,103716 2646,105021 2646,107100 2646,110533 2646,110584 2646,110606 2646,110625 2646,115474 2646,122130 2646,126764 2646,127148 2646,129708 2646,129790 2646,131224 2646,133830 2646,134530 2646,136674 2646,137797 2646,140755 2646,143504 2646,144268 2646,145659 2646,146482 2646,146484 2646,147447 2646,147583 2646,148041 2646,149462 2646,152939 2646,154004 2646,154527 2646,154782 2646,163433 2646,169341 2646,169595 2646,170608 2646,172660 2646,173544 2646,173808 2646,175476 2646,176325 2646,176980 2646,177074 2646,177491 2646,179671 2646,181764 2646,188791 2646,190108 2646,195716 2646,198176 2646,215987 2646,219351 2646,221337 2646,228960 2646,229782 2646,230496 2646,230911 2646,236740 2646,236900 2646,242569 2646,244595 2646,244765 2646,247214 2646,247225 2646,247721 2646,247811 2646,247871 2646,248046 2646,249286 2646,249374 2646,249650 2646,251107 2646,251294 2646,251739 2646,258398 2646,258752 2646,258964 2646,262449 2647,801 2648,1807 2649,313 2650,2617 2650,2651 2650,3261 2650,15923 2650,16028 2650,16145 2650,16536 2650,17718 2650,18075 2650,29908 2650,30280 2650,42183 2650,42531 2650,45938 2650,46591 2650,47599 2650,55987 2650,57399 2650,59512 2650,63197 2650,65567 2650,68085 2650,68479 2650,69514 2650,75265 2650,75504 2650,76649 2650,79787 2650,81370 2650,82489 2650,83090 2650,83781 2650,84317 2650,84326 2650,84911 2650,85386 2650,86920 2650,88020 2650,88163 2650,88227 2650,88800 2650,88917 2650,89112 2650,89201 2650,89245 2650,89294 2650,89883 2650,89928 2650,91189 2650,91632 2650,92374 2650,92445 2650,92470 2650,93021 2650,93458 2650,94453 2650,94992 2650,95041 2650,95099 2650,96111 2650,96572 2650,98506 2650,98577 2650,98713 2650,98973 2650,102320 2650,103004 2650,104805 2650,104822 2650,104999 2650,105137 2650,106696 2650,106718 2650,106900 2650,107166 2650,107264 2650,108100 2650,108300 2650,109785 2650,110109 2650,111659 2650,112022 2650,112142 2650,112749 2650,114171 2650,114328 2650,114672 2650,117262 2650,117542 2650,117551 2650,119216 2650,120270 2650,122346 2650,123080 2650,123438 2650,123530 2650,124282 2650,125235 2650,126212 2650,127585 2650,127622 2650,129043 2650,129133 2650,129159 2650,129201 2650,129223 2650,129357 2650,130722 2650,131139 2650,131470 2650,131533 2650,132381 2650,132713 2650,134527 2650,141505 2650,144622 2650,144715 2650,145271 2650,146948 2650,147304 2650,150143 2650,150313 2650,150967 2650,151896 2650,151903 2650,151909 2650,151951 2650,152883 2650,153781 2650,154122 2650,172757 2650,184573 2650,187498 2650,193914 2650,194005 2650,197904 2650,206048 2650,206724 2650,207915 2650,212252 2650,212392 2650,213609 2650,215023 2650,216962 2650,219028 2650,219947 2650,220798 2650,223618 2650,223619 2650,227208 2650,227737 2650,228777 2650,231719 2650,233193 2650,233243 2650,233800 2650,233862 2650,237157 2650,237970 2650,239056 2650,240590 2650,241941 2650,242483 2650,242671 2650,243274 2650,243578 2650,246345 2650,247166 2650,248531 2650,248935 2650,249019 2650,249449 2650,250263 2650,250430 2650,252981 2650,259216 2650,260694 2650,261415 2650,261486 2650,261532 2650,264565 2650,264785 2650,264826 2652,22 2652,65 2652,120 2652,285 2652,438 2652,599 2652,602 2652,660 2652,795 2652,868 2652,1122 2652,1454 2652,1803 2652,1849 2652,2274 2652,2646 2652,2699 2652,5961 2653,178 2654,1175 2655,289 2655,290 2655,94134 2656,240 2656,818 2656,17309 2657,372 2657,932 2657,1082 2657,1479 2658,596 2659,752 2659,1210 2660,1127 2661,355 2662,483 2663,2372 2664,1287 2665,192 2665,211 2665,949 2665,1509 2666,493 2666,1433 2667,2017 2667,2668 2668,6998 2668,19676 2668,32782 2669,358 2670,2671 2673,2674 2673,16153 2674,4 2674,5 2674,24 2674,26 2674,59 2674,60 2674,116 2674,220 2674,885 2674,887 2674,967 2674,994 2674,1235 2674,1335 2674,2157 2674,2673 2674,2674 2674,2893 2674,3794 2674,4054 2674,4114 2674,4185 2674,5700 2674,5713 2674,5803 2674,5809 2674,5889 2674,6621 2674,7530 2674,8155 2674,8167 2674,13662 2674,15229 2674,15378 2674,15742 2674,16153 2674,16418 2674,18696 2674,20111 2674,20375 2674,21944 2674,22643 2674,25636 2674,26144 2674,26153 2674,28995 2674,29002 2674,29386 2674,30352 2674,30356 2674,30360 2674,30377 2674,30379 2674,30382 2674,30384 2674,30471 2674,30529 2674,30558 2674,30574 2674,31270 2674,31333 2674,33331 2674,34060 2674,34805 2674,35510 2674,40793 2674,41974 2674,43667 2674,44244 2674,51260 2674,66784 2674,68440 2674,72626 2675,2105 2676,175 2676,1773 2677,178 2677,2677 2677,2844 2677,2854 2677,2869 2677,2876 2677,2887 2677,2894 2677,3000 2677,3019 2677,4689 2677,4699 2677,5728 2677,6109 2677,6110 2677,6533 2677,7303 2677,8510 2677,9294 2677,14511 2677,14827 2677,15313 2677,17220 2677,18035 2677,18747 2677,18748 2677,19904 2677,22053 2677,22077 2677,22083 2677,22148 2677,22998 2677,23855 2677,25345 2677,25346 2677,27481 2677,29866 2677,30008 2677,32591 2677,32773 2677,33325 2677,35497 2677,35575 2677,37211 2677,38985 2677,43839 2677,48278 2677,51979 2677,62609 2677,66394 2677,66678 2677,71801 2677,75050 2677,76060 2677,76943 2677,77529 2677,83515 2677,83638 2677,93338 2677,95539 2677,97665 2677,102578 2677,109627 2677,110336 2677,110338 2677,110346 2677,110884 2677,118622 2677,119694 2677,122160 2677,122713 2677,122715 2677,123516 2677,123517 2677,123645 2677,124944 2677,127982 2677,130763 2677,135502 2677,136787 2677,136802 2677,145312 2677,147046 2677,147047 2677,150865 2677,151075 2677,155667 2677,156246 2677,158289 2677,164769 2677,164770 2677,167071 2677,170897 2677,177066 2677,177067 2677,183526 2677,187422 2677,188261 2677,192747 2677,194548 2677,212752 2677,214142 2677,214849 2677,216029 2677,225902 2677,225924 2677,226370 2677,229280 2677,229711 2677,232921 2677,239769 2677,239773 2677,241655 2677,242620 2677,242621 2677,247664 2677,248020 2677,251629 2677,251636 2677,255129 2677,257728 2677,258301 2677,258304 2677,258315 2677,258319 2677,258408 2677,258738 2677,258746 2677,259897 2677,259903 2677,259904 2677,259906 2677,259909 2677,260553 2677,260884 2677,263977 2677,263979 2677,264405 2677,264483 2677,264490 2678,107 2678,795 2678,1188 2679,138 2680,2681 2680,31977 2680,34825 2680,35163 2680,51117 2680,63082 2680,64439 2680,68981 2680,70815 2680,76630 2680,77195 2680,77829 2680,80762 2680,82482 2680,83440 2680,83767 2680,84391 2680,87140 2682,251 2683,440 2684,809 2685,264 2685,1509 2685,1551 2686,72 2687,313 2687,685 2687,1151 2688,718 2689,3 2689,37 2689,50 2689,68 2689,104 2689,106 2689,111 2689,120 2689,140 2689,202 2689,203 2689,225 2689,240 2689,283 2689,301 2689,302 2689,312 2689,326 2689,349 2689,372 2689,388 2689,389 2689,435 2689,455 2689,503 2689,509 2689,518 2689,536 2689,557 2689,592 2689,697 2689,704 2689,779 2689,801 2689,818 2689,873 2689,874 2689,875 2689,907 2689,919 2689,932 2689,934 2689,949 2689,968 2689,1001 2689,1010 2689,1068 2689,1082 2689,1140 2689,1143 2689,1167 2689,1175 2689,1177 2689,1210 2689,1231 2689,1240 2689,1241 2689,1282 2689,1289 2689,1298 2689,1300 2689,1309 2689,1326 2689,1332 2689,1359 2689,1368 2689,1370 2689,1411 2689,1452 2689,1454 2689,1465 2689,1467 2689,1479 2689,1511 2689,1515 2689,1522 2689,1579 2689,1590 2689,1722 2689,1789 2689,1805 2689,1837 2689,1849 2689,1877 2689,1955 2689,1985 2689,2006 2689,2045 2689,2083 2689,2178 2689,2205 2689,2206 2689,2480 2689,2557 2689,2590 2689,2620 2689,2784 2689,2979 2689,3069 2689,3193 2689,3218 2689,3260 2689,3474 2689,3538 2689,3612 2689,3999 2689,4545 2689,4637 2689,4771 2689,5405 2689,5440 2689,5662 2689,5718 2689,6424 2689,6955 2689,7270 2690,195 2691,217 2691,536 2692,19 2692,808 2693,252 2694,397 2695,682 2696,595 2696,1151 2696,1453 2696,1572 2696,2697 2696,3538 2698,4 2698,5 2699,87 2699,119 2699,599 2699,808 2699,852 2699,919 2699,1240 2699,1293 2699,1559 2699,1860 2699,2699 2699,3507 2699,7768 2700,1414 2701,2701 2701,3474 2702,275 2703,887 2704,1021 2704,1096 2704,3555 2704,55712 2704,95159 2704,173258 2704,185121 2705,151 2706,640 2707,366 2707,3328 2708,503 2708,1257 2708,1282 2708,1732 2709,83 2710,30 2710,50 2710,269 2710,328 2710,333 2710,406 2710,435 2710,439 2710,440 2710,622 2710,794 2710,1033 2710,1179 2710,1305 2710,1415 2710,1515 2710,1531 2710,141912 2711,34 2711,35 2711,250 2711,1684 2711,2224 2711,2646 2711,5326 2712,117 2713,86 2713,151 2713,273 2713,274 2713,292 2713,483 2713,581 2713,783 2713,1127 2713,1130 2713,1284 2713,1345 2713,2168 2713,2373 2713,2744 2715,1858 2716,1860 2717,34 2717,35 2718,2719 2719,2719 2720,26 2720,59 2720,138 2720,2674 2720,16153 2721,1282 2722,2723 2722,105527 2722,105865 2722,225245 2724,200 2725,178 2726,87 2726,140 2726,323 2726,479 2726,515 2726,516 2726,647 2726,872 2726,991 2726,1052 2726,1102 2726,1192 2726,1267 2726,1287 2726,1289 2726,1381 2726,1509 2726,1579 2726,1659 2726,1663 2726,1973 2726,2605 2726,2744 2726,3507 2726,3695 2726,4771 2727,104 2727,254 2727,557 2727,953 2727,954 2727,1939 2727,10318 2728,22 2728,500 2728,718 2728,972 2729,240 2729,390 2729,1085 2729,1203 2729,1285 2729,1309 2730,315 2731,1143 2732,22 2732,65 2732,211 2732,269 2732,809 2732,818 2732,861 2732,893 2732,1052 2732,1374 2732,1556 2732,1803 2732,2017 2732,141912 2734,2735 2736,261 2736,1619 2736,2737 2736,3089 2736,4771 2738,32 2738,392 2739,647 2740,344 2741,50 2741,147 2741,158 2741,406 2742,647 2743,344 2744,425 2746,1140 2746,6955 2747,46 2747,167 2747,326 2747,372 2747,390 2747,518 2747,522 2747,534 2747,573 2747,589 2747,715 2747,765 2747,775 2747,783 2747,862 2747,1045 2747,1085 2747,1117 2747,1119 2747,1133 2747,1298 2747,1544 2747,1580 2747,1853 2747,2092 2747,2148 2747,2193 2747,2572 2747,2595 2747,2620 2747,2747 2747,3623 2747,4222 2747,4308 2747,5186 2747,5299 2747,5587 2747,5605 2747,6004 2747,6068 2747,6474 2747,7194 2747,8107 2747,13524 2747,14011 2747,14038 2747,14236 2747,14636 2747,14747 2747,15259 2747,15667 2747,16463 2747,16955 2747,18299 2747,19525 2747,20535 2747,20813 2747,22268 2747,28818 2747,31802 2747,34721 2747,34933 2747,37771 2747,38972 2747,38977 2747,39618 2747,58820 2747,62759 2747,64479 2747,66455 2747,68812 2747,75144 2747,75912 2747,83301 2747,88341 2747,91279 2747,96685 2747,98279 2747,99137 2747,101730 2747,103982 2747,106196 2747,113362 2747,113595 2747,115960 2747,116102 2747,116956 2747,119577 2747,119962 2747,134504 2747,135928 2747,136182 2747,138114 2747,141784 2747,145316 2747,150843 2747,156907 2747,157298 2747,172502 2748,723 2748,1267 2749,809 2749,2750 2750,10 2750,2749 2750,2750 2750,3088 2750,3091 2750,4163 2750,9553 2750,14571 2750,19618 2750,25121 2750,26161 2750,27282 2750,27807 2750,30049 2750,36961 2750,39408 2750,42785 2750,46742 2750,47387 2750,55686 2750,72681 2750,87275 2750,91220 2750,109863 2750,120119 2750,136815 2750,151013 2750,151225 2750,152064 2750,152119 2750,160959 2750,178456 2750,178739 2750,179623 2750,180085 2750,184435 2750,186452 2750,221386 2750,224088 2750,225865 2750,228955 2750,230457 2750,237691 2750,248881 2750,251362 2750,256608 2750,257480 2751,861 2751,2116 2752,50 2752,149 2752,158 2752,622 2752,3507 2752,141912 2753,66 2754,875 2755,408 2756,459 2756,4223 2757,1058 2758,87 2758,390 2758,615 2758,1143 2758,1801 2758,2296 2758,2572 2758,13661 2758,75912 2759,106 2760,2367 2761,87 2761,344 2761,1143 2761,1146 2761,1454 2761,1711 2761,1836 2762,302 2762,579 2762,2116 2763,1509 2764,779 2765,1235 2765,1335 2765,21944 2766,41 2766,294 2766,631 2767,86 2768,195 2769,66 2769,1433 2770,346 2771,943 2771,1454 2772,147 2772,483 2773,130 2773,1007 2774,2775 2775,10 2775,24 2775,40 2775,41 2775,54 2775,135 2775,175 2775,217 2775,240 2775,261 2775,294 2775,332 2775,364 2775,446 2775,500 2775,575 2775,609 2775,612 2775,631 2775,660 2775,682 2775,693 2775,694 2775,715 2775,749 2775,784 2775,801 2775,805 2775,911 2775,969 2775,996 2775,1082 2775,1118 2775,1149 2775,1172 2775,1203 2775,1220 2775,1222 2775,1242 2775,1285 2775,1309 2775,1328 2775,1353 2775,1359 2775,1368 2775,1417 2775,1512 2775,1696 2775,1807 2775,1849 2775,1888 2775,1955 2775,2097 2775,2105 2775,2211 2775,2253 2775,2315 2775,2373 2775,2512 2775,2572 2775,2646 2775,2775 2775,2944 2775,3087 2775,3115 2775,3385 2775,3582 2775,3619 2775,3623 2775,3695 2775,3709 2775,3964 2775,4066 2775,4115 2775,4266 2775,4303 2775,5130 2775,5268 2775,5935 2775,5992 2775,6506 2775,6652 2775,6724 2775,6770 2775,6853 2775,7087 2775,8592 2775,9467 2775,12727 2775,12752 2775,13304 2775,13563 2775,14133 2775,14597 2775,14833 2775,14907 2775,14925 2775,15587 2775,16103 2775,16410 2775,16562 2775,17116 2775,17692 2775,17890 2775,18327 2775,18965 2775,19484 2775,19881 2775,19901 2775,20419 2775,20876 2775,21071 2775,21589 2775,22177 2775,22428 2775,22839 2775,24690 2775,24887 2775,24934 2775,25416 2775,26302 2775,26848 2775,26880 2775,27500 2775,28114 2775,28553 2775,28562 2775,29042 2775,29065 2775,29872 2775,30304 2775,30568 2775,30733 2775,31763 2775,32751 2775,32903 2775,34384 2775,34893 2775,34960 2775,36820 2775,36841 2775,38317 2775,38325 2775,38466 2775,38845 2775,38939 2775,39290 2775,39684 2775,40686 2775,41178 2775,41243 2775,41980 2775,42140 2775,42691 2775,42918 2775,44162 2775,45278 2775,45610 2775,45647 2775,45886 2775,48409 2775,50285 2775,55055 2775,57351 2775,57875 2775,59123 2775,61093 2775,63005 2775,63410 2775,63414 2775,63538 2775,64085 2775,65854 2775,67534 2775,68867 2775,69967 2775,70252 2775,71048 2775,72439 2775,72598 2775,74540 2775,75806 2775,75829 2775,75972 2775,77569 2775,77808 2775,77831 2775,79860 2775,79870 2775,80111 2775,80186 2775,80755 2775,81043 2775,81681 2775,81832 2775,82268 2775,83287 2775,83450 2775,83905 2775,84193 2775,84204 2775,84373 2775,84499 2775,84552 2775,84855 2775,84860 2775,85202 2775,85807 2775,86096 2775,87370 2775,87371 2775,90301 2775,90381 2775,90412 2775,93528 2775,93618 2775,94147 2775,94822 2775,95462 2775,95496 2775,95629 2775,95760 2775,95778 2775,96623 2775,96848 2775,97617 2775,98227 2775,98854 2775,99933 2775,103755 2775,107759 2775,109955 2775,112964 2775,114061 2775,114150 2775,114468 2775,118252 2775,118374 2775,118378 2775,119560 2775,119663 2775,121138 2775,121141 2775,123420 2775,124167 2775,124169 2775,127469 2775,128728 2775,131277 2775,132114 2775,133959 2775,135222 2775,136674 2775,138214 2775,144515 2775,145653 2775,145865 2775,145866 2775,145867 2775,145868 2775,146349 2775,146865 2775,150411 2775,150862 2775,156270 2775,158457 2775,158762 2775,158803 2775,158808 2775,162659 2775,162661 2775,162675 2775,162677 2775,162679 2775,164632 2775,168532 2775,168533 2775,168534 2775,168540 2775,168542 2775,168543 2775,168545 2775,168546 2775,168547 2775,168597 2775,168835 2775,169098 2775,169218 2775,171181 2775,171194 2775,175780 2775,182162 2775,186614 2775,187976 2775,189331 2775,189950 2775,190108 2775,214733 2775,220285 2775,221301 2775,234869 2775,245331 2775,247325 2775,248128 2775,254370 2775,254434 2775,258184 2775,260256 2775,262449 2775,263336 2775,263608 2775,264668 2776,447 2777,1294 2778,83 2778,278 2778,285 2778,949 2778,2779 2778,2784 2779,8 2779,83 2779,222 2779,256 2779,278 2779,283 2779,313 2779,385 2779,455 2779,657 2779,685 2779,949 2779,1069 2779,1539 2779,2159 2779,2424 2779,2779 2779,2784 2779,3252 2779,3758 2779,4234 2779,4593 2779,5325 2779,5591 2779,7768 2779,8220 2779,13240 2779,15249 2779,18577 2779,18650 2779,19286 2779,19337 2779,19455 2779,19511 2779,22437 2779,23700 2779,24348 2779,28896 2779,28898 2779,28935 2779,28998 2779,37088 2779,41854 2779,44329 2779,46165 2779,49097 2779,50623 2779,54495 2779,60484 2779,63699 2779,66273 2779,66421 2779,67077 2779,85515 2779,85731 2779,88498 2779,92667 2779,107168 2779,108598 2779,115040 2779,128785 2779,135108 2779,135735 2779,163747 2779,164251 2779,164573 2779,166288 2779,175609 2779,190557 2779,204597 2779,206757 2779,215981 2779,254510 2779,258239 2780,344 2780,710 2780,1836 2781,2782 2782,10 2782,106 2782,175 2782,251 2782,280 2782,337 2782,446 2782,505 2782,620 2782,647 2782,663 2782,664 2782,685 2782,841 2782,1007 2782,1027 2782,1328 2782,1370 2782,1848 2782,1985 2782,2782 2782,6455 2782,7222 2782,14507 2782,15113 2782,15229 2782,16186 2782,17245 2782,18164 2782,20893 2782,21736 2782,25302 2782,27175 2782,28354 2782,30325 2782,30599 2782,33298 2782,37689 2782,40782 2782,41615 2782,50861 2782,62195 2782,67360 2782,82114 2782,82673 2782,83893 2782,84593 2782,88453 2782,89331 2782,90179 2782,91853 2782,99643 2782,102521 2782,106502 2782,131504 2782,156471 2782,172181 2782,184777 2782,185099 2782,191355 2782,198752 2782,202574 2782,222045 2782,223037 2782,224936 2783,1238 2784,222 2784,313 2784,379 2784,389 2784,477 2784,536 2784,634 2784,657 2784,685 2784,852 2784,949 2784,1011 2784,1069 2784,1571 2784,1618 2784,1724 2784,1881 2784,1973 2784,2159 2784,2224 2784,2253 2784,2290 2784,2689 2784,2784 2784,2944 2784,4457 2784,5326 2784,5458 2784,5591 2784,5644 2784,6064 2784,6131 2784,6788 2784,6997 2784,7698 2784,7999 2784,8152 2784,8554 2784,14612 2784,15138 2784,16151 2784,18831 2784,19005 2784,19211 2784,19433 2784,21200 2784,21414 2784,25509 2784,28130 2784,29828 2784,29881 2784,29884 2784,30502 2784,35032 2784,36754 2784,38297 2784,46056 2784,46241 2784,49262 2784,50339 2784,50593 2784,54559 2784,65905 2784,66703 2784,75170 2784,94900 2784,94912 2784,98926 2784,102700 2784,104264 2784,104971 2784,107001 2784,115474 2784,117231 2784,122116 2784,122166 2784,122171 2784,122173 2784,123131 2784,124442 2784,124524 2784,129719 2784,133024 2784,140501 2784,140503 2784,147483 2784,148803 2784,149463 2784,150858 2784,159384 2784,161616 2784,161662 2784,173547 2784,176499 2784,176504 2784,177367 2784,177908 2784,178703 2784,179838 2784,184844 2784,186516 2784,186551 2784,186683 2784,188676 2784,188685 2784,189850 2784,191628 2784,192459 2784,213681 2784,214240 2784,225675 2784,241637 2784,242289 2784,249732 2784,249771 2784,258794 2785,1414 2786,94 2786,2787 2787,94 2787,2787 2788,1858 2789,2790 2791,640 2792,158 2792,192 2792,406 2792,585 2792,620 2792,779 2792,1515 2794,104 2794,557 2794,953 2794,954 2794,1939 2795,3 2795,34 2795,35 2795,63 2795,79 2795,99 2795,146 2795,158 2795,178 2795,192 2795,195 2795,215 2795,217 2795,233 2795,254 2795,285 2795,298 2795,323 2795,332 2795,333 2795,336 2795,406 2795,422 2795,516 2795,615 2795,620 2795,622 2795,640 2795,663 2795,664 2795,694 2795,968 2795,1007 2795,1033 2795,1220 2795,1222 2795,1235 2795,1265 2795,1266 2795,1294 2795,1335 2795,1370 2795,1425 2795,1515 2795,1551 2795,1732 2795,1955 2795,2244 2795,2296 2795,2334 2795,2567 2795,2782 2795,3115 2795,3317 2795,3321 2795,3804 2795,5726 2795,5874 2795,16019 2796,120 2796,2797 2796,2807 2796,2812 2797,1955 2797,2797 2798,32 2799,1722 2800,1284 2801,302 2801,2116 2802,107 2802,278 2802,1388 2802,1888 2802,3538 2803,305 2803,1313 2804,2105 2805,647 2806,344 2808,704 2809,304 2809,417 2809,1085 2809,2205 2809,2206 2809,2296 2809,33424 2810,397 2810,623 2810,808 2810,1240 2810,1241 2810,1465 2810,1805 2810,1949 2810,2810 2810,3881 2810,5301 2810,6630 2810,9769 2810,21452 2810,29762 2810,80542 2810,166991 2810,167605 2811,333 2812,120 2812,240 2812,599 2812,685 2812,852 2812,1082 2812,1419 2812,1955 2812,2812 2812,2838 2812,3397 2812,6004 2812,7921 2812,15097 2812,16430 2812,16571 2812,17173 2812,23336 2812,31729 2812,32650 2812,47173 2812,49691 2812,52539 2812,53598 2812,60487 2812,63038 2812,67185 2812,82014 2812,86601 2812,116037 2812,122063 2812,127158 2812,134154 2812,161902 2812,179247 2812,194416 2812,203878 2812,204754 2812,213999 2812,215266 2813,252 2814,596 2815,222 2816,44 2817,301 2817,919 2818,240 2818,1359 2818,1564 2819,22 2819,809 2820,818 2820,1417 2821,217 2821,536 2821,1417 2821,4672 2821,115474 2822,304 2823,631 2823,805 2824,120 2824,261 2824,694 2824,2989 2824,2991 2824,3367 2824,32751 2825,87 2825,344 2825,392 2825,1151 2825,1836 2825,2697 2826,467 2827,2828 2828,9379 2828,29364 2828,77572 2828,121199 2828,124673 2829,973 2830,2048 2831,1058 2832,1241 2833,631 2833,1001 2834,294 2834,431 2834,634 2834,1052 2834,2701 2834,9015 2835,557 2835,954 2835,1939 2836,206 2836,2837 2837,2837 2837,9470 2837,13515 2837,15988 2837,15991 2837,21651 2837,27997 2837,33681 2837,37032 2837,37140 2837,43931 2838,240 2838,1955 2838,2620 2838,2812 2839,885 2840,86 2840,167 2840,301 2840,626 2840,1241 2840,1284 2840,1479 2840,1522 2840,1849 2840,2480 2840,2557 2840,2979 2841,240 2841,1309 2842,2843 2842,44053 2845,332 2845,399 2845,912 2845,40566 2846,417 2847,850 2848,1078 2849,344 2850,298 2850,417 2850,2296 2851,298 2852,485 2853,536 2855,313 2856,32 2857,301 2857,968 2857,1544 2857,1955 2857,2083 2858,302 2858,2116 2859,44 2859,202 2859,203 2859,217 2859,538 2859,663 2859,664 2859,779 2859,788 2859,809 2859,920 2859,1033 2859,1181 2859,1381 2859,1414 2859,1639 2859,1805 2859,2073 2859,2889 2859,5440 2859,15609 2860,2334 2861,302 2862,2863 2864,1858 2865,1860 2866,54 2866,743 2866,1247 2866,2867 2866,2868 2866,149534 2867,211 2867,1844 2867,2867 2867,2868 2868,47 2868,184 2868,2469 2868,2867 2868,2868 2870,1858 2871,1860 2872,1 2873,2379 2874,1 2874,37 2874,71 2874,107 2874,137 2874,146 2874,171 2874,248 2874,252 2874,272 2874,283 2874,287 2874,289 2874,290 2874,313 2874,344 2874,379 2874,417 2874,626 2874,685 2874,693 2874,704 2874,749 2874,827 2874,841 2874,849 2874,859 2874,900 2874,911 2874,918 2874,991 2874,1070 2874,1085 2874,1096 2874,1146 2874,1220 2874,1222 2874,1243 2874,1285 2874,1319 2874,1381 2874,1402 2874,1465 2874,1566 2874,1608 2874,1818 2874,1821 2874,2205 2874,2334 2874,2424 2874,2572 2874,21442 2874,21736 2874,33424 2874,81233 2874,92476 2875,147 2875,158 2875,285 2875,406 2875,779 2875,1515 2875,4193 2875,80266 2877,772 2878,247 2879,1707 2880,149 2880,333 2880,406 2880,779 2880,893 2880,1181 2880,6119 2880,18638 2880,68069 2881,269 2882,2883 2884,346 2885,338 2886,805 2890,106 2891,843 2891,852 2891,1844 2895,818 2895,1433 2896,346 2896,932 2896,1085 2897,305 2897,35092 2898,2899 2900,784 2900,1462 2900,8537 2901,2883 2902,623 2903,147 2903,158 2903,192 2903,195 2903,206 2903,336 2903,571 2903,663 2903,779 2903,805 2903,868 2903,1014 2903,1385 2903,1623 2903,6119 2903,31346 2903,55849 2903,60576 2903,127158 2904,875 2905,163 2905,209 2905,302 2905,687 2905,893 2906,949 2906,18831 2906,55233 2907,467 2907,1151 2908,178 2909,592 2910,79 2910,333 2910,2911 2910,72727 2910,77293 2910,78300 2910,79428 2910,81621 2910,81887 2910,87606 2912,310 2913,356 2913,442 2913,462 2913,795 2913,1740 2913,2334 2913,2590 2914,2915 2916,136 2917,248 2918,289 2918,290 2918,2205 2918,2206 2918,33424 2918,94134 2919,392 2921,225 2921,772 2921,850 2921,1332 2922,1179 2922,2923 2922,3695 2923,2923 2923,212518 2924,1 2925,2926 2926,5 2926,1684 2926,3118 2926,28168 2926,134580 2926,137926 2926,137927 2926,137929 2927,104 2927,557 2927,953 2927,954 2928,2929 2929,2929 2930,151 2930,2931 2931,1218 2931,76192 2932,79 2933,682 2933,72439 2934,104 2934,136 2934,254 2934,557 2934,953 2934,954 2934,1368 2934,1939 2934,10318 2935,1639 2936,344 2936,415 2936,1143 2936,1711 2936,1836 2936,15523 2937,605 2938,406 2938,779 2939,138 2939,1227 2939,1229 2939,2089 2939,2940 2939,21944 2939,86416 2940,430 2940,2089 2940,2940 2940,43983 2941,563 2942,666 2943,32 2943,37 2943,63 2943,158 2943,192 2943,202 2943,203 2943,251 2943,285 2943,333 2943,346 2943,393 2943,406 2943,439 2943,447 2943,465 2943,493 2943,516 2943,663 2943,664 2943,779 2943,925 2943,934 2943,980 2943,1068 2943,1175 2943,1181 2943,1220 2943,1222 2943,1265 2943,1266 2943,1294 2943,1370 2943,1388 2943,1512 2943,1531 2943,1740 2943,1821 2943,1877 2943,1985 2943,2292 2943,3148 2943,4455 2943,4545 2943,5212 2943,5992 2943,21736 2943,56150 2943,60576 2944,19 2944,54 2944,135 2944,222 2944,313 2944,379 2944,385 2944,455 2944,477 2944,536 2944,682 2944,685 2944,781 2944,784 2944,852 2944,891 2944,1201 2944,1512 2944,1617 2944,1618 2944,1843 2944,1871 2944,2159 2944,2211 2944,2319 2944,2646 2944,2775 2944,2784 2944,2944 2944,2945 2944,3729 2944,4223 2944,4234 2944,4790 2944,5163 2944,5326 2944,5458 2944,5591 2944,5992 2944,6005 2944,6506 2944,7698 2944,7974 2944,8442 2944,8554 2944,9788 2944,13137 2944,13389 2944,13661 2944,15451 2944,15710 2944,15756 2944,18345 2944,22860 2944,23287 2944,23859 2944,24274 2944,25670 2944,28232 2944,28600 2944,29177 2944,36843 2944,38859 2944,39537 2944,44149 2944,44301 2944,45098 2944,45462 2944,48983 2944,49735 2944,52520 2944,57354 2944,57839 2944,61031 2944,62539 2944,63519 2944,63961 2944,66703 2944,72439 2944,72818 2944,74103 2944,77149 2944,79721 2944,85998 2944,94195 2944,102752 2944,103512 2944,107576 2944,114166 2944,118835 2944,126043 2944,126859 2944,130331 2944,131019 2944,132085 2944,135077 2944,135268 2944,136137 2944,136353 2944,138901 2944,138904 2944,138908 2944,140159 2944,143436 2944,143976 2944,144148 2944,144156 2944,144996 2944,146170 2944,149223 2944,151105 2944,151726 2944,151952 2944,152407 2944,154688 2944,158254 2944,162685 2944,164439 2944,165039 2944,169211 2944,169212 2944,169738 2944,171014 2944,172592 2944,173496 2944,176084 2944,176929 2944,177032 2944,177040 2944,180036 2944,181063 2944,190968 2944,193860 2944,198176 2944,216248 2944,218395 2944,219243 2944,220201 2944,220508 2944,222105 2944,232218 2944,255083 2944,255333 2944,256865 2945,2944 2946,920 2947,743 2948,1014 2949,1227 2949,1229 2950,275 2950,277 2951,920 2952,929 2953,493 2953,1265 2953,1266 2953,1370 2954,195 2955,333 2956,424 2957,273 2957,274 2958,302 2959,788 2959,1531 2960,77 2961,298 2962,485 2963,536 2963,1072 2964,143 2965,289 2965,304 2965,599 2965,714 2965,1962 2965,2205 2965,33424 2965,94134 2966,811 2967,184 2968,718 2970,1556 2971,1414 2972,147 2972,406 2973,2353 2974,104 2974,136 2974,137 2974,431 2974,784 2974,818 2974,1235 2974,1305 2974,1432 2974,1462 2974,1511 2974,1635 2974,2417 2974,2991 2974,9015 2974,33424 2974,94134 2974,182162 2974,232709 2975,2506 2976,2506 2977,1414 2978,47 2978,862 2978,2469 2978,2979 2979,167 2979,186 2979,264 2979,287 2979,299 2979,301 2979,314 2979,440 2979,452 2979,457 2979,510 2979,536 2979,599 2979,631 2979,693 2979,762 2979,794 2979,838 2979,872 2979,973 2979,1001 2979,1010 2979,1011 2979,1014 2979,1118 2979,1167 2979,1192 2979,1210 2979,1231 2979,1284 2979,1293 2979,1298 2979,1299 2979,1381 2979,1436 2979,1533 2979,1616 2979,1635 2979,1796 2979,1837 2979,1849 2979,1853 2979,2083 2979,2252 2979,2373 2979,2479 2979,2557 2979,2979 2979,3207 2979,3392 2979,3422 2979,3497 2979,3507 2979,3578 2979,3804 2979,3858 2979,3866 2979,3942 2979,5269 2979,5376 2979,5654 2979,5662 2979,5787 2979,6027 2979,6853 2979,7203 2979,7349 2979,8011 2979,8146 2979,9640 2979,13418 2979,13442 2979,13519 2979,13605 2979,13657 2979,15183 2979,15428 2979,15430 2979,15857 2979,16182 2979,16837 2979,18264 2979,19387 2979,19934 2979,19980 2979,21411 2979,21563 2979,22664 2979,23078 2979,23369 2979,25662 2979,26034 2979,28328 2979,29595 2979,29681 2979,29760 2979,31785 2979,32577 2979,32967 2979,34820 2979,36694 2979,37511 2979,38140 2979,38395 2979,39047 2979,39058 2979,41234 2979,44385 2979,45448 2979,46956 2979,47073 2979,48897 2979,49121 2979,49557 2979,50152 2979,51880 2979,52975 2979,55586 2979,55597 2979,55726 2979,55747 2979,59581 2979,62644 2979,63121 2979,64457 2979,68873 2979,71068 2979,71879 2979,72928 2979,73408 2979,73487 2979,73570 2979,74726 2979,77873 2979,88345 2979,90183 2979,90881 2979,91779 2979,92748 2979,93590 2979,93613 2979,94986 2979,95612 2979,99770 2979,101551 2979,103784 2979,103881 2979,105416 2979,106246 2979,107702 2979,113598 2979,114353 2979,114501 2979,116040 2979,117480 2979,120500 2979,126620 2979,126787 2979,129842 2979,135255 2979,135800 2979,135946 2979,137107 2979,140585 2979,142990 2979,148976 2979,149846 2979,150624 2979,152298 2979,152606 2979,154671 2979,163303 2979,165025 2979,165170 2979,167669 2979,168394 2979,171767 2979,171884 2979,172082 2979,172494 2979,173860 2979,175627 2979,177923 2979,178572 2979,178611 2979,178810 2979,178880 2979,180609 2979,185358 2979,186506 2979,191139 2979,191207 2979,205442 2979,211950 2979,213785 2979,217311 2979,218838 2979,218875 2979,218884 2979,226324 2979,228156 2979,228399 2979,228902 2979,229096 2979,231084 2979,231814 2979,232159 2979,232718 2979,234640 2979,234902 2979,237432 2979,241603 2979,242344 2979,244840 2979,245443 2979,246109 2979,252075 2979,252656 2979,254539 2979,255741 2979,257137 2979,258207 2979,259660 2979,260120 2979,263372 2980,557 2981,146 2982,592 2982,631 2982,760 2982,805 2982,1285 2982,1462 2982,1631 2982,1635 2982,2620 2982,2995 2982,8537 2983,872 2983,1659 2984,302 2984,1983 2985,344 2985,1711 2986,366 2987,841 2988,2989 2988,2991 2989,120 2989,202 2989,240 2989,356 2989,390 2989,397 2989,440 2989,457 2989,467 2989,631 2989,794 2989,818 2989,949 2989,968 2989,1014 2989,1203 2989,1285 2989,1298 2989,1417 2989,1419 2989,1608 2989,1955 2989,2017 2989,2512 2989,2620 2989,2989 2989,2991 2989,3135 2989,8276 2989,13980 2989,23590 2989,27041 2989,27550 2989,127158 2990,1313 2992,457 2992,1417 2993,107 2993,452 2993,473 2993,2995 2994,26 2994,59 2995,41 2995,298 2995,417 2995,440 2995,534 2995,589 2995,626 2995,631 2995,632 2995,677 2995,685 2995,693 2995,715 2995,797 2995,805 2995,823 2995,852 2995,862 2995,1004 2995,1085 2995,1119 2995,1133 2995,1195 2995,1459 2995,1462 2995,2572 2995,2995 2995,3083 2995,3623 2995,5129 2995,5472 2995,6068 2995,6482 2995,7194 2995,8537 2995,9768 2995,15689 2995,16652 2995,16668 2995,18472 2995,25499 2995,25570 2995,42599 2995,45525 2995,46708 2995,51450 2995,54421 2995,54685 2995,57080 2995,59932 2995,68310 2995,75912 2995,103748 2995,106198 2995,178576 2995,216846 2995,216847 2995,235957 2995,247768 2995,249055 2996,861 2997,34 2997,35 2997,83 2997,1417 2998,557 2998,862 2999,264 2999,1147 3001,1016 3002,3003 3003,87 3003,289 3003,290 3003,509 3003,563 3003,808 3003,843 3003,849 3003,852 3003,918 3003,929 3003,1240 3003,1663 3003,20757 3003,26450 3003,94134 3004,527 3005,408 3006,104 3006,135 3006,137 3006,138 3006,1368 3006,2105 3007,3008 3009,30 3009,97 3009,175 3009,184 3009,205 3009,248 3009,328 3009,489 3009,685 3009,693 3009,704 3009,841 3009,1188 3009,1238 3009,1515 3009,1677 3009,1860 3010,364 3011,726 3012,240 3012,372 3012,1001 3012,1085 3013,358 3014,3015 3016,536 3016,18831 3017,485 3018,83 3018,178 3018,207 3018,211 3018,366 3018,387 3018,406 3018,622 3018,21944 3020,248 3020,450 3020,1332 3021,647 3022,344 3023,1298 3024,1 3024,71 3024,149 3024,151 3024,163 3024,184 3024,292 3024,332 3024,442 3024,485 3024,489 3024,491 3024,493 3024,557 3024,595 3024,611 3024,720 3024,760 3024,841 3024,893 3024,980 3024,1188 3024,1243 3024,1623 3024,1782 3024,1821 3024,2116 3024,2296 3024,2367 3024,2590 3024,3623 3024,5265 3024,5405 3024,5540 3024,5662 3024,13136 3024,21944 3024,27041 3025,3026 3027,406 3028,215 3028,240 3028,289 3028,290 3028,298 3028,372 3028,417 3028,592 3028,631 3028,704 3028,714 3028,805 3028,932 3028,1082 3028,1085 3028,1285 3028,1309 3028,1392 3028,1462 3028,1511 3028,1564 3028,1608 3028,1631 3028,1785 3028,1818 3028,1955 3028,1962 3028,2205 3028,2206 3028,2286 3028,2296 3028,2620 3028,2995 3028,3069 3028,5718 3028,8537 3028,33424 3028,94134 3028,245910 3029,841 3031,30 3031,248 3032,134 3033,247 3034,77 3034,83 3034,254 3034,278 3034,283 3034,388 3034,1363 3034,1756 3034,2224 3034,2421 3034,3252 3034,4039 3034,6068 3034,7092 3035,264 3035,292 3035,338 3035,392 3035,467 3035,479 3035,509 3035,647 3035,736 3035,835 3035,872 3035,1151 3035,1289 3035,1453 3035,1551 3035,1572 3035,1893 3035,2051 3035,4039 3035,49057 3036,72 3037,206 3037,957 3037,1247 3037,1815 3038,310 3038,3039 3040,3041 3042,292 3043,707 3044,798 3045,175 3046,175 3047,72 3048,518 3049,167 3049,744 3049,783 3049,1479 3049,3218 3050,1414 3052,104 3052,134 3052,135 3052,136 3052,137 3052,138 3052,557 3052,1368 3052,1939 3052,2105 3053,2334 3054,72 3055,175 3056,1858 3057,1860 3058,744 3059,72 3060,50 3060,158 3060,192 3060,406 3060,585 3060,779 3061,481 3062,743 3063,557 3064,65 3064,586 3065,557 3066,1 3067,10 3067,30 3067,175 3067,205 3067,328 3067,693 3067,704 3067,1498 3067,1773 3067,33437 3067,48955 3067,66678 3067,66832 3067,67429 3067,67554 3067,67940 3067,68372 3068,83 3069,10 3069,278 3069,289 3069,290 3069,328 3069,373 3069,592 3069,704 3069,714 3069,760 3069,911 3069,932 3069,1001 3069,1011 3069,1213 3069,1402 3069,1511 3069,1962 3069,2286 3069,3069 3069,4218 3069,6652 3069,8529 3069,14511 3069,19543 3069,22482 3069,22524 3069,25037 3069,33727 3069,35854 3069,35876 3069,43956 3069,46736 3069,56786 3069,57722 3069,58475 3069,58557 3069,58590 3069,59090 3069,62418 3069,71823 3069,73485 3069,77647 3069,80240 3069,82731 3069,86162 3069,87840 3069,99207 3069,99718 3069,99754 3069,103366 3069,116266 3069,117231 3069,127478 3069,132951 3069,134324 3069,144988 3069,152255 3069,160544 3069,163540 3069,176368 3069,177021 3069,179928 3069,182162 3069,182378 3069,182422 3069,197972 3069,243042 3069,243485 3069,244669 3069,259623 3070,147 3070,406 3070,779 3071,1458 3072,217 3073,3 3073,261 3073,390 3073,536 3073,702 3073,873 3073,874 3073,1210 3073,1544 3073,2045 3073,3182 3074,1707 3075,2116 3076,72 3077,483 3078,3079 3079,3078 3079,6387 3079,7117 3079,9410 3079,57710 3079,65134 3079,79025 3079,81457 3079,86544 3079,86561 3079,86769 3079,103675 3079,108822 3079,116773 3079,122660 3079,129490 3079,133976 3079,165047 3079,192778 3079,261830 3079,264975 3080,3081 3082,493 3082,1927 3083,2995 3084,1257 3084,3085 3086,65 3086,752 3086,1285 3087,366 3087,500 3087,1118 3087,1566 3087,1796 3087,2775 3089,3090 3089,6437 3089,13849 3089,15309 3089,21229 3089,36358 3089,44513 3089,45823 3089,50840 3089,50842 3089,51509 3089,69722 3090,718 3090,1677 3090,3089 3091,2750 3092,1707 3093,425 3093,534 3093,589 3093,765 3093,795 3093,1001 3093,1011 3093,1085 3093,1580 3093,3094 3093,3938 3093,5961 3093,119006 3093,122692 3093,135094 3093,168813 3093,212280 3093,214630 3093,215156 3093,216084 3093,218352 3093,229583 3093,229818 3093,230228 3093,230289 3093,243849 3093,249753 3093,256963 3093,256964 3093,264541 3094,240 3094,417 3094,589 3094,784 3094,795 3094,843 3094,1001 3094,1011 3094,1085 3094,1179 3094,1204 3094,1580 3094,1796 3094,185874 3095,261 3096,227 3097,175 3098,344 3099,248 3099,364 3099,850 3100,261 3101,326 3101,589 3101,4823 3102,417 3103,2506 3104,252 3105,1204 3106,615 3107,2315 3108,527 3108,743 3108,8714 3108,95583 3109,304 3110,2574 3110,3111 3111,10 3111,175 3111,431 3111,671 3111,1773 3111,3111 3111,56742 3111,58343 3112,2646 3113,1631 3114,143 3115,120 3115,175 3115,240 3115,261 3115,431 3115,694 3115,715 3115,784 3115,797 3115,814 3115,818 3115,1082 3115,1353 3115,1466 3115,1807 3115,1849 3115,1888 3115,2253 3115,2512 3115,2646 3115,2775 3115,3115 3115,3623 3115,5130 3115,5935 3115,6022 3115,7181 3115,7196 3115,8488 3115,14386 3115,14674 3115,14730 3115,15283 3115,15931 3115,19561 3115,19590 3115,19854 3115,19857 3115,19901 3115,20419 3115,20876 3115,22797 3115,24934 3115,28191 3115,28338 3115,32751 3115,44301 3115,49104 3115,55681 3115,66468 3115,66513 3115,74533 3115,82140 3115,82219 3115,94911 3115,101473 3115,118459 3115,123057 3115,126049 3115,131224 3115,135270 3115,141579 3115,174548 3115,176926 3115,190063 3115,211945 3115,212602 3115,243447 3115,248537 3115,255044 3115,264076 3116,740 3116,741 3117,577 3118,143 3119,1858 3120,1860 3121,94 3121,602 3121,2787 3122,444 3122,450 3122,589 3122,631 3122,720 3122,932 3122,1001 3122,1085 3122,1732 3122,3194 3122,3422 3122,8811 3123,3124 3125,1238 3126,934 3127,872 3128,206 3128,222 3128,510 3128,760 3128,1019 3128,3129 3128,3135 3130,1858 3131,1860 3132,1227 3132,1229 3132,86416 3133,1007 3135,41 3135,134 3135,233 3135,240 3135,390 3135,631 3135,677 3135,685 3135,784 3135,823 3135,1130 3135,1203 3135,1285 3135,1309 3135,1462 3135,1608 3135,1796 3135,1808 3135,1955 3135,2512 3135,2989 3135,2991 3135,3135 3135,3507 3135,5346 3135,14723 3135,16015 3135,16196 3135,17207 3135,18890 3135,19617 3135,26513 3135,31413 3135,33660 3135,43378 3135,44232 3135,48975 3135,55813 3135,61089 3135,61110 3135,62393 3135,75372 3135,84714 3135,86152 3135,90468 3135,98372 3135,104364 3135,116021 3135,126157 3135,127158 3135,130564 3135,135984 3135,155080 3135,160450 3135,162888 3135,169225 3135,177028 3135,188503 3135,207051 3135,211872 3135,215840 3135,235938 3135,244627 3135,260391 3136,1001 3137,1001 3137,3138 3138,350 3138,4291 3138,7612 3138,13480 3138,21698 3138,31426 3138,39110 3138,55020 3138,55206 3138,57150 3138,59241 3138,97330 3138,99153 3138,99199 3138,99672 3138,99696 3138,99823 3138,99857 3138,99866 3138,103456 3138,106336 3138,128516 3138,130444 3138,144797 3138,146429 3138,147352 3138,147602 3138,148963 3138,150170 3138,156333 3138,158000 3138,158001 3138,158050 3138,158055 3138,163159 3139,298 3140,485 3141,10 3142,346 3143,760 3143,1955 3143,2073 3144,97 3145,106 3145,149 3145,406 3146,151 3147,192 3147,306 3147,307 3147,406 3147,422 3147,493 3147,586 3147,620 3147,779 3147,1515 3147,1531 3147,3148 3147,4192 3147,4193 3147,8244 3148,3148 3149,314 3149,599 3150,206 3150,4611 3151,77 3151,682 3151,788 3151,72439 3152,3153 3154,996 3156,217 3157,389 3158,252 3158,318 3159,1252 3159,1253 3160,3161 3162,605 3163,77 3164,192 3164,500 3165,146 3166,315 3166,599 3166,685 3166,764 3166,775 3166,1011 3166,1326 3166,1411 3166,2006 3167,72 3168,1955 3169,1118 3170,26 3170,47 3170,59 3170,2469 3170,21944 3171,2590 3172,86 3172,167 3172,240 3172,301 3172,372 3172,567 3172,605 3172,615 3172,631 3172,720 3172,801 3172,907 3172,968 3172,972 3172,973 3172,1010 3172,1122 3172,1124 3172,1140 3172,1167 3172,1177 3172,1231 3172,1241 3172,1284 3172,1298 3172,1309 3172,1436 3172,1522 3172,1544 3172,1564 3172,1782 3172,1785 3172,1818 3172,1837 3172,1893 3172,1955 3172,2191 3172,2372 3172,2557 3172,2620 3172,2979 3172,3193 3172,3207 3172,3218 3173,366 3173,500 3174,22 3175,1659 3176,3177 3178,207 3178,424 3178,1058 3178,1201 3178,1368 3178,6556 3178,142405 3179,392 3180,247 3180,252 3180,925 3180,1119 3180,1179 3180,1220 3180,1222 3181,3182 3182,314 3182,388 3182,397 3182,425 3182,509 3182,510 3182,663 3182,685 3182,693 3182,852 3182,992 3182,1014 3182,1133 3182,1192 3182,1231 3182,1345 3182,1696 3182,1801 3182,2143 3182,2989 3182,2991 3182,3182 3182,3507 3182,3509 3182,4759 3182,5317 3182,6424 3182,6552 3182,6904 3182,8658 3182,9079 3182,13198 3182,13245 3182,14061 3182,20363 3182,20416 3182,20426 3182,21188 3182,30328 3182,31106 3182,32474 3182,33515 3182,33587 3182,33799 3182,37771 3182,40518 3182,45365 3182,55567 3182,64405 3182,67147 3182,118884 3182,130521 3182,134481 3182,147390 3182,176382 3182,183356 3182,188295 3182,188536 3182,189266 3182,191459 3182,220281 3182,221654 3182,224431 3182,226114 3182,230623 3182,230630 3182,231061 3182,237694 3184,10 3185,192 3185,2607 3186,72 3187,301 3187,1782 3188,143 3189,195 3189,222 3189,3297 3190,206 3190,1359 3191,3192 3191,34442 3191,36094 3191,36305 3191,37292 3191,41026 3191,51680 3191,52105 3191,53998 3191,57687 3191,78120 3191,84633 3191,88955 3191,91889 3191,99909 3191,100319 3191,101322 3191,102836 3191,104903 3191,219404 3191,257887 3193,186 3193,408 3193,518 3193,1113 3193,1241 3193,1326 3193,1853 3193,3193 3193,3640 3193,5186 3193,6638 3193,8107 3193,14701 3193,15331 3193,15353 3193,16192 3193,16243 3193,16254 3193,18137 3193,20350 3193,25549 3193,28092 3193,31402 3193,31730 3193,31766 3193,31796 3193,34816 3193,44072 3193,44723 3193,46688 3193,46691 3193,46692 3193,46693 3193,46697 3193,46701 3193,46718 3193,48505 3193,87871 3193,98189 3193,115228 3195,79 3195,195 3195,779 3196,207 3197,406 3197,599 3198,1659 3199,147 3199,167 3199,217 3199,467 3199,571 3199,868 3199,872 3199,1118 3199,1417 3199,1796 3199,156379 3200,1370 3201,417 3202,503 3202,586 3202,1118 3202,1149 3203,143 3204,925 3205,1429 3206,424 3207,86 3207,167 3207,299 3207,459 3207,522 3207,783 3207,968 3207,1122 3207,1167 3207,1284 3207,1319 3207,1436 3207,1493 3207,1522 3207,1544 3207,1581 3207,1849 3207,1986 3207,2083 3207,2253 3207,3207 3207,3422 3207,3630 3207,3774 3207,5301 3207,5662 3207,5949 3207,8097 3207,13252 3207,14580 3207,14674 3207,15633 3207,23565 3207,29760 3207,29898 3207,32863 3207,33466 3207,33983 3207,34003 3207,35545 3207,37630 3207,38140 3207,44238 3207,46165 3207,52067 3207,55703 3207,57098 3207,57104 3207,62439 3207,70028 3207,75066 3207,77568 3207,79991 3207,96685 3207,101551 3207,112017 3207,117081 3207,119790 3207,119894 3207,126814 3207,126818 3207,127807 3207,130501 3207,134023 3207,134079 3207,134600 3207,142456 3207,147860 3207,148742 3207,161963 3207,162704 3207,163057 3207,163480 3207,167395 3207,175773 3207,182761 3207,182843 3207,193978 3207,193981 3207,193988 3207,193993 3207,194147 3207,194149 3207,194155 3207,194158 3207,199763 3207,200482 3207,204791 3207,215432 3207,215603 3207,218873 3207,224659 3207,224660 3207,224663 3207,224665 3207,224694 3207,224695 3207,224697 3207,224700 3207,224701 3207,224702 3207,224703 3207,224704 3207,224708 3207,224710 3207,224711 3207,224721 3207,224722 3207,224725 3207,224729 3207,224732 3207,224733 3207,224752 3207,224754 3207,224757 3207,224758 3207,225422 3207,227070 3207,228171 3207,228173 3207,228174 3207,228175 3207,228176 3207,228179 3207,228180 3207,228181 3207,228187 3207,228188 3207,228189 3207,228190 3207,228192 3207,228194 3207,228195 3207,228196 3207,228200 3207,228202 3207,228203 3207,228204 3207,228205 3207,228206 3207,228207 3207,228208 3207,228211 3207,228212 3207,228214 3207,228217 3207,228220 3207,228222 3207,228223 3207,228224 3207,228225 3207,228229 3207,228258 3207,228259 3207,228261 3207,228262 3207,228264 3207,228265 3207,228273 3207,228274 3207,228275 3207,228278 3207,228332 3207,228334 3207,228336 3207,228338 3207,228343 3207,228345 3207,228346 3207,228353 3207,228355 3207,228397 3207,228398 3207,228400 3207,228401 3207,228412 3207,228415 3207,228421 3207,228422 3207,228423 3207,228424 3207,228427 3207,228428 3207,228448 3207,228450 3207,228452 3207,228453 3207,228461 3207,228463 3207,228464 3207,228465 3207,228478 3207,228479 3207,228481 3207,228868 3207,228869 3207,228871 3207,228872 3207,228874 3207,228875 3207,228876 3207,228877 3207,228878 3207,231070 3207,239909 3207,239910 3207,239911 3207,243994 3207,251448 3208,240 3209,3209 3210,72 3211,668 3212,178 3213,72 3214,3215 3216,250 3217,151 3218,10 3218,167 3218,299 3218,522 3218,528 3218,602 3218,607 3218,633 3218,941 3218,1118 3218,1167 3218,1241 3218,1319 3218,1479 3218,1544 3218,1849 3218,2083 3218,2127 3218,2193 3218,2251 3218,2372 3218,2689 3218,3049 3218,3218 3218,3630 3218,3991 3218,4303 3218,5662 3218,5788 3218,6798 3218,7612 3218,7744 3218,7759 3218,8504 3218,8684 3218,9702 3218,14264 3218,14913 3218,28289 3218,28869 3218,31426 3218,31595 3218,32527 3218,33083 3218,36955 3218,40675 3218,40964 3218,42980 3218,45399 3218,45853 3218,48455 3218,50934 3218,60088 3218,65419 3218,109877 3218,124847 3218,124990 3218,127236 3218,143481 3218,146368 3218,147883 3218,159509 3218,168296 3218,170551 3218,171064 3218,178624 3218,184730 3218,186166 3218,189207 3219,760 3220,30 3221,147 3221,149 3221,264 3221,289 3221,290 3221,1011 3221,2296 3221,94134 3221,118336 3222,264 3222,1381 3222,152358 3223,2931 3224,671 3224,1789 3225,2506 3226,3227 3228,22 3229,332 3229,3230 3231,2867 3231,2868 3232,267 3233,1 3233,83 3233,160 3234,222 3234,634 3234,1871 3234,2701 3235,3236 3237,86 3237,104 3237,140 3237,192 3237,227 3237,252 3237,287 3237,318 3237,349 3237,358 3237,383 3237,393 3237,417 3237,435 3237,444 3237,515 3237,586 3237,605 3237,622 3237,626 3237,697 3237,718 3237,726 3237,752 3237,934 3237,973 3237,1052 3237,1102 3237,1122 3237,1175 3237,1241 3237,1265 3237,1266 3237,1309 3237,1381 3237,1436 3237,1467 3237,1551 3237,1590 3237,1634 3237,1639 3237,1715 3237,1767 3237,1837 3237,1849 3237,1877 3237,1893 3237,2434 3237,3238 3237,3252 3237,3538 3237,4453 3237,4549 3237,5662 3237,5987 3237,7572 3237,8798 3237,9015 3237,9098 3237,32784 3237,41170 3237,141912 3239,79 3240,434 3240,435 3240,766 3240,939 3240,2094 3240,3241 3240,4646 3240,8477 3240,17421 3240,17424 3240,17425 3240,17426 3240,17429 3240,17430 3240,17431 3240,17432 3240,120052 3240,121505 3240,188523 3241,439 3241,571 3241,671 3241,868 3241,1449 3241,3474 3242,72 3243,147 3243,149 3243,264 3243,1011 3244,250 3245,3246 3245,3247 3246,3246 3246,3247 3247,30 3247,104 3247,134 3247,136 3247,137 3247,849 3247,850 3247,1011 3247,1235 3247,1332 3247,1335 3247,1368 3247,2105 3247,3246 3247,5405 3248,1179 3249,843 3249,1844 3250,200 3250,240 3250,2089 3250,2940 3251,424 3252,385 3252,660 3252,949 3252,1072 3252,2159 3252,6506 3252,6611 3252,13230 3252,13240 3252,20605 3252,37088 3252,40821 3252,52381 3252,52511 3252,78762 3252,79430 3252,97183 3253,3254 3255,406 3255,779 3256,34 3256,35 3256,79 3256,158 3256,192 3256,217 3256,222 3256,283 3256,326 3256,388 3256,455 3256,536 3256,657 3256,779 3256,868 3256,873 3256,949 3256,1001 3256,1010 3256,1019 3256,1072 3256,1274 3256,1370 3256,1429 3256,1454 3256,1466 3256,1467 3256,1531 3256,1644 3256,1722 3256,2244 3256,2266 3256,2671 3256,2797 3256,2989 3256,2991 3256,4672 3256,5265 3256,5343 3256,5976 3256,7092 3256,13546 3256,14819 3256,29380 3256,55585 3257,3258 3258,87 3258,256 3258,510 3258,623 3258,808 3258,852 3258,872 3258,911 3258,1240 3258,1370 3258,1805 3258,1949 3258,2253 3258,6424 3258,19010 3258,28107 3259,202 3259,203 3259,392 3259,3260 3260,87 3260,314 3260,599 3260,623 3260,673 3260,794 3260,838 3260,843 3260,852 3260,919 3260,1014 3260,1240 3260,1262 3260,1465 3260,1559 3260,1805 3260,1860 3260,1973 3260,4760 3260,6059 3262,1143 3263,644 3263,1559 3263,2699 3264,323 3265,135 3265,137 3265,138 3266,269 3267,134 3268,2775 3269,447 3270,2775 3271,1509 3272,447 3273,2775 3274,447 3275,217 3275,301 3275,304 3275,589 3275,631 3275,752 3275,932 3275,968 3275,1001 3275,1010 3275,1085 3275,1122 3275,1433 3275,1715 3276,30 3276,137 3276,772 3276,1282 3276,1332 3277,920 3278,143 3279,86 3279,595 3279,818 3279,985 3279,1313 3279,81648 3280,171 3281,72 3282,344 3283,285 3284,1390 3284,142870 3285,10 3285,693 3285,907 3285,3507 3285,6424 3287,338 3287,525 3287,1893 3287,4039 3288,1801 3289,932 3290,7 3290,41 3290,50 3290,58 3290,63 3290,97 3290,178 3290,222 3290,227 3290,269 3290,285 3290,289 3290,290 3290,355 3290,356 3290,358 3290,422 3290,442 3290,467 3290,516 3290,577 3290,596 3290,640 3290,805 3290,808 3290,841 3290,843 3290,918 3290,932 3290,972 3290,1012 3290,1085 3290,1425 3290,1531 3290,1571 3290,1634 3290,1639 3290,1818 3290,2572 3290,2620 3290,3209 3290,3246 3290,3247 3290,3370 3290,3507 3290,6556 3290,9015 3290,14453 3290,19010 3290,115659 3290,144988 3290,147123 3291,1265 3291,1266 3292,3293 3294,424 3294,1639 3294,1801 3294,3295 3294,3296 3295,3295 3297,3111 3298,292 3298,1010 3299,143 3300,332 3300,2797 3300,3319 3300,3328 3300,3331 3301,104 3302,19 3303,592 3303,2797 3304,312 3305,675 3306,406 3306,622 3306,1001 3306,1289 3306,3999 3307,1368 3307,22836 3308,3309 3310,104 3311,247 3312,3313 3312,38053 3314,417 3314,589 3314,1001 3314,1085 3314,2296 3314,2590 3315,1 3318,1014 3319,1807 3320,3321 3322,93 3322,94 3323,788 3324,392 3325,424 3326,973 3327,328 3328,240 3328,332 3328,685 3328,808 3328,1285 3328,1361 3328,2512 3328,3135 3328,3328 3328,4771 3328,5419 3328,24307 3328,37515 3328,44070 3328,45127 3328,45714 3328,54448 3328,57161 3328,62419 3328,88074 3328,184908 3328,195972 3328,251481 3328,258939 3329,563 3330,536 3332,599 3333,52 3334,175 3335,175 3335,140270 3335,212234 3336,3337 3338,1509 3339,175 3340,3182 3341,323 3342,3343 3344,3345 3346,79 3346,704 3346,1433 3347,269 3348,323 3349,872 3350,83 3351,1231 3351,1326 3351,1411 3352,920 3353,83 3354,54 3354,221301 3355,1368 3356,3357 3356,33291 3356,91840 3356,105871 3356,110643 3356,113283 3356,117414 3358,328 3359,3360 3361,406 3362,457 3362,497 3363,323 3364,126 3365,872 3366,3367 3367,3 3367,292 3367,314 3367,338 3367,389 3367,392 3367,457 3367,509 3367,510 3367,623 3367,661 3367,663 3367,664 3367,693 3367,697 3367,852 3367,875 3367,903 3367,1011 3367,1043 3367,1238 3367,1345 3367,1424 3367,1572 3367,1584 3367,1623 3367,1722 3367,1805 3367,1992 3367,2045 3367,2191 3367,2228 3367,2824 3367,3366 3367,3367 3367,3407 3367,3713 3367,3743 3367,3757 3367,3955 3367,4740 3367,5043 3367,5258 3367,5540 3367,7401 3367,8041 3367,9756 3367,12716 3367,13905 3367,15582 3367,16667 3367,17719 3367,21607 3367,21931 3367,22939 3367,24616 3367,25673 3367,26051 3367,27814 3367,29595 3367,31080 3367,31576 3367,32645 3367,33338 3367,33830 3367,34116 3367,35978 3367,36720 3367,41774 3367,42476 3367,42575 3367,43233 3367,45715 3367,46165 3367,46321 3367,46339 3367,49362 3367,50173 3367,51977 3367,52488 3367,54341 3367,54979 3367,63079 3367,63138 3367,63375 3367,70833 3367,71184 3367,80542 3367,82294 3367,82961 3367,91641 3367,96538 3367,102695 3367,104565 3367,111189 3367,111288 3367,111405 3367,112910 3367,113083 3367,113094 3367,113131 3367,115337 3367,116747 3367,116753 3367,122807 3367,128144 3367,128637 3367,133188 3367,138174 3367,138183 3367,138824 3367,139660 3367,139942 3367,140082 3367,142508 3367,146837 3367,163848 3367,174514 3367,174519 3367,175093 3367,176233 3367,176379 3367,185305 3367,186020 3367,186250 3367,194468 3367,195128 3367,216419 3367,221105 3367,222679 3367,225334 3367,249545 3367,250105 3367,254499 3367,254930 3367,255217 3367,258275 3368,10 3368,11 3368,79 3368,83 3368,203 3368,251 3368,252 3368,323 3368,435 3368,485 3368,516 3368,718 3368,920 3368,1181 3368,1222 3368,3370 3368,4831 3368,5213 3368,9179 3368,9191 3368,9208 3369,389 3369,1363 3369,1467 3369,1881 3369,2266 3369,2421 3370,56 3370,146 3370,192 3370,336 3370,406 3370,663 3370,664 3370,841 3370,1309 3370,1623 3370,1663 3370,106502 3371,192 3372,298 3373,485 3374,323 3375,94 3375,2787 3376,422 3376,602 3377,682 3377,1512 3377,72439 3377,181063 3378,97 3378,5101 3378,15119 3379,301 3379,604 3379,968 3379,1231 3379,1782 3380,3381 3380,217162 3382,233 3383,707 3384,63 3385,54 3385,2775 3386,160 3386,720 3386,22293 3387,1801 3388,3389 3390,663 3390,664 3391,376 3392,46 3392,86 3392,126 3392,299 3392,314 3392,397 3392,444 3392,452 3392,457 3392,505 3392,567 3392,599 3392,663 3392,673 3392,676 3392,750 3392,783 3392,838 3392,849 3392,852 3392,972 3392,1010 3392,1011 3392,1014 3392,1026 3392,1118 3392,1130 3392,1167 3392,1262 3392,1284 3392,1293 3392,1298 3392,1417 3392,1436 3392,1566 3392,1616 3392,1635 3392,1732 3392,1849 3392,1891 3392,2310 3392,2562 3392,2979 3392,3392 3392,3625 3392,4066 3392,4190 3392,6824 3392,6904 3392,9457 3392,18604 3392,19413 3392,67099 3392,83327 3392,90082 3392,90619 3392,131211 3392,142816 3392,152298 3392,161152 3392,163782 3392,163804 3392,207659 3392,215874 3392,216170 3392,227061 3392,238636 3392,246092 3392,249055 3392,254235 3393,8 3394,707 3395,219 3396,1801 3397,240 3397,301 3397,1796 3397,2812 3398,259 3398,336 3398,1163 3399,323 3400,392 3400,697 3400,3003 3401,875 3402,72 3402,147 3402,192 3402,586 3402,640 3402,1181 3402,1231 3402,4192 3402,4193 3403,622 3403,1033 3404,783 3405,32 3405,54 3405,56 3405,79 3405,102 3405,160 3405,182 3405,299 3405,301 3405,312 3405,372 3405,388 3405,415 3405,452 3405,483 3405,596 3405,609 3405,644 3405,687 3405,736 3405,770 3405,875 3405,891 3405,968 3405,972 3405,1192 3405,1298 3405,1556 3405,1616 3405,1653 3405,1749 3405,1881 3405,2421 3405,2646 3405,3003 3405,3209 3405,3623 3405,3830 3405,4760 3405,4903 3407,58 3407,192 3407,211 3407,248 3407,296 3407,366 3407,518 3407,752 3407,760 3407,775 3407,801 3407,907 3407,1113 3407,1177 3407,1326 3407,1411 3407,1531 3407,1893 3407,2006 3407,2334 3407,3367 3407,5130 3407,7155 3407,73570 3407,220502 3408,358 3408,3409 3410,222 3410,278 3410,349 3410,389 3410,577 3410,1871 3411,140 3411,163 3411,264 3411,515 3411,647 3411,1381 3411,1509 3411,2260 3412,3413 3413,3413 3415,26 3415,59 3416,389 3416,1858 3417,4 3417,5 3417,259 3417,750 3417,762 3418,72 3419,2116 3420,68 3420,467 3420,493 3421,698 3422,10 3422,22 3422,37 3422,46 3422,299 3422,301 3422,314 3422,356 3422,444 3422,567 3422,599 3422,604 3422,615 3422,663 3422,664 3422,685 3422,698 3422,717 3422,720 3422,775 3422,783 3422,818 3422,852 3422,877 3422,910 3422,911 3422,937 3422,968 3422,973 3422,1011 3422,1122 3422,1160 3422,1167 3422,1231 3422,1241 3422,1262 3422,1276 3422,1284 3422,1293 3422,1300 3422,1359 3422,1522 3422,1544 3422,1566 3422,1732 3422,1740 3422,1782 3422,1831 3422,1849 3422,2085 3422,2193 3422,2979 3422,3207 3422,3422 3422,3756 3422,4018 3422,4291 3422,4523 3422,5662 3422,6910 3422,7774 3422,7787 3422,8342 3422,8679 3422,9340 3422,9561 3422,14095 3422,14598 3422,15109 3422,15588 3422,16192 3422,25273 3422,25342 3422,26161 3422,27482 3422,28487 3422,30353 3422,30367 3422,33016 3422,33296 3422,33735 3422,38217 3422,39506 3422,42598 3422,50338 3422,55888 3422,57125 3422,57127 3422,57197 3422,62983 3422,72726 3422,73355 3422,75394 3422,80060 3422,82175 3422,85946 3422,87367 3422,94255 3422,95400 3422,96685 3422,96827 3422,97152 3422,102565 3422,120021 3422,120155 3422,131889 3422,136109 3422,142936 3422,144130 3422,160373 3422,164370 3422,164836 3422,170448 3422,174868 3422,175325 3422,178819 3422,179039 3422,179851 3422,181028 3422,189303 3422,207757 3422,221828 3422,226450 3422,232802 3422,233386 3422,261792 3423,1607 3424,1983 3425,392 3425,1143 3425,1363 3426,269 3427,32 3428,605 3428,968 3428,2944 3429,1267 3430,206 3431,1 3431,195 3431,202 3431,203 3431,563 3431,994 3431,1247 3431,3161 3433,3434 3436,217 3436,309 3436,310 3436,314 3436,440 3436,467 3436,868 3436,1433 3436,3744 3437,717 3437,1284 3437,1782 3438,996 3439,65 3440,430 3441,160 3442,158 3442,779 3442,1515 3443,392 3443,433 3443,1634 3444,206 3445,920 3445,1414 3446,3447 3448,106 3448,192 3448,1388 3449,1 3449,50 3449,147 3449,158 3449,192 3449,406 3449,620 3449,779 3449,835 3449,1181 3449,42064 3449,68069 3449,102560 3449,149534 3450,3451 3450,3452 3452,202 3452,1243 3453,130 3453,140 3453,264 3453,479 3453,515 3453,809 3453,835 3453,1052 3453,1381 3453,1551 3453,1579 3453,1659 3453,1893 3453,1968 3454,647 3454,1175 3455,167 3455,186 3455,390 3455,694 3455,801 3455,877 3455,907 3455,972 3455,973 3455,1001 3455,1140 3455,1284 3455,1326 3455,1715 3455,1732 3455,1837 3455,2646 3455,4222 3456,811 3457,41 3457,784 3457,1564 3457,1888 3457,2620 3457,258887 3458,1639 3459,2367 3460,3461 3462,671 3462,1544 3463,444 3464,760 3464,1631 3466,3467 3467,2285 3467,3467 3467,62151 3467,101474 3468,602 3468,707 3469,37 3470,1247 3471,298 3472,485 3473,58 3473,328 3473,510 3473,557 3473,596 3473,634 3473,784 3473,1052 3473,1177 3473,1368 3473,2701 3473,3474 3473,29008 3474,58 3474,87 3474,104 3474,292 3474,356 3474,441 3474,599 3474,609 3474,676 3474,784 3474,911 3474,1653 3474,1796 3474,1893 3474,1973 3474,2373 3474,2436 3474,2443 3474,3507 3474,4771 3474,95554 3475,19 3475,808 3475,1639 3476,358 3477,397 3477,720 3477,980 3477,1117 3478,838 3479,1227 3479,1229 3479,86416 3480,119 3481,46 3481,58 3481,3482 3481,3488 3481,4104 3481,4128 3481,8956 3481,15720 3481,20275 3481,20865 3481,22260 3481,22263 3481,22267 3481,24985 3481,25531 3481,26828 3481,29568 3481,34711 3481,39397 3481,54300 3481,54329 3481,59631 3481,62246 3481,63905 3481,65857 3481,73241 3481,78707 3481,80384 3481,83452 3481,83823 3481,83826 3481,86382 3481,88339 3481,89898 3481,91434 3481,97136 3481,98209 3481,103060 3481,109816 3481,112783 3481,112784 3481,112785 3481,113047 3481,115043 3481,118238 3481,125028 3481,125031 3481,125876 3481,127162 3481,128754 3481,134102 3481,135913 3481,136985 3481,140331 3481,142849 3481,152865 3481,163743 3481,163745 3481,167178 3481,167179 3481,167180 3481,167181 3481,170615 3481,173661 3481,173662 3481,177250 3481,183264 3481,183269 3481,183270 3481,183271 3481,185845 3481,186540 3481,187018 3481,189105 3481,189731 3481,191171 3481,191172 3481,191173 3481,192319 3481,213977 3481,218343 3481,218792 3483,292 3483,338 3483,509 3483,710 3483,745 3483,850 3483,1715 3483,1722 3483,2512 3483,4039 3483,9024 3484,2319 3485,275 3485,277 3486,137 3487,397 3489,58 3490,577 3490,1429 3491,306 3491,307 3492,3493 3494,360 3494,467 3494,872 3494,1572 3494,1893 3494,3538 3495,1010 3496,264 3496,292 3496,338 3496,462 3496,850 3496,1130 3496,1332 3496,1572 3496,2367 3496,4039 3496,4771 3496,49057 3497,111 3497,167 3497,326 3497,392 3497,467 3497,510 3497,589 3497,872 3497,968 3497,1210 3497,1284 3497,1801 3497,2557 3497,2979 3498,644 3499,1467 3500,2668 3500,8270 3501,143 3502,2073 3503,3 3503,304 3503,347 3503,1773 3504,135 3504,137 3504,186 3504,240 3504,294 3504,328 3504,431 3504,518 3504,557 3504,596 3504,631 3504,634 3504,772 3504,784 3504,805 3504,808 3504,862 3504,943 3504,1052 3504,1284 3504,1309 3504,1368 3504,1564 3504,1732 3504,2512 3504,2701 3504,3474 3504,75912 3505,83 3505,126 3506,65 3507,10 3507,20 3507,34 3507,35 3507,87 3507,140 3507,167 3507,192 3507,202 3507,207 3507,248 3507,278 3507,283 3507,294 3507,301 3507,313 3507,332 3507,333 3507,337 3507,346 3507,356 3507,372 3507,389 3507,392 3507,393 3507,406 3507,425 3507,442 3507,446 3507,452 3507,455 3507,457 3507,509 3507,510 3507,516 3507,572 3507,590 3507,622 3507,623 3507,626 3507,631 3507,636 3507,640 3507,673 3507,685 3507,693 3507,697 3507,704 3507,775 3507,779 3507,795 3507,838 3507,841 3507,843 3507,849 3507,872 3507,907 3507,911 3507,929 3507,932 3507,949 3507,973 3507,992 3507,1001 3507,1007 3507,1014 3507,1021 3507,1085 3507,1118 3507,1133 3507,1140 3507,1172 3507,1175 3507,1240 3507,1241 3507,1267 3507,1276 3507,1284 3507,1309 3507,1326 3507,1392 3507,1411 3507,1434 3507,1453 3507,1454 3507,1467 3507,1515 3507,1522 3507,1551 3507,1566 3507,1696 3507,1715 3507,1722 3507,1796 3507,1818 3507,1844 3507,1848 3507,1881 3507,1891 3507,1927 3507,1955 3507,1973 3507,2008 3507,2045 3507,2173 3507,2421 3507,2607 3507,2726 3507,2744 3507,2752 3507,2979 3507,3182 3507,3285 3507,3407 3507,3804 3507,3944 3507,4327 3507,4367 3507,5115 3507,5265 3507,5440 3507,6748 3507,7087 3507,7928 3507,8243 3507,8563 3507,12883 3507,13207 3507,13473 3507,14256 3507,14379 3507,14674 3507,15217 3507,15658 3507,17364 3507,20767 3507,21528 3507,23087 3507,27517 3507,29078 3507,30770 3507,31207 3507,31212 3507,31322 3507,32644 3507,32819 3507,35895 3507,38394 3507,39509 3507,39570 3507,40498 3507,43670 3507,44205 3507,44981 3507,49498 3507,52902 3507,55054 3507,63081 3507,64295 3507,66411 3507,66593 3507,71018 3507,71305 3507,75912 3507,76996 3507,77671 3507,81311 3507,84459 3507,88542 3507,93521 3507,93533 3507,93536 3507,93541 3507,93542 3507,93588 3507,94939 3507,110883 3507,114159 3507,115971 3507,119270 3507,124368 3507,129777 3507,130752 3507,136631 3507,137119 3507,146278 3507,146395 3507,150136 3507,152420 3507,155019 3507,155654 3507,163515 3507,175246 3507,175984 3507,180286 3507,217550 3507,236754 3507,242367 3507,247758 3508,104 3508,134 3508,240 3508,289 3508,290 3508,631 3508,636 3508,714 3508,760 3508,1149 3508,1462 3508,2205 3508,2206 3508,4237 3508,8180 3508,8537 3508,33424 3508,94134 3509,811 3509,900 3509,1805 3509,2460 3509,4760 3510,3511 3513,146 3513,313 3513,467 3513,685 3513,733 3513,862 3513,900 3513,1070 3513,1220 3513,1222 3513,2460 3513,6119 3513,26450 3513,92476 3514,577 3515,620 3516,207 3517,694 3517,3623 3519,272 3519,991 3519,1070 3520,72 3521,344 3522,285 3523,222 3524,20 3524,126 3524,178 3524,207 3524,222 3524,240 3524,259 3524,299 3524,336 3524,397 3524,441 3524,452 3524,455 3524,456 3524,510 3524,676 3524,685 3524,794 3524,808 3524,838 3524,911 3524,972 3524,1021 3524,1089 3524,1191 3524,1204 3524,1240 3524,1267 3524,1293 3524,1402 3524,1445 3524,1559 3524,1663 3524,1677 3524,1927 3524,1992 3524,2253 3524,2512 3524,2704 3524,2923 3524,3392 3524,3945 3524,3948 3524,4114 3524,4190 3524,4276 3524,5570 3524,6824 3524,7845 3524,7849 3524,7906 3524,8231 3524,8282 3524,8293 3524,8676 3524,20553 3524,22434 3524,26450 3524,29753 3524,30547 3524,31111 3524,32885 3524,34030 3524,34229 3524,34286 3524,34553 3524,40497 3524,41344 3524,42615 3524,42753 3524,50150 3524,55623 3524,63412 3524,64542 3524,75912 3524,91247 3524,99060 3524,99644 3524,101842 3524,161203 3524,174780 3524,176746 3524,178911 3524,182786 3524,184392 3524,188661 3524,207659 3524,214663 3524,216085 3525,783 3528,2173 3529,397 3529,516 3530,143 3531,1634 3532,1785 3534,397 3535,134 3535,192 3535,712 3536,48 3536,107 3536,192 3536,206 3536,328 3536,366 3536,452 3536,481 3536,596 3536,743 3536,827 3536,949 3536,1113 3536,1127 3536,1240 3536,1415 3536,1419 3536,1453 3536,1465 3536,1509 3536,1860 3536,1882 3536,2353 3536,3623 3536,3695 3536,5718 3536,27550 3536,103860 3538,30 3538,107 3538,111 3538,130 3538,175 3538,227 3538,338 3538,441 3538,446 3538,462 3538,502 3538,685 3538,805 3538,903 3538,911 3538,1011 3538,1014 3538,1146 3538,1151 3538,1238 3538,1572 3538,1688 3538,1722 3538,1758 3538,1978 3538,2194 3538,2582 3538,2802 3538,3494 3538,3507 3538,3538 3538,3539 3538,3830 3538,4039 3538,4114 3538,4520 3538,4771 3538,5498 3538,5608 3538,6896 3538,7085 3538,13538 3538,13625 3538,14353 3538,15493 3538,16562 3538,17173 3538,18299 3538,19579 3538,19595 3538,20738 3538,21004 3538,21133 3538,21334 3538,22535 3538,22576 3538,26051 3538,26084 3538,28478 3538,28977 3538,29760 3538,31067 3538,32819 3538,32848 3538,32978 3538,33585 3538,34906 3538,35710 3538,35721 3538,36300 3538,36841 3538,37498 3538,38279 3538,40486 3538,41173 3538,42094 3538,42114 3538,43170 3538,50254 3538,50695 3538,52811 3538,55964 3538,59396 3538,61780 3538,62499 3538,62506 3538,63490 3538,67986 3538,71081 3538,74698 3538,75199 3538,82299 3538,87133 3538,88705 3538,92354 3538,98377 3538,99750 3538,100309 3538,105615 3538,105868 3538,106237 3538,106796 3538,107366 3538,108767 3538,113577 3538,118518 3538,123201 3538,124164 3538,124210 3538,135424 3538,138028 3538,144178 3538,144730 3538,145134 3538,147526 3538,147697 3538,153883 3538,155997 3538,165221 3538,165431 3538,171171 3538,172107 3538,176555 3538,176814 3538,178827 3538,179743 3538,180972 3538,182895 3538,185537 3538,189361 3538,189982 3538,192342 3538,215449 3538,215929 3538,227227 3538,236291 3538,252027 3538,256410 3538,259346 3539,147 3539,644 3539,805 3539,1927 3539,3538 3541,491 3542,222 3543,366 3543,500 3544,1007 3544,1515 3545,292 3546,1043 3547,267 3548,65 3549,3550 3551,634 3552,1033 3553,626 3554,1096 3554,3555 3555,11 3555,111 3555,211 3555,217 3555,911 3555,1096 3555,1796 3555,2704 3555,3554 3555,3555 3555,5089 3555,5144 3555,5254 3555,7117 3555,8072 3555,13217 3555,14388 3555,39487 3555,46695 3555,58245 3555,62245 3555,75196 3555,86588 3555,101528 3555,146005 3555,159690 3555,189695 3555,215912 3555,244009 3556,744 3557,182 3557,309 3557,310 3557,3039 3558,344 3559,397 3559,868 3560,444 3560,968 3562,346 3563,1068 3564,567 3565,30 3565,134 3565,175 3565,233 3565,248 3565,289 3565,290 3565,304 3565,328 3565,440 3565,450 3565,622 3565,693 3565,704 3565,714 3565,760 3565,772 3565,953 3565,1085 3565,1179 3565,1282 3565,1305 3565,1402 3565,1415 3565,1818 3565,1939 3565,1973 3565,2206 3565,2210 3565,2286 3565,2315 3565,4218 3565,4237 3565,4941 3565,5405 3565,7757 3565,8180 3565,28203 3565,33424 3565,95674 3565,111142 3565,141912 3566,192 3566,760 3566,1119 3566,1631 3567,783 3567,1294 3568,1127 3569,65 3569,66 3569,467 3569,868 3569,1433 3569,3744 3570,347 3570,953 3570,1309 3570,1462 3570,1893 3570,7757 3571,56 3571,147 3571,158 3571,192 3571,1181 3571,118336 3571,240174 3572,298 3573,485 3574,2411 3575,46 3575,744 3575,1124 3576,439 3576,1612 3576,1776 3576,1877 3577,818 3578,151 3578,801 3578,818 3578,862 3578,1803 3578,2979 3579,195 3580,240 3580,301 3580,968 3581,3582 3582,252 3582,397 3582,849 3582,1014 3582,1445 3582,1566 3582,1968 3582,2085 3582,3581 3582,3582 3582,4190 3582,5192 3582,9457 3582,34208 3582,46303 3582,59689 3582,63866 3582,65760 3582,66563 3582,75912 3582,90079 3582,120155 3582,181590 3582,195998 3582,216403 3582,223726 3582,223931 3582,224625 3582,225590 3582,230382 3582,240144 3582,243669 3582,246015 3582,249653 3582,250780 3582,261745 3583,920 3583,1877 3584,54 3584,278 3584,304 3584,577 3584,589 3584,626 3584,752 3584,1151 3584,1309 3584,1479 3584,1634 3584,1871 3584,2421 3584,3507 3584,3585 3584,9015 3584,14483 3585,104 3585,225 3585,312 3585,515 3585,953 3585,991 3585,1267 3585,1285 3585,1298 3585,1326 3585,1659 3585,1749 3585,2605 3585,2744 3585,3585 3585,5130 3586,104 3586,862 3587,1429 3588,1474 3589,340 3589,811 3590,254 3590,312 3590,338 3590,525 3590,784 3590,1749 3590,1882 3590,49057 3591,577 3592,406 3592,779 3593,158 3593,406 3593,1181 3594,1388 3595,2460 3596,1007 3598,344 3599,312 3599,510 3599,525 3600,875 3601,3602 3602,3602 3603,83 3603,788 3604,273 3604,274 3605,497 3606,1332 3607,372 3607,1955 3608,306 3608,307 3609,79 3609,192 3609,1014 3609,1732 3610,818 3610,2620 3611,34 3611,222 3611,283 3611,631 3611,1698 3611,6424 3611,25275 3611,117696 3613,104 3613,134 3613,135 3613,136 3613,137 3613,138 3613,557 3613,1368 3614,718 3615,302 3616,140 3618,37 3619,1309 3619,1745 3619,2205 3619,33424 3620,264 3620,1509 3620,1551 3620,3041 3621,431 3621,442 3622,515 3623,417 3623,589 3623,685 3623,694 3623,715 3623,795 3623,862 3623,911 3623,969 3623,1082 3623,1085 3623,1242 3623,1257 3623,2296 3623,2572 3623,2646 3623,2747 3623,2775 3623,3115 3623,3623 3623,3841 3623,3964 3623,4222 3623,7194 3623,7731 3623,13304 3623,13835 3623,14294 3623,14925 3623,18880 3623,23671 3623,26034 3623,31763 3623,42029 3623,44192 3623,44725 3623,44951 3623,48505 3623,49535 3623,51961 3623,51972 3623,59998 3623,71836 3623,71890 3623,73400 3623,75912 3623,82703 3623,83903 3623,87969 3623,88645 3623,89816 3623,93248 3623,94365 3623,96830 3623,97238 3623,97256 3623,98378 3623,99824 3623,102750 3623,108122 3623,109493 3623,116074 3623,119470 3623,122212 3623,122591 3623,128734 3623,135104 3623,138030 3623,154290 3623,155740 3623,157570 3623,166631 3623,168602 3623,169660 3623,169898 3623,172494 3623,177437 3623,178576 3623,179740 3623,180277 3623,183405 3623,183410 3623,185874 3623,185877 3623,237644 3623,244924 3623,246605 3623,261958 3624,86 3625,3392 3626,346 3626,467 3626,538 3626,671 3626,1590 3626,2353 3627,640 3629,217 3629,390 3629,615 3629,818 3629,907 3629,968 3629,1010 3629,1167 3629,1436 3629,1522 3629,1796 3629,1849 3629,2191 3629,2480 3629,3422 3629,3630 3629,3804 3629,5130 3629,72764 3630,46 3630,167 3630,299 3630,425 3630,459 3630,783 3630,852 3630,1300 3630,1522 3630,1544 3630,1849 3630,1853 3630,1949 3630,2083 3630,2192 3630,2193 3630,3630 3630,5301 3630,6032 3630,14290 3630,15291 3630,15380 3630,15463 3630,15474 3630,15588 3630,17894 3630,18863 3630,31414 3630,32784 3630,39535 3630,42767 3630,44859 3630,52862 3630,55898 3630,57180 3630,57183 3630,57411 3630,71159 3630,74635 3630,80655 3630,93188 3630,96685 3630,96855 3630,136526 3630,152474 3630,157419 3630,165919 3630,174779 3630,182909 3630,185880 3630,186497 3630,218884 3630,229082 3630,230344 3630,237368 3630,247242 3630,247269 3630,248011 3630,248018 3630,249687 3630,249695 3630,258192 3630,260183 3631,104 3631,557 3631,953 3631,954 3631,5405 3632,360 3632,473 3633,225 3633,248 3633,943 3633,1332 3633,5405 3634,718 3634,893 3635,579 3636,657 3636,6955 3637,202 3637,203 3637,28755 3638,647 3638,1175 3639,875 3640,3193 3641,309 3641,310 3641,483 3641,6556 3642,63 3643,313 3643,2421 3644,8 3644,5034 3645,712 3646,222 3646,657 3646,2421 3646,2424 3647,675 3648,338 3648,360 3648,835 3648,872 3648,1224 3648,1659 3648,2051 3648,13538 3648,81070 3649,48 3649,160 3649,827 3649,1509 3649,1639 3650,1466 3651,493 3652,1058 3652,3653 3653,256 3653,491 3653,668 3653,676 3653,827 3653,849 3653,852 3653,1087 3653,2460 3653,3653 3653,4190 3653,5192 3654,328 3654,1179 3655,3656 3655,26062 3655,36135 3655,36592 3655,42155 3655,47683 3655,57843 3655,58611 3655,60903 3655,63971 3655,65891 3657,72 3658,2353 3659,2353 3660,1235 3660,1335 3664,2353 3665,2353 3668,1058 3668,13538 3669,337 3669,577 3670,422 3671,346 3671,439 3671,1033 3671,1789 3672,34 3672,35 3672,134 3672,187 3672,217 3672,222 3672,283 3672,289 3672,290 3672,455 3672,536 3672,631 3672,657 3672,1010 3672,1019 3672,1210 3672,1282 3672,1417 3672,1467 3672,1635 3672,1801 3672,2266 3672,2646 3672,3182 3672,6424 3672,20771 3672,94134 3672,115474 3673,422 3674,422 3675,2205 3675,2206 3675,33424 3676,422 3677,720 3677,980 3678,2105 3679,422 3680,2353 3681,79 3681,192 3681,579 3681,589 3681,868 3681,1425 3681,6119 3682,772 3682,1388 3684,269 3685,431 3685,1252 3685,1253 3686,222 3686,379 3686,399 3686,634 3686,657 3686,2646 3686,5591 3687,972 3687,1010 3687,1849 3687,32784 3688,32 3688,206 3689,1368 3690,673 3691,66 3692,718 3693,1359 3694,631 3694,760 3694,1402 3694,1531 3694,1631 3695,48 3695,72 3695,758 3695,1011 3695,1267 3695,1639 3695,2253 3695,2775 3695,3538 3695,3695 3695,155473 3696,22 3696,652 3696,3769 3696,3804 3697,3698 3698,3700 3698,3712 3698,4561 3698,22005 3698,55237 3698,62996 3698,90667 3698,91232 3698,91827 3698,98048 3698,101821 3698,102854 3698,136631 3698,254266 3698,263073 3699,697 3699,809 3699,1240 3701,1243 3702,671 3704,422 3705,422 3706,422 3707,422 3708,422 3709,2315 3709,2775 3710,422 3711,302 3711,2116 3713,852 3713,1722 3713,3367 3713,21982 3714,615 3715,431 3715,631 3715,1119 3715,185877 3716,818 3717,358 3717,611 3718,106 3718,186 3718,518 3718,775 3718,1326 3718,1411 3718,1837 3718,3804 3718,5961 3718,190492 3719,248 3719,450 3719,1332 3720,30 3721,875 3721,1117 3721,1262 3722,81 3722,273 3722,274 3722,338 3722,626 3722,862 3722,1085 3722,1433 3722,1465 3722,1556 3722,1634 3722,1881 3722,2367 3722,2528 3722,3041 3722,5718 3722,9015 3723,3724 3724,259 3724,911 3724,980 3724,3724 3724,7921 3724,8007 3724,15179 3724,15988 3724,18618 3724,20232 3724,39378 3724,41179 3724,44900 3724,63495 3724,74457 3724,74532 3724,76038 3724,104325 3724,125488 3724,126697 3724,140307 3724,145462 3725,415 3726,20 3726,315 3727,30 3727,366 3727,805 3727,1177 3727,2210 3727,4237 3727,6556 3727,182162 3728,22 3728,861 3729,34 3729,35 3729,1078 3729,1313 3729,1618 3729,2944 3729,3729 3729,4223 3729,7768 3729,13137 3729,19443 3730,718 3731,675 3732,1345 3733,143 3734,1010 3734,1122 3735,272 3736,3003 3737,72 3738,240 3738,1818 3739,1673 3741,392 3742,399 3742,40566 3743,30 3743,278 3743,328 3743,415 3743,440 3743,509 3743,3367 3744,34 3744,65 3744,171 3744,186 3744,264 3744,302 3744,314 3744,352 3744,457 3744,467 3744,631 3744,868 3744,872 3744,1019 3744,1262 3744,1433 3744,1518 3744,1785 3744,1796 3744,1844 3744,2895 3744,3569 3744,3744 3744,4446 3744,5498 3744,5524 3744,5596 3744,5702 3744,6467 3744,7178 3744,7880 3744,8161 3744,8337 3744,12395 3744,12752 3744,16586 3744,21382 3744,21411 3744,22277 3744,26133 3744,28360 3744,34232 3745,186 3746,1323 3747,102 3748,1326 3749,408 3750,535 3751,392 3754,1837 3755,1452 3756,567 3756,663 3756,752 3756,937 3756,968 3756,1293 3756,2083 3756,2217 3756,2480 3756,2557 3756,2595 3756,3756 3756,6645 3756,36681 3756,44385 3756,48545 3756,54504 3756,88306 3756,102695 3756,107942 3756,141934 3756,151445 3756,165651 3756,167083 3756,240943 3756,263834 3757,3367 3758,408 3759,195 3759,596 3759,784 3759,1052 3760,760 3760,1149 3760,1631 3761,1849 3761,32784 3762,344 3762,710 3762,1711 3762,1836 3763,32 3763,392 3763,918 3763,1453 3763,1711 3763,3003 3763,76096 3764,875 3765,160 3767,1345 3768,3769 3770,1203 3771,372 3771,1203 3771,1955 3772,298 3773,485 3774,301 3774,615 3774,968 3774,973 3774,1001 3774,1231 3774,1241 3774,1298 3774,1436 3774,1522 3774,1564 3774,1832 3774,2083 3774,2557 3774,2979 3775,392 3775,1454 3776,760 3777,505 3778,1707 3779,417 3780,151 3781,1240 3782,1453 3782,1722 3783,861 3784,949 3784,1167 3784,2979 3786,1240 3787,143 3787,1052 3788,1949 3788,4760 3789,360 3790,397 3791,1001 3792,408 3792,2260 3792,37088 3793,390 3794,26 3794,28 3794,47 3794,59 3794,117 3794,138 3794,430 3794,446 3794,805 3794,885 3794,887 3794,994 3794,1235 3794,1255 3794,1335 3794,1432 3794,1684 3794,1775 3794,2156 3794,2469 3794,2712 3794,3561 3794,3794 3794,3795 3794,3796 3794,4114 3794,4571 3794,9537 3794,21944 3794,50943 3794,67397 3794,88820 3794,171294 3797,3798 3799,393 3799,980 3800,602 3801,1849 3801,32784 3802,71 3802,1243 3803,503 3803,631 3803,1085 3803,2206 3804,186 3804,217 3804,301 3804,452 3804,518 3804,525 3804,599 3804,764 3804,765 3804,775 3804,818 3804,838 3804,872 3804,877 3804,972 3804,973 3804,1010 3804,1118 3804,1130 3804,1284 3804,1326 3804,1411 3804,1545 3804,1566 3804,1599 3804,1796 3804,1849 3804,2006 3804,2173 3804,2373 3804,2979 3804,3507 3804,3696 3804,3718 3804,3804 3804,4213 3804,4308 3804,4411 3804,5130 3804,5382 3804,5388 3804,5589 3804,5825 3804,5961 3804,6579 3804,6776 3804,6904 3804,7222 3804,7840 3804,8177 3804,16716 3804,18494 3804,18585 3804,19387 3804,20506 3804,25565 3804,31802 3804,35095 3804,39566 3804,44913 3804,45032 3804,48006 3804,48149 3804,48418 3804,48980 3804,49839 3804,49939 3804,50164 3804,51719 3804,52927 3804,55340 3804,55707 3804,56008 3804,61090 3804,61147 3804,63566 3804,63900 3804,67017 3804,68648 3804,82462 3804,82746 3804,101955 3804,111162 3804,111954 3804,112433 3804,114682 3804,115479 3804,119896 3804,125366 3804,131945 3804,145096 3804,148034 3804,148309 3804,156945 3804,163942 3804,167569 3804,172494 3804,184791 3804,187176 3804,214915 3804,215005 3804,216055 3804,216123 3804,219185 3804,223489 3804,229695 3805,344 3806,68 3807,772 3807,15807 3808,140 3809,167 3809,301 3809,604 3809,615 3809,872 3809,968 3809,1231 3809,1293 3809,5662 3811,58 3812,356 3812,1247 3813,336 3813,1803 3813,21442 3814,240 3814,1203 3814,8541 3815,338 3815,489 3818,1732 3819,87 3819,392 3819,509 3819,595 3819,872 3819,1151 3819,1572 3819,2274 3820,138 3820,167 3820,536 3820,849 3820,862 3820,1011 3820,1085 3820,1181 3820,1837 3820,1849 3820,1871 3820,2083 3820,2210 3820,2867 3820,4237 3820,22880 3821,489 3822,431 3823,273 3823,274 3823,66754 3824,891 3825,1127 3826,1127 3827,289 3827,290 3828,217 3828,920 3828,1118 3829,240 3829,861 3829,2017 3829,3830 3830,292 3830,441 3830,581 3830,609 3830,745 3830,852 3830,1238 3830,1424 3830,1653 3830,1677 3830,2163 3830,2201 3830,6581 3830,14353 3830,23311 3830,24500 3830,27033 3830,34709 3830,35487 3830,40947 3830,42428 3830,45883 3830,48024 3830,59664 3830,138099 3830,138102 3830,174849 3830,176040 3830,196147 3830,212367 3830,214558 3830,220899 3830,236043 3830,256442 3830,260851 3831,439 3831,671 3831,934 3831,1068 3831,1474 3831,1612 3832,240 3832,1085 3833,534 3833,1085 3834,360 3834,1224 3834,1673 3834,3177 3835,493 3835,682 3835,980 3835,72439 3835,215276 3836,467 3836,536 3836,703 3836,868 3836,1118 3836,3612 3837,1203 3837,1955 3838,240 3838,433 3838,1298 3839,26 3839,59 3839,21944 3840,104 3840,134 3840,137 3840,138 3841,534 3841,1085 3841,3623 3841,75912 3842,364 3843,192 3843,289 3843,290 3843,298 3843,1146 3843,1745 3843,94134 3844,1474 3845,3846 3847,527 3847,74541 3847,95152 3847,183859 3847,183861 3847,196039 3848,2372 3848,2557 3849,240 3850,2379 3851,3852 3853,536 3853,1433 3854,175 3855,302 3855,811 3856,893 3857,489 3857,1014 3857,1181 3858,2979 3859,344 3862,50 3862,79 3862,111 3862,147 3862,158 3862,192 3862,333 3862,346 3862,406 3862,435 3862,538 3862,622 3862,779 3862,1033 3862,1181 3862,1265 3862,1266 3862,1388 3862,2931 3862,3872 3863,1 3864,202 3864,203 3864,206 3864,4453 3865,397 3866,34 3866,35 3866,65 3866,167 3866,178 3866,186 3866,215 3866,217 3866,248 3866,252 3866,264 3866,301 3866,304 3866,309 3866,310 3866,372 3866,390 3866,392 3866,433 3866,435 3866,439 3866,444 3866,457 3866,467 3866,518 3866,536 3866,538 3866,714 3866,720 3866,784 3866,795 3866,868 3866,872 3866,932 3866,1010 3866,1085 3866,1119 3866,1133 3866,1210 3866,1300 3866,1326 3866,1522 3866,1531 3866,1715 3866,1782 3866,1796 3866,2191 3866,2646 3866,2979 3866,5961 3866,7194 3866,31206 3866,31896 3866,221292 3867,261 3867,760 3867,805 3867,818 3867,1353 3869,604 3869,750 3870,302 3871,167 3871,301 3871,783 3871,968 3871,1293 3871,1479 3873,41 3875,1370 3875,2782 3875,3876 3876,589 3877,56 3877,1181 3878,707 3879,240 3879,372 3879,417 3879,1564 3879,1635 3879,1818 3879,1955 3879,2205 3879,2206 3879,2296 3879,9025 3879,33424 3880,217 3880,222 3880,392 3880,595 3880,657 3880,1454 3880,1860 3880,1949 3880,2266 3880,3258 3881,397 3882,1400 3883,301 3883,968 3884,65 3884,467 3884,868 3885,1241 3886,160 3887,1400 3888,483 3889,1707 3890,77 3890,269 3891,202 3891,203 3892,473 3893,1010 3894,1058 3896,195 3896,841 3896,1181 3896,1803 3896,3370 3896,8244 3896,8329 3896,8330 3896,9394 3896,23783 3896,25555 3896,26414 3896,30331 3896,42569 3896,92476 3896,106502 3897,333 3898,1821 3898,21736 3899,273 3899,274 3901,4 3901,5 3901,10 3901,86 3901,158 3901,160 3901,209 3901,222 3901,298 3901,397 3901,422 3901,497 3901,589 3901,657 3901,760 3901,1010 3901,1019 3901,1274 3901,1572 3901,1803 3901,8270 3901,21944 3901,69829 3902,592 3903,435 3903,439 3903,1474 3903,1789 3904,200 3904,3209 3905,493 3906,264 3906,515 3906,1381 3907,1844 3908,54 3909,1749 3910,1837 3911,77 3911,269 3912,37 3912,65 3912,71 3912,272 3912,611 3912,717 3912,1070 3912,1449 3912,1782 3913,1 3914,1631 3915,1235 3915,1335 3916,392 3916,1240 3916,3260 3917,1433 3918,143 3919,137 3921,209 3921,302 3921,861 3922,50 3922,663 3922,1515 3923,505 3924,346 3924,1033 3925,534 3926,1608 3927,269 3927,1433 3928,273 3928,274 3929,1639 3930,557 3930,1844 3931,1082 3933,192 3933,336 3933,455 3933,949 3933,2646 3934,1639 3935,1579 3936,1590 3936,1644 3936,221315 3937,217 3937,240 3937,309 3937,310 3937,457 3937,483 3937,577 3937,590 3937,592 3937,623 3937,673 3937,949 3937,1010 3937,1085 3937,1118 3937,1143 3937,1417 3937,1805 3937,1818 3937,1849 3937,2253 3937,2671 3937,3039 3937,32784 3937,88653 3937,88654 3938,349 3938,392 3938,577 3939,805 3939,1149 3942,240 3942,2979 3943,158 3944,104 3944,134 3944,298 3944,417 3944,589 3944,611 3944,636 3944,805 3944,862 3944,1085 3944,1167 3944,1179 3944,1844 3944,1973 3944,2083 3944,2209 3944,3507 3944,4222 3944,5961 3944,26181 3944,75912 3945,3524 3945,4190 3946,920 3947,760 3947,1631 3948,3524 3949,2639 3949,3950 3949,9197 3949,13809 3949,20541 3949,21614 3949,29015 3949,29426 3949,31894 3949,33528 3949,37915 3949,40758 3949,44927 3949,55161 3949,56348 3949,63908 3949,75232 3949,97646 3949,113013 3949,133106 3949,136628 3949,148164 3949,148230 3949,148927 3949,158060 3949,159163 3949,161022 3949,162612 3949,165407 3949,166629 3949,168830 3949,172524 3949,177285 3949,183290 3949,189313 3949,189699 3949,192454 3949,200481 3949,215861 3949,229680 3949,249194 3949,251953 3951,107 3951,259 3951,2646 3952,1663 3953,417 3954,417 3955,120 3955,349 3955,433 3955,509 3955,1392 3955,3367 3955,7124 3956,1181 3957,932 3958,397 3959,3960 3960,3960 3961,861 3962,192 3962,256 3963,392 3963,1151 3963,1836 3964,135 3964,289 3964,290 3964,364 3964,583 3964,609 3964,694 3964,1257 3964,1359 3964,2315 3964,2775 3964,3115 3964,3623 3964,3695 3964,94134 3966,2989 3966,2991 3967,352 3967,467 3967,481 3967,497 3967,581 3967,668 3967,685 3967,712 3967,900 3967,911 3967,1118 3967,1135 3967,1172 3967,1262 3967,1402 3967,1434 3967,1603 3967,2310 3967,3967 3967,6861 3967,13814 3967,14308 3967,16413 3967,23649 3967,25598 3967,54954 3967,96334 3967,113534 3967,119990 3967,127540 3967,181951 3968,710 3969,682 3970,99 3970,278 3970,1181 3971,259 3973,312 3973,338 3973,479 3973,510 3973,525 3973,991 3973,1893 3973,2744 3974,1631 3975,225 3975,1332 3976,4 3976,65 3976,83 3976,86 3976,160 3976,167 3976,195 3976,207 3976,259 3976,269 3976,287 3976,292 3976,302 3976,306 3976,307 3976,326 3976,340 3976,355 3976,379 3976,452 3976,497 3976,581 3976,595 3976,605 3976,623 3976,626 3976,644 3976,660 3976,668 3976,675 3976,703 3976,731 3976,783 3976,877 3976,918 3976,929 3976,943 3976,985 3976,994 3976,1058 3976,1147 3976,1172 3976,1284 3976,1363 3976,1368 3976,1509 3976,1571 3976,1837 3976,1983 3976,2411 3976,2750 3976,2923 3976,5034 3976,5212 3976,6298 3976,6506 3976,7092 3976,17590 3976,17593 3976,17897 3976,18298 3976,30331 3976,142433 3976,142879 3976,144556 3976,214131 3977,146 3978,489 3979,22 3980,146 3981,209 3982,1556 3983,500 3984,1639 3985,1579 3986,1 3986,32 3986,83 3986,392 3986,644 3986,697 3986,712 3986,809 3986,1363 3986,1381 3986,1858 3986,2274 3986,2699 3986,76096 3987,178 3988,68 3988,71 3988,72 3988,280 3988,298 3988,364 3988,485 3988,611 3988,859 3988,920 3988,1370 3988,1612 3988,1821 3988,1927 3988,2590 3988,3989 3988,4220 3988,16953 3988,17245 3988,64147 3988,66297 3990,439 3990,726 3990,1294 3991,602 3991,3218 3992,972 3992,1010 3993,158 3993,328 3993,392 3993,694 3993,760 3993,818 3993,1010 3993,1962 3993,6789 3994,885 3994,1359 3994,13704 3995,611 3995,1612 3996,10 3997,99 3998,3999 3999,126 3999,256 3999,599 3999,663 3999,664 3999,843 3999,1011 3999,1130 3999,3999 4000,685 4001,143 4002,34 4002,35 4002,120 4002,217 4002,283 4002,455 4002,536 4002,694 4002,1072 4002,1466 4002,1608 4002,2266 4003,2607 4004,717 4005,489 4006,10 4006,4260 4007,222 4007,657 4007,1019 4007,2266 4007,2421 4008,366 4009,393 4010,285 4010,392 4010,406 4010,644 4010,779 4011,417 4012,1449 4013,518 4013,911 4013,1707 4014,652 4016,302 4017,1511 4017,3069 4018,301 4018,314 4018,3422 4019,143 4020,26 4020,47 4020,59 4020,60 4020,117 4020,330 4020,885 4020,887 4020,1235 4020,1335 4020,1432 4020,2469 4020,5871 4020,21944 4021,1673 4022,534 4022,1085 4022,2296 4023,3474 4024,104 4024,134 4024,135 4024,136 4024,138 4024,557 4024,1368 4024,1939 4025,2989 4025,2991 4026,489 4026,1844 4027,1858 4029,992 4029,1276 4030,477 4030,536 4030,2168 4030,7698 4030,23287 4030,57354 4031,1085 4031,1436 4032,215 4033,483 4033,827 4033,1639 4034,615 4035,206 4035,1326 4036,718 4037,392 4037,467 4037,2436 4038,1068 4039,34 4039,35 4039,107 4039,283 4039,292 4039,338 4039,441 4039,446 4039,455 4039,462 4039,510 4039,536 4039,609 4039,626 4039,801 4039,809 4039,872 4039,929 4039,978 4039,1058 4039,1078 4039,1118 4039,1151 4039,1210 4039,1326 4039,1332 4039,1417 4039,1454 4039,1479 4039,1559 4039,1572 4039,1584 4039,1659 4039,1688 4039,1715 4039,1722 4039,1758 4039,1836 4039,1845 4039,1968 4039,2181 4039,2224 4039,2367 4039,2436 4039,2646 4039,3035 4039,3252 4039,3483 4039,4565 4039,4580 4039,4771 4039,5258 4039,5604 4039,6631 4039,6880 4039,7698 4039,7993 4039,8149 4039,15339 4039,15608 4039,32819 4039,44740 4039,62156 4039,125409 4039,142367 4039,143036 4039,156292 4039,162600 4039,166487 4039,185459 4039,192643 4039,244115 4039,255640 4039,263282 4040,4041 4042,3555 4043,217 4043,1732 4045,1010 4046,46 4046,58 4046,302 4046,447 4046,850 4047,527 4048,536 4048,18831 4049,104 4049,609 4049,1140 4050,63 4050,240 4050,366 4050,489 4050,527 4050,567 4050,697 4050,1085 4050,1127 4050,1240 4050,1381 4050,2209 4051,209 4052,298 4053,485 4054,1016 4054,2674 4054,16153 4055,577 4055,1429 4056,26 4056,59 4056,885 4056,887 4056,1235 4056,1335 4056,1432 4056,21944 4057,163 4058,72 4059,4060 4060,13705 4060,39201 4061,149 4062,592 4063,760 4064,26 4064,59 4064,885 4064,887 4064,1235 4064,1335 4064,1432 4064,21944 4065,1247 4066,66 4066,87 4066,146 4066,182 4066,186 4066,192 4066,240 4066,289 4066,290 4066,347 4066,366 4066,392 4066,500 4066,808 4066,809 4066,818 4066,1052 4066,1118 4066,1119 4066,1147 4066,1197 4066,1204 4066,1220 4066,1222 4066,1298 4066,1417 4066,1445 4066,1509 4066,1566 4066,1655 4066,1659 4066,1796 4066,1836 4066,1927 4066,2224 4066,2253 4066,2775 4066,3504 4066,4066 4066,4237 4066,5186 4066,5935 4066,6695 4066,6824 4066,15582 4066,19010 4066,22293 4066,51503 4066,182162 4067,1188 4068,10 4068,485 4068,693 4068,4260 4069,462 4070,457 4071,326 4072,248 4072,450 4072,1332 4073,209 4073,138686 4074,450 4074,609 4074,1400 4074,1474 4075,261 4075,447 4075,4078 4076,34 4076,35 4076,222 4076,657 4076,1417 4077,1509 4080,2051 4080,9030 4082,1058 4083,811 4084,22 4084,192 4084,217 4084,1962 4084,6051 4085,1571 4086,104 4086,134 4086,135 4086,136 4086,137 4086,138 4086,557 4086,1368 4086,1939 4086,2105 4087,285 4087,518 4088,136 4088,346 4089,66 4090,772 4091,280 4091,577 4091,762 4091,1415 4091,17245 4092,304 4093,4094 4095,298 4096,485 4097,760 4098,515 4099,444 4099,589 4099,707 4099,1619 4099,2274 4100,1309 4101,366 4101,4101 4101,4675 4101,5681 4101,6583 4101,22182 4101,29617 4101,41266 4101,47461 4101,48791 4101,52107 4101,54258 4101,54262 4101,71568 4101,76598 4101,107097 4101,107794 4101,111033 4101,135698 4101,147043 4101,165880 4101,170138 4102,439 4102,1776 4102,1803 4102,21442 4103,147 4103,406 4103,620 4103,779 4104,596 4105,1363 4106,1068 4107,349 4107,390 4107,1564 4108,309 4108,310 4108,483 4108,2312 4108,18513 4108,30497 4109,83 4109,120 4109,158 4109,186 4109,217 4109,222 4109,264 4109,283 4109,389 4109,392 4109,433 4109,467 4109,510 4109,536 4109,657 4109,781 4109,809 4109,818 4109,868 4109,1001 4109,1274 4109,1433 4109,1796 4109,2553 4109,3804 4109,4637 4109,5343 4109,6726 4109,118336 4111,195 4112,356 4112,852 4112,2699 4112,5591 4113,885 4113,1962 4113,4114 4113,13704 4113,21944 4113,171294 4114,5 4114,24 4114,25 4114,26 4114,28 4114,33 4114,41 4114,47 4114,59 4114,60 4114,138 4114,175 4114,292 4114,441 4114,442 4114,588 4114,590 4114,599 4114,865 4114,885 4114,887 4114,994 4114,1119 4114,1227 4114,1229 4114,1235 4114,1238 4114,1252 4114,1253 4114,1255 4114,1335 4114,1415 4114,1432 4114,1572 4114,1722 4114,1775 4114,1836 4114,2088 4114,2089 4114,2469 4114,2674 4114,2940 4114,3524 4114,3538 4114,4079 4114,4113 4114,4571 4114,4748 4114,5881 4114,6621 4114,8714 4114,9537 4114,9539 4114,9542 4114,16153 4114,16614 4114,17140 4114,19893 4114,21944 4114,47540 4114,48673 4114,50943 4114,86416 4114,88820 4114,105811 4114,111142 4114,154690 4114,167349 4114,167350 4114,205627 4114,237552 4115,41 4115,805 4115,1082 4115,1149 4115,1807 4115,1888 4115,2775 4116,1 4117,710 4118,623 4118,919 4118,1860 4119,1143 4120,1801 4120,3182 4121,79 4122,500 4123,849 4124,430 4125,535 4125,536 4125,872 4125,1072 4126,134 4126,135 4126,137 4127,313 4127,326 4127,2421 4128,46 4128,58 4128,731 4128,1124 4129,991 4129,2480 4130,1210 4131,209 4131,302 4132,120 4132,392 4132,809 4132,1467 4132,1718 4132,2989 4132,2991 4133,1113 4133,1381 4134,1392 4135,609 4135,1140 4135,5547 4136,1284 4137,206 4137,240 4137,538 4137,577 4137,859 4137,980 4137,1033 4137,1181 4137,1388 4137,1531 4138,1276 4138,3698 4139,119 4140,160 4140,360 4140,510 4140,535 4140,599 4140,1287 4141,104 4141,1078 4141,1962 4142,1143 4142,1454 4142,1711 4142,1836 4142,5469 4143,1 4143,1801 4144,2116 4145,304 4145,1715 4145,4146 4146,304 4146,446 4146,843 4146,1715 4146,4145 4146,15641 4146,27119 4146,32222 4146,49341 4146,90220 4146,101665 4146,163730 4146,167589 4146,201304 4146,261753 4147,673 4147,1130 4148,304 4149,980 4149,2210 4149,4237 4149,182162 4150,252 4150,318 4150,41170 4151,1424 4152,259 4152,843 4153,66 4153,83 4153,182 4153,240 4153,302 4153,438 4153,452 4153,457 4153,497 4153,535 4153,599 4153,710 4153,794 4153,893 4153,918 4153,1118 4153,1147 4153,1188 4153,1191 4153,1192 4153,1204 4153,1417 4153,1433 4153,1663 4153,1673 4153,1722 4153,1796 4153,1844 4153,3744 4153,4165 4153,4823 4154,344 4154,360 4154,515 4154,736 4154,827 4154,835 4154,1058 4154,1127 4154,1132 4154,1551 4154,3999 4154,49057 4155,163 4155,209 4155,302 4155,579 4155,811 4155,861 4155,893 4155,1556 4155,2116 4155,3769 4156,733 4156,2424 4157,3260 4158,1434 4159,65 4159,147 4159,158 4159,195 4159,217 4159,261 4159,264 4159,301 4159,314 4159,467 4159,516 4159,577 4159,592 4159,623 4159,647 4159,868 4159,968 4159,1220 4159,1293 4159,1522 4159,1749 4159,1805 4159,2205 4159,2557 4159,2979 4159,21944 4159,33424 4160,1474 4161,171 4161,330 4161,6208 4161,6209 4162,1977 4162,1978 4163,596 4163,1001 4163,2750 4164,147 4164,158 4164,336 4164,505 4165,126 4165,256 4165,388 4165,397 4165,535 4165,1011 4165,1014 4165,1147 4165,1204 4165,1293 4165,1462 4165,1518 4165,1566 4165,1663 4165,2206 4165,2253 4165,6824 4165,16208 4165,18298 4165,183267 4166,217 4166,313 4166,385 4166,389 4166,634 4166,657 4166,1072 4166,1881 4166,2266 4166,2421 4166,13661 4166,14556 4166,37088 4167,330 4168,349 4169,1466 4169,1616 4171,389 4171,1368 4171,1801 4171,2744 4171,4172 4171,6556 4171,115659 4174,3447 4175,440 4175,794 4175,1740 4176,4177 4178,563 4178,581 4179,240 4179,1285 4179,1785 4179,2620 4179,2812 4179,13637 4179,94940 4179,95359 4179,96514 4179,96777 4179,96779 4179,101566 4179,255497 4180,302 4181,1177 4182,1082 4182,1849 4183,1298 4184,415 4184,770 4184,838 4184,918 4184,1240 4184,1454 4184,1465 4184,21982 4185,326 4185,1119 4185,1653 4185,2674 4185,3258 4185,16153 4185,72764 4186,581 4187,887 4187,2244 4188,328 4188,333 4188,440 4188,467 4188,622 4188,1033 4189,22 4190,50 4190,68 4190,207 4190,256 4190,259 4190,278 4190,304 4190,326 4190,333 4190,336 4190,356 4190,360 4190,385 4190,390 4190,397 4190,441 4190,452 4190,456 4190,457 4190,497 4190,505 4190,567 4190,634 4190,668 4190,673 4190,685 4190,697 4190,698 4190,733 4190,779 4190,838 4190,843 4190,849 4190,900 4190,911 4190,918 4190,929 4190,972 4190,1014 4190,1070 4190,1096 4190,1127 4190,1130 4190,1135 4190,1191 4190,1267 4190,1282 4190,1293 4190,1294 4190,1309 4190,1353 4190,1402 4190,1419 4190,1449 4190,1499 4190,1566 4190,1677 4190,1844 4190,1992 4190,2373 4190,2411 4190,2460 4190,2580 4190,2605 4190,2620 4190,3392 4190,3524 4190,3582 4190,3653 4190,3945 4190,4190 4190,4220 4190,5570 4190,7849 4190,7906 4190,8231 4190,8276 4190,8676 4190,9015 4190,9138 4190,12825 4190,14072 4190,14074 4190,14521 4190,20553 4190,22071 4190,23622 4190,26041 4190,26450 4190,27062 4190,27064 4190,28397 4190,28920 4190,29608 4190,29753 4190,29888 4190,30294 4190,30534 4190,30554 4190,31068 4190,32523 4190,32567 4190,32571 4190,32580 4190,32751 4190,32793 4190,32876 4190,33172 4190,34030 4190,34229 4190,34286 4190,34306 4190,34553 4190,40751 4190,40754 4190,42615 4190,42688 4190,42705 4190,42753 4190,44786 4190,46301 4190,50083 4190,50150 4190,50318 4190,55623 4190,60525 4190,60576 4190,62341 4190,81957 4190,97423 4190,114460 4190,115474 4190,118164 4190,124359 4190,134640 4190,136415 4190,136437 4190,143971 4190,161203 4190,167194 4190,173668 4190,174391 4190,178576 4190,185934 4190,190429 4190,192618 4190,198827 4190,212518 4190,212896 4190,213170 4190,213172 4190,214113 4190,222562 4190,222602 4190,229567 4190,252745 4191,83 4191,657 4192,4192 4192,4193 4193,50 4193,79 4193,147 4193,158 4193,333 4193,406 4193,778 4193,779 4193,1181 4193,1218 4193,1464 4193,1515 4193,2741 4193,2792 4193,2880 4193,2969 4193,3571 4193,5360 4193,5660 4193,6343 4193,7970 4193,8098 4193,8204 4193,8514 4193,13592 4193,16307 4193,16482 4193,16870 4193,17084 4193,17151 4193,18760 4193,20094 4193,23877 4193,23878 4193,23879 4193,23880 4193,23881 4193,23882 4193,23883 4193,23884 4193,23885 4193,23886 4193,23887 4193,23888 4193,23889 4193,23890 4193,23891 4193,23892 4193,23893 4193,23894 4193,23895 4193,23896 4193,23897 4193,23898 4193,23900 4193,23901 4193,23902 4193,23903 4193,23904 4193,23905 4193,23906 4193,23907 4193,23908 4193,23909 4193,23912 4193,23913 4193,23914 4193,23916 4193,23917 4193,23918 4193,23919 4193,23920 4193,23921 4193,23922 4193,23923 4193,23924 4193,23925 4193,23926 4193,23927 4193,23928 4193,23929 4193,23930 4193,23931 4193,23932 4193,23933 4193,23934 4193,23935 4193,23936 4193,23937 4193,23938 4193,23939 4193,23940 4193,23941 4193,23942 4193,23943 4193,23945 4193,23946 4193,23947 4193,23948 4193,23949 4193,23950 4193,23951 4193,23952 4193,23953 4193,23954 4193,23955 4193,23956 4193,23957 4193,23958 4193,23959 4193,23960 4193,23961 4193,23962 4193,23964 4193,23965 4193,23966 4193,23967 4193,23968 4193,23969 4193,23970 4193,23971 4193,23973 4193,23974 4193,23975 4193,23976 4193,23977 4193,23978 4193,23979 4193,23980 4193,23981 4193,23982 4193,23983 4193,23984 4193,23985 4193,23986 4193,23987 4193,23988 4193,23989 4193,23990 4193,23991 4193,23992 4193,23993 4193,23994 4193,23995 4193,23996 4193,23997 4193,23998 4193,24000 4193,24001 4193,24002 4193,24003 4193,24004 4193,24005 4193,24006 4193,24007 4193,24008 4193,24009 4193,24010 4193,24011 4193,24012 4193,24013 4193,24014 4193,24015 4193,24016 4193,24017 4193,24018 4193,24019 4193,24020 4193,24021 4193,24022 4193,24023 4193,24024 4193,24025 4193,24026 4193,24027 4193,24028 4193,24029 4193,24030 4193,24031 4193,24032 4193,24033 4193,24035 4193,24037 4193,24038 4193,24039 4193,24040 4193,24041 4193,24042 4193,24043 4193,24044 4193,24045 4193,24046 4193,24047 4193,24048 4193,24049 4193,24050 4193,24051 4193,24052 4193,24053 4193,24054 4193,24055 4193,24056 4193,24057 4193,24058 4193,24059 4193,24061 4193,24062 4193,24063 4193,24064 4193,24065 4193,24066 4193,24067 4193,24068 4193,24069 4193,24070 4193,24071 4193,24072 4193,24073 4193,24074 4193,24075 4193,24076 4193,24077 4193,24078 4193,24079 4193,24080 4193,24081 4193,24082 4193,24083 4193,24084 4193,24085 4193,24086 4193,24087 4193,24088 4193,24090 4193,24091 4193,24092 4193,24093 4193,24094 4193,24095 4193,24096 4193,24097 4193,24098 4193,24099 4193,24100 4193,24101 4193,24102 4193,24103 4193,24104 4193,24105 4193,24108 4193,24109 4193,24112 4193,24113 4193,24114 4193,24115 4193,24116 4193,24117 4193,24118 4193,24119 4193,24120 4193,24121 4193,24122 4193,24123 4193,24124 4193,24125 4193,24126 4193,24127 4193,24129 4193,24130 4193,24131 4193,24132 4193,24133 4193,24134 4193,24135 4193,24137 4193,24138 4193,24139 4193,24140 4193,24141 4193,24142 4193,24143 4193,24144 4193,24145 4193,24146 4193,24147 4193,24148 4193,24149 4193,24150 4193,24151 4193,24152 4193,24153 4193,24154 4193,24155 4193,24157 4193,24158 4193,24159 4193,24161 4193,24163 4193,24164 4193,24165 4193,24166 4193,24167 4193,24168 4193,24169 4193,24170 4193,24171 4193,24172 4193,24173 4193,24174 4193,24175 4193,24176 4193,24177 4193,24178 4193,24179 4193,24181 4193,24182 4193,24183 4193,24184 4193,24185 4193,24186 4193,24187 4193,24188 4193,24189 4193,24190 4193,24191 4193,24192 4193,24193 4193,24194 4193,24195 4193,24196 4193,24197 4193,24198 4193,24199 4193,24200 4193,24201 4193,24202 4193,24203 4193,24204 4193,24205 4193,24206 4193,24207 4193,24208 4193,24209 4193,24210 4193,24211 4193,24212 4193,24213 4193,24214 4193,24215 4193,24216 4193,24218 4193,24219 4193,24220 4193,24221 4193,24222 4193,24223 4193,24224 4193,24225 4193,24226 4193,24227 4193,24228 4193,24229 4193,24230 4193,24231 4193,24232 4193,24233 4193,130984 4194,120 4195,240 4195,1203 4195,1807 4195,1955 4196,4197 4196,38021 4196,39333 4196,172636 4196,195975 4196,200304 4196,258655 4198,994 4199,2310 4201,1400 4203,259 4204,312 4205,571 4205,868 4205,1400 4206,1479 4207,83 4208,2105 4210,312 4211,489 4212,163 4213,167 4213,186 4213,192 4213,217 4213,301 4213,406 4213,467 4213,589 4213,968 4213,973 4213,1010 4213,1085 4213,1284 4213,1326 4213,1417 4213,1749 4213,1796 4213,1849 4213,2191 4213,2334 4213,2646 4213,3804 4215,171 4216,503 4217,54 4217,399 4217,500 4217,644 4217,649 4217,749 4217,943 4217,996 4217,1052 4217,1078 4217,1204 4217,1212 4217,1274 4217,1300 4217,1429 4217,1474 4217,1512 4217,1539 4217,1616 4217,2168 4217,2224 4217,2775 4217,3194 4217,3258 4217,3630 4217,4218 4217,4219 4217,4220 4217,4222 4217,4223 4217,4234 4217,5130 4217,5667 4217,7768 4217,13361 4217,19010 4217,22293 4217,23783 4217,28107 4217,28130 4217,72439 4218,104 4218,328 4218,592 4218,677 4218,704 4218,714 4218,715 4218,1402 4218,1511 4218,1641 4218,1962 4218,2105 4218,2205 4218,2286 4218,3069 4218,3565 4218,4218 4218,4220 4218,4222 4218,4532 4218,8821 4218,9441 4218,12878 4218,13273 4218,16896 4218,32914 4218,33424 4218,55146 4218,63527 4218,66005 4218,76060 4218,94779 4218,102696 4218,103409 4218,111142 4218,120659 4218,122715 4218,125435 4218,125436 4218,174364 4218,174971 4218,176443 4218,176780 4218,179048 4218,182666 4218,228626 4218,228957 4218,239309 4218,244307 4218,245910 4218,253936 4218,255488 4220,68 4220,104 4220,240 4220,677 4220,685 4220,715 4220,838 4220,911 4220,1118 4220,1119 4220,1608 4220,1888 4220,2285 4220,2358 4220,2590 4220,4218 4220,4220 4220,4222 4220,4494 4220,4512 4220,4751 4220,7348 4220,12878 4220,13563 4220,13947 4220,16896 4220,17707 4220,18786 4220,18792 4220,21525 4220,22268 4220,24906 4220,26170 4220,26928 4220,29109 4220,29609 4220,34828 4220,43134 4220,46874 4220,47805 4220,54287 4220,55146 4220,55598 4220,56374 4220,56710 4220,66005 4220,66297 4220,80672 4220,83598 4220,103061 4220,103379 4220,103750 4220,107914 4220,115730 4220,118671 4220,121109 4220,137881 4220,144231 4220,154772 4220,172012 4220,172590 4220,175880 4220,179218 4220,181079 4220,181096 4220,183388 4220,186065 4220,188725 4220,189841 4220,193129 4220,215010 4220,228838 4220,258480 4222,104 4222,289 4222,290 4222,298 4222,417 4222,518 4222,573 4222,589 4222,677 4222,685 4222,714 4222,715 4222,862 4222,911 4222,1085 4222,1326 4222,1580 4222,2085 4222,2105 4222,2204 4222,2572 4222,2646 4222,2747 4222,3623 4222,3944 4222,4218 4222,4220 4222,6004 4222,6068 4222,6069 4222,7921 4222,9457 4222,13217 4222,15090 4222,15633 4222,21589 4222,23710 4222,28191 4222,29250 4222,29404 4222,33567 4222,33728 4222,34129 4222,34419 4222,35428 4222,36250 4222,37730 4222,38822 4222,39618 4222,39649 4222,39667 4222,40763 4222,44725 4222,48087 4222,59273 4222,62504 4222,66297 4222,68697 4222,72800 4222,73745 4222,74482 4222,75912 4222,82114 4222,83940 4222,85484 4222,85486 4222,93740 4222,99756 4222,110509 4222,113550 4222,118913 4222,121238 4222,125952 4222,132216 4222,139544 4222,148807 4222,154004 4222,156711 4222,159234 4222,160400 4222,176782 4222,184926 4222,185877 4222,193078 4222,212692 4222,218050 4222,221068 4222,245556 4222,261889 4223,34 4223,35 4223,217 4223,389 4223,657 4223,682 4223,815 4223,818 4223,1077 4223,1078 4223,1313 4223,1415 4223,1724 4223,2159 4223,3729 4223,4223 4223,4234 4223,5433 4223,7768 4223,8177 4223,13137 4223,20234 4223,20348 4223,23287 4223,31771 4223,34416 4223,59213 4223,62903 4223,72439 4223,93719 4223,98780 4223,101735 4223,140743 4223,152703 4223,154688 4223,155104 4223,155105 4223,157467 4223,157468 4223,159250 4223,163263 4223,170326 4223,170714 4223,178597 4223,189271 4223,191517 4223,214074 4223,232255 4223,232737 4223,253205 4224,273 4224,274 4224,313 4225,1801 4226,344 4226,1673 4227,1619 4227,2315 4228,146 4229,500 4230,1962 4232,1052 4233,1882 4234,83 4234,217 4234,222 4234,477 4234,536 4234,657 4234,682 4234,784 4234,1353 4234,1359 4234,1417 4234,1724 4234,1756 4234,2168 4234,2553 4234,2646 4234,2779 4234,2944 4234,4223 4234,18831 4234,42121 4234,57354 4234,72439 4234,115474 4234,127158 4235,2775 4236,2210 4236,4237 4237,81 4237,134 4237,135 4237,215 4237,328 4237,704 4237,797 4237,1011 4237,1016 4237,1177 4237,1282 4237,1402 4237,1511 4237,2210 4237,3069 4237,3565 4237,3727 4237,3820 4237,4149 4237,4237 4237,5331 4237,6556 4237,6667 4237,8132 4237,15768 4237,24918 4237,25302 4237,43178 4237,56346 4237,65681 4237,66353 4237,66539 4237,67327 4237,104000 4237,104698 4237,107801 4237,118122 4237,119223 4237,135274 4237,143193 4237,146502 4237,147633 4237,148462 4237,149237 4237,151590 4237,151591 4237,151592 4237,151593 4237,151594 4237,151891 4237,152091 4237,162762 4237,165302 4237,165388 4237,165476 4237,165643 4237,165760 4237,165846 4237,169066 4237,171332 4237,171726 4237,173271 4237,173278 4237,173634 4237,174016 4237,174832 4237,174923 4237,174981 4237,175459 4237,176422 4237,176526 4237,179727 4237,181054 4237,182109 4237,182162 4238,483 4238,852 4238,2646 4239,66 4240,167 4240,459 4240,744 4240,1010 4240,1012 4240,1241 4241,1 4241,596 4242,285 4242,347 4242,702 4242,861 4243,1298 4245,337 4246,1474 4247,1381 4247,1452 4247,1639 4248,563 4249,2605 4249,14550 4250,497 4251,4252 4251,15609 4252,392 4252,1805 4252,137245 4252,173918 4253,37 4253,301 4253,615 4253,968 4253,1282 4253,1293 4253,1837 4253,5662 4253,31977 4254,344 4255,298 4256,485 4259,397 4260,50 4260,175 4260,344 4260,693 4260,4260 4260,115659 4260,142405 4260,142433 4260,142473 4260,142870 4260,143287 4260,145502 4260,145524 4260,173366 4260,178222 4260,202837 4261,503 4261,1149 4262,1619 4262,2315 4263,2782 4264,424 4264,1634 4265,111 4265,289 4265,290 4265,631 4265,760 4265,1149 4265,1177 4265,1392 4265,1631 4265,2443 4265,4237 4265,94134 4265,182162 4266,2775 4267,240 4267,611 4268,278 4269,2828 4270,37 4270,1782 4271,685 4271,843 4271,849 4271,911 4271,1844 4271,2083 4272,22 4272,207 4272,287 4272,424 4272,446 4272,663 4272,702 4272,752 4272,873 4272,1133 4272,1623 4272,2782 4272,4272 4272,121110 4273,63 4273,79 4273,192 4273,251 4273,252 4273,516 4273,1243 4273,1844 4273,21944 4274,182 4276,30 4276,104 4276,134 4276,135 4276,136 4276,137 4276,138 4276,200 4276,211 4276,225 4276,248 4276,314 4276,327 4276,364 4276,397 4276,441 4276,452 4276,457 4276,500 4276,557 4276,668 4276,673 4276,676 4276,677 4276,685 4276,772 4276,794 4276,838 4276,843 4276,849 4276,850 4276,852 4276,929 4276,950 4276,953 4276,954 4276,1011 4276,1014 4276,1118 4276,1130 4276,1172 4276,1179 4276,1191 4276,1262 4276,1332 4276,1368 4276,1415 4276,1566 4276,1663 4276,1973 4276,1980 4276,2105 4276,2224 4276,2253 4276,3524 4276,4276 4276,4941 4276,5053 4276,5405 4276,6023 4276,6695 4276,6904 4276,9457 4276,13207 4276,19413 4276,19457 4276,28203 4276,29575 4276,40169 4276,48374 4276,65864 4276,82217 4276,85814 4276,97250 4276,190276 4276,207659 4276,215874 4276,238007 4276,249055 4277,685 4277,849 4278,626 4278,775 4279,130 4280,269 4281,298 4282,485 4283,1241 4284,338 4284,1893 4285,259 4285,920 4286,167 4286,186 4286,202 4286,203 4286,217 4286,240 4286,248 4286,299 4286,301 4286,392 4286,435 4286,457 4286,467 4286,516 4286,801 4286,818 4286,872 4286,1010 4286,1085 4286,1118 4286,1151 4286,1284 4286,1298 4286,1659 4286,1749 4286,1782 4286,2480 4286,2671 4286,4355 4286,6955 4286,73570 4287,87 4287,344 4287,392 4287,710 4287,918 4287,1151 4287,1363 4287,1711 4287,1836 4288,832 4290,399 4291,167 4291,301 4291,968 4291,1293 4291,1837 4291,2083 4291,3138 4291,3422 4291,5301 4292,485 4292,920 4292,1821 4292,255750 4293,527 4295,83 4295,399 4295,455 4295,477 4296,827 4297,577 4297,1105 4298,996 4298,1033 4300,918 4301,301 4301,968 4302,477 4303,48 4303,313 4303,399 4303,626 4303,1293 4303,2775 4303,3218 4304,1052 4305,160 4305,163 4305,299 4305,483 4305,516 4305,690 4305,1001 4305,1805 4306,192 4306,640 4307,79 4307,516 4307,1014 4308,104 4308,111 4308,130 4308,192 4308,200 4308,233 4308,264 4308,301 4308,309 4308,310 4308,328 4308,372 4308,441 4308,442 4308,589 4308,609 4308,631 4308,649 4308,714 4308,749 4308,760 4308,775 4308,932 4308,1007 4308,1010 4308,1046 4308,1085 4308,1140 4308,1212 4308,1285 4308,1462 4308,1522 4308,1551 4308,2105 4308,2205 4308,2209 4308,2443 4308,3804 4308,6556 4308,6880 4308,8537 4308,33424 4308,75912 4309,143 4310,10 4310,158 4310,178 4310,195 4310,336 4310,996 4311,2775 4312,447 4313,22 4314,87 4314,264 4314,392 4314,457 4314,687 4314,872 4314,918 4314,1151 4314,1454 4314,1556 4315,202 4315,264 4315,301 4315,388 4315,392 4315,479 4315,510 4315,586 4315,622 4315,772 4315,838 4315,920 4315,1014 4315,1085 4315,1181 4315,1210 4315,1298 4315,1370 4315,1462 4315,1522 4315,1531 4315,1782 4315,4355 4315,8537 4316,2334 4317,178 4317,868 4317,1619 4318,636 4319,250 4319,1684 4320,1149 4321,222 4321,1274 4321,1571 4321,2266 4321,18831 4322,1415 4322,1663 4323,72 4323,106 4323,136 4323,280 4323,493 4323,557 4323,1821 4323,2782 4323,17245 4324,192 4324,195 4324,1849 4325,302 4326,287 4326,538 4326,934 4326,1590 4326,1644 4327,3507 4327,15179 4328,338 4328,467 4328,1151 4329,615 4329,973 4329,1479 4329,2083 4330,1882 4331,195 4332,195 4333,72 4333,106 4333,2782 4334,1707 4335,147 4335,841 4335,1247 4336,676 4337,97 4337,175 4337,1509 4338,151 4339,447 4339,788 4340,818 4341,254 4341,1282 4341,1882 4342,56 4342,106 4342,493 4343,4344 4344,336 4344,505 4344,920 4344,1620 4344,1623 4344,31977 4345,1381 4346,4344 4347,4344 4348,358 4348,3409 4349,2319 4350,4344 4351,4344 4352,20 4352,83 4352,273 4352,538 4352,647 4352,1058 4352,1623 4352,66754 4352,142426 4353,146 4353,92476 4353,106502 4354,30 4354,328 4354,440 4354,622 4354,809 4354,1033 4354,1276 4354,1973 4354,2744 4354,3247 4354,4355 4354,141912 4355,30 4355,136 4355,200 4355,248 4355,254 4355,327 4355,328 4355,450 4355,588 4355,590 4355,631 4355,636 4355,950 4355,953 4355,1033 4355,1085 4355,1282 4355,1417 4355,1844 4355,2208 4355,3694 4355,4286 4355,4315 4355,4354 4355,4355 4355,4368 4355,5181 4355,6023 4355,6853 4355,7087 4355,7124 4355,7344 4355,13207 4355,13636 4355,13657 4355,15358 4355,15519 4355,16640 4355,21276 4355,24826 4355,29595 4355,32940 4355,34881 4355,41268 4355,43383 4355,45993 4355,47077 4355,47106 4355,48278 4355,48599 4355,49247 4355,49337 4355,59058 4355,59677 4355,60087 4355,63497 4355,68219 4355,75295 4355,77645 4355,77758 4355,78876 4355,78980 4355,79556 4355,85829 4355,91519 4355,93178 4355,106859 4355,116567 4355,117864 4355,118891 4355,126975 4355,131650 4355,135266 4355,148687 4355,149195 4355,155361 4355,155686 4355,156970 4355,170641 4355,171249 4355,190776 4355,190777 4355,198154 4355,200594 4355,200605 4355,200606 4355,200609 4355,200611 4355,213024 4355,228385 4355,245540 4355,250950 4355,260966 4356,392 4357,280 4358,704 4359,663 4359,666 4359,750 4359,1298 4359,72764 4360,4344 4361,1559 4362,720 4362,907 4362,1284 4362,2191 4363,372 4364,862 4367,22 4367,81 4367,104 4367,134 4367,192 4367,200 4367,215 4367,217 4367,227 4367,240 4367,248 4367,264 4367,289 4367,290 4367,298 4367,392 4367,442 4367,503 4367,557 4367,631 4367,636 4367,714 4367,805 4367,1016 4367,1119 4367,1149 4367,1282 4367,1392 4367,1462 4367,1631 4367,1745 4367,1796 4367,1955 4367,1962 4367,2205 4367,2209 4367,2286 4367,2315 4367,3507 4367,3804 4367,4771 4367,8537 4367,9001 4367,9005 4367,33424 4367,94134 4367,111142 4368,333 4368,622 4368,1033 4368,4355 4369,996 4369,1033 4371,563 4372,158 4373,1639 4374,1072 4375,366 4375,788 4376,20 4377,54 4377,222 4377,389 4377,455 4377,588 4377,590 4377,657 4377,694 4377,1019 4377,1274 4377,2173 4377,2266 4377,5343 4377,32751 4377,33508 4378,1127 4379,1449 4380,577 4381,264 4381,312 4381,872 4381,1010 4381,1127 4381,1298 4381,1411 4381,1659 4381,1749 4381,1893 4381,2334 4381,2605 4381,6695 4381,191860 4382,32 4382,349 4382,392 4382,509 4382,697 4382,809 4382,76096 4382,127158 4383,143 4384,431 4384,1247 4384,2782 4385,1243 4386,996 4387,134 4387,323 4387,714 4387,784 4387,805 4387,1016 4387,1119 4387,1146 4388,20 4388,63 4388,134 4388,163 4388,206 4388,222 4388,248 4388,280 4388,283 4388,289 4388,314 4388,332 4388,337 4388,346 4388,356 4388,422 4388,455 4388,491 4388,599 4388,620 4388,657 4388,663 4388,664 4388,694 4388,852 4388,1140 4388,1172 4388,1247 4388,1285 4388,1332 4388,1432 4388,1608 4388,1888 4388,1973 4388,1983 4388,2224 4388,2266 4388,2416 4388,2417 4388,2979 4388,2989 4388,2991 4388,3804 4388,4903 4388,6119 4388,7117 4388,9457 4388,14674 4388,15179 4388,17245 4388,94134 4388,189842 4390,163 4390,302 4390,579 4390,687 4390,861 4390,1556 4390,1634 4390,2017 4390,6303 4391,147 4391,184 4391,1247 4391,164572 4392,634 4393,217 4394,346 4394,435 4395,143 4395,1052 4396,302 4397,1117 4398,200 4398,772 4399,346 4399,447 4399,1860 4399,6955 4399,30428 4400,1276 4401,200 4401,299 4401,2674 4401,2779 4402,714 4402,1085 4403,79 4404,489 4405,147 4405,158 4405,273 4405,274 4405,1116 4405,1425 4406,417 4407,775 4408,609 4409,775 4410,304 4410,4411 4411,304 4411,631 4411,784 4411,911 4411,968 4411,1715 4411,1853 4411,3804 4411,4410 4411,4411 4411,4419 4411,5178 4411,5430 4411,5531 4411,5639 4411,5647 4411,5651 4411,7530 4411,14349 4411,15329 4411,15488 4411,15711 4411,16614 4411,20386 4411,21296 4411,22711 4411,24714 4411,42767 4411,42854 4411,43195 4411,43198 4411,44248 4411,44311 4411,58413 4411,59937 4411,63046 4411,63047 4411,87980 4411,96752 4411,109558 4411,112287 4411,112538 4411,112541 4411,112542 4411,112546 4411,112566 4411,140511 4411,142295 4411,143319 4411,143345 4411,143346 4411,159751 4411,165530 4411,166609 4411,167569 4411,167959 4411,223489 4411,243303 4411,245154 4411,250415 4412,634 4413,663 4413,664 4413,1298 4414,302 4415,50 4415,130 4415,209 4415,313 4415,393 4415,473 4415,483 4415,602 4415,841 4415,1566 4415,1571 4415,1955 4415,3451 4415,3452 4415,3507 4415,3804 4415,4223 4415,6955 4415,75912 4415,88820 4416,1240 4416,1465 4417,3 4417,32 4417,217 4417,222 4417,289 4417,290 4417,326 4417,349 4417,388 4417,392 4417,433 4417,509 4417,510 4417,657 4417,697 4417,720 4417,752 4417,809 4417,872 4417,873 4417,874 4417,907 4417,919 4417,932 4417,973 4417,1010 4417,1019 4417,1133 4417,1143 4417,1210 4417,1240 4417,1284 4417,1363 4417,1453 4417,1454 4417,1465 4417,1634 4417,1801 4417,1805 4417,1836 4417,1837 4417,1860 4417,1871 4417,1881 4417,2045 4417,2191 4417,2266 4417,2421 4417,2557 4417,2699 4417,3182 4417,4252 4417,6789 4417,6955 4417,7092 4417,94134 4418,697 4419,346 4419,1368 4419,1381 4419,1871 4419,4411 4420,143 4421,500 4422,1782 4423,140 4424,1133 4425,1634 4426,184 4426,346 4426,406 4426,1033 4426,1474 4427,718 4428,2373 4429,48 4430,1858 4431,1860 4433,1479 4434,534 4435,843 4435,2373 4436,1370 4437,72 4438,397 4438,142426 4439,575 4439,697 4439,3260 4440,222 4442,1580 4443,358 4445,710 4445,835 4445,1052 4445,1893 4445,49057 4445,81070 4446,66 4446,171 4446,264 4446,301 4446,493 4446,577 4446,690 4446,788 4446,868 4446,1010 4446,1433 4446,1531 4447,602 4447,620 4448,200 4448,911 4448,189788 4449,143 4449,1052 4449,190492 4450,433 4450,1634 4451,344 4451,920 4451,1089 4452,4453 4454,991 4454,1707 4455,259 4455,272 4455,301 4455,446 4455,685 4455,726 4455,788 4455,980 4455,1429 4455,1531 4455,4455 4455,4456 4455,4646 4455,6519 4455,9747 4455,23505 4455,24875 4455,44348 4455,48119 4455,52437 4455,62927 4455,64114 4455,67087 4455,67271 4455,70247 4455,70945 4455,104565 4455,114560 4455,122538 4455,124342 4455,126103 4455,139992 4455,140759 4455,142025 4455,145469 4455,148773 4455,151404 4455,155522 4455,163844 4455,163993 4455,166639 4455,168566 4455,177428 4455,193659 4455,231132 4455,237079 4455,238030 4455,244759 4455,244875 4457,222 4457,2784 4457,5591 4458,264 4458,338 4458,340 4458,1127 4458,1224 4458,1893 4458,1968 4459,298 4460,485 4461,439 4461,1294 4462,192 4462,366 4462,2480 4462,2557 4463,72 4463,312 4463,1052 4463,2296 4463,3695 4464,289 4464,290 4464,94134 4465,50 4465,314 4465,779 4465,141912 4466,163 4466,182 4466,440 4466,489 4466,586 4466,720 4466,893 4466,1149 4467,1085 4468,147 4468,158 4468,273 4468,274 4468,1116 4468,1425 4468,30427 4469,304 4470,247 4471,417 4472,1212 4473,1309 4474,4475 4476,571 4476,801 4477,399 4477,406 4478,200 4479,298 4480,485 4481,195 4482,1010 4482,1019 4482,6506 4483,392 4484,589 4485,58 4485,1140 4486,120 4486,694 4486,1419 4486,4487 4486,7155 4488,83 4488,399 4489,4490 4491,252 4491,516 4491,1220 4491,1222 4492,251 4492,464 4492,4493 4492,32625 4492,36269 4492,38157 4492,41144 4492,66299 4492,66321 4492,66568 4492,77656 4492,108440 4492,115834 4492,120450 4492,147645 4492,174936 4494,726 4494,2590 4494,4218 4494,4220 4494,4222 4495,392 4496,37 4496,611 4496,1449 4496,1782 4497,304 4497,1167 4497,1782 4498,338 4498,462 4498,467 4498,1151 4499,775 4500,818 4501,392 4501,697 4502,406 4503,1284 4503,4504 4505,32 4505,87 4505,392 4505,644 4505,697 4505,918 4505,1151 4505,2274 4505,3003 4506,388 4507,10 4507,175 4507,184 4507,206 4507,2244 4508,1 4508,63 4508,79 4508,118 4508,163 4508,192 4508,272 4508,275 4508,340 4508,571 4508,620 4508,703 4508,788 4508,1309 4508,1313 4508,4597 4509,248 4509,450 4509,1332 4510,1309 4510,1571 4511,1639 4513,392 4514,126 4514,240 4514,599 4514,918 4514,1293 4514,1326 4514,2373 4514,2512 4514,2605 4514,118336 4515,272 4515,934 4515,1449 4515,1612 4516,1414 4517,444 4517,968 4518,178 4519,2411 4520,58 4520,104 4520,107 4520,111 4520,227 4520,248 4520,264 4520,292 4520,441 4520,442 4520,452 4520,462 4520,503 4520,596 4520,626 4520,631 4520,714 4520,749 4520,805 4520,1078 4520,1085 4520,1140 4520,1146 4520,1147 4520,1192 4520,1282 4520,1462 4520,1466 4520,1659 4520,1955 4520,2205 4520,2206 4520,2334 4520,2443 4520,3538 4520,3555 4520,4771 4520,8537 4521,489 4521,2209 4522,1556 4523,3422 4524,134 4524,636 4524,805 4524,2209 4525,682 4525,2312 4525,72439 4526,338 4526,2779 4527,10 4527,35 4527,81 4527,104 4527,136 4527,137 4527,192 4527,225 4527,227 4527,248 4527,254 4527,278 4527,313 4527,372 4527,634 4527,636 4527,752 4527,907 4527,932 4527,973 4527,1001 4527,1033 4527,1082 4527,1133 4527,1179 4527,1241 4527,1282 4527,1313 4527,1392 4527,1479 4527,1515 4527,1745 4527,1849 4527,1939 4527,2205 4527,2206 4527,2224 4527,2646 4527,3085 4527,3246 4527,3247 4527,3507 4527,3585 4527,4276 4527,4355 4527,5326 4527,8180 4527,8855 4527,8990 4527,15748 4527,19946 4527,20063 4528,10 4529,195 4529,336 4529,620 4529,8244 4530,424 4531,575 4531,697 4533,2797 4534,79 4535,3 4537,1227 4537,1229 4537,21944 4538,292 4538,304 4538,332 4538,390 4538,752 4538,1285 4538,1479 4538,1801 4538,1858 4538,6789 4539,252 4540,240 4540,289 4540,290 4540,298 4540,372 4540,417 4540,714 4540,932 4540,1012 4540,1082 4540,1085 4540,1285 4540,1564 4540,1715 4540,1785 4540,1818 4540,1955 4540,1962 4540,2205 4540,2206 4540,2296 4540,2620 4540,4218 4540,5718 4540,33424 4540,94134 4540,144988 4540,221304 4541,809 4542,1571 4543,640 4543,1425 4544,2178 4544,4545 4544,56150 4544,88820 4544,139010 4545,259 4545,272 4545,314 4545,393 4545,577 4545,599 4545,788 4545,980 4545,1070 4545,1504 4545,1531 4545,2400 4545,4545 4545,5356 4545,6568 4545,8610 4545,14232 4545,22451 4545,22558 4545,22940 4545,32680 4545,34863 4545,35486 4545,36597 4545,39666 4545,47776 4545,56150 4545,63341 4545,69700 4545,90546 4545,116813 4545,117231 4545,117523 4545,118050 4545,118340 4545,118927 4545,119359 4545,119367 4545,119483 4545,119490 4545,119539 4545,120528 4545,121253 4545,121302 4545,121436 4545,122010 4545,122014 4545,122037 4545,122107 4545,122119 4545,122122 4545,122210 4545,122891 4545,122941 4545,123047 4545,124486 4545,125968 4545,126143 4545,126648 4545,126849 4545,127172 4545,128335 4545,133493 4545,134346 4545,136183 4545,138954 4545,139010 4545,139377 4545,139497 4545,140809 4545,142775 4545,143958 4545,144126 4545,144862 4545,153300 4545,153749 4545,154249 4545,154284 4545,154818 4545,155314 4545,157114 4545,158098 4545,158578 4545,158592 4545,163792 4545,165473 4545,165741 4545,167324 4545,167541 4545,167558 4545,167580 4545,168268 4545,169222 4545,169242 4545,169441 4545,169563 4545,169584 4545,169944 4545,170051 4545,170787 4545,170798 4546,32 4546,392 4547,41 4547,589 4547,4548 4548,310 4550,390 4551,200 4551,225 4551,772 4551,850 4551,1332 4551,221294 4552,44 4552,94 4552,2787 4553,1033 4554,392 4555,577 4556,862 4557,30 4557,328 4557,447 4557,693 4557,1188 4557,5192 4558,779 4558,68069 4559,151 4560,868 4562,818 4563,579 4563,868 4564,2073 4565,22 4565,65 4565,104 4565,111 4565,140 4565,160 4565,217 4565,227 4565,264 4565,292 4565,296 4565,312 4565,323 4565,338 4565,340 4565,364 4565,392 4565,420 4565,441 4565,442 4565,455 4565,462 4565,467 4565,479 4565,500 4565,509 4565,510 4565,515 4565,525 4565,571 4565,609 4565,626 4565,647 4565,736 4565,801 4565,835 4565,872 4565,911 4565,1001 4565,1007 4565,1052 4565,1058 4565,1118 4565,1140 4565,1238 4565,1241 4565,1298 4565,1332 4565,1381 4565,1417 4565,1453 4565,1509 4565,1572 4565,1579 4565,1653 4565,1659 4565,1688 4565,1722 4565,1749 4565,1893 4565,2051 4565,2292 4565,2334 4565,2443 4565,2626 4565,2889 4565,3538 4565,4039 4565,4453 4565,4771 4565,7124 4565,8994 4565,13538 4566,147 4566,2244 4567,302 4568,1132 4569,929 4570,536 4571,360 4571,1282 4571,2286 4571,4571 4571,88820 4572,1590 4573,1285 4575,433 4576,83 4576,5591 4577,1715 4578,328 4578,344 4578,2210 4578,4237 4579,891 4579,949 4579,1756 4579,2646 4579,9743 4579,28130 4579,115474 4579,212914 4580,87 4580,111 4580,292 4580,338 4580,392 4580,462 4580,467 4580,509 4580,510 4580,515 4580,595 4580,703 4580,872 4580,918 4580,1052 4580,1151 4580,1453 4580,1572 4580,1659 4580,1688 4580,1722 4580,1836 4580,1893 4580,4039 4581,945 4581,1572 4582,392 4583,861 4584,1634 4585,483 4585,818 4586,146 4587,312 4589,158 4589,192 4589,247 4589,252 4589,516 4589,622 4589,1433 4590,640 4591,24 4591,26 4591,28 4591,59 4591,885 4591,887 4591,1432 4591,1775 4591,4079 4591,4571 4591,21944 4591,44244 4591,171294 4592,149 4593,2779 4593,4594 4595,718 4595,893 4596,592 4598,301 4598,615 4598,968 4598,1293 4598,1782 4599,215 4600,518 4601,99 4601,1363 4601,1465 4602,1326 4603,4604 4605,68 4605,387 4605,22071 4606,298 4607,485 4608,900 4609,862 4610,4611 4611,192 4611,726 4611,766 4611,788 4611,859 4611,911 4611,980 4611,1388 4611,1531 4611,1612 4611,2224 4611,4137 4611,4545 4611,4611 4611,5618 4611,8300 4611,14679 4611,17913 4611,20712 4611,22221 4611,26915 4611,28377 4611,28997 4611,35211 4611,35486 4611,36613 4611,46483 4611,48865 4611,56150 4611,68727 4611,120106 4611,129546 4611,176498 4611,179720 4611,181734 4611,183470 4611,185289 4611,185355 4611,185401 4611,187416 4611,188729 4611,189354 4611,190804 4611,192410 4611,193034 4611,194454 4611,194513 4611,194588 4611,194690 4611,196627 4611,203108 4611,207639 4611,212307 4611,215804 4611,216572 4611,217461 4611,220272 4611,220646 4611,226193 4611,226254 4611,236107 4611,238728 4611,240868 4611,244682 4611,247303 4611,247392 4611,247774 4611,247848 4611,247852 4611,250886 4611,250887 4611,250904 4611,251472 4611,252030 4611,254252 4611,262485 4612,252 4613,200 4613,772 4615,63 4615,252 4615,516 4615,41170 4616,32 4616,392 4616,809 4616,3260 4617,50 4617,146 4617,779 4617,68069 4617,92476 4618,609 4618,1359 4618,2315 4619,41 4619,68 4619,1119 4619,1285 4619,1631 4619,3135 4620,72 4621,1955 4622,83 4623,192 4623,779 4623,1590 4623,68069 4624,140 4625,309 4625,310 4626,195 4626,393 4627,147 4627,149 4627,184 4627,2244 4628,217 4629,72 4630,388 4631,283 4632,1072 4633,332 4634,455 4635,3135 4636,4637 4637,192 4637,256 4637,283 4637,313 4637,389 4637,536 4637,599 4637,634 4637,660 4637,684 4637,1072 4637,1881 4637,1916 4637,2266 4637,2779 4637,4109 4637,4446 4637,5325 4637,5751 4637,7092 4637,8168 4637,13240 4637,15239 4637,18650 4637,19443 4637,29965 4637,39723 4637,43407 4637,44582 4637,44973 4637,54313 4637,72916 4637,93836 4637,93837 4637,161673 4637,172821 4637,207659 4637,213828 4637,223131 4637,224611 4638,2266 4639,1274 4640,1429 4641,1201 4642,2421 4643,120 4644,859 4645,278 4646,178 4646,315 4646,346 4646,435 4646,439 4646,447 4646,538 4646,868 4646,934 4646,1033 4646,1294 4646,1474 4646,1612 4646,1773 4646,1877 4646,1913 4646,4455 4646,5996 4646,15802 4646,21442 4647,4648 4647,6344 4647,56577 4647,83919 4649,4650 4651,4652 4651,40174 4651,50950 4651,53336 4651,56712 4651,76655 4651,78807 4651,79802 4651,84443 4651,90382 4651,92628 4651,94573 4651,96339 4651,99135 4651,101329 4651,105145 4651,107331 4651,109764 4651,111972 4651,112156 4651,112717 4653,1893 4654,2353 4655,1715 4656,44 4657,4658 4657,68966 4657,72443 4659,247 4660,356 4660,392 4660,1146 4660,1151 4660,1722 4660,1949 4661,192 4662,26 4662,59 4662,94 4662,116 4662,430 4662,994 4662,1235 4662,1335 4662,2087 4662,2787 4662,3816 4662,3817 4662,21944 4663,285 4663,336 4663,392 4663,644 4663,779 4663,1515 4663,60576 4663,118336 4663,141912 4664,3193 4665,1 4665,94 4665,795 4665,2787 4665,30331 4666,1033 4667,577 4668,247 4668,925 4669,668 4670,2681 4671,4672 4672,10 4672,217 4672,222 4672,536 4672,599 4672,1417 4672,2318 4672,2821 4672,4672 4672,6064 4672,7241 4672,7301 4672,14369 4672,14612 4672,15017 4672,16927 4672,18865 4672,18948 4672,19834 4672,20199 4672,20201 4672,20875 4672,23550 4672,24885 4672,30735 4672,37110 4672,38030 4672,40790 4672,41025 4672,42123 4672,45029 4672,48208 4672,49551 4672,52378 4672,57187 4672,58048 4672,59344 4672,59788 4672,59793 4672,59805 4672,59814 4672,80335 4672,91522 4672,94359 4672,94966 4672,101851 4672,115474 4672,120759 4672,124158 4672,124639 4672,125046 4672,127072 4672,134056 4672,138877 4672,147454 4672,147901 4672,149115 4672,155707 4672,160006 4672,162749 4672,177793 4672,216388 4672,216739 4672,216749 4672,216754 4672,216757 4672,217390 4672,218106 4672,221759 4672,231179 4672,231211 4672,234552 4672,247395 4672,251499 4672,256977 4672,256981 4672,256982 4672,258030 4672,258622 4672,258798 4672,260756 4673,364 4674,104 4674,254 4674,557 4674,953 4674,954 4676,247 4677,4678 4679,248 4679,450 4679,1332 4680,417 4680,1085 4681,1 4682,22 4682,151 4683,37 4683,301 4683,604 4683,717 4683,1231 4683,1782 4684,50 4684,147 4684,149 4684,158 4684,406 4684,622 4684,1425 4684,1776 4685,99 4685,779 4686,151 4687,346 4688,675 4688,1085 4690,4691 4691,109 4691,2593 4691,4691 4691,9379 4691,13138 4691,28111 4691,28851 4691,33721 4691,43714 4691,48752 4691,88125 4692,68 4692,104 4692,302 4692,328 4692,344 4692,577 4692,784 4692,794 4692,805 4692,818 4692,919 4692,1119 4692,1465 4692,1789 4692,1955 4693,1072 4694,2416 4694,2417 4694,3538 4694,5908 4695,247 4696,1298 4696,2191 4697,298 4698,485 4700,392 4700,1240 4701,22 4701,192 4701,911 4701,1021 4701,1655 4701,2209 4701,5726 4702,202 4702,203 4702,2371 4703,2605 4704,850 4705,563 4705,668 4706,149 4706,158 4706,640 4706,731 4706,127158 4707,852 4707,1143 4708,749 4708,1332 4708,1893 4709,20 4710,72 4711,192 4712,104 4712,557 4712,953 4712,954 4713,364 4713,850 4714,887 4715,417 4716,3003 4717,346 4718,1634 4719,4720 4721,72 4722,72 4722,87 4722,312 4722,509 4722,615 4722,875 4722,941 4722,1043 4722,1052 4722,1707 4722,3695 4723,372 4723,657 4723,1635 4724,171 4725,596 4725,1368 4726,1381 4727,63 4727,195 4727,252 4727,264 4727,392 4727,406 4727,516 4727,631 4727,1370 4727,1381 4727,1453 4727,1745 4727,1955 4728,3623 4729,1265 4729,1266 4730,417 4731,557 4732,557 4733,2506 4734,2506 4735,2506 4736,2506 4737,2506 4738,2506 4739,338 4739,515 4739,1119 4739,1381 4739,1893 4739,49057 4740,510 4740,657 4740,694 4740,2421 4740,3367 4740,9029 4741,285 4741,620 4741,8244 4741,21442 4742,389 4742,3260 4743,579 4743,4823 4744,872 4745,323 4745,417 4745,634 4745,1149 4746,406 4747,2867 4747,2868 4747,4748 4747,5881 4747,22880 4748,47 4748,967 4748,994 4748,1235 4748,1335 4748,2469 4748,4748 4748,5700 4748,5871 4748,5881 4748,13515 4748,20486 4748,25120 4748,25821 4749,301 4749,907 4749,2191 4749,2557 4750,65 4751,68 4751,336 4751,431 4751,818 4751,4220 4752,120 4752,158 4752,261 4752,301 4752,333 4752,406 4752,493 4752,682 4752,694 4752,2045 4752,2797 4753,140 4754,272 4755,1117 4756,267 4757,1016 4758,304 4759,240 4759,392 4759,919 4759,1465 4759,1805 4759,1860 4759,1949 4759,3258 4759,4760 4759,21982 4760,87 4760,349 4760,452 4760,599 4760,658 4760,697 4760,809 4760,911 4760,918 4760,919 4760,1240 4760,1424 4760,1663 4760,1805 4760,1949 4760,1986 4760,2045 4760,3509 4760,4759 4760,6552 4760,19010 4760,22293 4760,31030 4760,33338 4760,33674 4760,34129 4760,36720 4760,37219 4760,56256 4760,65931 4760,69250 4760,90144 4760,91259 4760,104565 4760,112321 4760,142291 4760,182465 4760,206189 4760,220317 4760,229167 4762,2506 4763,805 4764,1204 4765,841 4766,1402 4767,1707 4768,65 4769,126 4769,1014 4769,37414 4770,4771 4771,58 4771,107 4771,111 4771,227 4771,292 4771,314 4771,338 4771,373 4771,431 4771,440 4771,441 4771,442 4771,462 4771,502 4771,580 4771,596 4771,609 4771,631 4771,673 4771,677 4771,715 4771,749 4771,801 4771,872 4771,978 4771,1014 4771,1140 4771,1235 4771,1417 4771,1449 4771,1572 4771,1663 4771,1688 4771,1722 4771,1758 4771,1796 4771,1844 4771,1860 4771,2334 4771,2379 4771,2726 4771,3035 4771,3328 4771,3496 4771,3538 4771,4367 4771,4520 4771,5501 4771,6569 4771,6904 4771,7523 4771,15658 4771,16638 4771,20787 4771,23664 4771,26031 4771,27495 4771,30733 4771,30770 4771,32978 4771,33283 4771,37224 4771,41972 4771,42143 4771,44188 4771,45775 4771,46166 4771,46830 4771,49379 4771,49578 4771,50289 4771,54257 4771,55177 4771,57161 4771,60325 4771,64676 4771,67016 4771,73568 4771,77818 4771,78891 4771,87534 4771,88114 4771,104592 4771,106442 4771,120835 4771,120903 4771,120915 4771,120995 4771,121002 4771,121211 4771,121541 4771,124314 4771,130250 4771,135620 4771,137941 4771,138239 4771,147413 4771,148824 4771,149031 4771,151487 4771,152775 4771,153887 4771,161947 4771,169717 4771,169982 4771,171220 4771,178097 4771,183437 4771,185349 4771,191987 4771,192333 4771,192548 4771,192663 4771,195618 4771,230966 4771,233424 4771,244115 4771,245430 4771,250800 4771,255743 4772,187 4772,264 4772,634 4772,2620 4773,2373 4774,2681 4775,718 4776,4777 4778,358 4779,720 4780,861 4781,107 4782,147 4782,158 4782,314 4782,20030 4782,32631 4782,122182 4783,107 4784,3695 4785,1789 4786,862 4787,240 4787,332 4787,536 4787,781 4787,818 4788,941 4789,151 4790,143 4790,1052 4790,2944 4791,994 4792,79 4793,1429 4794,949 4795,94 4795,2787 4796,2506 4797,450 4797,611 4797,1927 4798,1001 4799,135 4799,1843 4799,2424 4799,2553 4799,4799 4799,6506 4799,7075 4799,13276 4799,79601 4799,79655 4799,79966 4799,98890 4799,104961 4799,106326 4799,109967 4799,123395 4799,127757 4799,164883 4799,167340 4799,234354 4799,251514 4799,261819 4799,261822 4799,261833 4800,4801 4802,158 4802,192 4802,620 4802,4192 4802,4193 4802,194822 4803,577 4804,358 4804,4805 4806,8 4806,20 4806,32 4806,269 4806,302 4806,424 4806,433 4806,575 4806,581 4806,595 4806,644 4806,668 4806,673 4806,713 4806,717 4806,760 4806,784 4806,918 4806,985 4806,1058 4806,1089 4806,1130 4806,1147 4806,1368 4806,1392 4806,1579 4806,1844 4806,2373 4806,2605 4806,2750 4806,2779 4806,3089 4806,3135 4806,4276 4806,7117 4806,26450 4807,247 4808,37 4808,304 4808,3999 4809,4810 4810,5 4810,355 4810,4810 4810,6532 4810,14316 4810,36000 4810,45259 4810,57610 4810,74110 4810,88153 4810,107238 4810,108607 4810,125138 4810,137869 4810,138105 4810,146062 4810,173578 4810,178354 4811,605 4811,919 4812,215 4813,1509 4814,493 4814,1659 4814,1927 4815,147 4816,2506 4817,192 4818,843 4819,515 4819,1381 4820,207 4821,805 4822,4823 4824,417 4825,1639 4826,240 4827,4828 4829,920 4830,4831 4832,298 4833,485 4834,195 4835,135 4836,2105 4837,94 4837,116 4837,994 4837,1235 4837,2087 4838,30 4839,107 4840,1238 4841,160 4841,640 4841,1287 4842,760 4843,83 4844,1572 4845,500 4845,893 4846,135 4847,671 4848,417 4848,1274 4848,1414 4849,893 4850,195 4851,356 4852,175 4852,255 4852,294 4852,615 4852,1058 4852,1436 4852,3209 4852,4691 4853,72 4854,2048 4855,2590 4856,1072 4857,417 4858,4859 4860,72 4861,4862 4863,83 4864,147 4864,306 4864,307 4864,489 4864,563 4864,663 4864,664 4864,920 4864,3148 4864,4865 4864,4866 4864,6041 4864,6179 4864,6180 4864,6184 4864,6837 4866,602 4867,4868 4869,485 4870,660 4871,366 4871,500 4871,1623 4871,2606 4872,72 4873,206 4874,872 4875,784 4876,240 4877,1849 4878,1837 4879,289 4879,290 4879,417 4879,94134 4880,1551 4881,77 4882,252 4882,516 4883,4884 4885,140 4885,346 4885,349 4885,859 4885,1151 4885,1564 4885,1590 4886,240 4886,372 4886,1082 4886,1285 4886,1309 4886,1796 4886,1807 4886,1888 4886,1955 4886,2775 4886,3135 4887,1133 4887,1167 4887,1522 4887,1785 4888,171 4889,147 4889,885 4889,6303 4890,885 4890,13704 4891,34 4891,35 4892,4893 4894,4895 4896,264 4897,1556 4898,932 4898,1122 4898,1298 4899,3467 4900,850 4901,65 4901,255 4901,292 4901,315 4901,675 4901,1363 4901,1414 4901,4252 4902,4903 4903,392 4903,644 4903,3003 4903,3258 4903,4415 4903,6424 4903,7768 4903,13136 4903,29260 4903,49037 4903,91284 4903,150783 4903,150784 4903,151390 4903,151408 4903,151414 4903,151420 4903,152553 4904,1608 4904,77315 4905,4906 4907,589 4908,1515 4909,2205 4909,2206 4909,33424 4910,1414 4912,4913 4914,4915 4914,21912 4914,39420 4914,51837 4914,55106 4914,91104 4914,95214 4914,105356 4914,105901 4914,112720 4916,346 4917,4918 4917,16062 4919,104 4919,134 4919,137 4919,2105 4920,1 4921,346 4922,3345 4923,602 4924,1085 4925,188 4926,663 4926,664 4927,34 4927,35 4928,195 4929,349 4930,4931 4932,505 4932,1837 4933,217 4933,435 4933,541 4933,561 4933,1907 4933,3246 4933,3247 4933,3297 4933,4672 4933,4831 4933,4934 4933,4935 4933,4936 4933,8330 4933,19809 4933,21826 4933,21938 4933,43604 4933,43605 4933,43606 4933,43607 4933,43608 4933,43609 4933,43610 4933,43611 4937,772 4938,772 4938,4939 4938,4940 4938,4941 4938,15807 4938,53230 4939,30 4939,772 4939,4936 4941,30 4941,200 4941,248 4941,328 4941,772 4941,1014 4941,1415 4941,4941 4941,15807 4941,28203 4941,95554 4942,663 4943,147 4944,4945 4946,4947 4948,1127 4949,417 4950,1977 4950,1978 4951,4952 4951,70325 4951,115642 4953,861 4954,4955 4954,97868 4956,72 4957,1192 4958,781 4959,346 4960,1370 4961,104 4961,850 4962,346 4963,44 4964,622 4965,272 4966,4967 4968,4967 4969,4967 4970,269 4971,885 4972,366 4973,4974 4975,346 4976,366 4977,1515 4978,83 4979,4980 4980,4980 4981,346 4982,1007 4983,104 4984,83 4984,86 4984,254 4984,267 4984,269 4984,271 4984,356 4984,483 4984,1179 4984,1313 4984,2372 4984,34511 4984,115652 4984,131622 4985,605 4985,1235 4985,1335 4986,81 4987,1773 4988,697 4989,4990 4991,136 4991,138 4992,376 4993,192 4993,1392 4993,1745 4994,1381 4995,50 4995,841 4995,2048 4996,233 4997,1132 4998,762 4998,911 4999,1893 5000,251 5000,1531 5000,2567 5001,83 5002,298 5002,1639 5003,1424 5004,515 5005,83 5006,22 5007,323 5008,186 5008,1326 5008,1411 5008,5961 5009,1068 5010,94 5010,500 5010,2787 5010,3769 5011,104 5011,111 5011,134 5011,248 5011,289 5011,290 5011,298 5011,372 5011,557 5011,631 5011,714 5011,1016 5011,1119 5011,1462 5011,1659 5011,1745 5011,1955 5011,8180 5011,8537 5011,94134 5012,178 5013,366 5014,430 5015,48 5016,302 5016,861 5017,827 5018,920 5018,1619 5019,660 5020,1298 5021,338 5021,1631 5023,885 5023,13704 5024,430 5025,2737 5026,720 5027,1227 5027,1229 5027,21944 5028,602 5029,5030 5031,5031 5032,877 5033,388 5033,392 5034,8 5034,19 5034,187 5034,385 5034,1313 5034,1718 5034,2168 5034,2224 5034,2421 5034,3644 5034,5034 5034,5036 5034,5038 5034,5039 5034,5040 5034,5041 5034,5042 5034,5326 5034,8220 5034,15094 5034,19286 5034,31039 5034,45666 5034,60321 5034,74555 5034,81151 5034,82163 5034,82217 5034,82659 5034,83790 5034,83791 5034,83793 5034,83795 5034,90111 5034,95305 5034,107043 5034,133012 5034,140758 5034,147768 5034,148305 5034,155621 5034,158398 5034,160321 5034,160322 5034,175850 5034,178722 5034,185859 5034,185867 5034,188791 5034,189121 5034,192614 5034,205733 5034,213388 5034,218806 5034,222588 5034,229679 5034,258707 5035,344 5037,647 5037,919 5037,1179 5040,5034 5043,509 5043,783 5043,1043 5043,1345 5043,1424 5043,3367 5044,5030 5045,306 5045,307 5046,83 5046,13980 5047,338 5048,147 5048,158 5048,406 5048,779 5049,50 5049,79 5049,158 5049,406 5049,779 5049,1181 5049,1414 5049,1515 5049,2931 5050,10 5050,22 5050,240 5050,269 5050,302 5050,758 5050,818 5050,861 5050,893 5050,1572 5050,2017 5050,17309 5051,390 5052,192 5052,256 5052,390 5052,615 5052,703 5052,808 5052,1118 5052,1133 5052,1844 5052,6638 5052,50176 5053,104 5053,264 5053,323 5053,332 5053,557 5053,872 5053,1130 5053,1332 5053,1381 5053,1572 5053,1688 5053,1722 5053,1893 5053,4039 5053,4276 5053,7270 5054,647 5054,991 5054,2260 5054,3177 5055,119 5056,302 5057,264 5057,338 5057,360 5057,509 5057,1052 5057,1147 5057,1289 5057,1659 5058,1659 5058,1893 5059,79 5060,63 5061,217 5061,397 5061,1181 5061,1417 5062,784 5063,3297 5064,202 5064,203 5065,809 5066,178 5066,622 5066,1033 5067,1572 5068,441 5069,83 5070,202 5070,203 5070,516 5071,338 5072,217 5073,206 5073,602 5073,788 5073,957 5073,1634 5073,1815 5073,36761 5074,5030 5075,209 5076,167 5076,968 5077,1313 5079,338 5080,171 5080,726 5080,859 5080,980 5080,4611 5081,3585 5082,2051 5083,447 5083,934 5084,861 5085,660 5086,1579 5087,1639 5088,306 5088,307 5090,2224 5091,589 5092,985 5093,422 5094,604 5094,968 5095,422 5096,422 5097,422 5098,422 5099,422 5100,10 5100,175 5100,195 5100,668 5100,1893 5100,5101 5100,5103 5100,183501 5102,3378 5102,5100 5102,5103 5102,5149 5102,5150 5102,5463 5102,5464 5102,5465 5102,5603 5102,7384 5102,7479 5102,7699 5102,8039 5102,14087 5102,14836 5102,15366 5102,17203 5102,17644 5102,17645 5102,18716 5102,18788 5102,20961 5102,20970 5102,20974 5102,21024 5102,21821 5102,21824 5102,23208 5102,28164 5102,28267 5102,29182 5102,29434 5102,29615 5102,30342 5102,30759 5102,30761 5102,31806 5102,31807 5102,31808 5102,31809 5102,31810 5102,31811 5102,31812 5102,31813 5102,31814 5102,31815 5102,31816 5102,31817 5102,31818 5102,31819 5102,31820 5102,31821 5102,31822 5102,31823 5102,31824 5102,31825 5102,31826 5102,31827 5102,31828 5102,31829 5102,31830 5102,31831 5102,31833 5102,31834 5102,31835 5102,31836 5102,31837 5102,31838 5102,31839 5102,31840 5102,31841 5102,31842 5102,31843 5102,31844 5102,31845 5102,31846 5102,31847 5102,31848 5102,31849 5102,31850 5102,31851 5102,31852 5102,33648 5102,33986 5102,35588 5102,35589 5102,36248 5102,36332 5102,36648 5102,36931 5102,37379 5102,37380 5102,37382 5102,37383 5102,37384 5102,37385 5102,38168 5102,38365 5102,38373 5102,39982 5102,39987 5102,39988 5102,39989 5102,40666 5102,44174 5102,45256 5102,45832 5102,45877 5104,192 5104,336 5105,403 5105,628 5106,1388 5107,422 5108,859 5108,1033 5109,63 5110,452 5110,457 5110,497 5111,140 5112,250 5112,887 5112,1235 5112,1335 5113,140 5114,292 5115,3507 5116,1402 5117,358 5118,1803 5118,21442 5119,247 5120,887 5121,1402 5122,5123 5124,30 5124,97 5124,147 5124,175 5124,184 5124,337 5124,563 5124,920 5124,1089 5124,1425 5124,1619 5124,1623 5124,2782 5125,306 5126,307 5127,1117 5128,577 5129,186 5129,518 5129,626 5129,668 5129,775 5129,1001 5129,1014 5129,1326 5129,1411 5129,1453 5129,1454 5129,1836 5129,2995 5129,3804 5129,5130 5130,186 5130,518 5130,765 5130,775 5130,794 5130,795 5130,1298 5130,1326 5130,1411 5130,1545 5130,1599 5130,1749 5130,2775 5130,3115 5130,3407 5130,3718 5130,5129 5130,5385 5130,5388 5130,6470 5130,15474 5130,21473 5130,33695 5130,40491 5130,44727 5130,48006 5130,49121 5130,59098 5130,88120 5130,96685 5130,98940 5130,173744 5131,15 5131,140 5131,264 5131,338 5131,736 5131,1509 5131,1893 5131,3474 5132,415 5133,171 5133,602 5133,620 5133,1849 5134,323 5135,86 5135,358 5135,657 5135,673 5135,891 5135,980 5135,1130 5135,1227 5135,1749 5135,3218 5135,86416 5136,668 5137,634 5137,1052 5137,1212 5137,1767 5137,1849 5137,2701 5138,720 5139,298 5139,390 5140,462 5140,1127 5141,146 5142,5143 5144,3555 5145,202 5145,203 5145,620 5146,86 5147,302 5148,302 5148,1803 5148,21442 5151,202 5151,203 5152,79 5153,1436 5154,589 5154,720 5155,104 5155,192 5155,200 5155,256 5155,1715 5155,1796 5155,2979 5155,3804 5157,1285 5157,1634 5158,192 5158,992 5159,1849 5160,595 5160,703 5160,1151 5160,1453 5160,3258 5161,1014 5162,24 5162,2893 5162,34060 5163,217 5163,477 5163,644 5163,1417 5163,1882 5163,2944 5163,6506 5164,5165 5166,500 5167,302 5168,22 5168,579 5169,764 5169,3804 5170,1326 5171,390 5172,491 5173,192 5173,313 5173,2421 5174,81 5174,211 5174,406 5174,640 5175,147 5176,577 5177,687 5177,1556 5178,217 5178,657 5178,1210 5179,65 5180,10 5181,79 5181,81 5181,301 5181,393 5181,1282 5181,1284 5181,1634 5181,4355 5183,1052 5183,162599 5184,158 5185,217 5185,292 5185,455 5185,509 5185,1010 5185,1118 5185,1282 5185,1298 5185,1465 5185,1801 5185,1955 5185,2083 5185,2373 5185,2979 5186,186 5186,372 5186,388 5186,390 5186,589 5186,626 5186,694 5186,934 5186,1001 5186,1082 5186,1085 5186,1118 5186,1300 5186,1522 5186,1544 5186,1572 5186,3193 5186,4066 5186,75912 5186,103860 5187,298 5188,485 5189,140 5189,202 5189,203 5189,254 5189,346 5189,439 5189,671 5189,1007 5189,1294 5189,1612 5190,859 5190,1639 5191,5192 5192,207 5192,336 5192,1087 5192,1434 5192,1607 5192,1955 5192,3582 5192,3666 5192,5191 5192,20757 5192,21569 5192,27060 5192,29679 5192,60116 5192,111065 5192,116042 5192,131662 5192,132767 5192,146792 5192,148813 5192,161501 5192,216663 5192,217421 5192,217587 5192,233507 5192,242318 5192,250776 5193,366 5193,622 5193,718 5193,929 5193,1566 5193,4678 5194,1782 5195,1167 5196,433 5196,1634 5197,1160 5198,387 5199,852 5200,875 5201,79 5202,710 5202,1127 5202,1673 5203,1454 5204,106 5205,302 5206,360 5206,1639 5207,143 5208,34 5208,35 5208,222 5208,240 5208,261 5208,278 5208,349 5208,392 5208,433 5208,455 5208,657 5208,1417 5208,2266 5208,13137 5208,33508 5208,115474 5208,127158 5209,808 5210,313 5211,872 5211,5212 5212,439 5212,1068 5212,1663 5212,19338 5212,24707 5212,29742 5212,49407 5212,49673 5212,60759 5212,69431 5212,73496 5212,75349 5212,85662 5212,109098 5212,116697 5212,143487 5212,165867 5212,175910 5213,10 5213,11 5213,314 5213,452 5213,457 5213,567 5213,693 5213,843 5213,849 5213,911 5213,972 5213,1011 5213,1135 5213,1172 5213,1204 5213,1284 5213,1293 5213,1434 5213,1844 5213,5540 5213,5591 5213,7087 5213,8419 5213,19413 5213,23027 5213,25598 5213,29886 5213,38881 5213,41927 5213,45859 5213,47664 5213,57149 5213,62780 5213,62837 5213,62870 5213,101652 5213,113959 5213,148027 5213,156593 5213,189795 5213,207659 5213,214190 5213,214653 5213,215874 5213,227031 5213,236785 5213,237286 5213,237457 5213,243011 5213,244646 5213,245416 5213,245713 5213,247705 5213,256912 5214,186 5214,1118 5215,225 5215,1332 5216,5217 5218,328 5219,425 5220,5221 5223,399 5223,1419 5223,7698 5224,1639 5225,417 5225,714 5225,2008 5226,314 5226,1566 5227,634 5228,240 5228,439 5228,1019 5228,1181 5229,631 5229,992 5230,388 5230,455 5231,392 5231,818 5231,1634 5231,127158 5232,2553 5233,5234 5235,5234 5236,5234 5237,5234 5238,1167 5239,5240 5243,784 5244,65 5244,957 5244,1247 5244,1815 5244,109503 5244,164572 5245,1659 5246,1515 5247,302 5248,298 5249,485 5250,186 5250,326 5250,402 5250,752 5250,1210 5250,1267 5250,1293 5250,1559 5250,2182 5250,2470 5250,2672 5250,15344 5250,20601 5250,23029 5250,29328 5250,34085 5250,35292 5250,39438 5250,39958 5250,46271 5250,48002 5250,55832 5250,62850 5250,65621 5250,88976 5250,90132 5250,92356 5250,116652 5250,117738 5250,118243 5250,120638 5250,174074 5250,227671 5250,234303 5250,245841 5250,255611 5251,160 5251,420 5251,861 5252,1836 5253,195 5254,3555 5255,301 5255,510 5255,968 5255,1231 5255,2480 5256,809 5257,323 5258,104 5258,292 5258,338 5258,462 5258,805 5258,809 5258,835 5258,1572 5258,1688 5258,1722 5258,1893 5258,4039 5259,77 5259,595 5259,809 5259,1453 5259,2116 5260,512 5260,4028 5260,5260 5260,5261 5260,7769 5260,13161 5260,21494 5260,30318 5260,80368 5260,80956 5260,82054 5260,98012 5260,99763 5260,110141 5260,114070 5260,123516 5260,136044 5260,152923 5260,175213 5260,178652 5260,179711 5260,181897 5260,219909 5260,222365 5260,225613 5260,226166 5260,233994 5262,694 5262,698 5262,1782 5263,217 5263,302 5263,861 5263,1556 5263,4823 5264,392 5265,10 5265,215 5265,446 5265,693 5265,714 5265,907 5265,911 5265,3507 5265,5265 5265,5266 5265,5555 5265,22482 5265,38836 5265,38863 5265,73292 5265,155380 5265,206084 5266,264 5267,875 5268,518 5268,1955 5268,2775 5269,264 5271,1323 5272,102 5273,1326 5274,408 5275,178 5276,1262 5277,626 5278,240 5278,289 5278,290 5278,372 5278,592 5278,631 5278,805 5278,932 5278,1085 5278,1392 5278,1462 5278,1631 5278,1818 5278,1955 5278,2205 5278,2206 5278,2620 5278,2995 5278,3069 5278,5718 5278,8537 5278,33424 5279,577 5279,596 5279,1368 5279,1429 5280,422 5280,602 5281,1847 5282,22 5282,264 5282,515 5282,801 5282,1052 5282,1381 5282,4039 5283,503 5285,457 5285,510 5285,623 5285,809 5285,980 5285,1274 5285,49193 5286,2209 5287,1147 5288,65 5288,1247 5289,489 5290,10 5291,247 5292,160 5292,1837 5295,3260 5297,304 5298,1133 5299,390 5300,673 5301,46 5301,167 5301,299 5301,673 5301,783 5301,968 5301,1544 5301,1849 5301,2083 5301,2372 5301,2588 5301,2810 5301,3207 5301,3218 5301,3630 5301,5301 5301,6824 5301,7087 5301,13299 5301,13480 5301,24579 5301,26742 5301,29760 5301,31731 5301,39708 5301,41854 5301,46165 5301,62932 5301,73355 5301,88306 5301,97699 5301,110186 5301,110575 5301,120978 5301,127404 5301,127807 5301,128922 5301,135333 5301,148335 5301,167083 5301,167808 5301,182909 5301,186497 5301,192508 5301,194007 5301,194566 5301,204721 5301,214981 5301,215322 5301,226499 5301,240769 5301,242379 5301,253721 5302,326 5302,873 5302,874 5302,1801 5303,330 5304,861 5305,438 5306,54 5306,477 5306,634 5306,660 5306,2168 5306,2424 5306,2646 5306,2944 5306,23287 5309,5310 5312,949 5314,30 5315,211 5316,3846 5317,1149 5317,3182 5318,5319 5318,8907 5318,32480 5318,36069 5318,36675 5318,40155 5318,44550 5318,52683 5318,53980 5318,57770 5318,67941 5318,68069 5318,85035 5318,88876 5318,89292 5318,97728 5318,99029 5318,101881 5318,103600 5318,105139 5318,105314 5318,106339 5318,106628 5318,107252 5318,107325 5318,109504 5318,112389 5320,433 5321,417 5322,818 5323,852 5324,314 5324,433 5325,385 5325,657 5325,1881 5325,2779 5325,4637 5326,19 5326,34 5326,35 5326,83 5326,222 5326,313 5326,385 5326,389 5326,536 5326,634 5326,849 5326,1313 5326,1571 5326,1576 5326,1618 5326,1718 5326,1724 5326,1843 5326,2159 5326,2168 5326,2224 5326,2424 5326,2646 5326,2784 5326,2944 5326,4223 5326,5326 5326,5327 5326,7847 5326,8431 5326,16242 5326,17811 5326,17825 5326,18345 5326,18831 5326,19443 5326,19562 5326,23287 5326,27115 5326,33055 5326,45666 5326,62539 5326,67284 5326,75340 5326,152166 5326,174955 5326,181063 5326,186608 5326,188791 5326,198176 5328,1240 5330,417 5331,41 5331,694 5331,805 5331,1177 5331,1608 5331,2210 5331,6556 5331,182162 5332,272 5333,1515 5335,221 5335,5336 5335,28163 5335,30696 5335,35842 5335,51376 5335,51558 5335,53633 5335,54680 5335,56967 5335,57145 5335,57400 5335,57918 5335,78260 5335,78274 5335,78281 5335,79472 5335,79557 5335,81819 5335,81916 5335,82506 5335,85320 5335,87882 5335,88197 5335,91091 5335,92374 5335,95468 5335,98719 5335,98883 5335,99402 5335,100133 5335,100156 5335,102005 5335,104873 5335,105442 5335,108389 5335,109420 5335,111645 5335,112920 5335,188931 5335,193530 5335,233740 5337,717 5338,298 5339,485 5341,252 5341,318 5341,41170 5342,158 5342,192 5342,195 5342,406 5342,640 5342,973 5342,1181 5342,2244 5342,2371 5342,2626 5342,2931 5342,3297 5342,4192 5342,4193 5342,5343 5342,8822 5342,68069 5343,5343 5345,1052 5346,120 5346,261 5346,332 5346,588 5346,590 5346,760 5346,805 5346,818 5346,1119 5346,1402 5346,1466 5346,1818 5346,1955 5346,2989 5346,2991 5346,6837 5346,127158 5347,2443 5348,1769 5349,312 5349,525 5349,1749 5350,158 5351,657 5351,718 5351,760 5351,1014 5351,5102 5353,192 5353,264 5353,301 5353,516 5353,920 5353,1010 5353,1147 5353,1210 5353,1531 5355,1556 5356,71 5356,146 5356,163 5356,252 5356,287 5356,344 5356,379 5356,390 5356,485 5356,663 5356,682 5356,685 5356,702 5356,733 5356,775 5356,795 5356,841 5356,849 5356,859 5356,911 5356,1127 5356,1133 5356,1188 5356,1240 5356,1285 5356,1319 5356,1332 5356,1515 5356,1566 5356,1985 5356,2353 5356,4545 5356,7194 5356,19010 5356,26450 5356,44725 5356,72439 5356,139010 5356,221828 5356,227376 5357,4 5357,5 5357,10 5357,50 5357,56 5357,79 5357,147 5357,158 5357,171 5357,192 5357,195 5357,206 5357,272 5357,323 5357,406 5357,602 5357,622 5357,628 5357,640 5357,693 5357,779 5357,841 5357,920 5357,957 5357,1149 5357,1235 5357,1247 5357,1335 5357,1425 5357,1515 5357,1623 5357,2244 5357,2719 5357,2867 5357,2868 5357,3370 5357,3876 5357,4865 5357,4866 5357,5358 5357,5359 5357,6051 5357,7270 5357,8270 5357,14352 5357,14453 5357,24505 5357,54064 5357,88018 5357,125569 5357,136574 5357,164572 5360,147 5360,158 5361,68 5361,240 5361,818 5361,859 5361,1012 5362,1579 5363,5 5363,1181 5363,1235 5363,3370 5363,8180 5363,125569 5363,164572 5364,163 5364,302 5365,5366 5366,5366 5367,491 5368,81 5369,326 5370,182 5371,338 5371,707 5371,1893 5372,104 5373,56 5374,5375 5375,1235 5375,1335 5375,5375 5375,9156 5375,17151 5375,18158 5375,30079 5375,44371 5375,83691 5375,93839 5375,98083 5375,113123 5375,119402 5375,125499 5375,135769 5375,135770 5375,147202 5375,170280 5375,184272 5376,192 5376,264 5376,301 5376,312 5376,435 5376,439 5376,1010 5376,1381 5376,1955 5376,2979 5377,1247 5377,164572 5378,862 5379,1118 5380,392 5380,1240 5380,1465 5380,3260 5382,68 5382,186 5382,240 5382,261 5382,301 5382,440 5382,444 5382,525 5382,538 5382,615 5382,968 5382,972 5382,1010 5382,1293 5382,1326 5382,1385 5382,1411 5382,1782 5382,1837 5382,3804 5382,5662 5382,5961 5382,31977 5383,500 5384,163 5385,186 5385,425 5385,518 5385,764 5385,775 5385,795 5385,1011 5385,1326 5385,1411 5385,3804 5385,5130 5385,5961 5385,19005 5386,10 5386,97 5386,99 5386,147 5386,158 5386,333 5386,336 5386,366 5386,422 5386,640 5386,841 5386,1572 5386,1659 5386,1888 5386,2244 5386,60576 5387,510 5387,525 5388,186 5388,240 5388,314 5388,390 5388,467 5388,518 5388,599 5388,685 5388,764 5388,775 5388,794 5388,795 5388,838 5388,1011 5388,1014 5388,1046 5388,1326 5388,1411 5388,1749 5388,1796 5388,1849 5388,2006 5388,2334 5388,3507 5388,3804 5388,5130 5388,26450 5388,127158 5388,215874 5389,143 5390,68 5391,596 5391,1368 5392,440 5392,622 5393,200 5394,1983 5395,726 5396,710 5397,489 5398,1285 5399,200 5400,518 5401,1 5401,10 5401,97 5401,146 5401,147 5401,175 5401,206 5401,333 5401,336 5401,366 5401,505 5401,640 5401,5726 5401,92476 5401,152224 5402,644 5403,644 5404,227 5404,433 5404,1635 5404,2421 5404,2750 5404,8855 5405,30 5405,104 5405,136 5405,137 5405,200 5405,225 5405,248 5405,256 5405,328 5405,408 5405,450 5405,557 5405,636 5405,685 5405,693 5405,715 5405,772 5405,850 5405,943 5405,1179 5405,1332 5405,1415 5405,2596 5405,3182 5405,3246 5405,3247 5405,3565 5405,3633 5405,4276 5405,5405 5405,5718 5405,6023 5405,7348 5405,9379 5405,13207 5405,13220 5405,13522 5405,18625 5405,19452 5405,20395 5405,20750 5405,20842 5405,21809 5405,22105 5405,22145 5405,22537 5405,22907 5405,23065 5405,23539 5405,23542 5405,23561 5405,23571 5405,24618 5405,24622 5405,24772 5405,25036 5405,25479 5405,26136 5405,26221 5405,26432 5405,26602 5405,26608 5405,26830 5405,28112 5405,29131 5405,29321 5405,31354 5405,31388 5405,34018 5405,39139 5405,39579 5405,40879 5405,44776 5405,45175 5405,45550 5405,46176 5405,46261 5405,46824 5405,56447 5405,57166 5405,58569 5405,59207 5405,59935 5405,62896 5405,63465 5405,65913 5405,70026 5405,73162 5405,77627 5405,80116 5405,80403 5405,81703 5405,81767 5405,84635 5405,84655 5405,85784 5405,85814 5405,86470 5405,86834 5405,87101 5405,90956 5405,94232 5405,98188 5405,98252 5405,103201 5405,110731 5405,113911 5405,119120 5405,121105 5405,122140 5405,123779 5405,123786 5405,123808 5405,126364 5405,126914 5405,127157 5405,127272 5405,127536 5405,134309 5405,136217 5405,136570 5405,140008 5405,142367 5405,146350 5405,146733 5405,148269 5405,148959 5405,150776 5405,155750 5405,156774 5405,159426 5405,162539 5405,162582 5405,162587 5405,165062 5405,169016 5405,171190 5405,172209 5405,177880 5405,181802 5405,181858 5405,182743 5405,182767 5405,190276 5405,198107 5405,204775 5405,205589 5405,212022 5405,212360 5405,214179 5405,219387 5405,222356 5405,236358 5405,236716 5405,244743 5405,245478 5405,246026 5405,249948 5405,254172 5405,254283 5406,1579 5406,1871 5407,1285 5407,1955 5408,143 5410,818 5410,861 5410,1556 5410,2017 5411,2334 5412,240 5412,1285 5412,1888 5412,2620 5413,41 5413,119 5413,298 5413,640 5413,843 5413,1012 5413,7155 5414,13 5414,663 5415,163 5416,298 5417,485 5418,48 5419,3328 5420,97 5420,1381 5420,1688 5421,149 5421,406 5421,118336 5423,107 5423,111 5423,292 5423,1332 5423,1415 5424,56 5424,841 5424,30331 5425,26 5425,59 5425,884 5425,885 5425,886 5425,887 5425,1432 5425,21944 5426,697 5426,852 5427,2775 5427,3623 5428,54 5429,2989 5429,2991 5431,298 5432,485 5433,328 5433,1078 5433,4223 5434,968 5435,54 5436,1515 5436,1544 5437,344 5437,827 5439,10 5439,104 5439,134 5439,135 5439,328 5439,417 5439,442 5439,609 5439,636 5439,772 5439,1001 5439,1119 5439,1257 5439,1359 5439,1882 5439,1888 5439,2105 5439,2315 5439,3474 5439,3623 5439,5440 5439,32914 5440,3507 5440,5440 5440,6824 5440,189839 5441,15 5442,5443 5444,5443 5445,217 5445,278 5445,509 5445,536 5445,7572 5445,20359 5446,3585 5447,1424 5449,392 5450,1 5451,120 5451,697 5451,818 5451,1072 5451,1453 5451,2173 5451,2989 5451,2991 5452,50 5452,158 5452,192 5452,195 5452,278 5452,285 5452,356 5452,406 5452,640 5452,779 5452,841 5452,1085 5452,1175 5452,1181 5452,1467 5452,1515 5452,2296 5452,3138 5452,3585 5452,5874 5452,6119 5454,2205 5454,2206 5455,301 5455,604 5455,968 5456,58 5457,1001 5458,19 5458,71 5458,477 5458,536 5458,1618 5458,2168 5458,23287 5459,749 5460,1877 5460,21442 5461,136 5461,302 5461,538 5461,893 5461,15179 5462,3695 5465,5101 5467,135 5467,309 5467,310 5467,389 5467,577 5467,1010 5467,1014 5467,1177 5467,1235 5467,1345 5467,1392 5467,1707 5467,1860 5467,2073 5467,2210 5467,2416 5467,2417 5467,3804 5467,5718 5467,9005 5467,31206 5468,305 5469,5469 5469,8177 5469,23202 5469,25150 5469,50679 5469,55877 5470,313 5470,697 5470,1332 5470,1805 5470,3769 5471,58 5472,30 5472,50 5472,104 5472,111 5472,267 5472,304 5472,328 5472,356 5472,372 5472,417 5472,435 5472,440 5472,615 5472,622 5472,631 5472,784 5472,794 5472,801 5472,862 5472,943 5472,1085 5472,1179 5472,1332 5472,1844 5472,1939 5472,2083 5472,2206 5472,2995 5472,3247 5472,33424 5472,75912 5473,58 5474,134 5474,158 5474,318 5474,818 5474,41170 5475,907 5475,932 5476,2506 5477,2506 5479,3003 5480,333 5482,315 5483,2353 5484,887 5485,147 5485,158 5485,192 5485,620 5485,779 5486,693 5486,1147 5486,1623 5487,10 5488,862 5488,3585 5488,27041 5489,4549 5490,2353 5491,1388 5492,259 5492,456 5492,483 5492,1118 5492,2599 5492,3951 5492,3971 5492,5492 5492,5493 5492,5583 5492,6595 5492,6652 5492,6849 5492,6973 5492,15104 5492,15783 5492,16609 5492,18627 5492,20648 5492,21278 5492,23115 5492,23125 5492,24513 5492,24665 5492,27855 5492,30448 5492,30451 5492,31396 5492,34048 5492,34122 5492,37380 5492,38842 5492,38951 5492,39453 5492,47650 5492,48643 5492,49568 5492,53760 5492,56930 5492,57043 5492,59079 5492,63371 5492,63386 5492,64015 5492,64746 5492,68150 5492,68157 5492,68206 5492,68323 5492,68741 5492,70998 5492,72638 5492,72691 5492,73547 5492,74397 5492,74449 5492,75905 5492,76053 5492,77652 5492,77922 5492,80042 5492,80677 5492,83461 5492,83857 5492,87305 5492,88516 5492,93026 5492,93730 5492,94131 5492,94890 5492,95387 5492,98896 5492,104299 5492,104409 5492,104574 5492,104598 5492,105620 5492,105628 5492,107496 5492,111307 5492,112242 5492,112619 5492,116595 5492,117922 5492,120730 5492,120833 5492,125379 5492,125390 5492,125506 5492,128856 5492,131882 5492,133624 5492,135182 5492,135335 5492,135971 5492,136083 5492,136119 5492,150082 5492,150828 5492,154987 5492,155693 5492,159078 5492,159339 5492,159720 5492,160819 5492,163577 5492,163916 5492,164286 5492,164304 5492,165805 5492,170537 5492,173238 5492,175987 5492,178618 5492,178627 5492,179151 5492,181077 5492,182802 5492,182817 5492,182858 5492,183910 5492,184788 5492,185149 5492,185934 5492,186494 5492,188508 5492,189862 5492,190939 5492,191322 5492,191429 5492,194445 5492,195640 5492,219810 5492,220350 5492,228996 5492,239936 5492,239938 5492,261756 5493,579 5493,5726 5495,147 5495,158 5495,192 5495,195 5495,202 5495,203 5495,336 5495,505 5495,602 5495,1089 5495,1414 5495,1619 5495,1623 5495,6119 5495,8055 5495,22616 5496,151 5496,167 5496,1293 5496,1522 5496,2083 5496,2557 5497,861 5499,3585 5500,54 5500,120 5500,417 5500,536 5500,1363 5500,1467 5500,1749 5501,4771 5502,1580 5502,1837 5502,4411 5504,5505 5507,22 5508,589 5508,1001 5509,41 5509,1119 5511,5512 5513,2353 5514,920 5515,5516 5517,985 5518,26 5518,59 5519,644 5519,1151 5519,1363 5520,372 5521,147 5521,158 5521,118336 5522,267 5523,195 5525,2506 5526,2506 5528,920 5529,1631 5530,54 5530,58 5530,102 5530,146 5530,273 5530,274 5530,408 5530,422 5530,510 5530,1417 5530,1436 5530,1467 5530,2421 5530,2701 5530,2704 5530,3999 5530,29008 5530,92476 5531,4411 5532,2244 5533,505 5534,1007 5534,3999 5535,1149 5536,140 5536,147 5536,158 5536,278 5536,302 5536,309 5536,310 5536,328 5536,372 5536,392 5536,406 5536,592 5536,623 5536,631 5536,694 5536,760 5536,779 5536,818 5536,861 5536,1001 5536,1010 5536,1119 5536,1241 5536,1326 5536,1782 5536,1836 5536,1962 5536,5961 5536,6789 5536,121678 5537,868 5538,596 5538,1796 5539,1590 5540,349 5540,567 5540,697 5540,875 5540,911 5540,918 5540,1612 5540,1653 5540,1805 5540,1860 5540,2699 5540,3260 5540,5540 5540,172976 5540,185524 5541,135 5541,483 5542,1612 5543,217 5543,918 5543,1010 5543,1085 5544,167 5545,760 5545,784 5546,330 5546,2146 5546,5547 5547,58 5547,87 5547,111 5547,217 5547,240 5547,292 5547,301 5547,360 5547,420 5547,441 5547,676 5547,749 5547,872 5547,1118 5547,1140 5547,1188 5547,1235 5547,1240 5547,1326 5547,1335 5547,1392 5547,1411 5547,1572 5547,1653 5547,1860 5547,1973 5547,2436 5547,2443 5547,3474 5547,3804 5547,4252 5547,5547 5547,7124 5547,9005 5547,9025 5547,22924 5547,54004 5548,640 5549,240 5549,1564 5550,195 5551,497 5551,1262 5551,1332 5551,1572 5551,1844 5551,11147 5552,227 5552,503 5552,1149 5553,309 5553,310 5554,640 5555,941 5555,5265 5556,2051 5557,2244 5558,707 5559,873 5560,5561 5562,1522 5563,68 5563,192 5563,240 5563,264 5563,301 5563,467 5563,1294 5563,1402 5563,1531 5563,1849 5563,2286 5563,2620 5563,32784 5564,1634 5565,333 5565,393 5565,1531 5566,5567 5568,187 5568,326 5568,623 5568,1616 5568,1801 5568,3003 5568,5591 5569,1019 5570,2923 5570,3524 5570,4190 5571,298 5572,485 5573,104 5573,134 5573,135 5573,137 5574,107 5574,338 5574,588 5574,590 5574,714 5574,1119 5574,1235 5574,1335 5575,704 5576,467 5576,595 5576,1151 5576,1893 5577,296 5577,1381 5577,1579 5577,14550 5578,298 5578,467 5578,631 5578,784 5578,872 5578,1010 5578,1085 5578,1119 5578,1133 5578,1179 5578,1462 5578,1844 5578,3623 5578,8537 5578,185877 5580,344 5580,710 5580,1711 5580,1836 5581,2681 5581,31977 5582,1977 5582,1978 5583,184 5583,259 5583,784 5584,440 5584,622 5584,794 5585,298 5586,485 5587,795 5587,875 5587,1117 5587,1122 5588,264 5588,292 5588,647 5588,872 5588,1579 5588,1659 5589,3804 5590,1381 5591,241 5591,278 5591,283 5591,313 5591,356 5591,379 5591,385 5591,455 5591,668 5591,685 5591,852 5591,1026 5591,1816 5591,1843 5591,2159 5591,2784 5591,2944 5591,3686 5591,4637 5591,5591 5591,6552 5591,8097 5591,13389 5591,13638 5591,15368 5591,15404 5591,15410 5591,15532 5591,15611 5591,15615 5591,15623 5591,21429 5591,21507 5591,22246 5591,22402 5591,23481 5591,24583 5591,28522 5591,29793 5591,30450 5591,30481 5591,31708 5591,33338 5591,34013 5591,38933 5591,41437 5591,42990 5591,44896 5591,44935 5591,47048 5591,48397 5591,55716 5591,60539 5591,62394 5591,64636 5591,65931 5591,70738 5591,76795 5591,76799 5591,77559 5591,80126 5591,86696 5591,87328 5591,92883 5591,97147 5591,98947 5591,106309 5591,107966 5591,109479 5591,109893 5591,109896 5591,122715 5591,125622 5591,126942 5591,128815 5591,134629 5591,134637 5591,145512 5591,145566 5591,147954 5591,148047 5591,148055 5591,148252 5591,150735 5591,152073 5591,161519 5591,169371 5591,169417 5591,169989 5591,172234 5591,172254 5591,173750 5591,173836 5591,174747 5591,176007 5591,176061 5591,177366 5591,178675 5591,189787 5591,192954 5591,193053 5591,194476 5591,194572 5591,195131 5591,195225 5591,212388 5591,220317 5591,223994 5591,224778 5591,231104 5591,232641 5591,243439 5591,244747 5591,245314 5591,245952 5591,253178 5591,255065 5592,1 5592,147 5592,158 5592,206 5592,406 5592,779 5592,1458 5592,2244 5592,118336 5593,390 5594,1805 5595,736 5596,1433 5596,1844 5596,3744 5597,4101 5598,1381 5599,433 5600,527 5601,406 5601,620 5601,1425 5601,1515 5601,1849 5601,92476 5601,141912 5602,332 5603,5101 5604,30 5604,278 5604,392 5604,433 5604,440 5604,510 5604,622 5604,697 5604,794 5604,809 5604,1033 5604,1453 5604,1805 5604,1860 5604,3247 5604,4039 5604,141912 5605,48 5606,577 5607,1849 5607,32784 5608,1722 5609,298 5610,485 5611,934 5612,272 5613,1893 5614,525 5614,1749 5615,4455 5616,309 5616,310 5616,483 5616,1836 5616,232766 5618,273 5618,274 5618,4611 5619,34 5619,35 5620,644 5620,3003 5621,779 5621,1181 5623,206 5623,467 5623,518 5623,868 5623,1326 5623,1849 5623,156379 5624,623 5624,919 5624,1805 5625,301 5625,467 5625,1118 5625,1433 5625,1837 5625,33611 5626,592 5626,1818 5627,28 5627,994 5627,2674 5627,16153 5627,21944 5628,298 5629,485 5630,491 5630,1985 5631,269 5631,440 5631,1417 5631,1796 5632,19 5632,808 5633,1634 5634,364 5634,1227 5634,1229 5634,2089 5634,2940 5634,21944 5634,86416 5635,1227 5635,1229 5635,21944 5635,86416 5636,861 5637,209 5637,302 5637,579 5637,861 5637,2116 5637,3769 5638,740 5638,741 5639,4411 5640,2083 5641,1566 5642,503 5643,835 5643,1381 5644,397 5644,2784 5645,72 5645,81 5645,111 5645,158 5645,215 5645,227 5645,233 5645,312 5645,349 5645,372 5645,388 5645,557 5645,605 5645,626 5645,718 5645,1001 5645,1085 5645,1140 5645,1149 5645,1179 5645,1238 5645,1467 5645,1479 5645,1544 5645,1572 5645,2209 5645,2266 5645,2779 5645,3538 5645,3695 5645,4455 5645,8798 5645,9018 5645,14797 5645,28130 5645,33611 5646,104 5646,217 5646,240 5646,372 5646,433 5646,589 5646,918 5646,1118 5646,1210 5646,1274 5646,1411 5646,1417 5646,1796 5646,3804 5646,5547 5646,13538 5648,77 5648,269 5649,1181 5650,743 5651,30331 5652,292 5652,366 5652,500 5652,972 5652,4101 5653,726 5654,167 5654,217 5654,240 5654,435 5654,818 5654,1085 5654,1298 5654,1381 5654,2557 5654,2812 5654,127158 5654,156379 5655,835 5656,240 5656,8276 5657,736 5657,1019 5657,3507 5659,919 5659,1612 5660,779 5660,1515 5660,4193 5661,424 5662,46 5662,301 5662,314 5662,522 5662,599 5662,604 5662,615 5662,663 5662,720 5662,937 5662,968 5662,973 5662,982 5662,1045 5662,1117 5662,1160 5662,1167 5662,1231 5662,1241 5662,1284 5662,1293 5662,1300 5662,1436 5662,1479 5662,1544 5662,1732 5662,1782 5662,1849 5662,2085 5662,2595 5662,2689 5662,2979 5662,3207 5662,3218 5662,3422 5662,3809 5662,5662 5662,7222 5662,8684 5662,13523 5662,14028 5662,15511 5662,15588 5662,17894 5662,23088 5662,25342 5662,28902 5662,29760 5662,32784 5662,34933 5662,35046 5662,36681 5662,37381 5662,39478 5662,40513 5662,42598 5662,45853 5662,46858 5662,48187 5662,49514 5662,50874 5662,54055 5662,55152 5662,63121 5662,72726 5662,101551 5662,132692 5662,136630 5662,143406 5662,152826 5662,161859 5662,227376 5662,264092 5663,1143 5664,158 5664,622 5665,1688 5666,10 5666,147 5666,175 5666,336 5666,2244 5666,3148 5666,4980 5666,13919 5667,326 5667,874 5667,5667 5667,31474 5667,87762 5667,101551 5667,105571 5667,139950 5668,143 5669,278 5670,22 5670,1019 5670,1454 5670,21982 5671,240 5671,247 5671,269 5672,433 5674,611 5675,298 5676,485 5677,589 5678,30 5678,328 5678,622 5678,1033 5678,141912 5679,264 5679,609 5679,760 5679,1147 5679,1149 5679,1631 5679,14797 5680,1143 5681,366 5681,4101 5682,306 5682,307 5682,493 5682,602 5682,682 5682,1220 5682,1222 5682,1512 5682,30331 5682,72439 5683,1858 5684,312 5686,673 5686,1130 5686,2373 5687,861 5688,1370 5689,1089 5690,577 5690,788 5690,1429 5691,586 5692,718 5692,893 5693,431 5693,805 5693,1285 5694,2105 5695,1983 5695,75912 5696,516 5696,920 5697,801 5697,3474 5697,5547 5698,5699 5700,26 5700,47 5700,59 5700,60 5700,211 5700,887 5700,994 5700,1235 5700,1335 5700,1432 5700,1707 5700,2089 5700,2469 5700,2674 5700,2940 5700,4748 5700,9539 5700,21944 5702,28130 5703,99 5703,298 5703,346 5703,483 5703,563 5703,726 5703,749 5703,1146 5703,1515 5703,2105 5703,2995 5703,146280 5704,2646 5704,48505 5705,1289 5706,233 5707,171 5707,5708 5709,1204 5710,349 5711,222 5712,163 5712,489 5712,811 5713,586 5713,2674 5715,137 5716,364 5717,248 5717,467 5717,1085 5717,5718 5717,156379 5718,175 5718,186 5718,192 5718,240 5718,256 5718,389 5718,446 5718,590 5718,693 5718,784 5718,818 5718,1011 5718,1285 5718,1359 5718,1505 5718,1564 5718,1785 5718,1818 5718,2620 5718,3028 5718,4540 5718,5278 5718,5405 5718,5717 5718,7087 5718,7915 5718,8178 5718,8205 5718,8479 5718,14139 5718,14603 5718,16514 5718,28409 5718,45857 5718,46574 5718,54551 5718,63102 5718,83158 5718,143377 5718,179119 5718,195048 5718,224095 5718,233508 5718,241742 5719,202 5719,203 5720,818 5721,660 5721,891 5721,19443 5722,83 5723,620 5724,707 5725,10 5725,147 5725,158 5725,336 5725,628 5725,1001 5725,3582 5725,5726 5725,28149 5728,126 5728,7757 5729,63 5729,158 5729,192 5729,202 5729,406 5729,493 5730,3769 5731,439 5732,209 5733,160 5733,366 5734,571 5735,3003 5736,1608 5738,344 5738,745 5739,707 5740,783 5741,1449 5742,149 5743,344 5744,298 5745,485 5746,264 5746,1381 5747,1298 5747,1616 5748,2089 5748,2940 5748,21944 5749,408 5750,195 5751,4637 5752,5753 5754,302 5754,861 5755,447 5756,626 5757,726 5758,283 5758,455 5758,1019 5759,493 5760,83 5761,58 5763,143 5764,893 5765,240 5765,1285 5765,1888 5766,273 5766,274 5766,726 5767,79 5768,278 5769,83 5770,217 5771,292 5772,483 5773,248 5773,850 5773,2596 5774,298 5775,485 5776,647 5776,1175 5777,1118 5778,417 5779,3321 5780,146 5781,385 5783,302 5783,579 5783,1556 5784,79 5785,713 5786,1452 5786,1639 5787,1167 5787,2979 5788,615 5788,852 5789,1818 5790,68 5790,392 5790,811 5791,389 5792,1732 5793,1012 5794,972 5795,1105 5796,338 5798,493 5799,209 5799,968 5800,875 5800,23783 5801,609 5801,1807 5801,1882 5801,1888 5801,6556 5802,140 5802,338 5802,340 5804,302 5804,525 5804,752 5804,1082 5804,1623 5804,1849 5804,2105 5804,4355 5805,338 5806,79 5806,1639 5807,579 5807,861 5808,985 5809,10 5809,104 5809,192 5809,264 5809,289 5809,290 5809,301 5809,312 5809,372 5809,503 5809,577 5809,805 5809,999 5809,1010 5809,1052 5809,1181 5809,1210 5809,1293 5809,1381 5809,2674 5809,8276 5809,31977 5809,94134 5810,63 5810,693 5811,83 5812,171 5812,313 5812,1181 5813,1467 5814,417 5815,685 5815,4411 5815,30331 5816,252 5816,1220 5816,1222 5817,575 5817,697 5817,1769 5817,3260 5818,818 5819,2156 5822,99 5822,682 5822,72439 5823,1639 5824,1579 5825,372 5825,1082 5825,1203 5825,1955 5825,3804 5827,182 5827,217 5827,264 5827,392 5827,467 5827,510 5827,515 5827,809 5827,872 5827,1052 5827,1118 5827,1147 5827,1417 5827,1551 5827,1659 5827,2496 5828,328 5828,390 5828,1119 5829,497 5830,254 5830,557 5830,954 5830,1939 5830,10318 5831,302 5832,2156 5833,182 5833,397 5833,599 5833,604 5833,626 5833,1204 5833,1844 5833,2373 5833,14182 5834,192 5834,5101 5835,10 5836,71 5836,611 5836,193129 5837,462 5837,577 5837,634 5837,1052 5837,1707 5838,200 5839,1118 5840,1133 5841,697 5844,1711 5845,1287 5846,509 5846,510 5846,723 5846,1043 5847,403 5848,872 5849,192 5850,301 5851,72 5851,87 5851,126 5851,439 5851,510 5851,535 5851,872 5851,920 5851,1118 5851,1143 5851,1298 5851,1326 5851,2006 5851,75912 5852,850 5853,868 5854,723 5854,2748 5855,843 5856,1836 5857,158 5858,1260 5859,313 5860,3260 5863,1127 5864,147 5864,192 5864,671 5864,1181 5865,668 5866,158 5866,192 5867,1227 5867,1229 5867,21944 5867,86416 5868,217 5868,283 5868,455 5868,536 5868,949 5869,1014 5869,1240 5870,83 5870,278 5871,26 5871,47 5871,59 5871,111 5871,292 5871,887 5871,1432 5871,2469 5871,2674 5871,2775 5871,2867 5871,2868 5871,21944 5871,22880 5872,485 5873,83 5873,447 5873,1274 5873,5874 5875,289 5875,290 5875,372 5875,714 5875,1012 5875,1818 5875,1955 5875,2008 5875,2296 5875,2620 5875,4218 5875,94134 5877,1659 5878,907 5878,932 5879,2051 5880,32 5880,314 5880,392 5880,1240 5880,1465 5880,3260 5880,76096 5881,26 5881,47 5881,59 5881,94 5881,967 5881,2469 5881,5700 5881,7222 5881,20485 5881,20486 5881,25120 5881,25796 5881,27222 5882,65 5883,10 5884,2006 5885,5886 5885,8928 5885,54104 5885,79491 5887,222 5887,313 5888,1374 5889,24 5889,28 5889,887 5889,2674 5889,3561 5889,4079 5889,4571 5889,21944 5890,184 5891,5892 5891,61846 5891,89069 5891,101854 5891,108816 5891,113478 5891,123246 5891,127480 5891,155920 5891,199626 5893,433 5894,406 5894,1265 5894,1266 5894,2931 5896,206 5896,1096 5897,647 5898,344 5899,5343 5900,336 5900,671 5901,516 5902,104 5902,298 5902,862 5902,863 5902,1085 5902,1459 5902,1462 5902,1608 5902,1655 5902,4609 5902,5903 5902,6068 5902,7790 5902,8537 5902,12886 5902,14149 5902,14969 5902,19798 5902,34726 5902,41129 5902,42581 5902,44725 5902,52488 5902,65886 5902,71161 5902,75912 5902,77122 5902,96836 5902,107205 5902,118815 5902,124881 5902,135194 5902,144079 5902,159337 5902,167576 5902,171555 5902,177029 5902,178254 5902,225584 5903,862 5904,406 5905,1019 5905,1467 5905,2421 5905,5906 5907,5908 5908,1619 5908,5907 5908,5908 5908,20655 5908,23085 5908,23139 5908,33006 5908,34126 5908,34301 5908,34561 5908,49746 5908,52946 5908,60849 5908,65057 5908,67368 5908,69444 5908,71292 5908,81783 5908,81785 5908,124187 5908,124416 5908,124704 5908,125101 5908,126598 5908,127470 5908,128372 5908,131026 5908,168525 5908,192419 5908,194194 5908,194201 5908,205063 5908,216644 5908,218828 5908,218831 5908,218832 5908,218833 5908,218835 5908,218836 5908,218837 5908,235058 5908,240507 5908,241155 5908,242855 5908,242856 5908,243318 5908,247094 5908,249477 5908,256777 5908,257310 5908,257562 5908,257651 5908,258041 5908,261196 5908,261786 5909,852 5910,5911 5912,97 5912,289 5912,290 5912,991 5912,1085 5912,1188 5912,1287 5912,1539 5912,1659 5912,2312 5913,336 5915,37 5915,71 5915,563 5915,611 5915,920 5915,1235 5915,1335 5915,1449 5916,147 5916,422 5916,1181 5916,1458 5916,8907 5916,80266 5917,392 5917,697 5918,143 5918,2006 5919,1033 5920,852 5920,3218 5921,516 5922,718 5923,1010 5924,2051 5925,438 5925,622 5925,1776 5926,509 5927,579 5927,893 5928,406 5929,143 5930,298 5931,485 5932,389 5932,455 5932,657 5932,660 5932,891 5932,1313 5932,1363 5932,1571 5932,1756 5932,1801 5932,1881 5932,2421 5932,2646 5932,2944 5932,13980 5932,28130 5934,328 5935,364 5935,609 5935,649 5935,694 5935,1082 5935,1745 5935,1807 5935,2205 5935,2572 5935,2775 5935,3115 5935,3623 5935,33424 5936,3585 5936,55849 5937,326 5937,1210 5938,171 5938,4691 5938,5708 5939,1634 5940,1509 5940,3041 5941,151 5943,417 5944,65 5944,156379 5945,3744 5946,1007 5947,1882 5948,72 5948,83 5948,119 5948,134 5948,278 5948,285 5948,347 5948,364 5948,372 5948,389 5948,417 5948,442 5948,455 5948,525 5948,626 5948,805 5948,907 5948,972 5948,1019 5948,1085 5948,1274 5948,1298 5948,1309 5948,1363 5948,1465 5948,1467 5948,1718 5948,1756 5948,1801 5948,1881 5948,2266 5948,2286 5948,2434 5948,2553 5948,2590 5948,2646 5948,2779 5948,2784 5948,4172 5948,13575 5949,1284 5950,1227 5950,1229 5951,743 5953,37 5953,717 5954,143 5955,433 5955,1634 5956,4831 5958,68 5959,392 5960,143 5961,10 5961,182 5961,425 5961,685 5961,693 5961,764 5961,765 5961,775 5961,794 5961,795 5961,838 5961,852 5961,911 5961,1001 5961,1085 5961,1326 5961,1796 5961,1973 5961,3093 5961,3094 5961,3804 5961,75912 5961,118327 5961,185874 5962,346 5963,167 5964,1782 5965,1241 5966,1124 5967,3193 5968,5969 5970,79 5971,192 5971,622 5971,1392 5972,147 5972,158 5973,515 5974,302 5974,2116 5975,5976 5976,5976 5977,1181 5978,1238 5979,1983 5980,160 5981,147 5981,158 5981,1623 5981,118336 5982,788 5983,973 5984,143 5985,86 5986,5987 5988,3207 5989,615 5990,1955 5991,192 5991,252 5991,1512 5991,1531 5991,5992 5992,63 5992,202 5992,203 5992,251 5992,252 5992,275 5992,493 5992,516 5992,682 5992,784 5992,1220 5992,1222 5992,1243 5992,1512 5992,1568 5992,1702 5992,1927 5992,2646 5992,2775 5992,2944 5992,5563 5992,5991 5992,5992 5992,7241 5992,7385 5992,9717 5992,13467 5992,13636 5992,14037 5992,19590 5992,19651 5992,19854 5992,20534 5992,21435 5992,22860 5992,24875 5992,26861 5992,28354 5992,34619 5992,40708 5992,41170 5992,42572 5992,48119 5992,64582 5992,66559 5992,72439 5992,87105 5992,94169 5992,127520 5992,131756 5992,163415 5993,202 5993,203 5994,151 5994,273 5994,274 5995,1151 5995,1572 5997,994 5998,972 5999,2750 6002,516 6003,1001 6004,240 6004,372 6004,1082 6004,1085 6004,1580 6004,1807 6004,2812 6004,4222 6004,6068 6004,75912 6005,2944 6006,247 6007,392 6008,2979 6009,4355 6010,389 6011,135 6011,143 6011,1052 6012,34 6012,35 6012,83 6012,313 6012,536 6012,949 6012,212914 6013,392 6013,809 6013,1363 6014,626 6015,6016 6015,17388 6015,19438 6015,53170 6015,56109 6015,84423 6017,1001 6017,1210 6017,1522 6017,5662 6017,6068 6018,515 6019,50 6020,1639 6021,509 6022,3115 6023,104 6023,137 6023,254 6023,503 6023,557 6023,596 6023,1143 6023,1282 6023,1363 6023,1939 6023,4276 6023,4355 6023,5405 6024,1564 6025,1506 6026,217 6026,6027 6026,227061 6027,6026 6027,6027 6027,65538 6027,102192 6027,127090 6027,137064 6027,140464 6027,159212 6027,231388 6028,267 6029,589 6030,907 6031,1167 6032,34 6032,35 6032,167 6032,187 6032,217 6032,222 6032,283 6032,290 6032,388 6032,455 6032,536 6032,631 6032,657 6032,702 6032,783 6032,808 6032,827 6032,1019 6032,1151 6032,1210 6032,1313 6032,1417 6032,1467 6032,1559 6032,1871 6032,2224 6032,2266 6032,6424 6032,6789 6032,15523 6032,48505 6032,94134 6033,298 6034,485 6035,605 6036,147 6036,6037 6036,31977 6036,52349 6036,57787 6036,103394 6036,104815 6036,106156 6036,170773 6036,188840 6036,193488 6036,196487 6036,207943 6038,417 6038,1085 6039,160 6040,143 6042,1240 6042,76096 6043,697 6045,22 6045,388 6045,392 6045,595 6045,703 6045,1392 6045,1453 6045,1949 6045,3258 6045,127158 6046,6047 6046,38088 6046,53159 6048,6049 6050,6051 6052,887 6053,2607 6054,26 6054,59 6054,865 6054,1432 6055,710 6056,1785 6057,3 6057,261 6057,390 6057,536 6057,702 6057,873 6057,874 6057,1210 6057,1544 6057,2045 6057,3182 6058,158 6058,1122 6058,6059 6058,18738 6059,87 6059,178 6059,918 6059,1240 6059,1465 6059,1805 6059,1949 6059,2646 6059,3260 6059,4760 6059,6058 6059,6059 6059,7098 6059,9756 6059,21380 6059,21404 6059,31414 6059,39445 6059,48782 6059,65771 6059,69250 6059,91880 6059,112321 6059,115713 6059,135926 6059,162599 6059,173261 6059,173279 6059,173285 6059,173921 6059,174325 6059,174471 6059,174494 6059,177355 6059,177381 6059,177429 6059,177431 6059,177433 6059,177435 6059,177436 6059,177773 6059,182734 6059,186480 6059,190272 6059,207837 6059,216773 6059,220919 6059,220923 6059,221905 6059,222192 6059,234066 6059,236492 6059,238244 6059,244633 6059,258683 6060,346 6061,1 6062,30 6062,328 6062,485 6062,693 6062,1238 6063,87 6063,872 6063,1454 6063,1556 6064,34 6064,35 6064,536 6064,2646 6064,2784 6064,4672 6064,7698 6064,18831 6065,3138 6066,406 6066,779 6066,1181 6067,3447 6068,298 6068,372 6068,417 6068,425 6068,534 6068,589 6068,596 6068,685 6068,693 6068,694 6068,782 6068,852 6068,862 6068,911 6068,1085 6068,1133 6068,1353 6068,1544 6068,1572 6068,1580 6068,2290 6068,2296 6068,2747 6068,2995 6068,6068 6068,6552 6068,6856 6068,7819 6068,9342 6068,13161 6068,13524 6068,14597 6068,16955 6068,20747 6068,22268 6068,25272 6068,26450 6068,29093 6068,29166 6068,29985 6068,30328 6068,33338 6068,34129 6068,34830 6068,38205 6068,46843 6068,49104 6068,54948 6068,57006 6068,58503 6068,61085 6068,62453 6068,62467 6068,63582 6068,63990 6068,64021 6068,64027 6068,64173 6068,64204 6068,64213 6068,73223 6068,73248 6068,74460 6068,75912 6068,81508 6068,82688 6068,83940 6068,101683 6068,118419 6068,118953 6068,132216 6068,139329 6068,142472 6068,144906 6068,171262 6068,174341 6068,175903 6068,176971 6068,177930 6068,178576 6068,180936 6068,192029 6068,192322 6068,193078 6068,195076 6068,212692 6068,214892 6068,215450 6068,220317 6068,229897 6068,238181 6068,254944 6068,259636 6068,262945 6069,1119 6069,1282 6069,4222 6070,58 6071,2373 6072,2574 6073,217 6073,19443 6074,346 6075,252 6075,318 6075,516 6075,1220 6075,1222 6075,41170 6076,251 6076,465 6077,862 6078,104 6079,54 6080,433 6081,6082 6083,83 6084,1305 6085,536 6086,1877 6087,46 6087,58 6087,534 6088,1531 6089,309 6089,310 6089,483 6089,4548 6090,1016 6091,647 6092,344 6093,217 6093,536 6094,1058 6095,1309 6096,72 6096,83 6096,119 6096,134 6096,175 6096,248 6096,278 6096,285 6096,364 6096,372 6096,389 6096,417 6096,442 6096,450 6096,455 6096,525 6096,626 6096,795 6096,805 6096,972 6096,1085 6096,1201 6096,1274 6096,1309 6096,1363 6096,1465 6096,1718 6096,1756 6096,1801 6096,2286 6096,2553 6096,2590 6096,2646 6096,2779 6096,2784 6096,28130 6096,35486 6096,141912 6097,6098 6099,6098 6100,887 6101,1116 6102,772 6103,160 6104,6105 6106,6105 6107,318 6107,516 6107,1220 6107,1222 6107,41170 6108,83 6109,178 6109,2677 6109,2854 6109,6109 6109,6110 6109,6111 6109,6112 6109,9379 6109,17573 6109,17628 6109,17629 6109,18012 6109,18035 6109,18855 6109,18907 6109,19132 6109,19770 6109,19810 6109,19811 6109,19812 6109,20079 6109,20138 6109,21888 6109,21889 6109,32322 6109,37879 6109,37880 6109,42144 6109,43395 6109,61023 6109,65370 6109,77246 6109,86081 6109,91551 6109,113186 6109,113190 6109,113191 6109,130547 6109,144962 6109,173140 6109,189611 6109,189612 6109,257728 6112,83 6112,718 6113,149 6114,2854 6114,6115 6114,9379 6114,17585 6114,17586 6114,17628 6114,19770 6114,23172 6114,35706 6114,37881 6114,42145 6114,43397 6114,53819 6116,577 6117,333 6118,6119 6119,79 6119,146 6119,182 6119,192 6119,195 6119,333 6119,336 6119,422 6119,602 6119,841 6119,911 6119,920 6119,1014 6119,1089 6119,1181 6119,1204 6119,1464 6119,1619 6119,1796 6119,1825 6119,1888 6119,2400 6119,2903 6119,3681 6119,5495 6119,6119 6119,12263 6119,13464 6119,13687 6119,14433 6119,15296 6119,15345 6119,22616 6119,24150 6119,27772 6119,29433 6119,30331 6119,37897 6119,38446 6119,39843 6119,41796 6119,42028 6119,42324 6119,45492 6119,46917 6119,59785 6119,60576 6119,88467 6119,92476 6119,96670 6119,109945 6119,113337 6119,114589 6119,115271 6119,118492 6119,130823 6119,131248 6119,134023 6119,155034 6119,155035 6119,173910 6119,173922 6119,177757 6119,188541 6119,221202 6119,221824 6119,247197 6119,247730 6119,248742 6119,250722 6119,255719 6119,258271 6119,258280 6121,83 6122,649 6123,86 6124,1556 6125,5662 6126,143 6126,1052 6127,50 6128,6129 6130,294 6130,332 6130,417 6130,525 6130,631 6130,805 6130,1085 6130,1140 6130,1309 6130,1749 6130,1818 6130,2286 6130,2620 6131,949 6131,2784 6132,527 6133,1506 6134,2506 6135,346 6136,4 6136,5 6136,48 6136,104 6136,140 6136,298 6136,557 6136,588 6136,590 6136,784 6136,805 6136,991 6136,1052 6136,1078 6136,1119 6136,1179 6136,1267 6136,1381 6136,1659 6136,1962 6136,2089 6136,2205 6136,2940 6136,4237 6136,21944 6136,33424 6136,49057 6136,205488 6137,586 6137,1782 6138,171 6138,536 6138,957 6139,107 6139,298 6139,364 6139,442 6139,588 6139,590 6139,805 6139,1085 6140,1707 6141,215 6141,417 6141,1119 6141,1564 6141,1955 6141,9015 6142,527 6142,740 6142,741 6142,743 6142,1983 6143,158 6144,2353 6145,4810 6146,784 6147,298 6148,485 6149,1707 6150,158 6151,346 6152,1707 6152,2105 6153,861 6154,1388 6155,2334 6156,424 6156,1801 6156,19010 6157,726 6158,850 6159,6160 6161,143 6162,663 6162,664 6163,346 6164,298 6165,647 6165,1175 6166,485 6167,604 6167,968 6167,1231 6167,1782 6168,893 6169,581 6170,44 6171,1257 6172,1260 6173,10 6175,6176 6175,197195 6177,675 6178,347 6178,1359 6181,557 6182,557 6183,143 6185,1 6185,408 6185,1119 6185,1127 6185,1619 6185,1707 6186,563 6187,481 6188,2775 6189,447 6190,1572 6191,305 6192,184 6193,2506 6194,1298 6195,2506 6196,647 6197,344 6198,2506 6199,83 6199,2784 6200,6201 6202,2379 6203,417 6204,805 6205,2379 6206,1096 6207,264 6210,417 6210,1274 6211,160 6211,710 6211,835 6211,1052 6211,1893 6212,1177 6213,6214 6215,146 6216,1590 6217,1001 6218,147 6219,1010 6220,1522 6221,143 6222,206 6222,89035 6223,358 6224,151 6225,1181 6226,4 6226,5 6226,527 6226,740 6226,741 6226,743 6226,95152 6227,346 6228,143 6229,736 6229,795 6229,1140 6230,1175 6232,3585 6233,72 6234,595 6234,752 6234,874 6234,1309 6234,1749 6234,6068 6235,571 6235,868 6235,6236 6235,6237 6235,24389 6235,51795 6235,51796 6235,59434 6235,84903 6235,84904 6235,84915 6235,95135 6235,96888 6235,114259 6235,114260 6235,114261 6238,250 6239,337 6239,115659 6240,222 6240,1571 6241,72 6242,97 6243,1298 6244,1118 6245,811 6246,3451 6246,3452 6247,1 6247,11 6247,20 6247,30 6247,34 6247,35 6247,37 6247,44 6247,58 6247,63 6247,79 6247,81 6247,87 6247,99 6247,102 6247,111 6247,138 6247,209 6247,211 6247,247 6247,261 6247,264 6247,272 6247,273 6247,283 6247,287 6247,298 6247,301 6247,302 6247,304 6247,305 6247,314 6247,326 6247,328 6247,332 6247,333 6247,336 6247,338 6247,358 6247,360 6247,364 6247,366 6247,393 6247,417 6247,425 6247,431 6247,442 6247,444 6247,447 6247,457 6247,462 6247,473 6247,481 6247,491 6247,497 6247,505 6247,579 6247,595 6247,602 6247,615 6247,649 6247,663 6247,671 6247,673 6247,682 6247,685 6247,697 6247,703 6247,704 6247,713 6247,717 6247,718 6247,736 6247,745 6247,760 6247,770 6247,775 6247,779 6247,784 6247,868 6247,873 6247,875 6247,893 6247,900 6247,918 6247,919 6247,920 6247,941 6247,968 6247,973 6247,994 6247,1001 6247,1007 6247,1011 6247,1033 6247,1058 6247,1068 6247,1070 6247,1085 6247,1118 6247,1122 6247,1130 6247,1132 6247,1135 6247,1143 6247,1146 6247,1151 6247,1160 6247,1177 6247,1231 6247,1267 6247,1282 6247,1289 6247,1293 6247,1300 6247,1345 6247,1353 6247,1368 6247,1381 6247,1402 6247,1417 6247,1419 6247,1425 6247,1434 6247,1452 6247,1453 6247,1458 6247,1467 6247,1509 6247,1551 6247,1559 6247,1663 6247,1732 6247,1749 6247,1782 6247,1805 6247,1818 6247,1836 6247,1837 6247,1881 6247,1888 6247,1968 6247,1983 6247,2006 6247,2045 6247,2135 6247,2205 6247,2224 6247,2253 6247,2296 6247,2784 6247,2979 6247,3193 6247,3422 6247,3724 6247,3756 6247,3999 6247,4146 6247,4165 6247,4222 6247,4355 6247,4411 6247,4571 6247,4760 6247,4771 6247,5192 6247,5213 6247,5375 6247,5540 6247,7760 6247,8055 6247,8541 6247,16683 6247,19519 6247,21944 6247,21982 6247,26041 6247,26450 6247,33424 6247,44725 6247,72439 6247,129534 6247,142433 6247,221828 6248,79 6248,136 6248,192 6248,202 6248,203 6248,217 6248,254 6248,333 6248,1181 6248,6249 6250,525 6251,6252 6253,852 6254,143 6255,6256 6257,6258 6259,309 6259,310 6260,2590 6261,577 6261,1010 6262,1177 6262,6263 6264,6265 6264,115917 6266,493 6266,586 6266,1265 6266,1266 6266,1370 6267,1433 6268,147 6268,336 6268,406 6268,435 6268,1294 6268,1370 6269,717 6270,72 6271,6272 6273,6274 6275,332 6276,6274 6277,360 6277,115659 6277,142409 6277,146280 6278,6279 6280,743 6281,6282 6283,579 6284,328 6285,6285 6286,577 6287,1871 6287,2421 6288,6289 6290,379 6291,3161 6292,211 6292,1305 6293,1300 6293,1506 6294,485 6295,240 6296,1579 6297,178 6297,222 6297,1289 6297,2178 6297,2671 6297,4545 6297,6298 6299,843 6300,644 6301,77 6302,6303 6304,417 6305,72 6306,515 6307,2867 6307,2868 6307,22880 6308,248 6308,296 6308,647 6308,1332 6308,1893 6308,1939 6308,3507 6308,4294 6308,7155 6309,267 6310,195 6311,920 6311,1619 6311,1623 6313,13 6314,269 6315,323 6316,6317 6318,649 6319,160 6320,1381 6321,1888 6322,175 6322,2574 6322,6323 6324,135 6325,63 6325,493 6326,932 6327,832 6328,346 6329,4490 6330,1370 6331,1749 6331,3585 6332,294 6333,1411 6334,292 6334,1580 6335,859 6335,6336 6335,9284 6335,9466 6335,9601 6335,9620 6335,9789 6335,14005 6335,14008 6335,15824 6335,22607 6335,35347 6335,109736 6335,110939 6335,123494 6335,123551 6335,151662 6335,153668 6335,206931 6335,221533 6335,226148 6337,503 6337,631 6337,1085 6337,1818 6337,2205 6337,2206 6338,46 6339,171 6340,6341 6340,38671 6342,417 6343,1515 6345,77 6346,1515 6347,406 6348,3769 6349,6350 6351,586 6352,602 6353,187 6354,424 6355,417 6356,6357 6358,20 6359,299 6360,1345 6361,22 6362,146 6363,852 6364,1644 6365,360 6365,1289 6366,6367 6368,6369 6370,1289 6371,233 6372,130 6373,336 6373,850 6373,1240 6373,1363 6373,1836 6373,138686 6374,366 6375,366 6376,366 6377,366 6378,366 6379,366 6380,1247 6381,577 6381,193578 6382,330 6383,130 6384,340 6385,2681 6386,6387 6387,3079 6387,7117 6387,15527 6387,37724 6387,57710 6387,74404 6387,81502 6387,130068 6387,136275 6387,164521 6387,164536 6387,189960 6388,313 6389,6390 6391,838 6392,1414 6393,259 6393,336 6394,273 6394,274 6394,360 6394,589 6394,710 6394,1118 6394,1363 6394,1673 6394,66754 6395,399 6396,518 6397,887 6398,37 6398,107 6398,301 6398,444 6398,525 6398,604 6398,615 6398,717 6398,973 6398,1124 6398,1160 6398,1231 6398,1293 6398,1300 6398,1782 6398,1837 6398,3422 6398,5358 6398,14352 6399,313 6400,518 6400,1113 6400,1326 6401,1146 6402,275 6402,1265 6402,1266 6403,473 6404,4748 6405,1566 6406,347 6406,358 6407,1043 6407,1556 6408,875 6409,1509 6410,58 6411,46 6411,58 6412,1639 6413,1579 6414,467 6415,2436 6415,5547 6416,160 6416,360 6416,515 6416,1052 6417,1515 6418,929 6419,19 6420,3769 6421,392 6421,3003 6422,10 6422,178 6422,346 6422,435 6422,440 6422,538 6422,671 6422,693 6422,794 6423,1262 6424,3 6424,446 6424,707 6424,911 6424,1696 6424,1792 6424,1801 6424,2092 6424,2689 6424,3182 6424,3258 6424,3285 6424,4903 6424,5178 6424,6032 6424,6424 6424,6652 6424,8254 6424,13136 6424,13245 6424,13301 6424,14061 6424,14098 6424,14425 6424,15303 6424,15711 6424,21665 6424,23311 6424,23328 6424,25395 6424,25826 6424,26219 6424,26229 6424,28107 6424,28193 6424,28384 6424,28387 6424,29569 6424,31080 6424,31106 6424,32462 6424,34509 6424,37710 6424,38711 6424,38794 6424,39570 6424,44127 6424,48505 6424,49003 6424,67867 6424,72530 6424,80519 6424,93636 6424,95455 6424,99000 6424,99791 6424,99851 6424,103275 6424,109955 6424,121381 6424,127148 6424,127741 6424,130719 6424,140308 6424,141656 6424,152006 6424,152100 6424,156295 6424,163360 6424,169053 6424,173825 6424,174421 6424,176040 6424,183356 6424,185399 6424,185940 6424,188767 6424,189266 6424,192957 6424,211711 6424,211796 6424,220281 6424,221117 6424,226114 6424,234011 6424,246800 6424,247066 6424,247089 6424,258215 6424,260187 6424,264516 6425,450 6426,336 6427,972 6427,1014 6427,1590 6428,640 6429,604 6430,388 6430,452 6430,623 6430,697 6430,919 6430,1801 6430,1805 6430,4252 6430,4760 6431,301 6431,1782 6433,596 6434,46 6434,58 6434,994 6435,338 6436,720 6437,79 6437,217 6437,222 6437,261 6437,872 6437,1118 6437,1796 6437,3089 6438,79 6439,575 6439,697 6440,447 6441,798 6442,195 6443,160 6444,289 6444,290 6445,104 6445,134 6445,2105 6446,424 6448,137 6448,500 6448,718 6449,710 6450,1243 6451,130 6453,346 6454,788 6455,557 6455,2105 6455,2782 6456,287 6456,595 6456,809 6456,1607 6456,2116 6457,106 6457,1220 6457,1222 6457,1512 6457,72439 6458,1927 6460,1782 6461,3653 6462,994 6463,644 6464,202 6464,203 6465,1181 6466,79 6468,575 6469,838 6470,301 6470,467 6470,525 6470,571 6470,868 6470,968 6470,1293 6470,1385 6470,1782 6470,3804 6470,5130 6471,450 6472,1118 6473,356 6473,1531 6474,158 6474,390 6474,534 6474,589 6474,623 6474,973 6474,1001 6474,1465 6474,1801 6474,2083 6474,18738 6475,577 6476,83 6476,292 6476,685 6477,577 6477,694 6477,852 6477,1105 6477,1844 6477,6837 6478,306 6478,307 6479,344 6479,1836 6480,422 6481,602 6482,298 6482,2995 6483,893 6484,422 6485,422 6486,4 6486,5 6486,206 6486,483 6486,731 6486,994 6486,1313 6486,1432 6486,1775 6486,2089 6486,2867 6486,2868 6486,2940 6486,4611 6486,6487 6486,88820 6488,195 6489,422 6490,10 6491,422 6492,79 6492,192 6492,1392 6493,602 6494,422 6495,422 6496,422 6497,422 6498,422 6499,1235 6499,1335 6500,718 6501,79 6502,344 6502,745 6503,575 6504,146 6505,1414 6506,19 6506,135 6506,222 6506,313 6506,389 6506,477 6506,634 6506,660 6506,1069 6506,1539 6506,1724 6506,1871 6506,1916 6506,2159 6506,2168 6506,2290 6506,2421 6506,2424 6506,2775 6506,2944 6506,4482 6506,4799 6506,5163 6506,5326 6506,6506 6506,6507 6506,6828 6506,13240 6506,16412 6506,18345 6506,19443 6506,25670 6506,26056 6506,31881 6506,32749 6506,33392 6506,33752 6506,33995 6506,34270 6506,35732 6506,38859 6506,56584 6506,57839 6506,58820 6506,62298 6506,94975 6506,102389 6506,114004 6506,119090 6506,119290 6506,125253 6506,126600 6506,131652 6506,137983 6506,139950 6506,140432 6506,156649 6506,157113 6506,167150 6506,173709 6506,190968 6506,222362 6506,258953 6507,6506 6507,13361 6508,158 6509,6510 6511,163 6511,302 6511,489 6511,579 6511,811 6512,1220 6512,1222 6513,252 6514,251 6515,160 6516,1227 6516,1229 6517,1891 6518,366 6518,972 6519,79 6519,192 6519,663 6519,664 6519,861 6519,4455 6520,298 6521,485 6522,1506 6523,1204 6524,1012 6525,1796 6526,182 6527,907 6527,932 6528,143 6529,206 6530,557 6531,1907 6532,536 6532,2828 6532,4810 6533,515 6533,671 6533,736 6533,1509 6533,1551 6533,1849 6533,3999 6533,32784 6534,298 6535,485 6536,392 6536,1140 6537,1955 6538,1332 6539,657 6539,907 6539,1363 6539,13361 6540,6541 6542,1300 6543,6544 6545,186 6546,620 6546,1474 6546,8244 6548,875 6549,920 6549,1623 6550,623 6551,5440 6552,187 6552,304 6552,390 6552,415 6552,567 6552,589 6552,615 6552,623 6552,685 6552,762 6552,849 6552,873 6552,874 6552,918 6552,1117 6552,1146 6552,1240 6552,1284 6552,1419 6552,1858 6552,2411 6552,2590 6552,3182 6552,5130 6552,5591 6552,6059 6552,6068 6553,337 6554,1149 6555,6556 6556,111 6556,175 6556,211 6556,240 6556,309 6556,310 6556,483 6556,1085 6556,1177 6556,1882 6556,2210 6556,2782 6556,3039 6556,4237 6556,6556 6556,182162 6556,193486 6556,232766 6557,147 6557,158 6557,602 6557,620 6557,8244 6558,929 6559,1241 6560,1227 6560,1229 6561,79 6561,202 6561,203 6561,252 6562,240 6563,309 6563,310 6563,6556 6563,6627 6564,996 6565,273 6565,274 6566,441 6567,509 6567,1453 6567,1836 6568,356 6568,510 6568,843 6568,2178 6568,4545 6568,6695 6569,4 6569,5 6569,47 6569,58 6569,104 6569,107 6569,441 6569,442 6569,801 6569,1140 6569,1177 6569,1449 6569,2089 6569,2205 6569,2206 6569,2334 6569,2469 6569,2940 6569,3474 6569,4771 6569,21944 6569,136072 6570,417 6571,620 6571,8244 6572,364 6573,315 6573,620 6573,8244 6574,760 6575,422 6577,620 6578,292 6578,433 6578,3830 6579,775 6580,1227 6580,1229 6580,1252 6580,1253 6580,4823 6580,21944 6580,86416 6581,392 6581,441 6581,1146 6581,1151 6581,1653 6581,1677 6581,1949 6581,2201 6581,2436 6581,3830 6583,366 6583,500 6583,2607 6583,4101 6584,340 6585,217 6585,337 6585,392 6586,435 6586,493 6586,538 6586,1590 6586,1877 6587,1326 6588,163 6588,489 6588,516 6588,668 6588,1243 6589,707 6590,10 6590,97 6590,5933 6591,1117 6592,2312 6593,907 6593,932 6594,1058 6597,393 6598,392 6599,1019 6600,489 6601,720 6602,66 6602,240 6602,467 6602,868 6602,1433 6603,48 6604,929 6605,313 6605,920 6605,1285 6606,58 6607,346 6607,435 6607,457 6607,1068 6607,1913 6607,6654 6608,611 6609,393 6610,119 6611,3252 6612,37 6613,583 6614,366 6614,500 6615,1323 6616,102 6617,1326 6618,408 6619,602 6620,25 6620,26 6620,59 6620,117 6620,887 6620,1432 6620,2088 6620,6621 6620,17140 6620,21944 6620,54870 6620,154690 6621,5 6621,26 6621,59 6621,114 6621,117 6621,231 6621,885 6621,994 6621,1238 6621,1432 6621,1722 6621,2674 6621,4571 6621,6621 6621,16153 6621,21944 6621,45140 6621,54870 6621,88820 6622,163 6622,538 6622,1877 6622,21442 6623,1955 6623,2526 6624,1096 6625,192 6625,663 6625,664 6626,32 6626,392 6626,644 6626,918 6626,2274 6626,3003 6627,310 6628,397 6629,390 6630,657 6630,5405 6631,835 6631,4039 6632,287 6632,314 6632,433 6633,868 6635,147 6635,158 6636,50 6636,79 6636,393 6636,406 6636,493 6636,585 6636,586 6636,592 6636,704 6636,1265 6636,1266 6636,1433 6637,211 6637,538 6637,1252 6637,1253 6637,1479 6638,388 6638,518 6638,685 6638,1113 6638,1345 6638,1584 6638,3193 6638,5052 6638,6045 6638,6641 6638,15303 6638,18097 6638,22245 6638,23349 6638,29102 6638,30996 6638,31035 6638,31080 6638,37771 6638,38861 6638,48505 6638,78829 6638,81019 6638,87871 6638,104556 6638,112513 6638,124718 6638,127154 6638,136969 6639,6640 6639,13968 6639,30206 6639,37188 6639,37939 6639,47361 6639,54116 6639,55378 6639,63775 6639,64163 6639,66950 6639,70180 6639,76020 6639,76294 6639,77385 6639,77592 6639,78995 6639,81858 6639,83089 6639,83931 6639,91878 6639,92531 6639,93425 6639,100357 6639,104180 6639,104812 6639,105209 6639,105272 6639,105287 6639,105817 6639,106500 6639,108490 6639,110413 6639,111721 6639,111732 6639,111825 6639,112942 6639,113706 6639,114200 6639,114329 6639,168738 6641,388 6641,457 6641,2045 6641,6638 6641,48505 6642,497 6642,2266 6643,592 6644,622 6645,393 6646,30 6646,328 6646,809 6646,1014 6646,1179 6646,1429 6646,1462 6646,3769 6646,8537 6646,68069 6646,138686 6646,141912 6647,195 6647,609 6647,204124 6648,439 6648,447 6648,538 6648,1033 6648,1294 6649,34 6649,35 6650,762 6650,1241 6650,1479 6650,1522 6651,1818 6652,1801 6653,209 6653,299 6653,6654 6655,6303 6656,932 6656,1016 6657,52 6657,196 6657,9598 6657,140269 6657,206059 6658,939 6658,2138 6658,4646 6658,5078 6658,5460 6658,5461 6658,6422 6658,6586 6658,6607 6658,6659 6658,6883 6658,17423 6658,18124 6658,20539 6658,21152 6658,25384 6658,28425 6658,32745 6658,34935 6658,37000 6658,38420 6658,44348 6658,52792 6658,62984 6658,83947 6658,113469 6658,133112 6658,135992 6658,135993 6658,135994 6658,135995 6658,135996 6658,135997 6658,135998 6658,135999 6658,136000 6658,136001 6658,136002 6658,136003 6658,136004 6658,136005 6658,136006 6658,136007 6658,136008 6658,136009 6658,136010 6660,20 6660,178 6660,315 6660,346 6660,435 6660,439 6660,447 6660,538 6660,671 6660,934 6660,996 6660,1033 6660,1068 6660,1294 6660,1474 6660,1590 6660,1612 6660,1644 6660,1789 6660,1877 6660,2353 6660,6661 6660,15179 6660,31977 6660,38158 6660,189128 6660,190492 6661,20 6661,178 6661,435 6661,439 6661,447 6661,766 6661,996 6661,1033 6661,1294 6661,1474 6661,1590 6661,1644 6661,1877 6661,2138 6661,2352 6661,6661 6661,6966 6661,13636 6661,14355 6661,15141 6661,15355 6661,16637 6661,19191 6661,26027 6661,37315 6661,41378 6661,48379 6661,48387 6661,49931 6661,56385 6661,62195 6661,70832 6661,73508 6661,88367 6661,93673 6661,114068 6661,120155 6661,138647 6661,161476 6661,168462 6661,185905 6661,219675 6661,219811 6661,232757 6661,241492 6661,241495 6661,241513 6661,241516 6661,243242 6661,243247 6661,243248 6661,243249 6661,243906 6661,245953 6661,260727 6661,261475 6661,262339 6662,766 6662,1651 6662,2030 6662,2102 6662,2352 6662,14111 6662,14428 6662,15141 6662,15355 6662,19191 6662,32468 6662,41804 6662,54295 6662,135980 6662,180938 6663,146 6663,996 6664,79 6664,192 6664,622 6664,1392 6664,1462 6664,8537 6665,283 6665,1871 6665,2421 6665,6068 6668,134 6668,6726 6671,192 6671,663 6671,664 6672,346 6672,435 6672,1782 6672,6303 6673,356 6675,720 6676,356 6676,852 6677,694 6677,749 6677,999 6678,140 6678,264 6678,515 6678,835 6678,1551 6679,579 6679,1227 6679,1229 6679,1252 6679,1253 6679,21944 6679,86416 6680,385 6681,6682 6682,36038 6682,39291 6682,76260 6682,76261 6682,76262 6682,76265 6682,76266 6682,76267 6682,76268 6682,76269 6682,76270 6682,76271 6682,76272 6682,76273 6682,76274 6682,76275 6682,76278 6682,76279 6682,76280 6682,76281 6682,77218 6682,77917 6682,98044 6683,130 6684,79 6684,147 6684,192 6684,202 6684,203 6684,602 6684,663 6684,1149 6684,1392 6684,118336 6685,1087 6685,1118 6685,1345 6685,1566 6685,1623 6685,6695 6685,162599 6686,41 6687,3003 6688,302 6688,340 6688,579 6688,811 6689,685 6689,733 6690,79 6690,467 6690,571 6690,868 6691,392 6691,623 6691,918 6691,1805 6691,1858 6691,4903 6693,250 6693,887 6693,1684 6694,515 6695,185 6695,186 6695,248 6695,397 6695,457 6695,535 6695,733 6695,802 6695,872 6695,913 6695,992 6695,1085 6695,1298 6695,1417 6695,1566 6695,1659 6695,1749 6695,1796 6695,1893 6695,2224 6695,2253 6695,2312 6695,2438 6695,3507 6695,3582 6695,4066 6695,4381 6695,6568 6695,6685 6695,6837 6695,8013 6695,8157 6695,13207 6695,14080 6695,30728 6695,34820 6695,46354 6695,50285 6695,62798 6695,70811 6695,79306 6695,86454 6695,86462 6695,86599 6695,93711 6695,93714 6695,93752 6695,94334 6695,94842 6695,161665 6695,164403 6695,179141 6695,187318 6695,214657 6695,214937 6695,215982 6695,219984 6695,230379 6695,234738 6695,247258 6695,249689 6695,251361 6695,259719 6695,260385 6695,260943 6695,261890 6695,263111 6696,3507 6697,58 6698,1849 6698,32784 6699,163 6699,579 6699,1556 6700,1556 6701,273 6701,274 6703,2353 6704,392 6705,83 6706,66 6707,302 6707,579 6708,158 6708,23783 6709,644 6710,167 6711,217 6711,301 6711,328 6711,457 6711,795 6711,1012 6711,1118 6711,1181 6711,1300 6711,1370 6711,1417 6711,1949 6711,2006 6711,2334 6711,3804 6712,167 6712,968 6712,1231 6712,1544 6712,1849 6712,2083 6713,634 6714,609 6715,81 6715,1745 6716,302 6716,1556 6716,2116 6717,538 6717,980 6718,425 6718,1276 6719,22 6719,65 6719,120 6719,285 6719,438 6719,599 6719,602 6719,660 6719,795 6719,818 6719,1122 6719,1454 6719,1803 6719,1849 6719,2274 6719,2646 6719,2699 6719,32784 6720,250 6720,1684 6721,647 6722,344 6723,704 6724,97 6725,32 6725,54 6725,72 6725,83 6725,99 6725,202 6725,203 6725,349 6725,406 6725,422 6725,435 6725,623 6725,649 6725,749 6725,781 6725,801 6725,1285 6725,1309 6725,1353 6725,1415 6725,1452 6725,1474 6725,1634 6725,1805 6725,1949 6725,2421 6725,3585 6725,6424 6725,6506 6725,162599 6726,6726 6727,58 6728,827 6729,26 6729,59 6729,887 6729,1235 6729,1335 6729,21944 6730,2557 6731,143 6731,1052 6733,34 6733,35 6733,313 6733,347 6734,182 6734,1639 6734,2253 6734,3258 6734,8149 6735,1238 6736,10 6736,206 6736,336 6736,164665 6737,298 6738,485 6739,1871 6740,137 6741,119 6741,2073 6742,346 6742,5405 6743,195 6744,1 6745,312 6746,861 6747,535 6747,1454 6748,233 6748,3507 6749,6750 6751,79 6751,192 6752,1844 6753,760 6753,1149 6753,1631 6754,34 6754,35 6754,186 6754,278 6754,1019 6754,1871 6754,23287 6755,58 6756,712 6757,805 6758,195 6759,171 6760,571 6760,868 6761,66 6762,233 6763,403 6763,693 6763,113878 6764,313 6765,538 6766,206 6766,438 6766,1096 6767,626 6768,932 6769,1639 6770,48 6770,130 6770,328 6770,1007 6770,1132 6770,1381 6770,2051 6770,2775 6772,79 6772,192 6773,120 6773,261 6773,372 6773,694 6773,1419 6774,868 6775,344 6775,827 6775,2674 6776,3804 6777,2557 6778,1231 6778,47031 6779,704 6780,1479 6781,392 6781,644 6781,1240 6781,1836 6781,127158 6782,872 6783,2528 6784,640 6785,2319 6786,83 6786,1001 6786,3585 6787,4895 6788,222 6788,283 6788,455 6788,2784 6788,6789 6788,7768 6789,54 6789,222 6789,278 6789,283 6789,379 6789,455 6789,657 6789,1019 6789,1539 6789,1756 6789,2421 6789,2424 6789,3646 6789,3993 6789,6032 6789,6788 6789,6789 6789,7768 6789,13137 6789,13276 6789,16117 6789,16847 6789,19349 6789,28169 6789,34183 6789,37088 6789,38972 6789,39561 6789,46789 6789,58403 6789,59398 6789,64108 6789,64764 6789,79966 6789,89429 6789,93226 6789,93320 6789,105808 6789,117965 6789,118692 6789,127743 6789,137142 6789,137877 6789,140055 6790,97 6790,217 6790,1181 6790,1417 6790,6891 6791,269 6792,107 6792,677 6792,1119 6792,1745 6792,2205 6792,2206 6792,20813 6792,33424 6792,207079 6792,255598 6792,255766 6794,392 6797,79 6798,3218 6799,34 6799,35 6799,536 6800,1564 6800,2620 6800,258887 6801,126 6801,1033 6801,1590 6802,143 6802,440 6802,1204 6802,1433 6802,1844 6802,6803 6802,17346 6805,743 6806,602 6806,675 6807,868 6807,156379 6808,1220 6808,1222 6809,252 6810,251 6811,97 6811,403 6811,3695 6812,850 6813,106 6813,663 6813,664 6813,1425 6813,59021 6814,1014 6815,344 6816,252 6816,516 6816,1220 6816,1222 6818,104 6818,577 6818,623 6818,893 6818,1805 6819,644 6820,3 6820,510 6821,760 6821,1785 6822,1284 6822,1309 6822,115474 6823,182 6823,843 6823,1663 6823,6824 6824,1 6824,20 6824,65 6824,182 6824,207 6824,209 6824,259 6824,336 6824,360 6824,397 6824,408 6824,441 6824,489 6824,500 6824,505 6824,510 6824,615 6824,693 6824,733 6824,872 6824,911 6824,918 6824,972 6824,1135 6824,1146 6824,1147 6824,1172 6824,1192 6824,1204 6824,1235 6824,1238 6824,1285 6824,1293 6824,1402 6824,1417 6824,1445 6824,1472 6824,1559 6824,1566 6824,1634 6824,1663 6824,1858 6824,1927 6824,1992 6824,2512 6824,2607 6824,2704 6824,2812 6824,3392 6824,3524 6824,3582 6824,4039 6824,4066 6824,4165 6824,4190 6824,4276 6824,5440 6824,6824 6824,6880 6824,8419 6824,14052 6824,14945 6824,22020 6824,28348 6824,28553 6824,38972 6824,75292 6824,75912 6824,77642 6824,81233 6824,88389 6824,115474 6824,120155 6824,195539 6824,204093 6824,215276 6825,417 6826,248 6826,1332 6827,298 6828,34 6828,35 6828,134 6828,222 6828,225 6828,278 6828,283 6828,313 6828,364 6828,389 6828,431 6828,455 6828,657 6828,694 6828,949 6828,1019 6828,1177 6828,2210 6828,2424 6828,5343 6828,6506 6828,6888 6829,485 6830,10 6830,113156 6831,2224 6833,1293 6834,77 6835,1579 6836,1639 6837,175 6837,240 6837,314 6837,452 6837,457 6837,599 6837,818 6837,823 6837,838 6837,911 6837,1118 6837,1203 6837,1466 6837,1566 6837,2410 6837,3574 6837,6695 6837,6837 6837,6935 6837,16712 6837,21458 6837,27550 6837,44846 6837,45129 6837,46258 6837,47369 6837,48006 6837,66500 6837,73517 6837,75912 6837,76048 6837,77567 6837,78902 6837,94281 6837,106140 6837,127158 6837,152828 6837,152843 6837,162593 6837,168466 6837,174306 6837,254906 6838,302 6839,1284 6841,6726 6843,620 6843,8244 6844,3756 6845,58 6846,3079 6847,356 6848,6263 6851,5874 6852,372 6852,1262 6853,30 6853,104 6853,120 6853,240 6853,264 6853,406 6853,518 6853,622 6853,631 6853,760 6853,1181 6853,1402 6853,1531 6853,1631 6853,1785 6853,2775 6853,3247 6854,209 6854,579 6855,634 6856,47 6856,68 6856,104 6856,120 6856,240 6856,261 6856,264 6856,289 6856,290 6856,332 6856,372 6856,431 6856,631 6856,694 6856,760 6856,1001 6856,1119 6856,1122 6856,1309 6856,1319 6856,1462 6856,1796 6856,1818 6856,1955 6856,2205 6856,2443 6856,2469 6856,3328 6856,6068 6856,6695 6856,8537 6856,33424 6857,972 6858,760 6858,1149 6858,1631 6859,6860 6859,14100 6859,72548 6859,99734 6859,184744 6859,214394 6859,214396 6859,251459 6861,911 6861,1603 6861,6948 6861,101635 6862,104 6862,254 6862,503 6862,557 6862,953 6862,954 6862,1939 6863,50 6863,147 6863,406 6864,192 6864,278 6864,285 6864,406 6864,752 6864,779 6864,1515 6864,3138 6864,3585 6864,8270 6865,1858 6866,1860 6867,599 6868,462 6869,167 6869,217 6869,457 6869,714 6869,2253 6869,4355 6870,980 6871,247 6871,2867 6871,2868 6872,980 6873,1711 6873,1836 6874,980 6875,1140 6876,72 6876,106 6877,259 6878,312 6878,1749 6879,206 6880,34 6880,35 6880,292 6880,347 6880,455 6880,518 6880,536 6880,745 6880,849 6880,1241 6880,1326 6880,1332 6880,1424 6880,1688 6880,1715 6880,1722 6880,2436 6880,4039 6880,7698 6880,7768 6880,20813 6881,134 6882,3 6882,346 6882,435 6882,586 6882,1294 6882,6119 6883,20 6883,79 6883,146 6883,685 6883,911 6883,1085 6883,1319 6883,1465 6883,2006 6883,5961 6883,92476 6883,221828 6884,2867 6884,2868 6884,22880 6885,1707 6886,1858 6887,1860 6889,5165 6890,35 6890,111 6890,1019 6890,1140 6890,1240 6890,1453 6890,1454 6890,1796 6890,2266 6891,207 6891,256 6891,326 6891,1014 6891,6790 6891,6891 6891,6927 6891,7353 6891,36306 6891,243283 6892,392 6893,392 6893,1860 6895,233 6895,269 6896,1572 6896,1634 6896,1722 6896,3538 6897,2353 6898,2334 6899,192 6899,406 6899,1776 6903,726 6903,859 6904,10 6904,20 6904,186 6904,192 6904,209 6904,240 6904,259 6904,299 6904,360 6904,389 6904,438 6904,441 6904,467 6904,500 6904,510 6904,512 6904,518 6904,535 6904,536 6904,622 6904,640 6904,685 6904,801 6904,808 6904,849 6904,872 6904,874 6904,911 6904,918 6904,929 6904,972 6904,1014 6904,1085 6904,1118 6904,1147 6904,1267 6904,1284 6904,1326 6904,1370 6904,1436 6904,1531 6904,1566 6904,1655 6904,2605 6904,3392 6904,3507 6904,3804 6904,4276 6904,4771 6904,6904 6904,75912 6904,115474 6904,237573 6904,242246 6905,861 6906,893 6907,644 6907,2274 6908,749 6908,784 6908,805 6908,1119 6908,1146 6909,1837 6911,1 6911,22 6911,32 6911,41 6911,58 6911,77 6911,106 6911,207 6911,233 6911,248 6911,259 6911,272 6911,273 6911,283 6911,292 6911,298 6911,302 6911,328 6911,340 6911,358 6911,408 6911,431 6911,444 6911,473 6911,489 6911,575 6911,586 6911,595 6911,599 6911,602 6911,634 6911,660 6911,675 6911,690 6911,714 6911,850 6911,859 6911,973 6911,980 6911,1007 6911,1132 6911,1179 6911,1224 6911,1309 6911,1419 6911,1424 6911,1571 6911,1572 6911,1579 6911,1607 6911,1608 6911,1836 6911,1860 6911,2089 6911,2411 6911,2605 6911,2940 6911,3085 6911,3830 6911,4276 6911,4903 6911,5326 6911,5540 6911,6059 6911,6119 6911,6556 6911,9457 6911,138686 6911,174849 6911,190492 6912,1590 6913,34 6913,35 6913,217 6913,222 6913,1019 6913,2266 6914,1977 6914,1978 6915,298 6916,485 6917,72 6918,192 6918,19413 6919,623 6919,973 6919,5034 6920,302 6921,467 6921,868 6922,227 6922,55585 6923,760 6923,1149 6923,1631 6924,516 6924,1243 6925,571 6925,868 6926,58 6926,605 6926,726 6926,1298 6926,6556 6926,21442 6927,6891 6929,299 6929,673 6931,781 6932,577 6933,1707 6934,392 6934,2989 6934,2991 6935,1118 6935,6837 6936,718 6937,1068 6938,301 6938,717 6938,1293 6938,1782 6940,536 6941,473 6943,1052 6944,1769 6944,5547 6945,20 6946,775 6947,932 6948,1603 6948,2310 6949,2224 6950,178 6950,2073 6951,72 6952,344 6953,285 6954,298 6955,314 6955,349 6955,392 6955,452 6955,455 6955,457 6955,497 6955,510 6955,536 6955,808 6955,872 6955,918 6955,919 6955,1151 6955,1197 6955,1860 6955,2746 6955,3636 6955,4286 6955,13316 6955,18191 6955,19823 6955,20200 6955,20346 6955,21639 6955,24592 6955,31790 6955,38300 6955,45050 6955,45740 6955,61055 6955,62932 6955,65940 6955,82148 6955,93184 6955,102695 6955,118951 6955,121148 6955,121989 6955,125644 6955,127712 6955,127787 6955,130275 6955,131216 6955,134506 6955,135270 6955,135409 6955,175367 6955,220814 6955,232112 6955,232114 6955,242189 6956,97 6957,1425 6958,1204 6959,192 6959,202 6959,622 6959,1392 6959,1745 6960,34 6960,35 6960,222 6960,455 6960,657 6960,949 6960,1274 6960,1417 6960,2045 6960,5343 6960,33508 6961,143 6962,1 6962,500 6963,1149 6964,868 6965,1564 6967,6968 6969,149 6969,417 6969,1381 6969,3999 6970,1014 6972,6803 6974,861 6975,20 6976,81 6976,274 6976,920 6976,2367 6977,425 6978,48 6979,19 6979,808 6980,1659 6981,54 6981,119 6981,126 6981,137 6981,248 6981,273 6981,390 6981,431 6981,441 6981,515 6981,581 6981,604 6981,713 6981,733 6981,772 6981,784 6981,862 6981,1058 6981,1087 6981,1127 6981,1172 6981,1262 6981,1293 6981,1402 6981,1479 6981,1509 6981,1571 6981,1718 6981,2083 6981,2266 6981,2923 6981,2944 6981,3653 6981,4223 6981,4411 6981,5326 6981,6682 6981,6824 6981,7698 6981,213089 6981,214131 6981,215276 6982,1033 6983,3724 6984,731 6985,130 6985,500 6986,784 6987,366 6987,972 6987,37414 6988,718 6989,2083 6990,66 6990,79 6990,203 6990,240 6990,314 6990,467 6990,868 6990,1235 6990,1345 6990,3804 6990,81233 6990,152855 6990,156379 6991,581 6992,146 6993,1639 6994,1579 6995,200 6995,206 6995,240 6996,301 6997,536 6997,2784 6997,7698 6998,106 6998,893 6998,2668 6998,3585 6999,2373 7001,781 7002,7003 7003,596 7004,1608 7005,79 7006,146 7006,779 7006,92476 7007,192 7007,217 7008,808 7008,2646 7008,32475 7009,143 7010,489 7011,167 7011,2083 7012,620 7013,752 7014,6303 7015,1579 7016,1639 7017,240 7017,289 7017,290 7017,1085 7017,1522 7017,1715 7017,94134 7018,259 7018,1433 7018,1531 7019,247 7021,302 7022,248 7022,636 7022,1262 7022,1332 7022,1572 7022,1844 7022,11147 7023,305 7023,3474 7025,202 7025,203 7027,202 7027,203 7028,298 7029,485 7030,957 7030,1815 7031,604 7032,1033 7033,1688 7034,676 7035,1087 7036,202 7036,203 7038,298 7039,104 7039,134 7039,135 7039,137 7039,138 7039,1368 7039,2105 7040,315 7040,1033 7040,1068 7041,120 7041,217 7041,240 7041,261 7041,694 7041,843 7041,1353 7041,1417 7041,1466 7042,485 7043,1639 7044,1579 7045,1579 7046,1639 7047,1203 7048,79 7049,22 7049,151 7049,2017 7050,509 7050,510 7050,872 7050,150022 7051,2116 7052,202 7052,203 7052,130897 7053,666 7053,744 7053,750 7053,762 7053,1124 7053,1167 7054,557 7055,505 7056,868 7057,167 7057,1241 7057,2083 7058,996 7060,184 7060,1612 7061,1181 7062,781 7063,615 7063,660 7063,1634 7063,2367 7063,3623 7064,202 7064,203 7064,251 7065,392 7066,340 7066,6556 7067,500 7068,1140 7068,5547 7069,592 7069,2205 7069,2206 7070,182 7070,1204 7071,1143 7072,1181 7072,2205 7072,2206 7072,33424 7072,245910 7073,1132 7073,1452 7073,1639 7074,107 7075,222 7075,278 7075,455 7075,2266 7075,2424 7075,248493 7075,256384 7075,258055 7076,240 7076,309 7076,310 7076,718 7076,875 7076,1001 7076,1014 7076,1419 7076,1531 7076,1796 7076,3039 7076,3260 7076,3370 7078,366 7078,500 7079,30 7079,1179 7079,1305 7079,7124 7080,32 7081,1282 7081,1882 7082,163 7082,302 7082,579 7082,868 7083,1531 7084,865 7084,994 7084,1235 7084,1335 7084,1432 7084,21944 7085,1688 7085,3538 7086,240 7086,301 7087,1 7087,4 7087,5 7087,32 7087,34 7087,35 7087,48 7087,72 7087,79 7087,86 7087,97 7087,104 7087,106 7087,107 7087,116 7087,119 7087,120 7087,134 7087,135 7087,136 7087,146 7087,149 7087,158 7087,163 7087,182 7087,187 7087,192 7087,195 7087,200 7087,206 7087,211 7087,222 7087,225 7087,247 7087,248 7087,252 7087,261 7087,264 7087,269 7087,273 7087,275 7087,278 7087,287 7087,292 7087,294 7087,299 7087,305 7087,309 7087,310 7087,312 7087,313 7087,328 7087,330 7087,332 7087,333 7087,344 7087,360 7087,366 7087,376 7087,392 7087,393 7087,399 7087,403 7087,408 7087,420 7087,422 7087,430 7087,438 7087,439 7087,447 7087,452 7087,489 7087,491 7087,493 7087,497 7087,516 7087,527 7087,557 7087,567 7087,596 7087,602 7087,626 7087,649 7087,663 7087,664 7087,671 7087,673 7087,694 7087,704 7087,707 7087,714 7087,717 7087,736 7087,749 7087,752 7087,758 7087,760 7087,770 7087,772 7087,779 7087,801 7087,809 7087,811 7087,827 7087,838 7087,843 7087,850 7087,859 7087,862 7087,873 7087,874 7087,875 7087,885 7087,887 7087,893 7087,918 7087,919 7087,920 7087,929 7087,932 7087,934 7087,949 7087,973 7087,991 7087,1010 7087,1019 7087,1033 7087,1052 7087,1082 7087,1085 7087,1096 7087,1113 7087,1127 7087,1130 7087,1133 7087,1140 7087,1146 7087,1151 7087,1181 7087,1220 7087,1227 7087,1229 7087,1235 7087,1240 7087,1243 7087,1289 7087,1298 7087,1309 7087,1313 7087,1319 7087,1335 7087,1368 7087,1381 7087,1415 7087,1419 7087,1432 7087,1434 7087,1436 7087,1449 7087,1453 7087,1458 7087,1465 7087,1474 7087,1509 7087,1515 7087,1531 7087,1539 7087,1544 7087,1571 7087,1572 7087,1590 7087,1623 7087,1639 7087,1644 7087,1653 7087,1707 7087,1749 7087,1773 7087,1782 7087,1789 7087,1801 7087,1805 7087,1818 7087,1844 7087,1849 7087,1860 7087,1877 7087,1881 7087,1891 7087,1912 7087,1927 7087,1962 7087,1984 7087,2045 7087,2083 7087,2087 7087,2089 7087,2178 7087,2205 7087,2210 7087,2224 7087,2266 7087,2286 7087,2353 7087,2373 7087,2411 7087,2421 7087,2424 7087,2528 7087,2590 7087,2607 7087,2646 7087,2701 7087,2775 7087,2779 7087,2782 7087,2797 7087,2940 7087,2944 7087,2995 7087,3069 7087,3148 7087,3218 7087,3507 7087,3695 7087,4039 7087,4237 7087,4276 7087,4355 7087,4411 7087,4545 7087,4760 7087,4865 7087,4866 7087,4903 7087,5192 7087,5213 7087,5250 7087,5301 7087,5405 7087,5540 7087,5662 7087,5718 7087,5726 7087,6837 7087,7117 7087,7143 7087,7155 7087,7614 7087,8541 7087,9024 7087,13704 7087,15807 7087,19010 7087,27550 7087,33424 7087,37414 7087,61004 7087,90845 7087,124668 7087,207837 7088,605 7089,3507 7090,907 7090,932 7091,577 7091,1105 7092,313 7092,536 7092,911 7092,4637 7092,5625 7092,13622 7092,22376 7092,24885 7092,39718 7092,41493 7092,43383 7092,59732 7092,64810 7092,70027 7092,70144 7092,90992 7092,103449 7092,104511 7092,120959 7092,122952 7092,123022 7092,127014 7092,130179 7092,134736 7092,134747 7092,171349 7092,177945 7092,236065 7093,298 7094,485 7095,72 7096,1282 7096,1882 7097,2051 7098,808 7098,1240 7098,1465 7098,1949 7098,6059 7099,298 7100,485 7101,3193 7102,1531 7103,251 7103,252 7103,318 7103,465 7103,516 7103,1220 7103,1222 7103,1512 7104,733 7105,424 7106,94 7106,2787 7108,3507 7109,77 7109,379 7109,657 7109,2224 7109,75912 7109,181063 7110,1085 7111,171 7112,779 7113,1531 7114,1298 7115,393 7115,980 7115,1096 7116,330 7117,10 7117,20 7117,81 7117,96 7117,97 7117,175 7117,248 7117,485 7117,685 7117,693 7117,849 7117,972 7117,1402 7117,1445 7117,1566 7117,3079 7117,6387 7117,7117 7117,9457 7117,14483 7117,17840 7117,18880 7117,20757 7117,27035 7117,28571 7117,48632 7117,68233 7117,74404 7117,114125 7117,127706 7117,142553 7117,165490 7117,207659 7117,232607 7118,217 7118,349 7118,1118 7118,1417 7118,4355 7119,779 7119,1515 7120,439 7120,671 7120,1181 7121,1776 7122,422 7123,433 7125,577 7126,118 7126,274 7126,795 7126,5265 7127,217 7127,240 7127,588 7127,590 7127,592 7127,1818 7128,206 7128,934 7128,1458 7128,89035 7129,65 7129,467 7129,868 7130,1298 7131,781 7132,718 7133,298 7134,485 7135,83 7135,130 7135,160 7135,581 7135,668 7135,710 7135,743 7135,1803 7135,2701 7135,6387 7135,7143 7135,7614 7136,415 7137,4823 7138,273 7138,274 7139,347 7140,301 7140,1782 7141,79 7141,1265 7141,1266 7141,1963 7142,206 7144,26 7144,59 7144,143 7144,1433 7144,1844 7144,6803 7144,17346 7145,217 7145,222 7145,314 7145,379 7145,1019 7146,379 7146,1019 7147,571 7148,4895 7149,4895 7150,77 7151,79 7151,491 7152,192 7152,256 7153,58 7154,509 7154,510 7154,875 7155,240 7155,1893 7155,2036 7155,2512 7155,3407 7155,7087 7155,26041 7155,41634 7155,60908 7155,125299 7155,125399 7155,125767 7155,192873 7156,620 7156,1181 7158,83 7159,852 7159,957 7159,1247 7159,1844 7159,109503 7160,527 7161,275 7161,749 7161,1085 7161,3695 7162,247 7163,83 7163,117 7163,278 7163,330 7163,390 7163,536 7163,920 7163,1085 7163,1240 7163,1381 7163,1465 7163,1805 7163,2712 7163,2782 7163,4549 7163,4594 7163,7124 7163,8854 7164,86 7165,788 7165,1433 7166,760 7168,726 7170,68 7170,186 7170,615 7170,1326 7170,1715 7170,1782 7171,58 7172,5718 7173,251 7173,465 7174,251 7174,465 7175,292 7177,344 7178,182 7178,192 7178,195 7178,217 7178,344 7178,1433 7178,1844 7178,2105 7178,3744 7179,918 7180,298 7182,30 7182,137 7182,328 7182,333 7182,372 7182,609 7182,622 7182,809 7182,1305 7182,1939 7183,579 7183,1844 7184,647 7185,344 7187,1844 7187,5213 7188,178 7189,309 7189,310 7190,1 7191,415 7192,192 7193,163 7194,104 7194,313 7194,372 7194,390 7194,446 7194,534 7194,589 7194,626 7194,784 7194,795 7194,911 7194,1004 7194,1119 7194,1462 7194,1580 7194,1701 7194,1844 7194,2572 7194,2995 7194,3623 7194,4222 7194,7194 7194,8537 7194,13273 7194,27703 7194,31302 7194,44725 7194,71745 7194,75912 7194,147952 7194,163304 7194,173427 7194,211936 7195,83 7196,120 7196,261 7196,694 7196,3115 7196,32751 7197,557 7198,1179 7199,111 7200,312 7201,72 7202,1149 7203,1167 7203,2979 7204,167 7204,1231 7204,1522 7206,1235 7206,1335 7206,21944 7207,58 7208,602 7209,1644 7209,6661 7210,305 7211,420 7212,2116 7213,309 7213,310 7214,248 7214,364 7214,850 7214,1332 7215,147 7215,991 7216,147 7216,158 7217,467 7217,868 7218,949 7219,1167 7220,1359 7221,120 7221,261 7221,1313 7221,1466 7222,37 7222,46 7222,301 7222,525 7222,717 7222,852 7222,968 7222,1133 7222,1231 7222,1235 7222,1241 7222,1293 7222,1335 7222,1370 7222,1411 7222,1782 7222,1837 7222,2557 7222,2782 7222,3804 7222,5662 7222,5881 7223,217 7223,536 7224,340 7224,408 7224,489 7225,431 7226,192 7226,256 7226,707 7228,1359 7229,726 7230,219 7231,106 7231,1370 7231,1821 7231,2782 7231,6119 7231,21736 7232,7233 7234,720 7234,1284 7235,248 7236,151 7237,1381 7238,417 7238,1564 7239,1167 7240,58 7241,3 7241,34 7241,35 7241,106 7241,158 7241,178 7241,192 7241,202 7241,203 7241,217 7241,251 7241,252 7241,333 7241,337 7241,346 7241,435 7241,439 7241,447 7241,516 7241,586 7241,602 7241,622 7241,640 7241,663 7241,664 7241,1181 7241,1220 7241,1222 7241,1243 7241,1247 7241,1294 7241,1370 7241,1512 7241,1590 7241,1635 7241,1963 7241,2567 7241,2931 7241,3161 7241,4192 7241,4193 7241,4672 7241,5874 7241,5976 7241,5992 7241,6119 7241,8598 7241,8771 7241,8811 7241,8822 7241,8907 7242,79 7242,784 7242,3623 7243,140 7243,1370 7244,1707 7245,217 7245,868 7246,346 7247,72 7247,2605 7247,3695 7248,7249 7250,117 7250,2712 7251,298 7252,2668 7253,7254 7255,485 7256,192 7256,333 7257,301 7257,1160 7258,663 7258,1531 7258,7259 7258,51080 7258,78065 7258,89302 7258,93891 7258,95362 7258,115886 7258,120313 7258,127490 7258,144415 7258,151915 7260,850 7261,408 7261,668 7261,1436 7261,1515 7262,859 7264,920 7265,202 7265,203 7265,312 7266,120 7266,261 7266,694 7266,1203 7266,1419 7266,1466 7266,1955 7266,2989 7266,2991 7267,83 7268,240 7268,289 7268,290 7268,298 7268,372 7268,417 7268,932 7268,1085 7268,1564 7268,1818 7268,1955 7268,2205 7268,2206 7268,2296 7268,2620 7268,33424 7268,94134 7269,104 7269,136 7269,254 7269,557 7269,953 7269,1368 7269,1939 7269,7270 7270,978 7270,5053 7270,7270 7270,105824 7272,2373 7273,1179 7274,1001 7275,1544 7276,7277 7278,1127 7279,7280 7281,66 7282,72 7283,7284 7285,143 7286,143 7287,217 7287,1417 7288,255 7288,1796 7289,1474 7290,278 7291,7292 7293,972 7294,1506 7295,63 7295,2156 7296,10 7296,56 7296,79 7296,135 7296,192 7296,333 7296,602 7296,841 7296,1089 7296,1181 7296,1458 7296,22616 7296,23783 7296,30331 7296,60576 7296,92476 7297,1210 7298,1400 7299,285 7299,525 7299,795 7299,1085 7299,2590 7299,35486 7300,326 7301,217 7301,222 7301,1417 7301,4672 7301,5343 7302,79 7303,4 7303,5 7303,117 7303,250 7303,256 7303,483 7303,668 7303,827 7303,994 7303,1116 7303,1684 7303,2712 7303,2735 7303,3089 7303,3524 7303,3695 7303,4691 7303,4810 7303,14434 7303,21603 7303,142430 7304,7304 7305,602 7306,184 7307,1235 7307,1335 7308,30 7309,1556 7310,26 7310,59 7311,2574 7312,420 7312,652 7313,7314 7315,7316 7317,376 7318,10 7318,175 7318,205 7318,313 7318,328 7318,485 7318,671 7318,685 7318,693 7318,704 7318,1130 7318,1188 7318,1402 7318,115659 7319,885 7320,136 7321,1033 7322,136 7324,81 7324,215 7324,1392 7325,206 7325,31977 7326,392 7326,1240 7327,7328 7329,7328 7330,7328 7331,247 7332,392 7333,1849 7333,32784 7334,7335 7337,10 7337,1711 7337,1796 7337,3111 7337,16196 7338,79 7338,240 7338,818 7339,698 7340,422 7341,1151 7341,1363 7341,1836 7342,7343 7344,1019 7344,1181 7344,1531 7344,4355 7345,289 7345,290 7346,34 7346,35 7346,536 7347,209 7347,222 7349,663 7349,972 7349,1167 7349,1298 7349,2979 7350,775 7351,6803 7352,2411 7353,6891 7354,99 7355,41 7355,119 7355,298 7355,843 7355,1127 7356,1381 7357,7358 7357,7363 7358,7358 7358,7363 7359,7360 7361,1571 7361,5326 7362,44 7364,794 7365,305 7365,515 7365,1381 7367,195 7368,160 7369,687 7370,1289 7371,1381 7372,3999 7373,1767 7374,697 7375,3260 7376,5440 7377,433 7378,227 7379,1722 7380,1132 7380,142430 7381,1465 7383,72 7383,134 7383,248 7383,285 7383,372 7383,525 7383,626 7383,795 7383,972 7383,1309 7383,2590 7383,35486 7384,5101 7385,344 7385,859 7385,1512 7385,1983 7385,2646 7385,5992 7386,1085 7386,75912 7387,433 7388,63 7388,589 7388,1127 7388,1274 7388,1298 7388,1474 7388,4411 7388,22293 7389,7390 7389,55017 7389,129433 7391,298 7392,485 7393,2506 7394,2506 7395,372 7396,6119 7397,130 7397,1289 7398,292 7398,417 7399,602 7400,446 7400,605 7400,615 7400,937 7400,968 7401,3367 7402,147 7402,306 7402,307 7402,406 7402,585 7402,779 7402,1181 7403,1769 7403,5547 7404,602 7405,10 7405,175 7405,328 7406,875 7407,225 7408,346 7409,7410 7411,192 7412,1663 7413,366 7413,500 7414,134 7414,225 7414,349 7414,431 7415,7416 7417,366 7417,640 7417,4691 7418,1220 7418,1222 7418,1566 7418,1571 7419,7420 7421,6051 7422,147 7422,158 7422,206 7423,1257 7423,3085 7424,146 7425,333 7426,65 7426,586 7427,2048 7428,781 7430,22 7430,83 7430,315 7430,366 7430,500 7430,1655 7431,1326 7432,160 7432,296 7432,314 7432,599 7432,647 7432,991 7432,1052 7432,1127 7432,1267 7432,1579 7432,1659 7432,1749 7432,1893 7432,2051 7432,2260 7432,2605 7432,14550 7432,32673 7432,49057 7433,140 7433,264 7433,1127 7433,1551 7433,1893 7434,72 7434,81 7434,264 7434,312 7434,360 7434,467 7434,515 7434,647 7434,652 7434,991 7434,1052 7434,1188 7434,1267 7434,1287 7434,1289 7434,1659 7434,1707 7434,1749 7434,1893 7434,2312 7434,2605 7434,13538 7435,663 7435,664 7436,1181 7437,72 7438,346 7439,182 7439,949 7439,1085 7440,907 7440,1284 7440,2191 7442,3585 7443,336 7443,406 7444,1293 7444,1782 7445,805 7446,7447 7448,557 7449,557 7450,147 7451,58 7452,557 7453,7454 7455,3585 7456,22 7456,1181 7457,135 7458,294 7458,372 7458,431 7458,596 7458,631 7458,634 7458,772 7458,784 7458,805 7458,1052 7458,1368 7458,127158 7459,392 7461,941 7462,63 7463,1078 7464,7465 7466,247 7467,63 7468,577 7470,315 7471,22 7472,408 7472,726 7473,784 7473,818 7473,32751 7474,1116 7475,1639 7476,83 7477,1479 7478,3148 7479,5101 7480,2224 7481,240 7481,1818 7482,7483 7484,7485 7486,107 7487,211 7488,406 7489,7490 7491,50 7492,766 7493,72 7494,50 7494,663 7494,1515 7496,298 7497,7498 7497,115535 7497,125983 7497,130010 7497,131352 7499,255 7500,4980 7501,72 7502,818 7503,442 7503,2334 7504,7505 7506,355 7507,104 7507,136 7507,557 7508,71 7509,72 7510,707 7511,417 7511,1085 7512,147 7512,184 7512,1247 7513,7514 7515,2506 7516,424 7517,861 7518,273 7518,274 7518,957 7518,1815 7518,66552 7519,2379 7520,392 7520,1151 7521,32 7522,1955 7523,107 7523,111 7523,4771 7524,344 7525,72 7525,83 7525,217 7525,278 7525,536 7525,631 7525,660 7525,949 7525,1133 7525,1274 7525,1466 7525,1881 7525,2244 7525,2779 7525,4637 7525,4903 7525,7092 7525,9015 7526,1359 7527,7528 7529,932 7530,126 7530,292 7530,446 7530,745 7530,932 7530,937 7530,972 7530,1117 7530,1298 7530,1618 7530,1653 7530,1677 7530,1688 7530,1849 7530,2443 7530,2674 7530,3830 7530,4411 7530,16614 7530,124668 7530,171641 7530,187176 7531,850 7532,106 7532,516 7532,1068 7532,1289 7533,861 7534,1001 7534,1010 7534,1085 7535,7536 7535,17485 7535,17874 7535,20011 7535,22752 7535,26643 7535,39115 7535,42282 7535,44675 7535,46424 7535,49394 7535,56809 7535,57506 7535,57541 7535,58319 7535,69856 7535,92092 7535,120760 7535,131697 7537,1551 7538,250 7538,887 7539,192 7539,13485 7540,72 7541,1298 7542,1287 7543,107 7544,2674 7545,72 7546,435 7547,130 7548,1326 7549,209 7550,143 7551,3238 7552,483 7553,346 7554,818 7555,4 7555,5 7556,417 7557,160 7558,605 7559,86 7560,5662 7561,1849 7562,1955 7563,301 7564,1231 7565,5718 7566,752 7567,1564 7568,2083 7569,2620 7570,390 7571,7572 7573,4549 7574,388 7575,1837 7576,3422 7577,3193 7578,1241 7579,1782 7580,1522 7581,2191 7582,3194 7583,907 7584,1167 7585,968 7586,1544 7587,3218 7588,3207 7589,3138 7590,2557 7591,720 7592,1298 7593,893 7594,247 7594,309 7594,310 7594,1566 7594,2266 7594,6068 7594,6298 7595,72 7596,143 7597,143 7598,336 7598,682 7599,72 7600,1837 7601,306 7601,307 7602,862 7603,784 7604,273 7604,274 7604,66754 7607,1452 7608,1181 7609,143 7609,2006 7610,2779 7611,143 7612,167 7612,1522 7612,2083 7612,2191 7612,2557 7612,3138 7613,209 7615,3041 7616,72 7617,184 7617,292 7617,304 7617,328 7617,356 7617,704 7617,862 7617,991 7617,1085 7617,1285 7617,1309 7617,2244 7617,5440 7617,7429 7618,20 7619,1016 7620,1052 7620,1639 7621,516 7622,7623 7624,366 7625,143 7626,602 7627,388 7628,77 7628,83 7628,278 7628,285 7628,372 7628,399 7628,536 7628,631 7628,805 7628,1085 7628,1238 7628,1274 7628,1756 7628,1801 7628,2421 7628,3695 7628,7698 7628,22293 7629,136 7629,252 7629,272 7629,318 7629,333 7629,435 7629,516 7629,596 7629,1033 7629,1370 7629,1893 7629,2006 7629,4545 7629,139010 7630,671 7631,143 7632,7633 7634,7633 7635,7633 7636,7637 7638,1858 7639,1860 7640,72 7641,4594 7642,7633 7643,7633 7644,1381 7645,175 7645,245706 7646,192 7647,602 7648,7649 7650,1634 7651,1390 7653,392 7654,392 7654,1151 7654,76096 7655,920 7656,4 7656,5 7657,1425 7658,349 7659,561 7659,911 7660,2286 7661,644 7662,99 7663,99 7664,30 7665,328 7666,346 7667,287 7668,1274 7669,143 7670,115 7671,118 7672,911 7673,207 7673,843 7674,957 7674,1247 7674,1815 7674,164572 7675,72 7676,149 7677,1127 7678,949 7679,346 7680,1133 7681,22 7681,207 7682,1 7682,94 7682,184 7682,2787 7683,7684 7685,7686 7687,72 7688,215 7689,269 7689,710 7689,784 7689,1241 7689,1345 7689,1572 7689,2083 7689,3069 7689,5874 7690,346 7691,346 7692,30 7693,346 7694,195 7695,7696 7697,158 7697,406 7697,779 7698,54 7698,83 7698,278 7698,313 7698,379 7698,385 7698,389 7698,457 7698,477 7698,536 7698,660 7698,745 7698,784 7698,1019 7698,1274 7698,1756 7698,1871 7698,2159 7698,2168 7698,2247 7698,2421 7698,2507 7698,2646 7698,2784 7698,2944 7698,4039 7698,6064 7698,6880 7698,6997 7698,7768 7698,9743 7698,18345 7698,21015 7698,21249 7698,21592 7698,23231 7698,23287 7698,29720 7698,29885 7698,30918 7698,33414 7698,34166 7698,35091 7698,35352 7698,38030 7698,38859 7698,39537 7698,41025 7698,42111 7698,46343 7698,48278 7698,55203 7698,57123 7698,59822 7698,61043 7698,62539 7698,66703 7698,66796 7698,70979 7698,75848 7698,79533 7698,79966 7698,80335 7698,82101 7698,87372 7698,91944 7698,91960 7698,93149 7698,93165 7698,94299 7698,94900 7698,107568 7698,107582 7698,107594 7698,110681 7698,110688 7698,110696 7698,111715 7698,114093 7698,114096 7698,115474 7698,123077 7698,127431 7698,134021 7698,134033 7698,134042 7698,134054 7698,134089 7698,135040 7698,140663 7698,140777 7698,141807 7698,141890 7698,168934 7698,181063 7698,219891 7698,231120 7698,232150 7698,232216 7698,236004 7698,236031 7698,236042 7698,236615 7698,248449 7698,263955 7699,5101 7700,7701 7702,932 7702,1085 7703,7704 7705,663 7705,664 7706,2351 7707,178 7708,1238 7709,1433 7710,2797 7711,5375 7712,872 7713,87 7714,202 7714,203 7714,4453 7715,195 7715,450 7715,32475 7716,676 7717,2923 7718,233 7718,1014 7718,1309 7718,1801 7718,3370 7719,1 7720,392 7721,7722 7724,94 7724,2787 7725,1511 7725,3069 7726,1634 7727,489 7728,1119 7728,1285 7728,26041 7729,7730 7731,4 7731,5 7731,32 7731,34 7731,35 7731,48 7731,50 7731,104 7731,146 7731,158 7731,182 7731,200 7731,248 7731,252 7731,261 7731,278 7731,306 7731,307 7731,328 7731,330 7731,333 7731,422 7731,491 7731,493 7731,596 7731,602 7731,663 7731,673 7731,704 7731,752 7731,772 7731,827 7731,893 7731,919 7731,929 7731,949 7731,994 7731,1052 7731,1127 7731,1140 7731,1149 7731,1227 7731,1235 7731,1289 7731,1298 7731,1309 7731,1335 7731,1368 7731,1381 7731,1419 7731,1458 7731,1509 7731,1515 7731,1544 7731,1623 7731,1844 7731,1912 7731,2083 7731,2178 7731,2353 7731,3209 7731,4545 7731,4637 7731,4865 7731,4866 7731,5192 7731,17346 7731,56150 7731,86416 7731,106502 7732,366 7733,306 7733,307 7734,233 7735,83 7736,602 7736,707 7737,827 7738,83 7739,760 7739,1149 7739,1631 7740,602 7741,841 7742,7743 7744,602 7744,3218 7745,515 7746,298 7747,485 7748,718 7749,3769 7750,11 7751,7752 7755,63 7756,7757 7757,136 7757,248 7757,450 7757,852 7757,1012 7757,1368 7757,1844 7757,1867 7757,4276 7757,5728 7757,7756 7757,7757 7757,7921 7757,13207 7757,18141 7757,19278 7757,20228 7757,22467 7757,28338 7757,30775 7757,32778 7757,33411 7757,34370 7757,34865 7757,35514 7757,38777 7757,41124 7757,43111 7757,48370 7757,48396 7757,51932 7757,58871 7757,60559 7757,63038 7757,70926 7757,70968 7757,72495 7757,72579 7757,78746 7757,82127 7757,83254 7757,83456 7757,91190 7757,102494 7757,106310 7757,106337 7757,111062 7757,120916 7757,122511 7757,122937 7757,134597 7757,148443 7757,149271 7757,150805 7757,157260 7757,159064 7757,185393 7757,189219 7757,190270 7757,202998 7757,203982 7757,216532 7757,220367 7757,221743 7757,221790 7757,221864 7757,225659 7757,243430 7757,250534 7757,255711 7757,256158 7757,264365 7757,264553 7758,163 7758,366 7758,489 7758,760 7758,1149 7758,1631 7759,167 7759,631 7759,657 7759,1210 7759,7760 7760,207 7760,1607 7760,23300 7760,29965 7760,66356 7760,74376 7760,194338 7760,201750 7760,247654 7760,251244 7760,259426 7761,868 7762,3451 7762,3452 7763,77 7764,631 7765,626 7766,292 7766,301 7766,333 7766,388 7766,392 7766,406 7766,516 7766,536 7766,571 7766,626 7766,875 7766,920 7766,1001 7766,1085 7766,1118 7766,1143 7766,1796 7766,1805 7766,2979 7767,379 7767,1724 7767,2424 7767,7768 7767,115474 7768,19 7768,130 7768,135 7768,222 7768,283 7768,455 7768,745 7768,784 7768,1539 7768,1618 7768,1724 7768,1756 7768,2159 7768,2424 7768,2699 7768,6788 7768,6880 7768,7767 7768,13137 7768,13276 7768,13328 7768,13400 7768,19349 7768,19351 7768,22119 7768,22252 7768,22253 7768,28130 7768,31903 7768,37088 7768,42434 7768,56584 7768,73451 7768,79966 7768,92656 7768,94975 7768,101735 7768,113481 7768,115474 7768,117308 7768,126037 7768,131216 7768,135270 7768,136072 7768,136665 7768,140055 7768,140292 7768,140452 7768,148355 7768,177486 7768,206246 7768,207659 7768,213089 7768,215060 7768,225319 7768,234249 7768,246189 7768,247153 7768,252341 7768,256342 7768,261962 7769,586 7769,652 7769,1149 7772,7768 7773,1639 7774,356 7774,852 7774,1167 7774,3422 7775,1417 7777,333 7777,622 7777,862 7777,893 7777,1515 7779,26 7779,59 7779,1235 7779,1335 7780,280 7780,393 7780,980 7780,1400 7781,302 7781,809 7781,2312 7781,22293 7782,3209 7783,2460 7784,298 7785,485 7786,349 7787,3422 7788,1579 7789,718 7790,248 7790,534 7790,760 7790,805 7790,862 7790,1119 7790,1179 7790,1631 7790,75912 7791,79 7791,273 7791,516 7791,1425 7792,86 7793,302 7794,192 7794,336 7794,493 7794,663 7794,664 7794,779 7794,1181 7794,1985 7794,60576 7795,403 7795,693 7796,97 7796,1639 7797,7798 7799,298 7800,485 7802,79 7802,726 7803,309 7803,310 7803,859 7804,143 7805,372 7806,1332 7806,1572 7807,7808 7807,14097 7807,23251 7807,31862 7807,41274 7807,45332 7807,46603 7807,51983 7807,54561 7807,57636 7807,68065 7807,79144 7807,79675 7807,87104 7807,88419 7807,88812 7807,99461 7807,100177 7807,101766 7807,106375 7809,278 7809,364 7809,431 7809,1252 7809,1253 7810,1235 7810,1335 7811,298 7811,309 7811,310 7811,611 7811,1105 7811,1368 7812,1285 7812,1888 7812,6119 7813,338 7813,462 7813,4039 7813,8149 7814,631 7815,298 7816,485 7817,1 7817,184 7818,779 7818,972 7818,973 7818,1634 7819,1085 7819,6068 7820,298 7821,485 7822,48 7823,1836 7824,306 7824,307 7825,473 7825,8149 7826,859 7826,6263 7827,1 7827,20 7827,22 7827,48 7827,63 7827,72 7827,81 7827,86 7827,104 7827,107 7827,130 7827,135 7827,137 7827,146 7827,149 7827,151 7827,163 7827,178 7827,184 7827,192 7827,206 7827,207 7827,209 7827,247 7827,250 7827,251 7827,252 7827,254 7827,256 7827,258 7827,259 7827,262 7827,264 7827,269 7827,272 7827,273 7827,275 7827,278 7827,280 7827,283 7827,289 7827,290 7827,299 7827,302 7827,305 7827,306 7827,307 7827,309 7827,310 7827,313 7827,314 7827,315 7827,326 7827,330 7827,337 7827,338 7827,347 7827,352 7827,356 7827,406 7827,435 7827,452 7827,581 7827,599 7827,626 7827,647 7827,649 7827,668 7827,726 7827,736 7827,752 7827,801 7827,805 7827,808 7827,841 7827,843 7827,852 7827,861 7827,893 7827,920 7827,934 7827,972 7827,994 7827,1133 7827,1151 7827,1172 7827,1179 7827,1210 7827,1220 7827,1222 7827,1247 7827,1309 7827,1313 7827,1381 7827,1434 7827,1449 7827,1452 7827,1465 7827,1509 7827,1644 7827,1684 7827,1707 7827,1796 7827,1818 7827,1844 7827,1881 7827,1973 7827,2048 7827,2073 7827,2244 7827,2266 7827,2837 7827,2867 7827,2868 7827,2915 7827,3989 7827,3999 7827,4771 7827,4903 7827,5326 7827,5718 7827,8993 7827,9457 7827,16687 7827,17245 7827,41170 7827,92476 7827,94134 7827,106502 7827,144988 7827,164572 7827,215276 7828,515 7829,376 7830,868 7831,83 7832,337 7833,7834 7835,1871 7836,483 7837,192 7837,2260 7837,3367 7838,58 7840,518 7840,1326 7840,3804 7841,483 7841,1707 7842,77 7842,868 7843,134 7844,1001 7845,2923 7846,626 7847,5326 7848,996 7849,3524 7850,515 7851,1551 7852,372 7853,934 7854,346 7855,1707 7856,717 7857,622 7858,178 7859,1590 7860,346 7861,439 7862,147 7862,149 7862,202 7862,203 7862,217 7862,838 7862,1014 7862,1179 7862,1243 7862,21944 7863,251 7864,26 7864,59 7864,178 7864,305 7865,158 7866,408 7867,1858 7868,1860 7869,278 7870,195 7870,640 7871,687 7871,1556 7872,346 7873,1122 7874,2334 7875,1143 7876,163 7878,784 7879,104 7879,134 7879,135 7879,136 7879,137 7879,138 7879,557 7879,1368 7879,1844 7879,1939 7879,2105 7880,65 7880,192 7880,217 7880,240 7880,264 7880,301 7880,309 7880,310 7880,392 7880,467 7880,779 7880,1019 7880,1085 7880,1417 7880,1531 7880,1688 7880,1796 7880,2205 7880,2206 7881,86 7881,344 7881,14674 7882,1424 7884,104 7884,202 7884,203 7885,417 7885,1118 7886,302 7886,861 7886,893 7886,2116 7887,298 7887,626 7887,2995 7887,7888 7887,73561 7887,89747 7887,93465 7887,99796 7887,103672 7887,159409 7887,161521 7887,176219 7887,237402 7887,243296 7887,245877 7889,248 7890,314 7890,392 7890,623 7890,872 7890,918 7890,1805 7890,3260 7891,192 7891,217 7891,535 7891,818 7892,640 7893,827 7894,187 7895,640 7896,694 7897,337 7898,7899 7901,1749 7901,3585 7902,1467 7903,187 7904,163 7904,1201 7904,1571 7904,2073 7904,6452 7904,75912 7906,2923 7906,3524 7907,697 7908,366 7908,972 7909,158 7909,195 7910,868 7911,163 7912,248 7913,298 7914,485 7915,240 7915,1285 7915,1309 7915,1955 7915,2512 7915,5718 7916,366 7918,366 7919,366 7920,372 7922,615 7923,206 7924,72 7925,304 7926,3 7927,3695 7928,1149 7928,3507 7930,22 7931,7932 7933,338 7933,1893 7934,497 7935,104 7935,636 7936,972 7936,1298 7937,827 7939,302 7939,861 7939,2116 7940,996 7941,972 7942,219 7943,781 7944,120 7944,577 7944,694 7944,1019 7945,206 7946,1858 7947,1860 7948,79 7948,158 7948,269 7948,337 7948,406 7948,467 7948,1181 7948,1433 7949,66 7949,868 7950,422 7951,422 7952,516 7952,1220 7952,1222 7952,1512 7952,5992 7953,195 7954,893 7955,1 7955,171 7955,184 7955,273 7955,422 7955,994 7955,1172 7955,6556 7955,7956 7957,2116 7958,26 7958,59 7958,430 7958,1432 7958,21944 7959,186 7959,459 7959,518 7959,775 7959,1326 7959,1849 7959,2646 7959,188791 7960,1323 7961,102 7962,233 7962,760 7962,1119 7962,1462 7962,8537 7963,781 7964,1326 7965,408 7966,372 7967,919 7968,56 7968,602 7968,685 7968,749 7968,1146 7968,1240 7968,2367 7969,1010 7969,1849 7969,32784 7970,147 7970,158 7971,620 7972,611 7972,1718 7973,673 7974,209 7974,302 7974,579 7974,1556 7974,2944 7975,233 7976,1381 7977,72 7978,397 7979,135 7980,1436 7981,718 7982,850 7984,66 7985,518 7986,567 7986,604 7986,1068 7986,1293 7987,32 7987,87 7987,392 7987,697 7987,872 7987,875 7987,1836 7988,408 7989,781 7990,219 7991,868 7992,346 7993,292 7993,312 7993,338 7993,360 7993,509 7993,510 7993,710 7993,1058 7993,1140 7993,1381 7993,1612 7993,1722 7993,2626 7993,4039 7995,1837 7996,227 7996,298 7996,304 7997,781 7998,1 7998,147 7998,149 7998,158 7998,184 7999,147 7999,516 7999,1052 7999,1580 7999,2784 8000,1118 8001,302 8001,579 8002,195 8002,392 8003,72 8004,143 8005,592 8006,86 8006,118 8006,306 8006,307 8006,315 8006,340 8006,663 8006,664 8006,668 8006,1179 8006,1623 8006,1837 8006,4597 8006,6506 8007,71 8007,136 8007,184 8007,304 8007,450 8007,485 8007,611 8007,690 8007,788 8007,795 8007,811 8007,920 8007,1070 8007,1133 8007,1368 8007,1449 8007,1612 8007,1619 8007,2460 8007,2590 8007,2812 8007,3724 8007,4222 8007,4411 8007,7757 8007,15179 8007,24500 8007,37414 8007,193129 8008,143 8009,749 8010,907 8010,932 8011,750 8011,1133 8011,1326 8011,2979 8012,714 8012,811 8012,3769 8013,79 8013,192 8013,440 8013,6695 8014,1388 8015,158 8016,222 8016,949 8017,510 8018,8019 8020,2574 8020,4980 8021,1204 8022,1122 8022,1849 8023,86 8024,1858 8025,1860 8026,577 8026,1010 8026,1298 8026,1429 8026,2995 8027,147 8027,158 8027,1803 8027,89035 8028,8019 8029,10 8029,1127 8029,2617 8029,2626 8030,1871 8031,146 8032,2372 8032,148742 8033,8034 8035,219 8036,315 8037,1 8037,107 8037,605 8037,811 8037,827 8037,1227 8037,1229 8037,1313 8037,1381 8038,393 8039,5101 8040,338 8040,467 8040,872 8040,1146 8040,1289 8040,1722 8040,1949 8041,32 8041,433 8041,440 8041,467 8041,809 8041,3367 8041,5440 8042,248 8042,1332 8043,346 8043,932 8044,581 8044,918 8045,932 8046,620 8046,8244 8047,1801 8048,72 8049,104 8049,134 8049,138 8049,2105 8050,143 8051,1298 8052,718 8052,3769 8054,102 8056,781 8057,634 8058,72 8059,58 8059,932 8060,187 8061,805 8061,1659 8063,1345 8064,240 8064,631 8065,1871 8066,985 8067,195 8068,163 8068,25222 8071,8072 8072,446 8072,849 8072,1096 8072,3555 8072,15241 8072,28294 8072,34136 8072,48721 8072,88473 8072,90831 8072,99593 8072,108559 8072,112366 8072,118958 8072,133971 8072,134027 8072,160700 8073,72 8074,710 8076,252 8076,1220 8076,1222 8077,140 8079,81 8079,8080 8079,8135 8079,8136 8079,18959 8079,19700 8079,22661 8079,25074 8079,25076 8079,26404 8079,26405 8081,788 8082,788 8083,788 8084,32 8084,48 8084,65 8084,79 8084,130 8084,146 8084,163 8084,240 8084,252 8084,275 8084,305 8084,326 8084,340 8084,364 8084,444 8084,467 8084,497 8084,500 8084,515 8084,527 8084,579 8084,693 8084,809 8084,811 8084,843 8084,850 8084,868 8084,891 8084,1127 8084,1673 8084,1893 8084,1927 8084,2373 8084,3297 8084,4101 8084,4453 8084,5102 8085,850 8086,158 8086,2797 8087,973 8088,518 8089,887 8090,344 8090,360 8090,1127 8090,1893 8091,1522 8093,248 8093,450 8093,1332 8094,1474 8095,15 8096,1653 8097,83 8097,313 8097,356 8097,388 8097,455 8097,536 8097,941 8097,1419 8097,2224 8097,3207 8097,3258 8097,5591 8097,6068 8098,147 8098,158 8098,406 8098,622 8098,779 8099,312 8099,525 8100,192 8100,406 8100,1181 8100,1370 8100,2471 8101,104 8101,557 8101,953 8101,954 8101,5405 8102,433 8103,450 8104,518 8105,264 8106,251 8106,516 8107,68 8107,167 8107,301 8107,372 8107,388 8107,390 8107,589 8107,626 8107,1010 8107,1085 8107,1293 8107,1522 8107,2557 8107,3193 8107,48505 8107,75912 8108,302 8109,1 8109,184 8110,535 8110,704 8110,710 8111,644 8112,3769 8113,589 8113,720 8113,972 8113,3846 8113,6249 8113,16153 8114,861 8115,26 8115,59 8117,298 8118,485 8119,68 8119,312 8119,358 8119,525 8120,5326 8120,5908 8121,781 8123,788 8124,20 8124,273 8124,274 8124,349 8124,408 8124,668 8124,712 8124,1313 8124,1891 8125,252 8125,1220 8125,1222 8126,200 8127,336 8127,1623 8127,2373 8128,192 8128,671 8128,788 8129,932 8130,862 8131,2373 8132,299 8132,849 8132,972 8132,1011 8132,1033 8132,1127 8132,1849 8132,2210 8132,4237 8133,30 8133,200 8133,772 8133,2376 8133,4398 8133,8126 8133,8134 8133,13207 8133,18510 8133,24789 8133,25041 8133,26264 8133,26265 8133,26802 8133,26980 8133,29740 8133,32244 8133,32656 8133,32722 8133,34352 8133,34358 8133,35703 8133,40546 8133,42541 8133,43352 8133,55911 8133,58443 8133,59203 8133,63618 8133,73222 8133,74511 8133,75256 8133,76014 8133,79333 8133,79415 8133,85814 8133,89765 8133,91293 8133,99794 8133,163744 8133,179208 8133,179338 8133,224299 8133,229893 8133,230541 8133,237687 8134,200 8137,8138 8139,868 8140,217 8140,222 8140,392 8140,657 8140,1019 8140,2266 8140,2421 8140,6424 8141,217 8142,447 8143,140 8144,97 8145,497 8146,1274 8146,2979 8148,8149 8149,87 8149,292 8149,420 8149,609 8149,673 8149,685 8149,849 8149,872 8149,1241 8149,1653 8149,2580 8149,4039 8149,20757 8150,248 8150,338 8150,668 8150,1631 8152,283 8152,385 8152,455 8152,536 8152,589 8152,1274 8152,1353 8152,1618 8152,1724 8152,2784 8152,14674 8153,640 8154,1274 8154,6556 8155,2674 8155,16153 8156,120 8156,222 8156,278 8156,1274 8156,1353 8156,1465 8157,217 8157,435 8157,538 8157,586 8157,1531 8157,1749 8157,2371 8157,6695 8158,1707 8160,79 8161,3744 8162,1070 8163,4 8163,5 8163,22 8163,151 8163,309 8163,310 8163,483 8163,818 8163,861 8163,1052 8163,1556 8163,2017 8163,2626 8163,3039 8163,3695 8164,2274 8165,843 8165,932 8165,972 8165,1844 8165,1849 8165,32784 8166,516 8166,1220 8166,1222 8168,657 8168,4637 8169,1274 8170,106 8171,949 8172,1241 8173,8019 8173,107923 8174,779 8174,1515 8175,8019 8176,1247 8176,164572 8177,510 8177,707 8177,1019 8177,1881 8177,2045 8177,3804 8177,4223 8177,5469 8177,9743 8177,132559 8177,136072 8180,107 8180,609 8180,966 8180,4308 8180,30443 8180,38266 8180,38877 8181,2312 8181,3585 8182,1274 8183,217 8183,467 8183,868 8183,1433 8184,805 8185,527 8188,269 8189,422 8190,65 8190,66 8190,120 8190,388 8190,392 8190,536 8190,868 8190,1240 8190,1345 8190,1433 8190,1454 8190,2371 8190,2671 8190,8192 8191,788 8193,1012 8193,1241 8193,2557 8194,8019 8195,50 8195,457 8195,473 8195,1313 8195,8149 8196,272 8196,589 8196,1294 8197,364 8198,1247 8199,1453 8200,248 8201,1506 8202,63 8203,850 8204,147 8205,5718 8206,875 8207,1977 8207,1978 8208,313 8208,623 8208,1805 8208,6068 8209,140 8209,510 8209,1453 8209,2436 8209,3507 8209,3538 8210,143 8210,1052 8211,163 8212,8213 8214,256 8214,852 8214,1837 8215,527 8215,743 8216,7 8216,97 8216,175 8217,2334 8218,305 8219,431 8220,8 8220,2779 8220,5034 8221,158 8221,206 8221,1001 8221,1801 8222,163 8222,209 8222,438 8222,694 8223,147 8223,158 8223,779 8224,2379 8225,3999 8225,7652 8226,22 8227,32 8227,187 8227,687 8228,312 8228,510 8228,525 8228,1749 8230,1181 8231,4190 8232,184 8232,332 8232,424 8232,438 8232,2315 8232,2620 8232,2701 8232,3451 8232,3452 8232,3769 8233,250 8233,1684 8233,96002 8234,8235 8236,392 8236,623 8236,1805 8236,3260 8237,151 8238,493 8238,525 8238,1983 8239,736 8240,1298 8242,1511 8242,3069 8243,104 8243,136 8243,137 8243,240 8243,439 8243,457 8243,493 8243,525 8243,631 8243,818 8243,992 8243,1749 8243,2205 8243,2206 8243,3507 8243,7124 8243,26306 8243,33424 8244,1425 8245,1608 8246,41 8246,68 8246,1119 8247,2073 8248,417 8249,1147 8250,577 8251,106 8251,1127 8252,907 8252,932 8253,167 8253,301 8253,919 8253,2557 8254,143 8254,1052 8254,2266 8254,6424 8255,1319 8255,1515 8255,8256 8257,3585 8258,500 8259,143 8260,392 8261,68 8261,186 8261,388 8261,534 8261,609 8261,631 8261,973 8261,1046 8261,1133 8261,1210 8261,1326 8261,2989 8261,2991 8262,1803 8262,5213 8263,652 8263,710 8263,1893 8264,298 8265,485 8266,2607 8267,8268 8269,8270 8270,8270 8271,392 8272,1284 8273,178 8273,439 8273,1612 8273,1776 8273,1877 8274,163 8274,467 8274,868 8274,162599 8277,505 8278,485 8279,30 8279,104 8279,135 8279,327 8279,328 8279,714 8279,1045 8279,1179 8279,1281 8279,1282 8279,1304 8279,1305 8279,1415 8279,3565 8279,6084 8279,6292 8279,6646 8279,7124 8279,7182 8279,9678 8279,22082 8279,27892 8279,28049 8279,57293 8279,92948 8279,98469 8279,160937 8279,176399 8279,202709 8279,203015 8279,206762 8279,207116 8279,213939 8279,223797 8279,231192 8279,254352 8280,1849 8283,723 8285,10 8285,134 8285,147 8285,175 8285,202 8285,332 8285,1623 8285,2244 8286,433 8287,211 8287,366 8288,326 8289,887 8291,720 8291,1117 8292,781 8294,801 8295,781 8296,41 8296,50 8296,58 8296,68 8296,79 8296,83 8296,86 8296,104 8296,107 8296,111 8296,120 8296,130 8296,136 8296,138 8296,160 8296,178 8296,202 8296,209 8296,211 8296,217 8296,240 8296,251 8296,252 8296,254 8296,259 8296,287 8296,294 8296,309 8296,310 8296,312 8296,315 8296,388 8296,406 8296,433 8296,477 8296,509 8296,510 8296,516 8296,518 8296,525 8296,577 8296,579 8296,586 8296,592 8296,596 8296,623 8296,626 8296,631 8296,634 8296,636 8296,640 8296,647 8296,649 8296,704 8296,714 8296,717 8296,760 8296,795 8296,809 8296,811 8296,818 8296,861 8296,893 8296,907 8296,919 8296,920 8296,943 8296,992 8296,994 8296,1001 8296,1010 8296,1012 8296,1033 8296,1058 8296,1132 8296,1133 8296,1149 8296,1179 8296,1238 8296,1241 8296,1243 8296,1368 8296,1381 8296,1392 8296,1436 8296,1466 8296,1474 8296,1509 8296,1531 8296,1551 8296,1571 8296,1572 8296,1619 8296,1631 8296,1634 8296,1653 8296,1715 8296,1722 8296,1801 8296,1860 8296,1877 8296,1881 8296,1893 8296,1927 8296,1968 8296,2045 8296,2209 8296,2244 8296,2260 8296,2379 8296,2590 8296,2605 8296,2620 8296,2775 8296,2779 8296,2784 8296,2995 8296,3182 8296,3367 8296,3538 8296,3695 8296,3999 8296,4355 8296,5265 8296,5667 8296,6059 8296,7194 8296,7698 8296,9001 8296,9457 8296,16687 8296,28107 8296,28130 8296,201298 8296,204124 8297,187 8297,302 8297,783 8297,1117 8297,1313 8298,710 8299,781 8300,273 8300,274 8300,4611 8301,83 8301,119 8301,347 8301,364 8301,372 8301,389 8301,417 8301,455 8301,525 8301,626 8301,795 8301,805 8301,907 8301,972 8301,1019 8301,1085 8301,1274 8301,1298 8301,1363 8301,1465 8301,1467 8301,1718 8301,1801 8301,1881 8301,2266 8301,2286 8301,2434 8301,2553 8301,2590 8301,2646 8301,4172 8301,13575 8301,141912 8302,781 8303,1117 8304,2372 8305,2995 8306,1688 8307,158 8307,269 8307,406 8307,622 8307,5874 8307,8308 8309,192 8309,663 8309,664 8310,6068 8311,462 8312,143 8313,516 8314,389 8315,54 8316,1241 8317,647 8317,835 8317,1522 8318,3769 8319,233 8319,805 8320,248 8322,240 8323,240 8323,392 8323,818 8323,918 8323,1143 8323,1363 8323,1454 8324,32 8324,3003 8325,818 8326,259 8326,312 8328,163 8329,3895 8331,163 8331,195 8331,302 8332,664 8332,1181 8332,1235 8332,1833 8332,3895 8332,4307 8332,4391 8332,5173 8332,8329 8332,8333 8332,9165 8332,9548 8332,13183 8332,15203 8332,23783 8332,26841 8332,29180 8332,30331 8332,30755 8332,31853 8332,31854 8332,31855 8332,31856 8332,31857 8332,31858 8332,32982 8332,32983 8332,36940 8332,42569 8332,43685 8332,43686 8332,44165 8332,45225 8332,72439 8332,240174 8334,79 8334,163 8334,346 8334,408 8334,422 8334,459 8334,473 8334,481 8334,671 8334,707 8334,743 8334,868 8334,996 8334,1276 8334,1294 8334,1323 8334,1425 8334,1572 8334,1607 8334,2807 8334,52232 8335,50 8335,163 8335,217 8335,302 8335,1265 8335,1266 8335,4748 8336,163 8338,163 8339,163 8339,1634 8340,163 8341,163 8342,599 8342,1293 8342,3422 8343,163 8344,10 8344,11 8344,20 8344,44 8344,97 8344,147 8344,158 8344,163 8344,192 8344,195 8344,202 8344,203 8344,206 8344,209 8344,247 8344,248 8344,251 8344,252 8344,255 8344,272 8344,302 8344,305 8344,323 8344,332 8344,333 8344,338 8344,344 8344,346 8344,352 8344,435 8344,438 8344,485 8344,489 8344,516 8344,563 8344,585 8344,622 8344,663 8344,690 8344,693 8344,718 8344,779 8344,818 8344,849 8344,920 8344,925 8344,929 8344,973 8344,991 8344,1011 8344,1046 8344,1135 8344,1181 8344,1188 8344,1204 8344,1220 8344,1222 8344,1238 8344,1243 8344,1309 8344,1319 8344,1326 8344,1400 8344,1414 8344,1623 8344,1634 8344,1844 8344,1891 8344,1927 8344,2373 8344,2668 8344,3370 8344,3804 8344,3876 8344,4177 8344,5213 8344,5726 8344,6027 8344,6119 8344,6837 8344,7117 8344,7124 8344,7614 8344,9029 8344,9179 8344,9208 8344,14453 8344,17772 8344,25222 8344,38158 8344,47268 8344,54064 8344,109940 8345,1188 8346,163 8346,893 8347,163 8347,302 8347,2116 8347,6303 8348,784 8349,163 8350,130 8350,163 8350,264 8350,1007 8350,1381 8351,254 8352,163 8353,298 8354,485 8358,26 8358,59 8358,887 8358,21944 8359,163 8359,996 8360,422 8361,182 8361,188 8362,422 8363,422 8364,163 8365,163 8366,781 8367,163 8368,163 8369,163 8370,163 8370,673 8371,1564 8372,8373 8374,346 8374,435 8374,447 8374,934 8374,1033 8375,163 8376,163 8377,392 8379,163 8380,163 8381,163 8382,137 8382,200 8383,163 8384,163 8384,2116 8385,364 8386,1319 8386,2083 8387,26 8387,47 8387,59 8387,2469 8387,21944 8388,2209 8389,140 8389,163 8391,1043 8393,163 8394,163 8395,900 8396,163 8397,577 8398,211 8398,1181 8398,2379 8399,1634 8400,859 8400,1175 8400,1289 8401,1119 8402,163 8403,184 8404,163 8404,302 8405,68 8405,302 8405,579 8406,163 8407,1140 8407,2436 8408,163 8408,1579 8409,66 8410,283 8411,163 8412,2379 8413,163 8415,104 8416,163 8417,46 8418,163 8419,182 8419,1135 8419,1172 8419,1191 8420,163 8421,636 8421,8541 8421,118336 8422,1309 8422,1955 8423,1052 8423,3695 8424,135 8425,22 8425,272 8425,439 8425,1634 8425,31207 8426,195 8426,1089 8426,2373 8426,31346 8427,54 8428,509 8429,10 8430,72 8430,1363 8431,83 8431,187 8431,222 8431,278 8431,283 8431,313 8431,385 8431,536 8431,660 8431,781 8431,1201 8431,1274 8431,1618 8431,1718 8431,1881 8431,2224 8431,2319 8431,2421 8431,2646 8431,2784 8431,2944 8431,3238 8431,5326 8431,5591 8431,6298 8431,7698 8431,7768 8431,13137 8431,19443 8431,23287 8431,32751 8431,37088 8432,422 8433,163 8433,21442 8434,527 8435,34 8435,58 8435,167 8435,261 8435,304 8435,424 8435,509 8435,518 8435,720 8435,868 8435,877 8435,973 8435,999 8435,1167 8435,1284 8435,1326 8435,1715 8435,1718 8435,2209 8435,3804 8435,5591 8435,5718 8435,7155 8435,9015 8435,21944 8435,26041 8435,94134 8437,63 8437,251 8437,252 8437,318 8437,465 8437,516 8437,1220 8437,1222 8437,1243 8437,1512 8437,5992 8437,41170 8438,393 8438,980 8438,1400 8439,63 8441,143 8441,442 8441,1052 8441,2156 8442,535 8442,2944 8444,1644 8445,37 8445,356 8445,1782 8447,7614 8448,996 8449,143 8450,163 8450,302 8450,2116 8451,135 8451,215 8451,372 8451,417 8451,704 8451,714 8451,760 8451,932 8451,1016 8451,1085 8451,1149 8451,1212 8451,1257 8451,1287 8451,1289 8451,1818 8451,2105 8451,2205 8451,2286 8451,2315 8451,3085 8451,3507 8451,4218 8451,4237 8451,33424 8451,182162 8452,34 8452,35 8452,222 8452,283 8452,389 8452,536 8452,657 8452,694 8452,720 8452,781 8452,877 8452,907 8452,1019 8452,1072 8452,1284 8452,1467 8452,1522 8452,1718 8452,1732 8452,1881 8452,1955 8452,2191 8452,2266 8452,2671 8452,2699 8452,2784 8452,3115 8452,3194 8452,3422 8452,4594 8452,5976 8452,6888 8452,29475 8452,42232 8453,2735 8455,163 8455,305 8455,447 8455,849 8455,1132 8455,8501 8456,1635 8457,586 8458,364 8459,107 8460,1363 8461,264 8462,743 8465,163 8466,500 8467,1962 8468,1151 8468,1363 8468,1836 8468,2697 8469,1052 8470,1882 8471,2775 8472,54 8473,2210 8473,4237 8474,269 8474,843 8475,4895 8476,2867 8476,2868 8477,163 8477,934 8478,34 8478,35 8479,356 8479,852 8479,5718 8480,22 8481,72 8482,79 8483,4 8483,5 8483,135 8483,192 8483,209 8483,779 8483,1010 8483,1014 8483,1235 8483,1345 8483,1531 8483,2073 8483,2416 8483,2417 8483,5718 8483,9005 8483,138775 8484,376 8485,885 8486,252 8486,442 8486,1220 8486,1222 8487,192 8488,68 8488,175 8488,387 8488,1912 8488,3115 8488,22071 8489,372 8490,516 8491,733 8492,1740 8493,81 8494,932 8496,1127 8497,1722 8498,430 8498,994 8498,3816 8498,3817 8499,107 8500,1844 8502,417 8503,143 8504,167 8504,2083 8504,3218 8505,417 8505,420 8506,3507 8507,302 8507,579 8507,861 8508,3 8509,83 8510,178 8510,611 8510,1332 8510,193129 8511,1179 8512,1282 8513,178 8514,147 8514,406 8514,779 8514,1181 8514,4193 8515,202 8515,483 8515,920 8516,652 8517,269 8518,3507 8519,387 8520,336 8521,1531 8522,887 8523,364 8524,20 8525,1411 8525,2006 8526,852 8527,151 8528,86 8528,167 8528,589 8528,605 8528,615 8528,907 8528,973 8528,1001 8528,1124 8528,1167 8528,1782 8528,1785 8528,1955 8528,3193 8528,3207 8528,221279 8528,221280 8528,221281 8528,221284 8528,221291 8528,221323 8528,221328 8528,221332 8529,215 8529,240 8529,289 8529,290 8529,372 8529,417 8529,592 8529,631 8529,704 8529,714 8529,932 8529,1012 8529,1016 8529,1082 8529,1085 8529,1119 8529,1212 8529,1257 8529,1285 8529,1392 8529,1511 8529,1564 8529,1631 8529,1635 8529,1785 8529,1818 8529,1882 8529,1955 8529,2205 8529,2206 8529,2210 8529,2286 8529,2296 8529,2315 8529,2620 8529,2775 8529,2995 8529,3069 8529,3695 8529,4218 8529,4237 8529,33424 8529,94134 8529,198174 8530,1117 8531,163 8532,392 8533,818 8534,86 8534,167 8534,299 8534,941 8534,1522 8534,1849 8534,2443 8534,16614 8534,32784 8535,240 8535,435 8535,455 8535,457 8535,467 8535,536 8535,868 8535,1433 8538,50 8538,336 8539,781 8540,8541 8541,6837 8542,2775 8543,447 8544,306 8544,307 8545,3846 8546,503 8546,1257 8546,3085 8547,54 8548,973 8549,784 8550,269 8551,1571 8551,13136 8552,943 8553,843 8554,2646 8554,2784 8555,292 8556,1474 8557,4 8557,5 8557,107 8557,200 8557,442 8557,784 8557,805 8557,885 8557,994 8557,1235 8557,1335 8557,21944 8558,1019 8559,6369 8560,30 8561,1359 8562,433 8563,356 8563,3507 8564,2775 8565,447 8566,1147 8567,859 8568,298 8569,485 8570,536 8571,217 8572,1722 8573,1151 8574,83 8575,278 8576,136 8576,137 8577,2506 8578,2506 8579,2506 8580,2506 8581,473 8581,525 8581,640 8581,1010 8581,1058 8581,1265 8581,1266 8581,1607 8581,1749 8581,8072 8581,90845 8581,131675 8582,875 8583,79 8583,192 8583,72750 8584,1 8585,2209 8586,158 8587,160 8588,83 8589,4895 8590,6357 8591,328 8592,1082 8592,2775 8593,143 8594,1052 8595,72 8596,151 8597,779 8597,2931 8597,8598 8599,557 8599,1368 8600,980 8601,8602 8603,151 8604,163 8605,455 8606,217 8606,252 8606,406 8606,440 8606,467 8606,493 8606,868 8606,1417 8606,1433 8607,3 8608,163 8609,102 8609,126 8609,146 8609,163 8609,280 8609,340 8609,372 8609,408 8609,491 8609,557 8609,644 8609,668 8609,783 8609,994 8609,1467 8609,1564 8609,3451 8609,3452 8609,6487 8609,17245 8609,92476 8610,2178 8610,4545 8610,56150 8610,139010 8611,104 8612,298 8613,485 8614,1 8615,298 8616,485 8617,1284 8618,147 8619,1309 8620,8621 8620,24795 8620,82458 8622,104 8623,1119 8624,1 8624,94 8624,184 8624,206 8624,2787 8625,2116 8626,83 8626,285 8626,455 8626,1467 8626,2590 8626,2779 8626,2784 8626,4172 8627,158 8627,252 8627,515 8627,622 8627,861 8627,1433 8627,1639 8627,1715 8628,949 8629,163 8630,602 8631,86 8632,104 8632,294 8632,431 8632,631 8632,784 8632,805 8632,1732 8632,2675 8632,8632 8632,8633 8632,55779 8632,66297 8632,72778 8632,72784 8632,74736 8632,75192 8632,75197 8632,75206 8632,75239 8632,75257 8632,75314 8632,77038 8632,77048 8632,78453 8632,82285 8632,82306 8632,110751 8632,116689 8634,422 8635,163 8636,8637 8638,8639 8640,140 8641,336 8642,58 8642,272 8642,563 8642,795 8642,1449 8642,1821 8642,2889 8642,5708 8643,8644 8645,516 8645,1220 8645,1222 8646,274 8646,1116 8647,2574 8648,8649 8650,376 8651,372 8651,1082 8652,163 8653,34 8653,35 8654,81 8655,809 8656,8657 8656,17669 8656,17673 8656,17698 8656,17701 8656,18986 8656,24255 8656,24280 8658,509 8658,595 8658,609 8658,697 8658,703 8658,744 8658,874 8658,949 8658,973 8658,1140 8658,1240 8658,1805 8658,1836 8658,2334 8658,3182 8658,5469 8658,19443 8659,163 8659,209 8659,262 8659,302 8659,579 8659,687 8659,811 8659,861 8659,893 8659,3769 8659,258973 8660,1240 8661,32 8661,392 8661,697 8661,1465 8661,3003 8662,56 8662,250 8662,349 8662,435 8662,1082 8662,1243 8662,1282 8662,1623 8662,1807 8662,3612 8662,6789 8662,8463 8662,162599 8663,274 8663,1116 8664,10 8665,8666 8667,8668 8670,346 8672,1707 8673,163 8674,718 8674,8675 8676,259 8676,397 8676,685 8676,2923 8676,3524 8676,4190 8676,26450 8677,298 8678,485 8679,3422 8680,1515 8681,8682 8683,1955 8684,2083 8684,3218 8685,801 8686,186 8686,818 8686,941 8686,1635 8687,1370 8688,83 8689,2051 8691,143 8692,83 8692,271 8693,592 8693,631 8693,1119 8693,1631 8693,1635 8693,2620 8693,2995 8694,304 8694,1285 8694,1715 8694,1962 8695,140 8696,72 8697,8698 8699,275 8699,277 8700,211 8700,1707 8700,6051 8701,272 8702,1313 8703,536 8704,422 8705,143 8706,640 8707,1749 8707,3585 8709,775 8710,44 8711,81 8711,83 8711,106 8711,134 8711,251 8711,273 8711,274 8711,275 8711,298 8711,313 8711,340 8711,497 8711,567 8711,620 8711,626 8711,652 8711,663 8711,694 8711,736 8711,827 8711,862 8711,931 8711,1058 8711,1082 8711,1113 8711,1122 8711,1127 8711,1402 8711,1732 8711,1807 8711,2315 8711,2867 8711,2868 8711,3003 8711,4039 8711,4597 8711,13136 8711,145502 8712,332 8713,1298 8714,5 8714,977 8714,1219 8714,3108 8714,4114 8714,13288 8714,14316 8714,21389 8714,22065 8714,34988 8714,35551 8714,38221 8714,48717 8714,58963 8714,79320 8714,82109 8714,82128 8714,86667 8714,117919 8714,126380 8714,136464 8714,138120 8714,174907 8715,200 8715,772 8716,143 8717,72 8718,8719 8719,37791 8719,37792 8720,666 8720,743 8720,95583 8721,138 8722,865 8723,557 8724,137 8725,8719 8726,138 8727,865 8728,557 8729,118 8729,4597 8730,137 8731,8719 8732,143 8733,138 8734,865 8735,557 8736,137 8737,143 8738,118 8738,4597 8739,118 8739,4597 8740,8719 8741,138 8742,865 8743,557 8744,137 8745,149 8746,118 8746,4597 8747,557 8748,557 8749,557 8750,302 8751,1718 8752,435 8753,206 8754,1425 8756,861 8757,772 8758,2379 8758,14674 8759,1893 8760,250 8761,298 8762,485 8763,592 8763,760 8763,1402 8763,1631 8763,1818 8763,2620 8764,37 8764,63 8764,158 8764,192 8764,202 8764,203 8764,251 8764,393 8764,406 8764,435 8764,447 8764,493 8764,925 8764,980 8764,1181 8764,1220 8764,1222 8764,1370 8764,1388 8764,1531 8764,1740 8764,1821 8764,4455 8764,5212 8765,843 8766,873 8767,1801 8768,1805 8769,390 8770,217 8770,1019 8772,527 8773,1313 8774,273 8774,274 8775,2116 8776,301 8777,2681 8778,1309 8778,1807 8778,1955 8778,2775 8779,298 8780,485 8781,364 8782,143 8783,1368 8784,8785 8786,2351 8787,8788 8788,8788 8789,151 8790,269 8791,818 8792,2867 8792,2868 8792,22880 8793,72 8793,106 8794,1634 8794,4810 8795,294 8796,875 8797,1309 8799,143 8800,631 8801,1235 8801,1335 8801,5375 8802,8803 8804,932 8805,10 8805,211 8805,309 8805,310 8805,483 8805,485 8805,4548 8806,332 8807,178 8807,75912 8808,500 8808,718 8808,893 8808,1188 8809,99 8810,22 8810,302 8812,28 8812,2775 8812,4571 8812,88820 8813,1556 8814,158 8814,252 8814,622 8814,1433 8815,525 8816,8817 8818,718 8819,8820 8820,2367 8820,8820 8821,289 8821,290 8821,1564 8821,2205 8821,4218 8821,33424 8822,779 8823,1767 8824,5440 8825,1289 8826,442 8827,333 8828,264 8829,3999 8830,264 8831,264 8831,333 8831,1033 8831,1381 8831,1551 8831,1639 8832,264 8833,1381 8834,147 8835,135 8836,390 8837,3041 8838,1551 8839,1007 8840,1551 8841,1 8842,163 8843,8844 8845,5440 8846,211 8847,358 8848,261 8849,1381 8850,1639 8851,1858 8852,1860 8853,8854 8855,8855 8856,240 8857,872 8858,8859 8860,388 8860,623 8860,1805 8861,79 8861,140 8861,158 8861,515 8861,585 8861,622 8861,818 8861,861 8861,1639 8861,1715 8861,5440 8862,8863 8864,1010 8864,1012 8864,1122 8864,1241 8864,1849 8865,8866 8867,50 8867,56 8867,68 8867,106 8867,147 8867,149 8867,158 8867,192 8867,202 8867,264 8867,301 8867,333 8867,337 8867,392 8867,422 8867,586 8867,602 8867,663 8867,714 8867,1085 8867,1181 8867,1210 8867,1531 8867,8868 8867,30331 8867,60576 8867,118336 8869,626 8869,1140 8869,1235 8869,1284 8869,9010 8870,135 8870,137 8870,138 8870,850 8870,2105 8871,143 8871,2926 8872,8873 8872,111953 8874,143 8875,8876 8877,8878 8879,146 8880,225 8881,8882 8883,8884 8885,8886 8887,435 8888,1085 8889,1858 8890,1860 8891,589 8891,1001 8892,483 8893,483 8894,932 8895,3695 8896,861 8896,4823 8897,8898 8899,8900 8901,586 8902,1858 8903,1860 8904,147 8904,158 8904,206 8904,261 8904,1429 8905,393 8906,8907 8907,33012 8908,160 8909,1204 8910,202 8910,203 8911,8912 8911,65375 8911,85315 8913,264 8914,72 8915,8916 8917,8916 8918,8916 8919,8916 8920,163 8921,8922 8923,163 8924,8925 8924,18086 8927,163 8929,50 8929,79 8929,393 8929,406 8929,493 8929,585 8929,586 8929,592 8929,704 8929,1265 8929,1266 8929,1433 8930,192 8931,10 8932,8933 8934,8935 8934,53166 8934,58407 8934,82107 8934,83176 8934,83634 8934,89867 8934,96991 8936,306 8936,307 8937,8938 8939,8940 8941,163 8941,264 8941,1007 8941,1551 8941,36819 8942,8943 8944,779 8944,818 8944,68069 8944,141912 8945,8946 8947,163 8948,267 8949,163 8950,8951 8952,1274 8953,301 8954,8955 8954,56096 8956,399 8956,920 8957,366 8958,366 8959,1323 8960,102 8961,1326 8962,408 8963,1707 8964,8965 8966,273 8966,274 8967,364 8968,163 8968,2116 8969,195 8969,493 8970,87 8970,687 8971,146 8971,336 8971,406 8971,1515 8972,422 8973,422 8974,422 8975,422 8976,422 8977,422 8978,422 8979,422 8980,2944 8981,1888 8982,957 8982,1247 8982,1815 8983,1181 8984,1359 8985,8986 8985,40611 8985,54119 8985,68069 8985,83803 8985,95187 8985,96394 8985,106538 8985,108679 8985,108729 8987,2506 8988,273 8988,274 8992,8992 9001,704 9001,1402 9004,704 9008,145967 9011,9011 9011,9032 9015,10 9015,1309 9015,3319 9015,4190 9015,15633 9015,117263 9015,219266 9015,263342 9015,263794 9015,264535 9021,823 9021,2512 9021,19413 9024,1001 9025,120 9025,240 9025,446 9025,1012 9025,2208 9025,2411 9025,9025 9025,15424 9025,166619 9033,9034 9033,16269 9035,932 9036,1276 9037,349 9037,392 9037,687 9037,697 9037,861 9037,868 9037,1010 9037,1390 9037,2574 9037,9038 9037,70935 9037,78833 9037,84562 9037,88990 9037,89286 9037,89287 9037,94225 9037,95467 9037,97283 9037,100758 9037,104915 9037,107456 9037,108038 9039,1773 9039,14472 9040,9041 9042,9041 9043,538 9043,1531 9044,9045 9046,731 9047,34 9047,35 9047,2646 9048,143 9049,9050 9051,1140 9052,163 9053,1220 9053,1222 9055,130 9055,140 9055,264 9055,323 9055,479 9055,595 9055,652 9055,736 9055,1007 9055,1289 9055,1509 9055,1551 9055,1579 9055,1659 9055,1767 9055,3999 9055,9030 9056,861 9056,1623 9056,4146 9057,9058 9059,143 9060,9061 9062,9063 9064,273 9064,422 9064,1803 9065,3830 9066,483 9067,2506 9068,298 9069,485 9070,745 9070,4411 9070,16614 9070,21944 9071,4 9071,5 9071,649 9071,1551 9071,9542 9072,718 9073,9074 9075,479 9076,1132 9077,130 9078,1631 9079,1696 9079,3182 9079,9080 9079,20426 9079,27448 9079,28255 9079,79607 9079,79701 9079,91922 9079,161547 9079,169179 9079,191547 9079,214548 9079,225942 9081,788 9082,932 9083,2048 9084,83 9085,328 9086,615 9087,1608 9087,77315 9088,1608 9089,2045 9090,48 9090,515 9091,596 9091,1368 9092,106 9093,718 9093,1417 9093,1688 9094,920 9095,1102 9096,298 9097,485 9099,9100 9101,3246 9101,3247 9102,158 9104,182 9105,149 9105,406 9105,585 9106,887 9107,63 9107,252 9107,516 9107,1220 9107,1222 9107,189842 9108,9109 9110,1571 9110,13136 9111,19 9111,1531 9111,1571 9111,2266 9111,2421 9112,1082 9113,872 9114,1368 9115,1368 9116,736 9117,718 9117,3555 9118,332 9120,143 9121,9121 9122,450 9123,87 9123,1465 9123,5366 9124,163 9125,1078 9126,483 9127,772 9128,346 9128,435 9129,30 9129,200 9130,111 9130,296 9130,1659 9130,3538 9130,8788 9130,29253 9130,29294 9131,579 9132,143 9133,240 9134,54 9135,211 9136,422 9136,602 9137,1033 9138,1417 9138,4190 9139,72 9139,312 9140,1127 9140,1267 9140,1893 9140,2051 9140,3999 9140,49057 9140,81070 9141,255 9142,143 9143,163 9144,9145 9146,2244 9147,485 9148,207 9149,1479 9150,376 9151,143 9152,298 9153,485 9155,781 9156,1235 9156,1335 9156,5375 9157,9158 9159,298 9160,485 9161,657 9161,213089 9162,298 9163,485 9164,485 9165,9166 9167,9168 9169,2590 9170,72 9171,50 9172,9173 9174,9175 9177,450 9177,515 9177,1381 9177,2867 9177,2868 9177,22880 9178,240 9178,1285 9178,1818 9180,2572 9181,298 9182,485 9183,298 9184,485 9185,312 9186,9187 9188,178 9188,622 9189,9190 9192,68 9193,1227 9193,1229 9194,9195 9195,9195 9196,273 9196,274 9197,1983 9198,143 9199,143 9200,9201 9202,298 9202,1282 9202,2286 9203,20 9204,20 9205,143 9206,206 9207,1619 9209,143 9210,143 9211,58 9212,83 9213,192 9213,663 9213,664 9214,9215 9216,9217 9218,640 9219,4935 9220,9221 9222,640 9223,34 9223,35 9224,994 9224,1235 9224,1335 9225,22 9225,652 9225,861 9225,893 9226,9227 9226,93374 9228,68 9229,143 9230,781 9231,5 9231,117 9231,206 9231,1118 9231,2089 9231,2617 9231,2940 9231,9239 9231,9386 9232,622 9233,557 9234,1963 9235,298 9236,485 9237,298 9238,485 9240,424 9241,9242 9243,704 9244,9245 9246,1 9247,2737 9248,207 9249,107 9250,167 9251,258 9252,366 9253,366 9254,273 9254,274 9255,269 9256,233 9257,202 9257,203 9258,872 9259,872 9260,219 9261,9262 9261,26503 9261,51069 9261,52219 9261,56531 9261,57565 9261,77362 9261,81865 9261,91436 9261,91710 9261,97438 9261,99237 9261,100356 9261,105428 9261,113457 9261,118750 9263,2105 9264,9265 9266,872 9268,9269 9270,328 9270,7124 9271,107 9272,2416 9272,2417 9273,292 9274,338 9275,298 9276,349 9276,973 9276,2572 9277,1133 9278,3538 9279,1118 9280,298 9281,485 9283,640 9285,1151 9286,10 9287,1010 9288,83 9289,83 9290,163 9291,872 9292,417 9293,58 9293,273 9293,274 9293,489 9293,749 9293,827 9293,859 9293,973 9293,1127 9293,1252 9293,1253 9293,1619 9293,1623 9293,1707 9293,1844 9293,6424 9293,6556 9293,21442 9293,28107 9294,273 9294,274 9294,515 9294,620 9294,1298 9294,1388 9294,1623 9294,6556 9294,28107 9294,66500 9295,874 9296,9297 9298,79 9300,9301 9300,14853 9300,24469 9300,44607 9300,47421 9300,57740 9300,68018 9300,77383 9300,78305 9300,113313 9302,1707 9303,107 9303,3474 9304,252 9305,1803 9306,344 9307,687 9307,1556 9308,2506 9309,687 9310,872 9311,872 9312,872 9313,872 9314,872 9315,872 9316,2048 9317,9318 9319,143 9320,26 9320,47 9320,59 9320,200 9320,206 9320,885 9320,887 9320,994 9320,1119 9320,2244 9320,2469 9320,2674 9320,8180 9320,21826 9320,21944 9321,160 9322,9323 9324,119 9325,58 9326,333 9328,949 9329,682 9330,32 9330,349 9330,392 9330,644 9330,697 9330,809 9330,3003 9330,76096 9330,127158 9331,2506 9332,2506 9333,1 9333,117 9333,149 9333,272 9333,302 9333,609 9333,620 9333,972 9333,1353 9333,1458 9333,2156 9333,2315 9333,2512 9333,2712 9333,2775 9333,3041 9333,40360 9333,181063 9334,2506 9335,2506 9336,2506 9337,996 9338,81 9338,390 9338,422 9338,447 9338,518 9338,640 9338,682 9338,704 9338,801 9338,873 9338,874 9338,907 9338,934 9338,1052 9338,1068 9338,1175 9338,1177 9338,1231 9338,1298 9338,1300 9338,1309 9338,1370 9338,1411 9338,1454 9338,1715 9338,1782 9338,1785 9338,1849 9338,2006 9338,2353 9338,2480 9338,2590 9338,2699 9338,2784 9338,3193 9338,3474 9338,3804 9339,932 9340,301 9340,567 9340,604 9340,605 9340,615 9340,937 9340,968 9340,1293 9340,1782 9340,2372 9340,3422 9341,1282 9342,372 9342,1085 9342,1119 9342,1462 9342,1659 9342,1962 9342,2156 9342,6068 9342,8537 9342,9343 9344,647 9345,344 9346,63 9346,483 9346,557 9346,1058 9346,1319 9346,1732 9346,42009 9347,65 9347,85 9347,1058 9347,1247 9348,615 9349,143 9350,222 9351,79 9352,422 9353,56 9355,1235 9355,1335 9360,24 9360,25 9360,26 9360,59 9360,60 9360,114 9360,884 9360,885 9360,886 9360,887 9360,2088 9360,4079 9360,9537 9360,9539 9360,21944 9360,44244 9360,154690 9361,4 9361,5 9361,483 9361,818 9361,861 9361,1212 9361,2089 9361,2105 9361,2940 9362,577 9363,872 9364,217 9365,37 9365,1782 9366,859 9367,22 9367,192 9367,2135 9367,6051 9368,749 9368,1146 9369,850 9370,2334 9371,149 9371,158 9371,55849 9372,355 9372,4810 9373,10 9374,37 9374,68 9374,106 9374,202 9374,203 9374,225 9374,328 9374,349 9374,358 9374,388 9374,389 9374,390 9374,422 9374,455 9374,518 9374,557 9374,595 9374,640 9374,704 9374,726 9374,775 9374,801 9374,873 9374,874 9374,907 9374,932 9374,934 9374,1010 9374,1052 9374,1068 9374,1140 9374,1167 9374,1175 9374,1177 9374,1231 9374,1241 9374,1274 9374,1298 9374,1300 9374,1309 9374,1370 9374,1411 9374,1452 9374,1454 9374,1467 9374,1479 9374,1579 9374,1715 9374,1782 9374,1785 9374,1801 9374,1837 9374,1849 9374,2006 9374,2116 9374,2353 9374,2480 9374,2590 9374,2620 9374,2699 9374,2784 9374,3193 9374,3474 9374,3804 9374,4637 9374,5662 9375,438 9375,718 9375,972 9376,2334 9377,417 9378,143 9381,182 9381,188 9381,206 9381,1265 9381,1266 9381,4453 9381,7652 9382,1007 9383,143 9384,852 9384,877 9384,1010 9384,1402 9384,2373 9384,2590 9385,433 9386,9386 9387,1265 9387,1266 9387,7652 9388,143 9389,252 9390,46 9390,58 9391,104 9391,298 9391,372 9391,442 9391,714 9391,1715 9391,2286 9392,433 9393,649 9394,1 9394,10 9394,50 9394,56 9394,98 9394,99 9394,139 9394,147 9394,149 9394,158 9394,195 9394,206 9394,285 9394,333 9394,406 9394,505 9394,602 9394,640 9394,779 9394,841 9394,1181 9394,1198 9394,1218 9394,1425 9394,1458 9394,1464 9394,1515 9394,1825 9394,2132 9394,2244 9394,2451 9394,3571 9394,3895 9394,3970 9394,4627 9394,9394 9394,9424 9394,9700 9394,15330 9394,15795 9394,17151 9394,18997 9394,19782 9394,21442 9394,31238 9394,41385 9394,42064 9394,68370 9394,75249 9394,80266 9394,85525 9394,87743 9394,95314 9394,104926 9394,118336 9394,130983 9394,141912 9394,170758 9394,180187 9394,184913 9394,202201 9394,229833 9394,234693 9394,236469 9394,240174 9394,241735 9394,243184 9394,243191 9394,243561 9394,243576 9394,243862 9394,243891 9394,244255 9394,244495 9394,244513 9394,244630 9394,244742 9394,244773 9394,244874 9394,244955 9394,245517 9394,245654 9394,245674 9394,246106 9394,246773 9394,246881 9394,247220 9394,247237 9394,247400 9394,249213 9394,250100 9394,250766 9394,250972 9394,251607 9394,253646 9394,254870 9394,255187 9394,255265 9394,255786 9394,256188 9394,256376 9394,256436 9394,257967 9394,258284 9394,258555 9394,259455 9394,259607 9394,261035 9394,261040 9394,261398 9394,261734 9394,262111 9394,262547 9394,263439 9394,263445 9394,263598 9394,263773 9394,263989 9394,264218 9394,264735 9395,9396 9395,34680 9395,44779 9397,30 9397,104 9397,704 9398,934 9399,1579 9400,1639 9401,1370 9402,7 9402,182 9402,188 9402,202 9402,203 9402,206 9402,1265 9402,1266 9402,4453 9402,7652 9403,483 9404,422 9405,56 9406,7 9406,182 9406,188 9406,206 9406,4453 9407,781 9408,143 9409,760 9410,3079 9411,143 9412,309 9412,310 9413,781 9414,68 9414,433 9414,1634 9415,48 9416,1858 9417,1860 9418,312 9419,452 9419,918 9420,932 9421,586 9421,1707 9422,250 9423,1688 9424,344 9424,240174 9425,805 9426,861 9426,893 9426,1374 9427,143 9428,143 9429,775 9430,143 9431,7 9431,1265 9431,1266 9431,7652 9432,163 9433,167 9434,22 9435,500 9437,1116 9437,2460 9438,435 9439,2775 9440,143 9441,1149 9441,4218 9442,9443 9444,9445 9446,718 9446,893 9447,143 9447,1052 9448,65 9448,360 9449,9450 9451,760 9452,376 9453,9453 9454,346 9455,143 9456,3148 9456,9457 9457,20 9457,259 9457,299 9457,441 9457,505 9457,567 9457,676 9457,693 9457,733 9457,752 9457,843 9457,849 9457,911 9457,972 9457,1147 9457,1172 9457,1191 9457,1204 9457,1240 9457,1293 9457,1326 9457,1345 9457,1402 9457,1417 9457,1462 9457,1566 9457,1776 9457,1973 9457,1992 9457,2373 9457,2512 9457,2704 9457,3367 9457,3392 9457,3653 9457,4039 9457,4276 9457,5213 9457,8537 9457,9457 9457,17241 9457,18298 9457,21442 9457,35315 9457,37202 9457,41441 9457,59709 9457,70229 9457,74969 9457,75912 9457,76199 9457,80658 9457,95971 9457,99732 9457,102755 9457,103322 9457,104522 9457,115474 9457,117807 9457,117961 9457,131862 9457,139598 9457,139929 9457,159621 9457,175973 9457,194327 9457,205156 9457,212902 9457,218369 9457,229100 9457,230266 9457,230419 9457,238926 9457,244703 9457,244756 9457,244772 9457,244776 9457,244814 9457,248258 9457,248868 9457,250540 9457,250908 9457,256273 9457,260742 9457,264351 9458,206 9458,1888 9458,8675 9459,9460 9461,273 9461,274 9462,22 9463,120 9464,184 9465,682 9465,731 9465,1509 9467,694 9467,2775 9467,3623 9468,163 9468,302 9468,579 9469,1893 9470,2837 9472,1019 9472,4177 9473,135 9474,135 9474,772 9475,143 9477,434 9477,939 9478,557 9479,50 9481,557 9482,557 9483,2416 9483,2417 9484,83 9484,120 9484,217 9484,273 9484,1052 9485,10 9485,9486 9485,22870 9485,43477 9485,46477 9485,47532 9485,54109 9485,55229 9485,56034 9485,57679 9485,58648 9485,59847 9485,75696 9485,79113 9485,80185 9485,81919 9485,83283 9485,84308 9485,89947 9485,92570 9485,92837 9485,93898 9485,94664 9485,99410 9485,102711 9485,102953 9485,104975 9487,2244 9488,557 9489,862 9491,143 9491,1052 9492,9493 9494,160 9494,652 9494,1127 9494,1551 9494,1893 9494,3041 9495,261 9496,392 9497,602 9498,9499 9500,1955 9500,8541 9501,9502 9503,22 9503,652 9503,861 9503,1070 9504,160 9504,264 9504,515 9504,1007 9504,1147 9504,1452 9504,1551 9504,3041 9504,3999 9504,5440 9504,49057 9505,192 9506,1849 9507,151 9508,392 9509,1608 9510,1089 9510,1623 9511,1858 9512,1860 9513,2411 9514,415 9515,143 9516,2156 9516,4571 9516,88820 9516,95554 9516,129534 9517,640 9518,149 9519,217 9520,9521 9522,2506 9523,2506 9524,2506 9525,422 9526,143 9526,527 9526,740 9526,741 9526,743 9526,1052 9527,136 9527,137 9527,525 9527,1531 9528,1433 9529,200 9529,298 9529,636 9529,772 9529,2205 9529,2286 9529,33424 9530,9531 9532,620 9532,1425 9533,779 9534,195 9535,143 9542,9542 9543,261 9543,604 9543,7572 9544,372 9544,1010 9544,1241 9544,1479 9544,1849 9545,718 9546,505 9547,1370 9549,2506 9550,1359 9551,9552 9554,149 9554,406 9554,1181 9554,1590 9554,68069 9555,1782 9556,310 9557,9558 9557,57743 9559,9560 9560,9560 9561,301 9561,314 9561,968 9561,1293 9561,3422 9562,9563 9564,72 9565,72 9566,344 9567,285 9568,422 9569,422 9570,422 9571,422 9572,422 9573,422 9574,422 9575,422 9576,422 9577,9578 9577,14542 9577,15894 9577,57609 9577,81304 9577,84536 9577,98318 9579,147 9579,202 9579,301 9579,392 9579,510 9579,577 9579,1014 9579,1370 9579,1531 9580,4101 9581,72 9582,147 9582,158 9582,640 9583,9584 9585,10 9585,72 9585,175 9585,4980 9585,13919 9586,9587 9586,43509 9586,43677 9586,51134 9586,53893 9586,57507 9586,65963 9586,69677 9586,94936 9586,101313 9586,106631 9586,108073 9586,109798 9586,112721 9586,113792 9586,115976 9586,126595 9586,127322 9586,127814 9588,9589 9591,72 9592,2351 9593,8788 9594,9595 9596,1240 9597,10 9597,52 9597,1773 9597,9597 9597,9598 9597,31977 9597,126435 9597,139245 9597,177639 9597,218834 9597,221340 9600,158 9602,26 9602,59 9602,94 9602,2089 9602,2940 9603,167 9603,299 9603,397 9604,2296 9605,1452 9606,9607 9608,9609 9610,9611 9612,9613 9612,45599 9614,577 9615,217 9615,1429 9615,3467 9616,9617 9618,366 9619,366 9621,292 9622,294 9623,296 9624,298 9625,304 9625,843 9626,5440 9627,211 9628,424 9628,640 9628,843 9628,1012 9628,1749 9628,7155 9629,20 9630,611 9631,9632 9633,9634 9635,26 9635,59 9635,94 9635,1235 9635,1335 9635,2787 9635,3794 9635,21944 9636,9637 9638,9639 9640,167 9640,1284 9640,2979 9641,9642 9643,9644 9645,9645 9646,3507 9647,233 9648,9649 9650,163 9651,9652 9653,182 9653,188 9653,206 9653,1844 9653,4453 9654,20 9655,163 9656,163 9657,640 9657,841 9658,292 9659,652 9660,163 9661,163 9662,163 9663,160 9664,634 9665,163 9666,163 9667,163 9668,388 9669,163 9670,163 9671,163 9671,302 9672,163 9673,515 9674,518 9675,163 9676,163 9676,392 9677,255 9678,4 9678,5 9678,163 9678,255 9678,309 9678,310 9679,22 9679,442 9679,1392 9680,693 9681,518 9682,163 9683,163 9684,34 9684,35 9684,77 9684,148742 9685,163 9686,586 9687,72 9688,338 9689,149 9689,1127 9690,140 9690,163 9690,209 9690,302 9690,489 9690,811 9690,861 9690,893 9690,1007 9690,2116 9690,6880 9691,163 9692,163 9693,1363 9694,163 9695,579 9696,2116 9697,163 9698,599 9699,163 9700,104 9700,163 9701,278 9701,455 9701,852 9701,2424 9702,167 9702,2191 9702,3218 9702,199199 9702,207045 9703,163 9704,163 9705,397 9706,143 9707,868 9708,301 9708,694 9709,163 9710,163 9711,271 9712,287 9713,3451 9713,3452 9714,424 9715,32 9716,1181 9717,1512 9717,5992 9718,163 9719,79 9719,1531 9720,207 9721,366 9721,500 9722,163 9723,163 9723,302 9723,489 9723,811 9724,163 9726,304 9726,1715 9727,387 9728,20 9729,278 9729,379 9729,457 9729,838 9729,891 9729,1240 9729,21982 9730,644 9731,255 9732,811 9732,1452 9733,163 9735,687 9735,1556 9737,163 9737,868 9738,336 9738,2371 9739,104 9739,111 9739,134 9739,372 9739,441 9739,442 9739,631 9739,636 9739,749 9739,775 9739,784 9739,999 9739,1140 9739,2209 9739,3474 9739,4771 9741,143 9742,875 9743,217 9743,389 9743,707 9743,875 9743,1019 9743,1881 9743,2253 9744,1877 9745,163 9746,9323 9747,79 9747,4455 9747,68069 9748,1801 9749,163 9749,1436 9750,163 9751,130 9751,841 9751,920 9752,2646 9752,6506 9753,163 9754,46 9754,99 9754,233 9754,292 9754,332 9754,525 9754,586 9754,592 9754,631 9754,954 9754,972 9754,2286 9754,3695 9754,10318 9754,42628 9755,163 9756,54 9756,83 9756,283 9756,347 9756,392 9756,455 9756,536 9756,623 9756,673 9756,694 9756,697 9756,781 9756,808 9756,1019 9756,1201 9756,1240 9756,1274 9756,1465 9756,1860 9756,2168 9756,3367 9756,6059 9756,6789 9756,6955 9757,1425 9758,781 9759,1370 9760,206 9761,2051 9761,49057 9762,818 9763,302 9763,515 9763,579 9763,687 9763,861 9763,893 9763,3769 9764,163 9765,255 9766,301 9766,1298 9766,1381 9766,1452 9766,1639 9767,392 9767,1140 9769,151 9770,306 9770,307 9771,9772 9773,9774 9775,9776 9777,9778 9779,1858 9780,1860 9781,9782 9783,9784 9785,623 9785,1805 9786,178 9786,1531 9787,887 9787,1235 9787,1335 9788,660 9788,2424 9788,2944 9788,6506 9790,134 9791,9792 9793,9794 9795,9796 9797,9798 9799,9800 9801,9802 9803,9804 9805,9806 9807,9808 9809,9810 9811,9812 9813,9814 9815,9816 9817,9818 9820,9821 9822,9823 9824,9825 9826,9827 9828,9829 9830,9831 9832,9833 9834,9835 9836,9837 9838,9839 9840,9841 9842,9843 9844,9845 9846,9847 9848,9849 9850,9851 9852,9853 9854,9855 9856,9857 9858,9859 9860,9861 9862,9863 9864,9865 9866,9867 9868,9869 9870,9871 9872,9873 9874,54 9875,9876 9877,9878 9879,9880 9881,9882 9883,9884 9885,9886 9887,9888 9889,818 9890,9891 9892,9893 9894,9895 9896,163 9896,2116 9897,9898 9899,9900 9901,9902 9903,9904 9905,9906 9907,9908 9909,9910 9911,9912 9913,9914 9915,9916 9917,9918 9919,9920 9921,9922 9923,9924 9925,9926 9927,9928 9929,9930 9931,9932 9933,9934 9935,9936 9937,9938 9939,9940 9941,9942 9943,9944 9945,9946 9947,9948 9949,9950 9951,9952 9953,9954 9955,9956 9957,9958 9959,9960 9961,9962 9963,9964 9965,9966 9967,9968 9969,9970 9971,9972 9973,9974 9975,9976 9977,1127 9978,9979 9980,9981 9982,9983 9984,9985 9986,9987 9988,9989 9990,9991 9992,9993 9994,9995 9996,9997 9998,9999 10000,10001 10002,10003 10004,10005 10006,10007 10008,10009 10010,10011 10012,10013 10014,10015 10016,10017 10018,10019 10020,10021 10022,10023 10024,10025 10026,1858 10027,1860 10028,10029 10030,10031 10032,10033 10034,10035 10036,10037 10038,10039 10040,10041 10042,10043 10044,10045 10046,10047 10048,10049 10050,10051 10052,10053 10054,10055 10056,10057 10058,10059 10060,10061 10062,10063 10064,10065 10066,10067 10068,10069 10070,10071 10072,10073 10074,10075 10076,10077 10078,10079 10080,10081 10082,10083 10084,10085 10086,10087 10088,10089 10090,10091 10092,10093 10094,10095 10096,10097 10098,10099 10100,10101 10102,10103 10104,10105 10106,72 10107,10108 10109,10110 10111,10112 10113,10114 10115,10116 10117,10118 10119,10120 10121,10122 10123,10124 10125,10126 10127,10128 10129,10130 10131,10132 10133,10134 10135,10136 10137,10138 10139,10140 10141,10142 10143,10144 10145,298 10145,752 10145,1368 10145,1458 10145,1579 10145,4355 10146,10147 10148,10149 10150,10151 10152,10153 10154,10155 10156,10157 10158,10159 10160,10161 10162,10163 10164,10165 10166,10167 10168,10169 10170,10171 10172,10173 10174,10175 10176,10177 10178,10179 10180,10181 10182,10183 10184,10185 10186,315 10187,10188 10189,10190 10191,10192 10193,10194 10195,10196 10197,10198 10199,10200 10201,1353 10202,10203 10204,10205 10206,10207 10208,10209 10210,10211 10212,10213 10214,10215 10216,752 10216,1210 10217,10218 10219,10220 10221,10222 10223,10224 10225,10226 10227,2775 10228,10229 10230,10231 10232,10233 10234,10235 10236,10237 10238,10239 10240,10241 10242,10243 10244,10245 10246,10247 10248,10249 10250,10251 10252,10253 10254,10255 10256,10257 10258,10259 10260,10261 10262,10263 10264,10265 10266,10267 10268,10269 10270,10271 10272,10273 10274,10275 10276,10277 10278,10279 10280,10281 10282,10283 10284,10285 10286,10287 10288,10289 10290,10291 10292,10293 10294,10295 10296,10297 10298,10299 10300,10301 10302,10303 10304,10305 10306,10307 10308,10309 10310,10311 10312,10313 10314,10315 10316,10317 10318,954 10318,1282 10318,1690 10318,1939 10318,10318 10318,50399 10318,71900 10318,71909 10318,71921 10318,72077 10319,10320 10321,10322 10323,10324 10325,10326 10327,10328 10329,10330 10331,10332 10333,10334 10335,10336 10337,10338 10339,10340 10341,10342 10343,10344 10345,10346 10347,10348 10349,10350 10351,10352 10353,10354 10355,10356 10357,10358 10359,10360 10361,10362 10363,86 10364,10365 10366,10367 10368,10369 10370,10371 10372,10373 10374,10375 10376,10377 10378,10379 10380,10381 10382,10383 10384,10385 10386,10387 10388,10389 10390,10391 10392,87 10392,255 10392,258 10393,10394 10395,10396 10397,273 10397,274 10397,310 10397,483 10397,3039 10398,10399 10400,10401 10402,10403 10404,10405 10406,195 10407,10408 10409,10410 10411,10412 10413,10414 10415,10416 10417,10418 10419,10420 10421,10422 10423,10424 10425,10426 10427,10428 10429,10430 10431,10432 10433,10434 10435,10436 10437,10438 10439,10440 10441,10442 10443,10444 10445,10446 10447,10448 10449,10450 10451,10452 10453,10454 10455,640 10456,10457 10458,10459 10460,10461 10462,640 10463,10464 10465,10466 10467,10468 10469,10470 10471,10472 10473,10474 10475,10476 10477,10478 10479,10480 10481,10482 10483,10484 10485,10486 10487,10488 10489,10490 10491,10492 10493,10494 10495,10496 10497,10498 10499,135 10500,10501 10502,10503 10504,10505 10506,10507 10508,10509 10510,10511 10512,10513 10514,10515 10516,640 10517,10518 10519,10520 10521,10522 10523,10524 10525,9029 10526,10527 10528,10529 10530,10531 10532,10533 10534,10535 10536,10537 10538,10539 10540,10541 10542,10543 10544,10545 10546,10547 10548,581 10549,10550 10551,10552 10553,10554 10555,10556 10557,10558 10559,911 10560,10561 10562,10563 10564,10565 10566,10567 10568,10569 10570,10571 10572,10573 10574,10575 10576,10577 10578,10579 10580,10581 10582,10583 10584,10585 10586,10587 10588,10589 10590,10591 10592,10593 10594,10595 10596,10597 10598,10599 10600,10601 10602,10603 10604,10605 10606,10607 10608,10609 10610,10611 10612,10613 10614,10615 10616,2681 10617,10618 10619,10620 10621,10622 10623,10624 10625,10626 10627,10628 10629,10630 10631,10632 10633,10634 10635,10636 10637,10638 10640,10641 10642,10643 10644,163 10644,579 10645,10646 10647,10648 10649,10650 10651,10652 10653,10654 10655,10656 10657,1858 10658,1860 10659,10660 10661,163 10662,10663 10664,10665 10666,10667 10668,10669 10670,10671 10672,10673 10674,10675 10676,10677 10678,10679 10680,10681 10682,10683 10684,10685 10686,1127 10687,10688 10689,10690 10691,10692 10693,10694 10695,10696 10697,10698 10699,10700 10701,10702 10703,10704 10705,10706 10707,10708 10709,10710 10711,10712 10713,10714 10715,10716 10717,10718 10719,10720 10721,10722 10723,10724 10725,10726 10727,10728 10729,10730 10731,10732 10733,10734 10735,10736 10737,10738 10739,10740 10741,10742 10743,10744 10745,10746 10747,37 10747,1551 10747,3999 10748,10749 10750,10751 10752,10753 10754,10755 10756,10757 10758,10759 10760,10761 10762,10763 10764,10765 10766,10767 10768,10769 10770,10771 10772,10773 10774,1836 10775,10776 10777,10778 10779,10780 10781,10782 10783,10784 10785,10786 10787,1893 10788,10789 10790,10791 10792,1262 10793,10794 10795,10796 10797,10798 10799,10800 10801,10802 10803,10804 10805,10806 10807,10808 10809,10810 10811,10812 10813,10814 10815,10816 10817,10818 10819,10820 10821,10822 10823,10824 10825,10826 10827,10828 10829,10830 10831,10832 10833,10834 10835,10836 10837,10838 10839,10840 10841,10842 10843,10844 10845,10846 10847,10848 10849,10850 10851,10852 10853,10854 10855,10856 10857,10858 10859,10860 10861,10862 10863,10864 10865,10866 10867,10868 10869,10870 10871,10872 10873,10874 10875,10876 10877,10878 10879,10880 10881,10882 10883,10884 10885,10886 10887,10888 10889,10890 10891,10892 10893,10894 10895,10896 10897,10898 10899,10900 10901,10902 10903,10904 10905,10906 10907,10908 10909,10910 10911,10912 10913,10914 10915,10916 10917,10918 10919,10920 10921,10922 10923,10924 10925,10926 10927,10928 10929,10930 10931,10932 10933,10934 10935,10936 10937,10938 10939,10940 10941,10942 10943,10944 10945,10946 10947,10948 10949,10950 10951,10952 10953,10954 10955,10956 10957,10958 10959,10960 10961,10962 10963,10964 10965,10966 10967,10968 10969,10970 10971,10972 10973,10974 10975,10976 10977,10978 10979,10980 10981,10982 10983,10984 10985,10986 10987,10988 10989,10990 10991,10992 10993,10994 10995,10996 10997,10998 10999,11000 11001,11002 11003,11004 11005,11006 11007,11008 11009,11010 11011,11012 11013,11014 11015,2681 11015,33535 11015,61597 11015,61602 11015,61810 11015,168211 11015,173005 11016,11017 11018,11019 11020,11021 11022,11023 11024,11025 11026,11027 11028,11029 11030,11031 11032,11033 11034,11035 11036,11037 11038,11039 11040,11041 11042,11043 11044,11045 11046,11047 11048,11049 11050,11051 11052,11053 11054,195 11055,11056 11057,11058 11059,11060 11061,11062 11063,11064 11065,11066 11067,11068 11069,11070 11071,11072 11073,11074 11075,11076 11077,11078 11079,11080 11081,11082 11083,11084 11085,11086 11087,11088 11089,11090 11091,11092 11093,11094 11095,11096 11097,11098 11099,11100 11101,11102 11103,11104 11105,11106 11107,11108 11109,11110 11111,11112 11113,11114 11115,11116 11117,11118 11119,11120 11121,11122 11123,11124 11125,11126 11127,11128 11129,11130 11131,11132 11133,11134 11135,11136 11137,11138 11139,11140 11141,11142 11143,11144 11145,11146 11147,261 11147,1808 11147,11147 11147,41871 11148,11149 11150,11151 11152,11153 11154,11155 11156,11157 11158,11159 11160,2681 11161,11162 11163,11164 11165,11166 11167,11168 11169,11170 11171,11172 11173,932 11173,1016 11174,11175 11176,11177 11178,11179 11180,11181 11182,11183 11184,11185 11186,11187 11188,11189 11190,11191 11192,11193 11194,11195 11196,11197 11198,11199 11200,11201 11202,11203 11204,11205 11206,11207 11208,11209 11210,11211 11212,11213 11214,11215 11216,11217 11218,11219 11220,11221 11222,11223 11224,11225 11226,11227 11228,11229 11230,11231 11232,11233 11234,11235 11236,11237 11238,11239 11240,11241 11242,11243 11244,11245 11246,11247 11248,11249 11250,11251 11252,11253 11254,11255 11256,11257 11258,11259 11260,11261 11262,11263 11264,11265 11266,11267 11268,11269 11270,11271 11272,11273 11274,11275 11276,11277 11278,11279 11280,11281 11282,11283 11284,11285 11286,11287 11288,11289 11290,11291 11292,11293 11294,11295 11296,11297 11298,11299 11300,11301 11302,11303 11304,11305 11306,11307 11308,11309 11310,11311 11312,11313 11314,11315 11316,11317 11318,11319 11320,11321 11322,11323 11324,11325 11326,11327 11328,11329 11330,11331 11332,11333 11334,11335 11336,11337 11338,11339 11340,11341 11342,11343 11344,11345 11346,134 11346,1309 11347,11348 11349,11350 11351,11352 11353,11354 11355,11356 11357,11358 11359,11360 11361,11362 11363,11364 11365,11366 11367,11368 11369,11370 11371,11372 11373,11374 11375,11376 11377,11378 11379,11380 11381,11382 11383,11384 11385,11386 11387,11388 11389,11390 11391,11392 11393,11394 11395,11396 11397,11398 11399,11400 11401,11402 11403,11404 11405,11406 11407,11408 11409,11410 11411,11412 11413,11414 11415,11416 11417,11418 11419,11420 11421,11422 11423,11424 11425,11426 11427,11428 11429,11430 11431,11432 11433,11434 11435,11436 11437,11438 11439,11440 11441,11442 11443,11444 11445,11446 11447,11448 11449,11450 11451,11452 11453,11454 11455,11456 11457,11458 11459,11460 11461,11462 11463,305 11463,35092 11464,11465 11466,11467 11468,11469 11470,11471 11472,11473 11474,11475 11476,11477 11478,11479 11480,11481 11482,11483 11484,11485 11486,11487 11488,11489 11490,11491 11492,11493 11494,11495 11496,11497 11498,2051 11499,11500 11501,11502 11503,11504 11505,11506 11507,11508 11509,11510 11511,11512 11513,11514 11515,11516 11517,11518 11519,11520 11521,11522 11523,11524 11525,11526 11527,11528 11529,11530 11531,11532 11533,11534 11535,11536 11537,11538 11539,11540 11541,11542 11543,11544 11545,11546 11547,11548 11549,11550 11551,11552 11553,11554 11555,11556 11557,11558 11559,11560 11561,11562 11563,11564 11565,11566 11567,11568 11569,11570 11571,11572 11573,11574 11575,11576 11577,11578 11579,11580 11581,11582 11583,11584 11585,11586 11587,11588 11589,11590 11591,11592 11593,11594 11595,11596 11597,11598 11599,11600 11601,11602 11603,11604 11605,11606 11607,11608 11609,11610 11611,11612 11613,11614 11615,11616 11617,11618 11619,11620 11621,11622 11623,11624 11625,11626 11627,11628 11629,11630 11631,11632 11633,11634 11635,11636 11637,11638 11639,11640 11641,11642 11643,11644 11645,11646 11647,11648 11649,11650 11651,11652 11653,11654 11655,11656 11657,11658 11659,11660 11661,11662 11663,11664 11665,11666 11667,11668 11669,11670 11671,11672 11673,11674 11675,11676 11677,11678 11679,11680 11681,11682 11683,11684 11685,11686 11687,11688 11689,163 11690,11691 11692,11693 11694,11695 11696,11697 11698,11699 11700,11701 11702,11703 11704,11705 11706,11707 11708,11709 11710,11711 11712,11713 11714,11715 11716,11717 11718,11719 11720,11721 11722,11723 11724,11725 11726,11727 11728,11729 11730,11731 11732,11733 11734,11735 11736,11737 11738,11739 11740,11741 11742,718 11743,11744 11745,11746 11747,11748 11749,626 11750,11751 11752,11753 11754,11755 11756,11757 11758,11759 11760,11761 11762,11763 11764,11765 11766,163 11767,11768 11769,11770 11771,11772 11773,11774 11775,11776 11777,11778 11779,11780 11781,11782 11783,11784 11785,11786 11787,11788 11789,301 11790,11791 11792,11793 11794,11795 11796,11797 11798,11799 11800,11801 11802,11803 11804,11805 11806,11807 11808,11809 11810,11811 11812,11813 11814,11815 11816,11817 11818,163 11818,302 11818,579 11818,811 11819,11820 11821,11822 11823,11824 11825,11826 11827,11828 11829,11830 11831,11832 11833,11834 11835,163 11836,11837 11838,11839 11840,11841 11842,11843 11844,11845 11846,11847 11848,11849 11850,11851 11852,11853 11854,11855 11856,11857 11858,11859 11860,11861 11862,11863 11864,11865 11866,11867 11868,11869 11870,11871 11872,11873 11874,11875 11876,11877 11878,11879 11880,11881 11882,11883 11884,11885 11886,11887 11888,11889 11890,192 11890,663 11890,664 11891,11892 11893,11894 11895,11896 11897,11898 11899,11900 11901,11902 11903,11904 11905,11906 11907,11908 11909,392 11909,1454 11910,11911 11912,11913 11914,11915 11916,11917 11918,11919 11920,11921 11922,11923 11924,11925 11926,11927 11928,11929 11930,163 11931,11932 11933,11934 11935,11936 11937,11938 11939,11940 11941,11942 11943,11944 11945,11946 11947,11948 11949,11950 11951,26 11951,59 11953,11954 11955,163 11956,11957 11958,11959 11960,11961 11962,11963 11964,11965 11966,11967 11968,11969 11970,11971 11972,11973 11974,11975 11976,11977 11978,11979 11980,11981 11982,11983 11984,11985 11986,11987 11988,11989 11990,11991 11992,11993 11994,11995 11996,11997 11998,11999 12000,12001 12002,12003 12004,12005 12006,12007 12008,163 12009,12010 12011,12012 12013,12014 12015,12016 12017,12018 12019,12020 12021,12022 12023,12024 12025,12026 12027,12028 12029,12030 12031,634 12031,6888 12032,12033 12034,12035 12036,12037 12038,12039 12040,12041 12042,12043 12044,12045 12046,12047 12048,12049 12050,12051 12052,12053 12054,19 12054,660 12055,12056 12057,12058 12059,12060 12061,12062 12063,12064 12065,12066 12067,12068 12069,12070 12071,12072 12073,12074 12075,12076 12078,12079 12080,12081 12082,12083 12084,12085 12086,12087 12088,12089 12090,12091 12092,12093 12094,12095 12096,12097 12098,12099 12100,72 12100,312 12101,12102 12103,163 12104,12105 12106,12107 12108,12109 12110,12111 12112,192 12112,602 12112,657 12112,663 12112,920 12112,1089 12112,1849 12112,8854 12113,12114 12115,12116 12117,12118 12119,12120 12121,12122 12123,12124 12125,12126 12127,12128 12129,12130 12131,12132 12133,12134 12135,12136 12137,12138 12139,12140 12141,12142 12143,12144 12145,163 12146,12147 12148,12149 12150,12151 12152,12153 12154,12155 12156,12157 12158,12159 12160,12161 12162,12163 12164,12165 12166,12167 12168,12169 12170,12171 12172,12173 12174,12175 12176,12177 12178,12179 12180,12181 12182,12183 12184,12185 12186,12187 12188,12189 12190,12191 12192,12193 12194,12195 12196,12197 12198,12199 12200,12201 12202,12203 12204,12205 12206,12207 12208,12209 12210,12211 12212,12213 12214,12215 12216,12217 12218,12219 12220,12221 12222,12223 12224,12225 12226,12227 12228,12229 12230,12231 12232,12233 12234,12235 12236,12237 12238,12239 12240,12241 12242,12243 12244,12245 12246,12247 12248,12249 12250,12251 12252,12253 12254,518 12254,1411 12255,12256 12257,12258 12259,12260 12261,12262 12263,192 12263,336 12263,609 12263,1181 12263,1663 12263,2244 12263,2253 12263,6119 12263,60576 12263,204124 12264,12265 12266,12267 12268,12269 12270,12271 12272,12273 12274,12275 12276,12277 12278,571 12278,718 12278,868 12278,1623 12279,12280 12281,611 12282,12283 12284,12285 12286,12287 12288,12289 12290,12291 12292,12293 12294,12295 12296,12297 12298,12299 12300,12301 12302,12303 12304,12305 12306,12307 12308,12309 12310,12311 12312,12313 12314,12315 12316,12317 12318,12319 12320,12321 12322,12323 12324,12325 12326,12327 12328,12329 12330,12331 12332,12333 12334,12335 12336,12337 12338,12339 12340,12341 12342,12343 12344,12345 12346,12347 12348,12349 12350,12351 12352,12353 12354,12355 12356,12357 12358,12359 12360,12361 12362,12363 12364,12365 12366,12367 12368,12369 12370,12371 12372,12373 12374,12375 12376,12377 12378,299 12379,12380 12381,12382 12383,12384 12385,12386 12387,12388 12389,12390 12391,12392 12393,12394 12395,3744 12395,9005 12396,12397 12398,12399 12400,12401 12402,12403 12404,12405 12406,12407 12408,12409 12410,12411 12412,12413 12414,12415 12416,12417 12418,12419 12420,12421 12422,12423 12424,12425 12426,12427 12428,12429 12430,12431 12432,12433 12434,12435 12436,12437 12438,12439 12440,12441 12442,12443 12444,12445 12446,12447 12448,12449 12450,12451 12452,12453 12454,12455 12456,12457 12458,12459 12460,12461 12462,12463 12464,12465 12466,12467 12468,12469 12470,12471 12472,12473 12474,12475 12476,12477 12478,12479 12480,12481 12482,12483 12484,12485 12486,12487 12488,12489 12490,12491 12492,12493 12494,12495 12496,12497 12498,12499 12500,12501 12502,12503 12504,12505 12506,12507 12508,12509 12510,12511 12512,12513 12514,12515 12516,12517 12518,12519 12520,12521 12522,12523 12524,12525 12526,12527 12528,12529 12530,12531 12532,12533 12534,12535 12536,12537 12538,12539 12540,12541 12542,12543 12544,12545 12546,12547 12548,12549 12550,12551 12552,12553 12554,12555 12556,1432 12556,1639 12557,493 12557,1370 12558,12559 12560,12561 12562,12563 12564,12565 12566,12567 12568,12569 12570,12571 12572,12573 12574,12575 12576,12577 12578,577 12579,12580 12581,12582 12583,12584 12585,12586 12587,12588 12589,12590 12591,12592 12593,12594 12595,12596 12597,12598 12599,12600 12601,12602 12603,12604 12605,12606 12607,12608 12609,12610 12611,12612 12613,12614 12615,12616 12617,12618 12619,12620 12621,12622 12623,50 12623,779 12623,68069 12623,86832 12624,12625 12626,12627 12628,12629 12630,12631 12632,12633 12634,12635 12636,12637 12638,12639 12640,12641 12642,12643 12644,12645 12646,12647 12648,12649 12650,12651 12652,12653 12654,12655 12656,12657 12658,12659 12660,12661 12662,12663 12664,12665 12666,12667 12668,12669 12670,12671 12672,12673 12674,12675 12676,12677 12678,12679 12680,12681 12682,12683 12684,12685 12686,12687 12688,12689 12690,12691 12692,12693 12694,12695 12696,12697 12698,12699 12700,12701 12702,12703 12704,12705 12706,12707 12708,12709 12710,12711 12712,1973 12713,392 12714,12715 12716,3367 12717,12718 12719,32 12720,12721 12722,12723 12724,195 12724,336 12724,86479 12725,12726 12727,2775 12728,795 12729,671 12730,264 12730,1381 12731,12732 12733,1551 12734,12735 12736,1411 12736,2006 12737,12738 12739,12740 12741,12742 12743,77 12744,12745 12746,328 12746,2443 12747,10 12747,104 12747,134 12747,248 12747,264 12747,289 12747,290 12747,298 12747,310 12747,557 12747,631 12747,636 12747,805 12747,838 12747,932 12747,1016 12747,1119 12747,1282 12747,1368 12747,1392 12747,1608 12747,1631 12747,1635 12747,1745 12747,1955 12747,2209 12747,94134 12747,144988 12748,12749 12750,12751 12753,12754 12755,12756 12757,12758 12759,12760 12761,12762 12763,795 12764,12765 12766,12767 12768,12769 12770,12771 12772,12773 12774,12775 12776,12777 12778,12779 12780,12781 12782,12783 12784,12785 12786,12787 12788,12789 12790,12791 12792,12793 12794,12795 12796,12797 12798,12799 12800,12801 12802,12803 12804,12805 12806,12807 12808,12809 12810,12811 12812,12813 12814,12815 12816,12817 12819,12820 12821,12822 12823,12824 12826,12827 12828,12829 12830,12831 12832,12833 12834,12835 12836,12837 12838,12839 12840,12841 12842,12843 12844,12845 12846,12847 12848,12849 12850,12851 12852,12853 12854,12855 12856,12857 12858,12859 12860,12861 12862,12863 12864,12865 12866,12867 12868,12869 12870,264 12870,1127 12870,1381 12870,1893 12871,240 12871,372 12871,1082 12871,1285 12871,1955 12872,356 12872,852 12873,887 12874,163 12875,795 12876,1631 12877,1551 12878,1411 12878,4218 12878,4220 12878,66297 12879,1323 12880,102 12881,1326 12882,408 12884,12885 12886,622 12886,862 12886,893 12886,2116 12886,3769 12887,12888 12889,280 12889,17245 12890,12891 12892,280 12892,17245 12893,12894 12895,12896 12897,12898 12899,12900 12901,12902 12903,12904 12905,12906 12907,12908 12909,12910 12911,12912 12913,12914 12915,12916 12917,12918 12919,12920 12921,12922 12923,12924 12925,12926 12927,12928 12929,12930 12931,12932 12933,163 12934,12935 12936,12937 12938,12939 12940,12941 12942,12943 12944,12945 12946,12947 12948,12949 12950,12951 12952,843 12953,12954 12955,12956 12957,12958 12959,12960 12961,12962 12963,1411 12964,12965 12966,12967 12968,12969 12970,12971 12972,12973 12974,12975 12976,12977 12978,12979 12980,12981 12982,163 12983,12984 12985,12986 12987,12988 12989,12990 12991,12992 12993,12994 12995,12996 12997,12998 12999,13000 13001,13002 13003,13004 13005,13006 13007,13008 13009,13010 13011,13012 13013,13014 13015,13016 13017,13018 13019,13020 13021,280 13022,13023 13024,13025 13026,13027 13028,13029 13030,13031 13032,13033 13034,13035 13036,79 13036,302 13036,3769 13037,13038 13039,13040 13041,13042 13043,13044 13045,13046 13047,13048 13049,13050 13051,13052 13053,13054 13055,13056 13057,13058 13059,13060 13061,13062 13063,13064 13065,13066 13067,13068 13069,13070 13071,13072 13073,1639 13074,1579 13075,13076 13077,13078 13079,3 13079,178 13079,563 13079,919 13079,1284 13079,1285 13079,32475 13080,13081 13082,13083 13084,13085 13086,13087 13088,13089 13090,13091 13092,13093 13094,175 13095,13096 13097,13098 13099,13100 13101,13102 13103,13104 13105,13106 13107,13108 13109,13110 13111,13112 13113,13114 13115,13116 13117,13118 13119,13120 13121,13122 13123,13124 13125,13126 13127,26 13127,59 13127,877 13128,13129 13130,571 13130,868 13131,1659 13131,1775 13131,2205 13131,21944 13131,33424 13132,596 13132,1368 13133,611 13134,586 13135,13136 13135,13137 13135,28130 13135,213089 13136,392 13136,644 13136,1019 13136,4903 13136,6424 13137,283 13137,455 13137,682 13137,1539 13137,1571 13137,1724 13137,1756 13137,1949 13137,4223 13137,5208 13137,7698 13137,7768 13137,13328 13137,19443 13137,20600 13137,21414 13137,23287 13137,36594 13137,37088 13137,72439 13137,91906 13137,103913 13137,117817 13137,119854 13137,131216 13137,135270 13137,182467 13137,193490 13137,204259 13137,212914 13137,213089 13137,216027 13137,232737 13137,251467 13137,255758 13138,743 13138,4691 13140,79 13140,337 13140,563 13140,1089 13140,1619 13140,1623 13141,163 13142,22 13142,163 13142,433 13142,818 13143,390 13144,287 13145,2334 13146,309 13146,310 13147,184 13147,485 13147,8854 13147,15179 13148,1849 13149,143 13150,247 13151,1973 13151,26181 13152,30 13152,312 13152,510 13152,575 13152,875 13152,3260 13153,392 13153,1151 13153,2699 13154,1801 13155,163 13156,72 13157,2506 13158,211 13158,344 13158,1801 13159,163 13161,192 13161,6068 13162,130 13162,1634 13163,143 13164,48 13165,932 13166,366 13166,760 13166,1149 13166,1631 13166,1635 13167,140 13168,130 13168,835 13168,1007 13168,1381 13168,1452 13168,1509 13168,1551 13168,1639 13168,3041 13168,5440 13169,2319 13170,163 13170,302 13172,163 13173,534 13174,6955 13175,1509 13176,301 13176,1181 13176,1210 13177,202 13177,203 13178,422 13179,56 13180,1556 13181,65 13184,163 13185,192 13185,1392 13185,1745 13186,217 13188,433 13188,571 13189,1276 13189,3507 13190,2006 13191,72 13192,907 13193,462 13193,510 13193,872 13193,1118 13193,1147 13193,1151 13193,1572 13193,1653 13193,4039 13193,8149 13194,781 13195,77 13195,425 13195,868 13195,1276 13196,344 13197,50 13197,285 13197,1515 13197,1707 13198,35 13198,207 13198,240 13198,457 13198,536 13198,657 13198,697 13198,818 13198,1119 13198,1133 13198,1210 13198,1284 13198,1417 13198,1801 13198,1955 13198,2989 13198,2991 13198,3182 13199,119 13201,10 13202,163 13203,184 13203,2244 13204,195 13205,104 13205,264 13205,289 13205,290 13205,631 13205,1147 13205,1381 13205,2205 13205,33424 13205,144988 13206,143 13207,30 13207,104 13207,111 13207,134 13207,135 13207,138 13207,182 13207,186 13207,200 13207,225 13207,240 13207,248 13207,264 13207,288 13207,289 13207,290 13207,314 13207,327 13207,328 13207,332 13207,356 13207,364 13207,397 13207,446 13207,450 13207,452 13207,457 13207,467 13207,557 13207,599 13207,631 13207,636 13207,673 13207,685 13207,714 13207,760 13207,772 13207,808 13207,838 13207,849 13207,850 13207,911 13207,943 13207,953 13207,1011 13207,1014 13207,1085 13207,1118 13207,1149 13207,1172 13207,1179 13207,1191 13207,1262 13207,1282 13207,1332 13207,1415 13207,1454 13207,1462 13207,1518 13207,1531 13207,1566 13207,1572 13207,1631 13207,1796 13207,1808 13207,1844 13207,1879 13207,1893 13207,1955 13207,2105 13207,2173 13207,2205 13207,3020 13207,3099 13207,3247 13207,3507 13207,3633 13207,3719 13207,4276 13207,4355 13207,5405 13207,6695 13207,7117 13207,7155 13207,7214 13207,7757 13207,7912 13207,8133 13207,13207 13207,13208 13207,13220 13207,13522 13207,14417 13207,16664 13207,16674 13207,20510 13207,20604 13207,21633 13207,23392 13207,23508 13207,23654 13207,24789 13207,26045 13207,28203 13207,28311 13207,28860 13207,29831 13207,30315 13207,30392 13207,31243 13207,32722 13207,33302 13207,33424 13207,33621 13207,34352 13207,38650 13207,40580 13207,41306 13207,42807 13207,43115 13207,44407 13207,46152 13207,47031 13207,56319 13207,59956 13207,60464 13207,62323 13207,62333 13207,63011 13207,63034 13207,64648 13207,64666 13207,64689 13207,65152 13207,67922 13207,68664 13207,68755 13207,73441 13207,75912 13207,75957 13207,77809 13207,79786 13207,82892 13207,83858 13207,85819 13207,93729 13207,93864 13207,94134 13207,94232 13207,96698 13207,103948 13207,103951 13207,104514 13207,105803 13207,112895 13207,112972 13207,113384 13207,115292 13207,116531 13207,121027 13207,122140 13207,127223 13207,127714 13207,130836 13207,130862 13207,131919 13207,132892 13207,135628 13207,136166 13207,136217 13207,136423 13207,136424 13207,136587 13207,136713 13207,136714 13207,136715 13207,136716 13207,136717 13207,137821 13207,138736 13207,149257 13207,162992 13207,179404 13207,180956 13207,181870 13207,190276 13207,196107 13207,196128 13207,196752 13207,197860 13207,201839 13207,204076 13207,205040 13207,205881 13207,207089 13207,232036 13207,232226 13207,232923 13207,233380 13207,245910 13207,254243 13207,254994 13208,200 13209,26 13209,59 13210,163 13211,163 13212,515 13212,1052 13213,697 13214,3507 13215,26 13215,59 13217,186 13217,304 13217,313 13217,332 13217,390 13217,589 13217,668 13217,685 13217,801 13217,877 13217,941 13217,968 13217,1001 13217,1284 13217,1326 13217,1715 13217,1955 13217,2209 13217,2334 13217,3555 13217,4222 13217,5130 13217,5718 13217,5961 13217,9015 13217,24500 13217,171641 13218,1298 13219,422 13220,248 13220,943 13220,1332 13220,5405 13221,99 13221,47031 13221,60576 13222,301 13222,392 13222,657 13222,1240 13222,1326 13222,2557 13223,433 13223,595 13223,1634 13224,1590 13224,1644 13225,1860 13226,149 13226,195 13226,252 13226,318 13226,516 13226,622 13227,63 13228,1634 13229,599 13230,146 13230,314 13230,779 13230,3252 13230,106502 13231,2681 13232,489 13233,65 13233,66 13233,79 13233,467 13233,868 13233,3744 13234,15 13235,30 13235,32 13235,440 13235,622 13235,809 13235,1179 13235,2116 13235,21442 13235,141912 13236,26 13236,59 13237,30 13238,26 13238,59 13239,1381 13240,222 13240,278 13240,313 13240,356 13240,389 13240,634 13240,657 13240,660 13240,852 13240,1072 13240,1724 13240,2779 13240,2784 13240,3252 13240,4637 13240,5933 13240,6506 13240,7092 13240,14556 13240,19443 13240,40566 13240,115659 13241,1858 13242,63 13242,202 13242,516 13242,671 13242,1385 13244,349 13244,5540 13245,707 13245,1801 13245,3182 13245,6424 13245,28107 13246,2105 13247,1544 13248,163 13250,32 13250,83 13250,273 13250,283 13250,408 13250,622 13250,634 13250,673 13250,1149 13250,1247 13250,1313 13250,1381 13250,1509 13250,1847 13250,2701 13250,3999 13250,4223 13250,138686 13252,299 13252,1284 13252,1319 13252,2083 13252,73570 13253,158 13254,4611 13255,346 13256,143 13257,500 13257,718 13258,1836 13259,1634 13260,868 13261,72 13262,1849 13262,32784 13263,79 13264,781 13265,68 13266,248 13267,143 13268,37 13268,366 13268,1231 13268,1782 13268,5662 13269,195 13269,252 13269,275 13269,1385 13270,79 13270,202 13270,1181 13271,417 13272,2681 13272,17369 13272,20026 13272,62678 13272,66006 13272,68871 13272,69645 13272,96373 13272,106995 13272,116381 13272,120291 13272,121511 13272,124808 13272,125325 13272,125970 13272,126306 13272,127608 13272,128010 13272,129298 13272,129649 13272,130031 13272,130078 13272,130124 13272,130786 13272,168511 13272,172015 13272,172904 13272,184189 13273,104 13273,718 13273,795 13273,893 13273,4218 13273,7194 13274,10 13274,149 13274,240 13274,261 13274,302 13274,372 13274,390 13274,518 13274,694 13274,811 13274,818 13274,1001 13274,1454 13274,1955 13275,457 13276,54 13276,278 13276,283 13276,455 13276,1538 13276,1539 13276,1843 13276,2423 13276,2424 13276,6506 13276,6789 13276,7768 13276,13400 13276,23858 13276,33118 13276,49188 13276,64858 13276,68135 13277,143 13278,30 13279,489 13279,809 13280,192 13280,435 13280,1745 13282,911 13282,2209 13282,4475 13283,158 13283,406 13283,779 13283,1181 13283,1515 13284,1557 13284,1684 13284,13285 13284,30886 13284,51664 13284,52106 13284,56674 13284,56676 13284,56678 13284,57870 13284,62437 13284,99218 13284,132321 13284,143507 13284,157407 13284,162310 13284,188672 13284,188686 13284,201461 13284,203295 13284,219194 13284,220270 13284,227676 13286,146 13286,92476 13287,3999 13289,336 13290,781 13291,1603 13291,6861 13292,136 13293,932 13294,592 13295,248 13296,240 13296,301 13296,444 13296,604 13296,615 13296,968 13296,1285 13296,1564 13297,37 13298,264 13298,9005 13299,349 13299,762 13299,941 13299,5301 13300,609 13302,425 13302,1276 13302,19488 13302,138686 13303,760 13303,1631 13304,694 13304,2775 13304,3623 13305,801 13305,1140 13306,217 13306,1417 13307,302 13307,310 13307,596 13307,811 13307,874 13307,1881 13307,255911 13308,408 13309,37 13310,13311 13310,44576 13310,57834 13310,114740 13312,252 13312,516 13312,1220 13312,1222 13313,143 13314,652 13315,7760 13316,6955 13317,252 13317,302 13317,538 13317,1220 13317,1222 13317,5405 13319,1782 13320,163 13320,209 13320,262 13320,302 13320,515 13320,571 13320,579 13320,687 13320,718 13320,861 13320,893 13320,1556 13320,2116 13320,4823 13322,1454 13323,440 13323,441 13323,673 13323,794 13324,292 13324,515 13325,2312 13326,251 13326,252 13326,516 13326,1220 13326,1222 13327,68 13327,1400 13328,34 13328,35 13328,217 13328,222 13328,455 13328,536 13328,862 13328,1001 13328,1019 13328,1531 13328,1539 13328,1571 13328,7768 13328,13137 13328,13361 13329,1509 13330,1127 13330,1639 13330,2051 13330,49057 13330,81070 13331,5547 13332,259 13332,577 13333,636 13334,77 13334,1287 13334,3695 13335,171 13337,10 13337,13338 13337,20077 13337,21085 13337,21086 13337,21087 13337,21091 13337,26451 13338,10 13338,13345 13339,682 13339,72439 13340,1579 13341,1639 13342,143 13343,991 13344,1749 13347,209 13347,346 13347,893 13347,4453 13348,273 13348,595 13348,704 13348,992 13348,1402 13348,1818 13348,1844 13348,1858 13348,5540 13348,9457 13349,298 13350,485 13351,973 13352,175 13352,693 13353,698 13354,968 13354,1241 13354,1479 13354,2557 13355,781 13356,134 13357,22 13357,147 13357,211 13357,2017 13357,141912 13358,534 13359,160 13359,294 13359,417 13359,736 13359,827 13359,1007 13359,1132 13359,1147 13359,1509 13359,1564 13359,3999 13360,1836 13360,13361 13361,58 13361,657 13361,911 13362,1127 13362,1659 13362,2051 13363,671 13364,1452 13365,389 13365,1454 13367,1858 13368,1860 13369,163 13370,163 13371,1370 13372,1181 13372,1210 13373,182 13374,252 13374,272 13374,943 13374,1068 13374,1220 13374,1222 13374,1512 13374,2867 13374,2868 13374,36761 13374,72439 13375,731 13375,1191 13375,6682 13376,163 13376,2116 13377,710 13378,50 13378,63 13378,158 13378,195 13378,285 13378,406 13378,620 13378,779 13378,1181 13378,1515 13378,5874 13378,6119 13379,4453 13380,225 13383,911 13385,158 13385,192 13386,4222 13387,2775 13388,447 13389,83 13389,87 13389,313 13389,356 13389,385 13389,455 13389,536 13389,852 13389,1140 13389,1453 13389,1722 13389,1836 13389,1881 13389,2944 13389,5591 13390,50 13390,149 13390,505 13390,620 13390,127158 13390,141912 13391,1 13392,66 13392,868 13392,920 13392,1433 13393,571 13393,1140 13393,1175 13394,393 13395,10 13395,72 13395,134 13395,9457 13396,900 13400,455 13400,1019 13400,1539 13400,7768 13401,81 13402,1474 13403,8907 13404,32 13404,392 13405,1105 13406,577 13406,1105 13406,1429 13407,595 13407,703 13408,134 13409,143 13410,1313 13411,107 13411,289 13411,290 13411,694 13411,749 13411,1388 13411,1888 13411,1955 13411,2775 13411,3085 13411,3623 13411,8276 13412,534 13413,1429 13414,56 13415,143 13416,187 13417,302 13417,2116 13418,301 13418,968 13418,2979 13419,779 13419,8055 13420,313 13420,544 13420,874 13423,687 13423,861 13423,1556 13423,4823 13424,485 13424,1096 13425,346 13426,143 13427,328 13428,79 13428,192 13428,206 13428,663 13428,664 13428,994 13428,1181 13429,720 13429,1117 13429,1240 13429,1465 13430,149 13430,333 13431,703 13431,1453 13432,589 13433,217 13433,372 13433,417 13433,588 13433,590 13433,1001 13433,1082 13433,1085 13433,1881 13433,2205 13433,6068 13433,33424 13435,192 13435,663 13435,664 13435,3872 13436,147 13436,252 13437,5908 13438,795 13439,163 13440,1973 13442,120 13442,388 13442,2006 13442,2979 13442,6638 13444,87 13444,392 13444,1151 13444,1240 13444,1454 13444,1572 13444,1722 13444,2436 13445,818 13446,794 13446,1368 13447,972 13448,874 13448,6891 13449,163 13449,2116 13451,1973 13452,760 13452,1149 13452,1631 13453,163 13454,37 13454,1782 13454,227376 13455,312 13456,163 13457,874 13458,65 13459,483 13460,151 13461,477 13461,2168 13462,949 13463,1096 13464,192 13464,195 13464,516 13464,663 13464,664 13464,1844 13464,6119 13465,1718 13466,577 13467,273 13467,274 13467,1512 13467,5992 13467,189128 13468,1608 13469,483 13470,167 13470,2083 13471,313 13472,163 13473,3507 13474,462 13474,907 13474,2191 13474,2436 13474,4039 13475,611 13475,717 13476,163 13477,707 13478,192 13478,240 13478,332 13478,372 13478,493 13478,1192 13478,1285 13478,1419 13478,1663 13478,1796 13478,2512 13478,4549 13479,657 13480,167 13480,1167 13480,1522 13480,1955 13480,2083 13480,2191 13480,2557 13480,2979 13480,3138 13480,5301 13481,1388 13482,136 13483,2083 13483,2191 13483,3138 13484,13485 13487,163 13487,302 13489,167 13489,832 13489,1522 13489,2083 13489,75912 13490,1309 13491,996 13491,3258 13491,44725 13492,392 13493,158 13493,285 13493,336 13493,406 13493,1515 13495,30 13495,704 13496,385 13497,2681 13497,31977 13497,82487 13497,89547 13497,93365 13497,105282 13498,298 13499,485 13500,333 13501,1963 13502,292 13502,1688 13503,143 13504,536 13505,1522 13506,3 13506,225 13506,372 13506,435 13506,592 13506,704 13506,932 13506,934 13506,1082 13506,1140 13506,1177 13506,1241 13506,1332 13506,1368 13506,1479 13506,1579 13506,1789 13506,1849 13506,1955 13506,1985 13506,2045 13506,2205 13506,2480 13506,3474 13506,4771 13506,33424 13507,333 13507,622 13508,1179 13509,151 13510,195 13511,160 13512,1983 13513,1010 13514,163 13515,920 13515,2837 13515,4748 13516,83 13517,72 13518,1849 13518,32784 13519,66 13519,163 13519,467 13519,571 13519,868 13519,1167 13519,1433 13519,2979 13520,158 13520,206 13520,314 13520,55849 13520,118336 13520,220502 13521,1326 13521,1955 13522,225 13522,248 13522,5405 13523,301 13523,968 13523,973 13523,1167 13523,1231 13523,1293 13523,1300 13523,1544 13523,3422 13523,227376 13524,217 13524,240 13524,301 13524,309 13524,310 13524,372 13524,390 13524,433 13524,440 13524,467 13524,510 13524,534 13524,589 13524,818 13524,1085 13524,1417 13524,1796 13524,3804 13524,6068 13524,18739 13525,252 13525,318 13525,2116 13525,41170 13527,772 13528,972 13528,1718 13528,2750 13529,275 13529,277 13529,70858 13531,305 13532,87 13533,83 13534,104 13534,1177 13534,2210 13535,247 13536,1179 13537,13538 13538,135 13538,685 13538,911 13538,1188 13538,13538 13539,104 13540,1467 13542,873 13543,206 13544,248 13544,450 13544,1332 13545,13546 13548,996 13549,120 13549,222 13549,283 13549,389 13549,455 13549,1072 13550,195 13551,1789 13553,151 13554,163 13555,1955 13555,66500 13556,147 13556,336 13556,991 13556,1247 13556,2421 13556,8055 13556,164572 13557,2574 13558,1133 13559,1287 13560,920 13561,516 13564,893 13566,577 13566,980 13567,364 13568,248 13568,1332 13569,592 13570,5165 13571,949 13572,143 13572,273 13572,274 13572,1052 13573,22 13573,861 13574,406 13576,333 13576,775 13576,841 13577,392 13577,809 13578,417 13578,525 13578,805 13578,1085 13578,1140 13578,1749 13578,1818 13578,2286 13578,2620 13579,1718 13580,518 13580,1955 13580,2775 13581,158 13582,298 13583,485 13584,261 13585,11 13585,613 13585,13586 13585,13590 13585,15749 13585,22676 13585,31470 13585,32839 13585,49738 13585,66849 13585,74748 13585,82327 13585,88738 13585,90979 13585,91046 13585,91613 13585,93876 13585,95141 13585,113130 13585,127012 13585,139698 13587,72 13588,247 13589,50 13589,779 13591,707 13592,158 13592,406 13592,779 13592,1181 13592,4192 13592,4193 13593,136 13593,137 13593,919 13593,1479 13593,1522 13593,2480 13593,2557 13594,252 13594,668 13594,859 13594,1465 13594,1619 13595,5265 13596,72 13597,222 13597,657 13597,770 13598,392 13598,2699 13598,13599 13599,2699 13600,72 13601,140 13601,264 13601,1381 13601,1509 13601,1893 13602,704 13603,2681 13603,13604 13603,31977 13603,35392 13605,283 13605,920 13605,1381 13605,2979 13607,252 13607,318 13607,657 13607,41170 13608,2744 13609,167 13609,2083 13610,1070 13611,72 13612,3507 13613,1749 13614,301 13615,7233 13616,81 13617,143 13618,13619 13620,72 13621,106 13621,1888 13621,6119 13622,34 13622,35 13622,217 13622,222 13622,379 13622,389 13622,455 13622,536 13622,657 13622,949 13622,1274 13622,1566 13622,1618 13622,7092 13622,18831 13622,20771 13622,115474 13623,158 13623,406 13623,779 13624,186 13624,338 13624,389 13624,450 13624,1392 13625,107 13625,1146 13625,1579 13625,3538 13626,493 13626,588 13626,590 13626,634 13626,784 13626,1016 13627,143 13628,932 13630,13631 13632,406 13632,53255 13632,55253 13632,96843 13633,192 13634,1453 13635,222 13636,146 13636,252 13636,516 13636,1243 13636,4355 13636,6661 13636,20771 13636,92476 13637,240 13637,1078 13637,1085 13637,1285 13637,1659 13637,1888 13637,127158 13637,179804 13637,185877 13638,356 13638,852 13639,13640 13639,55423 13639,61642 13639,63105 13641,240 13641,2296 13642,349 13643,392 13643,809 13644,140 13645,1033 13646,1068 13647,1749 13648,184 13649,714 13650,344 13651,151 13652,302 13652,687 13653,333 13654,195 13655,10 13656,3507 13657,158 13657,248 13657,289 13657,290 13657,309 13657,310 13657,455 13657,694 13657,875 13657,1085 13657,1118 13657,1298 13657,1309 13657,1612 13657,2083 13657,2253 13657,2646 13657,2671 13657,2979 13657,4355 13658,147 13658,175 13658,784 13659,493 13659,1927 13660,13661 13661,634 13661,635 13661,891 13661,1014 13661,2421 13661,4166 13661,4234 13661,13661 13661,14033 13661,14051 13661,14556 13661,14901 13661,15887 13661,22119 13661,25165 13661,25179 13661,26161 13661,27519 13661,40737 13661,40829 13661,42509 13661,45700 13661,50418 13661,56206 13661,73215 13661,77693 13661,79722 13661,83811 13661,99992 13661,100815 13661,113375 13661,113506 13661,118948 13661,149149 13661,149152 13661,149882 13661,150708 13661,151358 13661,152204 13661,152782 13661,156257 13661,169872 13661,171122 13661,173797 13661,174777 13661,174830 13661,175300 13661,176845 13661,176850 13661,198120 13661,203906 13661,204259 13661,214076 13661,221738 13661,228350 13661,228360 13661,234078 13661,234655 13661,248444 13661,250578 13661,250663 13661,253011 13662,26 13662,59 13662,994 13662,21944 13663,1243 13665,71 13665,304 13665,2334 13665,2620 13665,6068 13666,760 13668,72 13669,2274 13670,314 13670,349 13671,5375 13672,1105 13673,934 13674,1149 13675,7155 13676,525 13677,3 13677,107 13677,225 13677,372 13677,435 13677,509 13677,592 13677,694 13677,704 13677,801 13677,907 13677,932 13677,934 13677,1082 13677,1122 13677,1140 13677,1177 13677,1241 13677,1285 13677,1368 13677,1467 13677,1479 13677,1511 13677,1522 13677,1579 13677,1789 13677,1849 13677,1985 13677,2045 13677,2205 13677,2480 13677,2620 13677,2701 13677,2784 13677,3069 13677,3474 13677,4545 13677,33424 13679,1411 13680,72 13681,392 13681,2312 13682,13683 13684,273 13684,274 13685,250 13685,1684 13686,34 13686,35 13687,147 13687,175 13687,192 13687,195 13687,206 13687,622 13687,1515 13687,5101 13687,31346 13687,34876 13688,63 13688,252 13688,516 13688,1220 13688,1222 13688,16201 13688,41170 13689,1433 13690,178 13691,289 13691,290 13692,1381 13692,1551 13693,65 13693,217 13694,50 13694,147 13694,192 13694,333 13694,493 13694,586 13694,682 13694,1175 13694,1414 13694,1515 13694,1985 13694,2931 13694,3872 13694,5874 13694,6119 13694,72439 13695,366 13695,818 13695,1388 13696,13697 13698,372 13698,1082 13699,843 13699,1010 13700,135 13701,1127 13702,1127 13704,805 13704,885 13704,1235 13704,1335 13704,1775 13704,1962 13704,3795 13704,3796 13704,8557 13704,13704 13704,21944 13704,171294 13705,4060 13706,907 13706,2191 13707,269 13708,3193 13709,302 13709,687 13709,1556 13710,372 13712,240 13712,818 13712,819 13712,2235 13712,2348 13712,3993 13712,7338 13712,7891 13712,13274 13712,13712 13712,15556 13712,20788 13712,23354 13712,23777 13712,33620 13712,38743 13712,40824 13712,41206 13712,43750 13712,46891 13712,46894 13712,49699 13712,50189 13712,50588 13712,51919 13712,58223 13712,59148 13712,63714 13712,66301 13712,71678 13712,71697 13712,79640 13712,79666 13712,94077 13712,94246 13712,105784 13712,134226 13712,140384 13712,140536 13712,145050 13712,151063 13712,159400 13712,164213 13712,164490 13712,167737 13712,167842 13712,169620 13712,169896 13712,169970 13712,171483 13712,171581 13712,173440 13712,174817 13712,174842 13712,174844 13712,175067 13712,175068 13712,175949 13712,219956 13712,263076 13712,263088 13713,439 13714,44 13715,19 13715,1639 13716,515 13717,104 13717,136 13717,225 13717,248 13717,557 13717,1368 13718,1001 13719,10 13719,2646 13719,228471 13720,252 13720,314 13720,516 13720,1220 13720,1222 13721,1001 13722,195 13723,4548 13724,323 13725,980 13726,1639 13726,1893 13726,3695 13727,65 13727,296 13727,302 13727,534 13727,536 13727,652 13727,720 13727,1102 13727,3585 13727,4504 13727,14550 13728,2797 13729,1556 13730,503 13731,387 13735,143 13736,264 13736,1381 13736,1452 13736,1639 13737,1370 13737,1821 13738,13739 13740,143 13741,58 13741,130 13741,135 13741,137 13741,294 13741,332 13741,364 13741,431 13741,442 13741,557 13741,1052 13741,1564 13741,2315 13741,2701 13741,3328 13741,3474 13741,4771 13741,5405 13742,1590 13743,349 13744,13745 13746,247 13747,376 13748,1253 13748,2089 13748,2940 13749,718 13750,505 13751,586 13751,1749 13752,72 13753,893 13754,481 13755,269 13756,862 13756,2296 13757,1673 13758,1046 13759,143 13760,278 13760,1871 13762,595 13762,1453 13762,1572 13764,306 13764,307 13765,1127 13767,13768 13769,1116 13771,192 13771,264 13771,301 13771,406 13771,467 13771,516 13771,972 13771,1010 13771,1181 13771,1284 13771,1298 13771,1531 13771,1551 13771,1659 13771,1749 13771,2266 13772,417 13773,13774 13775,920 13775,8854 13776,11 13776,1135 13777,3138 13778,294 13779,483 13779,1227 13779,1229 13780,996 13781,660 13782,1888 13783,72 13784,344 13785,285 13786,1 13787,1326 13788,2681 13789,83 13790,2671 13791,516 13792,10 13793,1204 13794,557 13795,557 13796,211 13796,269 13796,622 13796,1014 13797,13798 13797,33870 13797,47646 13797,92375 13797,92607 13797,110737 13799,143 13800,83 13801,1179 13802,811 13803,417 13804,20 13804,83 13804,2372 13804,21442 13804,142426 13805,1644 13807,143 13808,718 13808,885 13808,13704 13809,1984 13809,3949 13810,392 13810,697 13810,1151 13810,2699 13811,312 13812,13813 13814,352 13814,3744 13814,3967 13815,298 13816,485 13817,250 13818,13819 13820,640 13821,13822 13823,2424 13824,8854 13825,119 13826,71 13827,79 13827,1425 13828,417 13829,390 13830,1 13830,202 13830,203 13831,3252 13832,417 13832,818 13833,406 13834,301 13835,3623 13836,1509 13837,577 13838,13839 13840,264 13840,818 13840,1181 13840,1210 13841,143 13842,1707 13843,1858 13844,1860 13845,171 13846,323 13847,809 13848,527 13849,3089 13850,273 13850,274 13851,283 13852,13853 13855,77 13856,182 13857,9021 13858,192 13858,859 13859,192 13859,525 13859,1392 13859,1454 13859,1745 13859,1796 13859,3804 13860,215 13861,7 13862,130 13862,697 13862,1531 13863,72 13864,72 13865,602 13866,143 13866,1052 13867,2286 13868,379 13868,385 13868,115474 13869,344 13869,652 13870,483 13871,72 13872,72 13873,2244 13873,23783 13873,30331 13874,143 13875,305 13876,1204 13877,143 13878,615 13879,143 13880,72 13881,634 13882,119 13882,151 13882,192 13882,309 13882,310 13882,577 13882,1400 13882,2073 13882,13910 13883,72 13884,143 13885,3724 13886,13887 13888,143 13889,72 13890,1282 13891,1467 13892,240 13893,2506 13894,3507 13895,726 13895,2867 13895,2868 13896,2506 13897,2506 13898,718 13898,893 13899,298 13900,485 13901,874 13901,1210 13902,1871 13903,72 13904,72 13905,3367 13906,206 13907,1433 13908,3585 13909,227 13911,143 13912,104 13912,134 13912,138 13913,743 13913,4691 13914,1414 13915,72 13916,72 13917,72 13918,13919 13920,143 13921,72 13922,2411 13923,8798 13924,920 13925,83 13926,247 13927,261 13928,104 13928,135 13928,136 13928,137 13928,138 13928,557 13928,1368 13929,920 13930,72 13931,41 13931,1177 13932,2146 13933,1381 13934,349 13935,217 13935,536 13936,1983 13937,149 13938,13939 13938,99406 13940,1818 13941,192 13942,13943 13944,63 13945,301 13945,717 13945,1231 13945,1740 13945,1782 13946,1590 13947,68 13947,22071 13948,32 13948,34 13948,35 13948,83 13948,217 13948,283 13948,323 13948,358 13948,392 13948,455 13948,577 13948,623 13948,949 13948,1001 13948,1201 13948,1240 13948,1467 13948,1572 13948,1644 13948,1722 13948,2045 13948,2266 13948,2931 13948,3252 13948,4549 13948,7092 13948,13546 13949,104 13950,202 13950,203 13951,255 13952,1 13953,13954 13956,104 13957,13958 13959,13960 13961,1179 13961,2681 13961,31977 13962,388 13963,652 13964,2590 13965,289 13965,290 13965,372 13965,417 13965,714 13965,932 13965,1012 13965,1082 13965,1285 13965,1564 13965,1818 13965,1955 13965,2205 13965,2296 13965,2620 13965,4218 13965,33424 13965,94134 13965,144988 13966,589 13966,1001 13967,1151 13969,104 13969,134 13969,135 13969,137 13969,138 13969,1368 13969,2105 13970,527 13970,13971 13972,10 13972,65 13972,97 13972,192 13972,406 13972,779 13972,1127 13973,207 13974,301 13974,968 13974,1167 13974,1241 13974,1298 13974,1359 13974,1436 13974,1479 13974,1837 13974,2083 13974,2979 13974,3138 13974,3218 13974,5718 13976,366 13977,366 13978,795 13979,13980 13980,83 13980,217 13980,949 13980,2290 13980,5046 13980,13980 13980,24628 13980,24653 13980,80153 13980,81024 13980,85823 13980,234800 13980,236740 13980,248640 13981,255 13982,358 13983,1509 13984,206 13985,462 13986,1977 13986,1978 13987,163 13988,493 13988,13989 13988,94460 13990,8235 13991,37 13991,446 13991,567 13991,698 13991,699 13991,762 13991,936 13991,937 13991,938 13991,1136 13991,1215 13991,1231 13991,1740 13991,1782 13991,3421 13991,7339 13991,13353 13991,13991 13991,30524 13991,34780 13991,37362 13991,46638 13991,77637 13991,78868 13991,85842 13991,89522 13991,135196 13991,135215 13991,137001 13991,142067 13991,151334 13991,161560 13991,165989 13991,189211 13991,194304 13991,222552 13991,224111 13991,261883 13992,163 13992,579 13993,149 13994,147 13994,779 13994,1515 13995,383 13996,13997 13998,13999 14000,518 14001,1639 14002,163 14002,302 14003,163 14004,163 14006,77 14006,79 14006,83 14006,206 14006,259 14006,301 14006,305 14006,337 14006,516 14006,581 14006,760 14006,900 14006,1113 14006,1177 14006,1238 14006,1287 14006,1509 14006,1860 14006,2210 14006,2620 14006,3193 14006,95338 14009,187 14009,388 14009,1559 14010,292 14010,462 14010,509 14010,595 14010,673 14010,1453 14010,1653 14011,534 14011,1085 14011,1580 14012,233 14013,949 14014,1673 14015,305 14016,911 14017,7 14017,97 14018,907 14018,932 14019,346 14021,14022 14021,135486 14023,1151 14023,1515 14024,211 14024,1844 14024,2867 14024,2868 14025,1043 14026,1070 14027,163 14027,340 14028,5662 14029,3451 14029,3452 14030,143 14031,388 14032,7233 14034,251 14035,1858 14036,1860 14038,344 14039,251 14040,50 14040,149 14040,285 14040,406 14040,440 14040,622 14040,779 14040,809 14040,68069 14040,141912 14041,1096 14042,919 14043,6027 14044,26 14044,59 14045,485 14046,602 14047,707 14048,83 14048,292 14048,1411 14048,3612 14048,4355 14049,1276 14050,207 14051,13661 14052,151 14052,985 14052,2626 14052,6824 14053,422 14055,611 14056,1939 14056,8180 14058,14059 14060,435 14060,663 14061,1801 14061,3182 14061,6424 14062,298 14063,485 14064,178 14064,202 14064,203 14064,240 14064,269 14064,366 14064,467 14064,500 14064,571 14064,622 14064,818 14064,868 14064,1133 14064,2371 14064,17309 14064,156379 14064,162599 14065,406 14065,779 14065,1515 14066,1985 14067,273 14067,274 14067,743 14067,4691 14068,657 14069,163 14070,611 14071,310 14073,255 14075,104 14076,346 14077,907 14077,949 14077,1133 14077,1240 14078,306 14078,307 14079,137 14080,104 14080,134 14080,186 14080,200 14080,227 14080,248 14080,261 14080,264 14080,289 14080,290 14080,298 14080,309 14080,310 14080,332 14080,372 14080,483 14080,503 14080,557 14080,588 14080,590 14080,631 14080,636 14080,714 14080,760 14080,805 14080,862 14080,1016 14080,1119 14080,1282 14080,1319 14080,1462 14080,1631 14080,1635 14080,1745 14080,1955 14080,1962 14080,2205 14080,2206 14080,2209 14080,4237 14080,6556 14080,8537 14080,33424 14080,94134 14080,182162 14080,232766 14081,818 14081,14082 14081,38087 14081,40194 14081,43567 14081,46527 14081,47344 14081,49296 14081,50848 14081,51700 14081,52918 14081,53311 14081,54939 14081,57230 14081,59750 14081,64452 14081,69125 14081,69319 14081,69384 14081,70527 14081,78314 14081,81462 14081,83800 14081,83952 14081,84758 14081,86883 14081,89126 14081,89846 14081,90031 14081,91932 14081,91997 14081,92344 14081,92610 14081,92723 14081,93743 14081,94505 14081,95986 14081,96152 14081,96613 14081,96856 14081,96890 14081,97561 14081,101356 14081,104513 14081,105145 14081,105814 14081,106070 14081,107214 14081,108771 14081,110972 14081,111828 14081,112129 14081,112494 14081,112740 14081,113104 14081,114221 14081,114281 14081,114642 14081,114941 14081,115083 14081,115914 14081,117185 14081,117199 14081,118751 14081,118933 14081,119733 14081,120374 14081,120399 14081,120774 14081,121495 14081,122561 14081,123739 14081,123956 14081,124289 14081,124638 14081,125026 14081,125538 14081,125694 14081,127617 14081,128595 14081,129119 14081,129281 14081,129485 14081,129656 14081,129987 14081,130653 14081,130896 14081,132727 14081,134703 14081,134843 14081,135014 14081,139089 14081,144423 14081,150971 14081,151588 14081,151622 14081,152038 14081,153213 14081,154058 14081,154236 14081,161769 14081,165463 14081,167431 14081,167520 14081,173185 14081,175201 14081,182101 14081,185169 14081,188680 14081,193945 14081,213531 14081,216480 14081,217260 14081,220890 14081,221574 14081,221981 14081,223215 14081,226413 14081,227549 14081,229302 14081,230120 14081,230428 14081,232622 14081,235360 14081,235375 14081,239407 14081,239466 14081,239491 14081,239948 14081,241449 14081,242111 14081,242398 14081,243054 14081,243098 14081,246493 14081,246635 14081,246819 14081,247584 14081,248930 14081,248982 14081,249018 14081,251209 14081,260472 14081,263668 14081,264708 14081,264887 14081,264967 14083,406 14084,644 14085,14086 14087,358 14087,15119 14088,379 14088,907 14089,577 14090,1105 14092,32 14092,34 14092,35 14092,63 14092,72 14092,77 14092,81 14092,104 14092,111 14092,120 14092,140 14092,158 14092,178 14092,192 14092,202 14092,203 14092,215 14092,217 14092,225 14092,233 14092,248 14092,252 14092,283 14092,285 14092,296 14092,301 14092,328 14092,332 14092,333 14092,337 14092,346 14092,358 14092,372 14092,383 14092,388 14092,390 14092,392 14092,393 14092,406 14092,422 14092,435 14092,439 14092,455 14092,493 14092,509 14092,518 14092,525 14092,577 14092,586 14092,592 14092,622 14092,631 14092,687 14092,704 14092,714 14092,717 14092,720 14092,752 14092,779 14092,795 14092,809 14092,862 14092,873 14092,907 14092,919 14092,934 14092,968 14092,980 14092,1001 14092,1007 14092,1010 14092,1016 14092,1052 14092,1085 14092,1105 14092,1133 14092,1140 14092,1149 14092,1167 14092,1177 14092,1179 14092,1181 14092,1210 14092,1231 14092,1240 14092,1274 14092,1282 14092,1298 14092,1309 14092,1326 14092,1332 14092,1381 14092,1392 14092,1411 14092,1429 14092,1436 14092,1466 14092,1467 14092,1509 14092,1515 14092,1522 14092,1544 14092,1564 14092,1590 14092,1634 14092,1644 14092,1715 14092,1722 14092,1749 14092,1821 14092,1837 14092,1849 14092,1877 14092,1893 14092,1939 14092,1977 14092,1978 14092,2045 14092,2205 14092,2206 14092,2443 14092,2557 14092,2596 14092,2620 14092,2699 14092,2701 14092,2784 14092,2979 14092,2989 14092,2991 14092,3041 14092,3135 14092,3138 14092,3182 14092,3194 14092,3207 14092,3218 14092,3422 14092,3507 14092,3538 14092,3585 14092,3695 14092,3804 14092,3999 14092,5405 14092,5440 14092,5662 14092,5718 14092,5874 14092,6068 14092,6955 14092,8180 14092,9001 14092,14126 14092,14797 14092,14819 14093,1673 14095,301 14095,510 14095,2372 14095,3422 14096,893 14098,707 14098,1696 14098,1801 14098,3182 14098,3582 14098,4903 14098,5178 14098,6032 14098,6424 14098,7087 14098,13136 14098,14098 14098,14099 14098,14425 14098,18756 14098,19285 14098,20777 14098,21207 14098,23311 14098,23328 14098,24740 14098,25395 14098,26811 14098,28107 14098,28193 14098,29662 14098,31018 14098,32462 14098,32486 14098,38711 14098,44457 14098,44458 14098,46129 14098,49003 14098,58822 14098,60081 14098,67867 14098,94753 14098,94961 14098,101741 14098,106086 14098,123811 14098,172668 14098,213931 14098,217485 14098,217899 14098,234785 14100,1985 14100,14101 14100,31254 14100,58476 14100,59653 14100,66529 14100,67108 14100,100237 14100,174800 14100,182878 14100,183466 14100,195081 14103,640 14104,599 14105,760 14107,1313 14108,868 14110,634 14111,346 14111,393 14111,435 14111,439 14111,457 14111,622 14111,934 14111,980 14111,1033 14111,1068 14111,1181 14111,1294 14111,1776 14111,1803 14111,1849 14111,1877 14111,6654 14111,6966 14111,13486 14113,261 14113,118336 14114,298 14115,485 14116,1634 14119,163 14119,252 14119,301 14120,20 14121,818 14121,1085 14122,366 14122,500 14123,772 14123,850 14123,1332 14125,355 14127,143 14128,392 14128,433 14128,467 14128,1634 14129,14130 14131,140 14132,58 14132,801 14132,1140 14132,1177 14133,818 14133,1212 14133,1807 14133,1955 14133,2775 14134,134 14134,225 14134,364 14134,431 14134,510 14135,1688 14136,779 14136,841 14136,1515 14136,23991 14137,14138 14139,1359 14139,1564 14139,1785 14140,1531 14141,248 14142,163 14143,163 14144,1767 14145,20 14145,56 14145,184 14145,685 14145,1623 14145,1634 14145,1888 14145,2460 14146,671 14148,1257 14149,862 14150,147 14150,211 14150,503 14150,516 14150,1266 14150,2105 14151,140 14152,346 14152,439 14153,602 14153,620 14153,8244 14154,136 14154,225 14154,248 14154,252 14154,557 14154,1368 14154,41170 14155,104 14155,1210 14155,1745 14155,1785 14155,2205 14155,2206 14155,2286 14155,2995 14155,33424 14156,289 14156,290 14156,372 14156,805 14156,2205 14156,2206 14156,94134 14157,2424 14158,167 14158,818 14158,1287 14158,1326 14158,1849 14158,2979 14159,1454 14160,3422 14161,1058 14162,1631 14163,535 14164,2105 14165,1616 14166,149 14166,406 14167,140 14168,920 14169,602 14169,620 14170,422 14171,422 14172,422 14173,422 14174,422 14175,422 14176,422 14177,2105 14178,422 14179,579 14179,1227 14179,1229 14179,1252 14179,1253 14179,86416 14180,422 14181,1370 14183,34 14183,289 14183,290 14183,352 14183,590 14183,1181 14183,1204 14183,1433 14183,1462 14183,1825 14183,1844 14183,14184 14183,94134 14183,144988 14185,292 14185,462 14186,435 14186,1033 14187,994 14187,3816 14187,3817 14188,10 14188,292 14188,1707 14189,143 14190,211 14191,1052 14191,1127 14191,1639 14191,1893 14191,2312 14192,1359 14193,10 14193,104 14193,107 14193,441 14193,609 14193,749 14193,999 14193,1001 14193,1146 14193,1388 14193,2209 14194,140 14195,1285 14196,126 14196,397 14196,557 14196,1293 14196,1326 14196,2617 14196,75912 14197,202 14197,203 14198,337 14199,1579 14200,1639 14201,346 14202,577 14202,788 14203,252 14205,1436 14206,1522 14207,1309 14208,261 14209,138 14209,1462 14209,1745 14209,8537 14210,143 14212,1276 14213,690 14213,2617 14213,4355 14214,422 14215,422 14216,1007 14217,859 14218,392 14220,1844 14220,2867 14220,22880 14221,315 14222,58 14222,1453 14223,143 14225,1033 14226,2244 14228,1127 14229,1776 14230,14231 14231,26 14231,59 14231,3794 14231,14230 14231,33107 14231,45744 14231,172367 14232,259 14232,272 14232,393 14232,788 14232,849 14232,4545 14232,139010 14233,328 14233,439 14233,440 14233,622 14233,1033 14233,1531 14233,1590 14233,1659 14234,140 14235,219 14236,390 14236,534 14236,589 14237,217 14237,536 14237,1072 14237,1801 14237,2421 14238,143 14239,433 14240,1877 14242,104 14242,557 14242,953 14242,954 14242,5405 14243,240 14243,301 14243,1285 14244,72 14245,65 14246,167 14246,240 14246,536 14246,187176 14248,143 14249,1454 14250,907 14250,932 14251,1424 14252,14253 14252,100223 14252,106304 14254,5265 14255,433 14256,3507 14257,163 14259,163 14260,1858 14261,592 14262,83 14263,4 14263,5 14263,298 14264,2083 14264,3218 14265,72 14266,22 14267,417 14268,2224 14269,2424 14270,301 14271,13980 14272,2779 14273,581 14274,14275 14276,1323 14277,102 14278,1326 14279,408 14280,1082 14280,1474 14281,500 14282,298 14283,485 14284,143 14287,97 14288,1058 14289,336 14290,861 14290,1284 14290,1300 14290,1949 14290,3630 14291,143 14292,868 14293,209 14294,3623 14295,1132 14295,191860 14296,3 14297,264 14297,338 14297,360 14297,515 14297,652 14297,835 14297,872 14297,1052 14297,1224 14297,1289 14297,1659 14297,1893 14297,1968 14297,21408 14298,163 14299,1070 14300,422 14301,56 14302,30 14302,694 14302,1201 14302,1388 14302,142430 14302,142473 14302,142879 14302,150529 14304,287 14304,433 14304,467 14304,1634 14305,1133 14306,422 14307,143 14308,3967 14309,58 14310,46 14311,222 14311,390 14311,567 14311,589 14311,1326 14312,491 14312,788 14312,801 14312,1559 14313,1805 14314,312 14315,403 14316,4 14316,5 14316,355 14316,527 14316,743 14316,4810 14316,8714 14316,13704 14316,64036 14316,95583 14317,302 14318,143 14320,2775 14321,447 14322,227 14323,1265 14323,1266 14324,515 14325,1715 14326,8798 14327,417 14328,1231 14329,622 14330,7572 14331,4549 14332,2266 14333,1467 14334,9098 14335,2557 14336,6955 14337,1359 14338,1882 14339,919 14340,5987 14341,973 14342,1429 14343,3474 14344,1449 14345,50 14345,1515 14346,536 14347,366 14348,657 14349,4411 14350,1007 14350,3999 14351,5358 14351,14352 14352,5358 14352,14352 14352,224666 14353,292 14353,397 14353,745 14353,1572 14353,3538 14353,3830 14353,16153 14355,6661 14356,143 14357,509 14358,309 14358,310 14358,536 14358,694 14358,818 14358,1019 14358,1085 14358,1181 14358,1417 14358,1580 14358,1659 14358,2480 14358,14368 14358,31206 14358,75912 14358,138686 14359,592 14359,1818 14361,1400 14361,4805 14362,14363 14364,332 14365,14366 14366,14366 14369,536 14369,4672 14371,261 14371,710 14371,726 14373,26 14373,59 14373,1235 14373,1335 14374,1688 14375,1 14375,147 14375,158 14375,160 14375,285 14375,292 14375,424 14375,485 14375,920 14375,934 14375,996 14375,1010 14375,2373 14375,2784 14375,3623 14375,3695 14375,5375 14375,16687 14375,204121 14376,592 14377,2681 14378,1033 14378,189128 14379,1844 14379,3507 14380,346 14380,435 14380,447 14381,907 14381,2191 14382,1127 14384,222 14384,389 14384,657 14384,5343 14385,685 14385,900 14386,3115 14387,843 14388,111 14388,1096 14388,2704 14388,3555 14390,1619 14390,1623 14390,18535 14393,934 14394,859 14395,1590 14396,106 14396,346 14396,1068 14396,1370 14396,3718 14396,24659 14396,43005 14396,189128 14396,189130 14396,189854 14396,189879 14396,190492 14396,193101 14396,194483 14396,212914 14396,217894 14396,222036 14396,227229 14396,235816 14397,315 14398,240 14399,346 14399,671 14400,652 14400,1659 14401,932 14402,1 14402,149 14402,2105 14404,420 14405,240 14406,134 14408,72 14409,54 14410,217 14410,222 14410,1417 14411,599 14411,1085 14412,581 14414,510 14414,760 14414,949 14414,1143 14414,1149 14414,1241 14414,1293 14414,1370 14414,1411 14414,2496 14415,693 14415,4980 14416,1509 14417,225 14417,248 14417,1332 14417,5405 14418,805 14419,415 14421,781 14422,980 14423,1453 14423,1572 14423,2697 14423,14458 14424,723 14425,79 14425,6424 14425,28107 14426,37 14426,106 14426,283 14426,328 14426,390 14426,455 14426,518 14426,934 14426,1010 14426,1068 14426,1177 14426,1309 14426,1370 14426,1454 14426,1479 14426,1801 14426,1837 14426,2480 14426,2590 14426,2620 14427,206 14428,315 14428,346 14428,435 14428,996 14428,1033 14428,1849 14428,1877 14428,2353 14428,6654 14428,13486 14428,21442 14428,32784 14429,1531 14430,19 14430,135 14430,340 14430,611 14430,887 14430,994 14430,2750 14430,6387 14430,14434 14430,75912 14431,718 14431,1188 14432,79 14432,192 14432,425 14432,663 14432,664 14432,861 14432,1149 14433,147 14433,192 14433,195 14433,336 14433,1381 14433,6119 14434,192 14434,9379 14434,36972 14434,37261 14434,47389 14434,55279 14434,55294 14434,55304 14434,96305 14434,99256 14434,102093 14435,344 14436,1776 14437,760 14439,1146 14440,615 14441,417 14442,1983 14443,920 14444,289 14444,290 14444,1149 14444,94134 14445,147 14445,158 14446,147 14446,422 14449,1010 14449,1122 14450,1282 14451,485 14452,163 14452,209 14452,302 14452,579 14452,4453 14454,143 14455,620 14456,503 14456,818 14456,1635 14457,192 14457,309 14457,310 14457,435 14457,4678 14457,14458 14460,222 14460,827 14460,934 14460,1564 14460,75912 14461,1425 14462,163 14462,489 14463,1977 14463,1978 14464,634 14466,219 14467,195 14467,356 14468,195 14468,356 14469,973 14469,3474 14470,690 14470,1433 14471,71 14471,14472 14473,596 14474,332 14475,349 14476,1402 14476,2286 14477,808 14479,349 14480,2105 14481,1191 14482,294 14482,431 14482,631 14482,784 14482,1353 14483,175 14483,663 14483,664 14483,693 14483,21171 14483,30999 14483,57002 14483,62988 14483,127104 14483,129784 14484,240 14484,301 14484,406 14484,1298 14485,1509 14486,634 14486,2867 14486,22880 14487,760 14487,1119 14487,1149 14487,1285 14487,1631 14488,3138 14489,911 14490,147 14490,1515 14490,8308 14490,240174 14491,703 14491,1453 14492,538 14492,1877 14493,1033 14494,389 14494,392 14494,697 14494,2045 14494,2699 14494,3260 14495,390 14496,83 14497,972 14497,1010 14497,1298 14497,1849 14498,167 14498,207 14498,631 14498,1210 14500,704 14500,1212 14500,1282 14501,65 14501,171 14501,957 14502,149 14502,158 14503,22 14503,457 14503,1363 14503,1805 14504,4611 14505,1544 14506,1531 14508,4611 14509,1544 14510,3148 14511,63 14511,72 14511,163 14511,222 14511,233 14511,252 14511,304 14511,326 14511,340 14511,408 14511,422 14511,491 14511,605 14511,620 14511,626 14511,652 14511,671 14511,682 14511,703 14511,726 14511,733 14511,749 14511,808 14511,1052 14511,1309 14511,1313 14511,1319 14511,1368 14511,1381 14511,1425 14511,1434 14511,1465 14511,1608 14511,1634 14511,1644 14511,1707 14511,2315 14511,3218 14511,3451 14511,3474 14511,4771 14511,28294 14511,72439 14514,2178 14514,4545 14515,273 14515,274 14516,225 14516,248 14516,450 14516,850 14516,1332 14516,2596 14516,5405 14517,222 14517,1639 14518,515 14518,652 14518,1893 14520,287 14520,1707 14521,4190 14522,182 14522,188 14522,206 14522,4453 14523,2315 14524,372 14524,760 14524,1149 14524,1631 14525,3258 14525,4903 14526,697 14528,1458 14529,111 14529,1462 14529,8537 14530,269 14531,710 14531,1893 14532,932 14533,1146 14533,1363 14534,192 14535,364 14536,104 14536,1801 14537,1467 14538,760 14539,557 14540,500 14540,718 14541,83 14541,285 14541,349 14541,442 14541,626 14541,634 14541,949 14541,1012 14541,1274 14541,1465 14541,1467 14541,1881 14541,2646 14541,2779 14541,2784 14541,9015 14541,28130 14543,323 14543,647 14543,14550 14543,75339 14544,304 14546,22 14546,818 14546,861 14547,332 14548,22 14548,861 14548,893 14549,673 14551,972 14552,272 14554,240 14554,592 14554,1001 14554,1085 14555,14556 14556,4166 14556,45373 14556,45679 14556,113506 14556,164826 14556,221547 14557,389 14558,13575 14559,1871 14560,366 14561,252 14562,406 14564,364 14564,431 14565,58 14565,309 14565,310 14565,314 14565,450 14565,626 14565,1046 14565,1085 14565,1140 14565,1284 14565,6556 14565,7155 14566,50 14567,79 14567,1767 14568,83 14569,163 14569,360 14569,489 14569,1559 14570,50 14570,99 14570,779 14572,301 14572,388 14572,518 14572,775 14572,972 14572,1001 14572,1326 14572,1522 14572,1849 14572,2646 14572,48505 14572,148742 14573,163 14573,171 14573,305 14573,447 14573,489 14573,1132 14574,1531 14575,626 14576,392 14577,202 14577,203 14577,1149 14577,1631 14578,202 14578,1419 14578,2436 14579,872 14580,356 14580,3207 14581,264 14582,760 14582,81070 14583,406 14584,50 14585,14586 14587,1564 14588,171 14588,957 14588,1815 14589,87 14589,192 14589,518 14589,634 14589,660 14589,740 14589,741 14589,811 14589,996 14589,1052 14589,1267 14589,1509 14589,3474 14589,21944 14589,187176 14589,204093 14590,14591 14592,140 14592,360 14592,462 14592,467 14592,872 14592,1127 14592,1893 14594,163 14595,86 14595,167 14595,240 14595,301 14595,372 14595,567 14595,589 14595,605 14595,615 14595,631 14595,720 14595,801 14595,907 14595,968 14595,972 14595,973 14595,1010 14595,1122 14595,1124 14595,1140 14595,1167 14595,1231 14595,1241 14595,1284 14595,1298 14595,1309 14595,1436 14595,1522 14595,1544 14595,1564 14595,1782 14595,1785 14595,1818 14595,1837 14595,1849 14595,1893 14595,1955 14595,2083 14595,2191 14595,2372 14595,2557 14595,2620 14595,2979 14595,3193 14595,3207 14595,3218 14597,134 14597,240 14597,299 14597,332 14597,372 14597,390 14597,431 14597,631 14597,873 14597,1082 14597,1085 14597,1119 14597,1122 14597,1849 14597,1955 14597,2557 14597,2775 14597,6068 14598,37 14598,663 14598,664 14598,968 14598,972 14598,1293 14598,3422 14600,720 14600,907 14600,1117 14601,1289 14602,171 14603,372 14603,417 14603,932 14603,1082 14603,1085 14603,1285 14603,1564 14603,1785 14603,1818 14603,1955 14603,2205 14603,2296 14603,2620 14603,5718 14603,33424 14604,222 14605,11 14605,63 14605,107 14605,160 14605,207 14605,264 14605,272 14605,273 14605,294 14605,302 14605,376 14605,515 14605,713 14605,733 14605,736 14605,877 14605,968 14605,1010 14605,1058 14605,1122 14605,1298 14605,1381 14605,1572 14605,1579 14605,1634 14605,1767 14605,1881 14605,2191 14605,2372 14605,2668 14605,2750 14605,3194 14605,4549 14605,6298 14605,143287 14606,4455 14607,422 14608,56 14609,422 14610,56 14611,2051 14612,217 14612,313 14612,536 14612,2646 14612,2784 14612,4672 14612,18831 14613,240 14613,1309 14614,301 14615,1167 14615,1544 14616,579 14617,58 14617,801 14617,1140 14617,5547 14618,8854 14619,1467 14620,911 14621,809 14622,1181 14623,1417 14624,843 14625,292 14625,1058 14625,14650 14626,932 14627,1425 14629,140 14630,2205 14630,2206 14630,33424 14630,245910 14631,687 14631,1556 14632,1385 14634,1058 14635,323 14635,1052 14635,1659 14635,2051 14636,444 14636,563 14636,1133 14636,188791 14637,147 14637,158 14637,195 14637,336 14638,254 14638,557 14638,954 14638,1939 14639,1603 14640,861 14641,1212 14642,2557 14643,809 14644,518 14644,801 14644,1140 14645,65 14645,66 14645,571 14646,227 14646,323 14646,736 14646,3138 14648,919 14649,117 14649,1227 14649,1229 14649,2712 14649,21944 14650,1247 14650,109503 14651,868 14651,1433 14651,156379 14653,949 14654,66 14655,996 14656,107 14656,338 14656,1052 14656,2312 14656,2367 14657,1143 14658,712 14658,798 14658,1172 14658,1434 14658,14674 14659,2146 14660,623 14661,1893 14662,72 14663,516 14663,3182 14663,4355 14664,206 14665,314 14665,392 14665,644 14665,1363 14666,147 14667,356 14667,1955 14669,20 14670,254 14671,219 14672,195 14672,779 14673,247 14674,256 14674,457 14674,481 14674,911 14674,1014 14674,1452 14674,1479 14674,8419 14674,9015 14674,30299 14676,264 14677,717 14677,784 14678,1429 14679,788 14680,992 14682,34 14682,35 14682,313 14682,634 14682,852 14682,1313 14682,1718 14682,2224 14682,2646 14682,5326 14682,5547 14683,697 14684,347 14685,4 14685,5 14685,355 14686,195 14687,171 14688,433 14689,433 14690,1454 14691,151 14692,255 14693,1962 14694,390 14695,302 14696,184 14697,273 14697,274 14698,1551 14699,143 14700,406 14700,779 14700,1515 14700,68069 14701,3193 14702,509 14703,932 14704,1007 14705,41 14705,1012 14706,1639 14707,192 14708,1231 14709,586 14710,622 14711,178 14712,1590 14713,671 14714,515 14715,346 14716,439 14717,333 14718,1749 14718,3585 14718,14719 14722,346 14723,41 14723,1285 14723,1462 14723,3135 14723,8537 14724,1454 14725,392 14725,1151 14725,1363 14726,97 14726,211 14726,406 14726,17886 14727,872 14728,34 14728,35 14728,366 14728,390 14728,749 14728,918 14728,1146 14729,333 14729,4193 14730,261 14730,3115 14730,32751 14731,7416 14732,34 14732,35 14732,217 14732,389 14732,536 14732,1618 14733,861 14734,280 14734,17245 14735,206 14735,2073 14735,2626 14736,143 14737,599 14738,483 14739,538 14739,1294 14740,718 14741,515 14741,652 14741,1052 14741,2312 14742,536 14743,781 14744,349 14745,1858 14746,1860 14747,3 14747,240 14747,390 14747,592 14747,968 14748,872 14749,86 14749,184 14749,273 14749,274 14749,292 14749,1010 14750,309 14750,310 14751,6068 14751,6803 14752,663 14752,664 14753,1133 14754,1326 14756,147 14757,1801 14758,873 14759,50 14760,135 14760,1282 14761,22 14761,302 14761,861 14762,577 14763,14764 14763,44658 14763,77146 14763,88855 14763,94577 14763,95296 14763,95773 14763,96458 14763,97039 14763,99462 14763,99800 14763,100393 14763,104914 14765,302 14765,687 14765,861 14765,893 14765,1556 14766,2411 14767,7 14767,202 14767,269 14767,285 14767,356 14767,358 14767,467 14767,640 14767,843 14767,2620 14767,9015 14767,147123 14768,248 14768,450 14768,717 14768,1332 14769,143 14770,143 14771,1411 14772,217 14772,536 14773,8798 14774,5662 14775,1849 14776,1715 14777,417 14778,1955 14779,1231 14780,752 14781,1564 14782,5718 14783,2083 14784,2620 14785,390 14786,1837 14787,3422 14788,589 14789,1241 14790,6068 14791,233 14792,3 14793,1001 14794,240 14795,63 14796,14797 14798,577 14799,192 14799,289 14799,631 14799,94134 14799,143287 14800,163 14801,592 14802,3555 14803,586 14804,247 14805,736 14806,65 14806,252 14807,72 14808,151 14809,147 14810,14811 14810,40108 14812,14811 14813,14811 14814,14811 14815,302 14816,852 14816,980 14818,143 14820,104 14820,120 14820,225 14820,694 14820,784 14820,1001 14820,1353 14820,2572 14820,2775 14820,3585 14820,3623 14821,424 14822,1983 14823,14811 14824,3724 14825,920 14826,1571 14827,1 14828,301 14828,968 14829,79 14829,192 14829,1392 14830,79 14830,192 14830,202 14830,203 14830,336 14830,1619 14830,1623 14831,447 14831,788 14832,376 14834,697 14835,3260 14836,5101 14837,364 14838,827 14841,14842 14843,247 14844,136 14845,184 14846,1608 14847,872 14848,72 14850,215 14851,14852 14854,192 14855,770 14856,313 14856,1052 14856,2421 14857,1313 14858,4 14858,5 14859,233 14860,83 14861,2671 14862,1181 14865,808 14867,500 14868,1962 14869,1052 14870,1882 14871,2775 14872,54 14873,2210 14873,4237 14874,240 14874,818 14875,272 14876,430 14877,14878 14879,1235 14879,1335 14880,920 14881,2506 14882,140 14883,267 14884,146 14885,1858 14886,6424 14886,14887 14886,40958 14888,14887 14888,40958 14889,1860 14890,346 14891,32 14891,392 14891,644 14891,697 14891,875 14891,1151 14892,48 14893,1078 14894,346 14895,479 14896,14897 14896,73218 14898,557 14899,557 14900,1509 14901,13661 14902,2782 14903,481 14904,390 14905,50 14905,14906 14905,95898 14908,347 14909,376 14910,885 14911,79 14911,704 14911,1433 14912,424 14913,158 14913,301 14913,392 14913,406 14913,779 14913,1454 14914,79 14915,160 14915,1130 14916,37 14916,301 14916,1231 14916,1782 14917,217 14917,663 14917,664 14917,779 14917,809 14917,920 14917,1033 14917,1181 14917,1414 14917,2889 14917,5440 14918,264 14918,1007 14918,1010 14918,3041 14918,5440 14919,1151 14919,3585 14920,3585 14921,22 14922,455 14922,1019 14922,18831 14923,273 14923,274 14924,968 14924,1544 14924,1955 14924,2083 14925,694 14925,3623 14926,417 14926,525 14926,805 14926,1085 14926,1140 14926,1749 14926,1818 14926,2286 14927,298 14928,485 14929,143 14929,1052 14930,146 14931,1247 14932,3297 14933,247 14934,332 14934,1454 14935,827 14936,143 14937,1370 14938,158 14939,97 14940,302 14941,346 14942,3507 14943,1844 14944,219 14945,225 14945,1893 14945,4294 14946,1433 14947,309 14947,310 14948,58 14949,861 14950,50 14951,163 14952,364 14952,431 14953,298 14954,485 14955,143 14956,211 14957,652 14958,731 14959,731 14960,731 14961,749 14961,1146 14962,1858 14963,1860 14964,143 14965,392 14966,493 14967,366 14967,571 14968,15 14969,862 14970,299 14971,14972 14971,117338 14973,72 14974,66 14975,30 14975,328 14975,1179 14976,72 14977,346 14978,2506 14979,3653 14980,72 14981,143 14982,417 14983,14984 14985,1151 14986,97 14987,389 14987,455 14987,805 14987,1718 14987,1756 14987,28130 14988,3846 14988,14989 14989,14989 14990,294 14991,1204 14992,94 14992,2787 14993,536 14994,309 14994,310 14995,14996 14997,2784 14997,4903 14998,104 14998,248 14999,65 15000,163 15001,452 15002,50 15002,1414 15003,1247 15004,1556 15005,2620 15006,2506 15007,163 15008,2436 15009,424 15011,72 15012,920 15013,2506 15014,430 15015,920 15016,682 15017,536 15017,781 15017,4672 15017,18831 15018,626 15019,72 15020,301 15020,968 15021,163 15022,200 15022,278 15022,1072 15022,1836 15022,1871 15022,2421 15022,3585 15023,1007 15024,784 15025,2146 15025,15026 15025,39168 15025,51721 15025,57087 15025,63654 15025,72120 15025,100470 15025,115315 15027,116 15027,994 15027,2087 15027,2590 15028,54 15028,5906 15029,15030 15031,366 15032,264 15033,143 15034,602 15035,424 15036,1363 15037,72 15038,72 15039,1515 15040,301 15040,717 15040,1231 15040,1740 15040,1782 15041,652 15042,72 15043,15044 15045,48 15045,175 15045,275 15045,277 15045,704 15045,1085 15045,1247 15045,1452 15045,2782 15045,48955 15045,135585 15045,164572 15046,424 15047,422 15047,589 15048,424 15049,81 15050,292 15050,795 15050,3804 15051,1515 15052,298 15053,485 15054,50 15054,399 15054,758 15054,1844 15054,3999 15055,251 15056,392 15057,15058 15059,15060 15059,38719 15061,149 15061,622 15061,973 15061,1010 15061,1298 15061,1436 15061,5662 15062,349 15063,1001 15064,178 15064,346 15065,15066 15067,58 15067,118 15067,272 15067,273 15067,328 15067,422 15067,647 15067,1179 15067,1353 15067,1425 15067,3115 15067,4597 15067,15068 15069,233 15070,346 15071,15072 15073,66 15073,1284 15073,1544 15074,726 15074,859 15075,15076 15077,9343 15077,176782 15078,248 15078,450 15078,1332 15079,104 15080,15081 15080,93608 15080,113926 15082,1968 15083,146 15084,1858 15085,1860 15086,222 15086,278 15087,211 15087,333 15088,3 15089,337 15089,505 15090,4222 15091,104 15091,138 15091,850 15092,1858 15093,1860 15095,7757 15096,379 15096,1454 15096,21982 15097,2812 15098,336 15098,422 15098,21442 15100,1085 15101,1559 15102,79 15103,760 15105,302 15105,861 15107,289 15107,290 15107,304 15107,328 15107,1715 15107,1962 15108,425 15109,41 15109,186 15109,431 15109,444 15109,518 15109,589 15109,673 15109,685 15109,764 15109,775 15109,795 15109,852 15109,973 15109,1001 15109,1011 15109,1085 15109,1172 15109,1326 15109,1580 15109,1732 15109,2209 15109,3422 15109,3804 15109,5961 15109,23437 15109,75912 15109,188791 15110,1052 15111,1265 15111,1266 15111,7652 15112,175 15112,285 15112,779 15112,875 15112,1425 15112,1515 15112,8055 15113,663 15113,664 15113,1370 15113,2260 15113,2782 15113,8244 15113,92476 15113,106502 15114,149 15114,406 15115,77 15115,489 15115,595 15115,1070 15115,1634 15115,1707 15115,1984 15116,2045 15117,818 15117,1285 15118,1509 15120,8854 15121,500 15122,1962 15123,1052 15124,1882 15125,2775 15126,54 15127,2210 15127,4237 15128,685 15128,827 15129,644 15130,493 15131,130 15132,163 15133,758 15134,255 15135,775 15135,1411 15135,5130 15136,15137 15136,21851 15138,2784 15139,58 15140,46 15141,178 15141,346 15141,439 15141,447 15141,611 15141,622 15141,671 15141,1033 15141,1294 15141,1590 15141,1644 15141,1849 15141,1877 15141,6661 15141,6662 15141,13486 15141,32784 15141,172181 15142,775 15143,65 15143,333 15143,346 15144,698 15145,1511 15145,3069 15146,934 15146,1877 15147,1511 15147,3069 15148,1068 15149,1511 15149,3069 15151,2210 15151,4237 15152,1607 15153,781 15154,422 15155,1 15155,1425 15155,1623 15155,3769 15155,6837 15155,30331 15156,346 15157,433 15158,640 15159,852 15159,1284 15159,1732 15159,148742 15160,595 15160,1146 15161,306 15161,307 15162,1 15163,104 15163,134 15163,135 15164,1564 15164,1785 15165,1858 15166,1860 15167,433 15170,2991 15171,278 15171,389 15171,455 15171,808 15172,298 15173,485 15174,1345 15175,1858 15176,1860 15177,106 15178,1707 15179,3724 15179,7921 15179,15988 15179,46726 15179,47522 15179,52383 15179,58871 15179,116709 15179,152687 15179,153449 15179,155032 15179,191423 15179,203911 15179,230590 15179,235953 15179,253767 15180,1634 15181,163 15183,77 15183,332 15183,389 15183,631 15183,1167 15183,1298 15183,1466 15183,2512 15183,2979 15184,425 15185,1888 15186,366 15186,389 15186,536 15186,577 15186,671 15186,673 15186,784 15186,872 15186,1007 15186,1033 15186,1052 15186,1105 15186,1436 15186,1474 15186,1539 15186,1608 15186,1644 15186,1707 15186,1849 15186,3769 15186,5213 15186,6789 15186,21944 15186,30331 15186,143287 15186,207837 15187,707 15188,147 15189,397 15189,503 15189,1149 15190,1607 15191,634 15192,99 15193,315 15194,1179 15195,467 15196,447 15197,389 15197,536 15198,781 15199,65 15199,868 15199,1433 15200,408 15201,452 15202,720 15202,1284 15203,147 15203,972 15204,2051 15204,49057 15205,72 15206,68 15206,314 15206,1119 15206,127158 15207,392 15207,1240 15208,861 15209,34 15209,35 15209,536 15209,14126 15210,622 15210,4691 15211,273 15211,274 15211,66754 15213,259 15214,389 15215,140 15215,264 15215,360 15215,515 15215,736 15215,835 15215,1267 15215,1381 15215,1509 15215,1968 15215,49057 15216,333 15217,81 15217,3507 15218,22 15218,314 15219,15220 15221,104 15221,215 15221,1085 15221,2205 15221,2206 15223,1849 15223,32784 15224,2995 15225,687 15225,1556 15226,999 15227,356 15227,1309 15228,309 15228,310 15229,106 15229,146 15229,289 15229,290 15229,620 15229,647 15229,663 15229,664 15229,714 15229,1149 15229,1370 15229,1425 15229,2260 15229,2674 15229,2782 15229,8244 15229,106502 15231,206 15234,41 15234,379 15234,772 15234,3474 15234,5908 15236,957 15236,1247 15236,1815 15237,346 15238,439 15239,4637 15241,527 15241,8072 15242,1452 15243,1220 15243,1222 15244,72 15245,217 15245,1417 15245,1881 15246,72 15247,15248 15249,379 15249,385 15249,2779 15249,5933 15250,143 15251,1433 15252,26 15252,59 15253,160 15253,481 15253,973 15253,1058 15253,1243 15253,1807 15255,1858 15256,1860 15257,920 15258,192 15258,346 15258,1181 15258,5726 15259,1001 15259,1085 15259,73570 15259,75912 15260,1983 15261,149 15261,217 15262,65 15263,1188 15265,500 15266,1858 15267,1860 15268,626 15269,717 15270,726 15270,859 15271,431 15272,907 15272,1082 15272,1284 15272,1715 15272,148742 15273,287 15274,515 15275,147 15275,1172 15275,1433 15275,1844 15276,158 15277,47 15277,104 15277,167 15277,240 15277,294 15277,459 15277,518 15277,631 15277,775 15277,818 15277,973 15277,1012 15277,1085 15277,1119 15277,1282 15277,1300 15277,1411 15277,1415 15277,1715 15277,1745 15277,2089 15277,2205 15277,2206 15277,2469 15277,2940 15277,4237 15277,5130 15277,21603 15277,21944 15277,23287 15277,127158 15277,136072 15277,171641 15277,178576 15278,1181 15279,515 15279,1052 15279,1893 15279,2312 15279,6695 15280,158 15280,206 15280,4193 15280,21442 15281,832 15282,980 15282,1014 15283,120 15283,3115 15284,1323 15285,102 15286,1326 15287,408 15288,1644 15289,660 15290,479 15290,534 15290,535 15290,862 15290,75912 15291,3630 15292,11 15292,134 15293,292 15293,852 15294,515 15295,1298 15297,422 15298,1977 15298,1978 15299,298 15300,250 15300,887 15300,1684 15301,485 15302,2051 15302,49057 15303,1240 15303,2253 15303,6424 15304,106 15304,146 15304,620 15304,647 15304,663 15304,664 15304,1370 15304,2260 15304,2782 15304,8244 15304,106502 15305,104 15305,135 15307,143 15308,182 15308,188 15308,206 15308,4453 15309,3089 15310,1172 15311,72 15312,393 15312,980 15312,1821 15313,130 15313,186 15313,264 15313,333 15313,663 15313,664 15313,808 15313,1551 15313,9457 15314,136 15315,1707 15316,1117 15317,312 15317,420 15318,1436 15319,147 15319,192 15319,195 15320,254 15321,795 15322,72 15323,5440 15324,20 15325,34 15325,167 15325,222 15325,338 15325,657 15325,1019 15325,1285 15325,2266 15326,647 15326,736 15326,835 15326,1289 15326,1509 15326,1659 15326,2292 15327,72 15328,3161 15328,8270 15330,147 15330,158 15330,175 15330,406 15330,505 15330,1181 15330,1298 15330,118336 15331,3193 15332,146 15332,17593 15332,92476 15333,1531 15334,111 15334,503 15334,805 15334,1149 15334,1462 15334,8537 15335,289 15335,290 15336,217 15336,479 15336,893 15336,1118 15336,1659 15336,2367 15336,19356 15337,104 15337,134 15338,302 15338,579 15339,111 15339,264 15339,292 15339,462 15339,745 15339,1147 15339,1151 15339,1631 15339,1688 15339,2209 15339,3695 15339,4039 15340,79 15340,406 15340,6279 15342,1858 15343,1860 15345,447 15345,671 15345,6119 15346,135 15347,15 15349,163 15350,86 15350,1204 15350,1243 15350,1559 15351,7 15352,660 15352,891 15353,626 15353,3193 15354,79 15354,693 15354,1718 15355,346 15355,439 15355,1033 15355,1294 15355,1474 15355,1849 15355,6661 15356,1381 15357,248 15359,712 15360,710 15360,1893 15361,143 15362,442 15362,592 15362,1745 15363,1243 15363,4355 15364,707 15365,192 15365,195 15369,137 15370,1235 15370,1335 15371,26 15371,41 15371,58 15371,59 15371,151 15371,264 15371,309 15371,310 15371,328 15371,344 15371,390 15371,439 15371,455 15371,538 15371,779 15371,872 15371,877 15371,1289 15371,1381 15371,1436 15371,1452 15371,1474 15371,1544 15371,2312 15371,3695 15371,16687 15371,227669 15372,15373 15374,515 15375,50 15376,557 15377,135 15378,994 15379,346 15380,167 15380,852 15380,1300 15380,1319 15380,2083 15380,3630 15381,99 15382,83 15382,356 15384,252 15384,1220 15384,1222 15385,1425 15386,1429 15386,1531 15386,1572 15386,1688 15387,20 15388,192 15388,2607 15389,1070 15390,1858 15391,1860 15392,907 15392,932 15393,563 15394,65 15394,687 15394,1556 15395,2312 15396,143 15397,104 15397,120 15397,389 15397,590 15397,760 15397,805 15397,1011 15397,1149 15397,1204 15397,1402 15397,1631 15397,1818 15397,1973 15397,2417 15398,1127 15399,302 15400,2073 15401,500 15402,346 15403,1400 15405,15406 15407,160 15407,186 15407,264 15407,338 15407,515 15407,801 15407,808 15407,991 15407,1052 15407,1118 15407,1127 15407,1147 15407,1224 15407,1381 15407,1893 15407,2260 15407,2312 15407,49057 15407,81070 15408,336 15408,1803 15408,21442 15409,1298 15411,932 15412,264 15412,1224 15412,1659 15412,1893 15413,104 15413,491 15413,943 15413,1085 15413,1579 15413,1659 15413,1745 15413,2089 15413,2205 15413,2940 15413,21944 15413,33424 15413,35486 15414,211 15415,15416 15415,16255 15417,505 15417,874 15417,918 15417,1240 15417,1603 15417,2253 15418,7 15418,202 15418,203 15419,1276 15420,827 15421,1133 15422,360 15423,1392 15423,1531 15423,1796 15424,104 15424,134 15424,240 15424,289 15424,372 15424,1012 15424,2209 15424,8276 15424,9025 15424,94134 15424,127158 15425,503 15426,3474 15427,1313 15428,2979 15429,1983 15430,2979 15431,510 15431,697 15432,1983 15433,1276 15434,305 15435,2209 15436,3246 15436,3247 15438,289 15438,290 15438,298 15438,417 15438,2296 15439,1 15439,147 15439,149 15439,158 15439,184 15439,875 15439,2244 15439,21442 15439,21826 15439,220502 15440,178 15441,2312 15442,492 15442,2489 15442,3082 15442,14966 15442,15130 15442,15344 15442,20916 15442,28836 15442,41799 15443,298 15444,485 15445,945 15447,107 15447,1388 15448,130 15448,1147 15448,1381 15449,37 15449,1411 15450,195 15451,2646 15451,2944 15453,907 15453,932 15454,10 15454,186 15454,217 15454,818 15454,1844 15455,1858 15456,843 15457,1860 15458,852 15458,1151 15459,2105 15460,417 15461,146 15461,158 15461,192 15461,285 15461,336 15461,406 15461,620 15461,779 15461,1515 15461,1531 15462,1388 15463,852 15463,3630 15464,15465 15466,493 15467,79 15467,707 15468,417 15469,726 15470,104 15470,134 15470,135 15470,136 15470,137 15470,138 15470,557 15470,1368 15470,1939 15470,2105 15471,781 15473,707 15474,186 15474,775 15474,3630 15474,5130 15475,364 15476,10 15478,217 15478,920 15478,1033 15478,1181 15479,586 15480,422 15481,422 15482,422 15483,422 15484,8270 15485,422 15486,1673 15487,163 15488,4411 15488,141912 15489,433 15490,1983 15491,422 15493,872 15493,1453 15493,1722 15493,3538 15493,127158 15494,19 15495,7 15498,1147 15499,1 15500,596 15501,596 15501,784 15501,2701 15502,278 15502,431 15503,1001 15504,298 15505,485 15506,596 15506,1052 15506,1368 15506,2416 15506,2417 15507,1151 15507,1363 15508,140 15508,264 15508,509 15509,151 15510,690 15511,1300 15511,5662 15512,2083 15513,107 15513,1149 15514,302 15515,254 15515,596 15516,111 15516,2931 15517,187 15517,330 15517,15518 15517,46585 15517,65330 15517,85341 15517,101134 15517,129318 15517,218868 15517,245308 15517,260456 15517,261295 15521,4411 15522,781 15523,685 15523,911 15523,75912 15524,907 15524,932 15525,510 15526,406 15528,485 15528,693 15529,417 15530,143 15531,996 15533,500 15534,1962 15535,1052 15536,1882 15537,2775 15538,54 15539,2210 15539,4237 15540,22 15540,302 15540,579 15540,861 15540,893 15540,1659 15540,4453 15541,417 15542,1858 15543,1860 15544,151 15545,1313 15545,15545 15546,26 15546,47 15546,59 15546,114 15546,884 15546,885 15546,886 15546,887 15546,1235 15546,1335 15546,1432 15546,1775 15546,2469 15546,2674 15546,21944 15547,10 15547,30 15547,175 15547,205 15547,313 15547,328 15547,693 15547,1773 15547,33437 15547,48955 15547,65492 15547,66058 15547,66061 15547,66678 15547,66683 15547,66832 15547,67128 15547,67429 15548,455 15548,1019 15549,931 15549,14458 15550,1087 15551,673 15552,175 15552,693 15553,30 15553,97 15553,446 15553,1033 15553,1179 15554,15555 15556,240 15556,332 15556,413 15556,661 15556,818 15556,819 15556,1347 15556,1623 15556,7891 15556,15556 15556,15557 15556,15585 15556,15624 15556,20505 15556,22312 15556,24614 15556,24669 15556,24811 15556,25005 15556,25585 15556,29037 15556,30523 15556,32611 15556,32682 15556,33486 15556,34159 15556,35689 15556,36104 15556,38248 15556,41564 15556,42011 15556,43548 15556,44163 15556,48184 15556,49202 15556,54445 15556,58214 15556,58945 15556,59831 15556,60565 15556,63411 15556,68035 15556,68060 15556,74573 15556,76143 15556,78812 15556,86659 15556,90261 15556,90271 15556,90308 15556,102227 15556,103216 15556,104512 15556,106982 15556,114042 15556,127158 15556,148313 15556,148818 15556,165339 15556,168349 15556,168462 15556,168892 15556,170740 15556,176465 15556,180392 15556,185927 15556,190428 15556,190444 15556,190449 15556,191952 15556,193636 15556,194213 15556,194479 15556,194522 15556,194535 15556,194645 15556,195545 15556,202635 15556,212451 15556,214043 15556,214138 15556,215386 15556,218003 15556,221831 15556,224653 15556,226514 15556,228159 15556,233709 15556,236269 15556,236271 15556,237118 15556,237120 15556,237121 15556,237861 15556,238762 15556,239045 15556,240063 15556,241336 15556,244633 15556,245576 15556,245579 15556,245580 15556,245581 15556,245582 15556,245588 15556,245595 15556,245601 15556,245615 15556,247058 15556,248835 15556,255036 15556,255067 15556,260900 15558,192 15559,137 15560,192 15560,211 15560,336 15560,366 15560,640 15560,949 15560,1177 15560,1623 15560,2775 15560,4571 15560,182162 15561,781 15562,120 15562,261 15562,389 15562,631 15562,1072 15562,1274 15562,1353 15562,1419 15562,19443 15563,315 15563,447 15563,538 15563,1294 15563,1877 15564,15565 15566,509 15566,510 15567,671 15571,328 15571,1179 15572,15573 15573,15573 15575,1240 15575,1653 15575,6638 15576,72 15577,596 15578,151 15579,254 15579,442 15579,503 15579,704 15579,1149 15579,1257 15581,34 15581,35 15581,347 15582,79 15582,314 15582,336 15582,446 15582,1370 15582,1566 15582,1707 15582,2253 15582,3367 15582,4066 15583,118 15583,4597 15584,269 15584,1634 15586,805 15587,779 15587,1353 15587,1623 15587,2373 15587,2775 15587,118336 15588,167 15588,301 15588,444 15588,968 15588,1293 15588,1300 15588,3630 15588,5662 15589,130 15589,1007 15590,83 15591,1860 15592,3612 15593,595 15594,2274 15595,392 15596,4760 15597,6059 15598,5658 15599,4252 15600,623 15601,697 15602,6955 15603,1782 15604,30 15604,120 15604,328 15604,1179 15604,1359 15604,1688 15605,1871 15606,15607 15608,160 15608,338 15608,360 15608,440 15608,515 15608,801 15608,809 15608,835 15608,872 15608,918 15608,931 15608,1001 15608,1052 15608,1118 15608,1127 15608,1151 15608,1267 15608,1566 15608,1579 15608,1659 15608,1893 15608,2051 15608,4039 15608,8149 15608,15609 15608,21589 15608,49057 15608,68069 15608,81070 15609,287 15609,392 15609,433 15609,623 15609,658 15609,809 15609,872 15609,1151 15609,1210 15609,1363 15609,1623 15609,4251 15609,18180 15609,18387 15609,84466 15609,90312 15609,95447 15609,110596 15609,131336 15609,177654 15609,212562 15610,10 15612,535 15612,595 15612,703 15612,1572 15612,1722 15612,3258 15613,206 15614,217 15615,5591 15616,893 15616,1556 15616,3769 15617,13919 15618,37 15618,71 15618,563 15618,611 15618,920 15618,1235 15618,1335 15618,1449 15620,873 15624,10 15624,175 15624,252 15624,275 15624,277 15624,663 15624,668 15625,13919 15626,473 15626,8149 15627,30 15627,248 15628,143 15630,1284 15631,1452 15632,1085 15634,143 15635,163 15635,433 15635,690 15635,1782 15636,192 15636,211 15636,309 15636,310 15636,516 15636,1181 15637,462 15638,1506 15639,349 15639,392 15639,4252 15640,1 15642,622 15642,868 15642,1559 15643,79 15644,20 15645,399 15646,30 15646,200 15647,19 15648,217 15648,240 15648,255 15648,515 15648,818 15648,819 15648,1370 15648,2235 15648,5073 15648,6895 15648,7731 15648,7891 15648,8662 15648,9689 15648,14064 15648,15648 15648,15649 15648,15656 15648,16438 15648,18804 15648,24916 15648,25043 15648,25047 15648,28268 15648,28501 15648,28545 15648,29866 15648,31207 15648,34777 15648,36258 15648,37147 15648,41970 15648,44145 15648,52164 15648,59100 15648,59851 15648,68418 15648,83371 15648,83488 15648,84182 15648,87340 15648,93134 15648,118490 15648,119416 15648,119634 15648,120907 15648,121951 15648,122137 15648,122207 15648,122324 15648,122422 15648,122425 15648,123355 15648,126053 15648,127428 15648,132068 15648,146885 15648,148391 15648,151059 15648,154820 15648,154891 15648,160451 15648,216538 15648,228363 15648,250403 15648,252224 15650,143 15651,356 15651,390 15652,1556 15653,120 15653,261 15653,1353 15653,1466 15653,2807 15653,2812 15654,22 15654,104 15654,134 15654,200 15654,227 15654,248 15654,264 15654,289 15654,290 15654,298 15654,392 15654,420 15654,557 15654,631 15654,636 15654,714 15654,805 15654,809 15654,1016 15654,1070 15654,1119 15654,1149 15654,1151 15654,1282 15654,1462 15654,1631 15654,1745 15654,1836 15654,1955 15654,1962 15654,2205 15654,2206 15654,2209 15654,8537 15654,22293 15654,33424 15654,94134 15655,312 15655,509 15655,510 15658,104 15658,107 15658,240 15658,248 15658,264 15658,441 15658,3507 15658,3538 15658,4771 15659,63 15660,349 15661,8788 15662,4611 15663,596 15663,668 15663,1119 15663,1616 15664,760 15665,1300 15666,907 15667,1085 15668,140 15668,264 15668,577 15668,1105 15668,1289 15669,298 15670,485 15671,83 15672,1 15673,104 15673,120 15673,338 15673,710 15673,1274 15673,1353 15673,1465 15674,301 15674,623 15674,968 15674,1167 15674,1298 15674,1805 15677,137 15678,1849 15678,32784 15679,15680 15681,233 15681,261 15681,697 15681,3260 15683,83 15683,175 15683,285 15683,450 15683,455 15683,949 15683,1756 15683,2553 15683,2784 15683,28130 15685,2944 15686,440 15687,483 15687,599 15687,1118 15687,4453 15688,581 15689,2995 15690,87 15690,392 15690,415 15690,852 15690,3003 15691,151 15691,309 15691,310 15691,313 15691,344 15691,1319 15691,1566 15691,1688 15691,3630 15691,5961 15692,97 15692,485 15693,1353 15694,54 15694,313 15694,385 15694,2421 15694,2424 15694,37088 15695,720 15696,143 15697,356 15697,611 15698,222 15699,1688 15701,1711 15701,1836 15702,818 15703,2416 15703,2417 15704,510 15704,875 15705,5987 15706,171 15707,2048 15708,222 15709,46 15709,1509 15711,1 15711,4 15711,5 15711,54 15711,65 15711,694 15711,784 15711,1082 15711,2926 15711,4411 15711,6424 15712,1 15713,1132 15713,1381 15713,1452 15714,72 15715,1143 15716,195 15717,247 15718,563 15719,397 15720,58 15721,134 15721,636 15721,2209 15722,2506 15723,861 15724,15725 15726,15725 15728,1001 15729,15725 15730,26 15730,59 15730,994 15730,1235 15730,1335 15731,1052 15731,1659 15732,120 15733,252 15733,318 15733,1220 15733,1222 15733,41170 15734,143 15735,392 15735,623 15736,920 15737,147 15737,151 15737,305 15737,1033 15737,1623 15738,994 15739,417 15740,5718 15741,120 15742,26 15742,59 15742,94 15742,117 15742,885 15742,887 15742,967 15742,994 15742,1432 15742,1775 15742,2674 15742,2712 15742,9542 15742,16614 15742,18815 15742,21944 15742,54870 15742,171294 15742,205627 15743,1579 15743,2051 15744,920 15744,1368 15745,86 15745,87 15745,178 15745,219 15745,595 15745,2310 15745,95836 15746,1016 15747,596 15747,784 15747,2701 15750,887 15751,151 15752,1151 15753,920 15754,1298 15755,992 15756,2944 15757,1179 15758,86 15758,167 15758,589 15758,605 15758,615 15758,907 15758,973 15758,1001 15758,1124 15758,1167 15758,1782 15758,1785 15758,1955 15758,3193 15758,3207 15759,1119 15759,15760 15759,45906 15759,82501 15759,86983 15759,103780 15761,1052 15762,1078 15762,6298 15763,240 15763,818 15764,852 15764,1368 15765,736 15766,302 15766,579 15766,893 15766,2116 15767,120 15767,261 15768,328 15768,1016 15768,1212 15768,1282 15768,2210 15768,4237 15769,1181 15770,50 15770,79 15770,192 15770,663 15770,664 15772,71 15773,15774 15775,406 15775,420 15776,795 15777,298 15778,485 15779,136 15779,557 15780,65 15781,86 15782,104 15782,136 15782,138 15782,953 15783,259 15784,1 15785,1 15786,1146 15787,3744 15788,71 15789,595 15789,1151 15789,1363 15789,2697 15790,1179 15791,158 15792,106 15792,1808 15792,1818 15792,1887 15792,1888 15792,3994 15792,5727 15792,7087 15792,15793 15792,17139 15792,26061 15792,27500 15792,29165 15792,45891 15792,52795 15792,60308 15792,83872 15792,106439 15792,113166 15792,118911 15792,125000 15793,1888 15794,111 15795,94 15795,147 15795,158 15795,195 15795,206 15795,336 15795,602 15795,695 15795,1235 15795,1560 15795,1860 15795,2244 15795,2714 15795,2787 15795,2867 15795,2868 15795,14382 15795,15795 15795,20111 15795,21944 15795,22880 15795,30331 15795,34716 15795,35439 15795,37702 15795,42064 15795,46364 15795,49027 15795,55859 15795,80266 15795,87866 15795,89035 15795,94130 15795,98192 15795,102006 15795,143314 15795,152928 15795,186040 15795,186074 15795,195050 15795,200554 15795,204787 15795,223365 15795,243934 15795,259501 15796,500 15797,264 15797,577 15798,611 15799,120 15800,1 15801,1368 15803,1651 15804,1 15804,156885 15805,184 15806,392 15806,809 15806,1151 15807,772 15807,1018 15807,3807 15807,4941 15807,15807 15807,28203 15807,31278 15807,36333 15807,75126 15807,76058 15807,85814 15807,142029 15807,175958 15807,178441 15807,182795 15807,186577 15807,187862 15807,188059 15807,190276 15807,192028 15807,217055 15807,217057 15807,217058 15807,217062 15807,221409 15807,225793 15807,232026 15807,236220 15808,15809 15810,15809 15811,143 15812,439 15812,15573 15813,22 15814,525 15814,843 15814,1849 15815,1634 15816,107 15817,2775 15818,447 15819,278 15820,72 15821,2915 15822,312 15823,1313 15823,1718 15823,2646 15823,5326 15825,72 15826,376 15827,714 15827,2205 15827,2206 15827,2315 15827,33424 15827,245910 15828,72 15829,79 15829,1147 15829,1623 15830,1127 15831,15832 15833,392 15834,211 15835,1181 15836,255 15837,1740 15838,599 15839,931 15840,240 15840,301 15841,247 15842,452 15842,457 15842,497 15842,535 15842,676 15842,843 15842,918 15842,1655 15843,111 15844,247 15846,717 15847,1474 15848,206 15850,143 15851,1381 15852,536 15853,134 15854,1 15854,184 15855,1590 15856,209 15856,248 15856,652 15856,1149 15856,1631 15857,1462 15857,1635 15857,8537 15857,9021 15858,143 15859,1381 15860,15861 15862,1082 15863,588 15863,590 15863,1419 15864,5326 15865,143 15866,66 15867,72 15868,2620 15869,483 15870,15871 15872,146 15874,273 15874,274 15875,1590 15876,1117 15877,298 15878,485 15879,15880 15879,45975 15879,50662 15881,399 15882,592 15883,83 15884,536 15885,652 15886,34 15886,35 15887,13661 15888,1556 15889,120 15889,1466 15890,392 15891,143 15892,536 15893,143 15895,489 15896,143 15897,346 15898,72 15899,280 15899,17245 15900,298 15901,485 15902,15903 15904,15905 15906,72 15907,346 15908,264 15908,1381 15908,1551 15909,4490 15910,2574 15911,392 15912,483 15913,44 15913,217 15913,538 15913,663 15913,664 15913,779 15913,788 15913,809 15913,920 15913,1033 15913,1181 15913,1381 15913,1414 15913,1639 15913,1805 15913,2073 15913,2889 15913,3193 15913,5440 15913,15609 15913,19010 15913,141912 15914,1368 15915,83 15915,285 15915,455 15915,1756 15915,2553 15915,2779 15915,2784 15915,28130 15916,273 15916,274 15917,8719 15918,138 15919,865 15920,557 15921,137 15922,118 15922,4597 15924,202 15924,203 15925,8719 15926,138 15927,865 15928,557 15929,137 15930,118 15930,4597 15931,34 15931,35 15931,120 15931,240 15931,261 15931,536 15931,599 15931,694 15931,1353 15931,1419 15931,1466 15931,2512 15931,2989 15931,2991 15931,3252 15932,8719 15933,138 15934,865 15935,557 15936,137 15937,1608 15938,118 15938,4597 15939,1052 15939,1289 15939,2626 15940,8719 15941,138 15942,865 15943,557 15944,137 15945,338 15945,1722 15945,1893 15946,118 15946,4597 15947,207 15948,557 15949,557 15950,149 15951,893 15952,592 15952,760 15952,805 15952,1119 15952,1285 15952,1635 15952,2620 15953,72 15954,97 15955,15956 15958,211 15960,15961 15962,372 15962,714 15963,255 15964,2411 15965,557 15966,143 15967,1085 15967,5961 15968,704 15969,151 15970,1858 15971,1860 15972,163 15973,72 15974,305 15975,640 15976,143 15977,143 15978,143 15979,843 15980,79 15980,192 15980,202 15980,203 15980,406 15980,779 15980,859 15980,1181 15980,1388 15980,1531 15980,1659 15981,143 15982,44 15983,72 15984,557 15985,647 15986,2073 15987,818 15988,611 15988,15179 15989,1608 15990,252 15990,318 15990,516 15990,1220 15990,1222 15991,68 15991,2837 15992,143 15993,143 15994,346 15995,298 15996,485 15997,143 15998,15999 16000,143 16001,71 16001,298 16001,304 16001,417 16001,525 16002,143 16003,147 16003,158 16005,143 16006,364 16007,1085 16008,289 16008,290 16009,30 16010,79 16010,192 16010,240 16010,435 16010,467 16010,516 16010,663 16010,868 16010,1210 16010,1220 16010,1222 16010,1243 16010,1385 16010,1844 16010,14674 16010,21944 16010,30428 16010,44370 16010,156379 16011,640 16012,422 16013,1871 16014,251 16014,252 16014,446 16014,465 16014,516 16014,16014 16014,189788 16014,189794 16014,223738 16014,234694 16014,236761 16015,3135 16016,41 16017,217 16018,16019 16019,16019 16020,143 16021,3623 16022,32 16023,1454 16024,217 16025,143 16026,779 16027,1119 16029,1939 16030,104 16031,30 16031,233 16031,1368 16032,2421 16033,422 16034,56 16035,149 16036,1707 16037,1287 16038,1715 16039,83 16039,278 16040,16041 16042,2351 16043,8788 16044,301 16044,717 16044,1231 16044,1740 16044,1782 16045,16045 16046,16047 16048,16049 16050,1227 16050,1229 16051,536 16052,160 16053,1479 16053,2979 16054,16055 16056,2416 16056,2417 16057,163 16058,272 16058,1127 16059,1058 16060,16061 16063,2205 16063,2206 16064,16065 16066,16067 16068,9560 16069,636 16070,1227 16070,1229 16070,21944 16071,16072 16071,46579 16071,47465 16071,53905 16071,54142 16071,57693 16073,146 16074,16075 16076,202 16076,203 16076,676 16077,417 16077,85531 16077,161317 16077,161318 16077,161319 16077,161321 16077,161327 16077,161329 16077,161332 16077,161335 16077,161337 16077,161342 16077,161344 16077,161345 16077,161346 16077,161348 16077,161514 16077,161584 16078,34 16078,35 16079,16080 16081,16082 16084,7124 16085,557 16086,1522 16087,1363 16088,2681 16089,1096 16090,16091 16092,16091 16093,7416 16094,65 16094,467 16095,4831 16096,366 16097,366 16098,366 16099,4 16099,5 16099,26 16099,59 16099,430 16099,1235 16099,1335 16100,312 16101,392 16101,1151 16101,1711 16101,1836 16103,26 16103,59 16103,135 16103,138 16104,298 16105,485 16106,219 16107,920 16108,433 16109,703 16110,32 16110,349 16110,392 16110,697 16110,808 16111,143 16112,1085 16113,298 16114,485 16115,298 16116,485 16117,6789 16118,433 16118,1454 16119,2146 16120,577 16120,595 16120,736 16120,1007 16120,1105 16120,1289 16120,1474 16120,7698 16122,775 16124,16125 16126,273 16126,274 16127,86 16130,163 16131,6323 16132,392 16133,233 16134,644 16135,406 16136,6750 16137,431 16137,760 16137,1119 16137,1285 16137,1631 16138,292 16138,462 16139,872 16140,920 16141,58 16141,534 16142,79 16143,248 16143,450 16143,1332 16144,137 16147,4276 16148,1 16148,4805 16149,306 16149,307 16151,518 16151,873 16151,874 16151,1010 16151,1210 16151,1231 16151,1298 16151,1300 16151,1326 16151,1411 16151,2006 16151,2784 16152,6726 16153,116 16153,138 16153,220 16153,886 16153,1235 16153,1335 16153,2157 16153,2673 16153,2720 16153,2893 16153,4054 16153,4114 16153,4185 16153,6621 16153,7544 16153,8113 16153,8155 16153,14353 16153,21944 16153,25501 16153,25636 16153,26923 16153,30471 16153,30574 16153,30692 16153,34060 16153,35510 16153,41974 16153,42813 16153,43667 16153,43835 16153,68440 16153,72626 16153,72632 16153,79346 16153,79373 16153,81220 16153,92562 16153,99296 16153,103411 16153,107765 16153,109269 16153,111707 16153,114453 16153,117103 16153,127920 16153,132380 16153,132478 16153,136397 16153,137875 16153,139033 16153,139120 16153,143316 16153,143631 16153,143733 16153,144342 16153,144344 16153,144824 16153,148076 16153,165128 16153,173224 16153,188564 16153,195071 16153,201690 16153,203585 16153,203816 16153,203829 16153,222441 16153,223983 16153,224094 16153,225103 16153,229333 16153,232461 16153,245296 16153,245494 16153,254129 16153,256193 16154,1769 16155,171 16156,417 16157,483 16158,1381 16159,151 16159,9457 16160,151 16161,32 16161,779 16161,2292 16162,298 16163,485 16164,893 16164,1119 16164,4177 16165,784 16165,1052 16166,4 16166,5 16166,79 16166,1368 16167,417 16168,151 16169,215 16169,388 16169,455 16170,1127 16170,1172 16170,1955 16171,1400 16172,1454 16173,41 16173,760 16174,417 16174,1564 16176,3 16177,1479 16178,143 16179,86 16180,86 16180,273 16180,344 16180,2671 16180,5212 16180,6682 16181,34 16181,35 16181,202 16181,203 16181,323 16181,358 16181,392 16181,493 16181,536 16181,623 16181,949 16181,1001 16181,1072 16181,1274 16181,1467 16181,1572 16181,1590 16181,1608 16181,1644 16181,1722 16181,2266 16181,2274 16181,2671 16181,2699 16181,2784 16181,2931 16181,2979 16181,3182 16181,3252 16181,3538 16181,4549 16181,4637 16181,7092 16181,13546 16182,167 16182,301 16182,2979 16183,158 16184,685 16185,1 16185,340 16185,841 16185,994 16185,1453 16186,283 16186,389 16186,455 16186,2782 16187,980 16188,16189 16190,818 16190,872 16190,1019 16190,1454 16191,1019 16191,1181 16191,1210 16192,167 16192,388 16192,589 16192,626 16192,631 16192,784 16192,795 16192,1001 16192,1085 16192,1284 16192,1293 16192,1522 16192,1837 16192,1844 16192,2045 16192,3193 16192,3422 16192,75912 16193,206 16194,392 16195,71 16195,372 16195,388 16195,704 16195,13538 16196,3297 16196,16196 16197,178 16198,611 16199,349 16200,579 16202,634 16203,483 16204,929 16205,304 16206,16207 16209,980 16210,290 16210,298 16210,304 16210,714 16210,2315 16210,3069 16210,33424 16210,94134 16211,1238 16212,58 16213,46 16214,3451 16214,3452 16215,417 16215,422 16215,602 16215,1564 16216,163 16218,1419 16218,1474 16219,907 16219,932 16220,1007 16220,1132 16221,2334 16224,163 16226,192 16229,392 16230,389 16230,657 16231,272 16231,1118 16232,163 16233,3138 16234,473 16236,690 16236,818 16237,58 16238,46 16239,868 16240,387 16241,10 16241,163 16244,949 16245,209 16246,302 16246,579 16246,4823 16247,567 16247,605 16247,968 16249,626 16250,459 16251,143 16252,660 16253,459 16254,3193 16256,660 16257,163 16258,16259 16260,1479 16261,1858 16262,1860 16263,104 16263,136 16263,137 16263,138 16263,557 16263,1368 16264,660 16265,312 16266,907 16266,932 16267,920 16268,79 16268,200 16268,289 16268,290 16268,536 16268,872 16268,1177 16268,1749 16268,2605 16270,163 16271,1807 16271,191355 16272,50 16272,147 16272,158 16272,406 16272,622 16273,781 16274,163 16275,227 16276,163 16277,163 16278,332 16278,2995 16279,30 16280,79 16280,136 16280,137 16281,163 16282,86 16283,178 16284,346 16286,209 16286,302 16286,579 16286,861 16286,4453 16287,83 16287,151 16287,1227 16287,1229 16287,9007 16287,86416 16288,392 16288,438 16288,1151 16288,1240 16289,516 16289,1818 16290,163 16291,143 16292,104 16292,1282 16293,872 16293,1579 16294,1282 16295,406 16296,843 16297,781 16299,158 16300,312 16302,151 16302,211 16302,972 16302,2173 16302,2979 16303,271 16304,2051 16304,49057 16305,163 16306,104 16306,107 16306,111 16306,134 16306,200 16306,227 16306,248 16306,289 16306,298 16306,503 16306,631 16306,636 16306,714 16306,805 16306,1016 16306,1119 16306,1149 16306,1282 16306,1631 16306,1955 16306,2205 16306,2209 16306,33424 16306,94134 16306,245910 16309,5 16309,47 16309,135 16309,248 16309,1119 16309,1332 16309,1415 16309,2089 16309,2469 16309,2940 16309,4091 16309,6569 16309,6642 16309,9529 16309,15277 16309,17139 16309,19602 16309,20397 16309,22188 16309,38822 16309,49301 16309,67127 16309,72586 16309,72743 16309,73186 16309,73360 16309,74071 16309,74361 16309,74368 16309,78708 16309,79987 16309,80711 16309,80717 16309,83249 16309,83256 16309,93961 16309,94312 16309,94830 16309,98892 16309,99108 16309,99548 16309,99881 16309,110906 16309,114055 16309,132512 16309,136072 16309,140828 16309,154646 16309,154671 16309,171318 16309,182606 16309,220913 16309,254842 16310,1309 16311,302 16312,16313 16314,907 16314,932 16316,163 16317,2775 16318,447 16319,163 16320,1298 16322,50 16322,79 16322,192 16322,195 16323,972 16324,366 16325,143 16326,143 16327,536 16328,634 16329,163 16330,47 16330,58 16330,251 16330,255 16330,287 16330,493 16330,563 16330,577 16330,626 16330,663 16330,664 16330,671 16330,698 16330,788 16330,795 16330,801 16330,1012 16330,1068 16330,1070 16330,1133 16330,1309 16330,1368 16330,1429 16330,1449 16330,1474 16330,2367 16330,2436 16330,2469 16330,2596 16330,5405 16330,6837 16330,16331 16330,21944 16332,256 16333,163 16334,163 16335,1203 16335,1955 16336,868 16337,433 16337,1634 16338,491 16338,758 16339,163 16340,1871 16341,779 16342,503 16343,1127 16343,1619 16343,13136 16344,163 16345,309 16345,310 16346,16347 16348,163 16349,758 16349,3695 16350,163 16352,949 16353,143 16354,86 16355,1085 16356,65 16357,222 16357,278 16357,379 16357,392 16357,467 16357,536 16357,571 16357,818 16357,868 16357,891 16357,1210 16357,1240 16357,1417 16357,1454 16357,1805 16357,2837 16357,5326 16357,21982 16357,162599 16358,868 16359,171 16359,957 16359,1815 16360,83 16360,1858 16361,134 16361,344 16361,636 16362,392 16362,697 16362,818 16362,872 16362,15609 16364,861 16365,298 16366,485 16367,163 16368,202 16368,203 16369,355 16370,41 16370,1119 16370,4619 16370,16370 16370,86778 16370,87209 16370,87223 16370,87238 16370,87504 16370,87507 16370,88706 16370,89039 16370,89252 16370,141590 16370,141601 16370,141844 16370,142040 16370,142044 16370,142050 16370,142277 16370,142281 16370,142515 16370,143427 16371,781 16372,151 16373,907 16373,932 16374,97 16374,269 16375,163 16376,158 16376,2244 16377,163 16379,143 16380,215 16382,134 16382,636 16383,1983 16384,163 16385,273 16385,274 16386,1235 16386,1335 16387,887 16388,41 16388,16389 16388,30689 16388,30914 16388,48884 16388,53911 16388,63181 16388,66877 16388,69128 16390,1425 16391,163 16392,596 16392,600 16392,617 16392,784 16392,1146 16392,1209 16392,1367 16392,1368 16392,1429 16392,2543 16392,2547 16392,2565 16392,2658 16392,2701 16392,2814 16392,3473 16392,4520 16392,4725 16392,5279 16392,5391 16392,5538 16392,7458 16392,7731 16392,13541 16392,14109 16392,14473 16392,15344 16392,15506 16392,15577 16392,15658 16392,15747 16392,16417 16392,16570 16392,19708 16392,20858 16392,22148 16392,22746 16392,22835 16392,29575 16392,29798 16392,29841 16392,30031 16392,31178 16392,32324 16392,32327 16392,32329 16392,32504 16392,33317 16392,33525 16392,34015 16392,34016 16392,34436 16392,34917 16392,34918 16392,34919 16392,38144 16392,38787 16392,49802 16392,50890 16392,54121 16392,57143 16392,61900 16392,61901 16392,61902 16392,63702 16392,63711 16392,64543 16394,647 16395,344 16396,72 16397,344 16398,285 16399,302 16400,671 16401,240 16401,503 16401,1785 16401,1955 16401,2989 16401,2991 16402,273 16402,274 16403,14989 16404,163 16405,349 16405,697 16406,657 16406,213089 16407,304 16407,999 16408,147 16409,147 16409,149 16409,158 16409,7998 16409,22231 16409,26152 16410,278 16410,2775 16412,222 16412,657 16412,660 16412,2424 16412,6506 16413,473 16413,3967 16414,240 16415,887 16416,163 16417,596 16418,2674 16419,697 16420,222 16421,79 16422,1118 16423,163 16424,163 16425,366 16425,795 16426,462 16426,1238 16426,3209 16427,424 16428,1085 16428,1522 16429,163 16430,81 16430,240 16430,372 16430,557 16430,1085 16430,1522 16430,1635 16430,1955 16430,2006 16430,2812 16430,3538 16431,1688 16432,415 16433,1634 16434,50 16434,79 16435,620 16436,163 16436,818 16437,163 16439,760 16440,104 16440,140 16440,143 16440,273 16440,801 16440,1052 16440,1659 16440,1745 16440,1893 16440,2367 16440,81070 16441,16442 16443,26 16443,59 16443,994 16443,1235 16443,1335 16443,21944 16444,16445 16444,110137 16446,16447 16448,760 16449,611 16450,163 16451,1070 16452,302 16453,932 16454,275 16454,277 16455,509 16455,510 16455,872 16455,150022 16456,2205 16456,2206 16457,907 16457,932 16458,4 16458,5 16458,859 16458,1243 16459,581 16460,301 16460,861 16460,893 16460,2979 16461,775 16462,163 16463,167 16463,1544 16463,3207 16464,16465 16467,697 16468,1179 16469,859 16470,1871 16471,1122 16472,2367 16473,143 16474,163 16475,467 16475,605 16475,868 16475,4831 16475,156379 16475,162599 16476,2073 16477,143 16478,1419 16480,267 16480,2372 16481,77 16481,332 16481,1466 16482,147 16482,149 16482,158 16482,406 16482,663 16482,664 16482,779 16482,818 16482,1181 16482,1515 16482,4193 16484,1436 16484,2083 16487,202 16487,251 16487,252 16487,516 16487,1220 16487,1222 16488,1122 16488,1559 16490,207 16490,424 16492,136 16492,252 16492,272 16492,333 16492,435 16492,516 16492,1033 16492,1370 16492,1877 16492,1893 16492,2006 16493,60576 16495,10 16496,192 16497,71 16497,251 16497,493 16497,957 16497,1247 16497,1815 16497,164572 16498,1977 16498,1978 16500,455 16500,623 16500,1454 16501,1639 16502,509 16502,872 16502,1151 16503,1011 16503,1096 16503,2135 16503,2704 16503,28294 16504,1506 16504,22125 16505,120 16505,1419 16505,2372 16506,973 16507,442 16507,503 16507,994 16507,1257 16508,163 16510,1119 16512,273 16512,274 16513,850 16515,1506 16515,22125 16516,137 16516,163 16516,349 16516,664 16516,1147 16516,1572 16516,2750 16516,3612 16517,143 16518,240 16518,818 16519,63 16520,596 16521,682 16521,72439 16522,392 16522,433 16522,467 16522,872 16522,162599 16523,518 16523,1326 16523,2737 16523,3193 16525,7 16525,97 16525,217 16526,2205 16526,2206 16527,745 16529,255 16530,106 16530,1370 16530,1821 16530,2782 16530,21736 16531,1096 16531,1821 16532,346 16534,309 16534,310 16535,1639 16537,83 16537,160 16537,849 16538,79 16538,202 16538,203 16538,1149 16538,1433 16539,392 16540,309 16540,310 16541,1240 16542,516 16543,4611 16544,1544 16545,233 16546,4611 16547,1544 16548,2506 16549,4611 16550,1544 16551,104 16551,134 16551,227 16551,240 16551,248 16551,264 16551,289 16551,290 16551,298 16551,442 16551,503 16551,631 16551,636 16551,714 16551,784 16551,1085 16551,1119 16551,1282 16551,1326 16551,1392 16551,1462 16551,1955 16551,2205 16551,2206 16551,2209 16551,2443 16551,8180 16551,8537 16551,33424 16553,215 16554,206 16555,929 16556,247 16557,571 16560,163 16561,11 16561,178 16561,663 16561,664 16561,707 16561,712 16561,713 16561,809 16561,1087 16561,1089 16561,1191 16561,1623 16561,2605 16561,3258 16561,3967 16561,3999 16562,364 16562,2775 16562,3538 16563,79 16563,111 16563,192 16563,202 16563,333 16563,406 16563,779 16563,1181 16564,312 16564,509 16564,510 16564,595 16564,1453 16565,535 16566,314 16566,1240 16567,163 16571,1203 16571,1955 16571,2812 16572,192 16572,663 16572,664 16573,175 16574,34 16574,35 16574,588 16574,590 16575,15 16575,2260 16576,349 16576,510 16576,697 16576,3260 16576,5540 16577,4611 16578,1544 16579,733 16580,3 16581,626 16581,707 16581,1590 16582,151 16582,240 16582,366 16582,2173 16582,2607 16583,65 16583,1433 16584,252 16585,5440 16586,515 16587,264 16587,1433 16588,399 16589,192 16590,9015 16591,1458 16592,16593 16594,2083 16595,2567 16596,392 16596,433 16596,687 16596,818 16596,861 16596,893 16596,1556 16597,264 16597,1509 16598,50 16598,1313 16599,1235 16599,1335 16600,457 16601,1837 16602,861 16603,2367 16605,1033 16606,749 16606,5101 16606,15119 16606,55077 16607,163 16607,579 16607,861 16607,1556 16608,2373 16609,83 16609,178 16609,259 16610,202 16610,203 16610,1175 16611,3582 16613,893 16614,292 16614,446 16614,685 16614,693 16614,745 16614,1688 16614,1849 16614,4114 16614,7530 16614,9070 16614,16614 16614,18490 16614,18970 16614,67946 16614,110160 16614,143068 16614,189328 16614,191481 16614,191483 16614,193155 16616,1556 16617,104 16617,636 16618,1070 16619,202 16619,203 16621,779 16622,1983 16623,2319 16624,1722 16625,720 16627,2319 16628,1983 16629,344 16630,301 16630,968 16631,1769 16633,202 16633,203 16634,907 16634,2191 16635,247 16636,302 16636,581 16636,918 16636,1556 16638,420 16638,868 16638,1010 16638,1179 16638,4771 16640,104 16640,636 16640,8993 16641,294 16641,634 16641,1052 16642,422 16643,422 16644,422 16645,422 16646,422 16647,72 16648,344 16649,285 16650,525 16651,3260 16652,83 16652,202 16652,467 16652,868 16652,1243 16652,1531 16652,2995 16652,191355 16653,240 16653,818 16653,17309 16654,247 16655,264 16655,332 16655,577 16655,1289 16656,163 16656,690 16657,1983 16661,120 16662,77 16663,86 16664,248 16665,4344 16666,195 16667,48 16667,87 16667,130 16667,272 16667,312 16667,338 16667,344 16667,349 16667,358 16667,431 16667,473 16667,510 16667,515 16667,589 16667,647 16667,801 16667,991 16667,1052 16667,1127 16667,1130 16667,1224 16667,1241 16667,1267 16667,1293 16667,1345 16667,1381 16667,1436 16667,1579 16667,1639 16667,1659 16667,1893 16667,2083 16667,2367 16667,2605 16667,3003 16667,3260 16667,3653 16667,3695 16667,8149 16667,13538 16667,19356 16667,49057 16667,131675 16667,191860 16668,417 16668,2572 16668,44725 16668,75912 16669,577 16670,267 16671,72 16672,1740 16673,302 16675,301 16676,222 16676,1052 16677,346 16678,467 16678,868 16679,393 16679,980 16680,2205 16680,2206 16680,33424 16682,16683 16683,16682 16683,16683 16683,24254 16683,37131 16683,226652 16683,246797 16684,289 16684,290 16684,932 16684,1082 16684,1285 16684,1564 16684,1818 16684,1955 16684,2205 16684,2296 16684,2620 16684,4218 16684,33424 16684,94134 16685,873 16687,264 16687,16687 16688,336 16689,143 16690,151 16691,467 16691,663 16691,664 16691,868 16691,893 16691,1803 16691,162599 16692,649 16693,932 16694,2590 16695,83 16696,1130 16698,77 16699,622 16699,1033 16700,184 16701,1 16702,305 16703,527 16704,1608 16705,309 16705,310 16706,957 16706,1815 16707,16708 16709,104 16709,111 16709,714 16709,1119 16709,1745 16709,2156 16709,2205 16709,2286 16709,4571 16709,33424 16709,88820 16710,1556 16711,949 16712,3 16712,1127 16712,1177 16712,2210 16712,2867 16712,2868 16712,6837 16712,22880 16713,247 16713,2867 16713,2868 16714,563 16715,273 16715,390 16715,885 16715,3623 16715,66754 16716,907 16716,3804 16717,2105 16717,4220 16718,3003 16718,5469 16719,143 16720,83 16721,16722 16723,247 16724,538 16725,264 16726,8992 16727,30 16728,302 16729,16730 16731,16732 16733,4 16733,5 16734,346 16735,302 16736,143 16737,54 16738,1282 16738,1882 16739,406 16740,631 16741,1821 16742,1511 16742,3069 16743,392 16744,16745 16746,83 16747,136 16748,390 16749,298 16750,485 16751,376 16752,406 16752,620 16754,1363 16755,215 16755,704 16755,1402 16755,176782 16756,16757 16758,248 16758,850 16759,1559 16760,34 16760,35 16760,83 16760,536 16761,784 16762,195 16762,5874 16762,6119 16762,16767 16763,1462 16763,8537 16764,7760 16765,1370 16765,1821 16766,99 16768,16769 16768,26655 16768,32891 16768,51857 16768,52736 16768,53589 16768,54062 16768,54224 16768,81048 16768,83752 16768,84323 16768,88746 16768,88862 16768,96287 16768,97107 16768,97759 16768,101012 16768,105225 16768,105825 16768,108447 16768,108682 16768,109730 16768,110879 16770,143 16771,292 16772,54 16773,1140 16774,192 16774,663 16775,149 16776,44 16776,202 16776,203 16776,217 16776,333 16776,406 16776,538 16776,663 16776,664 16776,779 16776,788 16776,809 16776,920 16776,1033 16776,1181 16776,1381 16776,1414 16776,1433 16776,1551 16776,1639 16776,1805 16776,2073 16776,2889 16776,5440 16776,15609 16776,141912 16777,406 16778,392 16779,34 16779,35 16779,83 16779,1718 16780,143 16781,240 16782,289 16782,290 16783,1433 16784,255 16785,450 16786,1544 16787,704 16788,1243 16788,4355 16789,247 16789,5213 16790,1429 16791,358 16792,2557 16793,143 16793,1052 16794,1590 16795,389 16796,163 16797,16798 16797,161176 16799,167 16800,1522 16801,225 16802,2574 16803,147 16804,217 16805,1149 16806,417 16807,4222 16808,16809 16810,16809 16811,16812 16813,202 16813,217 16813,333 16813,406 16813,663 16813,664 16813,779 16813,788 16813,809 16813,920 16813,1033 16813,1181 16813,1381 16813,1414 16813,1433 16813,1639 16813,1805 16813,2073 16813,2889 16813,3193 16813,5440 16813,15609 16813,141912 16814,1313 16815,272 16816,717 16817,1837 16818,227 16819,1265 16819,1266 16820,586 16821,349 16822,516 16823,372 16824,1740 16825,417 16826,8270 16827,81 16828,1556 16829,3260 16830,16831 16832,392 16833,3246 16833,3247 16834,2372 16835,1 16835,83 16835,117 16835,278 16835,330 16835,406 16835,450 16835,536 16835,1212 16835,1240 16835,2712 16835,4594 16836,827 16837,2979 16838,2995 16839,65 16840,392 16841,13136 16842,298 16843,485 16844,1893 16844,2051 16844,49057 16845,536 16846,392 16847,6789 16848,3538 16849,356 16849,5591 16850,704 16851,143 16851,1052 16851,15119 16852,72 16853,195 16854,2775 16855,72 16856,925 16857,72 16858,225 16858,248 16858,1332 16859,10 16860,79 16861,515 16862,704 16863,640 16864,1858 16865,1860 16866,192 16867,160 16868,160 16869,48 16869,104 16869,264 16869,515 16869,516 16869,687 16869,861 16869,953 16869,1007 16869,1010 16869,1181 16869,1374 16869,1392 16869,1551 16869,1782 16869,1968 16869,2626 16869,3041 16869,3999 16869,5440 16870,1515 16871,252 16871,1370 16872,160 16873,79 16873,178 16873,62561 16874,167 16874,968 16874,1241 16874,1522 16874,2979 16875,16687 16876,304 16877,72 16878,344 16879,285 16880,1511 16880,3069 16882,766 16882,939 16883,939 16883,2352 16884,422 16885,939 16885,3241 16886,671 16886,939 16887,56 16888,766 16888,939 16889,939 16889,3241 16890,50 16891,147 16891,206 16891,1458 16891,2157 16891,2244 16891,16891 16891,29109 16891,44654 16891,44877 16891,79883 16891,79887 16891,80120 16891,80266 16891,80515 16891,81315 16891,82103 16891,82244 16891,83916 16891,87803 16891,88582 16891,100737 16891,105751 16891,120691 16891,123892 16891,124596 16891,124955 16891,127333 16891,128317 16891,142016 16891,143446 16891,143617 16891,174526 16891,174963 16891,175348 16891,177986 16891,183850 16891,185352 16891,186787 16891,190854 16891,192763 16891,215396 16891,220792 16891,222095 16891,226675 16892,1220 16892,1222 16893,949 16894,202 16894,203 16896,4218 16896,4220 16896,66297 16897,273 16897,274 16898,72 16899,344 16900,285 16901,1298 16902,83 16902,175 16902,278 16902,285 16902,450 16902,455 16902,1756 16902,2553 16902,28130 16903,269 16904,143 16905,143 16906,344 16906,1512 16906,2646 16906,3794 16906,5992 16907,298 16908,485 16909,652 16909,1052 16909,1639 16909,1893 16910,301 16911,143 16912,143 16913,143 16914,1240 16915,1019 16916,1010 16917,505 16918,44 16919,640 16920,16921 16922,2334 16923,258 16924,424 16925,2312 16926,163 16927,4672 16928,16929 16930,16931 16932,640 16933,417 16934,72 16936,16937 16938,16937 16939,304 16939,356 16940,158 16940,406 16941,269 16942,1220 16942,1222 16943,252 16944,251 16945,146 16946,158 16947,332 16948,2506 16949,192 16949,663 16950,278 16951,2681 16952,1844 16954,72 16955,372 16955,390 16955,589 16955,1085 16955,1411 16955,6068 16955,75912 16955,185874 16956,862 16957,97 16957,16958 16957,53449 16957,60478 16957,90474 16957,97688 16957,101038 16957,111005 16957,114771 16957,118964 16957,119139 16957,124439 16957,175062 16959,81 16960,640 16961,16962 16963,417 16964,217 16964,392 16964,1417 16965,2083 16966,104 16966,134 16966,135 16966,136 16966,137 16966,138 16966,557 16966,850 16966,1368 16966,2105 16967,227 16968,1644 16969,1240 16969,1465 16970,30 16971,424 16972,240 16973,233 16974,16975 16974,55373 16976,44 16976,184 16976,808 16976,2646 16976,255876 16977,516 16978,146 16979,146 16980,158 16980,206 16981,392 16982,146 16983,390 16984,920 16985,2373 16986,72 16987,344 16988,285 16989,644 16990,143 16991,143 16991,1052 16992,16993 16994,3451 16994,3452 16995,206 16995,2244 16996,16997 16996,67014 16996,76415 16998,2146 16998,2931 16998,16999 16998,181476 16998,227357 16998,227639 16998,228757 16998,257540 17000,781 17001,298 17002,485 17003,644 17004,171 17005,298 17006,485 17007,30 17008,17009 17010,17011 17010,120831 17012,17013 17014,17013 17015,146 17016,1590 17016,1644 17016,6661 17017,17018 17019,102 17019,366 17019,3724 17020,433 17021,366 17021,972 17022,66 17022,868 17024,219 17024,535 17024,731 17024,758 17024,818 17024,957 17024,1815 17024,1888 17024,3451 17024,3452 17024,3695 17024,21944 17025,206 17026,306 17026,307 17027,298 17028,485 17029,240 17030,146 17031,726 17032,640 17033,640 17034,640 17035,760 17037,72 17038,344 17039,285 17040,1001 17040,3094 17041,313 17042,644 17042,1454 17043,6661 17044,602 17045,1033 17046,920 17047,17048 17049,143 17050,934 17051,1323 17052,788 17052,1368 17052,1452 17053,1033 17054,3507 17055,1285 17056,104 17056,557 17056,1939 17057,571 17058,949 17059,801 17060,634 17061,1323 17062,102 17063,1326 17064,408 17065,2367 17066,118 17066,206 17066,1381 17066,4597 17066,5405 17066,7572 17067,202 17067,203 17067,406 17067,1515 17067,2371 17068,626 17069,1551 17070,4060 17071,3 17072,6051 17073,68 17073,301 17073,372 17073,852 17073,972 17073,1010 17073,1293 17073,1309 17073,1782 17073,2083 17074,1238 17075,143 17076,134 17077,1608 17078,1010 17079,158 17080,1452 17081,1287 17082,805 17083,3999 17084,406 17084,602 17084,779 17085,34 17085,35 17085,536 17086,255 17087,17088 17089,1860 17090,3612 17091,595 17092,2274 17093,392 17094,4760 17095,6059 17096,5658 17097,4252 17098,72 17099,344 17100,623 17101,285 17102,697 17103,6955 17104,811 17105,160 17106,422 17107,422 17108,422 17109,422 17110,422 17111,422 17112,422 17113,422 17114,1227 17114,1229 17114,21944 17115,697 17115,1240 17115,1769 17116,34 17116,35 17116,186 17116,192 17116,254 17116,326 17116,392 17116,455 17116,534 17116,772 17116,801 17116,861 17116,943 17116,1118 17116,1119 17116,1140 17116,1417 17116,1515 17116,1749 17116,1955 17116,2372 17116,4039 17116,6556 17116,75912 17116,127158 17118,273 17118,274 17119,143 17120,135 17121,83 17122,433 17123,861 17124,393 17124,1821 17125,693 17125,6051 17126,1983 17127,392 17128,3161 17129,1363 17130,4039 17131,599 17132,392 17132,623 17133,736 17134,473 17135,298 17136,485 17137,104 17137,248 17138,130 17138,1007 17139,26 17139,59 17139,1359 17139,1458 17139,1888 17139,6621 17139,17140 17139,21944 17139,60576 17141,628 17141,2681 17141,58979 17141,88266 17141,166757 17141,187899 17142,217 17142,272 17142,393 17142,726 17142,980 17142,1388 17142,1531 17142,2178 17142,4455 17142,4545 17143,1 17143,206 17143,328 17143,920 17143,30331 17144,136 17145,273 17145,274 17146,525 17146,1749 17147,10 17147,72 17147,273 17147,274 17147,2367 17148,312 17149,111 17150,557 17151,34 17151,35 17151,50 17151,56 17151,79 17151,99 17151,147 17151,158 17151,192 17151,211 17151,269 17151,315 17151,333 17151,336 17151,366 17151,406 17151,516 17151,620 17151,622 17151,779 17151,949 17151,1014 17151,1181 17151,1298 17151,1425 17151,1623 17151,1655 17151,3370 17151,3895 17151,5375 17151,14453 17151,23783 17151,43613 17151,60576 17151,127158 17151,240174 17152,1082 17153,577 17153,1429 17154,877 17154,1284 17154,1715 17154,49512 17154,148742 17154,245420 17155,452 17155,457 17155,497 17155,535 17155,843 17155,918 17155,1011 17155,1014 17155,1655 17155,4165 17155,5726 17156,326 17156,784 17156,1732 17157,269 17158,6303 17159,1353 17160,215 17161,167 17162,26 17162,59 17163,215 17163,1016 17163,1282 17163,1882 17164,143 17165,4060 17166,147 17166,1620 17166,1623 17166,2471 17166,14389 17166,17166 17167,158 17168,2443 17169,143 17170,184 17171,1893 17172,215 17173,240 17173,1564 17173,1955 17173,2812 17173,3538 17174,10 17175,1179 17176,10 17177,30 17178,994 17179,704 17180,2979 17181,143 17182,516 17183,818 17184,1265 17184,1266 17184,7652 17185,6682 17186,20 17187,1001 17188,83 17188,175 17188,285 17188,455 17188,1274 17188,1718 17188,1756 17188,2553 17188,2779 17188,2784 17188,28130 17189,217 17189,387 17189,1204 17189,22071 17190,392 17190,697 17191,217 17192,4637 17193,34 17193,35 17194,2045 17195,455 17196,2266 17197,4594 17198,2421 17199,1201 17200,269 17201,1411 17202,16687 17203,5101 17204,17205 17204,28537 17204,43915 17204,43919 17204,46268 17204,180397 17206,390 17207,233 17207,3135 17208,1983 17209,392 17210,206 17210,1359 17211,356 17211,509 17211,595 17211,1453 17211,1572 17211,1722 17211,3538 17212,298 17212,417 17212,1085 17213,83 17214,104 17214,254 17214,557 17214,953 17214,954 17214,1939 17215,2506 17216,1151 17217,104 17217,254 17217,557 17217,953 17217,954 17217,1939 17217,134641 17218,417 17220,178 17220,3933 17221,17222 17223,222 17223,455 17224,222 17225,2073 17226,111 17226,217 17226,1181 17226,2620 17227,17228 17229,2574 17230,285 17230,631 17230,2590 17230,2779 17231,17232 17233,640 17234,143 17235,151 17236,406 17236,779 17237,184 17238,2411 17239,1033 17240,273 17240,274 17241,22 17241,163 17241,182 17241,579 17241,9457 17242,1400 17243,1849 17244,72 17245,280 17245,393 17245,980 17245,1370 17245,2782 17245,17245 17246,392 17247,285 17247,620 17247,8244 17248,195 17248,406 17249,663 17249,664 17250,850 17251,417 17252,349 17252,3260 17253,516 17253,255750 17254,1181 17255,850 17256,862 17257,602 17258,247 17259,779 17260,68 17261,9011 17261,9032 17261,17263 17262,269 17262,406 17264,206 17264,273 17264,274 17265,46 17265,86 17265,795 17265,949 17265,1801 17265,2699 17265,4903 17265,13136 17265,48505 17266,17267 17268,143 17269,151 17270,811 17271,2334 17272,515 17272,1436 17273,119 17273,313 17273,385 17273,389 17273,1724 17273,2421 17273,37088 17273,115474 17274,417 17275,143 17276,17277 17278,1912 17279,72 17280,50 17280,622 17280,640 17280,841 17281,809 17282,17283 17284,312 17285,147 17285,158 17285,206 17285,406 17285,2244 17285,118336 17286,1707 17287,1370 17287,1821 17288,17289 17290,1556 17291,1240 17292,6955 17293,784 17294,704 17295,784 17296,192 17296,1007 17296,1181 17297,120 17298,376 17299,515 17300,2292 17301,3370 17301,14453 17302,1033 17303,1 17303,269 17303,337 17303,788 17303,1425 17304,10 17305,874 17306,1143 17307,392 17308,17309 17309,240 17309,819 17309,6853 17309,16653 17309,18245 17309,39511 17309,63984 17309,66452 17309,68924 17309,158392 17309,173703 17309,175425 17310,333 17310,440 17310,1531 17311,1370 17311,1821 17312,63 17312,1893 17313,17314 17313,68069 17313,175346 17315,107 17316,1257 17316,3085 17317,631 17318,217 17319,1085 17320,207 17321,1844 17322,893 17324,611 17324,1612 17325,17326 17327,1241 17327,2083 17328,1204 17329,994 17330,206 17330,406 17330,422 17330,779 17330,1181 17331,920 17331,957 17331,1815 17332,306 17332,307 17333,17334 17335,920 17336,872 17337,302 17337,435 17337,440 17337,1433 17337,5265 17338,301 17339,146 17339,151 17339,893 17339,1179 17339,3585 17340,147 17340,171 17340,184 17340,306 17340,307 17341,192 17342,298 17343,485 17344,143 17345,17346 17346,19 17346,83 17346,135 17346,536 17346,4799 17346,29938 17346,250605 17346,250806 17346,251247 17347,500 17348,97 17349,420 17350,219 17351,143 17352,175 17353,310 17354,788 17355,900 17356,65 17356,171 17356,366 17356,500 17356,957 17356,1247 17356,1815 17356,33082 17356,164572 17357,289 17357,290 17357,349 17357,697 17357,94134 17358,192 17359,634 17360,1370 17360,1821 17361,10 17362,83 17362,175 17362,278 17362,285 17362,389 17362,455 17362,626 17362,1274 17362,1756 17362,2590 17362,2779 17362,2784 17363,79 17364,3507 17365,3148 17366,424 17367,143 17368,663 17368,664 17370,347 17371,2416 17371,2417 17372,151 17372,163 17372,340 17372,491 17372,841 17372,1058 17372,1243 17373,1955 17374,83 17374,119 17374,175 17374,285 17374,455 17374,1274 17374,1756 17374,2553 17374,2779 17374,2784 17374,28130 17375,256 17375,2373 17376,8822 17377,652 17378,338 17379,1363 17380,1414 17381,2379 17382,668 17382,972 17383,17384 17385,72 17386,9598 17387,278 17389,2372 17390,192 17390,920 17390,1118 17391,920 17392,1235 17392,1335 17393,2506 17394,430 17395,68 17396,83 17396,3538 17397,972 17397,1010 17397,1531 17398,372 17399,8598 17400,72 17401,118 17401,4597 17402,2506 17403,10 17403,48 17403,50 17403,136 17403,589 17403,795 17403,862 17403,1177 17403,1309 17403,1368 17403,1411 17403,1432 17403,3804 17403,8270 17403,88820 17403,182162 17404,1368 17405,17406 17405,95316 17405,107326 17405,108517 17405,110396 17405,113339 17407,3209 17408,58 17408,272 17408,417 17408,563 17408,626 17408,749 17408,795 17408,811 17408,1133 17408,1309 17408,1368 17408,1449 17408,1821 17408,2889 17408,5708 17408,6837 17408,21736 17409,258 17410,81 17411,452 17411,457 17411,497 17411,535 17411,1655 17412,225 17413,130 17414,17415 17416,563 17417,8884 17418,1392 17419,1 17419,22 17419,972 17420,94 17420,306 17420,307 17420,2787 17421,346 17421,447 17421,538 17421,671 17422,538 17422,671 17423,435 17423,440 17423,538 17423,671 17423,934 17423,1294 17423,1612 17423,1877 17424,435 17424,447 17424,671 17424,1590 17426,346 17426,435 17426,439 17426,538 17426,671 17426,818 17430,1068 17430,1877 17431,435 17431,5996 17432,192 17432,435 17432,538 17432,671 17432,30331 17433,1 17434,1402 17435,192 17436,273 17436,274 17437,1085 17438,841 17438,1458 17438,2712 17439,117 17440,1 17440,147 17440,158 17440,195 17440,206 17440,422 17440,640 17440,1458 17440,1803 17440,2244 17440,80266 17440,89035 17441,130 17441,500 17441,718 17441,893 17441,14458 17442,206 17442,718 17442,1888 17442,8675 17442,14458 17443,885 17444,592 17445,364 17445,431 17445,1227 17445,1229 17445,1252 17445,1253 17445,2089 17445,2940 17445,4823 17445,9536 17445,21944 17445,86416 17446,1 17446,184 17446,2312 17447,779 17448,14550 17449,227 17449,2379 17450,17451 17452,289 17452,290 17452,94134 17453,233 17454,10 17455,1392 17456,4 17456,5 17457,2244 17457,30331 17458,372 17459,251 17459,516 17460,634 17461,104 17461,134 17461,136 17461,138 17462,366 17463,366 17464,366 17465,366 17466,366 17467,1531 17468,366 17469,366 17470,1977 17470,1978 17471,305 17472,827 17473,32 17473,1274 17473,1858 17474,146 17474,3148 17474,5366 17475,17476 17476,17863 17476,52441 17477,146 17478,17479 17480,83 17480,356 17480,379 17480,2784 17480,5591 17481,17482 17483,1016 17484,306 17484,307 17486,333 17486,2931 17487,17487 17488,83 17490,483 17491,158 17492,17493 17494,17495 17496,20 17496,83 17496,21442 17496,142426 17497,581 17499,872 17500,3507 17501,671 17502,1655 17503,160 17504,17505 17506,17507 17508,422 17509,422 17510,422 17511,422 17512,72 17513,344 17514,285 17515,7 17515,202 17515,203 17515,1265 17515,1266 17516,577 17517,1001 17518,620 17519,202 17519,203 17520,10 17520,2282 17520,17521 17522,5726 17523,26 17523,59 17523,994 17523,1235 17523,1335 17523,21944 17524,17525 17526,146 17527,273 17527,1052 17528,306 17528,307 17529,298 17530,485 17531,147 17532,298 17533,485 17534,1072 17535,97 17535,240 17535,247 17535,264 17535,457 17536,17537 17538,1284 17539,255 17540,422 17541,304 17541,682 17541,772 17541,72439 17542,17543 17544,1 17545,298 17546,485 17547,17548 17547,43478 17547,88854 17549,202 17549,203 17550,275 17550,277 17551,147 17551,206 17551,406 17551,779 17551,89035 17551,118336 17552,17553 17554,433 17555,2178 17555,4545 17555,56150 17555,139010 17556,17557 17558,422 17559,56 17560,17561 17562,17561 17563,577 17564,10 17565,1688 17566,644 17567,158 17567,406 17567,779 17567,1181 17567,1515 17568,240 17568,592 17569,707 17569,717 17570,406 17570,422 17570,620 17571,83 17572,178 17573,206 17573,292 17573,660 17573,682 17573,704 17573,775 17573,1432 17573,1434 17573,72439 17573,88820 17574,980 17574,1370 17574,1821 17575,999 17576,505 17577,1224 17578,304 17579,1983 17580,26 17580,59 17580,885 17580,21944 17581,779 17582,497 17583,493 17584,647 17587,17588 17588,17588 17589,17590 17591,3451 17591,3452 17592,17593 17594,160 17595,1773 17596,4 17596,5 17597,3209 17598,390 17599,743 17600,65 17601,261 17602,143 17603,227 17604,264 17605,1043 17606,592 17606,631 17607,58 17607,186 17607,503 17607,518 17607,1140 17607,1326 17607,1659 17607,2334 17607,5547 17608,83 17608,544 17608,1019 17608,2779 17609,577 17610,143 17611,298 17612,485 17613,118 17613,682 17613,4597 17614,4 17614,5 17615,118 17615,4597 17616,994 17617,3331 17618,222 17618,446 17618,872 17618,1118 17618,1796 17618,3111 17618,3295 17618,3297 17618,16196 17618,19005 17619,32 17619,392 17619,697 17619,2699 17620,143 17621,147 17622,4903 17622,13136 17623,1033 17624,50 17625,310 17626,843 17627,1313 17627,81648 17628,1227 17628,86416 17631,302 17632,87 17632,609 17633,195 17634,779 17635,483 17635,1927 17636,2083 17637,143 17638,83 17639,17640 17641,1818 17642,718 17643,872 17646,671 17647,17648 17647,51614 17649,65 17650,4 17650,5 17651,17652 17653,515 17654,980 17655,595 17655,657 17655,1453 17656,516 17657,17658 17659,17660 17661,1511 17661,3069 17662,762 17663,485 17664,50 17664,158 17664,192 17664,406 17664,779 17664,1033 17664,1265 17664,1266 17664,1531 17664,3872 17665,143 17666,2416 17666,2417 17667,376 17668,818 17670,289 17670,290 17670,417 17671,34 17671,35 17672,143 17674,206 17674,430 17674,500 17674,1608 17675,1479 17676,17677 17678,1506 17679,211 17680,433 17681,3085 17682,309 17682,310 17683,1289 17684,207 17685,17686 17687,273 17687,274 17688,298 17689,485 17690,17691 17692,2775 17693,17694 17695,298 17696,485 17697,255 17699,17700 17702,2334 17703,17704 17703,81970 17703,91994 17703,122973 17705,301 17706,1 17707,68 17708,452 17709,433 17710,17711 17712,17713 17714,1359 17715,272 17716,17717 17719,3367 17720,4691 17721,17722 17723,1033 17724,17725 17726,872 17727,424 17728,392 17728,1363 17729,72 17730,344 17731,285 17732,1 17732,83 17732,149 17732,158 17732,184 17732,206 17732,269 17732,283 17732,330 17732,336 17732,356 17732,447 17732,575 17732,577 17732,595 17732,602 17732,841 17732,972 17732,1085 17732,1089 17732,1179 17732,1313 17732,1332 17732,1415 17732,1452 17732,1607 17732,1858 17732,2590 17732,2828 17732,2931 17732,3003 17732,3135 17732,3769 17732,4810 17732,6424 17732,6789 17732,6837 17732,15068 17732,21442 17732,89035 17732,154408 17733,784 17734,310 17734,1462 17734,3039 17734,8537 17735,2351 17736,525 17736,862 17736,3507 17737,17738 17739,261 17740,187 17741,267 17742,269 17743,271 17744,17745 17746,163 17747,17748 17749,862 17750,652 17751,640 17752,149 17752,4101 17753,195 17754,485 17755,1001 17756,17757 17758,17759 17758,67786 17760,273 17760,358 17760,30331 17761,147 17762,143 17763,17764 17765,366 17766,206 17767,366 17768,920 17769,17770 17769,19570 17771,366 17772,17772 17773,872 17774,872 17775,184 17776,1572 17777,81 17778,233 17779,17780 17781,1284 17782,1102 17783,17784 17785,107 17786,2416 17786,2417 17787,292 17788,338 17789,17790 17789,62962 17789,78602 17791,298 17792,1133 17793,3538 17794,447 17795,255 17796,452 17796,457 17796,497 17796,535 17796,1655 17798,2744 17799,7 17800,652 17801,79 17801,192 17801,202 17801,203 17801,333 17801,1181 17802,160 17803,10 17803,175 17804,1381 17805,146 17806,17807 17808,160 17809,698 17810,2424 17811,222 17811,278 17811,1571 17811,2224 17811,5326 17812,1572 17813,87 17813,595 17813,809 17813,872 17813,1151 17813,127158 17814,17815 17816,1 17816,340 17816,841 17816,994 17816,1294 17816,1453 17817,346 17818,634 17820,1323 17821,102 17822,1326 17823,408 17824,2367 17825,19 17825,385 17825,1571 17825,2266 17825,5326 17826,1454 17827,273 17827,274 17828,146 17829,1127 17830,151 17831,175 17831,269 17831,366 17831,479 17831,1462 17831,8537 17832,143 17833,2334 17834,298 17835,485 17836,10 17837,10 17837,34 17837,35 17837,217 17837,222 17837,389 17837,457 17837,536 17837,1019 17837,1072 17837,1531 17837,1724 17837,2159 17837,2266 17837,19443 17839,485 17840,485 17840,7117 17841,932 17842,83 17843,251 17844,872 17845,298 17846,485 17847,215 17847,240 17847,372 17847,417 17847,503 17847,592 17847,631 17847,760 17847,805 17847,932 17847,1016 17847,1282 17847,1285 17847,1462 17847,1564 17847,1715 17847,1818 17847,2620 17847,8537 17848,240 17848,301 17848,1785 17848,1818 17848,2620 17849,1085 17849,1181 17849,1522 17850,605 17851,4810 17853,3724 17854,693 17855,58 17856,1653 17856,1659 17858,72 17859,344 17860,285 17861,17862 17863,17476 17864,1949 17865,9098 17866,1247 17867,592 17868,171 17869,147 17869,973 17870,652 17871,17872 17873,17476 17875,592 17876,1140 17876,5547 17877,1122 17877,1241 17877,1544 17877,1849 17877,2372 17878,358 17878,1082 17879,184 17880,1893 17881,2590 17882,332 17883,615 17884,251 17884,252 17884,318 17884,516 17884,1220 17884,1222 17884,41170 17885,17886 17887,17888 17889,1511 17889,3069 17890,2775 17891,160 17892,2782 17894,46 17894,301 17894,444 17894,604 17894,615 17894,744 17894,968 17894,1124 17894,1231 17894,1293 17894,1300 17894,1949 17894,3630 17894,5662 17895,500 17896,366 17897,326 17897,79339 17897,79354 17897,113414 17897,127264 17898,17899 17898,37269 17900,298 17901,485 17902,44 17903,589 17904,726 17904,996 17904,1033 17904,1877 17905,2590 17907,640 17908,784 17908,2315 17908,3999 17909,1963 17910,376 17911,355 17912,1449 17913,192 17913,393 17913,1531 17913,4611 17914,809 17915,167 17916,2574 17917,615 17918,163 17919,86 17920,1955 17921,309 17921,310 17922,2607 17923,3193 17924,4604 17925,417 17925,1707 17926,743 17927,660 17927,2424 17927,19443 17928,647 17929,344 17931,1289 17931,1551 17932,178 17933,143 17933,1052 17934,4 17934,5 17936,298 17937,485 17938,17939 17940,298 17941,485 17942,97 17942,693 17943,640 17944,433 17945,1313 17946,17947 17948,994 17949,446 17950,72 17951,298 17952,485 17953,640 17954,1707 17955,579 17956,63 17957,1474 17958,991 17959,1227 17959,1229 17959,86416 17961,22 17962,557 17963,557 17964,862 17965,557 17966,557 17967,557 17968,5906 17969,557 17970,626 17971,278 17972,137 17973,862 17974,5906 17975,557 17976,626 17977,278 17978,137 17979,862 17980,17981 17980,160027 17982,143 17982,2926 17983,2574 17984,1515 17985,240 17986,2372 17987,298 17988,485 17989,15179 17990,298 17991,485 17992,647 17993,344 17994,17995 17996,647 17997,1474 17998,298 17999,485 18000,1016 18001,19 18001,206 18001,668 18001,875 18001,129534 18001,189842 18002,46 18003,2334 18004,304 18005,26 18005,59 18006,346 18007,346 18008,18009 18010,991 18011,671 18013,104 18013,441 18013,838 18013,1014 18013,1309 18014,18015 18016,1381 18017,305 18018,22 18018,94 18018,158 18018,211 18018,240 18018,294 18018,315 18018,366 18018,1655 18018,2787 18018,22293 18019,143 18020,805 18021,275 18021,277 18021,333 18021,2073 18022,18023 18024,440 18024,622 18025,211 18025,1639 18026,217 18026,920 18026,1033 18026,1181 18027,184 18028,22 18028,1227 18028,1229 18028,21944 18028,86416 18029,509 18031,1235 18031,1335 18032,315 18033,366 18034,389 18036,18037 18038,918 18039,264 18039,515 18039,652 18039,1007 18039,1639 18039,2626 18040,143 18041,298 18042,485 18043,163 18044,20 18044,366 18044,424 18044,500 18044,622 18044,1033 18044,1388 18044,1531 18044,1590 18044,4455 18045,151 18045,749 18045,985 18046,784 18047,18048 18049,18048 18050,18048 18051,18048 18052,18048 18053,2681 18054,158 18054,406 18054,438 18054,585 18054,2931 18055,18056 18057,10 18058,18059 18058,51586 18060,18061 18060,21105 18060,115785 18062,452 18063,596 18064,18065 18064,18682 18066,99 18067,72 18068,292 18069,294 18070,296 18071,298 18072,58 18072,87 18072,292 18072,442 18072,801 18072,872 18072,1140 18072,1146 18072,1177 18072,1326 18072,1392 18072,1653 18072,1836 18072,1893 18072,2334 18072,2436 18072,3474 18072,3804 18072,5547 18072,54004 18073,3507 18074,2681 18076,611 18077,72 18078,515 18079,2089 18079,2940 18080,18081 18082,3111 18083,563 18084,872 18085,1370 18087,233 18088,3 18089,1118 18089,2073 18090,8 18092,710 18092,1127 18092,1224 18093,567 18094,1882 18095,515 18096,1 18096,2089 18096,2940 18097,911 18097,6638 18097,48505 18098,444 18098,604 18098,968 18098,1124 18098,1293 18099,163 18100,3555 18101,5469 18102,1381 18102,1531 18103,364 18103,431 18103,1252 18103,1253 18104,292 18104,1177 18104,2443 18105,1968 18107,704 18108,211 18108,259 18108,393 18108,788 18109,893 18110,163 18110,467 18111,1143 18113,163 18114,147 18115,818 18115,1019 18116,346 18116,435 18116,1849 18117,1639 18118,1579 18120,163 18121,58 18122,46 18123,163 18124,178 18124,272 18124,447 18124,538 18124,671 18124,934 18125,26 18125,59 18125,994 18126,87 18126,392 18126,1151 18126,1363 18126,1454 18127,298 18128,485 18129,217 18129,301 18129,599 18129,604 18129,1782 18129,3193 18130,424 18131,1722 18132,1117 18133,1566 18133,1789 18134,143 18135,397 18137,1805 18137,3193 18138,433 18138,1634 18139,1096 18140,2373 18141,1012 18141,7757 18142,104 18142,120 18142,261 18142,338 18142,536 18142,710 18142,1274 18143,1893 18143,2051 18144,309 18144,310 18145,1715 18146,240 18146,818 18147,163 18147,302 18147,579 18147,861 18147,1556 18148,455 18149,72 18150,710 18152,290 18152,590 18152,1282 18152,1511 18152,2206 18152,2210 18152,31725 18152,33424 18153,298 18154,485 18155,255 18156,1240 18157,415 18158,1235 18158,1335 18158,5375 18159,72 18160,760 18160,1631 18161,704 18162,567 18163,14458 18164,106 18164,280 18164,393 18164,505 18164,980 18164,1821 18164,2782 18165,222 18165,455 18165,1019 18166,3585 18167,1326 18168,599 18170,1858 18171,1860 18172,202 18172,203 18172,2371 18173,1425 18174,158 18175,104 18175,134 18176,309 18176,310 18177,818 18178,306 18178,307 18179,687 18179,1556 18180,97 18180,15609 18181,72 18182,1224 18183,1858 18184,1860 18185,647 18185,1175 18185,1927 18186,1326 18187,485 18187,1893 18188,744 18189,399 18190,135 18190,1052 18191,1801 18191,6955 18193,58 18193,534 18193,589 18194,30 18194,50 18194,328 18194,440 18194,622 18194,631 18194,794 18194,809 18194,838 18194,1033 18194,1085 18194,1179 18194,1332 18194,1659 18194,1939 18194,3246 18194,3247 18194,141912 18195,202 18195,203 18196,163 18196,579 18197,1313 18199,500 18201,516 18204,65 18204,467 18207,868 18209,163 18210,571 18210,868 18210,81233 18214,571 18214,5212 18218,178 18218,571 18218,868 18218,1740 18218,1877 18218,156379 18219,571 18220,439 18220,1068 18220,1474 18220,1612 18220,1789 18221,571 18221,868 18221,1085 18221,1133 18221,1326 18221,221068 18224,467 18224,920 18224,1392 18224,152855 18224,156379 18225,868 18233,571 18233,868 18238,309 18238,310 18239,79 18239,192 18239,406 18239,622 18240,525 18240,663 18240,818 18240,868 18240,1370 18240,1623 18241,163 18241,302 18241,868 18241,1556 18241,2116 18242,571 18242,868 18244,467 18244,868 18244,81233 18244,156379 18244,162599 18245,240 18245,392 18245,433 18245,818 18246,1631 18248,66 18248,68 18248,83 18248,120 18248,151 18248,388 18248,392 18248,467 18248,536 18248,599 18248,868 18248,1019 18248,2083 18248,141912 18248,162599 18249,66 18249,467 18249,571 18249,868 18249,1241 18249,1326 18249,2083 18249,2353 18249,31206 18250,66 18250,467 18250,868 18254,571 18256,149 18256,178 18256,211 18256,467 18256,516 18256,571 18256,615 18256,1345 18261,192 18261,868 18261,6682 18262,571 18262,718 18264,65 18265,687 18265,868 18265,907 18265,1556 18265,4453 18268,868 18270,571 18270,868 18271,571 18271,694 18272,920 18275,163 18281,192 18281,571 18281,868 18281,2373 18284,149 18284,571 18284,868 18288,79 18289,571 18291,273 18291,571 18291,868 18294,358 18295,392 18295,697 18295,1240 18297,126 18297,452 18297,497 18297,676 18297,843 18297,918 18297,1011 18297,18298 18298,192 18298,256 18298,676 18298,852 18298,1014 18298,1663 18298,4165 18298,9457 18298,67223 18298,72713 18298,82102 18298,85419 18298,89362 18298,89778 18298,156994 18298,186264 18299,240 18299,442 18299,503 18299,1564 18299,1608 18299,3538 18299,3585 18300,151 18300,1893 18301,79 18303,571 18303,868 18304,571 18304,868 18307,433 18308,868 18309,439 18309,571 18309,868 18309,872 18309,1052 18309,1893 18309,49057 18310,2353 18312,868 18313,240 18313,309 18313,310 18315,1893 18315,7155 18320,1849 18326,571 18328,3 18328,65 18328,158 18328,202 18328,203 18328,393 18328,571 18328,862 18328,1243 18328,1871 18328,2867 18328,2868 18328,14483 18333,349 18333,392 18333,433 18333,868 18333,1240 18337,536 18338,640 18339,640 18340,1010 18340,1849 18341,640 18342,640 18343,640 18344,222 18344,336 18344,1836 18344,1973 18344,2744 18344,2775 18344,118336 18345,222 18345,313 18345,356 18345,477 18345,634 18345,1571 18345,1881 18345,2224 18345,2266 18345,5326 18345,7698 18345,8463 18348,1509 18349,596 18351,596 18352,596 18353,596 18357,571 18357,868 18357,1019 18357,1462 18357,2286 18357,8537 18358,571 18361,163 18361,467 18361,571 18361,868 18361,1345 18364,312 18366,467 18367,79 18367,571 18371,868 18372,579 18372,868 18373,264 18377,158 18377,440 18377,467 18377,3804 18379,417 18381,571 18382,136 18382,2557 18383,455 18383,1210 18384,349 18384,697 18384,3260 18386,1449 18387,120 18387,301 18387,388 18387,389 18387,571 18387,657 18387,868 18387,1293 18387,1634 18387,15609 18388,389 18388,1454 18389,431 18397,34 18397,35 18397,217 18397,435 18397,455 18397,467 18397,536 18397,571 18397,868 18397,2837 18397,81233 18397,156379 18397,162599 18398,283 18398,326 18398,571 18398,868 18398,1454 18398,19443 18400,349 18400,392 18400,433 18400,503 18400,832 18400,1836 18400,2671 18400,141912 18402,163 18402,209 18402,302 18402,579 18402,861 18402,2116 18404,571 18404,2371 18407,26 18407,59 18408,485 18410,1117 18412,32751 18413,571 18413,868 18415,516 18416,346 18416,435 18416,934 18416,1033 18417,1143 18419,87 18419,868 18419,1454 18420,571 18422,313 18422,1019 18423,571 18423,1688 18424,163 18425,417 18425,1085 18426,1096 18427,50 18428,26 18428,59 18430,32 18430,392 18433,292 18433,760 18433,968 18433,1417 18433,1522 18433,141912 18435,4 18435,5 18435,13704 18436,577 18438,467 18438,868 18439,832 18440,240 18441,306 18441,307 18441,4810 18442,535 18442,1151 18443,2073 18444,2436 18445,577 18446,649 18447,1370 18447,1821 18448,406 18449,393 18450,760 18450,1149 18450,1266 18450,1631 18451,186 18452,859 18453,146 18454,1447 18455,5192 18457,3 18457,200 18457,252 18457,289 18457,290 18457,328 18457,393 18457,493 18457,592 18457,772 18457,779 18457,1085 18457,1149 18457,1231 18457,1515 18457,1715 18457,2296 18457,3193 18457,5662 18457,94134 18458,18459 18460,671 18461,79 18462,79 18463,534 18464,592 18465,920 18465,1089 18465,1332 18465,22071 18466,1227 18466,1229 18466,1252 18466,1253 18467,1323 18468,102 18469,1326 18470,408 18471,34 18471,35 18472,626 18472,2995 18473,481 18474,349 18474,392 18475,163 18476,1374 18476,2116 18477,673 18478,516 18479,682 18479,784 18479,1222 18479,1568 18479,2944 18479,7385 18479,14037 18479,17681 18479,18479 18479,18480 18479,26861 18479,30428 18479,34386 18479,57114 18479,58932 18479,59771 18479,66401 18479,70426 18479,72439 18479,82295 18479,139564 18479,162604 18479,162611 18479,234087 18479,264503 18481,389 18481,1858 18482,46 18482,58 18482,1124 18482,75912 18484,859 18485,1566 18486,2319 18487,333 18487,1149 18488,703 18489,1096 18491,349 18491,425 18491,875 18491,1117 18491,3260 18492,126 18493,980 18494,3804 18495,158 18496,652 18496,1634 18499,22 18499,818 18499,18245 18499,39511 18500,1140 18500,1149 18500,1326 18500,1411 18500,3804 18501,304 18501,356 18502,577 18502,1105 18502,1429 18503,66 18504,1122 18505,2205 18506,2206 18507,1877 18508,388 18509,920 18511,596 18511,907 18514,264 18515,134 18515,200 18515,298 18515,372 18515,1511 18515,1962 18515,3069 18515,8180 18517,392 18520,83 18521,298 18522,485 18523,3960 18524,167 18524,301 18524,1837 18526,623 18526,663 18526,685 18526,973 18527,1070 18528,240 18528,1203 18529,18530 18531,217 18531,302 18531,2116 18532,66 18532,868 18533,41 18536,422 18537,422 18538,14550 18539,422 18540,422 18541,34 18541,35 18542,422 18543,68 18543,852 18543,1119 18544,932 18545,422 18546,1096 18547,3238 18548,500 18550,309 18550,310 18551,631 18552,336 18553,604 18554,1454 18555,1556 18556,1070 18559,859 18559,1105 18559,1429 18560,392 18560,872 18560,1151 18561,13 18562,298 18563,485 18564,309 18564,310 18564,3039 18565,604 18566,283 18566,455 18566,536 18566,1467 18566,1881 18566,2266 18567,15 18567,58 18567,994 18567,3538 18567,7360 18568,1434 18571,1564 18572,222 18575,1454 18575,1805 18576,2073 18578,298 18579,485 18580,717 18581,10 18582,85 18583,126 18584,219 18585,3804 18586,120 18587,326 18587,752 18587,874 18587,1210 18588,577 18589,1425 18592,19 18593,344 18593,1140 18593,5547 18594,298 18595,485 18596,143 18597,422 18598,422 18599,422 18600,749 18600,999 18601,240 18603,290 18603,592 18603,704 18603,1818 18604,444 18604,972 18604,2253 18604,3392 18605,269 18605,1001 18605,2979 18607,392 18608,304 18608,1715 18609,1143 18610,1639 18611,1579 18612,783 18612,2737 18614,1881 18615,535 18616,8180 18617,160 18617,1381 18619,79 18620,240 18620,1085 18621,592 18622,298 18623,485 18624,1133 18625,222 18625,2596 18625,5405 18626,372 18626,775 18626,852 18626,2209 18627,22 18627,79 18627,186 18627,217 18627,309 18627,310 18627,392 18627,435 18627,609 18627,1019 18627,1085 18627,2979 18627,3182 18628,14231 18629,240 18630,868 18631,392 18631,623 18631,1722 18631,1805 18632,107 18632,2416 18632,2417 18633,485 18634,312 18635,337 18635,920 18636,79 18636,136 18636,137 18637,500 18637,1181 18637,60576 18639,1181 18639,5874 18639,8244 18639,18640 18639,92476 18639,106502 18640,192 18640,18638 18642,22 18643,1096 18644,3258 18645,209 18646,50 18646,149 18646,406 18646,620 18646,622 18646,141912 18647,240 18647,1203 18647,8276 18648,957 18648,1815 18649,868 18650,222 18650,313 18650,385 18650,455 18650,657 18650,1019 18650,1274 18650,1467 18650,1618 18650,1718 18650,2779 18650,4637 18650,45437 18650,58376 18650,183456 18651,20 18651,83 18651,309 18651,310 18651,577 18651,929 18651,1400 18651,2372 18651,21442 18651,21944 18652,1977 18652,1978 18653,843 18654,313 18654,2646 18654,2944 18654,18831 18655,252 18655,318 18655,41170 18656,104 18657,22 18658,577 18658,1070 18659,18660 18661,1001 18661,1085 18661,75912 18662,720 18663,18664 18667,68 18667,211 18667,1837 18668,1319 18669,272 18669,333 18669,516 18669,1877 18669,2006 18669,4545 18669,139010 18669,194663 18669,240174 18670,1891 18670,1973 18671,1118 18672,444 18672,932 18672,972 18673,104 18673,111 18673,215 18673,298 18673,557 18673,588 18673,590 18673,714 18673,805 18673,1282 18673,1368 18673,1745 18673,1955 18673,2205 18673,33424 18675,1282 18676,1414 18677,994 18678,431 18678,749 18678,801 18678,1146 18678,1241 18678,2083 18679,720 18679,907 18679,1117 18679,1284 18680,1707 18681,2512 18683,1433 18684,3 18685,477 18686,3252 18687,10 18687,97 18688,301 18688,968 18688,1204 18690,346 18691,48 18691,338 18691,736 18691,2051 18692,149 18692,406 18693,623 18694,1001 18695,586 18696,497 18696,713 18697,50 18698,264 18698,1370 18699,18700 18699,53605 18699,104855 18701,143 18703,146 18704,893 18704,1146 18705,158 18705,406 18706,809 18707,644 18708,298 18709,485 18710,3 18710,147 18710,195 18710,225 18710,240 18710,1769 18710,68069 18710,86832 18711,623 18711,1240 18712,527 18713,435 18714,305 18715,5101 18716,5101 18717,1284 18719,338 18720,304 18721,225 18722,425 18722,1276 18722,3507 18722,19488 18723,1402 18725,9029 18726,1085 18726,17698 18726,18726 18726,18727 18726,22555 18726,29619 18726,32058 18726,45066 18726,53863 18726,53878 18726,54077 18726,54081 18726,54084 18726,54085 18726,54086 18726,54822 18726,102881 18726,131968 18726,235000 18727,68955 18728,808 18728,1453 18729,360 18729,647 18729,710 18729,3177 18730,483 18731,136 18731,137 18731,439 18733,251 18733,516 18733,1033 18734,1285 18735,338 18736,195 18737,278 18737,18738 18739,995 18739,1069 18739,1771 18739,3407 18739,5052 18739,5186 18739,5451 18739,6058 18739,6474 18739,8107 18739,13198 18739,13524 18739,15580 18739,16192 18739,18388 18739,18737 18739,20704 18739,21200 18739,25685 18739,28910 18739,29662 18739,31278 18739,31726 18739,31727 18739,31728 18739,31729 18739,31730 18739,31731 18739,31732 18739,31733 18739,31734 18739,31735 18739,31736 18739,31737 18739,31738 18739,31739 18739,31740 18739,31741 18739,31742 18739,31743 18739,31744 18739,31745 18739,31746 18739,31747 18739,31748 18739,31749 18739,31750 18739,31751 18739,31752 18739,31753 18739,31754 18739,31755 18739,31756 18739,31757 18739,31758 18739,31759 18739,31760 18739,31761 18739,31762 18739,31763 18739,31764 18739,31765 18739,31766 18739,31767 18739,31768 18739,31769 18739,31770 18739,31771 18739,31772 18739,31773 18739,31774 18739,31775 18739,31776 18739,31777 18739,31778 18739,31779 18739,31780 18739,31781 18739,31782 18739,31783 18739,31784 18739,31785 18739,31786 18739,31787 18739,31788 18739,31789 18739,31790 18739,31791 18739,31792 18739,31793 18739,31794 18739,31795 18739,31796 18739,31797 18739,31798 18739,31799 18739,31800 18739,31801 18739,31802 18739,34416 18739,36981 18740,392 18740,1240 18741,2334 18742,1284 18743,18744 18745,500 18746,694 18749,1858 18750,1860 18751,516 18752,163 18753,48 18753,163 18753,489 18753,5102 18753,193129 18754,302 18754,861 18755,1608 18756,628 18756,1118 18756,1210 18756,1639 18756,2266 18756,8235 18757,287 18758,247 18760,147 18761,333 18761,59021 18763,2373 18764,8 18764,309 18764,310 18766,760 18767,1858 18768,1860 18769,577 18770,602 18771,920 18772,1240 18772,2671 18773,309 18773,310 18773,2312 18774,2334 18775,163 18776,631 18777,489 18777,1276 18778,527 18779,577 18780,733 18781,626 18782,1849 18782,1955 18783,3 18783,233 18783,301 18784,302 18784,811 18784,1877 18785,192 18785,1181 18787,868 18788,5101 18789,18790 18791,87 18791,392 18791,1151 18791,1363 18791,1836 18793,163 18793,489 18794,640 18795,240 18796,973 18796,2367 18797,779 18798,760 18799,264 18799,1289 18800,872 18801,151 18802,120 18803,225 18805,209 18806,147 18806,158 18806,195 18806,333 18806,406 18806,585 18806,622 18806,779 18806,920 18806,1181 18806,1247 18806,1414 18806,3370 18806,8270 18806,8868 18806,18810 18806,164572 18807,577 18808,2421 18809,2574 18811,1 18811,1663 18812,83 18813,117 18813,885 18813,1462 18813,2712 18813,8537 18813,13704 18814,83 18815,192 18815,663 18815,664 18815,809 18815,1425 18817,493 18817,704 18818,393 18819,2209 18820,312 18821,72 18822,151 18822,2173 18823,788 18824,772 18825,3258 18826,841 18827,83 18827,949 18828,1243 18829,660 18829,7092 18830,2051 18831,10 18831,217 18831,536 18831,634 18831,1571 18831,2159 18831,2168 18831,2224 18831,2646 18831,2906 18831,3016 18831,4048 18831,6064 18831,8554 18831,13622 18831,14612 18831,15017 18831,18654 18831,18832 18831,19834 18831,20201 18831,20875 18831,23550 18831,24885 18831,28479 18831,28600 18831,29259 18831,29606 18831,30308 18831,30601 18831,30617 18831,30721 18831,30735 18831,30736 18831,31360 18831,37110 18831,48208 18831,48262 18831,49113 18831,49262 18831,49551 18831,55210 18831,55244 18831,55561 18831,57187 18831,59344 18831,59763 18831,59769 18831,59788 18831,59793 18831,59794 18831,59796 18831,59799 18831,59805 18831,59806 18831,59807 18831,59809 18831,59810 18831,59814 18831,59819 18831,59820 18831,59822 18831,61355 18831,62600 18831,63961 18831,69363 18831,71035 18831,82176 18831,86767 18831,94195 18831,102569 18831,106104 18831,115474 18831,119411 18831,119412 18831,119512 18831,120859 18831,121396 18831,124639 18831,125972 18831,125986 18831,127102 18831,127776 18831,128160 18831,130732 18831,130783 18831,131384 18831,131918 18831,133488 18831,133774 18831,134056 18831,134249 18831,138278 18831,140124 18831,142573 18831,142609 18831,142809 18831,143054 18831,143504 18831,144148 18831,144268 18831,145659 18831,146170 18831,146304 18831,146706 18831,147848 18831,147923 18831,147982 18831,148130 18831,148199 18831,148489 18831,148578 18831,148605 18831,148669 18831,148720 18831,148942 18831,148944 18831,149153 18831,149394 18831,149460 18831,149462 18831,149463 18831,149467 18831,149695 18831,150173 18831,150177 18831,150181 18831,150357 18831,150736 18831,150748 18831,150754 18831,150786 18831,150858 18831,152332 18831,152717 18831,152915 18831,153374 18831,153517 18831,154495 18831,154657 18831,155162 18831,155211 18831,155365 18831,155423 18831,155429 18831,155454 18831,155488 18831,155625 18831,157400 18831,157487 18831,157839 18831,158558 18831,158633 18831,160809 18831,160944 18831,162128 18831,162685 18831,163001 18831,164358 18832,392 18832,536 18832,1284 18832,1893 18832,3474 18832,5130 18832,18831 18833,611 18834,1392 18834,156379 18836,13980 18837,135 18837,138 18838,111 18838,442 18838,801 18838,1140 18838,1177 18838,1449 18839,809 18840,1544 18841,32 18841,392 18842,1359 18843,1711 18844,104 18844,852 18845,2083 18846,1238 18847,1572 18848,312 18849,72 18850,3538 18852,309 18852,310 18853,1179 18854,34 18854,35 18854,217 18854,240 18854,907 18854,973 18854,1001 18854,1133 18854,1284 18854,1467 18854,1715 18854,2205 18854,2206 18854,5976 18854,9018 18854,19946 18856,1635 18857,1803 18858,251 18858,516 18860,135 18861,1782 18862,875 18863,3630 18864,44 18865,536 18865,4672 18866,1619 18867,3585 18869,151 18870,535 18871,652 18872,48 18873,1659 18873,2367 18874,1955 18875,346 18876,991 18877,104 18877,195 18877,850 18878,920 18879,151 18881,34 18881,35 18881,313 18881,852 18882,360 18883,389 18884,1467 18885,135 18886,344 18886,647 18888,376 18889,885 18890,240 18890,1082 18890,1309 18890,1807 18890,1888 18890,1955 18890,2775 18890,3135 18891,2372 18892,850 18893,217 18894,2646 18896,1417 18897,195 18898,79 18899,1082 18900,372 18901,1241 18902,1849 18904,932 18905,1479 18906,809 18907,1188 18908,252 18908,682 18908,1243 18909,1983 18910,1267 18911,72 18912,6621 18912,17140 18912,21944 18913,379 18914,2421 18915,1858 18916,1860 18917,135 18918,592 18919,602 18920,301 18921,14819 18922,2424 18923,406 18924,192 18925,818 18926,30 18927,704 18928,72 18929,225 18930,631 18930,1462 18931,406 18931,779 18932,247 18933,41 18933,104 18933,107 18933,138 18933,248 18933,289 18933,290 18933,784 18933,5405 18933,94134 18934,135 18935,72 18936,399 18937,1238 18938,1579 18939,1639 18940,13980 18941,302 18941,861 18941,1381 18941,1556 18941,152855 18942,503 18943,422 18944,2421 18945,818 18946,83 18947,994 18948,536 18948,4672 18949,119 18949,192 18949,309 18949,310 18949,577 18949,1400 18949,21944 18950,1619 18951,1452 18952,1467 18953,195 18954,1370 18955,1983 18956,217 18956,222 18956,1417 18957,72 18958,376 18959,4823 18959,21944 18960,392 18960,415 18960,1240 18960,1454 18960,1465 18960,3260 18961,455 18962,1417 18963,72 18964,676 18965,104 18965,134 18965,289 18965,290 18965,364 18965,557 18965,784 18965,1016 18965,1359 18965,2775 18965,3115 18965,94134 18966,18967 18968,718 18968,893 18969,2421 18970,1359 18970,16614 18971,7416 18972,1860 18973,3612 18974,595 18975,2274 18976,392 18977,4760 18978,6059 18979,5658 18980,4252 18981,623 18982,697 18983,6955 18984,366 18984,2607 18985,422 18987,298 18988,485 18989,215 18989,1016 18989,1212 18989,1257 18989,1282 18989,1882 18989,4237 18989,182162 18990,1243 18991,1871 18992,389 18995,312 18996,818 18997,56 18997,146 18997,147 18997,192 18997,333 18997,336 18997,602 18997,620 18997,682 18997,994 18997,1089 18997,1181 18997,8244 18997,72439 18997,204124 18997,240174 18998,397 18999,298 19000,485 19001,72 19002,304 19003,364 19004,143 19005,1001 19005,1149 19005,2146 19005,5102 19006,907 19007,247 19008,536 19009,19010 19010,287 19010,392 19010,685 19010,697 19010,809 19010,903 19010,911 19010,918 19010,2016 19010,2418 19010,2475 19010,3258 19010,4066 19010,15913 19010,17852 19010,19009 19010,19010 19010,21139 19010,22293 19010,22377 19010,23158 19010,23169 19010,24680 19010,24790 19010,26071 19010,26256 19010,30378 19010,32677 19010,34175 19010,35959 19010,43279 19010,43896 19010,46812 19010,48648 19010,50449 19010,67537 19010,70741 19010,70818 19010,71142 19010,77816 19010,80431 19010,80630 19010,80667 19010,82721 19010,82900 19010,83810 19010,86483 19010,90837 19010,91892 19010,98227 19010,109434 19010,115066 19010,121959 19010,124896 19010,125481 19010,125906 19010,127720 19010,127808 19010,134030 19010,134067 19010,134773 19010,135559 19010,136162 19010,136659 19010,136993 19010,137197 19010,137198 19010,151540 19010,154198 19010,158997 19010,159457 19010,161184 19010,163445 19010,169012 19010,169312 19010,174839 19010,178733 19010,187826 19010,191939 19010,193613 19010,198515 19010,206537 19010,211923 19010,221144 19010,224874 19010,231094 19010,240067 19010,243480 19010,243986 19010,245293 19010,245298 19010,248015 19010,254401 19010,255574 19010,257077 19011,1618 19012,920 19013,298 19014,485 19015,143 19016,116 19016,151 19016,717 19016,991 19016,2048 19016,2087 19017,72 19018,344 19019,285 19020,83 19021,536 19022,83 19023,83 19024,2671 19025,79 19025,99 19025,1181 19026,1506 19026,22125 19027,118 19027,233 19027,302 19027,422 19027,1844 19027,4597 19027,5405 19028,516 19032,312 19033,850 19034,72 19035,704 19036,346 19037,1001 19037,4193 19038,15523 19039,422 19040,56 19041,875 19042,346 19043,422 19044,56 19045,298 19046,485 19047,79 19047,140 19047,178 19047,202 19047,203 19047,424 19047,718 19047,760 19047,818 19047,1368 19047,1715 19047,2045 19047,2205 19047,2206 19047,2416 19047,2417 19047,3085 19047,3331 19048,79 19048,111 19048,178 19048,192 19048,296 19048,585 19048,592 19048,718 19048,760 19048,818 19048,1715 19048,2045 19048,2205 19048,2206 19048,3085 19048,3331 19049,5375 19050,298 19051,485 19056,907 19056,2979 19057,485 19058,143 19059,2775 19060,447 19061,58 19061,534 19061,75912 19062,240 19063,19064 19063,149981 19068,980 19069,818 19070,781 19071,37 19071,717 19071,1782 19072,390 19073,450 19074,1467 19075,1149 19076,557 19077,557 19078,143 19079,18790 19080,875 19081,143 19082,158 19083,19084 19085,2434 19086,5213 19087,248 19087,450 19087,717 19087,1332 19088,2073 19088,2782 19088,5908 19089,187 19090,104 19091,2506 19092,2506 19093,2506 19094,781 19095,631 19096,143 19097,269 19098,1085 19099,417 19099,3069 19100,417 19100,3069 19103,497 19104,450 19105,515 19106,2506 19107,2506 19108,298 19109,485 19110,79 19110,309 19110,310 19110,364 19111,22 19111,972 19112,143 19113,450 19114,406 19115,1634 19116,784 19117,83 19117,178 19117,442 19117,500 19118,1127 19120,272 19120,934 19120,1449 19121,887 19122,718 19122,893 19123,850 19124,450 19125,10 19125,79 19125,81 19125,147 19125,158 19125,192 19125,202 19125,203 19125,289 19125,290 19125,305 19125,333 19125,336 19125,337 19125,406 19125,586 19125,602 19125,620 19125,663 19125,760 19125,1392 19125,1623 19125,2244 19125,94134 19125,118336 19126,1608 19126,77315 19127,758 19128,4611 19129,1544 19130,313 19130,2421 19131,30 19132,44725 19133,19134 19135,652 19136,143 19137,50 19138,247 19139,1417 19140,206 19141,184 19142,58 19142,872 19143,147 19143,158 19143,195 19143,779 19144,497 19145,19146 19147,1313 19148,602 19149,602 19150,602 19151,143 19152,4222 19153,26 19153,47 19153,59 19153,885 19153,887 19153,1432 19153,2469 19153,21944 19154,994 19154,1179 19155,298 19156,485 19157,1858 19158,1860 19159,1556 19160,1309 19161,19162 19163,5212 19163,6682 19164,72 19165,920 19166,1860 19167,3612 19168,1309 19169,595 19170,2274 19171,392 19172,4760 19173,6059 19174,5658 19175,4252 19176,623 19177,697 19178,6955 19179,8788 19180,247 19181,493 19182,192 19183,10 19184,115 19184,118 19184,330 19184,1235 19185,422 19186,422 19187,422 19188,422 19189,422 19190,422 19191,346 19191,435 19191,439 19191,980 19191,996 19191,1033 19191,1849 19191,6661 19191,13486 19192,19193 19194,843 19195,163 19196,72 19197,344 19198,285 19199,1871 19199,2421 19200,19201 19203,887 19204,19193 19204,95788 19205,192 19205,663 19205,1370 19205,3872 19206,272 19207,30 19208,406 19209,389 19209,4903 19210,26 19210,59 19210,885 19211,217 19211,1019 19211,2784 19211,5906 19212,596 19213,379 19214,1531 19215,143 19216,10 19217,417 19217,1085 19217,2296 19218,77 19218,5440 19219,19220 19221,1467 19222,2421 19223,83 19224,63 19224,6119 19225,138 19226,784 19227,19227 19228,795 19228,5961 19229,104 19230,1001 19231,26 19231,59 19231,430 19231,1235 19231,1335 19231,1432 19231,21944 19232,26 19232,59 19232,21944 19233,1871 19234,1309 19235,146 19236,422 19237,56 19238,147 19238,149 19238,158 19238,2244 19239,704 19240,1368 19241,19242 19243,182 19243,188 19243,7652 19244,366 19245,366 19246,366 19247,247 19248,81 19249,158 19250,149 19250,192 19251,872 19252,390 19253,323 19254,387 19255,1531 19256,233 19257,19258 19259,19258 19260,19258 19261,19258 19262,19258 19263,1564 19264,602 19265,19266 19265,35762 19267,515 19268,602 19269,602 19270,219 19271,422 19272,56 19273,72 19274,102 19274,1323 19275,312 19275,525 19275,1749 19276,497 19277,1381 19278,104 19278,233 19278,302 19278,577 19278,636 19278,760 19278,862 19278,1070 19278,1462 19278,1745 19278,1893 19278,2205 19278,3769 19278,7757 19278,8537 19278,33424 19278,68069 19279,577 19279,920 19280,182 19280,188 19280,202 19280,203 19280,1844 19281,571 19281,868 19282,19283 19282,43899 19282,54591 19284,1181 19285,28107 19286,634 19286,657 19286,1718 19286,1881 19286,2646 19286,2779 19286,4637 19286,5034 19286,45437 19286,183456 19287,586 19289,163 19289,489 19290,1326 19291,298 19292,485 19293,160 19293,360 19293,1893 19294,298 19295,485 19296,287 19296,433 19296,1607 19296,1634 19297,255 19298,644 19299,422 19299,602 19299,623 19299,707 19299,779 19299,1805 19299,22293 19299,207837 19300,1634 19301,957 19301,1815 19303,611 19304,1220 19304,1222 19305,19306 19307,217 19308,3451 19308,3452 19310,760 19311,1506 19312,583 19313,579 19313,861 19314,364 19315,704 19316,298 19317,485 19319,422 19320,56 19321,2421 19322,19323 19322,48813 19322,76594 19322,81404 19324,19325 19326,3769 19327,19328 19329,209 19330,79 19331,130 19331,264 19331,312 19331,360 19331,467 19331,649 19331,652 19331,736 19331,1007 19331,1147 19331,1381 19331,1551 19331,1556 19331,1893 19332,163 19333,483 19333,2421 19334,972 19335,314 19335,852 19335,1177 19335,1844 19335,2210 19335,4237 19335,182162 19336,10 19336,175 19336,693 19336,13919 19337,2779 19338,5212 19339,86 19339,775 19340,314 19340,733 19341,422 19342,56 19343,37 19343,1782 19344,306 19344,307 19346,647 19347,459 19347,497 19347,589 19347,868 19348,1707 19350,19351 19350,19352 19351,2424 19351,7768 19351,211889 19352,54 19352,222 19352,283 19352,1784 19352,1861 19352,2424 19352,5435 19352,18835 19352,79966 19352,84609 19352,88523 19352,91271 19352,93052 19352,111397 19352,118044 19352,118942 19352,137217 19352,161322 19352,165814 19352,172564 19352,173765 19353,146 19354,147 19355,19356 19357,1453 19358,130 19358,827 19359,287 19360,640 19361,893 19361,55077 19362,640 19363,1276 19364,710 19365,175 19366,392 19366,1240 19366,1465 19366,1769 19366,1949 19366,3003 19366,6556 19367,518 19367,1113 19367,1323 19368,1860 19369,3612 19370,595 19371,2274 19372,392 19373,4760 19374,6059 19375,5658 19376,4252 19377,623 19378,697 19379,6955 19380,3 19381,160 19382,1579 19383,1639 19384,287 19384,811 19384,1634 19384,3260 19384,3769 19385,50 19385,99 19385,336 19385,779 19386,1419 19387,301 19387,1955 19387,2979 19387,3804 19388,309 19388,310 19389,859 19389,5102 19390,1309 19391,298 19392,178 19392,387 19393,485 19394,861 19395,2274 19396,366 19397,6303 19398,72 19399,344 19400,285 19401,248 19402,740 19402,741 19402,743 19403,206 19403,273 19403,274 19405,1052 19406,500 19407,422 19408,56 19409,717 19410,349 19410,1240 19411,435 19411,1181 19412,1001 19413,147 19413,158 19413,178 19413,207 19413,256 19413,259 19413,433 19413,452 19413,481 19413,500 19413,581 19413,604 19413,668 19413,911 19413,1014 19413,1172 19413,1262 19413,1326 19413,1445 19413,1518 19413,1603 19413,1614 19413,1653 19413,1655 19413,1801 19413,3392 19413,3555 19413,4237 19413,4276 19413,5213 19413,6918 19413,9021 19413,10548 19413,19413 19413,20342 19413,20724 19413,26806 19413,27000 19413,48607 19413,52441 19413,57292 19413,76297 19413,76704 19413,81233 19413,89035 19413,92140 19413,134732 19413,136477 19413,136550 19413,137008 19413,176028 19413,182162 19413,223725 19414,1262 19415,292 19415,338 19415,462 19415,1653 19415,1688 19415,1893 19415,37414 19416,209 19416,467 19417,63 19419,726 19421,1113 19422,702 19422,703 19422,873 19422,874 19423,534 19424,298 19425,485 19426,211 19426,366 19427,623 19428,3585 19429,602 19429,623 19429,707 19432,364 19432,1087 19433,77 19433,2784 19434,623 19435,192 19435,1433 19435,3744 19436,206 19437,634 19439,852 19440,1955 19441,875 19442,184 19442,457 19442,859 19442,1368 19442,15179 19443,19 19443,385 19443,389 19443,477 19443,660 19443,852 19443,951 19443,1069 19443,1618 19443,1724 19443,1916 19443,2159 19443,2168 19443,2507 19443,2646 19443,4637 19443,5326 19443,5721 19443,6506 19443,7768 19443,8431 19443,8658 19443,13137 19443,13240 19443,15562 19443,17837 19443,18345 19443,18398 19443,19443 19443,19444 19443,19450 19443,21733 19443,22172 19443,22253 19443,23287 19443,26763 19443,28130 19443,28844 19443,30502 19443,34127 19443,38139 19443,40025 19443,41108 19443,41167 19443,42132 19443,44973 19443,55035 19443,56375 19443,56383 19443,56457 19443,56478 19443,56484 19443,56488 19443,56496 19443,56502 19443,56903 19443,58829 19443,59873 19443,61019 19443,61177 19443,61335 19443,63473 19443,68459 19443,71026 19443,79300 19443,83443 19443,90162 19443,91886 19443,95625 19443,103913 19443,108085 19443,115474 19443,118449 19443,154391 19443,161861 19443,175919 19443,192892 19443,212959 19443,239970 19443,248235 19444,19443 19445,346 19445,996 19446,4 19446,5 19446,5405 19448,1977 19448,1978 19449,2286 19450,19443 19451,294 19451,304 19451,717 19451,772 19451,784 19452,389 19452,5405 19453,668 19453,1607 19454,760 19454,1631 19455,2779 19455,4594 19456,99 19457,30 19457,147 19457,200 19457,248 19457,406 19457,439 19457,772 19457,1243 19457,1515 19457,28203 19458,1247 19459,1 19459,4805 19459,113878 19460,3507 19461,579 19462,392 19463,859 19464,985 19466,26 19466,47 19466,59 19466,118 19466,885 19466,887 19466,1722 19466,1775 19466,2469 19466,3794 19466,4597 19466,21944 19466,86298 19467,1512 19467,5992 19468,22 19468,240 19468,1655 19469,10 19470,1118 19472,1085 19473,163 19475,760 19475,1631 19476,349 19477,79 19478,171 19479,54 19480,489 19480,811 19480,827 19480,893 19481,1179 19482,872 19483,130 19483,163 19483,349 19483,668 19484,2775 19485,1381 19486,493 19486,682 19486,1985 19486,72439 19487,97 19489,749 19489,1368 19490,356 19491,206 19491,7652 19492,292 19494,22 19494,717 19495,79 19496,356 19497,392 19498,417 19499,3260 19500,104 19500,254 19500,557 19500,953 19500,954 19502,41 19502,850 19502,1132 19502,1608 19503,323 19505,211 19506,1033 19507,302 19507,1556 19508,2224 19509,217 19509,536 19512,535 19512,2209 19513,163 19513,579 19514,298 19515,143 19516,485 19517,301 19517,809 19518,19519 19519,19597 19519,19629 19519,19824 19519,24360 19519,31591 19519,38117 19519,127144 19519,192248 19520,171 19521,1227 19521,1229 19522,195 19524,872 19525,167 19525,301 19525,388 19525,392 19525,589 19525,694 19525,972 19525,1001 19525,1010 19525,1085 19525,1143 19525,1284 19525,1326 19525,1466 19526,2574 19527,602 19528,120 19528,1419 19528,1466 19529,920 19529,1433 19530,19531 19532,994 19533,202 19533,203 19534,783 19535,349 19535,356 19535,392 19535,467 19535,652 19535,697 19535,801 19535,1151 19535,1722 19535,1893 19536,302 19537,500 19537,718 19539,805 19539,4260 19540,143 19541,79 19543,289 19543,290 19543,489 19543,685 19543,849 19543,1130 19543,1402 19543,1844 19543,5213 19544,147 19544,158 19544,195 19546,1019 19547,1515 19548,516 19548,843 19548,893 19548,1033 19548,1293 19548,2006 19548,2867 19548,2868 19548,206079 19549,457 19550,707 19550,1707 19551,500 19553,868 19554,920 19555,10 19555,79 19555,97 19555,147 19555,149 19555,175 19555,184 19555,336 19555,588 19555,590 19556,298 19557,485 19559,135 19560,534 19560,1085 19560,75912 19561,120 19561,694 19561,28130 19564,1433 19565,1070 19566,104 19566,714 19566,1462 19566,2205 19566,2206 19566,2334 19566,6556 19566,8537 19567,392 19568,1241 19569,2319 19571,56 19573,843 19573,19574 19573,26417 19575,704 19576,439 19577,147 19577,406 19577,1181 19577,4193 19578,1 19578,147 19578,158 19578,175 19578,206 19578,336 19578,1458 19578,2244 19578,16891 19578,16980 19578,19578 19578,23798 19578,31573 19578,59997 19578,80266 19578,147078 19578,159257 19578,159258 19578,159625 19578,162839 19578,164155 19578,164181 19578,164560 19578,165644 19578,167116 19578,167353 19578,167524 19578,167525 19578,167526 19578,216342 19579,1688 19579,1722 19580,287 19580,3695 19580,6068 19580,141912 19581,2671 19582,874 19583,19519 19584,1515 19585,586 19586,406 19586,55849 19587,2319 19588,1293 19589,336 19589,406 19589,2373 19589,55849 19590,147 19590,425 19590,1512 19590,2646 19590,2775 19590,3115 19590,5992 19590,221313 19591,19519 19592,83 19592,192 19592,240 19592,261 19592,301 19592,309 19592,310 19592,314 19592,392 19592,417 19592,433 19592,435 19592,515 19592,536 19592,577 19592,589 19592,602 19592,615 19592,623 19592,838 19592,843 19592,920 19592,972 19592,1014 19592,1085 19592,1172 19592,1231 19592,1243 19592,1284 19592,1293 19592,1392 19592,1544 19592,1556 19592,1590 19592,1782 19592,1796 19592,1837 19592,1844 19592,1860 19592,2979 19592,30331 19592,75912 19593,620 19594,1085 19595,312 19595,338 19595,358 19595,509 19595,510 19595,652 19595,1572 19595,1722 19595,3538 19595,8994 19596,602 19597,19519 19598,68 19598,1326 19599,510 19600,1511 19600,3069 19601,417 19601,2296 19602,5 19602,47 19602,2089 19602,2469 19602,2940 19603,273 19603,274 19604,65 19605,171 19606,626 19607,19608 19607,52917 19609,392 19609,623 19609,697 19609,1769 19610,1143 19611,72 19612,344 19613,285 19614,1639 19615,1579 19616,439 19616,538 19617,41 19617,68 19617,104 19617,200 19617,248 19617,397 19617,431 19617,626 19617,631 19617,714 19617,760 19617,805 19617,818 19617,862 19617,1014 19617,1119 19617,1282 19617,1285 19617,1462 19617,2173 19617,2205 19617,2206 19617,2519 19617,2995 19617,3135 19617,4220 19617,5509 19617,6800 19617,8537 19617,9028 19617,13947 19617,15857 19617,24613 19617,30901 19617,33424 19617,36168 19617,37263 19617,40850 19617,49346 19617,69013 19617,71745 19617,75912 19617,76139 19617,88094 19617,98263 19617,117134 19617,120511 19617,125115 19617,127729 19617,127732 19617,127733 19617,127736 19617,127737 19617,127738 19617,127742 19617,127748 19617,127749 19617,127753 19617,127754 19617,127758 19617,127759 19617,127768 19617,127771 19617,127774 19617,127779 19617,127781 19617,127783 19617,127788 19617,127789 19617,127792 19617,127796 19617,127797 19617,127799 19617,127800 19617,127801 19617,127802 19617,127828 19617,127837 19617,128342 19617,151132 19617,159712 19617,167753 19617,167756 19617,167758 19617,167759 19617,169337 19617,169372 19617,169378 19617,169380 19617,169382 19617,169391 19617,169395 19617,182799 19617,182803 19617,182836 19617,182847 19617,182924 19617,182940 19617,182948 19618,809 19618,2750 19618,22293 19619,19620 19621,158 19622,611 19622,631 19622,1203 19622,1309 19622,1955 19623,146 19624,957 19624,1247 19624,1815 19625,356 19625,435 19625,843 19626,19519 19627,433 19628,788 19629,19519 19630,346 19631,636 19632,1381 19633,247 19634,503 19634,2443 19635,1653 19635,2436 19635,32751 19636,30 19636,772 19638,192 19639,868 19640,215 19641,301 19641,2045 19642,1127 19642,1381 19642,40389 19642,68069 19642,86832 19643,1882 19644,19519 19645,19519 19646,171 19647,302 19648,298 19649,485 19650,1359 19651,516 19651,1531 19652,1381 19653,717 19653,1782 19654,19519 19655,1359 19656,48 19656,106 19656,130 19656,515 19656,991 19656,1052 19656,1559 19656,1579 19656,1639 19656,1707 19656,2051 19656,3695 19656,36985 19656,54264 19657,171 19658,19519 19659,309 19659,310 19660,22 19660,222 19660,389 19661,83 19662,1247 19663,818 19664,1608 19665,586 19666,130 19667,1359 19667,13538 19668,1566 19669,171 19670,83 19670,337 19670,347 19670,417 19670,626 19670,795 19670,1133 19670,1167 19670,1837 19670,15179 19670,16687 19671,918 19672,146 19672,278 19672,389 19672,1539 19673,3 19673,230509 19673,230517 19674,302 19675,762 19676,37414 19677,171 19678,206 19679,298 19680,485 19682,68 19682,314 19682,7155 19683,302 19684,1425 19685,907 19685,932 19686,302 19686,314 19686,579 19686,2116 19687,292 19687,745 19688,1113 19689,509 19689,536 19690,104 19690,147 19690,406 19690,636 19690,644 19690,1515 19690,3507 19690,3538 19691,264 19691,818 19691,1531 19692,392 19692,3003 19693,577 19693,801 19695,1531 19698,346 19699,346 19701,32 19701,438 19701,1284 19702,337 19702,346 19702,393 19702,447 19702,934 19702,980 19702,1175 19702,1294 19703,19704 19705,298 19706,485 19707,3218 19708,596 19709,215 19710,167 19710,240 19710,310 19710,355 19710,949 19710,9001 19710,88653 19710,88654 19711,19519 19712,298 19713,485 19714,19715 19716,314 19716,467 19717,422 19718,56 19719,163 19720,227 19721,518 19721,775 19721,3804 19722,1267 19724,310 19725,163 19726,163 19726,302 19727,163 19728,1590 19728,1644 19729,37 19730,809 19731,442 19732,907 19732,932 19733,163 19734,843 19735,163 19736,146 19737,862 19737,1977 19737,1978 19738,163 19739,143 19740,22 19740,861 19741,305 19742,86 19743,163 19744,182 19744,4453 19746,298 19747,485 19748,187 19749,130 19750,163 19751,56 19752,758 19752,3695 19753,6803 19754,441 19754,563 19754,609 19754,1045 19754,4308 19754,19755 19754,24265 19754,60651 19755,609 19755,1046 19755,1257 19755,1359 19755,1882 19755,2315 19755,2572 19756,609 19757,19758 19757,91163 19757,115489 19757,120246 19759,447 19760,298 19761,485 19762,794 19763,893 19764,22 19764,32 19764,102 19764,106 19764,163 19764,269 19764,340 19764,649 19764,663 19764,893 19764,934 19764,994 19764,1052 19764,1082 19764,1293 19764,2353 19764,2923 19765,2224 19766,433 19767,171 19768,1673 19771,163 19772,1 19772,65 19772,86 19772,117 19772,273 19772,274 19772,485 19772,704 19772,2712 19772,5212 19773,920 19773,1118 19774,1381 19775,631 19777,510 19777,872 19777,1118 19777,1240 19778,333 19779,26 19779,59 19780,704 19781,163 19781,302 19782,285 19782,622 19782,1181 19782,1515 19782,68069 19782,240174 19783,22 19784,338 19784,457 19784,1262 19784,1454 19784,1531 19784,1844 19785,171 19786,104 19786,136 19786,557 19786,1368 19786,1939 19786,5405 19787,336 19788,636 19788,5405 19789,34 19789,35 19790,338 19790,1673 19791,1837 19792,158 19793,47 19793,611 19793,920 19793,1235 19793,1335 19793,2469 19793,2867 19793,2868 19793,4748 19793,15179 19793,22880 19794,302 19794,579 19794,687 19794,861 19794,893 19794,4453 19795,4611 19796,1544 19797,222 19797,2266 19797,32475 19798,41 19798,104 19798,134 19798,298 19798,372 19798,417 19798,431 19798,611 19798,805 19798,862 19798,1010 19798,1014 19798,1085 19798,1179 19798,1289 19798,1368 19798,1608 19798,1807 19798,2775 19798,2995 19798,75912 19799,623 19799,4760 19800,298 19801,485 19802,217 19803,32 19803,392 19803,644 19803,697 19803,3003 19805,301 19805,356 19805,372 19805,459 19805,852 19805,862 19805,907 19805,968 19805,1010 19805,1544 19805,1837 19805,1955 19805,2572 19805,4222 19805,20359 19805,188791 19806,1089 19807,349 19808,195 19811,500 19813,178 19814,1240 19815,68 19815,387 19816,596 19816,617 19816,784 19816,1146 19816,1367 19816,1368 19816,1429 19816,2565 19816,2658 19816,2814 19816,3504 19816,5391 19816,7458 19816,13132 19816,20858 19816,32504 19816,38144 19816,54271 19816,57143 19816,61901 19816,64543 19816,65395 19816,65896 19816,66090 19816,66348 19816,66357 19817,248 19817,450 19817,818 19817,996 19817,1332 19817,1644 19817,127158 19819,1323 19820,102 19821,1326 19822,408 19823,83 19823,217 19823,455 19823,536 19823,1240 19823,1419 19823,1453 19823,1454 19823,1467 19823,1860 19823,6955 19823,8798 19824,19519 19826,4611 19827,1544 19828,163 19828,305 19828,447 19828,1132 19828,1201 19828,15573 19829,1888 19829,21982 19830,22 19832,657 19833,2434 19834,536 19834,18831 19835,1033 19836,1414 19837,873 19838,1801 19839,2775 19840,447 19841,1181 19842,195 19843,1072 19843,1240 19844,217 19844,389 19844,592 19844,623 19844,818 19844,1010 19844,1085 19844,1143 19844,1374 19844,1417 19846,79 19846,163 19847,718 19847,21944 19848,2620 19849,1085 19850,2319 19851,784 19852,417 19853,809 19854,801 19854,1082 19854,1222 19854,1512 19854,2775 19854,3623 19854,9467 19854,19854 19854,19855 19854,21071 19854,45647 19854,72439 19854,77808 19854,156270 19856,48 19856,158 19856,278 19856,313 19856,422 19856,447 19856,575 19856,660 19856,682 19856,784 19856,795 19856,996 19856,1082 19856,1353 19856,1512 19856,1807 19856,2944 19856,4223 19856,5992 19856,6506 19856,7270 19856,7768 19856,13137 19856,32751 19856,41170 19856,72439 19857,120 19857,261 19857,682 19857,694 19857,1353 19857,3115 19857,72439 19858,392 19859,192 19859,1688 19860,278 19861,83 19862,217 19863,1370 19864,4611 19865,1544 19866,1220 19866,1222 19867,392 19867,467 19867,872 19868,372 19868,760 19869,704 19871,143 19872,3507 19873,34 19873,35 19873,518 19873,775 19873,2209 19874,1298 19874,1796 19875,999 19876,151 19878,143 19879,19519 19880,579 19882,424 19883,2411 19884,920 19885,7416 19886,313 19887,309 19887,310 19887,652 19888,225 19888,1181 19888,1285 19888,1749 19888,1973 19888,2205 19888,2605 19888,3585 19888,33424 19888,49057 19889,94 19889,430 19889,994 19889,1235 19889,1335 19889,2787 19889,3816 19889,3817 19890,19519 19891,1010 19891,1849 19892,1983 19893,967 19893,1235 19893,1684 19893,3794 19893,4114 19893,15742 19893,21944 19893,34060 19893,42559 19893,47819 19893,48344 19893,148326 19894,175 19894,313 19894,328 19894,485 19894,685 19894,693 19894,1188 19894,13538 19895,72 19897,1220 19897,1222 19898,1429 19900,2334 19901,48 19901,158 19901,206 19901,575 19901,682 19901,694 19901,1512 19901,2646 19901,2775 19901,3115 19901,3623 19901,5992 19901,72439 19902,704 19904,178 19904,1559 19905,19519 19906,3409 19907,167 19907,510 19907,1010 19907,1616 19907,3138 19907,20359 19908,991 19908,1653 19909,200 19909,225 19909,772 19909,850 19909,1332 19910,264 19910,649 19911,8180 19912,605 19913,1571 19914,1078 19915,247 19916,1571 19917,171 19918,4 19918,5 19919,50 19919,79 19919,147 19919,158 19919,192 19919,333 19919,336 19919,406 19919,620 19919,779 19919,1163 19919,1181 19919,1425 19919,1515 19919,4193 19919,5726 19919,8055 19920,298 19921,485 19922,872 19923,872 19924,298 19925,485 19926,736 19927,577 19928,298 19929,485 19930,79 19930,671 19931,264 19931,515 19931,652 19932,167 19932,73570 19933,1188 19935,301 19935,2083 19936,147 19936,158 19936,285 19936,406 19936,779 19936,1515 19937,425 19937,1973 19938,862 19939,333 19939,19010 19940,758 19941,1001 19942,622 19943,697 19944,417 19945,30 19947,611 19948,2135 19951,2135 19953,37 19953,1231 19953,1531 19954,718 19955,306 19955,307 19955,333 19955,779 19955,1515 19956,972 19957,163 19958,184 19959,143 19961,143 19962,9010 19963,8788 19964,1332 19965,941 19966,338 19966,941 19967,945 19967,1572 19968,65 19968,68 19968,868 19968,75912 19969,143 19969,1052 19970,298 19971,485 19972,1531 19973,2244 19973,9146 19974,298 19975,485 19976,431 19977,872 19978,298 19979,485 19980,1436 19980,2979 19981,2989 19981,2991 19982,485 19983,298 19984,349 19984,3260 19985,19986 19987,2646 19988,19989 19990,19991 19992,949 19993,10 19993,81 19993,1745 19993,31977 19995,1983 19996,1192 19996,1453 19997,104 19997,720 19997,779 19999,477 19999,536 19999,2168 20000,1968 20001,2244 20001,3246 20001,3247 20002,872 20003,20004 20005,44 20006,872 20008,287 20009,1274 20010,83 20012,808 20012,1949 20013,2073 20014,143 20015,50 20016,72 20017,390 20017,1544 20018,2051 20019,2506 20020,1326 20021,424 20022,1511 20022,3069 20023,20024 20023,36356 20023,37940 20023,43929 20023,56344 20023,58777 20023,58792 20023,59736 20023,83084 20023,87184 20023,104085 20025,104 20027,364 20027,431 20028,1608 20029,143 20030,403 20030,113878 20031,195 20031,285 20031,1366 20031,1776 20031,7818 20031,20032 20031,21487 20031,30418 20031,35623 20031,68069 20032,195 20033,20034 20033,53155 20033,55497 20033,64987 20035,192 20035,211 20035,1623 20036,779 20037,595 20037,1453 20037,1572 20038,431 20038,631 20038,1285 20039,518 20039,1227 20039,1229 20039,1252 20039,1253 20039,21944 20039,86416 20040,784 20041,1511 20041,3069 20042,301 20042,372 20042,862 20042,907 20042,968 20042,1010 20042,1544 20042,1837 20042,2590 20042,4222 20042,20359 20043,79 20044,20045 20044,87086 20046,718 20047,20048 20049,485 20050,818 20051,349 20052,417 20053,356 20053,477 20053,634 20053,2224 20053,5326 20053,6506 20053,7698 20054,332 20055,1284 20055,148742 20056,2048 20057,557 20058,557 20059,20060 20059,81445 20061,106 20061,1370 20061,6119 20062,163 20064,647 20065,344 20066,5440 20067,2116 20068,3409 20069,718 20070,143 20070,1052 20070,1983 20071,126 20071,336 20071,676 20071,1803 20071,215276 20072,301 20072,1818 20073,20074 20075,1837 20076,41 20076,406 20077,13345 20078,19519 20080,1425 20081,406 20082,932 20083,99 20084,450 20085,19519 20086,581 20087,640 20088,195 20089,50 20089,146 20089,147 20089,158 20089,358 20089,406 20089,510 20089,779 20089,1181 20089,1515 20090,1309 20091,918 20092,505 20093,1010 20094,147 20094,779 20095,1515 20096,4611 20097,1544 20098,66 20098,364 20099,1238 20100,1332 20101,450 20101,611 20102,2607 20103,19519 20104,195 20105,305 20106,652 20107,10 20107,113156 20108,20109 20110,135 20112,302 20112,861 20113,298 20114,485 20115,3111 20115,4980 20115,13538 20116,346 20116,435 20116,439 20116,447 20116,1033 20116,1590 20117,1801 20117,2416 20117,2417 20118,1381 20119,247 20120,309 20120,310 20121,143 20122,302 20123,1740 20124,240 20125,292 20126,6682 20127,417 20128,693 20128,20129 20128,51864 20128,52711 20128,53197 20128,61668 20130,20131 20132,32 20132,392 20132,1363 20132,2274 20132,2699 20133,1058 20134,588 20134,590 20134,2296 20134,2626 20135,1634 20136,1414 20137,250 20139,417 20140,20141 20142,83 20143,2779 20144,671 20145,71 20145,337 20145,1070 20146,171 20147,143 20148,589 20149,1370 20150,640 20151,1881 20152,147 20153,202 20153,203 20154,20155 20156,577 20156,1105 20157,20158 20159,510 20160,406 20160,779 20160,1181 20160,1515 20160,68069 20161,392 20162,392 20163,392 20164,104 20164,134 20164,135 20164,2105 20165,217 20165,278 20165,349 20165,536 20165,644 20165,2424 20165,2784 20165,141912 20166,264 20167,392 20168,147 20168,337 20169,4611 20170,1544 20171,20172 20171,45045 20171,56851 20173,135 20174,20158 20175,602 20176,392 20176,27392 20176,35942 20176,47362 20176,54865 20176,57554 20177,323 20178,2574 20179,366 20180,366 20181,366 20182,392 20183,366 20184,366 20185,202 20185,203 20186,366 20187,366 20188,366 20189,366 20190,240 20190,1085 20191,602 20192,20193 20194,1140 20194,5547 20195,1140 20195,5547 20196,392 20197,20198 20199,34 20199,35 20199,536 20199,1274 20199,4672 20200,54 20200,6955 20201,217 20201,536 20201,1417 20201,4672 20201,18831 20202,872 20203,7 20203,202 20203,203 20205,392 20206,247 20207,392 20207,710 20207,1836 20208,2146 20209,704 20210,163 20211,2146 20212,298 20213,485 20214,163 20215,163 20216,333 20217,1556 20218,2116 20219,392 20220,20221 20220,109142 20222,347 20222,13136 20223,622 20224,233 20225,493 20226,801 20226,991 20227,885 20227,1235 20227,1335 20227,2893 20227,13704 20227,21944 20227,52851 20228,388 20228,779 20228,1096 20228,1240 20228,2045 20228,7757 20229,1241 20230,163 20231,163 20231,2116 20232,3724 20233,583 20234,4223 20235,192 20236,163 20237,20238 20239,20240 20241,20240 20242,20240 20243,20240 20244,19519 20245,20246 20247,3111 20248,640 20248,682 20248,1313 20249,10 20249,113156 20250,163 20251,72 20252,344 20253,285 20254,163 20255,34 20255,35 20255,907 20255,1001 20255,1133 20255,1284 20255,1715 20255,9018 20255,19946 20256,32 20256,65 20256,87 20256,192 20256,509 20256,510 20256,1363 20256,1722 20256,1836 20256,2146 20256,3260 20256,3474 20256,20257 20258,3451 20258,3452 20259,433 20260,146 20261,72 20261,130 20261,264 20261,338 20261,467 20261,479 20261,510 20261,515 20261,872 20261,1052 20261,1151 20261,1287 20261,1381 20261,1893 20261,1968 20261,2617 20262,20263 20264,644 20265,222 20265,1618 20265,7092 20266,20267 20266,25645 20269,1220 20269,1222 20270,298 20271,485 20273,298 20274,485 20276,58 20277,46 20278,2681 20280,209 20281,885 20281,1983 20281,2105 20281,13704 20282,968 20283,1388 20284,120 20285,406 20285,682 20285,1181 20285,72439 20286,364 20287,968 20287,1285 20288,431 20289,2083 20290,687 20290,1556 20291,134 20292,2353 20293,360 20293,440 20294,885 20294,1235 20294,1335 20294,142427 20295,63 20295,79 20295,252 20295,467 20295,516 20295,1014 20295,1175 20295,1220 20295,1222 20295,1243 20295,1844 20295,156379 20295,162599 20296,433 20297,302 20297,579 20297,749 20297,1146 20297,1452 20297,1849 20298,202 20298,203 20298,7884 20298,20185 20298,20203 20298,21293 20298,21934 20298,22054 20298,22795 20298,24261 20298,34991 20299,298 20300,485 20301,68 20301,760 20301,1149 20301,1631 20302,358 20303,1167 20303,1544 20304,1392 20305,47 20305,2469 20307,240 20307,3135 20308,71 20308,663 20308,664 20310,510 20311,3138 20312,781 20314,3 20315,158 20315,602 20315,1392 20315,1745 20316,1590 20317,4611 20318,1544 20319,306 20319,307 20320,4 20320,5 20321,209 20322,500 20323,65 20323,467 20323,868 20323,1433 20325,634 20327,167 20327,301 20327,615 20327,968 20327,973 20327,1160 20327,1293 20327,1300 20327,1782 20327,1837 20327,103860 20328,968 20328,1293 20329,19519 20330,781 20331,500 20332,1235 20332,1335 20333,20334 20336,2784 20337,516 20338,1058 20339,1326 20340,360 20341,622 20341,1033 20343,1140 20343,3474 20343,5547 20344,209 20345,278 20345,1019 20345,8788 20345,8855 20346,6955 20347,171 20348,4223 20349,794 20350,240 20350,518 20350,872 20350,1326 20350,1732 20351,10 20351,113156 20352,143 20352,1559 20353,134 20353,1282 20353,1392 20353,1745 20353,2089 20353,2205 20353,2286 20353,2940 20353,33424 20354,32 20354,3003 20357,450 20357,1332 20358,968 20359,20359 20360,147 20361,10 20362,999 20363,3182 20364,417 20364,1564 20365,1655 20366,652 20366,710 20368,640 20369,2373 20370,1531 20371,1146 20371,118336 20372,602 20373,302 20374,2671 20375,56 20375,147 20375,149 20375,841 20375,1085 20375,2674 20376,163 20376,302 20377,980 20378,1052 20379,163 20380,392 20380,644 20381,207 20382,599 20383,611 20383,1718 20384,19519 20385,171 20386,4411 20387,48 20387,130 20387,160 20387,264 20387,515 20387,649 20387,1007 20387,1132 20387,1147 20387,1381 20387,1452 20387,1509 20387,1639 20388,682 20388,6424 20388,28107 20389,344 20389,1634 20390,15 20390,875 20392,2116 20393,222 20393,515 20394,163 20395,104 20395,557 20395,953 20395,954 20395,5405 20396,299 20396,972 20396,1010 20396,1479 20396,1849 20398,1014 20399,536 20401,1707 20402,733 20404,515 20405,50 20406,1849 20407,301 20407,968 20408,663 20408,664 20409,1634 20410,1323 20411,102 20412,1326 20413,408 20414,1370 20414,1821 20415,163 20416,615 20416,657 20416,3182 20417,2646 20418,586 20419,516 20419,579 20419,1243 20419,1462 20419,1512 20419,1983 20419,2775 20419,3115 20419,5992 20419,8537 20419,189788 20419,189794 20419,189842 20419,206297 20419,223738 20420,4611 20421,1544 20422,298 20423,485 20424,302 20425,337 20426,22 20426,222 20426,392 20426,457 20426,1151 20426,1240 20426,1326 20426,1465 20426,1860 20426,1955 20426,2436 20426,3182 20427,32 20427,392 20427,623 20427,1188 20427,1240 20427,1454 20427,4903 20427,76096 20428,287 20428,809 20429,1769 20430,264 20430,338 20430,467 20430,626 20432,943 20433,149 20434,3804 20435,1411 20436,795 20437,1016 20438,337 20440,687 20440,861 20441,3695 20442,1140 20443,227 20444,2701 20445,215 20446,328 20447,1016 20448,1849 20449,1010 20450,1722 20451,801 20452,358 20453,383 20454,111 20455,1052 20456,2443 20457,3538 20458,1332 20459,72 20460,1939 20461,248 20462,3193 20463,525 20464,1564 20465,1001 20466,1882 20467,850 20468,1955 20469,1177 20470,9001 20471,1282 20472,714 20473,136 20474,312 20475,9029 20476,4771 20477,1572 20478,1745 20479,3474 20480,1977 20480,1978 20481,406 20482,932 20483,483 20483,718 20484,760 20487,372 20487,1085 20489,19519 20490,2334 20491,500 20492,477 20493,1429 20494,50 20494,146 20494,779 20494,2539 20494,4617 20494,20494 20494,66534 20494,92476 20494,95513 20494,141912 20494,241560 20494,242434 20495,1803 20496,1433 20497,687 20497,861 20498,278 20498,1511 20498,3069 20499,1118 20500,209 20501,4 20501,5 20501,146 20501,328 20501,907 20501,1117 20501,1167 20501,1644 20501,2089 20501,2940 20503,149 20504,534 20505,163 20506,3804 20507,509 20507,536 20507,8855 20508,1673 20509,390 20509,918 20509,1293 20510,364 20510,450 20511,72 20512,344 20513,285 20514,163 20515,149 20515,1368 20516,10 20517,604 20518,2116 20518,2353 20519,222 20519,390 20519,589 20519,1453 20519,1949 20519,5591 20520,32 20521,779 20522,26 20522,59 20522,67397 20523,19519 20524,1033 20524,1381 20524,1551 20524,1639 20524,5440 20525,1466 20525,2989 20525,2991 20526,315 20527,4222 20527,8180 20528,500 20529,1607 20530,743 20530,23588 20530,182001 20531,72 20532,344 20533,285 20535,390 20535,782 20535,1888 20535,7155 20535,20535 20535,20763 20535,31729 20535,38783 20535,92934 20535,163388 20536,392 20537,136 20538,163 20539,163 20539,209 20539,440 20539,447 20539,163785 20540,120 20540,195 20540,261 20540,336 20540,628 20540,694 20540,1353 20540,1419 20540,2574 20540,5101 20540,32751 20541,3949 20542,20543 20544,264 20544,338 20544,467 20544,652 20544,872 20544,1151 20544,1659 20544,1722 20544,1893 20544,2367 20544,4039 20544,229667 20545,79 20546,209 20547,273 20547,274 20548,4355 20549,440 20549,1844 20550,37 20550,301 20550,1782 20551,178 20553,2923 20554,195 20554,20032 20554,20555 20554,42185 20556,392 20556,1454 20556,1722 20557,106 20557,1888 20558,41 20558,1419 20559,192 20559,579 20559,1531 20560,217 20560,240 20560,372 20560,818 20560,1085 20561,387 20562,163 20563,1821 20564,392 20565,163 20566,493 20566,682 20566,72439 20567,20568 20569,1151 20570,147 20570,158 20570,195 20570,206 20571,328 20572,433 20573,22 20573,207 20573,919 20574,143 20575,615 20575,873 20575,932 20575,972 20575,1479 20575,1740 20575,1849 20575,2480 20575,2557 20575,7956 20576,34 20576,35 20577,202 20577,203 20578,1058 20579,2051 20580,206 20581,20 20582,1267 20582,1579 20582,2051 20583,222 20584,118 20584,4597 20585,571 20586,126 20586,372 20586,422 20586,483 20586,589 20586,788 20586,992 20586,1274 20586,1298 20586,1718 20586,1871 20586,13661 20586,22293 20587,1 20587,50 20587,622 20587,862 20588,149 20588,406 20589,72 20589,312 20590,1837 20591,509 20591,510 20591,872 20591,1043 20591,150022 20592,261 20592,1119 20592,1466 20592,32751 20593,1837 20594,516 20595,1392 20596,104 20596,631 20596,784 20596,805 20597,167 20597,73570 20599,163 20601,5250 20602,58 20602,222 20602,278 20602,644 20602,702 20602,873 20602,1359 20602,1571 20602,1801 20602,1881 20602,6068 20603,120 20603,222 20603,1019 20604,248 20604,772 20606,660 20608,1388 20608,142430 20608,142473 20608,142879 20609,240 20609,1203 20609,1955 20610,83 20611,346 20611,435 20612,107 20613,264 20613,467 20613,868 20613,1289 20613,1551 20613,2373 20614,1 20615,192 20616,10 20616,79 20616,134 20616,459 20616,483 20616,668 20616,783 20616,843 20616,1400 20616,1607 20616,1837 20616,1893 20616,2373 20616,21442 20617,344 20618,634 20618,1531 20620,72 20621,1087 20622,422 20623,422 20624,1082 20624,1203 20625,422 20626,301 20626,717 20626,843 20626,1231 20626,1740 20627,143 20628,167 20628,301 20628,1231 20628,2083 20628,5662 20628,73570 20629,15 20630,1977 20630,1978 20631,47 20631,117 20631,430 20631,527 20631,743 20631,994 20631,1254 20631,1432 20631,1983 20631,2469 20631,2712 20631,4079 20631,21944 20631,31977 20631,44244 20631,54870 20631,95152 20631,194100 20632,30 20632,200 20632,3623 20633,187 20634,422 20636,388 20636,2334 20637,71 20637,195 20637,673 20637,712 20637,827 20637,931 20637,1172 20637,1434 20637,1556 20637,1707 20637,3623 20637,14674 20637,20757 20637,21944 20637,162599 20638,718 20639,422 20640,422 20641,422 20642,640 20642,1515 20643,2292 20643,2889 20644,422 20645,366 20645,431 20645,500 20646,483 20646,707 20646,1127 20646,1298 20647,479 20647,563 20647,668 20647,1010 20647,1238 20647,1267 20647,1432 20647,5469 20647,13538 20647,16687 20648,2135 20649,143 20650,5308 20651,1130 20652,718 20652,760 20652,1149 20652,1631 20653,422 20654,1927 20655,5908 20656,134 20657,136 20657,287 20657,538 20657,809 20657,1634 20657,5310 20658,536 20659,143 20660,931 20660,1509 20661,326 20662,50 20663,408 20663,801 20663,1326 20663,23437 20665,392 20666,1235 20666,1247 20667,626 20668,973 20668,1122 20668,1849 20668,32784 20669,248 20670,602 20671,602 20672,3 20672,22 20672,34 20672,35 20672,192 20672,240 20672,442 20673,292 20674,34 20674,35 20674,217 20675,887 20676,1287 20676,5212 20678,115 20678,118 20678,280 20678,328 20678,994 20678,4597 20678,17245 20679,1085 20680,149 20681,1801 20682,873 20683,4611 20684,1544 20685,130 20685,1893 20686,120 20686,259 20686,577 20686,788 20686,1118 20687,660 20687,2646 20688,3 20688,1001 20688,1326 20688,1411 20689,298 20690,485 20691,392 20692,83 20692,278 20692,285 20692,389 20692,455 20692,1274 20692,1467 20692,1718 20692,1756 20692,2553 20692,2646 20692,4172 20692,28130 20693,397 20694,1776 20694,1803 20695,1345 20696,1179 20697,312 20698,557 20699,72 20700,111 20701,1149 20702,872 20702,1659 20702,1893 20703,86 20703,207 20703,675 20703,698 20704,973 20705,875 20706,309 20706,310 20707,119 20708,1608 20709,972 20709,1559 20710,143 20711,309 20711,310 20712,346 20712,393 20712,538 20712,4611 20713,406 20713,620 20715,1179 20716,392 20716,3260 20717,225 20717,557 20717,592 20717,1332 20717,1368 20718,1001 20719,1544 20720,79 20721,1276 20723,8 20723,34 20723,35 20723,136 20723,137 20723,222 20723,313 20723,349 20723,1462 20723,2224 20723,2991 20723,34006 20724,255 20724,1072 20725,10 20725,2574 20726,79 20727,143 20728,1010 20729,1179 20730,907 20730,932 20731,586 20732,2443 20733,1127 20734,10 20734,240 20734,349 20734,415 20734,444 20734,687 20734,827 20734,868 20734,1117 20734,1313 20734,1326 20734,1607 20734,1659 20734,3135 20734,4101 20734,5726 20734,81025 20735,1368 20737,63 20737,163 20737,489 20738,182 20738,192 20738,202 20738,1118 20738,3538 20739,392 20740,3602 20741,104 20741,136 20741,138 20741,557 20741,953 20743,415 20743,1454 20744,406 20745,50 20745,79 20745,147 20745,158 20746,171 20747,120 20747,222 20747,240 20747,261 20747,392 20747,657 20747,694 20747,818 20747,1019 20747,1436 20747,2989 20747,2991 20747,6068 20747,33508 20748,1235 20748,1335 20749,104 20749,557 20749,852 20749,953 20750,5405 20751,143 20752,1181 20753,485 20754,143 20755,171 20756,301 20756,615 20756,1782 20757,32 20757,56 20757,160 20757,292 20757,299 20757,336 20757,360 20757,467 20757,505 20757,604 20757,818 20757,875 20757,929 20757,1033 20757,1087 20757,1147 20757,1293 20757,1345 20757,1434 20757,1796 20757,2496 20757,5192 20757,28571 20757,41548 20757,52922 20757,60116 20757,162599 20757,183335 20757,224519 20757,245201 20757,245343 20757,264449 20758,2353 20759,58 20760,366 20761,2867 20761,2868 20761,22880 20762,143 20763,640 20763,9005 20763,20535 20764,217 20764,779 20764,920 20764,1033 20764,1181 20765,694 20765,20790 20766,158 20767,3507 20768,309 20768,310 20769,999 20770,20771 20771,2159 20772,852 20772,1247 20772,164572 20773,1544 20774,994 20775,1511 20775,3069 20776,1227 20776,1229 20776,86416 20777,28107 20778,344 20779,22 20779,809 20779,861 20779,2017 20780,306 20780,307 20780,682 20780,1181 20780,72439 20781,104 20781,134 20781,1939 20782,1133 20783,83 20783,285 20783,455 20783,1756 20783,2784 20783,28130 20784,83 20784,278 20784,285 20784,455 20784,1718 20784,1756 20784,2553 20784,2784 20784,28130 20785,1458 20786,66 20786,868 20787,68 20787,104 20787,431 20787,1119 20787,1282 20787,1285 20787,1462 20787,1659 20787,2089 20787,2205 20787,2286 20787,2940 20787,4771 20787,8537 20787,33424 20788,302 20788,392 20788,1014 20789,693 20791,1082 20792,192 20792,685 20792,1118 20792,1566 20792,6837 20793,143 20793,1052 20794,687 20796,388 20796,440 20797,195 20797,306 20797,307 20797,406 20797,779 20797,1181 20797,1515 20798,302 20798,809 20800,602 20800,620 20801,968 20801,1001 20802,557 20802,954 20802,1939 20802,5405 20802,10318 20803,68 20803,301 20803,372 20803,599 20803,852 20803,872 20803,972 20803,1010 20803,1085 20803,1309 20803,1782 20804,687 20805,515 20806,861 20807,1551 20808,5440 20809,850 20809,3209 20810,240 20811,968 20812,20813 20814,58 20815,46 20816,1085 20817,247 20818,2775 20819,447 20820,392 20820,697 20821,2646 20822,1019 20823,332 20824,302 20824,1370 20824,2116 20825,222 20826,588 20826,590 20826,929 20827,158 20827,1181 20828,887 20828,994 20828,1235 20828,1335 20829,4678 20830,3260 20831,273 20831,274 20832,579 20833,1 20834,862 20835,420 20836,3 20837,323 20838,393 20838,3148 20839,158 20840,1359 20841,1052 20842,5405 20843,503 20843,932 20844,393 20844,980 20845,158 20846,151 20847,657 20848,1433 20849,1072 20850,104 20850,557 20850,953 20850,954 20850,1939 20851,264 20852,389 20853,994 20855,626 20856,392 20857,875 20858,596 20858,660 20858,784 20858,811 20858,1052 20858,1368 20859,872 20860,392 20861,2626 20862,1127 20863,255 20864,158 20865,387 20866,247 20867,20868 20867,21068 20867,25875 20867,31448 20867,39904 20867,53304 20867,58039 20867,63515 20867,68069 20867,72251 20867,80322 20867,100143 20867,105531 20867,110251 20869,714 20870,347 20871,862 20872,248 20872,450 20872,1332 20873,467 20873,868 20873,156379 20873,162599 20873,221278 20874,1773 20875,536 20875,18831 20876,2775 20876,3115 20877,171 20878,252 20878,516 20878,1220 20878,1222 20878,41170 20879,272 20879,563 20879,980 20879,2353 20879,2367 20880,240 20880,289 20880,290 20880,417 20880,631 20880,704 20880,714 20880,1085 20880,1285 20880,1392 20880,1511 20880,1631 20880,1785 20880,2205 20880,2286 20880,3069 20880,33424 20880,94134 20881,72 20882,44 20883,2051 20883,49057 20884,72 20885,19519 20887,171 20888,422 20889,56 20891,934 20892,302 20892,1433 20893,310 20893,2782 20893,3039 20894,58 20895,83 20897,146 20898,575 20898,697 20899,104 20899,254 20899,557 20899,1939 20901,83 20902,30 20903,1623 20904,163 20905,312 20906,718 20907,111 20907,240 20907,805 20908,1673 20909,1133 20910,301 20911,20912 20911,38044 20911,40492 20911,45906 20911,46598 20911,46607 20911,79181 20911,85679 20913,1 20914,20912 20915,392 20916,493 20917,106 20917,190492 20918,20919 20920,20919 20921,20919 20921,109236 20921,184173 20922,184 20923,346 20923,516 20923,1243 20924,20925 20927,20928 20927,99353 20929,160 20930,72 20931,202 20931,203 20932,1566 20933,184 20933,2867 20933,2868 20934,1871 20935,389 20936,713 20937,346 20938,417 20939,248 20940,135 20941,20941 20942,158 20942,406 20942,4192 20942,4193 20943,255 20944,20945 20944,103590 20944,107315 20944,108492 20946,631 20947,68 20947,240 20948,6179 20948,6180 20948,8675 20949,1287 20949,9030 20950,435 20951,4193 20951,20912 20951,29474 20951,30204 20951,32421 20951,53098 20951,79804 20951,85301 20952,406 20953,20954 20955,346 20956,586 20957,309 20957,310 20958,850 20959,473 20959,8149 20960,10 20961,5101 20962,83 20963,586 20964,20965 20964,32417 20966,160 20966,264 20966,649 20966,1007 20966,1289 20966,1579 20966,1893 20967,273 20967,274 20968,623 20968,1805 20969,346 20971,346 20972,247 20973,697 20974,15119 20975,4611 20976,1544 20977,5405 20978,346 20979,4810 20980,143 20981,503 20982,56 20982,192 20982,273 20982,274 20982,805 20982,4220 20982,60576 20983,20984 20985,535 20986,631 20987,217 20987,536 20988,2421 20989,1096 20990,1332 20991,1556 20992,217 20992,366 20992,1433 20993,4678 20994,626 20995,557 20996,557 20997,931 20998,1118 20999,240 21000,4823 21001,500 21001,718 21001,893 21001,14458 21002,21003 21004,3538 21005,149 21006,885 21007,1927 21008,184 21009,389 21010,302 21011,422 21012,56 21013,272 21013,795 21013,934 21013,1070 21013,1612 21014,302 21015,217 21015,477 21015,536 21015,781 21015,2168 21015,7698 21016,1571 21017,21018 21019,1127 21020,83 21020,660 21021,818 21022,278 21022,843 21023,862 21025,1227 21025,1229 21025,86416 21026,1844 21027,21028 21027,47483 21027,102065 21027,202264 21029,10 21030,21031 21032,1319 21033,19519 21034,968 21035,171 21036,450 21037,54 21038,21039 21040,6051 21041,602 21042,994 21043,21044 21045,32 21046,21047 21048,707 21048,827 21049,30 21049,1266 21050,292 21051,589 21051,1001 21052,2590 21053,602 21054,19519 21055,636 21056,602 21057,83 21058,4 21058,5 21058,21059 21060,46 21060,58 21061,10 21062,269 21063,184 21064,1181 21065,21066 21067,1287 21069,9029 21070,72 21071,2775 21072,202 21072,203 21073,21074 21075,21074 21076,21074 21077,149 21078,158 21079,640 21080,147 21081,30 21081,202 21081,251 21081,328 21081,431 21081,440 21081,516 21081,622 21081,1033 21081,1235 21081,1335 21081,9005 21082,147 21083,175 21083,3111 21083,4980 21088,1001 21089,151 21090,163 21091,10 21091,13345 21092,147 21092,333 21093,346 21094,346 21095,720 21095,907 21095,972 21095,1284 21095,2191 21096,1634 21097,1821 21098,1175 21099,758 21100,104 21101,104 21101,134 21101,254 21101,557 21101,953 21101,954 21101,2105 21102,195 21103,21104 21106,1531 21107,2590 21108,493 21109,772 21110,182 21110,188 21110,7652 21112,158 21113,3161 21114,862 21114,5911 21115,392 21116,422 21117,56 21118,366 21119,366 21120,366 21121,1515 21122,366 21123,206 21124,366 21125,366 21126,366 21127,1010 21128,1544 21129,21130 21129,54069 21129,75553 21129,86816 21129,92503 21131,269 21132,671 21133,366 21133,3538 21134,1 21134,149 21134,356 21134,859 21134,2089 21134,2940 21134,3069 21134,21944 21135,72 21136,99 21137,376 21138,1235 21138,1335 21139,809 21139,19010 21140,673 21141,298 21142,485 21143,515 21144,1191 21145,21146 21147,1284 21148,422 21149,56 21150,215 21150,233 21150,240 21150,289 21150,290 21150,372 21150,503 21150,592 21150,631 21150,714 21150,760 21150,805 21150,932 21150,1016 21150,1085 21150,1282 21150,1285 21150,1309 21150,1462 21150,1564 21150,1631 21150,1785 21150,1818 21150,1955 21150,2205 21150,2286 21150,2296 21150,2443 21150,2620 21150,3328 21150,5718 21150,8537 21150,33424 21150,144988 21151,390 21152,344 21152,671 21152,685 21152,827 21152,849 21152,1381 21153,163 21154,104 21154,134 21154,135 21154,136 21154,137 21154,138 21154,557 21154,850 21154,1368 21154,1939 21154,2105 21155,233 21156,200 21156,2712 21157,117 21159,1388 21159,35486 21160,171 21161,515 21162,184 21162,685 21162,849 21162,1623 21163,261 21165,21166 21167,911 21168,1370 21169,206 21170,694 21171,14483 21172,781 21173,599 21173,818 21175,3297 21176,211 21176,1551 21177,1133 21178,3451 21178,3452 21179,209 21180,644 21182,388 21182,588 21182,590 21182,907 21185,422 21186,56 21187,714 21187,760 21188,3182 21189,647 21190,344 21191,171 21192,887 21193,604 21195,422 21196,56 21197,298 21198,485 21199,151 21200,2784 21200,13538 21200,18738 21201,392 21202,106 21202,1019 21203,151 21204,6803 21206,187 21208,48 21209,1559 21210,251 21211,862 21212,657 21213,309 21213,310 21213,1400 21213,2915 21214,1122 21215,298 21216,485 21217,1803 21218,292 21218,579 21218,1070 21219,422 21220,366 21221,323 21222,911 21223,306 21223,307 21225,255 21228,467 21229,2744 21229,3089 21230,299 21230,783 21230,2083 21231,868 21232,54 21232,278 21232,304 21232,577 21232,589 21232,626 21232,932 21232,1151 21232,1175 21232,1212 21232,1289 21232,1298 21232,1309 21232,1479 21232,1634 21232,1871 21232,2421 21232,3507 21232,3585 21232,9015 21232,14483 21233,657 21233,1019 21234,298 21235,485 21236,248 21237,146 21238,503 21241,312 21241,1140 21243,415 21243,1454 21243,3474 21244,1634 21245,392 21245,644 21245,1001 21245,1363 21245,1805 21245,199253 21246,140 21246,1893 21246,2051 21246,81070 21247,859 21249,536 21249,720 21249,877 21249,937 21249,1117 21249,2266 21249,7698 21249,124668 21250,292 21251,640 21252,163 21253,283 21253,503 21253,118336 21254,135 21256,305 21257,1113 21258,21259 21261,21262 21261,35406 21261,54078 21261,56046 21261,101837 21264,929 21264,1370 21265,283 21266,2416 21266,2417 21267,1 21267,20 21267,32 21267,68 21267,120 21267,178 21267,269 21267,292 21267,360 21267,387 21267,388 21267,483 21267,710 21267,784 21267,893 21267,1204 21267,1241 21267,1294 21267,1345 21267,1425 21267,2083 21267,2735 21267,2923 21267,8308 21267,81070 21269,167 21269,299 21269,2083 21270,360 21270,81070 21271,146 21272,634 21273,143 21274,21275 21276,4355 21277,505 21279,1085 21280,996 21281,920 21281,1623 21282,151 21282,182 21282,440 21282,489 21282,1844 21283,1566 21284,209 21285,143 21287,1011 21288,1424 21289,2557 21290,1 21290,289 21290,290 21290,332 21290,1807 21290,94134 21291,985 21293,182 21293,188 21293,202 21293,203 21293,1844 21294,934 21294,16614 21295,1204 21295,4831 21295,75912 21297,312 21297,1267 21297,1659 21298,137 21299,1635 21300,424 21300,3148 21301,1323 21302,102 21303,1326 21304,408 21305,21306 21307,500 21308,1962 21309,1052 21310,1882 21311,2775 21312,54 21313,2210 21313,4237 21314,6750 21315,278 21316,1127 21317,392 21318,217 21319,1803 21320,83 21322,1877 21323,980 21324,397 21324,1623 21324,8149 21325,298 21326,485 21327,143 21329,56 21330,107 21331,604 21332,272 21333,586 21334,1072 21334,3538 21335,195 21335,1181 21336,19519 21337,287 21338,1220 21338,1222 21339,252 21340,251 21341,5405 21342,178 21343,1400 21343,40360 21344,647 21345,344 21346,178 21347,302 21348,1749 21349,346 21349,596 21349,1010 21349,1368 21350,192 21350,663 21350,664 21351,287 21352,309 21352,310 21352,794 21353,30 21354,86 21354,264 21354,467 21354,599 21354,1433 21355,1659 21356,999 21357,309 21357,310 21357,859 21358,21359 21360,2051 21361,1425 21362,775 21363,21364 21365,302 21366,415 21366,818 21366,1454 21366,13137 21366,27041 21367,2867 21367,2868 21367,22880 21368,1220 21368,1222 21369,252 21370,251 21371,338 21371,8149 21373,81 21374,94 21374,2787 21375,3260 21376,647 21377,344 21378,111 21379,809 21380,595 21380,1454 21380,2699 21380,3258 21380,21982 21381,455 21381,2266 21382,1267 21382,1370 21382,21982 21383,340 21384,1119 21385,195 21386,146 21386,151 21386,272 21386,850 21386,2367 21387,1370 21388,875 21389,4 21389,5 21389,527 21389,743 21389,8714 21390,481 21391,146 21392,932 21393,3 21393,605 21393,19010 21394,336 21394,5726 21394,60576 21395,442 21395,1001 21396,3 21396,907 21397,2867 21397,2868 21398,1179 21399,1454 21400,312 21400,358 21400,525 21401,682 21401,72439 21402,920 21402,8854 21403,340 21404,424 21404,6059 21406,3804 21407,21408 21409,66 21409,252 21409,516 21409,571 21409,868 21410,459 21411,264 21411,278 21411,301 21411,697 21411,760 21411,818 21411,1962 21411,2319 21411,2979 21411,3744 21412,1167 21413,65 21413,868 21413,1433 21414,34 21414,35 21414,186 21414,217 21414,222 21414,455 21414,536 21414,589 21414,891 21414,1019 21414,1085 21414,1274 21414,2784 21414,13137 21415,1007 21416,202 21416,203 21416,760 21417,83 21418,209 21419,1181 21420,240 21421,859 21422,818 21422,2116 21422,3769 21424,1070 21424,2837 21425,119 21425,178 21425,209 21425,577 21425,622 21425,929 21425,1400 21425,2073 21425,21944 21425,63502 21426,424 21428,781 21430,5366 21431,160 21432,1556 21433,1511 21433,3069 21434,1070 21435,1512 21435,2867 21435,2868 21435,5992 21435,213089 21435,221828 21435,227376 21437,726 21437,859 21438,859 21439,163 21440,1551 21440,3041 21441,21442 21442,1 21442,79 21442,146 21442,147 21442,149 21442,158 21442,171 21442,178 21442,202 21442,285 21442,314 21442,333 21442,336 21442,397 21442,406 21442,435 21442,505 21442,602 21442,673 21442,676 21442,685 21442,779 21442,843 21442,903 21442,972 21442,1011 21442,1087 21442,1118 21442,1130 21442,1181 21442,1294 21442,1425 21442,1458 21442,1464 21442,1502 21442,1515 21442,1518 21442,1566 21442,1572 21442,1603 21442,1776 21442,1803 21442,1877 21442,1940 21442,2102 21442,2353 21442,2373 21442,2418 21442,2427 21442,2460 21442,2652 21442,2792 21442,3813 21442,4102 21442,4684 21442,5118 21442,6622 21442,8433 21442,9394 21442,14428 21442,15439 21442,19191 21442,19854 21442,21442 21442,23890 21442,23903 21442,23920 21442,23941 21442,23957 21442,23983 21442,24002 21442,24007 21442,24023 21442,24051 21442,24061 21442,24095 21442,24113 21442,24129 21442,24147 21442,24153 21442,24161 21442,25426 21442,26053 21442,26450 21442,26736 21442,28282 21442,30035 21442,31222 21442,32791 21442,39643 21442,48235 21442,48364 21442,54234 21442,54958 21442,59020 21442,60855 21442,62265 21442,64572 21442,68183 21442,81971 21442,85909 21442,85979 21442,89021 21442,92476 21442,93860 21442,109131 21442,109369 21442,114954 21442,117966 21442,117974 21442,118336 21442,119438 21442,120155 21442,128143 21442,130027 21442,131211 21442,141912 21442,142749 21442,143374 21442,143387 21442,144892 21442,145047 21442,146282 21442,149998 21442,150090 21442,150666 21442,151028 21442,152141 21442,154480 21442,154733 21442,154986 21442,154990 21442,155431 21442,155441 21442,155662 21442,157336 21442,157454 21442,157666 21442,160250 21442,160698 21442,161987 21442,163422 21442,163425 21442,164980 21442,168430 21442,168446 21442,168823 21442,169311 21442,169400 21442,170000 21442,170149 21442,170562 21442,170612 21442,170650 21442,171592 21442,171647 21442,171734 21442,173316 21442,176407 21442,176545 21442,176823 21442,176961 21442,177356 21442,180336 21442,181860 21442,181896 21442,183833 21442,190254 21442,191136 21442,194508 21442,195024 21442,195171 21442,195506 21442,195512 21442,195543 21442,195554 21442,197609 21442,204103 21442,205422 21442,207659 21442,207666 21442,213913 21442,215874 21442,220502 21442,221747 21442,221812 21442,221816 21442,222251 21442,224502 21442,224577 21442,229836 21442,232138 21442,232760 21442,232795 21442,234148 21442,236469 21442,236787 21442,238340 21442,240173 21442,240174 21442,241557 21442,241694 21442,244738 21442,244986 21442,245004 21442,245318 21442,247210 21442,249757 21442,249758 21442,249770 21442,250648 21442,250676 21442,257991 21442,258115 21442,258206 21442,258796 21442,258905 21442,259302 21442,260807 21442,262349 21442,263178 21443,21444 21443,51279 21443,86120 21445,278 21446,206 21446,7652 21447,143 21448,22 21448,163 21448,259 21448,809 21448,2017 21449,222 21449,289 21449,290 21449,332 21449,636 21449,1807 21449,6424 21449,94134 21450,83 21450,217 21450,278 21450,455 21450,1019 21450,1467 21450,3409 21450,7572 21450,8788 21450,8855 21451,422 21453,980 21454,269 21455,1033 21456,163 21457,292 21458,1707 21458,2411 21458,6837 21459,941 21459,972 21460,202 21460,203 21461,111 21462,673 21463,525 21464,306 21464,307 21465,1707 21466,710 21467,313 21468,609 21469,1715 21470,163 21471,775 21472,1454 21474,163 21475,500 21476,1962 21477,1052 21478,1882 21479,2775 21480,54 21481,2210 21481,4237 21482,217 21483,1977 21483,1978 21484,527 21485,406 21486,21487 21488,240 21488,435 21488,536 21488,1001 21488,1284 21489,222 21490,143 21491,3 21492,163 21493,1425 21495,1016 21495,2205 21495,2206 21495,33424 21495,245910 21496,163 21497,849 21497,1844 21498,298 21499,485 21501,1655 21502,3467 21503,56 21503,192 21503,422 21503,30331 21503,60576 21504,1326 21504,2995 21505,422 21506,50 21506,149 21506,333 21506,406 21506,622 21507,5591 21508,5405 21509,422 21510,818 21510,2989 21510,2991 21511,422 21512,422 21513,422 21514,264 21514,736 21515,536 21516,1655 21517,34 21517,35 21517,920 21518,586 21519,222 21519,515 21520,163 21521,626 21521,1140 21521,1151 21522,77 21522,1392 21522,1659 21522,2367 21522,5405 21523,21524 21526,247 21527,1983 21528,192 21528,337 21528,493 21528,663 21528,682 21528,1181 21528,1293 21528,1985 21528,3507 21528,59021 21528,72439 21528,189839 21529,21530 21529,54887 21531,1 21532,292 21533,134 21533,137 21534,422 21535,56 21536,364 21537,72 21538,151 21539,292 21540,467 21540,868 21540,1433 21540,156379 21540,162599 21541,760 21542,631 21542,805 21542,1085 21542,1466 21543,1509 21544,1127 21544,2051 21544,49057 21545,364 21546,581 21547,240 21547,392 21547,467 21547,818 21548,222 21549,1010 21550,9743 21551,718 21552,760 21552,788 21552,862 21552,991 21553,21408 21554,579 21554,861 21554,1556 21554,63471 21555,422 21556,56 21557,30 21557,137 21557,225 21557,772 21557,1332 21558,34 21558,35 21559,885 21559,887 21559,994 21559,1235 21559,1335 21560,1506 21561,222 21561,283 21561,455 21561,1019 21562,663 21562,664 21563,34 21563,35 21563,65 21563,66 21563,83 21563,120 21563,202 21563,203 21563,217 21563,278 21563,314 21563,326 21563,383 21563,388 21563,392 21563,431 21563,455 21563,467 21563,536 21563,571 21563,577 21563,599 21563,694 21563,697 21563,752 21563,868 21563,918 21563,949 21563,1019 21563,1118 21563,1140 21563,1181 21563,1210 21563,1417 21563,1433 21563,1454 21563,1623 21563,1715 21563,1782 21563,1837 21563,1844 21563,2671 21563,2979 21563,3623 21563,8192 21563,136014 21563,141912 21564,1707 21566,417 21567,10 21568,852 21570,422 21571,56 21572,158 21572,406 21573,163 21574,312 21575,710 21576,392 21577,34 21577,35 21579,292 21580,240 21581,298 21582,485 21583,536 21584,314 21584,336 21584,852 21584,1011 21584,5726 21585,298 21586,485 21587,557 21587,954 21587,1939 21588,372 21588,788 21590,1172 21591,41 21591,134 21591,850 21591,1001 21592,7698 21592,204093 21593,347 21593,356 21593,1955 21594,34 21594,1235 21594,1411 21594,1715 21594,3804 21594,15807 21595,525 21596,81 21597,1767 21598,184 21599,1801 21600,143 21601,1 21601,160 21601,358 21601,1118 21602,805 21602,21603 21604,118 21604,4597 21605,192 21606,147 21606,184 21606,358 21606,2244 21606,14434 21607,328 21607,509 21607,622 21607,991 21607,1033 21607,1133 21607,1326 21607,1749 21607,2334 21607,3367 21607,205488 21608,104 21608,557 21608,953 21608,954 21608,1939 21609,143 21610,344 21610,827 21611,292 21612,192 21612,202 21612,203 21612,222 21612,333 21612,1181 21612,2266 21613,34 21613,35 21613,83 21613,158 21613,217 21613,536 21613,660 21613,852 21613,1133 21613,1274 21613,1466 21613,4637 21613,7092 21614,4 21614,5 21614,1984 21615,1127 21616,717 21617,611 21618,149 21619,10 21619,113156 21620,1085 21621,518 21622,34 21622,35 21622,2209 21623,336 21623,5726 21624,344 21625,272 21625,1370 21627,393 21627,980 21628,143 21629,516 21630,83 21630,273 21630,274 21630,313 21630,859 21630,920 21630,1146 21630,1400 21630,2424 21631,247 21632,302 21633,248 21633,5405 21634,1370 21635,1181 21636,660 21637,298 21638,485 21639,120 21639,222 21639,1860 21639,6955 21640,72 21641,160 21642,344 21643,163 21643,579 21644,149 21645,4220 21646,9239 21647,557 21647,2607 21647,3209 21648,1531 21649,34 21649,35 21649,134 21649,146 21649,167 21649,272 21649,346 21649,372 21649,525 21649,640 21649,673 21649,714 21649,1149 21649,1210 21649,1220 21649,1222 21649,1285 21649,1374 21649,1467 21649,1572 21649,1776 21649,1782 21649,2073 21649,2209 21649,2266 21649,2671 21649,2697 21649,2782 21649,3129 21649,3345 21649,3744 21649,5718 21649,6888 21649,7124 21649,7270 21649,7360 21649,8180 21649,21650 21649,21687 21649,21716 21651,2837 21652,1590 21653,422 21653,3474 21654,1590 21654,1644 21655,376 21656,1801 21656,3182 21657,259 21658,302 21659,1007 21660,1181 21661,107 21662,158 21663,83 21663,292 21663,399 21663,1210 21663,2353 21664,1222 21664,1512 21665,309 21665,310 21665,344 21665,489 21665,631 21665,749 21665,841 21665,849 21665,1436 21665,1844 21665,2334 21665,6424 21665,227376 21666,500 21667,328 21668,491 21668,788 21668,801 21668,1559 21668,1639 21668,3695 21669,104 21670,143 21671,151 21672,160 21673,289 21673,290 21674,247 21675,149 21676,140 21677,349 21677,1019 21679,3148 21680,4831 21681,2205 21681,2206 21682,158 21683,68 21683,4220 21684,20359 21685,406 21686,1707 21688,219 21689,298 21690,485 21691,338 21691,852 21692,251 21692,493 21692,516 21692,920 21692,1363 21692,1454 21692,1836 21692,1983 21692,3804 21694,3507 21695,527 21695,743 21695,4810 21695,8714 21696,302 21697,83 21698,3138 21699,338 21700,392 21701,37 21701,86 21701,167 21701,301 21701,615 21701,968 21701,1293 21701,1837 21702,366 21703,48 21703,305 21703,611 21703,712 21703,1572 21703,1612 21703,1707 21703,1821 21703,1849 21703,1881 21703,2512 21704,147 21705,338 21706,202 21706,493 21706,1085 21706,1243 21707,1363 21708,86 21709,2209 21709,4411 21709,21711 21710,972 21710,1014 21712,775 21713,364 21714,1381 21715,861 21717,4252 21719,205 21720,120 21721,1085 21722,143 21723,1707 21724,536 21724,2797 21725,805 21726,1849 21727,280 21727,393 21727,980 21728,302 21729,827 21729,1058 21731,1893 21732,163 21732,209 21732,262 21732,302 21732,312 21732,467 21732,579 21732,622 21732,647 21732,687 21732,760 21732,811 21732,893 21732,991 21732,1556 21732,2116 21732,2605 21732,19005 21732,220502 21733,278 21733,389 21733,19443 21734,72 21735,2286 21736,280 21736,393 21736,980 21736,1370 21736,1821 21736,2782 21736,17245 21736,21736 21737,1282 21738,247 21740,21741 21740,100303 21740,109723 21740,128633 21742,10 21742,298 21742,417 21742,534 21742,1001 21742,1085 21742,2296 21742,2572 21742,6068 21743,1579 21744,44 21745,340 21746,30 21746,328 21746,1179 21747,192 21747,932 21747,1479 21747,7956 21748,247 21749,644 21750,5405 21751,50 21752,2779 21753,1298 21754,1724 21755,626 21756,21757 21758,859 21759,222 21760,1414 21761,250 21762,72 21763,240 21764,72 21765,37 21766,205 21767,21768 21769,577 21769,1105 21769,1298 21770,1893 21770,4294 21771,225 21772,957 21772,1815 21773,3193 21774,72 21775,72 21776,72 21777,1608 21778,4903 21780,21781 21782,22 21782,599 21783,1326 21784,563 21785,1235 21785,1335 21786,258 21787,626 21788,781 21789,34 21789,35 21790,4222 21791,26 21791,59 21792,1551 21793,536 21794,30 21795,3 21795,34 21795,35 21795,50 21795,58 21795,86 21795,87 21795,104 21795,106 21795,134 21795,135 21795,136 21795,137 21795,167 21795,209 21795,217 21795,227 21795,247 21795,251 21795,252 21795,254 21795,269 21795,285 21795,289 21795,290 21795,328 21795,332 21795,333 21795,364 21795,392 21795,393 21795,420 21795,433 21795,515 21795,516 21795,536 21795,538 21795,557 21795,589 21795,596 21795,631 21795,636 21795,644 21795,720 21795,749 21795,779 21795,795 21795,850 21795,877 21795,907 21795,968 21795,1001 21795,1007 21795,1010 21795,1085 21795,1179 21795,1241 21795,1265 21795,1266 21795,1363 21795,1368 21795,1381 21795,1453 21795,1522 21795,1544 21795,1715 21795,1818 21795,1837 21795,1939 21795,1955 21795,2083 21795,2105 21795,2191 21795,2379 21795,2620 21795,2931 21795,2979 21795,3003 21795,3328 21795,3474 21795,4355 21795,4545 21795,5405 21795,5718 21795,6119 21795,6803 21795,41170 21795,94134 21795,139010 21796,1289 21797,920 21798,217 21799,192 21800,811 21801,278 21802,21803 21802,31888 21804,184 21805,1 21806,158 21806,620 21806,1181 21806,2244 21807,72 21808,872 21809,5405 21810,808 21811,313 21812,83 21813,781 21814,1837 21815,344 21816,2105 21817,1522 21817,1955 21817,2083 21817,5301 21818,557 21819,557 21820,1707 21821,5101 21822,328 21823,111 21823,178 21823,346 21823,516 21823,631 21823,1033 21823,1181 21823,1265 21823,1266 21823,1531 21823,3872 21824,15119 21825,217 21825,222 21825,1417 21827,1458 21827,2231 21827,4933 21827,15439 21827,21828 21827,28108 21827,37854 21829,3507 21830,388 21831,9098 21832,211 21832,269 21832,1014 21833,171 21834,233 21835,1289 21836,602 21837,1803 21838,346 21839,21840 21839,33198 21839,37923 21839,48837 21839,52521 21841,2411 21842,2205 21842,2206 21842,33424 21843,298 21844,485 21845,298 21846,485 21847,3 21848,289 21848,290 21849,1871 21849,5906 21850,1019 21852,163 21852,209 21852,302 21853,1247 21853,164572 21854,2506 21855,657 21856,8373 21857,4344 21858,21859 21860,843 21861,2681 21861,31977 21861,44570 21862,175 21862,2681 21862,31977 21862,99010 21862,100085 21862,121933 21862,125770 21862,171770 21862,175788 21862,178367 21863,493 21863,586 21863,1265 21863,1266 21864,65 21865,30 21865,328 21865,1179 21866,1837 21867,805 21867,1119 21867,2105 21867,4220 21867,66297 21867,172012 21868,30 21869,72 21870,79 21871,723 21872,1888 21873,240 21874,1623 21875,5906 21876,298 21877,485 21878,431 21879,1608 21880,130 21881,264 21881,1289 21882,493 21882,586 21882,1243 21882,1265 21882,1266 21883,417 21884,392 21885,602 21886,68 21887,602 21889,1188 21890,21891 21892,21893 21894,4611 21895,1133 21896,21897 21896,35259 21898,779 21898,1181 21898,1515 21899,1453 21900,217 21900,222 21900,455 21900,5343 21900,5547 21901,602 21902,557 21903,602 21904,422 21905,130 21905,206 21906,111 21907,602 21908,147 21908,302 21908,467 21908,2116 21909,171 21910,422 21911,422 21913,422 21914,809 21914,872 21914,6726 21915,422 21916,422 21917,422 21918,422 21919,422 21920,366 21921,872 21922,577 21923,21924 21925,7124 21926,215 21927,10 21928,10 21929,473 21929,2590 21930,4594 21931,3367 21932,3 21933,8884 21934,7 21934,202 21934,203 21935,21936 21937,21937 21939,72 21940,99 21941,1001 21942,21943 21942,29088 21944,967 21944,2939 21944,9070 21944,13704 21945,21946 21947,841 21948,323 21949,21950 21951,77 21952,323 21953,366 21954,366 21955,366 21956,366 21957,366 21958,99 21959,175 21960,16196 21961,21962 21963,323 21964,1203 21964,1955 21965,1556 21966,579 21967,233 21968,579 21969,710 21970,102 21971,58 21972,46 21973,515 21974,163 21975,7614 21976,392 21977,579 21978,2048 21979,304 21980,781 21981,264 21981,392 21981,1220 21981,1222 21982,808 21982,1192 21982,1949 21983,163 21984,298 21985,485 21986,298 21987,485 21988,387 21989,102 21990,483 21991,3451 21991,3452 21992,781 21993,3653 21995,781 21996,579 21998,1452 21998,1849 21999,22 21999,717 21999,7698 22000,167 22000,217 22000,406 22000,467 22000,599 22000,631 22000,868 22000,872 22000,1085 22000,1796 22001,240 22002,644 22003,48 22003,333 22003,567 22003,707 22003,783 22003,1425 22003,4453 22003,67888 22004,171 22007,32 22007,137 22007,187 22007,192 22007,202 22007,222 22007,273 22007,326 22007,358 22007,387 22007,415 22007,579 22007,657 22007,666 22007,676 22007,811 22007,838 22007,891 22007,1117 22007,1147 22007,1192 22007,1313 22007,1417 22007,1590 22007,1871 22007,1973 22007,2266 22007,2421 22007,3258 22007,5908 22008,527 22009,298 22010,485 22011,9024 22012,1425 22013,252 22013,318 22013,41170 22014,6891 22015,66 22015,192 22015,240 22015,336 22015,1623 22016,283 22016,323 22016,388 22016,623 22016,779 22016,949 22016,996 22016,1072 22016,1465 22016,1927 22016,3135 22016,4549 22016,14126 22017,289 22017,290 22017,3041 22018,255 22019,1072 22020,1191 22020,1663 22020,2253 22020,6824 22021,146 22022,217 22022,446 22022,872 22022,1118 22022,1796 22022,3111 22022,3297 22022,16196 22022,19005 22025,255 22026,21589 22027,1803 22028,489 22029,240 22029,397 22029,2989 22029,2991 22029,4355 22030,536 22031,30 22031,48 22031,94 22031,273 22031,274 22031,328 22031,358 22031,481 22031,583 22031,994 22031,1172 22031,1179 22031,1247 22031,1432 22031,2421 22031,2787 22031,3538 22031,4218 22031,14434 22032,104 22032,589 22032,1462 22032,4220 22032,8537 22033,217 22034,781 22035,81 22036,306 22036,307 22037,647 22038,344 22039,442 22039,588 22039,590 22039,1411 22039,2205 22039,33424 22039,178576 22040,5405 22041,647 22042,344 22043,163 22044,586 22045,140 22045,338 22045,360 22045,392 22045,479 22045,535 22045,1052 22045,1147 22045,1381 22045,1893 22045,1973 22045,13538 22045,26181 22045,49057 22045,131675 22048,15119 22050,171 22051,330 22054,182 22054,188 22054,202 22054,203 22054,1844 22055,158 22055,406 22055,779 22055,1181 22055,1515 22055,4193 22055,68069 22056,344 22056,647 22057,2572 22058,134 22058,431 22058,801 22058,805 22059,58 22060,46 22061,811 22062,167 22062,240 22062,301 22062,604 22062,968 22062,1522 22062,2083 22063,182 22063,217 22063,1417 22063,1844 22064,1096 22065,4 22065,5 22065,134 22065,743 22065,8714 22066,868 22067,647 22068,344 22069,647 22070,344 22073,22 22073,41 22073,48 22073,77 22073,137 22073,171 22073,255 22073,269 22073,289 22073,290 22073,302 22073,304 22073,360 22073,379 22073,424 22073,430 22073,485 22073,491 22073,510 22073,589 22073,605 22073,640 22073,647 22073,668 22073,707 22073,720 22073,749 22073,818 22073,852 22073,861 22073,919 22073,920 22073,934 22073,957 22073,1132 22073,1133 22073,1179 22073,1289 22073,1556 22073,1608 22073,1749 22073,1881 22073,1983 22073,2205 22073,2266 22073,2506 22073,2646 22073,2784 22073,3161 22073,3209 22073,3623 22073,3695 22073,4455 22073,4571 22073,5130 22073,13661 22073,16687 22073,22293 22073,33424 22073,35486 22073,53499 22073,94134 22073,142433 22073,155473 22074,852 22075,2210 22075,4237 22075,182162 22076,302 22076,344 22076,557 22078,849 22078,852 22078,26450 22079,390 22080,376 22081,104 22081,264 22081,483 22081,1119 22084,217 22085,392 22086,875 22087,79 22087,710 22087,760 22089,264 22089,749 22089,1381 22089,2605 22090,104 22090,254 22090,557 22090,953 22090,954 22090,1939 22091,1453 22093,577 22094,171 22095,2045 22096,647 22097,344 22098,577 22098,1070 22098,1309 22098,1462 22098,2205 22098,8537 22098,33424 22100,1551 22101,1 22102,147 22102,184 22103,589 22104,171 22105,1368 22105,5405 22106,298 22107,485 22109,171 22110,171 22111,302 22111,579 22112,2045 22113,1556 22114,171 22115,891 22116,2083 22117,298 22118,485 22119,34 22119,35 22119,143 22119,657 22119,1052 22119,1639 22119,5250 22119,7768 22119,13661 22119,42121 22120,298 22121,485 22122,563 22123,1 22124,1506 22124,22125 22125,704 22126,147 22126,149 22126,1118 22127,66 22128,459 22128,920 22129,171 22130,455 22131,1323 22132,102 22133,1326 22134,408 22135,779 22136,209 22137,272 22138,1531 22139,306 22139,307 22140,1058 22141,2051 22142,3 22142,605 22142,2224 22142,2274 22143,1379 22144,388 22145,5405 22145,189303 22146,1836 22148,219 22148,493 22148,1877 22149,104 22149,315 22149,588 22149,590 22149,714 22149,795 22149,1882 22150,372 22151,781 22152,571 22152,868 22152,1888 22153,1127 22154,2051 22154,3474 22155,2051 22155,5547 22156,72 22157,2083 22159,788 22160,2443 22161,1556 22163,97 22164,640 22165,640 22166,640 22167,640 22168,1070 22168,1381 22169,134 22170,647 22171,344 22172,222 22172,278 22172,19443 22173,104 22173,349 22173,392 22173,1836 22174,563 22175,171 22176,1433 22177,225 22177,379 22177,431 22177,932 22177,941 22177,968 22177,1832 22177,2775 22177,22799 22178,861 22178,2116 22179,163 22180,389 22181,3 22182,366 22182,827 22182,4101 22183,1267 22184,1467 22185,4066 22186,1927 22187,515 22190,1433 22191,2224 22192,893 22192,1453 22193,801 22193,1453 22193,9030 22194,647 22195,344 22196,577 22196,859 22196,1105 22196,1429 22197,1240 22198,424 22199,206 22200,372 22202,1877 22203,302 22204,252 22204,516 22204,1220 22204,1222 22204,41170 22205,516 22207,1619 22208,647 22209,344 22210,147 22210,149 22210,158 22210,184 22211,781 22212,932 22213,1118 22215,647 22216,344 22217,392 22218,1019 22219,602 22220,832 22221,68 22221,178 22221,186 22221,315 22221,346 22221,393 22221,435 22221,538 22221,934 22221,1033 22221,1068 22221,1294 22221,1531 22221,1590 22221,1877 22221,2353 22221,6661 22222,215 22222,503 22223,602 22224,1220 22224,1222 22225,252 22226,251 22227,841 22229,50 22229,79 22229,195 22229,305 22229,435 22229,516 22229,602 22229,920 22229,3209 22229,4455 22229,5213 22229,6119 22229,22280 22230,435 22231,147 22231,149 22231,158 22233,120 22233,1001 22234,217 22235,20 22236,5212 22237,147 22238,1983 22239,1143 22240,697 22241,333 22241,337 22241,59021 22242,130 22243,1415 22244,83 22247,34 22247,35 22248,647 22249,344 22250,422 22251,56 22252,7768 22254,83 22254,217 22254,278 22254,536 22256,68 22256,72 22256,873 22256,874 22256,1143 22256,1210 22256,1274 22256,2620 22256,5405 22257,163 22258,312 22259,192 22259,516 22259,663 22259,664 22259,127158 22261,211 22262,397 22264,1220 22264,1222 22265,252 22266,251 22267,500 22267,1124 22268,104 22268,289 22268,290 22268,298 22268,714 22268,1212 22268,1462 22268,2105 22268,4220 22268,6068 22268,8537 22268,9022 22268,9028 22268,75912 22268,94134 22269,647 22270,344 22271,1282 22271,1453 22275,538 22275,893 22275,1010 22276,163 22276,467 22276,861 22277,301 22277,406 22277,818 22277,1433 22278,872 22278,919 22279,120 22282,77 22282,83 22282,222 22282,285 22282,536 22282,631 22282,1085 22282,22293 22283,99 22284,195 22285,536 22286,163 22287,195 22288,104 22288,134 22288,332 22289,718 22290,536 22291,301 22291,1085 22291,189303 22292,22 22292,79 22292,163 22292,187 22292,459 22292,509 22292,538 22292,579 22292,745 22292,1007 22292,1033 22292,1326 22292,1425 22292,1677 22292,2116 22292,2443 22293,287 22293,392 22293,425 22293,518 22293,779 22293,809 22293,903 22293,918 22293,1678 22293,2016 22293,2418 22293,2475 22293,2819 22293,4760 22293,5604 22293,7388 22293,7781 22293,8420 22293,15654 22293,17852 22293,18662 22293,19010 22293,19618 22293,22293 22293,23447 22293,24680 22293,26161 22293,30691 22293,37219 22293,40552 22293,42684 22293,49108 22293,56397 22293,67984 22293,72070 22293,80063 22293,80431 22293,80957 22293,90715 22293,91892 22293,94351 22293,101588 22293,102676 22293,109421 22293,109901 22293,110486 22293,127317 22293,127852 22293,129844 22293,129851 22293,140416 22293,140465 22293,142868 22293,144951 22293,150172 22293,154654 22293,156320 22293,167739 22293,174582 22293,174754 22293,191939 22293,194427 22293,222627 22294,3209 22295,346 22296,182 22296,186 22296,211 22296,366 22296,406 22296,457 22296,500 22296,872 22296,1014 22296,1118 22296,1796 22296,173420 22296,220502 22297,163 22298,358 22299,248 22299,760 22299,1149 22299,1631 22299,1635 22300,1977 22300,1978 22301,137 22302,3451 22302,3452 22303,7360 22304,509 22304,510 22304,1572 22305,163 22306,163 22306,2116 22307,143 22308,33 22308,364 22308,431 22308,1227 22308,1229 22308,1252 22308,1253 22308,9541 22308,21944 22308,86416 22308,155473 22308,259296 22309,647 22310,344 22311,302 22313,30 22313,250 22313,602 22313,994 22313,1684 22313,30331 22314,392 22314,1240 22314,1353 22314,1454 22315,731 22316,1858 22317,56 22317,841 22317,1181 22317,1993 22317,2386 22317,23783 22317,30362 22317,30494 22318,240 22318,818 22320,217 22320,22321 22322,163 22323,163 22323,302 22324,808 22325,2775 22326,447 22327,66 22327,364 22328,1203 22329,163 22330,515 22331,1203 22331,1955 22333,273 22333,274 22333,313 22333,1068 22334,3138 22335,147 22335,631 22335,818 22335,1149 22335,1177 22336,4831 22337,240 22337,818 22337,1203 22337,1285 22337,1955 22338,146 22338,779 22338,1515 22339,240 22339,1203 22340,1419 22341,147 22341,422 22342,50 22343,1007 22344,9011 22344,9032 22345,2828 22346,893 22347,136 22347,287 22347,538 22347,809 22347,1634 22347,5310 22347,19010 22348,4611 22349,920 22350,389 22352,301 22352,604 22352,1293 22353,1203 22354,611 22355,647 22356,344 22357,1803 22361,11 22361,911 22361,1619 22362,2051 22362,2626 22362,49057 22363,137 22363,187 22363,222 22363,326 22363,387 22363,415 22363,623 22363,626 22363,1419 22363,1454 22363,1805 22363,1888 22363,2460 22363,3003 22363,5591 22363,44743 22364,206 22366,50 22366,406 22367,336 22368,34 22368,1718 22369,195 22370,160 22370,264 22370,1425 22371,1370 22372,192 22373,861 22374,417 22375,171 22376,7092 22377,809 22377,19010 22378,217 22378,1417 22379,83 22380,209 22380,861 22381,149 22382,83 22383,10 22384,784 22385,178 22385,435 22385,622 22385,1033 22386,1858 22387,1860 22388,21944 22389,83 22389,685 22389,849 22389,941 22389,1247 22389,1402 22389,1782 22389,178576 22390,21944 22391,717 22391,868 22391,1782 22391,162599 22393,135 22394,72 22395,192 22395,256 22396,996 22397,147 22397,192 22398,269 22399,184 22400,861 22401,1417 22403,622 22404,151 22406,163 22408,1240 22409,2089 22409,2940 22409,21944 22410,1509 22411,344 22412,333 22413,163 22413,1381 22414,264 22414,736 22414,835 22414,1052 22414,1127 22414,1381 22414,1551 22414,1893 22415,631 22416,104 22416,240 22416,973 22416,1458 22418,328 22418,1179 22419,479 22421,143 22422,219 22425,980 22425,2979 22426,406 22426,516 22426,1370 22427,579 22427,2116 22428,364 22428,1282 22428,2205 22428,33424 22429,19 22430,217 22431,980 22432,160 22432,273 22432,274 22432,515 22432,527 22432,652 22432,710 22432,1127 22432,1188 22432,1381 22432,1579 22432,1722 22432,1893 22433,852 22434,182 22434,3524 22435,720 22435,801 22435,991 22436,827 22437,2779 22439,65 22440,211 22440,240 22440,503 22440,518 22440,775 22440,801 22440,1001 22440,1119 22440,1140 22440,1326 22440,1659 22440,2334 22440,5547 22440,6556 22440,221286 22442,515 22443,310 22443,16207 22443,22727 22444,364 22445,772 22446,15573 22447,22448 22449,83 22450,68 22450,1326 22450,1782 22451,2178 22451,4545 22451,56150 22451,139010 22452,312 22453,1033 22453,1181 22454,86 22455,379 22455,1434 22456,760 22457,852 22458,704 22459,72 22460,120 22461,1888 22462,640 22463,22464 22465,22464 22466,206 22468,2312 22469,417 22470,81 22471,919 22472,143 22473,344 22473,1711 22474,10 22474,3316 22475,72 22476,211 22477,392 22478,298 22479,485 22480,640 22480,2744 22480,142405 22481,2867 22481,2868 22483,151 22484,333 22485,63 22485,272 22485,332 22485,422 22485,433 22485,435 22485,615 22485,752 22485,1085 22485,1381 22485,3218 22485,3467 22485,5213 22485,55849 22486,640 22487,640 22488,217 22488,536 22489,151 22490,441 22490,609 22490,760 22490,1631 22491,22492 22491,144888 22493,163 22493,861 22493,893 22493,1849 22494,79 22494,336 22494,525 22495,22496 22497,22496 22498,22496 22502,22503 22504,158 22505,314 22505,900 22506,1465 22507,146 22509,240 22509,278 22509,301 22509,356 22509,372 22509,843 22509,875 22509,1001 22509,1010 22509,1012 22509,1175 22509,1231 22509,1240 22509,1326 22509,1436 22509,1544 22509,1572 22509,1722 22509,1849 22509,1955 22509,2286 22509,2416 22509,2699 22509,3138 22509,3585 22509,3612 22509,4252 22510,184 22512,305 22513,10 22514,4594 22515,1740 22516,390 22517,250 22517,1684 22518,22519 22520,22521 22520,111909 22522,1227 22522,1229 22523,718 22524,1511 22524,3069 22525,79 22526,1454 22526,4172 22527,283 22527,455 22527,536 22527,1467 22527,1881 22527,2266 22528,147 22528,202 22528,252 22528,439 22528,516 22528,663 22528,920 22528,1181 22529,146 22530,151 22530,1070 22530,3804 22532,22533 22532,32032 22532,37167 22532,51122 22532,51600 22532,52467 22532,53700 22534,1453 22535,292 22535,441 22535,1688 22535,3538 22536,1227 22536,1229 22536,86416 22537,5405 22538,151 22539,592 22539,2416 22539,2417 22540,211 22541,376 22542,885 22543,255 22544,1284 22544,148742 22545,1400 22546,2506 22547,72 22548,86 22548,167 22548,240 22548,301 22548,372 22548,567 22548,605 22548,615 22548,631 22548,720 22548,801 22548,907 22548,972 22548,973 22548,1010 22548,1122 22548,1124 22548,1140 22548,1167 22548,1231 22548,1241 22548,1284 22548,1298 22548,1309 22548,1436 22548,1522 22548,1544 22548,1564 22548,1782 22548,1785 22548,1818 22548,1837 22548,1893 22548,2191 22548,2372 22548,2557 22548,2620 22548,2979 22548,3193 22548,3207 22548,3218 22549,376 22550,5310 22551,717 22551,991 22551,1096 22551,1368 22551,1465 22551,1509 22552,54 22552,283 22552,455 22553,252 22554,2209 22555,18726 22555,68955 22556,22557 22556,173049 22558,2178 22558,4545 22558,139010 22559,10 22560,252 22560,516 22560,1220 22560,1222 22561,1551 22562,592 22562,1001 22563,195 22564,22565 22566,20771 22567,184 22567,2646 22568,640 22569,22570 22571,22572 22573,3538 22574,22575 22576,3538 22577,809 22578,205 22579,65 22579,406 22579,1531 22579,22580 22581,433 22582,1133 22583,346 22584,925 22585,693 22586,875 22587,158 22588,247 22589,202 22589,203 22590,862 22591,736 22592,30 22593,1411 22593,2417 22593,3804 22594,22595 22596,557 22597,557 22598,557 22599,8719 22600,138 22601,865 22602,557 22603,137 22604,1 22605,118 22605,4597 22606,21944 22608,8719 22609,138 22610,557 22611,865 22612,137 22613,118 22613,4597 22614,21944 22615,10 22617,8719 22618,138 22619,22620 22621,865 22622,557 22623,137 22624,118 22624,4597 22625,21944 22626,8719 22627,138 22628,865 22629,557 22630,137 22631,118 22631,4597 22632,21944 22633,2506 22634,2506 22635,21944 22636,346 22637,21944 22638,255 22639,843 22640,452 22640,457 22640,497 22640,535 22640,676 22640,1655 22641,21944 22643,26 22643,59 22643,994 22643,2674 22643,21944 22644,346 22645,1313 22647,346 22648,22649 22650,1531 22652,1381 22653,832 22654,832 22654,1522 22655,489 22656,1181 22657,861 22658,8992 22659,34 22659,35 22659,158 22659,217 22659,248 22659,389 22659,392 22659,536 22659,577 22659,779 22659,862 22659,1001 22659,1010 22659,1019 22659,1436 22659,1608 22659,1644 22659,1849 22659,2083 22659,2699 22659,2782 22659,5405 22660,5591 22661,1227 22661,1229 22661,1252 22661,1253 22661,86416 22662,22663 22664,2979 22665,22666 22665,140020 22667,22668 22669,22668 22670,1381 22671,2178 22671,4545 22672,222 22673,1192 22674,1118 22675,25 22675,1425 22675,1432 22675,2088 22677,81 22677,147 22677,192 22677,195 22677,211 22677,217 22677,358 22677,366 22677,406 22677,500 22677,596 22677,622 22677,640 22677,718 22677,779 22677,818 22677,861 22677,1181 22677,1515 22677,1631 22677,1847 22677,4094 22677,5102 22677,141912 22678,3161 22679,1556 22680,557 22681,171 22682,493 22683,167 22683,301 22683,312 22683,392 22683,968 22683,1001 22683,1287 22683,2017 22683,2443 22684,408 22685,1058 22687,22688 22689,22690 22691,30 22691,1118 22691,1149 22691,22692 22691,74832 22691,86527 22691,86652 22691,100948 22691,113816 22691,193933 22693,22694 22695,158 22696,22697 22698,516 22698,41170 22700,5591 22701,2697 22702,158 22702,192 22703,22704 22705,72 22706,22707 22708,22707 22709,10 22710,4455 22711,115 22711,118 22711,137 22711,151 22711,206 22711,302 22711,306 22711,307 22711,372 22711,491 22711,595 22711,720 22711,957 22711,1381 22711,1436 22711,1684 22711,1815 22711,3148 22711,3467 22711,3967 22711,3999 22711,4411 22712,10 22713,1070 22714,1181 22715,589 22715,1001 22716,22717 22718,663 22718,664 22719,22720 22721,22722 22723,192 22724,151 22725,557 22726,22727 22728,22729 22730,225 22731,2699 22731,3003 22732,22733 22734,22735 22736,8884 22737,2681 22737,31977 22738,1085 22739,2292 22740,22741 22742,22743 22744,233 22745,1247 22746,596 22747,644 22748,22749 22750,22751 22753,2048 22754,8270 22755,366 22756,366 22757,366 22758,366 22759,366 22760,366 22761,366 22762,22763 22762,63505 22762,81691 22762,84924 22762,95555 22762,96381 22762,101049 22762,109856 22762,115104 22762,118190 22762,129039 22762,143061 22764,389 22766,10 22766,113156 22767,292 22768,22769 22770,306 22770,307 22771,22772 22773,22774 22775,107 22775,202 22775,203 22775,227 22775,269 22775,294 22775,299 22775,309 22775,310 22775,346 22775,366 22775,389 22775,424 22775,640 22775,657 22775,668 22775,760 22775,772 22775,841 22775,843 22775,932 22775,1085 22775,1368 22775,1381 22775,1458 22775,1544 22775,1801 22775,1849 22775,2209 22775,2266 22775,2411 22775,3507 22775,6955 22775,7155 22776,248 22776,1179 22777,267 22778,389 22779,4453 22780,483 22781,1235 22781,1335 22782,48 22783,143 22783,1052 22784,4078 22785,784 22786,647 22787,182 22787,188 22787,206 22787,7652 22788,663 22788,664 22789,130 22790,1210 22791,3846 22792,1776 22793,22794 22795,202 22795,203 22795,4453 22796,920 22797,3115 22798,2045 22798,8149 22800,280 22800,17245 22801,2681 22802,273 22802,274 22803,424 22804,130 22805,2837 22806,349 22806,509 22806,1043 22807,130 22808,217 22808,240 22808,392 22808,818 22808,1417 22808,23287 22808,102560 22808,127158 22808,191355 22808,207045 22808,212914 22809,1231 22810,2528 22811,581 22812,306 22812,307 22813,611 22814,2506 22815,68 22816,1571 22817,2506 22818,2506 22819,1388 22820,48 22821,22821 22822,731 22823,2828 22824,1133 22824,3094 22825,22826 22827,22828 22829,1181 22830,647 22831,344 22832,1782 22833,1265 22833,1266 22834,247 22835,577 22835,596 22835,1105 22835,1429 22836,136 22836,137 22836,2557 22837,2574 22838,980 22839,694 22839,2775 22840,298 22841,485 22842,72 22843,206 22843,718 22844,589 22845,10 22846,10 22847,885 22847,13704 22848,72 22849,298 22850,485 22851,1235 22851,1335 22852,72 22853,72 22854,1359 22855,72 22856,1858 22857,1860 22858,72 22859,19 22859,749 22860,313 22860,536 22860,1201 22860,1512 22860,2944 22860,5992 22860,7698 22860,7974 22860,28232 22860,193860 22860,199285 22860,254329 22861,72 22862,1181 22862,2244 22863,4548 22864,525 22865,3830 22866,104 22866,134 22866,135 22867,72 22868,22869 22871,781 22872,273 22872,274 22873,72 22874,240 22874,389 22874,1454 22875,72 22876,720 22877,252 22877,516 22877,1220 22877,1222 22878,5405 22879,48 22880,147 22880,158 22880,211 22880,634 22880,794 22880,1181 22880,1235 22880,1335 22880,2867 22880,2868 22880,22880 22881,302 22882,211 22883,130 22883,1551 22884,250 22885,1769 22886,273 22886,274 22887,217 22888,417 22889,22890 22891,22892 22893,491 22893,2315 22894,298 22895,485 22896,452 22896,457 22896,497 22896,535 22896,1655 22897,1479 22898,1085 22898,1522 22899,72 22900,22901 22902,3 22902,346 22902,435 22902,439 22902,447 22902,586 22902,1294 22902,2931 22902,6119 22903,206 22903,333 22904,647 22905,344 22906,21944 22907,5405 22908,784 22909,72 22910,72 22911,1140 22912,640 22913,602 22914,918 22914,1118 22915,4 22915,5 22916,119 22916,577 22916,1400 22916,2073 22917,130 22917,163 22917,264 22917,515 22917,1007 22917,1147 22917,1151 22917,1192 22917,1381 22917,1556 22917,1893 22917,1968 22917,3999 22918,66 22919,10 22920,1265 22920,1266 22921,647 22922,344 22923,3069 22924,22924 22925,1844 22926,22927 22928,22 22929,7 22930,22931 22930,47343 22930,47366 22930,49880 22930,53226 22930,54769 22930,55266 22930,56077 22930,60106 22930,62212 22930,65418 22930,68093 22930,69945 22930,78358 22930,88129 22930,250408 22932,3297 22933,2528 22934,22935 22936,163 22937,424 22938,3872 22939,120 22939,647 22939,682 22939,805 22939,1353 22939,3367 22939,3769 22940,811 22940,2178 22940,4545 22940,56150 22940,139010 22941,663 22941,664 22942,663 22942,664 22943,22944 22945,147 22946,22947 22948,30 22948,34 22948,35 22948,134 22948,158 22948,200 22948,211 22948,275 22948,333 22948,450 22948,536 22948,557 22948,585 22948,589 22948,862 22948,907 22948,991 22948,1102 22948,1149 22948,1285 22948,1379 22948,1414 22948,1776 22948,1980 22948,2048 22948,2351 22948,2931 22948,2995 22948,3872 22948,3960 22948,4475 22948,5366 22948,5440 22948,6068 22948,7358 22948,7360 22948,7363 22948,7652 22948,8270 22948,8991 22948,8992 22948,9121 22948,17228 22948,19227 22948,23010 22948,23011 22949,81 22949,104 22949,200 22949,215 22949,227 22949,233 22949,248 22949,503 22949,592 22949,704 22949,1016 22949,1149 22949,1282 22949,1392 22949,1882 22949,2210 22949,3507 22949,4237 22949,8993 22949,182162 22950,72 22951,22952 22951,92752 22951,105363 22951,110487 22951,112724 22951,114971 22951,115334 22951,115395 22951,116211 22951,118228 22951,119110 22951,119302 22951,120294 22951,121247 22951,121767 22951,121814 22951,122834 22951,124153 22951,124174 22951,124713 22951,125508 22951,126449 22951,127950 22951,128528 22951,129885 22951,130063 22951,130614 22951,136970 22951,144794 22951,151702 22951,151900 22951,157867 22951,160179 22951,160218 22951,162271 22951,178088 22951,178361 22951,221586 22951,254381 22953,269 22954,147 22954,158 22955,16207 22956,1132 22957,376 22958,22959 22960,250 22960,712 22960,752 22960,1522 22960,1803 22961,233 22962,893 22963,22964 22965,366 22966,366 22967,366 22968,366 22969,366 22970,22971 22970,37120 22972,515 22973,147 22973,452 22973,707 22973,743 22973,1262 22974,22975 22976,22975 22977,107 22978,292 22979,2416 22979,2417 22980,338 22981,298 22982,1133 22983,3538 22984,130 22985,22986 22985,57689 22985,62737 22987,298 22988,485 22989,22990 22989,37487 22989,39853 22989,47338 22989,53515 22989,53622 22989,56038 22989,76333 22989,80302 22989,84857 22989,86946 22989,87811 22989,100856 22991,433 22992,579 22993,918 22994,22995 22996,22997 22999,579 23000,302 23001,1265 23001,1266 23002,1265 23002,1266 23003,206 23003,7652 23004,298 23005,485 23006,298 23007,485 23008,832 23008,1522 23008,1927 23009,707 23010,23010 23012,2506 23013,872 23014,872 23015,872 23016,872 23017,872 23018,872 23019,217 23019,592 23019,1818 23020,1688 23021,932 23022,298 23023,485 23024,887 23025,330 23025,783 23025,3538 23026,1289 23026,1579 23026,2051 23027,5213 23028,306 23028,307 23029,5250 23030,406 23031,750 23031,762 23031,60576 23032,312 23034,2116 23035,358 23036,422 23036,1179 23037,192 23037,932 23037,1140 23037,1284 23037,4504 23038,510 23039,272 23040,72 23041,422 23042,422 23043,422 23044,1888 23046,200 23047,44 23048,23049 23050,1326 23051,349 23052,536 23053,493 23054,1007 23055,22 23055,1058 23055,21442 23056,207 23057,280 23058,2312 23059,23060 23059,84372 23059,120470 23059,120478 23059,135331 23059,140290 23061,615 23062,973 23063,48 23064,328 23064,720 23064,885 23064,13704 23065,5405 23066,10 23067,273 23067,274 23068,1639 23069,240 23069,301 23069,2083 23070,3413 23071,1033 23072,255 23073,126 23074,2775 23075,447 23076,2334 23077,431 23077,850 23077,4771 23078,2979 23080,83 23081,184 23082,240 23083,347 23084,406 23086,918 23087,217 23087,1417 23087,1796 23087,3507 23088,5662 23089,83 23089,1118 23090,2807 23091,23092 23093,298 23094,485 23095,23096 23095,81360 23097,344 23097,1127 23097,1711 23097,1836 23098,406 23098,55849 23099,285 23099,1655 23100,703 23101,452 23101,457 23101,497 23101,535 23101,1655 23102,240 23102,1285 23102,1818 23102,2989 23102,2991 23103,337 23103,115659 23103,142409 23103,146280 23103,148600 23104,10 23104,79 23104,97 23104,149 23104,220502 23105,376 23106,1983 23107,301 23107,1844 23108,209 23109,23110 23111,26 23111,59 23112,23110 23113,358 23114,5405 23115,1381 23116,298 23117,485 23118,23119 23120,872 23121,1983 23122,435 23122,440 23123,41 23123,104 23123,106 23123,140 23123,248 23123,349 23123,439 23123,444 23123,493 23123,577 23123,586 23123,726 23123,784 23123,859 23123,1007 23123,1105 23123,1151 23123,1252 23123,1253 23123,1309 23123,1363 23123,1381 23123,1388 23123,1564 23123,1836 23123,2590 23123,2620 23123,4039 23123,28130 23123,31073 23124,422 23126,107 23127,422 23128,784 23129,872 23130,515 23131,83 23132,10 23132,23132 23132,23217 23132,221331 23133,422 23134,26 23134,47 23134,59 23134,2469 23134,21944 23135,1085 23135,1962 23136,160 23137,433 23138,315 23138,671 23139,5908 23140,557 23141,862 23142,640 23143,557 23144,557 23145,557 23146,433 23147,1019 23148,23149 23150,23151 23152,406 23152,23153 23154,23155 23154,48812 23156,273 23156,274 23157,79 23157,252 23157,832 23158,19010 23159,973 23159,2017 23159,17309 23160,332 23160,424 23160,438 23160,2315 23161,149 23161,2353 23162,344 23162,647 23162,919 23163,647 23164,344 23165,23166 23167,79 23168,1078 23169,19010 23170,2607 23171,907 23171,2620 23172,1252 23172,1253 23172,1474 23173,652 23174,364 23174,609 23174,3623 23175,2506 23176,23177 23178,3623 23179,1860 23179,7155 23180,23181 23182,4691 23183,1298 23184,872 23185,1298 23186,920 23187,872 23188,872 23189,151 23190,143 23191,3003 23192,1265 23192,1266 23193,23194 23195,72 23195,87 23195,312 23196,23197 23198,1238 23199,48 23200,1452 23201,8992 23202,5469 23203,23204 23203,96592 23205,770 23206,1085 23207,5440 23208,5101 23208,15119 23209,4355 23210,589 23211,602 23212,330 23212,868 23212,1385 23213,602 23214,6068 23215,2528 23216,991 23217,10 23217,23217 23217,139245 23218,23219 23220,1 23221,2351 23222,17334 23223,2178 23223,4545 23223,56150 23224,420 23225,1 23225,8 23225,32 23225,86 23225,117 23225,273 23225,274 23225,485 23225,1345 23225,1368 23225,2712 23225,5212 23225,7757 23225,30331 23226,23227 23228,23229 23228,129887 23230,1201 23231,217 23232,4504 23233,934 23234,23235 23234,28488 23236,577 23236,1105 23237,23238 23239,23238 23240,72 23241,8992 23242,585 23243,72 23244,273 23244,274 23245,4453 23246,818 23247,23248 23249,393 23250,9195 23252,1149 23253,23254 23255,23254 23256,602 23257,292 23258,4453 23259,294 23260,296 23261,298 23262,5366 23263,1381 23264,275 23265,2178 23265,4545 23265,139010 23266,636 23267,1313 23268,272 23269,104 23270,136 23271,703 23272,21944 23273,3161 23274,23011 23275,23276 23277,233 23278,298 23279,485 23280,23281 23280,105942 23282,163 23283,920 23284,163 23285,1313 23286,515 23286,1127 23286,1224 23286,1381 23286,1893 23286,3999 23287,313 23287,477 23287,536 23287,1074 23287,1617 23287,1724 23287,2168 23287,2507 23287,2553 23287,4030 23287,4234 23287,5326 23287,5458 23287,6754 23287,8410 23287,13137 23287,23287 23287,23288 23287,23295 23287,23301 23287,26028 23287,45986 23287,69882 23287,73451 23287,75193 23287,76953 23287,99103 23287,102706 23287,111289 23287,111296 23287,115401 23287,122530 23287,127158 23287,144231 23287,165586 23287,181063 23287,191355 23287,207766 23287,214105 23287,216248 23287,220076 23287,248796 23289,163 23290,4611 23291,1544 23292,19986 23293,581 23294,760 23296,861 23296,868 23296,1556 23297,3161 23298,298 23299,485 23300,7760 23301,477 23301,23287 23302,934 23303,781 23304,163 23305,1707 23306,163 23306,201298 23307,299 23308,23309 23310,72 23311,34 23311,35 23311,287 23311,481 23311,1696 23311,1893 23311,3830 23311,6424 23311,25395 23312,163 23313,366 23314,312 23314,358 23314,510 23315,366 23317,366 23318,46 23319,1363 23320,366 23321,366 23322,685 23323,366 23324,366 23325,1858 23326,1860 23327,338 23328,3258 23328,6424 23329,784 23329,2006 23330,3451 23330,3452 23331,835 23331,1381 23332,23333 23332,101377 23334,694 23335,644 23337,467 23337,622 23337,868 23337,1033 23337,1326 23338,209 23338,287 23338,809 23339,1559 23340,408 23341,252 23341,318 23342,364 23343,1276 23344,2681 23344,31977 23345,4903 23346,1608 23347,3413 23348,163 23349,595 23349,1033 23349,3193 23349,6638 23349,48505 23350,19986 23351,349 23351,2372 23351,148742 23352,289 23352,290 23352,94134 23354,818 23355,292 23356,184 23357,911 23358,1265 23358,1266 23359,647 23360,344 23361,163 23361,302 23362,330 23362,536 23362,994 23362,1877 23364,972 23364,5469 23365,58 23365,1167 23366,160 23366,187 23366,390 23366,604 23366,1257 23366,1359 23367,389 23367,1072 23368,841 23369,2979 23371,536 23372,305 23372,390 23373,72 23374,23375 23376,272 23376,485 23376,1634 23377,306 23377,307 23378,422 23379,255 23380,23381 23382,304 23382,525 23382,1151 23382,1212 23382,1285 23382,1309 23382,1715 23383,309 23383,310 23384,1 23385,163 23386,292 23387,23388 23387,140635 23387,151965 23389,309 23389,310 23391,206 23392,248 23393,671 23394,10 23395,1579 23396,415 23396,653 23397,980 23399,202 23399,203 23399,1392 23400,835 23401,305 23402,1849 23403,422 23404,56 23405,1749 23405,14550 23406,640 23407,19 23407,34 23407,35 23407,536 23407,781 23407,1618 23407,2646 23407,2944 23407,17346 23409,640 23410,809 23411,392 23412,622 23413,781 23414,1007 23414,68494 23414,105821 23415,647 23416,344 23417,187 23418,360 23418,1224 23418,3177 23418,3999 23419,48 23420,135 23421,592 23421,1133 23422,433 23425,500 23426,2048 23427,338 23427,595 23427,1151 23427,1893 23428,184 23429,30 23429,50 23429,79 23429,111 23429,137 23429,248 23429,420 23429,557 23429,647 23429,652 23429,1019 23429,1332 23429,2312 23429,5440 23430,20 23431,389 23431,1072 23432,953 23433,1707 23434,11 23434,20 23434,60 23434,86 23434,187 23434,483 23434,497 23434,663 23434,664 23434,668 23434,713 23434,1087 23434,1096 23434,1130 23434,1881 23434,3999 23434,5192 23434,5540 23434,9539 23434,13136 23434,41967 23434,142879 23435,21944 23436,209 23436,579 23436,3769 23437,167 23437,685 23437,1326 23437,1599 23437,3804 23437,5130 23437,20663 23437,48006 23437,122905 23438,718 23439,1722 23440,1983 23441,1983 23442,187 23442,1313 23442,23442 23443,996 23444,996 23445,1241 23446,356 23446,852 23446,3422 23448,671 23449,184 23451,330 23452,134 23452,636 23452,760 23453,788 23454,2089 23454,2940 23454,21944 23455,8235 23456,657 23456,1634 23457,72 23458,34 23458,35 23458,622 23459,907 23459,932 23460,779 23462,1891 23462,3507 23463,1068 23463,1789 23464,34 23464,35 23464,211 23465,79 23466,704 23467,622 23468,75912 23469,309 23469,310 23469,431 23469,1844 23469,2443 23469,3623 23469,7124 23469,7270 23469,8990 23469,16019 23470,415 23472,50 23472,192 23472,336 23472,5726 23472,16019 23473,330 23474,332 23474,1888 23474,1955 23475,364 23476,718 23477,422 23478,525 23478,872 23478,1181 23478,1635 23478,1749 23478,1818 23479,422 23482,182 23483,422 23484,422 23485,615 23485,859 23486,1058 23488,250 23489,422 23490,649 23491,68 23492,2979 23493,1188 23495,5718 23497,422 23498,225 23499,1298 23500,79 23502,30 23502,104 23502,23502 23503,1983 23504,622 23504,6119 23505,4455 23506,72 23506,312 23507,32 23507,285 23507,392 23507,918 23507,1466 23508,248 23508,1332 23509,2353 23510,151 23511,422 23512,56 23513,310 23513,809 23513,6556 23514,66 23514,467 23514,868 23514,1433 23515,209 23515,861 23516,292 23517,192 23517,336 23517,493 23517,586 23517,663 23517,682 23517,852 23517,72439 23517,221324 23518,314 23519,1556 23520,222 23520,455 23520,467 23520,657 23520,2266 23521,292 23523,2506 23524,2506 23525,1070 23526,518 23526,1326 23527,781 23527,1653 23528,26 23528,59 23529,280 23529,306 23529,307 23529,557 23529,920 23529,973 23529,17245 23529,30331 23530,2506 23531,23532 23533,2506 23534,991 23535,647 23536,344 23537,71 23537,298 23537,417 23537,626 23537,749 23537,795 23537,811 23537,1070 23537,1133 23537,1285 23537,1474 23537,2590 23537,2889 23537,5405 23538,918 23539,805 23539,5405 23540,392 23541,19 23541,749 23543,589 23544,1068 23545,3 23545,932 23545,8788 23545,230509 23545,230517 23546,292 23547,83 23548,1977 23548,1978 23549,151 23550,83 23550,536 23550,4672 23550,18831 23551,298 23552,485 23553,389 23554,743 23556,1085 23557,23558 23559,6068 23563,671 23564,5405 23565,972 23565,973 23565,5547 23565,148742 23566,406 23567,1043 23568,1001 23569,346 23570,37 23570,611 23570,1449 23570,1782 23571,5405 23572,10 23573,389 23573,596 23575,3069 23576,818 23577,340 23577,668 23578,338 23578,1224 23579,4504 23581,1858 23582,1860 23583,392 23584,1224 23585,305 23586,17334 23587,527 23587,743 23587,23588 23589,5405 23591,2351 23592,392 23593,5405 23594,433 23595,10 23596,1033 23596,1789 23597,567 23597,1293 23598,72 23599,298 23600,485 23601,72 23602,264 23603,718 23604,5405 23604,189303 23605,72 23606,3474 23607,4453 23608,392 23608,697 23608,15609 23609,107 23609,111 23609,1149 23609,1462 23609,8537 23610,1085 23611,104 23611,557 23611,953 23611,954 23612,137 23612,1143 23612,1240 23612,1293 23612,1616 23612,2411 23612,2605 23612,3538 23612,75912 23613,5405 23614,2312 23615,1559 23616,65 23616,66 23616,302 23616,314 23616,467 23616,1284 23616,1433 23617,248 23619,2572 23620,302 23621,579 23622,4190 23623,215 23623,366 23623,8180 23624,250 23624,1684 23627,2334 23628,298 23629,485 23630,104 23630,557 23630,1939 23631,44 23632,163 23633,50 23633,79 23633,149 23633,337 23633,406 23633,422 23633,1181 23633,1385 23633,30365 23634,120 23634,261 23634,1240 23634,1309 23634,2436 23635,500 23636,1467 23637,1962 23638,1052 23639,1882 23640,2775 23641,54 23642,2210 23642,4237 23643,571 23643,827 23644,1313 23645,1433 23646,673 23647,1436 23648,931 23649,3967 23651,1220 23651,1222 23652,252 23653,251 23654,248 23654,557 23656,1836 23657,862 23658,406 23659,1 23660,3161 23661,907 23662,516 23662,994 23662,1181 23662,1243 23662,2867 23662,2868 23663,4220 23664,32 23664,626 23664,1653 23664,4771 23665,772 23666,818 23667,503 23667,1370 23667,1522 23667,2296 23667,9025 23668,140 23668,160 23668,515 23668,1052 23668,1224 23669,41 23669,50 23669,83 23669,87 23669,158 23669,195 23669,264 23669,269 23669,301 23669,309 23669,310 23669,333 23669,364 23669,433 23669,516 23669,595 23669,615 23669,622 23669,644 23669,702 23669,703 23669,720 23669,736 23669,760 23669,779 23669,862 23669,872 23669,877 23669,949 23669,1082 23669,1143 23669,1151 23669,1179 23669,1210 23669,1220 23669,1222 23669,1235 23669,1240 23669,1298 23669,1300 23669,1335 23669,1400 23669,1452 23669,1465 23669,1515 23669,1579 23669,1718 23669,1849 23669,1888 23669,1939 23669,1955 23669,2210 23669,4237 23669,6298 23669,13661 23669,32784 23669,55849 23669,145502 23669,182162 23670,5405 23672,827 23673,1298 23674,685 23675,1326 23676,5405 23677,1282 23678,626 23679,19986 23680,23011 23681,4411 23682,586 23683,120 23683,240 23684,626 23685,500 23686,1962 23687,1052 23688,1882 23689,2775 23690,54 23691,2210 23691,4237 23692,1 23692,160 23692,794 23692,1345 23692,1847 23693,211 23693,255 23693,720 23694,887 23695,1019 23696,872 23700,2779 23701,23701 23702,389 23703,21944 23704,1235 23704,1335 23705,313 23705,852 23706,1579 23707,126 23707,299 23708,146 23709,126 23709,299 23711,222 23711,949 23711,1881 23711,1955 23711,2266 23712,309 23712,310 23713,1227 23713,1229 23714,87 23715,104 23715,225 23715,364 23715,953 23715,1179 23715,1332 23715,1368 23715,5405 23716,206 23716,209 23716,302 23716,579 23717,247 23719,134 23720,1133 23721,1749 23722,779 23722,1425 23722,1515 23723,1285 23724,2353 23725,333 23726,907 23726,932 23728,968 23728,1740 23729,146 23729,2923 23730,1240 23732,272 23733,315 23734,252 23734,318 23734,1220 23734,1222 23734,41170 23735,1309 23736,1227 23736,1229 23736,2089 23736,2940 23736,21944 23736,86416 23737,483 23737,805 23737,1659 23737,1962 23737,6556 23737,136072 23738,41 23738,42 23739,34 23739,35 23740,178 23740,1434 23740,1566 23740,5356 23740,22455 23740,23741 23740,26730 23740,31224 23740,38392 23740,62319 23740,120043 23740,133554 23740,151093 23740,181637 23740,182403 23740,183312 23740,216044 23740,230394 23740,254933 23742,4 23742,5 23742,137 23742,151 23742,491 23742,1381 23743,452 23744,422 23745,104 23745,137 23745,215 23745,248 23745,636 23745,1016 23745,1282 23745,8993 23746,171 23746,424 23746,1639 23746,3295 23746,3296 23746,17886 23747,887 23747,994 23748,808 23749,147 23750,438 23751,420 23752,1572 23753,422 23754,314 23754,868 23755,200 23755,1319 23756,2274 23757,1836 23758,509 23759,111 23760,13745 23761,1590 23762,349 23763,32 23764,392 23765,779 23766,1240 23767,809 23768,1151 23770,26 23770,59 23770,430 23770,1235 23770,1335 23771,192 23771,366 23772,1663 23773,1634 23773,1655 23774,717 23775,146 23775,92476 23775,106502 23776,557 23777,83 23777,1962 23779,346 23780,1579 23780,1749 23781,718 23782,315 23783,1 23783,55 23783,56 23783,79 23783,99 23783,146 23783,147 23783,192 23783,333 23783,336 23783,422 23783,425 23783,446 23783,602 23783,841 23783,1089 23783,1181 23783,1218 23783,1623 23783,1825 23783,1969 23783,2244 23783,2374 23783,3970 23783,5800 23783,6119 23783,7456 23783,14091 23783,17151 23783,20360 23783,22616 23783,23783 23783,24150 23783,24701 23783,30331 23783,30498 23783,44872 23783,44876 23783,60576 23783,62290 23783,62291 23783,62294 23783,62326 23783,62423 23783,63450 23783,71266 23783,75155 23783,82104 23783,82354 23783,93070 23783,93593 23783,96761 23783,96765 23783,96862 23783,96934 23783,102465 23783,103154 23783,103157 23783,103160 23783,103221 23783,106385 23783,106387 23783,114969 23783,115341 23783,124045 23783,145072 23783,148058 23783,148104 23783,153001 23783,155085 23783,157110 23783,175985 23783,177568 23783,191378 23783,198548 23783,204124 23783,208029 23783,213779 23783,223821 23783,224108 23783,237278 23783,257795 23785,23786 23785,47350 23785,52005 23785,54814 23785,61041 23785,78212 23785,81175 23785,85148 23785,98505 23785,98682 23785,104231 23785,105092 23785,111807 23787,1590 23787,1644 23788,1381 23789,42 23790,30 23790,328 23791,493 23792,1151 23792,1711 23792,1836 23793,2436 23794,861 23795,2671 23796,217 23797,83 23798,206 23799,225 23799,301 23799,615 23799,968 23799,1782 23799,5961 23800,509 23800,510 23801,462 23802,907 23802,932 23803,4 23803,5 23803,11 23803,20 23803,115 23803,118 23803,160 23803,611 23804,5405 23805,1140 23806,703 23806,1740 23807,1127 23807,1893 23808,104 23809,315 23809,980 23809,2006 23811,42 23811,23811 23812,5547 23813,1571 23814,23815 23816,406 23816,779 23817,107 23818,44 23819,366 23820,104 23820,202 23820,203 23820,1181 23820,1955 23821,3507 23822,72 23822,111 23822,312 23822,1052 23822,3695 23823,5405 23824,657 23825,1836 23826,772 23827,5405 23828,1119 23828,1462 23828,8537 23829,23830 23831,267 23832,107 23832,111 23832,4771 23833,298 23834,485 23835,58 23835,104 23835,442 23835,609 23835,749 23835,801 23835,1140 23835,1147 23835,1449 23835,1882 23835,2163 23835,2181 23835,2334 23835,2443 23835,3473 23835,3474 23835,4049 23835,5547 23835,6569 23835,7182 23835,13538 23835,20787 23835,26244 23835,26936 23835,34163 23835,36721 23835,36999 23835,46245 23835,59742 23835,65689 23835,74489 23835,77709 23835,80147 23835,81991 23835,83874 23835,88417 23835,88449 23835,113930 23836,2334 23837,5405 23838,151 23839,222 23839,385 23839,536 23840,2353 23841,515 23841,652 23842,23843 23842,108670 23842,132760 23845,356 23845,615 23845,852 23845,1167 23846,23847 23848,301 23848,444 23848,968 23849,602 23850,68 23850,186 23850,193129 23851,503 23851,704 23852,298 23853,485 23854,779 23854,1776 23854,68069 23856,406 23859,2944 23860,1983 23861,733 23861,920 23861,1619 23861,1623 23861,1927 23862,8990 23863,596 23863,615 23863,1429 23864,298 23865,485 23866,83 23867,1181 23868,1179 23869,146 23870,1133 23872,2867 23872,2868 23873,107 23873,749 23873,1146 23874,718 23875,452 23875,457 23875,497 23875,535 23875,1655 23876,422 23891,23783 23899,392 23908,147 23908,406 23908,779 23910,4193 23910,8907 23911,779 23911,4193 23912,4193 23912,21442 23915,953 23926,406 23926,779 23926,1181 23927,1 23927,147 23927,406 23931,1515 23937,158 23941,147 23941,158 23941,285 23941,406 23941,779 23941,1515 23941,4193 23941,21442 23943,779 23944,21944 23948,779 23948,1515 23954,147 23954,779 23954,68069 23963,247 23967,4193 23970,1515 23972,65 23987,192 23991,158 23991,192 23991,285 23991,406 23991,779 23991,1515 23991,4193 23999,158 23999,333 24021,285 24021,779 24021,1515 24021,16341 24021,24021 24021,24055 24021,24172 24021,130532 24021,243656 24021,243935 24021,243972 24021,244083 24021,245290 24021,245875 24021,245902 24021,246160 24021,249833 24021,250372 24021,250927 24021,251282 24021,251781 24034,718 24036,1551 24045,147 24045,158 24045,779 24045,1181 24045,1515 24045,68069 24056,147 24056,779 24056,1515 24060,206 24065,158 24066,79 24066,149 24066,275 24066,622 24066,1623 24073,147 24073,158 24074,1181 24084,4193 24089,58 24090,21442 24095,779 24106,149 24107,907 24107,1284 24107,2191 24107,148742 24110,83 24110,24111 24110,68078 24113,1515 24113,68069 24128,26 24128,59 24128,430 24128,887 24128,1235 24128,1335 24128,21944 24129,158 24131,779 24131,1425 24136,4192 24136,4193 24137,1 24148,1515 24156,920 24161,158 24161,406 24161,779 24161,1181 24161,1515 24162,333 24164,149 24164,158 24164,406 24164,779 24164,1370 24164,1515 24166,620 24166,779 24168,1181 24170,158 24170,285 24170,406 24170,779 24170,1181 24170,1515 24172,158 24172,1515 24172,4193 24173,158 24173,406 24173,663 24173,664 24173,779 24173,1181 24173,1515 24174,147 24174,158 24174,80266 24176,147 24176,158 24176,1181 24180,5405 24182,195 24182,406 24182,779 24183,779 24184,779 24184,4193 24184,145222 24185,779 24185,1515 24186,158 24186,4193 24187,406 24187,779 24187,1515 24191,147 24191,158 24191,406 24191,779 24191,1181 24191,1515 24198,1 24198,195 24198,406 24198,779 24198,1515 24202,779 24203,779 24206,147 24208,278 24208,406 24211,285 24211,779 24217,32 24217,44 24217,106 24217,215 24217,240 24217,251 24217,252 24217,254 24217,272 24217,289 24217,290 24217,301 24217,323 24217,332 24217,336 24217,337 24217,392 24217,393 24217,430 24217,493 24217,525 24217,592 24217,615 24217,671 24217,788 24217,907 24217,925 24217,968 24217,1001 24217,1010 24217,1016 24217,1033 24217,1231 24217,1235 24217,1282 24217,1335 24217,1388 24217,1425 24217,1531 24217,1722 24217,1732 24217,1782 24217,1955 24217,1963 24217,2210 24217,2379 24217,2567 24217,2620 24217,3085 24217,3115 24217,3148 24217,3317 24217,3321 24217,3804 24217,4237 24217,4455 24217,6803 24217,9007 24220,158 24220,406 24220,779 24220,1181 24220,1515 24221,158 24222,192 24228,4193 24229,779 24230,147 24230,158 24233,406 24234,278 24235,779 24236,217 24236,536 24236,2797 24237,251 24237,465 24237,516 24237,1512 24237,5992 24239,626 24240,3193 24241,376 24242,682 24242,72439 24243,104 24243,134 24243,135 24245,2351 24246,920 24247,7614 24248,752 24248,17263 24249,8270 24250,3872 24251,135 24252,4193 24253,1453 24256,24257 24258,158 24259,8788 24260,14989 24261,202 24261,203 24262,779 24263,72 24264,248 24265,1882 24266,13980 24267,24268 24269,647 24270,450 24271,344 24272,182 24273,217 24274,34 24274,35 24274,634 24274,2224 24274,2319 24274,115474 24275,182 24276,1181 24277,83 24278,188 24279,188 24281,247 24282,687 24283,596 24283,843 24283,918 24283,1531 24284,72 24285,6263 24286,481 24288,431 24288,784 24289,261 24290,240 24291,24292 24293,275 24294,7 24295,24296 24297,1181 24298,217 24299,83 24300,250 24301,515 24302,247 24303,1962 24304,278 24305,65 24306,723 24307,240 24307,3328 24307,24307 24307,43436 24307,43438 24307,43442 24308,240 24309,22 24310,17228 24311,875 24312,557 24313,557 24314,24315 24316,9121 24317,2266 24318,2590 24319,146 24319,3538 24320,2178 24320,4545 24321,77 24322,3079 24323,1 24324,86 24325,130 24325,36819 24326,58 24327,255 24328,388 24329,875 24330,640 24331,24332 24332,24332 24333,3193 24334,2557 24335,3999 24336,30 24337,146 24338,605 24339,1 24340,278 24341,200 24341,1177 24341,2210 24341,4237 24341,182162 24342,3507 24343,143 24344,72 24345,344 24346,285 24347,3 24347,81 24347,240 24347,289 24347,290 24347,592 24347,704 24347,714 24347,1007 24347,1010 24347,1210 24347,1231 24347,1326 24347,1411 24347,1436 24347,1564 24347,1715 24347,1818 24347,1849 24347,1955 24347,2045 24347,2083 24347,3193 24347,3507 24347,3804 24348,707 24348,931 24348,2668 24348,2779 24349,72 24350,87 24350,1454 24351,647 24352,44 24353,146 24354,356 24354,852 24355,1227 24355,1229 24355,21944 24356,58 24356,1140 24357,2923 24358,178 24358,211 24358,1891 24359,595 24359,818 24359,985 24359,1313 24359,3252 24359,81648 24360,119 24360,120 24360,217 24360,850 24360,19519 24361,406 24362,323 24363,1265 24363,1266 24364,1167 24365,873 24365,1210 24366,5405 24367,10 24368,24369 24370,3260 24371,1893 24372,192 24373,24374 24375,259 24376,24377 24376,56768 24376,57474 24378,2506 24379,2506 24380,2506 24381,2506 24382,2506 24383,63 24384,149 24385,1085 24386,83 24387,24388 24387,43049 24387,71144 24390,72 24391,72 24392,143 24393,24394 24393,26556 24393,51073 24393,58546 24393,130830 24393,131414 24393,151771 24393,199470 24393,215043 24393,215767 24395,671 24396,250 24397,634 24398,202 24398,203 24398,2931 24398,3872 24399,515 24400,376 24401,885 24402,920 24403,954 24403,10318 24404,83 24405,192 24405,393 24405,779 24405,6119 24406,2995 24407,15573 24408,1 24409,7416 24410,1133 24411,247 24412,9195 24413,4101 24414,7 24415,7652 24416,202 24416,203 24416,925 24417,24418 24419,24420 24421,333 24422,5547 24422,24423 24422,37288 24422,47932 24422,68069 24424,72 24425,707 24426,2590 24427,3960 24428,920 24429,422 24430,56 24431,71 24431,811 24431,1070 24431,1113 24431,1368 24431,1634 24431,1881 24431,3724 24431,28107 24431,142879 24432,147 24433,8788 24434,2351 24435,579 24436,640 24437,682 24438,24439 24440,273 24440,274 24441,24442 24443,801 24444,140 24445,175 24446,801 24447,1238 24447,1663 24448,3148 24449,7360 24450,1001 24451,222 24452,298 24452,615 24452,652 24452,859 24452,1127 24452,1287 24452,2719 24452,3148 24452,5405 24452,6323 24452,28755 24453,261 24454,640 24455,94 24455,219 24455,712 24455,1515 24455,2787 24455,2923 24455,9457 24456,2681 24457,211 24458,24459 24458,27839 24458,37536 24458,45898 24458,58723 24458,96750 24458,100115 24458,104239 24458,107837 24460,116 24460,994 24460,2087 24460,2590 24461,497 24461,1655 24461,4165 24462,24463 24462,35228 24462,53049 24462,53454 24462,54093 24462,78276 24462,80678 24462,83586 24462,95063 24464,702 24464,703 24465,2135 24466,1 24466,149 24466,2924 24467,24468 24470,1433 24471,6263 24472,233 24473,1844 24474,1151 24474,1711 24474,1836 24475,24476 24477,652 24478,1381 24479,21944 24480,7124 24481,171 24482,24483 24484,9011 24484,9032 24485,79 24486,366 24487,255 24488,733 24488,920 24488,1619 24489,781 24490,2506 24492,4611 24493,1544 24494,6179 24494,6180 24495,7572 24496,1556 24497,9029 24498,24499 24498,82393 24500,292 24500,441 24500,1722 24500,3830 24501,872 24502,298 24503,485 24504,24505 24506,932 24507,346 24507,2116 24508,1241 24509,272 24512,3451 24512,3452 24513,163 24514,4193 24515,1359 24516,4611 24517,1544 24518,644 24519,24520 24521,137 24522,1414 24523,160 24523,264 24523,360 24523,515 24523,718 24523,783 24523,1052 24523,1127 24523,1147 24523,1298 24523,1509 24523,1572 24523,1688 24523,1749 24523,1882 24523,2626 24523,2697 24523,81070 24523,191860 24524,10 24525,302 24526,209 24527,283 24527,544 24527,589 24528,620 24529,58 24530,46 24532,349 24533,577 24534,79 24535,26 24535,59 24535,106 24535,134 24535,137 24535,264 24535,285 24535,703 24535,972 24535,1511 24535,3069 24535,4355 24535,5405 24535,141912 24536,595 24537,595 24538,611 24539,1414 24539,6119 24541,4903 24542,1392 24543,1417 24545,146 24547,163 24547,209 24547,302 24547,579 24547,861 24547,893 24547,1556 24547,3653 24548,366 24549,366 24550,366 24552,366 24553,366 24554,366 24555,366 24556,306 24556,307 24557,1147 24558,1019 24558,1276 24559,207 24560,743 24560,23588 24561,1402 24562,972 24562,75912 24563,50 24563,79 24563,147 24563,158 24564,349 24564,3260 24565,192 24565,217 24565,259 24565,272 24565,333 24565,389 24565,406 24565,435 24565,516 24565,788 24565,818 24565,920 24565,1010 24565,1181 24565,1370 24565,1388 24565,1531 24565,1659 24565,2266 24566,106 24567,1010 24568,182 24569,422 24570,56 24571,875 24572,602 24572,3218 24573,1644 24574,718 24574,893 24575,65 24576,54 24576,676 24576,1556 24576,2105 24577,640 24578,640 24579,347 24579,762 24579,1479 24579,1837 24580,1011 24580,1849 24581,2787 24582,94 24583,356 24583,852 24583,5591 24584,72 24585,949 24585,1012 24585,2253 24586,24587 24586,35260 24586,38369 24586,39331 24586,43732 24586,43848 24586,45143 24586,57977 24588,1298 24589,30 24589,72 24589,184 24589,202 24589,233 24589,1381 24589,8373 24590,718 24590,760 24591,7 24592,1860 24592,6955 24593,1849 24594,652 24595,920 24596,366 24597,5591 24598,1102 24599,79 24600,71 24600,251 24600,304 24600,417 24600,489 24600,557 24600,749 24600,852 24600,1309 24601,682 24602,349 24602,392 24602,1769 24604,302 24604,2116 24605,818 24606,875 24607,65 24607,149 24607,467 24608,805 24609,9195 24610,68 24610,387 24611,772 24612,567 24613,631 24613,760 24613,1462 24613,8537 24615,567 24616,3367 24617,1151 24618,137 24618,431 24618,557 24618,5405 24619,200 24619,298 24619,1177 24619,48505 24620,671 24621,652 24622,5405 24623,63 24624,850 24625,87 24625,1836 24627,167 24627,301 24627,968 24627,1522 24627,2083 24627,73570 24628,83 24628,222 24628,5343 24628,13980 24630,2089 24630,2940 24630,21944 24631,827 24633,698 24634,497 24635,138 24637,422 24638,422 24639,422 24640,422 24641,455 24641,1454 24642,389 24643,422 24644,760 24645,422 24647,3413 24648,195 24648,779 24649,195 24649,1188 24650,344 24650,577 24651,58 24652,46 24653,34 24653,1417 24653,1571 24653,1718 24653,4594 24653,6888 24653,13980 24654,97 24654,273 24654,274 24654,346 24654,1012 24654,3538 24655,163 24656,1014 24657,302 24658,309 24658,310 24659,106 24659,346 24659,447 24659,1294 24659,3718 24659,4449 24659,5204 24659,5728 24659,8170 24659,15355 24659,24659 24659,29578 24659,96718 24659,139522 24659,158289 24659,175344 24659,178163 24659,189128 24659,189130 24659,189854 24659,189879 24659,190492 24659,193101 24659,193596 24659,194904 24659,194988 24659,212914 24659,213989 24659,215224 24659,215511 24659,215937 24659,216164 24659,216737 24659,217592 24659,222036 24659,222446 24659,226447 24659,226558 24659,227030 24659,229040 24659,229869 24659,230417 24659,230916 24659,235806 24659,235809 24659,235816 24659,245834 24659,248671 24659,248674 24659,251288 24659,251886 24659,253174 24659,254836 24659,254849 24659,255006 24659,255565 24659,260363 24660,24661 24662,10 24663,1298 24664,439 24666,163 24666,326 24666,1805 24667,893 24670,302 24671,117 24671,330 24671,1240 24671,1465 24671,2712 24671,2782 24671,4549 24671,4594 24671,8854 24672,222 24672,760 24673,1140 24674,861 24677,2867 24677,2868 24679,697 24680,19010 24681,875 24682,467 24682,872 24683,843 24685,843 24686,510 24688,34 24688,35 24688,77 24688,83 24688,111 24688,217 24688,222 24688,261 24688,283 24688,313 24688,323 24688,349 24688,379 24688,388 24688,392 24688,455 24688,493 24688,536 24688,577 24688,623 24688,694 24688,859 24688,862 24688,949 24688,1072 24688,1201 24688,1240 24688,1274 24688,1454 24688,1465 24688,1467 24688,1564 24688,1590 24688,1608 24688,1644 24688,1722 24688,1927 24688,2266 24688,2274 24688,2671 24688,2699 24688,2784 24688,2931 24688,2979 24688,2989 24688,2991 24688,3135 24688,3182 24688,3252 24688,3538 24688,4549 24688,4594 24688,4637 24688,6638 24688,7092 24688,13546 24688,14126 24688,29475 24690,1370 24690,2775 24691,192 24692,392 24693,850 24694,2506 24695,192 24695,477 24695,4548 24696,222 24697,1506 24699,24700 24702,850 24703,2373 24704,3 24704,34 24704,35 24704,37 24704,54 24704,63 24704,68 24704,72 24704,81 24704,86 24704,104 24704,111 24704,120 24704,136 24704,140 24704,158 24704,178 24704,192 24704,215 24704,217 24704,222 24704,227 24704,233 24704,240 24704,248 24704,283 24704,294 24704,296 24704,301 24704,304 24704,312 24704,315 24704,328 24704,333 24704,346 24704,349 24704,358 24704,383 24704,388 24704,389 24704,390 24704,392 24704,417 24704,439 24704,444 24704,455 24704,509 24704,510 24704,515 24704,518 24704,525 24704,586 24704,589 24704,592 24704,595 24704,605 24704,622 24704,626 24704,671 24704,687 24704,697 24704,704 24704,714 24704,717 24704,718 24704,720 24704,752 24704,801 24704,850 24704,862 24704,873 24704,875 24704,907 24704,919 24704,932 24704,934 24704,968 24704,973 24704,1001 24704,1010 24704,1016 24704,1052 24704,1072 24704,1085 24704,1102 24704,1122 24704,1133 24704,1140 24704,1151 24704,1167 24704,1175 24704,1177 24704,1179 24704,1201 24704,1210 24704,1231 24704,1240 24704,1265 24704,1266 24704,1274 24704,1282 24704,1289 24704,1298 24704,1332 24704,1353 24704,1368 24704,1381 24704,1429 24704,1436 24704,1465 24704,1467 24704,1522 24704,1544 24704,1551 24704,1564 24704,1572 24704,1579 24704,1590 24704,1634 24704,1644 24704,1715 24704,1722 24704,1745 24704,1767 24704,1782 24704,1801 24704,1837 24704,1849 24704,1871 24704,1881 24704,1882 24704,1893 24704,1939 24704,1955 24704,1977 24704,1978 24704,2045 24704,2083 24704,2191 24704,2224 24704,2266 24704,2421 24704,2424 24704,2434 24704,2443 24704,2557 24704,2620 24704,2646 24704,2701 24704,2784 24704,2989 24704,2991 24704,3138 24704,3193 24704,3194 24704,3207 24704,3218 24704,3422 24704,3474 24704,3507 24704,3538 24704,3695 24704,3999 24704,4453 24704,4549 24704,4594 24704,4637 24704,4771 24704,5405 24704,5440 24704,5662 24704,5718 24704,5906 24704,5987 24704,6068 24704,6298 24704,6955 24704,7270 24704,7572 24704,8798 24704,9001 24704,9029 24704,9098 24704,14483 24704,14797 24704,24763 24704,35486 24705,4980 24706,79 24707,673 24707,1172 24707,2373 24707,5212 24708,298 24709,485 24710,298 24711,485 24712,1298 24713,1673 24715,1551 24715,3041 24716,58 24717,4549 24718,1983 24719,920 24719,1849 24719,32784 24720,500 24721,163 24722,1179 24722,1305 24723,493 24724,710 24725,1181 24725,2528 24726,4611 24727,1544 24728,1130 24729,81 24730,1070 24731,1240 24733,292 24733,1449 24733,37414 24735,1805 24736,2995 24737,9560 24738,379 24739,104 24739,254 24739,557 24739,953 24739,954 24739,1939 24740,515 24740,4831 24740,142426 24741,192 24741,663 24741,664 24742,2782 24743,868 24744,459 24745,65 24746,1983 24750,907 24750,932 24751,577 24751,1429 24751,1608 24752,182 24753,760 24754,21944 24755,379 24755,2784 24756,192 24757,273 24757,274 24757,360 24757,372 24757,710 24757,818 24757,1118 24758,949 24760,107 24760,483 24761,467 24761,710 24761,2496 24762,46 24762,58 24762,130 24762,160 24762,259 24762,302 24762,459 24762,483 24762,535 24762,1052 24762,1113 24762,1127 24762,1313 24762,1805 24762,2923 24762,3474 24762,6059 24762,17897 24762,19413 24762,217854 24763,499 24763,45436 24764,15 24764,2292 24764,2889 24765,1977 24765,1978 24766,1203 24766,1955 24767,298 24768,485 24769,743 24770,79 24770,240 24770,516 24771,1010 24772,5405 24773,636 24773,772 24775,586 24776,717 24777,302 24777,2116 24778,50 24779,2173 24780,44 24781,134 24781,344 24781,557 24781,636 24781,1844 24782,1436 24783,192 24784,195 24785,302 24786,389 24787,1210 24788,450 24789,200 24789,772 24790,287 24790,595 24790,809 24791,134 24791,636 24791,1844 24792,403 24792,1127 24792,2460 24793,7 24794,920 24794,2319 24796,392 24797,5540 24798,298 24799,485 24800,2668 24801,623 24801,1240 24801,1590 24801,1644 24801,1805 24802,567 24804,1400 24805,10 24806,79 24807,588 24807,590 24807,8180 24808,1619 24809,8072 24809,8332 24810,302 24810,973 24810,1188 24810,6303 24812,615 24812,1265 24812,1266 24812,31934 24813,21944 24814,1309 24815,167 24815,240 24815,818 24816,1858 24817,1326 24817,4411 24818,21944 24819,1188 24819,2292 24820,356 24820,1381 24821,338 24821,1127 24821,1722 24821,1893 24822,911 24823,5405 24824,217 24826,30 24826,328 24826,4355 24827,163 24827,192 24828,1309 24829,163 24830,298 24831,485 24832,336 24832,1163 24832,8055 24833,292 24834,107 24835,50 24835,285 24835,779 24835,1425 24835,1515 24835,68069 24835,118336 24835,141912 24835,180487 24837,50 24837,726 24837,859 24837,4177 24838,1011 24839,372 24839,390 24839,588 24839,590 24839,631 24839,714 24839,1309 24839,1631 24839,1635 24839,2812 24840,248 24840,450 24840,1332 24840,5405 24841,673 24841,868 24842,41 24842,1608 24844,1179 24845,119 24845,358 24845,30331 24845,255911 24846,58 24847,457 24848,79 24849,83 24851,240 24851,372 24851,1001 24851,1479 24852,723 24853,595 24855,272 24856,143 24857,1836 24858,509 24859,1590 24860,349 24861,2274 24862,5987 24863,111 24864,13745 24865,32 24866,392 24867,779 24868,697 24869,8798 24870,809 24871,1240 24872,3260 24873,1836 24874,287 24876,261 24876,493 24876,1927 24877,222 24877,278 24877,467 24878,178 24878,302 24878,579 24878,1220 24878,1222 24879,302 24879,579 24879,861 24879,2116 24880,302 24881,192 24882,1359 24883,171 24884,158 24885,83 24885,536 24885,4672 24885,7092 24885,18831 24886,364 24886,442 24886,749 24886,2315 24887,588 24887,590 24887,784 24887,2775 24888,302 24889,313 24889,707 24889,2421 24890,7614 24891,298 24892,485 24893,827 24894,79 24895,349 24895,779 24896,240 24896,1818 24897,1235 24897,1335 24898,1188 24899,1551 24899,3041 24900,192 24901,264 24902,1001 24903,151 24903,663 24903,664 24904,298 24905,485 24906,364 24906,805 24906,1068 24906,2590 24906,4220 24906,7194 24907,217 24907,536 24908,483 24909,1659 24910,364 24910,583 24910,609 24910,1707 24910,2775 24911,644 24912,1893 24912,2051 24913,247 24914,795 24914,6789 24915,1151 24917,222 24917,2266 24918,2210 24918,4237 24919,206 24920,178 24920,252 24920,387 24920,2931 24920,24921 24920,25244 24920,39286 24920,39903 24920,42287 24920,43121 24920,44625 24920,45130 24920,45254 24920,46641 24920,47334 24920,47516 24920,47545 24920,51549 24920,51650 24920,53016 24920,53422 24920,53644 24920,57454 24920,60403 24920,67083 24920,68935 24920,77045 24920,77636 24920,79689 24920,80076 24920,80586 24920,80854 24920,82246 24920,82249 24920,83080 24920,83914 24920,83948 24920,83964 24920,84191 24920,84319 24920,85271 24920,85321 24920,85587 24920,86119 24920,86356 24920,86837 24920,86843 24920,95775 24920,97047 24920,97711 24920,100440 24920,100702 24920,101207 24920,103629 24920,103644 24920,104235 24920,104673 24920,105355 24920,105973 24920,106063 24920,106128 24920,107190 24920,108136 24920,108967 24920,109777 24920,110230 24920,111109 24920,112750 24920,112813 24920,112843 24920,122862 24920,151820 24920,184605 24920,193282 24920,217050 24920,220926 24920,225892 24920,242083 24920,242837 24920,258358 24922,207 24922,358 24922,366 24922,1052 24922,1253 24922,1319 24922,1571 24922,2424 24922,2868 24923,1140 24924,518 24924,1010 24924,1326 24924,1849 24924,2557 24924,32784 24924,171641 24925,3039 24927,1849 24928,1893 24929,301 24930,1837 24931,973 24932,1085 24933,252 24934,54 24934,140 24934,202 24934,203 24934,272 24934,287 24934,337 24934,467 24934,516 24934,577 24934,671 24934,838 24934,872 24934,1052 24934,1167 24934,1179 24934,1294 24934,1381 24934,1454 24934,1531 24934,1796 24934,2775 24934,3115 24935,147 24935,149 24935,158 24935,406 24935,2244 24936,2048 24937,393 24938,1143 24939,8798 24940,1849 24941,1955 24942,417 24943,1564 24944,622 24945,1590 24946,1837 24947,346 24948,439 24949,1010 24950,714 24951,4475 24952,784 24953,163 24955,422 24956,1 24957,56 24958,24959 24960,305 24961,1285 24962,1010 24963,356 24963,968 24964,147 24964,158 24964,406 24965,500 24965,718 24966,1175 24967,134 24967,135 24967,372 24967,588 24967,590 24967,631 24967,932 24967,1082 24967,1635 24967,2812 24968,1531 24969,302 24970,6837 24971,83 24971,167 24971,206 24971,406 24971,694 24971,1274 24971,2553 24971,6789 24971,127158 24972,784 24972,2775 24973,1847 24974,4678 24975,452 24975,457 24975,497 24975,535 24975,676 24975,1655 24976,3 24977,151 24978,2979 24979,184 24980,1983 24981,1146 24982,3724 24983,63 24984,302 24984,687 24984,1556 24985,143 24986,273 24986,274 24987,248 24987,1332 24988,809 24989,68 24989,4220 24990,717 24991,1983 24992,1623 24993,83 24993,315 24993,337 24993,795 24993,1117 24993,4903 24994,1127 24994,5440 24995,1572 24996,631 24996,1119 24996,2995 24997,86 24997,167 24997,240 24997,372 24997,567 24997,589 24997,605 24997,615 24997,631 24997,720 24997,801 24997,907 24997,968 24997,972 24997,973 24997,1010 24997,1122 24997,1124 24997,1140 24997,1167 24997,1231 24997,1241 24997,1284 24997,1298 24997,1309 24997,1436 24997,1522 24997,1564 24997,1782 24997,1785 24997,1818 24997,1893 24997,1955 24997,2083 24997,2191 24997,2372 24997,2557 24997,2620 24997,2979 24997,3193 24997,3207 24997,3218 24998,862 24999,620 25000,25001 25002,1151 25003,175 25004,4771 25006,697 25007,920 25007,1619 25007,2867 25007,2868 25007,193129 25008,209 25009,1888 25010,376 25011,1381 25012,704 25013,885 25014,34 25014,35 25015,503 25015,557 25016,450 25017,83 25018,376 25019,206 25019,718 25020,25021 25022,609 25022,622 25022,873 25022,1046 25023,278 25024,72 25025,344 25026,285 25027,399 25027,422 25027,5405 25028,34 25028,35 25029,592 25030,450 25031,602 25032,535 25033,393 25034,83 25035,278 25037,3069 25038,1033 25039,217 25040,163 25041,200 25042,589 25044,247 25045,704 25046,1608 25046,13137 25047,690 25048,1119 25048,1462 25048,7194 25048,8537 25049,704 25050,2135 25051,6068 25052,358 25053,310 25053,3039 25054,72 25054,104 25055,2411 25056,1608 25057,4903 25058,17334 25059,2351 25060,784 25061,302 25062,301 25062,1293 25062,1782 25063,302 25064,2979 25065,704 25066,704 25067,195 25067,1789 25067,1849 25068,1019 25069,54 25069,222 25069,657 25069,694 25069,1019 25069,2266 25070,273 25070,274 25071,4453 25072,202 25072,203 25073,184 25073,206 25073,2244 25073,8180 25073,21826 25075,171 25077,247 25078,3804 25079,557 25080,25081 25082,557 25083,1033 25084,3252 25085,1179 25086,94 25086,885 25086,2787 25087,30 25087,328 25087,1179 25087,1305 25087,2146 25087,2701 25087,7124 25088,192 25088,422 25089,1313 25090,13 25091,10 25092,298 25093,485 25094,3555 25094,6180 25094,6369 25094,21944 25094,92295 25095,9323 25096,1240 25097,1837 25098,1634 25099,13745 25100,1590 25101,349 25102,278 25102,1241 25102,1479 25102,2205 25102,2206 25102,2296 25102,33424 25103,3161 25104,305 25105,907 25106,818 25107,289 25107,290 25108,305 25108,929 25109,23011 25110,269 25111,1370 25112,1821 25113,4895 25114,433 25115,72 25116,25117 25118,19986 25119,3474 25120,47 25120,2469 25120,4748 25120,5881 25120,21944 25121,809 25122,3161 25123,310 25124,309 25124,310 25125,779 25126,77 25127,5375 25128,65 25129,66 25129,158 25129,178 25129,252 25129,314 25129,388 25129,406 25129,626 25129,843 25129,868 25129,1033 25129,1220 25129,1222 25129,1411 25129,1433 25129,1782 25129,1801 25130,1085 25130,1140 25130,1749 25130,2620 25131,10 25132,302 25133,6682 25134,261 25135,187 25136,868 25137,267 25138,104 25138,134 25138,137 25138,2105 25139,269 25140,861 25141,801 25141,1140 25141,5547 25142,2506 25143,1858 25144,1860 25145,450 25146,450 25147,160 25147,306 25147,307 25148,25149 25150,5469 25151,3999 25152,309 25152,310 25153,1381 25154,1381 25155,433 25156,827 25157,872 25158,347 25159,1983 25160,302 25160,579 25160,809 25160,1240 25160,1381 25160,1556 25160,2617 25160,2626 25161,3413 25162,25163 25164,255 25166,313 25167,7416 25168,22 25168,72 25169,37 25169,301 25169,717 25169,1231 25169,1782 25170,138 25170,1227 25170,1229 25171,2557 25172,313 25173,1837 25174,2775 25175,447 25176,589 25177,25178 25179,366 25179,500 25180,2681 25180,31977 25181,536 25182,6068 25183,184 25184,269 25185,202 25185,203 25186,175 25187,818 25188,1188 25188,32475 25189,17334 25190,346 25191,2351 25192,538 25193,25194 25195,25196 25197,718 25198,671 25199,1836 25200,8992 25201,585 25202,1 25203,1836 25204,1313 25205,333 25206,1149 25207,1133 25207,1411 25208,801 25209,5366 25210,275 25211,911 25212,1274 25212,2797 25213,2506 25214,907 25215,818 25216,23011 25217,717 25218,19986 25219,17772 25220,309 25220,310 25221,25222 25223,254 25224,126 25224,452 25224,457 25224,497 25224,535 25224,676 25224,843 25224,1011 25224,1655 25224,4165 25225,272 25226,346 25227,25228 25227,51288 25229,248 25229,1332 25230,640 25231,25232 25233,694 25233,1001 25234,366 25235,366 25236,366 25237,366 25238,366 25239,25240 25241,932 25242,20 25243,481 25243,567 25243,5540 25245,81 25246,25247 25246,93949 25248,8373 25249,467 25249,1659 25250,65 25251,4344 25252,207 25253,233 25254,415 25256,1058 25257,86 25258,106 25258,586 25258,17772 25259,779 25259,1515 25259,4192 25259,4193 25260,292 25261,195 25262,1001 25263,255 25264,25265 25266,1381 25267,25268 25269,2051 25270,4504 25271,911 25272,694 25272,1001 25272,1011 25272,14556 25272,115474 25272,148742 25273,444 25273,567 25273,1160 25273,1293 25273,1300 25276,298 25277,485 25278,313 25279,346 25280,206 25281,3451 25281,3452 25282,481 25282,567 25282,581 25282,911 25282,243297 25283,500 25284,48 25285,485 25286,1616 25287,25288 25289,644 25290,136 25291,25292 25293,784 25294,136 25294,137 25295,749 25295,1146 25296,4903 25297,589 25297,1001 25298,2191 25299,25300 25301,8270 25302,333 25302,393 25302,615 25302,660 25302,2782 25303,298 25304,485 25305,202 25305,723 25306,885 25306,1212 25307,431 25308,1313 25309,106 25310,2590 25311,634 25312,298 25313,485 25314,298 25315,485 25316,298 25317,485 25318,255 25319,8788 25320,626 25321,1179 25321,2701 25322,298 25323,485 25324,306 25324,307 25325,298 25326,485 25327,392 25328,805 25329,136 25329,167 25329,202 25329,203 25329,252 25329,422 25329,602 25329,1001 25329,1381 25330,298 25331,485 25333,163 25333,489 25334,149 25335,1 25336,652 25337,518 25338,79 25338,557 25338,636 25339,2205 25339,2206 25339,33424 25340,298 25341,485 25342,301 25342,604 25342,968 25342,3422 25342,5662 25343,25344 25345,178 25345,1333 25345,2854 25345,25346 25345,33325 25347,2512 25348,10 25348,147 25348,149 25348,195 25348,206 25348,991 25348,1149 25348,1608 25348,2244 25348,4060 25348,25348 25348,80266 25348,101688 25349,182 25350,907 25350,1117 25350,1284 25351,1433 25352,298 25353,485 25354,875 25355,188 25356,332 25357,298 25358,485 25359,206 25361,298 25362,485 25363,217 25363,2266 25364,298 25365,485 25366,631 25367,366 25368,355 25368,991 25369,7 25370,79 25370,192 25371,178 25371,1891 25372,143 25372,2006 25373,2353 25374,2173 25375,143 25376,2116 25377,247 25378,87 25378,872 25378,1267 25378,1453 25379,1858 25380,1860 25382,283 25383,2073 25384,611 25384,934 25384,1070 25384,1612 25385,41 25385,104 25385,285 25385,1119 25385,1659 25385,2205 25385,33424 25385,75912 25385,111142 25385,185877 25386,326 25387,149 25388,505 25388,1559 25389,1323 25390,102 25391,1326 25392,408 25394,7 25394,596 25395,392 25395,433 25395,440 25395,467 25395,868 25395,1085 25395,1284 25395,1345 25395,6424 25395,28107 25395,48505 25395,162599 25396,24332 25397,326 25398,34 25398,35 25398,278 25398,392 25398,433 25398,623 25399,852 25400,850 25401,611 25401,801 25401,934 25401,1070 25401,1449 25401,1782 25402,425 25402,4222 25402,36761 25402,111142 25403,6263 25404,1805 25404,6726 25405,9121 25406,147 25408,298 25409,485 25410,10 25411,17228 25412,1177 25413,1284 25414,2416 25414,2417 25415,252 25415,175947 25415,194116 25416,364 25416,588 25416,590 25416,1181 25416,2315 25416,8180 25417,240 25418,3069 25419,314 25420,298 25421,485 25422,808 25422,6955 25423,392 25424,671 25425,7 25425,97 25426,1181 25426,1803 25426,21442 25427,712 25428,435 25429,1220 25429,1222 25429,1893 25430,68 25430,240 25430,7155 25431,911 25432,104 25433,1639 25434,999 25435,422 25436,2775 25437,447 25438,422 25439,1635 25440,422 25441,422 25442,422 25443,2051 25444,422 25445,302 25446,349 25446,875 25446,1653 25447,1849 25448,22 25448,302 25448,861 25448,893 25448,1659 25448,2116 25448,3769 25449,163 25450,438 25450,579 25450,1417 25450,1722 25451,1977 25451,1978 25452,298 25452,596 25453,2867 25453,2868 25453,258298 25454,2334 25456,310 25456,3039 25457,850 25459,640 25460,25461 25462,640 25463,640 25464,2775 25465,447 25466,640 25467,1359 25467,60576 25468,104 25469,217 25469,1417 25470,72 25470,611 25472,346 25473,255 25474,932 25475,1220 25475,1222 25476,3 25476,510 25477,393 25478,264 25478,1381 25479,104 25479,136 25479,254 25479,557 25479,954 25479,1368 25479,1939 25479,5405 25479,7757 25479,10318 25480,356 25481,4 25481,5 25481,3555 25482,346 25483,255 25484,516 25485,422 25486,107 25487,192 25487,309 25487,310 25488,3069 25489,1803 25490,71 25490,611 25490,859 25491,2173 25492,1801 25493,873 25494,136 25494,252 25494,272 25494,333 25494,435 25494,516 25494,1033 25494,1243 25494,1370 25494,1877 25494,1893 25494,2006 25495,745 25497,1572 25497,3999 25498,1220 25498,1222 25499,2995 25500,209 25500,811 25500,1891 25501,344 25501,827 25501,2674 25501,16153 25502,1722 25502,4039 25503,1276 25503,3698 25504,302 25505,20 25506,852 25507,195 25507,1454 25507,1572 25509,1019 25509,2784 25510,1411 25511,406 25511,1118 25512,1659 25513,389 25514,515 25515,50 25516,4 25516,5 25516,211 25516,740 25516,741 25517,298 25518,485 25519,287 25521,222 25521,1871 25522,1276 25522,2334 25523,1522 25524,1871 25525,1858 25526,356 25526,599 25526,685 25526,849 25526,1130 25526,1844 25526,2373 25527,1782 25528,920 25529,107 25530,920 25531,712 25531,1243 25531,1400 25531,1425 25533,859 25534,34 25534,35 25535,1085 25536,48 25536,704 25536,1179 25536,3507 25537,425 25537,682 25537,1276 25537,1891 25537,6068 25537,72439 25539,595 25539,2116 25539,3769 25541,26 25541,59 25541,117 25541,887 25541,1432 25541,2712 25541,21944 25542,346 25543,1359 25544,1983 25545,1010 25546,302 25546,340 25547,87 25549,3193 25551,217 25551,392 25551,872 25551,1118 25551,1796 25552,4355 25553,599 25554,309 25554,310 25555,56 25555,192 25555,333 25555,3895 25556,25557 25556,35215 25558,1983 25559,406 25560,333 25560,3177 25561,171 25562,6726 25563,1313 25564,794 25565,3804 25566,1836 25567,442 25567,749 25567,2334 25568,106 25568,1220 25568,1222 25570,626 25570,2995 25571,104 25571,289 25571,290 25571,80266 25571,94134 25575,538 25575,934 25576,130 25578,37 25578,1782 25579,1556 25580,707 25581,406 25582,272 25583,309 25583,310 25584,1175 25585,467 25585,868 25585,1323 25586,87 25586,312 25587,811 25587,1130 25588,7360 25589,302 25590,9195 25591,1210 25591,1631 25591,1639 25592,83 25593,852 25594,1836 25595,1893 25597,760 25597,1454 25597,1608 25597,2989 25597,2991 25598,712 25598,1434 25599,1247 25601,15573 25602,302 25603,718 25604,26 25604,59 25605,581 25606,167 25607,338 25608,1659 25609,323 25610,1590 25611,25612 25613,252 25613,1220 25613,1222 25614,4980 25615,54 25616,25617 25618,1220 25618,1222 25619,515 25620,7652 25621,280 25621,17245 25622,1082 25622,1807 25622,2775 25623,433 25624,1844 25626,634 25626,2867 25626,2868 25626,22880 25627,79 25627,192 25627,202 25627,203 25627,620 25627,1181 25627,80266 25628,872 25629,26 25629,59 25629,21944 25630,26 25630,59 25630,21944 25632,2506 25633,2506 25634,10 25635,2506 25636,26 25636,47 25636,59 25636,117 25636,885 25636,2469 25636,2712 25636,4079 25636,9542 25636,21944 25636,25636 25636,44244 25636,68120 25637,25638 25639,875 25640,579 25641,58 25642,24505 25643,247 25644,859 25646,15 25646,292 25646,1449 25648,143 25649,406 25649,620 25649,779 25649,1181 25649,1425 25649,1515 25650,723 25651,15573 25652,932 25652,1016 25652,2205 25652,33424 25653,1707 25654,217 25654,301 25654,1417 25655,2266 25656,4831 25657,1326 25658,1559 25658,1639 25658,25573 25659,217 25659,389 25659,949 25659,1019 25659,2266 25660,626 25661,682 25662,167 25662,467 25662,818 25662,1167 25662,2372 25662,2979 25662,73570 25663,907 25664,41 25664,68 25664,294 25664,431 25664,631 25664,760 25664,784 25664,805 25664,818 25664,1119 25664,1285 25664,2995 25664,3135 25664,9021 25665,6955 25666,151 25667,151 25668,920 25668,1623 25669,1127 25670,54 25670,187 25670,222 25670,283 25670,313 25670,379 25670,385 25670,389 25670,657 25670,781 25670,1019 25670,1274 25670,1467 25670,1539 25670,1724 25670,2421 25670,2944 25670,6506 25670,7768 25670,37088 25671,10 25672,452 25672,457 25672,497 25672,535 25672,676 25672,1655 25673,333 25674,805 25675,1265 25675,1266 25676,647 25677,344 25678,2681 25679,247 25680,992 25681,72 25682,1858 25683,1860 25684,525 25685,510 25685,1019 25685,1181 25685,1300 25686,11 25686,63 25686,107 25686,160 25686,207 25686,264 25686,272 25686,273 25686,294 25686,302 25686,376 25686,515 25686,713 25686,733 25686,736 25686,811 25686,877 25686,968 25686,1010 25686,1058 25686,1122 25686,1298 25686,1381 25686,1572 25686,1579 25686,1634 25686,1767 25686,1881 25686,2105 25686,2191 25686,2372 25686,2668 25686,2750 25686,3194 25686,4549 25686,6298 25686,115659 25686,143287 25687,1326 25688,4 25688,5 25689,1644 25690,1058 25690,8149 25691,1043 25692,259 25692,1433 25693,3960 25694,50 25695,1983 25696,1544 25697,206 25698,312 25699,1983 25700,25701 25702,581 25703,302 25703,2116 25704,72 25705,2506 25706,420 25708,217 25709,10 25710,34 25710,35 25711,4637 25712,2506 25713,151 25714,34 25714,35 25714,83 25715,195 25716,356 25716,1572 25717,54 25718,160 25718,206 25718,452 25718,583 25718,1118 25719,801 25720,372 25721,424 25722,516 25723,875 25724,1740 25725,81 25726,1740 25727,184 25728,107 25729,859 25730,250 25731,718 25732,25733 25732,82740 25734,387 25735,252 25735,318 25735,516 25735,1220 25735,1222 25736,1177 25736,1773 25736,6556 25737,72 25738,72 25739,34 25739,35 25740,143 25741,72 25742,302 25743,25744 25743,56128 25745,302 25745,420 25745,1414 25746,247 25747,346 25748,240 25748,392 25748,818 25749,195 25750,41 25751,497 25752,72 25753,6369 25754,875 25755,298 25756,485 25757,261 25757,347 25757,589 25758,615 25759,717 25759,1177 25759,2210 25760,58 25761,46 25763,247 25763,406 25765,178 25766,818 25766,1085 25767,1836 25768,1381 25769,2224 25770,2274 25771,575 25772,376 25773,9029 25774,26 25774,59 25775,2574 25776,298 25777,485 25778,536 25778,949 25779,376 25780,885 25781,1836 25782,1466 25783,649 25784,72 25785,298 25786,485 25787,104 25787,136 25787,557 25787,953 25787,954 25787,1939 25788,4475 25789,1462 25789,8537 25790,298 25791,485 25792,72 25793,1285 25794,389 25795,920 25797,4611 25798,3148 25798,8270 25799,72 25800,41 25800,68 25800,1119 25800,1285 25801,16617 25802,973 25802,1837 25802,2436 25803,809 25804,1001 25805,4611 25806,893 25807,219 25808,1608 25809,250 25810,298 25811,485 25812,44 25814,503 25814,760 25814,1119 25814,1140 25814,1149 25814,1631 25815,202 25815,203 25816,372 25816,1082 25817,147 25817,158 25817,206 25817,80266 25818,217 25819,887 25820,72 25821,4748 25821,21944 25822,586 25822,1175 25823,392 25824,720 25824,907 25824,1117 25825,206 25825,302 25825,422 25826,657 25826,6424 25827,32 25828,79 25828,931 25829,1590 25829,1644 25829,1769 25830,557 25831,557 25832,301 25832,717 25832,1231 25832,1740 25832,1782 25833,887 25834,25835 25836,72 25837,1556 25838,147 25838,158 25839,79 25839,422 25839,1220 25839,1222 25840,1070 25841,272 25841,795 25841,934 25841,1070 25841,1612 25842,25843 25842,125838 25844,143 25845,1579 25846,6955 25847,1432 25848,9018 25849,1181 25850,292 25851,21944 25853,25854 25855,81 25855,304 25855,332 25855,420 25855,843 25855,875 25855,994 25855,1133 25855,1818 25855,2083 25855,2995 25855,4039 25855,9015 25856,271 25858,433 25859,250 25860,25861 25862,887 25864,184 25865,1252 25865,1253 25866,333 25867,298 25868,485 25870,158 25870,259 25870,356 25870,392 25870,406 25870,483 25870,535 25870,592 25870,713 25870,718 25870,852 25870,877 25870,1419 25870,1453 25870,2253 25870,3331 25870,4252 25870,4678 25870,5301 25870,7572 25870,20535 25870,37088 25871,4453 25872,25873 25874,516 25876,298 25877,485 25878,278 25878,733 25879,9011 25879,9032 25880,48 25880,233 25880,634 25881,192 25882,433 25883,2807 25884,171 25885,636 25886,1707 25887,450 25888,2506 25889,704 25889,920 25890,298 25891,485 25892,1313 25893,2607 25894,1639 25895,247 25896,255 25897,2506 25898,225 25899,3161 25900,450 25901,1414 25902,2574 25903,1284 25904,1836 25905,25906 25907,23011 25909,25910 25909,127076 25911,2506 25912,19986 25913,107 25914,192 25915,450 25916,333 25917,151 25918,479 25919,79 25920,2506 25921,309 25921,310 25922,640 25923,356 25924,313 25925,1544 25926,25927 25928,54 25928,83 25928,577 25928,1871 25928,25929 25928,53217 25928,133628 25930,115 25930,118 25931,450 25932,346 25933,25933 25934,258 25935,63 25935,489 25935,1623 25936,255 25937,143 25938,3999 25939,772 25940,304 25940,337 25940,338 25940,393 25940,439 25940,626 25940,649 25940,772 25940,811 25940,1506 25940,2367 25940,5212 25941,240 25942,2443 25943,25944 25943,91652 25945,652 25946,301 25947,1102 25948,248 25948,450 25949,264 25950,1381 25951,1274 25952,50 25952,79 25952,393 25952,406 25952,493 25952,585 25952,586 25952,592 25952,704 25952,1433 25953,333 25954,1007 25955,818 25956,592 25956,1082 25956,1285 25956,1818 25956,3069 25957,163 25958,250 25958,991 25958,1684 25959,192 25959,195 25959,215 25959,302 25959,1149 25959,1980 25959,8992 25960,422 25961,56 25962,267 25963,134 25963,483 25964,8788 25965,2506 25966,2506 25967,1836 25968,25969 25968,97488 25968,129488 25970,862 25970,2590 25971,217 25972,3507 25973,1417 25974,32 25974,392 25974,918 25974,214734 25975,8992 25976,585 25977,850 25978,346 25979,143 25980,392 25981,72 25982,25983 25984,1149 25985,140 25985,264 25985,1381 25985,1509 25985,1639 25986,83 25987,5366 25988,275 25989,10 25990,34 25990,35 25991,25992 25993,3474 25994,304 25995,143 25997,298 25997,636 25997,1579 25997,1962 25998,784 25999,515 26000,26001 26002,83 26003,26004 26005,1227 26005,1229 26005,86416 26006,366 26007,704 26008,26009 26010,254 26010,2979 26011,795 26011,3804 26012,233 26013,1556 26014,366 26015,366 26016,366 26017,366 26018,1309 26019,366 26020,366 26021,366 26022,366 26024,515 26025,298 26026,485 26027,1888 26027,6661 26028,23287 26029,273 26029,274 26030,2506 26031,275 26031,874 26031,4771 26032,22 26032,31206 26034,1 26034,83 26034,158 26034,178 26034,209 26034,309 26034,310 26034,313 26034,337 26034,390 26034,455 26034,467 26034,599 26034,664 26034,694 26034,752 26034,818 26034,843 26034,868 26034,968 26034,1010 26034,1181 26034,1556 26034,1623 26034,1782 26034,2646 26034,2699 26034,3623 26034,136014 26035,163 26036,579 26038,178 26038,439 26038,1776 26038,1877 26039,34 26039,35 26040,1749 26040,3585 26041,68 26041,71 26041,631 26041,4190 26041,90845 26041,128297 26041,128872 26041,132639 26041,148995 26041,162140 26041,178820 26041,182790 26041,254929 26042,46 26042,58 26042,1124 26043,323 26044,3451 26044,3452 26045,248 26045,364 26045,850 26046,644 26047,875 26048,2048 26049,1983 26050,1707 26051,87 26051,510 26051,703 26051,852 26051,1140 26051,1238 26051,1722 26051,1893 26051,2436 26051,3367 26051,3538 26052,4903 26053,163 26053,209 26053,302 26053,579 26053,811 26054,79 26054,1715 26055,283 26056,278 26056,536 26056,660 26056,1871 26056,6506 26057,744 26058,366 26058,1052 26058,1319 26058,1571 26058,1634 26058,2424 26058,2620 26058,2868 26059,1983 26060,366 26060,1749 26060,3585 26060,4691 26061,41 26061,609 26061,682 26061,1085 26061,1359 26061,1882 26061,2296 26061,6556 26061,8180 26063,795 26064,1227 26064,1229 26064,1252 26064,1253 26065,850 26066,850 26067,81 26068,907 26068,932 26070,795 26070,2334 26070,3474 26071,19010 26073,143 26074,623 26074,1805 26075,390 26075,1085 26076,1858 26077,1860 26078,1241 26078,2083 26079,346 26080,663 26080,664 26081,752 26081,873 26081,1210 26082,626 26082,775 26083,929 26084,1140 26084,1235 26084,1238 26084,1688 26084,1722 26084,3474 26084,3538 26084,5547 26085,34 26085,35 26085,2319 26086,1151 26087,211 26088,184 26089,1127 26089,1673 26090,15 26090,1332 26091,309 26091,310 26091,483 26092,3 26094,2421 26095,3135 26097,107 26098,1227 26098,1229 26099,1276 26100,911 26101,32 26101,392 26101,697 26101,809 26102,301 26102,968 26103,30 26105,372 26106,1289 26107,687 26107,1556 26108,885 26110,760 26111,344 26112,4276 26113,444 26114,65 26115,1782 26116,104 26117,147 26117,932 26118,811 26118,893 26119,710 26120,1001 26122,1663 26123,7155 26124,1566 26125,433 26125,1241 26125,76096 26125,127158 26128,3069 26129,1326 26129,1411 26129,2006 26129,14797 26131,26131 26132,1635 26132,9457 26133,192 26133,264 26133,301 26133,1085 26133,1118 26133,1531 26133,3744 26134,336 26135,278 26136,137 26136,5405 26137,640 26138,640 26139,192 26141,640 26142,640 26143,4 26143,5 26143,104 26143,136 26143,557 26143,1368 26143,1939 26143,5405 26145,32 26145,392 26145,697 26145,809 26145,2312 26146,536 26147,217 26148,1117 26148,1284 26149,818 26150,305 26151,301 26151,305 26151,509 26151,516 26151,1298 26151,1381 26151,1837 26151,2083 26151,3193 26153,2674 26154,2506 26155,2506 26157,151 26158,1927 26159,493 26160,843 26161,37 26161,50 26161,360 26161,452 26161,623 26161,644 26161,660 26161,673 26161,710 26161,838 26161,877 26161,1130 26161,1147 26161,1240 26161,1267 26161,1345 26161,1688 26161,1724 26161,1805 26161,2266 26161,2310 26161,2750 26161,3422 26161,9743 26161,13661 26161,22293 26161,40566 26162,58 26162,772 26163,1590 26164,510 26164,872 26164,150022 26165,340 26165,8235 26166,1479 26167,83 26168,360 26168,1522 26169,1983 26171,1 26171,48 26171,79 26171,118 26171,163 26171,192 26171,233 26171,272 26171,275 26171,304 26171,340 26171,422 26171,491 26171,571 26171,605 26171,620 26171,703 26171,726 26171,788 26171,911 26171,1052 26171,1133 26171,1309 26171,1313 26171,1319 26171,1392 26171,1634 26171,1803 26171,4597 26171,8244 26172,146 26172,336 26173,690 26173,3409 26174,1983 26175,3193 26176,2073 26177,195 26178,252 26179,63 26179,202 26179,203 26179,516 26179,1220 26179,1222 26179,1663 26180,26181 26181,20 26181,160 26181,248 26181,338 26181,397 26181,516 26181,586 26181,1402 26181,1515 26181,1722 26181,1786 26181,1927 26181,1973 26181,1992 26181,2312 26181,2726 26181,3507 26181,3944 26181,4276 26181,5265 26181,13151 26181,22045 26181,58860 26181,168844 26181,177427 26181,190327 26182,389 26183,5726 26184,3138 26185,1238 26186,338 26186,462 26186,872 26186,1722 26187,1467 26188,385 26188,477 26188,781 26188,1201 26188,1881 26188,2319 26188,2553 26189,631 26190,685 26191,1983 26192,1058 26193,602 26194,557 26194,954 26194,1939 26194,134641 26195,450 26197,406 26197,485 26199,1181 26200,861 26201,604 26201,968 26201,1293 26202,356 26203,422 26204,422 26205,422 26206,195 26207,1983 26208,2506 26209,2506 26210,58 26211,46 26212,1452 26213,1323 26214,58 26215,46 26217,58 26218,611 26218,949 26218,1782 26219,1298 26221,5405 26222,422 26223,422 26224,422 26225,1983 26226,2506 26228,240 26228,1962 26228,2205 26228,2209 26228,33424 26229,6424 26230,379 26230,850 26231,344 26231,647 26232,1140 26232,2436 26233,577 26233,1105 26234,56 26234,147 26234,158 26234,422 26234,1181 26235,850 26236,433 26237,422 26238,56 26240,19 26240,379 26240,850 26241,104 26243,422 26244,81 26244,104 26244,1282 26244,2205 26244,2206 26244,2286 26244,33424 26245,1052 26246,296 26246,2605 26247,991 26247,992 26248,292 26249,285 26249,366 26251,91622 26251,203739 26252,2353 26253,392 26253,697 26253,809 26255,2995 26255,3135 26256,19010 26257,72 26257,104 26257,312 26257,3695 26258,2353 26260,3 26262,344 26262,596 26262,1127 26264,26264 26264,26265 26266,2105 26267,1309 26268,217 26269,3 26270,8 26270,3555 26270,7117 26271,346 26271,435 26272,178 26273,1140 26274,1977 26274,1978 26275,118 26275,4597 26276,344 26277,1509 26278,3 26279,264 26280,1821 26281,72 26281,312 26281,3695 26282,158 26282,1001 26282,1433 26284,79 26284,217 26284,718 26284,1309 26285,850 26286,387 26286,920 26286,1089 26286,1332 26286,1368 26286,1619 26286,1927 26287,301 26287,1782 26288,1572 26288,1688 26289,302 26289,2116 26290,808 26291,2915 26292,292 26293,557 26293,918 26293,1673 26293,3474 26294,292 26295,312 26297,690 26297,1474 26297,1807 26298,1556 26299,163 26300,406 26301,433 26301,1284 26301,1634 26302,406 26302,435 26302,972 26302,2775 26305,26306 26307,292 26311,929 26311,1608 26312,1566 26313,887 26314,493 26315,835 26316,1509 26317,217 26319,149 26320,2073 26321,146 26322,2572 26323,781 26324,1433 26325,163 26326,1014 26327,1276 26327,19488 26328,298 26329,485 26330,1149 26332,1983 26333,2828 26334,302 26335,289 26335,290 26335,1011 26336,140 26337,1285 26338,2191 26339,2173 26340,1 26340,149 26340,202 26341,379 26341,455 26341,536 26341,694 26341,877 26341,1284 26341,1539 26341,1715 26341,7645 26342,1556 26343,1370 26343,1821 26343,2782 26344,931 26345,337 26345,389 26345,818 26345,1014 26345,1454 26346,247 26347,138 26347,1559 26348,273 26348,274 26349,163 26350,184 26351,1556 26352,775 26353,2051 26354,1 26354,26 26354,59 26354,147 26354,1087 26354,1579 26354,8180 26354,144962 26355,58 26356,1070 26357,872 26358,10 26358,195 26358,931 26359,3328 26360,3467 26361,269 26362,149 26362,240 26362,818 26362,127158 26363,779 26364,298 26365,485 26366,657 26366,1010 26366,1849 26366,1860 26367,302 26368,292 26369,1722 26369,1836 26369,3612 26370,500 26371,718 26372,5192 26373,493 26373,1265 26373,1266 26374,657 26375,452 26375,457 26375,497 26375,535 26375,676 26375,918 26375,1655 26376,805 26376,2443 26377,1454 26378,147 26379,527 26380,163 26380,861 26380,1556 26380,6303 26382,20 26383,406 26384,1227 26384,1229 26385,535 26386,10 26387,1127 26388,30 26388,1177 26388,2210 26388,4237 26389,34 26389,35 26389,120 26389,217 26389,283 26389,372 26389,392 26389,455 26389,1240 26389,1564 26389,1639 26389,2699 26389,2989 26389,2991 26390,2506 26391,2506 26392,209 26393,1775 26393,1782 26393,21944 26394,473 26395,192 26396,714 26396,760 26398,217 26399,647 26400,344 26401,1227 26401,1229 26403,2334 26404,1227 26404,1572 26404,21944 26404,86416 26406,832 26407,87 26407,1140 26407,1453 26408,195 26409,301 26409,626 26409,968 26409,1010 26409,1298 26410,1818 26411,264 26411,1509 26411,1893 26412,175 26412,693 26413,2506 26414,56 26414,147 26414,158 26414,175 26414,192 26414,285 26414,333 26414,336 26414,422 26414,602 26414,620 26414,640 26414,1011 26414,1181 26414,1425 26414,1803 26414,2244 26414,2253 26414,3895 26414,22616 26414,27834 26414,30331 26416,887 26418,104 26419,20 26419,32 26419,202 26419,203 26419,302 26419,433 26419,581 26419,599 26419,644 26419,668 26419,673 26419,713 26419,717 26419,760 26419,784 26419,918 26419,985 26419,1058 26419,1089 26419,1147 26419,1392 26419,1844 26419,2373 26419,2605 26419,3089 26419,3135 26419,3451 26419,3452 26419,7117 26419,26450 26420,315 26420,35486 26420,227061 26421,1559 26422,781 26423,292 26424,406 26424,620 26425,192 26425,364 26426,1085 26428,779 26430,247 26432,225 26432,248 26432,5405 26433,717 26433,1782 26434,147 26434,158 26434,406 26434,779 26434,1181 26434,1515 26435,147 26435,158 26435,206 26435,2244 26437,1891 26438,83 26439,843 26440,887 26441,120 26442,15 26443,217 26443,1118 26444,1235 26444,1335 26445,622 26446,1033 26447,852 26448,225 26449,247 26449,2867 26449,2868 26450,71 26450,146 26450,313 26450,314 26450,349 26450,467 26450,685 26450,838 26450,849 26450,911 26450,1011 26450,1014 26450,1293 26450,1504 26450,1566 26450,1844 26450,1848 26450,3003 26450,3513 26450,4190 26450,5356 26450,8097 26450,26928 26450,30557 26450,32976 26450,33287 26450,41230 26450,56567 26450,81775 26450,155719 26450,162574 26450,166558 26450,167194 26450,171169 26450,172224 26450,216130 26451,13345 26453,56 26453,336 26453,422 26453,22616 26454,83 26455,536 26456,151 26457,137 26458,302 26460,289 26460,290 26460,1818 26461,2367 26462,1849 26463,274 26463,1116 26464,557 26465,932 26466,3 26466,81 26466,225 26466,273 26466,274 26466,292 26466,302 26466,425 26466,1082 26466,1807 26467,26468 26469,516 26469,1220 26469,1222 26469,1243 26470,26471 26472,306 26472,307 26473,356 26473,611 26474,302 26474,579 26476,72 26477,178 26478,247 26479,217 26479,1417 26480,151 26481,81 26481,225 26481,292 26481,425 26481,1082 26481,1807 26482,26483 26484,1465 26485,2797 26487,217 26488,2296 26489,577 26490,1085 26490,26492 26491,631 26493,1085 26494,949 26495,206 26496,158 26497,663 26497,664 26498,1807 26499,376 26500,72 26501,10 26502,44 26504,389 26505,887 26506,81 26506,1807 26507,972 26508,250 26509,2506 26510,255 26511,26 26511,59 26512,200 26513,4 26513,5 26513,1119 26513,1203 26513,1252 26513,1253 26513,1415 26513,1955 26513,1962 26513,2089 26513,2940 26513,3135 26513,21944 26513,23590 26513,81577 26514,22 26514,387 26514,707 26515,918 26516,338 26516,420 26516,467 26516,809 26517,211 26518,1858 26519,1860 26520,313 26520,1140 26520,1718 26521,1858 26522,1860 26523,3507 26524,861 26525,217 26525,222 26525,536 26525,4672 26526,2506 26527,26 26527,59 26527,1893 26527,17346 26528,26529 26530,483 26531,273 26531,274 26532,2209 26533,577 26533,1287 26533,1462 26534,602 26535,563 26536,26537 26538,1235 26538,1335 26539,3724 26540,340 26541,225 26542,305 26543,289 26543,290 26544,289 26544,290 26545,994 26546,104 26546,1368 26546,2867 26546,22880 26547,302 26548,81 26548,425 26549,1140 26550,861 26551,211 26552,704 26553,447 26554,2775 26555,1509 26557,289 26557,290 26557,3041 26558,8820 26559,415 26560,26561 26562,379 26563,58 26564,72 26565,1515 26566,1388 26567,298 26568,485 26569,83 26570,493 26571,333 26572,273 26572,274 26573,557 26574,557 26575,58 26575,1140 26576,175 26577,2620 26578,557 26579,1 26579,48 26579,130 26579,340 26579,360 26579,489 26579,710 26579,1096 26579,1381 26579,4355 26579,9457 26580,171 26581,346 26582,1043 26583,209 26584,26585 26586,35 26587,779 26588,424 26589,7760 26590,275 26591,841 26592,267 26593,107 26594,151 26595,991 26596,137 26597,1 26598,143 26599,444 26599,4222 26600,184 26601,1085 26602,5405 26603,298 26604,485 26605,424 26606,1531 26607,34 26607,35 26607,217 26607,283 26607,455 26607,536 26607,1240 26607,1274 26607,1465 26607,1608 26607,2989 26607,2991 26607,7092 26607,14126 26608,5405 26609,26610 26609,121089 26609,123048 26609,262342 26611,1381 26612,171 26613,285 26614,304 26615,2735 26616,1188 26618,26619 26620,5265 26621,26 26621,59 26622,294 26623,217 26624,3507 26625,26626 26627,1515 26628,1305 26629,107 26630,347 26631,949 26632,1014 26633,3069 26634,1506 26635,1571 26636,4594 26637,298 26638,485 26639,433 26640,784 26641,30 26642,515 26644,289 26644,290 26645,83 26646,1453 26647,602 26648,26649 26648,108829 26650,26651 26650,43054 26650,51411 26650,68069 26650,81405 26650,81915 26650,81974 26650,84195 26650,85171 26650,86832 26650,86880 26650,87173 26650,93072 26650,95106 26650,98727 26650,103671 26650,106521 26650,108717 26650,217063 26650,255501 26650,256163 26650,262267 26652,346 26653,5547 26654,251 26656,83 26657,3193 26658,1181 26659,841 26661,346 26662,26663 26664,1773 26665,72 26666,1773 26667,723 26667,1267 26668,72 26669,344 26670,285 26671,874 26672,163 26673,850 26674,887 26675,143 26676,130 26677,1267 26678,77 26679,26680 26681,171 26682,104 26682,134 26682,135 26682,137 26683,26684 26683,47723 26685,72 26686,489 26687,640 26689,147 26689,158 26690,26691 26692,46 26693,83 26693,379 26693,1274 26693,1881 26694,26695 26694,115118 26696,217 26696,1417 26697,8811 26698,323 26699,424 26700,115 26700,118 26701,330 26702,1309 26703,138 26703,1243 26703,1368 26704,151 26705,151 26705,184 26705,980 26705,1243 26706,872 26707,366 26708,366 26709,720 26710,366 26711,366 26712,366 26713,366 26714,366 26715,366 26716,1089 26716,1623 26717,366 26718,366 26719,3345 26720,704 26721,704 26722,301 26723,779 26723,1515 26724,389 26724,918 26725,233 26726,130 26727,158 26728,23011 26729,104 26729,134 26729,135 26729,137 26729,138 26729,1078 26729,2105 26729,4276 26730,163 26730,457 26730,505 26730,1749 26731,652 26732,784 26733,116 26733,994 26733,2087 26733,2590 26734,26735 26736,346 26736,493 26737,314 26738,26739 26740,781 26741,206 26742,5301 26743,781 26744,130 26744,273 26744,274 26744,1247 26745,3209 26746,26747 26746,38519 26746,53539 26748,104 26748,134 26748,135 26749,26750 26751,859 26751,2116 26752,26753 26755,3451 26755,3452 26756,644 26757,26758 26759,26758 26760,26758 26761,26758 26762,859 26763,19443 26764,19986 26765,26766 26765,27496 26765,30116 26765,46012 26765,50887 26765,63220 26765,70489 26765,78484 26765,84376 26765,94005 26765,95771 26765,99974 26765,100487 26765,102847 26765,104276 26765,109227 26765,111572 26765,130727 26767,673 26768,516 26768,1243 26769,10 26770,605 26771,3252 26771,7092 26772,483 26773,1608 26774,493 26775,6263 26776,306 26776,307 26777,1151 26777,1363 26777,1836 26779,788 26780,4453 26781,289 26781,290 26781,932 26781,1082 26781,1285 26781,1818 26781,1955 26781,2296 26781,2620 26781,94134 26782,120 26783,1579 26784,2319 26785,134 26785,538 26785,579 26785,636 26785,934 26785,1294 26785,1474 26785,2209 26785,2353 26786,309 26786,310 26786,577 26786,788 26786,1010 26786,1433 26786,1531 26786,23487 26787,346 26787,1590 26787,1644 26788,3413 26789,240 26789,301 26789,444 26789,592 26789,852 26789,968 26789,1564 26789,1785 26790,292 26791,3 26792,850 26793,1858 26794,1860 26796,259 26797,808 26798,3447 26799,1821 26800,388 26801,54 26801,389 26801,634 26801,1871 26802,200 26803,3724 26804,1871 26805,1181 26806,19413 26807,32 26808,805 26809,206 26809,710 26809,1058 26809,2617 26810,473 26812,2421 26812,3695 26813,760 26814,346 26815,1118 26816,1381 26817,298 26818,485 26819,586 26820,422 26821,422 26822,422 26823,422 26824,422 26825,422 26826,305 26827,403 26829,720 26830,5405 26831,1118 26832,202 26832,203 26834,479 26835,406 26836,493 26839,50 26839,79 26839,393 26839,406 26839,493 26839,585 26839,586 26839,592 26839,704 26840,225 26840,248 26841,147 26841,149 26841,184 26841,206 26841,1623 26842,557 26843,20 26844,557 26845,406 26845,622 26846,195 26846,252 26846,264 26846,269 26846,333 26846,1220 26846,1222 26846,1235 26846,1335 26846,1452 26847,1559 26849,337 26849,1014 26849,1454 26850,1612 26851,1323 26852,102 26853,1326 26854,408 26855,1955 26858,649 26860,636 26860,1844 26861,1512 26861,5992 26862,1235 26862,1335 26863,760 26863,1149 26863,1631 26864,346 26864,439 26864,868 26865,1559 26866,1313 26867,390 26867,760 26868,1289 26869,1082 26869,1220 26869,1222 26869,2605 26869,3999 26870,3260 26871,298 26872,485 26873,636 26873,805 26873,1844 26874,48 26874,130 26875,83 26876,563 26876,1241 26876,1522 26876,2480 26877,192 26877,660 26877,666 26877,877 26877,907 26877,932 26877,972 26877,973 26877,1010 26877,1122 26877,1284 26877,1298 26877,1732 26877,1837 26877,1849 26877,2191 26877,2421 26877,2750 26877,72764 26877,124668 26877,171641 26878,3161 26880,1955 26880,2775 26881,104 26882,26883 26884,868 26885,209 26885,579 26886,349 26889,252 26890,861 26891,515 26892,779 26893,217 26894,240 26895,577 26895,1429 26896,996 26896,3003 26897,640 26898,640 26899,292 26900,4344 26900,8373 26902,634 26904,58 26905,120 26905,372 26905,392 26905,536 26905,626 26905,752 26905,818 26905,907 26905,1130 26905,1284 26905,1309 26905,1522 26905,1715 26905,2191 26905,2373 26905,3804 26906,163 26906,292 26906,392 26906,579 26906,809 26906,1151 26906,2116 26906,3769 26907,4220 26909,2506 26910,2506 26911,1001 26912,442 26912,1392 26913,292 26914,1433 26915,143 26915,178 26915,435 26915,1052 26915,4611 26916,292 26917,932 26918,63 26919,66 26919,140 26920,292 26921,26922 26923,135 26923,16153 26924,328 26925,1102 26926,875 26927,932 26928,146 26928,602 26928,685 26928,749 26928,841 26928,1285 26928,1566 26928,4220 26928,6119 26928,26450 26928,81233 26929,485 26930,292 26931,1052 26932,182 26933,292 26934,1433 26935,34 26935,35 26937,760 26938,772 26940,126 26940,392 26940,918 26941,302 26942,861 26943,192 26944,26 26944,59 26945,663 26945,664 26946,887 26946,1235 26946,1335 26947,1454 26948,972 26949,710 26949,1224 26950,1522 26951,1465 26952,1082 26953,1556 26954,1893 26956,920 26957,850 26958,167 26958,2557 26959,294 26960,1663 26961,3830 26962,136 26963,850 26964,1116 26964,13136 26965,1220 26965,1222 26966,671 26967,1309 26968,483 26969,1179 26970,264 26971,850 26972,146 26972,175 26972,285 26972,344 26972,435 26972,779 26972,1181 26972,1294 26972,1515 26972,1644 26972,68069 26972,92476 26974,408 26976,1566 26977,192 26978,592 26979,1052 26980,200 26981,65 26982,957 26982,1815 26983,163 26984,298 26985,485 26986,1722 26987,292 26988,875 26989,7652 26990,500 26991,671 26993,364 26993,48505 26994,1127 26994,1673 26994,1893 26995,247 26996,392 26997,390 26998,7 26999,3258 27000,19413 27001,406 27002,364 27003,160 27003,252 27003,406 27003,516 27003,1181 27003,1231 27003,1782 27004,2312 27005,919 27007,907 27007,932 27008,1 27008,346 27008,1425 27009,248 27011,1151 27011,1836 27012,779 27012,1515 27013,30 27013,309 27013,310 27013,1385 27015,211 27015,794 27015,2867 27015,2868 27015,22880 27016,151 27017,1058 27018,298 27019,485 27020,1033 27021,298 27022,485 27023,383 27024,298 27025,452 27025,457 27025,497 27025,535 27025,676 27025,918 27025,1655 27026,485 27027,1634 27028,83 27029,143 27029,1052 27030,58 27030,392 27030,1140 27030,1465 27030,1653 27031,1231 27032,323 27033,3830 27034,2048 27035,7117 27036,140 27037,991 27038,5405 27039,219 27040,27041 27041,240 27041,332 27041,390 27041,677 27041,818 27041,862 27041,1285 27041,1353 27041,1808 27041,2512 27041,5488 27041,21366 27041,27040 27041,31729 27041,34881 27041,40723 27041,46329 27041,48254 27041,49784 27041,50690 27041,76101 27041,87753 27041,111255 27041,112081 27041,127924 27041,154737 27041,182391 27041,189358 27041,233042 27042,1363 27042,1465 27042,1836 27043,389 27044,298 27045,485 27046,3960 27048,868 27049,4 27049,5 27050,104 27051,15 27052,192 27052,663 27053,68 27053,301 27053,372 27053,577 27053,872 27053,1010 27053,1309 27053,1782 27053,2083 27054,2353 27055,2205 27055,2206 27058,1623 27059,784 27060,1087 27060,1267 27060,1345 27060,2460 27060,5192 27061,809 27062,259 27062,2923 27062,4190 27063,809 27065,192 27066,387 27066,22071 27067,852 27068,1143 27069,81 27069,225 27070,631 27071,195 27071,202 27071,203 27071,301 27071,309 27071,310 27071,366 27071,1392 27071,2073 27071,3804 27071,22321 27071,31206 27072,388 27073,389 27074,392 27075,338 27075,349 27075,467 27075,1151 27076,10 27076,307 27076,957 27076,1181 27076,2244 27076,72439 27077,83 27078,149 27079,171 27081,184 27082,1392 27083,358 27085,9195 27087,1363 27088,760 27089,192 27090,158 27091,298 27092,485 27093,891 27094,640 27095,167 27096,26 27096,59 27098,493 27099,801 27099,872 27099,1151 27101,4220 27102,143 27104,493 27105,298 27106,485 27107,302 27107,579 27107,687 27109,1608 27111,298 27112,485 27113,8373 27114,4344 27115,634 27115,635 27115,2224 27115,5034 27115,27115 27115,66550 27117,195 27118,579 27118,1479 27119,167 27119,240 27119,301 27119,347 27119,372 27119,605 27119,615 27119,631 27119,907 27119,968 27119,1001 27119,1085 27119,1133 27119,1160 27119,1167 27119,1231 27119,1284 27119,1436 27119,1522 27119,1715 27119,1785 27119,2191 27119,3193 27119,3194 27119,3207 27119,3218 27119,3422 27119,4146 27119,5662 27119,5718 27120,784 27121,158 27122,387 27123,1085 27124,298 27125,485 27126,294 27126,390 27126,784 27126,1119 27127,392 27127,595 27127,852 27127,1453 27127,1454 27128,27129 27130,634 27131,107 27131,111 27131,652 27131,1579 27131,1893 27131,2312 27132,233 27132,372 27132,805 27132,1635 27133,14989 27134,182 27135,17228 27136,188 27137,723 27138,1012 27139,298 27140,485 27141,298 27142,485 27143,4220 27144,2979 27145,146 27146,83 27147,640 27148,622 27149,211 27150,151 27151,640 27152,859 27153,72 27154,852 27155,24505 27156,298 27157,485 27158,668 27159,72 27160,298 27161,485 27162,72 27163,563 27164,1860 27165,1858 27166,1319 27167,439 27168,1 27169,143 27170,2775 27171,447 27172,306 27172,307 27173,298 27174,485 27175,56 27175,515 27175,2915 27175,30331 27176,1608 27176,4903 27177,968 27178,151 27179,184 27180,27181 27182,83 27183,143 27183,442 27183,1052 27183,2156 27183,2926 27184,149 27185,1782 27186,304 27186,714 27187,809 27188,862 27189,376 27190,420 27191,248 27191,1332 27192,302 27193,120 27194,27195 27196,27195 27197,27195 27198,27195 27199,27195 27199,67447 27200,27195 27201,27195 27202,27195 27203,4980 27204,1058 27205,615 27206,1634 27207,27208 27209,6263 27210,3148 27211,115 27211,118 27212,949 27213,1309 27214,27215 27214,160219 27216,195 27216,27217 27218,269 27219,392 27220,26 27220,59 27220,21944 27221,379 27223,35 27223,140 27224,1124 27225,481 27226,217 27227,240 27228,720 27228,920 27228,3695 27229,27230 27231,1287 27232,2506 27233,2506 27234,79 27234,1181 27235,264 27236,571 27237,147 27237,640 27238,27239 27240,1243 27241,2372 27242,240 27243,2424 27244,146 27245,795 27246,344 27247,704 27248,1119 27249,8719 27250,138 27251,865 27252,557 27253,137 27254,118 27254,4597 27255,21944 27256,8719 27257,138 27258,865 27259,557 27260,1381 27261,137 27262,118 27262,4597 27263,21944 27264,8719 27265,138 27266,865 27267,557 27268,137 27269,118 27269,4597 27270,21944 27271,8719 27272,138 27273,557 27274,865 27275,137 27276,217 27277,118 27277,4597 27278,21944 27279,557 27280,557 27281,557 27282,2750 27283,24505 27284,27285 27286,1147 27287,1181 27288,94 27288,2787 27289,861 27290,72 27291,779 27292,85 27293,302 27294,206 27295,146 27295,151 27295,563 27295,1085 27295,1210 27295,4101 27296,302 27297,27298 27299,278 27300,83 27301,3538 27302,3138 27303,72 27304,9560 27305,302 27306,79 27307,1912 27308,27309 27310,195 27310,333 27310,640 27311,58 27312,247 27313,27314 27315,72 27316,27317 27318,3989 27319,143 27320,171 27321,1962 27321,2553 27322,885 27323,779 27324,1204 27325,2334 27326,147 27326,779 27327,27328 27329,907 27330,292 27331,1608 27332,27333 27334,27335 27336,272 27337,682 27338,27339 27340,2775 27341,447 27342,640 27343,182 27344,457 27344,497 27344,676 27344,918 27344,1011 27344,1655 27344,5726 27345,27346 27345,37187 27345,51058 27345,52146 27345,75579 27345,81740 27345,84332 27345,101446 27347,422 27348,422 27349,422 27350,422 27351,422 27352,422 27353,27354 27355,27356 27357,163 27358,422 27359,2620 27360,258 27361,2051 27362,615 27362,1782 27363,10 27364,116 27364,994 27364,2087 27365,2590 27366,920 27366,1531 27368,1313 27369,483 27370,585 27371,225 27372,8884 27373,8992 27374,333 27375,1556 27376,9010 27377,17334 27378,27379 27380,27379 27381,27379 27382,602 27383,1313 27384,23011 27385,422 27386,56 27387,1085 27388,298 27389,485 27390,366 27391,3069 27393,366 27394,366 27395,366 27397,422 27398,56 27399,9121 27400,366 27401,366 27402,366 27403,233 27404,515 27405,784 27406,907 27407,818 27408,3295 27409,72 27410,27411 27412,27413 27414,292 27415,1085 27416,19986 27417,450 27418,202 27418,203 27419,27420 27421,27422 27423,433 27424,27425 27424,27580 27426,306 27426,307 27427,1122 27428,27429 27430,27431 27432,760 27433,364 27433,431 27434,1572 27435,147 27435,158 27435,252 27435,868 27435,1220 27435,1222 27435,1433 27436,1323 27437,102 27438,1326 27439,408 27440,310 27441,298 27442,485 27443,2995 27444,5213 27445,682 27446,192 27446,663 27446,664 27446,1370 27446,1531 27446,3872 27447,1265 27447,1266 27449,27450 27451,1977 27451,1978 27452,182 27453,151 27453,1673 27454,27455 27454,90519 27454,96857 27456,424 27457,2209 27458,390 27458,444 27458,567 27458,634 27458,1143 27458,1801 27458,2266 27458,5326 27458,6068 27458,6298 27458,24763 27458,28693 27458,103860 27459,1844 27460,298 27461,485 27462,158 27463,7 27464,2506 27465,2995 27466,2506 27467,957 27467,1815 27468,450 27469,2506 27470,17228 27471,2506 27472,27473 27474,623 27474,811 27475,147 27475,663 27475,664 27476,182 27477,301 27477,717 27477,1231 27477,1740 27477,1782 27478,188 27479,14989 27480,68 27482,3422 27483,6263 27484,27485 27486,167 27486,1241 27486,1436 27486,1522 27486,2083 27486,2557 27487,27488 27487,40973 27489,1432 27490,27491 27490,61515 27492,1644 27493,50 27493,79 27493,158 27493,192 27493,275 27493,333 27493,336 27493,622 27493,779 27493,872 27493,1265 27493,1266 27493,1452 27493,1776 27493,3876 27493,5310 27493,28072 27493,31499 27494,1844 27495,147 27495,192 27495,202 27495,493 27495,682 27495,1220 27495,1222 27495,1243 27495,2244 27495,4771 27495,72439 27498,596 27501,500 27502,1962 27503,1052 27504,1882 27505,2775 27506,54 27507,2210 27507,4237 27508,137 27509,1608 27509,1801 27510,333 27511,312 27511,1068 27511,1309 27511,1454 27511,1722 27511,3538 27511,5440 27512,1010 27513,749 27513,775 27513,1001 27514,9121 27515,171 27516,872 27517,3507 27518,1644 27519,13661 27520,310 27521,1392 27522,450 27523,2051 27523,27524 27523,58394 27525,1096 27526,298 27527,485 27528,72 27529,27530 27531,1284 27532,1 27533,422 27534,56 27535,7360 27536,1414 27537,500 27538,366 27539,26 27539,59 27540,2574 27541,450 27542,1010 27543,7360 27544,1837 27545,907 27546,2979 27547,535 27548,358 27549,3582 27549,27550 27549,221341 27550,911 27550,1888 27550,6837 27550,27550 27550,48603 27550,62989 27550,65849 27550,77026 27550,162593 27550,245940 27551,1085 27552,273 27552,274 27553,301 27554,298 27555,485 27556,184 27557,818 27558,388 27559,240 27560,450 27561,1893 27562,9323 27563,27564 27565,27564 27566,27567 27568,1085 27569,4 27569,5 27569,142433 27570,27571 27572,158 27573,140 27573,1370 27574,1837 27575,9011 27575,9032 27576,1368 27577,4980 27578,801 27578,1241 27579,1309 27581,2995 27582,15573 27583,27584 27585,3148 27586,301 27586,305 27586,372 27586,510 27586,516 27586,1210 27586,1298 27586,1837 27586,3193 27587,298 27588,485 27589,298 27590,485 27591,195 27592,3193 27593,167 27594,1284 27595,390 27596,9560 27597,233 27597,289 27597,290 27597,592 27597,631 27597,818 27597,1818 27597,94134 27598,3804 27599,483 27600,801 27600,1140 27600,5547 27600,27601 27600,35255 27600,58786 27600,68069 27600,86832 27602,389 27603,27604 27603,108940 27605,27606 27607,27608 27609,16045 27610,682 27611,143 27611,1052 27612,615 27612,859 27613,143 27613,1052 27614,859 27615,27616 27617,8270 27618,298 27619,485 27620,2051 27620,27621 27620,27623 27622,376 27624,298 27625,485 27626,3111 27627,298 27628,485 27629,278 27630,298 27631,485 27632,298 27633,485 27634,27635 27636,1479 27637,433 27638,1227 27638,1229 27639,1149 27640,298 27641,485 27642,1414 27643,143 27644,2367 27645,2617 27646,298 27647,485 27648,450 27649,2048 27650,167 27650,818 27650,2979 27651,255 27652,27653 27652,27654 27652,27655 27656,1235 27656,1335 27656,21944 27657,27658 27660,450 27661,694 27662,215 27663,35 27664,640 27665,481 27666,160 27667,269 27668,240 27669,217 27670,143 27671,298 27672,485 27673,424 27674,640 27675,875 27676,143 27677,4453 27678,3209 27679,143 27680,338 27680,760 27681,3069 27682,158 27682,779 27683,146 27684,10 27685,1313 27686,14819 27687,3161 27688,333 27689,27690 27689,57611 27691,479 27692,272 27693,907 27694,818 27696,115 27696,118 27697,8992 27698,1644 27699,585 27700,292 27701,206 27702,1381 27703,7194 27704,160 27705,30 27705,328 27706,349 27707,422 27708,56 27709,27710 27711,27710 27712,27710 27713,5366 27714,17334 27715,1181 27716,23011 27717,3069 27718,7 27719,163 27720,640 27721,640 27722,310 27723,27724 27725,422 27726,56 27727,953 27728,596 27729,364 27730,65 27731,72 27732,202 27732,203 27733,19986 27734,27735 27736,151 27737,8788 27738,2244 27739,694 27739,3115 27740,233 27741,298 27742,1265 27742,1266 27743,640 27744,9121 27745,366 27746,366 27747,704 27748,107 27749,2416 27749,2417 27750,292 27751,338 27752,366 27753,298 27754,366 27755,366 27756,366 27757,366 27758,366 27759,366 27760,366 27761,1133 27762,3538 27763,366 27764,366 27765,250 27766,7117 27767,1419 27768,9560 27769,7 27770,366 27771,2244 27772,13 27772,50 27772,192 27772,233 27772,309 27772,310 27772,338 27772,489 27772,841 27772,1243 27772,1381 27772,2353 27772,3370 27772,3507 27772,6119 27772,8541 27772,14453 27772,27773 27772,66297 27774,17228 27775,346 27776,27777 27778,182 27779,188 27780,298 27781,485 27782,27783 27784,6263 27785,50 27785,147 27785,202 27785,203 27785,222 27785,285 27785,333 27785,406 27785,586 27785,620 27785,994 27785,1181 27785,1515 27785,2782 27786,14989 27787,104 27788,24332 27789,27790 27791,175 27791,1089 27791,1247 27791,164572 27792,27793 27794,27795 27796,137 27797,104 27798,27799 27798,122711 27800,1644 27801,151 27802,1 27802,2089 27802,2940 27802,21944 27803,298 27804,485 27805,714 27806,3872 27807,2750 27808,34 27808,35 27808,313 27808,536 27808,1417 27809,298 27810,485 27811,158 27812,27813 27814,3367 27815,1309 27816,298 27817,485 27818,2995 27819,298 27820,485 27821,15573 27822,1370 27823,312 27824,7652 27825,72 27826,392 27827,83 27827,240 27827,301 27827,435 27827,467 27827,818 27828,718 27829,7360 27830,1227 27830,1229 27831,875 27832,620 27833,9323 27835,347 27835,392 27835,2266 27835,3585 27836,171 27837,586 27838,104 27840,104 27841,760 27842,298 27843,485 27844,563 27845,1085 27846,595 27846,818 27846,1313 27846,81648 27847,3960 27848,178 27849,718 27850,2051 27851,1635 27852,1247 27853,1590 27854,3209 27855,4 27855,5 27856,1983 27857,994 27858,994 27859,3148 27860,859 27861,2105 27862,2105 27863,1474 27864,9560 27865,682 27866,875 27867,16045 27868,887 27869,483 27870,1140 27871,315 27872,27871 27873,1551 27874,1363 27875,8270 27876,968 27877,24505 27878,158 27879,269 27880,22 27880,2017 27880,17309 27881,298 27881,2995 27882,255 27883,27884 27885,255 27888,592 27889,1298 27891,289 27891,290 27891,2296 27892,1305 27893,2048 27894,4475 27895,171 27896,9011 27896,9032 27897,1285 27898,72 27899,304 27900,1659 27901,366 27901,972 27901,37414 27902,143 27903,240 27903,818 27903,1210 27904,360 27905,27906 27907,27908 27909,376 27910,392 27911,450 27912,1247 27913,393 27914,252 27914,1058 27915,718 27916,868 27917,1117 27918,1224 27919,868 27920,27921 27920,43006 27920,51616 27920,65025 27920,82025 27920,83094 27922,143 27923,557 27924,862 27925,557 27926,5906 27927,557 27928,626 27929,278 27930,137 27931,862 27932,5906 27933,557 27934,626 27935,278 27936,137 27937,862 27938,1722 27939,500 27940,493 27940,682 27940,72439 27941,298 27942,485 27943,557 27944,557 27945,9011 27945,9032 27946,1414 27947,10 27948,1282 27949,1359 27950,1151 27950,1836 27951,2775 27952,447 27953,1531 27954,743 27954,991 27954,1058 27954,1227 27954,1821 27954,86416 27954,189794 27954,223738 27955,1227 27955,1229 27955,86416 27956,640 27957,611 27958,83 27959,422 27960,56 27961,298 27962,485 27963,27964 27966,652 27967,1715 27968,809 27969,589 27970,422 27971,422 27972,422 27973,422 27974,422 27975,422 27976,6068 27977,143 27978,143 27979,1707 27980,143 27981,10 27982,2351 27983,298 27984,485 27985,25 27985,93 27985,94 27985,2088 27986,275 27987,17334 27988,27989 27990,27991 27990,181549 27990,257567 27992,346 27993,146 27994,2334 27995,27996 27997,1096 27997,2837 27998,333 27999,8308 28000,991 28000,992 28001,115 28001,118 28002,10 28002,147 28002,841 28002,31977 28002,98426 28003,255 28004,907 28005,175 28006,2367 28007,818 28009,3069 28010,577 28010,2416 28010,2417 28011,301 28012,1238 28013,298 28014,485 28015,525 28015,28016 28015,92741 28015,120461 28015,151636 28017,28018 28019,28018 28020,481 28021,1452 28022,1313 28023,292 28024,28025 28026,1985 28027,3161 28028,602 28029,28030 28029,69838 28029,79671 28029,80848 28029,81087 28029,86108 28029,87301 28029,87572 28029,95698 28029,98210 28029,103870 28029,110427 28029,110437 28029,111643 28029,115307 28029,119073 28029,120163 28031,20 28031,77 28031,85 28031,86 28031,119 28031,120 28031,142430 28032,28033 28034,1 28034,32 28034,50 28034,79 28034,99 28034,163 28034,187 28034,233 28034,273 28034,274 28034,298 28034,358 28034,403 28034,408 28034,422 28034,442 28034,447 28034,491 28034,602 28034,626 28034,647 28034,671 28034,718 28034,745 28034,749 28034,784 28034,827 28034,872 28034,1007 28034,1058 28034,1082 28034,1113 28034,1227 28034,1247 28034,1262 28034,1298 28034,1305 28034,1571 28034,1619 28034,1634 28034,1962 28034,2867 28034,2868 28034,3474 28034,3999 28034,4597 28034,6556 28034,6682 28034,9015 28034,16201 28034,16687 28034,21442 28034,30331 28034,86416 28034,115659 28034,144556 28035,206 28036,557 28038,28039 28040,158 28041,147 28042,104 28042,134 28042,136 28042,137 28042,138 28042,2105 28043,28044 28043,57697 28043,75556 28043,82231 28043,120711 28045,158 28045,192 28045,406 28045,422 28045,424 28045,602 28046,602 28047,8992 28048,585 28050,953 28051,1133 28052,5366 28053,28054 28055,275 28056,1001 28057,602 28058,254 28059,292 28060,294 28061,296 28062,298 28063,323 28064,850 28065,8788 28066,1010 28067,9121 28068,289 28068,290 28069,251 28070,28071 28073,28074 28075,8180 28076,255 28077,104 28077,338 28077,462 28077,473 28077,2367 28077,4039 28077,8149 28077,13538 28077,21408 28078,28079 28078,59476 28078,90561 28078,104117 28078,119264 28080,219 28081,146 28082,309 28082,310 28083,247 28084,206 28085,640 28086,72 28087,344 28088,285 28089,1745 28090,163 28091,710 28092,3193 28093,1133 28094,163 28095,182 28096,28096 28097,182 28098,188 28099,163 28100,644 28101,28102 28103,28102 28104,366 28105,535 28106,366 28107,401 28107,707 28107,875 28107,1663 28107,1696 28107,1801 28107,3258 28107,6424 28107,6437 28107,14098 28107,14425 28107,18880 28107,19285 28107,25395 28107,28107 28107,28193 28107,28387 28107,29569 28107,38711 28107,46129 28107,49003 28107,65615 28107,80519 28107,102536 28107,138731 28107,141656 28107,145407 28107,174318 28107,185270 28107,189266 28107,211816 28107,213931 28107,234231 28107,253346 28109,602 28109,3218 28109,4866 28110,1181 28112,134 28112,225 28112,431 28112,636 28112,868 28112,3367 28112,3474 28112,5405 28113,500 28114,1284 28114,1732 28115,147 28115,336 28115,406 28115,1849 28117,28118 28119,255 28120,24332 28121,143 28122,9195 28123,9323 28124,306 28124,307 28125,717 28127,255 28128,604 28128,750 28128,1293 28129,718 28129,1707 28130,83 28130,217 28130,536 28130,852 28130,949 28130,1618 28130,2784 28130,2944 28130,5702 28130,7698 28130,18345 28130,19443 28130,28131 28130,28140 28130,29954 28130,44301 28130,56584 28130,88283 28130,125513 28130,165640 28130,229657 28130,232223 28131,28130 28132,77 28134,3193 28135,87 28136,760 28137,163 28137,579 28138,577 28139,315 28140,536 28140,28130 28141,2460 28142,22 28142,192 28142,397 28142,442 28142,1973 28143,58 28144,390 28145,389 28146,247 28147,1019 28148,10 28148,28149 28150,1392 28151,1227 28151,1229 28151,1252 28151,1253 28152,83 28152,718 28152,875 28153,671 28154,72 28155,516 28156,58 28157,46 28159,143 28160,255 28161,338 28161,801 28161,3585 28162,387 28162,22071 28164,5101 28165,626 28166,818 28166,1893 28167,1007 28167,1411 28167,3041 28167,8868 28169,217 28169,455 28169,1019 28169,6789 28170,358 28170,379 28173,28174 28175,1323 28176,102 28177,1326 28178,408 28179,640 28180,640 28181,1085 28182,1085 28183,493 28184,14366 28185,7652 28186,515 28186,1893 28186,2617 28187,1983 28188,1177 28188,2210 28189,3069 28190,2244 28191,58 28191,104 28191,136 28191,137 28191,248 28191,289 28191,290 28191,298 28191,372 28191,557 28191,1001 28191,1282 28191,1368 28191,1659 28191,1715 28191,1749 28191,1955 28191,2209 28191,3623 28191,75912 28192,13 28192,920 28192,1619 28193,1696 28193,6424 28193,28107 28194,104 28194,557 28194,953 28194,954 28196,481 28196,1696 28197,17228 28198,760 28198,809 28198,1631 28200,605 28200,649 28200,783 28200,973 28200,1058 28200,1298 28200,2373 28200,2411 28200,2605 28200,136072 28200,142473 28201,563 28202,649 28203,30 28203,200 28203,248 28203,328 28203,596 28203,693 28203,772 28203,1014 28203,1415 28203,4276 28203,4941 28203,19457 28203,28203 28203,75936 28203,85814 28203,87883 28203,95554 28203,104555 28203,125879 28203,147761 28204,264 28204,1433 28204,1556 28205,1512 28205,2353 28206,1844 28207,392 28207,1143 28207,1240 28207,1363 28207,1454 28207,1465 28208,1368 28209,843 28210,104 28211,493 28211,1007 28212,206 28212,1425 28213,510 28214,4 28214,5 28215,32 28216,147 28216,158 28217,302 28218,718 28219,2995 28220,500 28220,718 28221,795 28221,1955 28221,5961 28222,1247 28225,143 28225,1052 28225,1415 28226,32 28226,392 28227,15573 28228,1096 28229,58 28229,87 28229,703 28229,801 28229,852 28229,1722 28230,422 28231,56 28232,2944 28233,264 28233,338 28233,360 28233,479 28233,652 28233,872 28233,1289 28233,1659 28233,1893 28234,1143 28234,1363 28236,28237 28238,455 28239,1983 28240,1 28240,994 28240,1425 28240,1623 28240,3769 28240,6837 28240,30331 28241,579 28242,14989 28243,32 28243,392 28244,107 28244,442 28244,1332 28245,83 28246,1052 28247,1556 28248,3960 28249,599 28250,158 28250,1181 28251,298 28252,485 28253,422 28257,1267 28258,1556 28259,56 28259,147 28259,158 28259,192 28259,333 28259,493 28259,585 28259,586 28259,602 28259,779 28259,920 28259,1181 28259,1243 28259,1247 28259,1963 28259,2931 28259,3872 28259,4060 28259,8270 28259,18810 28259,164572 28260,1143 28260,3507 28261,298 28262,485 28263,852 28263,862 28263,1179 28264,298 28265,485 28266,588 28266,590 28266,1411 28266,3138 28268,206 28268,801 28268,849 28268,1011 28268,1392 28269,390 28270,81 28270,83 28270,158 28270,215 28270,222 28270,227 28270,233 28270,240 28270,278 28270,289 28270,294 28270,372 28270,390 28270,392 28270,406 28270,431 28270,455 28270,536 28270,589 28270,592 28270,631 28270,714 28270,784 28270,805 28270,809 28270,949 28270,1001 28270,1019 28270,1085 28270,1119 28270,1235 28270,1241 28270,1285 28270,1335 28270,1392 28270,1467 28270,1511 28270,1531 28270,1539 28270,1551 28270,1580 28270,1962 28270,2205 28270,2266 28270,2421 28270,2424 28270,2443 28270,2557 28270,2671 28270,2979 28270,2995 28270,3069 28270,3135 28270,4222 28270,5906 28270,6068 28270,6506 28270,7194 28270,8788 28270,15609 28270,33424 28270,37088 28270,94134 28270,245910 28271,56 28271,175 28271,595 28273,500 28274,1962 28275,1052 28276,1882 28277,2775 28278,54 28279,2210 28279,4237 28280,1858 28281,1860 28282,415 28282,455 28282,536 28282,644 28282,1858 28282,2989 28282,2991 28282,13361 28282,32751 28282,138686 28283,1644 28284,119 28284,178 28284,299 28284,366 28284,387 28284,440 28284,2373 28284,2989 28284,2991 28284,14458 28285,1072 28286,5405 28287,1257 28288,312 28288,525 28289,167 28289,1715 28289,2620 28289,3218 28290,3069 28291,503 28291,1149 28291,1973 28292,163 28292,209 28292,302 28292,579 28293,160 28294,485 28294,877 28294,911 28294,1096 28294,2135 28294,8072 28294,14511 28294,16503 28294,28294 28294,28334 28294,30440 28294,32335 28294,32515 28294,44401 28294,68732 28294,72436 28294,72440 28294,80346 28294,81949 28294,125820 28294,170304 28294,225339 28294,243113 28295,358 28295,1436 28296,22 28296,861 28297,1151 28297,1836 28298,1436 28300,275 28301,1309 28302,1805 28303,275 28304,302 28305,167 28305,217 28305,1019 28305,1085 28305,2411 28306,2460 28307,1635 28308,50 28309,34 28309,68 28309,261 28309,333 28309,393 28309,435 28309,442 28309,479 28309,697 28309,809 28309,862 28309,1204 28309,1282 28309,1298 28309,1332 28309,1363 28309,1390 28309,1462 28309,1551 28309,1612 28309,1836 28309,2206 28309,2671 28309,33424 28309,245910 28310,760 28310,818 28311,557 28311,1332 28312,259 28312,577 28312,726 28312,788 28312,859 28312,1531 28312,6803 28313,718 28314,1285 28316,1509 28317,163 28317,209 28317,301 28317,302 28317,457 28317,525 28317,631 28317,784 28317,968 28317,1085 28317,1210 28317,1782 28317,5662 28317,8180 28317,75912 28318,79 28319,1740 28320,79 28320,192 28321,171 28323,83 28323,1326 28323,1844 28324,1282 28324,1882 28325,626 28325,1241 28325,1479 28326,18831 28327,1425 28329,663 28329,664 28330,781 28331,48 28331,149 28331,599 28331,712 28332,1983 28333,5662 28335,22 28335,861 28335,2116 28336,1977 28336,1978 28337,527 28337,740 28337,741 28337,743 28337,8714 28338,72 28338,83 28338,120 28338,694 28338,1012 28338,1419 28338,3115 28338,7757 28339,1127 28340,126 28341,1837 28342,1298 28343,163 28344,515 28345,2209 28346,1332 28347,2006 28348,28349 28349,5 28349,26 28349,34 28349,94 28349,116 28349,117 28349,118 28349,290 28349,307 28349,590 28349,664 28349,954 28349,957 28349,1222 28349,1235 28349,1253 28349,1266 28349,1462 28349,1511 28349,1512 28349,1684 28349,1980 28349,2089 28349,2178 28349,2206 28349,2417 28349,2991 28349,3247 28349,3370 28349,3794 28349,4234 28349,5358 28349,5359 28349,9031 28349,13704 28349,15609 28349,17245 28349,21736 28349,33424 28349,47750 28349,56150 28349,58979 28349,72439 28349,92476 28349,94134 28349,163964 28349,164572 28349,182162 28349,230510 28349,230512 28349,245910 28350,60576 28351,3585 28352,3148 28353,217 28353,283 28353,2944 28353,23287 28353,102560 28353,138686 28353,181063 28353,188791 28353,207045 28353,211889 28353,212914 28354,56 28354,192 28354,227 28354,251 28354,272 28354,301 28354,435 28354,516 28354,818 28354,1033 28354,1210 28354,1243 28354,1368 28354,1370 28354,1512 28354,1631 28354,1877 28354,2782 28354,5405 28354,5992 28354,191355 28355,79 28356,1453 28357,6303 28358,718 28359,1707 28360,65 28360,171 28360,957 28360,1247 28360,1815 28363,21944 28364,158 28364,336 28364,406 28365,406 28366,2828 28367,104 28367,200 28367,254 28367,557 28367,953 28367,954 28368,22 28368,211 28368,861 28368,13361 28369,2699 28370,167 28371,178 28372,151 28373,222 28375,589 28375,1122 28376,424 28376,1634 28376,2931 28376,8072 28377,439 28377,493 28377,1181 28377,1243 28377,1776 28377,1849 28377,4611 28377,32784 28378,7360 28379,392 28380,4 28380,5 28380,527 28380,740 28380,741 28380,743 28381,1544 28382,280 28383,920 28384,6424 28385,406 28386,302 28386,893 28387,28107 28388,920 28389,467 28389,1433 28390,493 28391,634 28391,3422 28392,292 28393,718 28394,83 28394,440 28394,489 28394,577 28394,893 28394,1796 28394,2073 28394,3804 28394,4453 28394,142879 28395,292 28396,10 28397,4190 28398,292 28399,349 28399,392 28399,3367 28400,102 28402,292 28405,10 28406,433 28410,4039 28411,151 28412,843 28413,54 28414,247 28415,611 28416,20 28416,435 28416,671 28416,676 28416,1033 28416,1068 28416,1294 28416,1565 28416,1612 28416,1789 28416,3241 28416,3831 28416,3903 28416,5212 28416,5731 28416,8425 28416,13713 28416,19191 28416,26864 28416,29251 28416,31195 28416,31224 28416,34184 28416,34342 28416,34508 28417,3999 28418,422 28419,891 28420,56 28421,292 28422,24505 28423,392 28423,972 28424,211 28424,500 28425,1877 28426,473 28426,8149 28427,718 28427,931 28428,211 28429,5405 28430,292 28431,30 28432,408 28433,516 28434,292 28435,292 28436,292 28437,346 28438,843 28439,298 28440,485 28441,292 28442,41 28442,111 28442,134 28442,442 28442,1001 28442,1368 28442,1659 28442,1722 28442,2089 28442,2286 28442,2940 28442,8180 28442,21944 28442,136072 28443,22 28444,682 28445,292 28446,147 28447,392 28448,225 28448,1332 28449,79 28449,980 28449,1052 28449,1531 28450,392 28450,615 28450,1240 28450,1465 28450,1782 28452,292 28453,28454 28455,604 28455,605 28455,968 28456,1707 28457,292 28458,581 28458,918 28459,292 28460,292 28461,292 28462,26 28462,59 28462,430 28462,994 28462,21944 28463,192 28464,30 28464,392 28464,510 28464,2116 28465,79 28466,8798 28467,388 28468,7572 28469,4549 28470,9098 28471,1837 28472,1465 28473,2989 28473,2991 28475,4611 28476,292 28477,292 28478,1722 28478,3538 28479,35 28479,217 28479,4672 28479,18831 28480,28481 28482,392 28483,48 28484,718 28485,292 28487,356 28487,390 28487,615 28487,852 28487,1293 28487,1955 28487,3422 28489,640 28489,671 28489,1515 28489,2867 28489,2868 28490,647 28490,1175 28491,850 28492,1010 28493,28494 28493,248266 28495,292 28496,9560 28497,1425 28498,240 28498,301 28499,292 28500,1274 28501,240 28501,726 28501,818 28502,83 28504,292 28505,302 28505,344 28506,28507 28508,151 28509,588 28509,590 28509,1419 28510,450 28511,19 28511,222 28511,1571 28511,2266 28511,211889 28513,772 28514,10 28516,83 28516,2319 28517,247 28518,292 28519,1181 28520,861 28521,450 28522,5591 28523,9011 28523,9032 28524,83 28525,28526 28527,292 28528,54 28530,28531 28532,809 28533,83 28533,222 28534,50 28535,143 28535,1052 28538,626 28539,192 28539,220502 28539,221326 28540,1433 28541,1151 28541,1836 28542,626 28543,376 28544,30 28545,217 28545,240 28545,269 28545,435 28545,467 28545,818 28545,1181 28545,1298 28545,1370 28545,1417 28545,1531 28545,75912 28545,127158 28546,5405 28547,298 28548,485 28549,406 28550,10 28551,298 28552,485 28553,10 28553,240 28553,294 28553,784 28553,1285 28553,1309 28553,1962 28553,2512 28553,2775 28553,6824 28553,9015 28554,344 28555,9007 28555,31497 28556,248 28557,298 28558,485 28559,195 28560,298 28561,485 28562,389 28562,694 28562,1353 28562,2775 28563,147 28564,184 28565,158 28566,143 28567,28568 28569,28570 28569,56935 28569,57833 28569,80520 28569,86286 28569,88889 28569,97870 28569,98640 28569,108665 28569,123527 28569,125657 28571,20757 28572,1707 28573,240 28574,5375 28575,255 28576,86 28577,485 28578,255 28579,192 28580,1414 28581,534 28582,72 28583,83 28584,304 28584,1285 28585,269 28586,272 28587,6803 28589,247 28590,304 28590,1188 28591,211 28592,83 28593,422 28593,760 28593,1019 28594,536 28595,843 28596,2671 28597,306 28597,307 28598,184 28599,697 28600,536 28600,18831 28601,299 28602,4220 28603,349 28603,392 28603,697 28603,720 28603,3260 28604,292 28605,949 28605,2784 28605,19005 28606,206 28606,586 28607,143 28608,2797 28609,298 28610,485 28611,292 28612,861 28613,4475 28614,298 28615,485 28616,207 28617,1285 28618,304 28619,298 28620,485 28621,302 28622,151 28623,79 28624,718 28625,5440 28626,251 28626,393 28626,450 28626,671 28626,893 28626,1012 28626,1243 28626,1309 28626,1789 28626,1983 28626,15573 28627,298 28628,485 28629,868 28630,640 28631,1151 28631,1836 28632,258 28633,1359 28634,358 28634,379 28634,1262 28635,907 28636,41 28636,68 28637,720 28637,1284 28638,160 28638,250 28638,310 28638,346 28638,577 28638,1058 28638,1381 28638,1684 28638,3039 28638,19010 28638,29380 28639,6068 28640,491 28641,298 28642,485 28643,171 28644,28645 28646,202 28646,203 28647,248 28648,135 28649,22 28649,65 28649,240 28649,269 28649,438 28649,687 28649,809 28649,818 28649,861 28649,1058 28649,1363 28649,1374 28649,1659 28649,1796 28649,2017 28649,2073 28649,2292 28649,2312 28649,4823 28649,21442 28649,141912 28650,1235 28650,1335 28651,47 28651,1235 28651,1335 28651,2469 28652,704 28653,795 28654,2351 28655,79 28656,10 28657,1381 28658,2083 28659,83 28660,1608 28661,1556 28662,298 28663,485 28664,187 28665,298 28666,485 28667,158 28668,302 28669,312 28670,250 28671,222 28671,379 28671,634 28671,657 28671,2421 28672,304 28672,372 28673,652 28674,1417 28675,1102 28676,130 28677,28678 28677,102206 28677,254516 28680,24 28680,26 28680,59 28680,885 28680,4079 28680,21944 28681,557 28682,557 28683,217 28684,4101 28685,389 28686,28687 28688,28687 28688,83592 28688,103620 28688,110539 28688,125782 28688,154105 28688,160288 28689,28687 28689,110539 28689,125782 28690,493 28691,304 28692,211 28694,323 28695,704 28696,255 28697,850 28698,1140 28699,920 28700,28701 28700,40373 28700,50145 28700,53066 28700,53274 28700,62570 28700,82426 28702,10 28702,113156 28703,280 28703,626 28703,736 28703,862 28703,873 28703,874 28703,925 28703,1001 28703,1133 28703,1363 28703,1370 28703,2797 28703,3585 28703,4549 28703,17245 28704,8907 28705,557 28705,1939 28706,104 28706,248 28707,269 28708,4453 28709,147 28710,184 28711,247 28712,920 28713,3209 28714,920 28715,663 28715,664 28715,2178 28715,4545 28716,663 28716,1298 28717,28718 28719,143 28720,10 28721,1381 28722,143 28723,392 28724,192 28724,222 28724,310 28724,588 28724,590 28724,1177 28724,1844 28724,2073 28724,2626 28724,3039 28724,3804 28724,4831 28724,8270 28724,25222 28724,182162 28725,1313 28726,28727 28728,3161 28729,272 28730,7 28730,211 28730,315 28730,788 28731,479 28732,907 28733,818 28734,115 28734,118 28735,65 28736,332 28737,292 28738,483 28739,147 28740,206 28741,8992 28742,585 28743,28744 28745,346 28746,104 28746,136 28746,557 28746,953 28746,1368 28746,1939 28747,135 28747,137 28748,28749 28750,312 28751,1149 28752,5366 28753,14366 28754,28755 28756,23011 28757,3069 28758,135 28759,301 28759,968 28760,953 28761,2750 28762,346 28763,28764 28765,28766 28767,2574 28768,424 28769,81 28770,19986 28771,202 28771,203 28772,8788 28773,272 28774,167 28774,2083 28775,215 28776,233 28777,2812 28778,1127 28779,579 28780,28781 28780,32678 28782,63 28783,712 28784,143 28785,289 28785,290 28785,1298 28785,2083 28786,518 28787,104 28787,134 28788,1370 28789,516 28790,28791 28792,298 28793,485 28794,106 28794,1033 28796,634 28797,1146 28798,3209 28799,50 28799,79 28799,1566 28800,222 28800,850 28801,292 28802,1113 28802,1436 28802,1564 28803,187 28803,920 28803,1619 28804,298 28805,485 28806,292 28807,207 28808,920 28809,28810 28809,45954 28809,85175 28811,1983 28811,2205 28811,2206 28811,2210 28811,2775 28811,4237 28811,111142 28812,694 28812,4060 28813,690 28814,292 28814,338 28814,467 28814,510 28814,835 28814,872 28814,1052 28814,1130 28814,1151 28814,1688 28814,4039 28816,264 28816,467 28817,602 28819,306 28819,307 28820,1749 28820,3585 28822,28823 28825,911 28826,10 28827,781 28828,861 28828,1623 28828,3069 28829,30 28830,1400 28832,304 28832,534 28832,1085 28832,1580 28832,4222 28832,44725 28832,101935 28832,103860 28833,326 28833,340 28833,994 28834,255 28835,433 28836,493 28837,1580 28838,779 28839,298 28840,485 28841,907 28842,500 28842,3830 28843,1313 28844,120 28844,389 28844,657 28844,1353 28844,142430 28845,818 28846,652 28847,604 28848,298 28849,485 28851,192 28851,366 28851,949 28851,1623 28851,4691 28851,30427 28851,114600 28853,1132 28854,1293 28855,1132 28856,843 28857,120 28858,3161 28861,28862 28863,1323 28864,102 28865,1326 28866,408 28867,760 28868,292 28870,13361 28871,1659 28873,178 28873,622 28873,1033 28874,1718 28875,302 28876,3161 28877,714 28878,143 28879,11 28879,302 28879,385 28879,390 28879,1001 28879,14556 28880,28881 28882,893 28882,3830 28883,206 28885,408 28886,240 28886,1085 28886,2296 28886,3623 28886,75912 28887,697 28888,195 28889,1220 28889,1222 28890,1313 28891,104 28891,248 28891,557 28891,953 28891,4276 28893,143 28894,781 28895,1531 28897,479 28898,1474 28898,2779 28899,1707 28900,422 28901,397 28902,5662 28903,422 28904,422 28905,422 28906,264 28906,1007 28906,1127 28906,1381 28906,1509 28906,1893 28908,422 28909,422 28910,442 28910,3182 28911,599 28912,422 28913,158 28915,115 28915,118 28916,1544 28917,58 28918,868 28919,310 28921,248 28922,934 28923,1639 28924,968 28925,28926 28927,146 28927,92476 28928,269 28928,406 28928,592 28929,626 28930,158 28930,118336 28931,932 28932,1247 28933,54 28934,1368 28935,2779 28936,35 28937,1127 28938,920 28939,1400 28940,372 28941,175 28941,298 28941,7194 28941,138686 28942,585 28943,28944 28943,38050 28943,57804 28943,59561 28943,72728 28945,305 28945,1201 28946,389 28946,1072 28947,299 28948,4 28948,5 28949,1509 28950,3069 28951,66 28951,206 28951,397 28951,920 28952,1639 28955,467 28955,868 28957,63 28958,1243 28959,5343 28960,920 28960,999 28960,1089 28961,1509 28962,534 28962,868 28964,17334 28965,312 28967,104 28967,248 28968,312 28969,147 28969,158 28969,336 28969,1515 28970,497 28971,1149 28972,599 28973,818 28975,1326 28976,143 28977,217 28977,1688 28977,1722 28977,3538 28978,2315 28979,491 28979,827 28980,302 28980,2116 28982,623 28982,1805 28983,718 28984,868 28985,195 28986,1019 28987,5366 28988,275 28989,301 28990,264 28990,1381 28991,143 28992,1132 28993,781 28996,1012 28996,46631 28997,192 28997,393 28997,1531 28997,28997 28998,259 28998,1688 28998,2779 28999,872 29000,302 29000,579 29000,687 29000,1433 29000,1556 29001,462 29002,929 29002,1888 29002,2674 29003,23011 29004,1836 29005,1836 29006,385 29008,509 29008,510 29008,663 29008,822 29008,3473 29008,29008 29008,168388 29008,211989 29009,752 29010,390 29011,160 29012,58 29012,104 29012,636 29013,7360 29014,63 29015,666 29015,1983 29015,8149 29015,8714 29015,9386 29016,2931 29017,305 29018,760 29018,1631 29019,1977 29019,1978 29020,136 29020,137 29021,1105 29022,58 29023,46 29024,379 29025,302 29026,182 29027,1247 29028,298 29029,485 29030,467 29031,366 29032,422 29033,83 29034,510 29034,875 29035,29036 29037,467 29037,779 29038,120 29038,694 29038,805 29038,1001 29038,1353 29038,1419 29038,1466 29038,2989 29038,3585 29038,162599 29039,143 29040,872 29043,4611 29044,626 29045,143 29046,1579 29046,2051 29048,353 29048,29048 29049,58 29049,595 29049,861 29049,934 29049,2367 29049,2411 29049,21603 29049,96284 29050,1983 29051,2443 29052,1 29053,248 29053,450 29054,919 29054,1860 29055,278 29055,248556 29056,192 29057,3 29057,406 29057,439 29057,671 29057,1085 29058,588 29058,590 29059,392 29061,292 29061,1688 29062,29063 29064,66 29064,467 29064,868 29064,920 29064,1433 29065,2775 29066,30 29066,175 29066,227 29066,1179 29066,2782 29066,3148 29066,6051 29066,8501 29066,14472 29066,27834 29067,1983 29068,1579 29069,595 29069,783 29069,850 29070,972 29071,718 29072,83 29072,217 29072,379 29072,399 29072,1467 29072,2168 29072,2784 29072,6506 29072,7698 29073,505 29074,171 29075,2828 29076,79 29076,571 29076,868 29076,875 29076,920 29076,1566 29077,72 29078,992 29078,3507 29079,240 29079,17309 29080,3260 29082,302 29083,192 29083,640 29084,525 29085,626 29086,8788 29087,850 29089,818 29089,1955 29090,143 29091,2205 29091,2206 29091,33424 29092,312 29094,143 29095,415 29095,1058 29095,1949 29095,6506 29095,21982 29096,16683 29097,1140 29098,135 29099,1688 29100,497 29101,160 29101,273 29101,620 29101,6682 29102,868 29102,1345 29102,6638 29102,75912 29104,292 29105,439 29105,1033 29105,1590 29105,189128 29106,79 29107,29108 29109,4220 29110,1016 29110,1436 29111,2017 29112,292 29113,1983 29114,211 29115,1608 29116,346 29116,393 29116,538 29116,788 29116,980 29116,1033 29116,1068 29116,4611 29116,124994 29117,3085 29118,1858 29119,1860 29120,68 29120,240 29121,2224 29122,2274 29123,657 29124,2434 29125,6789 29126,2779 29128,1177 29128,2210 29128,182162 29130,1151 29130,1836 29131,5405 29133,240 29133,868 29134,605 29135,602 29135,620 29136,1240 29136,1623 29137,29138 29137,32756 29137,34433 29137,68482 29137,71327 29137,80348 29137,80971 29137,83526 29137,83532 29137,85487 29137,101111 29137,101319 29139,467 29140,392 29141,1392 29142,1179 29143,1238 29145,1001 29146,1544 29147,1179 29148,312 29149,72 29150,557 29151,111 29152,1149 29153,13546 29154,126 29155,1836 29156,304 29157,1983 29158,346 29159,1639 29160,7416 29161,3209 29162,1983 29163,388 29164,467 29164,872 29164,1151 29164,1893 29164,2443 29165,673 29165,749 29165,2312 29167,83 29167,315 29168,1140 29169,801 29170,1052 29171,2443 29172,1332 29173,247 29174,32 29175,592 29176,217 29177,222 29177,455 29177,1019 29177,1888 29177,2944 29178,1151 29179,366 29181,1381 29181,1579 29182,5101 29183,29184 29183,53237 29186,305 29188,298 29189,485 29190,557 29191,602 29192,136 29193,215 29194,875 29195,336 29195,1010 29195,5726 29196,86 29197,687 29198,1102 29199,605 29200,934 29201,5662 29202,140 29203,1381 29204,1849 29205,29206 29207,1893 29208,1715 29209,1955 29210,301 29211,1231 29212,5718 29213,752 29214,1564 29215,2083 29216,626 29217,390 29218,2620 29219,388 29220,5440 29221,1782 29222,3422 29223,1522 29224,2191 29225,907 29226,3194 29227,1167 29228,968 29229,3138 29230,3218 29231,3207 29232,1298 29233,720 29234,671 29235,589 29236,6068 29237,233 29238,1210 29239,1001 29240,3 29241,240 29242,1289 29243,302 29244,292 29245,2116 29246,252 29247,30 29248,2867 29248,2868 29248,22880 29249,149 29249,333 29250,4222 29252,50 29254,1453 29255,151 29256,10 29257,795 29258,1010 29259,1274 29259,18831 29260,389 29261,588 29261,590 29262,1419 29263,6068 29263,36761 29264,1805 29265,247 29266,483 29267,2681 29268,1151 29269,338 29269,462 29269,710 29269,1127 29269,1151 29269,1893 29270,3507 29271,29272 29273,779 29274,298 29275,861 29276,29277 29278,14989 29279,83 29280,158 29280,247 29281,602 29282,298 29283,485 29284,1151 29284,1711 29284,1836 29285,117 29285,994 29285,2712 29286,29287 29286,195980 29289,285 29290,298 29291,485 29292,17228 29293,1801 29295,264 29295,652 29295,1968 29296,6263 29297,188 29298,358 29299,9121 29300,577 29301,393 29302,298 29303,485 29304,875 29305,151 29306,158 29307,390 29308,563 29309,477 29310,760 29310,784 29310,1462 29310,2620 29310,8537 29311,932 29312,107 29313,87 29313,323 29313,1151 29313,1363 29313,1453 29313,2697 29314,376 29315,10 29316,1363 29317,1007 29318,389 29319,640 29320,1844 29321,5405 29322,217 29322,1001 29323,1433 29324,346 29325,29326 29327,143 29328,83 29328,126 29328,305 29328,668 29328,805 29328,941 29328,1058 29328,1326 29328,1479 29328,1837 29328,4487 29328,5250 29328,5718 29329,393 29330,344 29331,862 29332,29333 29334,147 29334,158 29334,333 29334,422 29334,1385 29335,5326 29336,784 29337,788 29337,1433 29338,264 29339,687 29339,1556 29340,2367 29341,557 29341,954 29341,1939 29342,538 29343,7757 29344,372 29345,392 29346,1 29347,29348 29349,29348 29350,29351 29352,160 29353,15 29353,54 29353,118 29353,349 29353,435 29353,1243 29353,1345 29353,1363 29353,1807 29353,3612 29353,4597 29353,8463 29354,298 29355,485 29356,2995 29357,34 29357,35 29357,536 29357,694 29357,4637 29358,7155 29359,272 29359,4455 29360,29361 29362,647 29363,10 29364,805 29364,2828 29365,640 29365,4192 29365,4193 29366,872 29367,1556 29368,1309 29369,211 29370,557 29371,557 29372,907 29373,1556 29374,30 29374,328 29376,636 29377,149 29378,1010 29379,29380 29381,346 29382,861 29383,2244 29384,147 29385,323 29387,30 29388,309 29388,310 29389,5212 29390,77 29391,302 29392,44 29393,1078 29394,29395 29396,360 29397,211 29398,302 29399,3451 29399,3452 29401,1001 29402,143 29402,1052 29403,10 29403,113156 29404,2006 29404,4222 29404,8855 29405,2292 29405,2889 29406,5908 29407,1531 29408,1983 29409,143 29410,4101 29411,1983 29412,671 29413,29414 29415,298 29416,485 29417,29418 29419,338 29420,481 29422,26 29422,59 29422,4571 29422,21944 29424,9560 29425,9560 29426,3949 29427,2671 29428,16045 29429,333 29430,269 29431,3148 29432,1515 29433,140 29433,911 29433,2915 29433,6119 29434,5101 29435,349 29435,1014 29435,1363 29436,505 29437,1010 29438,422 29439,56 29440,264 29440,1551 29440,1579 29440,5440 29440,49057 29441,35 29441,222 29441,283 29441,389 29441,536 29441,657 29441,781 29441,949 29441,1019 29441,1274 29441,1718 29441,1871 29441,1881 29441,1927 29441,2266 29441,2424 29441,2671 29441,2784 29441,4594 29441,6789 29441,6888 29441,8235 29441,29475 29442,2681 29443,2209 29444,450 29445,30 29446,433 29447,211 29448,111 29449,1363 29450,143 29451,779 29452,602 29453,2351 29454,8788 29455,1313 29456,8270 29457,602 29458,809 29459,2411 29460,171 29461,83 29462,338 29463,358 29464,261 29465,450 29466,143 29467,2719 29468,192 29469,1414 29470,1509 29471,422 29472,56 29473,9011 29473,9032 29476,450 29477,422 29478,422 29479,422 29480,422 29481,422 29482,94 29482,2787 29483,29484 29485,452 29485,457 29485,497 29485,535 29485,676 29485,918 29485,1655 29486,602 29487,29488 29489,346 29490,29491 29492,602 29493,10 29493,640 29494,207 29495,29496 29497,1368 29498,602 29498,620 29499,1796 29500,652 29501,255 29502,5440 29503,393 29504,29505 29506,99 29507,289 29507,290 29507,714 29507,2417 29508,450 29509,8854 29510,273 29510,274 29511,450 29512,577 29513,652 29514,1392 29515,3804 29516,3209 29517,1305 29518,450 29519,206 29520,29521 29522,563 29523,151 29523,158 29524,2379 29525,29526 29525,103872 29525,236824 29527,366 29528,366 29529,366 29530,366 29531,264 29531,515 29532,48 29532,35486 29533,233 29534,1 29535,6068 29536,515 29537,29538 29539,29540 29541,302 29542,420 29544,48 29544,1479 29545,1707 29546,1715 29547,392 29548,518 29549,450 29550,3413 29551,911 29551,29552 29553,481 29554,9323 29555,442 29555,2209 29556,330 29556,634 29558,6323 29558,29559 29558,69581 29558,115409 29558,129305 29558,149722 29567,9542 29568,647 29569,6424 29569,28107 29570,340 29571,17334 29572,104 29572,135 29572,138 29573,2915 29574,72 29576,644 29577,333 29578,106 29580,1634 29581,160 29582,306 29582,307 29583,346 29584,1724 29584,8270 29585,66 29585,920 29585,1433 29586,1 29587,72 29589,304 29589,932 29590,527 29591,15 29592,1893 29593,872 29593,1118 29593,1663 29594,1707 29595,34 29595,35 29595,81 29595,134 29595,240 29595,283 29595,392 29595,457 29595,536 29595,697 29595,838 29595,907 29595,949 29595,1014 29595,1019 29595,1085 29595,1118 29595,1140 29595,1151 29595,1210 29595,1332 29595,1715 29595,3367 29595,4355 29596,697 29596,3260 29597,2083 29598,5908 29599,1844 29600,918 29601,1298 29602,298 29603,485 29604,647 29605,861 29607,298 29608,2923 29608,4190 29609,4220 29610,34 29610,35 29610,192 29610,195 29610,298 29610,417 29610,455 29610,704 29610,1149 29610,1179 29610,1462 29610,1531 29610,3623 29610,4355 29610,8537 29610,27217 29610,33611 29612,349 29613,1509 29614,1188 29615,15119 29616,143 29617,4101 29618,264 29618,1381 29618,1509 29619,1085 29619,18726 29620,2373 29621,1858 29623,408 29625,240 29625,326 29625,873 29625,1801 29627,1363 29628,163 29628,489 29628,811 29629,1323 29630,274 29630,1116 29631,46 29631,86 29631,167 29631,301 29631,444 29631,567 29631,615 29631,783 29631,968 29631,1046 29631,1231 29631,1293 29631,1359 29631,1522 29631,1544 29631,1564 29631,1782 29631,1832 29631,1837 29631,2083 29631,2557 29631,2620 29631,3138 29631,3207 29631,3422 29631,5301 29631,5662 29631,20813 29632,893 29632,4823 29634,147 29635,872 29636,485 29637,557 29638,178 29638,406 29638,843 29638,868 29638,1220 29638,1222 29639,1436 29640,5405 29641,65 29641,66 29642,515 29643,485 29644,312 29644,2605 29646,1227 29646,1229 29646,21944 29646,86416 29648,920 29649,439 29649,1033 29649,1651 29649,2352 29649,18416 29649,32468 29649,32721 29649,32791 29649,54291 29649,55564 29649,68235 29649,68816 29649,85791 29649,86712 29649,103772 29649,125466 29649,128239 29649,145339 29649,172092 29649,176335 29649,177328 29649,228943 29649,250573 29649,258325 29650,143 29651,3 29652,14819 29653,999 29654,862 29655,1707 29656,1012 29657,1983 29658,579 29660,1877 29661,137 29662,104 29662,949 29663,422 29665,287 29666,1871 29667,907 29667,932 29668,140 29668,338 29668,1188 29668,1893 29669,1133 29670,30 29672,143 29674,579 29675,2590 29676,264 29676,1127 29676,1289 29676,1551 29676,1893 29677,623 29677,707 29677,1447 29677,1801 29677,1805 29678,63 29678,106 29678,259 29678,273 29678,1220 29678,1222 29678,6891 29679,5192 29680,10 29680,178 29681,2979 29682,358 29683,35 29684,240 29684,1955 29685,852 29686,459 29687,479 29687,749 29688,509 29688,510 29689,264 29690,1188 29691,1467 29692,2590 29693,516 29694,1707 29695,46 29696,349 29696,1188 29696,182733 29696,258973 29697,1326 29698,1332 29699,29700 29701,873 29702,1977 29702,1978 29704,3507 29704,3698 29705,1392 29706,891 29707,349 29708,1179 29709,338 29709,1893 29710,29711 29712,298 29713,467 29713,81233 29715,893 29716,111 29717,3161 29718,1509 29719,1801 29720,7698 29721,192 29721,557 29722,1531 29723,301 29724,83 29724,996 29724,1294 29725,29726 29727,1167 29728,30 29730,1836 29731,2590 29732,1983 29733,138 29734,1860 29735,79 29735,1368 29737,3695 29738,58 29739,3 29739,264 29739,16687 29740,200 29740,2376 29740,8133 29740,34883 29740,41240 29740,62267 29740,99807 29740,168311 29741,120 29741,694 29741,1419 29741,3115 29742,5212 29743,671 29743,868 29743,1417 29744,298 29745,1983 29746,1238 29747,586 29747,663 29747,664 29748,953 29749,29750 29749,38055 29751,1556 29752,1673 29753,3524 29753,4190 29754,389 29755,1298 29756,1454 29757,126 29757,392 29757,972 29757,1118 29757,1284 29758,1319 29759,968 29759,73570 29760,106 29760,301 29760,312 29760,358 29760,372 29760,388 29760,949 29760,968 29760,1001 29760,1068 29760,1167 29760,1231 29760,1454 29760,1722 29760,1837 29760,2083 29760,3207 29760,3538 29760,3612 29760,5301 29760,5440 29760,5662 29762,397 29763,349 29764,1608 29765,287 29766,302 29767,83 29767,315 29768,3328 29769,485 29770,222 29771,336 29772,1298 29774,102 29775,107 29776,3467 29778,1983 29779,302 29781,1241 29782,485 29783,5987 29784,56 29785,264 29785,571 29785,1673 29785,1888 29785,2979 29785,3297 29785,160055 29786,397 29786,1191 29787,240 29788,2506 29789,852 29789,136072 29790,333 29791,163 29791,579 29792,698 29793,356 29793,5591 29794,640 29795,1732 29796,1119 29797,312 29800,8270 29801,50 29802,309 29802,310 29803,158 29804,2674 29805,206 29806,1983 29807,450 29808,1452 29809,626 29810,275 29811,1105 29812,3507 29813,1001 29814,202 29814,203 29814,602 29815,298 29816,275 29818,1983 29819,29820 29821,222 29822,536 29823,668 29824,2266 29825,83 29826,200 29827,240 29828,389 29828,455 29828,536 29828,1608 29828,2784 29829,644 29830,192 29830,344 29831,248 29832,1983 29833,143 29834,664 29835,175 29836,302 29837,192 29837,760 29837,1631 29838,102 29838,557 29839,5405 29840,146 29840,92476 29841,596 29842,1010 29842,1849 29843,5547 29844,4 29844,5 29845,147 29845,406 29845,779 29845,1181 29845,1515 29846,452 29847,32 29847,349 29847,575 29847,697 29847,3260 29848,1151 29848,1453 29848,1688 29848,3258 29849,1479 29850,1210 29852,1265 29852,1266 29853,872 29853,1579 29853,1893 29853,191860 29854,106 29854,140 29854,302 29854,358 29854,372 29854,388 29854,875 29854,949 29854,968 29854,1001 29854,1068 29854,1309 29854,1370 29854,1722 29854,1837 29854,2083 29854,2979 29854,3207 29854,3538 29854,5301 29854,5440 29855,516 29856,310 29856,358 29856,615 29856,931 29856,1119 29856,2244 29856,3039 29858,72 29859,287 29859,862 29859,27041 29860,30 29861,626 29862,83 29863,347 29864,1033 29865,1 29866,127158 29867,623 29868,827 29868,1877 29868,2353 29868,21442 29868,40497 29869,83 29870,346 29870,538 29870,1001 29870,220502 29871,186 29871,433 29872,2775 29873,4980 29874,1968 29876,1983 29877,217 29877,302 29878,827 29879,2051 29880,30 29881,2784 29882,338 29883,79 29883,273 29883,313 29883,931 29883,1127 29884,2784 29885,7698 29886,264 29886,283 29886,809 29886,1590 29886,1782 29886,2646 29886,5213 29887,392 29887,1454 29887,1722 29890,192 29890,264 29890,301 29890,336 29890,392 29890,516 29890,525 29890,843 29890,1014 29890,1130 29890,1179 29890,1210 29890,1659 29890,1844 29890,4355 29891,366 29891,61660 29891,67628 29892,247 29892,269 29892,1070 29892,1634 29893,83 29893,285 29893,2779 29893,2784 29893,28130 29894,859 29895,60576 29896,406 29897,626 29899,302 29899,579 29899,861 29900,333 29901,356 29901,1140 29903,264 29904,66 29905,953 29906,435 29906,16614 29907,107 29910,50 29910,1572 29911,264 29912,859 29913,720 29914,2699 29915,920 29916,310 29916,515 29916,3039 29918,344 29919,874 29920,302 29921,10 29922,289 29922,290 29922,2315 29923,636 29924,366 29925,182 29926,1531 29928,1052 29929,1631 29930,424 29931,302 29932,2073 29933,83 29934,344 29934,693 29935,2989 29935,2991 29936,4078 29937,702 29937,874 29937,1210 29938,536 29938,17346 29939,147 29939,149 29939,158 29939,622 29941,50 29942,356 29943,256 29944,217 29944,500 29944,760 29944,1210 29944,1724 29944,4831 29945,2073 29945,4831 29946,852 29947,301 29947,1837 29948,1858 29949,1860 29950,2266 29951,252 29951,1220 29951,1222 29952,264 29953,273 29953,274 29954,28130 29955,1326 29957,29958 29957,128562 29959,10 29960,252 29960,41170 29961,704 29962,240 29963,577 29964,406 29965,4 29965,5 29965,251 29965,422 29965,663 29965,664 29965,893 29965,1070 29965,1118 29965,1135 29965,2812 29965,3555 29965,4637 29965,4691 29965,37414 29966,143 29966,1052 29967,143 29968,192 29969,143 29969,1433 29969,6803 29970,151 29971,298 29972,485 29973,640 29974,301 29975,292 29976,596 29977,422 29978,56 29979,957 29979,1815 29980,294 29981,264 29983,875 29984,151 29985,356 29985,6068 29986,704 29987,1122 29987,8235 29987,22799 29988,30 29988,393 29988,493 29988,1265 29988,1266 29989,392 29990,30 29990,4260 29990,4980 29991,247 29992,10 29993,483 29994,72 29995,247 29996,376 29997,885 29998,86 29999,30000 29999,38011 30001,652 30002,151 30002,206 30002,1096 30003,1893 30004,704 30005,1983 30006,393 30006,1531 30007,1531 30009,1181 30010,602 30011,30012 30011,92345 30013,1010 30014,2205 30014,2206 30015,2367 30016,298 30017,376 30018,376 30019,626 30020,479 30021,1782 30022,4611 30023,483 30024,11147 30025,217 30025,222 30026,9025 30027,406 30028,4611 30029,130 30030,192 30031,596 30032,346 30033,346 30034,2244 30035,147 30035,149 30035,406 30036,346 30037,30038 30037,36345 30039,143 30040,346 30041,83 30041,315 30041,435 30041,929 30041,991 30041,1400 30041,3804 30041,5213 30042,68 30043,285 30043,1644 30044,298 30045,485 30046,1001 30047,298 30048,485 30049,2750 30050,1572 30052,247 30053,2574 30054,622 30054,1392 30055,25 30055,2088 30056,255 30057,48 30058,72 30059,298 30060,485 30061,8373 30062,250 30063,481 30064,392 30065,143 30066,30067 30068,372 30069,30070 30071,83 30072,192 30073,485 30074,2701 30075,146 30076,298 30077,485 30078,8854 30079,5375 30080,178 30081,563 30082,30083 30084,119 30084,151 30084,192 30084,309 30084,310 30084,577 30084,1400 30084,2073 30084,13910 30084,21944 30085,736 30086,2989 30086,2991 30087,217 30087,536 30088,372 30088,1718 30088,1871 30089,10 30090,298 30091,485 30092,1644 30093,657 30094,557 30095,557 30096,4980 30097,392 30097,872 30098,298 30099,485 30100,2590 30101,861 30102,2073 30103,10 30104,862 30105,30106 30105,43769 30105,60789 30105,62108 30105,62703 30105,63152 30105,63776 30107,861 30108,1849 30109,298 30110,485 30112,1019 30113,1983 30114,72 30115,83 30115,509 30115,1019 30115,1467 30115,3409 30115,5911 30115,7572 30115,8788 30115,8855 30117,72 30118,44 30119,30120 30121,1559 30122,477 30123,1983 30124,704 30125,107 30126,30127 30126,237789 30128,72 30129,30130 30131,175 30132,30133 30134,885 30135,450 30136,450 30137,536 30138,450 30139,310 30139,3039 30140,2244 30141,7360 30142,2105 30143,4192 30143,4193 30144,10 30145,30146 30147,30148 30149,30148 30150,417 30151,333 30151,640 30152,631 30153,873 30153,1243 30154,1058 30155,422 30156,422 30157,422 30158,422 30159,422 30160,422 30161,346 30162,422 30163,682 30164,1531 30165,323 30166,422 30167,346 30168,602 30169,68 30170,338 30171,30172 30171,36384 30171,48563 30171,52253 30171,52371 30171,53121 30171,54231 30171,58601 30171,59274 30173,1010 30174,505 30175,30176 30177,557 30178,4355 30179,941 30180,1274 30181,30182 30183,72 30184,30185 30186,9026 30187,30188 30189,258 30190,714 30191,301 30191,444 30191,968 30192,192 30192,392 30192,1127 30192,1773 30192,4823 30192,9007 30192,30193 30192,52653 30192,52974 30192,102117 30192,170227 30192,251687 30194,323 30195,30196 30197,104 30197,134 30198,326 30199,30200 30201,104 30201,134 30201,135 30202,602 30203,703 30205,346 30207,126 30208,4453 30209,104 30209,134 30209,135 30211,652 30212,292 30213,195 30214,3447 30215,1102 30216,1309 30217,671 30218,4177 30219,137 30220,72 30221,30222 30223,4475 30224,1285 30225,2296 30226,30227 30228,2351 30229,1429 30230,652 30231,2048 30232,81 30233,287 30234,8822 30235,30236 30237,3413 30238,72 30239,30240 30241,233 30242,72 30243,872 30244,30245 30244,80469 30246,30245 30247,30245 30248,30245 30249,30245 30250,30245 30251,30245 30252,30245 30253,167 30253,1231 30253,2083 30254,1235 30254,1335 30255,602 30256,366 30257,366 30258,366 30259,366 30260,736 30261,872 30262,1639 30263,30264 30266,779 30267,459 30268,134 30268,332 30268,364 30268,636 30268,694 30268,749 30268,760 30268,999 30268,1119 30268,1388 30268,1955 30268,2205 30268,3328 30268,27041 30268,33424 30269,483 30270,171 30271,22 30272,32 30273,346 30274,349 30274,697 30275,388 30276,1289 30277,32 30278,644 30279,579 30281,306 30281,307 30282,211 30283,609 30284,143 30285,21944 30286,87 30286,931 30286,2617 30287,273 30287,274 30289,425 30289,1276 30290,795 30291,1 30292,1402 30293,818 30295,1707 30296,634 30296,852 30296,4252 30297,10 30297,34 30297,35 30297,79 30297,167 30297,259 30297,305 30297,312 30297,358 30297,393 30297,435 30297,439 30297,518 30297,563 30297,589 30297,631 30297,640 30297,660 30297,779 30297,1014 30297,1149 30297,1177 30297,1210 30297,1402 30297,1572 30297,1603 30297,1837 30297,1871 30297,2411 30297,2995 30297,4748 30297,6487 30297,21944 30297,68725 30297,74245 30297,78030 30297,120055 30298,875 30300,83 30301,481 30301,14674 30302,37 30302,71 30302,278 30302,292 30302,304 30302,338 30302,390 30302,467 30302,485 30302,920 30302,1231 30302,1740 30302,1782 30302,2572 30302,4220 30302,6059 30302,6068 30303,907 30303,932 30304,571 30304,818 30304,2775 30305,536 30306,968 30308,4672 30308,18831 30309,30310 30311,206 30312,302 30312,687 30312,2116 30313,184 30314,302 30316,79 30317,1175 30317,1452 30317,4637 30319,58 30319,292 30319,379 30319,557 30319,626 30319,644 30319,660 30319,668 30319,673 30319,712 30319,745 30319,843 30319,859 30319,1122 30319,1147 30319,1179 30319,1707 30319,2411 30319,2701 30319,3999 30320,30321 30323,1167 30324,46 30324,744 30326,347 30327,1298 30328,694 30328,3182 30329,2590 30331,1 30331,56 30331,146 30331,147 30331,158 30331,175 30331,192 30331,206 30331,336 30331,406 30331,422 30331,446 30331,601 30331,602 30331,841 30331,1089 30331,1181 30331,1425 30331,1464 30331,1515 30331,1518 30331,1601 30331,1619 30331,1623 30331,1825 30331,1992 30331,2254 30331,2374 30331,5424 30331,5647 30331,5651 30331,5726 30331,5815 30331,6119 30331,7296 30331,8070 30331,14091 30331,14433 30331,14507 30331,15795 30331,16497 30331,17143 30331,19592 30331,22313 30331,22317 30331,22616 30331,23783 30331,24511 30331,27175 30331,30331 30331,30332 30331,30427 30331,30428 30331,30429 30331,32663 30331,32753 30331,34328 30331,34879 30331,34963 30331,35357 30331,35439 30331,35680 30331,36417 30331,36435 30331,37568 30331,38834 30331,38882 30331,38975 30331,38985 30331,39035 30331,39532 30331,39539 30331,39547 30331,43277 30331,54582 30331,55023 30331,55075 30331,58920 30331,58954 30331,60576 30331,62215 30331,63450 30331,63472 30331,64573 30331,65809 30331,66671 30331,70131 30331,72744 30331,75045 30331,77650 30331,77874 30331,79768 30331,80022 30331,84749 30331,86697 30331,87309 30331,87331 30331,87387 30331,93778 30331,94130 30331,94254 30331,95302 30331,96665 30331,96721 30331,98429 30331,101826 30331,102465 30331,102576 30331,104337 30331,104346 30331,104347 30331,106956 30331,107430 30331,108099 30331,108103 30331,110033 30331,115968 30331,115969 30331,115970 30331,116554 30331,116555 30331,116556 30331,117103 30331,122532 30331,130859 30331,131388 30331,132456 30331,132903 30331,133003 30331,134716 30331,140475 30331,140855 30331,143386 30331,143493 30331,143575 30331,146696 30331,150111 30331,150226 30331,152165 30331,161541 30331,162774 30331,163730 30331,163978 30331,164469 30331,164957 30331,164963 30331,164964 30331,164965 30331,164966 30331,164970 30331,165776 30331,171076 30331,171715 30331,178719 30331,180281 30331,180305 30331,183763 30331,193610 30331,195549 30331,212569 30331,212573 30333,30334 30333,53750 30333,126225 30333,163766 30333,166337 30333,167479 30333,175829 30333,188575 30333,212487 30333,221079 30335,143 30336,1149 30337,758 30338,143 30339,302 30340,143 30341,718 30342,5102 30343,1858 30344,838 30344,1014 30344,1181 30345,714 30346,973 30346,1544 30347,1309 30348,6750 30349,835 30350,994 30350,1235 30350,1335 30351,72 30352,2674 30354,731 30354,4691 30355,2089 30355,2940 30355,21944 30358,2048 30359,217 30361,37 30361,349 30361,1298 30361,3193 30361,3260 30363,1659 30364,1179 30365,1181 30365,30331 30366,1871 30367,3422 30368,5 30368,94 30368,116 30368,117 30368,118 30368,290 30368,307 30368,590 30368,954 30368,957 30368,1222 30368,1235 30368,1253 30368,1266 30368,1462 30368,1511 30368,1512 30368,1684 30368,2089 30368,2210 30368,2417 30368,2991 30368,3370 30368,3794 30368,5359 30368,13704 30368,17245 30368,30331 30368,33424 30368,56150 30368,58979 30368,72439 30368,92476 30368,94134 30368,163964 30368,164572 30369,30331 30369,30370 30369,34878 30371,1400 30372,23011 30373,104 30373,134 30373,136 30373,137 30373,167 30373,186 30373,217 30373,278 30373,290 30373,292 30373,372 30373,392 30373,509 30373,510 30373,623 30373,862 30373,875 30373,907 30373,1210 30373,1284 30373,1417 30373,1805 30373,1837 30373,1939 30373,2191 30373,3999 30373,4771 30373,75912 30374,158 30375,2574 30376,467 30376,1133 30376,1298 30376,1955 30378,19010 30379,2674 30380,338 30380,525 30381,147 30381,158 30381,333 30381,406 30381,586 30381,663 30381,664 30381,779 30381,841 30381,980 30381,1247 30381,1943 30381,2931 30381,4192 30381,4193 30381,8270 30381,8822 30381,31237 30383,206 30385,579 30385,622 30385,1227 30385,1229 30387,4276 30388,4831 30390,292 30391,1 30394,58 30395,46 30396,301 30396,1293 30397,2979 30400,671 30400,1877 30401,143 30403,58 30404,46 30405,631 30405,760 30405,2620 30406,289 30406,290 30407,953 30408,503 30408,1140 30408,2436 30409,278 30409,2168 30410,1837 30411,500 30412,1962 30413,1052 30414,1882 30415,2775 30416,54 30417,2210 30417,4237 30419,346 30420,536 30420,2168 30420,30421 30420,80306 30420,81847 30422,50 30422,147 30422,158 30422,192 30422,333 30422,406 30422,779 30422,1181 30422,1515 30422,2244 30423,590 30423,1419 30424,920 30426,932 30430,652 30432,349 30433,149 30433,251 30433,586 30433,920 30434,22 30435,2460 30436,30393 30437,1882 30438,949 30439,346 30441,264 30443,289 30443,290 30443,588 30443,590 30443,8180 30444,872 30445,301 30445,525 30445,717 30446,264 30446,1289 30446,1509 30446,1551 30446,3041 30447,1983 30449,452 30450,356 30450,852 30450,5591 30451,7 30452,301 30452,604 30454,2073 30455,182 30455,1118 30455,19005 30456,50 30456,273 30456,274 30456,333 30456,483 30456,1130 30456,1285 30456,1927 30456,30331 30457,392 30457,697 30457,3003 30458,149 30458,202 30458,406 30458,920 30459,455 30459,862 30459,949 30460,97 30461,58 30462,46 30463,143 30464,346 30465,30466 30470,579 30471,26 30471,59 30471,116 30471,2087 30471,2674 30471,16153 30472,424 30473,2775 30474,447 30475,3297 30476,292 30477,346 30479,6803 30480,273 30480,1458 30482,1313 30483,784 30484,980 30484,1298 30485,874 30485,972 30485,1085 30485,75912 30486,4611 30487,1544 30488,4611 30489,1544 30490,1388 30491,1167 30492,3769 30492,4252 30492,15609 30493,107 30495,209 30496,5591 30500,907 30500,932 30501,111 30501,1212 30502,120 30502,136 30502,137 30502,206 30502,269 30502,285 30502,302 30502,309 30502,310 30502,346 30502,438 30502,536 30502,599 30502,660 30502,795 30502,818 30502,1374 30502,2274 30502,2699 30502,14556 30502,19443 30503,1877 30504,1977 30504,1978 30505,41 30505,344 30505,455 30505,1012 30505,1177 30506,1019 30507,217 30507,1796 30507,1844 30507,3804 30509,32 30510,4611 30511,1544 30512,4611 30513,1544 30514,22 30515,158 30516,135 30517,34 30517,35 30518,106 30519,6051 30519,101473 30520,1140 30521,1655 30522,849 30522,1789 30523,1085 30524,698 30525,1 30526,1146 30527,302 30527,596 30528,68 30529,2674 30530,151 30531,247 30532,349 30532,575 30532,697 30532,3260 30535,2312 30536,1608 30537,3161 30538,30539 30540,202 30540,203 30541,1881 30543,3297 30545,1466 30546,788 30549,283 30549,358 30550,2244 30551,252 30552,1590 30553,192 30553,2775 30554,4190 30555,302 30556,577 30557,20 30557,146 30557,248 30557,280 30557,313 30557,602 30557,685 30557,775 30557,827 30557,841 30557,849 30557,1844 30557,2460 30557,6119 30557,13538 30557,17245 30557,92476 30559,313 30560,1801 30561,873 30562,631 30563,579 30563,4823 30565,151 30566,326 30568,24 30568,298 30568,649 30568,1745 30568,2089 30568,2775 30568,2940 30568,4079 30569,209 30569,5213 30570,1515 30571,2421 30571,28130 30572,424 30573,1140 30573,5547 30574,2674 30575,309 30575,310 30576,1509 30577,68 30577,240 30577,571 30577,818 30577,1619 30577,1715 30577,2512 30577,66297 30577,102560 30577,127158 30577,191355 30578,171 30579,30580 30580,609 30581,406 30582,712 30582,154408 30583,1724 30584,22 30585,420 30586,119 30586,693 30587,420 30588,872 30589,333 30590,862 30590,2590 30590,3507 30591,217 30591,1019 30591,1118 30591,1454 30591,1465 30591,1849 30592,10 30592,97 30593,30594 30595,758 30597,206 30599,2782 30600,137 30600,1432 30601,34 30601,35 30601,217 30601,536 30601,1417 30601,18831 30602,1977 30602,1978 30603,392 30604,24763 30605,862 30606,22 30606,2116 30606,2210 30606,4237 30606,182162 30607,611 30608,298 30609,485 30610,22 30611,493 30611,1265 30611,1266 30612,2674 30613,211 30614,483 30615,493 30616,795 30616,3094 30618,862 30619,247 30620,81 30621,247 30623,1353 30624,1634 30625,1102 30626,687 30627,5662 30628,515 30629,1381 30630,8798 30631,1893 30632,417 30633,1231 30634,1564 30635,301 30636,2620 30637,2083 30638,586 30639,390 30640,1767 30641,388 30642,7572 30643,1837 30644,5440 30645,3193 30646,1241 30647,1522 30648,1782 30649,2191 30650,3194 30651,1167 30652,907 30653,968 30654,1544 30655,3207 30656,3138 30657,3218 30658,2557 30659,4453 30660,346 30661,439 30662,1644 30663,6068 30664,3 30665,333 30666,1289 30667,240 30668,3999 30669,493 30670,68 30671,1143 30672,65 30673,406 30673,779 30673,8270 30674,433 30674,1210 30675,3585 30676,30677 30676,50810 30676,53491 30676,59288 30676,66753 30676,96147 30676,96877 30676,101143 30676,105294 30676,108398 30676,111084 30676,129423 30676,131584 30676,134399 30676,150744 30676,153077 30676,167850 30676,172675 30676,173577 30676,199970 30676,203482 30676,218625 30676,241785 30676,248370 30679,34 30679,35 30681,1019 30682,252 30682,318 30683,818 30683,1151 30685,841 30686,1359 30687,137 30688,250 30688,972 30690,1227 30690,1229 30691,63 30691,137 30691,22293 30692,622 30692,1309 30692,2674 30692,16153 30693,30693 30694,920 30695,17228 30697,6263 30698,151 30699,7 30700,1019 30701,4895 30703,1590 30704,178 30704,980 30705,34 30705,35 30705,217 30705,358 30705,1805 30706,406 30707,714 30707,760 30708,861 30710,366 30711,536 30712,9457 30713,106 30714,1556 30715,143 30716,366 30717,37 30717,301 30717,1411 30717,1782 30718,130 30719,307 30719,682 30719,784 30720,20 30720,1179 30721,536 30721,18831 30722,160 30722,1381 30723,151 30724,344 30725,6303 30726,5405 30727,34 30727,35 30728,652 30728,1893 30728,6695 30729,1718 30730,1068 30731,13137 30732,298 30733,104 30733,134 30733,135 30733,227 30733,372 30733,588 30733,590 30733,596 30733,631 30733,704 30733,784 30733,1052 30733,1119 30733,1368 30733,2775 30733,4771 30735,217 30735,1417 30735,4672 30735,18831 30736,83 30736,217 30736,536 30736,18831 30737,877 30738,298 30739,485 30740,1381 30741,298 30742,485 30743,1132 30744,781 30746,211 30746,2116 30747,50 30748,158 30748,1181 30749,50 30750,247 30751,2590 30752,30753 30754,1983 30756,2903 30756,30757 30756,30758 30756,30760 30759,5101 30762,273 30762,274 30762,333 30762,30331 30763,595 30763,1572 30764,457 30764,535 30765,30766 30767,143 30767,1052 30768,1983 30769,50 30769,79 30770,15 30770,111 30770,292 30770,441 30770,1238 30770,1688 30770,1973 30770,2292 30770,2697 30770,2889 30770,3507 30771,872 30772,30773 30774,302 30774,372 30774,1370 30775,192 30775,203 30775,272 30775,346 30775,447 30775,579 30775,602 30775,671 30775,934 30775,996 30775,1294 30775,1590 30775,1644 30775,7757 30775,31207 30775,33298 30776,493 30776,1265 30776,1266 30777,1010 30778,1983 30779,72 30780,697 30781,30782 30781,69110 30781,86070 30783,1143 30783,4252 30784,1963 30785,435 30786,94 30786,2787 30787,83 30787,2266 30787,3252 30788,302 30789,2372 30790,744 30791,83 30792,30793 30794,626 30795,1849 30796,832 30797,19005 30798,261 30798,333 30798,4192 30798,4193 30799,1749 30801,9195 30802,3260 30803,783 30804,615 30805,2995 30806,333 30807,30808 30809,647 30810,344 30811,72 30812,225 30813,1434 30814,137 30815,273 30815,274 30816,1085 30817,1983 30818,557 30819,34 30819,35 30820,557 30821,83 30822,595 30822,1332 30822,1572 30823,953 30824,483 30824,1359 30825,1571 30826,779 30827,589 30828,151 30829,289 30829,290 30830,1983 30831,206 30831,222 30831,760 30831,1019 30832,424 30833,83 30834,589 30834,1411 30835,278 30836,8270 30837,2244 30838,264 30839,107 30839,698 30839,1782 30839,3297 30840,788 30841,1619 30842,48 30842,304 30843,217 30843,1417 30844,3872 30845,86 30846,1551 30847,605 30848,192 30849,934 30850,140 30851,1849 30852,717 30853,1955 30854,5718 30855,752 30856,622 30857,4549 30858,178 30859,1590 30860,626 30861,3422 30862,1298 30863,720 30864,671 30865,1010 30866,589 30867,1210 30868,973 30869,30870 30871,483 30872,356 30872,415 30872,852 30872,21982 30873,211 30873,1149 30874,949 30875,1871 30876,30877 30878,72 30879,344 30880,285 30881,83 30882,515 30884,44 30885,83 30887,106 30888,86 30888,167 30888,240 30888,301 30888,372 30888,444 30888,567 30888,589 30888,605 30888,615 30888,631 30888,720 30888,801 30888,907 30888,968 30888,972 30888,973 30888,1010 30888,1122 30888,1124 30888,1140 30888,1167 30888,1231 30888,1241 30888,1284 30888,1298 30888,1309 30888,1436 30888,1522 30888,1544 30888,1564 30888,1782 30888,1785 30888,1818 30888,1837 30888,1893 30888,1955 30888,2083 30888,2191 30888,2372 30888,2557 30888,2620 30888,2979 30888,3193 30888,3207 30888,3218 30889,222 30890,1204 30891,1881 30892,1243 30893,455 30894,602 30895,192 30895,333 30895,1634 30895,2574 30896,83 30897,7360 30898,272 30899,87 30899,349 30899,595 30899,1014 30899,1143 30899,1363 30899,2274 30899,29380 30900,15068 30902,273 30902,274 30903,366 30903,500 30903,718 30903,1149 30903,1631 30904,602 30905,22 30905,211 30905,788 30905,8270 30906,72 30907,500 30908,1962 30909,1052 30910,1882 30911,2775 30912,54 30913,2210 30913,4237 30915,438 30916,622 30917,202 30917,203 30918,7698 30919,99 30920,283 30920,1274 30921,949 30921,6789 30922,358 30923,48 30924,30 30925,72 30926,1235 30926,1335 30927,1388 30928,346 30929,602 30930,26 30930,59 30931,99 30932,697 30933,3148 30934,388 30935,99 30936,640 30936,1181 30937,99 30938,4594 30939,682 30939,1353 30939,72439 30940,72 30941,2867 30941,2868 30941,22880 30942,22 30943,147 30943,158 30943,422 30943,1181 30943,80266 30944,8270 30945,8270 30946,10 30946,113156 30947,704 30948,704 30949,417 30950,422 30951,422 30952,422 30953,422 30954,422 30955,422 30956,422 30957,422 30958,171 30959,1414 30960,34 30960,35 30960,202 30960,203 30960,623 30960,949 30960,1467 30960,2784 30960,4549 30961,424 30962,2590 30963,417 30963,1274 30964,2697 30965,72 30966,18726 30967,72 30968,344 30969,285 30970,9027 30971,87 30971,207 30972,805 30973,3447 30974,254 30975,602 30976,2646 30977,1085 30978,30979 30980,240 30981,30982 30983,390 30984,292 30984,483 30984,644 30984,707 30984,1012 30984,1096 30984,1127 30984,1298 30984,2699 30984,3999 30984,5469 30985,366 30986,2116 30987,30 30988,2051 30989,22 30990,252 30991,151 30992,10 30993,1305 30994,2674 30995,872 30997,138 30999,10 30999,175 30999,333 30999,485 30999,663 30999,664 30999,693 30999,14366 30999,14483 31000,17309 31001,623 31001,1119 31001,1805 31002,392 31002,874 31002,1454 31003,68 31003,852 31003,1010 31004,171 31005,2590 31005,66297 31006,233 31007,298 31008,485 31009,1010 31011,1127 31011,2699 31012,1559 31013,79 31014,1010 31015,505 31016,9026 31017,3585 31018,1313 31019,1276 31020,163 31022,158 31023,79 31023,1433 31023,21944 31024,920 31024,5213 31025,31026 31027,3295 31028,1247 31029,644 31031,72 31032,801 31033,1117 31034,760 31034,1631 31035,694 31035,6638 31036,1082 31037,306 31037,307 31038,72 31039,1718 31039,5034 31040,292 31041,818 31042,44 31043,1332 31044,31045 31044,32000 31044,39809 31044,47080 31044,47481 31044,56373 31046,1985 31047,2931 31048,1983 31049,4 31049,5 31050,4 31050,5 31052,671 31053,298 31054,485 31055,509 31055,852 31055,875 31056,302 31057,1147 31058,184 31059,31060 31061,640 31062,640 31063,298 31064,485 31065,1556 31066,1133 31067,30 31067,328 31067,3538 31069,31070 31071,1181 31072,31073 31074,19 31074,2266 31075,1007 31075,1579 31076,1147 31077,1247 31077,1644 31077,1844 31078,346 31079,2574 31080,3 31080,509 31080,510 31080,663 31081,647 31082,344 31083,1891 31085,509 31085,510 31086,392 31088,31089 31088,92704 31088,126459 31088,126936 31088,129521 31088,149594 31088,200363 31088,212311 31088,233218 31088,241506 31088,244210 31090,163 31090,280 31090,455 31090,1247 31090,1332 31090,1888 31090,1983 31090,17245 31090,189842 31091,287 31091,809 31091,19010 31092,271 31093,2105 31094,586 31094,663 31094,664 31095,1891 31096,3041 31097,2784 31098,298 31099,485 31100,217 31101,58 31102,18726 31103,47 31103,48 31103,102 31103,1133 31103,2469 31104,2048 31106,1119 31106,1801 31106,3182 31107,58 31108,46 31111,3524 31112,1323 31113,102 31114,1326 31115,408 31116,160 31116,515 31116,647 31116,835 31116,1289 31116,1893 31116,2312 31117,518 31118,304 31118,444 31118,589 31118,631 31118,720 31118,877 31118,907 31118,932 31118,968 31118,972 31118,973 31118,1001 31118,1010 31118,1085 31118,1117 31118,1122 31118,1284 31118,1715 31118,1732 31118,1837 31118,1849 31118,1962 31118,2191 31118,22799 31119,31120 31121,31122 31122,408 31122,1113 31122,1326 31122,31122 31122,98805 31122,258851 31122,260338 31123,1132 31124,781 31125,58 31125,1177 31126,313 31127,1893 31127,4039 31128,31129 31130,225 31131,1983 31132,887 31132,994 31133,1983 31134,298 31135,485 31138,918 31139,302 31140,140 31140,195 31141,392 31142,2775 31143,447 31145,41 31145,63 31145,151 31145,557 31145,571 31145,586 31145,657 31145,835 31145,843 31145,852 31145,1082 31145,1227 31145,1229 31145,6789 31145,17886 31145,20004 31146,2411 31147,392 31148,252 31148,41170 31149,801 31150,1749 31150,2605 31151,1673 31152,252 31152,41170 31153,392 31153,433 31153,1634 31154,31155 31154,60027 31157,2334 31158,589 31158,1653 31158,92476 31159,104 31159,134 31159,137 31159,138 31160,631 31161,1127 31162,503 31163,663 31163,664 31165,1983 31166,195 31167,581 31168,7360 31169,72 31170,192 31170,346 31170,439 31170,588 31170,590 31170,671 31171,500 31172,920 31172,1623 31173,1212 31174,640 31176,720 31176,877 31176,907 31176,1001 31176,1117 31176,2083 31176,9024 31177,252 31177,493 31177,1243 31178,596 31179,143 31180,7 31180,452 31180,3538 31180,3846 31180,14989 31181,1849 31182,79 31183,206 31184,119 31184,483 31184,1400 31184,3089 31184,3524 31184,3695 31184,31206 31185,718 31186,50 31186,192 31187,1756 31187,2989 31187,2991 31188,31189 31190,163 31190,302 31190,861 31191,1711 31191,1836 31192,4810 31193,704 31194,304 31196,1167 31197,261 31197,1749 31199,1181 31199,1388 31200,1001 31201,1392 31202,1424 31204,932 31205,408 31205,37088 31206,272 31206,766 31206,939 31206,18249 31206,159762 31206,216594 31206,251409 31208,994 31208,1300 31209,13136 31210,1181 31211,980 31211,2979 31212,657 31212,718 31212,3507 31212,21982 31213,31214 31215,1415 31216,337 31216,852 31219,306 31219,307 31220,337 31221,1113 31222,178 31222,439 31222,1776 31223,861 31225,1912 31226,663 31226,664 31226,1370 31227,647 31227,1175 31228,50 31229,211 31231,1522 31231,2557 31232,3297 31233,302 31234,31235 31236,104 31236,134 31236,135 31238,273 31238,274 31238,240174 31239,14472 31240,19227 31241,195 31242,332 31243,200 31243,248 31244,314 31245,1688 31246,192 31246,1392 31247,1033 31248,34 31248,35 31250,65 31251,393 31252,801 31253,267 31255,392 31255,1732 31255,2191 31256,647 31257,3161 31258,992 31258,8270 31259,72 31260,344 31261,285 31262,393 31263,147 31263,1370 31264,272 31265,158 31266,479 31267,534 31267,535 31269,1007 31269,1381 31269,1458 31269,5440 31270,2674 31271,106 31272,366 31273,717 31274,31275 31276,206 31277,841 31278,788 31278,1732 31278,2775 31278,15807 31279,143 31280,34 31280,126 31280,314 31280,392 31280,433 31280,467 31280,872 31280,1087 31280,1118 31280,1130 31280,1465 31281,596 31282,794 31283,338 31283,1298 31284,920 31285,1181 31286,1977 31286,1978 31287,2867 31287,2868 31288,571 31289,158 31289,422 31289,1181 31290,71 31291,31292 31293,525 31294,1001 31294,1284 31295,3999 31296,299 31297,22 31298,302 31298,344 31298,579 31298,2116 31298,142426 31299,1012 31299,1241 31300,10 31300,30 31300,41 31300,97 31300,175 31300,200 31300,336 31300,1847 31302,41 31302,104 31302,200 31302,397 31302,862 31302,1119 31302,2995 31302,44725 31302,75912 31302,127158 31303,1 31303,467 31303,693 31304,491 31305,147 31306,1243 31306,1512 31306,2674 31306,2867 31306,2868 31306,16153 31307,2867 31307,2868 31307,22880 31309,219 31310,783 31310,3218 31311,1133 31312,255 31312,1181 31313,1007 31315,187 31316,31317 31318,1210 31319,485 31320,811 31321,143 31322,3507 31323,500 31324,1962 31325,1052 31326,1882 31327,2775 31328,54 31329,2210 31329,4237 31330,280 31331,31332 31331,31540 31331,74874 31331,79138 31331,83037 31333,2674 31334,557 31335,372 31335,388 31335,626 31335,1284 31336,1531 31337,158 31338,1359 31339,147 31339,2244 31339,42064 31340,920 31341,980 31341,1429 31342,5265 31344,5469 31345,304 31347,360 31347,1893 31348,10 31350,195 31351,1140 31351,5547 31353,184 31355,79 31356,2244 31357,149 31358,104 31358,217 31358,1939 31359,518 31360,536 31360,781 31360,18831 31361,779 31362,32 31362,483 31362,509 31362,534 31362,557 31362,1572 31362,75912 31363,314 31363,687 31364,302 31364,2116 31366,1509 31367,1179 31368,30 31368,328 31369,86 31369,167 31369,240 31369,301 31369,567 31369,605 31369,631 31369,968 31369,972 31369,973 31369,1122 31369,1160 31369,1359 31369,1436 31369,1479 31369,1564 31369,1785 31369,1832 31369,1837 31369,2083 31369,2191 31369,2557 31369,2620 31369,3218 31369,5662 31369,5718 31370,1179 31371,392 31372,1522 31373,143 31374,493 31375,1127 31375,1673 31377,195 31378,1927 31380,392 31381,1001 31383,349 31383,697 31383,907 31383,3260 31384,312 31384,5547 31385,1608 31386,2719 31387,2209 31389,10 31390,151 31391,31392 31391,55263 31391,104833 31393,302 31393,489 31394,973 31395,4548 31397,217 31397,283 31397,1019 31398,302 31398,634 31398,1010 31398,1143 31398,1837 31398,1881 31398,2421 31398,2779 31398,7698 31398,142430 31399,7360 31400,4355 31401,3507 31402,1326 31402,3193 31403,493 31404,151 31405,158 31406,72 31407,344 31408,285 31409,31410 31411,10 31412,663 31412,664 31413,1203 31413,1955 31413,3135 31414,175 31414,808 31414,1240 31414,1300 31414,1465 31414,1949 31414,3630 31414,6059 31415,72 31416,1033 31417,717 31418,1893 31419,10 31419,259 31419,622 31419,1433 31419,1436 31419,1973 31419,2083 31419,6803 31419,16196 31420,693 31420,16683 31422,626 31423,31424 31425,247 31426,2083 31426,3138 31426,3218 31427,1411 31427,3804 31428,10 31429,182 31429,256 31429,390 31429,563 31429,918 31429,1238 31429,1663 31429,2083 31429,6837 31429,7092 31429,7270 31429,15523 31430,704 31431,22 31434,779 31434,1515 31435,41 31435,104 31435,119 31435,247 31435,269 31435,285 31435,422 31435,424 31435,467 31435,636 31435,640 31435,788 31435,843 31435,1012 31435,1564 31435,1572 31435,1749 31435,7155 31435,19010 31436,455 31437,72 31437,1313 31438,72 31439,344 31440,285 31441,1776 31442,772 31443,1411 31443,3804 31444,93 31444,94 31445,577 31446,809 31447,390 31449,704 31450,99 31451,376 31452,885 31453,30 31453,328 31454,775 31455,972 31456,149 31456,250 31456,841 31457,1046 31458,376 31459,1359 31460,920 31461,704 31462,6068 31462,36761 31463,31464 31463,227659 31465,392 31466,1619 31467,86 31467,167 31467,240 31467,301 31467,372 31467,567 31467,589 31467,605 31467,615 31467,631 31467,720 31467,801 31467,907 31467,968 31467,972 31467,973 31467,1010 31467,1122 31467,1124 31467,1140 31467,1167 31467,1231 31467,1241 31467,1284 31467,1298 31467,1309 31467,1436 31467,1522 31467,1544 31467,1564 31467,1782 31467,1785 31467,1818 31467,1837 31467,1849 31467,1893 31467,1955 31467,2191 31467,2372 31467,2557 31467,2620 31467,2979 31467,3193 31467,3207 31467,3218 31468,1 31469,192 31471,644 31472,83 31473,843 31474,34 31474,35 31474,167 31474,217 31474,240 31474,283 31474,301 31474,536 31474,571 31474,605 31474,657 31474,760 31474,873 31474,907 31474,968 31474,973 31474,1001 31474,1019 31474,1133 31474,1181 31474,1210 31474,1284 31474,1462 31474,1522 31474,1531 31474,1715 31474,2205 31474,2206 31474,2266 31474,2557 31474,2790 31474,3138 31474,3218 31474,5667 31474,6027 31474,8537 31474,9024 31474,13575 31474,33424 31474,127158 31475,31476 31477,1181 31478,44 31479,1882 31480,143 31481,255 31482,147 31483,340 31484,298 31485,333 31485,980 31485,1181 31485,15573 31486,99 31487,107 31488,275 31489,2048 31490,31491 31492,146 31493,68 31494,663 31494,664 31495,1078 31496,557 31500,137 31501,138 31502,557 31503,8719 31504,865 31505,72 31506,118 31506,4597 31507,118 31507,4597 31508,118 31508,4597 31509,118 31509,4597 31510,2424 31511,120 31512,2434 31513,119 31514,272 31515,3507 31516,31517 31518,15 31518,1179 31518,2048 31519,50 31520,2224 31521,2274 31522,605 31523,887 31524,50 31524,72 31524,285 31524,8270 31525,99 31526,2210 31526,4237 31527,2379 31528,932 31529,920 31531,289 31531,290 31531,718 31532,272 31532,285 31532,422 31532,805 31532,1449 31533,609 31534,489 31535,557 31536,21944 31537,21944 31538,21944 31539,21944 31541,557 31542,138 31543,8719 31544,137 31545,865 31546,557 31547,143 31548,31549 31548,171235 31550,2146 31551,99 31552,83 31553,143 31554,406 31555,31556 31557,99 31558,31559 31560,137 31561,865 31562,8719 31563,138 31564,557 31565,1167 31566,72 31567,344 31568,285 31569,31570 31569,189368 31571,862 31572,111 31573,158 31573,206 31573,406 31573,779 31574,99 31575,240 31576,3367 31577,8719 31578,138 31579,865 31580,137 31581,557 31582,195 31582,31346 31583,31584 31585,158 31585,195 31585,406 31585,31346 31586,450 31587,1001 31588,72 31589,344 31590,285 31591,119 31591,19519 31592,1707 31593,1474 31594,1133 31595,15 31595,563 31595,615 31595,941 31595,3218 31596,289 31596,290 31597,32 31598,2528 31599,6556 31600,442 31601,1453 31602,841 31603,30 31604,9015 31605,1644 31606,137 31607,704 31608,72 31609,1544 31610,3370 31610,14453 31611,1844 31612,1143 31613,1634 31614,422 31615,422 31616,422 31617,422 31618,422 31619,422 31620,422 31621,171 31622,3069 31623,30245 31624,30236 31625,31626 31627,292 31628,2744 31629,2931 31630,808 31631,1118 31631,9024 31632,1309 31633,63 31634,676 31635,8270 31636,272 31637,31638 31639,31640 31639,36013 31639,44669 31639,52695 31639,79699 31639,92433 31639,198048 31641,175 31642,31643 31644,83 31645,805 31646,636 31647,1247 31648,14434 31649,1309 31650,31651 31652,31651 31653,349 31654,207 31656,972 31657,31658 31659,483 31660,349 31661,2750 31662,30 31662,328 31663,3507 31664,68 31665,217 31666,31667 31668,163 31669,31670 31671,225 31672,31673 31674,269 31675,536 31676,346 31677,1082 31678,217 31679,8884 31680,255 31681,1085 31682,192 31683,9006 31684,137 31684,138 31685,557 31686,592 31687,285 31688,918 31689,1238 31690,126 31691,20813 31692,3409 31693,1509 31694,392 31694,433 31695,1452 31696,3 31696,81 31696,111 31696,233 31696,240 31696,372 31696,383 31696,503 31696,557 31696,592 31696,704 31696,805 31696,818 31696,953 31696,1085 31696,1370 31696,1392 31696,1522 31696,1564 31696,1608 31696,1635 31696,1715 31696,1745 31696,1749 31696,1785 31696,1818 31696,1837 31696,1893 31696,1955 31696,2205 31696,2206 31696,2296 31696,2334 31696,3507 31696,3538 31696,3585 31696,4294 31696,5718 31696,9025 31696,33424 31697,2048 31698,2889 31699,2572 31700,907 31701,1571 31702,233 31703,21944 31704,264 31704,338 31704,467 31704,515 31704,1007 31704,1052 31704,1147 31704,1381 31704,1509 31704,5440 31704,8868 31705,713 31706,1844 31706,2460 31707,187 31708,5591 31709,366 31710,366 31711,366 31712,366 31713,10 31714,2443 31715,17588 31716,379 31717,31718 31719,1001 31721,861 31722,31723 31724,306 31724,307 31726,631 31729,34 31729,120 31729,240 31729,294 31729,332 31729,372 31729,493 31729,536 31729,590 31729,818 31729,862 31729,1019 31729,1082 31729,1274 31729,1718 31729,1858 31729,2989 31729,2991 31729,3623 31729,4594 31729,6068 31729,9007 31729,14126 31729,27041 31729,46391 31730,3193 31731,207 31731,631 31731,973 31731,1133 31731,1210 31731,5301 31738,455 31738,891 31738,949 31738,18738 31741,390 31741,589 31741,2372 31742,1785 31746,68 31746,167 31746,301 31746,467 31746,968 31746,1010 31746,1119 31746,1133 31746,1241 31746,2557 31746,2979 31746,13361 31755,18738 31756,1085 31756,18738 31758,18738 31762,1796 31762,3804 31763,3623 31765,349 31765,392 31765,433 31765,439 31765,1644 31765,2083 31765,17309 31765,68069 31766,535 31766,1732 31766,2191 31766,3193 31766,75912 31777,167 31777,795 31777,1284 31777,1309 31779,455 31781,1014 31784,444 31784,968 31784,1837 31784,2557 31784,103860 31785,294 31785,431 31785,626 31785,631 31785,784 31785,1001 31785,1119 31785,1284 31785,1411 31785,1479 31785,1522 31785,2045 31785,2372 31785,2979 31788,1127 31788,1590 31790,1210 31794,392 31794,589 31794,694 31794,697 31794,1284 31796,372 31796,609 31796,1118 31796,1284 31796,2191 31796,3193 31796,18739 31796,118336 31797,500 31799,392 31799,1454 31799,18738 31801,222 31801,283 31801,455 31801,657 31801,1019 31802,186 31802,264 31802,292 31802,467 31802,510 31802,775 31802,973 31802,1085 31802,3804 31802,75912 31803,31804 31803,31805 31832,431 31832,2989 31832,2991 31832,31803 31859,1181 31859,1531 31860,30 31861,1133 31863,3960 31864,872 31865,500 31866,1962 31867,1052 31868,1882 31869,2775 31870,54 31871,2210 31871,4237 31872,2697 31873,146 31874,366 31874,500 31875,83 31876,1133 31877,72 31878,344 31879,285 31880,602 31882,3413 31883,406 31884,31885 31886,72 31887,579 31887,861 31889,827 31889,1332 31890,2506 31891,2506 31892,3345 31893,4 31893,5 31893,714 31893,1212 31893,1432 31893,1745 31893,2089 31893,2940 31893,8820 31893,21944 31893,111142 31894,3949 31895,31896 31896,467 31896,31896 31897,31898 31899,283 31900,972 31900,1298 31901,13 31902,4453 31903,222 31903,455 31903,1019 31903,4672 31903,7768 31904,158 31905,83 31906,3413 31907,83 31909,206 31911,83 31912,58 31913,83 31914,1179 31914,1634 31914,1844 31914,6682 31915,920 31917,302 31917,344 31919,577 31920,3 31921,3804 31922,1181 31923,328 31923,31067 31923,58941 31924,143 31925,217 31925,1001 31926,31927 31928,452 31928,457 31928,497 31928,535 31928,676 31928,918 31928,1655 31929,143 31930,2828 31931,202 31931,203 31931,1379 31931,3321 31931,28755 31932,424 31933,509 31935,1634 31936,10 31936,31937 31936,32168 31936,38611 31936,44293 31938,2351 31939,589 31940,6068 31941,953 31942,872 31942,141912 31943,2995 31944,450 31945,536 31945,1467 31946,406 31947,31948 31949,779 31950,779 31951,31952 31953,338 31954,134 31954,137 31954,557 31954,2105 31955,920 31956,15573 31957,31958 31959,72 31960,344 31961,285 31962,72 31963,104 31963,134 31963,135 31963,217 31963,2105 31964,104 31965,3 31966,178 31966,500 31967,72 31968,344 31969,285 31970,3 31970,3999 31971,516 31972,72 31973,344 31974,285 31975,31976 31977,223738 31978,31979 31978,45357 31978,51415 31978,52692 31978,56168 31978,82370 31980,136 31981,31982 31983,6682 31984,1019 31985,1309 31986,2334 31987,392 31988,147 31989,102 31990,72 31991,15573 31992,44 31994,1907 31994,5101 31995,1955 31996,1309 31997,72 31998,72 31999,147 32001,376 32002,9323 32003,72 32004,32005 32006,1181 32008,483 32009,32010 32011,83 32012,784 32014,323 32014,6556 32015,1479 32016,72 32017,72 32018,72 32019,32020 32021,450 32022,450 32023,1 32023,11 32023,192 32023,336 32023,397 32023,620 32023,1117 32023,1313 32023,1425 32023,3079 32023,30331 32024,143 32025,515 32026,298 32027,485 32028,31977 32029,83 32030,640 32031,72 32033,32034 32035,269 32035,1070 32035,1634 32036,872 32037,32038 32039,298 32040,485 32041,32042 32043,2668 32044,72 32045,240 32046,2526 32047,32048 32049,2744 32050,1313 32051,32052 32053,32054 32053,60928 32053,91720 32055,255 32056,424 32057,104 32057,134 32058,2266 32058,18726 32058,68955 32059,298 32060,485 32061,32062 32063,450 32064,1556 32065,2526 32066,102 32067,102 32068,272 32069,32070 32071,586 32072,918 32073,2351 32074,72 32075,72 32076,344 32077,285 32078,207 32079,652 32080,31977 32081,652 32082,1192 32083,146 32084,2351 32085,32086 32087,455 32088,93 32088,94 32089,333 32090,163 32091,9195 32092,589 32093,32094 32095,4192 32095,4193 32096,1247 32096,1644 32096,1844 32097,818 32098,346 32099,32100 32099,44521 32099,74839 32101,72 32102,8270 32103,2292 32104,818 32105,233 32106,32107 32108,346 32109,818 32110,907 32111,15573 32112,2995 32113,6068 32114,298 32115,485 32116,2048 32117,107 32118,2416 32118,2417 32119,292 32120,338 32121,298 32122,1133 32123,3538 32124,32125 32126,8270 32127,134 32128,346 32129,298 32130,485 32131,312 32132,34 32132,35 32133,442 32134,366 32135,8992 32136,366 32137,585 32138,861 32138,2017 32139,1224 32140,872 32141,32142 32143,953 32144,4 32144,5 32144,1983 32145,346 32146,346 32147,439 32148,77 32148,5440 32149,2506 32150,872 32151,872 32152,872 32153,872 32154,872 32155,872 32156,32157 32158,872 32159,272 32160,298 32161,485 32162,577 32163,93 32163,94 32164,158 32165,269 32166,252 32167,3370 32167,14453 32169,3246 32169,3247 32170,32171 32172,147 32172,306 32172,307 32172,406 32172,585 32172,779 32172,1181 32173,1891 32174,328 32174,333 32175,143 32176,2048 32177,920 32178,72 32179,344 32180,285 32181,32182 32183,32182 32184,32182 32185,32182 32186,32182 32187,2867 32187,2868 32187,22880 32188,298 32189,485 32190,760 32191,32192 32194,2828 32195,7652 32196,355 32197,32198 32197,226976 32199,83 32200,3 32200,54 32201,32202 32204,136 32205,310 32205,620 32205,3039 32206,3260 32207,346 32208,1220 32208,1222 32209,298 32210,485 32211,1893 32212,346 32213,1893 32214,1893 32215,338 32216,273 32216,274 32217,346 32218,1119 32219,346 32220,16683 32221,1 32222,1715 32222,4146 32223,104 32223,134 32224,1707 32225,34 32225,35 32226,1012 32227,911 32228,298 32229,485 32230,32231 32232,346 32233,298 32234,485 32235,671 32236,79 32237,4453 32238,54 32238,222 32238,389 32238,1590 32239,160 32240,3069 32241,1893 32242,4 32242,5 32243,338 32244,200 32245,147 32246,298 32247,485 32248,4252 32249,996 32250,450 32251,147 32252,72 32253,450 32254,503 32255,298 32256,485 32257,298 32258,485 32259,298 32260,485 32261,636 32262,298 32263,485 32264,973 32265,44 32266,72 32267,22 32268,22 32268,403 32268,693 32268,113878 32269,657 32270,72 32271,2319 32271,8463 32272,32273 32272,53048 32274,32273 32274,122823 32275,72 32276,920 32276,2319 32277,779 32280,1235 32280,1335 32281,32282 32283,32282 32284,32282 32285,32282 32286,32282 32287,32282 32288,120 32289,298 32290,485 32291,72 32292,1707 32294,7360 32295,72 32296,298 32297,485 32298,72 32299,72 32300,143 32301,298 32302,485 32303,298 32304,485 32305,3474 32306,298 32307,485 32308,72 32309,2045 32310,32 32310,392 32311,1433 32312,143 32313,557 32314,346 32315,32316 32317,298 32318,485 32319,1860 32320,1544 32321,430 32323,1181 32325,32326 32328,527 32329,596 32330,557 32331,862 32332,557 32333,4691 32334,557 32335,1096 32335,28294 32336,557 32337,32338 32337,39362 32337,55408 32339,219 32339,364 32341,1983 32342,31977 32343,143 32346,599 32347,34 32347,35 32347,536 32348,366 32349,72 32350,344 32351,285 32352,32353 32354,346 32355,22 32356,146 32357,1265 32357,1266 32358,668 32358,1607 32359,1078 32359,2286 32359,2312 32360,346 32361,72 32362,309 32362,310 32363,2045 32364,137 32365,21944 32366,577 32367,459 32368,2506 32369,422 32370,422 32371,422 32372,422 32373,422 32374,240 32375,422 32376,422 32377,483 32378,422 32379,32380 32381,818 32382,1414 32383,22 32383,599 32384,433 32385,32386 32387,32388 32389,557 32390,536 32391,980 32392,72 32393,32394 32395,10 32396,4453 32397,676 32398,219 32399,2574 32400,32401 32402,10 32402,97 32403,72 32404,18726 32405,592 32406,10 32407,9007 32408,1313 32409,479 32410,272 32411,907 32412,818 32413,115 32413,118 32414,3161 32415,292 32416,1531 32418,3999 32419,72 32420,72 32422,104 32423,309 32424,292 32425,294 32426,296 32427,298 32428,32429 32430,72 32431,8270 32432,872 32433,872 32434,1118 32434,3447 32435,192 32436,72 32437,953 32438,323 32439,217 32440,713 32441,406 32442,20 32442,116 32442,134 32442,137 32442,138 32442,207 32442,247 32442,273 32442,298 32442,736 32442,1085 32442,1309 32442,1881 32442,2087 32442,3193 32442,7155 32443,233 32445,509 32445,510 32446,366 32447,83 32447,536 32448,366 32451,32452 32453,515 32454,8788 32455,143 32456,115 32456,118 32457,83 32458,393 32459,557 32460,338 32461,376 32462,34 32462,167 32462,222 32462,283 32462,289 32462,290 32462,312 32462,455 32462,631 32462,1019 32462,1210 32462,1467 32462,2266 32462,2775 32462,6424 32462,6789 32462,94134 32464,338 32464,838 32465,1711 32465,1836 32466,256 32467,489 32467,811 32468,178 32468,338 32468,346 32468,393 32468,439 32468,538 32468,668 32468,1294 32468,2353 32468,6662 32469,200 32470,7698 32471,72 32472,3413 32473,500 32475,393 32475,32475 32476,187 32477,1238 32481,10 32482,1452 32483,32484 32483,35968 32483,39891 32483,54039 32483,56384 32485,3161 32487,32488 32490,602 32491,83 32492,980 32493,1590 32494,392 32495,3999 32496,81 32497,1001 32497,2191 32500,2674 32503,87 32503,392 32504,596 32505,861 32506,83 32506,299 32506,1010 32507,255 32508,158 32509,306 32509,307 32510,2224 32511,178 32511,1531 32512,32513 32516,518 32516,1001 32516,1326 32516,3193 32517,167 32517,32518 32517,51554 32517,69872 32517,73786 32517,82806 32517,86244 32517,87539 32517,92440 32517,104495 32517,104772 32517,108370 32517,112815 32517,113293 32519,32520 32519,40132 32519,64073 32519,77798 32519,78954 32519,80285 32519,87208 32519,87621 32519,93131 32519,102986 32519,108496 32519,108558 32519,110503 32519,113737 32519,128310 32519,128998 32521,483 32522,2105 32523,4190 32524,32525 32526,805 32527,58 32527,63 32527,72 32527,163 32527,222 32527,233 32527,252 32527,340 32527,491 32527,620 32527,626 32527,652 32527,671 32527,682 32527,726 32527,733 32527,749 32527,808 32527,1052 32527,1309 32527,1368 32527,1381 32527,1402 32527,1434 32527,1608 32527,1644 32527,3218 32527,3451 32527,3452 32527,4771 32527,28294 32527,72439 32529,79 32529,192 32529,118336 32530,760 32531,149 32533,2266 32534,652 32535,1313 32536,4453 32537,32538 32537,32564 32537,32573 32537,32574 32537,32586 32537,32587 32537,32623 32537,32624 32537,32675 32537,32953 32537,33031 32537,33062 32537,33066 32537,33069 32537,33092 32537,34343 32537,35096 32537,35110 32539,32540 32541,32540 32542,32540 32543,32540 32544,32540 32545,32540 32546,32540 32547,32540 32548,32540 32549,32540 32550,32540 32551,32540 32552,32540 32553,32540 32554,32540 32555,32540 32556,32540 32557,32540 32558,32540 32559,32540 32560,32540 32561,1143 32562,333 32565,671 32566,992 32566,1276 32566,2744 32567,4190 32568,23096 32569,538 32570,1963 32572,83 32575,83 32575,217 32575,379 32575,399 32575,1467 32575,2168 32575,7698 32576,104 32576,304 32576,332 32576,636 32576,1659 32576,1715 32576,2367 32576,2620 32576,49057 32577,1167 32577,1436 32577,2979 32577,75912 32578,346 32579,149 32581,1181 32582,868 32584,534 32585,259 32585,788 32585,1433 32585,1531 32588,992 32590,3555 32592,4504 32593,147 32593,184 32593,1247 32593,3161 32594,1749 32595,644 32596,671 32598,32599 32600,579 32602,344 32603,136 32604,417 32604,1085 32606,736 32607,1323 32608,102 32609,1326 32610,408 32612,640 32613,87 32613,442 32613,1001 32613,1151 32613,1805 32614,640 32615,640 32616,1191 32617,195 32618,640 32619,640 32620,424 32621,32622 32621,109787 32621,119092 32621,120791 32625,217 32626,467 32627,602 32628,192 32629,430 32629,784 32631,403 32632,8598 32633,1276 32635,392 32637,32638 32639,250 32640,388 32640,6638 32642,425 32644,3507 32645,417 32645,809 32645,3367 32645,6726 32646,671 32647,875 32648,1984 32649,415 32650,240 32650,372 32650,390 32650,2512 32650,2812 32650,127158 32650,179804 32652,500 32653,671 32654,333 32655,1010 32657,1085 32658,337 32659,248 32659,1332 32659,1893 32659,7155 32660,302 32660,579 32660,2617 32660,4823 32661,158 32661,55849 32662,83 32662,222 32662,264 32662,852 32663,30331 32664,422 32665,2379 32665,9007 32666,30 32666,299 32666,557 32666,590 32666,760 32666,1177 32666,1309 32666,1359 32666,1368 32666,1462 32666,2210 32666,2416 32666,2417 32666,2701 32666,2775 32666,3129 32666,3209 32666,182162 32668,302 32668,687 32668,893 32668,1556 32669,195 32670,302 32671,3069 32672,3069 32674,192 32676,1143 32677,79 32677,809 32679,4060 32680,195 32680,366 32680,3246 32680,4545 32680,139010 32681,264 32681,1381 32681,191860 32682,779 32683,32684 32685,393 32686,273 32686,274 32687,457 32688,120 32688,392 32688,779 32688,1240 32688,1363 32688,1858 32688,21982 32689,217 32689,1019 32690,687 32691,726 32692,446 32692,1085 32692,1119 32692,75912 32692,185877 32694,22 32694,623 32695,273 32695,274 32696,182 32698,302 32698,579 32699,10 32699,113156 32700,516 32701,579 32702,188 32703,1282 32704,167 32704,1010 32705,818 32707,1370 32708,500 32709,1962 32710,1052 32711,1882 32712,2775 32713,54 32714,2210 32714,4237 32715,6263 32716,1127 32717,1224 32718,647 32719,344 32720,3872 32721,72 32721,337 32721,1033 32721,115659 32722,134 32722,200 32722,364 32722,772 32724,1907 32726,3193 32727,72 32728,171 32728,1877 32729,809 32729,19010 32730,1639 32731,1011 32732,473 32733,459 32734,592 32735,143 32736,893 32737,143 32738,1220 32738,1222 32739,1010 32740,107 32741,285 32741,999 32742,222 32743,28130 32744,406 32746,668 32746,713 32747,328 32747,808 32747,1531 32747,1566 32748,83 32749,83 32749,1274 32749,5591 32749,6506 32750,32751 32751,261 32751,332 32751,693 32751,694 32751,784 32751,852 32751,911 32751,1045 32751,1285 32751,1353 32751,2418 32751,2775 32751,2824 32751,3115 32751,4190 32751,4377 32751,5683 32751,7196 32751,7266 32751,7473 32751,14730 32751,18412 32751,19635 32751,20540 32751,20592 32751,26849 32751,28282 32751,32750 32751,32751 32751,48372 32751,49784 32751,78623 32751,80568 32751,85040 32751,95655 32751,110102 32751,123830 32751,124593 32751,128948 32751,132338 32751,138295 32751,138296 32751,138297 32751,138298 32751,138299 32751,139699 32751,156352 32751,160943 32751,165164 32751,169368 32751,175032 32751,183873 32751,197745 32751,227227 32751,230587 32751,233498 32751,258222 32751,262513 32751,263949 32758,1844 32758,2073 32759,1265 32759,1266 32760,6051 32761,4190 32762,32763 32764,285 32765,1085 32766,515 32767,7652 32768,779 32769,158 32769,178 32769,439 32769,1782 32770,592 32771,406 32772,647 32773,1612 32774,356 32774,2224 32774,2266 32774,7698 32775,58 32776,46 32777,968 32779,2590 32780,389 32782,2668 32783,557 32785,9195 32786,779 32786,141912 32787,516 32788,305 32790,1977 32790,1978 32791,315 32791,784 32791,1789 32791,21442 32792,439 32792,663 32792,664 32792,1175 32792,6119 32795,140 32795,346 32795,515 32795,835 32796,1052 32797,5405 32798,1011 32799,86 32800,285 32800,8270 32801,192 32801,195 32801,206 32801,671 32801,1033 32802,143 32803,1893 32804,657 32804,949 32805,32806 32807,20 32808,72 32810,104 32810,805 32810,1319 32810,2205 32810,33424 32811,1634 32812,2312 32813,83 32816,943 32816,1238 32817,805 32818,1147 32819,87 32819,292 32819,349 32819,392 32819,509 32819,510 32819,595 32819,697 32819,703 32819,818 32819,838 32819,872 32819,918 32819,931 32819,1011 32819,1014 32819,1151 32819,1188 32819,1192 32819,1289 32819,1363 32819,1453 32819,1454 32819,1572 32819,1722 32819,1836 32819,1893 32819,2253 32819,2436 32819,2699 32819,2744 32819,3258 32819,3507 32819,3538 32819,4039 32819,40360 32819,127158 32820,34 32820,35 32820,536 32820,2646 32821,2506 32822,1454 32823,72 32824,1262 32824,1844 32825,3555 32826,310 32826,3039 32827,209 32827,302 32828,247 32829,5375 32830,1309 32831,2506 32832,3846 32833,32834 32835,2506 32836,1012 32836,1241 32837,2995 32839,489 32839,75912 32840,626 32841,83 32842,15573 32843,1 32844,77 32844,349 32844,1803 32846,301 32847,489 32848,30 32848,328 32848,1179 32848,3538 32849,1465 32850,1231 32851,326 32853,330 32854,20790 32855,1707 32856,3069 32857,1983 32858,592 32859,304 32860,158 32861,32862 32863,801 32863,1284 32863,3474 32863,5547 32864,192 32865,140 32866,301 32867,46 32867,58 32868,372 32868,1010 32868,1082 32868,1241 32868,1479 32868,1849 32869,302 32869,2116 32869,3769 32871,358 32873,72 32874,32875 32877,1085 32878,2051 32878,81070 32879,5405 32880,247 32881,1298 32882,32883 32884,358 32884,1265 32884,1266 32885,3524 32886,83 32887,389 32888,32889 32890,9013 32892,346 32893,248 32894,784 32895,79 32896,1837 32897,809 32898,301 32901,72 32902,9323 32904,140 32904,1284 32905,393 32906,217 32906,240 32907,483 32908,250 32909,649 32910,247 32911,79 32911,99 32911,130 32911,233 32911,422 32911,685 32911,994 32911,1087 32911,1571 32911,1619 32911,1707 32911,2260 32911,4355 32911,81233 32912,349 32912,697 32913,32914 32915,111 32915,134 32915,200 32915,202 32915,203 32915,248 32915,264 32915,289 32915,290 32915,333 32915,631 32915,714 32915,718 32915,1119 32915,1149 32915,1181 32915,1462 32915,1631 32915,1955 32915,4355 32915,4831 32915,8180 32915,8537 32915,9006 32915,9010 32916,8798 32917,143 32917,1052 32918,178 32918,333 32918,538 32918,622 32918,980 32918,1033 32918,1181 32918,1531 32918,15573 32919,2051 32920,467 32920,868 32921,1955 32922,32923 32922,47308 32924,1707 32924,189794 32924,223738 32925,32926 32927,1282 32928,200 32929,34 32929,35 32929,217 32929,240 32929,278 32929,358 32929,435 32929,455 32929,467 32929,536 32929,571 32929,623 32929,694 32929,868 32929,1417 32929,81233 32929,156379 32929,162599 32930,1579 32931,104 32931,192 32931,202 32931,203 32931,248 32931,252 32931,346 32931,439 32931,687 32931,779 32931,934 32931,980 32931,1133 32931,1210 32931,1231 32931,1466 32931,1634 32931,1722 32931,1893 32931,1939 32931,5405 32932,390 32933,21944 32934,872 32935,1179 32935,1305 32935,2701 32936,493 32937,1623 32938,1235 32938,1335 32939,120 32939,588 32939,590 32939,1284 32939,1402 32939,1419 32941,3079 32942,779 32943,211 32944,1122 32945,4 32945,5 32946,687 32947,192 32947,779 32948,2590 32949,431 32949,1252 32949,1253 32950,500 32951,2699 32952,2073 32954,843 32955,811 32956,4 32956,5 32956,107 32956,1252 32956,1253 32956,1381 32957,392 32958,147 32958,158 32959,875 32960,1227 32960,1229 32960,21944 32960,86416 32961,171 32962,222 32963,1634 32964,151 32965,20 32966,24505 32967,167 32967,720 32967,1167 32967,1436 32967,2979 32968,200 32969,1452 32970,83 32971,1151 32972,137 32974,1235 32974,1335 32974,2045 32974,2209 32974,3474 32974,8180 32974,8788 32974,21711 32974,29253 32974,29294 32975,167 32975,1849 32976,685 32976,911 32976,26450 32977,772 32978,72 32978,292 32978,440 32978,510 32978,794 32978,801 32978,849 32978,872 32978,1151 32978,1238 32978,1240 32978,1449 32978,1688 32978,1722 32978,4771 32979,1188 32980,1151 32980,1807 32981,104 32981,200 32983,356 32983,481 32983,660 32983,1623 32984,4355 32985,47 32985,2469 32986,32987 32988,1673 32989,1556 32990,200 32991,2572 32992,147 32992,406 32993,1227 32993,1229 32993,86416 32994,21944 32995,994 32996,1983 32997,32998 32999,217 33000,376 33001,682 33002,1572 33003,1955 33004,344 33005,1417 33006,5908 33007,247 33008,893 33009,344 33010,269 33011,72 33012,8907 33013,158 33014,1782 33015,2105 33016,775 33016,3422 33017,200 33018,63 33019,3585 33020,1467 33021,1210 33022,932 33023,1241 33024,372 33025,1849 33026,1082 33027,1479 33028,63 33029,143 33032,72 33033,3297 33034,33035 33036,422 33037,106 33038,146 33039,1282 33040,149 33041,425 33042,366 33043,147 33043,602 33043,1265 33043,1266 33043,1370 33044,358 33045,1140 33046,1782 33047,219 33048,1639 33048,21944 33049,809 33049,2017 33050,72 33051,33052 33053,1707 33054,9011 33054,9032 33056,72 33057,346 33058,79 33059,3069 33060,298 33061,485 33063,676 33064,298 33065,485 33067,298 33068,485 33070,5366 33071,310 33071,6556 33072,143 33073,33074 33075,406 33075,2178 33075,4545 33076,557 33077,557 33078,644 33079,298 33080,485 33081,33082 33083,602 33083,3218 33084,2506 33085,760 33085,788 33086,200 33086,215 33086,1227 33086,1229 33086,1458 33086,86416 33087,510 33088,338 33089,137 33090,346 33091,1707 33091,4165 33093,63 33094,83 33094,301 33094,1313 33095,527 33096,72 33097,1289 33098,346 33099,72 33100,980 33101,346 33102,219 33103,63 33104,3209 33105,83 33105,1014 33106,4453 33108,1117 33108,1715 33109,2506 33110,33111 33112,2506 33113,33114 33115,10 33116,2528 33117,10 33118,1539 33119,1313 33120,323 33121,309 33121,310 33122,33123 33124,5213 33125,272 33126,1 33127,907 33128,605 33129,3161 33130,818 33131,44 33132,479 33133,305 33134,292 33135,217 33136,323 33137,115 33137,118 33138,704 33139,247 33140,206 33141,1087 33142,33143 33144,83 33144,356 33145,261 33146,267 33147,1285 33147,1955 33148,312 33149,309 33150,151 33151,77 33152,46 33152,1509 33153,137 33154,143 33155,47 33155,1235 33155,1335 33155,2469 33156,137 33157,1227 33157,1229 33157,21944 33157,86416 33159,22 33160,143 33160,1052 33160,1962 33161,346 33162,305 33162,1556 33163,717 33164,34 33164,35 33165,8992 33166,585 33167,292 33168,33169 33170,33171 33170,230159 33172,2923 33173,50 33174,192 33175,272 33176,126 33177,1149 33178,907 33179,4101 33180,5366 33181,275 33182,72 33183,219 33184,2351 33185,151 33186,19986 33187,349 33188,872 33189,328 33190,6179 33190,6180 33191,292 33192,1837 33193,33194 33195,63 33196,920 33197,33197 33199,81 33200,33201 33202,33203 33204,104 33205,72 33206,346 33207,349 33208,255 33209,137 33210,104 33211,9121 33212,333 33212,779 33212,2931 33213,3209 33214,4453 33215,366 33216,481 33217,33218 33219,240 33220,31977 33221,99 33222,1556 33223,33224 33225,323 33226,424 33226,784 33227,10 33228,640 33229,2334 33230,146 33231,272 33232,417 33232,2296 33233,907 33234,818 33235,1313 33236,233 33237,24505 33238,433 33239,292 33240,861 33241,302 33242,3161 33243,687 33244,579 33246,920 33247,452 33248,634 33249,206 33250,455 33250,1240 33251,302 33251,1284 33251,1749 33251,2367 33252,473 33253,33254 33255,33256 33257,452 33258,1010 33259,805 33260,2979 33261,63 33261,1871 33262,333 33262,15573 33263,483 33263,1011 33263,1289 33264,1140 33265,452 33266,309 33267,126 33269,104 33269,557 33269,953 33269,954 33270,294 33271,605 33272,452 33273,1673 33274,1571 33275,1844 33276,171 33277,14231 33278,452 33280,675 33281,200 33282,299 33282,2083 33283,4771 33284,33285 33286,33285 33287,1 33287,313 33287,685 33287,827 33287,841 33287,1319 33287,1566 33287,1821 33287,2421 33287,21736 33289,1425 33290,3069 33292,527 33292,743 33292,1983 33292,8714 33292,95152 33293,33294 33293,81520 33296,178 33296,579 33296,3422 33297,34 33297,35 33297,457 33297,536 33297,868 33299,306 33299,307 33300,452 33301,126 33302,248 33303,2775 33304,447 33306,349 33307,626 33307,784 33307,862 33307,1160 33307,1177 33307,1309 33307,1415 33308,784 33309,33310 33311,500 33311,718 33312,1433 33313,72 33314,907 33315,2837 33316,489 33318,126 33319,640 33320,452 33321,33322 33321,55376 33323,298 33324,269 33324,344 33324,1070 33326,126 33326,206 33326,435 33326,47785 33327,72 33328,911 33329,313 33330,1955 33332,158 33332,202 33332,203 33332,697 33332,1001 33332,1417 33334,2989 33334,2991 33337,72 33338,187 33338,285 33338,304 33338,390 33338,415 33338,567 33338,623 33338,685 33338,762 33338,1241 33338,1419 33338,1436 33338,1888 33338,2989 33338,2991 33338,4760 33338,5591 33338,6068 33338,36761 33340,143 33341,2224 33341,3769 33342,298 33343,485 33344,137 33345,994 33345,1368 33346,192 33347,298 33348,485 33349,33350 33349,40255 33349,44019 33349,51082 33349,53540 33349,60024 33349,64862 33349,77242 33349,95902 33349,129317 33351,718 33352,2671 33353,5405 33354,252 33354,516 33354,1220 33354,1222 33354,189842 33355,422 33356,422 33357,422 33358,33359 33360,422 33361,422 33362,422 33363,422 33364,422 33365,422 33366,2296 33367,58 33368,46 33369,579 33369,4177 33370,2296 33371,298 33372,485 33373,1147 33376,536 33377,1323 33378,102 33379,1326 33380,408 33381,875 33382,431 33382,631 33382,4220 33382,41027 33382,58979 33382,66297 33382,88266 33383,1235 33383,1257 33383,1335 33384,788 33385,1608 33386,72 33387,344 33388,285 33389,2931 33389,15609 33389,33390 33391,273 33391,274 33391,66754 33392,389 33392,455 33392,1274 33392,1881 33392,5933 33392,6506 33392,7092 33393,3524 33394,72 33395,107 33396,143 33397,2353 33398,1085 33398,2083 33399,1983 33400,644 33401,338 33403,452 33404,1247 33405,184 33407,1983 33408,1276 33409,207 33409,1210 33410,663 33412,1955 33414,7698 33415,577 33416,147 33416,158 33417,5540 33418,596 33418,697 33419,1983 33420,58 33421,46 33423,893 33424,104 33424,248 33424,289 33424,290 33424,588 33424,590 33424,631 33424,704 33424,714 33424,1282 33424,1402 33424,1415 33424,1462 33424,1745 33424,2105 33424,2205 33424,2206 33424,2286 33424,2315 33424,4218 33424,8537 33424,33424 33424,94134 33425,1634 33426,1058 33427,2319 33428,58 33429,46 33430,1860 33432,516 33433,1634 33434,211 33435,50 33436,1143 33437,30 33437,175 33437,313 33437,693 33437,1188 33438,33439 33440,3069 33441,457 33441,760 33441,1745 33443,1 33443,63 33443,83 33443,184 33443,285 33443,442 33443,808 33443,918 33443,1238 33443,1425 33443,1571 33443,1639 33443,2312 33443,2744 33443,3246 33443,6556 33443,19010 33443,147123 33444,994 33444,21944 33445,298 33446,485 33447,147 33447,158 33448,1983 33449,1983 33450,264 33450,1007 33451,389 33451,1058 33451,1454 33452,4594 33453,389 33454,687 33454,1556 33455,392 33456,33457 33456,38925 33456,65399 33458,861 33458,1556 33459,187 33460,1983 33461,1639 33462,1579 33463,72 33464,515 33465,1227 33465,1229 33465,86416 33466,877 33466,1284 33467,668 33468,65 33468,417 33468,1836 33469,536 33470,143 33471,2995 33472,15573 33473,1983 33474,192 33474,663 33474,664 33475,136 33475,313 33476,1639 33477,1579 33478,571 33479,567 33479,604 33479,1740 33480,290 33480,714 33480,1511 33480,2206 33480,33424 33480,94134 33481,15068 33482,48 33482,1007 33482,1381 33483,22 33483,1374 33484,33485 33487,211 33487,1462 33488,9121 33489,1977 33489,1978 33490,178 33490,1188 33490,68069 33491,63 33491,2105 33492,33493 33494,309 33494,310 33495,1579 33495,1893 33495,2605 33495,49057 33496,631 33497,273 33497,274 33498,1983 33499,1458 33500,7360 33501,130 33501,140 33501,160 33501,515 33501,1052 33502,29380 33504,65 33506,760 33506,818 33507,143 33509,20747 33510,255 33511,2296 33512,920 33513,33514 33516,250 33517,171 33518,1474 33519,34 33519,35 33519,389 33519,1860 33520,136 33521,79 33522,852 33524,626 33525,596 33525,1368 33526,136 33527,167 33527,1436 33527,2083 33527,2979 33528,1984 33530,298 33531,485 33533,50 33534,313 33536,3582 33538,47 33538,2469 33539,510 33540,640 33541,3451 33541,3452 33542,17593 33543,4 33543,5 33544,65 33546,392 33546,644 33546,2105 33546,3003 33547,743 33548,33549 33548,78285 33548,89712 33548,105044 33548,105420 33548,111610 33548,111886 33548,111911 33550,1608 33551,313 33554,713 33555,160 33556,835 33556,1968 33557,592 33558,217 33558,536 33559,195 33560,2296 33561,33562 33563,83 33564,330 33565,17228 33566,1368 33567,104 33567,135 33567,588 33567,590 33567,596 33567,714 33567,862 33567,1119 33567,1882 33567,2572 33567,3623 33568,298 33570,147 33570,493 33571,182 33572,911 33573,188 33574,4831 33575,143 33576,1 33577,2590 33578,2224 33579,657 33580,2424 33581,13980 33582,2779 33583,6263 33584,1345 33584,1370 33585,3538 33586,364 33587,1240 33587,1454 33587,3182 33587,4252 33587,6955 33588,195 33589,1767 33590,333 33590,779 33591,1001 33592,9011 33592,9032 33594,3209 33595,668 33597,33598 33599,151 33600,72 33601,907 33601,932 33602,104 33602,332 33603,389 33604,272 33605,1033 33606,1722 33607,182 33608,240 33609,760 33610,33611 33612,9018 33613,2209 33614,388 33615,1140 33616,393 33617,452 33617,457 33617,497 33617,535 33617,676 33617,918 33617,1655 33618,287 33619,130 33619,140 33619,515 33619,1052 33619,1968 33622,849 33622,1011 33623,147 33624,649 33625,264 33625,536 33625,718 33625,1160 33625,1732 33625,3422 33626,420 33627,346 33628,1010 33629,140 33631,17590 33632,390 33633,1085 33634,1298 33635,10 33636,420 33636,509 33636,510 33636,1722 33636,1836 33637,784 33638,140 33639,4453 33640,515 33641,1634 33642,264 33643,1639 33644,968 33645,298 33646,406 33647,726 33648,195 33648,920 33648,5101 33648,5103 33649,1287 33649,9030 33650,535 33650,872 33650,2989 33650,2991 33650,3252 33650,7092 33651,33652 33653,1983 33654,393 33655,41 33655,33656 33657,63 33658,79 33659,1072 33660,233 33660,1955 33660,3135 33661,850 33662,33663 33664,3260 33667,2995 33668,483 33669,1140 33670,251 33671,15573 33672,126 33672,333 33672,430 33672,1402 33672,1803 33672,2605 33673,1276 33674,32 33674,623 33674,1805 33674,4760 33675,1007 33676,2048 33677,130 33678,920 33679,920 33680,4475 33681,2837 33682,151 33683,649 33684,2779 33685,2045 33685,8788 33685,17263 33685,29253 33685,29294 33686,195 33687,1285 33688,56 33688,99 33688,206 33688,333 33688,1425 33688,6119 33689,704 33690,267 33690,1544 33691,636 33692,33693 33692,40069 33692,45324 33692,50219 33692,51553 33692,51559 33692,51923 33692,55402 33692,61633 33692,84008 33692,99415 33692,100936 33694,2668 33695,1085 33695,1411 33696,111 33696,294 33696,843 33696,1411 33696,2209 33696,3585 33696,21711 33697,289 33697,290 33697,1818 33697,94134 33697,144988 33698,1309 33699,158 33699,1433 33700,760 33701,1243 33702,1085 33702,2572 33703,68 33703,1634 33704,31977 33705,2506 33707,4 33707,5 33707,30 33707,32 33707,44 33707,50 33707,59 33707,79 33707,147 33707,215 33707,217 33707,240 33707,251 33707,272 33707,298 33707,301 33707,323 33707,336 33707,337 33707,346 33707,393 33707,417 33707,422 33707,430 33707,493 33707,503 33707,516 33707,538 33707,585 33707,586 33707,588 33707,590 33707,592 33707,671 33707,704 33707,714 33707,760 33707,795 33707,801 33707,805 33707,862 33707,907 33707,932 33707,973 33707,996 33707,1001 33707,1007 33707,1068 33707,1085 33707,1133 33707,1149 33707,1212 33707,1231 33707,1265 33707,1266 33707,1294 33707,1309 33707,1326 33707,1370 33707,1425 33707,1531 33707,1732 33707,1789 33707,1963 33707,2205 33707,2206 33707,2244 33707,2296 33707,2334 33707,2353 33707,2379 33707,2620 33707,2782 33707,2793 33707,3148 33707,3321 33707,3794 33707,4748 33707,5726 33707,5874 33707,6279 33707,8855 33707,16019 33707,33424 33708,217 33709,83 33710,907 33711,818 33711,907 33711,2995 33712,2506 33713,868 33714,873 33715,1801 33716,63 33716,2116 33717,195 33718,33719 33720,158 33722,264 33723,1058 33724,33725 33726,717 33726,1544 33726,1807 33727,1511 33727,3069 33728,577 33728,4222 33729,83 33730,301 33731,71 33733,1782 33734,1653 33735,301 33735,968 33735,1293 33735,3422 33735,189303 33736,3079 33737,83 33738,1151 33738,1836 33738,13361 33739,515 33739,1893 33740,3724 33741,3218 33742,247 33743,25873 33744,850 33745,818 33746,147 33746,158 33747,32 33747,79 33747,104 33747,106 33747,116 33747,134 33747,137 33747,146 33747,147 33747,149 33747,158 33747,178 33747,192 33747,240 33747,248 33747,323 33747,330 33747,333 33747,336 33747,337 33747,406 33747,417 33747,422 33747,442 33747,493 33747,516 33747,585 33747,589 33747,592 33747,620 33747,622 33747,636 33747,640 33747,694 33747,760 33747,779 33747,805 33747,862 33747,907 33747,994 33747,1016 33747,1033 33747,1085 33747,1181 33747,1235 33747,1282 33747,1326 33747,1335 33747,1368 33747,1370 33747,1388 33747,1411 33747,1425 33747,1515 33747,1531 33747,1551 33747,1939 33747,1955 33747,2087 33747,2205 33747,2206 33747,2210 33747,2701 33747,2782 33747,2931 33747,2979 33747,3085 33747,3115 33747,3148 33747,3317 33747,3321 33747,4237 33747,4355 33747,4455 33747,6119 33747,7270 33748,704 33749,861 33750,360 33750,760 33750,1149 33750,1631 33751,264 33751,515 33751,579 33751,861 33751,4453 33752,477 33752,2944 33753,248 33754,137 33755,333 33755,663 33755,664 33756,589 33756,953 33756,8788 33757,717 33758,422 33759,56 33760,2574 33761,83 33762,1556 33763,376 33764,2674 33764,36761 33764,75912 33765,3148 33766,33767 33768,3653 33769,289 33769,290 33770,72 33771,33772 33771,43398 33773,859 33774,1429 33775,827 33776,298 33777,485 33778,298 33779,485 33780,33781 33782,184 33783,1414 33784,250 33785,298 33786,485 33787,536 33788,34 33788,35 33788,1715 33789,310 33789,6556 33790,843 33791,264 33791,622 33792,660 33793,682 33794,862 33794,1388 33795,872 33796,557 33797,557 33798,9011 33798,9032 33799,1010 33799,3182 33799,221329 33800,2775 33801,447 33802,809 33802,907 33803,1608 33804,887 33805,33806 33805,120243 33805,140986 33807,250 33808,44 33809,1241 33810,9011 33810,9032 33811,2506 33812,33813 33814,83 33815,949 33817,1117 33818,33819 33820,298 33820,589 33822,298 33823,485 33824,33825 33826,330 33827,10 33828,843 33829,72 33830,240 33830,1001 33830,3367 33831,6803 33832,72 33833,1807 33834,33835 33836,72 33837,873 33838,158 33838,2931 33838,8822 33839,704 33840,138 33840,1227 33840,1229 33840,86416 33841,2506 33842,589 33843,652 33844,3138 33845,1381 33846,1102 33847,3138 33848,72 33849,72 33850,309 33850,310 33851,151 33851,1179 33851,2779 33852,6068 33853,130 33854,10 33855,2526 33856,33857 33858,1319 33859,2351 33860,33861 33860,53595 33860,108528 33860,119579 33862,920 33863,72 33864,1227 33864,1229 33864,21944 33864,86416 33865,557 33866,1007 33867,33868 33869,366 33871,126 33872,2334 33873,1414 33874,171 33875,1425 33876,422 33877,422 33878,422 33879,422 33880,422 33881,717 33882,83 33883,33884 33885,83 33886,422 33887,4594 33888,720 33888,877 33888,973 33888,1284 33888,1732 33888,1837 33888,2191 33889,207 33890,1659 33891,875 33892,628 33893,1556 33894,255 33896,272 33897,2296 33898,275 33898,1149 33898,8992 33899,258 33900,255 33901,1082 33902,252 33902,318 33902,31977 33902,174873 33903,33904 33905,72 33906,577 33907,1381 33908,6051 33909,115 33909,118 33909,333 33910,346 33911,772 33912,30 33913,217 33913,1118 33914,99 33915,33916 33917,171 33918,7360 33919,784 33920,83 33921,163 33922,33923 33924,2351 33925,8884 33926,33927 33926,63402 33928,652 33929,3447 33930,1775 33931,33932 33933,17588 33934,6621 33934,33935 33934,43269 33934,57503 33934,57504 33934,118252 33934,223329 33936,33937 33938,503 33938,1085 33940,33941 33942,33943 33944,298 33945,485 33946,366 33947,366 33948,366 33949,366 33950,83 33951,309 33951,310 33951,1313 33952,33953 33954,920 33954,8854 33955,2574 33956,33957 33958,233 33959,1238 33960,557 33961,83 33961,694 33962,1452 33963,349 33964,980 33965,2319 33966,1871 33967,634 33968,240 33968,392 33968,818 33968,1722 33969,72 33970,344 33971,285 33973,731 33974,83 33975,862 33977,58 33977,1653 33977,1836 33977,2436 33977,13361 33978,5366 33979,579 33980,452 33982,135 33984,3207 33985,577 33985,788 33987,481 33988,195 33988,663 33988,1639 33988,1849 33989,611 33990,115 33990,118 33990,184 33990,261 33990,272 33990,489 33990,1188 33990,1821 33990,2315 33990,6051 33990,21736 33991,158 33991,192 33991,535 33991,1181 33991,2178 33991,4545 33992,50 33992,192 33992,264 33992,315 33992,968 33992,1639 33992,1796 33992,14989 33992,33993 33992,86700 33992,155228 33994,58 33995,41 33995,459 33995,6506 33996,1893 33996,7155 33997,525 33998,452 33999,1 33999,195 33999,202 33999,203 33999,330 33999,563 33999,994 33999,1247 33999,3161 34000,579 34001,336 34001,406 34002,72 34003,3207 34004,211 34004,500 34005,2048 34007,452 34008,1243 34009,1274 34011,79 34011,115 34012,306 34012,307 34013,83 34013,187 34013,283 34013,313 34013,356 34013,477 34013,694 34013,5591 34014,192 34014,455 34017,86 34018,5405 34019,376 34021,298 34022,485 34023,424 34024,452 34025,126 34026,783 34027,875 34028,2590 34029,640 34030,4190 34031,2048 34032,135 34033,2944 34034,187 34035,126 34036,3695 34037,1149 34038,1179 34039,467 34039,872 34040,312 34041,111 34042,72 34044,3695 34045,1149 34046,1179 34047,1509 34048,795 34049,158 34050,452 34051,34052 34053,186 34054,861 34056,1085 34057,14650 34058,3003 34060,24 34060,25 34060,26 34060,28 34060,33 34060,47 34060,59 34060,60 34060,66 34060,885 34060,887 34060,994 34060,1432 34060,1775 34060,2088 34060,2469 34060,2674 34060,2701 34060,4079 34060,4571 34060,5162 34060,9343 34060,9539 34060,9541 34060,16153 34060,21944 34060,82021 34060,88820 34060,154690 34060,171294 34061,120 34061,1353 34061,35691 34061,78083 34061,78121 34061,78187 34061,83764 34061,86490 34061,90133 34061,99762 34061,100327 34061,105389 34061,106702 34061,108898 34061,108924 34061,116162 34061,118755 34061,120197 34063,79 34063,4220 34064,968 34066,79 34066,1639 34067,83 34068,1323 34069,102 34070,1326 34071,408 34072,388 34073,631 34073,972 34073,973 34073,1210 34073,1298 34075,8993 34077,304 34077,801 34078,660 34079,424 34080,1551 34080,3041 34081,255 34082,809 34083,1363 34084,663 34084,664 34086,784 34087,718 34088,779 34090,493 34091,868 34092,581 34093,417 34095,1133 34095,5250 34097,104 34098,579 34099,46 34099,58 34100,104 34100,134 34101,4611 34102,1544 34103,192 34104,2506 34105,1836 34106,515 34107,50 34108,72 34109,344 34110,285 34111,1287 34111,2436 34112,120 34112,217 34112,1085 34112,1241 34112,1949 34113,252 34113,16201 34114,79 34114,1572 34115,1634 34116,314 34116,852 34116,3367 34117,66 34117,1267 34117,75912 34120,225 34121,2572 34122,259 34122,3949 34123,1370 34124,1844 34125,3161 34126,5908 34127,19443 34129,567 34129,3422 34129,4222 34129,4760 34129,6068 34130,135 34131,312 34132,72 34133,1749 34134,143 34135,868 34137,65 34137,79 34137,3744 34138,932 34140,1298 34142,500 34143,1962 34144,1052 34145,1882 34146,2775 34147,54 34148,2210 34148,4237 34149,1309 34150,106 34150,996 34151,10 34151,493 34151,596 34151,1135 34151,1149 34151,1210 34151,1368 34151,1509 34151,1860 34151,1973 34151,2173 34151,5250 34152,875 34153,310 34153,620 34153,3039 34154,58 34154,801 34154,1140 34154,1177 34155,875 34156,1010 34157,510 34158,264 34159,302 34159,893 34160,273 34160,274 34161,264 34162,37 34162,698 34162,1293 34162,1782 34164,1579 34165,1639 34167,515 34168,1179 34169,1238 34170,1572 34171,312 34172,72 34173,3538 34174,2083 34176,93 34176,94 34177,850 34179,663 34179,664 34180,26 34180,59 34180,994 34180,1235 34180,1335 34180,4571 34180,21944 34181,1118 34181,1556 34182,83 34183,217 34183,657 34183,1417 34183,6789 34185,77 34186,34187 34188,485 34190,143 34191,1539 34192,217 34192,1417 34193,717 34193,1293 34193,1782 34194,818 34195,1619 34196,83 34197,1007 34198,1411 34199,3804 34200,333 34201,79 34202,663 34202,664 34203,996 34204,1977 34204,1978 34205,431 34205,440 34205,622 34205,862 34206,431 34206,631 34207,115 34207,118 34208,1607 34208,3582 34209,65 34210,217 34210,278 34210,536 34210,949 34210,1467 34211,1556 34212,1 34212,10 34212,693 34213,301 34213,604 34214,219 34215,1388 34216,1454 34217,3724 34218,48 34218,264 34218,1007 34218,1132 34218,1289 34218,1381 34218,1551 34218,1893 34218,3999 34219,1016 34220,267 34221,1243 34222,452 34222,457 34222,497 34222,535 34222,676 34222,918 34222,1655 34223,72 34224,344 34225,285 34226,1010 34227,301 34227,604 34228,861 34229,2923 34230,920 34231,875 34232,1433 34232,3744 34233,301 34233,304 34233,752 34233,968 34234,1319 34234,2557 34235,58 34236,46 34237,79 34237,192 34238,996 34239,1007 34240,626 34242,1849 34242,32784 34243,72 34244,344 34245,285 34247,106 34248,20 34249,41 34250,9029 34252,859 34253,192 34253,663 34253,664 34253,1943 34253,2480 34254,72 34255,344 34256,285 34257,143 34258,788 34259,79 34259,336 34260,13 34260,251 34260,337 34260,450 34260,516 34260,611 34260,925 34261,349 34262,333 34262,1181 34264,772 34265,2319 34266,626 34267,192 34267,336 34267,663 34268,178 34268,435 34268,622 34268,1033 34269,209 34270,891 34271,1085 34272,217 34273,1072 34274,4637 34275,34 34275,35 34276,455 34277,2266 34278,1274 34279,1201 34280,2421 34281,34 34281,35 34281,536 34281,2266 34282,1298 34283,536 34284,2744 34285,83 34285,1466 34286,2923 34287,34 34287,35 34287,536 34287,2266 34288,623 34289,143 34291,644 34293,1881 34295,693 34296,1732 34298,1893 34299,2646 34300,389 34301,5908 34302,278 34303,1133 34306,4190 34308,8270 34310,72 34311,795 34316,4252 34317,217 34318,83 34320,56 34320,275 34320,626 34320,1973 34321,264 34321,649 34321,1282 34321,36819 34322,1749 34322,3585 34323,581 34323,918 34325,818 34326,718 34327,953 34328,30331 34329,46 34329,301 34329,390 34329,525 34329,595 34329,615 34329,744 34329,783 34329,832 34329,874 34329,919 34329,941 34329,1010 34329,1133 34329,1436 34329,1522 34329,1544 34329,1837 34329,1849 34329,2372 34329,3422 34330,215 34331,1531 34332,248 34333,718 34334,602 34335,261 34335,1466 34336,392 34337,280 34338,10 34339,2319 34341,192 34342,439 34344,592 34346,1001 34348,2319 34349,536 34350,1572 34351,1082 34352,248 34352,557 34353,467 34353,620 34353,868 34353,1385 34353,152855 34354,1313 34355,907 34355,932 34356,255 34357,392 34357,1151 34358,200 34359,397 34360,81 34360,372 34360,1085 34360,1522 34360,1635 34360,1955 34360,2006 34360,2812 34360,3538 34361,247 34362,56 34363,217 34363,536 34363,2319 34364,1118 34365,72 34366,158 34367,379 34367,868 34367,1345 34368,577 34369,1805 34370,7757 34372,195 34373,302 34374,1177 34374,1220 34374,1222 34374,2210 34375,217 34376,247 34377,1241 34378,305 34379,1556 34380,120 34380,805 34381,809 34382,8788 34383,579 34383,71820 34385,579 34386,273 34386,274 34386,1707 34387,3148 34388,333 34389,2590 34390,72 34390,217 34390,222 34390,509 34390,510 34390,1043 34391,34392 34394,34395 34396,389 34397,31977 34397,34398 34397,53196 34397,155171 34399,579 34400,323 34401,222 34401,455 34402,151 34403,1082 34403,1807 34404,718 34405,83 34406,83 34406,285 34406,2784 34406,28130 34407,278 34407,609 34407,1688 34408,72 34409,344 34410,285 34411,652 34412,515 34413,652 34415,278 34415,809 34416,2045 34417,622 34417,868 34417,1133 34417,1326 34418,818 34420,885 34421,338 34421,2312 34422,143 34424,269 34425,283 34426,292 34426,1082 34427,424 34428,3296 34429,34430 34431,83 34432,13661 34434,294 34434,304 34434,1085 34435,215 34437,1082 34438,415 34439,209 34439,515 34440,609 34441,195 34443,5662 34444,1849 34445,202 34445,203 34446,1715 34447,1893 34448,1955 34449,417 34450,301 34451,1231 34452,5718 34453,752 34454,1564 34455,2083 34456,2620 34457,390 34458,7572 34459,392 34460,626 34461,388 34462,605 34463,1837 34464,8798 34465,3422 34466,3193 34467,1241 34468,1782 34469,1522 34470,2191 34471,3194 34472,907 34473,1167 34474,1326 34475,968 34476,1544 34477,3218 34478,3207 34479,3138 34480,2557 34481,1298 34482,720 34483,1010 34484,589 34485,6068 34486,233 34487,1210 34488,3 34489,1001 34490,240 34491,518 34492,973 34493,86 34494,143 34495,1231 34495,1782 34496,192 34497,10 34498,1181 34499,298 34500,140 34501,34502 34503,483 34504,222 34505,146 34505,106502 34506,4222 34507,143 34508,439 34509,455 34509,657 34509,2266 34509,6424 34510,302 34512,336 34513,72 34514,1082 34516,8822 34517,202 34517,203 34518,298 34519,485 34520,1227 34520,1229 34521,1224 34522,2296 34523,1033 34524,255 34524,571 34524,818 34524,68069 34525,652 34526,1082 34527,2867 34527,2868 34527,22880 34528,28294 34529,1267 34530,302 34530,893 34530,1893 34531,104 34531,918 34532,376 34533,34534 34535,34534 34536,71 34536,417 34536,557 34536,615 34536,1612 34536,3467 34537,1227 34537,1229 34538,718 34539,10 34540,269 34541,415 34541,996 34542,6298 34543,58 34543,86 34543,167 34543,240 34543,301 34543,372 34543,444 34543,567 34543,589 34543,605 34543,615 34543,631 34543,720 34543,801 34543,843 34543,907 34543,968 34543,972 34543,973 34543,1010 34543,1122 34543,1124 34543,1140 34543,1167 34543,1231 34543,1241 34543,1284 34543,1298 34543,1309 34543,1436 34543,1522 34543,1544 34543,1564 34543,1782 34543,1785 34543,1818 34543,1837 34543,1893 34543,1955 34543,2083 34543,2191 34543,2372 34543,2557 34543,2620 34543,2979 34543,3193 34543,3194 34543,3207 34543,3218 34543,20359 34544,647 34545,344 34546,1082 34547,143 34548,2116 34549,34550 34551,83 34552,602 34553,2923 34553,4190 34554,1907 34555,184 34556,1818 34556,1955 34557,1608 34558,50 34558,97 34558,104 34558,106 34558,147 34558,178 34558,202 34558,203 34558,333 34558,493 34558,588 34558,590 34558,620 34558,622 34558,628 34558,640 34558,720 34558,779 34558,1175 34558,1247 34558,1370 34558,1509 34558,1515 34558,2073 34558,2782 34558,2931 34558,3876 34558,6279 34558,8270 34558,8788 34559,143 34560,631 34561,5908 34562,3 34562,1807 34562,1984 34563,1085 34564,647 34565,344 34566,557 34567,557 34568,346 34569,147 34569,158 34570,10 34571,77 34572,795 34573,392 34574,1707 34575,1078 34576,1749 34578,346 34579,392 34580,34580 34581,503 34581,704 34581,1149 34582,1231 34583,586 34584,622 34585,178 34586,1590 34587,1837 34588,671 34589,346 34590,439 34591,333 34592,192 34593,717 34594,515 34595,34596 34597,209 34598,7698 34599,1 34599,94 34599,184 34599,2787 34600,422 34602,1551 34603,54 34604,2411 34605,586 34605,1227 34605,1229 34606,104 34607,34608 34609,1 34609,149 34609,184 34609,1425 34609,1966 34609,2244 34609,102786 34609,118336 34609,141230 34609,141821 34609,154519 34609,154521 34609,158397 34609,158401 34609,177841 34609,226362 34609,226381 34609,239459 34609,240870 34610,130 34610,272 34610,273 34610,489 34610,1188 34610,1634 34610,1821 34610,2315 34610,2367 34610,4571 34611,34611 34612,1052 34613,577 34614,209 34615,2334 34616,34617 34618,693 34619,344 34619,859 34619,1512 34619,2646 34619,5992 34620,775 34621,2506 34622,312 34623,34624 34625,1983 34626,192 34626,1847 34626,6119 34627,126 34627,452 34627,457 34627,497 34627,535 34627,676 34627,843 34627,918 34627,1011 34627,1655 34627,4165 34627,5726 34628,3960 34629,72 34630,1 34631,171 34632,34633 34634,34635 34636,72 34637,195 34638,1 34639,34640 34641,663 34641,664 34642,644 34643,24505 34644,2775 34645,447 34646,34647 34648,34647 34649,264 34650,34651 34652,2590 34653,1818 34654,9195 34655,1284 34656,1274 34656,1429 34657,269 34658,34659 34660,366 34661,34662 34663,376 34664,3069 34665,81 34666,34667 34668,163 34669,146 34670,1515 34671,304 34672,34673 34675,163 34675,302 34675,579 34676,273 34676,274 34677,2351 34678,2671 34679,424 34681,298 34682,485 34683,273 34683,274 34684,233 34685,65 34686,563 34687,872 34688,872 34689,34690 34691,106 34691,192 34691,202 34691,252 34691,318 34691,333 34691,439 34691,663 34691,920 34691,1385 34692,602 34693,907 34694,510 34694,623 34694,809 34695,1590 34696,586 34697,818 34698,34699 34700,602 34701,77 34702,366 34703,298 34704,485 34705,292 34706,452 34707,760 34707,1631 34708,663 34708,664 34709,79 34709,481 34709,3830 34712,623 34713,195 34714,142473 34715,452 34716,1860 34717,2178 34717,4545 34718,875 34719,602 34720,207 34720,1133 34721,1010 34721,1298 34721,1607 34722,34723 34722,66143 34722,66202 34722,66496 34724,563 34724,1740 34725,389 34726,77 34726,862 34727,620 34728,158 34728,251 34728,318 34728,337 34728,465 34728,516 34728,586 34728,1220 34728,1222 34728,1512 34728,5992 34728,6119 34728,16201 34729,647 34730,344 34731,336 34732,326 34732,873 34733,34734 34735,34734 34736,34737 34738,3 34738,186 34738,233 34738,518 34738,775 34738,795 34738,1326 34738,1411 34738,1715 34738,3094 34738,3804 34738,4146 34738,5130 34739,518 34739,4220 34740,292 34741,452 34743,2775 34744,447 34745,272 34746,726 34748,306 34748,307 34749,21944 34750,479 34751,602 34753,34754 34755,452 34756,222 34757,2168 34758,360 34759,579 34760,649 34762,452 34763,425 34763,1276 34764,920 34764,1181 34765,991 34766,9457 34767,1133 34768,184 34769,994 34771,34772 34773,106 34773,168479 34774,1082 34775,287 34775,433 34776,3 34778,588 34778,590 34778,718 34778,805 34778,1016 34779,452 34780,698 34781,50 34781,79 34781,147 34781,158 34781,178 34781,192 34781,285 34781,406 34781,422 34781,620 34781,622 34781,779 34781,1515 34781,1531 34781,2931 34781,4192 34781,4193 34782,1453 34783,422 34784,422 34785,1323 34786,102 34787,1326 34788,408 34789,422 34790,422 34791,422 34792,1 34793,4805 34794,422 34795,79 34796,3260 34797,332 34798,459 34799,623 34799,1805 34800,171 34801,697 34802,452 34803,34804 34803,81877 34803,84955 34803,92347 34803,97763 34803,108722 34803,110149 34803,111969 34806,184 34807,171 34808,693 34809,772 34810,1801 34811,673 34812,171 34813,171 34814,6750 34816,3193 34817,1001 34818,137 34819,392 34820,104 34820,217 34820,264 34820,289 34820,290 34820,1118 34820,1298 34820,1417 34820,6695 34821,58 34822,46 34824,1085 34826,392 34826,644 34826,697 34826,1363 34827,1227 34827,1229 34828,4 34828,5 34828,68 34828,200 34828,442 34828,636 34828,805 34828,1119 34828,1962 34828,2286 34828,4220 34830,1085 34830,6068 34831,158 34832,1566 34833,2421 34834,2266 34835,34836 34837,34838 34839,34838 34840,34838 34841,34838 34842,34838 34843,1001 34843,1522 34844,1082 34845,264 34845,1381 34846,3 34847,1149 34848,640 34849,536 34850,79 34850,310 34850,3039 34850,254384 34851,623 34851,1805 34852,640 34853,861 34854,2253 34854,13538 34854,75912 34855,2372 34856,579 34857,811 34857,893 34858,980 34859,1688 34860,1072 34861,5366 34862,275 34863,313 34864,83 34864,536 34864,843 34864,7698 34866,58 34867,195 34867,247 34867,146952 34868,704 34869,310 34870,392 34870,623 34870,919 34870,1805 34871,256 34872,731 34872,784 34873,4453 34874,298 34874,1175 34874,1392 34874,1962 34875,1012 34875,2775 34875,3846 34875,6249 34877,264 34879,5 34879,26 34879,34 34879,116 34879,118 34879,280 34879,290 34879,307 34879,590 34879,664 34879,1222 34879,1235 34879,1253 34879,1266 34879,1462 34879,1511 34879,1512 34879,1684 34879,1893 34879,1980 34879,2178 34879,2206 34879,2210 34879,2417 34879,2868 34879,2991 34879,3247 34879,3370 34879,3794 34879,4234 34879,4866 34879,5358 34879,5359 34879,8244 34879,9031 34879,17245 34879,21736 34879,32784 34879,33424 34879,36523 34879,56150 34879,58979 34879,72439 34879,92476 34879,94134 34879,106502 34879,164572 34879,182162 34879,245910 34880,1803 34881,310 34881,332 34881,1001 34881,1462 34881,1893 34881,4294 34881,4355 34881,7155 34881,8537 34881,27041 34882,932 34883,200 34884,1983 34885,485 34885,493 34886,34887 34888,907 34889,707 34890,2775 34891,447 34892,118 34892,4597 34893,399 34893,2775 34894,346 34895,9457 34896,9121 34897,10 34898,481 34900,287 34901,918 34902,34903 34904,389 34904,795 34904,1072 34905,586 34906,509 34906,510 34906,1722 34906,3538 34907,302 34908,34 34908,35 34908,251 34908,1135 34909,364 34910,1313 34911,1313 34912,360 34913,941 34914,1326 34915,16614 34916,10 34918,596 34921,233 34921,240 34921,1085 34922,50 34922,424 34922,1167 34923,3161 34924,644 34925,151 34926,192 34927,775 34929,217 34929,240 34929,592 34929,1001 34929,1818 34931,850 34932,192 34933,1544 34933,5662 34934,1433 34935,1096 34935,1612 34936,2051 34937,2051 34938,1332 34939,602 34940,579 34941,209 34941,302 34941,579 34941,811 34941,893 34942,2048 34943,1385 34944,602 34945,994 34946,298 34947,827 34948,3474 34949,151 34949,182 34949,440 34949,1844 34950,63 34951,104 34951,134 34951,200 34951,248 34951,372 34951,431 34951,631 34951,636 34951,795 34951,1016 34951,1332 34951,81233 34952,827 34953,344 34954,4453 34955,1749 34955,2605 34956,158 34957,309 34958,577 34958,21944 34959,1544 34960,83 34960,240 34961,9015 34962,760 34963,1133 34963,2315 34963,30331 34964,2828 34965,1715 34966,717 34967,827 34968,188 34969,718 34970,2411 34971,1172 34972,32 34972,392 34972,697 34972,3003 34973,1082 34975,217 34975,818 34976,1227 34976,1229 34976,21944 34977,31977 34979,97 34980,140 34981,5405 34982,2436 34983,1860 34984,65 34985,907 34985,932 34986,6208 34986,6209 34987,10 34988,527 34988,743 34988,1983 34988,8714 34988,21059 34988,64036 34988,95152 34989,336 34990,296 34990,991 34992,718 34993,299 34994,1419 34995,22924 34996,302 34996,623 34997,3094 34998,3209 34999,79 34999,147 34999,516 35000,50 35000,79 35000,1515 35001,1072 35002,818 35003,718 35005,2312 35007,579 35008,35009 35010,35011 35010,157870 35012,1147 35013,264 35014,1313 35015,178 35016,3252 35017,1893 35018,2351 35019,35020 35021,1419 35022,393 35022,435 35022,439 35023,163 35023,579 35023,1556 35024,158 35024,252 35024,41170 35025,422 35026,56 35027,422 35028,56 35029,422 35030,56 35031,442 35032,83 35032,1467 35033,35034 35035,581 35036,86 35037,2116 35038,107 35039,312 35039,510 35039,575 35039,875 35040,356 35041,158 35042,83 35042,577 35042,622 35042,1433 35043,304 35044,2411 35045,192 35046,301 35046,615 35046,968 35046,5662 35047,30 35048,1572 35049,1544 35049,3207 35050,298 35051,485 35052,389 35053,1509 35053,1551 35053,3041 35054,1893 35054,2312 35055,717 35056,388 35056,1363 35057,1844 35058,2995 35059,704 35060,309 35061,15573 35062,1082 35063,442 35064,1267 35064,1659 35064,1749 35065,1010 35065,1298 35066,1082 35067,3392 35068,500 35069,366 35070,592 35071,48 35071,130 35071,160 35071,1132 35071,1639 35072,151 35073,592 35073,90358 35074,195 35075,873 35076,35077 35078,1082 35079,119 35080,83 35080,247 35080,1247 35082,1294 35083,604 35084,1985 35085,1433 35086,35087 35088,298 35089,485 35090,292 35091,83 35091,7698 35093,919 35094,911 35094,1801 35095,186 35095,233 35095,301 35095,518 35095,525 35095,795 35095,1235 35095,1411 35095,1715 35095,3804 35095,4146 35095,21711 35097,500 35098,1962 35099,1052 35100,1882 35101,2775 35102,54 35103,2210 35103,4237 35104,1082 35105,251 35105,920 35106,1644 35107,178 35107,671 35107,934 35107,1033 35107,1201 35107,1238 35107,1590 35107,1612 35107,1877 35107,2353 35107,6661 35108,579 35109,44 35111,252 35112,202 35112,203 35113,217 35114,86 35115,1579 35116,1639 35117,392 35117,697 35118,450 35118,485 35119,875 35120,376 35121,1639 35122,1579 35123,818 35124,302 35124,687 35124,861 35124,893 35124,1556 35125,99 35126,1458 35127,1673 35128,557 35129,250 35130,652 35131,136 35132,2073 35133,1082 35134,3585 35135,1010 35136,422 35137,56 35138,3413 35140,160 35141,3135 35142,1010 35143,20 35143,310 35143,675 35143,3039 35144,302 35144,1556 35145,143 35146,7360 35147,1082 35148,1177 35148,2210 35149,41 35149,200 35149,1368 35150,225 35151,1639 35152,72 35153,35154 35155,206 35156,344 35157,640 35158,21944 35159,595 35160,182 35161,35162 35164,188 35165,258 35166,5405 35167,72 35168,6263 35169,483 35170,9323 35171,35172 35173,35174 35175,151 35175,292 35176,934 35177,850 35178,557 35179,557 35180,255 35181,907 35182,9323 35183,1572 35184,783 35185,298 35186,485 35187,267 35188,887 35188,21944 35189,35190 35191,240 35192,9011 35192,9032 35193,1140 35193,5547 35194,3769 35195,188 35196,3769 35197,1707 35198,25873 35199,35200 35201,3798 35202,248 35202,1149 35202,1631 35203,10 35204,22 35204,818 35204,861 35204,1012 35204,15609 35204,162599 35205,1014 35206,6051 35207,8788 35208,2351 35209,171 35210,6263 35211,273 35211,274 35211,4611 35212,1414 35213,35214 35216,35217 35218,4 35218,5 35219,35220 35221,2775 35222,447 35223,72 35224,809 35225,406 35226,2048 35227,1285 35229,682 35230,3138 35232,14366 35233,1001 35234,1634 35235,261 35236,5440 35237,211 35238,72 35239,1140 35240,35241 35242,143 35243,35244 35245,15573 35246,35247 35248,35249 35250,35251 35252,35253 35254,72 35256,72 35257,640 35258,104 35261,682 35262,1983 35263,1634 35264,66 35265,147 35265,158 35266,515 35266,647 35266,1968 35267,372 35268,34 35268,111 35268,4193 35269,35270 35271,146 35272,406 35273,602 35274,68 35274,5547 35274,35275 35274,56794 35274,62592 35274,64980 35274,68069 35274,83023 35274,83026 35274,86832 35274,92102 35274,97311 35274,104912 35274,111915 35274,114704 35274,115142 35274,115147 35274,115575 35274,123239 35274,126271 35274,129685 35274,130007 35274,132312 35274,155540 35274,157517 35274,160164 35274,182058 35274,183078 35274,199322 35274,215027 35274,217695 35274,235537 35274,236459 35274,249128 35274,250306 35274,251125 35276,1776 35277,1133 35278,467 35278,872 35278,1151 35278,1893 35279,35280 35281,233 35282,326 35283,931 35284,206 35285,35286 35287,35288 35289,35289 35290,298 35291,485 35292,5250 35293,35294 35295,346 35296,918 35297,48 35297,130 35297,340 35297,360 35297,489 35297,1096 35297,2209 35297,4355 35297,9457 35298,4 35298,5 35299,7124 35300,35301 35300,53553 35302,35303 35304,240 35304,1818 35305,3451 35305,3452 35306,35307 35308,2867 35308,22880 35309,455 35309,1019 35310,1659 35310,2607 35311,72 35312,693 35313,872 35314,1 35317,2351 35318,104 35318,323 35318,479 35318,991 35318,9030 35319,652 35320,366 35321,366 35322,366 35323,149 35324,366 35325,247 35326,306 35326,307 35327,337 35327,873 35328,86 35329,1551 35329,1849 35330,1509 35331,34 35331,35 35331,347 35331,356 35331,873 35332,640 35333,640 35334,640 35335,107 35335,467 35336,192 35336,406 35339,1579 35340,1639 35341,579 35342,720 35343,1564 35344,392 35345,868 35346,1082 35349,2574 35350,310 35350,718 35351,2173 35352,34 35352,35 35352,313 35352,399 35352,536 35352,657 35352,2224 35352,2646 35352,2784 35352,3252 35352,6298 35352,7092 35352,7698 35354,422 35355,56 35356,6880 35357,2367 35357,30331 35358,718 35359,447 35361,1326 35362,1323 35363,102 35364,1326 35365,408 35366,433 35367,1769 35369,298 35370,485 35371,760 35371,1149 35371,1631 35371,1635 35371,3069 35372,298 35373,485 35374,1983 35375,1143 35375,1849 35376,861 35377,143 35378,592 35379,1849 35380,589 35381,1276 35383,83 35383,2784 35384,358 35386,875 35387,1983 35389,298 35390,485 35391,500 35393,2048 35394,762 35394,1241 35395,298 35396,485 35398,111 35398,690 35398,788 35399,1227 35399,1229 35399,1252 35399,1253 35399,21944 35400,328 35400,693 35401,392 35401,509 35402,441 35402,760 35402,1973 35402,2443 35403,292 35404,1579 35405,298 35407,485 35408,289 35408,290 35409,1453 35410,33298 35411,33298 35412,1474 35413,137 35413,163 35414,389 35415,972 35415,973 35416,760 35417,10 35418,422 35419,422 35420,422 35421,422 35422,422 35423,422 35424,422 35425,422 35426,422 35427,422 35428,356 35428,1955 35428,4222 35430,163 35431,1707 35431,20004 35432,1227 35432,1229 35433,292 35434,273 35434,274 35434,66754 35435,314 35435,467 35435,868 35435,1433 35435,1722 35436,358 35437,298 35438,485 35439,602 35439,1582 35439,2244 35439,2867 35439,2868 35439,30331 35439,35439 35439,42064 35439,80266 35440,704 35440,991 35440,13538 35441,647 35442,344 35443,932 35444,433 35445,1167 35446,272 35448,298 35449,485 35450,264 35450,1381 35450,1509 35451,349 35452,1836 35452,13361 35453,481 35455,850 35457,1010 35457,1363 35458,589 35459,292 35460,178 35460,287 35461,644 35462,34 35462,35 35462,1313 35463,1506 35464,34 35464,120 35464,140 35464,349 35464,389 35464,392 35464,433 35464,623 35464,818 35464,1133 35464,1274 35464,1805 35464,6726 35465,392 35466,298 35467,485 35469,358 35470,358 35470,408 35470,581 35470,1082 35470,1113 35470,1298 35471,850 35472,292 35474,1715 35475,63 35475,503 35478,292 35479,2867 35479,2868 35479,22880 35481,392 35482,298 35483,1010 35483,1122 35484,1082 35485,424 35486,259 35486,272 35486,393 35486,685 35486,726 35486,788 35486,859 35486,911 35486,980 35486,1070 35486,1388 35486,2085 35486,4611 35486,21159 35486,26420 35486,28377 35486,29532 35486,38857 35486,84600 35486,92967 35486,109644 35486,120155 35486,125579 35486,133585 35486,139952 35486,142776 35486,143983 35486,169377 35486,177561 35486,192522 35486,199887 35486,219916 35486,224030 35486,229868 35486,249063 35488,298 35489,485 35490,149 35491,907 35491,932 35492,21944 35493,147 35493,158 35494,10 35494,77 35494,97 35494,217 35494,222 35494,313 35494,420 35494,784 35494,973 35494,1118 35494,1345 35494,1572 35494,1722 35494,1844 35494,2073 35494,2146 35494,2274 35494,2574 35494,3295 35494,3297 35494,4039 35494,4831 35494,5212 35494,5375 35494,8270 35494,9024 35494,13910 35494,27550 35494,99287 35496,1274 35497,285 35497,346 35497,403 35497,994 35497,1085 35497,2416 35497,2417 35497,3695 35497,20004 35498,671 35499,192 35500,431 35500,631 35502,247 35503,693 35504,217 35507,298 35508,485 35509,850 35510,2674 35510,16153 35511,850 35512,240 35512,818 35513,1151 35513,4252 35514,7757 35515,302 35515,703 35515,893 35515,2116 35515,3769 35516,579 35517,563 35518,50 35518,1515 35519,595 35519,932 35519,1579 35519,3538 35520,850 35522,1983 35523,907 35523,932 35525,292 35526,861 35526,81679 35526,186779 35528,760 35528,1631 35529,19986 35530,104 35530,136 35530,248 35530,557 35530,1368 35532,623 35532,809 35532,1836 35533,298 35534,485 35535,233 35535,503 35535,631 35535,1085 35535,2205 35535,2206 35535,33424 35535,245910 35540,7 35542,46 35542,301 35543,126 35543,467 35543,872 35543,1151 35543,49057 35544,28130 35545,186 35545,459 35545,1849 35545,3207 35545,32784 35546,261 35546,389 35546,660 35546,1419 35546,1466 35546,6506 35547,1001 35548,248 35549,50 35549,146 35549,314 35549,779 35549,92476 35550,390 35551,8714 35552,2443 35552,2626 35553,718 35554,298 35555,485 35556,9195 35558,861 35559,3246 35559,3247 35560,171 35561,336 35561,783 35561,1363 35561,27041 35561,75912 35561,118336 35562,1465 35563,206 35564,298 35565,485 35566,2210 35566,4237 35568,784 35569,623 35570,118 35570,4597 35572,435 35572,538 35572,1374 35573,827 35574,151 35574,366 35574,2607 35576,623 35576,1805 35577,99 35577,682 35577,72439 35578,1392 35579,298 35580,485 35581,79 35581,515 35581,861 35581,3209 35582,644 35583,2506 35584,2506 35585,271 35586,1052 35587,2701 35590,285 35590,28130 35592,15179 35593,980 35594,1805 35595,406 35596,250 35596,887 35596,1684 35597,1133 35598,186 35598,972 35598,6837 35599,209 35599,579 35600,425 35600,1276 35601,72 35602,143 35603,10 35603,113156 35604,2775 35605,447 35606,217 35606,872 35606,1118 35606,1796 35607,493 35608,1454 35609,19010 35610,422 35611,56 35612,240 35613,217 35613,240 35613,372 35613,920 35613,1287 35614,47 35614,104 35614,147 35614,192 35614,264 35614,289 35614,290 35614,298 35614,503 35614,557 35614,1149 35614,1458 35614,1955 35614,2244 35614,2469 35614,94134 35615,1579 35615,1955 35616,149 35616,406 35617,422 35618,56 35619,389 35620,818 35621,1388 35622,1707 35623,285 35623,779 35623,972 35623,973 35623,68069 35623,118336 35623,141912 35624,872 35624,127158 35625,557 35625,852 35626,143 35627,2319 35628,178 35629,422 35630,56 35631,192 35632,972 35632,35655 35632,36802 35632,36803 35633,269 35634,649 35635,972 35635,3804 35635,35659 35635,36657 35635,36658 35636,439 35636,510 35636,622 35637,72 35638,1556 35639,158 35640,87 35641,35642 35643,147 35644,557 35645,35646 35647,4 35647,5 35649,422 35650,56 35651,875 35652,35653 35652,66984 35656,151 35657,26 35657,59 35657,79 35657,1844 35660,628 35661,393 35661,447 35661,1033 35662,500 35663,366 35664,557 35665,158 35665,333 35665,406 35666,287 35667,640 35668,192 35668,252 35668,287 35668,333 35668,435 35668,809 35668,1220 35668,1222 35668,1243 35668,6119 35668,15573 35668,19010 35669,1220 35669,1222 35670,252 35671,251 35672,65 35672,158 35672,163 35672,217 35672,287 35672,302 35672,383 35672,392 35672,406 35672,439 35672,467 35672,687 35672,697 35672,818 35672,861 35672,872 35672,1010 35672,1140 35672,1370 35672,1659 35672,1722 35672,1836 35672,1837 35672,2671 35672,3260 35672,3804 35672,189839 35673,35674 35675,35674 35676,1143 35677,87 35677,1151 35677,1240 35677,1454 35678,44 35679,63 35680,30331 35681,35682 35683,264 35685,225 35685,248 35686,35687 35688,34 35688,35 35690,388 35692,66 35692,247 35693,151 35695,222 35695,1467 35696,850 35697,1179 35698,433 35699,7 35700,1247 35701,267 35702,406 35703,200 35704,233 35704,775 35704,2045 35705,1188 35706,1844 35707,9195 35708,784 35709,887 35709,1235 35709,1335 35710,3538 35711,35712 35713,255 35714,34 35714,35 35714,775 35714,2209 35715,1082 35716,33298 35717,557 35718,35719 35720,586 35720,1590 35721,111 35722,1151 35722,1836 35723,1370 35723,21736 35724,1082 35725,604 35726,424 35727,83 35727,2779 35728,379 35729,187 35730,366 35730,500 35730,718 35732,660 35732,784 35732,2424 35732,2944 35732,6506 35733,1179 35733,4252 35733,8541 35733,16687 35734,58 35735,704 35736,605 35737,605 35738,2334 35739,333 35740,1707 35741,8788 35742,1860 35743,2351 35744,26251 35745,1803 35746,809 35747,733 35748,147 35749,35750 35749,35751 35751,65 35751,1983 35752,1309 35753,93 35753,94 35754,424 35755,9560 35756,1188 35757,240 35758,717 35759,287 35760,35761 35763,1122 35764,305 35765,269 35766,4101 35767,3003 35768,3069 35769,4980 35770,489 35771,1082 35772,160 35772,872 35772,1659 35773,1309 35774,704 35775,94 35775,175 35775,251 35775,704 35775,2782 35775,2787 35775,48955 35776,146 35777,557 35778,557 35779,557 35780,8719 35781,138 35782,865 35783,557 35784,137 35785,35786 35787,21944 35788,118 35788,4597 35789,8719 35790,138 35791,865 35792,557 35793,137 35794,21944 35795,8719 35796,138 35797,865 35798,557 35799,137 35800,21944 35801,118 35801,4597 35803,8719 35804,138 35805,865 35806,557 35807,137 35808,118 35808,4597 35809,21944 35810,5440 35811,1392 35812,30 35813,1479 35814,171 35815,3413 35816,557 35817,8719 35818,138 35819,865 35820,557 35821,137 35822,35823 35824,118 35824,4597 35825,21944 35826,261 35827,118 35827,4597 35828,1033 35828,2051 35829,13919 35830,252 35831,389 35831,1072 35832,35833 35834,35835 35836,758 35837,99 35838,211 35839,3069 35840,35841 35843,25929 35844,50 35844,1512 35844,5992 35845,35846 35847,5 35847,117 35847,1001 35847,2089 35847,2940 35847,8719 35847,9386 35847,21944 35847,37794 35848,4611 35849,1544 35850,35851 35852,1773 35853,160 35854,3069 35855,240 35855,301 35855,818 35856,35857 35858,35859 35860,35861 35862,1414 35863,1082 35864,10 35865,1313 35866,704 35867,35868 35869,3161 35870,35871 35872,8598 35873,83 35874,35875 35876,3069 35877,22727 35878,483 35879,309 35880,35881 35882,422 35883,422 35884,422 35885,422 35886,422 35887,422 35888,422 35889,422 35890,1414 35891,167 35891,3138 35892,2351 35893,10 35894,217 35895,1118 35895,1419 35895,3507 35896,809 35897,35898 35899,536 35900,784 35901,346 35902,704 35903,72 35904,35905 35906,233 35907,366 35908,366 35909,366 35910,366 35911,35912 35913,1572 35914,1381 35915,1849 35915,32784 35916,35917 35916,37213 35916,46671 35916,47315 35916,49812 35916,56026 35916,60217 35916,85292 35916,98606 35918,35919 35920,8884 35921,2292 35922,1085 35923,158 35924,35925 35926,35927 35928,192 35929,50 35930,273 35930,274 35931,79 35932,222 35933,640 35934,35935 35936,452 35937,104 35938,17334 35939,35940 35941,579 35943,452 35944,452 35945,1082 35946,158 35946,592 35946,779 35946,2371 35946,49057 35946,117163 35946,191860 35947,225 35948,186 35948,518 35948,1326 35948,1849 35949,310 35950,452 35951,35952 35953,306 35953,307 35954,207 35955,452 35957,452 35958,2750 35959,809 35959,19010 35960,137 35961,261 35962,171 35963,217 35964,1323 35965,102 35966,1326 35967,408 35969,35970 35969,45151 35969,46407 35969,49606 35969,52490 35969,58177 35971,640 35972,424 35974,143 35974,1052 35975,1033 35976,264 35977,26 35977,59 35978,3367 35979,9195 35980,35981 35980,59656 35980,68069 35980,120455 35982,818 35983,10 35983,35984 35983,264982 35985,433 35986,676 35987,1082 35988,1118 35989,893 35990,1247 35990,1644 35990,1844 35991,35992 35991,43053 35991,68069 35993,35994 35995,35996 35997,1231 35998,850 35999,41 36001,36002 36003,433 36003,1634 36004,18726 36005,36006 36007,3467 36008,192 36008,663 36009,130 36009,1551 36010,72 36011,344 36012,285 36014,158 36015,1085 36015,6068 36016,1707 36017,267 36018,158 36019,1860 36020,843 36021,1117 36022,36023 36024,44 36025,312 36026,640 36027,36028 36029,333 36030,4604 36031,875 36032,920 36033,1231 36034,68 36035,1082 36036,86 36037,1033 36038,6682 36039,97 36040,36041 36040,93398 36042,83 36042,217 36042,222 36043,4611 36044,1544 36045,481 36046,158 36046,406 36047,818 36048,269 36049,200 36050,41 36051,1235 36051,1335 36052,1181 36053,2574 36054,406 36054,779 36054,1515 36054,4192 36054,4193 36055,187 36056,192 36057,1082 36058,1381 36059,3161 36060,743 36061,346 36062,861 36063,1082 36064,36065 36064,61120 36066,21944 36067,126 36068,258 36070,1072 36071,93 36071,94 36072,149 36073,250 36074,36075 36076,1893 36076,36077 36076,55953 36076,77145 36078,841 36079,1634 36080,207 36081,31896 36082,50 36082,406 36083,255 36084,1479 36085,36086 36087,264 36087,1147 36087,16687 36088,36089 36090,36089 36091,1082 36092,36093 36095,36096 36097,4453 36098,36099 36100,663 36100,664 36101,36102 36103,1419 36105,850 36106,36107 36108,36109 36110,275 36111,4190 36112,422 36113,56 36114,1433 36115,2244 36116,3653 36117,2617 36118,346 36119,36120 36121,3370 36121,14453 36122,2048 36123,704 36124,623 36124,1805 36125,4611 36126,1544 36127,1893 36128,1085 36129,346 36130,805 36131,640 36132,97 36133,784 36134,72 36136,3069 36137,292 36138,346 36139,406 36139,4192 36139,4193 36140,36141 36142,36143 36142,80312 36142,100097 36144,36145 36146,309 36146,310 36147,3246 36147,3247 36148,36149 36150,36151 36152,233 36153,36154 36155,779 36155,2244 36156,107 36157,2416 36157,2417 36158,292 36159,2351 36160,338 36161,298 36162,1133 36163,3538 36164,779 36165,652 36166,872 36167,41 36167,58669 36167,60021 36168,631 36169,1247 36169,1644 36169,1844 36170,1893 36171,3 36171,509 36171,510 36172,44 36173,872 36174,872 36175,2574 36176,872 36177,743 36178,200 36179,301 36179,305 36179,516 36179,1298 36179,1837 36179,3193 36180,36181 36182,516 36183,406 36184,818 36185,4220 36185,65140 36186,2048 36187,250 36187,1684 36188,602 36189,83 36190,4611 36191,1544 36192,3 36193,640 36194,72 36195,452 36196,493 36196,516 36196,1243 36197,1955 36198,178 36199,602 36200,452 36201,452 36202,147 36203,72 36204,36205 36206,72 36207,452 36208,366 36209,72 36210,366 36211,126 36212,4611 36213,1544 36214,72 36215,1052 36215,2989 36215,2991 36216,452 36217,72 36218,920 36219,609 36220,3161 36221,1265 36221,1266 36222,3069 36223,1968 36224,3321 36225,333 36226,1313 36227,130 36227,515 36227,736 36227,1132 36227,1381 36227,1639 36227,3695 36228,264 36229,5440 36230,1052 36231,433 36232,1659 36233,1773 36234,250 36235,1639 36236,931 36237,10 36237,149 36237,175 36238,44 36239,3524 36240,1116 36241,301 36241,615 36241,968 36241,1939 36241,5662 36242,255 36243,275 36244,775 36245,805 36245,1078 36245,3585 36246,483 36247,13 36248,305 36248,5101 36248,31977 36249,273 36249,274 36250,431 36250,784 36250,4220 36250,4222 36251,1893 36253,6298 36254,93 36254,94 36255,240 36256,366 36256,760 36256,1149 36256,1631 36257,575 36257,1122 36257,1257 36257,1429 36257,3115 36257,6059 36259,1010 36260,2073 36261,36262 36263,1860 36264,36265 36266,393 36266,36267 36268,1227 36268,1229 36268,86416 36270,36271 36272,304 36273,425 36273,583 36273,690 36273,1805 36274,34 36274,35 36275,328 36276,2244 36277,1860 36278,431 36278,1252 36278,1253 36280,333 36280,1181 36281,298 36282,485 36283,36284 36285,298 36286,485 36287,298 36288,485 36289,1227 36289,1229 36290,72 36291,4060 36292,36293 36294,2775 36295,192 36295,202 36295,203 36295,422 36295,516 36296,718 36297,192 36298,44 36299,1860 36300,805 36300,3538 36301,310 36302,704 36303,718 36304,1298 36306,6891 36307,312 36308,222 36309,5906 36310,557 36311,626 36312,278 36313,137 36314,36315 36316,862 36317,5906 36318,557 36319,626 36320,278 36321,137 36322,862 36323,557 36324,557 36325,557 36326,557 36327,862 36328,36329 36330,652 36331,805 36331,5212 36333,15807 36334,252 36335,415 36335,2989 36335,2991 36335,13361 36336,704 36337,3538 36338,379 36339,298 36340,485 36341,36342 36343,298 36344,485 36346,36347 36348,36349 36350,596 36350,1907 36351,5366 36352,1204 36353,1 36353,58 36353,107 36353,289 36353,290 36353,647 36353,994 36353,1353 36353,1425 36353,30331 36353,144988 36354,36355 36354,199220 36357,192 36357,663 36357,664 36358,745 36358,1677 36358,2915 36358,3089 36359,36360 36361,219 36361,358 36362,36363 36364,973 36365,602 36366,602 36367,602 36368,2590 36369,296 36370,50 36370,99 36371,36372 36373,285 36373,406 36373,1515 36374,602 36375,885 36376,1124 36377,36378 36379,849 36379,2310 36380,36380 36381,65 36382,447 36383,447 36385,4611 36386,1544 36387,36388 36389,1238 36390,1452 36391,147 36392,10 36393,36394 36395,36396 36397,36398 36398,586 36398,2782 36398,36397 36399,1309 36400,36401 36402,52 36402,175 36402,1773 36403,36404 36405,36406 36407,875 36411,50 36411,56 36411,79 36411,146 36411,147 36411,158 36411,192 36411,195 36411,206 36411,333 36411,406 36411,422 36411,585 36411,602 36411,620 36411,622 36411,640 36411,779 36411,1181 36411,1515 36411,2244 36411,2931 36411,5874 36411,6119 36411,23783 36411,30331 36411,60576 36411,92476 36417,56 36417,192 36417,1181 36417,30331 36421,192 36421,240 36421,264 36421,301 36421,309 36421,310 36421,392 36421,931 36421,1531 36421,1634 36421,2312 36425,1551 36435,192 36435,931 36435,30331 36436,1 36436,99 36436,147 36437,1907 36439,1175 36440,1907 36442,56724 36443,195 36444,663 36444,664 36451,195 36457,192 36459,195 36459,438 36459,5101 36465,1907 36469,56 36476,195 36476,86479 36478,609 36479,86479 36480,718 36482,1631 36483,41 36483,120 36483,261 36483,332 36483,694 36483,1353 36483,1608 36483,3115 36483,6068 36483,32751 36485,406 36490,1893 36490,7155 36492,195 36492,1639 36494,158 36494,195 36505,1907 36506,994 36507,158 36507,893 36507,994 36507,1983 36511,1907 36512,56 36512,158 36512,192 36512,406 36512,422 36512,779 36512,1149 36512,1181 36512,1370 36512,18638 36512,92476 36512,127158 36514,1907 36523,10 36523,158 36523,217 36523,406 36523,36523 36523,235790 36525,1907 36528,195 36528,30418 36528,86479 36532,269 36532,1181 36532,69585 36534,50 36534,337 36534,103698 36535,622 36535,1515 36541,1844 36544,195 36551,1749 36554,1572 36555,195 36555,86479 36558,195 36558,718 36560,994 36563,467 36563,1782 36565,195 36565,1181 36567,292 36568,294 36569,296 36570,298 36571,704 36572,704 36573,36574 36575,36574 36576,36574 36577,310 36579,36580 36581,1001 36582,366 36583,366 36584,366 36585,240 36585,1082 36585,1807 36585,1955 36585,2775 36586,328 36587,36588 36589,372 36589,509 36589,932 36589,1082 36589,1122 36589,1241 36589,1282 36589,1479 36589,1522 36589,1849 36589,2480 36590,328 36590,1052 36591,509 36591,510 36593,2178 36593,4545 36594,278 36594,13137 36595,1019 36596,406 36597,2178 36597,4545 36597,56150 36597,139010 36598,805 36599,862 36600,1467 36602,106 36602,518 36603,32 36603,3999 36603,7155 36603,18810 36604,346 36605,72 36606,843 36608,1058 36608,8149 36609,36610 36611,337 36612,31977 36613,4611 36614,298 36615,485 36616,663 36616,664 36617,726 36619,298 36620,485 36621,298 36622,485 36623,602 36624,298 36625,485 36626,222 36626,1474 36627,304 36628,1363 36629,1433 36630,718 36631,255 36632,328 36635,1085 36636,647 36636,1276 36636,2744 36637,47 36637,248 36637,1235 36637,1332 36637,1335 36637,2469 36638,298 36639,485 36640,298 36641,485 36642,827 36644,306 36644,307 36645,604 36645,1392 36646,534 36647,784 36648,5101 36649,58 36650,46 36651,868 36653,439 36654,79 36655,1673 36659,35635 36660,1181 36660,4933 36660,8244 36660,9394 36660,36458 36660,36517 36660,43612 36660,45683 36660,92476 36661,424 36663,298 36664,485 36665,980 36665,1400 36666,298 36666,1955 36667,206 36668,298 36669,485 36670,1298 36672,652 36673,1454 36677,2607 36678,615 36678,852 36680,718 36680,931 36681,3756 36681,5662 36682,571 36682,868 36684,1544 36685,1319 36687,907 36687,1284 36688,640 36689,640 36690,640 36691,240 36691,372 36691,932 36691,1001 36691,1241 36691,1479 36691,1849 36692,222 36693,640 36695,640 36697,640 36698,1544 36699,2224 36700,893 36701,1544 36702,452 36703,1247 36704,184 36705,1544 36706,704 36707,704 36708,79 36708,485 36708,827 36708,994 36708,1639 36709,5213 36710,72 36711,333 36711,1893 36712,510 36713,1033 36714,652 36715,422 36716,349 36717,1860 36718,1707 36719,1955 36720,349 36720,509 36720,875 36720,907 36720,1117 36720,2191 36720,3260 36720,3367 36720,4760 36720,5540 36721,58 36721,87 36721,1140 36721,1454 36721,5547 36722,72 36723,1188 36724,178 36725,36726 36728,1359 36730,510 36731,4998 36731,29433 36731,86677 36732,697 36732,1769 36733,272 36734,868 36735,360 36736,217 36736,301 36736,1796 36736,3804 36737,15573 36738,849 36739,36740 36742,18726 36743,81 36744,1227 36744,1229 36745,567 36745,1436 36745,2557 36746,422 36747,102 36747,442 36747,563 36747,595 36747,1188 36747,1285 36747,2782 36748,21944 36748,36749 36748,36753 36750,21442 36751,68 36751,1381 36752,6627 36754,360 36754,2617 36754,2784 36755,19 36755,77 36755,379 36755,657 36755,1274 36755,1984 36755,3413 36755,7768 36755,75912 36756,34 36756,35 36757,1143 36757,2367 36758,1639 36759,592 36760,147 36761,175 36761,589 36761,1085 36761,25402 36761,29263 36761,30328 36761,31462 36761,33338 36761,33764 36761,41253 36761,42810 36761,54452 36761,54948 36761,58532 36761,63699 36761,75223 36761,75281 36762,872 36763,872 36764,872 36765,872 36766,872 36767,872 36768,872 36769,872 36770,872 36771,872 36772,872 36773,356 36773,3003 36774,442 36775,872 36776,312 36777,801 36778,1177 36779,252 36780,626 36781,1454 36782,79 36783,333 36784,877 36785,163 36785,209 36785,579 36785,6303 36786,439 36787,1556 36788,586 36788,784 36788,1262 36788,1332 36788,1572 36788,2701 36789,571 36790,433 36791,3695 36792,1564 36793,1082 36794,676 36795,760 36797,48 36797,704 36798,1707 36799,217 36800,932 36801,592 36804,35632 36804,51002 36804,81615 36804,96937 36804,108365 36805,1284 36805,35632 36806,1267 36806,1579 36806,1893 36806,2051 36808,1707 36809,440 36810,2929 36811,5547 36812,626 36813,34 36813,35 36813,120 36813,222 36813,389 36813,455 36813,657 36813,32751 36813,33508 36814,21944 36815,536 36816,136 36816,137 36817,298 36818,485 36819,1212 36819,1663 36819,2253 36820,1118 36822,328 36822,1179 36823,66 36823,868 36824,2048 36825,1127 36826,298 36827,485 36828,3 36829,1608 36830,8270 36832,859 36833,631 36833,968 36834,536 36835,1181 36836,349 36837,874 36837,1133 36838,628 36839,264 36839,872 36840,1849 36840,32784 36841,111 36841,609 36841,2315 36841,2775 36841,3538 36841,4771 36842,83 36843,2944 36844,1220 36844,1222 36845,252 36846,251 36847,83 36848,83 36850,313 36851,772 36851,1332 36852,1977 36852,1978 36853,178 36854,160 36856,18726 36858,19 36861,3695 36862,1140 36863,422 36864,215 36865,227 36866,2701 36867,328 36868,1016 36869,1849 36870,1010 36871,1722 36872,801 36873,358 36874,383 36875,111 36876,1052 36877,3538 36878,2443 36879,1332 36880,72 36881,1939 36882,248 36883,3193 36884,525 36885,1001 36886,1564 36887,1882 36888,1177 36889,1955 36890,850 36891,9001 36892,1282 36893,1821 36894,1837 36895,714 36896,136 36897,312 36898,9029 36899,1572 36900,4771 36901,1531 36902,1745 36903,3474 36904,1977 36904,1978 36905,7270 36906,104 36907,3804 36908,795 36909,5405 36910,640 36910,1132 36910,1181 36911,2590 36912,920 36913,30 36913,200 36913,248 36913,772 36914,885 36915,346 36915,447 36915,934 36915,1590 36916,1707 36917,1016 36918,2191 36919,251 36920,433 36920,467 36920,162599 36921,298 36922,485 36923,2353 36924,693 36926,298 36927,485 36928,462 36928,473 36928,491 36928,827 36928,1172 36929,171 36930,7652 36932,2244 36933,1860 36934,835 36935,10 36936,31976 36937,259 36938,2367 36939,134 36939,609 36939,1359 36939,1882 36940,30428 36941,1210 36942,1276 36943,58 36944,46 36945,36946 36947,182 36947,206 36947,1227 36947,86416 36948,907 36949,32 36949,1313 36950,687 36950,1556 36950,1836 36953,298 36954,134 36954,332 36955,3218 36956,349 36957,3 36957,37 36957,589 36957,605 36958,1001 36958,1368 36959,3089 36960,2574 36962,2828 36963,2310 36964,72 36965,579 36966,1127 36967,252 36967,318 36967,1220 36967,1222 36967,41170 36968,493 36969,289 36969,392 36969,577 36969,1001 36969,1070 36969,1289 36969,1326 36969,1462 36969,8537 36969,94134 36970,312 36971,868 36972,14434 36973,920 36973,1623 36974,575 36975,273 36975,2089 36975,2940 36975,21944 36976,36977 36978,217 36978,1417 36979,2244 36980,222 36981,240 36981,518 36981,18738 36982,392 36982,1590 36983,885 36984,340 36985,140 36986,2017 36986,17309 36988,301 36988,968 36988,189303 36990,264 36990,1509 36990,1551 36991,861 36993,10 36994,1836 36996,247 36998,178 37000,209 37000,302 37000,893 37000,1556 37001,433 37002,1289 37003,3209 37004,1433 37005,5213 37006,4 37006,5 37007,3451 37007,3452 37008,390 37009,65 37010,5213 37011,17590 37012,160 37013,17593 37014,37015 37016,1465 37017,247 37018,5213 37019,1227 37019,1229 37019,21944 37019,86416 37020,1782 37021,1860 37022,690 37023,743 37024,1381 37025,338 37026,779 37027,1381 37027,1509 37028,1623 37029,302 37030,130 37030,264 37030,626 37030,1127 37030,1381 37030,1509 37030,1893 37031,1227 37031,1229 37031,86416 37032,206 37032,2837 37033,252 37033,516 37033,1220 37033,1222 37033,41170 37034,252 37034,1243 37035,442 37035,749 37036,79 37037,338 37038,111 37039,809 37040,264 37040,1381 37040,1509 37040,1893 37041,483 37042,186 37042,450 37042,615 37042,1400 37042,1449 37042,19488 37043,338 37044,298 37045,485 37046,338 37047,605 37048,660 37049,932 37050,1506 37051,99 37052,1381 37053,37054 37055,54 37056,467 37056,872 37057,187 37058,356 37059,195 37060,34 37060,35 37060,83 37060,313 37060,1240 37061,37 37062,707 37063,104 37063,200 37064,264 37064,1381 37066,151 37067,66 37067,818 37069,772 37070,996 37071,247 37072,631 37073,151 37073,202 37073,203 37073,536 37073,599 37073,736 37073,843 37073,849 37073,852 37073,1844 37073,2073 37073,2310 37073,3345 37074,178 37075,258 37076,1257 37077,1634 37078,406 37078,1181 37079,355 37080,83 37081,1381 37082,1082 37083,158 37084,225 37085,83 37085,285 37085,2779 37085,2784 37087,37088 37088,8 37088,19 37088,54 37088,222 37088,278 37088,283 37088,379 37088,385 37088,408 37088,439 37088,455 37088,1871 37088,2159 37088,2290 37088,2421 37088,2424 37088,3758 37088,3792 37088,4166 37088,6667 37088,6789 37088,7698 37088,7768 37088,13137 37088,13420 37088,15694 37088,17273 37088,19349 37088,25670 37088,31205 37088,37088 37088,38845 37088,41450 37088,115474 37088,130275 37088,145991 37088,166288 37088,172486 37088,178554 37088,190108 37088,192900 37088,215815 37088,217469 37088,239462 37088,251862 37089,3079 37090,83 37090,285 37090,2784 37091,1052 37092,23701 37093,3872 37094,247 37095,34 37095,222 37095,455 37095,536 37095,1531 37095,1571 37095,1756 37095,7768 37096,37097 37096,49499 37096,50570 37098,972 37099,877 37100,4 37100,5 37100,332 37100,1119 37100,1282 37100,2205 37100,27041 37100,33424 37100,111142 37101,1551 37101,3041 37101,21944 37102,44 37103,500 37103,718 37104,10 37104,151 37104,37105 37104,168457 37106,37105 37107,37105 37108,1522 37109,372 37110,217 37110,536 37110,2319 37110,4672 37110,18831 37111,37112 37111,53518 37111,85532 37114,749 37115,37116 37117,298 37118,485 37119,406 37121,99 37122,264 37122,1381 37122,1893 37123,1572 37123,1623 37124,79 37125,206 37126,171 37127,372 37127,390 37128,338 37129,704 37130,10 37131,16683 37132,861 37133,22 37133,652 37134,1556 37135,3413 37136,493 37137,5375 37139,271 37141,72 37142,178 37143,3252 37144,1227 37144,1229 37144,1368 37145,135 37146,1860 37147,818 37148,932 37149,1531 37150,147 37150,68069 37151,37152 37153,83 37153,285 37153,2784 37154,10 37154,198 37155,83 37156,202 37156,203 37157,138 37157,1227 37157,1229 37157,21944 37157,55849 37158,602 37159,1082 37160,338 37161,1707 37162,309 37162,310 37162,611 37162,1118 37162,3695 37163,1776 37164,225 37165,83 37165,285 37165,2784 37165,28130 37166,2334 37168,438 37169,622 37170,4453 37171,805 37172,435 37173,1634 37174,557 37175,557 37176,250 37177,393 37178,298 37179,485 37180,217 37181,1454 37182,37183 37182,61493 37182,83184 37182,97843 37182,102978 37182,115323 37182,122299 37182,124173 37182,127598 37182,127615 37182,127651 37182,132561 37182,156543 37182,163273 37182,170428 37182,177826 37182,191097 37182,199270 37184,255 37185,743 37186,250 37189,417 37189,525 37189,805 37189,1085 37189,1749 37189,1818 37189,2286 37189,2620 37190,79 37192,298 37193,485 37194,452 37195,1247 37196,184 37197,147 37198,83 37198,285 37198,2779 37198,2784 37199,206 37200,644 37201,623 37201,1805 37202,1146 37202,1818 37202,9457 37203,3 37204,579 37204,599 37205,37206 37207,417 37208,1247 37208,164572 37209,149 37210,4 37210,5 37212,1227 37212,1229 37214,1143 37215,640 37216,8788 37217,2351 37218,158 37218,2244 37219,623 37219,1240 37219,1805 37219,1860 37219,4760 37219,22293 37219,23287 37219,102560 37219,138686 37219,171641 37219,207045 37219,212914 37220,1467 37221,4252 37222,2436 37223,254 37223,1363 37224,81 37224,192 37224,264 37224,647 37224,1818 37224,4771 37225,1368 37226,346 37227,206 37228,15 37229,37230 37231,2434 37232,94 37232,1608 37232,1882 37232,2787 37232,3507 37233,718 37234,37235 37236,314 37237,54 37238,333 37238,779 37238,2931 37239,4101 37240,9743 37241,247 37242,3069 37243,801 37244,1019 37245,481 37246,37247 37248,272 37249,346 37250,2506 37251,376 37252,885 37253,264 37253,1102 37254,222 37255,7360 37256,9560 37257,50 37257,147 37257,206 37257,406 37257,620 37257,622 37257,779 37257,1181 37257,1515 37257,2931 37257,4192 37257,4193 37257,5874 37258,602 37260,7092 37261,14434 37262,452 37262,457 37262,497 37262,918 37262,1655 37263,631 37263,1462 37263,8537 37264,302 37264,1893 37264,2626 37264,5547 37265,298 37266,485 37267,920 37268,4 37268,5 37268,151 37268,310 37268,622 37268,3039 37270,920 37271,920 37272,104 37273,1085 37274,32 37275,83 37275,178 37275,259 37275,500 37275,620 37275,1655 37275,2923 37275,3507 37276,5440 37277,211 37278,240 37279,557 37280,160 37281,392 37282,72 37283,72 37284,151 37285,1414 37287,907 37289,406 37290,3069 37291,149 37293,2590 37294,37295 37294,52234 37294,103854 37294,107868 37296,772 37297,1634 37298,2506 37299,37300 37301,704 37302,206 37303,298 37304,264 37304,872 37304,1381 37304,1509 37304,1893 37304,191860 37305,366 37306,366 37307,366 37308,366 37309,366 37310,323 37311,920 37311,1623 37312,120 37313,932 37314,358 37314,1509 37315,447 37315,1877 37315,6661 37316,264 37316,515 37316,652 37317,79 37318,233 37319,3 37320,515 37321,673 37322,58 37323,46 37324,349 37325,3295 37326,298 37327,485 37329,143 37329,477 37329,1789 37329,2105 37330,37331 37333,302 37334,151 37335,37336 37337,37338 37339,442 37340,444 37341,37342 37343,97 37343,120 37343,182 37343,200 37343,217 37343,222 37343,240 37343,388 37343,392 37343,420 37343,510 37343,622 37343,710 37343,850 37343,972 37343,1010 37343,1085 37343,1210 37343,1284 37343,1326 37343,1402 37343,1419 37343,1673 37343,1818 37343,1893 37343,2512 37343,2626 37343,3182 37343,4355 37343,5310 37343,9005 37344,652 37345,30 37345,79 37345,309 37345,310 37345,622 37346,3451 37346,3452 37347,48 37347,72 37347,87 37347,140 37347,160 37347,312 37347,338 37347,515 37347,525 37347,1052 37347,1289 37347,1381 37347,1509 37347,1579 37347,1893 37347,2312 37347,2605 37347,5440 37348,385 37349,907 37349,932 37350,1313 37351,3 37352,217 37352,1579 37353,83 37354,1467 37355,46 37355,58 37355,1124 37356,298 37357,485 37358,2867 37358,2868 37358,22880 37359,663 37359,664 37359,2334 37360,298 37361,485 37362,698 37362,938 37362,1782 37362,13991 37362,133581 37364,595 37365,207 37366,252 37366,318 37366,41170 37367,299 37370,192 37370,1172 37371,273 37371,274 37372,298 37373,485 37375,996 37376,477 37377,298 37378,485 37381,301 37381,615 37381,968 37381,5662 37381,231939 37386,602 37387,442 37388,175 37389,704 37390,704 37391,306 37391,307 37392,1454 37392,1844 37393,2351 37394,733 37396,4101 37396,31517 37399,37400 37401,640 37402,718 37403,640 37404,640 37405,640 37406,640 37407,240 37407,261 37407,372 37407,390 37407,818 37409,298 37410,485 37411,808 37412,996 37413,535 37414,338 37414,441 37414,611 37414,745 37414,1572 37414,7921 37414,19676 37414,37414 37414,48955 37414,54326 37414,65901 37414,65911 37414,81149 37414,94091 37414,130296 37414,145461 37414,216722 37414,224083 37415,298 37416,485 37417,209 37418,292 37420,3003 37421,442 37422,41 37422,718 37424,104 37424,225 37424,248 37424,1332 37425,346 37426,1240 37426,76096 37427,77 37428,5405 37429,473 37429,707 37431,1619 37432,2590 37433,693 37434,996 37436,37437 37438,809 37439,907 37439,932 37440,682 37440,1353 37440,72439 37441,79 37441,192 37441,422 37442,22 37442,227 37443,209 37445,393 37445,1821 37446,309 37446,310 37447,37448 37449,37450 37451,58 37451,178 37451,685 37451,994 37451,17593 37452,852 37452,1782 37453,301 37453,615 37453,968 37453,1293 37454,422 37455,422 37456,328 37457,422 37458,422 37459,209 37460,422 37461,422 37462,422 37463,1323 37464,102 37465,1326 37466,408 37467,310 37468,3161 37469,1313 37472,516 37472,1385 37473,215 37474,1860 37475,932 37476,518 37477,46 37478,907 37479,65 37479,66 37480,79 37480,1276 37481,192 37481,663 37482,1167 37483,240 37483,312 37484,10 37489,9121 37490,957 37491,305 37492,104 37492,1282 37493,301 37493,752 37493,968 37493,1522 37493,2557 37493,20359 37494,171 37495,301 37495,968 37496,171 37497,182 37497,1118 37500,195 37501,644 37503,1284 37503,1732 37504,843 37505,358 37506,4 37506,5 37507,875 37508,1836 37509,240 37511,1635 37511,1688 37511,2979 37512,1803 37513,15 37513,994 37513,3538 37513,7360 37514,1511 37514,3069 37515,104 37515,332 37515,467 37515,3328 37516,1001 37516,3094 37517,1118 37518,704 37520,13136 37521,1072 37522,3 37523,1479 37524,37525 37526,115659 37526,142870 37527,2315 37528,7124 37529,992 37531,37532 37533,292 37535,1014 37537,1608 37538,298 37539,330 37540,37541 37542,1241 37543,424 37544,269 37545,200 37545,772 37546,79 37547,304 37547,356 37547,442 37547,795 37547,852 37547,859 37547,1782 37547,2620 37547,6068 37548,3582 37549,422 37550,56 37551,1 37552,160 37553,1298 37554,720 37555,2867 37555,2868 37555,22880 37558,1888 37559,1235 37559,1335 37559,2089 37559,2940 37559,21944 37560,1955 37561,602 37564,1433 37565,37566 37567,907 37567,932 37568,56 37568,422 37568,30331 37568,60576 37569,65 37569,467 37569,1433 37570,313 37570,843 37571,3 37575,503 37575,1257 37576,385 37576,4672 37576,37577 37576,68069 37576,86832 37578,83 37579,652 37581,22 37582,503 37582,2379 37583,503 37584,503 37584,1149 37585,503 37586,299 37586,312 37587,980 37587,1531 37587,2178 37587,4455 37587,4545 37587,16331 37588,503 37588,1149 37589,1072 37590,346 37591,503 37595,885 37596,929 37597,209 37598,240 37599,372 37601,287 37602,622 37602,1326 37602,1849 37603,1012 37604,503 37605,1287 37607,503 37609,503 37610,46 37610,1124 37612,134 37613,996 37614,298 37615,485 37616,34 37616,35 37616,222 37616,283 37616,389 37616,536 37616,657 37616,781 37616,949 37616,1019 37616,1072 37616,1274 37616,1467 37616,1539 37616,1718 37616,1871 37616,1881 37616,2266 37616,2424 37616,2671 37616,2784 37616,4594 37616,5976 37616,6789 37616,6888 37616,13575 37616,29475 37618,1977 37618,1978 37629,192 37630,720 37630,877 37630,973 37630,1001 37630,1284 37630,1522 37630,1715 37630,1837 37630,2191 37630,9024 37633,503 37637,1688 37639,37640 37639,57702 37639,62299 37639,87557 37639,99496 37639,101552 37643,1188 37647,1298 37648,6263 37649,21944 37650,859 37651,134 37651,225 37651,431 37651,801 37651,8180 37652,781 37653,1332 37654,47 37654,2469 37655,81 37655,215 37655,227 37655,328 37655,430 37655,503 37655,704 37655,760 37655,1016 37655,1149 37655,1257 37655,1282 37655,1392 37655,2210 37655,4237 37655,20063 37656,83 37657,623 37658,15573 37659,338 37659,340 37659,360 37659,1224 37660,309 37660,310 37661,1860 37662,2671 37663,4094 37664,37665 37666,83 37666,379 37666,2784 37667,2506 37668,1130 37669,158 37669,406 37670,623 37671,5547 37672,868 37672,1433 37673,259 37674,852 37674,1326 37675,920 37676,406 37676,2931 37677,433 37679,567 37680,3724 37681,37681 37682,37683 37684,943 37685,660 37685,1539 37686,63 37687,151 37688,1608 37690,50 37691,20 37692,433 37692,1634 37693,473 37696,147 37697,252 37697,516 37699,1419 37700,264 37701,1243 37701,1515 37703,557 37704,1247 37705,1818 37707,192 37707,663 37707,664 37708,54 37708,455 37709,30 37711,1515 37712,809 37713,4 37713,5 37713,1983 37714,158 37715,503 37715,704 37716,713 37718,406 37719,299 37721,652 37721,1659 37722,3507 37723,433 37725,862 37726,217 37726,457 37727,1531 37728,1289 37728,1893 37728,2617 37729,424 37730,30 37730,328 37730,431 37730,631 37730,4222 37731,37732 37733,388 37733,467 37733,1411 37734,26922 37735,1284 37736,1506 37737,577 37738,83 37739,577 37740,1353 37741,134 37741,200 37741,289 37741,1016 37741,6556 37741,94134 37742,219 37743,452 37743,457 37743,918 37743,1417 37743,1796 37744,151 37745,1522 37747,602 37751,1102 37753,717 37755,1623 37756,247 37758,37759 37760,3 37760,1807 37760,1984 37761,1506 37761,22125 37762,536 37762,2266 37762,2421 37764,240 37764,615 37764,968 37764,1119 37764,1818 37764,1832 37764,1837 37765,3 37765,3507 37766,315 37766,500 37766,622 37767,37768 37769,1370 37770,7416 37771,388 37771,483 37771,626 37771,671 37771,795 37771,827 37771,973 37771,1089 37771,1119 37771,1146 37771,1298 37771,1368 37771,1415 37771,1608 37771,1623 37771,1644 37771,2775 37771,3182 37771,4222 37771,6638 37771,48505 37773,171 37774,86 37775,1805 37776,875 37777,158 37777,779 37778,1433 37779,500 37780,1962 37781,1052 37782,1882 37783,2775 37784,54 37785,2210 37785,4237 37786,518 37787,581 37788,294 37789,1465 37790,160 37791,8719 37793,406 37795,1837 37795,3612 37796,1663 37797,1127 37798,422 37799,56 37800,22 37800,120 37800,302 37800,861 37800,1240 37800,6303 37801,158 37801,620 37801,1181 37802,2590 37803,843 37804,422 37805,56 37806,151 37807,1509 37809,690 37810,273 37810,274 37811,333 37812,344 37813,115 37813,118 37814,422 37815,56 37816,104 37816,332 37816,714 37816,1368 37816,1659 37816,1715 37816,1749 37816,1962 37816,2620 37817,8992 37818,585 37819,1149 37820,349 37820,697 37821,211 37822,1370 37823,392 37823,1240 37824,275 37825,160 37826,301 37827,483 37828,1539 37829,10 37830,151 37831,222 37832,640 37833,852 37834,1285 37835,171 37836,200 37836,31977 37836,77183 37836,78277 37836,84869 37836,106420 37836,111885 37836,193841 37837,111 37838,805 37839,925 37840,247 37841,37842 37843,602 37844,192 37845,1033 37846,356 37847,302 37848,433 37849,1127 37849,3148 37850,875 37851,1118 37852,217 37852,1019 37852,1417 37852,1531 37852,2266 37853,4 37853,5 37854,184 37855,640 37856,861 37857,120 37857,1284 37857,1419 37857,1740 37858,875 37859,392 37859,644 37860,7360 37861,6051 37862,83 37863,433 37864,784 37865,682 37866,83 37867,392 37867,1151 37868,500 37869,192 37870,439 37871,37872 37873,37872 37874,37872 37875,37872 37876,1133 37877,4060 37878,9026 37882,406 37882,779 37883,37884 37885,272 37886,2775 37887,447 37888,14989 37889,622 37890,406 37891,877 37892,631 37893,79 37893,1707 37894,862 37895,120 37895,332 37895,392 37895,455 37895,644 37895,1019 37895,2989 37895,2991 37896,2735 37898,1274 37899,1556 37900,1072 37901,1608 37902,72 37903,875 37904,30 37905,1551 37906,202 37906,203 37907,588 37907,590 37909,37910 37911,1983 37913,37914 37915,344 37915,1984 37915,3949 37916,273 37916,274 37917,273 37917,274 37918,1016 37919,37920 37921,563 37922,1506 37924,24 37924,2089 37924,2940 37924,4079 37924,21944 37925,83 37926,811 37927,592 37927,1818 37927,2995 37928,2506 37929,2506 37930,2506 37931,2506 37932,2506 37933,2506 37934,1559 37935,671 37936,209 37937,557 37938,557 37941,37942 37943,1782 37944,2367 37945,83 37945,2266 37945,3252 37946,252 37947,5976 37948,1332 37949,1579 37949,5440 37950,10 37950,175 37950,779 37950,13546 37950,31977 37950,37951 37950,228298 37950,230697 37950,241421 37950,253626 37950,254805 37954,301 37954,536 37954,2006 37954,2620 37955,37956 37957,1858 37958,1860 37959,393 37960,1381 37961,660 37962,247 37963,467 37963,571 37963,868 37964,433 37965,37966 37965,100084 37967,178 37967,261 37968,996 37969,872 37970,1467 37971,872 37972,1566 37973,37974 37975,872 37976,510 37977,417 37978,406 37978,779 37979,2506 37980,207 37981,10 37982,861 37983,891 37984,37985 37986,726 37987,255 37988,3413 37989,1285 37989,1955 37990,809 37991,1001 37991,1085 37992,602 37993,269 37994,10 37994,34 37994,35 37994,192 37994,247 37995,704 37996,1433 37997,292 37998,37999 38000,1220 38000,1222 38000,1566 38000,1571 38001,192 38002,328 38003,652 38004,175 38005,4192 38005,4193 38006,267 38007,202 38007,203 38008,602 38009,1 38010,10 38010,19005 38012,301 38013,2506 38014,704 38015,704 38016,1227 38016,1229 38018,389 38018,1072 38019,392 38020,323 38022,872 38023,187 38024,38025 38026,240 38027,195 38028,134 38029,455 38030,222 38030,536 38030,4672 38030,7698 38031,1634 38032,801 38033,38034 38033,57021 38035,302 38036,2506 38037,1634 38038,360 38039,366 38040,366 38041,366 38042,366 38043,366 38045,151 38046,38047 38046,51942 38046,53365 38046,55522 38048,38049 38051,323 38052,1078 38054,417 38056,704 38057,38058 38057,60230 38059,1556 38061,38062 38063,1634 38064,151 38065,779 38066,38067 38066,41850 38066,75751 38066,91178 38068,1392 38069,3413 38070,171 38071,3413 38072,1163 38073,111 38074,805 38075,81 38076,28072 38077,323 38078,358 38079,3 38079,510 38080,250 38080,1684 38081,954 38081,1939 38081,10318 38082,567 38083,907 38083,1284 38083,2191 38084,602 38085,30 38085,328 38085,7124 38086,1179 38086,3695 38089,233 38090,392 38090,2699 38091,457 38091,497 38091,918 38092,38093 38094,1181 38095,973 38096,602 38097,38098 38099,38100 38099,59128 38099,85423 38101,1133 38102,38103 38104,50 38104,75912 38105,440 38106,298 38107,136 38107,137 38108,485 38109,2351 38110,7652 38112,704 38113,298 38114,485 38115,79 38116,3451 38116,3452 38118,38119 38120,772 38121,10 38122,980 38123,323 38124,340 38125,38126 38127,2334 38128,893 38129,269 38129,1014 38130,137 38132,259 38132,980 38132,1531 38133,1058 38133,3367 38133,3804 38134,306 38134,307 38136,79 38137,38138 38139,389 38140,440 38140,467 38140,663 38140,762 38140,794 38140,2373 38140,2979 38140,3207 38140,227061 38141,996 38142,592 38143,575 38144,596 38144,1368 38145,217 38146,4637 38147,455 38148,2266 38149,1201 38150,2421 38151,941 38152,710 38153,222 38153,694 38153,1871 38155,1238 38156,907 38158,20 38158,183412 38159,1172 38160,852 38160,1429 38161,1452 38162,626 38163,652 38164,289 38164,290 38165,2867 38165,22880 38166,1140 38169,818 38170,652 38170,2312 38171,1323 38172,102 38173,1326 38174,408 38175,222 38176,71 38176,258 38176,408 38176,611 38176,1623 38176,1983 38176,2867 38176,22880 38176,64147 38178,301 38178,968 38179,885 38180,217 38180,240 38180,356 38180,379 38180,694 38180,3115 38181,671 38182,299 38183,71 38183,1227 38183,86416 38184,422 38185,422 38186,440 38187,422 38188,422 38189,422 38190,422 38191,626 38192,422 38193,422 38194,366 38194,500 38194,718 38195,503 38195,1149 38196,640 38197,640 38198,640 38199,640 38200,640 38201,346 38204,54 38206,602 38207,3695 38208,602 38209,1590 38209,1644 38210,602 38211,1983 38212,1319 38213,83 38213,222 38213,356 38213,536 38213,852 38213,2266 38214,333 38214,459 38214,2135 38215,3331 38216,1381 38217,3422 38219,907 38220,240 38221,743 38221,8714 38223,1608 38224,3246 38224,3247 38225,211 38226,1707 38227,283 38227,1019 38228,920 38229,2574 38230,671 38231,20771 38232,1285 38233,225 38233,850 38233,1332 38234,893 38234,1146 38235,6252 38235,38236 38237,9195 38238,1425 38238,2867 38238,2868 38239,1634 38240,309 38240,310 38241,515 38242,50 38243,146 38243,158 38243,192 38243,285 38243,336 38243,406 38243,620 38243,779 38243,1515 38243,1531 38244,1241 38245,138 38246,1983 38247,1849 38248,2421 38249,5405 38250,712 38251,120 38251,379 38251,536 38251,1274 38251,5547 38251,7698 38251,115474 38252,273 38252,274 38253,439 38254,932 38255,217 38255,247 38255,252 38255,372 38255,467 38255,1181 38255,41170 38256,1858 38257,1860 38259,126 38260,126 38262,38262 38263,83 38264,647 38265,344 38266,8180 38267,644 38268,596 38268,2296 38269,20 38272,28 38272,4571 38272,88820 38273,126 38273,430 38273,457 38274,907 38274,932 38275,431 38275,631 38276,195 38277,2775 38278,447 38279,3538 38280,1326 38282,119 38282,19519 38283,366 38284,877 38284,1715 38285,687 38285,1556 38286,500 38287,1962 38288,1052 38289,1882 38290,2775 38291,54 38292,2210 38292,4237 38293,996 38294,1849 38295,2205 38295,2206 38298,4 38298,5 38298,134 38299,972 38299,124668 38300,1 38300,217 38300,292 38300,309 38300,310 38300,372 38300,406 38300,439 38300,510 38300,599 38300,626 38300,631 38300,752 38300,760 38300,779 38300,973 38300,1143 38300,1149 38300,1181 38300,1231 38300,1370 38300,1385 38300,1411 38300,1417 38300,1522 38300,1715 38300,1801 38300,1837 38300,1844 38300,2209 38300,2646 38300,3474 38300,3623 38300,3804 38300,136014 38303,323 38304,41 38304,406 38304,435 38304,1181 38305,250 38305,306 38305,307 38305,994 38305,1247 38305,1684 38305,2088 38305,154690 38305,164572 38306,811 38307,1436 38308,171 38309,1414 38310,4 38310,5 38311,1973 38313,344 38315,79 38315,726 38317,2775 38318,120 38318,1419 38320,1977 38320,1978 38321,3260 38322,718 38323,106 38323,1220 38323,1222 38324,344 38325,694 38325,2775 38326,579 38326,1172 38327,1805 38328,19 38328,77 38328,743 38328,1274 38328,1984 38328,3413 38330,433 38331,19443 38332,209 38333,330 38334,160 38335,852 38336,433 38339,309 38339,310 38339,652 38340,424 38341,2828 38343,788 38344,861 38345,5366 38346,302 38346,579 38346,1188 38346,6303 38347,111 38347,1659 38349,567 38349,604 38349,750 38350,167 38351,3724 38353,217 38353,240 38353,294 38354,704 38355,440 38356,1085 38357,794 38358,697 38358,2626 38361,97 38362,1663 38363,79 38364,3999 38365,5101 38366,349 38367,269 38368,302 38368,861 38370,298 38371,485 38372,920 38374,406 38375,118 38375,4597 38376,2017 38376,17309 38377,273 38377,274 38378,72 38379,81 38381,54 38382,2506 38384,557 38385,577 38385,2367 38386,158 38386,467 38386,872 38386,55171 38386,118336 38387,107 38387,111 38387,296 38387,1659 38388,3260 38389,38390 38392,206 38393,272 38393,538 38394,431 38394,596 38394,704 38394,805 38394,1052 38394,1402 38394,3507 38395,2979 38396,3193 38397,83 38398,261 38399,1803 38400,264 38401,491 38402,264 38402,1749 38403,217 38403,479 38404,660 38404,1631 38404,2168 38404,5662 38404,142473 38405,7124 38406,358 38406,1634 38406,1801 38406,2590 38406,6424 38406,28107 38407,438 38407,671 38407,934 38407,1776 38408,2244 38409,1252 38409,1253 38410,483 38410,2105 38411,1707 38412,65 38413,83 38414,536 38415,2671 38416,309 38416,310 38417,247 38418,1564 38419,333 38419,1181 38420,20 38420,178 38420,352 38420,440 38420,1033 38420,1147 38421,843 38422,862 38423,38424 38423,106644 38423,171704 38423,175571 38425,389 38426,178 38426,996 38427,811 38427,145751 38428,254 38429,211 38431,1659 38432,868 38433,586 38434,356 38435,1801 38436,873 38437,943 38437,152855 38438,1140 38438,3474 38440,766 38441,2574 38442,1983 38443,38444 38445,5366 38447,1127 38448,151 38449,20 38449,207 38449,48505 38450,302 38450,392 38450,595 38450,809 38450,893 38450,1143 38450,1722 38450,3258 38451,349 38451,3260 38452,592 38453,500 38454,72 38455,907 38455,932 38456,72 38457,1836 38458,252 38459,676 38460,2867 38460,22880 38461,285 38461,21944 38462,9560 38463,104 38463,392 38464,38465 38466,2775 38466,3507 38467,158 38468,2353 38469,247 38470,79 38471,358 38472,3507 38473,3447 38474,390 38475,1326 38476,83 38476,217 38476,278 38476,509 38476,536 38476,1019 38476,1467 38476,8855 38476,20359 38477,392 38477,697 38477,1893 38477,2116 38477,4672 38477,5547 38477,8907 38477,59021 38477,118336 38478,536 38479,2784 38480,602 38481,247 38482,704 38483,1381 38484,255 38485,83 38486,1240 38487,376 38488,885 38489,422 38490,406 38491,431 38491,631 38492,240 38493,843 38494,38495 38496,862 38497,760 38498,269 38499,5375 38500,3138 38500,6303 38501,1085 38502,158 38503,280 38504,93 38504,94 38505,33598 38506,298 38507,485 38508,1962 38509,240 38510,2353 38512,2296 38513,38514 38515,79 38516,346 38517,301 38517,652 38517,733 38518,1227 38518,1229 38518,86416 38520,779 38521,83 38522,704 38523,704 38524,309 38524,310 38525,859 38526,949 38527,1722 38528,83 38529,479 38530,1085 38530,2206 38531,366 38531,500 38532,557 38533,557 38534,907 38535,38536 38537,15573 38538,953 38539,1858 38540,83 38541,818 38542,389 38545,953 38546,2367 38546,8820 38547,38548 38549,120 38550,298 38551,485 38552,38553 38554,1287 38555,9029 38556,2244 38557,1659 38558,2995 38559,1370 38560,2351 38561,8788 38562,1181 38563,1 38563,275 38563,277 38564,206 38565,19 38565,34 38565,217 38565,313 38565,536 38565,891 38565,949 38565,1274 38565,1881 38565,2266 38565,2553 38565,2646 38565,2944 38565,6298 38565,7092 38565,7698 38565,217598 38566,1181 38567,137 38568,178 38569,872 38570,1133 38571,72 38572,273 38573,602 38574,272 38575,5405 38576,1181 38577,298 38578,485 38579,424 38580,2775 38581,447 38582,192 38582,442 38582,1392 38582,2671 38583,1133 38583,1462 38584,3872 38584,4193 38585,5405 38586,7358 38586,7363 38587,1844 38588,72 38588,588 38588,590 38589,406 38590,38591 38592,3653 38593,17772 38594,298 38595,485 38596,2775 38597,447 38598,2506 38599,602 38600,2506 38601,349 38602,2775 38603,447 38604,107 38605,467 38605,536 38605,156379 38606,38607 38608,693 38609,1893 38609,4294 38610,2506 38612,104 38612,136 38612,312 38612,557 38612,875 38612,1238 38612,1572 38612,1722 38612,3538 38612,3612 38613,333 38614,323 38615,273 38615,274 38616,483 38617,292 38618,682 38619,17772 38620,5366 38621,323 38622,8270 38623,323 38624,1556 38625,255 38626,406 38627,1452 38628,50 38628,192 38628,195 38628,779 38628,5874 38628,6119 38629,323 38630,346 38631,38632 38633,38634 38634,38634 38635,323 38636,3246 38636,3247 38637,323 38638,83 38639,1425 38639,1515 38640,392 38640,1836 38641,3246 38641,3247 38642,2775 38643,447 38644,422 38645,56 38646,346 38647,192 38647,366 38647,640 38648,202 38648,203 38649,1181 38650,248 38650,450 38651,38652 38653,38652 38654,323 38655,2995 38656,280 38657,4193 38657,17588 38658,222 38659,134 38660,5405 38661,2697 38661,7363 38662,38663 38664,258 38665,66 38666,38667 38668,147 38669,4101 38670,323 38672,2048 38673,671 38674,38675 38676,17334 38677,652 38678,1102 38679,1608 38680,1052 38682,602 38683,31977 38684,505 38685,1010 38686,704 38687,1634 38688,79 38688,111 38688,602 38688,620 38688,663 38688,1181 38689,233 38690,273 38690,274 38691,1267 38692,4475 38693,515 38694,366 38695,366 38696,366 38697,366 38698,366 38699,366 38700,1235 38700,1335 38701,366 38702,366 38703,366 38704,10 38705,515 38705,2572 38706,872 38707,1392 38708,1143 38709,298 38710,485 38711,1792 38711,6424 38711,13441 38711,14098 38711,15711 38711,16378 38711,18288 38711,19358 38711,23311 38711,25395 38711,28107 38711,28193 38711,28196 38711,28387 38711,29001 38711,29647 38711,32872 38711,37710 38711,38711 38711,38985 38711,44422 38711,59206 38711,62471 38711,64018 38711,65369 38711,67865 38711,67867 38711,67868 38711,71748 38711,72681 38711,76657 38711,76819 38711,82739 38711,99167 38711,101851 38711,103275 38711,103409 38711,103575 38711,106195 38711,118950 38711,130165 38711,130936 38711,145407 38711,149144 38711,149199 38711,152022 38711,154388 38711,154693 38711,164212 38711,166277 38711,166352 38711,168770 38711,171012 38711,172061 38711,172665 38711,174366 38711,174377 38711,174428 38711,174431 38711,174882 38711,176040 38711,183372 38711,183810 38711,185270 38711,185301 38711,185399 38711,185977 38711,188767 38711,190354 38711,191778 38711,192880 38711,193408 38711,194360 38711,194361 38711,194528 38711,207008 38711,212357 38711,212921 38711,212931 38711,213931 38711,217460 38711,217517 38711,217551 38711,217848 38711,217884 38711,217918 38711,217974 38711,218009 38711,218337 38711,218338 38711,219968 38711,221663 38711,222428 38711,222437 38711,223677 38711,223758 38711,225573 38711,226444 38711,226446 38711,226464 38711,228121 38711,228351 38711,235975 38711,247244 38711,251399 38711,251402 38711,254871 38711,255515 38711,255761 38711,256302 38711,260829 38712,3451 38712,3452 38713,634 38714,298 38715,485 38716,118 38716,605 38716,4597 38717,298 38718,485 38720,875 38721,1556 38722,459 38723,779 38724,859 38725,623 38726,563 38727,118 38727,192 38727,275 38727,620 38727,4597 38728,298 38729,485 38730,83 38730,919 38730,1140 38730,1871 38730,5326 38731,38732 38731,239358 38733,209 38733,467 38733,1849 38733,32784 38734,364 38735,306 38735,307 38736,660 38737,718 38738,38739 38740,652 38741,1400 38742,292 38743,240 38744,1858 38745,1860 38746,207 38747,38748 38749,602 38749,3218 38750,298 38751,485 38752,1893 38754,301 38754,516 38755,388 38755,6638 38756,346 38757,3585 38758,1151 38759,38760 38761,1411 38762,313 38762,1571 38763,171 38764,1363 38764,1927 38765,2867 38765,2868 38765,22880 38766,192 38767,147 38767,158 38768,171 38769,58 38770,3507 38770,75912 38771,292 38772,2334 38772,3474 38773,298 38774,485 38775,1087 38776,20 38777,7757 38778,171 38779,671 38780,298 38781,485 38782,3555 38783,1454 38783,3507 38783,20535 38784,252 38784,318 38784,1220 38784,1222 38785,640 38786,640 38787,596 38788,640 38789,640 38790,500 38792,301 38792,968 38793,1007 38794,1241 38794,6424 38795,2105 38796,1332 38797,640 38799,10 38800,1323 38801,102 38802,1326 38803,408 38804,422 38805,422 38806,422 38807,422 38808,422 38809,422 38811,182 38812,422 38816,301 38816,1782 38817,652 38818,4101 38819,298 38820,485 38821,171 38822,104 38822,136 38822,272 38822,298 38822,417 38822,557 38822,588 38822,590 38822,1001 38822,1085 38822,1474 38822,2089 38822,2253 38822,2296 38822,2572 38822,2940 38822,4220 38822,4222 38822,4237 38822,75912 38822,111142 38822,127158 38822,178576 38823,457 38824,4 38824,5 38825,137 38826,1465 38827,192 38828,6750 38829,66 38830,3252 38831,2867 38831,22880 38832,171 38833,893 38834,56 38834,99 38835,596 38837,503 38838,298 38839,485 38840,652 38841,1893 38842,1653 38843,644 38844,399 38844,1175 38845,2775 38846,10 38847,431 38848,392 38849,298 38850,485 38851,1414 38852,4101 38854,4611 38855,1544 38856,107 38858,1893 38859,313 38859,356 38859,477 38859,781 38859,852 38859,1201 38859,1571 38859,1618 38859,1881 38859,2224 38859,2266 38859,2553 38859,2944 38859,6506 38859,7698 38859,8463 38859,19443 38859,28130 38860,211 38860,1782 38860,1837 38862,388 38863,5265 38864,1052 38865,278 38866,298 38867,58 38868,46 38870,312 38872,272 38873,9195 38875,79 38876,534 38877,8180 38878,1782 38879,868 38880,171 38881,5213 38882,56 38882,99 38882,440 38882,30331 38882,60576 38883,195 38883,202 38883,602 38883,620 38883,204124 38884,717 38885,1556 38886,202 38886,203 38887,7360 38888,1014 38889,1983 38890,171 38891,171 38892,457 38892,818 38893,187 38893,222 38893,968 38893,2224 38893,2421 38894,620 38894,1087 38895,1284 38896,338 38896,360 38896,809 38896,2617 38896,113878 38897,184 38898,1381 38899,251 38899,252 38899,1220 38900,2775 38901,447 38902,79 38903,192 38904,264 38904,1224 38905,10 38906,510 38907,827 38907,1096 38910,1203 38910,1955 38911,298 38912,485 38913,7233 38914,392 38915,873 38916,932 38917,503 38918,273 38918,274 38919,5405 38920,119 38920,794 38922,252 38922,516 38922,41170 38923,509 38923,872 38924,171 38926,920 38926,2334 38927,2931 38928,34 38928,35 38929,647 38930,344 38931,775 38932,1085 38934,211 38936,22 38936,818 38937,301 38937,1231 38937,1782 38938,604 38939,516 38939,2775 38940,1571 38941,1014 38942,1544 38943,8270 38944,81 38944,272 38945,298 38946,485 38947,516 38949,301 38950,192 38951,259 38952,1707 38953,1388 38953,142430 38953,142473 38953,142879 38954,79 38954,849 38954,911 38954,1243 38954,1619 38954,1888 38955,493 38955,586 38955,1181 38957,518 38958,3003 38959,750 38959,783 38959,1167 38959,1284 38959,1616 38961,298 38962,485 38963,873 38964,1133 38965,247 38966,34 38966,35 38966,217 38966,536 38967,298 38968,485 38969,38970 38972,657 38972,2421 38972,6789 38972,6824 38973,485 38974,631 38974,1284 38974,3695 38974,148742 38975,30331 38978,298 38979,485 38980,38981 38982,809 38983,2116 38984,1818 38987,58 38988,46 38989,779 38989,68069 38989,141912 38990,68 38991,2116 38992,1858 38993,1860 38994,301 38994,2083 38995,79 38996,1 38996,240 38996,818 38996,1298 38997,515 38999,63 39000,1381 39001,1715 39002,72 39003,3555 39004,1181 39004,1392 39006,1858 39007,1860 39008,1983 39009,592 39010,79 39010,158 39010,1116 39010,2209 39011,167 39011,301 39012,251 39012,252 39012,1220 39012,1222 39013,167 39014,195 39015,1222 39015,1803 39015,3148 39016,1506 39017,4637 39018,455 39019,2266 39020,217 39021,2421 39022,1201 39023,314 39024,83 39024,119 39024,347 39024,364 39024,372 39024,389 39024,417 39024,455 39024,525 39024,626 39024,795 39024,805 39024,907 39024,972 39024,1019 39024,1085 39024,1274 39024,1298 39024,1363 39024,1465 39024,1467 39024,1718 39024,1801 39024,1881 39024,2266 39024,2286 39024,2434 39024,2553 39024,2590 39024,2646 39024,4172 39024,13575 39025,206 39026,389 39027,579 39027,2116 39028,39029 39028,39036 39030,1400 39031,1231 39033,503 39034,252 39034,516 39034,1220 39035,30331 39037,805 39038,417 39038,714 39039,10 39039,113156 39040,163 39040,811 39041,640 39042,805 39043,2867 39043,22880 39044,58 39045,1564 39046,217 39046,240 39046,1287 39047,1298 39047,1635 39047,2979 39048,1429 39049,4980 39050,1181 39051,30 39052,273 39052,274 39052,66754 39053,972 39053,973 39053,1284 39054,439 39055,697 39055,838 39056,209 39056,1860 39057,26 39057,59 39059,872 39059,127158 39060,2073 39061,79 39062,178 39064,1319 39065,891 39066,467 39066,1181 39068,298 39069,485 39070,111 39070,1177 39070,1287 39070,1893 39070,3695 39070,8180 39071,32 39071,392 39071,697 39071,3003 39072,1858 39073,1860 39074,376 39075,885 39076,65 39076,868 39077,557 39078,158 39079,1235 39079,1335 39080,717 39081,83 39082,120 39082,919 39082,2620 39084,280 39084,17245 39085,3 39086,83 39087,104 39088,1962 39089,581 39090,79 39091,850 39092,151 39093,39094 39095,287 39095,809 39095,893 39096,32 39097,79 39098,447 39099,589 39100,6068 39101,22 39102,392 39103,44 39104,2116 39105,289 39105,290 39105,631 39105,94134 39106,298 39107,485 39108,4 39108,5 39109,292 39110,3138 39111,1319 39113,298 39114,485 39116,392 39116,918 39117,83 39117,1949 39118,503 39119,247 39120,167 39121,4903 39123,615 39124,704 39125,704 39126,298 39127,158 39128,571 39128,18831 39128,21442 39129,158 39130,1745 39131,1511 39131,3069 39132,652 39133,30 39134,433 39135,111 39136,557 39137,209 39137,302 39138,83 39140,333 39141,83 39142,240 39142,1085 39143,20 39145,247 39146,1381 39147,140 39150,1531 39152,292 39153,83 39154,2867 39154,2868 39154,22880 39155,115 39155,118 39156,406 39158,39159 39158,105304 39158,117178 39158,121807 39158,127702 39158,132166 39160,557 39161,296 39162,83 39163,818 39164,30 39164,63 39164,1309 39165,483 39166,1749 39167,392 39167,918 39169,1085 39170,439 39171,39172 39173,202 39173,203 39173,2371 39174,2506 39175,2506 39176,9560 39177,217 39177,577 39177,1429 39178,251 39179,1285 39180,225 39181,106 39182,271 39183,2867 39183,22880 39184,749 39185,2506 39186,7155 39187,250 39188,72 39189,872 39190,298 39191,485 39192,393 39193,424 39194,39195 39196,1 39197,2089 39197,9536 39198,557 39199,298 39200,485 39202,557 39203,269 39204,39205 39206,972 39207,83 39208,784 39209,481 39210,39211 39212,58 39213,151 39214,1983 39215,58 39215,107 39215,647 39215,1353 39216,2116 39217,298 39218,485 39219,305 39220,1392 39221,192 39222,298 39223,485 39224,344 39225,500 39226,1962 39227,1052 39228,1882 39229,2775 39230,54 39231,2210 39231,4237 39232,518 39232,631 39232,968 39232,1326 39232,2205 39232,2206 39233,298 39234,485 39235,147 39236,298 39237,485 39238,22 39238,211 39238,366 39239,39240 39239,90283 39241,39241 39242,1149 39243,585 39244,431 39244,697 39244,3260 39245,1388 39246,39247 39248,399 39248,1983 39249,211 39250,1 39251,261 39252,13136 39253,120 39254,1402 39255,298 39256,485 39257,393 39258,1807 39259,843 39260,1531 39261,298 39262,485 39263,1179 39263,21603 39264,10 39265,195 39266,980 39267,240 39268,3297 39269,2017 39270,137 39271,151 39272,4594 39273,631 39274,10 39275,1085 39276,875 39277,39278 39279,149 39280,503 39280,1287 39281,26 39281,59 39281,994 39281,1432 39282,2351 39283,5366 39284,1544 39285,340 39285,1623 39285,1837 39287,79 39288,720 39288,43203 39289,309 39289,310 39290,158 39290,875 39290,2775 39291,6682 39292,920 39292,1623 39293,39294 39295,1556 39296,515 39297,332 39298,10 39299,1381 39299,1551 39300,240 39300,417 39301,171 39302,784 39302,2105 39302,2750 39303,175 39304,39304 39305,346 39306,58 39306,107 39306,647 39306,1353 39307,215 39307,289 39307,290 39307,417 39307,631 39307,1016 39307,1085 39307,1212 39307,1257 39307,1285 39307,1511 39307,1564 39307,2205 39307,3069 39307,33424 39308,72 39309,323 39310,2506 39311,72 39312,200 39312,1177 39313,273 39313,274 39314,340 39315,1983 39316,346 39317,39318 39319,39318 39320,14483 39321,712 39322,39323 39324,1 39325,39326 39327,39328 39327,81582 39327,99954 39327,107479 39327,113269 39327,113699 39329,505 39330,1010 39332,3148 39334,609 39334,1140 39334,1688 39334,2701 39334,3474 39334,190963 39335,2735 39336,39337 39338,39339 39338,57733 39338,98938 39338,102639 39340,1140 39340,3474 39341,422 39342,56 39343,10 39344,422 39345,56 39346,2923 39347,39348 39349,39350 39351,346 39352,346 39353,346 39354,206 39355,626 39356,81 39357,217 39357,278 39357,536 39357,577 39358,39359 39360,137 39361,63 39363,39364 39365,8854 39366,949 39366,9743 39367,827 39367,893 39368,10 39369,39370 39371,219 39372,872 39373,1 39374,5440 39375,1238 39376,298 39377,485 39378,3724 39379,872 39380,1434 39381,83 39382,1452 39383,516 39384,7 39385,7 39387,39388 39389,63 39390,714 39390,736 39390,1282 39390,1659 39391,579 39392,3451 39392,3452 39393,7 39394,7 39395,298 39396,485 39398,83 39399,2178 39399,4545 39400,1977 39400,1978 39401,2116 39402,611 39404,313 39405,39406 39407,406 39409,703 39410,868 39411,306 39411,307 39412,671 39412,1096 39412,1287 39412,1623 39412,81233 39413,366 39414,366 39415,366 39416,366 39417,366 39418,366 39419,366 39421,292 39422,366 39423,366 39424,366 39425,489 39426,273 39426,274 39426,313 39427,433 39428,2574 39429,615 39430,10 39431,107 39432,298 39433,485 39434,39435 39436,48 39436,140 39437,1 39437,147 39437,149 39437,171 39437,184 39437,1623 39438,5250 39439,30 39439,595 39439,872 39439,1151 39439,4039 39439,19010 39440,298 39441,485 39442,893 39443,720 39444,313 39444,1052 39444,2421 39445,720 39445,6059 39446,457 39446,515 39446,557 39446,581 39446,868 39446,941 39446,1130 39446,2373 39447,640 39448,640 39449,298 39450,485 39451,720 39452,640 39453,259 39456,3 39456,312 39456,390 39456,702 39456,873 39456,1140 39456,1454 39456,1801 39456,2045 39457,640 39458,640 39459,640 39460,671 39461,278 39462,1313 39463,50 39463,79 39463,147 39463,158 39463,178 39463,192 39463,285 39463,406 39463,620 39463,622 39463,779 39463,1181 39463,1515 39463,1531 39463,2931 39463,4192 39463,4193 39463,102560 39463,240174 39465,340 39466,1769 39467,1243 39468,1323 39469,102 39470,1326 39471,408 39472,32 39473,668 39473,1607 39474,435 39476,611 39476,1370 39477,652 39478,5662 39479,247 39480,389 39480,536 39483,875 39484,1515 39485,1655 39486,138 39488,30 39489,500 39490,298 39491,485 39492,10 39492,113156 39493,2668 39494,422 39495,83 39497,422 39498,422 39499,422 39500,1332 39501,422 39502,422 39503,422 39504,1181 39505,424 39506,615 39506,3422 39507,2671 39508,872 39508,1072 39510,893 39510,21736 39512,81 39513,1204 39514,39515 39514,130391 39516,344 39517,1238 39518,83 39519,147 39520,34 39520,35 39520,907 39520,1001 39520,1133 39520,1284 39520,1715 39520,9018 39520,19946 39521,77 39522,151 39523,657 39524,668 39527,1 39528,953 39529,4101 39530,292 39530,811 39530,893 39530,1319 39530,1740 39531,17476 39532,1 39532,827 39532,1247 39532,1305 39533,457 39534,1085 39536,160 39536,457 39536,972 39537,217 39537,477 39537,536 39537,781 39537,1019 39537,1871 39537,2168 39537,2553 39537,2646 39537,2944 39537,7698 39538,1983 39539,30331 39540,255 39541,3 39542,360 39543,877 39543,1623 39543,145502 39544,30331 39545,1429 39546,704 39547,30331 39548,1227 39548,1229 39549,106 39550,349 39551,273 39551,274 39552,202 39552,203 39552,251 39552,467 39552,1385 39553,1707 39555,195 39556,599 39557,893 39558,1010 39560,718 39561,54 39561,536 39561,1019 39561,2224 39561,2646 39561,5906 39561,6789 39562,972 39562,973 39562,1284 39562,35654 39563,39564 39564,15693 39564,40550 39565,644 39566,167 39567,4101 39568,273 39568,274 39569,2334 39570,1631 39571,6323 39572,19 39572,891 39572,1756 39572,13137 39573,2244 39574,784 39575,126 39575,397 39576,406 39577,252 39577,318 39577,516 39577,1220 39577,1222 39577,2567 39579,225 39579,248 39579,1332 39579,5405 39580,65 39580,586 39581,515 39582,697 39583,873 39583,1210 39584,39585 39586,126 39587,160 39587,264 39587,1289 39588,2315 39590,1977 39590,1978 39591,217 39591,1417 39592,859 39593,46 39593,604 39593,744 39593,762 39593,1293 39594,2286 39595,107 39595,298 39595,1955 39595,3474 39596,403 39597,1149 39598,65 39599,77 39600,34 39600,298 39600,1715 39600,1955 39600,2620 39601,3555 39602,4355 39603,1449 39604,1143 39605,859 39605,138686 39606,893 39608,83 39609,390 39610,435 39611,2828 39612,1014 39613,298 39614,485 39615,1220 39615,1222 39616,252 39617,251 39618,3 39618,10 39618,19 39618,30 39618,32 39618,34 39618,35 39618,37 39618,41 39618,44 39618,48 39618,50 39618,56 39618,58 39618,63 39618,65 39618,68 39618,72 39618,77 39618,79 39618,81 39618,83 39618,85 39618,86 39618,97 39618,99 39618,104 39618,106 39618,107 39618,111 39618,116 39618,120 39618,130 39618,134 39618,135 39618,136 39618,137 39618,138 39618,140 39618,146 39618,149 39618,158 39618,167 39618,178 39618,186 39618,192 39618,195 39618,200 39618,202 39618,203 39618,211 39618,215 39618,217 39618,222 39618,225 39618,227 39618,233 39618,240 39618,248 39618,251 39618,252 39618,254 39618,261 39618,264 39618,272 39618,278 39618,283 39618,285 39618,287 39618,289 39618,290 39618,292 39618,294 39618,296 39618,298 39618,301 39618,302 39618,304 39618,309 39618,310 39618,312 39618,313 39618,315 39618,323 39618,326 39618,328 39618,332 39618,333 39618,337 39618,346 39618,347 39618,349 39618,358 39618,364 39618,366 39618,372 39618,379 39618,388 39618,390 39618,392 39618,393 39618,406 39618,415 39618,417 39618,420 39618,422 39618,431 39618,433 39618,435 39618,439 39618,442 39618,444 39618,447 39618,455 39618,459 39618,477 39618,479 39618,493 39618,500 39618,509 39618,510 39618,515 39618,516 39618,518 39618,525 39618,536 39618,538 39618,557 39618,575 39618,577 39618,586 39618,588 39618,589 39618,590 39618,592 39618,599 39618,602 39618,605 39618,609 39618,615 39618,620 39618,622 39618,623 39618,626 39618,631 39618,634 39618,636 39618,640 39618,647 39618,649 39618,652 39618,653 39618,657 39618,660 39618,663 39618,664 39618,671 39618,682 39618,687 39618,694 39618,702 39618,704 39618,714 39618,717 39618,718 39618,720 39618,726 39618,736 39618,749 39618,752 39618,760 39618,772 39618,779 39618,781 39618,783 39618,784 39618,788 39618,801 39618,805 39618,808 39618,809 39618,811 39618,818 39618,832 39618,841 39618,850 39618,859 39618,861 39618,862 39618,868 39618,872 39618,873 39618,874 39618,875 39618,893 39618,907 39618,919 39618,920 39618,932 39618,934 39618,943 39618,949 39618,968 39618,973 39618,980 39618,996 39618,999 39618,1001 39618,1007 39618,1010 39618,1012 39618,1016 39618,1019 39618,1033 39618,1052 39618,1068 39618,1072 39618,1078 39618,1082 39618,1085 39618,1102 39618,1117 39618,1119 39618,1122 39618,1124 39618,1132 39618,1133 39618,1140 39618,1143 39618,1149 39618,1151 39618,1167 39618,1175 39618,1179 39618,1181 39618,1210 39618,1220 39618,1222 39618,1231 39618,1235 39618,1238 39618,1240 39618,1241 39618,1243 39618,1247 39618,1274 39618,1282 39618,1284 39618,1285 39618,1289 39618,1294 39618,1298 39618,1300 39618,1309 39618,1313 39618,1326 39618,1332 39618,1335 39618,1353 39618,1359 39618,1363 39618,1368 39618,1370 39618,1381 39618,1388 39618,1392 39618,1425 39618,1436 39618,1447 39618,1449 39618,1452 39618,1453 39618,1454 39618,1462 39618,1465 39618,1466 39618,1467 39618,1474 39618,1479 39618,1509 39618,1512 39618,1515 39618,1522 39618,1531 39618,1544 39618,1551 39618,1564 39618,1572 39618,1579 39618,1590 39618,1612 39618,1616 39618,1631 39618,1634 39618,1635 39618,1639 39618,1644 39618,1653 39618,1659 39618,1688 39618,1715 39618,1722 39618,1732 39618,1749 39618,1782 39618,1785 39618,1789 39618,1796 39618,1801 39618,1807 39618,1818 39618,1821 39618,1832 39618,1836 39618,1837 39618,1844 39618,1849 39618,1858 39618,1860 39618,1871 39618,1877 39618,1881 39618,1888 39618,1893 39618,1927 39618,1939 39618,1955 39618,1962 39618,1968 39618,1985 39618,2045 39618,2083 39618,2087 39618,2105 39618,2116 39618,2168 39618,2178 39618,2191 39618,2205 39618,2206 39618,2209 39618,2210 39618,2224 39618,2244 39618,2260 39618,2266 39618,2274 39618,2286 39618,2296 39618,2334 39618,2353 39618,2372 39618,2379 39618,2421 39618,2424 39618,2436 39618,2443 39618,2572 39618,2607 39618,2620 39618,2646 39618,2671 39618,2699 39618,2775 39618,2782 39618,2784 39618,2797 39618,2812 39618,2931 39618,2944 39618,2979 39618,2989 39618,2991 39618,2995 39618,3069 39618,3085 39618,3115 39618,3135 39618,3138 39618,3182 39618,3193 39618,3218 39618,3252 39618,3258 39618,3260 39618,3319 39618,3328 39618,3367 39618,3370 39618,3413 39618,3422 39618,3474 39618,3507 39618,3538 39618,3612 39618,3623 39618,3695 39618,3804 39618,3876 39618,3999 39618,4039 39618,4146 39618,4220 39618,4222 39618,4223 39618,4237 39618,4455 39618,4545 39618,4549 39618,4637 39618,4771 39618,4823 39618,5212 39618,5301 39618,5405 39618,5440 39618,5662 39618,5667 39618,5718 39618,5874 39618,5911 39618,5933 39618,5992 39618,6027 39618,6059 39618,6068 39618,6119 39618,6298 39618,6357 39618,6424 39618,6506 39618,6661 39618,6789 39618,6888 39618,6955 39618,7092 39618,7155 39618,7194 39618,7768 39618,8180 39618,8192 39618,8463 39618,8537 39618,8884 39618,9001 39618,9015 39618,9024 39618,9029 39618,9030 39618,9743 39618,13137 39618,13361 39618,13541 39618,13546 39618,14126 39618,14453 39618,14556 39618,14819 39618,14945 39618,15573 39618,16019 39618,16331 39618,19010 39618,19443 39618,21442 39618,21982 39618,22280 39618,22293 39618,23287 39618,28107 39618,28693 39618,30331 39618,31517 39618,32751 39618,33424 39618,35486 39618,37088 39618,37414 39618,42064 39618,44725 39618,45437 39618,48505 39618,50176 39618,72439 39618,88010 39618,88016 39618,88018 39619,907 39619,1522 39619,1837 39619,2083 39620,79 39622,347 39622,702 39622,873 39622,874 39622,1133 39622,1313 39623,527 39623,740 39623,741 39623,743 39624,1590 39625,1052 39626,1655 39627,779 39628,718 39628,1893 39629,920 39630,1858 39631,1860 39632,222 39632,356 39633,623 39634,1858 39635,1860 39636,788 39637,240 39638,859 39639,1608 39640,292 39641,264 39641,1381 39641,1509 39641,1893 39642,227 39642,2051 39643,149 39643,192 39643,406 39643,1181 39643,220502 39644,1837 39645,79 39647,557 39648,4 39648,5 39648,137 39648,275 39648,424 39648,668 39648,991 39648,1058 39648,1718 39648,2048 39648,3345 39648,9013 39648,9029 39648,24763 39650,37 39650,301 39650,1782 39651,19 39652,99 39652,14352 39652,125569 39653,10 39655,775 39656,63 39656,149 39656,202 39656,203 39656,301 39656,1012 39656,1326 39656,1370 39656,1411 39656,1512 39656,1849 39656,3089 39656,5992 39657,1968 39658,1893 39660,1962 39661,32 39661,349 39661,875 39661,1117 39661,3260 39662,151 39663,2319 39664,1274 39665,973 39666,2178 39666,4545 39666,56150 39667,4222 39668,83 39669,1962 39670,247 39671,34 39671,35 39672,1247 39674,859 39675,163 39675,2116 39675,3769 39676,206 39676,309 39676,310 39676,577 39676,1400 39676,21944 39677,34 39677,35 39678,39679 39680,273 39680,274 39681,6323 39682,219 39682,264 39682,760 39684,217 39684,240 39684,483 39684,1181 39685,1571 39686,390 39687,240 39687,1118 39688,1858 39689,1860 39691,818 39692,313 39693,240 39693,818 39694,720 39696,1113 39698,240 39699,151 39700,10 39700,1559 39700,2574 39701,5192 39702,346 39702,1313 39705,285 39706,500 39706,718 39706,4066 39707,247 39708,158 39708,202 39708,203 39708,248 39708,393 39708,577 39708,602 39708,1010 39708,1179 39708,1240 39708,1274 39708,2784 39708,5301 39708,5405 39709,1893 39710,424 39711,1102 39712,557 39713,30 39714,211 39715,516 39716,875 39717,79 39717,247 39717,252 39717,372 39717,1181 39718,6068 39718,7092 39719,5591 39720,83 39721,83 39723,389 39723,2671 39723,3252 39724,34 39724,35 39724,111 39724,120 39724,178 39724,217 39724,283 39724,392 39724,435 39724,455 39724,518 39724,536 39724,631 39724,694 39724,805 39724,873 39724,968 39724,996 39724,1033 39724,1240 39724,1326 39724,1722 39724,1801 39724,1977 39724,1978 39724,2045 39724,2699 39724,2989 39724,2991 39724,3135 39724,3182 39724,3538 39724,3585 39724,6955 39724,8180 39724,14797 39725,934 39726,1608 39728,79 39729,994 39730,256 39730,444 39730,567 39730,604 39730,615 39730,668 39730,698 39730,762 39730,877 39730,1837 39731,349 39733,39734 39735,2146 39737,536 39738,72 39739,660 39740,809 39741,20771 39742,3193 39743,5308 39744,920 39745,1282 39746,1085 39746,75912 39747,158 39748,247 39749,1556 39750,805 39751,147 39751,158 39752,269 39753,298 39754,485 39755,920 39756,1608 39757,1235 39757,1335 39758,1381 39759,217 39759,1417 39760,841 39761,39762 39761,66813 39761,112051 39761,118999 39761,120611 39761,172380 39763,302 39764,151 39765,920 39766,980 39768,146 39769,83 39770,304 39770,442 39771,107 39772,240 39773,35905 39774,273 39774,274 39775,644 39775,2274 39776,44 39777,557 39778,557 39779,557 39780,8719 39781,138 39782,865 39783,557 39784,137 39785,118 39785,4597 39786,8719 39787,138 39788,865 39789,557 39790,137 39791,118 39791,4597 39792,202 39792,203 39793,8719 39794,138 39795,865 39796,557 39797,137 39798,118 39798,4597 39799,8719 39800,138 39801,865 39802,557 39803,137 39804,118 39804,4597 39805,39806 39805,68069 39805,105230 39807,298 39808,485 39810,872 39810,1151 39811,1 39812,489 39813,39814 39815,424 39816,39817 39816,61607 39816,64339 39816,65269 39816,66179 39818,2646 39819,278 39820,72 39821,346 39822,102 39822,2416 39822,2417 39823,39824 39823,89122 39825,2048 39826,973 39827,313 39827,356 39828,17557 39829,298 39830,485 39831,1133 39832,39833 39832,51539 39832,89090 39832,94566 39834,346 39835,118 39835,4597 39836,3295 39837,15573 39838,30 39839,1608 39840,843 39841,399 39841,536 39842,309 39843,6119 39844,1298 39845,2574 39846,500 39847,1962 39848,1052 39849,1882 39850,2775 39851,54 39852,2210 39852,4237 39854,1 39855,289 39855,290 39856,39857 39858,2929 39859,23701 39860,563 39861,39862 39863,13 39864,39865 39866,8788 39867,39868 39867,50249 39869,298 39870,485 39871,2506 39872,72 39873,30 39874,83 39875,784 39876,447 39877,2931 39878,39879 39880,81 39881,907 39882,424 39883,640 39884,72 39885,39886 39887,39888 39889,2572 39890,483 39892,1181 39893,973 39894,2146 39895,874 39896,240 39897,337 39897,563 39897,663 39897,664 39898,589 39899,8788 39900,2351 39901,39902 39905,255 39906,72 39907,225 39908,2929 39909,171 39910,8884 39911,2744 39912,1085 39913,1033 39914,586 39914,1243 39915,71 39916,872 39917,5310 39918,5440 39919,211 39920,310 39921,3161 39922,3 39923,2572 39924,39925 39924,103651 39926,233 39927,65 39928,39929 39931,68 39932,366 39933,366 39934,366 39935,366 39936,366 39937,366 39938,366 39939,72 39940,366 39941,366 39942,366 39943,366 39944,366 39945,366 39946,366 39947,366 39948,2590 39949,1238 39950,1452 39952,35905 39954,39955 39956,2929 39957,23701 39959,5469 39960,294 39961,433 39962,211 39963,1019 39963,3370 39964,306 39964,307 39965,1623 39966,58 39966,107 39966,647 39966,1353 39966,3115 39967,4 39967,5 39968,63 39969,644 39970,1323 39971,102 39972,1326 39973,408 39974,79 39974,111 39974,192 39975,298 39976,485 39977,579 39977,1257 39978,258 39980,72 39981,3246 39981,3247 39984,718 39985,640 39986,3069 39990,602 39991,39992 39993,72 39994,50 39994,63 39994,147 39994,251 39994,516 39994,602 39994,1247 39995,184 39996,1769 39997,467 39998,298 39999,485 40000,718 40001,1452 40002,431 40003,1274 40004,422 40005,422 40006,422 40007,422 40008,422 40009,422 40010,422 40011,422 40012,392 40013,309 40013,310 40013,1243 40014,289 40014,290 40015,40016 40018,1019 40019,40020 40021,146 40022,1801 40023,63 40023,158 40023,192 40023,252 40023,493 40023,516 40023,602 40023,1220 40023,1222 40024,72 40025,18739 40026,818 40027,671 40028,760 40029,72 40030,3 40031,44 40032,72 40033,422 40034,56 40036,1247 40037,422 40038,56 40040,1363 40041,72 40042,258 40043,72 40044,99 40045,1515 40046,13 40046,3161 40047,2929 40047,23701 40048,72 40049,310 40049,3039 40050,72 40051,1715 40051,5405 40052,1353 40053,503 40053,596 40054,40055 40056,72 40057,72 40058,2209 40059,72 40060,151 40061,720 40062,2051 40063,31977 40064,31977 40065,298 40066,72 40067,2351 40068,818 40070,309 40070,310 40071,760 40072,438 40073,704 40074,40075 40076,1631 40077,272 40078,1619 40079,1479 40080,1332 40081,40082 40083,40084 40085,40086 40087,267 40088,1133 40089,79 40090,2351 40091,79 40092,7652 40093,893 40094,40095 40094,85415 40094,110396 40094,264875 40096,40097 40098,491 40098,2156 40099,34 40099,35 40099,217 40099,222 40099,536 40099,1724 40099,1881 40099,2646 40099,2671 40099,6888 40099,7092 40099,13980 40100,72 40101,3069 40102,1749 40103,72 40104,640 40105,40106 40107,40108 40109,40108 40110,779 40111,40108 40112,1639 40113,760 40113,1149 40113,1631 40114,40115 40114,105477 40114,246351 40116,97 40117,40118 40119,151 40120,298 40121,485 40122,10 40123,346 40124,2506 40125,4548 40126,254 40127,250 40127,1684 40128,450 40129,644 40130,1467 40131,267 40133,483 40134,9010 40135,515 40136,34 40136,35 40137,704 40138,2371 40138,22580 40139,885 40139,13704 40140,40141 40142,8788 40143,187 40144,40145 40146,392 40147,4193 40147,8822 40148,1133 40148,3247 40148,7363 40149,907 40150,40151 40152,289 40152,290 40153,40154 40156,40157 40158,40159 40160,40161 40162,28072 40163,40164 40165,264 40166,289 40166,290 40167,4980 40168,71 40169,134 40169,137 40169,138 40169,248 40169,4276 40170,10 40171,233 40172,1634 40173,850 40175,40176 40177,107 40178,2416 40178,2417 40179,292 40180,338 40181,366 40182,366 40183,298 40184,366 40185,366 40186,366 40187,1133 40188,3538 40189,366 40190,366 40191,366 40192,366 40193,489 40195,392 40196,147 40197,704 40198,158 40198,577 40198,1634 40199,278 40200,2506 40201,872 40202,872 40203,872 40204,872 40205,872 40206,346 40207,171 40208,34 40208,35 40209,1572 40210,40211 40212,178 40213,171 40214,72 40215,10 40215,34 40215,35 40215,50 40215,97 40215,104 40215,146 40215,158 40215,192 40215,206 40215,217 40215,222 40215,240 40215,264 40215,285 40215,304 40215,406 40215,444 40215,455 40215,571 40215,589 40215,620 40215,631 40215,652 40215,772 40215,932 40215,968 40215,1001 40215,1085 40215,1122 40215,1151 40215,1515 40215,1531 40215,1572 40215,1659 40215,1715 40215,1782 40215,1962 40215,2626 40215,2931 40215,5343 40215,9007 40215,68069 40216,707 40217,72 40218,1102 40219,269 40220,41 40220,442 40220,557 40220,588 40220,590 40220,636 40220,1119 40220,1282 40220,1368 40220,1745 40220,2205 40220,2286 40220,33424 40221,22 40222,346 40223,119 40224,346 40225,333 40226,1247 40226,5265 40227,30 40227,1133 40227,2073 40227,2351 40227,15573 40228,783 40229,900 40230,40231 40232,298 40233,485 40234,50 40234,158 40234,195 40234,406 40234,455 40234,588 40234,590 40234,620 40234,1033 40235,805 40235,1506 40237,1285 40238,202 40238,203 40239,640 40240,433 40241,743 40242,422 40243,56 40244,422 40245,56 40246,640 40247,40248 40249,872 40250,422 40251,56 40252,119 40253,302 40253,687 40253,1556 40254,2379 40256,192 40256,457 40256,2253 40257,310 40257,483 40257,515 40257,1132 40257,3039 40258,4101 40259,557 40260,1033 40261,207 40262,240 40263,255 40264,704 40265,850 40266,640 40267,47 40267,442 40267,805 40267,1119 40267,2469 40267,21944 40268,298 40269,485 40270,298 40271,485 40272,2411 40273,298 40274,485 40275,40276 40277,1227 40277,1229 40278,1096 40279,1912 40280,9195 40284,40285 40286,298 40287,485 40288,809 40288,68069 40288,141912 40289,206 40290,2590 40291,1363 40291,1893 40292,1983 40293,664 40293,20359 40294,34 40294,1767 40295,8855 40296,290 40296,1235 40296,8992 40297,2995 40298,1980 40298,8991 40299,206 40300,483 40301,298 40302,485 40303,149 40304,40305 40306,273 40306,274 40307,40308 40309,255 40310,298 40311,485 40312,72 40313,1085 40314,72 40315,294 40316,481 40317,1893 40318,58 40319,46 40320,1319 40321,818 40322,557 40323,862 40324,557 40325,557 40326,557 40327,40328 40329,3695 40330,1082 40331,160 40332,980 40333,202 40333,203 40333,873 40334,980 40335,366 40336,366 40337,673 40338,1298 40339,760 40340,298 40341,485 40342,40343 40344,1191 40344,1192 40344,2253 40344,6824 40345,273 40345,274 40346,346 40347,298 40348,485 40349,1707 40350,1769 40351,272 40352,298 40353,485 40354,65 40355,1332 40355,1572 40356,298 40357,485 40358,611 40359,40360 40361,5366 40362,346 40363,346 40364,273 40364,274 40365,2411 40366,323 40368,40369 40371,1149 40372,269 40374,48 40375,323 40376,809 40377,40378 40379,111 40379,652 40379,1453 40379,1572 40379,1722 40379,2626 40379,3538 40379,14458 40380,40381 40382,40383 40382,41442 40384,40383 40384,41442 40385,40386 40387,1458 40388,557 40390,40391 40390,107400 40392,994 40392,33444 40392,40393 40394,40157 40395,40396 40395,49761 40395,50760 40395,56217 40395,61106 40395,66615 40395,68069 40395,89334 40395,93913 40395,95372 40395,95506 40395,97485 40395,109682 40395,109732 40395,110313 40395,111854 40397,1453 40398,40399 40400,65 40401,40402 40403,1313 40404,292 40405,784 40406,294 40407,40408 40407,51852 40407,67582 40407,102906 40409,296 40410,298 40411,557 40412,17772 40413,2574 40414,366 40415,366 40416,366 40417,366 40418,366 40419,50 40419,147 40419,158 40419,406 40419,620 40419,779 40419,1776 40419,2931 40419,8822 40420,784 40421,1133 40422,195 40423,137 40424,328 40424,7124 40425,298 40426,485 40427,323 40428,298 40429,485 40430,1 40431,1893 40432,10 40433,99 40434,79 40435,30 40435,240 40435,302 40436,40437 40438,704 40439,3555 40440,106 40440,1888 40441,1973 40442,15 40442,292 40442,1572 40442,1634 40442,3769 40443,1968 40444,175 40445,358 40446,425 40446,1276 40447,772 40448,252 40448,318 40448,41170 40449,3247 40449,17588 40450,660 40451,147 40452,79 40453,299 40453,1122 40453,1544 40454,79 40456,1012 40459,1858 40460,1860 40462,697 40463,255 40464,1132 40465,781 40466,1132 40467,781 40468,306 40468,307 40469,657 40469,221333 40470,22 40472,1858 40473,1860 40474,433 40474,1634 40475,392 40475,1151 40476,1849 40477,259 40478,671 40479,344 40480,1010 40481,72 40482,40483 40484,72 40485,50 40486,111 40486,3538 40486,9006 40487,392 40487,644 40488,671 40489,184 40490,743 40491,5130 40493,3872 40494,248 40495,1181 40498,1973 40498,3507 40499,3413 40500,222 40500,455 40500,1019 40501,171 40502,1140 40502,2443 40503,79 40504,1659 40505,2506 40507,192 40508,10 40509,298 40510,485 40511,32 40511,911 40512,206 40513,167 40513,299 40513,301 40513,5662 40513,73570 40514,149 40514,184 40514,859 40514,1619 40514,1623 40515,40516 40517,4039 40519,1132 40520,781 40521,1803 40522,40523 40524,467 40524,872 40524,1001 40525,72 40526,932 40527,79 40528,1634 40529,1715 40530,32 40530,392 40530,697 40530,809 40531,217 40531,240 40531,264 40531,1417 40531,1796 40531,3804 40532,1688 40533,1243 40534,273 40534,274 40535,104 40535,147 40535,5213 40536,1983 40537,1893 40538,1724 40539,104 40540,455 40541,1300 40542,493 40542,682 40542,1220 40542,1222 40542,72439 40543,647 40544,344 40545,422 40548,1893 40549,178 40550,39564 40551,137 40554,40555 40556,602 40557,932 40558,140 40558,287 40558,809 40558,19010 40559,151 40560,1238 40561,920 40562,2617 40562,3507 40563,720 40564,40565 40566,313 40566,389 40566,660 40566,2424 40566,2646 40566,5933 40566,6506 40566,19443 40567,255 40568,609 40569,682 40569,72439 40570,620 40571,202 40571,203 40571,718 40572,217 40573,192 40574,302 40576,301 40577,298 40578,485 40579,704 40579,1732 40580,626 40581,500 40582,1962 40583,1052 40584,1882 40585,2775 40586,54 40587,2210 40587,4237 40588,929 40588,1127 40588,1400 40588,1566 40589,588 40589,590 40589,714 40590,1849 40591,259 40592,1132 40593,781 40594,1556 40595,1949 40596,500 40597,1962 40598,1052 40599,1882 40600,2775 40601,54 40602,2210 40602,4237 40603,500 40604,217 40604,1118 40604,1796 40605,809 40607,1132 40608,781 40609,5405 40610,623 40610,1805 40612,79 40614,1849 40615,827 40616,79 40617,500 40618,1962 40619,1052 40620,1882 40621,2775 40622,54 40623,2210 40623,4237 40624,602 40625,14989 40626,79 40627,79 40628,79 40629,731 40630,500 40631,1962 40632,1052 40633,1882 40634,2775 40635,54 40636,2210 40636,4237 40637,2775 40638,79 40639,602 40640,79 40641,2105 40642,1085 40642,1284 40643,264 40643,349 40643,652 40643,2312 40643,3260 40645,72 40646,50 40646,79 40647,40648 40649,4066 40650,72 40651,24505 40652,1983 40653,83 40654,79 40655,1243 40656,2506 40657,873 40657,1210 40658,63 40658,79 40659,1132 40660,781 40661,2506 40662,1132 40663,781 40664,10 40665,20 40667,83 40668,15119 40669,34 40669,35 40669,217 40669,283 40669,536 40669,1019 40670,392 40672,1893 40673,171 40674,907 40674,932 40676,1977 40676,1978 40677,1893 40678,1210 40679,298 40680,143 40681,485 40682,261 40682,694 40682,852 40682,2812 40683,1539 40684,298 40685,485 40687,40688 40689,18726 40690,240 40690,1085 40692,920 40693,143 40694,314 40695,973 40696,1 40697,1949 40698,200 40698,1105 40698,1177 40699,120 40699,1175 40700,40701 40702,1224 40703,217 40703,392 40703,1072 40703,3252 40703,4637 40704,2506 40705,647 40706,344 40707,1707 40708,1512 40708,5992 40709,336 40710,503 40711,647 40712,344 40713,287 40713,462 40713,595 40713,1033 40713,1052 40715,1132 40716,781 40717,271 40718,408 40718,491 40718,827 40719,1370 40720,577 40721,1858 40722,1860 40723,332 40723,577 40723,788 40723,980 40723,27041 40724,579 40724,893 40725,1858 40726,1860 40727,1858 40728,1860 40730,151 40731,34 40731,35 40732,657 40733,393 40734,1722 40735,1132 40736,781 40737,13661 40738,1132 40739,781 40740,422 40740,918 40740,1118 40740,1844 40741,973 40742,2105 40743,2828 40744,500 40745,1962 40746,1052 40747,1882 40748,2775 40749,54 40750,2210 40750,4237 40751,4190 40752,79 40753,79 40754,4190 40755,973 40755,51421 40756,2775 40757,50 40757,79 40758,1984 40758,3949 40759,1163 40760,302 40760,861 40760,893 40761,1132 40762,781 40763,415 40764,158 40765,973 40766,1556 40767,298 40768,485 40769,1132 40770,781 40771,647 40772,344 40773,7652 40774,2105 40775,2590 40776,309 40776,310 40776,1635 40776,1688 40776,6556 40777,219 40779,40780 40781,72 40783,623 40783,1143 40783,1374 40784,1749 40786,40787 40788,1132 40789,781 40790,34 40790,35 40790,536 40790,4672 40791,247 40793,3297 40795,657 40795,809 40796,779 40797,175 40799,134 40799,248 40800,240 40801,1715 40802,536 40803,779 40804,647 40805,344 40806,79 40806,604 40807,1370 40808,2367 40810,2626 40811,920 40812,657 40812,2224 40812,13980 40814,1388 40815,72 40816,40817 40818,40819 40821,660 40822,72 40823,349 40824,818 40825,5987 40826,72 40827,3193 40829,1019 40829,2646 40829,13661 40830,1983 40831,273 40831,274 40832,393 40832,1531 40833,171 40834,1132 40835,781 40836,640 40837,72 40838,1893 40839,22 40839,873 40840,1803 40841,137 40842,225 40843,500 40844,1962 40845,1052 40846,1882 40847,2775 40848,54 40849,2210 40849,4237 40850,760 40850,1285 40851,694 40851,781 40851,1419 40851,2116 40852,72 40853,344 40854,285 40855,313 40855,1140 40855,1718 40856,1132 40857,781 40858,500 40859,1962 40860,1052 40861,1285 40862,1882 40863,2775 40864,54 40865,2210 40865,4237 40866,192 40868,3507 40869,1007 40871,255 40872,285 40873,406 40873,779 40874,147 40875,1085 40876,1203 40876,1955 40877,3148 40878,151 40879,5405 40880,366 40881,206 40882,788 40883,772 40884,392 40885,171 40886,217 40886,278 40887,1844 40888,387 40890,509 40890,595 40890,1453 40891,299 40892,72 40893,48 40894,267 40895,1052 40896,483 40896,6556 40897,483 40898,1359 40899,2379 40900,972 40901,3960 40902,72 40904,72 40905,247 40906,40907 40908,184 40909,920 40910,50 40911,40912 40911,57849 40911,63627 40913,298 40914,439 40915,79 40916,222 40917,143 40918,809 40919,15 40920,1858 40921,1860 40922,135 40922,138 40923,644 40924,1033 40925,171 40926,79 40927,346 40928,255 40928,2991 40929,79 40930,1381 40931,79 40933,1782 40934,171 40935,23010 40936,390 40936,534 40936,1085 40937,79 40938,1556 40939,79 40940,9121 40941,2379 40942,68 40942,193129 40943,344 40944,160 40945,40946 40947,3830 40948,68 40948,301 40949,40950 40951,40950 40952,40950 40953,40954 40955,388 40956,2045 40957,247 40957,184349 40959,272 40960,563 40961,255 40962,83 40963,86 40964,3218 40965,1893 40966,5310 40967,604 40968,72 40969,344 40970,285 40972,264 40974,143 40975,26 40975,59 40975,885 40976,143 40977,1287 40978,875 40979,40980 40981,264 40981,1007 40981,1289 40981,1381 40981,1551 40983,79 40984,40985 40986,4831 40987,907 40987,932 40987,73570 40989,298 40990,485 40991,1381 40992,1227 40992,1229 40993,135 40993,298 40993,588 40993,590 40993,1119 40993,2205 40993,33424 40993,48505 40993,58979 40993,88266 40994,1227 40994,1229 40995,525 40995,1140 40995,2209 40997,500 40998,1962 40999,1052 41000,1882 41001,2775 41002,54 41003,2210 41003,4237 41004,920 41005,41006 41007,264 41008,264 41009,41010 41011,379 41012,1955 41013,640 41014,41015 41016,893 41017,1572 41018,158 41019,217 41020,41021 41022,250 41022,1684 41023,138 41023,579 41024,1871 41025,83 41025,536 41025,4672 41025,7698 41028,1707 41029,1749 41030,1467 41031,1368 41032,4 41032,5 41032,8270 41033,1381 41034,261 41035,41036 41037,920 41038,1046 41039,280 41039,364 41039,485 41039,920 41039,2590 41039,4220 41039,17245 41039,66297 41039,193129 41040,1 41041,10 41041,113156 41042,41043 41044,1181 41045,93 41045,94 41046,422 41047,56 41048,6303 41049,72 41050,206 41050,41051 41052,14366 41053,949 41054,72 41055,779 41056,1102 41057,1175 41058,137 41058,779 41059,406 41059,779 41060,872 41061,41062 41061,135295 41063,41064 41065,275 41066,4039 41067,41068 41069,81 41070,442 41071,41072 41073,41074 41075,808 41076,440 41077,1332 41078,104 41078,850 41079,818 41080,489 41081,233 41082,81 41083,873 41084,873 41084,2209 41085,4831 41089,3447 41090,596 41091,2995 41092,622 41093,1132 41094,781 41095,1381 41096,366 41096,500 41096,682 41096,72439 41097,422 41098,56 41099,392 41100,3451 41100,3452 41101,702 41101,703 41102,1893 41103,83 41103,505 41105,770 41106,818 41106,1210 41106,127158 41108,19443 41109,366 41110,366 41111,366 41112,366 41113,366 41114,366 41115,366 41116,366 41117,366 41118,366 41119,366 41120,366 41121,366 41122,7117 41123,8855 41125,207 41126,306 41126,307 41127,298 41128,485 41130,483 41131,435 41132,392 41133,79 41134,1688 41135,255 41136,217 41136,818 41136,3182 41137,83 41137,415 41138,79 41140,873 41141,1767 41142,171 41143,147 41144,22 41145,634 41146,192 41146,439 41147,356 41147,615 41148,779 41148,1181 41149,1323 41150,102 41151,1326 41152,408 41155,615 41156,1058 41157,389 41159,1332 41161,505 41162,1010 41163,996 41164,26 41164,59 41165,158 41165,1181 41166,50 41166,79 41167,19443 41168,393 41169,372 41170,252 41170,516 41170,1220 41170,1222 41171,3804 41172,158 41173,509 41173,3538 41175,79 41175,178 41175,827 41176,255 41177,255 41178,2775 41179,3724 41180,388 41181,422 41182,422 41183,422 41184,422 41185,422 41186,422 41187,422 41188,422 41189,422 41190,1836 41191,340 41191,611 41192,200 41193,422 41194,79 41195,2750 41196,48 41197,1722 41199,171 41200,202 41200,203 41201,79 41202,200 41203,5375 41204,18831 41206,818 41206,1149 41206,3507 41207,388 41207,852 41209,200 41210,206 41211,589 41212,346 41213,1 41213,20 41213,22 41213,48 41213,72 41213,104 41213,130 41213,135 41213,137 41213,146 41213,151 41213,163 41213,192 41213,207 41213,209 41213,247 41213,250 41213,251 41213,252 41213,256 41213,258 41213,259 41213,262 41213,264 41213,272 41213,273 41213,275 41213,278 41213,280 41213,283 41213,289 41213,290 41213,299 41213,302 41213,305 41213,306 41213,307 41213,313 41213,314 41213,315 41213,326 41213,330 41213,337 41213,338 41213,347 41213,352 41213,356 41213,406 41213,581 41213,752 41213,801 41213,852 41213,972 41213,994 41213,1133 41213,1151 41213,1313 41213,1381 41213,1684 41213,1818 41213,2266 41213,4771 41213,9457 41213,17245 41213,94134 41214,79 41215,26 41215,59 41216,79 41217,932 41219,79 41220,1068 41221,48 41221,65 41221,120 41221,285 41221,438 41221,599 41221,660 41221,795 41221,818 41221,868 41221,1122 41221,1454 41221,1801 41221,1849 41221,2480 41221,2646 41221,2699 41222,2889 41223,81 41224,996 41225,8854 41227,200 41228,41229 41230,175 41230,252 41230,314 41230,332 41230,446 41230,452 41230,599 41230,623 41230,685 41230,693 41230,1014 41230,1619 41230,1973 41230,9457 41231,115 41231,118 41233,83 41234,1436 41234,2979 41235,893 41236,252 41236,318 41236,779 41236,41170 41237,505 41238,233 41238,372 41238,3135 41239,1010 41240,200 41242,433 41242,1634 41243,2775 41244,957 41244,1815 41245,41246 41248,233 41248,372 41249,1634 41250,1506 41251,1634 41252,97 41253,483 41253,36761 41254,1132 41255,781 41256,24505 41257,743 41258,217 41258,1118 41258,1417 41259,41260 41261,233 41262,920 41263,626 41264,215 41265,1127 41265,1522 41265,1893 41265,2312 41266,4101 41267,872 41269,79 41270,450 41270,1400 41270,3623 41271,200 41272,852 41273,192 41275,467 41276,32 41276,392 41276,697 41276,809 41277,79 41278,200 41279,818 41280,200 41281,2646 41282,1429 41283,309 41283,310 41283,1891 41285,222 41285,247 41285,273 41285,274 41285,304 41285,347 41285,644 41285,994 41285,1402 41285,1801 41285,2995 41285,4545 41286,631 41286,3467 41287,1147 41289,72 41290,1188 41291,2995 41292,1019 41293,3370 41293,14453 41294,211 41295,644 41296,875 41297,717 41298,287 41300,22 41302,58 41303,46 41305,389 41306,30 41307,1707 41308,22 41310,261 41311,158 41312,9026 41313,83 41315,1298 41316,577 41316,788 41317,1454 41317,1732 41320,1634 41321,302 41321,2116 41322,283 41322,718 41323,86 41324,200 41325,140 41325,264 41325,515 41326,41327 41326,75112 41328,200 41329,994 41329,1707 41329,1888 41331,356 41332,431 41332,968 41333,455 41333,1019 41334,251 41334,631 41334,59931 41335,1983 41336,72 41336,296 41336,312 41336,323 41336,479 41336,525 41336,647 41336,991 41336,1052 41336,1188 41336,1267 41336,1579 41336,1659 41336,1707 41336,1749 41336,2260 41336,2605 41336,3585 41336,3695 41336,13538 41336,49057 41337,178 41339,571 41340,1977 41340,1978 41341,455 41342,20 41342,435 41342,1590 41343,652 41345,309 41345,310 41345,358 41345,483 41345,868 41345,1326 41345,81233 41346,302 41346,861 41347,200 41347,392 41348,10 41349,22 41350,79 41351,1240 41351,76096 41353,439 41354,2828 41355,809 41356,1983 41357,136 41357,137 41357,1479 41358,310 41359,314 41359,3367 41360,784 41361,79 41361,1619 41362,298 41363,485 41364,1634 41365,356 41366,60576 41367,10 41368,515 41369,999 41370,83 41371,3260 41372,34 41372,35 41373,1096 41375,1 41376,861 41378,314 41378,315 41378,447 41378,509 41378,875 41378,142409 41378,146280 41378,159365 41379,41380 41381,333 41383,83 41384,79 41385,99 41385,147 41385,178 41385,192 41385,206 41385,602 41385,640 41385,1181 41385,1515 41385,2244 41387,247 41390,393 41392,861 41394,1326 41395,760 41395,1631 41395,2620 41396,473 41396,8149 41397,779 41398,1127 41399,83 41400,298 41401,485 41403,298 41404,485 41406,140 41407,36398 41409,83 41410,4549 41411,349 41412,2274 41413,111 41414,13745 41415,32 41416,392 41417,779 41418,366 41419,697 41420,809 41421,1240 41422,1151 41423,1515 41424,66 41425,1836 41426,509 41427,1590 41428,158 41428,206 41429,149 41429,406 41430,47 41430,2469 41431,21408 41432,779 41433,18831 41434,328 41434,7124 41435,314 41435,510 41435,538 41435,875 41435,934 41435,1424 41435,6661 41435,146280 41435,159365 41436,652 41436,1893 41437,5591 41438,287 41439,2617 41440,1133 41443,222 41444,302 41445,877 41446,3474 41447,34 41447,35 41447,455 41448,106 41448,1370 41450,385 41450,1274 41450,37088 41451,158 41452,920 41453,1151 41453,1893 41454,298 41455,485 41456,664 41456,2178 41456,4545 41457,10 41457,217 41457,2574 41457,19005 41458,50 41459,247 41460,21408 41461,41462 41461,83453 41463,233 41464,19 41464,415 41464,1072 41464,1571 41464,1871 41464,2424 41464,2944 41465,1579 41466,79 41467,450 41468,652 41469,298 41470,1722 41471,784 41472,1608 41473,83 41474,217 41476,595 41477,115 41477,118 41478,509 41478,1043 41478,19010 41479,298 41480,81 41481,1127 41482,83 41483,1805 41484,515 41485,264 41486,595 41487,151 41488,1849 41489,1837 41490,222 41490,644 41490,1858 41490,2989 41490,2991 41491,48 41492,4 41492,5 41494,54 41495,2296 41496,79 41498,510 41499,1608 41500,217 41502,6695 41503,182 41504,178 41504,538 41504,622 41505,184 41506,483 41507,2105 41508,104 41508,557 41508,953 41508,954 41509,663 41509,664 41510,516 41511,575 41511,697 41512,5987 41513,158 41514,217 41515,147 41516,247 41517,406 41518,41519 41522,920 41523,510 41524,254 41525,104 41526,690 41527,431 41528,167 41528,240 41528,301 41528,1160 41528,1564 41528,1818 41528,73570 41529,41530 41529,88070 41531,1326 41532,388 41533,3 41534,10 41535,1370 41536,1551 41537,2411 41538,269 41538,20771 41539,376 41540,885 41541,219 41541,1803 41542,63 41543,273 41543,274 41544,147 41545,79 41545,111 41545,202 41545,203 41545,333 41545,586 41545,1370 41546,278 41546,455 41547,772 41548,86 41548,178 41548,1635 41548,1891 41548,20757 41549,1298 41550,278 41550,283 41551,1127 41551,1711 41551,1836 41552,1603 41552,6861 41553,3413 41554,1181 41555,3 41556,326 41557,146 41558,10 41559,1 41560,8854 41562,20 41563,1983 41565,207 41566,406 41567,356 41567,615 41568,843 41569,818 41570,406 41571,1983 41572,72 41573,805 41574,298 41575,485 41576,298 41577,485 41578,859 41579,1740 41580,81 41581,8854 41582,516 41583,372 41584,171 41585,557 41586,557 41587,4146 41588,1284 41588,4504 41589,72 41590,589 41590,1001 41590,1085 41590,2296 41590,2590 41591,4637 41592,6298 41593,1274 41594,202 41594,203 41594,366 41594,500 41595,2735 41596,1983 41597,41598 41599,2244 41600,1163 41601,30236 41602,497 41602,1175 41603,30 41603,175 41603,328 41604,2146 41605,2048 41606,151 41607,41608 41609,861 41610,8180 41611,1085 41612,41613 41614,1608 41615,2782 41615,4548 41616,269 41617,250 41617,1684 41618,41619 41620,72 41621,71 41621,104 41621,611 41621,704 41621,1319 41621,1368 41621,2367 41622,1983 41623,1235 41623,1335 41624,8788 41625,758 41625,3695 41626,818 41627,1181 41628,1085 41629,275 41630,3724 41631,119 41631,151 41631,192 41631,309 41631,310 41631,1400 41631,2073 41631,13910 41632,605 41632,843 41632,907 41632,1293 41632,3138 41633,1227 41633,1229 41633,1252 41633,1253 41633,21944 41633,86416 41634,7155 41635,79 41636,323 41637,1033 41638,1740 41639,932 41640,422 41641,41642 41643,83 41644,459 41645,1402 41646,392 41647,1243 41648,772 41649,41650 41651,2244 41652,493 41652,586 41652,1265 41652,1266 41652,1370 41653,536 41654,872 41655,2146 41656,305 41656,447 41656,538 41656,671 41656,190492 41657,269 41658,269 41659,931 41660,893 41661,704 41662,809 41663,1881 41664,195 41665,32 41665,34 41665,35 41665,202 41665,203 41665,283 41665,392 41665,536 41665,623 41665,996 41665,1001 41665,1201 41665,1274 41665,1467 41665,1644 41665,2045 41665,2266 41665,2671 41665,2699 41665,2784 41665,3252 41665,4549 41665,7092 41665,13546 41666,211 41667,872 41668,1 41668,94 41668,184 41668,206 41668,2787 41669,743 41670,704 41671,577 41672,207 41673,980 41674,5440 41675,211 41676,1381 41677,2436 41678,8907 41679,3260 41680,1556 41681,72 41682,760 41682,1818 41683,2590 41684,255 41685,41686 41687,1 41687,20 41687,22 41687,48 41687,63 41687,72 41687,79 41687,81 41687,86 41687,104 41687,107 41687,130 41687,135 41687,137 41687,146 41687,147 41687,149 41687,151 41687,163 41687,178 41687,182 41687,184 41687,192 41687,206 41687,207 41687,209 41687,217 41687,240 41687,247 41687,250 41687,251 41687,252 41687,254 41687,256 41687,258 41687,259 41687,262 41687,264 41687,269 41687,272 41687,273 41687,274 41687,275 41687,277 41687,278 41687,280 41687,283 41687,289 41687,290 41687,299 41687,302 41687,305 41687,306 41687,307 41687,309 41687,310 41687,313 41687,314 41687,315 41687,318 41687,326 41687,330 41687,337 41687,338 41687,340 41687,347 41687,352 41687,356 41687,406 41687,435 41687,465 41687,516 41687,525 41687,538 41687,581 41687,626 41687,647 41687,649 41687,668 41687,736 41687,752 41687,801 41687,805 41687,808 41687,843 41687,852 41687,861 41687,893 41687,920 41687,934 41687,954 41687,972 41687,994 41687,1019 41687,1133 41687,1147 41687,1151 41687,1179 41687,1201 41687,1210 41687,1220 41687,1222 41687,1247 41687,1309 41687,1313 41687,1381 41687,1434 41687,1449 41687,1452 41687,1465 41687,1509 41687,1644 41687,1684 41687,1707 41687,1796 41687,1818 41687,1844 41687,1949 41687,1973 41687,2048 41687,2260 41687,2266 41687,2421 41687,2837 41687,3989 41687,3999 41687,4771 41687,4903 41687,5326 41687,5718 41687,5996 41687,6059 41687,8993 41687,9457 41687,10318 41687,16019 41687,16687 41687,17245 41687,21944 41687,41170 41687,66754 41687,94134 41687,106502 41688,779 41689,3246 41689,3247 41690,620 41691,41692 41693,158 41694,192 41695,1515 41696,192 41697,703 41698,779 41699,41700 41701,158 41702,704 41703,9195 41704,41705 41704,43927 41704,48293 41706,285 41707,2931 41708,620 41709,41710 41711,134 41712,8854 41713,843 41714,41715 41716,41717 41716,43825 41718,158 41719,41720 41721,1381 41722,233 41723,106 41724,385 41725,1531 41726,298 41727,485 41728,1133 41729,178 41730,1238 41731,473 41731,8149 41732,2351 41733,1452 41734,298 41735,485 41736,589 41736,1085 41737,298 41738,485 41739,1858 41740,1860 41741,3451 41741,3452 41742,147 41743,50 41744,861 41745,192 41746,1531 41747,1877 41748,366 41749,1 41749,1127 41750,366 41751,366 41752,366 41753,366 41754,366 41755,366 41756,366 41757,366 41758,366 41759,366 41760,872 41760,1127 41760,1381 41760,1893 41760,6695 41761,366 41762,366 41763,41764 41765,366 41766,406 41767,1068 41767,7087 41767,18416 41767,35661 41767,40713 41767,57025 41768,397 41769,1392 41771,518 41773,726 41774,158 41774,9166 41775,160 41776,306 41776,307 41777,34 41777,35 41779,20 41779,86 41779,136 41779,151 41779,206 41779,222 41779,273 41779,310 41779,344 41779,459 41779,485 41779,567 41779,579 41779,628 41779,666 41779,744 41779,762 41779,811 41779,868 41779,1326 41779,1424 41779,1425 41779,1572 41779,1749 41779,1849 41779,2353 41779,2701 41779,3039 41779,6279 41779,69714 41779,73959 41779,76086 41779,78030 41779,80903 41780,392 41780,1363 41782,4771 41783,360 41783,2051 41784,23701 41785,346 41786,652 41787,41788 41789,41790 41792,2995 41793,255 41794,1181 41795,626 41796,336 41796,1089 41796,6119 41797,779 41798,1479 41799,493 41800,195 41801,158 41801,779 41801,4192 41801,4193 41802,184 41803,622 41804,772 41804,1294 41806,312 41807,875 41808,1749 41809,1323 41810,102 41811,1326 41812,408 41813,79 41814,422 41815,422 41816,1821 41816,2867 41816,22880 41817,79 41818,41819 41820,1227 41820,1229 41822,4355 41823,9121 41824,227 41825,704 41826,26 41826,59 41826,3794 41827,336 41828,422 41829,393 41829,980 41830,422 41831,620 41832,422 41833,422 41834,422 41836,422 41837,1688 41838,18790 41839,143 41841,312 41841,336 41841,457 41841,525 41841,1274 41844,336 41845,217 41845,536 41845,13575 41846,1102 41847,2048 41848,5547 41849,298 41851,3960 41852,9560 41852,16045 41853,41853 41854,657 41854,1881 41854,2779 41854,5301 41855,264 41855,1659 41855,2979 41856,1266 41856,1370 41857,83 41858,784 41859,875 41861,772 41863,1707 41864,752 41865,592 41866,32 41866,392 41866,697 41866,809 41867,433 41867,1634 41868,1983 41869,3999 41870,217 41871,120 41871,240 41871,332 41871,338 41871,1293 41871,1844 41871,1955 41871,11147 41872,83 41873,296 41874,79 41875,2989 41875,2991 41875,3367 41875,13361 41876,312 41876,872 41877,666 41878,1231 41879,184 41879,673 41880,349 41880,1298 41880,1805 41880,3193 41880,3260 41881,1033 41882,805 41883,1274 41884,379 41885,980 41885,1010 41886,509 41886,510 41886,1453 41886,150022 41888,392 41888,3260 41889,1257 41890,158 41890,2646 41891,843 41892,79 41892,333 41893,838 41893,1172 41893,1796 41893,1837 41894,1181 41895,248 41895,364 41896,1265 41896,1266 41897,1732 41899,1143 41900,1284 41901,1732 41902,758 41903,907 41903,932 41906,442 41907,171 41907,788 41907,841 41907,920 41908,41909 41910,581 41911,302 41912,248 41912,450 41912,1332 41913,41914 41915,13 41915,733 41915,920 41915,1085 41915,1089 41915,1293 41915,1619 41917,3653 41918,390 41919,605 41920,589 41921,6068 41922,515 41923,50 41924,344 41925,1539 41926,1294 41928,433 41928,1634 41929,1983 41930,66 41931,644 41932,575 41932,697 41932,2045 41933,21442 41934,349 41935,907 41936,356 41937,3003 41938,261 41939,1424 41940,41941 41943,861 41944,20 41945,79 41946,3003 41948,1556 41949,301 41949,304 41949,752 41949,968 41950,417 41951,261 41951,1419 41951,1466 41952,147 41952,158 41952,184 41953,1454 41955,500 41956,1962 41957,1052 41958,1882 41959,2775 41960,54 41961,2210 41961,4237 41962,1509 41963,968 41964,2646 41965,278 41968,408 41969,1257 41970,2372 41971,1707 41973,1836 41974,2674 41974,16153 41975,346 41976,1977 41976,1978 41977,41978 41979,349 41979,644 41980,79 41980,694 41980,2775 41981,222 41982,442 41983,710 41984,861 41985,79 41987,192 41987,663 41988,811 41989,298 41990,485 41992,24505 41993,3003 41994,527 41994,740 41994,741 41997,907 41999,302 42000,104 42001,1590 42002,1515 42003,217 42004,42005 42004,68069 42004,86832 42004,104497 42004,108706 42004,109691 42004,131470 42004,167441 42004,169205 42004,170881 42004,172523 42004,213536 42006,15 42006,256 42006,292 42006,441 42006,1572 42006,1722 42006,2889 42007,3538 42008,79 42010,209 42011,269 42011,1070 42011,1634 42012,1891 42013,579 42014,42015 42014,53663 42016,151 42017,489 42018,79 42019,758 42020,302 42021,710 42022,872 42023,42024 42025,252 42026,1801 42027,873 42029,289 42029,290 42029,417 42029,1085 42029,2296 42029,3623 42030,4455 42031,97 42032,1467 42032,2421 42033,79 42034,3003 42036,1235 42036,1335 42037,389 42038,215 42039,227 42040,2701 42041,328 42042,1016 42043,1722 42044,383 42045,111 42046,3538 42047,1332 42048,1939 42049,248 42050,1882 42051,850 42052,9001 42053,136 42054,4771 42055,9029 42056,1745 42057,1977 42057,1978 42058,7270 42059,1016 42060,718 42061,302 42062,5405 42063,104 42064,1 42064,147 42064,158 42064,206 42064,336 42064,505 42064,602 42064,676 42064,695 42064,1425 42064,1458 42064,1518 42064,1601 42064,2037 42064,2244 42064,3449 42064,4177 42064,9394 42064,15795 42064,35439 42064,42064 42064,80266 42064,142749 42064,240174 42065,167 42066,704 42067,1579 42068,42069 42068,53132 42068,66083 42068,69834 42068,70377 42068,71544 42068,100978 42068,104187 42068,107513 42068,109665 42068,109672 42068,110776 42068,113734 42068,113835 42068,114774 42068,115163 42068,115555 42068,122750 42068,123580 42068,123722 42068,123977 42068,124750 42068,124829 42068,125485 42068,125771 42068,125803 42068,126112 42068,128343 42068,129369 42068,129520 42068,129906 42068,130628 42068,131106 42068,131158 42068,131176 42068,132279 42068,219901 42070,120 42070,261 42070,694 42070,949 42072,42073 42074,278 42075,83 42076,4611 42077,1544 42078,302 42081,1179 42082,1113 42083,809 42084,1837 42085,687 42086,1179 42087,1001 42088,1544 42089,304 42089,1188 42090,298 42091,485 42092,1368 42093,79 42094,3538 42095,1858 42096,1860 42097,42098 42099,20771 42100,111 42101,1149 42102,1179 42103,312 42104,557 42105,72 42106,42107 42108,358 42109,163 42109,579 42109,1673 42110,206 42111,7698 42112,22 42112,302 42112,749 42112,811 42112,861 42112,875 42112,893 42112,2017 42113,1572 42113,1688 42114,509 42114,1143 42114,1454 42116,34 42116,35 42116,240 42116,332 42116,809 42116,1072 42116,1564 42116,1782 42116,1837 42116,3135 42116,3695 42117,79 42118,500 42119,195 42119,393 42119,32475 42120,417 42122,1429 42124,192 42125,859 42126,247 42127,1707 42128,349 42129,602 42130,149 42130,406 42130,640 42132,518 42132,19443 42133,206 42134,10 42135,252 42135,406 42136,146 42136,589 42136,3999 42136,92476 42137,149 42138,195 42139,652 42140,1888 42141,2617 42141,31896 42142,376 42143,4771 42146,298 42147,146 42148,37 42148,71 42148,563 42148,611 42148,920 42148,1235 42148,1335 42148,1449 42149,1837 42150,10 42151,8719 42152,151 42153,217 42154,406 42156,4823 42157,86 42158,1298 42159,2590 42160,302 42161,233 42161,372 42162,65 42162,571 42163,72 42164,1224 42165,2048 42166,106 42166,192 42166,285 42166,306 42166,307 42166,337 42166,346 42166,393 42166,406 42166,435 42166,447 42166,516 42166,538 42166,620 42166,1181 42166,1370 42166,1388 42166,1515 42166,1531 42166,6119 42167,527 42168,805 42169,42170 42171,42172 42173,500 42174,366 42175,417 42176,42177 42178,292 42178,1453 42179,264 42179,1893 42180,143 42181,1893 42182,158 42184,72 42186,217 42186,1417 42187,250 42187,1684 42188,247 42188,2867 42188,22880 42189,83 42190,1858 42191,1860 42192,843 42193,309 42193,310 42194,219 42195,1240 42196,1837 42197,13745 42198,1634 42199,1590 42200,349 42201,3 42202,140 42203,893 42204,79 42205,83 42206,415 42206,1293 42207,973 42207,1117 42208,72 42209,3507 42210,120 42211,3409 42212,399 42213,2779 42214,272 42215,31517 42216,34 42216,35 42217,119 42218,4594 42219,42220 42221,4252 42222,1201 42223,1801 42224,50 42225,781 42226,9022 42227,20771 42228,332 42229,3367 42230,417 42231,42232 42233,2784 42234,14126 42235,1240 42236,4549 42237,323 42238,85 42239,2646 42240,379 42241,9098 42242,8235 42243,72 42244,1146 42245,473 42246,264 42246,304 42246,599 42247,1265 42247,1266 42248,483 42249,258 42250,217 42251,602 42252,500 42253,1847 42254,186 42254,2979 42255,1210 42255,1801 42256,83 42257,1417 42258,41 42258,163 42258,337 42258,929 42258,9024 42259,980 42260,42261 42260,96873 42262,3193 42263,344 42264,344 42265,392 42265,872 42265,1240 42265,4252 42265,6955 42266,99 42267,247 42268,72 42269,42270 42269,57516 42269,77404 42269,85534 42269,86869 42269,239480 42271,298 42272,485 42273,83 42274,2671 42275,595 42276,2607 42277,42278 42279,515 42280,1085 42281,294 42283,42284 42283,69337 42283,83064 42283,93631 42283,97578 42283,108745 42283,176013 42283,176161 42285,195 42285,5874 42285,6119 42285,16767 42286,557 42288,298 42289,485 42290,336 42291,34 42291,35 42291,83 42292,269 42293,42294 42293,45989 42295,298 42296,485 42297,269 42298,417 42299,37759 42300,557 42301,557 42303,195 42304,652 42305,515 42305,652 42305,1893 42306,577 42306,805 42307,332 42307,1058 42308,31977 42308,42309 42308,43775 42308,95849 42308,108307 42310,500 42311,1962 42312,1052 42313,1882 42314,2775 42315,54 42316,2210 42316,4237 42317,1556 42318,1298 42319,801 42320,1715 42321,1644 42322,20 42323,417 42323,1177 42324,6119 42325,2837 42326,1983 42327,1118 42328,10 42329,79 42330,83 42331,3876 42332,1085 42333,485 42333,859 42334,718 42335,167 42335,217 42335,240 42335,390 42335,444 42335,589 42335,631 42335,932 42335,968 42335,1001 42335,1010 42335,1085 42335,1231 42335,1326 42335,1531 42335,1715 42335,1962 42335,2083 42336,8270 42337,1590 42338,42339 42340,718 42341,430 42342,1707 42343,344 42344,1149 42345,704 42346,195 42346,2244 42347,79 42348,417 42349,175 42350,83 42351,338 42351,420 42351,652 42351,1453 42351,1659 42351,1688 42351,2626 42351,4039 42352,861 42353,2367 42354,72 42355,42356 42357,10 42358,42359 42360,991 42361,184 42362,285 42363,1188 42364,294 42365,704 42366,3069 42367,640 42368,5265 42369,347 42370,26 42370,59 42371,481 42372,1 42373,1571 42374,1515 42375,2719 42376,1305 42377,872 42378,2775 42379,447 42380,304 42381,1454 42382,42383 42384,841 42385,280 42386,640 42386,42387 42388,1007 42389,417 42389,862 42390,138 42390,1227 42390,1229 42390,1252 42390,1253 42390,21944 42390,86416 42391,704 42392,1235 42392,1335 42392,2931 42393,323 42394,805 42395,301 42395,968 42395,1837 42396,4355 42397,1 42398,42399 42400,304 42401,42402 42403,42404 42405,42404 42406,704 42407,366 42408,366 42409,366 42410,366 42411,366 42412,366 42413,366 42414,366 42415,2073 42416,42417 42418,42419 42420,63 42421,1167 42422,2083 42423,233 42424,301 42424,968 42425,2351 42426,483 42427,515 42429,3069 42430,149 42431,264 42431,1509 42432,1326 42433,873 42433,1479 42433,2557 42434,7768 42435,1479 42436,2574 42437,42438 42439,2178 42439,4545 42440,366 42441,366 42442,872 42443,694 42444,21408 42445,1803 42446,366 42447,873 42448,1235 42448,1335 42449,397 42450,1381 42452,1052 42453,1012 42453,1177 42454,97 42454,120 42454,178 42454,818 42454,141912 42455,34 42455,35 42456,79 42457,209 42458,1010 42459,687 42459,1556 42460,42461 42462,784 42463,3960 42465,1877 42465,40497 42466,500 42467,306 42467,307 42468,42469 42470,985 42471,366 42472,349 42474,392 42474,1146 42475,671 42476,620 42476,3367 42477,184 42478,19 42479,79 42479,202 42479,203 42480,42481 42482,6750 42484,137 42485,2775 42486,447 42487,602 42487,620 42487,8244 42488,259 42489,2995 42490,473 42490,8149 42492,1181 42493,147 42493,158 42493,80266 42494,489 42495,1368 42496,72 42497,1323 42498,102 42499,1326 42500,408 42501,104 42501,557 42501,953 42501,954 42501,1939 42502,72 42503,42504 42505,483 42506,178 42507,79 42508,50 42508,1515 42510,801 42511,285 42512,422 42513,422 42514,422 42515,422 42516,422 42517,422 42518,392 42518,805 42518,1179 42519,422 42520,9121 42521,65 42521,440 42522,2526 42523,20 42523,269 42523,346 42523,349 42523,439 42523,752 42523,760 42523,868 42523,1010 42523,1289 42523,1425 42523,1515 42523,1590 42523,1644 42524,868 42524,1285 42524,1289 42524,1425 42525,1927 42526,1227 42526,1229 42527,255 42528,1284 42529,65 42529,467 42530,273 42530,274 42532,1983 42534,1983 42535,1608 42536,83 42537,301 42537,518 42537,720 42537,795 42537,1052 42537,1326 42537,1436 42537,1837 42537,2979 42537,3218 42538,503 42539,217 42540,200 42541,200 42541,772 42542,1983 42544,972 42545,240 42545,1203 42545,1955 42546,158 42547,1767 42548,9121 42549,312 42550,811 42551,422 42552,2051 42553,1983 42554,81 42554,215 42554,503 42555,2296 42556,42557 42556,44660 42556,47492 42556,78377 42556,81418 42556,83497 42556,86675 42556,87654 42556,89656 42556,89999 42556,93263 42556,95980 42556,101885 42556,102056 42556,106227 42556,110423 42558,1983 42560,3872 42560,7124 42560,8868 42561,479 42561,953 42562,48 42562,710 42563,500 42564,147 42564,1608 42565,5405 42566,602 42567,1132 42568,781 42569,1776 42570,42571 42573,42574 42575,292 42575,462 42575,852 42575,1722 42575,3367 42575,3538 42576,602 42577,175 42578,718 42579,302 42579,2116 42580,202 42581,2572 42581,44725 42582,289 42582,290 42582,417 42582,1085 42582,2205 42582,2206 42582,2296 42582,33424 42582,75912 42582,94134 42583,47 42583,2469 42584,209 42586,366 42588,723 42589,310 42590,356 42590,852 42591,366 42592,1072 42593,1070 42593,15179 42594,349 42595,46 42595,744 42595,750 42595,762 42595,783 42595,1293 42595,1849 42596,158 42597,861 42598,444 42598,783 42598,968 42598,1160 42598,1293 42598,1300 42598,3422 42598,5662 42599,392 42599,631 42599,1285 42600,3695 42603,13538 42604,255 42605,515 42606,50 42606,149 42607,1983 42608,1509 42609,907 42609,932 42610,87 42612,252 42613,83 42613,285 42613,2779 42613,2784 42617,178 42618,6888 42619,1531 42620,500 42621,417 42622,605 42623,15573 42624,818 42625,4453 42626,388 42627,42628 42629,393 42630,17772 42631,7233 42632,2434 42633,1298 42634,2931 42635,1634 42636,626 42637,2296 42638,349 42639,1877 42640,29380 42641,622 42642,202 42642,203 42643,7572 42644,586 42645,1001 42646,372 42647,1294 42648,264 42649,2671 42650,973 42651,6068 42652,4455 42653,192 42654,1007 42655,510 42656,3507 42657,1085 42658,86 42659,563 42660,861 42661,1590 42662,1639 42663,140 42664,515 42665,227 42666,435 42667,8798 42668,1133 42669,697 42670,1363 42671,718 42672,3238 42673,158 42674,34 42674,1467 42674,21290 42674,41877 42674,43155 42674,43164 42674,43167 42674,43259 42674,44069 42674,44457 42675,298 42676,356 42678,1556 42680,158 42681,192 42682,278 42683,435 42683,980 42684,3 42684,163 42684,302 42684,605 42684,2116 42684,19010 42685,217 42685,1417 42686,42687 42689,949 42690,775 42691,222 42691,455 42691,2775 42692,920 42693,264 42693,1749 42693,14550 42694,3 42695,1068 42696,652 42697,3999 42697,5440 42698,298 42699,1105 42699,1429 42700,149 42701,500 42702,22 42702,752 42703,1977 42703,1978 42704,79 42706,3094 42707,326 42708,852 42709,1836 42710,509 42711,1590 42712,349 42713,2274 42714,5987 42715,111 42716,13745 42717,32 42718,392 42719,779 42720,697 42721,8798 42722,809 42723,1240 42724,3260 42725,1085 42725,1634 42725,2423 42725,18726 42725,29619 42725,41772 42725,42725 42725,45066 42725,45501 42725,47365 42725,47401 42725,47970 42725,54528 42725,57654 42725,59210 42725,60523 42725,66767 42725,68955 42725,72821 42725,87725 42725,114708 42725,114709 42725,114711 42725,118577 42725,120695 42725,125606 42725,129040 42725,139812 42725,146017 42725,156447 42725,164376 42725,165752 42725,166932 42725,169599 42725,169952 42725,169962 42725,170694 42725,171371 42725,181064 42725,184356 42725,186706 42725,186709 42725,216805 42725,218377 42725,245631 42725,245632 42725,259473 42726,287 42727,599 42728,163 42728,302 42728,579 42728,1849 42728,6303 42728,191860 42729,1132 42730,781 42732,3069 42733,48 42733,704 42734,46 42734,304 42734,481 42734,485 42734,744 42734,750 42734,783 42734,1124 42734,1167 42734,1402 42734,1479 42735,1844 42736,2915 42737,500 42737,949 42738,668 42739,217 42739,379 42740,1644 42741,644 42742,536 42744,247 42745,1454 42746,602 42747,360 42748,994 42749,1118 42750,1983 42751,54 42751,1309 42751,1707 42751,2315 42751,2605 42752,602 42752,620 42753,2923 42753,4190 42754,873 42755,1659 42756,602 42757,1858 42758,1860 42759,861 42760,602 42761,10 42761,182 42761,1417 42762,120 42762,225 42762,261 42762,332 42762,694 42762,1181 42762,1419 42763,1181 42764,72 42765,3321 42766,1238 42767,783 42767,1616 42768,264 42768,1509 42769,8270 42770,1370 42771,2775 42772,447 42774,577 42774,1429 42775,2995 42776,97 42777,1368 42778,366 42779,287 42779,685 42779,694 42779,849 42779,1319 42781,660 42782,602 42783,602 42784,254 42784,557 42784,954 42784,1939 42785,178 42785,2750 42786,1782 42787,106 42787,147 42787,251 42787,252 42787,493 42787,682 42787,1243 42787,1512 42787,5992 42788,500 42789,304 42790,1284 42791,717 42791,861 42793,349 42794,1955 42795,1955 42796,500 42797,79 42798,422 42799,56 42800,217 42800,1417 42801,602 42802,1381 42803,77 42803,1298 42804,657 42805,1556 42806,158 42806,252 42806,302 42806,622 42807,225 42807,248 42808,579 42809,968 42809,20359 42810,298 42810,1001 42810,1085 42810,1474 42810,2089 42810,2572 42810,2940 42810,21944 42810,178576 42811,3846 42812,376 42815,435 42815,1033 42816,2775 42817,447 42818,818 42820,1133 42821,622 42822,4 42822,5 42823,248 42823,447 42823,1818 42824,640 42825,563 42826,536 42827,1085 42828,10 42829,483 42830,3804 42831,54 42832,1181 42832,1243 42832,2867 42832,22880 42833,167 42833,968 42833,2979 42834,872 42835,698 42835,750 42836,7416 42837,818 42838,919 42839,372 42839,390 42839,75912 42840,151 42841,390 42841,589 42841,1119 42842,676 42843,247 42844,83 42844,119 42844,278 42844,347 42844,364 42844,372 42844,389 42844,417 42844,455 42844,525 42844,626 42844,805 42844,907 42844,972 42844,1019 42844,1085 42844,1274 42844,1298 42844,1363 42844,1465 42844,1467 42844,1718 42844,1801 42844,1881 42844,2266 42844,2434 42844,2553 42844,2590 42844,2646 42844,4172 42844,13575 42845,30 42846,1715 42847,5405 42849,1181 42850,292 42851,907 42851,932 42852,302 42853,171 42854,222 42854,657 42854,3182 42854,4411 42855,247 42856,4549 42857,1612 42858,1298 42859,83 42860,9121 42861,634 42862,298 42863,485 42864,206 42865,920 42866,42867 42868,1782 42869,309 42869,310 42870,79 42871,2045 42872,2782 42873,2797 42874,1181 42875,422 42876,56 42877,3 42878,14366 42879,298 42880,485 42881,5547 42882,86 42883,2315 42884,8373 42885,42886 42887,42886 42888,42886 42889,42886 42890,42886 42891,42886 42892,42886 42893,42886 42894,1531 42895,240 42896,2775 42897,447 42898,240 42899,79 42899,1010 42899,1011 42900,10 42900,113156 42901,1571 42902,3069 42903,640 42904,42905 42906,4903 42907,1608 42908,2048 42909,1192 42910,704 42911,818 42912,949 42913,289 42913,290 42914,136 42915,42916 42917,271 42917,615 42917,1188 42917,2089 42917,3695 42917,9021 42917,9536 42917,35750 42917,35751 42918,298 42918,805 42918,911 42918,1368 42918,2775 42919,42920 42921,980 42922,22 42923,42924 42925,146 42926,225 42927,483 42928,126 42928,534 42929,42930 42929,46150 42931,2353 42932,171 42933,264 42934,4192 42934,4193 42935,1235 42935,1335 42936,233 42937,872 42938,515 42938,1381 42939,42940 42939,132588 42939,179937 42941,1 42942,272 42943,202 42943,203 42944,42945 42946,1 42947,652 42948,3258 42949,9560 42950,675 42951,34 42951,35 42951,83 42951,147 42951,862 42951,1001 42951,1122 42951,1785 42951,5718 42952,219 42952,233 42953,151 42954,41 42954,1608 42954,43749 42954,73662 42955,5366 42956,731 42957,206 42958,636 42959,557 42960,178 42961,557 42962,254 42962,2379 42964,731 42965,99 42966,893 42966,1374 42966,1556 42967,366 42968,1 42969,406 42970,657 42971,233 42972,2620 42973,497 42974,202 42974,203 42974,493 42975,42976 42977,240 42978,83 42979,731 42980,167 42980,301 42980,968 42980,1012 42980,1241 42980,1436 42980,1522 42980,2083 42980,2557 42980,2979 42980,3218 42981,809 42982,5440 42983,949 42984,852 42985,1509 42986,7 42987,14366 42988,417 42990,356 42990,852 42990,1718 42990,2646 42990,5591 42991,4611 42992,107 42993,1007 42994,360 42995,14996 42996,640 42997,323 42998,356 42998,390 42998,1140 42998,5540 42998,6068 42998,9457 42999,4691 43000,72 43001,1235 43001,1335 43002,1370 43003,1436 43004,424 43005,106 43007,467 43007,743 43007,1803 43008,43009 43008,51048 43008,219348 43010,107 43011,422 43012,56 43013,602 43014,43015 43016,602 43017,346 43018,43019 43020,1353 43021,4594 43022,43023 43024,647 43024,43025 43026,30 43027,805 43028,1010 43029,2775 43030,447 43031,1556 43032,35687 43033,640 43034,433 43035,422 43036,56 43037,43038 43039,1 43040,99 43041,349 43042,43043 43044,704 43045,120 43046,43047 43048,2574 43050,805 43051,1010 43052,704 43055,1411 43056,217 43057,704 43058,704 43059,160 43060,442 43060,2436 43060,3474 43061,392 43062,8854 43063,207 43065,10 43066,366 43067,366 43068,366 43069,366 43070,366 43071,160 43072,366 43073,366 43074,366 43075,366 43076,366 43077,481 43078,366 43079,366 43080,366 43081,366 43082,233 43083,366 43084,7416 43085,102 43085,408 43086,43087 43086,51130 43086,52283 43088,43089 43090,503 43090,1149 43090,1282 43091,1551 43092,704 43093,366 43094,872 43095,752 43096,827 43096,3328 43097,872 43098,1424 43099,861 43100,893 43101,652 43101,1579 43102,3451 43102,3452 43103,907 43103,932 43104,634 43106,15 43107,1118 43108,43109 43110,217 43111,3602 43111,7757 43112,1983 43113,485 43114,312 43114,872 43114,1453 43115,248 43116,298 43117,485 43118,160 43119,919 43120,202 43120,1659 43120,14819 43122,306 43122,307 43123,4146 43124,43125 43126,298 43127,485 43128,330 43128,885 43129,918 43130,602 43132,872 43133,310 43133,3039 43134,4220 43134,6487 43135,287 43135,809 43135,19010 43136,34 43136,35 43137,1298 43137,1616 43138,79 43139,1858 43140,1860 43141,175 43141,693 43141,2146 43142,254 43143,1238 43144,43145 43146,366 43147,516 43148,422 43149,422 43150,79 43150,1326 43151,596 43151,1639 43152,422 43153,422 43154,422 43156,298 43157,1400 43158,485 43159,422 43160,422 43161,422 43162,647 43163,344 43165,1287 43166,66 43168,43169 43170,3538 43173,1235 43173,1335 43174,1 43174,5375 43175,146 43175,779 43176,704 43177,704 43178,1282 43178,1882 43178,2210 43178,4237 43179,33611 43180,10 43180,113156 43181,652 43182,337 43183,163 43183,186 43183,302 43183,703 43183,893 43183,1556 43183,2116 43183,3769 43184,1133 43185,2411 43186,1133 43187,417 43188,483 43189,217 43190,43191 43193,1298 43194,240 43194,2989 43194,2991 43194,3328 43195,4411 43196,1033 43199,640 43200,919 43202,431 43205,211 43205,5440 43206,602 43208,592 43209,2367 43210,65 43210,868 43211,298 43212,485 43213,1011 43213,1127 43213,1849 43216,2810 43216,3611 43216,6032 43216,6424 43216,9708 43216,18028 43216,71824 43216,72530 43216,74658 43216,125011 43216,138654 43216,142256 43216,145851 43216,163891 43216,185271 43216,188481 43216,190241 43216,223659 43216,247074 43216,263931 43217,1631 43218,2995 43220,2373 43221,1891 43222,1052 43223,120 43223,261 43223,1466 43224,14989 43226,932 43227,911 43228,1151 43228,1454 43229,485 43230,336 43231,258 43231,818 43231,872 43231,2991 43232,841 43233,872 43233,1267 43233,1579 43233,3367 43233,49057 43234,392 43234,644 43235,167 43235,2083 43236,217 43236,467 43236,872 43237,795 43239,30 43239,267 43239,328 43239,440 43239,622 43239,779 43239,809 43239,1179 43239,1515 43239,3246 43239,3247 43239,60576 43239,68069 43239,141912 43240,1227 43240,1229 43241,994 43242,811 43243,1434 43245,302 43245,420 43245,1414 43246,644 43247,1285 43247,1888 43247,2590 43248,1284 43248,1715 43249,43250 43251,1983 43252,43253 43254,346 43255,206 43256,682 43256,72439 43257,104 43257,1881 43261,77 43261,85 43262,644 43262,2105 43263,195 43265,1102 43266,48 43266,726 43267,704 43268,2353 43270,5405 43271,736 43273,222 43273,283 43273,289 43273,290 43273,81233 43273,94134 43274,1238 43275,406 43276,1803 43277,30331 43279,809 43279,19010 43280,647 43280,1289 43280,1893 43280,49057 43281,406 43282,577 43283,1452 43284,1127 43285,256 43286,17897 43287,1425 43288,167 43288,1298 43288,1522 43288,1616 43289,605 43290,192 43291,1429 43292,304 43293,389 43294,1118 43295,1858 43296,1860 43297,1085 43298,379 43298,707 43301,671 43302,292 43302,1014 43303,222 43303,289 43303,290 43303,338 43303,1151 43304,366 43305,240 43305,809 43306,1243 43307,18726 43308,929 43309,160 43309,736 43310,1243 43311,2048 43312,957 43312,1815 43313,225 43314,255 43315,81 43317,346 43318,859 43319,296 43320,1927 43321,392 43322,68 43322,1400 43323,1858 43324,1860 43327,200 43328,1644 43331,760 43332,932 43332,1016 43333,1010 43333,1011 43334,775 43335,299 43336,344 43336,710 43336,1711 43336,1836 43337,22 43337,2017 43338,682 43340,77 43341,120 43341,1466 43341,2372 43342,356 43342,973 43343,372 43343,1955 43344,687 43345,302 43346,167 43346,1284 43346,2083 43347,372 43348,285 43348,406 43348,779 43349,77 43350,1370 43352,200 43352,1282 43353,30 43353,1608 43353,14989 43354,77 43355,1429 43356,247 43357,1 43358,1844 43359,1429 43360,273 43360,274 43361,271 43362,447 43363,1298 43364,192 43364,264 43364,592 43364,1181 43364,1531 43365,1175 43366,571 43366,868 43367,298 43368,485 43369,83 43370,406 43371,247 43372,447 43373,1147 43374,30 43374,1179 43375,136 43375,563 43376,447 43377,795 43378,3135 43379,79 43380,1 43380,313 43381,79 43382,900 43383,222 43383,440 43383,536 43383,949 43383,1019 43383,4355 43383,7092 43384,269 43385,43386 43387,1556 43388,2244 43389,160 43390,379 43390,385 43391,872 43392,7124 43393,602 43394,41 43394,134 43394,332 43394,714 43394,1001 43394,1119 43394,1284 43394,1715 43394,1955 43394,2205 43394,2286 43394,4237 43394,33424 43396,143 43399,79 43400,2590 43401,151 43402,439 43403,835 43403,1968 43404,718 43405,1370 43406,264 43407,240 43407,877 43407,4637 43408,1010 43409,280 43409,664 43409,2353 43409,9015 43409,17245 43410,710 43411,43412 43411,81806 43413,1181 43414,4823 43415,79 43416,1556 43417,2367 43418,93 43418,94 43419,1085 43420,392 43421,151 43422,195 43422,314 43423,717 43424,247 43425,304 43426,1551 43427,43428 43429,366 43430,599 43431,602 43432,2315 43433,328 43434,602 43435,809 43437,647 43439,192 43439,406 43440,20771 43441,493 43441,1381 43443,577 43443,1429 43444,7429 43445,1078 43446,3161 43447,563 43448,563 43449,1429 43450,640 43451,158 43452,97 43452,424 43452,1639 43452,1801 43452,3295 43452,3296 43453,278 43454,1 43455,4 43455,5 43455,355 43456,535 43457,1849 43458,298 43459,485 43460,15 43460,415 43460,1474 43460,4218 43460,66500 43461,44 43462,1893 43463,390 43464,424 43465,298 43466,485 43467,72 43468,30 43468,364 43468,417 43468,442 43468,1179 43468,1368 43468,1415 43469,2775 43470,447 43471,2775 43472,447 43473,298 43474,485 43475,483 43476,13919 43479,557 43480,557 43481,557 43482,8719 43483,138 43484,865 43485,557 43486,137 43487,118 43487,4597 43488,704 43489,8719 43490,138 43491,865 43492,557 43493,137 43494,43495 43494,47148 43494,77965 43494,102958 43494,110954 43494,121111 43494,124415 43494,133481 43494,178366 43496,8719 43497,138 43498,865 43499,557 43500,137 43501,118 43501,4597 43502,118 43502,4597 43503,8719 43504,138 43505,865 43506,557 43507,137 43508,118 43508,4597 43510,920 43511,9323 43512,250 43512,1684 43513,72 43514,43515 43516,296 43517,417 43518,704 43519,2775 43520,447 43521,389 43522,43523 43524,298 43525,485 43526,1285 43526,7124 43527,43528 43529,422 43530,56 43531,269 43532,43533 43532,66268 43534,149 43535,8788 43536,2351 43537,1118 43538,622 43539,1644 43540,417 43541,397 43541,483 43542,187 43543,43544 43545,20 43546,43547 43549,298 43550,485 43551,9560 43552,149 43553,1556 43554,240 43555,43556 43555,57562 43557,43558 43557,97632 43559,192 43559,663 43559,664 43560,7117 43561,9560 43562,43563 43564,1531 43565,1634 43566,1201 43568,872 43569,589 43570,2867 43570,22880 43571,43572 43573,222 43574,171 43575,211 43576,5440 43577,697 43577,3260 43578,4101 43579,147 43580,557 43581,43582 43583,225 43584,585 43585,376 43586,43587 43588,8884 43589,1085 43590,43591 43592,233 43593,1821 43594,43595 43596,1782 43597,4549 43598,43599 43600,1977 43600,1978 43601,72 43602,330 43603,273 43603,274 43613,56 43613,140 43613,18638 43613,43613 43613,163955 43613,163956 43613,164280 43613,164289 43613,182022 43614,366 43615,366 43616,366 43617,366 43618,366 43619,298 43620,485 43621,43622 43623,68 43624,2048 43625,306 43625,307 43626,3069 43627,146 43628,283 43629,2416 43629,2417 43631,1454 43632,515 43633,13 43634,43635 43636,298 43637,485 43638,43639 43640,2266 43641,366 43642,483 43645,2296 43646,872 43646,1151 43647,111 43647,760 43648,932 43650,422 43651,422 43652,422 43653,422 43654,422 43655,422 43656,422 43657,79 43658,996 43659,5440 43660,222 43660,1467 43660,13137 43661,298 43662,485 43663,43664 43663,81871 43663,104660 43665,349 43666,1631 43668,298 43669,485 43670,158 43670,202 43670,406 43671,43672 43673,285 43674,134 43675,50 43675,762 43675,2156 43675,21944 43675,124668 43676,805 43678,104 43679,9026 43680,1983 43681,298 43682,485 43683,44 43684,875 43687,1181 43688,718 43689,399 43690,628 43691,718 43692,163 43692,209 43692,302 43692,579 43692,861 43692,1556 43693,718 43694,2411 43695,2626 43697,2995 43698,273 43698,274 43700,1579 43701,1467 43702,79 43703,2737 43704,518 43705,3193 43706,31122 43707,97 43708,72 43709,850 43710,875 43711,417 43712,298 43713,485 43714,4691 43714,114600 43715,818 43717,4066 43718,1140 43718,1287 43718,1309 43718,1453 43718,1572 43718,2443 43719,43720 43721,406 43722,83 43723,1707 43724,2867 43724,2868 43724,22880 43725,931 43726,83 43727,137 43728,272 43728,1414 43729,1509 43730,1509 43731,503 43733,273 43733,274 43734,83 43734,217 43734,323 43734,358 43734,577 43734,1072 43734,1240 43734,1274 43734,1590 43734,2045 43734,2979 43735,718 43736,6682 43737,120 43737,1466 43737,2807 43738,1849 43739,1479 43741,424 43742,43743 43744,211 43744,714 43745,7 43745,43746 43745,86419 43745,89186 43745,103290 43745,129144 43745,170482 43747,43748 43747,219639 43749,1608 43749,43749 43749,57109 43749,77315 43751,518 43753,4237 43753,182162 43754,931 43755,43756 43757,589 43758,1414 43759,43760 43761,602 43762,1085 43763,48 43764,43765 43766,10 43767,115 43767,118 43768,5405 43770,273 43770,274 43771,43772 43773,43774 43776,682 43776,72439 43777,1289 43778,932 43778,1016 43778,4237 43778,182162 43779,1767 43780,171 43781,1085 43782,1266 43782,1370 43783,207 43784,43785 43786,973 43787,447 43788,483 43789,5343 43790,217 43791,289 43791,290 43792,28072 43793,557 43794,2506 43795,3 43796,602 43797,376 43798,23011 43799,1085 43800,328 43801,2351 43802,233 43803,704 43804,704 43805,652 43806,9121 43807,557 43808,107 43809,2416 43809,2417 43810,292 43811,338 43812,3447 43813,298 43814,195 43815,1133 43816,3538 43817,2048 43818,2995 43819,3960 43820,1007 43821,2574 43822,43823 43824,63 43826,868 43826,162599 43827,1858 43828,1860 43829,160 43830,893 43830,1326 43830,1715 43830,124668 43831,1323 43832,102 43833,1326 43834,408 43835,2674 43836,43837 43838,151 43840,298 43841,485 43842,43843 43844,1983 43845,602 43846,240 43846,1285 43846,1785 43846,2620 43846,5718 43849,17228 43850,43851 43852,640 43853,957 43857,1821 43858,1821 43859,1257 43860,872 43861,8270 43862,43863 43864,269 43865,44 43866,48 43867,43868 43867,48823 43867,52479 43869,1116 43870,6682 43871,175 43871,1773 43872,483 43873,233 43874,1227 43874,1229 43875,972 43875,1010 43875,1298 43876,240 43877,1506 43880,483 43880,2867 43880,2868 43880,22880 43881,30 43882,79 43883,1274 43884,171 43885,192 43885,336 43885,493 43885,663 43885,3872 43886,447 43886,538 43887,43888 43889,287 43890,143 43891,146 43891,158 43891,192 43891,285 43891,336 43891,406 43891,620 43891,779 43891,920 43891,1515 43891,1531 43891,1893 43892,222 43893,41 43893,304 43893,328 43893,634 43893,141912 43894,422 43895,56 43896,19010 43897,718 43898,33082 43900,43901 43902,43901 43903,104 43903,953 43904,422 43905,56 43906,43907 43908,493 43908,920 43909,1707 43910,929 43912,991 43913,376 43914,1881 43916,43917 43918,2105 43920,298 43921,485 43922,20257 43923,298 43924,485 43925,872 43926,10 43928,1837 43930,861 43932,406 43932,1775 43932,55849 43933,126 43934,126 43935,72 43936,772 43937,557 43938,862 43939,557 43940,557 43941,557 43942,5906 43943,557 43944,626 43945,278 43946,137 43947,862 43948,5906 43949,557 43950,626 43951,278 43952,137 43953,862 43954,2837 43955,147 43956,3069 43957,20813 43958,704 43959,43960 43959,50900 43959,63051 43959,64098 43959,67573 43959,69171 43959,74448 43959,87386 43961,1 43961,273 43961,274 43961,626 43961,647 43961,1415 43962,1983 43963,83 43963,202 43963,203 43963,217 43963,577 43963,1072 43963,1590 43963,2266 43963,2274 43963,2784 43963,2931 43963,3182 43963,3538 43963,4637 43963,7092 43964,602 43965,330 43965,783 43965,2572 43965,3538 43966,72 43967,344 43968,285 43969,1983 43970,43971 43972,718 43973,1983 43974,43975 43976,104 43977,1983 43978,298 43979,485 43980,72 43981,217 43982,5976 43984,1179 43985,323 43986,43987 43986,89495 43988,202 43988,455 43988,536 43988,694 43988,996 43988,1240 43988,1274 43988,1572 43988,1608 43988,1644 43988,2266 43988,2274 43988,2671 43988,2699 43988,2784 43988,3182 43988,3538 43988,4549 43988,7092 43989,2797 43990,493 43991,850 43992,592 43993,43994 43995,1181 43996,366 43997,366 43998,366 43999,366 44000,366 44001,366 44002,312 44003,366 44004,1220 44004,1222 44005,44006 44007,1368 44008,704 44009,44010 44011,861 44012,44013 44014,422 44015,56 44016,44017 44018,44017 44020,422 44021,44022 44023,44024 44025,44026 44027,104 44028,9121 44029,338 44030,422 44031,56 44032,1983 44033,292 44034,178 44035,294 44036,296 44037,298 44038,1767 44039,861 44040,2526 44041,10 44042,383 44043,1175 44044,10 44045,1151 44046,44047 44048,83 44049,1238 44050,581 44051,1452 44052,233 44054,44055 44056,500 44057,1191 44058,784 44059,2312 44060,390 44060,20535 44061,2701 44062,147 44062,184 44063,1289 44065,1858 44066,1860 44067,861 44068,657 44068,2266 44071,5165 44072,301 44074,298 44075,485 44076,146 44078,255 44079,893 44080,477 44080,23287 44081,795 44083,306 44083,307 44085,1140 44085,9030 44086,1858 44087,1860 44088,4831 44089,1983 44090,298 44091,485 44092,72 44093,344 44094,285 44095,292 44095,599 44095,872 44095,1151 44096,255 44097,10 44098,79 44099,1858 44100,1860 44101,626 44103,397 44104,330 44105,167 44106,422 44107,31073 44108,79 44109,79 44110,195 44110,1515 44111,483 44112,604 44113,292 44115,163 44115,309 44115,310 44115,392 44115,818 44115,872 44116,393 44118,79 44119,640 44120,184 44120,304 44120,602 44120,980 44120,1252 44120,1253 44120,1285 44120,1821 44120,2528 44120,4455 44121,671 44122,104 44123,483 44123,1082 44124,292 44125,26 44125,59 44126,1118 44127,1801 44128,292 44129,1711 44130,1238 44131,422 44132,422 44133,422 44134,422 44135,217 44135,222 44135,1019 44136,393 44136,35486 44136,79349 44137,422 44138,422 44139,422 44140,422 44141,422 44142,422 44143,422 44144,640 44146,640 44147,1663 44148,640 44149,2944 44150,640 44152,640 44153,298 44154,485 44155,65 44157,65 44157,868 44157,162599 44158,1466 44158,6955 44159,292 44160,292 44161,1241 44161,1849 44161,2620 44162,192 44164,718 44165,97 44165,5405 44166,557 44167,292 44168,292 44169,1127 44170,72 44171,83 44171,143 44171,599 44171,17346 44173,292 44174,5101 44175,292 44177,2210 44177,4237 44178,30428 44179,292 44180,298 44181,485 44182,1010 44182,1955 44183,1891 44184,14366 44185,135 44186,5547 44186,6955 44186,8180 44187,292 44189,292 44190,273 44190,274 44190,1082 44191,240 44193,392 44194,309 44194,310 44195,66 44195,868 44197,273 44197,274 44197,313 44197,66754 44198,15573 44199,298 44200,485 44201,1556 44202,58 44203,298 44204,485 44205,3507 44206,292 44207,1983 44207,1984 44208,868 44209,690 44210,338 44211,1849 44212,104 44213,406 44213,779 44214,392 44215,592 44217,4355 44218,3960 44219,310 44219,3039 44220,1289 44221,1973 44222,3585 44222,156379 44223,649 44224,2995 44225,2244 44226,644 44229,980 44230,980 44231,980 44232,309 44232,310 44232,1203 44232,3135 44233,1429 44234,1181 44237,240 44237,1203 44237,1955 44238,717 44239,489 44239,893 44240,20 44241,99 44242,56 44242,252 44243,538 44245,602 44246,1893 44248,211 44248,4411 44251,934 44252,298 44253,485 44254,644 44255,1659 44256,120 44256,503 44257,309 44257,310 44258,1429 44259,1 44261,861 44262,388 44263,3999 44265,2312 44269,186 44269,500 44272,1566 44273,1203 44274,4101 44275,2744 44276,647 44277,344 44278,264 44278,515 44278,647 44278,1289 44278,2626 44279,15573 44280,1181 44281,292 44282,298 44283,485 44284,289 44284,290 44285,195 44286,861 44288,1052 44289,292 44290,861 44291,2073 44293,292 44293,918 44293,31934 44294,602 44296,83 44297,602 44298,760 44298,1149 44298,1631 44299,1392 44301,222 44301,682 44301,2944 44301,2989 44301,2991 44301,3115 44301,28130 44301,72439 44303,640 44305,861 44306,72 44307,647 44308,344 44309,312 44310,79 44310,192 44310,269 44310,809 44310,1425 44310,1844 44310,5213 44312,2828 44315,44 44316,298 44317,485 44318,1102 44319,298 44320,485 44321,292 44322,292 44323,861 44324,647 44325,344 44326,1052 44327,647 44328,344 44329,222 44329,313 44329,455 44329,657 44329,2646 44329,2779 44330,1285 44330,84257 44331,861 44332,861 44333,2353 44334,287 44335,557 44336,247 44337,298 44338,485 44339,273 44339,274 44342,1381 44343,273 44343,274 44344,50 44344,99 44345,435 44346,30 44347,661 44347,20573 44347,188658 44347,190259 44347,192041 44347,192116 44347,192465 44347,193564 44348,1612 44348,4455 44350,726 44351,660 44352,875 44353,195 44354,298 44355,485 44356,731 44357,918 44358,861 44359,298 44360,485 44361,875 44362,779 44363,3447 44364,760 44365,861 44366,647 44367,2292 44368,2178 44368,4545 44368,139010 44369,50 44370,640 44370,1149 44370,2867 44370,2868 44370,8488 44371,5375 44372,298 44373,485 44374,298 44375,485 44376,292 44377,393 44377,1531 44378,255 44380,217 44380,233 44381,875 44382,2205 44382,2206 44382,33424 44383,298 44384,485 44385,795 44385,968 44385,973 44385,3756 44386,312 44387,772 44388,515 44388,1052 44389,861 44390,252 44390,318 44391,336 44391,571 44391,2083 44392,83 44393,1807 44393,1955 44394,996 44396,104 44397,389 44397,1858 44399,710 44399,1147 44400,392 44401,259 44401,788 44401,28294 44402,264 44403,167 44403,1167 44403,1231 44403,1837 44403,2083 44403,5662 44405,1370 44407,104 44407,248 44408,83 44410,83 44410,51502 44410,68069 44410,77336 44410,256337 44411,717 44413,356 44414,393 44415,1052 44416,467 44416,525 44416,818 44417,44418 44419,2073 44420,1052 44421,907 44421,932 44423,79 44424,611 44424,873 44424,1634 44424,1860 44424,2828 44424,8072 44425,312 44426,240 44427,1571 44428,1749 44429,392 44430,32 44430,392 44430,697 44430,3003 44431,44432 44431,54393 44431,87600 44431,89592 44431,105267 44431,108279 44431,113210 44431,235517 44431,261910 44433,5213 44434,1014 44435,392 44435,697 44437,1243 44438,483 44439,285 44440,104 44441,4 44441,5 44441,859 44441,1243 44442,313 44442,657 44443,83 44444,1085 44445,1224 44446,298 44447,346 44448,626 44449,20 44449,86 44449,784 44449,5212 44449,6682 44449,20257 44451,58 44451,596 44453,310 44454,1821 44455,422 44456,56 44459,1985 44460,106 44460,192 44460,337 44460,435 44460,447 44460,726 44460,1388 44460,3989 44460,6119 44461,389 44462,772 44463,422 44464,56 44465,718 44466,30 44467,346 44468,298 44469,485 44470,44471 44470,51523 44470,92428 44470,117516 44470,121559 44472,298 44473,485 44474,151 44475,298 44476,485 44477,1313 44478,5192 44479,338 44479,852 44480,167 44480,2083 44481,304 44483,346 44485,273 44485,274 44486,1608 44487,760 44487,1149 44487,1631 44487,3585 44488,346 44489,417 44490,4039 44491,356 44492,1590 44492,1644 44493,346 44494,376 44495,272 44496,346 44497,79 44498,83 44498,2671 44499,72 44500,406 44501,250 44501,1684 44502,247 44503,1707 44505,72 44507,264 44507,1509 44507,1893 44507,2312 44508,171 44509,209 44510,392 44512,1133 44514,1467 44515,2867 44515,22880 44516,344 44516,577 44517,227 44518,86 44518,167 44518,301 44518,356 44518,852 44518,941 44518,1010 44518,1284 44518,1298 44518,1522 44518,2083 44518,2191 44518,2372 44518,2557 44518,2979 44518,3138 44519,209 44520,704 44522,292 44522,1238 44522,1572 44522,1722 44523,2421 44524,255 44525,8308 44526,255 44527,1300 44528,344 44528,577 44529,704 44530,44531 44530,55424 44530,60631 44532,209 44533,44534 44535,44534 44536,209 44537,1983 44538,1983 44539,202 44539,203 44539,1243 44540,44541 44542,358 44543,211 44543,671 44544,44545 44546,5874 44547,1634 44548,298 44549,485 44551,1001 44552,44553 44554,44555 44554,80363 44554,93079 44554,111481 44554,185108 44556,2421 44557,44558 44557,54090 44557,56882 44557,68470 44557,171730 44557,192740 44557,235206 44559,44560 44561,44562 44563,557 44564,557 44565,209 44566,202 44566,203 44567,1623 44568,481 44569,3069 44571,44572 44573,10 44574,3 44575,209 44577,2867 44577,2868 44577,22880 44578,248 44578,450 44578,1332 44579,631 44580,602 44581,602 44582,1452 44582,4637 44583,3999 44584,406 44585,83 44586,673 44586,2373 44587,422 44588,56 44589,579 44590,1983 44591,861 44592,346 44593,34 44593,35 44593,217 44594,843 44595,2351 44596,1983 44597,406 44598,44599 44600,79 44601,1252 44601,1253 44602,34 44602,35 44603,346 44604,44605 44606,107 44608,1 44609,1118 44610,805 44611,1058 44612,30 44613,211 44614,861 44615,5440 44616,147 44617,3507 44618,602 44619,861 44620,346 44621,850 44622,346 44623,779 44624,222 44624,1590 44626,626 44627,6068 44628,264 44629,44630 44631,44632 44631,84064 44631,89461 44631,100588 44633,1381 44634,392 44634,1796 44635,10 44636,1740 44637,372 44638,247 44639,516 44640,81 44641,1556 44642,920 44643,44644 44645,8270 44646,1370 44647,861 44648,1749 44649,1117 44650,44651 44650,52438 44650,84906 44650,155315 44652,417 44653,1007 44654,147 44654,206 44654,994 44654,2244 44655,801 44656,346 44657,346 44659,3538 44661,346 44662,346 44663,346 44664,207 44665,862 44665,2590 44666,704 44667,3246 44667,3247 44668,346 44670,292 44671,805 44672,72 44673,44674 44676,44677 44676,87542 44676,96298 44676,106795 44678,346 44679,81 44680,83 44681,44682 44681,52132 44683,366 44684,366 44685,366 44686,4453 44687,366 44688,366 44689,44690 44691,366 44692,366 44693,366 44694,99 44695,366 44696,366 44697,366 44698,346 44699,408 44700,1773 44701,233 44702,83 44703,346 44704,298 44705,485 44706,408 44706,1016 44707,515 44708,1977 44708,1978 44709,346 44710,1634 44711,50 44711,79 44712,72 44713,1010 44715,718 44718,251 44719,439 44719,622 44720,360 44721,872 44722,585 44724,346 44725,417 44725,431 44725,446 44725,534 44725,588 44725,590 44725,677 44725,685 44725,714 44725,862 44725,943 44725,997 44725,1462 44725,1641 44725,2285 44725,2572 44725,2874 44725,3623 44725,4222 44725,5563 44725,5902 44725,7194 44725,8537 44725,9028 44725,16668 44725,18035 44725,19132 44725,44725 44725,46874 44725,51972 44725,56350 44725,57041 44725,58400 44725,63729 44725,66345 44725,73279 44725,75912 44725,81508 44725,85930 44725,90976 44725,93206 44725,94247 44725,99003 44725,104341 44725,107947 44725,108282 44725,108555 44725,117924 44725,118156 44725,125173 44725,125174 44725,134039 44725,140222 44725,140666 44725,150059 44725,150067 44725,152600 44725,161892 44725,162568 44725,162578 44725,174890 44725,176454 44725,176791 44725,178576 44725,182476 44725,183573 44725,183575 44725,185877 44725,189477 44725,193129 44725,194414 44725,217459 44725,219904 44725,221310 44725,221666 44725,225563 44725,230599 44725,235952 44725,236594 44725,236821 44725,238191 44725,241746 44725,247743 44725,248796 44726,79 44726,195 44727,5130 44728,10 44728,113156 44729,3451 44729,3452 44730,195 44731,207 44733,346 44734,287 44735,306 44735,307 44736,818 44737,346 44738,1298 44739,4 44739,5 44739,527 44739,794 44740,835 44740,4039 44741,292 44742,151 44744,32475 44745,346 44746,264 44746,809 44746,2646 44746,5213 44747,861 44748,298 44749,485 44750,222 44750,13361 44751,209 44752,44753 44755,2083 44756,305 44757,1149 44758,422 44759,255 44760,422 44761,422 44762,779 44763,704 44764,298 44765,485 44766,422 44767,704 44768,3161 44768,44769 44770,422 44771,422 44772,422 44773,422 44774,422 44775,175 44776,5405 44777,852 44778,929 44778,4678 44780,1240 44780,76096 44781,298 44782,485 44783,4810 44784,147 44785,1118 44786,2923 44787,536 44787,2173 44788,640 44789,640 44790,640 44791,195 44791,596 44791,749 44791,752 44791,1033 44791,1151 44792,775 44793,79 44793,149 44794,640 44795,332 44795,383 44795,406 44795,509 44795,1298 44795,1722 44795,3135 44795,14819 44796,720 44798,79 44798,192 44799,312 44800,19 44801,264 44801,1659 44801,2979 44802,72 44803,4411 44804,344 44804,349 44804,392 44804,1836 44807,931 44808,5591 44809,240 44810,500 44811,1962 44812,1052 44813,1882 44814,2775 44815,54 44816,2210 44816,4237 44817,360 44818,1181 44819,1323 44820,102 44821,1326 44822,408 44823,79 44824,920 44827,510 44829,779 44831,340 44834,9121 44835,996 44836,328 44838,83 44838,694 44839,718 44839,760 44839,1631 44840,647 44841,344 44842,120 44844,44845 44846,1118 44847,393 44848,1749 44849,704 44850,7360 44851,298 44852,485 44854,557 44855,779 44856,44857 44858,1179 44860,931 44861,151 44862,929 44863,760 44864,38634 44865,273 44865,274 44865,313 44865,66754 44866,44867 44868,2923 44869,240 44870,1955 44871,1140 44871,2443 44873,718 44874,298 44875,485 44877,1 44877,147 44877,206 44877,1815 44877,2244 44877,80266 44877,89035 44878,996 44879,403 44879,1805 44880,1179 44881,649 44883,1181 44883,1204 44884,298 44885,485 44886,222 44886,536 44886,596 44887,690 44887,872 44888,1515 44889,1977 44889,1978 44890,178 44891,861 44892,1893 44893,65 44895,87 44895,392 44895,433 44895,2699 44898,1402 44899,209 44900,3724 44901,72 44902,344 44903,285 44904,240 44905,34 44905,991 44906,83 44907,5440 44908,200 44909,644 44910,2744 44910,3247 44911,298 44912,485 44913,1411 44913,3804 44914,346 44915,222 44915,605 44916,209 44917,1033 44918,1454 44919,726 44919,859 44920,23783 44921,760 44921,1085 44921,3585 44922,336 44922,459 44923,602 44924,309 44924,310 44925,209 44926,852 44928,2744 44928,3247 44929,302 44929,579 44929,861 44929,1010 44929,1849 44929,6303 44930,298 44931,485 44933,868 44934,422 44936,209 44937,937 44937,1117 44937,2191 44938,44939 44938,69414 44940,167 44940,1544 44941,893 44942,4276 44943,3069 44944,264 44944,491 44944,515 44945,435 44946,1983 44947,200 44948,302 44948,1659 44949,211 44949,217 44949,309 44949,310 44949,609 44949,623 44949,818 44949,1019 44949,1118 44949,1210 44949,1796 44950,406 44951,417 44951,1085 44951,1955 44951,3623 44952,861 44953,140 44953,467 44953,515 44954,920 44955,271 44956,10 44957,3949 44958,392 44959,417 44960,304 44961,151 44962,63 44962,137 44962,326 44962,422 44962,736 44962,752 44962,1011 44962,1140 44962,1220 44962,1222 44962,1881 44962,2411 44962,30331 44963,920 44964,5405 44965,1227 44965,1229 44965,2105 44965,4220 44965,4611 44966,479 44967,9457 44968,298 44969,485 44972,35 44972,167 44972,536 44972,2671 44972,23287 44972,102560 44972,127158 44972,207045 44973,222 44973,4637 44973,19443 44974,298 44975,485 44976,9121 44977,712 44978,1893 44978,2312 44979,500 44980,160 44981,702 44983,1531 44984,346 44985,346 44986,346 44987,298 44988,485 44989,1119 44990,346 44990,1294 44991,1188 44992,79 44993,4 44993,5 44994,1623 44994,17590 44995,3451 44995,3452 44996,17593 44997,3209 44998,65 44999,743 45000,390 45001,893 45001,2750 45002,252 45002,318 45003,996 45004,693 45005,932 45006,346 45007,657 45008,346 45009,657 45010,104 45011,346 45012,389 45013,1803 45014,1140 45014,5547 45015,2506 45016,934 45017,7360 45018,1070 45019,893 45020,30766 45020,45021 45020,45022 45020,45023 45020,45024 45025,581 45026,22 45026,602 45026,652 45026,1070 45026,1860 45026,1893 45027,5469 45029,34 45029,35 45029,536 45029,4672 45030,215 45030,417 45031,406 45032,1715 45032,3804 45033,850 45033,1400 45034,83 45035,1803 45036,45037 45039,45040 45041,1805 45042,346 45043,45044 45046,171 45047,292 45048,647 45049,344 45050,347 45050,697 45050,6955 45051,1559 45052,192 45052,586 45053,602 45054,151 45055,298 45056,485 45057,1285 45058,10 45059,980 45060,104 45062,298 45063,485 45065,849 45065,911 45066,1085 45066,15100 45066,16228 45066,18726 45066,18727 45066,19276 45066,20315 45066,29619 45066,32058 45066,32832 45066,33702 45066,34271 45066,35745 45066,36014 45066,41578 45066,41772 45066,42725 45066,45495 45066,45501 45066,45748 45066,47365 45066,47401 45066,47700 45066,47955 45066,47965 45066,47968 45066,47970 45066,48466 45066,52154 45066,52292 45066,52296 45066,52298 45066,52303 45066,52306 45066,52307 45066,52308 45066,52309 45066,52311 45066,52312 45066,52314 45066,52317 45066,52319 45066,52320 45066,52519 45066,53863 45066,54511 45066,54514 45066,54528 45066,55348 45066,55363 45066,57654 45066,57894 45066,57895 45066,58614 45066,58619 45066,59210 45066,60050 45066,60084 45066,60523 45066,63462 45066,63481 45066,63662 45066,64197 45066,65426 45066,65430 45066,65472 45066,66749 45066,66767 45066,66818 45066,66838 45066,66847 45066,66870 45066,66910 45066,67052 45066,68660 45066,68908 45066,71901 45066,72821 45066,73008 45066,73480 45066,73517 45066,77720 45066,78897 45066,78980 45066,79528 45066,82525 45066,84383 45066,87725 45066,88507 45066,88599 45066,95604 45066,97651 45066,101798 45066,104425 45066,107646 45066,111687 45066,114184 45066,114657 45066,114660 45066,114708 45066,114709 45066,117188 45066,117313 45066,117315 45066,117888 45066,118531 45066,118535 45066,118538 45066,118551 45066,118553 45066,118561 45066,118564 45066,118566 45066,118573 45066,118576 45066,118577 45066,118580 45066,118592 45066,118646 45066,119065 45066,119066 45066,119078 45066,119084 45066,119085 45066,119086 45066,119087 45066,119089 45066,119234 45066,119607 45066,119803 45066,120107 45066,120113 45066,120695 45066,121239 45066,121641 45066,122178 45066,122768 45066,123407 45066,125606 45066,126168 45066,127886 45066,129825 45066,130028 45066,130551 45066,131856 45066,158773 45066,159476 45066,160271 45066,160276 45066,160855 45066,161720 45066,161723 45066,162776 45066,163154 45066,163703 45066,164376 45066,164520 45066,165085 45066,166272 45066,166932 45066,168791 45066,169597 45066,169599 45066,170694 45066,171872 45066,172248 45066,173299 45066,173333 45066,177059 45066,178559 45066,184356 45066,184860 45066,186669 45066,186709 45066,188054 45066,191323 45066,192054 45066,216259 45066,216805 45066,234001 45066,244195 45066,245614 45066,254005 45066,259471 45066,259472 45066,260952 45067,2590 45072,664 45072,20359 45075,563 45077,1227 45077,1229 45077,86416 45079,120 45080,301 45080,2557 45082,304 45084,1282 45085,45086 45087,516 45088,1177 45093,346 45094,83 45095,579 45096,660 45097,1402 45098,302 45099,346 45100,850 45101,435 45101,439 45101,622 45101,1531 45103,2045 45104,346 45105,2506 45106,2506 45107,45108 45109,326 45109,873 45110,79 45111,298 45112,485 45113,875 45115,298 45116,485 45117,151 45118,298 45119,485 45120,45121 45122,215 45124,360 45125,273 45126,390 45127,1285 45127,3328 45128,589 45129,1118 45131,3467 45132,1531 45133,1072 45134,58 45134,801 45134,1140 45135,2083 45136,605 45136,1119 45136,1167 45136,2995 45136,103860 45137,1014 45138,45139 45140,4 45140,5 45140,292 45140,441 45140,446 45140,693 45140,5627 45140,6621 45141,1363 45142,875 45145,215 45146,483 45147,8994 45148,215 45149,211 45149,2421 45150,376 45152,240 45152,588 45152,590 45152,592 45152,818 45153,171 45154,3695 45155,79 45156,182 45156,841 45156,1515 45156,45594 45157,298 45158,485 45159,93 45159,94 45160,45161 45162,298 45163,485 45164,1181 45165,298 45166,485 45167,77 45167,1544 45167,1749 45169,360 45170,23701 45171,3507 45172,211 45173,247 45174,872 45175,248 45176,273 45176,274 45177,2105 45178,4604 45179,1204 45180,1551 45181,97 45182,298 45183,485 45184,388 45184,435 45184,48505 45185,14989 45186,298 45187,485 45188,389 45189,264 45190,104 45191,298 45192,485 45193,298 45194,485 45195,22 45195,37 45195,567 45195,968 45195,1210 45195,1284 45196,1181 45197,34 45197,35 45197,222 45198,34 45198,35 45198,250 45198,1684 45199,1983 45200,346 45201,740 45201,741 45202,2979 45203,491 45203,852 45203,1449 45204,304 45205,45206 45207,5366 45208,298 45209,485 45210,697 45211,1359 45212,649 45213,577 45214,298 45215,485 45216,298 45217,485 45218,1858 45219,1860 45220,640 45220,4192 45220,4193 45221,779 45222,233 45222,240 45222,592 45222,631 45222,714 45222,760 45222,1785 45222,1818 45222,2416 45222,2417 45222,5718 45223,626 45224,1871 45225,21826 45226,1858 45227,1860 45228,118 45228,4597 45229,217 45229,1417 45230,7416 45231,167 45231,240 45231,347 45231,372 45231,605 45231,615 45231,720 45231,907 45231,968 45231,1001 45231,1085 45231,1122 45231,1133 45231,1160 45231,1167 45231,1231 45231,1284 45231,1298 45231,1436 45231,1522 45231,1564 45231,1785 45231,1837 45231,2620 45231,3193 45231,3194 45231,3207 45231,3218 45231,3422 45231,5662 45231,5718 45232,640 45233,298 45234,485 45235,3585 45236,10 45237,346 45238,602 45239,1298 45240,557 45241,557 45242,2782 45243,271 45244,1882 45245,72 45246,349 45247,87 45248,264 45249,417 45250,298 45251,485 45252,45253 45255,602 45257,3161 45258,949 45259,4810 45260,163 45260,6303 45262,3161 45263,298 45264,485 45265,298 45266,485 45267,536 45268,1085 45269,2506 45270,1133 45271,2775 45272,447 45273,1243 45274,1381 45275,920 45276,45277 45278,1955 45278,2775 45279,99 45280,298 45281,485 45282,45283 45284,298 45285,485 45286,298 45287,485 45288,1634 45289,1 45289,868 45289,1619 45289,7956 45290,1 45291,652 45291,1429 45292,44 45293,1414 45294,310 45294,6556 45295,206 45296,104 45297,3161 45298,310 45299,119 45300,195 45301,30 45301,264 45301,640 45301,1980 45301,4823 45302,805 45303,160 45304,596 45304,749 45304,1368 45305,45306 45307,818 45308,640 45309,45310 45311,1001 45312,2178 45312,4545 45313,99 45314,158 45315,2334 45316,81 45317,503 45318,247 45319,1 45319,195 45319,306 45319,307 45319,330 45319,994 45319,1247 45319,3161 45320,267 45321,83 45322,72 45323,493 45323,586 45323,1243 45323,1265 45323,1266 45325,563 45326,81 45327,217 45327,247 45327,372 45327,467 45327,1181 45328,14650 45329,8270 45330,1556 45331,1983 45333,366 45334,366 45335,366 45336,366 45337,366 45338,366 45339,366 45340,366 45341,192 45342,366 45343,366 45344,366 45345,366 45346,187 45347,366 45348,366 45349,366 45350,2995 45351,20 45352,2574 45353,175 45354,2626 45355,704 45356,704 45358,206 45359,9560 45360,45361 45360,47607 45362,233 45363,346 45364,1419 45365,3182 45366,195 45367,19227 45368,515 45369,4611 45370,1544 45371,298 45372,485 45374,330 45375,2351 45376,2351 45377,8788 45378,240 45379,298 45380,485 45381,1118 45382,1 45383,147 45384,298 45385,485 45386,312 45387,2607 45388,298 45389,485 45390,626 45390,920 45391,58 45392,46 45393,45394 45395,1238 45396,298 45397,485 45398,77 45398,788 45398,1631 45399,50 45399,602 45399,3218 45399,4866 45400,1452 45402,346 45403,338 45403,835 45403,1968 45404,1844 45405,330 45406,346 45407,372 45407,1082 45408,330 45410,163 45410,489 45411,306 45411,307 45412,577 45412,1105 45413,811 45414,45415 45417,45418 45419,602 45419,3218 45419,4866 45420,298 45421,485 45422,206 45422,1631 45423,972 45424,1509 45427,206 45427,217 45427,240 45427,457 45427,467 45427,534 45427,868 45427,1085 45427,1803 45427,75912 45427,152855 45428,151 45430,640 45431,640 45432,640 45433,611 45433,1718 45434,3 45435,290 45435,2206 45435,2995 45435,8788 45436,24763 45436,45437 45438,182 45438,3507 45439,422 45440,3260 45441,422 45442,422 45443,422 45444,422 45445,422 45446,422 45447,422 45448,1298 45448,1616 45449,422 45450,422 45451,158 45452,1968 45453,440 45454,146 45454,167 45454,726 45455,1010 45456,1644 45457,298 45458,485 45459,346 45460,1590 45460,1644 45462,2944 45463,1858 45464,1860 45465,298 45466,485 45467,261 45468,72 45469,2574 45470,346 45471,255 45472,1001 45473,309 45473,310 45474,119 45474,577 45474,1400 45475,875 45476,704 45477,106 45479,602 45480,301 45480,872 45480,968 45480,2557 45481,182 45481,2173 45482,515 45483,50 45484,1732 45485,273 45485,805 45485,1980 45485,8991 45486,349 45487,1718 45488,72 45490,58 45491,46 45492,2353 45493,652 45494,206 45495,1515 45496,3207 45497,346 45499,72 45500,2424 45502,217 45503,483 45504,298 45505,485 45506,3555 45507,264 45508,1707 45509,336 45510,167 45511,389 45511,2646 45512,626 45513,1 45514,500 45515,843 45516,1016 45517,2775 45518,447 45519,3345 45520,859 45521,1707 45522,79 45523,1653 45523,2436 45525,2995 45526,1782 45528,1274 45529,79 45530,420 45532,1818 45533,1707 45534,575 45534,5540 45535,1332 45535,1572 45536,209 45537,34 45537,35 45538,32 45538,349 45538,392 45538,509 45538,510 45538,644 45538,697 45538,809 45538,3003 45538,76096 45539,1188 45540,86 45541,97 45542,1285 45542,6263 45544,305 45544,859 45544,1147 45545,717 45546,200 45547,849 45548,577 45549,287 45550,225 45550,557 45550,5405 45551,255 45552,1151 45552,1454 45553,500 45554,1962 45555,1052 45556,1882 45557,2775 45558,54 45559,2210 45559,4237 45560,417 45560,1580 45561,1151 45561,1454 45562,298 45563,485 45564,435 45565,149 45566,34 45566,35 45567,298 45568,485 45569,389 45570,1243 45571,1429 45572,26 45572,59 45573,149 45575,209 45576,1749 45577,7 45577,211 45577,4078 45577,7124 45578,1319 45579,209 45580,209 45581,644 45582,20 45583,86 45584,217 45584,949 45586,209 45587,209 45588,518 45589,481 45590,891 45590,949 45590,1363 45590,2191 45590,148742 45591,907 45592,209 45593,72 45595,160 45595,3003 45596,26 45596,59 45597,211 45598,5440 45600,1227 45600,1229 45601,301 45601,615 45601,968 45602,225 45603,1858 45604,1860 45605,217 45606,577 45607,149 45608,217 45608,19443 45609,500 45611,1977 45611,1978 45612,160 45613,5718 45614,99 45615,209 45616,1749 45617,2995 45618,97 45619,209 45620,306 45620,307 45621,872 45621,6695 45622,1858 45623,1319 45624,209 45625,209 45627,611 45628,72 45629,872 45630,1070 45630,4455 45631,106 45632,415 45632,13361 45633,346 45634,158 45635,1983 45636,707 45637,301 45638,360 45639,217 45639,1417 45640,6726 45641,45642 45643,328 45643,1305 45644,45642 45645,1927 45646,640 45647,283 45647,2775 45649,202 45649,203 45650,305 45652,4611 45653,1544 45654,2828 45655,360 45656,192 45657,3413 45659,20771 45660,147 45660,1235 45660,1335 45660,21944 45661,2210 45661,4237 45662,1429 45663,251 45663,1512 45663,5992 45664,77 45665,4504 45666,34 45666,35 45666,2266 45666,127158 45666,188791 45666,212914 45667,809 45668,294 45668,567 45668,3345 45669,718 45670,1564 45671,178 45671,2671 45671,6298 45672,1663 45673,1085 45674,818 45675,1370 45676,932 45677,1707 45678,1181 45679,338 45679,14556 45680,622 45681,344 45682,6303 45684,682 45685,287 45685,1149 45686,14434 45687,417 45688,872 45689,298 45690,485 45691,1659 45692,2668 45694,1564 45695,509 45696,628 45697,346 45698,287 45698,697 45698,1653 45699,919 45700,13661 45701,994 45703,346 45704,1058 45704,1113 45704,1623 45705,287 45706,346 45707,83 45707,620 45708,50 45708,71 45708,473 45708,2750 45709,209 45710,702 45710,873 45710,874 45710,1001 45710,1801 45711,1007 45711,1289 45711,3999 45713,1837 45714,332 45714,862 45715,3367 45716,337 45716,509 45717,483 45717,1432 45717,1803 45718,1179 45719,1033 45720,1243 45721,1068 45721,1474 45721,1789 45722,4355 45723,1068 45725,577 45726,247 45727,442 45728,45729 45728,79092 45728,205452 45730,626 45732,45733 45734,444 45735,26 45735,59 45736,26 45736,59 45738,1858 45739,1860 45740,6955 45741,1363 45742,10 45743,972 45744,107 45744,372 45744,1309 45744,14231 45745,68 45746,258 45747,209 45748,79 45748,309 45748,310 45748,467 45748,1191 45748,1192 45750,301 45750,861 45750,893 45750,1231 45750,2979 45750,3422 45752,1016 45752,2379 45753,980 45754,222 45754,590 45754,1419 45754,2292 45755,151 45756,424 45757,1370 45760,240 45761,272 45762,1 45763,134 45763,135 45763,137 45763,138 45763,2105 45764,346 45765,83 45766,41 45767,45768 45769,1388 45770,72 45771,3 45772,195 45773,264 45774,86 45775,4771 45776,968 45776,1564 45777,217 45778,563 45778,920 45779,1417 45780,4192 45780,4193 45781,87 45781,17384 45782,5405 45783,795 45784,1474 45785,58 45785,1140 45786,1465 45787,1007 45787,1289 45787,3999 45788,45789 45790,209 45792,6303 45793,45794 45795,93 45795,94 45796,45797 45798,1858 45799,1860 45800,184 45801,247 45802,875 45803,634 45804,86 45805,298 45806,485 45807,376 45808,56 45809,623 45810,34 45810,35 45810,217 45811,392 45812,818 45813,209 45814,171 45815,949 45816,671 45817,10 45818,605 45819,620 45820,1881 45821,647 45822,344 45823,518 45823,3089 45825,604 45826,2073 45826,2626 45827,1001 45828,1564 45829,298 45830,485 45832,5101 45833,83 45834,1 45835,45836 45837,273 45837,274 45839,775 45840,640 45841,4192 45841,4193 45842,640 45843,58 45844,46 45845,1227 45845,1229 45846,192 45847,640 45848,435 45849,1556 45850,640 45851,557 45852,557 45853,10 45853,720 45853,877 45853,907 45853,972 45853,1010 45853,1117 45853,1122 45853,1167 45853,1284 45853,1544 45853,1623 45853,1849 45853,1973 45853,2191 45853,3218 45853,5662 45854,1877 45855,760 45856,862 45857,5718 45858,1274 45859,5213 45860,3447 45861,45862 45863,2286 45864,72 45865,186 45865,1326 45865,1411 45865,3804 45867,1298 45868,640 45869,21487 45870,631 45870,760 45870,805 45870,1462 45870,8537 45871,146 45871,1247 45871,1368 45872,2367 45873,250 45873,1684 45874,217 45874,1019 45875,298 45876,485 45877,5101 45878,338 45878,356 45878,525 45878,852 45878,920 45879,483 45880,4060 45881,86 45882,217 45882,222 45883,3830 45884,45885 45886,41 45886,206 45886,301 45886,592 45886,694 45886,1465 45886,1608 45886,1801 45886,2775 45886,9030 45887,779 45888,874 45889,104 45889,134 45889,135 45889,850 45890,1033 45892,2436 45893,298 45894,485 45895,7416 45896,1458 45897,1133 45899,515 45900,389 45901,160 45902,3804 45903,68 45904,106 45904,333 45904,586 45904,59021 45904,60576 45905,102 45907,3447 45908,104 45909,298 45910,485 45911,704 45912,390 45912,589 45912,1544 45913,151 45915,44 45916,273 45916,274 45917,389 45918,298 45919,485 45920,420 45921,1379 45922,1326 45923,640 45924,45925 45924,49727 45926,45927 45928,366 45929,10 45929,113156 45930,151 45931,6726 45932,417 45933,1370 45934,417 45935,862 45935,2590 45936,41 45937,704 45939,225 45940,631 45941,1893 45942,16207 45943,346 45944,602 45945,4192 45945,4193 45946,1033 45947,346 45948,1556 45949,7 45950,215 45951,207 45952,45953 45955,704 45956,2146 45957,207 45958,9560 45959,45960 45961,3804 45962,671 45963,45964 45965,1767 45966,2735 45967,704 45968,186 45968,775 45969,186 45970,45971 45972,2574 45973,45974 45976,45977 45978,1796 45979,261 45981,424 45982,83 45982,1707 45983,259 45983,272 45983,1070 45985,818 45985,861 45987,45988 45991,872 45993,1 45993,83 45993,273 45993,298 45993,626 45993,859 45993,1058 45993,1415 45993,1571 45993,4039 45993,4355 45994,86 45995,808 45995,1465 45997,233 45998,515 46000,489 46001,68 46001,269 46001,483 46001,710 46001,784 46001,1241 46001,1345 46001,1572 46001,2083 46001,3069 46001,5874 46002,298 46003,485 46004,50 46005,298 46006,485 46007,255 46008,46009 46008,47112 46008,61608 46008,71632 46008,80510 46008,89282 46008,91002 46008,104494 46008,124252 46008,124357 46008,127606 46008,128617 46008,129859 46008,130667 46008,132256 46008,134503 46010,209 46011,1551 46013,48 46014,46015 46016,46017 46018,3451 46018,3452 46019,19 46020,366 46021,366 46022,366 46023,240 46024,366 46025,366 46026,366 46027,186 46028,1151 46028,2436 46028,5547 46029,366 46030,467 46030,1556 46031,366 46033,366 46034,202 46034,203 46035,1143 46036,366 46037,366 46038,366 46039,366 46040,366 46041,366 46042,1858 46043,1860 46044,46045 46044,62881 46047,500 46048,46049 46050,366 46051,907 46051,932 46053,941 46054,1046 46055,306 46055,307 46056,2784 46057,46058 46059,720 46060,298 46061,485 46062,30 46062,328 46064,3 46065,298 46066,485 46067,1983 46068,298 46069,485 46070,333 46071,298 46072,485 46073,1858 46074,1860 46075,968 46076,579 46077,1191 46078,292 46079,503 46080,192 46080,247 46080,406 46080,467 46080,599 46080,56150 46081,346 46083,1181 46084,26 46084,59 46085,264 46086,2553 46087,56 46088,577 46089,349 46089,697 46090,1782 46092,356 46093,859 46094,592 46095,46096 46097,46096 46098,46096 46099,46096 46100,46096 46101,46096 46102,46096 46103,46096 46104,46096 46105,46096 46106,46096 46107,46096 46108,46096 46109,46096 46110,46096 46111,46096 46112,46096 46113,46096 46114,46096 46115,46096 46116,46096 46117,422 46118,422 46119,422 46120,422 46121,422 46122,422 46123,422 46124,422 46125,422 46126,422 46127,273 46127,274 46128,1001 46128,3804 46129,3258 46129,28107 46130,46131 46132,1888 46133,3769 46134,1220 46134,1222 46135,79 46135,147 46135,149 46135,406 46136,248 46136,1332 46137,577 46137,1070 46138,298 46139,485 46140,932 46141,349 46141,1836 46142,22 46143,1453 46144,60576 46145,10 46145,1572 46146,5405 46151,2353 46152,225 46152,248 46153,151 46155,2083 46156,192 46157,4060 46159,137 46160,302 46161,3653 46162,298 46163,485 46164,6750 46165,68 46165,83 46165,356 46165,390 46165,392 46165,455 46165,536 46165,703 46165,752 46165,1043 46165,1274 46165,1284 46165,1849 46165,1860 46165,2421 46165,2590 46165,2779 46165,3367 46165,5301 46165,5591 46165,6068 46165,7194 46165,32784 46166,4771 46167,1732 46168,1072 46169,252 46169,1220 46169,1222 46170,301 46170,861 46170,893 46170,2979 46172,65 46172,957 46172,1815 46173,1749 46174,2931 46175,861 46177,720 46178,186 46178,2209 46178,3804 46179,557 46180,192 46182,668 46182,1803 46183,202 46183,203 46184,171 46185,516 46186,65 46187,832 46188,298 46189,485 46190,186 46191,577 46192,4611 46193,83 46194,1556 46195,272 46196,422 46197,50 46197,206 46197,340 46198,158 46199,1309 46200,877 46201,2506 46202,1385 46203,2073 46204,1265 46204,1266 46205,2929 46205,23701 46206,1659 46207,1590 46208,186 46209,392 46209,509 46211,302 46212,273 46212,274 46213,298 46214,485 46215,2506 46216,1400 46216,4805 46217,723 46218,298 46219,485 46220,46221 46222,46223 46224,206 46225,644 46226,1052 46226,1579 46228,175 46229,2775 46230,447 46231,2867 46231,22880 46232,175 46233,222 46234,1466 46235,315 46236,1298 46237,623 46237,1805 46239,66 46240,571 46240,1893 46240,5547 46241,2784 46242,392 46244,195 46246,72 46247,46248 46247,104917 46247,108179 46249,3804 46250,907 46250,1284 46251,687 46252,1531 46253,3260 46254,15573 46255,596 46255,1368 46256,657 46257,1707 46258,6837 46259,344 46260,1001 46261,1332 46261,5405 46262,107 46262,296 46263,298 46264,485 46267,736 46269,195 46270,516 46271,79 46271,264 46271,392 46271,433 46271,525 46271,818 46271,832 46271,934 46271,1058 46271,1210 46271,1955 46271,2557 46271,5250 46271,8276 46271,127158 46271,207837 46272,622 46273,5310 46274,1571 46275,1977 46275,1978 46276,431 46276,784 46276,943 46277,392 46278,1571 46279,5405 46280,143 46281,602 46282,1688 46283,720 46286,663 46286,664 46287,1454 46288,130 46288,3999 46289,72 46290,3161 46292,195 46293,240 46293,818 46294,389 46294,3260 46295,2607 46295,4101 46296,86 46297,2828 46298,149 46299,1224 46299,3177 46300,932 46301,2923 46301,4190 46303,3582 46304,1058 46305,46306 46307,577 46308,1858 46309,1203 46310,1860 46311,247 46312,130 46313,298 46314,485 46315,195 46316,240 46316,372 46316,1955 46317,1639 46318,1983 46319,841 46320,1400 46321,120 46321,217 46321,222 46321,349 46321,392 46321,433 46321,467 46321,868 46321,1118 46321,1411 46321,2989 46321,2991 46321,3367 46321,3804 46321,141912 46321,162599 46322,83 46323,301 46323,877 46323,907 46323,972 46323,1117 46323,1284 46323,1522 46323,54362 46324,261 46325,663 46325,1370 46326,439 46326,1559 46327,636 46328,7360 46329,2989 46329,2991 46329,27041 46330,72 46331,149 46331,424 46331,1058 46332,859 46333,338 46334,158 46334,406 46335,818 46336,333 46337,146 46338,972 46338,1572 46339,1572 46339,1688 46340,852 46340,1238 46340,1572 46340,1722 46340,3538 46341,1210 46342,140 46344,3182 46345,1392 46346,1983 46347,3321 46348,485 46349,222 46350,440 46351,3069 46352,1639 46353,1893 46354,1659 46354,6695 46355,392 46356,273 46356,274 46357,2178 46357,4545 46358,731 46359,356 46359,852 46360,149 46361,852 46362,1287 46363,9029 46364,602 46365,289 46365,290 46365,417 46366,346 46367,2105 46368,392 46368,1240 46368,1465 46369,58 46370,11 46370,15 46370,83 46370,178 46370,505 46370,644 46370,663 46370,664 46370,707 46370,712 46370,713 46370,809 46370,1087 46370,1089 46370,1191 46370,1623 46370,2605 46370,3258 46370,3967 46370,3999 46371,298 46372,485 46373,991 46374,26 46374,59 46375,1955 46376,1235 46376,1335 46377,30 46378,4252 46380,872 46380,6695 46381,83 46382,4611 46383,1544 46384,83 46385,1085 46386,1058 46387,68 46388,920 46389,72 46390,731 46393,298 46394,485 46395,1033 46396,590 46396,20813 46397,211 46397,664 46399,2506 46400,872 46400,1659 46401,2424 46402,1235 46402,1335 46403,46404 46405,6303 46406,48 46406,130 46406,649 46406,1007 46406,1132 46406,1147 46406,1381 46406,1452 46406,1639 46408,788 46410,151 46411,818 46412,1052 46413,264 46414,298 46415,485 46417,1 46417,1127 46418,657 46419,364 46420,843 46421,46422 46421,86966 46423,920 46425,1436 46426,247 46427,79 46427,994 46428,298 46429,312 46430,483 46431,1019 46431,1635 46432,85 46433,2646 46434,399 46435,2779 46436,46437 46438,302 46438,579 46438,687 46438,811 46438,861 46438,1659 46438,2116 46438,4453 46439,875 46440,252 46440,344 46440,647 46440,919 46441,3 46442,46443 46444,788 46445,72 46446,65 46447,1858 46448,1860 46449,1274 46450,1381 46451,671 46452,83 46453,81 46454,1122 46455,46456 46457,360 46458,71 46459,647 46459,1146 46460,1414 46461,46462 46463,346 46464,704 46465,195 46465,217 46465,222 46465,302 46465,1033 46465,2668 46465,5375 46466,718 46467,376 46468,247 46469,1479 46470,302 46471,72 46472,479 46473,718 46474,2557 46476,93 46476,94 46478,34 46478,35 46479,360 46480,875 46481,83 46482,1881 46483,4611 46484,72 46484,292 46484,312 46484,1052 46484,3538 46484,3695 46485,83 46486,192 46486,256 46486,862 46487,310 46488,1414 46489,8308 46490,1265 46490,1266 46491,393 46491,1033 46492,704 46493,10 46494,875 46495,500 46496,217 46497,972 46498,200 46499,240 46500,302 46501,949 46502,225 46503,920 46504,72 46505,1608 46505,4903 46506,72 46507,1151 46508,4810 46509,77 46510,46511 46512,704 46513,272 46514,1707 46515,22 46515,1210 46516,6789 46517,2506 46518,187 46519,58 46520,1033 46521,795 46522,298 46523,485 46524,557 46525,557 46526,9121 46528,563 46529,269 46530,46531 46532,704 46533,298 46534,485 46535,1556 46536,872 46537,704 46538,389 46539,592 46540,2266 46541,455 46541,7092 46542,304 46543,32 46544,2506 46545,1572 46546,346 46547,46548 46549,861 46550,206 46551,44 46553,72 46554,344 46555,285 46556,292 46557,557 46558,1309 46558,1955 46558,3129 46559,485 46560,779 46561,1043 46562,46563 46562,52144 46564,1881 46565,158 46566,1140 46567,254 46567,557 46568,1353 46569,376 46570,1224 46571,885 46572,704 46573,4594 46574,1564 46574,1785 46574,2620 46574,5718 46575,30 46576,46577 46578,9025 46580,760 46581,5343 46582,2319 46583,83 46584,301 46584,968 46586,41941 46587,563 46588,2045 46589,46590 46592,704 46593,72 46594,1133 46595,72 46596,46597 46599,264 46599,736 46600,99 46601,704 46602,592 46604,46605 46606,312 46606,1052 46608,301 46609,147 46609,779 46609,141912 46610,571 46610,1893 46610,5343 46610,5547 46611,631 46612,1085 46613,79 46614,240 46615,356 46615,516 46615,1220 46615,1222 46616,46617 46618,536 46619,46620 46621,46622 46623,298 46624,485 46625,28072 46626,46627 46628,233 46629,620 46630,50 46632,46633 46634,4344 46634,8373 46635,827 46636,30 46637,97 46638,698 46638,762 46638,1740 46638,1782 46638,13991 46638,77637 46638,85842 46638,161560 46638,175946 46638,178743 46638,191902 46639,872 46640,1359 46640,15179 46642,2506 46643,312 46644,602 46645,3451 46645,3452 46646,46647 46648,808 46649,366 46650,9323 46651,366 46652,366 46653,366 46654,366 46655,366 46656,366 46657,366 46658,366 46659,697 46659,2045 46660,366 46661,72 46662,366 46663,366 46664,366 46665,1140 46665,5547 46666,366 46667,301 46667,968 46668,1203 46669,631 46669,1363 46669,2372 46669,2671 46670,366 46672,366 46673,697 46674,366 46675,366 46676,1127 46677,309 46677,310 46678,366 46679,366 46680,17384 46681,422 46682,56 46683,1332 46684,392 46684,697 46685,72 46686,697 46686,96130 46687,1368 46689,306 46689,307 46691,3193 46692,3193 46694,779 46696,1509 46697,3193 46698,760 46698,1149 46698,1631 46699,1010 46699,1122 46699,1849 46700,68 46700,387 46701,3193 46702,788 46703,147 46704,1912 46705,1968 46706,1815 46706,35687 46707,8270 46708,2995 46709,46710 46711,46712 46713,46714 46715,422 46716,56 46717,589 46717,1294 46717,1326 46717,3804 46718,3193 46719,130 46720,1010 46721,1231 46722,775 46723,46724 46725,392 46725,644 46726,666 46726,15179 46727,868 46728,1133 46729,1968 46730,422 46731,422 46732,422 46733,422 46734,4411 46735,422 46736,1511 46736,3069 46737,406 46738,1639 46739,2989 46739,2991 46740,217 46741,2607 46742,1284 46743,2292 46744,50 46745,1392 46746,171 46747,34 46747,35 46747,83 46747,493 46747,1608 46748,217 46748,222 46748,536 46748,1417 46749,1177 46750,104 46751,264 46752,422 46753,56 46754,77 46754,160 46754,299 46754,388 46754,483 46754,620 46754,1749 46754,2421 46754,4903 46756,422 46757,422 46758,422 46759,422 46760,422 46762,1323 46763,102 46764,1326 46765,408 46767,46768 46769,1151 46769,1711 46769,1836 46770,302 46771,717 46772,422 46773,56 46774,581 46775,516 46775,1014 46776,225 46776,431 46777,527 46778,417 46779,104 46780,422 46781,56 46782,209 46784,422 46785,56 46786,15573 46787,907 46788,1983 46790,389 46791,72 46792,968 46792,1293 46793,344 46794,647 46795,344 46796,518 46796,1326 46797,209 46798,330 46799,120 46800,83 46800,385 46800,605 46800,749 46800,2224 46800,5034 46800,5591 46801,2506 46802,2506 46804,301 46804,1231 46804,1293 46804,5662 46805,2116 46805,2372 46806,1212 46807,852 46807,1326 46808,2626 46808,8907 46809,455 46810,5405 46811,1893 46811,5547 46812,19010 46813,264 46813,1659 46814,919 46815,422 46816,1983 46817,56 46818,26 46818,59 46819,83 46820,301 46820,1231 46821,240 46821,1955 46822,481 46823,4190 46825,1284 46825,1688 46826,483 46827,392 46828,264 46828,1893 46829,130 46829,264 46829,1749 46830,202 46831,481 46832,483 46832,1400 46832,3524 46832,3695 46833,1033 46835,736 46836,26 46836,59 46836,83 46836,250 46836,344 46836,500 46836,1684 46836,3967 46837,718 46838,178 46838,1033 46839,167 46839,467 46839,1796 46840,920 46841,596 46842,891 46844,779 46844,1033 46845,1151 46845,1454 46846,1276 46847,602 46848,285 46848,779 46849,481 46849,604 46850,718 46851,1849 46853,30 46854,46855 46854,132719 46856,104 46856,557 46856,953 46856,954 46856,5405 46857,22 46858,5662 46859,1877 46860,304 46861,663 46861,664 46862,332 46862,1515 46864,644 46865,422 46866,87 46866,1769 46866,1836 46867,106 46867,1370 46867,6119 46868,37 46869,1285 46870,251 46871,20 46871,86 46871,675 46872,1983 46873,1235 46873,1335 46874,104 46874,138 46874,289 46874,290 46874,372 46874,503 46874,557 46874,586 46874,631 46874,714 46874,805 46874,1016 46874,1119 46874,1149 46874,1955 46874,2105 46874,4220 46874,4571 46874,6556 46874,44725 46874,94134 46874,136072 46874,172012 46874,176782 46875,393 46875,439 46876,1858 46877,1860 46878,222 46879,602 46879,634 46880,634 46881,37 46881,698 46881,1782 46882,611 46883,932 46883,1016 46883,2205 46883,2206 46884,264 46885,717 46885,1058 46885,2646 46886,455 46887,1858 46888,1860 46889,652 46890,195 46891,818 46892,1033 46892,19010 46893,79 46894,818 46895,358 46896,875 46897,1220 46897,1222 46898,252 46899,775 46900,251 46901,500 46902,1962 46903,1052 46904,1882 46905,2775 46906,54 46907,2210 46907,4237 46908,240 46909,1274 46910,397 46911,392 46911,644 46911,1151 46912,1977 46912,1978 46913,720 46914,714 46914,2205 46914,2206 46915,485 46915,2310 46916,1707 46917,6119 46918,120 46919,1220 46919,1222 46920,252 46921,251 46923,1983 46924,720 46924,775 46924,877 46924,907 46924,973 46924,1001 46924,1117 46924,1284 46924,1522 46924,1715 46924,1732 46924,1837 46924,2083 46924,2191 46924,9024 46925,861 46926,932 46927,1370 46928,9030 46930,1220 46930,1222 46931,252 46932,251 46933,344 46933,1836 46934,302 46934,4453 46935,390 46936,818 46936,1151 46937,697 46938,392 46938,1860 46938,3769 46939,328 46940,1220 46940,1222 46941,252 46942,251 46943,3111 46944,259 46945,217 46945,1289 46945,1381 46946,151 46947,509 46947,1043 46948,3585 46949,248 46950,1559 46950,25573 46951,852 46952,366 46952,527 46952,740 46952,741 46952,743 46953,1276 46954,1227 46954,1229 46954,1252 46954,1253 46954,21944 46954,40566 46955,10 46956,2979 46957,1016 46958,298 46959,485 46960,717 46961,2828 46962,1590 46963,264 46964,717 46965,326 46966,1789 46967,1707 46968,872 46969,1419 46970,467 46970,538 46970,920 46970,1893 46971,1052 46971,1983 46972,206 46973,1803 46974,151 46975,3804 46976,207 46977,298 46978,485 46980,1803 46981,68 46982,1462 46982,8537 46983,46984 46985,258 46986,31976 46987,312 46988,575 46989,439 46991,1007 46992,207 46993,994 46994,4039 46995,663 46995,1010 46995,1298 46995,1616 46995,1749 46995,2191 46996,567 46997,873 46997,874 46998,2506 46999,2668 47000,861 47001,349 47002,852 47003,1858 47004,1860 47005,872 47005,1659 47006,510 47006,2045 47008,510 47009,510 47009,1143 47009,1453 47011,875 47011,1400 47011,1893 47012,779 47014,510 47015,147 47016,47017 47018,1052 47019,1177 47019,47020 47019,51845 47019,85072 47019,212888 47021,875 47022,81233 47024,622 47026,818 47027,83 47028,510 47029,1 47030,801 47030,1140 47030,5547 47032,83 47033,736 47033,1927 47034,264 47034,433 47035,1220 47035,1222 47036,252 47037,251 47038,510 47039,832 47040,292 47040,312 47041,301 47042,1740 47043,264 47043,1749 47043,14550 47044,390 47046,697 47047,3 47047,106 47047,510 47047,875 47047,1848 47048,83 47048,5591 47049,3 47049,510 47051,167 47051,2083 47052,442 47053,779 47054,8270 47055,481 47056,4549 47057,66 47058,954 47058,10318 47059,1220 47059,1222 47060,1796 47061,2867 47061,22880 47062,338 47063,1274 47064,47065 47066,673 47067,63 47068,1707 47069,302 47070,26 47070,59 47072,1046 47073,2979 47074,301 47075,628 47076,264 47077,4355 47078,163 47078,440 47079,302 47079,861 47081,83 47081,577 47081,1871 47081,3115 47082,510 47083,433 47084,1220 47084,1222 47085,252 47086,251 47087,5308 47088,47089 47090,1240 47091,1085 47091,1285 47092,247 47093,38634 47094,34 47094,35 47095,640 47095,3507 47096,47097 47098,420 47098,1572 47098,1653 47098,1722 47098,3538 47099,151 47100,292 47100,745 47100,1238 47100,1677 47100,3830 47100,24500 47101,704 47102,704 47103,941 47104,23011 47105,48 47106,192 47106,217 47106,392 47106,435 47106,1210 47106,1392 47106,1796 47106,1844 47106,4355 47107,861 47108,920 47109,18298 47110,907 47111,861 47113,178 47113,1033 47114,186 47114,518 47114,1326 47114,1849 47114,5130 47115,340 47116,652 47117,1467 47118,450 47119,1119 47120,46 47121,217 47122,483 47123,302 47124,147 47124,158 47124,406 47125,2372 47126,202 47126,203 47127,736 47128,252 47128,314 47128,516 47128,41170 47129,676 47130,861 47131,264 47131,392 47131,577 47131,1559 47131,1860 47131,3182 47131,4760 47131,6303 47132,151 47133,5310 47134,626 47135,302 47136,247 47137,934 47137,1033 47138,58 47139,47140 47141,652 47142,301 47142,435 47142,447 47142,1033 47142,1590 47143,809 47144,636 47145,450 47146,647 47147,344 47149,72 47150,160 47151,47151 47152,497 47152,510 47152,516 47152,1655 47152,2334 47153,1522 47153,2557 47153,73570 47154,1289 47154,1509 47155,376 47156,349 47157,920 47159,861 47159,3260 47160,72 47161,240 47161,372 47161,862 47161,1085 47161,2812 47162,83 47163,366 47164,366 47165,366 47166,366 47167,366 47168,47169 47168,61516 47168,137178 47168,141506 47168,146097 47168,147722 47168,153116 47168,159691 47168,190974 47170,366 47171,47172 47173,298 47173,372 47173,852 47173,1285 47173,1309 47173,1955 47173,2590 47173,2812 47174,47175 47174,49846 47174,75538 47174,75894 47174,76136 47174,77834 47174,84897 47174,105067 47174,154875 47174,155435 47176,652 47177,1454 47178,147 47179,104 47180,500 47181,3 47181,4 47181,5 47181,26 47181,32 47181,34 47181,35 47181,48 47181,50 47181,59 47181,63 47181,68 47181,72 47181,79 47181,81 47181,83 47181,86 47181,97 47181,104 47181,106 47181,107 47181,116 47181,119 47181,134 47181,135 47181,136 47181,137 47181,146 47181,149 47181,158 47181,163 47181,182 47181,187 47181,192 47181,195 47181,200 47181,202 47181,203 47181,207 47181,219 47181,222 47181,225 47181,247 47181,248 47181,256 47181,261 47181,264 47181,273 47181,274 47181,278 47181,287 47181,294 47181,296 47181,299 47181,302 47181,305 47181,306 47181,307 47181,309 47181,310 47181,313 47181,315 47181,326 47181,328 47181,332 47181,333 47181,344 47181,360 47181,366 47181,376 47181,387 47181,392 47181,393 47181,399 47181,403 47181,406 47181,420 47181,422 47181,430 47181,433 47181,435 47181,438 47181,439 47181,447 47181,452 47181,455 47181,489 47181,491 47181,493 47181,497 47181,505 47181,509 47181,516 47181,538 47181,557 47181,596 47181,602 47181,615 47181,622 47181,626 47181,649 47181,652 47181,657 47181,663 47181,664 47181,671 47181,673 47181,682 47181,697 47181,704 47181,714 47181,717 47181,720 47181,736 47181,743 47181,752 47181,758 47181,760 47181,770 47181,772 47181,779 47181,784 47181,801 47181,809 47181,811 47181,827 47181,843 47181,850 47181,862 47181,874 47181,875 47181,893 47181,918 47181,919 47181,920 47181,929 47181,932 47181,973 47181,991 47181,994 47181,1016 47181,1019 47181,1033 47181,1052 47181,1070 47181,1085 47181,1096 47181,1127 47181,1130 47181,1140 47181,1149 47181,1179 47181,1181 47181,1188 47181,1227 47181,1229 47181,1235 47181,1240 47181,1243 47181,1285 47181,1294 47181,1298 47181,1309 47181,1335 47181,1368 47181,1370 47181,1381 47181,1392 47181,1400 47181,1419 47181,1436 47181,1449 47181,1453 47181,1454 47181,1458 47181,1465 47181,1474 47181,1509 47181,1515 47181,1522 47181,1531 47181,1539 47181,1544 47181,1572 47181,1590 47181,1623 47181,1631 47181,1634 47181,1639 47181,1644 47181,1688 47181,1707 47181,1722 47181,1749 47181,1767 47181,1773 47181,1782 47181,1796 47181,1801 47181,1805 47181,1807 47181,1818 47181,1844 47181,1849 47181,1860 47181,1871 47181,1877 47181,1881 47181,1891 47181,1912 47181,1927 47181,1962 47181,1968 47181,1984 47181,2045 47181,2083 47181,2087 47181,2089 47181,2178 47181,2205 47181,2206 47181,2210 47181,2224 47181,2266 47181,2286 47181,2315 47181,2367 47181,2372 47181,2373 47181,2411 47181,2421 47181,2424 47181,2572 47181,2607 47181,2646 47181,2701 47181,2750 47181,2782 47181,2797 47181,2837 47181,2915 47181,2931 47181,2940 47181,2944 47181,2995 47181,3003 47181,3069 47181,3148 47181,3194 47181,3209 47181,3218 47181,3252 47181,3409 47181,3507 47181,3695 47181,4039 47181,4101 47181,4172 47181,4237 47181,4276 47181,4453 47181,4545 47181,4637 47181,4760 47181,4805 47181,4865 47181,4866 47181,4903 47181,5192 47181,5213 47181,5250 47181,5301 47181,5326 47181,5358 47181,5540 47181,5662 47181,5726 47181,5911 47181,6051 47181,6119 47181,6298 47181,6837 47181,6861 47181,7117 47181,7143 47181,7155 47181,7614 47181,7698 47181,8541 47181,9004 47181,9008 47181,13661 47181,14352 47181,15807 47181,21944 47181,27550 47181,31976 47181,37414 47181,47268 47182,640 47183,20771 47184,1572 47185,743 47186,1888 47187,273 47187,274 47188,3999 47189,34 47189,35 47190,2367 47191,301 47192,2367 47193,217 47193,222 47193,1417 47194,289 47194,290 47195,577 47196,1400 47197,392 47197,660 47198,424 47199,1070 47200,516 47201,430 47202,4691 47203,772 47204,47205 47206,557 47207,8719 47208,138 47209,865 47210,557 47211,137 47212,652 47213,118 47213,4597 47214,21944 47215,217 47216,557 47217,557 47218,392 47218,697 47219,47220 47221,424 47222,44 47223,2083 47224,287 47225,1858 47226,1860 47227,126 47228,47229 47230,275 47231,1149 47232,477 47233,1858 47234,1860 47235,779 47236,1210 47237,47238 47237,61889 47240,99 47241,240 47242,87 47243,1179 47244,1556 47245,72 47246,332 47246,1888 47246,9025 47247,120 47248,2367 47249,72 47250,255 47251,72 47252,557 47253,417 47253,605 47253,1634 47254,330 47255,779 47255,1515 47256,872 47257,47258 47259,195 47260,111 47260,4355 47260,4771 47261,861 47262,72 47263,344 47264,285 47265,272 47266,47267 47266,62821 47269,1381 47270,489 47271,406 47272,22 47272,178 47272,211 47272,622 47272,1891 47273,3209 47274,6303 47275,68 47276,47277 47278,292 47279,389 47280,500 47281,1962 47282,1052 47283,1882 47284,2775 47285,54 47286,2210 47286,4237 47287,417 47288,47289 47290,47291 47290,65248 47290,113424 47290,114567 47290,115795 47290,120517 47290,122860 47290,123350 47290,124805 47290,126467 47292,2244 47293,1284 47294,289 47294,290 47295,872 47296,298 47297,485 47298,47299 47300,47301 47302,47303 47302,50738 47302,84367 47302,95316 47302,103636 47302,107326 47302,206972 47304,536 47305,4101 47306,664 47306,20359 47307,1980 47307,8991 47309,147 47309,158 47309,206 47309,406 47309,779 47309,2244 47310,47311 47312,1368 47313,47314 47316,885 47317,861 47318,252 47318,318 47319,225 47320,663 47320,664 47321,440 47322,8884 47323,714 47324,1085 47325,2574 47326,808 47327,47328 47329,644 47330,920 47331,275 47332,452 47332,918 47333,4039 47335,86 47335,167 47335,240 47335,301 47335,372 47335,567 47335,589 47335,605 47335,615 47335,631 47335,720 47335,801 47335,907 47335,968 47335,972 47335,973 47335,1010 47335,1122 47335,1124 47335,1140 47335,1167 47335,1231 47335,1241 47335,1284 47335,1298 47335,1309 47335,1436 47335,1522 47335,1544 47335,1564 47335,1782 47335,1785 47335,1818 47335,1837 47335,1849 47335,1893 47335,2191 47335,2372 47335,2557 47335,2620 47335,2979 47335,3193 47335,3207 47335,3218 47336,489 47337,2048 47339,47340 47341,298 47342,485 47345,704 47346,47347 47346,105020 47348,233 47349,1452 47351,1070 47352,366 47353,366 47354,366 47355,366 47356,366 47357,1238 47358,17384 47359,47360 47363,1287 47364,861 47367,861 47368,160 47368,309 47368,310 47368,929 47368,972 47368,1305 47368,1559 47368,1749 47368,3999 47368,142430 47369,6837 47370,306 47370,307 47371,240 47371,818 47372,178 47373,2367 47374,68 47375,3804 47376,47377 47378,2775 47379,447 47380,1323 47381,102 47382,1326 47383,408 47384,47385 47386,86 47387,2750 47388,269 47388,850 47389,14434 47390,47391 47390,54796 47392,422 47393,422 47394,422 47395,422 47396,422 47397,422 47398,422 47399,422 47400,30 47403,5308 47404,36398 47405,47406 47407,195 47408,8270 47409,30 47409,1796 47409,47410 47409,49200 47409,52977 47409,54147 47409,60899 47409,65299 47409,69552 47409,78413 47409,82357 47409,82518 47409,83182 47409,84674 47409,85192 47409,93368 47409,93418 47409,100455 47409,105415 47409,106602 47409,107314 47409,108564 47409,110198 47409,111782 47409,112695 47409,115520 47409,120190 47409,120303 47409,120417 47409,120754 47409,122364 47409,124008 47409,124964 47409,125787 47409,126350 47409,128417 47409,128581 47409,128806 47409,129041 47409,129336 47409,129365 47409,130051 47409,135740 47409,143590 47409,151809 47409,157958 47411,5874 47412,20 47412,1033 47413,47414 47415,3069 47416,47416 47417,920 47418,47419 47420,202 47420,203 47422,932 47423,577 47424,301 47424,968 47425,2828 47426,481 47427,2334 47428,255 47429,17384 47430,271 47431,1 47432,818 47433,2567 47434,206 47435,346 47436,248 47437,2296 47438,72 47439,2646 47440,1274 47441,47442 47443,302 47443,687 47443,811 47443,893 47443,1374 47443,2116 47444,79 47445,217 47446,178 47447,6695 47448,222 47449,3960 47450,1837 47451,47452 47453,14996 47454,14674 47455,31977 47456,805 47457,7270 47458,849 47459,872 47460,346 47461,4101 47461,6556 47462,137 47463,2512 47464,634 47466,267 47467,9560 47468,310 47469,65 47470,483 47471,192 47471,588 47471,590 47471,1140 47471,1579 47471,1769 47471,1893 47471,2051 47471,3474 47471,5547 47471,8907 47471,31977 47471,49057 47471,68069 47472,217 47473,18726 47474,1458 47475,743 47476,47477 47478,47477 47479,47477 47480,47477 47482,1425 47482,2674 47484,366 47485,79 47486,298 47487,485 47488,47489 47488,56149 47488,68069 47488,74727 47488,106003 47488,109501 47488,113594 47490,298 47491,485 47493,1479 47494,47495 47496,47497 47498,298 47499,485 47500,79 47501,271 47502,827 47502,1392 47502,1531 47503,1381 47504,1707 47505,158 47505,406 47505,779 47505,1181 47505,1515 47506,47507 47508,442 47509,44 47510,366 47511,366 47512,2146 47513,527 47514,47515 47517,968 47518,390 47518,589 47518,156379 47519,10 47520,772 47521,2146 47522,15179 47523,47524 47525,1149 47526,1265 47526,1266 47526,47527 47526,170460 47528,47529 47530,47531 47530,120575 47533,298 47534,485 47535,72 47536,54 47536,47537 47538,26 47538,59 47539,47539 47539,58575 47540,994 47540,21944 47541,16207 47542,273 47542,274 47543,298 47544,485 47546,298 47547,485 47548,1368 47549,1715 47550,379 47550,1274 47551,21944 47552,219 47552,743 47553,298 47554,485 47555,516 47556,1181 47557,298 47558,485 47559,47560 47561,841 47562,3069 47563,388 47564,1181 47565,72 47566,344 47567,285 47568,704 47569,206 47570,1204 47571,13 47571,298 47571,994 47572,187 47573,1414 47574,47575 47576,47575 47577,47575 47578,47575 47579,195 47580,557 47581,195 47582,893 47583,7270 47584,72 47585,330 47586,1796 47587,3413 47588,779 47589,1623 47590,47591 47592,698 47593,312 47594,346 47595,3246 47595,3247 47596,344 47597,585 47598,6888 47600,233 47601,8788 47602,1379 47603,290 47603,8992 47604,1767 47605,7652 47606,81 47608,3246 47608,3247 47609,107 47610,2416 47610,2417 47611,292 47612,338 47613,47614 47615,298 47616,1133 47617,3538 47618,72 47619,3413 47620,1247 47621,634 47622,1634 47623,366 47624,366 47625,366 47626,366 47627,366 47628,366 47629,298 47630,485 47631,47632 47631,135847 47633,783 47634,1 47634,11 47634,86 47634,192 47634,315 47634,330 47634,333 47634,397 47634,444 47634,452 47634,581 47634,713 47634,929 47634,1014 47634,1058 47634,1113 47634,1191 47634,1192 47634,1220 47634,1241 47634,1300 47634,1579 47634,1677 47634,1749 47634,2083 47634,2373 47634,2526 47634,2923 47634,3999 47634,4218 47634,23287 47634,50318 47635,6891 47636,2923 47637,240 47638,1181 47639,1323 47640,102 47641,1326 47642,408 47643,1955 47645,4597 47647,26 47647,59 47648,406 47649,392 47649,1860 47650,259 47651,269 47651,571 47651,599 47651,47652 47651,53746 47651,55251 47653,2506 47654,861 47654,1453 47655,256 47656,872 47657,872 47658,309 47658,310 47658,626 47659,2367 47660,149 47661,602 47662,481 47663,602 47664,5213 47665,366 47666,13661 47667,2574 47668,30 47670,1707 47670,20004 47671,588 47671,590 47673,252 47673,275 47674,217 47674,1419 47675,932 47676,861 47677,47678 47679,255 47680,8788 47681,10 47681,22 47681,50 47681,65 47681,68 47681,72 47681,79 47681,81 47681,94 47681,120 47681,134 47681,136 47681,137 47681,178 47681,195 47681,202 47681,203 47681,206 47681,215 47681,217 47681,222 47681,233 47681,240 47681,252 47681,261 47681,278 47681,301 47681,302 47681,310 47681,312 47681,332 47681,349 47681,366 47681,372 47681,388 47681,390 47681,392 47681,431 47681,439 47681,446 47681,455 47681,467 47681,489 47681,503 47681,525 47681,577 47681,579 47681,588 47681,590 47681,622 47681,631 47681,687 47681,697 47681,752 47681,760 47681,809 47681,818 47681,861 47681,868 47681,872 47681,949 47681,994 47681,1001 47681,1010 47681,1019 47681,1085 47681,1118 47681,1119 47681,1149 47681,1151 47681,1231 47681,1285 47681,1309 47681,1332 47681,1419 47681,1466 47681,1556 47681,1572 47681,1634 47681,1659 47681,1749 47681,1769 47681,1776 47681,1782 47681,1796 47681,1877 47681,1955 47681,2017 47681,2073 47681,2443 47681,2620 47681,2787 47681,2797 47681,2979 47681,2989 47681,2991 47681,3135 47681,3328 47681,3331 47681,3345 47681,3507 47681,4453 47681,4823 47681,5343 47681,5358 47681,6279 47681,6303 47681,9007 47681,9015 47681,9026 47681,14352 47681,17309 47681,21442 47681,22580 47681,31896 47682,1803 47684,919 47685,30 47686,104 47687,47688 47689,206 47690,47691 47692,652 47693,4678 47694,298 47695,647 47696,344 47697,920 47697,1796 47698,1381 47699,206 47701,118 47702,47703 47704,47705 47707,292 47707,360 47707,918 47707,1509 47707,3328 47707,215276 47708,1326 47711,1509 47712,1243 47713,302 47714,26 47714,59 47715,718 47716,483 47717,47718 47719,2668 47720,151 47720,2607 47721,149 47722,1175 47724,47725 47726,171 47727,171 47728,1220 47728,1222 47728,1655 47729,118 47729,4597 47730,158 47731,47732 47733,10 47733,113156 47734,2073 47735,1238 47736,47737 47738,693 47739,102 47740,376 47741,171 47742,647 47743,344 47744,919 47745,775 47746,47747 47748,192 47749,1238 47752,358 47752,1432 47753,1285 47754,1132 47755,781 47756,389 47759,2045 47761,1238 47762,2135 47765,2135 47766,240 47767,1285 47767,1300 47768,1285 47768,1688 47769,13546 47770,1119 47770,1285 47770,3585 47771,22 47772,206 47772,406 47772,205478 47773,1085 47773,18726 47774,626 47775,795 47776,2178 47776,4545 47777,47778 47779,269 47780,6369 47781,160 47782,47783 47784,406 47786,1001 47786,47787 47786,61161 47786,75954 47786,99808 47786,106603 47786,112103 47786,114252 47786,119749 47786,132000 47786,142428 47786,172362 47786,243028 47788,47789 47790,44 47791,718 47792,718 47793,68 47793,119 47794,151 47794,312 47795,47796 47797,557 47798,862 47799,671 47800,557 47801,557 47802,557 47803,718 47804,26 47804,59 47805,4 47805,5 47805,68 47805,134 47805,784 47805,2089 47805,2469 47805,2940 47805,4220 47805,5871 47805,21944 47805,40942 47805,48006 47805,66297 47805,148461 47805,172232 47805,192522 47805,193129 47806,527 47807,312 47808,1235 47808,1335 47808,27621 47808,27623 47809,18790 47810,240 47810,592 47811,47812 47813,1231 47813,1782 47814,743 47815,3209 47816,47817 47818,3602 47819,25 47819,26 47819,59 47819,865 47819,994 47819,1432 47819,2088 47819,21944 47820,907 47821,718 47822,47823 47824,47823 47825,1849 47826,668 47826,843 47827,346 47827,3115 47828,1332 47829,31976 47830,137 47831,72 47832,919 47833,516 47834,1 47834,32 47834,137 47834,273 47834,274 47834,652 47834,671 47834,736 47834,827 47834,859 47834,931 47834,1058 47834,1415 47835,673 47835,1130 47836,873 47836,1210 47837,47838 47839,47840 47839,54836 47841,47842 47843,56 47844,47845 47846,1274 47847,310 47847,3039 47848,818 47849,2867 47850,861 47851,22 47852,251 47853,861 47854,22 47855,97 47856,47857 47858,1127 47859,47860 47861,718 47862,47863 47864,47865 47866,861 47867,22 47868,861 47869,22 47870,577 47871,47872 47871,213668 47873,250 47874,47875 47874,51645 47874,51895 47874,80393 47874,81267 47876,206 47877,47878 47877,112102 47879,861 47880,22 47881,1506 47882,1019 47883,47884 47885,8235 47886,312 47887,14989 47888,13910 47889,841 47890,240 47891,35687 47892,602 47893,3538 47894,760 47895,301 47895,372 47895,907 47895,968 47895,1544 47895,1837 47896,72 47897,47898 47899,1127 47900,15 47901,390 47902,160 47903,1623 47904,4 47904,5 47905,743 47906,17593 47907,3209 47908,3451 47908,3452 47909,65 47910,195 47911,4177 47912,918 47913,261 47913,333 47914,47915 47916,1033 47917,206 47918,207 47919,1836 47920,47921 47920,95632 47920,102187 47922,47923 47924,1181 47925,980 47926,292 47927,294 47928,296 47929,298 47930,146 47931,1058 47933,171 47935,626 47936,376 47938,255 47939,47940 47941,1659 47942,200 47943,47944 47945,843 47946,1238 47947,1085 47948,1452 47949,1776 47950,264 47951,47952 47953,1531 47954,718 47957,861 47958,22 47959,510 47960,366 47962,366 47963,2668 47964,366 47966,207 47967,83 47969,510 47971,31976 47973,509 47973,510 47974,1544 47975,500 47976,510 47979,209 47980,647 47981,344 47982,309 47982,310 47983,510 47984,693 47985,510 47986,47987 47989,312 47990,509 47991,58 47992,46 47993,509 47993,510 47993,875 47994,510 47996,510 47998,358 47998,509 47998,510 48001,1127 48002,301 48002,5250 48003,604 48004,118 48004,304 48004,337 48004,346 48004,595 48004,994 48004,1688 48004,2315 48004,4597 48005,344 48006,68 48006,186 48006,388 48006,518 48006,693 48006,775 48006,795 48006,1235 48006,1326 48006,1411 48006,1545 48006,1715 48006,2006 48006,3370 48006,3804 48006,5130 48006,5961 48006,6837 48006,15474 48006,111074 48006,111140 48006,111141 48006,111162 48007,1639 48008,1579 48009,330 48010,835 48011,911 48012,455 48012,973 48012,5343 48012,29380 48013,843 48014,58 48015,46 48016,338 48016,710 48018,48019 48020,1374 48021,626 48022,652 48023,843 48024,941 48024,1262 48024,3830 48025,620 48025,1072 48026,393 48026,1531 48027,306 48027,307 48028,302 48029,83 48031,809 48032,843 48033,202 48033,203 48034,34 48034,536 48036,671 48037,184 48038,233 48038,577 48039,211 48040,251 48040,516 48040,1179 48041,835 48042,202 48042,203 48044,861 48045,22 48046,206 48046,366 48047,2371 48048,827 48049,192 48049,202 48049,203 48049,2371 48050,634 48051,467 48052,261 48052,694 48053,586 48053,1985 48053,59021 48054,1132 48055,781 48056,875 48057,2371 48058,1673 48059,861 48060,22 48061,861 48062,579 48063,22 48064,760 48065,1132 48066,626 48067,48068 48069,760 48070,577 48071,255 48072,1782 48074,801 48075,581 48076,298 48077,485 48078,393 48078,485 48078,577 48078,788 48078,138686 48079,72 48080,344 48081,285 48082,34 48082,35 48082,313 48082,536 48082,2646 48083,775 48084,1749 48086,1204 48087,1001 48087,4222 48088,626 48090,1983 48091,626 48092,1782 48093,315 48093,1789 48094,206 48095,1019 48096,340 48097,2292 48097,2889 48098,424 48100,217 48101,304 48101,356 48101,852 48101,2334 48102,577 48102,788 48102,1429 48102,1715 48102,4039 48104,1323 48105,102 48106,1326 48107,408 48108,626 48109,752 48109,874 48109,1210 48109,1801 48110,1782 48112,1293 48113,2351 48115,3507 48116,1127 48117,48118 48119,79 48119,1417 48120,934 48121,516 48122,1370 48124,1417 48125,697 48126,160 48127,652 48128,65 48128,467 48129,337 48130,301 48130,1293 48130,1782 48132,1722 48133,184 48133,704 48134,422 48135,1016 48136,104 48136,557 48136,953 48136,954 48137,422 48138,1782 48139,1782 48140,467 48140,868 48141,1220 48141,1222 48142,252 48143,251 48144,843 48145,422 48146,215 48146,1016 48147,422 48148,392 48148,1151 48149,3804 48150,422 48151,119 48151,192 48151,309 48151,310 48151,577 48151,1400 48151,21944 48152,422 48153,1417 48154,422 48155,718 48155,1745 48156,422 48157,422 48158,32 48159,264 48160,422 48163,346 48164,206 48164,818 48164,1118 48164,4260 48164,115659 48164,142870 48166,1556 48167,731 48168,809 48168,980 48169,272 48169,668 48171,861 48172,22 48174,1058 48174,3585 48176,668 48178,980 48179,403 48179,628 48179,794 48180,1707 48181,79 48182,68 48182,360 48182,1127 48186,592 48187,5662 48188,134 48188,135 48188,137 48188,138 48188,2105 48189,219 48191,1179 48193,83 48193,536 48194,338 48195,58 48196,46 48198,640 48199,861 48200,22 48201,19 48202,861 48202,2017 48203,3252 48204,392 48205,2744 48207,920 48208,222 48208,536 48208,4672 48208,18831 48209,83 48216,1782 48218,1231 48218,1782 48219,1782 48221,1782 48223,1782 48224,717 48224,1782 48225,1010 48225,1241 48225,1782 48227,1782 48228,1133 48228,14797 48229,37 48231,1782 48232,1782 48233,171 48234,211 48234,5440 48235,1803 48235,21442 48237,192 48237,1849 48238,37 48238,1782 48238,1837 48239,56 48240,634 48241,634 48242,1782 48243,439 48243,996 48244,1118 48245,663 48245,664 48245,1224 48246,22 48246,1860 48246,5265 48247,920 48248,1983 48249,1010 48250,1381 48250,49057 48251,301 48252,2073 48253,328 48253,349 48253,389 48253,697 48253,795 48253,818 48253,3260 48253,3804 48254,332 48254,1353 48254,3331 48254,27041 48255,21442 48256,1688 48257,433 48258,83 48259,462 48259,1688 48260,301 48260,657 48260,1010 48261,79 48262,18831 48263,968 48264,392 48264,2116 48265,1001 48266,392 48267,1782 48268,171 48269,83 48270,626 48271,433 48272,920 48273,83 48274,10 48275,79 48277,1353 48278,79 48278,298 48278,615 48279,1639 48280,577 48281,171 48282,167 48283,389 48283,1019 48283,1860 48283,148742 48284,83 48285,718 48286,563 48287,349 48287,1160 48287,1381 48288,718 48289,577 48290,202 48290,579 48290,794 48290,1033 48290,1374 48290,1590 48295,138 48296,206 48298,589 48299,1240 48299,1454 48300,83 48301,333 48302,644 48304,37 48304,167 48304,1782 48305,37 48305,301 48305,1231 48305,1782 48306,868 48308,1983 48309,83 48311,217 48312,184 48313,178 48314,301 48314,1085 48315,65 48316,9030 48317,1160 48318,20 48319,32 48319,65 48319,222 48319,875 48319,2191 48319,5540 48320,56 48320,147 48320,158 48320,192 48321,1143 48323,4 48323,5 48323,424 48325,2528 48326,5726 48327,481 48328,2436 48329,467 48330,34 48330,35 48332,20 48332,182 48333,392 48333,875 48333,1363 48333,1836 48333,3260 48334,805 48335,264 48336,1644 48337,1188 48340,323 48341,6263 48342,83 48344,5 48344,557 48344,615 48344,1235 48344,1684 48344,3794 48344,4114 48344,5700 48344,6621 48344,9542 48344,15742 48344,17364 48344,21944 48344,34060 48344,45701 48344,48344 48344,48345 48344,53885 48344,55176 48344,56438 48344,69395 48344,69396 48344,69665 48344,71657 48344,74648 48344,80661 48344,101805 48344,102822 48344,104457 48344,110550 48344,112489 48345,1319 48346,1033 48348,579 48349,557 48350,83 48352,718 48353,1715 48354,1033 48355,1749 48356,1033 48357,328 48358,6263 48359,360 48360,1201 48361,3 48361,435 48362,1531 48364,149 48364,178 48364,333 48364,439 48364,505 48364,622 48364,868 48364,1803 48364,21442 48365,32 48365,392 48365,697 48365,809 48365,76096 48366,843 48367,932 48368,784 48369,1955 48371,1276 48372,389 48372,455 48372,657 48372,949 48372,32751 48372,33508 48373,1977 48373,1978 48374,254 48374,596 48374,1363 48374,4276 48375,861 48376,22 48377,861 48378,22 48380,516 48381,63 48382,439 48383,366 48384,2668 48385,37 48385,698 48385,717 48385,1616 48385,1715 48385,1740 48385,1782 48386,718 48387,6661 48388,647 48389,233 48390,809 48391,1285 48392,68 48393,1871 48394,1590 48394,1644 48395,328 48396,7757 48399,1707 48400,65 48400,467 48400,868 48401,2828 48402,444 48403,333 48405,626 48405,3193 48406,3135 48407,48408 48409,79 48409,622 48409,2775 48410,192 48411,634 48412,1105 48413,571 48413,868 48414,349 48414,2372 48415,186 48415,1509 48415,5547 48416,273 48416,274 48417,2436 48418,195 48418,217 48418,240 48418,251 48418,326 48418,392 48418,516 48418,1454 48418,1572 48418,3804 48421,1782 48423,919 48424,1782 48425,138 48425,1332 48426,83 48427,536 48428,138 48429,2083 48432,32 48432,349 48432,392 48433,3138 48434,83 48435,6119 48436,130 48439,326 48439,358 48439,415 48439,714 48439,736 48439,783 48439,1011 48439,1043 48439,1262 48439,3653 48439,48505 48440,9026 48442,104 48442,1939 48443,338 48444,202 48445,233 48446,1522 48447,48448 48447,55510 48447,69348 48449,392 48451,104 48451,200 48451,442 48451,714 48451,805 48452,147 48453,433 48454,247 48455,602 48455,3218 48455,4866 48457,58 48458,46 48459,516 48460,147 48460,158 48460,1235 48460,1335 48461,433 48462,673 48463,4066 48464,2626 48466,26 48466,59 48467,255 48469,296 48469,2626 48470,1572 48471,1113 48471,1381 48471,1400 48471,4831 48471,13136 48472,2210 48472,4237 48473,1235 48473,1335 48473,21944 48475,852 48475,2590 48476,48 48477,140 48478,120 48478,1052 48479,647 48480,344 48481,171 48482,467 48483,657 48484,861 48484,893 48485,171 48488,2506 48490,920 48491,516 48491,1127 48492,1220 48492,1222 48493,252 48494,251 48495,2048 48496,433 48498,433 48499,48500 48501,33598 48502,433 48502,1634 48503,1955 48504,1133 48504,3370 48504,3585 48504,14453 48505,186 48505,388 48505,518 48505,685 48505,707 48505,852 48505,911 48505,1021 48505,1043 48505,1084 48505,1113 48505,1326 48505,1345 48505,3193 48505,3623 48505,5704 48505,6032 48505,6424 48505,6638 48505,6641 48505,8107 48505,14572 48505,18097 48505,23349 48505,25395 48505,28107 48505,40993 48505,45184 48505,48505 48505,49373 48505,52232 48505,56921 48505,57144 48505,58218 48505,58424 48505,67097 48505,72956 48505,73216 48505,87871 48505,96685 48505,126873 48505,127140 48505,127154 48505,131356 48505,131362 48505,131753 48505,135978 48505,136186 48505,143410 48505,147995 48505,152959 48505,163450 48505,169505 48505,169715 48505,169811 48505,170554 48505,170687 48505,180987 48505,182917 48505,183144 48505,183283 48505,188754 48505,189697 48505,190361 48505,194910 48505,202379 48505,212995 48505,214004 48505,214663 48505,215928 48505,221809 48505,227728 48505,231111 48505,243482 48505,243489 48505,247782 48505,250831 48505,252568 48505,252714 48505,255066 48505,255564 48505,255760 48505,255763 48505,257772 48505,263329 48505,263736 48505,264476 48507,264 48507,652 48508,1773 48508,14472 48509,2353 48510,37 48512,283 48512,1509 48513,79 48513,2017 48514,1151 48514,1836 48515,222 48515,360 48515,455 48516,37 48517,310 48518,1282 48519,48520 48521,346 48522,422 48523,56 48524,252 48524,318 48524,516 48525,1345 48526,4193 48527,536 48527,18831 48528,184 48530,818 48531,1001 48532,104 48532,248 48532,991 48532,1267 48532,1659 48532,2605 48533,48534 48535,2116 48536,138 48537,264 48538,65 48538,467 48538,868 48539,1147 48539,1509 48539,1962 48539,2089 48539,2940 48539,21944 48539,36819 48540,302 48540,2607 48543,2607 48544,2607 48545,167 48545,225 48545,299 48545,349 48545,809 48545,968 48545,1284 48545,2372 48545,2607 48545,3756 48546,660 48547,119 48548,48 48549,477 48549,805 48550,718 48550,1745 48551,647 48552,344 48553,718 48554,48555 48556,312 48557,668 48558,527 48559,48560 48561,264 48561,1381 48562,298 48564,222 48564,1417 48565,1368 48565,17346 48566,483 48567,83 48568,264 48569,48570 48571,209 48572,202 48572,203 48572,516 48573,366 48574,425 48574,992 48575,312 48576,151 48577,1782 48578,34 48578,35 48579,2334 48580,296 48580,1381 48581,6357 48582,299 48583,25222 48584,920 48585,72 48586,417 48587,247 48587,2867 48587,22880 48588,1151 48589,301 48590,149 48591,209 48591,687 48592,1556 48593,138 48594,1235 48594,1335 48594,21944 48595,1151 48596,861 48596,893 48597,138 48598,10 48599,30 48599,81 48599,134 48599,136 48599,215 48599,225 48599,227 48599,254 48599,503 48599,557 48599,636 48599,850 48599,953 48599,1016 48599,1149 48599,1179 48599,1282 48599,1332 48599,1368 48599,1745 48599,1844 48599,1939 48599,3507 48599,4276 48599,4355 48599,7124 48599,7270 48599,8990 48599,8991 48599,8992 48599,8994 48599,20063 48600,5375 48601,68 48601,81 48601,5103 48603,27550 48604,861 48605,22 48606,919 48607,19413 48608,302 48610,356 48610,3474 48611,147 48611,184 48611,697 48612,217 48612,592 48612,1818 48613,294 48614,2775 48615,447 48616,1509 48617,48618 48619,79 48619,192 48620,104 48620,217 48621,272 48622,634 48623,4475 48624,134 48625,599 48626,247 48627,1257 48628,72 48629,1400 48630,861 48630,893 48631,20 48632,4678 48633,843 48634,72 48635,861 48636,1722 48637,227 48638,72 48639,120 48639,2646 48641,392 48642,34 48642,35 48643,259 48643,221336 48644,349 48644,392 48644,1151 48645,647 48646,344 48647,72 48648,19010 48649,346 48650,376 48651,720 48652,160 48653,631 48653,1085 48654,72 48655,302 48656,34 48656,35 48657,349 48657,392 48657,697 48657,703 48657,720 48657,3260 48657,3612 48658,392 48659,1849 48660,1466 48661,3148 48662,1298 48663,302 48663,2116 48664,48665 48666,72 48667,187 48668,48669 48668,51734 48668,53118 48668,57772 48670,77 48671,86 48672,516 48674,217 48674,392 48675,72 48676,10 48677,1402 48678,72 48679,704 48680,7416 48681,72 48682,1381 48683,72 48684,48685 48686,1836 48687,1844 48688,20 48689,72 48690,640 48691,27041 48692,102 48693,83 48693,285 48693,949 48693,2779 48693,2784 48694,252 48694,1188 48695,72 48696,3069 48697,579 48698,79 48699,417 48700,72 48701,30 48701,1179 48702,376 48703,885 48704,34 48704,35 48704,313 48704,2646 48705,718 48706,250 48706,1684 48707,289 48707,290 48708,557 48709,714 48709,1119 48710,557 48711,626 48712,615 48713,72 48714,2506 48715,50 48715,158 48715,406 48715,779 48716,211 48716,1001 48716,1844 48717,79 48717,743 48717,8714 48717,95583 48718,217 48718,240 48719,1608 48720,313 48721,5101 48721,8072 48722,138 48723,861 48724,22 48725,44 48726,136 48727,794 48728,718 48729,77 48729,392 48729,415 48729,644 48729,657 48729,918 48729,1453 48729,1454 48729,1858 48729,1860 48729,1871 48729,2266 48729,2699 48729,3003 48729,8235 48729,214734 48730,48731 48732,250 48732,1684 48733,68 48734,72 48735,93 48735,94 48736,247 48737,1453 48738,50 48739,718 48740,1238 48741,1888 48742,349 48743,707 48744,872 48745,247 48746,140 48747,417 48747,3069 48748,1014 48749,406 48750,2351 48751,8788 48752,4691 48753,48754 48755,48756 48757,171 48758,450 48759,390 48760,1016 48761,450 48762,273 48762,274 48763,302 48765,86 48765,167 48765,301 48765,567 48765,589 48765,605 48765,615 48765,720 48765,801 48765,907 48765,972 48765,973 48765,1001 48765,1124 48765,1140 48765,1167 48765,1241 48765,1284 48765,1298 48765,1309 48765,1436 48765,1522 48765,1782 48765,1785 48765,1955 48765,2083 48765,2191 48765,2372 48765,2443 48765,2557 48765,2620 48765,2979 48765,3138 48765,3193 48765,3207 48766,192 48766,693 48767,48768 48769,704 48771,366 48772,788 48773,439 48774,358 48774,931 48775,1858 48776,1860 48777,1927 48778,240 48778,784 48778,805 48778,818 48778,1462 48778,3467 48779,206 48780,37414 48781,63 48781,202 48781,203 48781,493 48782,749 48782,1146 48782,6059 48783,83 48783,389 48783,949 48784,330 48785,48786 48787,918 48787,2979 48788,599 48789,63 48790,1579 48791,4101 48792,809 48793,599 48794,1016 48795,209 48796,2931 48797,577 48798,444 48799,126 48800,424 48801,1220 48801,1222 48802,171 48803,5440 48804,211 48805,192 48805,406 48806,252 48806,318 48807,252 48808,48809 48810,72 48811,72 48814,1572 48815,2048 48816,1385 48817,264 48818,14130 48819,48820 48819,63978 48821,48822 48824,147 48824,337 48825,417 48826,392 48826,1151 48827,1465 48828,2411 48829,301 48830,1551 48831,310 48832,301 48832,392 48832,442 48833,328 48834,704 48835,704 48836,72 48838,30 48839,10 48839,2146 48840,1 48841,1 48842,1860 48843,704 48844,192 48844,336 48844,372 48844,973 48844,1085 48844,2371 48844,68069 48845,240 48846,980 48847,264 48848,366 48849,366 48850,312 48850,1052 48851,366 48852,366 48853,366 48854,366 48855,868 48856,626 48857,273 48857,274 48858,72 48859,233 48860,538 48860,5213 48861,10 48862,417 48863,81 48866,83 48867,1715 48868,171 48872,393 48873,515 48875,83 48878,4611 48879,1544 48880,4611 48881,1544 48882,893 48885,72 48887,275 48888,393 48889,431 48889,455 48890,160 48892,148742 48893,298 48894,485 48895,455 48895,1284 48895,1634 48895,148742 48896,1718 48896,2646 48897,2979 48898,32 48898,41 48898,48 48898,107 48898,250 48898,252 48898,278 48898,360 48898,385 48898,483 48898,575 48898,620 48898,673 48898,718 48898,749 48898,779 48898,784 48898,893 48898,920 48898,973 48898,1119 48898,1160 48898,1220 48898,1222 48898,1238 48898,1345 48898,1353 48898,1684 48898,1832 48898,1888 48898,1962 48898,2315 48898,2779 48898,3207 48898,4771 48898,5911 48898,6119 48898,19443 48898,19519 48899,3451 48899,3452 48900,1782 48901,1381 48902,217 48903,1381 48904,1381 48905,1381 48906,178 48907,1381 48908,147 48908,252 48908,1220 48908,1222 48909,186 48909,1381 48910,1149 48911,202 48911,203 48912,56 48913,1381 48914,1858 48915,1860 48916,1381 48917,151 48917,192 48917,500 48917,1224 48917,1803 48917,4903 48918,861 48919,22 48920,225 48921,301 48922,48 48923,1858 48924,1860 48925,1381 48926,48 48927,415 48928,690 48928,832 48929,104 48930,1149 48931,406 48932,346 48934,1381 48935,2073 48936,1983 48937,1381 48938,1983 48939,248 48940,306 48940,307 48941,301 48942,1085 48944,1927 48945,1381 48946,302 48947,8788 48948,1085 48949,338 48949,1453 48950,2436 48951,217 48951,1019 48951,1417 48952,694 48953,1381 48954,389 48955,693 48955,4260 48955,7117 48955,15547 48956,849 48957,652 48958,48 48960,326 48961,838 48962,392 48962,1146 48963,259 48963,668 48965,1309 48966,58 48967,46 48968,920 48969,147 48970,611 48971,1381 48972,1849 48972,32784 48973,302 48973,1010 48974,393 48974,999 48974,1388 48975,233 48975,1203 48975,3135 48976,1381 48977,941 48979,1085 48981,1381 48982,273 48982,439 48982,818 48982,992 48984,452 48985,1454 48986,422 48987,422 48988,1509 48989,422 48990,1749 48991,358 48992,1132 48993,422 48994,781 48995,599 48996,422 48997,1381 48998,302 48998,467 48999,336 49000,571 49000,868 49000,1556 49000,21944 49001,1381 49002,227 49003,6424 49004,1345 49006,652 49007,269 49008,20359 49010,718 49011,65 49011,868 49011,1385 49013,1323 49014,102 49015,1326 49016,408 49018,302 49019,1238 49019,2379 49020,1436 49021,264 49024,1298 49025,422 49027,992 49027,1276 49027,1860 49027,19488 49027,75912 49028,718 49029,422 49031,973 49031,1298 49032,422 49033,422 49034,264 49034,1381 49035,134 49035,135 49035,200 49035,298 49035,372 49035,431 49035,588 49035,590 49035,631 49035,714 49035,805 49035,932 49035,1016 49035,1955 49035,6556 49036,1556 49037,22 49037,6726 49038,422 49039,264 49039,117163 49040,417 49041,338 49041,1634 49042,1247 49044,49044 49045,71 49045,1368 49045,3467 49046,2351 49047,2266 49048,248 49049,2590 49050,202 49050,203 49051,1844 49052,1983 49053,104 49054,31073 49055,1124 49056,49057 49058,138 49059,289 49059,290 49059,94134 49060,1298 49061,302 49062,1572 49062,1722 49063,509 49065,1858 49066,1860 49067,192 49068,433 49069,435 49070,184 49071,202 49071,203 49072,907 49073,5366 49074,1818 49075,147 49076,72 49076,557 49076,1001 49076,1210 49076,75912 49077,58 49078,46 49080,58 49081,46 49082,3413 49083,1782 49084,298 49085,485 49086,1133 49087,1007 49087,1381 49087,1551 49087,3999 49088,439 49089,104 49089,592 49090,48 49091,26 49091,59 49092,805 49092,1210 49092,1381 49092,8180 49093,58 49094,46 49095,932 49096,1871 49097,2779 49098,1381 49098,1893 49098,7155 49099,58 49100,46 49101,301 49102,1326 49103,893 49104,390 49104,3115 49104,6068 49105,1298 49106,346 49107,1179 49108,30 49108,2116 49108,19010 49108,22293 49109,25222 49110,1146 49111,48 49112,481 49112,811 49113,536 49113,18831 49115,557 49116,1298 49117,30 49117,58 49117,251 49117,563 49117,626 49117,749 49117,795 49117,811 49117,1133 49117,1368 49117,1821 49117,2590 49117,5708 49117,21736 49117,33598 49118,44013 49120,79 49121,37 49121,202 49121,440 49121,615 49121,794 49121,868 49121,1345 49121,1370 49121,1411 49121,2979 49121,2989 49121,2991 49121,5130 49121,75912 49122,49123 49124,718 49125,1284 49125,1522 49125,5662 49126,1298 49127,389 49127,657 49128,718 49129,736 49129,1893 49129,49057 49129,81070 49130,718 49131,49132 49133,305 49134,134 49134,248 49134,289 49134,290 49134,298 49134,588 49134,590 49134,1745 49134,94134 49136,1132 49137,49138 49139,392 49139,433 49139,644 49139,697 49139,1151 49140,718 49142,163 49143,1858 49144,1860 49145,1227 49145,1229 49145,21944 49146,163 49147,10 49147,163 49147,202 49147,203 49147,217 49147,332 49147,333 49147,483 49147,1240 49147,1465 49147,69377 49147,69993 49147,70554 49148,163 49149,163 49150,920 49151,1113 49152,81 49152,1749 49152,2296 49154,1019 49155,163 49155,302 49155,893 49156,163 49157,163 49158,163 49159,481 49160,163 49160,805 49161,516 49162,349 49163,163 49164,163 49165,163 49166,493 49167,163 49168,280 49168,1821 49168,17245 49171,163 49172,251 49172,252 49172,465 49172,516 49174,1655 49175,392 49175,931 49177,222 49179,163 49179,215276 49180,143 49181,5212 49182,147 49184,1241 49185,163 49186,163 49186,579 49187,22 49187,163 49187,302 49187,392 49187,579 49187,1151 49187,1749 49187,1836 49189,1085 49189,2989 49189,2991 49190,298 49191,485 49192,163 49194,65 49194,868 49195,252 49195,318 49195,1220 49195,1222 49195,41170 49196,697 49197,1220 49197,1222 49198,1220 49198,1222 49199,2668 49201,644 49202,163 49202,302 49203,298 49204,163 49205,163 49206,3 49207,1381 49208,392 49209,1551 49210,1425 49211,163 49212,49213 49214,422 49215,56 49216,422 49217,56 49218,163 49219,422 49220,56 49221,65 49221,467 49221,868 49222,919 49223,147 49223,163 49223,8332 49223,30428 49224,657 49225,473 49226,861 49227,22 49228,861 49229,2210 49229,3209 49230,22 49231,392 49232,41 49233,714 49234,49235 49236,1241 49237,163 49238,163 49239,694 49240,349 49241,1149 49242,1858 49243,1860 49244,775 49245,298 49246,485 49247,81 49247,202 49247,203 49247,272 49247,631 49247,1001 49247,1282 49247,1284 49247,4355 49248,163 49249,850 49250,2989 49250,2991 49251,163 49252,392 49253,264 49253,2312 49255,163 49256,163 49257,366 49257,1287 49258,49259 49260,252 49261,264 49261,1289 49262,536 49262,2784 49262,18831 49264,163 49266,1381 49266,1893 49267,628 49268,298 49269,485 49271,431 49272,163 49273,163 49273,302 49274,861 49275,22 49276,49277 49278,6303 49279,850 49280,1118 49281,163 49283,1309 49284,868 49285,626 49287,500 49288,1962 49289,1052 49290,1882 49291,2775 49292,54 49293,2210 49293,4237 49294,1381 49295,794 49297,240 49297,301 49297,1955 49298,850 49299,137 49299,222 49299,1019 49299,1635 49299,5101 49299,6323 49299,8235 49300,577 49301,1634 49302,26 49302,59 49303,305 49304,861 49305,22 49306,1977 49306,1978 49307,850 49308,163 49308,302 49308,579 49310,3872 49311,1623 49312,49313 49314,493 49315,310 49316,178 49317,192 49317,336 49318,292 49319,302 49320,1235 49320,1335 49322,20771 49323,1102 49324,389 49325,24505 49326,850 49327,1252 49327,1253 49328,328 49329,647 49330,9026 49331,21944 49332,7652 49333,1849 49334,48 49335,83 49336,1072 49337,240 49337,264 49337,467 49337,1019 49337,1181 49337,1210 49337,1531 49337,4355 49338,929 49339,227 49339,503 49339,1149 49340,163 49340,893 49342,68 49342,202 49342,203 49342,1181 49343,163 49343,118336 49344,163 49345,163 49346,760 49348,302 49349,1007 49351,192 49352,1572 49352,1722 49353,949 49353,2105 49354,163 49355,872 49355,1127 49355,1893 49355,49057 49355,191860 49356,850 49357,626 49358,972 49359,49360 49361,932 49362,3260 49362,3367 49363,222 49364,58 49365,46 49366,452 49367,1247 49368,184 49370,163 49371,28693 49372,248 49372,1332 49373,63 49373,163 49373,192 49373,207 49373,261 49373,292 49373,733 49373,1167 49373,1571 49373,1580 49373,1619 49373,1849 49373,2315 49373,48505 49374,56 49375,163 49376,509 49378,187 49379,389 49379,4771 49380,3507 49381,538 49382,431 49383,1509 49386,3 49386,349 49386,392 49386,510 49386,3260 49387,760 49388,682 49388,72439 49389,592 49390,2737 49391,518 49392,3193 49393,31122 49395,1509 49396,58 49397,46 49398,631 49398,1631 49398,84257 49399,163 49401,247 49402,83 49402,299 49402,309 49402,310 49402,459 49402,1509 49402,2674 49403,68 49403,1836 49404,1639 49405,1579 49406,850 49407,5212 49408,1210 49409,850 49410,167 49410,301 49410,73570 49411,1179 49413,1001 49414,1544 49415,861 49416,22 49417,481 49420,440 49420,794 49420,1740 49421,389 49422,312 49423,788 49424,1132 49426,811 49427,850 49428,111 49429,1149 49430,557 49431,312 49432,72 49433,1179 49434,222 49435,1509 49436,49437 49438,850 49440,850 49442,1634 49443,1509 49444,48 49444,459 49445,1837 49446,611 49447,1509 49449,1634 49450,422 49451,56 49452,2045 49453,264 49454,163 49455,809 49456,1955 49457,1119 49458,349 49459,1381 49460,1019 49460,4172 49461,491 49462,1707 49463,195 49464,1381 49465,1556 49466,163 49467,3507 49468,1454 49469,46 49469,163 49469,1580 49470,1033 49470,1590 49470,1644 49470,6661 49471,1177 49473,209 49474,7652 49475,211 49476,861 49477,163 49479,346 49480,17346 49481,4823 49482,1381 49483,431 49484,422 49485,56 49486,58 49487,46 49488,852 49489,861 49490,32673 49491,2045 49492,7652 49493,143 49494,346 49495,3467 49496,3328 49497,163 49497,579 49498,1235 49498,1335 49498,3507 49500,217 49501,649 49502,49503 49504,1789 49505,58 49506,46 49507,211 49508,163 49509,72 49510,749 49511,1509 49512,1284 49513,1509 49514,5662 49515,58 49516,46 49517,3507 49518,1033 49519,516 49520,893 49520,1149 49521,779 49522,3331 49523,1509 49524,195 49525,920 49526,557 49527,1102 49528,1515 49529,158 49530,459 49532,3872 49533,483 49534,579 49535,1085 49535,2572 49535,3623 49536,779 49536,30428 49537,8270 49538,1381 49539,1203 49539,3135 49540,736 49541,760 49542,49543 49542,60319 49542,61278 49542,64450 49544,49545 49546,192 49547,779 49547,68069 49547,141912 49548,1033 49549,1849 49550,32 49550,330 49550,408 49550,843 49550,1113 49550,1571 49550,3769 49551,34 49551,35 49551,536 49551,2646 49551,4672 49551,18831 49552,211 49553,99 49553,206 49553,994 49553,30331 49553,60576 49554,314 49554,1085 49555,49556 49557,1167 49558,309 49558,310 49559,79 49560,779 49562,151 49563,406 49563,779 49563,1181 49563,124889 49564,779 49565,118 49565,4597 49566,779 49567,406 49567,779 49568,1608 49569,392 49569,1151 49570,120 49570,240 49570,2812 49571,34 49571,35 49572,779 49573,779 49574,779 49576,1326 49577,859 49578,4771 49579,158 49579,779 49580,779 49581,195 49581,30418 49583,1381 49584,1381 49585,779 49585,68069 49586,779 49586,68069 49586,118336 49586,141912 49588,72 49589,141912 49590,26 49590,59 49591,22 49591,358 49592,1877 49593,1509 49594,211 49595,1326 49596,10 49597,592 49598,10 49599,7416 49600,1858 49601,1860 49602,163 49603,215 49604,4611 49605,1590 49605,1644 49607,4611 49608,931 49609,861 49610,211 49611,86 49612,1052 49613,861 49614,22 49615,2296 49616,158 49617,104 49618,34 49618,1718 49619,1556 49620,422 49621,56 49622,563 49623,3960 49624,1282 49625,19227 49628,49629 49630,247 49632,34 49632,35 49632,2224 49632,2646 49633,1453 49635,3474 49636,435 49637,1454 49638,422 49639,56 49640,217 49640,455 49640,1417 49641,640 49642,536 49642,1019 49643,87 49643,312 49644,861 49645,22 49646,390 49647,120 49647,694 49647,877 49647,1284 49647,1353 49647,1419 49647,148742 49648,338 49649,163 49650,211 49651,467 49652,22 49654,2105 49655,120 49656,1085 49657,760 49657,1631 49658,163 49659,49660 49661,516 49662,19010 49663,557 49664,422 49665,56 49666,1531 49667,392 49668,859 49669,72 49670,272 49671,1285 49672,743 49673,5212 49674,1058 49675,1381 49675,1551 49676,376 49677,1639 49678,1579 49679,151 49680,1235 49680,1335 49681,49682 49683,302 49684,509 49684,510 49685,120 49685,1353 49686,626 49687,861 49688,22 49689,32 49690,868 49691,120 49691,2812 49692,292 49692,338 49692,467 49692,745 49693,422 49694,56 49696,2979 49697,48 49697,1659 49698,2424 49700,37 49700,717 49700,1782 49701,49702 49703,302 49704,292 49705,83 49706,1509 49707,1509 49708,509 49709,9026 49710,509 49710,510 49710,1151 49711,158 49711,406 49711,779 49712,1085 49713,2073 49714,1509 49715,1639 49715,2646 49716,13745 49717,49718 49719,968 49720,2205 49720,2206 49721,68 49722,861 49723,22 49724,515 49724,1454 49725,211 49726,450 49728,49729 49730,163 49731,87 49731,1151 49732,163 49733,589 49733,1509 49734,1773 49735,2944 49736,17263 49737,2931 49739,392 49740,1179 49741,240 49741,818 49742,49743 49744,1227 49744,1229 49745,200 49747,312 49748,58 49749,46 49750,1858 49751,1860 49752,68 49753,217 49753,222 49753,1417 49754,49755 49756,49757 49756,53688 49756,56854 49756,57126 49756,61891 49756,80301 49756,87523 49756,87853 49758,49759 49760,136 49760,137 49760,312 49760,406 49760,1749 49762,1163 49763,292 49764,49765 49766,557 49767,269 49768,557 49769,302 49770,31934 49771,20004 49772,13 49773,3538 49774,313 49775,264 49776,83 49777,3724 49778,102 49778,693 49778,841 49778,1363 49778,14231 49779,49780 49781,1132 49782,781 49783,1149 49784,261 49784,2989 49784,2991 49784,27041 49784,32751 49785,44 49786,1844 49787,1265 49787,1266 49788,261 49789,663 49789,664 49790,94 49790,206 49790,571 49790,868 49790,2787 49790,3345 49791,147 49791,192 49791,336 49791,406 49791,779 49791,1458 49791,55849 49792,1417 49793,2315 49794,4594 49795,1807 49796,49797 49798,1805 49799,49800 49801,779 49802,596 49802,1368 49803,8820 49804,1132 49805,781 49806,3447 49807,2506 49808,1509 49809,1509 49809,109503 49810,1149 49811,147 49811,622 49813,931 49814,219 49815,850 49816,14819 49817,907 49818,818 49819,49820 49821,1509 49822,8992 49823,1058 49823,17309 49823,21442 49824,585 49825,599 49825,1639 49825,1796 49826,1363 49827,893 49829,2775 49830,447 49831,743 49832,779 49833,272 49834,23049 49835,147 49835,1181 49836,83 49836,261 49836,718 49837,1776 49838,779 49838,68069 49838,141912 49839,3804 49840,1149 49841,298 49842,485 49843,3069 49844,1858 49845,1860 49847,483 49848,5366 49849,275 49850,1381 49851,1070 49851,1619 49852,163 49853,973 49854,1983 49855,49856 49855,56106 49855,68641 49855,100669 49855,101156 49855,261422 49857,10 49857,126161 49858,1805 49859,779 49860,2443 49861,49862 49863,2944 49864,107 49865,258 49866,301 49867,704 49869,3 49870,1 49871,289 49871,290 49872,72 49873,344 49874,285 49875,1370 49876,1821 49877,323 49878,996 49879,22 49879,233 49879,596 49881,49882 49883,72 49884,49885 49886,49887 49888,83 49889,312 49890,493 49890,1927 49891,1531 49892,1181 49893,1715 49894,349 49895,323 49896,178 49897,107 49898,392 49899,143 49900,609 49901,49902 49903,9121 49904,500 49905,1116 49906,192 49907,8270 49908,50 49909,273 49909,274 49910,163 49911,647 49912,49913 49914,15748 49915,49916 49915,98297 49917,1715 49918,49919 49920,233 49921,163 49921,310 49921,503 49922,163 49923,577 49924,301 49925,49926 49927,697 49928,163 49929,163 49930,163 49930,827 49931,6661 49932,72 49933,795 49934,7360 49935,893 49936,163 49937,515 49938,163 49939,1411 49939,3804 49940,2605 49941,9029 49942,163 49943,163 49943,579 49944,163 49945,163 49946,1149 49947,1149 49948,660 49949,58 49950,46 49951,762 49952,77 49952,717 49952,784 49953,344 49954,2931 49955,72 49956,58 49957,46 49958,808 49959,87 49959,111 49959,326 49959,347 49959,372 49959,388 49959,392 49959,752 49959,968 49959,1085 49959,1133 49959,1210 49959,1231 49959,1240 49959,1241 49959,1359 49959,1465 49959,1479 49959,1522 49959,1544 49959,2045 49959,2083 49959,3218 49959,3260 49959,5718 49959,31976 49960,493 49960,1127 49962,2296 49963,589 49963,850 49964,49965 49966,49967 49968,861 49969,22 49970,163 49971,1149 49972,485 49973,163 49974,5662 49975,151 49976,1381 49978,32 49978,349 49978,388 49978,392 49978,575 49978,697 49978,1210 49978,2045 49979,861 49980,22 49981,980 49982,366 49983,366 49984,366 49986,1132 49986,1639 49987,163 49988,366 49989,366 49990,431 49991,302 49991,467 49991,1122 49992,366 49993,397 49994,366 49995,163 49996,2775 49997,447 49999,163 50001,160 50001,163 50002,42232 50003,264 50003,14945 50004,202 50004,203 50006,1556 50007,1381 50008,3218 50009,306 50009,307 50010,217 50010,264 50011,7 50011,14989 50012,134 50012,138 50013,1590 50013,68069 50014,868 50015,481 50017,13 50018,657 50019,1132 50020,1449 50020,1688 50021,1882 50022,579 50022,4823 50024,50025 50026,2995 50027,589 50028,79 50029,1313 50030,163 50030,302 50030,344 50030,1087 50031,15573 50032,163 50033,1381 50034,346 50034,1068 50034,2353 50035,25873 50036,192 50038,1149 50039,4411 50040,647 50042,50043 50044,344 50045,72 50047,1019 50048,1019 50049,50043 50050,298 50051,485 50052,140 50053,609 50054,77 50055,640 50056,996 50057,640 50058,163 50059,2646 50059,3209 50060,640 50061,158 50063,497 50064,996 50065,58 50066,46 50067,640 50068,2620 50070,296 50070,1893 50070,3507 50070,7155 50071,1858 50072,1860 50073,996 50074,640 50075,83 50076,509 50078,996 50079,392 50079,1860 50080,640 50082,1509 50083,457 50083,4190 50084,151 50085,1323 50086,102 50087,1326 50088,408 50089,996 50090,337 50090,8332 50091,115 50091,118 50092,6298 50093,996 50094,794 50094,1559 50095,602 50096,911 50096,1559 50097,72 50099,83 50100,1058 50101,301 50102,1858 50103,1860 50104,1635 50104,1955 50105,2045 50106,579 50107,192 50108,422 50109,422 50110,422 50111,422 50112,422 50114,422 50115,1531 50116,251 50117,473 50117,8149 50118,422 50119,422 50120,1556 50121,861 50122,22 50123,493 50123,586 50123,682 50123,72439 50123,189839 50125,422 50126,163 50128,626 50129,1531 50130,251 50132,1782 50133,346 50133,435 50133,447 50133,586 50133,1294 50134,160 50135,1140 50136,3830 50137,827 50138,2668 50139,1659 50140,1572 50141,6661 50141,191355 50142,392 50143,1801 50144,1531 50146,1891 50147,2266 50148,119 50148,1252 50148,1253 50148,1844 50148,3804 50148,6249 50148,21944 50149,388 50150,2923 50150,4190 50151,1556 50152,2979 50154,393 50154,859 50154,980 50154,1531 50155,1531 50156,215 50157,202 50157,203 50157,497 50157,626 50158,26 50158,59 50158,861 50161,158 50161,1001 50161,2646 50162,50163 50164,3804 50165,285 50166,22 50166,992 50167,285 50168,1068 50169,1210 50170,992 50172,505 50172,1096 50173,3367 50174,838 50175,1149 50178,1881 50179,1983 50180,497 50181,497 50182,1572 50182,1722 50183,1556 50184,861 50185,22 50186,392 50186,1151 50186,1572 50186,1722 50187,649 50191,195 50191,1181 50192,1149 50193,2292 50194,192 50194,3507 50195,1590 50196,26 50196,59 50197,843 50198,1509 50199,1149 50200,251 50201,602 50202,1181 50203,240 50203,1285 50205,510 50206,1149 50208,72 50209,2646 50210,644 50210,1836 50212,447 50214,1556 50215,861 50216,22 50217,1149 50221,640 50222,1188 50223,163 50223,302 50223,579 50224,2310 50226,592 50229,65 50230,1313 50232,251 50233,1531 50234,388 50234,2557 50235,861 50236,1556 50237,861 50238,22 50239,481 50240,72 50241,217 50241,310 50241,500 50241,1417 50241,1796 50241,3804 50242,1556 50243,861 50244,22 50245,1096 50246,178 50246,1612 50247,1559 50251,79 50252,3846 50253,1749 50254,3538 50255,338 50256,718 50256,749 50257,251 50258,309 50258,310 50259,68 50259,1782 50260,1556 50261,861 50262,22 50263,1127 50264,360 50265,1149 50266,1010 50266,1479 50267,2048 50268,676 50269,254 50270,192 50272,980 50273,1968 50274,1381 50275,795 50276,393 50276,980 50276,1096 50277,338 50278,333 50279,192 50281,106 50282,957 50284,758 50285,217 50285,455 50285,631 50285,1612 50285,2775 50286,66 50289,4771 50290,415 50291,48 50292,1509 50293,934 50294,2668 50295,749 50296,1556 50297,861 50298,22 50299,58 50300,46 50301,557 50302,602 50303,50304 50305,1210 50306,1821 50307,2995 50308,852 50309,611 50310,273 50310,274 50311,217 50311,1796 50311,3804 50312,364 50314,302 50315,435 50317,500 50319,644 50320,206 50320,1572 50320,50321 50322,264 50324,175 50324,21944 50324,31977 50325,660 50325,1860 50326,20004 50327,726 50328,2353 50328,7143 50329,682 50329,72439 50330,298 50331,1089 50332,690 50333,920 50334,1479 50335,859 50335,1531 50336,623 50337,1140 50337,31896 50339,2784 50340,481 50341,77 50342,609 50343,579 50344,1821 50345,106 50346,333 50348,81 50349,1572 50350,2574 50351,251 50352,2073 50352,2668 50353,104 50354,1590 50355,447 50355,788 50357,1871 50358,397 50359,1210 50359,1639 50360,264 50361,83 50362,1634 50363,273 50363,274 50364,135 50365,718 50366,163 50367,392 50367,809 50368,783 50369,744 50370,3218 50371,1479 50372,211 50374,267 50375,579 50375,1172 50376,333 50377,1001 50378,438 50378,736 50379,1977 50379,1978 50380,302 50381,652 50382,875 50383,79 50384,2421 50385,87 50385,991 50386,818 50387,163 50389,3297 50390,2286 50390,142430 50390,142879 50391,26 50391,59 50392,1181 50393,509 50393,1238 50395,1293 50395,1782 50398,106 50399,954 50399,1939 50399,10318 50400,509 50401,2319 50402,973 50403,934 50405,45437 50407,3069 50408,581 50409,652 50409,1860 50410,2590 50411,1313 50412,178 50413,1007 50414,534 50415,1556 50416,861 50417,22 50418,431 50419,900 50420,275 50420,309 50420,310 50420,809 50420,1266 50420,162599 50421,1 50422,146 50422,336 50423,301 50423,1837 50424,298 50425,485 50426,20 50427,50428 50431,1871 50432,493 50433,32 50434,252 50435,1556 50436,861 50437,22 50438,195 50439,151 50439,1247 50441,337 50443,843 50444,333 50445,86 50445,795 50445,920 50445,934 50445,2367 50446,143 50448,1392 50449,19010 50450,676 50450,745 50451,151 50451,192 50451,309 50451,310 50451,577 50451,1400 50452,147 50452,2244 50452,21826 50453,647 50456,515 50457,50 50458,1858 50459,1860 50461,1590 50462,2244 50463,1068 50464,644 50464,1012 50464,2699 50464,5469 50465,298 50466,485 50467,2373 50468,1474 50469,140 50469,272 50470,996 50471,1556 50472,861 50473,22 50474,1572 50474,1722 50475,996 50476,252 50477,1849 50478,996 50479,996 50480,996 50481,1509 50483,1474 50484,252 50485,996 50486,996 50487,996 50490,1782 50491,2506 50492,2051 50493,459 50493,832 50494,1119 50495,187 50496,4475 50497,50498 50497,160575 50497,259505 50499,309 50499,310 50500,178 50500,447 50500,538 50500,934 50501,1724 50502,1300 50503,301 50503,1300 50504,1893 50505,1474 50506,1381 50507,337 50507,344 50508,1370 50509,1285 50510,250 50510,310 50510,346 50510,1058 50510,1381 50510,1684 50510,3039 50510,29380 50511,1147 50512,106 50513,163 50513,302 50513,579 50515,1474 50516,302 50516,579 50516,861 50517,283 50518,503 50519,1203 50520,58 50521,46 50522,1160 50522,1732 50522,1837 50523,1858 50524,1860 50525,2083 50526,5212 50527,657 50528,1531 50529,805 50530,1474 50531,298 50532,485 50535,818 50536,1608 50537,485 50538,63 50539,500 50540,68 50540,233 50540,420 50540,1818 50542,1010 50542,1849 50542,32784 50543,32 50543,422 50543,1070 50543,118336 50544,1143 50544,1363 50544,14556 50545,14989 50547,160 50548,10 50548,1849 50549,17309 50550,731 50551,68 50553,107 50553,749 50553,893 50553,1146 50554,422 50555,56 50556,1370 50556,2782 50557,811 50558,3409 50560,1531 50561,1001 50562,2083 50563,366 50564,1608 50565,167 50565,818 50566,5987 50567,2083 50568,509 50569,509 50571,97 50572,1983 50574,483 50575,440 50576,41 50576,1608 50577,264 50578,875 50579,99 50580,516 50581,302 50581,579 50582,72 50583,77 50583,1962 50584,211 50585,1284 50586,1803 50587,151 50588,818 50589,1608 50590,83 50590,455 50591,264 50592,171 50593,536 50593,2784 50594,202 50594,203 50595,973 50596,536 50597,86 50598,991 50599,30 50599,1179 50600,1424 50601,149 50604,2867 50604,2868 50604,22880 50605,640 50606,178 50606,358 50607,907 50607,221280 50608,252 50609,516 50609,1454 50610,50611 50612,1284 50613,1634 50614,743 50615,1240 50616,160 50616,337 50616,452 50616,457 50616,586 50616,668 50616,713 50616,784 50616,1262 50616,1332 50616,1368 50616,1572 50616,1796 50616,2701 50616,2915 50617,1634 50618,138 50619,206 50620,1414 50621,980 50622,301 50623,2779 50624,818 50625,949 50626,252 50627,1313 50628,93 50628,94 50629,126 50631,13546 50632,83 50633,1010 50636,1192 50637,4810 50638,1058 50639,48 50640,99 50642,106 50642,497 50642,874 50643,264 50644,1458 50645,1181 50646,626 50647,8270 50648,424 50649,920 50649,1893 50650,215 50651,136 50651,225 50651,248 50651,1368 50652,4078 50653,640 50654,50655 50654,56681 50656,640 50657,6661 50658,849 50659,2083 50660,772 50661,640 50663,640 50664,48 50665,3079 50666,192 50667,44 50668,2674 50669,1531 50670,4060 50671,640 50672,818 50673,2929 50674,859 50675,135 50676,430 50677,32 50677,65 50677,875 50677,2191 50677,5540 50678,1572 50678,1722 50680,50681 50682,1807 50683,192 50683,663 50684,1858 50685,1860 50686,323 50687,850 50688,298 50689,485 50690,349 50690,577 50690,980 50690,27041 50691,1149 50692,827 50693,493 50694,731 50695,3538 50696,3413 50697,525 50698,8270 50699,50700 50701,283 50702,315 50703,312 50704,171 50705,264 50705,1007 50705,3999 50706,50707 50708,996 50709,500 50710,1639 50711,1572 50712,333 50712,500 50712,718 50713,21944 50714,301 50715,94 50715,2787 50716,1381 50717,1265 50717,1266 50718,50719 50720,953 50721,779 50722,1381 50723,102 50724,206 50725,20790 50726,298 50727,485 50728,50729 50730,50731 50730,60096 50732,8788 50733,50734 50735,50736 50735,80117 50737,862 50739,2572 50740,50741 50742,743 50743,931 50744,72 50745,137 50745,557 50746,50747 50748,289 50748,290 50749,206 50750,2944 50751,500 50752,1962 50753,1052 50754,1882 50755,2775 50756,54 50757,2210 50757,4237 50758,50759 50761,1579 50762,2697 50763,50764 50765,50764 50766,5547 50767,1634 50768,72 50769,344 50770,285 50771,50772 50773,50774 50773,75782 50773,77277 50773,78048 50773,78267 50773,81351 50773,87528 50773,114665 50773,118910 50773,123223 50773,123695 50773,123728 50773,124692 50773,125131 50773,126439 50773,128009 50773,128444 50773,128578 50775,304 50776,376 50777,163 50778,8270 50779,2146 50780,50781 50782,652 50783,24505 50784,50785 50784,106885 50784,112766 50784,112846 50784,116297 50784,125355 50784,126578 50784,177316 50784,178926 50786,233 50787,50788 50789,515 50790,50791 50792,366 50793,366 50794,366 50795,366 50796,50797 50798,366 50799,366 50800,366 50801,1639 50802,366 50803,366 50804,366 50805,50806 50807,7652 50808,50809 50811,1608 50812,50813 50812,89408 50814,809 50815,312 50815,510 50816,1019 50816,1467 50817,779 50818,50819 50820,306 50820,307 50821,50822 50821,161511 50823,1531 50824,147 50824,158 50824,73906 50825,83 50826,2506 50827,358 50827,1659 50828,818 50829,83 50830,79 50831,72 50832,344 50833,285 50834,298 50835,485 50836,1983 50837,137 50838,3003 50839,1891 50841,6750 50843,50844 50845,206 50846,107 50847,1452 50849,1452 50850,273 50850,1116 50851,222 50852,34395 50853,50854 50855,251 50856,760 50857,1119 50858,273 50858,274 50859,644 50860,422 50861,1844 50861,2782 50862,298 50863,485 50864,171 50866,50867 50868,1204 50869,595 50869,1453 50870,364 50871,649 50872,50873 50874,5662 50875,1240 50876,79 50876,1052 50877,850 50878,1007 50879,818 50879,1151 50879,60445 50879,60446 50879,60449 50879,60450 50879,60451 50879,60452 50879,60453 50879,60454 50879,60455 50879,60456 50879,60462 50879,60474 50879,60479 50879,60480 50879,60491 50879,60646 50879,60647 50879,60648 50879,60659 50879,60662 50879,61229 50879,61367 50879,61371 50879,61384 50879,61392 50879,61395 50879,61404 50879,61414 50880,3079 50881,649 50882,2367 50883,50884 50885,393 50885,1531 50885,4545 50885,139010 50886,2646 50888,256 50889,21944 50890,596 50891,1893 50892,50893 50894,1210 50895,1082 50896,3 50896,609 50897,3447 50898,17228 50899,292 50901,50902 50903,1210 50904,2244 50905,50906 50907,50908 50909,3846 50910,312 50910,592 50911,483 50912,3161 50913,805 50914,349 50915,50916 50917,50918 50919,72 50920,338 50920,462 50920,710 50920,1893 50921,954 50921,10318 50922,30 50922,772 50922,954 50922,10318 50922,198024 50923,585 50924,151 50925,50926 50925,102013 50925,259172 50927,358 50928,1149 50930,481 50931,1359 50932,275 50933,907 50934,602 50934,3218 50934,4866 50935,143 50936,3413 50937,1707 50938,309 50938,310 50939,1882 50939,2210 50940,50941 50942,718 50942,893 50942,1359 50944,874 50945,4066 50946,3069 50947,160 50948,3370 50948,14453 50949,1313 50951,874 50952,50953 50954,1179 50955,302 50955,310 50956,10 50957,376 50958,21487 50959,50960 50961,1639 50962,406 50963,50964 50963,52374 50963,53354 50963,53440 50963,55511 50963,70453 50963,77295 50963,77526 50963,82533 50963,82550 50963,83324 50963,90052 50963,93419 50963,96379 50963,103928 50963,104130 50963,107068 50963,107359 50963,108831 50963,109731 50963,195184 50965,14483 50966,8180 50967,447 50968,2146 50969,2775 50970,447 50971,5405 50972,439 50973,1402 50974,1509 50975,8270 50976,50977 50978,6068 50979,1805 50981,58 50982,46 50983,1767 50984,652 50985,272 50986,1102 50987,167 50987,392 50987,433 50987,595 50987,809 50987,818 50987,872 50987,1151 50987,1210 50987,1238 50987,1453 50987,3258 50987,127158 50988,158 50989,50990 50991,158 50992,7358 50992,7363 50993,1452 50994,6682 50995,589 50996,589 50997,50998 50999,254 51000,592 51001,1368 51003,23701 51004,2929 51005,51006 51007,9121 51008,953 51009,51010 51011,1188 51012,615 51013,289 51013,290 51014,261 51015,9025 51016,68 51017,2697 51018,1955 51019,195 51020,51021 51022,51023 51024,178 51025,51026 51025,52748 51025,103648 51027,2995 51028,51029 51030,6068 51031,1102 51032,51033 51034,6027 51035,447 51036,302 51037,51038 51039,51040 51041,51040 51042,51043 51044,932 51045,1983 51046,462 51047,31977 51047,54494 51047,58769 51047,61536 51047,69295 51047,94609 51047,101641 51047,111283 51047,114258 51047,119756 51049,1509 51050,51051 51052,51053 51054,525 51055,7360 51056,801 51057,1146 51059,51060 51061,1353 51062,2944 51063,51064 51065,500 51066,366 51067,25873 51068,72 51070,3209 51071,489 51072,51073 51074,383 51075,2995 51076,15573 51077,2178 51077,4545 51078,51079 51081,3413 51083,72 51084,344 51085,285 51086,2436 51087,1531 51088,1767 51089,953 51090,51091 51090,68069 51090,82878 51090,86832 51090,95251 51090,100380 51090,198574 51090,219231 51092,158 51093,652 51094,3069 51095,3872 51096,7358 51096,7363 51097,51098 51097,53415 51097,53547 51097,53972 51097,82479 51097,83318 51099,2697 51100,51101 51102,51103 51104,406 51104,435 51105,81 51106,51107 51108,72 51109,1210 51110,7124 51111,1858 51112,1414 51113,953 51114,2995 51115,51116 51118,366 51119,366 51120,366 51121,366 51123,2048 51124,151 51125,272 51126,79 51126,192 51126,217 51126,222 51126,973 51126,1118 51126,1417 51127,1133 51128,51129 51131,184 51132,392 51133,340 51135,306 51135,307 51136,51137 51138,26 51138,59 51139,1033 51140,859 51141,859 51142,99 51143,167 51143,299 51144,760 51145,83 51146,1238 51146,9542 51146,21944 51147,422 51148,56 51149,422 51150,422 51151,422 51152,422 51153,422 51154,422 51155,422 51156,652 51157,611 51158,273 51158,274 51159,1556 51160,2506 51161,2506 51162,1 51162,94 51162,206 51162,2787 51163,87 51164,1767 51165,1844 51165,51166 51165,85471 51165,86563 51165,90623 51165,96352 51167,1201 51168,1893 51169,79 51170,175 51170,206 51171,392 51171,623 51172,1858 51173,1860 51174,932 51175,818 51176,160 51176,736 51176,1127 51176,1893 51176,49057 51177,312 51178,1381 51179,1722 51180,644 51181,1893 51182,4 51182,5 51183,527 51184,447 51185,1116 51186,664 51186,20359 51187,63 51187,217 51187,588 51187,590 51187,1143 51187,3260 51187,51188 51187,52252 51187,60749 51187,69411 51187,78317 51187,80315 51187,82800 51187,84675 51187,87700 51187,88046 51187,89365 51187,89777 51187,108952 51187,156993 51187,157245 51187,159893 51187,160234 51187,171235 51187,213151 51187,213597 51187,219440 51187,221715 51187,222046 51187,231440 51187,235585 51189,51190 51191,393 51192,72 51193,344 51194,285 51195,3538 51196,72 51197,344 51198,285 51199,1381 51199,1452 51200,217 51200,51201 51200,57077 51200,57485 51200,68507 51200,70655 51200,83779 51200,91154 51200,94554 51200,95949 51200,96121 51200,96386 51200,96925 51200,100000 51200,100840 51200,112198 51200,112224 51200,115922 51200,120317 51200,122352 51200,134522 51200,147319 51200,153735 51200,170303 51200,171964 51200,172271 51200,174445 51200,181295 51200,182716 51200,218885 51200,219082 51200,220616 51200,229367 51200,235411 51200,235781 51200,240057 51200,249661 51200,249800 51200,263537 51202,72 51203,2828 51204,51205 51206,120 51207,72 51208,344 51209,285 51210,87 51210,312 51211,120 51212,171 51213,51214 51215,1782 51216,51216 51217,872 51218,1014 51219,51220 51221,51220 51222,1 51223,1241 51224,7117 51225,51226 51227,586 51228,51229 51228,64456 51228,67599 51228,77324 51228,86832 51228,103233 51228,112131 51230,51231 51230,129424 51232,1414 51233,1572 51234,907 51235,1556 51236,663 51236,664 51237,136 51238,20359 51239,872 51240,2411 51241,1858 51242,1860 51243,51244 51245,26 51245,59 51245,3794 51246,151 51247,640 51248,51249 51250,51251 51252,240 51252,2372 51253,269 51253,30331 51254,51255 51256,72 51257,652 51257,1968 51258,26 51258,59 51258,21944 51259,557 51260,79 51260,147 51260,192 51260,195 51260,206 51260,503 51260,1181 51261,697 51262,72 51263,20813 51264,211 51264,664 51265,240 51265,264 51265,818 51266,151 51267,1043 51268,51269 51270,809 51271,6068 51272,278 51273,1531 51274,206 51274,788 51274,4611 51275,86 51276,51277 51278,44 51280,51281 51282,51283 51282,53907 51284,872 51285,344 51286,195 51287,417 51289,868 51290,850 51291,72 51292,376 51293,743 51294,557 51295,557 51296,557 51297,8719 51298,138 51299,865 51300,557 51301,137 51302,21944 51303,118 51303,4597 51304,8719 51305,138 51306,865 51307,557 51308,137 51309,21944 51310,118 51310,4597 51311,8719 51312,138 51313,865 51314,557 51315,137 51316,21944 51317,118 51317,4597 51318,8719 51319,138 51320,865 51321,557 51322,137 51323,21944 51324,118 51324,4597 51325,6051 51326,358 51327,1119 51328,298 51329,485 51330,1285 51331,51332 51333,2367 51334,2590 51335,1531 51336,8788 51337,2351 51338,68 51339,7 51340,51341 51340,54526 51340,71118 51340,77325 51342,187 51343,1072 51344,51345 51346,51345 51347,516 51348,1801 51349,9560 51350,51351 51352,50960 51353,298 51354,485 51355,818 51356,81 51357,919 51358,4823 51359,240 51359,269 51359,818 51359,1210 51359,17309 51359,127158 51360,261 51361,97 51362,5440 51363,202 51363,203 51364,718 51365,192 51366,17334 51367,932 51368,7652 51369,6068 51370,483 51371,240 51372,626 51372,652 51372,931 51372,4355 51373,652 51374,929 51375,1102 51377,51376 51378,51379 51378,87552 51380,51381 51382,7652 51383,953 51384,652 51385,31977 51386,589 51387,3872 51388,7358 51388,7363 51389,2797 51390,447 51391,1019 51392,1767 51393,1767 51394,8270 51395,1102 51396,1414 51397,657 51398,1515 51399,31934 51400,500 51401,366 51402,14989 51403,171 51404,628 51405,22 51406,51407 51408,850 51409,167 51410,158 51410,779 51412,233 51413,336 51413,626 51413,1082 51413,1732 51413,2868 51413,3999 51414,366 51416,8270 51417,1531 51418,51419 51418,126628 51420,63 51422,306 51422,307 51423,87 51423,372 51424,50 51425,158 51426,298 51427,137 51428,1058 51429,83 51430,1247 51432,51432 51433,143 51434,240 51435,50960 51436,51437 51438,94 51438,184 51438,2787 51439,422 51440,422 51441,422 51442,422 51443,422 51444,422 51445,422 51446,422 51447,4611 51448,1181 51449,4611 51450,2995 51451,626 51452,48 51453,51454 51453,68069 51453,78313 51453,82200 51453,83797 51453,90534 51453,111680 51455,51456 51455,155619 51457,51458 51459,51460 51461,389 51462,261 51464,932 51465,120 51465,261 51466,195 51467,2334 51468,298 51469,485 51470,344 51472,51473 51474,261 51475,328 51476,1001 51477,1001 51478,953 51479,136 51480,83 51481,779 51482,1556 51483,920 51484,7 51485,509 51486,51487 51488,51489 51488,78290 51488,83942 51488,84336 51488,89009 51488,89379 51488,93855 51488,104834 51488,105990 51488,106829 51488,108867 51488,116650 51488,118807 51488,121094 51488,121819 51488,194006 51490,872 51491,392 51492,312 51492,652 51493,51494 51495,51496 51497,615 51498,240 51499,1462 51499,8537 51500,51501 51503,120 51503,503 51503,4066 51504,973 51505,120 51505,261 51505,694 51505,32751 51506,206 51507,872 51508,195 51509,843 51509,3089 51510,473 51510,8149 51511,2351 51512,3876 51513,4611 51514,483 51515,941 51516,872 51517,299 51518,3413 51519,622 51520,779 51521,779 51522,875 51524,51525 51524,76400 51524,83854 51526,9560 51527,1776 51528,298 51529,450 51530,8270 51531,44 51532,1381 51532,1551 51532,51533 51534,1556 51535,861 51536,22 51537,1298 51538,1046 51538,2334 51540,972 51541,7360 51542,1181 51543,433 51544,51545 51544,56870 51544,86290 51546,51547 51548,801 51550,644 51551,312 51552,1782 51555,4611 51556,379 51557,10 51557,113156 51560,592 51561,72 51562,4192 51562,4193 51563,1767 51564,273 51564,274 51564,1070 51565,4611 51566,273 51566,274 51566,1070 51567,30766 51568,868 51569,51570 51571,1179 51572,1968 51573,366 51574,366 51575,366 51576,2995 51577,51578 51579,51580 51582,1860 51583,51584 51585,240 51587,7194 51587,138686 51588,175 51588,7194 51589,7194 51589,138686 51590,1052 51590,1515 51590,5101 51591,292 51592,51593 51594,15573 51595,346 51596,51597 51598,51599 51601,376 51602,68 51603,3069 51604,51605 51606,51607 51606,56693 51608,51609 51610,51611 51612,51613 51615,72 51617,233 51618,10 51619,310 51620,805 51621,1803 51622,3246 51622,3247 51623,107 51624,2416 51624,2417 51625,292 51626,338 51627,298 51628,626 51629,1133 51630,3538 51631,275 51632,51633 51634,51635 51636,51635 51637,515 51637,1033 51638,1659 51639,27550 51640,211 51641,1515 51642,298 51643,485 51644,875 51646,51647 51648,51647 51649,577 51651,171 51652,222 51652,1019 51652,113481 51653,298 51654,485 51655,687 51656,26 51656,59 51656,21944 51657,86 51658,1556 51659,211 51660,932 51661,3260 51662,1454 51663,104 51665,278 51666,390 51666,1085 51667,104 51668,51669 51670,104 51671,104 51672,240 51672,2083 51673,1381 51674,8788 51675,51676 51677,2775 51678,447 51679,31977 51681,130 51682,358 51683,1010 51685,258 51686,206 51687,2506 51688,2506 51689,51690 51691,302 51691,538 51692,195 51693,51694 51695,483 51696,21487 51697,299 51698,1072 51699,202 51699,203 51701,3999 51702,312 51703,647 51704,1858 51705,1860 51706,51707 51708,202 51709,51710 51711,51712 51711,72719 51711,83173 51713,422 51714,56 51715,8868 51716,422 51717,56 51718,392 51718,809 51719,186 51719,3804 51720,333 51722,27215 51723,51724 51725,346 51726,1882 51727,312 51727,392 51727,127158 51728,167 51729,376 51730,72 51731,10 51732,51733 51735,21944 51736,21944 51736,87772 51736,116235 51737,21944 51738,219 51739,330 51739,349 51739,783 51739,2572 51739,3538 51740,51741 51742,22293 51743,931 51744,346 51745,195 51746,360 51747,1353 51748,557 51749,557 51750,862 51751,5906 51752,557 51753,626 51754,278 51755,137 51756,862 51757,5906 51758,557 51759,626 51760,278 51761,137 51762,862 51763,557 51764,557 51765,1858 51766,1860 51767,1801 51768,1623 51769,1858 51770,1860 51771,51772 51773,19227 51774,217 51775,3474 51776,51777 51778,51779 51778,56825 51778,68866 51778,77276 51778,82015 51778,84122 51778,101464 51778,102950 51778,104968 51778,112184 51778,120963 51780,51781 51782,422 51783,56 51784,21944 51785,3413 51786,72 51787,344 51788,285 51789,28294 51790,72 51791,1149 51792,51793 51794,694 51794,784 51794,1353 51794,162599 51797,1305 51798,1151 51799,217 51800,51801 51802,206 51803,1773 51804,51805 51806,323 51807,51808 51807,90781 51807,97576 51807,119582 51807,120693 51807,124646 51807,126333 51807,128302 51807,128596 51807,129126 51807,130089 51807,130956 51807,141450 51809,422 51810,56 51811,51812 51813,422 51814,422 51815,422 51816,422 51817,422 51818,422 51819,422 51820,422 51821,422 51822,51823 51824,422 51825,56 51826,51827 51828,581 51829,5375 51830,51831 51832,422 51833,56 51834,51835 51836,1381 51838,126 51839,292 51840,294 51841,296 51842,298 51843,3069 51844,4597 51846,323 51847,2210 51847,4237 51848,640 51849,51850 51851,872 51853,872 51854,301 51855,3148 51856,87 51858,51859 51860,51861 51862,51863 51862,52531 51862,53339 51862,74605 51862,86663 51862,98847 51862,98934 51862,102162 51862,105063 51862,106029 51862,199149 51865,51866 51867,491 51868,579 51869,51870 51871,77 51872,72 51873,868 51873,1556 51874,634 51875,207 51876,1132 51877,781 51878,51879 51880,332 51880,657 51880,873 51880,1210 51880,2266 51880,5667 51881,1381 51882,163 51883,760 51884,252 51884,337 51884,457 51885,2607 51886,843 51887,51888 51889,167 51889,2083 51890,1151 51891,51892 51893,163 51893,579 51894,252 51894,318 51896,760 51897,255 51898,1556 51899,647 51900,51901 51902,306 51902,307 51903,671 51904,497 51905,668 51906,252 51907,163 51907,579 51908,51909 51910,1323 51911,102 51912,1326 51913,408 51914,934 51915,51916 51917,301 51919,818 51920,1509 51921,818 51924,392 51925,34 51925,35 51925,818 51925,1796 51926,358 51926,3409 51927,344 51928,875 51929,818 51930,1556 51931,1556 51932,717 51934,83 51935,4453 51936,875 51937,135 51938,312 51938,535 51939,1149 51940,1556 51941,1968 51943,1381 51944,68 51945,72 51946,344 51947,285 51948,577 51949,51950 51951,298 51952,485 51953,406 51954,309 51954,310 51954,929 51954,1566 51956,72 51957,344 51958,285 51959,222 51960,626 51962,240 51963,388 51964,51965 51966,485 51967,58 51967,1140 51968,72 51969,344 51970,285 51971,1531 51972,417 51972,852 51972,1085 51972,3623 51972,75912 51972,185874 51975,497 51976,515 51977,186 51977,264 51977,3367 51978,1639 51980,3 51981,808 51981,2424 51982,72 51984,1556 51985,861 51986,22 51987,51988 51989,485 51989,717 51989,861 51990,97 51991,338 51991,462 51991,710 51991,1893 51992,2867 51992,2868 51992,22880 51995,192 51995,346 51995,538 51996,83 51997,51998 51999,171 52000,83 52001,644 52002,44 52003,192 52004,1608 52006,20 52007,52008 52009,298 52010,485 52011,422 52012,56 52013,192 52014,579 52015,809 52017,119 52018,3 52019,2867 52019,22880 52020,875 52021,1014 52021,1623 52022,1858 52023,1860 52024,1509 52025,422 52026,56 52027,52028 52029,52028 52030,433 52031,52032 52033,417 52033,805 52033,1085 52033,1749 52033,1818 52033,2286 52033,2620 52034,298 52035,485 52036,2443 52037,1579 52038,2274 52039,736 52040,298 52041,485 52042,72 52043,58 52044,46 52045,52046 52047,1368 52048,433 52048,687 52048,1556 52049,3209 52050,703 52051,736 52052,592 52053,217 52054,261 52055,775 52055,1411 52056,104 52057,72 52058,344 52059,285 52060,3297 52062,525 52063,392 52063,1769 52064,500 52066,2867 52066,2868 52066,22880 52067,299 52067,1010 52067,1122 52067,1849 52067,3207 52068,743 52069,160 52070,1623 52071,4 52071,5 52072,390 52073,3451 52073,3452 52074,17593 52075,3209 52076,65 52077,467 52077,868 52077,1556 52078,309 52078,310 52079,72 52080,344 52081,285 52082,805 52084,440 52085,192 52086,406 52087,72 52088,344 52089,285 52090,1556 52091,907 52092,41 52092,200 52093,1858 52094,1860 52095,52096 52097,309 52097,310 52098,346 52099,417 52100,34 52100,35 52101,366 52102,366 52102,15119 52104,72 52104,137 52107,4101 52109,366 52111,240 52112,37 52113,2319 52116,417 52117,3260 52118,217 52118,536 52119,3413 52123,37 52123,1782 52124,1016 52125,1052 52125,2156 52126,192 52126,366 52127,435 52128,346 52130,18726 52133,163 52134,626 52134,852 52135,346 52136,346 52137,1287 52138,151 52139,875 52140,602 52141,1210 52142,1 52142,1127 52143,772 52145,483 52147,1556 52148,861 52149,22 52150,134 52151,247 52152,818 52153,10 52153,818 52153,31977 52154,431 52155,346 52156,83 52156,285 52156,949 52156,2779 52156,2784 52157,850 52158,83 52159,389 52160,609 52161,424 52162,376 52163,1326 52165,52166 52167,52168 52169,72 52170,30 52171,285 52171,406 52171,620 52171,779 52171,1515 52172,247 52172,2867 52172,22880 52173,2292 52174,579 52175,920 52176,275 52177,862 52178,27041 52179,52180 52181,346 52182,392 52183,4805 52184,376 52185,885 52186,1983 52187,694 52188,301 52188,189303 52189,10 52190,86 52190,1070 52190,1313 52190,2089 52190,2940 52190,21944 52190,43203 52190,52232 52190,144556 52191,250 52191,1684 52192,261 52193,673 52193,818 52194,392 52195,1010 52197,1623 52198,557 52199,557 52200,1773 52202,134 52204,1773 52205,832 52206,372 52206,1001 52207,516 52208,390 52209,1773 52210,104 52210,292 52210,1274 52211,52212 52213,72 52214,736 52215,52216 52217,4895 52218,147 52218,306 52218,307 52218,406 52218,585 52218,779 52218,1181 52220,52221 52222,736 52223,1411 52223,1564 52224,50 52225,52226 52227,52228 52229,852 52230,310 52231,8854 52233,2574 52235,151 52235,1332 52235,3724 52236,240 52237,267 52238,83 52239,682 52240,52241 52240,62138 52240,67632 52240,81388 52240,119952 52240,124201 52240,127454 52242,52243 52244,4903 52245,1608 52246,973 52247,72 52248,344 52249,285 52250,267 52251,81 52254,10 52255,289 52255,290 52256,2048 52257,290 52257,859 52258,1046 52259,250 52259,1684 52260,52261 52261,52261 52262,8992 52263,2244 52264,2146 52265,1977 52265,1978 52266,592 52267,1773 52268,147 52269,52270 52271,233 52272,52273 52274,52275 52276,850 52277,779 52278,163 52279,52280 52281,473 52282,104 52284,3246 52284,3247 52285,72 52286,344 52287,285 52288,366 52289,872 52290,366 52291,366 52293,366 52294,195 52295,2867 52295,22880 52297,366 52299,366 52300,366 52301,366 52302,366 52304,366 52305,366 52310,289 52310,290 52313,264 52315,52316 52318,7652 52321,52322 52323,52324 52325,192 52326,515 52327,652 52328,215 52329,2931 52330,1767 52331,1858 52332,1860 52333,306 52333,307 52334,4611 52335,1544 52336,1 52337,397 52338,3447 52339,192 52340,158 52341,54 52341,68 52341,99 52341,1238 52341,1891 52341,1973 52341,2315 52342,192 52343,919 52343,1240 52343,5469 52344,52345 52346,579 52347,617 52347,784 52347,1146 52347,1368 52347,2565 52347,22835 52347,38144 52347,65395 52347,70032 52348,83 52350,433 52351,392 52351,1860 52352,163 52353,3872 52354,1133 52355,346 52356,623 52359,7358 52359,7363 52360,4475 52360,8992 52361,599 52362,87 52363,2697 52364,1673 52365,6051 52366,52367 52368,1882 52369,626 52370,818 52372,1058 52373,8270 52375,3467 52376,714 52377,163 52378,477 52378,2168 52378,4672 52379,433 52380,83 52381,3252 52382,34 52382,35 52383,15179 52384,953 52385,953 52386,195 52387,602 52388,7652 52389,1688 52390,309 52390,310 52391,818 52393,111 52393,203 52394,34 52394,4193 52394,19227 52395,874 52396,1452 52397,1688 52398,52399 52400,202 52400,203 52401,136 52402,994 52403,973 52403,1732 52404,344 52405,2460 52406,932 52407,302 52408,1210 52409,1619 52410,510 52412,953 52414,510 52415,312 52416,3209 52417,151 52418,422 52419,422 52420,422 52421,422 52422,422 52423,422 52424,862 52424,1181 52425,1276 52426,422 52427,298 52428,485 52429,422 52430,422 52431,137 52432,919 52433,86 52433,586 52433,1267 52434,3447 52435,130 52436,1287 52437,79 52437,178 52437,538 52437,4455 52439,14472 52440,312 52441,130 52441,19413 52442,644 52443,509 52443,1453 52444,298 52445,264 52446,4066 52447,3370 52447,14453 52448,1313 52449,225 52450,195 52451,3960 52452,215 52452,1882 52453,326 52453,586 52453,1345 52455,452 52455,2206 52456,211 52457,302 52458,163 52460,1724 52461,1556 52462,861 52463,22 52464,1556 52465,861 52466,22 52468,406 52469,192 52470,195 52471,72 52472,344 52473,285 52474,252 52475,104 52476,859 52477,290 52477,3798 52478,1046 52480,298 52482,801 52483,163 52484,2351 52485,8788 52486,15573 52487,1414 52488,862 52488,3367 52488,5911 52491,1058 52492,510 52493,217 52493,1796 52493,3804 52494,58 52495,46 52496,72 52497,344 52498,285 52500,192 52500,406 52501,1556 52502,1556 52503,9195 52504,72 52505,779 52506,366 52507,5366 52508,72 52509,1531 52510,247 52511,3252 52512,1818 52513,6263 52514,298 52515,485 52516,52517 52518,602 52519,202 52519,203 52520,2944 52520,148742 52522,358 52523,588 52523,590 52523,1590 52523,1893 52523,9003 52524,1014 52525,27773 52526,483 52527,3246 52527,3247 52528,46 52528,972 52528,973 52528,1284 52529,7652 52530,779 52532,1715 52533,403 52533,861 52534,202 52534,203 52534,372 52535,2146 52537,151 52538,240 52538,289 52538,290 52538,298 52538,417 52538,609 52538,2205 52538,2206 52538,2296 52538,2572 52538,3474 52538,3623 52538,4475 52538,8180 52538,21711 52539,167 52539,186 52539,240 52539,372 52539,435 52539,818 52539,1085 52539,1181 52539,1298 52539,1309 52539,1531 52539,1807 52539,2797 52539,81233 52539,127158 52540,1858 52541,1860 52542,875 52543,364 52544,52545 52546,2244 52547,1231 52548,52549 52550,178 52551,346 52551,516 52551,1462 52551,3804 52551,8537 52552,862 52553,44 52554,6051 52555,147 52556,3960 52557,346 52558,1715 52559,392 52559,918 52560,192 52560,202 52560,203 52560,422 52560,516 52561,1287 52562,72 52563,1 52564,953 52565,52566 52567,376 52568,83 52569,640 52570,47 52570,2469 52571,4066 52572,217 52573,586 52574,1767 52575,72 52576,192 52577,557 52578,557 52579,1572 52580,178 52581,68 52582,8180 52583,743 52584,7416 52585,68 52585,240 52585,1745 52585,1955 52585,11147 52586,10 52587,346 52588,10 52589,577 52590,383 52591,72 52592,52593 52592,69731 52594,72 52595,83 52595,304 52595,467 52595,861 52595,868 52595,1590 52595,162599 52596,622 52597,72 52598,143 52599,4810 52600,72 52601,149 52602,4594 52603,877 52604,10 52605,52606 52607,3295 52608,178 52609,346 52610,1707 52611,581 52612,72 52613,344 52614,285 52615,305 52616,211 52616,718 52617,671 52618,640 52619,640 52620,850 52621,3949 52622,306 52622,307 52622,682 52622,72439 52623,2205 52623,2206 52623,33424 52624,338 52625,640 52626,3295 52627,640 52628,72 52629,644 52630,744 52631,3218 52632,783 52633,1479 52634,52635 52636,292 52637,2506 52638,72 52639,52640 52641,336 52642,52643 52642,104096 52642,104653 52642,129239 52642,130113 52642,130617 52642,133310 52642,136636 52642,165054 52644,72 52645,2923 52646,1531 52647,278 52648,1556 52649,861 52650,22 52651,52652 52654,366 52655,366 52656,366 52657,366 52658,366 52659,366 52660,366 52661,366 52662,875 52663,640 52664,417 52665,72 52666,72 52667,346 52668,2574 52669,1711 52670,346 52671,640 52672,850 52672,972 52672,3246 52672,3247 52673,346 52674,1452 52675,83 52676,302 52676,388 52676,1085 52677,1179 52678,52679 52680,346 52681,72 52682,17228 52684,52685 52686,392 52687,3321 52688,52689 52690,2073 52691,83 52693,52694 52696,1718 52697,52698 52699,346 52700,358 52701,611 52702,1353 52703,346 52704,10 52705,422 52706,827 52707,72 52708,1634 52709,52710 52709,100394 52709,201129 52712,640 52713,72 52714,346 52715,202 52715,203 52716,346 52717,2411 52718,52719 52720,779 52720,1385 52720,6487 52720,52721 52720,68069 52720,81025 52720,81461 52720,82013 52720,83227 52720,83690 52720,92729 52720,94925 52720,96140 52720,96277 52720,100635 52720,104684 52720,107682 52720,109447 52720,111399 52720,111910 52720,114963 52720,116359 52720,116643 52720,117216 52720,124730 52720,125762 52720,126426 52720,126860 52720,129515 52720,130131 52720,130603 52720,131720 52720,132161 52720,139107 52720,141504 52720,147229 52720,149801 52720,161781 52720,169575 52720,169778 52720,184276 52720,228837 52720,239227 52720,242661 52720,242673 52722,346 52723,31060 52724,1634 52725,32475 52726,233 52727,312 52728,872 52729,626 52730,515 52731,312 52731,3695 52732,779 52733,81 52734,355 52735,19986 52737,693 52738,577 52739,23011 52740,52741 52742,832 52743,52744 52745,52746 52747,832 52749,660 52750,306 52750,307 52751,301 52751,379 52752,379 52753,379 52754,1323 52755,102 52756,1326 52757,408 52758,1882 52759,346 52760,52761 52762,346 52763,346 52764,577 52765,312 52766,346 52767,818 52768,83 52770,41 52770,1177 52771,433 52772,1118 52773,907 52774,298 52775,485 52776,704 52777,389 52778,2506 52779,1715 52780,298 52781,485 52782,52783 52782,65373 52784,346 52785,52786 52787,52788 52789,2178 52789,4545 52790,726 52790,37414 52791,1309 52792,72 52792,3695 52793,52794 52793,91211 52793,200837 52795,309 52795,310 52795,1888 52796,1836 52797,137 52797,5405 52798,929 52798,1509 52799,58 52800,46 52801,264 52802,182 52803,4 52803,5 52804,581 52805,298 52806,609 52807,52808 52809,493 52810,258 52811,312 52811,1722 52811,3538 52812,1146 52813,758 52814,1572 52815,1238 52816,52817 52818,26 52818,59 52819,592 52820,392 52821,140 52821,515 52821,191860 52822,52823 52822,61834 52822,65297 52825,52826 52827,52826 52828,52826 52829,18726 52830,163 52831,749 52832,52833 52832,53308 52832,85357 52832,116154 52832,119973 52832,124321 52832,133874 52832,147531 52834,10 52835,83 52836,52837 52838,3507 52839,240 52840,1579 52841,1639 52842,406 52843,309 52843,310 52844,1122 52845,640 52846,422 52847,1231 52848,137 52849,344 52849,4823 52850,515 52852,3370 52852,14453 52853,52854 52855,406 52856,850 52857,2351 52858,298 52859,314 52859,779 52860,872 52861,493 52862,1564 52862,1818 52862,3630 52863,298 52864,485 52865,609 52866,146 52867,406 52868,652 52869,52870 52871,52872 52873,72 52874,644 52875,52876 52877,422 52878,422 52879,422 52880,422 52881,422 52882,422 52883,422 52884,424 52885,1844 52886,676 52887,178 52888,957 52888,1815 52889,298 52890,485 52891,21944 52892,52893 52894,4 52894,5 52895,422 52896,779 52897,187 52898,52899 52900,138 52901,52902 52901,52903 52902,3507 52904,376 52905,312 52906,3413 52907,687 52908,717 52908,1782 52909,1556 52910,861 52911,22 52912,1522 52913,485 52914,52915 52916,255 52919,233 52919,240 52920,81 52921,779 52922,911 52922,20757 52923,2979 52924,206 52926,158 52926,252 52926,622 52927,3804 52928,77 52929,515 52930,50 52931,1247 52932,1740 52933,3193 52934,2048 52935,87 52935,372 52936,393 52937,326 52937,579 52938,151 52939,255 52940,255 52941,483 52942,1715 52943,602 52944,149 52945,1715 52947,3467 52948,3328 52949,2506 52950,2506 52951,422 52952,56 52953,106 52954,503 52955,1326 52956,52957 52958,136 52959,4637 52960,81 52961,247 52962,346 52963,195 52963,217 52963,657 52964,289 52964,290 52964,94134 52965,259 52966,7614 52967,52968 52969,79 52970,628 52970,859 52971,178 52972,592 52973,602 52975,167 52975,2557 52975,2979 52976,58 52978,217 52979,631 52980,184 52981,1085 52982,52983 52984,1085 52985,1149 52986,72 52987,1891 52988,422 52989,56 52990,72 52991,1893 52992,52993 52994,1257 52995,2178 52995,4545 52996,626 52997,20 52998,704 52999,10 53000,187 53001,3328 53002,3467 53003,3148 53004,332 53005,920 53006,15068 53007,77 53008,53009 53010,285 53010,518 53011,1509 53012,2590 53013,53014 53013,101963 53015,3413 53017,99 53018,874 53019,704 53020,1132 53021,206 53022,72 53023,1462 53023,8537 53024,3724 53025,53026 53027,972 53028,2590 53029,1782 53030,192 53030,333 53030,1181 53030,4192 53030,4193 53031,1181 53031,4193 53032,106 53033,1 53033,184 53034,21944 53035,874 53036,358 53037,1544 53038,640 53039,640 53040,310 53041,53042 53041,100803 53043,536 53043,1274 53044,344 53045,53046 53047,292 53050,53051 53052,53053 53054,53055 53054,62061 53056,53057 53058,346 53059,392 53060,1016 53061,195 53062,53063 53064,53065 53067,1313 53068,53069 53070,2574 53071,53072 53073,3161 53074,1782 53075,227 53076,636 53077,53078 53079,1058 53080,714 53081,2506 53082,326 53083,53084 53085,1363 53086,240 53087,53088 53089,53090 53091,1531 53092,53093 53094,640 53095,53096 53095,85624 53095,101114 53095,126548 53095,129468 53095,157810 53095,161045 53095,168253 53095,173660 53097,1118 53099,53100 53101,304 53102,671 53103,1 53103,94 53103,795 53103,2787 53103,30331 53104,53105 53106,309 53106,310 53107,500 53108,366 53109,3872 53110,640 53111,2797 53112,1247 53113,53114 53113,63773 53113,93747 53115,233 53116,126 53116,202 53116,203 53116,479 53116,1392 53116,3872 53116,4192 53116,4193 53116,17228 53117,65 53119,3999 53120,515 53122,485 53123,872 53124,805 53125,72 53126,355 53127,1644 53128,438 53129,859 53130,72 53131,668 53133,346 53134,720 53134,907 53135,147 53136,366 53137,366 53138,366 53139,366 53140,366 53142,366 53143,312 53144,366 53145,366 53146,366 53147,366 53148,366 53149,366 53150,366 53151,366 53152,366 53153,366 53154,779 53156,306 53156,307 53157,516 53158,209 53158,1014 53160,346 53161,217 53162,18726 53163,163 53164,14434 53165,872 53167,147 53167,493 53167,1247 53168,83 53169,809 53169,6726 53171,6750 53172,53173 53174,1043 53175,358 53176,346 53177,1 53178,581 53179,3370 53179,14453 53180,346 53181,872 53182,1160 53182,1381 53182,103860 53183,422 53184,72 53185,1983 53186,644 53188,3138 53189,483 53190,72 53191,17263 53192,1962 53193,676 53194,72 53195,1977 53195,1978 53198,187 53199,1381 53200,3 53200,1392 53201,178 53202,72 53203,192 53203,302 53203,1231 53203,1313 53203,1425 53203,4237 53203,142405 53203,182162 53204,10 53204,184 53204,306 53204,307 53204,772 53204,801 53204,1140 53204,2443 53204,3474 53205,3413 53206,1 53206,1127 53206,1619 53206,1707 53207,58 53208,46 53209,53210 53211,818 53212,333 53213,53214 53215,18726 53216,163 53218,5440 53219,994 53220,151 53221,137 53222,1707 53223,1891 53224,996 53225,2048 53227,4475 53228,1285 53229,2506 53231,53232 53233,509 53233,510 53234,53235 53236,195 53238,349 53239,207 53240,376 53241,439 53242,349 53243,292 53244,19010 53245,255 53246,31977 53247,158 53247,206 53248,21944 53249,34 53249,35 53249,250 53249,1684 53250,408 53251,158 53252,87 53253,53254 53253,69160 53253,84004 53253,92030 53256,72 53257,1579 53258,859 53259,44 53260,53261 53262,53263 53264,1146 53265,422 53266,422 53267,422 53268,422 53269,422 53270,422 53271,422 53272,422 53273,422 53275,53276 53277,53278 53279,595 53280,676 53281,3413 53282,53283 53284,83 53285,2701 53286,571 53286,2224 53286,2989 53286,2991 53287,2995 53288,118 53288,4597 53289,15573 53290,207 53291,1707 53292,2048 53293,275 53294,832 53295,874 53296,687 53297,255 53298,187 53299,53300 53299,75554 53299,126228 53301,53302 53303,3695 53305,1631 53306,1474 53307,509 53307,510 53309,3413 53310,1240 53312,30 53312,358 53312,1149 53312,1983 53312,53313 53312,78474 53312,92299 53312,99628 53312,104786 53312,107124 53312,179531 53312,204612 53312,249212 53314,298 53315,485 53316,302 53316,515 53317,1181 53318,743 53319,1309 53320,346 53321,72 53322,9121 53323,3960 53324,50 53324,4193 53325,254 53326,1767 53327,1353 53328,53329 53330,240 53331,652 53332,8270 53333,107 53334,1102 53335,772 53337,53338 53340,53341 53342,255 53343,1247 53343,1644 53343,1844 53344,151 53345,31977 53345,53346 53345,83309 53345,94325 53345,100725 53345,102276 53345,114316 53345,118765 53345,125776 53345,126442 53345,131558 53345,184064 53347,850 53348,149 53349,53350 53351,151 53352,417 53353,2105 53355,53356 53355,82417 53357,1235 53357,1335 53358,1 53359,349 53360,4101 53361,10 53362,195 53363,72 53364,346 53366,640 53367,859 53368,346 53369,53370 53371,275 53372,53373 53374,366 53375,366 53376,366 53377,366 53378,366 53379,366 53380,366 53381,366 53382,366 53383,366 53384,366 53385,206 53386,2929 53387,366 53388,366 53389,515 53390,53391 53392,195 53393,53394 53395,355 53396,18726 53397,163 53398,450 53399,4192 53399,4193 53400,58 53400,801 53400,1140 53400,1177 53400,1893 53400,3474 53401,306 53401,307 53402,626 53403,202 53403,203 53404,358 53404,2105 53405,346 53406,83 53407,1531 53408,151 53409,346 53410,104 53411,868 53412,53413 53414,581 53416,536 53417,1634 53418,424 53419,273 53419,274 53420,305 53420,366 53420,500 53420,718 53420,1204 53420,1796 53420,2373 53420,20535 53421,1955 53423,53424 53425,1140 53425,3474 53425,5547 53426,1323 53427,102 53428,1326 53429,408 53430,1257 53431,1837 53432,53433 53434,53435 53436,644 53437,298 53438,861 53439,818 53441,676 53442,1556 53443,861 53444,22 53445,1116 53446,920 53446,2178 53446,4545 53447,422 53448,422 53450,422 53451,422 53452,422 53453,422 53455,7117 53456,1715 53457,195 53458,483 53459,187 53460,195 53461,1715 53462,4611 53463,53464 53465,53466 53467,53468 53467,93922 53467,100273 53467,102369 53469,3413 53470,195 53470,222 53470,1466 53470,1635 53470,3135 53470,3148 53470,8235 53471,192 53472,192 53473,2206 53473,31896 53474,211 53475,83 53476,206 53478,1014 53479,720 53479,877 53479,907 53479,1284 53479,1522 53479,1732 53479,2191 53479,3194 53479,3422 53480,1844 53481,392 53482,1531 53483,83 53484,53485 53486,53487 53488,53489 53490,312 53492,652 53493,53494 53495,120 53495,1353 53496,151 53497,219 53498,259 53500,1419 53501,264 53501,1551 53502,8822 53503,53504 53505,53506 53507,1556 53508,861 53509,22 53510,500 53511,143 53512,1837 53513,3129 53514,79 53516,8270 53517,151 53519,779 53520,53521 53522,349 53523,53524 53525,217 53525,536 53525,1417 53526,53527 53528,809 53529,376 53530,1119 53531,1058 53532,489 53533,349 53534,3260 53535,169 53537,21944 53538,247 53538,1309 53538,3135 53538,3328 53541,44 53542,21944 53543,72 53544,53545 53546,72 53548,640 53549,640 53550,312 53551,1201 53552,346 53554,557 53555,557 53556,557 53557,8719 53558,138 53559,865 53560,557 53561,137 53562,21944 53563,118 53563,4597 53564,8719 53565,138 53566,865 53567,557 53568,137 53569,21944 53570,118 53570,4597 53571,10 53572,8719 53573,138 53574,865 53575,557 53576,137 53577,118 53577,4597 53578,21944 53579,8719 53580,138 53581,865 53582,557 53583,137 53584,21944 53585,118 53585,4597 53586,53587 53588,53587 53590,53591 53592,17334 53593,8270 53594,106 53594,538 53594,1531 53594,1634 53596,53597 53598,120 53599,4078 53600,53601 53602,53603 53606,2367 53607,640 53608,640 53609,21944 53610,640 53611,640 53612,53613 53614,53615 53616,53617 53618,53619 53620,53621 53623,120 53624,640 53625,240 53625,424 53625,438 53625,515 53625,588 53625,590 53625,779 53625,1634 53625,3246 53625,3247 53626,1181 53627,53628 53629,1462 53629,8537 53630,452 53631,1247 53632,184 53634,247 53635,225 53636,1767 53637,1309 53637,22880 53638,247 53639,53640 53641,1179 53642,640 53643,1522 53645,53646 53647,640 53648,53649 53650,326 53650,873 53651,53652 53653,640 53654,346 53655,397 53656,346 53657,53658 53659,118 53659,4597 53660,275 53661,874 53662,17228 53664,1773 53665,644 53666,16196 53667,53668 53669,53670 53671,184 53672,53673 53674,53675 53676,233 53677,346 53678,640 53679,195 53680,515 53681,83 53682,53683 53682,84235 53682,121489 53684,355 53685,53686 53687,1968 53689,310 53690,1181 53691,306 53691,307 53692,53693 53694,8788 53695,118 53695,4597 53696,53697 53698,8270 53699,1284 53701,83 53702,366 53703,366 53704,366 53705,366 53706,366 53707,366 53708,366 53709,366 53710,83 53711,207 53712,3069 53713,420 53714,298 53715,485 53716,704 53717,301 53717,1715 53718,581 53719,333 53720,83 53721,53722 53723,21944 53724,83 53725,3148 53726,106 53726,1370 53726,56998 53726,62895 53726,89736 53726,191355 53727,53728 53729,294 53729,596 53729,784 53729,1119 53729,2424 53730,1556 53731,861 53732,22 53733,515 53733,589 53733,1877 53734,1072 53735,255 53736,255 53737,1016 53737,2205 53737,2206 53737,33424 53738,1556 53739,861 53740,22 53741,932 53742,1381 53743,207 53744,481 53745,346 53747,7 53748,21944 53749,7 53751,389 53752,298 53753,485 53754,861 53754,2116 53755,53756 53757,1238 53758,973 53759,1133 53761,79 53761,104 53761,111 53761,134 53761,192 53761,200 53761,202 53761,203 53761,215 53761,227 53761,240 53761,248 53761,264 53761,289 53761,290 53761,298 53761,309 53761,310 53761,333 53761,503 53761,516 53761,588 53761,590 53761,631 53761,636 53761,714 53761,805 53761,1016 53761,1102 53761,1119 53761,1149 53761,1181 53761,1282 53761,1462 53761,1631 53761,1659 53761,1745 53761,1849 53761,1955 53761,1962 53761,2205 53761,2206 53761,2286 53761,2443 53761,4355 53761,6955 53761,8180 53761,8537 53761,9005 53761,9006 53761,9010 53761,54004 53762,53763 53764,298 53765,485 53766,298 53767,485 53768,2210 53768,4237 53769,22580 53770,1462 53770,8537 53771,53772 53773,2828 53774,346 53775,872 53776,18726 53777,163 53778,3413 53779,53780 53781,332 53781,389 53782,850 53783,3069 53784,346 53785,136 53786,53787 53788,8822 53789,2421 53790,53791 53792,137 53793,1688 53794,217 53795,10 53795,50 53795,120 53795,147 53795,151 53795,222 53795,248 53795,647 53795,657 53795,1235 53795,1335 53795,1381 53795,4504 53796,346 53797,195 53798,3695 53799,298 53800,485 53801,3695 53802,3246 53802,3247 53803,7 53804,195 53805,53806 53807,1381 53808,53809 53810,298 53811,485 53812,483 53813,3069 53814,376 53815,2334 53816,72 53817,72 53818,53818 53820,53821 53822,676 53823,2979 53824,17334 53825,53826 53827,640 53828,640 53829,994 53829,1235 53829,1335 53830,640 53831,36388 53832,106 53833,53834 53833,86775 53833,86788 53833,95723 53833,99009 53833,115824 53833,117406 53833,117504 53835,53836 53837,1556 53838,1400 53839,274 53839,1210 53839,1980 53840,393 53841,53842 53843,44 53844,346 53845,2506 53846,2017 53847,1 53848,3960 53849,53850 53851,72 53852,640 53853,53854 53855,53856 53855,120676 53855,135668 53855,196520 53857,72 53858,17334 53859,1983 53860,366 53861,53862 53863,18726 53863,68955 53864,2146 53865,693 53865,1458 53866,1181 53867,640 53868,8270 53869,53870 53871,298 53872,485 53873,1058 53874,53875 53876,53877 53879,1858 53880,1860 53881,1858 53882,1860 53883,72 53884,267 53886,994 53888,53889 53890,53891 53892,72 53894,53895 53896,53897 53898,53899 53900,53901 53902,187 53903,53904 53906,2506 53908,9560 53909,53910 53912,31977 53913,53914 53915,275 53916,874 53917,1849 53918,1776 53920,1381 53922,557 53923,147 53924,240 53925,53926 53925,73060 53925,94641 53925,111198 53925,112404 53925,120148 53927,536 53927,1019 53927,1417 53928,72 53929,81 53930,72 53931,53932 53933,233 53934,1773 53935,346 53936,53937 53938,18726 53939,53940 53941,163 53942,515 53943,417 53944,107 53945,2416 53945,2417 53946,292 53947,338 53948,53949 53950,298 53951,743 53952,151 53953,1133 53954,3538 53955,53956 53955,59993 53957,355 53958,668 53959,53960 53961,53960 53962,634 53963,907 53963,22880 53964,211 53965,53966 53967,366 53968,366 53969,366 53970,53971 53973,136 53974,18726 53975,53975 53976,72 53977,663 53977,664 53978,346 53979,676 53981,515 53982,652 53983,911 53983,6638 53984,2506 53985,907 53985,1117 53986,581 53987,2206 53987,31896 53988,151 53989,298 53990,485 53991,53992 53993,56 53994,3724 53995,872 53996,872 53997,187 53999,160 54000,54001 54002,740 54002,741 54003,346 54005,83 54006,83 54007,4177 54008,346 54009,3413 54010,21944 54011,875 54012,54013 54014,636 54015,274 54015,1210 54015,1980 54016,647 54017,344 54018,274 54018,1210 54018,1980 54019,5375 54020,275 54021,874 54022,54023 54024,313 54025,599 54026,1118 54027,718 54028,3069 54029,54030 54029,93921 54029,117192 54029,128661 54029,155923 54031,346 54032,772 54033,346 54034,312 54035,66 54036,779 54036,3999 54037,147 54038,2244 54041,349 54042,483 54043,1417 54044,79 54045,54046 54047,2506 54048,54049 54050,1556 54051,433 54052,54053 54054,422 54054,1556 54055,5662 54056,310 54057,305 54057,1818 54058,54059 54060,240 54061,306 54061,307 54063,54064 54065,1188 54066,305 54067,581 54068,219 54070,346 54071,417 54072,79 54073,795 54074,305 54075,97 54076,346 54079,54080 54081,18726 54082,305 54083,907 54084,18726 54085,18726 54087,298 54088,485 54089,360 54091,217 54091,1417 54092,415 54094,54095 54094,57563 54096,302 54097,3370 54097,14453 54098,18726 54099,44 54100,163 54101,298 54102,485 54103,126 54103,1663 54105,160 54106,931 54107,1014 54108,510 54110,346 54111,832 54112,557 54113,557 54114,515 54115,862 54117,557 54118,557 54120,5469 54121,596 54122,54123 54124,1284 54125,54126 54127,54128 54129,54130 54129,60229 54129,85442 54129,161127 54129,173011 54129,180357 54129,197409 54129,198167 54131,1014 54132,326 54133,54134 54135,54136 54137,54138 54139,298 54140,485 54141,202 54141,203 54143,602 54144,602 54145,1381 54146,980 54146,1531 54148,54149 54150,72 54151,20 54152,54153 54152,57732 54152,73006 54152,90577 54152,99023 54154,17334 54155,4980 54156,3069 54158,422 54159,422 54160,422 54161,422 54162,422 54163,422 54164,422 54165,422 54166,422 54167,54168 54169,1181 54170,72 54171,298 54172,485 54173,640 54174,1133 54175,54176 54177,54178 54179,54180 54181,207 54182,827 54183,163 54184,54185 54186,577 54187,118 54187,4597 54188,676 54189,424 54189,3209 54190,137 54191,72 54192,16921 54192,113497 54193,54194 54195,48 54195,87 54195,111 54195,130 54195,163 54195,178 54195,184 54195,192 54195,217 54195,264 54195,296 54195,309 54195,310 54195,344 54195,346 54195,435 54195,510 54195,515 54195,516 54195,538 54195,579 54195,589 54195,647 54195,801 54195,811 54195,932 54195,1001 54195,1007 54195,1058 54195,1118 54195,1122 54195,1188 54195,1267 54195,1294 54195,1452 54195,1509 54195,1531 54195,1962 54195,1968 54195,2116 54195,2626 54195,3041 54195,3089 54195,3345 54195,3585 54195,3695 54195,5358 54195,5911 54195,6119 54195,9024 54195,14352 54195,19356 54195,31896 54195,36985 54195,54202 54196,278 54197,240 54198,302 54199,54200 54201,54201 54203,54204 54205,83 54205,278 54205,292 54205,313 54205,326 54205,356 54205,385 54205,417 54205,424 54205,477 54205,663 54205,697 54205,752 54205,781 54205,1140 54205,1167 54205,1201 54205,1240 54205,1465 54205,1571 54205,1881 54205,2224 54205,2266 54205,2367 54205,2553 54205,2944 54205,3467 54205,4220 54205,5326 54205,5591 54205,7698 54205,8463 54205,16614 54205,19443 54206,187 54207,640 54208,83 54208,455 54208,949 54209,54210 54211,346 54212,211 54213,805 54214,54215 54216,596 54217,640 54218,3413 54219,6888 54220,292 54221,54222 54223,294 54225,296 54226,298 54227,34 54227,35 54228,557 54229,640 54230,9195 54232,298 54233,485 54234,79 54234,931 54234,21442 54235,10 54236,248 54236,626 54237,54238 54239,206 54239,240 54239,315 54239,406 54239,489 54239,652 54239,809 54239,934 54239,1118 54239,1140 54239,1210 54239,1370 54239,1381 54239,1400 54239,1462 54239,1776 54239,1844 54239,1877 54239,2334 54239,4066 54239,6303 54239,6661 54239,8537 54239,54202 54239,54243 54240,54241 54240,94516 54242,278 54244,298 54245,485 54246,515 54247,1639 54248,54249 54251,392 54252,1844 54253,7360 54254,366 54255,366 54256,805 54257,515 54257,4771 54258,4101 54259,333 54259,431 54259,439 54259,440 54259,444 54259,1102 54259,1177 54259,1326 54259,4453 54259,5213 54259,6955 54259,54264 54259,54272 54260,163 54261,355 54262,718 54262,4101 54263,151 54265,907 54266,54267 54268,160 54269,1891 54270,147 54271,596 54271,1368 54273,163 54274,4 54274,5 54274,65 54274,68 54274,72 54274,79 54274,94 54274,97 54274,119 54274,227 54274,302 54274,305 54274,310 54274,323 54274,340 54274,358 54274,392 54274,420 54274,442 54274,479 54274,491 54274,577 54274,622 54274,628 54274,687 54274,818 54274,827 54274,841 54274,859 54274,861 54274,872 54274,994 54274,1033 54274,1052 54274,1289 54274,1466 54274,1551 54274,1556 54274,1590 54274,1612 54274,1707 54274,1715 54274,1749 54274,1796 54274,1818 54274,1893 54274,2205 54274,2206 54274,2209 54274,2260 54274,2312 54274,2443 54274,2787 54274,2979 54274,3039 54274,4411 54274,6051 54274,8180 54274,8541 54274,8820 54274,9018 54274,9028 54274,17309 54274,17384 54274,20359 54274,32475 54274,54284 54274,54362 54275,140 54275,827 54276,58 54277,46 54278,163 54279,808 54280,1087 54281,850 54282,54283 54282,197862 54285,211 54285,1844 54286,1149 54288,2105 54289,1556 54290,1639 54291,202 54291,333 54291,439 54291,694 54291,788 54291,862 54292,202 54292,203 54293,255 54294,893 54295,602 54295,2353 54295,6966 54295,13486 54296,58 54298,868 54299,53617 54301,1381 54302,932 54303,54304 54303,95935 54305,718 54308,192 54310,72 54311,344 54312,285 54314,671 54316,314 54316,779 54317,1635 54318,79 54319,163 54321,493 54322,640 54323,640 54324,640 54325,360 54328,222 54330,251 54331,167 54331,1381 54332,1151 54332,1572 54333,450 54334,424 54335,349 54336,54337 54338,1509 54339,163 54340,43604 54341,1140 54341,1240 54341,3367 54342,3331 54343,58 54344,54345 54346,346 54347,611 54347,1677 54347,37414 54348,818 54349,893 54349,1556 54350,54351 54353,1566 54354,79 54356,298 54357,485 54358,58 54359,1653 54359,2889 54360,344 54360,1711 54360,1836 54363,510 54364,516 54366,305 54367,1151 54368,344 54369,843 54370,868 54371,1566 54372,1531 54373,516 54373,1220 54373,1222 54374,592 54375,1231 54376,1927 54377,298 54378,346 54379,415 54380,54381 54382,1818 54383,1663 54384,1285 54385,1556 54386,581 54387,685 54388,376 54389,8270 54390,911 54392,1566 54394,818 54396,1977 54396,1978 54397,87 54397,697 54398,81 54398,137 54398,215 54398,1282 54399,10 54399,2574 54399,3111 54400,920 54400,1559 54402,356 54402,852 54403,972 54403,973 54403,1284 54403,3804 54404,873 54405,422 54406,422 54407,636 54409,422 54410,1181 54411,422 54412,200 54413,422 54414,422 54415,422 54416,422 54417,233 54418,72 54419,360 54421,1119 54421,2995 54422,13361 54423,58 54424,240 54424,1085 54425,657 54426,1241 54427,818 54428,360 54429,68 54430,79 54432,1381 54433,1590 54434,106 54435,389 54436,171 54436,605 54436,3182 54436,5358 54436,14352 54436,142430 54437,392 54440,932 54441,312 54442,872 54443,298 54444,485 54445,1118 54446,1849 54447,872 54448,3328 54449,500 54450,577 54451,500 54452,313 54452,385 54452,5591 54453,1509 54454,1608 54454,77315 54455,1068 54455,1506 54456,37 54456,1782 54457,356 54458,1612 54459,72 54460,4678 54461,872 54462,850 54463,292 54464,389 54465,671 54465,1181 54465,1381 54466,79 54467,406 54468,626 54469,980 54470,640 54471,422 54472,147 54472,158 54472,406 54473,1983 54475,872 54476,292 54477,557 54478,877 54479,4805 54480,389 54482,54483 54484,222 54484,278 54484,891 54484,1019 54486,2436 54488,859 54489,217 54490,54491 54492,1782 54493,577 54493,788 54493,1070 54493,1105 54493,127158 54493,138686 54496,305 54497,500 54498,1962 54499,1052 54500,1882 54501,2775 54502,54 54503,2210 54503,4237 54504,390 54504,518 54504,973 54504,1284 54504,1849 54504,230519 54506,99 54507,1181 54507,68069 54508,1220 54508,1222 54509,1381 54512,195 54513,20757 54515,34 54515,35 54516,1556 54517,861 54518,22 54519,640 54520,571 54521,344 54522,72 54523,344 54524,285 54525,3138 54527,718 54529,2812 54531,581 54531,918 54532,2775 54532,4805 54533,79 54534,4475 54535,269 54536,192 54537,240 54538,818 54539,31073 54541,649 54542,34 54542,35 54542,83 54542,217 54542,949 54543,217 54543,1417 54544,1181 54545,640 54545,4192 54545,4193 54546,298 54547,557 54548,54549 54551,240 54551,1285 54551,5718 54552,104 54552,162599 54553,184 54554,54555 54556,1983 54557,392 54557,697 54557,1240 54557,3003 54558,743 54560,417 54562,147 54563,163 54566,1789 54566,174551 54567,305 54568,1639 54569,1300 54570,592 54571,120 54571,1019 54572,760 54573,595 54574,779 54575,1149 54575,1631 54576,1639 54577,1210 54579,346 54580,1033 54582,56 54582,30331 54583,862 54585,298 54586,485 54587,30 54587,134 54587,1179 54588,83 54589,83 54589,338 54589,1274 54589,2572 54589,6068 54589,13136 54590,1551 54592,779 54593,1127 54594,54595 54596,195 54597,247 54598,406 54599,22 54600,364 54601,1381 54602,389 54603,811 54604,1181 54605,1370 54605,2782 54606,301 54606,615 54607,392 54608,66 54609,54609 54610,37088 54611,34 54611,35 54612,328 54612,7124 54614,195 54615,104 54615,784 54615,1001 54615,1462 54615,8537 54616,10 54616,126 54616,217 54616,302 54616,397 54616,1118 54616,1191 54616,1192 54616,1204 54616,1559 54616,1663 54616,1844 54616,2173 54616,2253 54616,3524 54616,3582 54616,4165 54617,996 54618,30 54618,305 54618,1871 54619,2506 54620,305 54622,54623 54622,80508 54622,82500 54622,92691 54624,4192 54624,4193 54625,805 54625,1282 54626,1634 54627,424 54628,795 54629,118 54629,4597 54630,81 54632,1276 54632,3698 54633,312 54634,634 54634,2421 54636,1238 54637,744 54638,2146 54639,392 54640,1983 54641,137 54643,2224 54644,779 54645,305 54645,1796 54647,671 54648,358 54649,932 54650,376 54651,885 54652,1388 54653,406 54654,392 54655,54656 54657,346 54658,30 54658,1179 54659,1454 54660,275 54661,298 54662,2697 54663,2048 54664,292 54665,636 54666,41 54667,473 54668,364 54670,54671 54672,54673 54674,1227 54674,1229 54674,1252 54674,1253 54674,21944 54675,483 54677,743 54678,2646 54679,151 54681,389 54682,10 54683,18726 54684,22 54684,163 54684,302 54684,579 54684,818 54684,861 54684,1556 54684,4453 54685,631 54685,2995 54686,54687 54688,447 54688,671 54689,163 54690,54691 54692,147 54692,158 54693,41 54694,54695 54696,54695 54697,298 54698,485 54699,21944 54702,240 54702,1119 54703,273 54703,274 54703,313 54704,1381 54705,178 54706,83 54707,83 54708,749 54710,72 54711,5405 54712,1096 54713,2372 54714,1801 54715,54716 54717,72 54718,344 54719,285 54720,72 54721,54722 54723,1332 54724,247 54725,134 54726,3069 54727,72 54728,333 54729,54730 54731,1462 54731,8537 54732,788 54732,1531 54732,6803 54733,3538 54734,83 54735,54736 54737,289 54737,290 54738,83 54739,2411 54739,6803 54740,312 54741,516 54742,527 54742,740 54742,741 54742,743 54743,1623 54744,406 54744,1515 54745,1858 54746,1860 54747,376 54748,346 54749,1132 54750,781 54751,86 54751,301 54751,907 54751,1293 54751,1436 54751,1522 54751,2083 54751,2557 54751,2979 54752,2995 54753,1467 54754,907 54754,22880 54755,1309 54756,406 54757,54758 54757,55411 54757,64084 54757,83681 54757,87565 54757,95838 54759,10 54760,83 54760,1274 54760,2779 54760,2784 54760,28130 54761,772 54762,563 54763,72 54764,2434 54765,393 54765,1531 54766,72 54767,344 54768,285 54770,274 54770,1210 54770,1980 54771,393 54772,1381 54773,346 54774,252 54776,1014 54777,72 54778,344 54779,285 54780,10 54781,718 54782,1 54782,306 54782,307 54782,491 54782,1425 54782,1515 54782,4039 54782,4260 54782,165561 54782,260893 54783,54783 54784,83 54784,455 54784,949 54785,2367 54786,54787 54788,1551 54789,99 54790,1188 54791,65 54792,54793 54794,557 54795,3370 54795,14453 54797,1181 54797,141912 54798,439 54798,1789 54799,406 54800,147 54800,158 54801,557 54802,557 54803,1181 54804,15068 54805,54806 54807,690 54808,1033 54808,1612 54809,44 54810,54811 54812,301 54813,372 54815,137 54816,640 54817,309 54817,310 54818,406 54819,72 54820,406 54821,9029 54823,623 54823,1805 54824,2105 54825,298 54826,485 54827,1634 54828,72 54829,920 54830,1566 54831,349 54832,640 54833,147 54833,158 54834,704 54835,312 54837,2048 54838,195 54839,3413 54840,72 54841,247 54842,809 54843,676 54844,516 54845,452 54845,2206 54846,54847 54846,124064 54846,124198 54846,136179 54846,156151 54846,170123 54846,173040 54846,176182 54846,178990 54846,190651 54846,213524 54846,221569 54846,225505 54846,232431 54846,234617 54846,239667 54846,244985 54846,253764 54846,257162 54846,258229 54846,263875 54846,264545 54848,54849 54850,54851 54852,801 54852,1140 54852,3474 54852,5547 54853,1860 54854,602 54855,602 54856,118 54856,4597 54857,1204 54858,54859 54860,340 54861,54862 54861,155356 54863,72 54864,503 54866,1551 54867,8270 54868,920 54869,26 54869,59 54869,117 54869,885 54869,886 54869,1235 54869,1335 54869,54870 54871,493 54871,586 54871,663 54871,59021 54872,1551 54873,187 54874,2334 54875,171 54876,79 54877,54878 54879,54880 54881,31977 54882,349 54883,3413 54884,323 54885,21944 54886,356 54888,9018 54889,54890 54891,252 54892,1265 54892,1266 54893,9018 54894,779 54895,779 54896,83 54897,54898 54899,1181 54900,333 54901,479 54902,115 54902,118 54903,1149 54904,104 54904,134 54905,275 54906,360 54907,424 54908,233 54909,704 54910,217 54910,1417 54911,79 54911,147 54912,54913 54914,850 54915,54915 54916,163 54916,489 54917,515 54918,54919 54920,704 54921,872 54922,2351 54923,1707 54924,392 54924,1860 54925,349 54926,269 54927,355 54929,1247 54929,1644 54929,1844 54930,302 54931,459 54932,54933 54934,1789 54935,298 54936,485 54937,195 54938,583 54940,3 54941,1096 54942,207 54943,18726 54944,292 54945,192 54945,340 54945,505 54945,893 54945,1927 54945,4172 54945,45437 54946,302 54946,579 54946,687 54946,2116 54947,306 54947,307 54948,222 54948,455 54948,972 54948,6068 54949,718 54950,366 54951,248 54951,1332 54951,1572 54951,1844 54951,11147 54952,392 54952,809 54953,72 54954,3967 54955,192 54956,206 54957,278 54957,1274 54958,66 54958,149 54958,467 54958,671 54958,818 54958,21442 54959,3 54960,1590 54961,72 54962,344 54962,1711 54962,1836 54964,54965 54966,167 54967,422 54968,422 54969,422 54970,422 54971,2889 54972,58 54973,626 54974,298 54975,485 54976,1711 54977,500 54978,26181 54979,83 54979,694 54979,3367 54980,178 54981,83 54982,516 54983,973 54984,422 54985,422 54986,422 54987,307 54987,682 54987,72439 54989,422 54990,422 54991,2178 54991,4545 54992,302 54992,2116 54993,500 54994,500 54995,1983 54996,393 54997,137 54998,581 54999,55000 55001,932 55002,55003 55002,89180 55002,92307 55002,94628 55002,98692 55002,100186 55002,123413 55002,170446 55002,217739 55002,254477 55004,79 55005,1181 55007,233 55008,55009 55008,57979 55008,68296 55010,298 55011,485 55012,83 55012,6955 55014,337 55014,586 55015,1858 55016,1860 55018,647 55019,752 55021,264 55022,111 55022,289 55022,290 55022,309 55022,310 55022,1631 55023,97 55023,8180 55023,30331 55024,292 55025,72 55026,415 55027,292 55030,893 55032,79 55033,389 55034,56 55034,79 55034,192 55034,202 55034,333 55034,1181 55034,256681 55035,19443 55036,56 55036,192 55036,406 55036,620 55036,1515 55037,7360 55038,760 55039,949 55040,1590 55040,1644 55041,809 55042,21944 55043,1858 55044,1860 55045,874 55047,596 55047,3507 55050,1858 55051,1860 55052,433 55053,298 55054,3507 55055,79 55055,2775 55056,1858 55057,1860 55058,55059 55060,1326 55061,1608 55062,1858 55063,1860 55066,346 55067,55068 55069,18726 55070,3069 55071,292 55072,55073 55074,163 55075,56 55075,99 55075,192 55075,493 55075,1181 55075,30331 55075,60576 55076,1908 55076,55077 55078,433 55079,644 55080,968 55080,1001 55081,875 55082,2083 55083,275 55084,83 55085,79 55086,151 55086,2266 55087,1149 55088,8992 55089,602 55090,832 55091,415 55093,852 55093,1133 55095,269 55096,652 55098,712 55099,301 55099,968 55100,1298 55101,752 55102,298 55103,485 55104,186 55105,211 55105,538 55105,1844 55107,104 55108,83 55109,875 55110,875 55111,1132 55112,781 55113,1452 55114,79 55115,515 55116,83 55117,779 55118,1179 55119,1623 55120,2995 55121,222 55122,1836 55124,192 55124,493 55125,1639 55126,602 55127,79 55129,55130 55131,3653 55132,1313 55133,7124 55134,875 55135,20359 55136,1231 55137,137 55139,875 55140,920 55141,147 55142,10 55143,1871 55144,1 55144,171 55145,577 55146,1119 55146,1962 55146,4218 55146,4220 55147,392 55148,302 55148,312 55148,861 55148,1556 55149,240 55149,818 55149,859 55150,292 55151,1454 55151,1722 55152,5662 55153,389 55155,2048 55156,392 55156,626 55156,1240 55157,83 55158,6627 55160,104 55160,138 55161,1984 55162,18726 55163,932 55163,1016 55163,2205 55163,2206 55163,2567 55163,33424 55163,245910 55164,2775 55165,447 55166,163 55168,104 55168,240 55168,264 55168,2436 55169,1082 55170,55171 55172,1370 55172,1821 55173,255 55174,577 55174,671 55174,1276 55175,1370 55175,1821 55177,4771 55178,991 55178,1267 55178,1579 55178,2605 55179,1564 55179,1707 55179,1955 55179,6837 55179,66500 55179,125569 55181,302 55181,6303 55184,1968 55185,1326 55186,640 55187,7416 55188,55189 55190,298 55191,485 55192,622 55193,676 55194,1210 55195,222 55195,657 55195,13546 55196,30236 55197,392 55198,68 55198,9021 55199,2557 55200,483 55201,222 55202,389 55202,1072 55203,2944 55203,7698 55204,500 55205,1663 55206,3138 55207,55208 55207,157843 55209,160 55211,346 55212,1634 55213,1370 55213,1821 55214,233 55214,240 55215,30 55216,55217 55218,1370 55218,1821 55220,10 55221,310 55221,3161 55223,151 55224,433 55226,55227 55228,55227 55230,1370 55230,1821 55231,433 55231,1010 55231,1298 55231,75912 55232,55233 55232,231213 55233,34 55234,2784 55234,55233 55234,231213 55235,55233 55235,98399 55236,1370 55236,1821 55237,3698 55238,55233 55238,68069 55238,94464 55239,55240 55239,205383 55241,273 55241,274 55242,217 55243,1983 55244,18831 55245,1370 55245,1821 55246,187 55247,640 55248,222 55248,657 55249,18831 55250,37 55252,2572 55254,1 55254,336 55254,397 55254,406 55254,1425 55254,8055 55254,102560 55255,147 55255,516 55255,920 55255,1181 55256,83 55257,217 55258,146 55259,4 55259,5 55260,55233 55262,872 55264,994 55265,2421 55267,1370 55267,1821 55268,55269 55270,55271 55272,994 55273,996 55274,376 55275,885 55276,55277 55278,3413 55280,7 55280,309 55280,310 55281,376 55282,704 55283,55284 55285,885 55286,1474 55287,440 55287,622 55287,3367 55288,37088 55289,305 55290,247 55291,579 55292,875 55293,376 55294,192 55295,163 55296,202 55296,203 55297,1370 55297,1821 55298,126 55298,346 55298,972 55299,17346 55301,557 55302,4504 55303,424 55305,195 55306,1454 55307,271 55308,602 55309,55310 55311,72 55312,704 55313,622 55314,1370 55314,1821 55315,30 55317,55318 55319,158 55319,252 55320,9195 55321,83 55322,1858 55323,1860 55324,1858 55325,1860 55326,333 55326,36819 55329,222 55331,30 55332,1608 55333,805 55334,137 55335,1298 55336,30 55337,83 55338,35 55338,83 55339,83 55340,3804 55341,250 55341,1684 55342,1805 55343,1370 55343,1821 55344,8270 55345,309 55345,310 55346,309 55346,310 55347,795 55349,30 55350,1085 55351,171 55352,1370 55352,1821 55353,1381 55354,306 55354,307 55355,676 55356,255 55357,605 55358,861 55359,233 55359,1715 55359,4146 55360,557 55361,1631 55362,557 55364,55365 55366,3413 55367,184 55367,21442 55368,640 55369,146 55370,7270 55371,222 55372,604 55374,9121 55375,872 55377,1127 55379,30 55380,805 55381,44 55382,219 55383,393 55383,1388 55383,1531 55383,4455 55384,1359 55385,30 55386,433 55387,433 55388,349 55389,1381 55390,406 55391,1453 55392,1556 55393,861 55394,22 55395,602 55396,994 55397,1227 55397,1229 55398,3653 55399,2867 55399,22880 55400,217 55401,481 55403,750 55403,783 55403,1319 55404,30 55405,861 55406,187 55407,72 55409,818 55410,151 55412,222 55413,1844 55414,622 55414,55415 55416,557 55416,636 55416,943 55416,1332 55416,1572 55416,1844 55416,7757 55417,312 55418,644 55419,298 55420,485 55421,30 55422,9560 55425,346 55426,406 55427,1644 55427,6661 55428,3413 55429,187 55430,55431 55432,289 55432,290 55433,30 55434,55435 55436,55435 55438,30 55439,30 55440,106 55440,1370 55440,168463 55441,30 55442,55443 55444,55445 55446,338 55447,389 55448,7124 55449,26 55449,59 55449,1238 55449,2367 55449,4039 55450,83 55451,563 55452,192 55452,333 55453,72 55454,6249 55455,1238 55456,602 55457,55458 55459,72 55460,72 55461,4101 55462,83 55463,211 55464,20359 55465,83 55466,55467 55468,55469 55471,640 55471,7270 55472,21944 55473,1181 55474,360 55475,147 55476,55477 55478,55479 55480,55481 55482,55483 55484,668 55484,852 55484,2146 55484,6323 55484,55485 55484,106954 55484,119786 55484,127995 55484,129037 55484,130134 55484,132431 55484,133713 55484,135487 55484,139353 55484,141566 55484,144402 55484,147200 55484,151866 55484,160719 55486,2367 55487,349 55488,1247 55489,146 55490,693 55491,7416 55492,55493 55494,30 55495,30 55496,30 55498,30 55499,55500 55501,72 55502,195 55503,1977 55503,1978 55504,55505 55506,349 55507,18831 55508,932 55509,294 55512,1033 55513,55514 55515,1368 55516,372 55517,55518 55519,72 55520,72 55521,861 55523,392 55524,72 55525,30 55526,1070 55527,479 55528,366 55529,366 55530,366 55531,137 55532,55533 55534,81 55535,515 55536,55537 55539,18726 55540,72 55541,163 55542,349 55542,392 55543,634 55544,355 55545,55546 55547,55546 55548,1010 55548,1677 55549,713 55550,298 55551,485 55552,873 55552,1210 55552,236180 55553,298 55554,485 55555,3451 55555,3452 55556,392 55557,1175 55557,4411 55558,1858 55559,1860 55560,163 55561,18831 55562,13538 55563,30 55565,1559 55567,58 55567,261 55567,312 55567,1140 55567,1544 55567,2480 55567,3182 55567,3207 55567,19443 55569,1858 55570,306 55570,307 55571,1860 55572,18726 55573,602 55574,563 55575,563 55576,563 55577,340 55578,163 55579,3 55580,1612 55581,252 55581,516 55581,1220 55581,1222 55583,120 55583,1235 55583,1462 55584,55585 55585,149 55585,336 55585,1425 55585,1603 55585,1776 55585,1803 55585,1877 55585,21442 55585,26450 55585,118336 55586,2979 55587,602 55588,1058 55589,2775 55590,447 55591,5405 55592,626 55593,1381 55594,1623 55596,215 55598,68 55598,372 55598,805 55598,1068 55598,1359 55598,4220 55598,230515 55599,1132 55600,781 55601,269 55602,79 55603,104 55603,439 55603,509 55604,313 55605,15523 55606,55607 55608,222 55609,83 55610,3209 55611,1293 55611,1556 55613,1132 55614,781 55615,433 55616,298 55617,485 55618,37 55618,3999 55619,1858 55620,1860 55621,1132 55622,781 55623,336 55624,920 55625,330 55626,1124 55627,55628 55629,697 55630,1711 55630,1836 55631,422 55632,422 55633,422 55634,422 55635,422 55636,673 55637,422 55638,192 55638,195 55639,1326 55640,422 55641,3555 55642,298 55643,485 55644,1052 55645,1132 55646,781 55647,422 55648,163 55649,344 55649,1844 55649,2073 55649,13538 55650,422 55651,3 55651,233 55651,518 55651,775 55651,795 55651,1326 55651,1411 55651,1715 55651,3094 55651,3804 55651,4146 55651,5130 55652,298 55653,485 55654,55655 55654,108904 55654,131480 55659,1608 55660,770 55661,818 55662,30 55663,251 55663,516 55664,1805 55665,217 55665,455 55665,1417 55666,611 55667,500 55668,467 55668,536 55668,538 55668,1881 55668,2867 55668,2868 55668,22880 55668,156379 55669,30 55670,1265 55670,1266 55671,932 55672,120 55673,3069 55674,1634 55675,581 55676,118 55676,4597 55677,283 55677,425 55677,1276 55678,592 55679,79 55680,30 55681,261 55681,1353 55682,602 55683,301 55683,189303 55684,1849 55685,135 55686,120 55686,217 55686,809 55686,1411 55686,2750 55686,3804 55686,15609 55687,1132 55688,781 55689,1803 55690,714 55691,500 55692,493 55692,586 55693,450 55694,493 55696,392 55697,1132 55698,781 55699,611 55700,2979 55701,41 55702,1140 55702,3474 55703,1544 55703,3207 55704,151 55704,202 55704,841 55704,1425 55704,1474 55704,30331 55705,602 55706,2979 55708,3804 55709,500 55710,1132 55711,781 55712,1096 55712,2704 55714,1381 55715,852 55715,3003 55717,55718 55719,1132 55720,781 55721,676 55722,254 55722,557 55722,1939 55723,252 55724,55725 55724,191777 55726,2979 55727,34 55727,35 55727,872 55728,30 55730,1132 55731,781 55732,79 55733,222 55733,657 55733,760 55733,1368 55734,422 55736,602 55737,147 55738,515 55739,50 55740,30 55742,81 55744,269 55745,788 55746,919 55747,1167 55747,2979 55748,644 55749,1132 55750,781 55752,1132 55753,781 55754,83 55755,1983 55756,392 55757,217 55758,1707 55759,158 55760,290 55760,714 55760,1511 55760,2206 55760,33424 55760,94134 55760,245910 55761,83 55762,1052 55762,1368 55763,838 55764,68 55764,818 55765,8854 55766,2312 55767,30 55768,1132 55769,781 55770,676 55771,55772 55773,536 55774,119 55774,577 55774,1400 55774,1927 55775,1370 55777,1132 55778,781 55780,818 55781,1132 55782,781 55783,1983 55784,1181 55785,1267 55786,187 55787,1085 55787,1210 55787,3182 55788,302 55790,147 55791,626 55793,1151 55794,222 55794,657 55795,5547 55796,217 55796,467 55797,1132 55798,781 55799,137 55800,106 55801,784 55802,298 55803,485 55804,875 55805,83 55805,126 55805,872 55805,957 55805,6424 55808,134 55808,8714 55809,267 55810,422 55811,56 55812,68 55813,233 55813,332 55813,3135 55814,1962 55815,83 55817,3413 55818,2719 55819,3370 55819,14453 55820,1 55821,1462 55821,8537 55822,393 55823,151 55824,1454 55825,187 55826,136 55827,305 55827,1188 55827,2253 55827,4101 55827,13538 55827,142426 55828,1127 55828,1566 55829,302 55829,2116 55830,1132 55831,781 55832,58 55832,403 55832,586 55832,693 55832,1118 55832,5250 55832,113878 55833,68 55834,5310 55835,422 55836,56 55837,1381 55838,55839 55838,71153 55838,125613 55840,83 55840,217 55840,278 55840,536 55840,577 55840,1429 55840,1608 55840,13575 55841,718 55842,55843 55844,422 55845,56 55846,392 55847,55848 55847,76169 55849,147 55849,158 55849,406 55849,8055 55849,55849 55849,102560 55849,220502 55850,6556 55851,3413 55852,422 55853,56 55854,1419 55855,50 55855,389 55856,58 55857,46 55858,392 55858,1014 55860,1132 55861,781 55862,811 55863,1659 55864,68 55865,483 55866,3069 55867,63 55867,422 55868,1715 55869,39247 55870,217 55871,278 55872,16687 55873,1309 55874,392 55875,1402 55876,349 55877,5469 55878,2083 55879,1531 55880,1323 55881,102 55882,1326 55883,408 55884,631 55884,1085 55884,1785 55884,3115 55885,717 55886,493 55886,682 55886,72439 55887,217 55887,222 55887,379 55887,1019 55887,1417 55887,5343 55889,2048 55890,55891 55892,217 55893,83 55894,278 55895,1201 55896,290 55896,859 55897,1046 55898,3630 55899,309 55899,310 55900,79 55901,577 55902,1556 55903,301 55905,135 55905,596 55905,784 55905,1052 55905,1368 55906,406 55907,83 55908,18726 55909,536 55910,536 55911,200 55912,272 55913,55914 55915,163 55916,4 55916,5 55917,663 55917,818 55917,1370 55917,1821 55919,1132 55920,392 55921,781 55922,72 55923,932 55924,120 55924,861 55924,162599 55925,55926 55928,171 55929,328 55929,7124 55930,801 55930,1140 55931,233 55931,240 55932,1411 55933,920 55934,7124 55935,140 55935,697 55935,5540 55936,34 55936,35 55936,217 55936,536 55937,1711 55937,1836 55938,417 55939,202 55939,203 55940,602 55941,23701 55942,2574 55943,151 55944,2867 55944,22880 55945,2045 55946,379 55947,356 55948,301 55948,615 55948,968 55949,1782 55950,3 55951,1962 55952,515 55954,7124 55955,309 55955,310 55955,483 55956,6556 55957,718 55958,439 55959,1181 55960,640 55961,1893 55962,2045 55963,438 55963,811 55963,1247 55963,3148 55963,5213 55965,9005 55966,233 55966,240 55967,875 55968,805 55969,1132 55970,781 55971,349 55972,206 55973,17588 55974,406 55974,55849 55975,247 55976,676 55978,83 55979,130 55980,1181 55981,240 55982,184 55984,222 55984,1618 55985,602 55986,1188 55988,602 55989,107 55990,79 55990,217 55990,435 55991,55992 55993,376 55994,55995 55995,72912 55995,92762 55995,93739 55995,100540 55995,105027 55995,120350 55995,150246 55995,174586 55996,602 55997,79 55998,55999 56000,56001 56002,1893 56002,4294 56003,3724 56004,1132 56005,781 56006,147 56006,158 56006,1803 56006,89035 56008,447 56008,538 56008,934 56008,3804 56009,20359 56010,3695 56011,56012 56013,10 56013,1623 56014,1983 56015,269 56016,56017 56018,784 56019,422 56020,56 56021,56022 56023,86 56024,207 56025,83 56027,862 56028,392 56029,254 56029,557 56030,294 56031,56032 56033,6303 56035,557 56036,56037 56036,68069 56036,73803 56036,78094 56039,372 56039,907 56039,968 56039,1544 56039,1837 56039,1955 56040,379 56040,536 56040,1618 56041,611 56042,1287 56043,56044 56045,9029 56047,222 56048,557 56049,557 56050,1556 56051,50 56052,1983 56053,72 56054,30 56055,56056 56057,56058 56059,20 56060,207 56061,1858 56062,1860 56063,56064 56065,202 56065,203 56066,17557 56067,44 56068,56069 56068,112122 56070,868 56071,30 56071,7124 56072,158 56073,83 56074,30 56075,5547 56076,875 56078,298 56079,485 56080,366 56081,1803 56082,184 56084,56085 56086,56087 56088,30 56089,481 56089,911 56089,1449 56090,5976 56091,918 56092,1058 56093,602 56094,602 56095,1454 56097,30 56098,366 56099,72 56100,14996 56101,56102 56103,56102 56103,132469 56104,1983 56105,5976 56107,15 56108,65 56111,1983 56113,1983 56114,56115 56116,9560 56117,206 56118,146 56119,1623 56120,273 56120,274 56120,422 56121,1858 56122,1860 56123,79 56124,1773 56125,56126 56127,56126 56129,3 56129,5874 56130,50887 56131,392 56132,442 56133,30 56134,72 56135,56136 56137,17334 56138,980 56139,30 56140,1612 56141,779 56142,515 56143,163 56144,72 56145,392 56145,809 56146,23010 56147,72 56148,3148 56150,259 56150,272 56150,393 56150,577 56150,599 56150,726 56150,788 56150,859 56150,980 56150,1105 56150,1381 56150,1388 56150,1531 56150,1973 56150,2178 56150,4455 56150,4545 56150,23487 56150,35486 56150,56150 56150,118436 56150,118438 56150,139010 56150,142952 56150,153787 56151,56152 56153,56154 56155,2436 56156,30 56157,56158 56159,178 56159,859 56159,3209 56160,83 56161,4 56161,5 56162,30 56163,56164 56165,1224 56166,422 56167,175 56169,442 56170,1363 56171,30 56172,4453 56173,422 56174,56 56175,56176 56177,30 56178,137 56179,106 56180,5440 56181,211 56182,304 56183,56184 56185,30 56186,588 56186,590 56186,1419 56187,1571 56188,1977 56188,1978 56189,422 56190,30 56191,1773 56192,30 56193,56194 56195,255 56196,56197 56198,1238 56199,349 56200,233 56201,302 56202,704 56203,2244 56204,931 56205,515 56207,379 56208,346 56209,586 56210,1983 56211,240 56212,841 56213,355 56214,668 56216,1274 56218,163 56219,56220 56221,1452 56222,58 56223,46 56224,1429 56224,3467 56224,3507 56225,493 56225,788 56225,1927 56226,50 56226,158 56226,285 56226,307 56226,4192 56226,4193 56227,1132 56228,781 56229,2867 56229,22880 56230,479 56231,393 56231,726 56232,306 56232,307 56233,298 56234,485 56235,2506 56236,298 56237,485 56238,3085 56239,9195 56241,640 56243,298 56244,485 56245,668 56248,298 56249,485 56250,240 56251,918 56252,366 56253,366 56254,248 56255,366 56256,623 56256,1805 56256,4760 56257,602 56258,2506 56259,56 56259,147 56260,1983 56265,1082 56266,1881 56267,536 56268,1983 56269,30 56271,1634 56272,323 56273,298 56274,79 56274,273 56274,274 56274,21944 56275,6750 56276,1082 56277,83 56278,1983 56280,137 56282,1082 56285,704 56286,1127 56287,1983 56289,18726 56290,640 56291,640 56292,640 56293,163 56294,397 56294,142430 56294,142879 56295,130 56296,56297 56298,106 56299,72 56300,422 56301,422 56302,422 56304,422 56305,422 56306,422 56307,422 56308,422 56309,7124 56311,79 56312,269 56313,1983 56314,301 56315,22 56315,861 56316,577 56317,697 56320,760 56320,1149 56322,1241 56324,37 56325,217 56327,30 56328,1368 56329,581 56330,932 56331,1983 56332,13661 56333,1381 56334,467 56334,868 56334,162599 56335,442 56336,536 56336,1274 56337,392 56338,1531 56339,30 56340,1132 56341,781 56342,18726 56343,328 56343,7124 56345,349 56345,697 56345,3260 56347,163 56348,3949 56349,160 56349,259 56349,994 56349,19010 56350,44725 56352,893 56354,1556 56355,2048 56356,72 56358,107 56358,4823 56359,422 56360,56 56361,1983 56362,1871 56363,86 56364,66 56365,433 56365,467 56365,872 56365,1010 56365,1298 56366,356 56367,1132 56368,781 56369,202 56369,203 56369,21944 56371,673 56371,1130 56372,1058 56374,68 56374,4220 56376,7124 56378,2424 56379,481 56380,222 56381,188 56382,182 56386,333 56387,192 56388,500 56389,1962 56390,1052 56391,1882 56392,1893 56393,2775 56394,54 56396,211 56396,366 56396,500 56397,287 56397,22293 56398,1711 56399,1789 56400,527 56400,88450 56400,95152 56400,140778 56400,192861 56400,207038 56400,264504 56401,305 56401,1082 56401,1807 56402,298 56403,485 56404,911 56404,972 56405,2915 56406,50 56406,1631 56407,1298 56409,97 56409,217 56411,248 56412,99 56412,356 56412,1140 56412,1888 56413,1531 56414,694 56416,15573 56417,1977 56417,1978 56418,1893 56419,83 56420,298 56421,485 56422,292 56422,673 56423,577 56424,577 56425,1179 56426,1381 56426,1639 56428,264 56428,56429 56428,57827 56428,76717 56428,99019 56428,104864 56428,104887 56428,108283 56428,109794 56428,123504 56428,204383 56430,752 56430,2353 56430,124668 56431,515 56431,1052 56431,1267 56431,1579 56431,1893 56431,2312 56431,3695 56432,30331 56433,5405 56434,151 56436,3413 56437,1983 56439,779 56440,861 56441,2775 56443,447 56444,949 56444,2421 56445,1284 56446,5547 56447,5405 56448,605 56449,1688 56450,309 56450,310 56450,5718 56451,2266 56452,2351 56453,644 56454,134 56456,518 56458,2424 56459,56460 56462,3695 56464,1805 56465,240 56466,217 56467,1653 56468,581 56471,676 56473,397 56475,859 56476,503 56476,704 56477,2744 56479,30236 56480,718 56481,809 56482,56483 56486,118 56486,4597 56487,4453 56488,19443 56489,140 56489,389 56489,671 56489,1167 56490,1980 56490,8991 56491,34 56491,35 56492,664 56492,20359 56493,6068 56494,2995 56495,8992 56497,1381 56497,56498 56499,72 56500,442 56501,779 56503,298 56504,406 56505,50 56506,366 56507,72 56508,2828 56509,516 56510,1983 56511,56512 56513,184 56514,346 56515,247 56516,258 56517,1181 56518,2266 56519,1515 56521,1127 56522,422 56523,56 56524,346 56525,278 56526,187 56527,206 56528,1983 56530,1983 56532,1323 56534,102 56535,1326 56536,408 56537,134 56537,873 56537,1082 56537,1955 56538,875 56539,809 56539,2292 56542,388 56543,920 56544,577 56545,392 56546,56547 56548,1319 56549,1267 56550,72 56551,442 56552,292 56552,483 56553,442 56556,447 56557,779 56557,1515 56557,68069 56558,202 56558,203 56559,2775 56560,447 56561,2775 56562,447 56563,56564 56565,356 56566,3413 56567,146 56567,673 56567,685 56567,827 56567,1634 56567,2460 56567,21442 56567,92476 56568,2372 56569,744 56570,312 56570,1167 56571,611 56572,1983 56573,255 56574,8788 56575,1849 56576,1531 56578,875 56579,30 56580,615 56581,255 56582,832 56583,332 56583,3135 56584,34 56584,35 56584,389 56584,536 56584,891 56584,1019 56584,1052 56584,1531 56584,7768 56584,28130 56585,1082 56587,356 56588,493 56590,1608 56591,72 56592,344 56593,285 56594,1782 56595,783 56596,296 56596,9030 56597,1544 56598,415 56599,255 56600,34 56600,35 56600,222 56600,2266 56601,1392 56602,1181 56602,1590 56603,83 56604,872 56605,178 56606,536 56607,2671 56608,872 56609,287 56609,809 56610,1007 56611,247 56612,1014 56612,1796 56613,442 56614,392 56615,1149 56617,248 56618,1085 56619,10 56620,483 56621,442 56622,158 56623,48 56624,140 56625,1639 56626,875 56627,1983 56628,30 56629,41 56629,1012 56629,1177 56630,602 56631,83 56632,697 56632,5469 56633,868 56634,151 56635,602 56637,1033 56638,602 56639,5101 56639,5102 56640,1363 56640,1454 56641,1082 56642,30 56643,366 56644,304 56644,775 56644,1140 56644,3474 56644,4411 56645,1608 56646,932 56646,1298 56647,392 56649,310 56650,356 56650,631 56650,1119 56651,1659 56652,346 56653,631 56654,640 56655,147 56655,158 56656,516 56657,56658 56659,557 56660,1983 56661,275 56662,56663 56664,4355 56665,1844 56666,346 56667,261 56667,333 56668,467 56668,518 56668,50176 56668,52232 56669,1227 56669,1229 56669,86416 56670,1082 56671,455 56672,1479 56673,536 56675,247 56677,292 56679,389 56679,1072 56680,184 56682,18726 56683,255 56684,1313 56685,388 56686,163 56687,1983 56688,376 56689,4903 56690,376 56691,885 56692,515 56692,647 56692,801 56692,835 56692,1893 56692,2626 56692,5440 56694,704 56695,56696 56697,563 56698,1188 56699,56700 56701,56700 56702,56700 56703,949 56704,1235 56704,1335 56705,83 56706,349 56707,271 56708,30 56709,1962 56710,68 56710,2590 56710,66297 56711,2590 56713,65 56714,304 56715,1001 56716,56717 56718,225 56719,72 56720,344 56721,285 56722,949 56723,1402 56724,36442 56725,1983 56726,3138 56727,918 56728,557 56729,72 56730,344 56731,285 56732,640 56733,56734 56735,261 56735,333 56737,818 56738,1235 56738,1335 56739,557 56740,557 56741,178 56742,3111 56743,4549 56744,442 56745,302 56746,1082 56747,56748 56749,56750 56751,58 56751,86 56751,167 56751,240 56751,301 56751,372 56751,444 56751,567 56751,589 56751,605 56751,615 56751,631 56751,720 56751,801 56751,843 56751,907 56751,968 56751,972 56751,973 56751,1010 56751,1122 56751,1124 56751,1140 56751,1167 56751,1231 56751,1241 56751,1284 56751,1298 56751,1309 56751,1436 56751,1522 56751,1544 56751,1564 56751,1782 56751,1785 56751,1818 56751,1837 56751,1893 56751,1955 56751,2083 56751,2191 56751,2372 56751,2557 56751,2620 56751,2979 56751,3193 56751,3194 56751,3207 56751,3218 56752,1132 56753,781 56754,83 56755,225 56756,147 56756,1247 56757,255 56758,10 56759,17772 56760,1235 56760,1335 56760,1462 56761,1247 56761,1644 56761,1844 56762,250 56762,1684 56763,44 56764,83 56765,72 56766,344 56767,285 56769,1644 56770,3370 56770,14453 56771,1363 56772,4611 56773,3247 56773,7358 56773,7363 56774,3999 56775,852 56776,72 56777,72 56778,704 56779,72 56780,1285 56781,269 56782,592 56783,72 56784,372 56785,72 56786,3069 56787,65 56788,83 56788,389 56788,455 56788,805 56788,1718 56788,1756 56788,2779 56788,2784 56788,28130 56789,1608 56790,4903 56791,217 56791,920 56792,56793 56795,56796 56797,5101 56797,6627 56798,4594 56799,34 56799,35 56799,379 56799,2784 56800,1983 56801,202 56801,203 56801,346 56801,1531 56802,30 56803,861 56804,65 56805,56806 56805,57835 56807,733 56808,2506 56810,30 56811,10 56812,515 56813,1058 56814,77 56815,30 56816,794 56816,17346 56817,422 56818,422 56819,422 56820,422 56821,422 56822,422 56823,422 56824,422 56826,107 56827,56828 56829,207 56830,366 56831,366 56832,980 56833,81 56834,56835 56836,56837 56838,10 56839,30 56840,175 56841,72 56842,54064 56843,1980 56843,8991 56844,215 56845,56846 56847,330 56848,206 56849,4810 56850,972 56852,274 56852,1210 56852,1980 56853,393 56855,56856 56857,146 56858,56859 56860,30 56861,56862 56863,602 56864,255 56865,726 56866,240 56867,452 56868,919 56869,167 56871,5906 56872,233 56873,56874 56875,991 56876,900 56877,264 56878,56879 56880,1267 56881,515 56883,372 56884,56884 56885,586 56886,56887 56888,15 56889,355 56890,1559 56891,56892 56891,57521 56891,57700 56893,1085 56893,75912 56894,56895 56894,63842 56894,69400 56894,70001 56897,663 56897,664 56898,1370 56898,1821 56899,240 56900,1085 56900,75912 56901,644 56902,1707 56903,852 56903,19443 56904,1353 56905,17334 56906,1844 56907,1238 56908,1267 56910,788 56911,433 56911,918 56912,663 56912,664 56913,2574 56914,406 56914,779 56915,56916 56917,1085 56918,1796 56919,2506 56920,2506 56921,852 56921,48505 56922,1983 56924,392 56925,640 56926,640 56927,1132 56928,781 56929,192 56932,56933 56934,726 56936,1096 56937,1639 56938,202 56938,203 56938,493 56939,34 56939,158 56940,269 56941,4252 56942,83 56943,21944 56944,859 56945,1133 56947,1082 56947,1544 56949,2590 56950,10 56951,56952 56954,1858 56955,1860 56956,430 56957,17228 56959,4980 56960,2929 56961,187 56962,2373 56963,431 56964,3653 56965,525 56965,1188 56966,1085 56968,134 56969,1102 56970,1326 56973,417 56974,8149 56975,202 56975,203 56976,1118 56977,676 56979,1309 56980,640 56981,581 56982,1240 56983,1118 56984,1001 56985,493 56987,202 56987,203 56988,211 56989,261 56991,500 56992,252 56992,41170 56993,515 56993,1127 56994,647 56995,356 56996,56997 56999,602 57000,920 57001,671 57001,1096 57001,2915 57002,333 57002,557 57002,636 57002,663 57002,664 57002,14483 57003,505 57004,1266 57004,2931 57005,2367 57006,685 57006,5591 57006,6068 57008,439 57008,15573 57009,852 57010,1085 57011,1983 57012,1531 57013,640 57015,94 57015,2787 57016,4101 57017,676 57018,2411 57019,1983 57020,1983 57022,21944 57023,389 57024,718 57025,30 57025,267 57025,278 57025,328 57025,440 57025,622 57025,3247 57026,406 57027,2048 57028,3999 57029,217 57030,158 57031,2371 57032,682 57033,1454 57034,14556 57035,718 57036,567 57036,1284 57036,2557 57037,56 57038,1140 57038,5547 57039,273 57039,274 57040,435 57042,417 57044,30 57045,57046 57047,289 57047,290 57049,626 57050,2274 57051,195 57052,929 57053,3069 57054,47 57054,417 57054,1564 57054,2469 57055,1132 57056,781 57057,217 57059,1474 57060,602 57061,1370 57062,57063 57062,70566 57062,250349 57064,1313 57065,500 57065,718 57066,1167 57067,1132 57068,781 57069,298 57070,346 57073,1326 57074,111 57076,4193 57076,8822 57078,217 57079,83 57081,586 57081,1175 57088,973 57090,1977 57090,1978 57092,392 57094,285 57094,2779 57094,2784 57095,43203 57096,87 57096,1151 57105,222 57107,920 57116,1181 57117,631 57118,57119 57120,171 57122,1590 57124,346 57125,459 57125,852 57125,1160 57127,3422 57128,58 57129,46 57130,57131 57132,457 57133,147 57133,158 57133,406 57134,273 57134,274 57135,515 57136,130 57136,1564 57137,2116 57138,2116 57140,2116 57141,8992 57142,2116 57143,30 57143,259 57143,328 57143,440 57143,577 57143,596 57143,788 57143,794 57143,859 57143,1070 57143,1105 57143,1179 57143,1368 57143,2253 57143,4455 57143,138686 57144,304 57144,356 57144,852 57144,2436 57144,48505 57146,57145 57147,209 57148,1962 57149,5213 57150,3138 57151,360 57151,392 57151,500 57152,2506 57153,2506 57154,158 57155,2506 57156,1132 57157,781 57159,868 57160,3474 57161,3328 57161,4771 57162,2266 57163,1556 57164,973 57165,500 57166,5405 57168,919 57169,1531 57170,8855 57171,5405 57172,626 57173,81 57174,1282 57175,1140 57176,57177 57178,10 57178,113156 57179,2116 57181,980 57182,66 57182,83 57182,301 57182,314 57182,467 57182,868 57182,1122 57182,1241 57182,1782 57182,1844 57182,2191 57182,31206 57184,1326 57185,247 57185,2867 57185,22880 57186,360 57187,217 57187,222 57187,536 57187,18831 57189,1566 57190,298 57191,917 57192,852 57193,72 57193,285 57194,209 57194,1631 57195,21944 57196,1179 57197,3422 57198,2506 57200,57201 57202,57203 57204,743 57205,186 57205,877 57205,968 57205,1284 57205,1955 57205,2572 57205,3756 57206,3 57206,1608 57207,467 57208,312 57208,1240 57208,1454 57208,2372 57208,5591 57208,15523 57210,1238 57212,2506 57213,2506 57214,57215 57216,3 57217,717 57218,86 57219,422 57220,56 57221,1010 57222,685 57223,875 57224,30 57225,255 57227,2506 57228,206 57229,344 57229,1711 57229,1836 57231,875 57232,37 57232,1231 57232,1782 57232,5662 57233,151 57234,483 57236,1274 57237,1639 57238,1579 57239,9018 57240,83 57241,1818 57242,1983 57243,259 57243,272 57244,392 57245,57246 57247,644 57248,1983 57249,217 57249,435 57249,536 57249,1284 57250,483 57250,6556 57251,57252 57253,1227 57253,1229 57253,86416 57254,9323 57255,57256 57257,272 57258,392 57259,202 57259,203 57259,925 57260,255 57261,818 57262,1983 57263,255 57264,57265 57264,68069 57264,83910 57266,313 57267,8598 57268,17384 57269,269 57270,306 57270,307 57271,250 57271,1684 57272,3069 57273,704 57273,1265 57273,1266 57274,83 57275,302 57276,973 57277,255 57278,473 57278,8149 57279,406 57280,225 57281,151 57282,72 57283,1556 57284,861 57285,22 57286,8270 57287,30 57288,79 57289,57290 57291,376 57292,19413 57293,328 57293,7124 57294,406 57295,422 57296,56 57297,406 57298,809 57299,392 57300,57301 57302,57303 57304,57305 57306,30 57307,57308 57309,83 57310,255 57311,187 57312,83 57313,1983 57314,30 57315,30 57316,1167 57317,15 57317,2260 57318,55849 57319,57320 57321,30 57322,9021 57323,1769 57324,10 57325,1289 57326,640 57327,406 57328,57329 57330,94 57330,430 57330,1235 57330,1335 57330,2787 57331,6179 57331,6180 57332,57333 57334,7194 57335,83 57335,3094 57336,10 57336,222 57336,588 57336,590 57336,1419 57337,254 57338,657 57339,22924 57340,1326 57341,83 57342,57343 57344,433 57345,1368 57346,433 57347,779 57348,1210 57349,3182 57350,1204 57351,694 57351,2775 57352,5405 57353,536 57353,682 57353,57354 57354,1011 57354,2159 57354,4303 57354,225774 57355,83 57356,338 57357,557 57358,8719 57359,138 57360,865 57361,557 57362,137 57363,21944 57364,118 57364,4597 57365,8719 57366,138 57367,865 57368,557 57369,137 57370,21944 57371,118 57371,4597 57372,364 57373,57374 57375,8719 57376,138 57377,865 57378,557 57379,2367 57380,137 57381,21944 57382,118 57382,4597 57383,8719 57384,138 57385,865 57386,557 57387,137 57388,21944 57389,118 57389,4597 57390,557 57391,557 57392,57393 57394,44 57395,2506 57396,2506 57397,219 57397,336 57397,397 57397,1130 57397,30331 57398,424 57401,366 57402,907 57403,676 57404,10 57405,250 57405,1684 57406,1722 57407,289 57407,290 57408,4548 57409,149 57410,356 57410,14550 57411,852 57411,3630 57413,1370 57414,489 57416,336 57416,406 57416,1181 57418,247 57418,252 57418,925 57418,1119 57418,1179 57418,1220 57418,1222 57418,41170 57419,222 57420,760 57421,779 57422,3960 57423,7270 57424,57425 57426,57425 57427,171 57428,4903 57429,1608 57430,57431 57432,57433 57434,57435 57436,57437 57438,704 57439,372 57440,203 57440,2931 57441,81 57442,3148 57443,261 57443,333 57444,1707 57445,2506 57446,187 57447,1381 57448,8270 57449,57450 57451,957 57451,1815 57452,1980 57452,8991 57453,5375 57455,406 57456,3999 57457,862 57458,1016 57459,57460 57461,178 57462,861 57463,163 57464,57465 57466,57467 57468,57469 57470,3413 57471,72 57472,2506 57473,2506 57475,147 57476,147 57476,779 57477,4453 57478,298 57478,852 57478,862 57478,8855 57479,57480 57481,72 57482,301 57482,372 57483,57484 57483,74681 57483,98648 57486,2989 57486,2991 57487,251 57487,1512 57487,5992 57488,57489 57490,255 57491,8788 57492,4066 57493,57494 57495,57496 57497,83 57498,850 57499,57500 57501,1323 57501,3370 57501,3872 57502,83 57505,225 57508,8884 57509,57510 57509,64309 57511,52345 57511,87346 57511,115001 57511,122712 57511,145672 57511,147000 57511,155592 57511,156030 57511,156153 57511,213816 57512,1085 57513,7652 57514,71 57514,278 57514,304 57514,390 57514,467 57514,4220 57514,6059 57515,795 57517,57518 57519,57520 57522,366 57523,366 57524,57525 57526,34 57526,35 57526,1033 57527,366 57528,366 57529,233 57530,57531 57532,57533 57532,82389 57532,85342 57532,100033 57534,57535 57536,515 57537,57538 57539,178 57540,355 57542,57543 57542,91752 57544,973 57545,211 57545,7363 57546,1556 57547,861 57548,22 57549,424 57550,30 57551,83 57552,57553 57555,1556 57556,861 57557,22 57558,417 57559,1132 57560,781 57561,336 57561,406 57564,875 57566,581 57567,255 57568,1085 57569,4611 57570,57571 57572,932 57573,1608 57574,79 57575,783 57576,57577 57578,1140 57580,447 57581,57582 57583,818 57583,1353 57584,17334 57585,1707 57586,366 57587,57588 57589,298 57590,485 57591,647 57592,1882 57593,57594 57595,14989 57596,2116 57597,83 57598,1203 57599,392 57600,525 57601,1962 57602,240 57603,72 57604,134 57605,875 57607,592 57607,1082 57608,2296 57610,4810 57612,1033 57613,1556 57614,861 57615,22 57616,9560 57617,1556 57618,861 57619,22 57620,57621 57622,6303 57623,713 57624,333 57624,868 57625,57626 57627,57628 57627,69836 57629,424 57630,8788 57631,841 57632,2506 57633,440 57634,233 57634,1608 57635,18726 57637,718 57638,2590 57639,333 57640,333 57640,1893 57641,1556 57642,861 57643,22 57644,1227 57644,1229 57644,1252 57644,1253 57644,21944 57644,86416 57645,2574 57646,50 57647,163 57648,56 57649,21944 57650,1556 57651,861 57652,22 57653,481 57655,818 57655,907 57656,349 57657,207 57658,50 57659,5976 57660,57660 57661,57662 57663,929 57664,505 57665,505 57666,57667 57668,15 57669,72 57670,344 57671,285 57672,57673 57674,57673 57675,483 57676,5874 57677,376 57678,23701 57680,1082 57681,310 57682,349 57683,622 57684,18726 57685,704 57686,163 57688,24332 57690,57691 57692,1893 57694,2048 57695,72 57696,24505 57698,2105 57699,289 57699,290 57701,34 57701,1776 57701,4193 57703,2506 57704,2506 57705,2506 57706,493 57707,57708 57709,2351 57710,3079 57711,104 57712,515 57713,30 57714,104 57715,57716 57717,417 57718,21944 57719,5440 57720,211 57721,875 57722,1511 57722,3069 57723,151 57724,920 57725,57726 57727,57728 57729,30 57730,57731 57730,65483 57734,676 57735,57736 57737,10 57738,57739 57738,102964 57741,8270 57742,2048 57744,2574 57744,17309 57745,57746 57747,187 57748,233 57749,3413 57750,366 57751,366 57752,515 57753,147 57753,158 57754,366 57755,366 57756,366 57757,634 57758,392 57759,107 57760,2416 57760,2417 57761,292 57762,338 57763,298 57764,1133 57765,3538 57766,57767 57766,94029 57768,355 57769,4504 57771,18726 57773,163 57773,2116 57774,57775 57776,57777 57776,91605 57778,2146 57779,57780 57781,309 57781,310 57782,1556 57783,861 57784,22 57785,1014 57786,859 57788,22 57788,287 57789,1881 57790,83 57791,57792 57793,7358 57793,7363 57794,18726 57795,163 57796,893 57797,30 57798,3695 57799,932 57802,535 57802,760 57803,581 57805,57806 57807,392 57808,636 57809,57810 57809,132322 57811,972 57812,1844 57813,57814 57815,211 57816,589 57817,72 57818,690 57819,2506 57820,640 57822,4355 57823,206 57824,1353 57826,195 57828,72 57829,57830 57831,1058 57832,349 57836,57837 57839,455 57839,2944 57839,6506 57840,72 57841,57842 57841,71207 57841,84966 57841,88657 57841,92192 57841,92475 57844,147 57844,149 57845,875 57846,3999 57847,676 57848,483 57850,872 57851,278 57851,615 57851,660 57851,781 57851,1262 57851,1274 57851,1718 57852,1983 57853,57854 57855,875 57856,77 57857,72 57858,57859 57860,72 57861,577 57862,57863 57864,2506 57865,1175 57866,7360 57867,57868 57869,187 57871,1363 57872,107 57872,805 57873,1210 57874,269 57875,2775 57876,1844 57877,344 57878,6051 57879,3161 57880,1247 57881,57882 57883,272 57884,1285 57885,5440 57886,3161 57887,17588 57888,2367 57889,1644 57890,16207 57891,676 57892,1033 57893,344 57896,704 57897,459 57898,3413 57899,171 57900,1132 57901,781 57902,305 57902,2206 57902,3247 57903,7124 57904,640 57905,57906 57907,222 57907,283 57907,455 57907,2266 57908,30 57909,4810 57910,200 57910,298 57910,302 57910,714 57910,1119 57910,1179 57910,1659 57910,1962 57910,2156 57910,2205 57910,6303 57910,33424 57910,245910 57911,72 57912,192 57913,3069 57914,30766 57915,1285 57916,57917 57919,252 57920,2209 57921,72 57922,6682 57923,4355 57924,779 57925,30 57926,5101 57927,72 57928,273 57928,274 57928,142433 57929,957 57929,1247 57929,1815 57929,1893 57930,30 57931,57932 57933,346 57934,79 57935,72 57936,30 57937,30 57938,72 57940,44 57941,72 57942,72 57943,417 57943,1235 57944,620 57945,206 57946,1181 57947,433 57948,31977 57949,557 57950,5906 57951,626 57952,278 57953,137 57954,862 57955,5906 57956,557 57957,433 57958,626 57959,278 57960,137 57961,862 57962,557 57963,557 57964,862 57965,779 57965,1132 57966,557 57967,557 57968,1983 57969,827 57970,211 57970,7363 57971,30 57972,346 57973,1881 57974,657 57975,22924 57976,406 57978,211 57980,349 57981,57981 57982,57983 57984,818 57985,1285 57986,349 57987,310 57988,704 57989,5366 57990,146 57991,58 57992,46 57993,4411 57994,57995 57996,57997 57998,57999 58000,1776 58000,4193 58001,34 58001,158 58002,21487 58002,22880 58003,30 58004,477 58005,30 58006,58007 58006,76917 58006,92629 58006,149489 58006,257273 58006,259970 58006,260043 58008,147 58008,149 58009,422 58010,422 58011,422 58012,422 58013,422 58014,422 58015,422 58016,4691 58017,422 58018,422 58019,500 58021,58022 58023,875 58024,875 58025,697 58026,1381 58027,332 58028,1181 58029,477 58030,477 58031,58032 58033,433 58034,310 58035,586 58036,310 58037,3161 58038,1983 58040,83 58041,171 58042,207 58043,7 58044,72 58045,58046 58047,704 58048,536 58048,4672 58048,7698 58049,72 58050,2436 58051,811 58052,376 58053,254 58054,118 58054,4597 58055,72 58056,195 58057,58058 58059,328 58059,7124 58060,30 58061,356 58062,1370 58063,2048 58064,3538 58065,292 58066,294 58067,296 58068,5547 58069,298 58070,58071 58073,346 58074,760 58075,346 58076,58077 58078,704 58079,4823 58080,255 58081,58082 58083,203 58083,2931 58084,3960 58085,233 58086,58087 58088,58087 58089,30 58090,1238 58091,58092 58091,102275 58091,125788 58091,126399 58091,129518 58093,104 58093,137 58094,515 58095,1181 58096,2116 58097,1452 58098,1541 58099,918 58100,1210 58101,718 58102,3148 58103,634 58104,477 58105,30 58106,8270 58107,58108 58109,137 58110,30 58111,919 58112,355 58113,647 58114,344 58115,255 58115,9001 58115,15636 58115,28130 58115,58116 58117,310 58117,805 58118,207 58119,58120 58121,366 58122,7117 58123,1381 58124,58125 58126,2116 58127,366 58128,79 58129,366 58130,207 58131,147 58131,158 58131,192 58131,406 58131,779 58131,1181 58131,1515 58132,15 58133,1707 58134,1010 58135,1616 58136,415 58137,704 58138,1085 58139,1033 58140,58141 58142,2373 58143,58144 58145,41 58145,760 58146,206 58148,1132 58149,781 58150,500 58151,146 58152,1858 58153,1860 58154,588 58154,590 58155,392 58156,1639 58157,298 58158,485 58159,192 58159,1181 58160,346 58161,326 58162,671 58163,147 58164,1639 58165,58166 58167,184 58168,671 58169,406 58169,55849 58170,1132 58171,781 58172,30 58173,750 58173,783 58173,1319 58174,3321 58175,217 58175,788 58176,255 58178,652 58179,1893 58180,215 58181,149 58182,1058 58183,205 58183,485 58183,611 58184,779 58185,364 58186,1132 58187,781 58188,305 58189,30 58190,980 58191,346 58192,1381 58193,207 58193,302 58193,2373 58193,9457 58194,1381 58195,640 58196,640 58197,83 58198,392 58199,346 58200,918 58201,58 58202,46 58203,195 58203,1474 58203,1849 58204,862 58205,79 58206,1818 58208,1319 58209,72 58210,1722 58210,3367 58211,1722 58213,420 58215,149 58215,406 58216,3069 58217,160 58218,48505 58219,184 58221,425 58222,809 58224,379 58224,388 58226,973 58227,58228 58229,136 58229,3247 58230,206 58231,1983 58232,171 58233,581 58234,58235 58236,163 58237,392 58238,911 58241,932 58242,8855 58243,1085 58244,631 58244,1085 58244,1785 58246,875 58247,911 58248,779 58249,346 58250,7652 58251,13980 58252,644 58252,918 58253,18726 58254,346 58255,163 58256,5405 58257,1132 58258,781 58259,58260 58262,58263 58264,2379 58265,50 58266,657 58267,149 58267,622 58268,611 58268,1718 58271,515 58271,872 58271,1052 58271,1509 58271,1579 58271,1639 58271,1893 58271,2626 58271,6695 58272,304 58273,422 58274,21487 58275,68 58275,1285 58275,1888 58275,2590 58276,609 58276,875 58276,1888 58277,1556 58278,1240 58279,4691 58282,1298 58284,1010 58285,736 58286,827 58288,151 58289,631 58289,775 58289,999 58289,1284 58289,1326 58289,2209 58292,931 58292,1118 58293,7316 58294,1411 58296,158 58298,58299 58300,79 58301,1608 58302,83 58302,2784 58302,28130 58303,1132 58304,781 58305,644 58306,19443 58307,2379 58308,1509 58309,1309 58310,525 58310,1309 58311,1309 58312,535 58312,872 58313,968 58314,72 58315,422 58316,56 58317,16196 58318,1274 58320,1007 58321,861 58322,2867 58322,22880 58323,1132 58324,781 58325,30 58326,72 58327,344 58328,285 58329,6298 58330,671 58330,1068 58331,240 58332,415 58332,2750 58333,137 58334,477 58335,605 58336,406 58337,406 58338,1531 58339,58340 58339,72464 58339,83179 58339,105014 58341,972 58341,7117 58342,20004 58343,3111 58344,422 58345,30 58346,1132 58347,781 58348,1132 58349,781 58350,158 58350,1181 58351,1977 58351,1978 58352,30 58353,298 58354,58355 58356,1579 58356,1639 58357,968 58358,644 58359,497 58360,209 58362,58363 58364,1551 58365,406 58366,676 58367,248 58368,118 58368,4597 58369,278 58371,30 58372,302 58372,433 58372,2116 58372,6303 58373,1058 58373,2626 58374,718 58374,8180 58375,171 58377,1782 58378,50 58379,30 58380,577 58381,2045 58382,240 58383,720 58384,298 58385,485 58386,1370 58387,779 58388,30 58389,58390 58391,1132 58392,781 58393,596 58393,885 58393,1368 58393,5213 58395,34 58395,35 58396,58397 58398,58397 58399,187 58401,147 58401,158 58401,406 58402,2286 58403,261 58403,278 58403,283 58403,2319 58403,2646 58403,6789 58404,240 58405,1844 58406,567 58408,30 58409,299 58410,298 58411,485 58414,1955 58415,3413 58416,811 58417,3 58417,34 58417,35 58417,106 58417,158 58417,178 58417,192 58417,202 58417,203 58417,217 58417,251 58417,252 58417,337 58417,346 58417,435 58417,516 58417,586 58417,622 58417,640 58417,663 58417,664 58417,1181 58417,1220 58417,1222 58417,1243 58417,1294 58417,1370 58417,1590 58417,1635 58417,2567 58417,2931 58417,3161 58417,4192 58417,4193 58417,5874 58417,5976 58417,6119 58417,8598 58417,8771 58417,8811 58417,8822 58417,8907 58418,298 58419,485 58420,66 58420,171 58420,467 58420,693 58420,868 58420,1345 58420,81233 58421,1243 58422,147 58422,158 58422,1181 58423,22 58423,861 58424,388 58424,518 58424,911 58424,1345 58424,6638 58424,48505 58425,202 58425,203 58426,298 58427,485 58429,1132 58430,781 58433,151 58434,283 58435,1284 58436,247 58437,4611 58438,1544 58439,852 58439,3630 58440,5213 58441,1858 58442,1860 58444,34 58444,35 58444,973 58445,171 58446,56 58447,1284 58448,1634 58449,442 58449,1001 58449,3474 58450,217 58450,1796 58451,4611 58452,3069 58453,2646 58454,240 58454,818 58455,1262 58456,255 58456,918 58457,1515 58458,1181 58459,483 58460,1962 58461,72 58462,1188 58463,118 58463,4597 58464,83 58465,3474 58466,1078 58466,1659 58468,31122 58470,358 58471,4604 58472,932 58472,1016 58473,1284 58475,1511 58475,3069 58477,30 58478,261 58479,158 58480,783 58481,30 58482,146 58484,192 58484,861 58484,1659 58485,240 58486,1298 58486,1659 58486,1749 58487,30 58488,313 58488,2421 58489,240 58489,818 58490,657 58491,30 58492,8270 58493,611 58494,918 58495,255 58496,8598 58497,17384 58498,30 58499,875 58500,255 58501,991 58502,251 58503,240 58503,372 58503,1082 58503,1085 58503,1580 58503,1807 58503,2812 58503,4222 58503,6068 58503,212692 58504,697 58506,1858 58508,1860 58509,37 58509,611 58509,1449 58509,1782 58510,349 58511,1556 58512,2443 58513,247 58514,1881 58515,907 58515,973 58515,1210 58515,1544 58515,1715 58515,1785 58515,2797 58515,2991 58516,151 58517,1381 58518,758 58519,58520 58521,58522 58523,1509 58523,1551 58524,602 58525,217 58526,195 58527,248 58527,313 58527,685 58527,2460 58528,772 58529,3 58530,31977 58531,83 58533,994 58533,1432 58534,1707 58535,58536 58537,217 58538,1085 58539,30 58540,392 58541,7416 58542,994 58543,7416 58544,251 58545,1707 58547,1298 58548,563 58549,30 58550,192 58550,861 58550,1659 58551,247 58552,147 58552,439 58553,97 58554,32 58554,388 58554,779 58554,1240 58555,30 58556,195 58557,1511 58557,3069 58558,1773 58559,30 58559,66 58559,118 58559,151 58559,272 58559,273 58559,274 58559,422 58559,505 58559,602 58559,887 58559,1247 58559,4101 58559,4597 58559,4691 58559,68192 58561,6068 58562,392 58563,68 58564,240 58564,818 58565,4355 58565,4771 58566,20790 58567,4691 58568,255 58568,918 58569,1368 58569,5405 58570,2379 58571,1151 58571,1836 58572,30 58573,58574 58576,58577 58576,82143 58578,376 58579,72 58580,1332 58580,21944 58581,5547 58582,58583 58584,1119 58585,346 58586,20 58587,138 58588,72 58589,240 58590,3069 58591,93 58591,94 58592,58593 58594,346 58595,346 58596,259 58597,346 58598,3960 58599,17228 58600,1181 58602,346 58603,83 58604,83 58605,536 58606,2671 58607,1458 58608,298 58609,485 58610,2292 58612,147 58612,158 58613,137 58615,72 58616,30 58617,852 58617,3630 58617,185877 58618,72 58620,58621 58622,58623 58624,1707 58625,298 58626,485 58627,1983 58628,44 58629,206 58630,557 58631,557 58632,255 58633,2782 58634,5375 58635,104 58636,271 58637,784 58638,151 58639,1718 58640,147 58640,158 58640,2244 58641,255 58641,918 58642,1052 58643,931 58644,1707 58645,72 58646,203 58646,2931 58647,333 58649,2244 58650,207 58650,873 58650,1210 58651,72 58652,406 58653,50 58654,30 58655,609 58655,626 58656,58657 58658,392 58659,1639 58660,222 58661,182 58662,14989 58663,1417 58664,1289 58665,957 58666,718 58667,1 58667,20 58667,668 58667,1623 58668,72 58670,97 58671,305 58671,2206 58671,3247 58672,640 58673,298 58674,485 58675,422 58676,422 58677,422 58678,422 58679,422 58680,422 58681,422 58682,422 58683,422 58684,356 58684,3474 58685,422 58686,420 58686,843 58686,9015 58687,255 58688,1010 58689,192 58689,406 58689,1181 58690,3331 58691,973 58692,34 58692,35 58692,83 58693,58694 58693,67102 58695,920 58696,30 58697,1805 58698,1740 58699,953 58700,126 58701,17228 58702,393 58703,1132 58704,781 58705,118 58705,4597 58706,146 58707,875 58708,1007 58709,30 58710,255 58711,30 58712,247 58713,4060 58714,779 58715,557 58716,126 58717,676 58718,631 58719,628 58720,28072 58721,2697 58722,38634 58724,518 58724,1326 58724,14797 58725,10 58726,58727 58728,4192 58728,4193 58729,1370 58730,58731 58732,2506 58733,907 58734,1414 58735,3209 58736,58736 58737,147 58737,192 58737,406 58737,4192 58737,4193 58738,2048 58739,10 58740,3370 58740,14453 58741,58742 58743,8180 58744,58745 58744,64524 58746,118 58746,4597 58747,4980 58748,9457 58749,188 58750,137 58751,10 58752,393 58753,178 58754,202 58754,203 58755,1980 58755,8992 58756,9560 58757,435 58758,1776 58758,4193 58759,20790 58760,58761 58762,657 58763,192 58763,663 58763,664 58763,3872 58764,2944 58764,5976 58765,192 58766,58767 58768,2292 58770,4504 58771,1019 58772,58773 58774,1313 58775,841 58776,140 58778,640 58779,21944 58780,452 58781,1634 58782,273 58782,274 58783,1284 58784,1133 58784,22880 58785,438 58788,298 58789,485 58790,7358 58790,7363 58791,233 58793,393 58794,58795 58794,87573 58794,101423 58794,105231 58794,110970 58796,1240 58797,298 58798,485 58799,58800 58801,310 58802,515 58803,273 58803,274 58804,718 58805,634 58805,1160 58805,13980 58806,406 58806,779 58807,45023 58809,58810 58811,1007 58812,355 58813,634 58814,273 58814,274 58814,589 58815,406 58816,393 58817,623 58818,7360 58819,346 58820,46 58820,48 58820,56 58820,68 58820,72 58820,79 58820,83 58820,99 58820,120 58820,130 58820,167 58820,192 58820,217 58820,248 58820,261 58820,264 58820,283 58820,285 58820,301 58820,312 58820,315 58820,332 58820,349 58820,364 58820,372 58820,392 58820,393 58820,406 58820,417 58820,422 58820,435 58820,450 58820,455 58820,477 58820,493 58820,503 58820,509 58820,510 58820,525 58820,538 58820,575 58820,577 58820,589 58820,602 58820,615 58820,636 58820,660 58820,671 58820,682 58820,697 58820,702 58820,720 58820,726 58820,779 58820,783 58820,808 58820,850 58820,859 58820,907 58820,932 58820,968 58820,973 58820,980 58820,1007 58820,1010 58820,1052 58820,1082 58820,1105 58820,1117 58820,1122 58820,1149 58820,1181 58820,1210 58820,1231 58820,1240 58820,1257 58820,1282 58820,1294 58820,1326 58820,1332 58820,1353 58820,1370 58820,1429 58820,1454 58820,1465 58820,1467 58820,1479 58820,1515 58820,1522 58820,1531 58820,1539 58820,1749 58820,1756 58820,1805 58820,1807 58820,1849 58820,1858 58820,1871 58820,1877 58820,1893 58820,1949 58820,1955 58820,2083 58820,2178 58820,2191 58820,2353 58820,2421 58820,2424 58820,2557 58820,2572 58820,2590 58820,2775 58820,2779 58820,2812 58820,3115 58820,3207 58820,3218 58820,3252 58820,3260 58820,3585 58820,3623 58820,3630 58820,3695 58820,4545 58820,4637 58820,5667 58820,5906 58820,6059 58820,6506 58820,6789 58820,7092 58820,9743 58820,14945 58820,22799 58821,602 58823,698 58824,58825 58824,92698 58826,3538 58827,1434 58828,1143 58829,19443 58830,1132 58831,781 58832,58833 58834,298 58835,485 58836,10 58836,30 58836,175 58836,693 58836,1188 58836,2797 58836,3582 58836,127158 58837,209 58838,1858 58839,1860 58840,985 58841,252 58842,209 58843,280 58844,130 58845,4604 58847,366 58848,209 58849,1927 58850,9323 58851,6068 58852,366 58854,366 58855,366 58857,366 58858,209 58859,366 58860,192 58860,337 58860,8854 58861,366 58862,366 58863,366 58864,328 58865,298 58866,485 58867,346 58868,1381 58869,1745 58870,30 58872,209 58873,4177 58874,247 58875,248 58875,1133 58875,1881 58875,115659 58876,66 58876,171 58876,467 58876,868 58877,907 58877,932 58878,58879 58880,392 58880,1888 58880,3769 58881,171 58882,1033 58883,1359 58884,54 58885,30 58886,83 58887,58888 58889,10 58889,8854 58889,146764 58890,2989 58890,2991 58891,801 58892,202 58892,1127 58893,3111 58894,200 58894,2443 58895,41 58896,346 58897,392 58898,673 58899,1506 58900,415 58900,666 58900,3999 58901,918 58902,918 58903,918 58905,640 58906,301 58907,640 58908,640 58909,640 58910,1663 58911,41 58912,4 58912,5 58913,438 58913,1247 58913,3148 58913,164572 58914,202 58914,203 58915,200 58917,1247 58917,30331 58918,107 58919,6303 58920,30331 58921,999 58921,1001 58923,1149 58924,171 58926,1556 58927,861 58928,22 58929,7270 58930,1132 58931,781 58933,45310 58934,30 58936,340 58936,1096 58936,2460 58936,3003 58937,1267 58938,346 58939,72 58940,135 58942,581 58943,1531 58944,195 58946,1179 58947,346 58948,233 58948,301 58948,1235 58948,1335 58948,4146 58949,3069 58950,932 58951,1858 58952,1860 58953,2436 58954,30331 58955,433 58956,372 58957,330 58958,1265 58958,1266 58959,1087 58961,1085 58962,534 58963,527 58963,1983 58963,8714 58964,136 58964,178 58964,760 58965,2351 58966,255 58967,843 58968,657 58969,647 58970,344 58971,302 58971,579 58972,652 58973,493 58974,893 58975,2590 58976,3079 58977,1087 58978,299 58980,647 58981,344 58982,379 58982,415 58983,1983 58985,1479 58986,2006 58987,2006 58988,304 58989,640 58990,697 58990,818 58991,406 58991,1425 58992,22 58993,557 58994,256 58994,356 58995,1983 58996,720 58997,2006 58998,861 58999,338 58999,668 59000,430 59000,1235 59000,1335 59001,467 59001,872 59002,586 59003,2006 59004,18726 59005,611 59005,911 59006,134 59006,431 59006,805 59007,1127 59008,7358 59008,7363 59009,163 59010,647 59011,344 59012,217 59012,240 59012,818 59013,385 59014,425 59015,202 59015,203 59016,422 59017,1572 59018,644 59019,2178 59019,4545 59020,1 59020,149 59020,178 59020,256 59020,275 59020,333 59020,336 59020,337 59020,439 59020,505 59020,538 59020,868 59020,934 59020,1776 59020,21442 59021,106 59021,333 59021,337 59021,469 59021,586 59021,18761 59021,21528 59021,22241 59021,32654 59021,48053 59021,54871 59021,60576 59021,62208 59021,65844 59021,65966 59021,66206 59021,66966 59021,67164 59021,68651 59021,70005 59021,70006 59021,92361 59021,110506 59021,124052 59021,127987 59021,130644 59021,130882 59021,134660 59021,134661 59021,134662 59021,134668 59021,134670 59021,134674 59021,136979 59021,139859 59021,140306 59021,148479 59021,148899 59021,148901 59021,156372 59021,161473 59021,166369 59021,168842 59021,171205 59021,186248 59021,189141 59021,192154 59021,260772 59022,299 59023,1836 59024,509 59025,1590 59026,349 59027,5987 59028,2274 59029,111 59030,13745 59031,32 59032,392 59033,779 59034,697 59035,8798 59036,809 59037,287 59038,1240 59039,3260 59040,59041 59042,346 59044,2782 59045,760 59046,620 59048,171 59049,5405 59050,304 59051,225 59051,349 59052,406 59053,79 59055,647 59056,344 59057,15 59057,2260 59058,240 59058,1019 59058,1181 59058,4355 59059,158 59060,5874 59061,1122 59062,577 59063,647 59064,344 59065,392 59065,1590 59066,167 59066,301 59066,333 59066,577 59066,919 59066,968 59066,1133 59066,1293 59066,2443 59066,2557 59066,5662 59067,41 59068,30 59069,302 59069,420 59069,1414 59069,1466 59070,360 59071,1983 59072,50 59073,72 59074,907 59074,932 59075,217 59076,72 59077,1181 59078,346 59080,1179 59081,30 59082,861 59083,211 59083,1014 59083,3695 59085,392 59086,222 59086,536 59086,1072 59086,1467 59086,1539 59086,2168 59086,2424 59086,2784 59086,2944 59086,13137 59087,222 59087,278 59087,283 59087,389 59087,634 59087,657 59087,781 59087,1019 59087,1274 59087,1571 59087,1718 59087,1871 59087,1881 59087,2266 59087,4594 59087,6789 59087,6888 59087,7768 59087,29475 59088,760 59088,1149 59089,310 59091,264 59092,743 59093,1531 59094,30 59095,1590 59096,2006 59098,516 59099,2006 59100,818 59102,59103 59104,2006 59105,137 59106,1801 59107,1977 59107,1978 59108,32 59108,83 59108,392 59108,697 59109,10 59109,222 59110,483 59111,422 59112,1149 59113,852 59113,980 59114,360 59116,682 59117,877 59117,1284 59118,2006 59119,16207 59120,2574 59121,1801 59122,784 59122,19443 59123,217 59123,2775 59124,760 59125,1968 59126,21442 59127,1531 59129,59130 59131,1983 59132,2209 59134,602 59135,58 59136,46 59137,1179 59138,1052 59138,1659 59139,868 59140,1181 59141,360 59142,209 59143,968 59143,1241 59143,1436 59145,360 59146,1052 59146,2006 59147,1425 59148,818 59149,59149 59149,133639 59150,577 59151,315 59151,431 59151,1252 59151,1253 59152,1659 59153,1983 59154,134 59155,130 59156,147 59156,149 59156,1623 59157,167 59158,406 59158,1181 59159,2006 59160,2006 59161,264 59162,301 59162,1298 59163,647 59164,2526 59165,59166 59167,809 59168,50 59169,86 59170,38236 59171,392 59172,255 59173,8788 59174,22 59175,2506 59176,41 59176,415 59178,703 59179,330 59180,818 59180,59181 59182,392 59183,178 59183,192 59183,920 59183,1620 59184,59184 59185,1122 59186,874 59186,2697 59187,1659 59187,1749 59189,2006 59190,515 59191,1151 59192,1836 59193,2274 59194,289 59194,290 59194,805 59194,2205 59194,2206 59194,94134 59195,1805 59196,1556 59197,192 59197,256 59198,259 59199,536 59200,310 59201,3507 59201,6424 59202,41 59204,388 59208,104 59208,134 59208,200 59208,358 59208,372 59208,714 59208,760 59209,425 59211,120 59212,289 59212,290 59213,4223 59214,151 59215,130 59216,202 59216,203 59216,1556 59217,1711 59218,200 59218,278 59218,1072 59218,1836 59218,1871 59218,2421 59218,3585 59219,640 59220,1127 59221,1274 59222,240 59223,83 59224,202 59224,1659 59225,676 59227,704 59228,907 59228,932 59229,1749 59229,3585 59230,3507 59231,518 59232,718 59233,718 59234,779 59235,366 59236,718 59237,126 59238,72 59239,10 59240,151 59242,4355 59243,752 59244,8270 59245,120 59245,1860 59245,6955 59246,72 59247,779 59248,10 59249,255 59250,788 59251,83 59252,1858 59253,1860 59254,72 59255,602 59256,442 59257,72 59257,2782 59257,35486 59258,163 59259,10 59260,34 59260,35 59261,1858 59262,1860 59263,483 59263,79599 59264,615 59264,720 59264,877 59264,907 59264,1732 59264,2191 59264,3422 59265,875 59266,59267 59268,21944 59269,167 59269,467 59269,687 59269,794 59269,1151 59270,158 59271,663 59271,664 59272,31896 59273,104 59273,215 59273,714 59273,1212 59273,1282 59273,1745 59273,4222 59273,111142 59273,176782 59275,2590 59276,920 59277,10 59278,30 59279,83 59280,255 59281,118 59281,4597 59282,59283 59284,48 59285,1181 59286,30 59287,187 59289,298 59290,485 59291,18726 59292,247 59293,392 59293,697 59294,72 59295,255 59295,918 59296,163 59297,1531 59298,24332 59299,422 59300,1962 59301,422 59302,184 59303,72 59304,647 59305,344 59306,422 59307,392 59308,10 59308,139451 59309,358 59310,8714 59311,422 59312,59313 59314,13661 59315,422 59316,376 59317,200 59318,147 59319,7358 59319,7363 59320,211 59321,59322 59323,72 59324,1877 59325,1072 59326,493 59326,1265 59326,1266 59326,1370 59327,72 59328,217 59329,330 59330,72 59331,949 59332,136 59332,3247 59333,3413 59334,801 59334,1140 59334,1177 59334,1893 59334,5547 59335,301 59336,346 59337,704 59338,779 59339,30 59340,779 59341,907 59341,2191 59342,30 59343,298 59344,34 59344,35 59344,217 59344,536 59344,4672 59344,13546 59344,18831 59345,136 59346,298 59347,278 59348,1019 59349,13980 59350,1556 59351,861 59352,22 59353,77 59354,932 59355,77 59356,1298 59357,59358 59359,406 59360,406 59361,1284 59362,298 59363,485 59364,602 59364,1181 59365,346 59366,30 59367,72 59368,240 59369,252 59369,1179 59369,1210 59369,1326 59369,1381 59370,298 59371,485 59372,422 59373,346 59374,422 59375,422 59376,557 59377,557 59378,227 59379,376 59380,422 59381,885 59382,4355 59383,83 59384,671 59385,298 59386,346 59387,485 59388,779 59389,54284 59390,481 59391,1181 59391,1531 59392,10 59393,346 59394,106 59395,217 59395,536 59395,2797 59396,111 59396,703 59396,1722 59396,3538 59396,3612 59397,379 59398,657 59398,6789 59399,3246 59399,3247 59400,14989 59401,50 59402,779 59403,50 59404,59405 59406,250 59406,1684 59407,305 59408,704 59409,59410 59409,104666 59409,113762 59409,128080 59411,23011 59412,9323 59413,17334 59414,586 59414,1243 59415,704 59416,393 59417,636 59418,349 59419,515 59420,1858 59421,1860 59422,83 59423,1531 59424,10 59425,50 59426,1556 59427,2506 59428,2506 59429,2506 59430,10 59431,72 59432,59432 59433,17334 59435,313 59436,72 59437,455 59438,72 59439,841 59440,5405 59441,72 59442,602 59443,602 59444,602 59445,72 59446,872 59447,59448 59449,118 59449,4597 59450,72 59451,59452 59453,151 59453,2607 59455,676 59456,516 59457,383 59458,72 59459,118 59459,4597 59460,72 59461,72 59462,72 59463,313 59464,663 59464,664 59464,788 59464,5265 59465,313 59466,920 59466,994 59466,2923 59466,4094 59467,704 59468,59469 59468,110980 59470,59471 59472,72 59473,206 59474,72 59475,72 59477,2260 59478,346 59479,72 59480,289 59480,290 59481,118 59481,4597 59482,34 59482,35 59483,72 59484,72 59485,349 59486,8822 59487,72 59488,34 59488,35 59489,19227 59490,72 59491,72 59492,72 59493,1688 59494,3 59495,240 59496,4604 59497,72 59498,44 59499,72 59500,704 59501,10 59502,59503 59504,8822 59505,72 59506,59507 59508,72 59509,63 59510,2292 59511,17228 59513,137 59514,676 59515,2379 59516,301 59517,206 59517,2617 59517,9239 59517,59931 59518,5101 59519,72 59520,72 59521,72 59522,72 59523,21944 59524,72 59525,72 59526,83 59527,72 59528,72 59529,30 59530,2567 59531,24505 59532,72 59533,704 59534,217 59534,872 59534,1118 59534,1796 59535,1119 59536,346 59537,21944 59538,72 59539,137 59540,59541 59542,30 59543,30 59544,192 59544,663 59544,1089 59545,7117 59546,225 59547,35687 59548,8990 59549,346 59550,7 59551,187 59552,6263 59553,9323 59554,2351 59555,72 59556,22 59556,72 59556,97 59556,285 59557,59558 59559,195 59559,27217 59560,652 59562,918 59563,72 59564,72 59565,233 59566,81 59567,59568 59569,1181 59570,3413 59571,2995 59572,1019 59572,1462 59573,72 59574,1 59575,158 59576,1265 59576,1266 59577,59578 59579,21944 59580,79 59581,167 59581,2979 59582,406 59583,195 59583,27217 59584,192 59585,5547 59586,310 59586,805 59587,1980 59587,8991 59588,805 59589,134 59590,5375 59591,1033 59592,355 59593,693 59594,346 59595,30 59596,2105 59597,186 59598,1140 59598,5547 59599,366 59600,647 59601,344 59602,366 59603,366 59604,366 59605,366 59606,366 59607,366 59609,366 59610,366 59611,44013 59612,21944 59613,431 59614,366 59615,217 59616,801 59616,1140 59616,1177 59616,1985 59616,3474 59617,801 59617,1140 59617,3474 59618,72 59619,509 59620,567 59620,900 59621,305 59622,305 59623,30 59624,147 59624,158 59624,1122 59625,26 59625,59 59626,7270 59627,47 59627,2469 59628,1058 59629,72 59632,217 59633,3177 59634,850 59635,1274 59637,72 59638,850 59639,58 59640,46 59641,1551 59642,58 59643,46 59645,693 59646,104 59647,10 59647,147 59647,158 59647,628 59647,795 59647,1411 59647,1572 59647,3804 59647,4039 59647,6323 59648,72 59649,891 59650,2443 59651,346 59652,72 59654,3260 59657,240 59658,467 59658,1452 59658,1849 59658,32784 59659,72 59660,72 59661,83 59662,1127 59663,439 59663,1033 59664,3830 59665,1058 59667,72 59668,640 59669,640 59670,72 59671,72 59672,2915 59673,72 59674,907 59674,932 59675,1298 59675,3804 59676,72 59677,1607 59677,4355 59678,7124 59679,147 59681,72 59682,21944 59683,2506 59684,255 59685,1644 59686,2775 59687,447 59688,195 59689,3582 59690,54 59691,1531 59692,72 59693,285 59694,195 59696,59697 59698,195 59699,26 59699,59 59701,581 59703,1323 59704,72 59705,536 59706,240 59706,818 59707,59708 59709,9457 59710,192 59711,406 59712,4 59712,5 59712,104 59712,136 59712,557 59712,885 59712,1368 59712,1939 59712,5405 59712,13704 59713,118 59713,4597 59715,1319 59716,72 59717,59718 59719,59718 59720,59718 59721,72 59722,907 59722,932 59724,875 59725,2178 59725,4545 59726,1010 59727,217 59727,1118 59728,292 59728,622 59729,252 59730,349 59731,392 59731,1151 59732,7092 59733,79 59734,1143 59735,2460 59737,1284 59738,55849 59739,302 59739,811 59740,50 59741,439 59745,302 59746,158 59746,406 59746,55849 59748,158 59751,1556 59752,390 59752,752 59752,2590 59752,6068 59753,911 59754,417 59756,1033 59757,1881 59758,1608 59759,195 59760,644 59761,79 59762,140 59762,191860 59764,602 59765,9560 59766,337 59767,6263 59768,17228 59769,34 59769,35 59769,18831 59770,850 59772,875 59773,433 59773,2017 59775,298 59776,59777 59778,579 59778,6303 59779,217 59780,192 59781,298 59782,485 59783,875 59784,704 59785,6119 59787,389 59787,1466 59788,83 59788,536 59788,949 59788,18831 59789,79 59790,500 59792,557 59793,4672 59793,18831 59795,1531 59797,79 59797,136 59797,137 59797,290 59797,590 59797,760 59797,805 59797,1181 59797,1462 59797,2206 59797,8180 59798,1326 59799,536 59799,4672 59799,18831 59800,9121 59801,808 59802,195 59803,4039 59804,8270 59805,217 59805,222 59805,536 59805,18831 59807,217 59807,1417 59807,18831 59808,344 59808,1127 59808,1140 59808,1893 59808,5547 59808,54362 59809,34 59809,35 59809,217 59809,536 59809,1417 59809,18831 59810,536 59810,18831 59811,304 59813,304 59814,18831 59816,20813 59817,2697 59819,536 59819,18831 59820,18831 59821,344 59822,7698 59822,18831 59823,1014 59824,72 59825,151 59826,1326 59826,3585 59826,14797 59827,79 59828,195 59829,30 59830,379 59833,26 59833,59 59833,577 59833,1844 59834,1531 59835,1462 59835,31896 59836,8270 59837,1181 59838,349 59839,248 59840,5405 59841,406 59842,20 59843,1983 59844,79 59844,663 59844,664 59845,422 59846,56 59848,83 59849,358 59850,18726 59853,86 59854,163 59856,1274 59857,2506 59858,2506 59859,422 59860,56 59861,56 59862,925 59863,1531 59864,1803 59865,2828 59867,1001 59868,430 59869,59870 59871,2931 59872,217 59872,425 59872,3507 59874,298 59875,485 59876,313 59877,1332 59878,31977 59879,99 59880,433 59881,187 59882,273 59882,274 59883,202 59883,203 59884,536 59884,972 59884,1363 59884,1881 59884,13136 59885,1551 59888,663 59888,664 59890,86 59891,58 59892,46 59893,1132 59894,859 59895,302 59896,158 59897,1531 59898,1983 59899,273 59899,274 59899,1400 59900,422 59901,1133 59902,557 59903,422 59904,215 59905,422 59906,422 59907,30 59908,968 59908,1801 59909,872 59910,6627 59911,422 59912,422 59913,422 59914,838 59915,118 59915,4597 59916,422 59917,3246 59917,3247 59918,1240 59918,1454 59919,1551 59920,972 59920,973 59920,148742 59921,34 59921,35 59921,1715 59921,2209 59922,3451 59922,3452 59923,151 59923,1844 59924,6027 59925,30 59926,118 59926,4597 59927,30 59929,1016 59930,779 59931,68 59931,1004 59931,1285 59931,1462 59931,8537 59931,41334 59931,62982 59931,82285 59931,84256 59931,85931 59931,88094 59931,96606 59931,112530 59931,114060 59931,114092 59931,116548 59931,117134 59931,119863 59931,122992 59931,132922 59931,136164 59931,149142 59931,151170 59931,151423 59932,2995 59933,5662 59935,5405 59936,557 59938,30 59939,79 59940,120 59940,225 59940,248 59940,328 59940,383 59940,392 59940,592 59940,622 59940,631 59940,714 59940,795 59940,805 59940,934 59940,1001 59940,1010 59940,1085 59940,1133 59940,1149 59940,1177 59940,1181 59940,1274 59940,1326 59940,1466 59940,1522 59940,1634 59940,1722 59940,1849 59940,1977 59940,1978 59940,2045 59940,2443 59940,2989 59940,2991 59940,3138 59940,3538 59940,9001 59940,14126 59940,14797 59940,14819 59941,2506 59942,30 59943,99 59944,1531 59945,647 59946,344 59947,868 59948,79 59949,77 59949,269 59950,3 59952,23010 59954,72 59955,200 59955,859 59955,1122 59955,32475 59956,248 59956,450 59956,1332 59956,5405 59957,302 59957,340 59957,467 59957,586 59957,596 59957,861 59957,893 59957,1058 59957,1556 59959,676 59960,104 59961,1167 59962,30 59963,217 59964,5265 59965,10 59966,704 59967,158 59968,16196 59969,1531 59970,83 59971,602 59971,4866 59972,2146 59973,30 59974,1012 59975,21944 59976,26 59976,59 59978,4172 59979,147 59979,149 59979,158 59979,406 59979,622 59980,1983 59981,151 59982,1181 59983,83 59984,1284 59985,59986 59987,442 59988,676 59989,346 59990,392 59990,510 59990,697 59990,818 59991,49887 59992,389 59994,932 59995,6726 59996,1287 59997,158 59997,206 59998,104 59998,217 59998,872 59998,1118 59998,1417 59999,209 60000,9029 60001,171 60002,602 60003,602 60004,289 60004,290 60005,1 60005,117 60005,1345 60005,2712 60006,640 60007,862 60007,1332 60008,9342 60008,9529 60009,2191 60010,392 60011,264 60012,72 60013,254 60014,1531 60015,5 60015,117 60015,2089 60015,2940 60015,9386 60015,21944 60016,1531 60017,22519 60018,72 60019,406 60020,392 60020,918 60022,861 60023,278 60025,323 60026,1955 60028,72 60029,115 60029,118 60030,1070 60031,3999 60032,850 60033,1462 60033,8537 60034,563 60035,376 60036,652 60037,298 60038,485 60039,647 60040,344 60041,602 60042,72 60043,3413 60044,1531 60045,195 60045,779 60046,1531 60047,72 60048,483 60049,1313 60050,18726 60050,41772 60050,186030 60051,58 60052,46 60053,247 60054,392 60055,160 60056,72 60057,72 60058,431 60058,2353 60060,1118 60061,34 60061,35 60062,72 60063,60064 60065,151 60065,911 60066,631 60067,58 60068,46 60069,1231 60070,72 60071,72 60072,455 60072,2590 60073,33598 60074,60075 60076,72 60077,34 60077,1776 60077,4193 60078,3321 60079,694 60080,83 60082,60083 60084,1515 60085,1181 60086,312 60086,1010 60087,4355 60088,968 60088,3218 60089,138 60089,184 60089,850 60089,968 60089,1085 60089,1368 60089,2105 60089,4545 60090,60091 60092,72 60093,72 60094,1082 60095,200 60095,557 60095,1368 60097,1265 60097,1266 60098,60099 60100,920 60101,309 60101,310 60102,843 60103,557 60104,557 60105,477 60107,83 60108,117 60108,1227 60108,2712 60108,21944 60108,86416 60109,72 60110,72 60111,392 60112,72 60113,1033 60114,72 60115,1149 60116,3653 60117,72 60118,1556 60119,72 60119,312 60120,72 60121,392 60122,3260 60123,72 60124,60125 60126,72 60127,779 60128,72 60129,779 60130,72 60131,158 60132,72 60133,779 60134,1556 60135,72 60136,417 60136,714 60136,2286 60137,417 60137,714 60137,1749 60137,1818 60137,2286 60137,2620 60138,515 60138,1381 60139,72 60140,60141 60142,2929 60143,5366 60144,60145 60146,72 60147,72 60148,60149 60148,105096 60148,141235 60150,349 60151,72 60152,50 60153,72 60154,72 60155,72 60156,72 60157,60158 60159,72 60160,1796 60161,1531 60162,1707 60163,60164 60163,105943 60163,110176 60165,72 60166,72 60167,1860 60168,72 60169,30 60170,72 60171,72 60172,1531 60173,298 60174,72 60175,72 60176,58 60177,46 60178,107 60179,72 60180,160 60181,207 60182,704 60183,58 60184,46 60185,171 60186,44 60187,72 60188,1634 60189,424 60190,626 60191,602 60192,60193 60194,72 60195,704 60196,1181 60197,72 60198,72 60199,10 60200,72 60201,255 60202,72 60203,72 60204,58 60205,46 60206,1572 60208,10 60209,1782 60210,8822 60211,1531 60212,704 60213,151 60214,1212 60215,455 60216,2315 60218,60219 60220,333 60221,104 60222,346 60223,859 60223,1531 60224,4252 60224,5987 60225,602 60226,602 60227,72 60228,704 60231,72 60232,1608 60233,72 60234,72 60235,72 60236,72 60237,72 60238,2867 60238,2868 60238,22880 60239,72 60240,862 60240,2590 60241,72 60242,60243 60244,72 60245,72 60246,72 60247,72 60248,289 60248,290 60248,3041 60249,2351 60250,72 60251,72 60252,392 60252,1151 60253,1363 60254,72 60255,60256 60255,71483 60255,82603 60257,1 60258,68 60259,346 60260,72 60261,671 60262,346 60263,72 60264,704 60265,137 60266,72 60267,72 60268,72 60269,1181 60270,147 60271,310 60272,1181 60273,72 60274,72 60275,346 60276,605 60277,563 60278,346 60279,72 60280,79 60281,60282 60283,160 60283,305 60283,538 60284,704 60285,41 60286,704 60287,1238 60288,233 60289,2083 60290,3467 60291,500 60292,1962 60293,1052 60294,1882 60295,2775 60296,54 60297,255 60298,72 60299,60300 60299,69259 60301,2995 60302,17334 60303,72 60304,104 60304,192 60304,240 60304,493 60304,760 60304,1181 60304,149534 60305,72 60306,355 60307,687 60307,1556 60309,2557 60310,1452 60311,775 60312,500 60313,1962 60314,1052 60315,1882 60316,2775 60317,54 60318,2574 60320,718 60320,1227 60320,1229 60320,4823 60320,21944 60320,86416 60321,5034 60322,2292 60323,50 60324,3999 60325,4771 60326,79 60327,58 60328,46 60329,60330 60331,1132 60332,781 60333,48 60333,1452 60334,298 60335,485 60336,647 60337,344 60338,79 60339,1858 60340,1860 60341,298 60342,485 60344,298 60345,485 60346,477 60347,1858 60348,1860 60349,26 60349,59 60350,60351 60350,91494 60350,96378 60350,105158 60350,119776 60353,366 60354,298 60355,485 60356,760 60356,1149 60356,1631 60358,366 60359,366 60360,366 60361,366 60362,366 60363,366 60364,366 60365,255 60366,366 60367,366 60368,366 60369,366 60370,366 60371,366 60372,366 60373,346 60374,918 60375,37 60375,968 60375,1293 60375,1782 60376,1858 60377,1860 60378,1224 60379,192 60380,83 60382,366 60383,366 60384,346 60385,292 60385,704 60385,1285 60385,66297 60385,171641 60386,255 60388,1181 60389,182 60390,1285 60391,60392 60393,640 60394,240 60395,56 60396,1531 60397,647 60398,344 60399,663 60399,664 60401,60402 60404,251 60404,465 60405,3999 60407,203 60407,2697 60407,4193 60408,1102 60409,1102 60410,818 60410,46891 60410,60411 60410,60650 60410,60661 60410,60690 60410,61042 60410,61365 60412,247 60412,2867 60412,22880 60413,626 60414,772 60414,4691 60414,6068 60415,301 60415,563 60416,72 60417,346 60418,795 60418,68069 60418,86832 60419,158 60419,406 60420,3474 60421,192 60422,60423 60424,581 60425,60426 60427,762 60428,6726 60429,1776 60429,4193 60430,34 60430,158 60431,2178 60431,4545 60432,1955 60432,66500 60433,72 60434,1363 60434,15523 60437,783 60438,682 60439,1531 60440,1556 60441,1127 60442,1019 60443,158 60443,779 60443,1181 60444,347 60444,702 60444,874 60447,17334 60448,298 60457,1467 60459,503 60459,1149 60460,143 60460,1204 60460,1844 60460,17346 60461,35905 60463,240 60463,1285 60464,225 60464,248 60465,1977 60465,1978 60466,344 60466,1140 60466,1363 60466,1836 60466,3474 60466,5547 60467,34 60467,35 60467,83 60467,217 60467,379 60467,390 60467,392 60467,571 60467,599 60467,660 60467,697 60467,872 60467,918 60467,1019 60467,1285 60467,1796 60467,1805 60468,1274 60469,515 60470,2775 60471,447 60472,657 60473,3623 60475,5405 60476,644 60481,60482 60481,131079 60483,195 60484,4594 60485,602 60486,3555 60487,2812 60488,2989 60488,2991 60489,56 60490,1707 60492,99 60493,2411 60494,240 60494,372 60494,1085 60494,1580 60494,2812 60494,4222 60495,1179 60496,147 60496,206 60496,422 60496,1458 60497,1368 60498,3524 60499,202 60499,203 60499,272 60499,1370 60500,760 60500,1149 60500,1436 60501,83 60502,18726 60503,1745 60504,1122 60506,134 60507,163 60508,99 60509,2116 60510,827 60511,392 60512,4177 60513,247 60514,1227 60514,1229 60515,217 60516,682 60517,859 60517,1531 60518,406 60519,4 60519,5 60521,86 60521,109720 60522,1313 60523,309 60523,310 60524,292 60526,146 60527,827 60527,3653 60528,1192 60529,72 60530,602 60531,852 60532,86 60533,206 60534,450 60534,24332 60535,1983 60536,1983 60537,4066 60538,192 60538,671 60540,1078 60541,301 60541,968 60541,73570 60542,301 60542,604 60542,968 60543,207 60544,1188 60544,1381 60545,1118 60546,1983 60547,10 60548,760 60548,1149 60548,3653 60549,663 60549,664 60550,850 60551,1531 60552,211 60553,918 60554,406 60555,60556 60559,7757 60560,1276 60561,4504 60562,60563 60564,1167 60564,1241 60564,2557 60566,783 60567,10 60567,195 60568,301 60568,968 60568,1160 60569,171 60570,358 60571,60572 60573,79 60576,1 60576,10 60576,56 60576,99 60576,106 60576,130 60576,146 60576,147 60576,158 60576,192 60576,285 60576,314 60576,333 60576,336 60576,337 60576,406 60576,422 60576,425 60576,586 60576,602 60576,620 60576,622 60576,779 60576,841 60576,920 60576,1011 60576,1027 60576,1089 60576,1181 60576,1425 60576,1464 60576,1619 60576,1623 60576,1825 60576,1969 60576,1973 60576,1985 60576,1994 60576,2032 60576,2217 60576,2903 60576,3895 60576,4190 60576,5401 60576,6119 60576,7296 60576,7768 60576,7794 60576,8244 60576,8867 60576,12263 60576,13221 60576,15437 60576,15795 60576,16493 60576,17139 60576,17151 60576,18637 60576,20982 60576,21394 60576,22616 60576,23031 60576,23783 60576,24230 60576,25467 60576,28350 60576,29895 60576,30331 60576,35537 60576,35561 60576,38834 60576,38882 60576,41366 60576,43239 60576,46144 60576,47095 60576,49553 60576,55075 60576,59021 60576,60576 60576,62226 60576,62457 60576,62686 60576,65844 60576,67908 60576,68024 60576,70965 60576,71028 60576,78688 60576,78875 60576,79768 60576,80266 60576,84685 60576,92476 60576,93081 60576,99819 60576,106352 60576,109411 60576,115968 60576,115969 60576,115970 60576,117726 60576,121321 60576,123797 60576,126727 60576,131905 60576,133983 60576,137014 60576,137015 60576,137016 60576,139859 60576,140355 60576,147341 60576,148370 60576,148479 60576,150210 60576,150446 60576,150841 60576,156372 60576,159733 60576,168354 60576,171143 60576,171144 60576,172640 60576,175883 60576,181815 60576,188779 60576,193008 60576,197730 60576,204124 60576,221675 60576,228521 60576,229950 60576,230516 60576,232390 60576,232696 60576,232855 60576,238338 60576,239548 60576,241031 60576,241086 60576,243708 60576,250406 60576,252713 60576,257164 60576,258627 60577,795 60578,72 60579,602 60580,602 60581,2506 60582,247 60583,136 60583,160 60583,346 60584,2506 60587,663 60587,664 60588,2351 60589,907 60590,34 60590,35 60590,313 60590,2224 60590,2646 60590,5326 60591,29380 60592,4101 60593,1118 60594,60595 60596,60595 60597,60595 60598,571 60598,1326 60599,1634 60600,775 60601,663 60601,664 60602,406 60603,41 60603,1608 60604,406 60605,326 60605,873 60606,652 60607,907 60607,932 60608,72 60609,1531 60611,1983 60612,2205 60612,2206 60612,33424 60613,10 60614,315 60615,19 60616,9195 60617,1381 60618,626 60619,660 60619,1871 60620,660 60620,1871 60621,72 60622,344 60623,285 60624,2867 60624,2868 60624,22880 60625,21944 60626,2116 60627,240 60627,818 60628,2775 60629,447 60630,392 60632,269 60633,269 60634,1132 60635,781 60636,2224 60637,140 60639,298 60640,1151 60641,557 60642,60643 60644,202 60644,203 60645,483 60649,50 60649,2923 60651,609 60652,58 60653,1033 60654,104 60654,3246 60655,79 60656,302 60657,3209 60658,1 60658,422 60658,972 60658,973 60658,1010 60658,1298 60658,7768 60660,292 60663,83 60664,247 60665,34 60665,35 60665,536 60666,83 60666,285 60666,2779 60666,2784 60667,195 60668,1572 60669,137 60670,26 60670,59 60671,1782 60672,104 60672,136 60672,557 60672,1319 60673,217 60673,252 60674,72 60675,503 60676,151 60677,510 60678,392 60679,872 60680,217 60681,372 60682,1143 60683,147 60683,158 60683,206 60683,2244 60684,203 60684,2931 60685,1531 60686,1740 60687,372 60688,516 60689,81 60691,652 60691,2206 60692,4355 60693,304 60694,344 60694,1070 60695,5976 60696,671 60697,16687 60698,1803 60699,1247 60699,1424 60700,264 60701,106 60701,586 60701,1985 60702,861 60703,714 60704,136 60704,137 60705,247 60706,60707 60708,344 60709,1381 60710,493 60711,676 60712,440 60713,333 60713,841 60714,1871 60715,126 60716,4895 60717,704 60718,675 60718,1078 60719,697 60720,1462 60720,31896 60721,151 60722,422 60723,422 60724,47 60724,2469 60725,2867 60725,22880 60726,422 60727,422 60728,422 60729,422 60730,422 60731,422 60732,535 60733,37 60733,66 60733,1181 60734,417 60735,459 60736,647 60737,344 60738,647 60739,344 60740,17228 60741,3960 60742,455 60743,704 60744,310 60745,872 60746,1531 60747,3161 60748,1983 60750,30 60751,1235 60751,1335 60753,26 60753,59 60754,1983 60755,1007 60756,347 60757,346 60758,72 60759,5212 60760,1707 60761,255 60762,8788 60763,2312 60764,104 60764,332 60765,273 60765,274 60766,704 60767,704 60768,140 60769,60770 60769,64305 60769,64330 60771,1983 60772,187 60773,1149 60774,783 60775,83 60775,2779 60775,2784 60776,225 60777,577 60778,65 60779,77 60780,2205 60780,2206 60780,33424 60781,503 60783,1983 60784,783 60785,1235 60785,1335 60786,622 60787,557 60788,557 60790,8270 60791,68 60792,60793 60794,1210 60795,206 60795,657 60796,137 60797,358 60798,58 60799,46 60800,1289 60801,581 60802,1381 60803,3413 60804,1962 60805,595 60806,850 60807,30 60808,1983 60809,932 60810,72 60811,72 60812,30 60813,2506 60814,1564 60814,1785 60815,60816 60817,30 60818,1983 60819,79 60820,72 60821,1655 60822,376 60823,885 60824,6068 60825,30 60826,563 60827,563 60828,563 60829,5405 60830,1 60831,1659 60832,332 60833,2506 60834,392 60834,1151 60835,83 60836,379 60837,527 60838,1531 60839,1381 60840,72 60841,83 60842,269 60843,393 60844,83 60845,298 60846,485 60847,1531 60848,83 60850,60851 60852,862 60853,72 60854,83 60855,1392 60855,21442 60856,360 60857,330 60857,349 60857,783 60857,973 60857,2572 60857,3538 60858,4594 60859,872 60860,859 60861,1531 60863,60864 60863,128099 60865,3846 60866,446 60867,72 60868,344 60869,285 60870,147 60870,1265 60870,1266 60870,1370 60870,5212 60871,252 60872,1673 60873,1462 60873,8537 60874,1179 60874,1305 60874,2701 60875,1531 60876,22 60876,861 60876,893 60877,2775 60878,447 60879,60880 60879,70899 60879,107268 60879,171947 60881,1983 60882,60883 60884,1531 60885,97 60886,104 60886,134 60886,135 60886,136 60886,137 60886,138 60886,557 60886,1368 60886,1939 60886,2105 60887,30236 60888,18726 60889,163 60890,72 60891,151 60891,911 60892,602 60893,602 60894,269 60895,72 60896,1118 60897,1955 60898,147 60900,305 60900,1544 60901,30 60902,10 60902,31977 60904,60905 60904,63564 60904,73146 60904,93475 60904,98006 60904,102853 60904,104591 60904,112606 60904,126313 60904,144661 60904,158477 60904,168648 60904,176729 60904,217570 60904,231196 60904,253441 60906,393 60907,72 60908,68 60908,2512 60908,7155 60908,221300 60909,187 60909,302 60909,326 60910,2506 60911,349 60912,1531 60913,310 60913,503 60913,874 60914,602 60915,60916 60917,72 60918,206 60919,10 60919,113156 60920,72 60921,602 60922,302 60923,52 60923,175 60924,862 60925,801 60925,5547 60926,3 60927,1531 60929,557 60930,1368 60931,4980 60932,44 60933,72 60934,602 60935,60936 60937,1140 60937,2443 60938,7652 60939,83 60940,10 60941,72 60942,60943 60942,126293 60944,7117 60945,16045 60946,72 60947,60948 60947,123217 60947,125479 60947,136645 60949,104 60950,1267 60951,704 60952,72 60953,1531 60954,225 60955,72 60956,72 60957,1140 60957,5547 60958,1419 60959,30 60960,72 60961,233 60962,872 60963,346 60964,21944 60965,712 60966,21944 60967,149 60967,622 60968,72 60969,72 60970,60971 60972,60973 60974,346 60975,588 60975,590 60976,72 60977,788 60978,366 60979,72 60980,366 60981,366 60982,366 60983,366 60984,77 60985,366 60987,366 60988,366 60989,366 60990,366 60991,366 60992,366 60993,366 60994,2319 60995,366 60996,60997 60998,72 60999,355 61000,61001 61002,138 61003,346 61004,289 61004,290 61004,714 61004,1962 61004,2008 61004,94134 61004,111142 61005,3451 61005,3452 61006,48 61007,202 61007,251 61008,861 61009,261 61009,1419 61010,30 61011,527 61012,1179 61012,1305 61013,1531 61014,1531 61015,61016 61017,61018 61020,30 61021,1220 61021,1222 61022,217 61024,26 61024,59 61025,330 61026,676 61027,579 61027,2116 61028,1983 61029,918 61030,2867 61030,22880 61031,2944 61032,298 61033,485 61034,718 61035,873 61036,6119 61037,47 61037,2469 61038,61039 61038,194653 61038,243023 61040,14989 61043,7698 61044,1531 61045,1983 61046,1858 61047,1860 61048,32 61048,392 61048,1151 61049,745 61050,1707 61051,1127 61052,83 61053,336 61053,586 61053,1353 61053,1579 61053,2775 61054,1551 61056,58 61057,46 61058,843 61059,1353 61060,1323 61061,102 61062,1326 61063,408 61065,1707 61066,256 61067,647 61068,344 61070,1001 61071,1247 61071,30331 61072,640 61073,811 61074,346 61075,1858 61076,1860 61077,500 61078,1962 61079,1052 61080,1882 61081,2775 61082,54 61083,292 61083,1449 61083,1572 61083,1722 61083,3367 61084,481 61085,657 61085,743 61085,6068 61085,13136 61086,1531 61087,97 61088,7757 61089,278 61089,392 61089,431 61089,435 61089,589 61089,631 61089,671 61089,818 61089,838 61089,1014 61089,1130 61089,1149 61089,1326 61089,1844 61089,2045 61089,2373 61089,3135 61091,15573 61092,195 61092,5101 61092,5103 61092,31346 61093,2775 61094,34 61094,35 61094,536 61095,15 61097,581 61098,1072 61099,1724 61100,489 61102,557 61102,707 61102,1326 61103,206 61104,1715 61105,775 61107,298 61109,485 61110,240 61110,3135 61111,980 61111,1096 61112,718 61113,356 61114,61115 61116,1019 61117,1274 61117,1858 61118,72 61119,1326 61121,379 61121,536 61121,1284 61122,72 61123,442 61124,602 61125,885 61126,187 61127,885 61127,13704 61128,346 61129,58 61130,46 61131,931 61132,147 61133,22 61134,97 61135,779 61135,68069 61136,1140 61136,5547 61137,66 61138,980 61139,972 61139,973 61140,20813 61141,1007 61142,392 61142,697 61143,79 61144,1140 61144,1240 61144,1465 61145,346 61146,577 61147,3804 61148,392 61148,1949 61149,61150 61151,644 61152,649 61153,718 61154,21944 61155,1172 61156,72 61157,344 61158,285 61160,222 61162,336 61163,1133 61164,72 61165,72 61166,1127 61166,1893 61166,49057 61166,81070 61167,56 61167,685 61167,1319 61168,849 61169,356 61170,195 61171,477 61172,4039 61173,3413 61174,106 61174,538 61174,1531 61174,1634 61175,346 61176,259 61176,4039 61178,392 61179,137 61180,893 61180,1289 61181,1983 61182,349 61182,697 61182,1769 61183,287 61183,809 61184,1707 61185,298 61186,485 61187,1977 61187,1978 61188,1033 61189,3148 61190,346 61191,211 61192,158 61198,58 61199,46 61202,596 61202,779 61202,1135 61203,1707 61204,1749 61205,694 61206,240 61207,278 61208,356 61208,3258 61209,457 61210,4 61210,5 61211,77 61213,32 61213,71 61213,611 61213,690 61213,788 61213,932 61213,1113 61213,1133 61213,1319 61213,1436 61213,66297 61214,1132 61215,781 61216,298 61217,485 61218,58 61219,3321 61221,30 61222,58 61223,46 61224,1803 61225,1639 61226,1579 61227,298 61228,1634 61230,500 61232,1962 61233,1052 61234,1882 61235,2775 61236,54 61238,72 61239,10 61239,192 61240,140 61240,1052 61240,1127 61240,1579 61240,1639 61240,1893 61240,2312 61240,6695 61241,298 61242,485 61243,657 61243,718 61244,217 61245,452 61246,83 61247,872 61248,58 61249,46 61250,79 61252,298 61253,485 61254,217 61255,292 61255,338 61255,4039 61256,58 61257,46 61258,1231 61259,50 61259,79 61259,137 61260,2506 61261,240 61262,305 61263,48 61264,2506 61265,592 61266,61267 61268,298 61269,485 61270,207 61271,30 61272,589 61273,3872 61274,1608 61275,217 61275,222 61276,61277 61279,1132 61280,1238 61281,781 61282,8270 61283,298 61284,485 61285,20 61286,536 61286,697 61287,83 61288,18726 61289,1983 61290,1467 61291,647 61292,344 61293,30 61294,252 61294,516 61294,1220 61294,1222 61295,61296 61295,120471 61295,151779 61295,157985 61295,168541 61297,163 61298,676 61299,30 61300,298 61301,485 61302,61303 61304,1983 61305,240 61306,390 61308,30 61310,477 61311,1323 61312,102 61313,1326 61314,408 61315,1983 61316,21944 61317,760 61318,1631 61319,455 61321,483 61322,2424 61323,1983 61324,240 61324,269 61324,640 61324,760 61324,818 61324,862 61324,920 61324,67995 61325,72 61327,861 61328,72 61329,30 61330,195 61331,1531 61332,1579 61333,663 61333,664 61334,1227 61334,1229 61335,19443 61336,119 61336,278 61336,364 61336,372 61336,389 61336,417 61336,455 61336,525 61336,805 61336,907 61336,1085 61336,1298 61336,1718 61336,1801 61336,1881 61336,2266 61336,2590 61336,13575 61337,151 61338,13136 61339,30 61340,72 61341,1289 61343,479 61344,577 61345,907 61345,1284 61346,459 61347,1871 61348,301 61348,304 61348,752 61348,968 61349,1127 61350,843 61351,718 61352,2367 61353,918 61354,586 61354,663 61354,664 61355,222 61355,1881 61355,18831 61356,415 61356,493 61356,868 61356,1363 61356,1955 61357,2646 61358,356 61359,240 61359,372 61359,932 61359,1001 61359,1479 61360,195 61360,269 61360,337 61360,1181 61361,15068 61362,255 61363,147 61364,206 61366,151 61368,58 61369,46 61370,1881 61372,2421 61373,83 61374,13980 61375,2048 61376,783 61377,1639 61378,1579 61379,158 61380,1639 61381,1579 61382,1639 61383,1579 61385,1639 61386,1579 61387,602 61388,2867 61388,2868 61388,22880 61389,3653 61390,61391 61393,305 61394,158 61396,171 61397,61398 61399,2506 61400,493 61401,61402 61403,647 61403,991 61403,1188 61403,1267 61403,1287 61403,1659 61403,2312 61403,13538 61405,19443 61406,298 61407,31977 61408,2931 61409,479 61409,1980 61410,225 61411,240 61411,1010 61412,61413 61415,861 61416,115 61416,118 61417,72 61418,298 61419,485 61420,8719 61421,138 61422,557 61423,865 61424,137 61425,217 61425,1417 61426,118 61426,4597 61427,21944 61428,8719 61429,138 61430,865 61431,557 61432,137 61433,118 61433,4597 61434,21944 61435,8719 61436,138 61437,865 61438,557 61439,137 61440,118 61440,4597 61441,21944 61442,8719 61443,138 61444,865 61445,557 61446,137 61447,118 61447,4597 61448,21944 61449,861 61450,422 61451,83 61452,72 61453,422 61454,422 61455,72 61456,422 61457,422 61458,422 61459,422 61460,809 61461,676 61462,251 61463,72 61464,298 61465,647 61466,344 61468,72 61469,79 61470,72 61470,167 61470,588 61470,590 61471,250 61471,1684 61472,1007 61473,72 61474,1188 61475,72 61476,596 61477,660 61477,1871 61478,6068 61479,45024 61480,663 61480,664 61481,72 61482,187 61483,1119 61484,273 61484,274 61485,644 61486,647 61487,344 61488,83 61489,647 61490,344 61491,392 61491,697 61491,3260 61492,2506 61494,779 61495,3413 61496,1266 61496,1776 61497,3989 61498,647 61499,344 61500,298 61501,485 61502,557 61503,557 61504,557 61505,72 61507,72 61508,158 61509,215 61509,1016 61509,1212 61509,1257 61509,1882 61510,3094 61511,86 61511,167 61511,240 61511,301 61511,372 61511,567 61511,589 61511,605 61511,615 61511,631 61511,720 61511,801 61511,907 61511,968 61511,972 61511,973 61511,1010 61511,1122 61511,1124 61511,1140 61511,1167 61511,1231 61511,1241 61511,1284 61511,1298 61511,1309 61511,1436 61511,1522 61511,1544 61511,1564 61511,1782 61511,1785 61511,1807 61511,1818 61511,1837 61511,1893 61511,1955 61511,2083 61511,2191 61511,2372 61511,2557 61511,2620 61511,2775 61511,2979 61511,3193 61511,3207 61511,3218 61511,20359 61512,1707 61513,349 61514,932 61517,61518 61519,61518 61520,1858 61521,1860 61522,10 61523,13 61523,450 61523,611 61523,8854 61523,255750 61524,602 61525,3069 61526,640 61527,10 61528,1133 61529,346 61530,309 61530,310 61531,61532 61533,83 61534,61535 61537,3246 61537,3247 61538,61539 61540,24332 61541,1858 61542,1860 61543,106 61544,72 61545,7652 61546,932 61546,1016 61547,536 61548,393 61549,346 61550,72 61551,61552 61553,72 61554,72 61555,211 61555,972 61556,72 61557,61558 61559,346 61560,346 61561,349 61562,72 61563,2048 61564,3999 61565,72 61566,22 61566,2017 61567,1235 61567,1335 61568,2506 61569,392 61570,602 61571,298 61572,485 61573,30236 61574,254 61575,7360 61576,306 61576,307 61577,10 61577,113156 61578,273 61578,274 61579,1882 61580,346 61581,61582 61583,61584 61585,44 61586,366 61587,333 61587,346 61587,366 61588,9598 61589,225 61590,8884 61591,298 61592,589 61593,1175 61593,22880 61594,1085 61595,6051 61596,81 61598,30 61599,644 61600,30 61601,261 61603,7416 61604,417 61605,233 61606,136 61609,61610 61611,61612 61611,63525 61613,366 61614,366 61615,366 61616,366 61617,366 61618,366 61619,366 61620,355 61621,10 61622,72 61623,8598 61624,30 61625,19 61625,743 61625,749 61626,1803 61626,118336 61627,298 61628,485 61629,19 61629,56 61629,588 61629,590 61630,1132 61631,907 61632,697 61634,83 61635,61636 61637,2205 61637,2206 61638,61639 61640,61641 61640,63860 61640,217844 61640,227703 61640,264709 61643,2116 61644,18726 61646,163 61647,1515 61648,2646 61649,240 61650,581 61651,602 61652,784 61653,61654 61655,298 61656,485 61657,158 61657,779 61658,333 61659,1531 61661,1052 61662,274 61662,1368 61663,515 61664,872 61665,219 61665,273 61665,302 61665,422 61665,481 61665,483 61665,1010 61665,1238 61665,1353 61665,1580 61665,1891 61665,2168 61665,2210 61665,2553 61665,4237 61665,182162 61666,818 61667,15573 61669,1368 61671,61672 61673,2506 61674,2353 61675,63 61676,1608 61677,1509 61678,2424 61679,104 61679,136 61679,225 61679,248 61679,953 61679,1179 61679,1368 61679,1939 61679,5405 61679,7270 61680,676 61681,602 61682,718 61683,22 61683,269 61683,861 61684,50 61685,794 61686,298 61687,485 61688,248 61689,83 61690,195 61691,433 61692,694 61692,704 61692,66297 61693,187 61694,326 61694,2443 61695,2506 61697,1368 61698,2506 61699,30 61700,3413 61701,61702 61703,994 61703,21944 61704,261 61705,6682 61706,872 61707,72 61708,1858 61709,1860 61710,61711 61710,62767 61710,66470 61710,78005 61710,115017 61710,120331 61712,18726 61713,163 61715,30 61716,1001 61717,3804 61718,1556 61719,315 61720,72 61721,344 61722,285 61723,14366 61724,15748 61725,479 61726,647 61727,344 61728,647 61729,344 61730,1381 61730,2292 61731,72 61732,344 61733,285 61734,192 61735,647 61736,344 61737,31896 61738,1844 61739,50 61740,346 61741,349 61742,61743 61744,1085 61745,30 61746,389 61747,1608 61748,1127 61749,1858 61750,1860 61751,422 61752,422 61753,1117 61754,1608 61755,269 61756,2367 61757,61758 61757,87660 61757,117526 61759,61760 61761,1467 61762,422 61763,2646 61764,30766 61765,497 61766,3193 61767,676 61768,1479 61769,932 61770,328 61771,455 61772,72 61773,309 61773,310 61774,305 61775,3474 61776,72 61777,344 61778,285 61779,187 61780,3538 61781,298 61782,485 61783,387 61785,61786 61787,160 61788,3413 61789,72 61790,344 61791,285 61792,298 61793,485 61794,72 61795,344 61796,285 61797,61798 61799,72 61800,344 61801,285 61802,72 61803,344 61804,285 61805,72 61806,1415 61807,1033 61808,30 61809,13546 61811,2506 61812,1655 61813,61814 61813,63835 61813,70638 61815,44 61816,61817 61818,298 61819,485 61820,2351 61821,346 61822,794 61823,349 61824,1133 61824,2006 61825,1235 61825,1335 61826,104 61827,483 61828,72 61829,344 61830,285 61831,18726 61832,163 61833,515 61835,3069 61836,61837 61838,30 61839,57842 61840,7 61840,211 61841,72 61842,344 61843,285 61844,233 61845,393 61847,676 61848,240 61849,107 61850,2416 61850,2417 61851,292 61852,338 61853,298 61854,1133 61855,3538 61856,355 61857,187 61858,61859 61860,3413 61861,54064 61862,1980 61862,8991 61863,215 61864,30 61864,640 61864,1085 61864,1871 61865,298 61866,298 61867,485 61868,72 61869,344 61870,285 61871,298 61872,485 61873,61874 61875,19413 61876,1323 61877,102 61878,1326 61879,408 61880,907 61881,349 61882,10 61883,61884 61883,90542 61883,107321 61885,581 61886,859 61887,298 61888,485 61890,872 61892,872 61893,72 61894,344 61895,285 61896,372 61897,72 61898,344 61899,285 61901,596 61902,596 61903,366 61904,366 61905,366 61906,366 61907,366 61908,366 61909,366 61910,17334 61911,1707 61912,58 61912,1167 61915,605 61916,366 61917,1140 61917,5547 61918,83 61918,17263 61919,2173 61920,298 61921,485 61922,346 61923,718 61924,298 61925,485 61926,745 61927,14989 61928,994 61929,2506 61930,483 61931,602 61932,61933 61934,980 61935,872 61936,872 61937,298 61938,485 61939,211 61940,433 61941,111 61942,640 61943,120 61943,588 61943,590 61943,1419 61944,1082 61945,61946 61947,30 61948,30 61949,1962 61950,298 61951,485 61952,192 61952,3872 61953,301 61954,72 61955,344 61956,285 61957,61958 61959,477 61960,207 61961,1631 61962,2506 61963,255 61964,872 61965,605 61966,30 61967,44725 61968,34 61968,35 61968,167 61968,187 61968,217 61968,222 61968,283 61968,455 61968,631 61968,657 61968,713 61968,1019 61968,1210 61968,1635 61968,1807 61968,1871 61968,2266 61968,2775 61968,6789 61968,8235 61968,20771 61969,1556 61970,861 61971,22 61972,61973 61974,289 61974,290 61974,714 61975,48 61976,81 61977,1983 61978,1983 61979,61980 61981,1983 61985,586 61986,34 61986,35 61987,25873 61988,61989 61990,1566 61991,1019 61992,393 61993,406 61994,217 61994,1007 61994,1289 61995,477 61996,1544 61997,557 61998,557 61999,557 62000,167 62002,557 62003,862 62004,62005 62007,6027 62008,158 62009,298 62010,485 62011,957 62011,1815 62012,2048 62013,932 62014,62015 62016,1556 62017,861 62018,22 62019,431 62019,631 62020,447 62021,298 62022,485 62023,10 62024,972 62025,1556 62026,861 62027,22 62028,72 62029,527 62030,647 62031,1454 62032,39247 62033,99 62034,62035 62036,602 62037,62038 62039,602 62040,602 62041,602 62042,62043 62044,62043 62045,62043 62046,62043 62047,62043 62048,918 62049,106 62050,298 62051,1381 62051,1551 62052,602 62053,17588 62054,62055 62056,389 62057,366 62058,366 62059,366 62060,602 62062,44 62063,366 62064,422 62065,422 62066,422 62067,422 62068,422 62069,422 62070,422 62071,202 62071,203 62072,477 62073,62074 62075,171 62076,289 62076,290 62077,422 62078,217 62078,1417 62079,422 62080,422 62081,422 62082,4453 62083,1983 62084,62085 62086,493 62087,134 62088,34 62088,35 62089,2210 62089,4237 62089,182162 62090,62091 62092,298 62093,62094 62096,994 62097,222 62098,15573 62099,292 62100,294 62101,296 62102,298 62103,5547 62104,312 62104,5547 62105,217 62106,62107 62106,244080 62109,994 62110,8992 62111,585 62112,255 62113,602 62114,298 62115,485 62116,10 62116,2146 62117,3585 62118,366 62119,233 62120,366 62121,62122 62123,366 62124,366 62125,602 62126,275 62127,62128 62129,50 62129,309 62129,310 62129,1566 62130,62131 62132,62131 62133,366 62134,1411 62135,175 62136,62137 62139,2995 62140,62141 62142,1572 62143,15573 62144,7 62145,18726 62146,62147 62148,163 62149,333 62149,346 62149,366 62149,1247 62150,355 62152,1860 62153,1247 62154,298 62155,485 62156,4039 62157,994 62158,298 62159,485 62160,298 62160,1241 62160,1436 62160,2083 62160,9024 62161,1058 62163,515 62163,5130 62164,306 62164,307 62166,298 62167,485 62168,298 62169,485 62171,2372 62172,467 62172,571 62172,868 62173,255 62174,240 62175,62176 62177,30 62178,62179 62180,62181 62182,298 62183,485 62184,158 62185,62186 62187,83 62188,392 62189,500 62190,30 62191,1127 62192,104 62192,134 62192,2105 62193,649 62194,30 62195,406 62195,1033 62195,1474 62195,1849 62195,2782 62195,3876 62195,6661 62196,652 62197,3370 62197,14453 62199,298 62200,485 62201,62202 62203,671 62204,104 62204,875 62204,1117 62204,2191 62204,148742 62205,485 62207,577 62208,333 62208,59021 62209,3003 62210,104 62210,137 62211,79 62211,500 62211,1749 62213,602 62214,2209 62215,30331 62216,310 62217,3161 62218,1556 62219,861 62220,22 62221,2590 62222,178 62223,393 62224,30 62225,392 62226,60576 62227,160 62228,298 62229,485 62230,298 62231,485 62232,3345 62233,676 62234,1033 62234,1789 62235,83 62236,1893 62237,304 62238,83 62239,852 62240,30 62241,217 62241,1417 62242,581 62243,62244 62245,1096 62245,3555 62247,5405 62248,1962 62249,1983 62250,875 62251,298 62252,485 62253,1983 62254,1983 62255,1983 62256,1417 62257,489 62258,1983 62259,1983 62260,58 62263,392 62264,289 62264,657 62264,94134 62265,439 62265,1776 62266,187 62267,200 62268,298 62269,485 62271,62272 62273,140 62274,240 62275,309 62275,310 62276,752 62277,158 62278,79 62279,302 62281,422 62282,62283 62284,62283 62285,3413 62286,83 62286,217 62286,222 62286,313 62286,634 62286,694 62286,752 62286,849 62286,1419 62286,1454 62286,2224 62286,5591 62286,188791 62287,1983 62288,97 62289,217 62289,1417 62290,23783 62292,298 62293,485 62295,298 62296,485 62301,422 62302,209 62302,579 62302,687 62302,861 62302,893 62302,1374 62303,2205 62303,2206 62303,2210 62303,4237 62304,1506 62305,54 62306,3872 62307,422 62308,577 62309,557 62310,71 62311,62312 62313,1776 62313,4611 62314,809 62315,644 62316,852 62317,1983 62318,178 62318,4158 62318,48912 62318,62319 62318,103739 62318,129903 62318,143528 62318,158562 62318,216044 62318,216515 62318,220934 62318,237276 62319,852 62320,356 62321,30 62322,217 62322,872 62322,1417 62322,1844 62323,200 62323,248 62324,557 62325,30 62326,23783 62327,1608 62328,1556 62329,68 62329,433 62329,1634 62330,2793 62331,868 62332,8180 62336,697 62337,1434 62339,147 62340,1305 62341,4190 62342,920 62344,62345 62346,388 62348,130 62351,107 62352,30 62353,22 62353,442 62354,5101 62354,15119 62355,1634 62356,622 62356,31977 62357,1983 62358,298 62359,485 62360,6506 62361,364 62361,714 62362,872 62363,298 62364,485 62365,271 62366,55849 62367,48 62368,4 62368,5 62369,1977 62369,1978 62370,200 62372,406 62373,868 62374,493 62375,1749 62376,349 62377,261 62378,1515 62379,62380 62381,8149 62382,160 62382,222 62383,34 62383,217 62383,536 62384,22 62384,1146 62385,1285 62386,592 62387,1274 62388,1776 62389,298 62390,485 62391,298 62392,485 62393,233 62393,3135 62395,1033 62396,30 62397,72 62398,1556 62399,861 62400,22 62401,493 62402,167 62403,163 62404,973 62405,217 62405,1417 62406,34 62406,35 62407,79 62407,1749 62409,2828 62410,6068 62411,30 62411,63 62411,1309 62412,467 62413,392 62414,697 62414,1240 62415,1240 62416,1033 62417,15 62417,292 62417,397 62417,668 62417,745 62423,23783 62424,500 62425,298 62426,485 62427,18726 62429,3555 62430,79 62432,3 62433,1181 62434,30 62434,192 62434,298 62434,862 62434,1085 62434,1462 62434,7124 62434,8537 62435,163 62436,1707 62438,58 62439,431 62439,762 62439,103860 62440,83 62441,2411 62442,158 62443,743 62444,200 62444,772 62444,1332 62445,298 62446,485 62447,209 62448,9015 62449,1231 62450,248 62451,2979 62452,1579 62454,62455 62456,62455 62457,138 62457,195 62457,644 62457,752 62457,907 62457,1619 62457,1973 62457,2244 62457,60576 62458,1033 62459,222 62459,389 62459,634 62459,657 62459,1072 62459,33508 62460,247 62461,868 62461,15573 62461,75912 62462,1983 62463,1052 62464,209 62465,62466 62468,1133 62469,192 62470,8 62470,273 62470,274 62470,372 62470,485 62470,581 62470,647 62470,668 62470,675 62470,827 62470,1058 62470,1313 62470,3612 62471,1619 62472,704 62473,1007 62474,1133 62475,62476 62475,70423 62475,115497 62475,122820 62475,129407 62475,129622 62475,130440 62475,155568 62477,217 62477,1417 62478,2979 62479,868 62481,275 62482,372 62482,588 62482,590 62482,631 62482,714 62482,805 62482,1119 62482,1282 62482,1402 62482,1608 62482,1818 62482,2210 62482,2620 62482,2797 62482,2989 62482,2991 62482,3507 62482,4237 62482,4752 62482,57802 62482,62482 62482,143414 62482,143415 62482,257474 62482,261162 62483,71 62484,1085 62484,1133 62484,3474 62484,4504 62486,535 62487,1849 62487,32784 62487,189128 62488,302 62488,579 62488,861 62489,852 62490,690 62491,302 62491,2116 62492,192 62492,1181 62493,160 62494,83 62495,2506 62497,338 62497,652 62497,835 62497,1052 62497,1127 62497,1381 62497,1551 62497,1893 62497,2626 62498,107 62500,9098 62501,22 62502,30 62504,2744 62504,4222 62505,2979 62508,72 62509,71 62509,86 62509,304 62509,356 62509,563 62509,599 62509,611 62509,615 62509,631 62509,717 62509,788 62509,811 62509,852 62509,859 62509,1085 62509,1309 62509,1368 62509,1541 62509,1740 62509,1749 62509,1782 62509,6068 62509,7155 62510,477 62511,1001 62512,209 62513,1707 62514,72 62515,1181 62517,1298 62519,30 62520,30 62521,209 62523,298 62524,485 62525,136 62526,22 62526,760 62526,2224 62527,1707 62528,62529 62528,87348 62528,114532 62530,79 62530,406 62530,620 62530,1515 62531,875 62532,72 62533,920 62534,2979 62535,62536 62535,107257 62537,151 62538,333 62539,536 62539,781 62539,2646 62539,2944 62539,7698 62540,62541 62542,1608 62543,2506 62544,72 62545,344 62546,285 62547,2073 62548,62549 62550,473 62551,640 62552,298 62553,485 62554,6068 62555,8149 62556,104 62557,483 62558,62559 62560,178 62560,240 62560,435 62560,62561 62562,393 62563,22 62563,217 62563,1417 62563,2017 62563,17309 62564,744 62565,72 62566,332 62568,83 62569,360 62571,178 62572,62573 62572,105992 62572,116322 62574,30 62575,1623 62576,920 62577,247 62578,62579 62580,62581 62582,251 62582,1512 62582,5992 62583,107 62584,62585 62586,298 62587,485 62588,602 62589,106 62590,72 62593,745 62593,2443 62594,298 62595,485 62597,1177 62597,2334 62598,328 62599,360 62600,2266 62600,18831 62601,72 62602,6726 62603,874 62604,801 62604,1140 62605,500 62605,622 62606,314 62607,72 62608,809 62608,1313 62608,2828 62610,586 62611,3260 62612,364 62613,298 62614,485 62615,1414 62616,358 62616,1096 62616,1326 62617,83 62618,5375 62619,1132 62620,1983 62621,781 62622,72 62623,949 62623,1419 62624,26 62624,59 62624,21944 62625,872 62626,779 62626,68069 62627,209 62628,338 62629,1983 62630,779 62631,10 62632,192 62632,779 62633,306 62633,307 62633,333 62633,1181 62634,676 62635,676 62636,5440 62637,72 62638,344 62639,285 62640,557 62641,557 62642,704 62643,269 62644,2979 62645,1707 62646,1773 62647,62648 62647,63183 62647,66111 62647,98743 62647,109742 62647,130757 62649,72 62650,62651 62652,83 62653,62654 62655,187 62656,72 62657,62658 62657,233837 62659,2506 62660,171 62661,79 62662,21944 62663,704 62664,3069 62665,62666 62667,390 62667,1363 62668,187 62669,687 62670,30 62671,389 62672,192 62673,1983 62674,1983 62675,1117 62676,1603 62677,62677 62679,704 62680,1284 62681,1566 62682,392 62683,137 62684,3413 62685,81 62686,158 62686,406 62686,620 62686,1181 62686,1425 62686,102560 62687,1370 62688,62689 62690,3653 62691,1414 62692,62693 62694,275 62695,182 62696,1265 62696,1266 62697,20004 62698,72 62699,702 62699,703 62700,62701 62702,192 62704,3538 62705,54 62705,5906 62706,10 62707,62708 62709,62710 62711,5547 62712,2671 62713,62714 62715,5440 62716,62717 62718,35687 62719,62720 62721,589 62722,422 62723,6068 62724,62725 62726,21944 62727,704 62728,62729 62730,1238 62731,366 62732,3246 62732,3247 62733,366 62734,18726 62735,163 62736,366 62738,1452 62739,37 62739,1782 62740,77 62741,1509 62742,102 62743,233 62744,62745 62744,128545 62746,130 62747,355 62749,340 62750,366 62751,126 62752,83 62753,1326 62754,118 62754,333 62755,585 62756,349 62757,209 62758,1326 62758,1531 62759,1436 62760,306 62760,307 62761,676 62762,62763 62764,1467 62765,66 62766,171 62768,515 62769,668 62770,209 62771,68 62772,62773 62774,62775 62776,62775 62777,62775 62778,58 62779,644 62781,147 62782,58 62783,46 62784,56 62785,310 62786,571 62787,1419 62788,1844 62789,83 62790,356 62790,390 62790,6068 62790,9457 62791,62792 62793,187 62794,640 62795,2775 62796,447 62798,264 62798,515 62798,647 62798,835 62798,1147 62798,1289 62798,1893 62798,6695 62799,207 62800,1983 62802,1631 62803,640 62804,1509 62805,891 62807,19 62808,55849 62809,760 62810,16045 62811,248 62812,918 62813,1414 62814,518 62814,1010 62814,1298 62814,1300 62814,1411 62814,2784 62815,3413 62817,97 62818,209 62818,489 62818,827 62818,2073 62819,217 62819,592 62820,30 62822,685 62822,849 62824,292 62824,338 62825,30 62826,62827 62828,417 62830,106 62831,30 62833,1323 62834,102 62835,1326 62836,408 62838,62839 62840,151 62841,2260 62842,1012 62845,581 62846,1983 62847,62848 62849,1181 62850,5250 62852,192 62852,663 62852,1089 62852,3872 62853,1175 62854,202 62854,251 62855,1119 62856,47 62856,2469 62857,1983 62859,433 62859,1634 62860,515 62860,1127 62860,1893 62860,49057 62861,388 62862,195 62863,209 62864,62865 62866,62865 62867,640 62868,306 62868,307 62868,991 62868,1220 62868,1222 62869,1381 62870,5213 62871,102 62871,1113 62871,1323 62872,1707 62873,2744 62875,422 62876,422 62877,422 62878,422 62879,422 62880,422 62882,422 62883,422 62884,422 62885,422 62886,525 62886,1012 62886,1119 62886,1177 62886,1564 62886,1818 62887,422 62888,1844 62888,2867 62888,2868 62889,663 62889,664 62890,1623 62891,68 62892,68 62893,1227 62893,1229 62893,21944 62893,86416 62894,872 62896,5405 62897,1634 62898,2424 62899,1019 62900,4355 62901,1983 62902,251 62904,663 62905,2979 62906,356 62907,298 62908,818 62909,1102 62910,1531 62911,1983 62913,62914 62915,644 62917,62918 62919,483 62920,209 62921,760 62921,1858 62922,62923 62924,298 62924,347 62924,615 62924,1243 62924,2367 62924,7429 62925,1531 62926,1287 62927,10 62927,11 62927,50 62927,79 62927,195 62927,252 62927,272 62927,305 62927,485 62927,602 62927,920 62927,1319 62927,1891 62927,3209 62927,4455 62927,5213 62927,7117 62928,171 62929,298 62930,485 62931,32 62931,41 62931,58 62931,264 62931,309 62931,310 62931,328 62931,344 62931,390 62931,439 62931,455 62931,538 62931,649 62931,779 62931,784 62931,872 62931,877 62931,973 62931,1289 62931,1381 62931,1436 62931,1452 62931,1458 62931,3695 62931,16687 62931,115659 62931,227669 62932,167 62932,349 62932,808 62932,1167 62932,1522 62932,5301 62932,6955 62933,18726 62934,20 62935,644 62936,406 62937,1474 62939,163 62940,644 62941,247 62942,50 62942,305 62942,516 62942,920 62942,22280 62943,941 62944,292 62944,1143 62944,1453 62944,1653 62944,1722 62945,209 62946,415 62946,6487 62947,62948 62949,211 62951,875 62951,1836 62952,58 62953,62954 62955,941 62956,628 62957,200 62957,248 62959,1531 62960,1634 62961,424 62963,920 62964,332 62964,1119 62964,6556 62965,1381 62966,1634 62967,424 62968,30 62969,717 62970,240 62971,205 62972,209 62973,30 62974,83 62975,2416 62975,2417 62976,4094 62977,1370 62978,195 62979,918 62980,644 62981,344 62982,1016 62982,84257 62984,996 62985,47 62985,2469 62987,579 62988,10 62988,14366 62988,14483 62989,27550 62990,873 62990,874 62990,1210 62991,1983 62992,298 62993,485 62994,392 62994,1454 62995,1425 62997,1769 62998,287 62998,349 62998,3602 62998,4252 62999,1467 63000,63001 63002,209 63003,1509 63004,2697 63005,2775 63007,636 63008,298 63009,485 63010,34 63010,35 63010,41 63010,222 63010,278 63010,283 63010,349 63010,389 63010,534 63010,536 63010,634 63010,657 63010,781 63010,949 63010,1019 63010,1072 63010,1085 63010,1274 63010,1467 63010,1539 63010,1571 63010,1718 63010,1871 63010,1881 63010,2168 63010,2266 63010,2319 63010,2424 63010,2784 63010,2944 63010,2995 63010,3370 63010,3623 63010,4594 63010,5976 63010,6789 63010,6888 63010,7768 63010,13137 63010,14453 63010,15573 63010,29475 63011,248 63012,586 63013,298 63014,485 63015,1836 63017,2116 63018,1844 63019,1983 63020,918 63021,1181 63022,1983 63023,63024 63025,1983 63026,209 63027,72 63029,676 63030,248 63031,4611 63032,222 63032,264 63033,302 63033,893 63034,248 63035,68 63036,1888 63037,818 63038,941 63038,2812 63039,1224 63040,483 63041,1871 63042,209 63043,63044 63045,1776 63046,140 63047,4411 63048,586 63048,1243 63049,102 63049,1113 63049,1323 63050,83 63052,1033 63052,1531 63053,65 63054,240 63054,1955 63055,1871 63056,676 63057,8907 63058,7652 63059,388 63059,14126 63060,2646 63061,349 63062,1001 63062,3094 63063,393 63064,209 63066,289 63066,290 63066,298 63066,417 63066,592 63066,1085 63066,2296 63066,94134 63067,301 63067,861 63067,893 63067,1231 63067,2979 63067,3422 63068,1019 63071,392 63072,247 63073,2979 63074,417 63075,83 63075,852 63075,3422 63075,6068 63075,44725 63079,3367 63080,1805 63081,34 63081,35 63081,68 63081,167 63081,217 63081,227 63081,240 63081,248 63081,264 63081,289 63081,290 63081,301 63081,392 63081,406 63081,435 63081,442 63081,479 63081,493 63081,516 63081,588 63081,590 63081,875 63081,1010 63081,1014 63081,1019 63081,1085 63081,1151 63081,1181 63081,1210 63081,1282 63081,1370 63081,1462 63081,1466 63081,1531 63081,2671 63081,2979 63081,3804 63081,8537 63081,94134 63081,144988 63083,818 63084,640 63085,4672 63086,273 63086,274 63086,313 63087,9018 63088,577 63088,852 63088,1070 63089,920 63090,760 63091,1983 63092,209 63093,5405 63095,126 63096,809 63096,19010 63097,32 63097,720 63097,875 63097,1117 63097,1241 63097,3260 63097,14458 63097,76096 63097,115474 63098,417 63099,485 63100,10 63101,187 63102,240 63102,301 63102,567 63102,1160 63102,1359 63102,1462 63102,1785 63102,1818 63102,1832 63102,2620 63102,5718 63102,8537 63103,32 63106,151 63107,240 63107,818 63108,63109 63110,393 63111,2979 63112,63113 63114,140 63115,63116 63117,298 63118,485 63119,217 63120,83 63121,301 63121,2979 63121,5662 63122,422 63123,56 63124,356 63124,5591 63125,20 63125,536 63125,647 63125,1151 63125,1363 63125,1571 63125,2411 63125,13361 63125,66500 63126,192 63126,406 63126,620 63126,779 63126,1515 63127,626 63128,818 63129,483 63131,622 63132,107 63132,2646 63133,1836 63134,3413 63135,1983 63136,251 63136,252 63136,577 63136,1105 63136,1220 63136,1222 63136,1429 63137,3 63138,83 63139,63140 63141,376 63142,83 63143,885 63144,1707 63145,636 63146,1181 63147,63148 63149,1381 63149,1551 63149,1639 63150,861 63151,1085 63153,611 63154,4611 63155,63156 63157,247 63158,217 63158,301 63158,872 63158,1085 63159,611 63159,852 63160,431 63161,63162 63161,153670 63163,4355 63164,2411 63165,652 63167,1247 63168,1082 63169,9195 63170,79 63171,298 63172,5405 63173,920 63174,861 63176,783 63177,79 63178,640 63180,493 63182,312 63184,571 63184,1634 63185,192 63185,1243 63186,571 63187,772 63187,1179 63188,83 63189,536 63190,2671 63191,10 63192,77 63193,1319 63194,217 63195,1707 63196,772 63198,1608 63199,620 63200,577 63202,5440 63203,1522 63204,557 63205,557 63206,704 63207,13980 63208,1707 63209,24505 63210,7652 63211,1983 63212,349 63213,269 63214,805 63215,1983 63216,298 63217,485 63218,3413 63219,3085 63221,63222 63223,920 63224,349 63225,298 63226,485 63227,932 63228,302 63228,4823 63228,6303 63229,298 63230,485 63231,340 63232,178 63233,79 63234,1858 63235,1858 63236,1860 63237,1860 63238,219 63239,697 63240,9121 63241,1556 63242,861 63243,22 63244,120 63245,704 63246,271 63247,72 63247,1363 63248,63249 63250,602 63251,602 63252,1858 63253,1860 63254,195 63255,251 63255,516 63255,893 63255,1033 63256,1634 63257,424 63258,298 63259,485 63260,63261 63262,158 63262,63263 63264,21944 63265,298 63266,485 63267,63268 63269,640 63270,233 63270,240 63270,590 63270,592 63270,631 63270,805 63270,1785 63270,1818 63270,2620 63270,5718 63271,1983 63272,862 63273,328 63275,184 63276,30 63277,366 63278,107 63279,104 63279,134 63279,135 63279,137 63280,63281 63282,63283 63284,248 63285,779 63286,63287 63288,63287 63289,920 63290,2480 63291,862 63292,1181 63293,63294 63295,63296 63297,2351 63298,147 63299,63300 63301,1511 63301,3069 63302,907 63303,3804 63304,269 63305,44 63306,6263 63307,1522 63308,275 63309,7124 63310,7652 63311,16045 63312,9560 63313,9560 63314,171 63315,9121 63316,1644 63317,30 63318,5440 63319,431 63320,366 63321,366 63322,366 63323,366 63324,366 63325,366 63326,366 63327,1634 63328,273 63328,274 63329,104 63329,136 63329,200 63329,254 63329,442 63329,636 63329,953 63329,1368 63329,1939 63330,233 63331,63332 63333,872 63334,63335 63336,79 63337,47 63337,2469 63338,71 63338,332 63338,1821 63338,21736 63339,366 63340,2351 63341,119 63341,1298 63341,4545 63342,323 63343,1619 63344,1590 63345,211 63346,355 63347,439 63347,1776 63348,79 63348,775 63349,1 63350,784 63350,1559 63350,2209 63351,252 63352,72 63353,385 63353,1241 63354,2979 63355,779 63355,68069 63356,7124 63357,18726 63358,298 63359,485 63360,163 63361,2205 63361,33424 63361,245910 63362,34 63362,35 63362,313 63363,992 63364,366 63365,30 63366,707 63368,422 63369,56 63370,811 63370,861 63370,893 63372,1326 63372,14797 63373,192 63374,333 63374,346 63374,366 63374,1247 63375,304 63375,387 63375,390 63375,589 63375,666 63375,849 63375,1363 63375,1419 63375,2460 63375,2590 63375,3367 63375,4222 63375,5591 63375,21982 63376,6682 63377,298 63378,485 63379,1659 63380,298 63381,485 63382,298 63383,485 63384,433 63385,473 63385,8149 63388,252 63388,318 63389,252 63390,647 63391,859 63392,657 63393,1707 63394,306 63394,307 63395,433 63396,63397 63398,640 63399,63400 63401,344 63403,622 63405,433 63406,13538 63408,972 63409,233 63410,222 63410,278 63410,2775 63411,186 63411,240 63411,818 63411,1623 63411,127158 63413,356 63413,859 63413,1285 63414,2775 63415,21944 63416,473 63417,298 63418,485 63419,171 63420,1122 63424,868 63425,439 63425,579 63426,89 63427,1359 63428,364 63429,581 63430,55849 63431,392 63432,328 63432,392 63432,622 63432,2266 63432,9030 63433,79 63434,10 63434,147 63434,158 63434,336 63434,682 63434,1243 63434,1512 63434,2244 63434,2528 63434,72439 63435,364 63436,668 63436,843 63436,1191 63437,850 63438,462 63438,1146 63438,1949 63439,55479 63440,676 63441,720 63442,83 63443,195 63444,992 63445,1323 63446,102 63447,1326 63448,408 63449,1392 63451,623 63452,392 63452,697 63453,63454 63455,809 63456,147 63457,31237 63458,217 63458,1019 63459,417 63460,147 63461,425 63463,30 63464,447 63465,5405 63466,63467 63468,63467 63469,304 63470,579 63470,63471 63472,30331 63474,13136 63475,693 63476,497 63477,187 63478,1509 63479,893 63480,1818 63481,346 63482,30 63483,206 63483,1326 63484,312 63485,304 63486,63487 63488,6682 63489,3413 63490,3538 63491,567 63491,604 63491,750 63491,762 63492,6726 63493,302 63494,107 63494,151 63495,3724 63496,644 63497,4355 63498,23010 63499,439 63500,433 63501,63502 63503,392 63503,1240 63504,1619 63504,13538 63506,3260 63509,389 63510,222 63511,1634 63512,206 63512,435 63512,2617 63513,7360 63514,209 63516,21944 63517,7652 63518,577 63518,788 63518,1274 63519,34 63519,35 63519,222 63519,379 63519,385 63519,536 63519,779 63519,2944 63520,178 63521,2105 63522,21944 63523,1531 63524,209 63526,6303 63528,1977 63528,1978 63529,422 63530,422 63531,422 63532,1332 63533,422 63534,422 63535,422 63536,875 63537,422 63538,2775 63539,422 63540,422 63541,21944 63542,240 63543,349 63544,980 63544,1531 63544,2178 63544,4545 63544,16331 63544,139010 63545,195 63546,875 63546,1454 63547,1010 63548,1983 63549,760 63550,21944 63551,485 63552,30 63553,31896 63554,255 63555,422 63556,83 63557,330 63558,147 63559,875 63560,356 63561,30 63562,349 63563,5987 63565,21944 63566,843 63566,3804 63567,209 63568,571 63568,868 63569,336 63570,63571 63570,70056 63570,98355 63572,493 63572,1181 63572,2867 63572,2868 63572,22880 63573,417 63574,1118 63575,117 63575,200 63575,2712 63575,21944 63576,772 63577,30 63578,557 63579,999 63580,146 63580,158 63580,192 63580,285 63580,336 63580,406 63580,620 63580,779 63580,920 63580,1515 63580,1531 63580,1893 63583,518 63584,6303 63585,147 63585,158 63585,206 63585,406 63585,1181 63585,1515 63586,21944 63587,1639 63588,435 63588,1531 63590,30 63593,392 63593,1146 63594,30 63595,811 63596,138 63596,557 63596,1368 63597,30 63598,509 63598,1634 63598,1782 63598,75912 63599,30 63600,30 63601,2045 63602,30 63603,3 63604,304 63604,1962 63605,1556 63606,861 63607,22 63608,63609 63610,1096 63611,30 63612,30 63613,23011 63614,30 63615,536 63616,1265 63616,1266 63617,1012 63619,30 63620,310 63621,301 63622,2775 63623,447 63624,22 63625,30 63626,63 63626,332 63628,217 63628,1417 63629,1 63629,4 63629,5 63629,65 63629,694 63629,1082 63629,1807 63629,2926 63629,4411 63630,3182 63631,30 63632,30 63633,30 63634,663 63634,1089 63635,868 63636,726 63637,1634 63638,424 63639,135 63639,596 63639,784 63639,1052 63639,1368 63640,3209 63641,1179 63642,973 63643,134 63644,704 63645,247 63645,2867 63645,22880 63646,63647 63648,301 63649,206 63651,1274 63652,346 63653,588 63653,590 63655,285 63655,779 63655,1515 63656,364 63656,372 63656,2209 63657,439 63658,473 63659,248 63660,63661 63662,1085 63663,83 63664,2146 63665,2274 63666,83 63667,151 63668,30 63669,338 63670,30 63671,1860 63672,1858 63673,3069 63674,83 63675,861 63676,186 63676,301 63676,518 63676,525 63676,795 63676,1085 63676,1235 63676,1326 63676,1715 63676,2205 63676,2206 63676,3804 63676,4146 63676,21711 63676,33424 63677,264 63677,1551 63678,852 63679,30 63680,68 63681,247 63682,1392 63683,217 63683,1417 63684,34 63684,35 63685,219 63686,30 63687,30 63688,920 63689,5310 63690,30 63691,8788 63692,72 63693,175 63694,392 63695,1 63696,38634 63697,209 63698,40159 63699,68 63699,77 63699,104 63699,107 63699,120 63699,134 63699,137 63699,151 63699,184 63699,252 63699,269 63699,273 63699,278 63699,283 63699,287 63699,294 63699,326 63699,328 63699,340 63699,349 63699,356 63699,358 63699,364 63699,392 63699,417 63699,595 63699,611 63699,668 63699,707 63699,752 63699,760 63699,784 63699,805 63699,1070 63699,1087 63699,1143 63699,1167 63699,1220 63699,1222 63699,1257 63699,1285 63699,1313 63699,1531 63699,1559 63699,1634 63699,1718 63699,1860 63699,2105 63699,2266 63699,2367 63699,2411 63699,2744 63699,2779 63699,2931 63699,4146 63699,4597 63699,5326 63699,5540 63699,6556 63699,7757 63699,9028 63699,19010 63699,21944 63699,162599 63699,188791 63699,212914 63699,213089 63700,107 63701,34 63701,35 63703,841 63704,1544 63705,1572 63706,1449 63707,71 63708,1571 63709,991 63710,247 63712,285 63713,697 63715,5265 63716,1001 63717,1515 63718,1188 63719,1858 63720,1860 63721,294 63722,1 63723,347 63724,106 63724,337 63725,1305 63726,26 63726,59 63727,3069 63728,134 63729,44725 63730,1983 63731,233 63732,8308 63733,704 63734,957 63734,1815 63735,538 63735,996 63735,1294 63736,72 63737,596 63738,596 63739,240 63739,694 63740,805 63742,280 63743,333 63744,557 63745,557 63746,557 63747,1572 63748,2351 63750,2334 63750,3602 63751,30 63752,685 63753,50 63754,1370 63754,1821 63755,379 63755,1096 63756,63757 63758,58 63758,3474 63758,5547 63759,255 63760,30 63761,483 63762,1531 63763,83 63764,184 63765,2506 63766,557 63767,79 63768,178 63769,273 63769,274 63770,30 63771,72 63772,358 63774,875 63777,2506 63778,58 63779,46 63780,58 63781,46 63782,2989 63782,2991 63783,2506 63784,744 63784,1844 63784,19010 63785,2506 63786,9025 63787,2620 63788,63789 63790,310 63791,1707 63792,424 63793,417 63793,611 63793,852 63794,151 63795,63796 63797,63798 63799,72 63800,344 63801,285 63803,63804 63803,171437 63805,3960 63806,366 63807,344 63807,3474 63807,5547 63808,366 63809,104 63810,366 63811,1235 63811,1335 63811,2089 63811,2940 63811,21944 63812,15573 63813,704 63814,2210 63814,4237 63815,63816 63817,366 63818,18726 63819,63820 63821,63822 63823,163 63824,704 63825,22 63825,211 63826,252 63826,318 63826,41170 63827,563 63828,366 63829,252 63829,318 63829,41170 63830,63831 63832,611 63833,2590 63834,18726 63836,18726 63837,163 63838,1370 63838,1821 63839,50791 63840,671 63841,366 63843,30 63844,8270 63845,63846 63847,1363 63848,304 63849,63850 63849,82446 63849,129486 63851,704 63852,3 63853,63854 63855,2867 63855,2868 63855,22880 63856,2506 63857,5375 63858,63859 63861,30 63862,240 63862,1411 63862,63863 63862,90817 63862,109195 63864,195 63864,640 63864,17228 63864,27217 63865,925 63866,685 63867,752 63867,63868 63867,78963 63867,90618 63867,91133 63867,92100 63867,92826 63867,108337 63867,108614 63867,117580 63867,156583 63867,177387 63869,63870 63871,72 63872,344 63873,285 63874,233 63875,44 63876,14366 63877,30 63878,611 63879,872 63879,1127 63881,1983 63882,72 63883,818 63884,1776 63885,63886 63887,376 63888,10 63889,2367 63890,920 63891,676 63892,611 63893,355 63894,3209 63895,611 63895,1449 63896,6027 63897,63898 63899,1983 63900,3804 63901,302 63901,1019 63902,611 63903,13361 63904,302 63907,1235 63907,1335 63908,1984 63909,10 63909,704 63909,784 63909,805 63909,1149 63909,1631 63910,875 63911,18726 63912,163 63913,2979 63914,58 63915,46 63916,202 63916,203 63917,875 63918,827 63919,63920 63921,875 63922,4980 63923,358 63924,118 63924,4597 63925,209 63926,571 63926,868 63926,1096 63927,1014 63928,302 63929,58 63930,46 63931,704 63932,29380 63933,192 63934,360 63934,2626 63935,3960 63936,1544 63937,640 63938,640 63940,640 63941,479 63942,779 63943,538 63944,302 63946,2574 63947,1113 63948,209 63950,640 63951,2775 63952,447 63953,1858 63954,1860 63955,137 63957,63958 63959,63960 63961,2168 63961,2944 63961,18831 63963,907 63963,932 63964,187 63965,1955 63965,8276 63966,356 63966,843 63967,626 63967,752 63967,1571 63967,1634 63968,1707 63969,1363 63970,4455 63972,417 63973,907 63975,581 63976,301 63977,2995 63979,1326 63980,50 63980,516 63980,622 63981,63982 63983,3474 63984,818 63984,17309 63985,920 63986,83 63987,406 63987,1515 63989,3413 63990,120 63990,752 63990,1119 63990,6068 63991,83 63992,66 63993,298 63994,485 63995,676 63996,63997 63998,338 63998,668 63999,64000 64001,1359 64002,1556 64003,240 64003,255 64004,1323 64005,102 64006,1326 64007,408 64008,5662 64009,1289 64010,106 64010,192 64010,251 64010,346 64010,435 64010,447 64010,516 64010,586 64010,620 64010,934 64010,1033 64010,1175 64010,1512 64010,1985 64010,5992 64011,3695 64012,26 64012,59 64013,3585 64014,875 64016,264 64016,1127 64016,1381 64016,1893 64017,392 64019,58 64020,46 64022,187 64023,644 64024,644 64024,697 64024,3003 64025,192 64026,1085 64026,1580 64026,75912 64029,424 64030,483 64032,171 64033,417 64034,875 64035,304 64037,106 64037,337 64038,3413 64039,602 64041,273 64041,274 64042,2574 64043,525 64044,406 64045,64046 64047,140 64048,35486 64049,336 64050,1392 64051,422 64052,422 64053,422 64054,422 64055,599 64056,422 64057,422 64058,422 64059,422 64060,422 64061,1294 64062,586 64063,337 64064,929 64065,4177 64066,77 64067,192 64067,337 64067,841 64067,2244 64068,2646 64070,167 64070,2083 64072,87 64072,392 64072,595 64072,703 64072,872 64072,1151 64072,1572 64072,2274 64074,1085 64075,66 64075,467 64075,868 64076,875 64077,1447 64078,287 64078,733 64078,827 64079,192 64079,285 64080,1977 64080,1978 64081,72 64082,344 64083,285 64085,2775 64086,87 64086,392 64086,595 64086,703 64086,872 64086,1151 64086,1572 64086,2274 64087,875 64088,1590 64089,2889 64090,636 64091,64092 64091,113456 64091,120467 64091,123431 64091,160563 64091,186447 64091,213626 64091,213640 64091,231961 64091,237516 64091,240350 64091,242982 64093,289 64093,290 64094,310 64095,1608 64097,217 64099,3161 64100,64101 64103,107 64104,392 64105,2929 64106,146 64107,151 64108,278 64108,694 64108,1019 64108,6789 64109,875 64110,1858 64111,1860 64112,1241 64113,874 64114,4455 64115,17228 64116,130 64117,4611 64118,1544 64119,83 64120,349 64121,687 64121,1556 64122,302 64123,44 64124,852 64124,5591 64125,247 64126,605 64127,1140 64127,5547 64128,1983 64129,106 64129,1033 64129,6119 64130,518 64130,1113 64130,1326 64130,1955 64130,8270 64131,392 64132,1769 64133,1891 64134,72 64135,577 64135,1429 64136,41 64137,356 64138,302 64139,219 64140,280 64141,206 64142,287 64143,422 64144,56 64145,592 64148,2979 64149,1119 64150,1119 64151,861 64152,702 64152,874 64152,1210 64153,192 64153,622 64153,663 64153,664 64154,1298 64154,1436 64155,2421 64156,1167 64158,1837 64159,1639 64160,1579 64161,1688 64162,1837 64164,850 64165,6750 64166,1147 64167,861 64168,66 64169,4980 64170,3209 64171,292 64171,312 64171,1177 64171,2443 64172,233 64173,6068 64174,1608 64175,483 64176,64177 64178,264 64178,736 64179,704 64180,64181 64182,1010 64182,1849 64183,349 64184,2995 64185,1019 64185,1462 64186,26 64186,59 64186,21944 64187,861 64188,390 64188,6068 64189,147 64189,158 64190,1639 64191,1579 64192,1454 64192,8541 64193,483 64194,64195 64196,83 64197,1085 64197,75912 64198,151 64199,233 64200,106 64200,192 64200,202 64200,203 64200,252 64200,318 64200,516 64200,586 64200,1220 64200,1222 64200,16201 64200,41170 64201,259 64202,64203 64205,1635 64206,207 64206,647 64206,934 64206,1058 64206,1247 64207,779 64208,818 64209,1571 64210,292 64211,83 64212,1849 64214,1 64215,1983 64216,64217 64218,500 64219,366 64220,178 64221,2590 64222,86 64222,104 64222,516 64222,671 64222,932 64222,953 64222,1127 64222,1243 64222,1458 64222,3507 64222,4355 64223,86 64224,1096 64225,875 64226,973 64227,3538 64228,247 64229,392 64230,2671 64231,83 64232,8992 64233,5366 64234,65 64236,1590 64236,1644 64237,390 64237,424 64237,438 64237,479 64237,536 64237,644 64237,1058 64237,1282 64237,2528 64237,3041 64237,7155 64238,875 64240,1 64241,280 64241,17245 64242,33598 64243,2367 64244,406 64245,83 64246,195 64247,772 64248,1 64249,7652 64250,875 64251,72 64252,1556 64253,875 64254,592 64255,1363 64256,1274 64257,2006 64258,779 64258,68069 64259,1381 64260,861 64261,298 64262,485 64263,7360 64264,390 64265,30 64266,1465 64267,326 64268,4 64268,5 64270,835 64271,247 64272,671 64273,21944 64274,527 64275,1227 64275,1229 64275,86416 64276,657 64277,3413 64278,2944 64279,302 64280,527 64281,64282 64283,10 64283,120 64283,278 64283,333 64283,467 64283,3297 64283,5101 64283,37414 64283,66733 64283,66797 64283,66898 64284,364 64284,1252 64284,1253 64285,134 64286,1285 64287,455 64288,657 64289,225 64290,827 64291,4903 64292,1551 64293,779 64295,3507 64296,5213 64297,743 64298,21944 64299,72 64300,240 64300,269 64301,4192 64301,4193 64302,30 64303,376 64304,885 64306,14797 64307,64308 64310,1096 64311,83 64312,72 64313,30 64314,389 64315,1082 64316,107 64317,202 64317,203 64318,64319 64320,557 64321,557 64322,1707 64323,2506 64324,1235 64324,1335 64324,1462 64325,8270 64326,704 64327,305 64328,217 64329,6068 64331,2775 64332,447 64333,1983 64334,596 64334,1368 64335,118 64335,4597 64336,30 64337,64338 64340,704 64341,240 64341,1955 64342,30 64343,298 64344,485 64345,4594 64346,83 64347,104 64347,136 64347,596 64347,617 64347,1368 64347,38144 64347,40220 64347,64509 64347,65395 64347,66873 64348,64349 64350,779 64351,120 64352,4895 64353,56 64353,192 64353,1623 64354,34 64354,35 64354,2784 64355,949 64356,64357 64358,1462 64358,8537 64359,862 64360,4895 64361,269 64362,515 64363,30 64364,30 64365,206 64366,704 64367,72 64368,64369 64370,328 64371,64372 64373,64374 64375,779 64376,932 64377,8270 64378,417 64379,663 64379,664 64380,2205 64380,2206 64381,393 64382,8822 64383,72 64384,344 64385,285 64386,118 64386,4597 64387,8308 64388,13919 64389,704 64390,30 64391,2506 64392,4276 64392,22880 64393,1133 64394,704 64395,704 64396,663 64396,664 64397,358 64397,687 64398,1634 64399,424 64400,298 64401,18726 64402,163 64403,64404 64405,3182 64406,1980 64406,8991 64407,134 64408,779 64409,202 64409,203 64409,332 64409,1392 64409,1572 64409,6837 64410,2116 64411,64412 64413,217 64414,1133 64415,704 64416,2367 64417,9323 64418,417 64419,973 64420,7358 64420,7363 64421,211 64422,118 64422,4597 64423,118 64423,4597 64424,676 64425,366 64426,366 64427,366 64428,366 64429,366 64430,366 64431,366 64432,366 64433,366 64434,366 64435,30 64436,366 64437,366 64438,366 64440,366 64441,366 64442,366 64443,366 64444,64445 64446,1265 64446,1266 64448,2266 64449,233 64451,3413 64453,2116 64454,2048 64455,376 64457,1298 64457,1732 64457,75912 64458,64459 64460,9005 64461,355 64462,171 64463,1181 64464,1968 64465,298 64466,485 64467,1858 64468,1860 64470,251 64470,465 64471,302 64472,64473 64474,4192 64474,4193 64475,425 64475,1276 64476,1740 64477,433 64477,1634 64478,1927 64479,657 64480,2775 64481,447 64482,3 64482,1871 64483,1983 64484,1983 64485,1983 64486,310 64487,298 64488,682 64489,64490 64491,1860 64492,251 64492,465 64492,877 64492,1985 64493,779 64495,1858 64496,1860 64497,264 64497,515 64497,736 64497,1289 64498,217 64499,1860 64500,44 64501,1634 64502,79 64503,875 64504,1688 64505,640 64506,336 64507,1590 64508,874 64510,349 64511,1235 64511,1335 64511,2209 64511,8180 64511,21711 64512,703 64514,107 64514,2646 64515,50 64516,500 64517,1962 64518,1052 64519,1882 64520,2775 64521,54 64522,1983 64523,1983 64525,589 64525,1001 64525,1085 64526,1001 64526,1235 64526,1335 64526,2116 64527,515 64528,30 64529,1983 64530,1220 64531,2775 64532,447 64533,749 64533,1146 64533,3538 64534,2334 64535,602 64536,64537 64538,980 64539,406 64540,581 64541,808 64543,596 64544,1506 64545,1983 64546,202 64546,203 64547,1127 64548,64549 64550,1881 64550,5326 64551,682 64552,1220 64552,1222 64553,252 64554,251 64556,682 64557,349 64558,682 64558,72439 64559,2353 64560,682 64560,72439 64561,682 64561,72439 64562,261 64562,333 64563,251 64563,252 64563,925 64563,1220 64563,1222 64563,41170 64564,1776 64564,4193 64565,34 64565,158 64566,5591 64568,158 64568,1181 64569,485 64570,467 64570,189839 64571,1688 64572,439 64573,30331 64574,278 64575,254 64576,1267 64578,240 64578,1285 64579,1983 64581,1955 64582,79 64582,333 64585,1983 64586,273 64586,274 64588,2116 64589,623 64589,1805 64590,4611 64591,349 64592,1085 64593,805 64596,7652 64597,273 64597,274 64598,406 64598,516 64598,1181 64599,1663 64600,72 64601,644 64603,107 64603,200 64603,364 64603,3474 64604,302 64605,1983 64606,973 64607,1509 64608,390 64609,273 64609,274 64610,440 64611,222 64612,1243 64613,433 64614,5405 64615,1210 64616,536 64617,577 64617,1429 64618,1983 64619,1983 64621,1133 64622,338 64622,340 64622,344 64622,360 64622,515 64622,835 64622,1052 64622,1127 64622,1224 64622,1267 64622,1663 64622,1673 64622,1836 64622,1893 64622,2312 64622,2367 64622,13538 64622,49057 64622,81070 64624,788 64625,431 64626,425 64627,10 64628,2574 64629,5405 64630,868 64631,41 64631,1119 64633,264 64634,219 64634,68069 64635,893 64637,868 64638,1608 64639,17334 64640,364 64641,312 64642,1522 64643,203 64643,2931 64644,479 64645,415 64646,1579 64647,1639 64648,30 64648,248 64649,1977 64649,1978 64650,493 64651,5212 64652,275 64653,2205 64653,2206 64653,33424 64654,64655 64657,500 64658,1962 64659,1052 64660,1882 64661,2775 64662,54 64663,1860 64664,192 64665,302 64667,809 64668,1881 64669,620 64669,8244 64670,1140 64671,1274 64672,81 64672,200 64673,8180 64675,697 64675,703 64676,4771 64677,5102 64677,15119 64678,671 64678,1294 64679,64680 64679,85299 64681,390 64681,775 64682,1326 64683,538 64684,439 64684,809 64684,141912 64685,1010 64685,1326 64686,510 64687,211 64688,872 64689,248 64690,30 64691,1243 64692,422 64693,422 64694,422 64695,422 64696,422 64697,422 64698,422 64699,422 64700,364 64701,859 64702,422 64703,1181 64704,1608 64705,298 64706,2995 64707,1462 64708,1522 64709,309 64709,310 64709,1181 64710,422 64711,422 64712,536 64713,54 64715,126 64715,972 64715,1267 64715,2605 64715,3474 64716,920 64717,222 64718,188 64719,182 64720,240 64721,422 64722,1844 64722,162599 64723,72 64724,1453 64725,83 64726,500 64727,439 64728,1962 64729,1052 64730,1882 64731,2775 64732,30 64733,54 64734,64735 64736,581 64737,515 64738,2436 64739,784 64740,525 64741,920 64743,957 64743,1815 64744,1590 64746,259 64747,697 64748,58 64749,46 64750,2506 64751,784 64752,313 64753,7757 64754,1 64754,149 64754,160 64754,222 64754,340 64754,397 64754,644 64754,668 64754,783 64754,985 64754,1012 64754,1191 64754,1192 64754,1204 64754,1345 64754,1388 64754,1434 64754,1608 64754,1634 64754,1663 64754,1776 64754,1803 64754,2253 64754,2310 64754,2699 64754,3524 64754,3630 64754,3999 64754,4903 64754,5469 64754,6824 64754,28107 64754,50318 64754,81070 64754,90845 64754,136072 64755,30 64756,392 64756,493 64757,920 64758,58 64759,46 64760,8991 64762,64763 64764,455 64764,6789 64765,1531 64766,1465 64768,439 64768,447 64768,1531 64769,1118 64770,34 64770,35 64770,313 64771,392 64771,1363 64771,1454 64772,292 64773,292 64774,390 64775,1381 64775,1893 64776,4276 64777,392 64778,83 64779,64780 64781,704 64782,1001 64783,1001 64784,1556 64785,272 64786,252 64786,1220 64786,1222 64787,422 64788,56 64789,500 64790,1962 64791,1052 64792,1882 64793,2775 64794,54 64795,1639 64796,1579 64797,151 64798,50 64798,97 64798,106 64798,147 64798,178 64798,202 64798,203 64798,298 64798,333 64798,337 64798,417 64798,493 64798,515 64798,588 64798,590 64798,620 64798,622 64798,628 64798,640 64798,779 64798,1085 64798,1132 64798,1175 64798,1247 64798,1370 64798,1509 64798,1515 64798,1531 64798,2073 64798,2296 64798,2782 64798,2931 64798,3876 64798,6279 64798,8270 64798,8788 64799,292 64800,1579 64801,1639 64802,1287 64803,30 64804,9029 64805,1370 64806,1980 64806,8991 64807,4475 64808,932 64809,72 64810,7092 64811,34 64811,1776 64811,4193 64812,861 64813,41 64813,68 64813,240 64813,294 64813,431 64813,631 64813,760 64813,784 64813,805 64813,818 64813,1119 64813,1285 64813,2995 64813,3135 64813,9021 64814,1983 64815,2205 64815,2206 64816,366 64817,72 64818,344 64819,285 64820,2506 64821,795 64821,3094 64822,83 64823,392 64823,1151 64823,1240 64823,1454 64824,1782 64825,479 64825,6695 64826,1181 64827,240 64828,932 64829,1181 64830,57854 64831,1177 64831,4548 64831,6263 64832,151 64833,136 64834,1556 64835,269 64836,72 64837,1319 64838,1265 64839,872 64840,41 64840,233 64840,1119 64840,3135 64841,19 64841,83 64841,1881 64841,2266 64841,5326 64842,206 64843,493 64844,366 64845,795 64845,1566 64846,107 64846,4771 64848,809 64849,1962 64850,431 64851,516 64852,64853 64854,175 64855,1359 64855,1785 64856,200 64856,772 64857,364 64858,1539 64859,278 64860,1983 64861,202 64861,203 64863,64864 64865,3 64865,34 64865,35 64865,106 64865,158 64865,178 64865,192 64865,202 64865,203 64865,217 64865,251 64865,252 64865,337 64865,346 64865,435 64865,516 64865,586 64865,622 64865,640 64865,663 64865,664 64865,1175 64865,1181 64865,1220 64865,1222 64865,1243 64865,1294 64865,1370 64865,1590 64865,1635 64865,2567 64865,2931 64865,3161 64865,4192 64865,4193 64865,5874 64865,5976 64865,6119 64865,8598 64865,8771 64865,8811 64865,8822 64865,8907 64865,16201 64866,298 64867,485 64868,292 64869,784 64870,477 64871,64872 64871,228665 64873,332 64874,72 64875,344 64876,285 64877,1285 64878,704 64878,1140 64879,1274 64880,83 64881,72 64882,694 64882,1608 64883,2506 64884,2506 64885,328 64886,158 64886,2931 64887,900 64888,64889 64890,644 64891,64892 64893,1265 64894,704 64895,22 64895,1707 64896,676 64897,151 64898,805 64899,8719 64900,138 64901,865 64902,557 64903,137 64904,118 64904,4597 64905,21944 64906,8719 64907,138 64908,865 64909,557 64910,137 64911,118 64911,4597 64912,21944 64913,8719 64914,138 64915,865 64916,557 64917,137 64918,118 64918,4597 64919,21944 64920,292 64921,8719 64922,138 64923,865 64924,557 64925,137 64926,118 64926,4597 64927,21944 64928,557 64929,557 64930,557 64931,1181 64932,72 64933,5405 64934,515 64934,1452 64934,2626 64935,10 64935,113156 64936,305 64937,644 64938,1007 64939,1140 64940,704 64941,3507 64942,1381 64943,227 64944,481 64945,64946 64947,4475 64948,64949 64950,298 64951,485 64952,1392 64953,8270 64954,14989 64955,48 64956,493 64957,393 64958,2837 64959,340 64960,779 64961,6837 64962,1127 64963,302 64964,1127 64965,489 64966,779 64967,72 64968,255 64969,225 64970,19005 64971,64972 64973,2867 64973,22880 64974,250 64974,1684 64975,644 64976,3960 64977,366 64978,366 64979,366 64981,21487 64981,22880 64982,4039 64983,704 64984,215 64985,932 64986,602 64988,64989 64990,64991 64992,71 64992,304 64992,417 64992,611 64993,72 64994,206 64995,2051 64997,493 64998,657 64999,3413 65000,779 65001,65002 65003,779 65004,65005 65004,103286 65004,105057 65006,1453 65007,118 65007,4597 65008,2775 65009,447 65010,1881 65011,483 65012,18726 65013,163 65014,65015 65016,65017 65018,2775 65019,447 65020,2697 65021,4101 65022,841 65023,225 65024,8884 65026,1085 65027,676 65028,202 65028,203 65029,1370 65030,187 65031,87 65031,140 65031,1453 65031,1572 65032,3413 65033,2506 65034,147 65035,30 65036,30 65037,233 65038,9121 65039,72 65040,1551 65041,44 65042,65043 65044,376 65045,20359 65046,355 65047,8270 65048,349 65049,147 65050,366 65051,366 65052,366 65053,932 65054,366 65055,310 65056,2206 65056,3247 65056,17588 65058,2048 65059,65060 65061,932 65062,65 65063,65064 65065,5976 65066,195 65067,652 65068,107 65069,171 65070,652 65071,1118 65072,581 65073,83 65074,72 65075,344 65076,285 65077,18726 65078,50 65079,163 65080,1127 65081,364 65082,596 65082,1368 65083,424 65084,118 65084,4597 65085,586 65086,1381 65086,2292 65087,203 65087,2931 65088,104 65088,636 65089,868 65090,417 65091,72 65092,344 65093,285 65094,79 65095,147 65095,151 65096,4177 65097,4177 65098,195 65099,841 65100,657 65101,364 65101,431 65101,1252 65101,1253 65102,859 65103,4691 65104,298 65105,485 65107,18726 65108,163 65109,83 65110,1298 65111,118 65111,4597 65112,217 65113,217 65114,30 65115,65116 65117,72 65118,240 65119,1462 65119,2351 65120,10 65121,72 65122,344 65123,285 65124,5375 65125,30 65126,1231 65127,30 65128,2506 65129,30 65130,676 65131,65132 65131,72184 65133,408 65134,21944 65135,731 65136,4895 65137,676 65138,187 65139,8149 65141,3413 65142,1085 65143,30 65144,1058 65145,3413 65146,30 65147,79 65148,120 65149,515 65150,30 65151,779 65152,104 65152,135 65152,138 65152,248 65152,510 65153,8788 65154,158 65155,206 65156,184 65157,149 65158,298 65159,485 65160,3804 65161,1368 65162,1425 65163,422 65164,298 65165,485 65166,56 65167,2244 65168,1458 65169,187 65170,298 65171,485 65172,267 65173,640 65174,366 65175,137 65176,8907 65177,298 65178,485 65179,292 65180,8270 65181,18790 65182,147 65183,171 65184,30 65185,2367 65186,392 65186,1146 65186,1151 65187,349 65188,215 65188,298 65188,417 65188,592 65188,760 65188,1085 65188,1285 65188,1564 65188,1818 65188,1955 65188,2205 65188,2206 65188,2296 65188,2620 65188,5718 65188,33424 65189,1087 65190,657 65191,7652 65191,22880 65192,1133 65193,671 65194,195 65194,332 65194,640 65194,1572 65194,27217 65195,3413 65196,104 65199,704 65200,2367 65201,184 65202,273 65202,631 65203,1479 65204,313 65205,346 65206,298 65207,211 65208,491 65208,1058 65209,261 65210,346 65211,30 65212,72 65213,907 65214,346 65215,346 65216,346 65217,481 65218,346 65219,30 65220,81 65221,28072 65222,779 65223,1332 65224,3069 65225,65226 65227,424 65228,269 65229,1773 65230,287 65231,53763 65232,72 65233,483 65234,346 65235,30 65236,932 65237,1353 65238,30 65239,704 65240,704 65241,30 65242,72 65243,3370 65243,14453 65244,6027 65245,14989 65246,65247 65249,349 65250,178 65251,30 65252,30 65253,272 65253,596 65253,1381 65253,3999 65254,65255 65256,255 65257,8788 65258,1181 65259,30 65260,65261 65262,18726 65263,147 65263,192 65263,406 65263,4192 65263,4193 65264,87 65265,163 65266,17228 65267,422 65268,56 65270,376 65271,171 65272,21487 65272,22880 65273,2506 65274,1133 65275,346 65276,65277 65276,97598 65276,110977 65278,83 65279,83 65280,346 65281,366 65282,233 65283,366 65284,676 65285,44 65286,107 65287,2416 65287,2417 65288,292 65289,338 65290,298 65291,65292 65293,187 65294,1133 65295,3538 65296,30 65298,30 65300,3413 65301,355 65302,346 65303,1634 65304,424 65305,87 65305,1151 65306,872 65307,65308 65309,346 65310,841 65311,671 65312,1962 65313,366 65314,779 65315,65316 65317,1235 65317,17772 65318,417 65319,72 65320,349 65321,8270 65322,65323 65322,123591 65322,205763 65324,23011 65325,577 65326,200 65326,372 65326,588 65326,590 65326,805 65327,581 65328,65329 65331,973 65332,602 65333,30 65333,557 65333,1102 65333,1265 65333,5440 65334,346 65335,65336 65337,79 65338,171 65339,65340 65341,65342 65343,30 65344,3297 65344,65345 65346,4810 65347,1265 65348,1983 65349,39247 65350,1858 65351,1860 65352,779 65353,779 65354,10 65355,298 65356,485 65357,298 65358,485 65359,298 65360,485 65361,298 65362,485 65363,30 65364,298 65365,485 65366,65367 65366,132308 65368,1117 65369,217 65369,2867 65369,22880 65371,240 65372,45960 65374,93 65374,94 65374,2787 65376,1509 65377,2296 65378,349 65380,30 65381,338 65382,65383 65384,65385 65386,192 65387,120 65387,261 65387,588 65387,590 65387,1419 65387,2416 65387,2417 65387,3331 65388,483 65389,65390 65391,104 65391,557 65391,953 65391,954 65391,1939 65392,19986 65393,259 65394,30 65395,596 65395,1368 65396,50 65396,99 65396,192 65397,8822 65398,30 65400,65401 65402,875 65403,298 65404,485 65405,30 65406,366 65407,65408 65409,17334 65410,515 65411,290 65411,585 65412,274 65413,200 65413,1119 65414,298 65415,485 65416,45022 65417,907 65419,602 65419,3218 65420,1326 65421,219 65422,640 65423,72 65424,344 65425,285 65427,65428 65429,203 65429,2931 65431,118 65431,4597 65432,65433 65434,640 65435,30 65436,1707 65437,79 65438,2775 65439,447 65440,72 65441,344 65442,285 65443,30 65444,872 65445,30 65446,1511 65446,3069 65447,366 65448,310 65448,805 65449,68 65450,30 65451,557 65452,5906 65453,626 65454,137 65455,278 65456,862 65457,5906 65458,557 65459,626 65460,278 65461,137 65462,862 65463,557 65464,557 65465,557 65466,557 65467,862 65468,65469 65470,65471 65473,30 65474,2775 65475,447 65476,493 65477,298 65478,485 65479,79 65480,875 65481,433 65482,72 65484,10 65485,72 65486,344 65487,285 65488,1955 65489,1634 65490,479 65491,9195 65493,682 65493,72439 65494,10 65495,30 65496,298 65497,485 65498,72 65499,344 65500,285 65501,640 65502,72 65503,344 65504,285 65505,5976 65506,72 65507,30 65508,65509 65510,104 65511,1980 65511,8991 65512,5375 65513,65514 65515,72 65516,344 65517,285 65518,433 65519,433 65520,65521 65522,485 65522,65522 65522,65627 65522,112094 65522,138968 65522,168264 65523,65524 65523,81670 65523,94001 65523,107774 65523,111233 65523,121207 65523,122725 65523,124155 65523,124987 65525,104 65525,135 65526,30 65527,261 65528,932 65529,657 65530,4192 65530,4193 65531,640 65532,9195 65533,557 65534,21487 65534,22880 65535,1133 65536,7117 65537,35905 65538,6027 65539,65540 65541,389 65542,1381 65543,5976 65544,640 65545,290 65545,585 65546,9025 65547,65548 65549,18726 65550,163 65551,65552 65553,704 65554,2073 65555,30 65556,25344 65557,779 65559,10 65560,65561 65563,2506 65564,30 65565,3148 65566,41 65568,158 65568,406 65568,3209 65568,5375 65569,2995 65570,805 65571,676 65572,292 65573,588 65573,590 65574,294 65575,296 65576,298 65577,30 65578,8675 65579,255 65580,6027 65581,328 65582,640 65582,2206 65582,3247 65583,7124 65584,65585 65584,99194 65586,187 65587,1392 65587,1745 65588,3413 65589,1745 65590,8598 65591,704 65592,1238 65594,310 65594,805 65595,1452 65596,233 65597,30 65598,30 65599,65600 65599,96208 65599,105110 65599,217281 65599,235331 65599,252421 65599,259921 65601,44 65602,65603 65604,392 65605,366 65606,217 65607,874 65608,65609 65610,1776 65611,255 65612,3148 65613,1955 65614,1541 65615,14098 65615,25395 65615,28193 65615,67867 65615,156718 65615,213931 65615,247765 65616,83 65618,393 65619,8822 65620,355 65621,5250 65622,171 65623,79 65624,337 65625,586 65628,1010 65629,158 65630,337 65631,586 65632,1140 65632,1465 65633,337 65634,586 65635,775 65635,795 65635,1001 65635,1411 65635,2006 65635,5130 65636,349 65637,298 65638,485 65639,1181 65641,337 65642,586 65643,8270 65644,314 65645,2116 65646,1019 65647,920 65648,255 65649,30 65651,1531 65652,264 65652,687 65652,893 65653,1 65653,467 65653,1844 65653,162599 65654,671 65655,147 65656,1243 65657,79 65658,5366 65659,184 65660,392 65661,1132 65662,781 65663,126 65663,1133 65664,217 65666,2574 65667,2699 65668,298 65669,485 65670,872 65671,1634 65672,500 65673,1962 65674,1052 65675,1882 65676,2775 65677,54 65678,671 65679,66 65680,34 65680,35 65681,104 65681,111 65681,134 65681,248 65681,309 65681,310 65681,332 65681,372 65681,483 65681,503 65681,588 65681,590 65681,631 65681,714 65681,760 65681,805 65681,1119 65681,1149 65681,1282 65681,1462 65681,1631 65681,1849 65681,1882 65681,1955 65681,2008 65681,2205 65681,2209 65681,2210 65681,2443 65681,2797 65681,4237 65681,6556 65681,8537 65681,33424 65682,1265 65682,1266 65683,704 65684,366 65686,1007 65687,875 65688,41 65690,640 65691,875 65692,640 65693,1858 65694,1860 65696,8788 65697,1608 65699,195 65700,620 65701,3295 65702,3960 65703,1188 65704,563 65706,500 65707,425 65707,1235 65707,1335 65708,1345 65709,302 65709,893 65710,79 65711,298 65711,1659 65711,2205 65711,2286 65711,4220 65711,33424 65711,66297 65712,298 65713,485 65714,3209 65715,299 65716,79 65717,6357 65718,192 65719,1724 65720,72 65721,344 65722,285 65723,147 65723,149 65723,171 65723,859 65723,1623 65724,207 65725,577 65725,762 65725,1247 65726,72 65727,344 65728,285 65729,1983 65730,1860 65731,1983 65732,731 65733,1844 65734,58 65735,46 65736,1860 65737,120 65738,171 65739,1556 65740,337 65741,586 65743,83 65744,920 65745,479 65747,104 65747,760 65747,818 65748,22 65750,500 65751,779 65752,18726 65754,298 65755,485 65756,717 65757,996 65758,163 65759,50 65759,2353 65761,273 65761,274 65762,2048 65763,3999 65764,779 65765,581 65766,442 65766,1939 65767,240 65767,1019 65768,240 65769,784 65769,1119 65769,1285 65769,1462 65769,1888 65769,84257 65769,185877 65770,192 65770,604 65772,579 65773,309 65773,310 65774,422 65775,422 65776,422 65777,422 65778,422 65779,17588 65780,422 65781,422 65782,422 65783,631 65783,1285 65784,422 65785,390 65785,784 65786,346 65787,337 65788,586 65789,1 65789,283 65789,6837 65790,1011 65791,1590 65791,1644 65792,337 65793,586 65794,459 65795,240 65795,417 65797,1001 65798,171 65799,187 65800,422 65801,56 65802,17228 65803,644 65805,3582 65806,440 65806,794 65806,1740 65807,1411 65808,1179 65810,337 65811,586 65812,26 65812,59 65812,430 65812,994 65812,1235 65812,1335 65812,3816 65812,3817 65812,21944 65813,356 65814,1634 65815,536 65816,805 65817,119 65817,192 65817,217 65817,305 65817,337 65817,577 65817,1188 65817,1400 65817,2253 65817,4101 65817,13538 65817,21944 65817,142426 65818,707 65818,713 65818,3999 65818,258631 65819,20 65821,1 65822,1 65823,1 65824,292 65824,1085 65824,1688 65824,1722 65825,72 65826,1 65826,147 65826,336 65827,1807 65827,1893 65827,149534 65829,1688 65830,1132 65831,781 65834,415 65836,32 65836,273 65836,289 65836,290 65837,72 65838,344 65839,285 65840,557 65842,1326 65843,86 65845,1509 65846,106 65846,158 65846,272 65846,337 65846,346 65846,439 65846,516 65846,726 65846,934 65846,980 65846,1181 65846,2178 65846,4545 65847,264 65847,467 65847,515 65847,1127 65847,1147 65847,1551 65847,1659 65847,2626 65848,364 65849,27550 65850,433 65851,209 65852,622 65853,1474 65854,2775 65854,204093 65855,1977 65855,1978 65856,240 65856,818 65856,17309 65858,788 65859,693 65863,500 65863,718 65864,30 65864,104 65864,134 65864,135 65864,136 65864,137 65864,138 65864,1432 65864,1564 65864,4276 65865,1323 65866,102 65867,1326 65868,408 65869,875 65871,344 65871,1711 65871,1836 65872,4060 65873,195 65873,305 65873,310 65873,3039 65874,35905 65875,360 65876,71 65878,195 65879,30 65880,81 65881,240 65881,302 65881,779 65881,818 65881,1515 65881,3041 65881,3999 65881,92476 65882,422 65883,56 65884,356 65885,184 65886,862 65886,3367 65887,130 65888,6303 65888,63471 65889,1243 65890,240 65892,536 65893,18726 65894,163 65895,483 65897,1284 65898,1465 65899,65900 65901,611 65901,2867 65901,2868 65902,298 65903,485 65904,79 65905,313 65906,390 65907,158 65907,779 65908,406 65909,372 65910,247 65911,1619 65911,37414 65911,193129 65912,240 65912,818 65913,21944 65915,1 65915,467 65915,868 65915,1844 65915,156379 65915,162599 65916,66 65917,79 65918,1179 65918,2701 65919,859 65919,972 65920,1370 65921,422 65922,56 65923,1556 65924,310 65925,493 65926,1619 65927,516 65928,919 65930,1231 65931,187 65931,390 65931,489 65931,615 65931,852 65931,968 65931,999 65931,1718 65931,1801 65931,1805 65931,3182 65931,3422 65931,4760 65931,5591 65931,6068 65931,214131 65932,298 65933,485 65934,79 65935,305 65936,86 65936,602 65937,30 65938,147 65938,158 65939,83 65940,1860 65940,6955 65941,10 65942,298 65943,65944 65945,79 65946,217 65946,222 65946,5265 65946,6789 65947,657 65947,1019 65948,920 65949,292 65950,50 65950,77 65950,79 65950,211 65950,217 65950,283 65950,333 65950,344 65950,360 65950,422 65950,527 65950,583 65950,586 65950,623 65950,652 65950,718 65950,731 65950,1149 65950,1177 65950,1201 65950,1210 65950,1392 65950,1425 65950,1466 65950,1572 65950,1801 65950,2617 65950,3295 65950,3804 65950,5726 65950,13136 65950,17309 65950,67005 65950,69377 65950,69381 65950,69890 65952,30 65953,1001 65953,3094 65954,4980 65955,35486 65956,149 65957,920 65959,704 65960,292 65961,292 65962,292 65964,1188 65965,222 65965,455 65965,1019 65966,59021 65967,137 65968,772 65969,151 65970,349 65970,3260 65971,2379 65972,920 65973,422 65974,56 65976,671 65977,676 65978,1619 65979,477 65980,647 65981,65982 65983,200 65983,2224 65983,2286 65983,8180 65984,760 65985,676 65986,65987 65988,65989 65990,30 65991,704 65992,250 65992,1684 65993,1749 65994,247 65995,104 65995,136 65995,138 65995,557 65995,1368 65996,10 65997,104 65998,65999 66000,389 66000,1072 66001,117 66001,2712 66002,3297 66003,875 66004,47 66004,2469 66005,4218 66005,4220 66005,66297 66007,4475 66008,195 66009,187 66010,872 66011,406 66011,779 66012,355 66012,991 66013,818 66014,217 66015,622 66016,298 66017,485 66018,2590 66019,83 66020,704 66021,376 66022,151 66023,417 66024,3413 66025,217 66026,72 66027,704 66028,149 66029,10 66030,636 66031,130 66031,264 66031,1007 66031,1010 66031,1509 66031,1551 66031,3041 66031,3999 66031,5440 66032,818 66033,251 66034,2367 66035,671 66036,1127 66036,49057 66037,861 66038,271 66039,586 66040,2178 66040,4545 66041,104 66042,298 66043,66044 66045,206 66045,690 66046,312 66047,30 66048,240 66048,818 66049,2775 66050,187 66051,2867 66051,22880 66052,298 66053,485 66054,447 66055,211 66055,7363 66056,557 66057,30 66060,298 66062,455 66063,392 66064,1801 66064,3182 66065,30 66066,1241 66066,1849 66066,2620 66067,1 66068,3602 66069,873 66070,1210 66071,104 66071,134 66072,592 66073,10 66074,30 66076,72 66077,298 66079,485 66080,557 66081,557 66082,211 66084,516 66085,30 66086,240 66087,1298 66088,3413 66089,349 66091,16045 66092,83 66093,65999 66094,1639 66095,2929 66096,2929 66098,1639 66099,1016 66100,433 66101,640 66102,671 66103,415 66104,433 66105,563 66106,1803 66107,298 66108,485 66109,206 66110,417 66112,83 66113,247 66114,1247 66115,72 66116,417 66117,493 66118,779 66119,1274 66120,217 66121,779 66122,72 66123,536 66124,2146 66124,31977 66125,66126 66127,66128 66127,175254 66129,4276 66130,577 66131,704 66132,431 66133,217 66134,455 66135,2146 66136,2379 66137,151 66138,195 66139,779 66140,72 66141,392 66142,292 66144,406 66145,620 66146,366 66147,118 66147,4597 66148,1453 66148,1785 66148,3804 66149,779 66150,8598 66151,602 66152,17384 66153,104 66153,137 66154,779 66155,200 66155,772 66156,298 66157,104 66157,135 66158,310 66159,66160 66159,110199 66159,115051 66159,115149 66159,123461 66159,206046 66161,8270 66162,34 66162,35 66163,1871 66164,376 66165,4475 66166,972 66167,72 66168,640 66169,267 66170,640 66171,779 66172,66173 66174,5375 66175,192 66175,333 66176,10 66177,3 66177,3538 66177,7358 66177,7363 66177,15609 66178,3 66180,704 66181,10 66182,3316 66183,1070 66184,687 66185,207 66186,640 66187,422 66188,1368 66189,195 66190,862 66190,1085 66190,2590 66190,8884 66191,3960 66192,809 66193,195 66194,4455 66195,932 66196,602 66197,22125 66198,968 66199,589 66200,640 66201,10 66203,151 66203,1773 66204,349 66205,211 66206,493 66206,59021 66207,66208 66209,273 66209,274 66210,349 66211,663 66211,664 66211,980 66212,66213 66214,1634 66215,1688 66216,81 66216,3370 66217,1201 66218,298 66219,485 66220,66221 66222,8270 66223,536 66224,66225 66226,3895 66227,32 66227,34 66227,35 66227,72 66227,104 66227,111 66227,120 66227,178 66227,192 66227,202 66227,203 66227,217 66227,225 66227,248 66227,283 66227,296 66227,301 66227,332 66227,346 66227,358 66227,372 66227,383 66227,388 66227,390 66227,392 66227,422 66227,439 66227,455 66227,509 66227,518 66227,525 66227,586 66227,631 66227,687 66227,717 66227,720 66227,752 66227,779 66227,795 66227,873 66227,907 66227,919 66227,934 66227,968 66227,980 66227,1001 66227,1010 66227,1052 66227,1085 66227,1133 66227,1140 66227,1149 66227,1167 66227,1177 66227,1179 66227,1210 66227,1231 66227,1240 66227,1274 66227,1298 66227,1309 66227,1326 66227,1332 66227,1381 66227,1411 66227,1436 66227,1466 66227,1515 66227,1522 66227,1544 66227,1564 66227,1590 66227,1634 66227,1644 66227,1715 66227,1722 66227,1837 66227,1849 66227,1877 66227,1893 66227,1939 66227,1977 66227,1978 66227,2045 66227,2443 66227,2557 66227,2620 66227,2699 66227,2979 66227,2989 66227,2991 66227,3135 66227,3182 66227,3194 66227,3207 66227,3218 66227,3422 66227,3538 66227,3695 66227,3804 66227,3999 66227,5405 66227,5662 66227,5718 66227,5874 66227,6068 66227,6955 66227,8180 66227,14126 66227,14797 66227,14819 66228,515 66228,835 66229,1201 66230,872 66231,222 66231,393 66232,72 66233,310 66233,805 66234,72 66235,868 66236,233 66237,2146 66238,760 66238,1149 66239,10 66239,113156 66241,1052 66242,534 66244,273 66244,274 66245,50 66245,687 66245,868 66245,893 66245,968 66245,2116 66245,5265 66247,3 66248,355 66249,740 66249,741 66250,301 66250,538 66251,66252 66253,222 66253,657 66254,337 66255,586 66256,118 66256,4597 66257,1181 66258,439 66258,861 66258,1294 66258,1776 66259,305 66260,1634 66261,8270 66262,707 66263,337 66264,586 66265,1392 66266,1181 66267,1962 66269,333 66270,292 66271,337 66272,586 66274,1274 66275,30 66276,138 66277,195 66278,10 66278,54 66278,104 66278,147 66278,192 66278,195 66278,252 66278,275 66278,333 66278,336 66278,452 66278,500 66278,563 66278,577 66278,586 66278,620 66278,622 66278,628 66278,657 66278,760 66278,872 66278,972 66278,992 66278,1118 66278,1140 66278,1163 66278,1204 66278,1257 66278,1267 66278,1631 66278,1655 66278,1659 66278,1893 66278,3260 66278,3507 66278,5874 66278,30428 66278,43203 66278,54284 66279,1983 66280,209 66281,302 66282,17588 66283,640 66284,66285 66286,1983 66287,907 66287,932 66288,10 66288,48 66288,275 66288,277 66288,483 66288,615 66288,4748 66288,69266 66289,81 66290,217 66290,467 66290,920 66291,296 66293,3960 66294,1181 66295,1181 66297,68 66297,356 66297,387 66297,685 66297,852 66297,1715 66297,2590 66297,2620 66297,4218 66297,4220 66297,4222 66297,4532 66297,8632 66297,16717 66297,20982 66297,24906 66297,33728 66297,36250 66297,37534 66297,38822 66297,42810 66297,56710 66297,60385 66297,65711 66297,66005 66297,66297 66297,110144 66297,114182 66297,114901 66297,116543 66297,127158 66297,128361 66297,137881 66297,144231 66297,158949 66297,177034 66297,178576 66297,180348 66297,181130 66297,186065 66297,187297 66297,193129 66297,206174 66297,212048 66297,212077 66297,228524 66297,228629 66297,229109 66297,230366 66297,255240 66297,255242 66297,257052 66297,257113 66298,22 66298,217 66298,1590 66300,918 66301,557 66301,818 66301,2017 66302,2929 66303,657 66304,393 66304,1235 66305,372 66305,442 66305,704 66305,872 66305,1882 66305,2697 66305,4355 66305,54004 66306,4193 66306,4355 66307,2931 66308,399 66309,34 66309,1776 66310,1 66310,10 66310,50 66310,58 66310,137 66310,158 66310,195 66310,222 66310,273 66310,312 66310,333 66310,344 66310,435 66310,673 66310,818 66310,1462 66310,1509 66310,1635 66310,1659 66310,2017 66310,3555 66310,8537 66310,66754 66311,192 66311,285 66311,305 66311,422 66311,431 66311,459 66311,536 66311,622 66311,657 66311,811 66311,859 66311,1122 66311,1163 66311,1740 66311,2371 66311,2867 66311,2868 66311,5301 66311,17384 66311,54004 66312,72 66313,640 66314,640 66315,640 66316,640 66317,640 66318,1181 66319,72 66320,1509 66322,827 66322,1707 66323,259 66324,66325 66324,110238 66326,1181 66328,599 66329,1085 66329,2083 66330,875 66331,326 66331,21944 66332,1181 66334,215 66336,1983 66338,657 66339,1181 66340,481 66341,298 66341,131604 66342,1181 66343,104 66343,2443 66344,996 66346,10 66346,136 66346,217 66346,452 66346,457 66346,599 66346,985 66346,1181 66346,2617 66346,3630 66346,35687 66347,980 66348,215 66348,336 66348,596 66348,2210 66348,4237 66348,116074 66348,154168 66348,172609 66348,182320 66350,703 66350,852 66351,1655 66352,50 66353,2210 66353,4237 66354,579 66354,811 66354,7194 66355,433 66357,596 66358,273 66358,274 66358,640 66358,1572 66359,83 66361,1181 66362,248 66363,248 66364,68 66365,252 66365,1220 66366,1 66366,222 66366,7092 66368,433 66369,209 66370,1181 66371,16019 66373,248 66374,344 66375,72 66376,146 66377,2083 66378,56 66378,147 66378,158 66379,83 66380,1033 66380,1151 66380,68069 66380,86832 66380,131303 66381,510 66382,151 66384,301 66385,477 66386,2146 66387,493 66387,682 66387,72439 66388,1893 66389,1238 66390,2775 66391,447 66392,527 66392,657 66392,758 66393,811 66394,605 66394,2315 66395,1181 66396,9007 66397,349 66397,697 66397,1985 66398,1 66399,66 66400,387 66400,920 66401,273 66401,274 66401,66754 66402,1181 66403,285 66404,240 66405,192 66405,920 66405,1118 66406,893 66407,66408 66409,10 66409,431 66409,809 66409,1181 66409,2979 66409,3252 66410,1243 66412,1619 66413,134 66413,227 66413,289 66413,290 66413,292 66413,387 66413,745 66413,1058 66413,1267 66413,1634 66413,1677 66413,1724 66413,1891 66413,3194 66413,3830 66413,6263 66413,16614 66414,581 66415,344 66416,920 66417,1046 66418,433 66419,1983 66420,861 66421,338 66421,2779 66422,628 66423,309 66423,310 66424,859 66426,313 66429,433 66430,304 66431,3698 66431,19488 66432,209 66433,83 66433,86 66433,269 66433,841 66434,66435 66436,66435 66437,269 66438,1509 66439,304 66439,1305 66441,304 66441,1326 66442,337 66443,586 66444,171 66445,66446 66447,2146 66448,980 66448,1531 66449,1149 66450,1220 66450,1222 66451,1639 66452,17309 66453,622 66454,140 66456,932 66457,283 66458,337 66459,586 66460,5212 66461,66462 66463,72 66464,206 66465,192 66465,577 66465,1776 66466,389 66467,736 66467,49057 66467,81070 66468,120 66468,389 66468,3115 66469,42220 66472,859 66473,298 66474,485 66475,1590 66475,223179 66475,226902 66476,3260 66477,4192 66477,4193 66478,1983 66480,1465 66481,1893 66482,644 66483,1983 66484,87 66484,1151 66484,2274 66485,422 66486,1326 66487,422 66488,422 66489,631 66489,2620 66489,6837 66490,422 66491,422 66492,298 66493,485 66494,422 66495,422 66497,1267 66498,422 66499,5101 66500,611 66500,631 66500,1118 66500,1807 66500,1955 66500,2208 66500,2991 66500,6837 66500,13555 66500,14597 66500,49456 66500,60432 66500,63965 66500,76748 66500,82564 66500,103090 66500,103092 66500,106492 66500,146393 66500,152894 66503,422 66504,296 66505,2620 66506,972 66506,973 66506,1300 66509,2146 66510,10 66511,636 66513,3115 66514,30 66516,337 66517,586 66518,1265 66518,1266 66519,1631 66520,749 66520,1313 66520,1571 66521,1983 66522,1893 66523,744 66523,783 66523,1033 66524,1893 66525,1181 66526,10 66526,306 66526,307 66526,344 66526,657 66526,838 66526,861 66528,1 66530,605 66531,87 66531,3507 66531,31977 66532,10 66532,15 66532,22 66532,50 66532,79 66532,104 66532,119 66532,130 66532,158 66532,206 66532,227 66532,259 66532,267 66532,292 66532,338 66532,352 66532,571 66532,604 66532,615 66532,760 66532,907 66532,992 66532,996 66532,1052 66532,1068 66532,1127 66532,1359 66532,1837 66532,6298 66532,8270 66532,67888 66532,73959 66533,50 66534,779 66535,338 66536,1590 66537,485 66538,1590 66538,31237 66539,4237 66540,1220 66540,1222 66541,136 66542,10 66543,577 66544,5265 66545,20 66546,1977 66546,1978 66547,485 66548,158 66548,644 66548,779 66548,1515 66550,2224 66551,1983 66553,83 66555,2224 66556,809 66556,862 66557,868 66558,195 66558,17228 66558,27217 66559,682 66559,1512 66559,5992 66559,72439 66560,760 66561,2411 66562,106 66562,393 66562,527 66562,745 66562,1313 66562,2089 66562,2940 66562,8270 66562,21944 66562,73626 66564,184 66565,957 66565,1815 66566,1515 66567,79 66567,192 66567,571 66567,2266 66567,3207 66567,43613 66569,640 66570,2620 66571,640 66572,292 66572,1085 66572,1285 66572,171641 66573,30 66573,240 66573,301 66573,366 66573,704 66573,875 66573,5547 66574,640 66575,32 66575,505 66575,647 66575,20757 66576,622 66577,1805 66578,911 66579,1572 66579,70331 66580,4805 66581,8598 66582,356 66583,17384 66584,356 66584,788 66585,1231 66586,222 66586,301 66586,620 66586,718 66586,2989 66586,2991 66586,3182 66586,20771 66587,1085 66588,3999 66588,14550 66589,595 66591,30 66592,160 66593,3507 66594,1300 66595,49193 66596,3209 66598,1590 66598,1796 66598,3804 66599,663 66599,664 66600,146 66600,14366 66601,31977 66602,50 66603,406 66604,192 66604,893 66605,158 66606,2073 66607,337 66608,586 66609,337 66610,586 66611,1379 66612,720 66612,1188 66613,130 66614,277 66614,290 66614,585 66616,2979 66617,66 66617,868 66618,240 66619,1462 66619,8537 66620,337 66621,586 66622,66623 66622,170376 66624,10 66625,1085 66626,1224 66627,720 66628,44 66629,32 66629,349 66629,392 66629,509 66629,595 66629,644 66629,697 66629,779 66629,918 66629,1240 66629,1363 66629,1454 66629,1465 66629,1805 66629,1893 66629,2699 66629,4760 66629,9098 66631,497 66631,668 66631,762 66631,1132 66631,1147 66632,835 66632,1127 66632,1893 66632,81070 66633,24505 66634,32 66635,1818 66636,1893 66637,134 66637,248 66637,332 66638,2146 66639,79 66639,631 66640,640 66642,17588 66643,579 66644,968 66645,435 66646,30 66647,81 66648,147 66648,171 66648,859 66650,66651 66652,596 66653,6068 66654,30 66655,50 66656,1133 66657,805 66658,30 66659,310 66660,433 66660,1634 66662,392 66662,1151 66663,10 66664,22 66664,818 66665,525 66666,344 66666,1836 66667,30 66668,77 66669,433 66669,1118 66669,5547 66670,760 66670,1785 66670,3422 66671,30331 66672,355 66673,83 66674,13661 66675,366 66676,1411 66677,13361 66678,126 66678,190492 66679,1858 66680,1860 66681,1634 66682,222 66682,358 66682,536 66682,1019 66684,30 66685,66686 66687,333 66687,1181 66688,21944 66690,1572 66691,417 66691,1235 66692,72 66693,31977 66694,66695 66697,1247 66698,872 66699,72 66700,8788 66701,130 66703,54 66703,217 66703,222 66703,379 66703,477 66703,536 66703,634 66703,781 66703,949 66703,1019 66703,1274 66703,1417 66703,1724 66703,2168 66703,2421 66703,2646 66703,2784 66703,2944 66703,7698 66704,30 66705,366 66706,485 66706,24500 66707,184 66708,1634 66709,424 66711,1181 66711,1265 66712,1860 66713,30 66715,644 66716,994 66716,1235 66716,1335 66717,5405 66718,21944 66719,66720 66721,147 66722,657 66723,151 66724,10 66724,113156 66725,718 66726,117 66726,192 66726,211 66726,283 66726,444 66726,611 66726,772 66726,1149 66726,1247 66726,1265 66726,1266 66726,1388 66726,1807 66726,2712 66726,2775 66726,2989 66726,2991 66726,3218 66726,3422 66726,3756 66726,4748 66726,6789 66726,66727 66726,69215 66726,69601 66726,70279 66726,70563 66726,70586 66726,73626 66728,1980 66728,8991 66729,134 66730,3422 66731,779 66732,1608 66734,83 66735,779 66735,1769 66736,1955 66737,1359 66738,1556 66739,861 66740,22 66741,30 66742,259 66743,1193 66743,1512 66743,5992 66743,25757 66743,66743 66743,80361 66744,247 66745,22 66746,2146 66747,676 66748,1298 66750,3246 66750,3247 66751,393 66752,6323 66754,273 66755,66756 66757,66758 66757,89875 66759,209 66759,302 66759,687 66760,605 66761,6303 66762,481 66763,19133 66763,66695 66763,66764 66765,536 66766,1635 66768,515 66769,455 66770,151 66771,222 66772,1983 66773,376 66774,240 66775,195 66776,26 66776,59 66776,21944 66777,1381 66778,72 66779,233 66779,1181 66780,50 66780,219 66780,1068 66780,2209 66780,4411 66780,5192 66781,360 66782,326 66783,1531 66784,2674 66785,287 66786,1782 66787,392 66788,376 66789,885 66790,861 66791,66792 66793,134 66796,7698 66798,779 66799,333 66800,557 66800,954 66800,1939 66801,640 66801,2206 66802,66803 66804,1467 66805,536 66806,1257 66806,2379 66807,1381 66808,248 66809,32 66810,1983 66811,66812 66814,2995 66815,1118 66816,1462 66816,2351 66817,26 66817,59 66817,994 66819,21487 66819,22880 66820,4276 66821,872 66822,1133 66823,247 66824,1556 66825,861 66826,22 66827,1118 66828,483 66829,805 66830,310 66831,211 66831,333 66833,682 66834,1140 66834,2443 66835,203 66835,372 66836,83 66837,2671 66839,438 66840,66841 66842,66843 66844,1968 66845,1265 66845,1266 66846,1983 66848,1 66850,438 66851,1707 66852,72 66853,217 66854,58 66855,252 66856,1287 66857,9029 66858,79 66859,417 66860,65 66860,287 66860,1267 66860,1294 66860,1400 66860,1631 66860,2371 66860,3297 66860,5469 66861,72 66862,66863 66864,493 66865,30 66866,66867 66868,714 66868,1119 66869,779 66871,10 66872,477 66873,1368 66874,557 66875,557 66878,160 66879,171 66880,66881 66882,66883 66884,1210 66885,222 66885,1019 66886,72 66887,240 66888,30 66889,302 66890,1 66890,200 66890,202 66890,203 66890,222 66890,252 66890,571 66890,779 66890,872 66890,1181 66890,1572 66890,41170 66891,422 66892,56 66893,2626 66895,66896 66897,515 66899,302 66899,893 66900,118 66900,4597 66901,30 66902,79 66903,66904 66903,66925 66905,8822 66906,2929 66907,200 66907,772 66908,151 66908,309 66908,310 66908,21944 66911,2424 66912,671 66913,118 66913,4597 66914,118 66914,4597 66915,366 66916,344 66916,4611 66917,586 66918,1309 66918,1955 66919,272 66920,17334 66921,644 66922,149 66923,50 66924,439 66926,30 66927,1 66928,298 66929,485 66930,313 66930,406 66930,536 66931,1181 66932,207 66933,298 66934,485 66936,406 66936,536 66937,1722 66938,1556 66939,1419 66940,2931 66941,72 66942,392 66943,1058 66943,1434 66943,3585 66944,1612 66944,2146 66945,1983 66946,66947 66948,1 66949,3370 66949,14453 66951,818 66952,8270 66953,192 66954,10 66955,640 66956,10 66957,72 66958,149 66959,8270 66960,240 66961,192 66962,1140 66963,685 66963,919 66963,1363 66963,2480 66963,3193 66963,3467 66963,3524 66963,5662 66963,6837 66964,72 66965,626 66966,59021 66967,30 66968,805 66969,23011 66970,30 66971,1 66972,66973 66974,83 66974,258 66975,66976 66977,195 66978,2315 66979,9121 66980,1556 66981,861 66982,22 66983,158 66983,2931 66985,99 66986,1085 66986,2590 66987,298 66988,485 66989,30 66990,467 66991,252 66992,255 66993,65999 66994,1983 66995,178 66996,2351 66997,8788 66998,10 66999,406 67000,19133 67000,66813 67000,67299 67001,2073 67002,920 67003,310 67004,571 67004,67005 67006,30 67007,67008 67009,557 67010,217 67011,818 67012,104 67012,483 67012,588 67012,590 67012,859 67012,1149 67012,1181 67012,1860 67012,5265 67012,21944 67012,67013 67015,479 67015,682 67016,4771 67017,3804 67018,1 67019,1551 67020,932 67021,4276 67021,22880 67022,1133 67023,2867 67023,22880 67024,2506 67025,1980 67025,8991 67026,2048 67027,30 67028,240 67028,332 67028,372 67028,1140 67028,1285 67028,1955 67028,2371 67028,9026 67029,1 67030,9560 67031,104 67032,779 67033,1608 67034,151 67035,30 67036,30 67037,30 67038,1634 67039,1634 67040,349 67041,1634 67042,2371 67043,1019 67044,79 67045,1265 67045,1266 67046,1983 67047,1326 67048,211 67049,5440 67050,233 67051,673 67053,67054 67055,175 67055,693 67056,9560 67057,355 67058,493 67059,640 67061,366 67062,79 67063,2506 67064,302 67065,2146 67066,366 67067,225 67068,393 67068,3724 67069,30 67070,93 67070,94 67071,4355 67072,34 67072,1776 67072,4193 67073,298 67075,67076 67077,2779 67078,192 67078,920 67079,45023 67080,2286 67081,2146 67082,206 67084,217 67084,2867 67084,22880 67085,67086 67088,516 67089,206 67089,4220 67089,6119 67090,972 67090,973 67091,622 67092,972 67093,1531 67094,3804 67095,67096 67097,873 67097,48505 67098,333 67098,1262 67098,1313 67098,1402 67100,2146 67101,58 67103,67104 67105,254 67106,811 67107,1983 67108,310 67108,483 67108,1147 67108,3039 67109,1381 67110,63 67110,344 67111,2480 67112,3447 67113,4060 67114,67115 67116,467 67116,1782 67116,1837 67117,275 67117,277 67118,497 67119,439 67119,1033 67120,1267 67121,424 67121,3769 67122,875 67123,1072 67124,450 67125,843 67126,2315 67129,843 67130,843 67131,1010 67132,167 67132,301 67133,843 67134,158 67135,67136 67137,3695 67138,843 67139,1243 67140,72 67141,287 67141,1634 67142,972 67143,2931 67144,63 67145,50 67146,1085 67147,941 67147,3182 67148,333 67149,79 67152,775 67155,187 67156,67157 67158,604 67159,252 67159,1220 67159,1222 67160,435 67161,259 67162,557 67163,1893 67164,106 67164,59021 67165,333 67167,1240 67168,852 67168,6068 67169,2372 67170,67171 67172,809 67172,1326 67173,94 67173,184 67173,2787 67174,160 67175,83 67176,67177 67178,1556 67179,805 67180,481 67181,875 67182,356 67183,571 67183,647 67183,1452 67183,3297 67183,6119 67183,20771 67184,503 67185,240 67185,444 67185,818 67185,1796 67185,2812 67186,2371 67187,10 67187,79 67187,134 67187,147 67187,178 67187,202 67187,203 67187,287 67187,323 67187,333 67187,366 67187,720 67187,805 67187,1400 67187,2372 67187,2995 67187,32475 67188,422 67189,422 67190,652 67191,422 67192,422 67193,422 67194,422 67195,21944 67196,158 67197,2931 67197,8811 67198,726 67199,516 67199,103389 67199,130977 67200,422 67201,422 67202,422 67203,2116 67204,5547 67205,314 67205,673 67205,849 67205,1130 67206,195 67207,1531 67210,440 67210,1085 67211,67212 67213,99 67214,1858 67215,1860 67216,1 67217,63 67217,147 67217,251 67217,252 67217,493 67217,516 67217,1243 67217,1265 67217,1266 67217,1789 67217,1927 67217,3451 67217,3452 67217,17772 67217,41170 67218,1893 67219,442 67221,885 67222,2889 67223,18298 67224,48 67225,932 67226,1201 67227,1531 67228,581 67229,192 67229,493 67230,30 67232,1381 67233,477 67234,1001 67235,30 67236,516 67236,1001 67236,1313 67237,1370 67238,1381 67239,72 67240,344 67241,285 67242,20257 67244,118 67244,4597 67245,2146 67247,67248 67249,779 67249,1181 67249,1515 67251,217 67251,269 67251,389 67251,818 67251,1019 67251,1796 67252,67253 67254,136 67254,137 67255,333 67257,663 67257,664 67258,72 67259,344 67260,285 67261,636 67262,9010 67265,1143 67266,120 67266,694 67266,148742 67268,22 67269,1572 67270,6323 67272,1210 67272,5547 67272,6119 67273,67274 67275,393 67276,264 67276,1007 67276,1509 67276,1551 67276,191860 67277,67278 67279,344 67279,1836 67280,50 67281,1707 67282,1531 67283,1370 67283,1821 67283,21736 67284,5326 67285,67286 67287,118 67287,4597 67288,20771 67289,1531 67290,788 67292,422 67293,1983 67294,21944 67295,1631 67296,5101 67297,760 67298,21944 67300,247 67301,13 67302,1531 67304,1531 67305,30 67306,67307 67308,22 67310,20 67311,929 67312,2929 67313,192 67313,346 67313,949 67313,1531 67313,1572 67313,6955 67314,392 67315,408 67317,48 67318,1983 67319,586 67320,50 67321,818 67322,644 67323,264 67324,1927 67325,3345 67326,366 67328,77 67329,515 67330,1368 67331,83 67332,356 67333,809 67334,202 67334,203 67335,10 67335,35 67335,79 67335,130 67335,182 67335,200 67335,302 67335,431 67335,440 67335,459 67335,505 67335,525 67335,702 67335,843 67335,929 67335,1147 67335,1252 67335,1374 67335,1782 67335,1803 67335,1837 67335,1962 67335,2626 67335,3297 67335,4748 67335,5726 67335,6487 67335,31206 67335,72811 67335,76185 67335,81640 67336,406 67337,252 67338,79 67338,217 67338,68671 67338,69601 67338,69829 67339,217 67339,536 67339,2266 67340,2116 67342,67343 67342,67349 67343,95642 67344,8992 67345,10 67345,86 67345,192 67345,330 67345,527 67345,1177 67345,1181 67345,5265 67346,3538 67347,406 67348,1893 67351,872 67352,252 67352,41170 67353,298 67355,1634 67356,328 67356,355 67356,364 67356,885 67356,2315 67356,21944 67357,72 67358,344 67359,285 67360,859 67360,2782 67361,158 67361,252 67361,622 67361,41170 67362,6323 67363,818 67364,2590 67365,628 67366,622 67367,192 67368,1506 67368,1619 67368,5908 67369,217 67370,310 67371,920 67372,44 67373,1531 67374,3585 67375,479 67376,217 67376,1019 67377,1085 67378,67379 67380,682 67380,2244 67380,72439 67381,309 67381,310 67381,760 67382,1531 67383,4691 67384,58 67384,217 67384,1001 67384,1411 67384,1564 67385,406 67386,1531 67387,1531 67388,178 67389,843 67390,1955 67391,217 67391,1019 67392,1634 67393,647 67394,344 67395,577 67395,1105 67395,138686 67396,1058 67396,1653 67398,1140 67399,10 67399,113156 67400,10 67401,72 67402,344 67403,285 67404,2646 67405,278 67406,477 67407,67408 67409,366 67410,515 67411,1052 67412,579 67413,3161 67414,65 67415,56 67416,67417 67419,6387 67420,422 67421,56 67422,779 67423,872 67424,4237 67425,694 67425,2557 67426,1019 67427,175 67428,1556 67430,337 67431,586 67432,44 67433,1179 67433,2146 67434,247 67435,337 67436,586 67437,67438 67439,83 67440,843 67441,996 67443,57810 67443,67444 67445,147 67445,406 67445,1425 67445,80266 67446,67447 67448,67447 67449,67447 67450,67447 67451,67447 67452,67447 67453,1370 67453,1821 67454,1453 67455,640 67456,1 67457,48 67457,136 67457,211 67457,240 67457,358 67457,397 67457,483 67457,628 67457,673 67457,707 67457,713 67457,718 67457,740 67457,741 67457,809 67457,1019 67457,1127 67457,1177 67457,1572 67457,3260 67457,3367 67457,4611 67457,8270 67457,15068 67457,15119 67458,949 67459,283 67460,195 67461,2006 67462,1085 67463,67464 67465,5547 67466,406 67466,1181 67467,1572 67468,72 67469,663 67469,664 67470,801 67470,54362 67471,83 67472,2506 67473,292 67474,67475 67476,588 67476,590 67478,1572 67480,8270 67481,30 67482,387 67483,347 67484,493 67484,682 67485,389 67485,1072 67486,1179 67486,1305 67487,657 67488,720 67488,973 67488,1001 67488,1117 67488,1522 67488,1715 67488,2191 67489,2073 67490,86 67490,202 67490,203 67490,439 67490,611 67490,809 67491,455 67492,10 67493,1782 67494,805 67495,21944 67496,31237 67497,3367 67498,4 67498,5 67499,772 67499,1659 67499,1688 67500,1181 67502,2574 67503,704 67504,1556 67505,861 67506,22 67507,714 67507,1119 67508,151 67509,4039 67510,585 67511,861 67512,390 67512,2480 67512,3207 67513,1381 67514,67515 67516,67517 67518,292 67519,801 67519,1085 67519,54362 67520,10 67520,195 67520,302 67520,657 67520,1572 67520,73074 67521,376 67522,885 67523,827 67524,760 67525,2574 67526,1 67526,620 67526,6387 67527,827 67528,222 67529,67530 67531,182 67534,2775 67535,22 67536,175 67536,671 67536,693 67536,1147 67536,1623 67537,287 67537,809 67537,19010 67539,67540 67541,280 67541,17245 67542,433 67543,563 67544,5547 67545,1381 67546,50 67547,515 67548,483 67549,392 67550,200 67551,1 67552,67553 67555,2480 67556,79 67557,1238 67557,1893 67557,3538 67558,67559 67560,1149 67561,1227 67561,1229 67562,628 67563,195 67563,779 67564,346 67565,217 67565,536 67565,1019 67566,298 67567,485 67568,10 67569,247 67570,588 67570,590 67571,67572 67574,605 67574,1634 67575,682 67576,376 67577,1858 67578,1860 67579,422 67580,56 67581,433 67583,515 67584,1274 67585,843 67586,338 67587,10 67588,1319 67589,455 67590,1785 67591,1001 67592,184 67593,136 67593,137 67593,534 67593,657 67593,843 67593,885 67593,1058 67595,5718 67596,217 67597,233 67598,467 67598,872 67600,4237 67601,1556 67602,861 67603,22 67604,349 67604,605 67604,626 67604,752 67604,1590 67604,3182 67605,406 67606,1556 67607,687 67607,1556 67608,72 67609,67610 67611,67612 67611,76522 67611,111560 67611,132026 67611,170344 67613,17228 67614,107 67614,195 67614,200 67614,302 67614,536 67614,32475 67614,105292 67614,206542 67615,422 67616,56 67617,72 67618,344 67619,285 67620,192 67621,206 67622,1858 67623,1860 67624,3148 67625,493 67626,77 67627,195 67629,615 67630,973 67630,5547 67631,184 67633,5547 67634,278 67634,1363 67634,1756 67634,2224 67634,2421 67634,6068 67635,10 67635,1033 67636,269 67637,67638 67639,67640 67641,3161 67642,1782 67643,283 67643,1001 67644,1579 67645,403 67646,67647 67648,298 67649,158 67650,67651 67652,557 67653,67654 67655,557 67656,72 67657,192 67657,1007 67657,1181 67658,3367 67659,54 67660,752 67661,2274 67662,510 67662,861 67663,20257 67664,16196 67665,346 67666,7416 67667,907 67667,1117 67668,657 67669,450 67670,433 67671,72 67672,602 67673,137 67674,67675 67674,258469 67674,261905 67676,72 67677,406 67678,1466 67678,5976 67679,137 67679,1135 67680,217 67681,1858 67682,1860 67683,72 67684,195 67685,83 67686,623 67686,1805 67687,21944 67688,211 67688,7363 67689,1556 67690,861 67691,22 67692,536 67693,130 67693,207 67693,252 67693,775 67693,1243 67693,189788 67694,65 67695,1858 67696,1860 67697,1381 67698,67699 67700,278 67701,7416 67702,5547 67703,310 67703,805 67704,338 67705,10 67706,1556 67707,861 67708,22 67709,4355 67710,34 67710,1776 67710,4193 67711,158 67712,5440 67713,171 67714,171 67715,1858 67716,1860 67718,83 67719,2266 67720,907 67721,422 67722,56 67723,349 67723,697 67724,67725 67726,2146 67726,2929 67727,151 67728,151 67729,346 67730,167 67731,450 67732,338 67733,1085 67734,493 67735,47031 67736,843 67737,862 67738,149 67739,72 67740,3 67741,2506 67742,2867 67742,22880 67743,4504 67744,602 67745,1871 67746,305 67747,450 67748,3069 67749,346 67750,586 67751,4192 67751,4193 67752,269 67753,83 67754,1 67755,1776 67755,4193 67756,72 67757,8270 67758,731 67759,631 67759,720 67759,932 67759,1085 67759,1732 67759,3194 67759,3422 67760,30 67761,1133 67762,72 67763,34 67763,1776 67763,4193 67764,158 67765,602 67766,72 67767,240 67768,10 67769,10 67770,1235 67770,1335 67771,1983 67772,30 67773,3804 67774,2351 67775,67776 67777,15573 67778,67779 67780,2146 67781,30 67782,207 67783,450 67784,67785 67787,58 67788,46 67789,972 67789,973 67790,2073 67791,255 67792,72 67793,872 67794,67795 67796,2574 67796,4355 67797,2744 67798,843 67799,67800 67801,67800 67802,647 67803,344 67804,664 67804,1085 67805,72 67806,6323 67807,30 67808,2506 67809,309 67809,310 67810,72 67811,30 67812,30 67812,104 67812,134 67812,135 67812,138 67813,298 67814,72 67815,795 67816,3413 67817,1363 67818,46 67818,1124 67819,10 67819,406 67819,1181 67819,4192 67819,4193 67820,207 67821,72 67822,206 67823,447 67823,1590 67823,1644 67824,536 67824,718 67824,1068 67824,1160 67824,67825 67824,68052 67824,80815 67826,255 67827,932 67828,406 67829,3193 67830,1776 67830,4193 67831,34 67831,158 67832,102 67833,269 67834,67835 67836,1858 67837,1860 67838,22 67838,5726 67839,233 67840,579 67841,3413 67842,50 67842,79 67842,430 67842,760 67842,4355 67842,86479 67843,72 67844,1531 67845,366 67846,3 67846,230509 67846,230517 67847,72 67848,602 67848,3218 67849,72 67850,355 67851,577 67851,1149 67853,714 67853,1010 67853,1276 67854,2506 67855,10 67855,287 67855,671 67855,1294 67855,15573 67856,2048 67857,5343 67858,1639 67859,72 67860,1 67862,1289 67862,1579 67863,72 67864,58 67866,1 67866,50 67866,147 67866,620 67866,1623 67867,1 67867,34 67867,35 67867,287 67867,304 67867,338 67867,392 67867,433 67867,440 67867,467 67867,862 67867,1118 67867,1381 67867,1796 67867,1801 67867,2253 67867,3804 67867,6424 67867,14098 67867,67868 67869,67870 67871,137 67871,1432 67871,21944 67872,1715 67872,67873 67874,296 67874,479 67874,991 67874,1102 67874,1287 67874,1579 67874,9030 67875,67876 67877,2646 67878,1893 67879,83 67880,1749 67880,3585 67881,298 67882,485 67883,215 67884,843 67885,682 67885,72439 67886,389 67886,631 67887,147 67889,160 67890,364 67892,2146 67893,67894 67895,10 67896,1240 67897,130 67898,668 67898,736 67898,1619 67900,171 67901,137 67902,640 67903,515 67904,640 67905,3507 67906,1370 67907,893 67908,60576 67909,835 67910,479 67911,346 67912,4101 67913,852 67914,1612 67915,1284 67916,217 67917,83 67917,217 67917,536 67918,1985 67919,538 67920,602 67921,346 67922,248 67923,1 67924,48 67925,481 67926,1298 67927,1335 67928,195 67928,312 67928,640 67928,875 67928,1149 67928,1177 67928,1631 67928,4101 67929,668 67930,48 67931,222 67932,50 67932,222 67933,135 67934,217 67935,10 67935,22 67937,15573 67938,67939 67942,192 67943,392 67944,67945 67947,160 67947,163 67947,192 67947,340 67947,477 67947,599 67947,671 67947,841 67947,1453 67947,1634 67947,3297 67948,287 67949,137 67951,818 67952,657 67953,65 67954,1556 67956,1188 67957,79 67958,388 67959,2146 67960,301 67960,919 67960,2620 67961,717 67962,136 67962,137 67963,83 67965,1181 67966,287 67967,1127 67968,309 67968,310 67969,422 67970,344 67971,422 67972,2353 67973,422 67974,422 67975,67976 67977,422 67979,422 67980,422 67981,631 67981,1531 67982,450 67983,72 67985,827 67986,107 67986,111 67986,749 67986,932 67986,1146 67986,3538 67986,3695 67987,248 67988,994 67988,1124 67989,72 67990,1860 67991,298 67992,485 67993,298 67994,485 67995,61324 67995,67995 67995,227149 67996,1522 67996,2557 67997,1392 67998,693 68002,2436 68003,2775 68004,447 68005,56 68005,2315 68006,264 68006,289 68006,290 68006,1449 68006,1844 68006,2286 68006,94134 68006,144988 68007,745 68008,1227 68008,1229 68009,2719 68010,72 68011,219 68012,1515 68013,1551 68015,68016 68015,125314 68016,68016 68017,178 68019,422 68020,10 68021,393 68022,273 68022,66754 68023,31237 68025,571 68028,1267 68029,6068 68030,2073 68031,86 68031,344 68032,602 68033,72 68034,467 68034,868 68035,818 68036,34 68036,35 68036,1417 68037,1858 68038,1860 68039,13538 68041,195 68042,171 68043,195 68044,392 68045,1983 68047,298 68048,485 68049,602 68050,1608 68051,1085 68051,89388 68054,136 68054,2557 68055,1984 68056,5212 68058,1285 68059,406 68061,604 68062,192 68062,195 68063,2372 68066,65 68066,302 68066,485 68066,497 68066,583 68066,657 68066,798 68066,1058 68066,1149 68066,1782 68066,3297 68067,111 68068,222 68068,1019 68069,10 68069,50 68069,99 68069,146 68069,285 68069,391 68069,406 68069,410 68069,446 68069,622 68069,779 68069,809 68069,841 68069,875 68069,1181 68069,1464 68069,1502 68069,1515 68069,1776 68069,1825 68069,2132 68069,2244 68069,2374 68069,2880 68069,3449 68069,4465 68069,4558 68069,4623 68069,4663 68069,6646 68069,7818 68069,8944 68069,9554 68069,9747 68069,13589 68069,14040 68069,14700 68069,15608 68069,18295 68069,19278 68069,19782 68069,20160 68069,20521 68069,23877 68069,23882 68069,23954 68069,24045 68069,24113 68069,24835 68069,26972 68069,34524 68069,35623 68069,37150 68069,38989 68069,39624 68069,40288 68069,43239 68069,48844 68069,49547 68069,49585 68069,49586 68069,49589 68069,49838 68069,54507 68069,54797 68069,56557 68069,61135 68069,62626 68069,63355 68069,64258 68069,68069 68069,69014 68069,69015 68069,69022 68069,69033 68069,69070 68069,69076 68069,69077 68069,69088 68069,69089 68069,69090 68069,69096 68069,69097 68069,69099 68069,69104 68069,69112 68069,69118 68069,69121 68069,69122 68069,69134 68069,69136 68069,69161 68069,69162 68069,69165 68069,69168 68069,69169 68069,69182 68069,69183 68069,69184 68069,69186 68069,69187 68069,69189 68069,69191 68069,69207 68069,69210 68069,69218 68069,69219 68069,69225 68069,69226 68069,69231 68069,69233 68069,69234 68069,69235 68069,69254 68069,69255 68069,69256 68069,69258 68069,69270 68069,69280 68069,69285 68069,69293 68069,69297 68069,69298 68069,69299 68069,69302 68069,69313 68069,69314 68069,69315 68069,69324 68069,69338 68069,69339 68069,69341 68069,69357 68069,69358 68069,69359 68069,69556 68069,70232 68069,70348 68069,70995 68069,77566 68069,80068 68069,80074 68069,80088 68069,80103 68069,80113 68069,80125 68069,80138 68069,80150 68069,80169 68069,80191 68069,80340 68069,80501 68069,87143 68069,87277 68069,88429 68069,88444 68069,88622 68069,88867 68069,89687 68069,89788 68069,89808 68069,89833 68069,89840 68069,89849 68069,89851 68069,89869 68069,89966 68069,90005 68069,90037 68069,90088 68069,90139 68069,90211 68069,90457 68069,90482 68069,90535 68069,90794 68069,90942 68069,91112 68069,91126 68069,91246 68069,91285 68069,92089 68069,92091 68069,92476 68069,92530 68069,92736 68069,92984 68069,93125 68069,93138 68069,93164 68069,93287 68069,93290 68069,93331 68069,93537 68069,93694 68069,93813 68069,94183 68069,94203 68069,94332 68069,94382 68069,94627 68069,94856 68069,94859 68069,94902 68069,94933 68069,94935 68069,95003 68069,95050 68069,95149 68069,95355 68069,95360 68069,95371 68069,95385 68069,95424 68069,95465 68069,95497 68069,95517 68069,95530 68069,95564 68069,95584 68069,95587 68069,95589 68069,95628 68069,95645 68069,95692 68069,95695 68069,95704 68069,95705 68069,95715 68069,95748 68069,95749 68069,95759 68069,95768 68069,95784 68069,95786 68069,95822 68069,95978 68069,95983 68069,96057 68069,96091 68069,96097 68069,96112 68069,96124 68069,96323 68069,96816 68069,97568 68069,97649 68069,97650 68069,97846 68069,100012 68069,100013 68069,100022 68069,100023 68069,100024 68069,100025 68069,100026 68069,100027 68069,100028 68069,100029 68069,101666 68069,103361 68069,103819 68069,107049 68069,107051 68069,108138 68069,108273 68069,108477 68069,109268 68069,109358 68069,109489 68069,110454 68069,111217 68069,112380 68069,118336 68069,119941 68069,125049 68069,125933 68069,126067 68069,131192 68069,131302 68069,133451 68069,133963 68069,134238 68069,134673 68069,135441 68069,136174 68069,137254 68069,137743 68069,137793 68069,138055 68069,138876 68069,138957 68069,139388 68069,139748 68069,140010 68069,140042 68069,140054 68069,141912 68069,141945 68069,142977 68069,148507 68069,148508 68069,148509 68069,148513 68069,148515 68069,148516 68069,148519 68069,148520 68069,148601 68069,149020 68069,150120 68069,150123 68069,150128 68069,150129 68069,150401 68069,150550 68069,150700 68069,152136 68069,153335 68069,154436 68069,157361 68069,159277 68069,160572 68069,160880 68069,161297 68069,161759 68069,163129 68069,163651 68069,164119 68069,164847 68069,165444 68069,166365 68069,166367 68069,166371 68069,166377 68069,166380 68069,166381 68069,166384 68069,166387 68069,166389 68069,166396 68069,166401 68069,166405 68069,166409 68069,166410 68069,166415 68069,166418 68069,166420 68069,166424 68069,166427 68069,166428 68069,166437 68069,166440 68069,166447 68069,166449 68069,166452 68069,166456 68069,166459 68069,166462 68069,166464 68069,166469 68069,166470 68069,166476 68069,166477 68069,166478 68069,166482 68069,166484 68069,166488 68069,166490 68069,166497 68069,166501 68069,166502 68069,166509 68069,166515 68069,166517 68069,166518 68069,166523 68069,166529 68069,166534 68069,166539 68069,166546 68069,166549 68069,166552 68069,166553 68069,166555 68069,166560 68069,166561 68069,166566 68069,166573 68069,166574 68069,166594 68069,166601 68069,166608 68069,166612 68069,166614 68069,166618 68069,166623 68069,166626 68069,166664 68069,166665 68069,166691 68069,166694 68069,166747 68069,166834 68069,166856 68069,167202 68069,167239 68069,167267 68069,167354 68069,167818 68069,168928 68069,184913 68069,224372 68069,229772 68069,229840 68069,236173 68069,238330 68069,247186 68070,1522 68071,1551 68071,191860 68072,704 68073,30 68074,273 68074,66754 68075,97 68076,4895 68077,1359 68079,41 68080,302 68081,202 68081,203 68081,217 68081,920 68082,192 68082,663 68083,22 68083,222 68083,326 68083,838 68083,2607 68084,102 68084,326 68084,758 68087,83 68088,1436 68089,50 68089,893 68089,141912 68090,872 68091,160 68091,515 68092,557 68094,68095 68096,500 68096,718 68096,1860 68097,314 68097,2646 68098,360 68098,1052 68099,195 68100,302 68100,687 68101,893 68102,302 68103,623 68104,775 68105,195 68106,1977 68106,1978 68107,1871 68108,202 68108,203 68110,3474 68111,68112 68113,136 68113,137 68113,433 68114,393 68115,8822 68116,136 68117,2224 68118,5547 68118,6119 68119,25636 68119,68120 68122,63 68123,605 68123,2315 68124,333 68124,622 68124,3370 68124,14453 68125,1370 68126,1417 68127,30 68128,557 68130,1659 68131,37 68131,698 68131,1782 68132,1181 68133,14989 68134,1572 68136,1 68137,240 68137,1181 68138,68139 68141,22 68141,158 68141,167 68141,211 68141,577 68141,760 68141,809 68141,1188 68141,1210 68141,1844 68141,3297 68141,5265 68141,32475 68143,54 68145,393 68146,536 68147,1707 68148,694 68148,1707 68149,1803 68151,872 68152,1010 68153,2351 68154,34 68154,35 68155,415 68155,467 68155,703 68155,718 68155,770 68155,931 68156,15573 68157,259 68158,1175 68159,247 68160,1 68161,68162 68163,48 68164,34 68164,35 68164,217 68164,1417 68164,13980 68165,1181 68166,10 68166,397 68166,509 68166,6303 68167,298 68168,602 68169,2319 68170,2506 68171,784 68171,1544 68172,272 68172,393 68172,447 68172,949 68172,1466 68172,1531 68172,2178 68172,3260 68172,4545 68173,222 68173,283 68173,2266 68173,211889 68174,1388 68175,86 68176,1179 68177,184 68178,972 68178,973 68179,1007 68180,1 68181,79 68182,79 68182,358 68183,79 68183,192 68183,21442 68184,972 68184,973 68185,577 68186,972 68186,973 68188,435 68189,2116 68190,485 68191,516 68193,298 68194,485 68196,160 68197,581 68198,2421 68199,450 68201,467 68202,644 68203,447 68204,358 68204,1118 68205,1402 68206,259 68207,222 68208,1417 68209,2506 68210,868 68212,3 68213,1572 68213,1722 68213,14458 68214,10 68215,68216 68218,41 68219,240 68219,4355 68220,439 68221,972 68221,973 68222,1419 68223,30 68225,8270 68226,588 68226,590 68227,536 68227,1019 68228,10 68229,1417 68230,1417 68231,337 68232,586 68233,1049 68233,6387 68233,7117 68233,92641 68233,92645 68233,158032 68234,6750 68235,953 68236,6323 68237,1608 68238,900 68239,2506 68240,44 68242,310 68243,3161 68244,745 68245,389 68245,1019 68245,1467 68245,2421 68246,2506 68247,1133 68248,301 68248,631 68250,676 68251,875 68252,3161 68253,843 68254,435 68254,1033 68255,298 68256,485 68257,875 68258,2351 68260,15573 68261,3161 68262,406 68263,30 68264,151 68265,30 68266,83 68266,5591 68267,2073 68269,1844 68270,2146 68270,19005 68271,1559 68272,623 68272,1805 68272,3260 68273,640 68274,34 68274,1776 68275,503 68276,2617 68277,663 68277,664 68277,1531 68277,2178 68277,2931 68277,4545 68277,6119 68277,56150 68278,68279 68280,640 68280,1001 68281,72 68282,30 68283,1773 68284,206 68285,30 68286,21487 68286,22880 68287,1133 68288,349 68288,3260 68289,30 68290,1388 68291,68292 68293,483 68294,483 68295,493 68297,30 68298,247 68299,861 68300,2719 68301,4475 68303,2574 68304,273 68305,6323 68306,217 68307,83 68308,187 68309,10 68310,592 68310,1119 68310,1631 68310,1635 68310,2620 68310,2995 68311,149 68312,640 68314,72 68315,15 68315,217 68315,298 68315,349 68315,358 68315,360 68315,567 68315,615 68315,668 68315,783 68315,859 68315,1072 68315,1113 68315,1117 68315,1323 68315,1381 68315,1388 68315,1796 68315,1968 68315,2372 68315,9004 68316,592 68317,97 68318,247 68319,652 68320,1639 68321,1556 68322,222 68323,259 68324,68325 68324,84065 68324,87875 68324,95805 68324,100742 68324,108720 68324,114268 68324,119730 68324,122410 68324,122805 68324,123370 68326,289 68326,290 68327,187 68328,2146 68329,1572 68329,1688 68330,130 68331,264 68331,1381 68332,852 68333,50 68334,30 68335,2146 68336,59 68336,67397 68338,1235 68338,1335 68339,640 68340,134 68341,206 68342,2929 68343,577 68343,3297 68344,23701 68345,1001 68346,195 68347,1644 68348,481 68349,479 68350,72 68351,72 68352,1551 68353,862 68354,68355 68356,247 68356,2867 68356,22880 68357,918 68358,30 68359,146 68360,68361 68362,136 68363,4 68363,5 68364,2626 68365,4066 68366,83 68367,225 68368,13 68369,1319 68370,1 68370,147 68370,859 68370,1181 68370,240174 68371,1467 68373,516 68373,538 68373,1175 68374,30 68375,79 68375,134 68375,163 68375,203 68375,305 68375,567 68375,631 68375,744 68375,809 68375,861 68375,1010 68375,1572 68375,1939 68375,2867 68375,2868 68375,8714 68375,21944 68375,25222 68376,557 68377,1968 68378,192 68379,2699 68380,450 68381,9018 68382,1204 68383,852 68384,8822 68385,292 68386,186 68386,628 68386,5192 68386,6303 68387,483 68388,118 68388,4597 68389,195 68389,779 68390,557 68391,79 68392,72 68393,1235 68393,1335 68394,68395 68396,72 68397,6323 68398,2205 68398,2206 68399,10 68400,68401 68402,175 68402,1368 68402,4941 68403,18726 68404,557 68405,493 68406,72 68407,163 68408,1782 68409,1133 68410,30 68411,30 68412,167 68414,68415 68416,72 68417,72 68419,77 68419,104 68419,248 68419,372 68419,383 68419,509 68419,592 68419,862 68419,1001 68419,1007 68419,1149 68419,1722 68419,1939 68419,1977 68419,1978 68419,2701 68419,3585 68419,5405 68420,640 68421,72 68422,72 68423,126 68424,20257 68425,366 68426,72 68427,525 68428,420 68429,515 68430,72 68431,3 68432,557 68433,83 68434,7360 68435,146 68436,23701 68437,403 68438,72 68439,2146 68440,2674 68441,2351 68442,72 68443,8788 68444,72 68445,72 68446,1151 68447,222 68448,3538 68449,1238 68450,298 68451,485 68452,34 68452,35 68452,83 68452,217 68452,278 68452,852 68452,1467 68453,72 68454,1 68455,994 68456,7358 68456,7363 68457,298 68458,485 68459,657 68459,19443 68460,510 68461,779 68462,217 68463,171 68464,104 68464,248 68464,850 68464,1332 68465,1133 68466,68467 68468,65 68469,2146 68471,2073 68472,65 68472,158 68472,252 68472,264 68472,467 68472,599 68472,622 68472,1235 68472,1335 68472,1659 68472,2979 68473,588 68474,259 68474,344 68475,68476 68477,5212 68478,2351 68480,784 68481,178 68483,10 68484,68485 68486,68487 68488,1572 68489,4594 68490,5547 68491,346 68492,3 68493,8991 68495,30 68496,68497 68498,7757 68499,2506 68500,450 68501,450 68502,217 68503,557 68504,589 68504,1001 68505,640 68506,1452 68508,68509 68510,920 68511,346 68512,158 68513,406 68514,50 68515,35687 68516,346 68517,68518 68519,68518 68520,68518 68521,68518 68522,346 68523,376 68524,2048 68525,406 68525,779 68526,973 68527,211 68527,7363 68528,72 68529,18726 68530,72 68531,1247 68532,240 68533,8270 68534,602 68535,671 68536,14483 68537,147 68538,2506 68539,2506 68540,2506 68541,255 68542,217 68543,7 68543,211 68544,79 68544,326 68545,366 68546,366 68547,3447 68548,217 68549,30 68550,1707 68551,1252 68551,1253 68552,1133 68553,392 68554,68555 68554,104881 68556,1133 68557,2146 68558,3451 68558,3452 68559,2073 68560,968 68561,340 68562,192 68563,67343 68564,628 68565,211 68566,68567 68568,289 68568,290 68568,3041 68569,392 68570,10 68571,264 68571,1381 68572,932 68573,120 68574,83 68575,233 68576,68577 68578,422 68579,79 68580,2574 68580,68581 68582,1353 68583,106 68583,278 68583,287 68583,328 68583,509 68583,811 68583,893 68583,1007 68583,1085 68583,1235 68583,1335 68583,1556 68583,1571 68583,1782 68583,2116 68583,2209 68583,2260 68583,115659 68583,142473 68584,2506 68585,2506 68586,207 68587,2506 68588,258 68589,302 68590,1453 68591,631 68592,481 68593,1644 68594,68595 68596,760 68597,1807 68598,355 68599,588 68599,590 68600,137 68601,118 68601,4597 68602,2506 68604,54 68604,158 68604,660 68604,2424 68604,2646 68605,1353 68606,1983 68607,775 68608,1247 68609,392 68610,2334 68612,137 68612,13136 68613,65 68613,868 68614,1381 68615,1983 68616,2334 68617,872 68618,50 68618,2979 68619,406 68620,346 68621,312 68622,30 68623,298 68624,485 68625,1012 68625,1241 68625,2557 68626,2506 68627,571 68627,868 68627,1181 68628,346 68629,163 68629,305 68629,563 68629,911 68629,991 68629,1132 68629,1623 68630,328 68630,1085 68630,1241 68630,2205 68630,2206 68630,130708 68630,207523 68631,6661 68633,217 68634,811 68635,163 68635,302 68637,33611 68638,949 68639,1983 68640,1 68640,149 68642,918 68643,58 68644,46 68645,86 68646,222 68646,657 68647,6661 68648,3804 68649,146 68650,1983 68651,59021 68652,640 68653,2319 68654,273 68655,1572 68656,1801 68657,1773 68658,14366 68659,8180 68661,240 68661,588 68661,590 68662,640 68663,640 68665,302 68666,640 68667,640 68668,1983 68670,1238 68670,8149 68672,1983 68673,447 68675,195 68676,1531 68678,149 68678,745 68678,1776 68678,2371 68678,2867 68678,3193 68678,5265 68678,22880 68679,972 68679,973 68680,415 68681,808 68681,1240 68681,1465 68682,130 68684,83 68685,336 68686,2017 68686,17309 68687,68688 68689,6323 68690,240 68691,356 68691,852 68691,2995 68692,302 68693,1983 68694,14483 68695,147 68695,149 68695,158 68695,1803 68696,455 68698,1243 68699,206 68699,222 68699,455 68699,485 68699,611 68699,712 68699,1177 68701,893 68701,1374 68702,779 68703,581 68704,222 68705,301 68706,187 68706,1227 68706,1229 68707,192 68708,1353 68709,240 68710,30 68712,1177 68712,2210 68713,1556 68714,972 68715,264 68716,2421 68717,1983 68718,32 68718,392 68718,918 68719,356 68720,15573 68721,356 68723,515 68724,1085 68726,483 68727,1531 68728,340 68729,2073 68731,605 68732,2135 68733,167 68733,1167 68733,1436 68733,3218 68733,5301 68733,73570 68734,1983 68735,259 68735,264 68735,567 68735,611 68735,1181 68735,1707 68735,1893 68735,21944 68737,827 68738,158 68739,50 68740,406 68741,259 68742,852 68743,55995 68743,68744 68745,356 68747,292 68748,1983 68749,298 68750,485 68751,406 68752,422 68753,422 68754,10 68754,628 68756,2867 68756,22880 68757,433 68758,1203 68758,2146 68759,309 68759,310 68760,310 68761,636 68762,2626 68763,160 68764,10 68765,694 68766,2506 68767,195 68768,477 68769,972 68771,760 68772,20 68772,59 68772,644 68772,783 68772,838 68772,1363 68772,1572 68772,2605 68772,2704 68772,3794 68772,17897 68773,1977 68773,1978 68775,1639 68776,222 68777,188 68778,182 68779,248 68780,1231 68780,3115 68781,431 68782,252 68782,41170 68783,5547 68784,5547 68785,973 68786,9005 68788,68789 68790,5547 68790,110269 68791,5547 68792,68793 68794,372 68794,5547 68795,433 68797,457 68798,79 68798,140 68798,147 68798,160 68798,287 68798,302 68798,326 68798,346 68798,358 68798,408 68798,422 68798,459 68798,473 68798,481 68798,493 68798,581 68798,622 68798,671 68798,707 68798,868 68798,996 68798,1117 68798,1119 68798,1247 68798,1265 68798,1266 68798,1276 68798,1294 68798,1323 68798,1425 68798,1572 68798,1631 68798,1644 68798,2421 68798,2807 68798,3297 68798,52232 68799,2045 68800,379 68801,1688 68802,171 68803,5547 68804,1072 68805,247 68806,424 68806,6556 68807,5547 68808,450 68809,676 68810,50 68811,292 68811,509 68811,1722 68812,657 68813,1368 68814,21944 68815,3872 68816,147 68816,158 68816,447 68816,1181 68816,2178 68816,3989 68818,53763 68819,137 68819,1381 68820,968 68820,1072 68820,6955 68821,450 68822,393 68823,14483 68824,1388 68825,2626 68825,49057 68826,4637 68827,233 68827,301 68827,525 68827,1235 68827,1335 68827,4146 68828,843 68829,147 68829,256 68829,1014 68830,10 68830,760 68831,248 68831,626 68831,636 68831,1282 68832,972 68834,1572 68835,309 68835,310 68836,255 68837,422 68839,907 68839,1284 68840,259 68842,422 68843,422 68844,422 68845,5547 68846,483 68847,5547 68848,58 68849,46 68850,422 68851,138 68852,422 68853,1556 68854,861 68855,22 68856,1043 68856,42220 68857,586 68858,140 68859,68860 68861,644 68862,30 68863,86 68863,118 68863,292 68863,306 68863,307 68863,315 68863,340 68863,483 68863,663 68863,664 68863,668 68863,1151 68863,1179 68863,1623 68863,1837 68863,4597 68863,6506 68864,15573 68865,760 68867,217 68868,1858 68869,1860 68870,1893 68870,2312 68870,6968 68872,2421 68873,1167 68873,2979 68874,1210 68875,7 68876,561 68876,911 68876,972 68877,602 68879,1127 68880,202 68880,203 68881,392 68881,760 68882,493 68883,298 68884,485 68885,439 68886,3367 68887,126 68887,671 68887,1033 68889,827 68889,1201 68890,1639 68892,4193 68893,46 68893,972 68893,973 68894,1634 68895,298 68896,485 68897,247 68898,151 68899,389 68899,1363 68899,1849 68900,827 68901,3999 68902,406 68903,68904 68905,671 68906,467 68907,1359 68909,586 68910,146 68910,467 68910,92476 68911,602 68912,309 68912,310 68913,102 68913,408 68913,518 68913,1113 68913,1323 68913,3193 68914,1010 68915,704 68916,202 68916,203 68916,1745 68918,1287 68919,9029 68920,2421 68921,1381 68922,861 68923,151 68924,17309 68925,30 68925,1179 68926,2421 68927,298 68928,3 68929,1149 68930,392 68931,8270 68932,146 68933,390 68934,859 68936,206 68937,301 68937,1837 68938,104 68939,8270 68940,1323 68941,102 68942,1326 68943,408 68944,68945 68946,440 68946,1001 68947,1235 68947,1335 68948,3447 68949,1140 68949,3474 68949,5547 68950,5547 68951,704 68951,1052 68951,1359 68951,1782 68951,3989 68952,47 68952,743 68952,2469 68952,8714 68953,68954 68953,219768 68955,1085 68955,18727 68955,165542 68955,165994 68956,187 68957,344 68958,2073 68959,195 68960,83 68961,852 68962,818 68963,1001 68964,657 68965,973 68967,285 68967,392 68967,779 68968,393 68969,20771 68971,1556 68972,217 68973,704 68974,392 68975,399 68975,536 68976,68977 68978,294 68979,2923 68980,289 68980,290 68982,1010 68983,332 68984,602 68985,1556 68986,861 68987,22 68988,379 68989,376 68990,338 68991,2146 68992,107 68992,273 68992,355 68992,452 68992,493 68992,1146 68993,202 68993,203 68993,588 68993,590 68994,301 68995,3295 68997,1133 68998,376 68999,442 69000,48 69001,885 69002,557 69003,278 69004,809 69005,1 69005,202 69005,203 69005,222 69005,657 69006,1363 69007,366 69008,2926 69009,1572 69010,1608 69011,247 69012,6068 69013,805 69016,68069 69017,68069 69017,86832 69018,68069 69018,86832 69019,1309 69020,417 69021,557 69023,68069 69024,68069 69025,557 69026,8719 69027,138 69028,557 69029,865 69030,137 69031,118 69031,4597 69032,21944 69034,8719 69035,138 69036,865 69037,557 69038,137 69039,118 69039,4597 69040,21944 69041,8719 69042,138 69043,3623 69044,865 69045,557 69046,137 69047,298 69048,485 69049,118 69049,4597 69050,21944 69051,779 69051,68069 69051,86832 69052,8719 69053,138 69054,865 69055,557 69056,366 69057,366 69058,137 69059,118 69059,4597 69060,21944 69061,118 69061,4597 69062,258 69063,417 69064,217 69065,1411 69066,1556 69067,861 69068,22 69069,1891 69071,68069 69071,86832 69072,602 69073,69074 69075,493 69078,68069 69079,588 69079,590 69080,222 69080,305 69080,1181 69081,30 69082,69083 69084,779 69084,68069 69085,10 69085,187 69085,267 69085,693 69086,4411 69087,431 69091,68069 69092,68069 69093,206 69094,1608 69095,4039 69098,206 69100,68069 69101,68069 69102,273 69103,1773 69103,9598 69105,657 69106,779 69106,68069 69106,141912 69107,477 69108,68069 69109,222 69111,5547 69113,19986 69114,8270 69115,69116 69117,1769 69117,68069 69119,356 69119,417 69119,459 69119,852 69119,2572 69119,189303 69120,44 69123,68069 69124,68069 69124,86832 69126,850 69127,68069 69129,2719 69130,250 69130,1684 69131,69132 69133,240 69135,333 69137,1243 69138,30 69139,68069 69140,68069 69141,68069 69142,68069 69143,8270 69144,1238 69145,2979 69146,56 69147,233 69148,158 69148,406 69148,779 69148,1181 69148,1515 69149,338 69150,422 69151,1285 69152,195 69153,68069 69153,86832 69154,68069 69154,86832 69155,68069 69155,86832 69156,68069 69156,86832 69157,68069 69158,68069 69158,86832 69159,68069 69159,86832 69163,1983 69164,1014 69166,68069 69167,118 69167,4597 69170,68069 69172,264 69173,1381 69174,68069 69174,86832 69175,68069 69176,68069 69176,86832 69177,557 69178,1007 69179,68069 69180,483 69181,68069 69185,45022 69188,2646 69190,68069 69192,68069 69193,862 69194,68069 69195,422 69196,422 69197,422 69198,422 69199,422 69200,68069 69200,86832 69201,422 69202,422 69203,422 69204,422 69205,422 69206,422 69208,68069 69209,779 69209,68069 69211,83 69212,69213 69214,69215 69216,202 69216,203 69217,72 69220,68069 69220,83086 69220,91052 69220,97025 69221,104 69221,953 69221,954 69221,1368 69221,10318 69222,907 69223,68069 69223,86832 69224,515 69227,225 69228,69229 69230,1265 69230,1266 69232,704 69236,68069 69236,86832 69237,424 69238,310 69239,1118 69240,3069 69241,557 69242,8884 69243,68069 69244,5547 69245,1085 69246,69247 69246,119523 69248,68069 69249,644 69250,455 69250,623 69250,1240 69250,4760 69250,6059 69251,918 69252,171 69253,805 69257,489 69260,1285 69261,151 69262,843 69263,1188 69264,69265 69267,72 69268,7360 69269,77 69271,450 69272,72 69273,344 69273,5547 69274,366 69275,68069 69276,72 69277,657 69278,69279 69281,233 69282,393 69283,69284 69286,79 69286,211 69286,256 69286,283 69286,333 69286,505 69286,1014 69286,5405 69286,18298 69287,289 69287,290 69288,1085 69289,417 69290,2296 69291,1127 69292,30 69294,355 69296,433 69300,240 69301,932 69303,4060 69304,372 69304,1210 69305,69306 69307,2775 69308,447 69309,2775 69310,447 69311,843 69312,589 69312,818 69312,953 69312,2351 69312,2995 69312,6068 69312,15573 69316,693 69317,333 69318,192 69320,3148 69321,126 69322,372 69323,269 69325,6323 69326,16196 69327,1 69328,1 69329,10 69330,83 69331,69332 69333,58 69334,46 69335,163 69335,438 69335,1043 69335,8270 69336,1033 69340,581 69342,68069 69342,86832 69343,79 69343,211 69343,352 69343,567 69343,5405 69343,5726 69344,68069 69345,567 69346,68069 69347,83 69349,485 69350,1247 69351,69352 69353,1127 69354,779 69355,973 69355,4504 69356,10 69360,907 69361,602 69362,2351 69363,18831 69364,72 69365,1566 69366,424 69366,805 69367,72 69368,1509 69369,392 69370,273 69370,647 69371,872 69372,515 69373,3999 69374,69375 69376,97 69378,20359 69379,333 69379,760 69379,808 69379,2867 69379,2868 69379,73452 69380,980 69382,275 69383,640 69383,1644 69383,7124 69383,7270 69383,9010 69385,1411 69386,69387 69388,58 69389,46 69390,104 69391,30 69392,1285 69393,69394 69393,72023 69397,4935 69398,538 69399,1370 69401,493 69402,79 69402,192 69402,372 69402,425 69402,577 69402,599 69402,740 69402,741 69402,861 69402,1052 69402,1140 69402,1313 69402,1893 69402,20004 69402,75912 69403,333 69404,9195 69405,1058 69406,69407 69408,1113 69409,885 69410,779 69412,991 69413,20 69413,366 69413,424 69413,500 69413,622 69413,1033 69413,1085 69413,1388 69413,1531 69413,1590 69413,4455 69415,184 69416,483 69417,2146 69418,364 69419,192 69420,69421 69422,1623 69423,107 69423,442 69424,3069 69425,69426 69427,211 69427,7363 69428,4453 69429,1140 69429,5547 69430,652 69431,5212 69432,83 69433,1539 69434,72 69435,67939 69436,79 69437,13 69438,10 69439,72 69440,240 69440,1402 69440,1818 69441,207 69442,994 69443,515 69444,4805 69444,5908 69445,50 69445,79 69445,104 69445,250 69445,372 69445,527 69445,668 69445,698 69445,762 69445,811 69445,861 69445,1305 69445,1326 69445,1684 69445,1707 69445,1776 69445,1782 69445,1844 69445,1860 69445,2116 69445,2371 69445,2944 69445,3135 69445,3367 69445,6837 69445,24763 69446,66 69446,87 69446,1590 69447,2775 69448,447 69449,376 69450,1776 69450,4193 69451,72 69452,69453 69452,157966 69454,1639 69455,1479 69456,636 69457,602 69458,32 69459,69460 69461,136 69462,1127 69463,30 69464,392 69464,918 69465,69466 69467,289 69467,290 69467,657 69467,685 69467,3345 69468,602 69469,640 69469,2206 69470,7124 69471,79 69472,2089 69472,2940 69472,21944 69473,17309 69474,2089 69474,2940 69474,21944 69475,393 69476,8822 69477,4276 69477,22880 69478,1133 69479,479 69480,973 69481,72 69482,827 69483,657 69484,195 69485,7360 69486,1181 69487,72 69488,298 69489,485 69490,8788 69491,171 69492,477 69493,640 69494,973 69495,21487 69495,22880 69496,1133 69497,69498 69499,2506 69500,69501 69502,2506 69503,34 69503,35 69504,72 69505,69506 69508,779 69509,10 69509,113156 69510,72 69511,779 69512,1368 69513,21944 69515,158 69515,252 69515,622 69515,862 69516,622 69516,1419 69517,240 69518,393 69519,147 69519,158 69519,406 69519,779 69519,1181 69519,1458 69519,1515 69520,8991 69521,805 69522,69523 69524,9318 69525,69526 69527,147 69527,158 69527,779 69527,1515 69528,69529 69530,14483 69531,8822 69532,850 69533,1392 69534,69535 69536,1608 69537,32475 69538,5405 69539,69540 69541,392 69541,623 69542,557 69543,69544 69545,8991 69546,130 69547,18726 69548,184 69549,481 69550,872 69551,8992 69553,872 69554,1465 69555,1871 69557,137 69558,7652 69559,2620 69560,420 69561,640 69562,233 69563,107 69564,292 69565,2416 69565,2417 69566,338 69567,1285 69568,298 69569,366 69570,713 69571,1133 69572,3538 69573,69574 69575,69574 69576,69577 69578,21944 69579,19227 69580,17588 69582,34 69582,158 69583,69584 69586,1411 69587,69588 69589,346 69590,137 69591,72 69592,818 69593,1893 69594,137 69595,657 69596,298 69597,485 69598,240 69599,158 69600,1644 69602,1 69602,217 69602,459 69602,640 69602,2617 69602,2923 69603,349 69604,17334 69605,72 69606,72 69607,34 69607,35 69607,949 69607,1467 69607,2266 69607,2944 69608,72 69609,72 69610,298 69611,485 69612,2146 69613,192 69613,663 69614,215 69615,779 69616,32475 69617,298 69618,485 69619,907 69620,2351 69621,298 69622,485 69623,13361 69624,372 69624,999 69625,1769 69626,6068 69627,305 69628,999 69629,68069 69630,298 69631,485 69632,1052 69633,1531 69634,72 69635,2266 69636,640 69637,192 69638,200 69639,72 69640,515 69641,8992 69642,1149 69643,5366 69644,275 69646,1181 69647,503 69647,1118 69648,1224 69649,1046 69650,515 69651,69652 69651,220490 69651,227655 69653,999 69654,72 69655,72 69656,72 69657,72 69658,206 69659,72 69660,818 69661,1224 69662,3069 69663,294 69664,118 69664,4597 69666,171 69667,240 69667,500 69667,581 69667,70390 69668,1 69668,50 69668,175 69668,406 69668,640 69668,55849 69668,102560 69669,31977 69670,79 69671,68069 69672,366 69673,290 69673,585 69674,68 69675,69676 69678,3252 69679,907 69679,1117 69679,148742 69680,481 69681,9121 69682,2048 69683,859 69684,1247 69685,1454 69686,69687 69686,69714 69686,71024 69686,73452 69688,252 69688,289 69688,290 69688,318 69688,332 69688,841 69688,1132 69688,1285 69688,1381 69688,4545 69688,139010 69689,4691 69690,69691 69692,72 69693,4192 69693,4193 69694,48 69695,79 69696,54 69697,534 69698,1749 69699,336 69700,2178 69700,4545 69700,56150 69700,139010 69701,483 69702,48 69703,48 69704,167 69705,118 69705,4597 69706,1359 69707,21944 69708,48 69709,657 69710,1033 69711,779 69712,5265 69713,251 69713,252 69713,1220 69713,1222 69713,41170 69715,151 69716,392 69717,430 69718,406 69719,298 69720,485 69721,2506 69722,3089 69723,994 69725,256 69725,305 69725,1782 69725,3209 69725,9018 69725,69687 69726,8235 69727,2929 69728,23701 69729,376 69730,557 69732,663 69732,779 69733,393 69734,6682 69735,69736 69737,481 69738,8992 69739,805 69740,1707 69741,289 69741,290 69742,34 69742,1776 69742,4193 69743,158 69744,30 69745,366 69746,1243 69747,69748 69747,89204 69749,2995 69750,841 69750,1462 69751,2775 69752,298 69753,485 69754,366 69755,69756 69757,874 69758,557 69759,862 69760,557 69761,557 69762,136 69763,3246 69764,63 69765,557 69766,779 69767,206 69768,333 69769,219 69770,298 69771,485 69772,1983 69773,647 69774,344 69775,433 69776,219 69777,2506 69779,980 69780,271 69781,872 69782,872 69783,872 69784,1983 69785,2995 69786,779 69787,1962 69788,1359 69789,2506 69791,1181 69792,477 69793,602 69794,477 69795,310 69796,1177 69796,2210 69797,79 69797,911 69798,920 69799,704 69800,602 69801,178 69802,602 69803,602 69804,602 69805,602 69806,2146 69807,8991 69808,2266 69809,602 69810,4 69810,5 69810,355 69810,743 69810,2089 69810,2940 69811,2931 69811,4078 69812,2506 69813,195 69814,68069 69815,420 69816,392 69817,69818 69819,69820 69821,2351 69823,682 69824,626 69825,2146 69826,21487 69826,22880 69827,1313 69828,4276 69830,4101 69831,18726 69832,69833 69832,69894 69832,76461 69832,84964 69832,87535 69832,90613 69832,91601 69832,93844 69832,94436 69832,98824 69832,99485 69832,99936 69832,100222 69832,100488 69832,103442 69832,103673 69832,109229 69832,111067 69832,111563 69832,111567 69832,112733 69832,112769 69832,115475 69832,117669 69832,118074 69832,119446 69832,119630 69832,120200 69832,122170 69832,122175 69832,122337 69832,123144 69832,124327 69832,124702 69832,125241 69832,125304 69832,125608 69832,129218 69832,132422 69832,133880 69835,479 69835,589 69835,849 69835,3297 69835,66898 69837,255 69839,779 69840,273 69841,973 69842,292 69843,294 69844,30 69844,137 69844,225 69844,772 69844,1332 69845,296 69846,298 69847,1411 69848,422 69849,56 69850,422 69851,56 69852,1238 69853,1452 69854,240 69855,187 69857,704 69858,3413 69859,68 69860,69861 69862,366 69863,1566 69864,69865 69866,1776 69867,1238 69868,233 69869,69870 69873,4748 69873,68725 69874,1818 69875,69876 69877,644 69878,874 69879,158 69880,69881 69882,23287 69883,178 69883,439 69883,1776 69883,1877 69885,589 69886,953 69887,3246 69888,30 69889,118 69889,4597 69891,422 69892,56 69893,3 69893,206 69895,38634 69896,557 69897,118 69897,333 69898,4039 69899,30 69900,298 69901,485 69902,2224 69903,217 69904,298 69905,485 69908,1860 69909,5547 69911,298 69912,485 69913,120 69914,2146 69915,1414 69916,192 69916,202 69916,620 69916,760 69916,1462 69916,8537 69917,79 69918,298 69919,485 69920,1181 69921,255 69922,222 69924,298 69925,485 69926,298 69927,485 69928,1983 69929,326 69930,671 69931,302 69931,2116 69933,69934 69935,1122 69936,875 69937,15609 69938,298 69939,485 69940,907 69941,217 69941,949 69942,932 69943,1127 69944,8180 69946,784 69947,571 69947,818 69947,868 69948,671 69949,68069 69950,347 69951,203 69951,2931 69952,333 69953,918 69954,2646 69955,298 69956,485 69957,515 69957,652 69957,872 69957,1893 69958,192 69958,1181 69959,579 69959,2146 69960,1860 69961,479 69962,415 69963,731 69964,640 69965,640 69966,160 69967,2775 69968,1181 69969,422 69970,422 69971,422 69972,422 69973,422 69974,5718 69975,422 69976,309 69976,310 69977,160 69979,30 69980,2411 69981,240 69981,818 69982,2931 69983,805 69984,2697 69985,6955 69989,2421 69990,657 69990,1474 69991,248 69991,1140 69992,344 69994,1010 69995,1102 69996,1388 69997,676 69998,240 69999,602 70000,1012 70002,298 70003,485 70004,862 70005,516 70006,106 70006,59021 70007,5212 70008,2626 70009,17309 70010,70011 70012,392 70013,2697 70015,1556 70019,30 70020,4192 70020,4193 70022,207 70023,298 70024,485 70025,1140 70025,5547 70026,5405 70028,299 70028,604 70028,1293 70028,1837 70029,697 70029,852 70029,3003 70030,298 70031,485 70033,749 70034,298 70035,485 70036,760 70037,30 70038,1274 70039,50 70040,83 70041,254 70042,604 70043,1052 70043,1368 70045,818 70045,2646 70046,599 70047,1011 70048,372 70049,4192 70049,4193 70050,1962 70051,192 70052,70053 70054,5547 70055,30 70057,71 70058,298 70059,485 70060,671 70060,1181 70061,192 70062,215 70063,3769 70064,187 70066,355 70070,30 70071,439 70073,1803 70074,30 70076,68069 70077,30 70078,1639 70078,8788 70079,160 70079,675 70080,202 70080,203 70081,1803 70083,298 70084,485 70085,30 70086,850 70087,1882 70088,310 70088,596 70088,3039 70088,75912 70089,30 70090,1381 70091,72 70092,147 70092,406 70093,577 70094,30 70095,30 70096,1983 70097,9560 70098,45960 70099,8270 70100,72 70101,298 70102,485 70103,72 70104,355 70105,137 70106,222 70106,1019 70107,20 70108,72 70109,1118 70110,1240 70112,79 70113,620 70114,392 70114,1240 70115,30 70116,1381 70117,298 70118,485 70119,1359 70120,920 70121,1240 70122,673 70123,72 70124,347 70124,1096 70126,1801 70127,261 70128,3804 70129,420 70129,509 70130,1631 70133,440 70134,5366 70135,1977 70135,1978 70136,186 70136,968 70136,1240 70137,1181 70138,1803 70138,21442 70138,118336 70139,349 70140,298 70141,485 70142,160 70145,21944 70147,818 70147,1240 70148,2995 70149,3 70150,422 70151,784 70152,56 70153,3003 70154,1284 70155,1085 70156,2146 70157,298 70158,485 70159,65 70160,65 70161,1046 70162,298 70163,485 70164,1140 70164,2443 70164,3474 70164,5547 70165,518 70166,1052 70166,1849 70167,298 70168,485 70169,868 70169,1707 70170,17334 70171,298 70172,485 70173,4455 70174,397 70175,1467 70176,65 70177,3451 70177,3452 70178,17593 70179,1983 70181,3209 70182,3451 70182,3452 70183,17593 70184,65 70185,640 70185,159365 70186,1769 70187,1623 70188,4 70188,5 70189,390 70190,743 70191,160 70192,647 70193,344 70194,3209 70195,417 70195,1085 70195,2205 70195,2206 70195,2296 70195,33424 70196,1531 70197,1983 70198,70199 70201,1515 70202,920 70203,195 70203,3538 70204,34 70204,1718 70207,477 70208,151 70209,1127 70210,298 70211,485 70212,15 70212,693 70213,32 70213,392 70213,697 70214,233 70214,304 70214,649 70214,704 70214,893 70214,932 70214,1458 70214,3069 70215,571 70215,1014 70215,1326 70216,298 70217,485 70218,338 70219,750 70220,147 70220,158 70220,42064 70221,356 70221,5591 70222,920 70223,5212 70224,360 70224,827 70224,1117 70224,1677 70224,2274 70224,2807 70224,3630 70225,65 70225,586 70226,240 70226,818 70227,107 70227,4548 70228,222 70228,455 70229,192 70229,9457 70231,14231 70231,21944 70231,66297 70233,30 70234,264 70235,433 70235,1240 70236,65 70236,571 70236,868 70237,1298 70238,298 70239,485 70240,1 70241,611 70242,392 70243,247 70244,5547 70245,70246 70247,272 70248,392 70249,299 70249,1319 70250,5366 70251,160 70252,2775 70253,70254 70255,3413 70256,330 70257,875 70258,158 70259,83 70260,298 70261,485 70262,1085 70263,19 70264,2296 70265,72 70266,72 70267,477 70268,1623 70269,743 70270,390 70271,4 70271,5 70272,160 70273,184 70274,5310 70275,1556 70276,360 70277,1070 70277,1240 70277,1467 70278,2105 70281,58 70282,46 70283,70284 70285,874 70286,918 70287,875 70288,431 70288,510 70289,70290 70291,392 70292,135 70293,70294 70295,222 70295,1019 70296,333 70296,406 70297,30 70298,527 70299,356 70300,70301 70302,30 70303,406 70304,3413 70305,714 70305,1962 70306,5375 70307,30 70308,72 70309,623 70309,1805 70310,298 70311,195 70313,151 70314,46 70314,459 70314,744 70314,783 70314,1479 70315,70316 70315,83828 70317,158 70318,1634 70318,1807 70319,536 70319,2424 70320,999 70321,298 70322,372 70322,1962 70323,818 70326,58 70327,46 70328,70329 70330,611 70332,364 70332,431 70332,1252 70332,1253 70332,1888 70333,827 70334,657 70335,8149 70336,1052 70337,20 70337,160 70337,477 70337,481 70337,644 70337,666 70337,1043 70337,2168 70337,13137 70337,23287 70338,588 70338,590 70338,1419 70339,1634 70340,346 70341,34 70341,35 70341,83 70342,44 70343,346 70344,70345 70347,1309 70348,779 70348,68069 70349,918 70351,1522 70352,631 70353,772 70354,1285 70355,346 70356,682 70357,1181 70357,1515 70358,72 70359,1858 70360,1860 70361,1881 70362,18790 70363,1572 70364,217 70364,222 70365,433 70366,931 70367,192 70367,207 70367,675 70367,698 70368,72 70369,999 70370,70371 70372,581 70373,557 70373,596 70373,2210 70373,4237 70373,4355 70374,422 70375,56 70376,1284 70378,1224 70379,146 70379,779 70379,2244 70380,70381 70380,101083 70382,93 70382,94 70383,1326 70384,408 70385,70386 70387,104 70388,333 70389,406 70391,346 70392,247 70393,298 70394,485 70395,392 70395,457 70395,503 70395,644 70395,657 70395,697 70395,714 70395,794 70395,918 70395,1012 70395,1019 70395,1147 70395,1293 70395,1359 70395,1363 70395,1522 70395,1544 70395,1663 70395,1818 70395,2083 70395,2253 70395,2605 70395,3003 70395,3474 70395,4165 70395,5547 70395,48505 70396,10 70397,346 70399,376 70400,1323 70401,102 70402,704 70403,1235 70403,1335 70404,63 70404,252 70404,318 70404,516 70405,631 70406,1467 70407,2146 70408,455 70409,2424 70410,1467 70411,1085 70412,1871 70413,83 70414,2421 70415,13980 70416,1149 70417,581 70418,328 70419,20 70420,1844 70421,2434 70422,483 70424,1454 70424,19443 70425,1515 70427,3161 70428,338 70428,420 70428,872 70428,1572 70428,1688 70428,1722 70428,1836 70428,3538 70429,70430 70431,8991 70432,251 70433,1370 70433,1821 70434,366 70434,657 70434,760 70434,1267 70434,2244 70435,309 70435,310 70435,1284 70436,2506 70437,872 70438,1370 70438,1821 70439,663 70439,664 70439,1149 70440,207 70441,515 70442,10 70443,577 70444,615 70444,1119 70445,30 70446,2506 70447,1983 70448,3695 70449,269 70450,22 70451,4611 70452,4611 70454,21944 70455,346 70456,70457 70458,932 70459,10 70460,333 70461,1381 70462,557 70463,557 70464,118 70464,4597 70465,206 70466,18790 70467,389 70468,479 70469,346 70470,70471 70472,9195 70473,79 70473,140 70473,202 70473,203 70473,360 70473,1052 70473,1118 70473,1132 70473,1298 70473,1313 70473,1572 70473,1579 70473,1659 70473,1968 70473,2224 70473,2626 70473,21408 70473,191860 70474,344 70476,5366 70477,932 70478,70478 70479,70480 70481,37414 70482,704 70483,493 70483,2146 70484,931 70487,515 70490,1634 70492,5366 70493,195 70494,147 70494,158 70495,973 70496,70497 70498,1634 70499,422 70500,56 70501,301 70501,596 70501,2006 70502,326 70502,349 70503,269 70504,1181 70505,602 70506,1235 70506,1335 70507,30 70508,67343 70509,358 70509,422 70510,2416 70510,2417 70511,920 70512,313 70513,602 70514,602 70515,70516 70517,72 70519,70520 70521,178 70522,704 70523,70524 70525,749 70526,393 70526,2146 70526,3872 70528,30 70529,247 70530,333 70531,8180 70532,1243 70533,70534 70535,70536 70537,852 70538,30 70539,30 70540,647 70541,344 70542,111 70542,217 70542,388 70542,455 70542,14126 70543,30 70544,640 70545,344 70546,8180 70547,9560 70548,83 70549,30 70550,70524 70551,83 70552,70524 70553,640 70555,640 70556,202 70556,203 70557,70558 70559,70558 70560,1140 70560,1381 70561,99 70562,118 70562,4597 70564,163 70565,1 70567,2889 70568,875 70569,479 70570,4604 70571,640 70572,70524 70573,563 70574,70524 70575,657 70576,70524 70577,70524 70578,518 70579,269 70580,70524 70581,70524 70582,70524 70583,310 70584,70585 70587,3960 70588,70589 70588,77460 70588,80280 70588,96075 70588,100086 70588,102961 70588,110301 70588,115174 70588,122074 70588,125739 70588,129314 70588,130982 70588,131104 70588,134178 70588,139836 70590,70524 70591,70524 70592,366 70593,70524 70594,366 70595,70524 70596,70524 70597,1551 70598,70524 70599,70524 70600,8270 70601,70524 70602,70603 70602,123340 70602,134419 70604,1653 70605,70524 70606,254 70607,70524 70608,70609 70610,195 70611,70524 70612,70524 70613,3413 70614,70615 70616,467 70617,70524 70618,693 70619,70524 70620,70524 70621,70524 70622,70524 70623,240 70624,697 70625,70524 70626,70524 70627,393 70628,2351 70629,70524 70630,70631 70632,366 70633,366 70634,70524 70635,70524 70636,70524 70637,104 70637,134 70637,138 70637,4237 70637,182162 70639,70524 70640,657 70641,70524 70642,3413 70643,70524 70644,3321 70645,70524 70646,70524 70647,70524 70648,1531 70649,622 70650,70524 70651,30 70652,30 70653,70524 70654,70524 70656,163 70657,298 70658,485 70659,70524 70660,70524 70661,1749 70662,70524 70663,644 70664,70524 70666,70524 70667,1033 70667,41767 70668,766 70669,70524 70670,13361 70671,70524 70672,70524 70673,70674 70675,70524 70676,70524 70677,70524 70678,233 70679,70524 70680,30 70681,70524 70682,70524 70683,70524 70684,30 70685,30 70686,79 70687,70524 70688,70524 70689,873 70689,1210 70690,70524 70691,70524 70692,355 70693,70524 70694,70524 70695,70524 70696,70524 70697,70524 70698,604 70699,70524 70700,435 70701,70524 70702,2045 70703,2353 70704,70524 70705,70706 70707,70708 70709,70524 70710,704 70712,704 70713,30 70714,30 70715,70524 70716,275 70717,70524 70718,1140 70718,5547 70719,21944 70720,346 70721,875 70722,30 70724,1370 70726,70524 70727,70524 70728,207 70729,70524 70730,1983 70731,70732 70734,872 70735,8991 70736,70524 70737,3 70737,1590 70739,70524 70740,158 70740,406 70740,779 70740,1181 70740,1515 70741,287 70741,809 70741,19010 70742,431 70743,450 70744,70524 70745,337 70745,586 70746,1631 70747,254 70748,149 70749,147 70750,920 70751,647 70752,344 70753,187 70754,298 70755,485 70756,58 70757,70524 70758,30 70759,298 70760,485 70761,843 70762,575 70762,2045 70763,70524 70765,70524 70766,310 70767,875 70768,70524 70769,30 70770,192 70770,333 70770,1634 70770,2574 70771,70524 70772,16019 70773,83 70774,70524 70775,70524 70776,83 70777,70524 70778,70524 70779,70524 70780,356 70781,70524 70782,70524 70783,70524 70784,631 70785,70524 70786,557 70787,1368 70788,70524 70789,211 70790,70524 70791,70524 70793,5547 70794,70524 70795,19010 70796,70524 70797,30 70798,435 70799,70524 70800,527 70801,1955 70802,1181 70803,8235 70804,178 70804,289 70804,290 70804,1046 70804,1119 70804,1531 70804,6027 70804,13546 70805,70524 70806,393 70807,70524 70808,298 70809,485 70810,298 70811,535 70811,872 70811,9030 70812,485 70813,58 70814,70524 70816,118 70816,4597 70817,70524 70820,1140 70820,3474 70820,5547 70821,70822 70823,309 70823,310 70823,483 70823,3039 70824,868 70825,2779 70825,2784 70826,70524 70827,2744 70828,868 70829,70524 70830,1181 70831,70524 70832,1590 70832,6661 70833,3367 70834,70524 70835,527 70836,19010 70837,70524 70838,5547 70839,784 70840,32475 70841,70524 70843,366 70843,406 70844,70524 70845,685 70846,70524 70847,868 70848,693 70849,70524 70850,77 70850,1619 70851,422 70852,1619 70853,1531 70854,240 70855,70524 70856,70524 70857,843 70858,277 70858,279 70858,13529 70858,70858 70859,1070 70860,70524 70861,83 70862,349 70863,70524 70864,70524 70865,70524 70866,1858 70867,1860 70868,70524 70869,195 70870,868 70870,162599 70872,1474 70873,818 70874,70524 70875,344 70876,70524 70878,70524 70879,34 70879,35 70880,48 70881,70524 70883,1436 70883,1984 70883,5708 70884,70524 70885,147 70885,422 70887,1782 70888,222 70889,70524 70890,217 70890,1019 70891,298 70892,485 70893,70524 70894,70895 70896,206 70896,682 70896,920 70896,72439 70897,136 70898,72 70900,30 70900,328 70900,1033 70900,1939 70902,2312 70903,581 70904,1639 70905,79 70905,536 70905,70906 70905,115219 70907,70906 70908,571 70908,868 70909,70524 70910,2506 70911,70912 70913,422 70914,907 70915,70524 70916,215 70917,70918 70920,1127 70920,2424 70921,70524 70922,298 70923,1858 70924,1860 70925,2224 70926,7757 70928,392 70928,1151 70929,160 70931,206 70932,30 70933,346 70934,1359 70936,346 70937,515 70938,1860 70939,146 70939,92476 70942,18790 70943,10 70944,1805 70945,4455 70946,595 70946,2617 70947,972 70948,859 70949,1983 70950,72 70951,252 70951,1220 70951,1222 70951,41170 70952,1858 70953,1860 70954,30 70955,1983 70956,2506 70957,1844 70958,1146 70959,3602 70960,326 70962,392 70963,1769 70964,3447 70965,1 70965,60576 70967,48 70968,7757 70970,104 70970,1368 70971,1130 70972,8270 70973,1983 70974,356 70975,70976 70975,122838 70975,128240 70975,128616 70975,129152 70977,298 70978,485 70979,7698 70980,1983 70982,9025 70983,1177 70984,1368 70985,702 70985,752 70985,874 70985,1133 70985,1210 70985,1801 70986,713 70987,599 70988,1983 70989,2646 70990,1983 70991,83 70993,872 70995,779 70995,141912 70996,50 70997,693 70997,75912 70998,259 70999,160 70999,827 70999,1147 71000,3321 71001,71002 71003,422 71004,349 71005,611 71006,433 71007,489 71007,2116 71008,1167 71009,299 71010,1181 71011,79 71012,30 71013,70524 71014,406 71015,372 71015,393 71015,100740 71015,100949 71015,101263 71015,101689 71015,103339 71015,103495 71016,47 71016,184 71016,202 71016,203 71016,2469 71017,417 71017,626 71017,1133 71018,3507 71019,4355 71020,34 71020,1776 71020,4193 71021,158 71023,406 71025,1939 71027,79 71027,158 71027,192 71027,202 71027,203 71027,333 71027,586 71027,663 71027,664 71027,1181 71027,3876 71028,56 71028,147 71028,158 71028,192 71028,60576 71029,852 71030,663 71030,664 71030,2178 71030,4545 71030,56150 71031,694 71033,1240 71034,30 71034,622 71035,18831 71036,406 71036,435 71037,289 71037,290 71037,344 71037,620 71037,685 71037,1252 71037,1253 71037,2116 71038,233 71039,1844 71040,422 71041,422 71042,298 71043,485 71044,422 71045,422 71047,422 71048,200 71048,1319 71048,1955 71048,2775 71049,422 71050,1359 71051,406 71052,422 71053,422 71054,515 71054,1579 71054,1893 71054,2312 71055,731 71056,440 71057,1001 71058,422 71059,56 71061,94 71061,885 71061,2787 71061,13704 71062,640 71063,392 71063,697 71064,1467 71065,2146 71066,302 71066,579 71067,872 71069,852 71069,5591 71070,390 71070,417 71070,1285 71071,5310 71072,3069 71073,283 71074,455 71075,2206 71075,6726 71076,32 71076,37 71076,54 71076,83 71076,140 71076,217 71076,278 71076,283 71076,304 71076,385 71076,388 71076,392 71076,538 71076,577 71076,589 71076,626 71076,660 71076,749 71076,752 71076,859 71076,919 71076,949 71076,1010 71076,1151 71076,1175 71076,1212 71076,1241 71076,1287 71076,1289 71076,1298 71076,1309 71076,1479 71076,1509 71076,1579 71076,1616 71076,1634 71076,1801 71076,1871 71076,2421 71076,2424 71076,2646 71076,3507 71076,3585 71076,3999 71076,6059 71076,6424 71076,9015 71076,14483 71076,22293 71076,35486 71077,1556 71081,3538 71082,720 71084,875 71085,4 71085,5 71085,620 71085,628 71085,1572 71086,366 71087,247 71088,366 71089,71090 71091,640 71091,2206 71092,1871 71093,134 71094,1359 71095,406 71096,48 71097,301 71098,972 71098,973 71099,3069 71100,392 71101,273 71102,137 71103,106 71103,337 71104,178 71105,1381 71106,30 71107,1531 71108,577 71109,1181 71110,261 71110,1119 71111,302 71112,151 71113,1149 71113,1631 71113,5265 71114,338 71115,30 71116,452 71117,2367 71119,192 71120,850 71121,805 71122,1359 71123,134 71124,640 71125,71126 71127,393 71128,30 71129,483 71130,2995 71131,147 71132,640 71133,907 71133,1284 71134,1151 71135,247 71136,8270 71137,83 71138,376 71139,885 71140,2146 71141,392 71142,19010 71143,372 71145,2697 71146,71147 71148,83 71149,536 71150,2671 71151,622 71152,1033 71154,652 71155,160 71156,1893 71157,79 71158,1 71161,536 71161,44725 71162,1509 71163,1531 71164,376 71165,626 71166,818 71167,192 71168,1323 71169,102 71170,1326 71171,408 71172,10 71173,30 71174,805 71175,310 71176,2697 71177,1715 71178,48 71179,30 71180,392 71180,1151 71181,536 71182,71183 71184,509 71184,510 71184,1043 71184,1424 71184,1805 71184,3367 71185,809 71185,22293 71186,259 71187,1285 71188,852 71188,2699 71189,30 71190,2782 71191,2209 71192,171 71193,1133 71194,433 71195,298 71196,485 71197,298 71198,485 71199,217 71200,516 71201,1531 71202,44 71203,140 71203,1462 71204,818 71205,3804 71206,1707 71208,3409 71209,972 71210,557 71211,298 71212,485 71213,640 71214,557 71215,994 71216,393 71217,2526 71218,72 71219,640 71220,298 71221,485 71222,206 71223,8598 71224,704 71225,147 71226,137 71227,71228 71229,865 71229,1432 71230,406 71231,333 71232,50 71233,841 71234,146 71235,336 71236,585 71237,602 71238,779 71239,192 71240,71240 71241,620 71242,622 71243,79 71244,44 71245,6119 71246,285 71247,99 71248,3960 71249,2719 71250,71251 71252,269 71253,8270 71254,2995 71255,233 71255,240 71255,590 71255,592 71255,631 71255,1785 71255,1818 71255,2620 71255,5718 71256,805 71257,3555 71258,13 71258,489 71259,298 71260,485 71261,72 71262,338 71263,779 71264,417 71265,1265 71265,1266 71266,1181 71267,1010 71268,3321 71269,30 71270,1749 71271,452 71272,1247 71273,184 71274,200 71275,5265 71276,296 71276,671 71277,222 71278,298 71279,485 71280,71281 71282,640 71282,2206 71283,7124 71284,298 71285,485 71286,71287 71288,527 71289,298 71290,485 71291,30 71292,5908 71293,277 71293,585 71294,240 71294,1962 71295,1359 71296,1 71297,251 71297,1243 71298,1370 71299,30 71300,298 71301,485 71302,17886 71303,1 71303,147 71303,149 71303,158 71303,171 71303,184 71303,206 71303,606 71303,1458 71303,1619 71303,1623 71303,2244 71303,4507 71303,7817 71303,8854 71303,23861 71303,26841 71303,39437 71303,40514 71303,65723 71303,71303 71303,76835 71303,87843 71303,87870 71303,112537 71303,121575 71303,138831 71303,147380 71303,179365 71303,194784 71303,207140 71303,207671 71303,228739 71303,247936 71303,258183 71303,258567 71303,262171 71304,83 71305,3507 71306,779 71307,5440 71308,907 71309,8180 71310,4355 71311,10 71312,1359 71313,1881 71314,602 71315,602 71316,818 71317,795 71318,333 71319,71320 71321,1590 71322,292 71323,45024 71324,664 71324,1085 71325,358 71325,2266 71326,392 71326,1151 71328,1359 71329,10 71329,750 71330,72 71331,217 71331,1893 71332,192 71332,3872 71333,920 71333,957 71333,1815 71334,70524 71335,450 71336,70524 71337,3872 71338,920 71339,920 71340,209 71341,71342 71343,71 71344,71344 71345,1983 71346,801 71346,1140 71346,5547 71347,595 71348,71349 71350,338 71351,70524 71352,70524 71353,195 71354,422 71355,70524 71356,2775 71357,447 71358,70524 71359,70524 71360,207 71361,586 71362,136 71362,217 71362,254 71362,6249 71363,70524 71364,346 71365,70524 71366,336 71367,1983 71368,338 71369,366 71370,8270 71371,366 71372,30 71373,366 71374,366 71375,70524 71376,30 71376,328 71376,1179 71376,1305 71376,2146 71376,2701 71376,7124 71377,932 71378,81 71379,1411 71380,70524 71381,346 71382,70524 71383,70524 71384,70524 71385,138 71385,1368 71385,2105 71386,70524 71387,70524 71388,70524 71389,70524 71390,70524 71391,30 71392,70524 71393,70524 71394,70524 71395,70524 71396,70524 71397,70524 71398,70524 71399,346 71400,70524 71401,346 71402,70524 71403,2697 71404,70524 71405,70524 71406,71407 71408,70524 71409,18726 71410,70524 71411,163 71412,70524 71413,70524 71414,70524 71415,70524 71416,70524 71417,70524 71418,70524 71419,70524 71420,70524 71421,70524 71422,70524 71423,70524 71424,70524 71425,309 71425,310 71426,70524 71427,70524 71428,1983 71429,70524 71430,70524 71431,70524 71432,70524 71433,70524 71434,70524 71435,70524 71436,818 71437,393 71438,70524 71439,70524 71440,70524 71441,70524 71442,346 71443,805 71444,70524 71445,70524 71446,70524 71447,240 71448,70524 71449,18726 71450,70524 71451,70524 71452,9121 71453,3960 71454,1462 71454,8537 71455,70524 71456,70524 71457,346 71458,1140 71458,5547 71459,70524 71460,70524 71461,71462 71461,84517 71461,88100 71463,71464 71465,70524 71466,83 71466,217 71466,278 71466,455 71466,536 71466,1467 71467,70524 71468,70524 71469,70524 71470,70524 71471,841 71472,70524 71473,346 71474,70524 71475,70524 71476,70524 71477,71478 71479,70524 71480,70524 71481,70524 71482,1167 71484,70524 71485,71486 71487,70524 71488,71489 71490,71489 71491,70524 71492,70524 71493,704 71494,70524 71495,70524 71496,7358 71496,7363 71497,70524 71498,70524 71499,70524 71500,70524 71501,70524 71502,70524 71503,70524 71504,70524 71505,70524 71506,70524 71507,70524 71508,70524 71509,70524 71510,70524 71511,70524 71512,70524 71513,70524 71514,70524 71515,861 71516,70524 71517,70524 71518,70524 71519,118 71519,4597 71520,118 71520,4597 71521,70524 71522,175 71523,70524 71524,70524 71525,9195 71526,71527 71526,72930 71526,88908 71526,91035 71526,92066 71526,92315 71526,92601 71526,96820 71526,99682 71526,104960 71526,105528 71526,107143 71528,70524 71529,70524 71530,3246 71531,70524 71532,450 71533,1977 71533,1978 71534,70524 71535,70524 71536,973 71537,70524 71538,71539 71540,850 71540,1572 71541,70524 71542,68 71543,70524 71545,97 71546,70524 71547,1267 71548,2116 71549,302 71550,3695 71551,70524 71552,2574 71553,5212 71554,70524 71555,71556 71557,21487 71558,233 71559,289 71559,290 71560,178 71560,403 71560,408 71560,579 71560,827 71560,1479 71560,1572 71560,1803 71560,1968 71560,3653 71561,70524 71562,557 71563,70524 71564,479 71565,71566 71567,70524 71568,4101 71569,70524 71570,644 71571,70524 71572,1467 71573,687 71574,1634 71575,70524 71576,70524 71577,70524 71578,70524 71579,70524 71580,71581 71583,70524 71585,70524 71586,10 71586,1265 71586,1266 71587,70524 71588,355 71589,70524 71590,314 71591,70524 71592,70524 71593,70524 71594,70524 71595,70524 71596,337 71597,586 71598,70524 71599,178 71600,93 71600,94 71601,3960 71602,346 71603,70524 71604,2697 71605,70524 71606,70524 71607,71608 71609,269 71611,70524 71612,346 71613,70524 71614,70524 71615,1801 71616,70524 71617,1179 71618,70524 71619,70524 71620,2421 71621,70524 71622,435 71622,500 71623,70524 71624,70524 71625,1836 71626,209 71627,70524 71628,579 71629,70524 71630,34 71630,35 71631,79 71631,1707 71633,70524 71634,70524 71635,779 71636,70524 71637,70524 71638,10 71638,772 71638,1188 71639,70524 71640,298 71641,485 71642,70524 71643,718 71644,433 71644,1531 71645,70524 71646,1140 71646,5547 71648,347 71648,563 71648,2367 71649,65 71649,868 71650,104 71651,3960 71652,70524 71653,628 71654,70524 71655,34 71655,1776 71655,4193 71656,70524 71658,192 71659,70524 71660,604 71661,657 71662,146 71662,344 71662,2699 71662,106502 71663,2995 71665,515 71666,70524 71667,70524 71668,217 71669,72 71670,70524 71672,71673 71674,70524 71675,63 71675,79 71675,202 71675,203 71675,233 71675,247 71675,397 71675,473 71675,491 71675,505 71675,868 71675,1590 71675,1663 71675,1803 71675,2617 71675,2646 71675,5726 71675,31977 71676,2574 71677,70524 71678,818 71679,72 71680,932 71681,70524 71682,192 71683,1659 71684,1179 71685,298 71686,485 71687,1096 71688,775 71689,70524 71691,1707 71692,70524 71693,1265 71693,1266 71694,68069 71695,1983 71696,1531 71697,779 71697,818 71697,1010 71698,298 71699,485 71700,99 71701,70524 71702,70524 71703,240 71705,861 71706,392 71707,8270 71708,240 71708,372 71708,1082 71708,1085 71708,1580 71708,1807 71708,2812 71708,4222 71708,212692 71709,1653 71710,2812 71712,186 71713,70524 71714,30 71715,298 71716,485 71717,30 71718,323 71719,70524 71720,298 71721,485 71722,70524 71723,298 71724,485 71726,1033 71727,1749 71728,338 71729,1515 71730,1858 71731,1860 71732,21944 71733,70524 71734,79 71734,1707 71735,70524 71737,516 71738,298 71739,485 71740,70524 71741,50 71741,79 71741,147 71741,158 71741,178 71741,192 71741,285 71741,406 71741,620 71741,622 71741,779 71741,1531 71741,2931 71742,1276 71742,2626 71743,298 71744,485 71746,56 71747,1240 71749,422 71750,1140 71750,3474 71750,5547 71751,422 71752,240 71753,422 71754,422 71755,422 71756,422 71758,422 71759,422 71760,422 71761,171 71761,330 71761,1608 71762,83 71763,70524 71764,1140 71764,3474 71764,5547 71765,1 71766,298 71767,485 71768,70524 71769,70524 71770,135 71770,138 71770,211 71770,304 71770,795 71770,1001 71770,1181 71770,1305 71770,1844 71770,2105 71770,2867 71770,2868 71770,3094 71770,5625 71770,8442 71770,9294 71770,16906 71770,18256 71770,27715 71770,31802 71770,38429 71770,38875 71770,48119 71770,48716 71770,54410 71770,57182 71770,64687 71770,71770 71770,72684 71770,99223 71770,103575 71770,106504 71770,114211 71770,135821 71770,155460 71770,161915 71770,165041 71770,172265 71770,178478 71770,185413 71770,189378 71770,189889 71770,190471 71770,192082 71770,192085 71770,217552 71770,218584 71770,221060 71770,221061 71770,223945 71770,224907 71770,225578 71770,227327 71770,232125 71770,232177 71770,232910 71770,232919 71770,232951 71770,233981 71770,241103 71770,241749 71770,245870 71770,256392 71771,70524 71772,2146 71773,779 71774,417 71775,6955 71776,70524 71777,136 71777,137 71778,70524 71779,209 71780,298 71781,485 71782,206 71783,71784 71785,70524 71786,41 71786,301 71786,1177 71787,202 71787,203 71788,267 71789,557 71790,70524 71791,298 71792,485 71794,70524 71795,273 71796,818 71797,206 71798,140 71799,30 71800,1298 71801,151 71801,178 71801,2989 71801,2991 71802,106 71804,70524 71805,298 71806,485 71807,206 71807,907 71807,1241 71808,70524 71810,70524 71811,581 71812,70524 71813,70524 71814,70524 71815,1983 71816,2146 71817,4078 71818,70524 71819,1807 71821,726 71822,3260 71823,3069 71824,1639 71825,104 71826,58 71827,46 71828,298 71829,485 71830,158 71830,392 71830,433 71830,779 71830,1836 71830,2292 71831,671 71832,167 71833,50 71834,158 71835,147 71835,206 71835,1458 71836,3623 71837,1220 71837,1222 71838,30 71839,1707 71840,70524 71841,298 71842,1749 71842,2605 71843,493 71844,32475 71845,158 71845,206 71845,1801 71845,55849 71845,118336 71846,1983 71847,72 71848,70524 71849,3474 71850,70524 71852,2116 71853,30 71854,70524 71855,1140 71855,5547 71856,872 71857,134 71858,392 71859,58 71860,46 71861,292 71862,104 71863,2574 71865,7124 71866,2697 71867,349 71867,5540 71868,1837 71869,417 71870,1983 71871,393 71873,41 71873,406 71874,44 71875,1619 71876,151 71877,1634 71878,323 71879,2979 71880,79 71880,718 71880,760 71881,1983 71882,2674 71883,1977 71883,1978 71885,24505 71886,2590 71887,422 71888,697 71889,8270 71890,3623 71891,477 71892,920 71893,104 71893,557 71893,953 71893,954 71893,1368 71893,5405 71894,71895 71896,188 71897,182 71898,1639 71899,222 71900,14556 71902,63 71902,620 71903,7757 71904,338 71905,557 71906,477 71907,907 71908,34 71908,1718 71910,333 71910,346 71910,366 71910,1247 71911,333 71912,406 71913,1608 71914,356 71914,455 71914,852 71914,5591 71915,1140 71915,5547 71916,1608 71917,779 71918,247 71918,301 71918,302 71919,2116 71920,1001 71922,79 71922,338 71922,1118 71923,1983 71924,483 71925,2146 71926,106 71927,50 71928,515 71929,640 71930,516 71931,206 71932,71933 71934,273 71934,1544 71935,83 71935,206 71935,586 71935,718 71935,1888 71935,8675 71935,14458 71936,1722 71936,2697 71937,392 71937,14556 71938,10318 71939,406 71940,255 71941,640 71942,652 71943,22580 71944,527 71944,743 71944,95152 71945,273 71946,1655 71947,8270 71948,71949 71950,372 71951,298 71952,485 71953,4549 71954,843 71955,298 71956,485 71957,5547 71958,467 71959,312 71959,1010 71960,227 71960,843 71962,65 71962,868 71963,151 71964,298 71965,298 71966,485 71967,71949 71968,663 71968,664 71970,58 71971,46 71972,1400 71973,467 71974,30 71974,41 71975,1556 71976,1388 71977,489 71977,577 71977,1400 71978,868 71979,3041 71980,37 71981,259 71982,5547 71983,602 71984,726 71985,252 71985,41170 71989,5718 71990,1805 71991,272 71991,328 71991,994 71993,714 71994,346 71995,801 71995,1140 71995,2443 71995,5547 71996,349 71996,697 71996,3260 71997,907 71998,336 72000,192 72000,333 72000,74845 72000,100915 72000,101912 72000,108302 72002,1983 72003,1983 72004,1227 72004,1229 72005,1983 72006,72007 72008,5547 72009,10 72010,346 72012,77 72013,1891 72014,50 72015,72 72016,147 72016,422 72016,907 72016,2191 72016,4545 72016,139010 72018,120 72018,261 72018,272 72018,310 72018,563 72018,862 72018,907 72018,1368 72018,1462 72018,1466 72018,3328 72018,8537 72018,9015 72019,312 72020,697 72022,151 72022,309 72022,310 72024,346 72025,1379 72026,151 72027,247 72028,240 72029,1323 72030,102 72031,1326 72032,408 72033,48 72034,1143 72035,147 72035,178 72035,447 72035,1531 72035,1541 72036,285 72036,2620 72037,72038 72039,2480 72040,338 72041,338 72042,217 72043,252 72043,318 72043,41170 72044,433 72045,2351 72046,861 72047,83 72047,217 72049,406 72050,247 72051,338 72052,72 72053,907 72054,20 72055,3161 72056,147 72056,80266 72057,44 72058,346 72059,72 72060,72061 72062,392 72063,346 72064,83 72065,302 72066,346 72068,493 72068,772 72068,949 72068,1715 72068,1927 72068,1985 72069,48 72070,809 72070,22293 72071,406 72072,32475 72073,1133 72074,438 72075,3 72075,34 72075,35 72075,106 72075,158 72075,178 72075,192 72075,202 72075,203 72075,217 72075,251 72075,252 72075,346 72075,435 72075,586 72075,622 72075,640 72075,663 72075,664 72075,1181 72075,1220 72075,1222 72075,1243 72075,1294 72075,1370 72075,1590 72075,1635 72075,2567 72075,2931 72075,3161 72075,4192 72075,4193 72075,5874 72075,5976 72075,6119 72075,8598 72075,8771 72075,8811 72075,8822 72075,8907 72075,41170 72076,9560 72078,30 72079,433 72080,34 72080,35 72081,1287 72082,9029 72083,217 72083,663 72083,664 72083,779 72083,809 72083,920 72083,1033 72083,1181 72083,1381 72083,1414 72083,2073 72083,2889 72084,171 72085,1983 72087,111 72087,595 72087,1572 72087,3538 72088,5440 72089,8854 72090,72091 72092,147 72093,10 72094,1634 72095,346 72096,83 72097,2244 72098,1458 72099,184 72100,120 72100,577 72101,192 72102,314 72103,557 72104,557 72105,422 72106,56 72107,1634 72108,850 72109,72110 72111,106 72112,338 72113,346 72114,10 72115,493 72116,146 72116,147 72116,957 72116,1707 72116,1815 72116,92476 72117,433 72118,72 72119,2116 72121,30 72122,615 72122,1782 72123,15 72123,83 72123,206 72123,1634 72123,4252 72124,72125 72126,72125 72127,30 72128,2146 72129,422 72130,56 72131,850 72132,175 72132,2372 72132,31977 72133,577 72134,557 72135,452 72136,8270 72137,346 72138,850 72139,1068 72140,455 72141,358 72142,932 72142,1149 72142,80261 72142,94137 72142,98214 72142,170446 72142,235494 72142,239497 72142,246526 72143,477 72144,2590 72145,30 72146,861 72147,3538 72148,72149 72150,393 72151,45960 72152,8868 72153,171 72154,72155 72156,338 72157,21487 72157,22880 72158,1133 72159,207 72160,298 72161,485 72162,406 72162,779 72162,1181 72163,292 72164,323 72165,298 72166,485 72167,1881 72168,330 72168,1235 72169,247 72170,872 72171,1429 72172,6726 72173,83 72173,358 72174,72175 72176,8675 72177,72178 72179,18726 72180,14366 72181,346 72182,392 72183,668 72185,660 72186,8270 72187,70524 72188,422 72189,56 72190,298 72191,485 72192,59870 72193,70524 72194,72195 72196,1381 72197,192 72198,1608 72199,70524 72200,422 72201,56 72202,22 72202,58 72202,192 72202,859 72202,1388 72202,13661 72203,70524 72204,779 72205,70524 72206,1608 72207,70524 72208,70524 72209,473 72210,2607 72211,393 72212,5405 72213,70524 72214,72215 72214,108864 72214,112702 72214,126417 72216,1274 72217,70524 72218,70524 72219,70524 72220,72221 72222,17228 72223,30 72224,70524 72225,323 72226,94 72226,72227 72228,957 72229,70524 72230,70524 72231,70524 72232,30 72233,1782 72234,58 72235,46 72236,1143 72237,70524 72238,70524 72239,70524 72240,70524 72241,70524 72242,70524 72243,70524 72244,70524 72245,30 72246,70524 72247,70524 72248,346 72249,70524 72250,862 72250,1085 72250,2590 72252,70524 72253,70524 72254,70524 72255,687 72256,79 72257,70524 72258,1983 72259,70524 72260,70524 72261,2367 72262,30 72263,9010 72264,30 72265,70524 72266,70524 72267,72268 72269,70524 72270,72271 72272,70524 72273,72274 72275,1102 72276,70524 72277,70524 72278,652 72279,72280 72281,690 72282,328 72283,87 72283,392 72283,1151 72284,30 72285,70524 72286,70524 72287,118 72287,4597 72288,20 72289,8854 72290,70524 72291,70524 72292,70524 72293,70524 72294,1140 72294,5547 72295,70524 72296,70524 72297,70524 72298,30 72299,70524 72300,70524 72301,70524 72302,1181 72303,70524 72304,70524 72305,70524 72306,70524 72307,346 72308,72309 72310,304 72311,2929 72312,8270 72313,1363 72314,70524 72315,70524 72316,818 72317,70524 72318,70524 72319,70524 72320,70524 72321,1796 72322,1541 72323,704 72324,70524 72325,70524 72326,1425 72327,70524 72328,70524 72329,70524 72330,70524 72331,70524 72332,805 72333,70524 72334,70524 72335,70524 72336,70524 72337,70524 72338,70524 72339,1452 72340,34 72340,35 72341,70524 72342,55479 72343,72344 72345,1381 72346,70524 72347,70524 72348,72349 72350,70524 72351,5547 72352,72353 72354,222 72354,278 72354,349 72354,389 72354,1871 72355,302 72355,2116 72356,70524 72357,8991 72358,264 72359,387 72360,70524 72361,3804 72362,70524 72363,233 72364,5547 72365,805 72366,850 72367,70524 72368,70524 72369,376 72370,1238 72371,72372 72371,130163 72373,70524 72374,70524 72375,70524 72376,2116 72377,70524 72378,21487 72378,22880 72379,70524 72380,70524 72381,2116 72382,70524 72383,70524 72384,23011 72385,70524 72386,479 72387,70524 72388,70524 72389,16019 72390,355 72391,70524 72392,70524 72393,298 72394,485 72395,83 72395,852 72395,5591 72396,5547 72397,70524 72398,2116 72399,70524 72400,366 72401,366 72402,571 72402,868 72403,2116 72404,70524 72405,70524 72406,2116 72407,70524 72408,366 72409,934 72410,366 72411,366 72412,10 72413,366 72414,4276 72415,647 72416,140 72416,1462 72417,70524 72418,298 72419,485 72420,70524 72421,70524 72422,2929 72423,23701 72424,70524 72425,56 72425,704 72425,714 72425,932 72426,5547 72427,70524 72428,192 72429,2116 72430,70524 72431,137 72432,298 72432,346 72432,615 72432,1243 72432,7429 72433,70524 72434,663 72434,664 72435,70524 72437,1458 72438,70524 72439,682 72439,1512 72439,5992 72441,1983 72442,70524 72444,70524 72445,2116 72446,70524 72447,70524 72448,70524 72449,70524 72450,70524 72451,70524 72452,70524 72453,70524 72454,70524 72455,70524 72456,70524 72457,70524 72458,70524 72459,1 72460,70524 72461,70524 72462,298 72463,485 72465,70524 72466,673 72467,809 72468,1983 72469,70524 72470,3079 72471,1983 72472,277 72472,8992 72474,70524 72475,70524 72476,1983 72477,70524 72478,70524 72479,733 72480,30 72481,70524 72482,843 72483,70524 72484,872 72485,1891 72486,298 72487,485 72488,571 72488,868 72489,280 72489,1707 72489,17245 72490,1983 72491,70524 72492,663 72492,664 72493,146 72494,70524 72496,70524 72497,70524 72498,1381 72499,7117 72500,2048 72501,70524 72502,301 72503,70524 72505,779 72506,5547 72507,70524 72508,422 72509,70524 72510,422 72511,422 72513,70524 72514,70524 72515,1515 72516,70524 72517,70524 72518,70524 72519,3999 72520,70524 72521,298 72522,485 72523,10 72523,1388 72523,1509 72523,1836 72523,2617 72523,5192 72524,1235 72524,1335 72525,283 72526,457 72526,557 72526,589 72526,704 72526,1402 72526,1417 72526,1458 72526,5213 72527,2416 72527,2417 72528,422 72529,467 72529,920 72530,6424 72531,70524 72532,422 72533,422 72534,70524 72535,1181 72536,422 72537,422 72538,8180 72539,20813 72540,479 72541,7358 72541,7363 72542,1858 72543,1860 72544,70524 72545,66 72546,1860 72547,515 72548,1293 72549,3612 72550,72551 72552,298 72553,485 72554,137 72556,70524 72557,298 72558,3 72559,485 72560,70524 72561,97 72562,48 72562,254 72562,994 72565,2697 72566,70524 72567,5440 72568,70524 72569,859 72569,1368 72570,278 72571,70524 72572,2319 72573,676 72574,1860 72575,1370 72576,248 72577,273 72578,83 72579,7757 72580,1849 72581,30 72583,48 72584,72585 72586,184 72586,264 72586,1955 72587,1983 72588,5547 72589,137 72589,720 72589,1453 72590,4903 72590,13136 72591,70524 72593,1860 72594,467 72594,868 72595,222 72597,272 72598,516 72598,2775 72599,8598 72600,581 72601,2735 72602,70524 72603,602 72604,83 72605,126 72606,298 72607,485 72608,70524 72609,647 72610,344 72611,1118 72612,1556 72613,252 72613,41170 72614,50 72615,1247 72616,2146 72617,450 72618,872 72619,70524 72620,48 72621,167 72622,287 72622,314 72622,809 72623,403 72624,1359 72627,178 72628,1707 72629,72630 72631,45023 72632,2674 72632,16153 72633,477 72634,55849 72635,72636 72637,827 72639,111 72639,134 72639,240 72639,372 72639,631 72639,805 72639,1001 72639,1368 72639,1955 72639,1962 72639,2286 72640,70524 72641,2574 72642,70524 72643,17334 72644,251 72644,465 72644,516 72645,3413 72646,467 72647,206 72648,467 72648,868 72649,298 72650,485 72651,1858 72652,1860 72653,647 72654,344 72655,298 72656,485 72657,372 72657,1368 72657,1962 72657,2286 72658,58 72659,46 72660,70524 72661,991 72662,158 72663,827 72663,1370 72664,733 72665,149 72666,1776 72667,5366 72668,58 72669,46 72670,79 72670,1673 72671,6059 72672,433 72673,163 72673,1240 72673,1241 72673,2116 72673,3769 72674,65 72675,2205 72675,2206 72676,6303 72677,1085 72677,75912 72678,406 72679,333 72680,424 72682,83 72683,200 72684,111 72684,805 72684,1462 72684,8537 72685,58 72686,46 72687,70524 72688,1977 72688,1978 72689,442 72689,2367 72690,657 72692,2334 72693,28072 72694,2626 72695,72696 72698,422 72699,56 72700,175 72701,439 72702,1860 72703,302 72704,70524 72705,775 72706,581 72707,420 72708,1432 72708,21944 72709,1124 72710,2048 72711,151 72712,1769 72713,18298 72714,17334 72715,66 72715,158 72715,163 72715,264 72715,269 72715,278 72715,309 72715,310 72715,435 72715,628 72715,752 72715,784 72715,1010 72715,1326 72715,1374 72715,1531 72715,2979 72715,4823 72715,5265 72716,72717 72718,631 72720,604 72720,1293 72722,6424 72723,2744 72724,868 72725,1707 72726,563 72726,615 72726,1241 72726,3422 72726,5662 72729,72730 72731,171 72732,1454 72734,158 72735,44 72736,147 72736,158 72737,301 72739,247 72740,72741 72742,704 72742,1212 72742,1282 72744,50 72744,99 72745,392 72746,72747 72749,34 72749,35 72751,417 72752,811 72753,58 72754,46 72756,72757 72758,2607 72759,932 72760,2116 72761,48 72762,171 72763,832 72764,666 72764,750 72764,973 72764,1167 72764,1284 72764,1298 72764,2191 72764,4185 72764,4359 72764,7349 72764,30328 72764,61307 72764,63038 72764,72764 72764,87994 72764,95380 72764,96685 72764,105429 72764,107162 72764,147958 72764,156293 72764,170883 72764,189264 72764,190521 72764,190525 72764,227286 72764,237320 72764,244016 72765,138 72766,1140 72767,477 72768,850 72769,24505 72770,72771 72770,106422 72772,195 72773,483 72774,433 72776,868 72777,158 72778,431 72778,188791 72779,1556 72780,6051 72781,422 72782,56 72783,68 72785,287 72786,872 72787,433 72788,868 72789,222 72790,48 72791,48 72792,48 72793,227 72794,118 72794,4597 72795,247 72795,2867 72795,22880 72796,134 72797,310 72797,805 72798,298 72799,485 72801,392 72802,1140 72803,137 72804,292 72805,6750 72806,171 72807,48 72808,918 72809,1807 72810,72811 72812,48 72813,433 72814,298 72815,366 72816,287 72816,809 72816,19010 72817,195 72817,1639 72818,2944 72820,1467 72821,41 72822,687 72822,861 72822,893 72823,1801 72824,968 72825,149 72825,336 72825,406 72826,344 72827,72828 72829,70524 72830,70524 72831,72832 72833,557 72834,22 72835,811 72836,158 72836,406 72837,707 72838,130 72838,1551 72839,151 72841,72842 72843,1860 72844,3612 72845,595 72846,2274 72847,392 72848,4760 72849,6059 72850,5658 72851,4252 72852,623 72853,697 72854,6955 72856,1381 72857,1284 72858,264 72858,1289 72859,631 72860,70524 72861,8822 72862,217 72863,779 72864,1247 72865,136 72865,563 72866,83 72867,483 72868,68 72868,20359 72868,72869 72870,1323 72871,102 72872,1326 72873,408 72874,147 72874,158 72874,1458 72874,1803 72874,56006 72874,58612 72874,81185 72874,89035 72874,102579 72874,102580 72874,102581 72874,102582 72874,102583 72874,102595 72874,102602 72874,102635 72874,102680 72874,102684 72874,102715 72875,949 72876,1531 72877,34 72877,35 72877,313 72877,1313 72877,1718 72877,2224 72877,2646 72877,5326 72878,2224 72879,376 72880,72881 72882,34 72882,35 72883,1467 72884,147 72885,247 72886,298 72889,240 72889,818 72890,2506 72891,611 72892,58 72892,344 72892,801 72892,2443 72892,5547 72893,72 72894,6682 72895,79 72896,56 72896,422 72896,30331 72896,60576 72897,8270 72898,56 72898,422 72898,30331 72898,60576 72899,79 72900,107 72901,207 72902,392 72902,1240 72902,3260 72903,644 72904,872 72905,1608 72906,1429 72907,111 72907,200 72907,240 72907,805 72907,1462 72907,1962 72907,8537 72908,83 72909,483 72910,10 72910,714 72910,1612 72910,2146 72910,6682 72911,668 72913,376 72914,885 72915,301 72915,968 72916,313 72916,385 72916,660 72916,949 72916,2779 72916,4637 72917,225 72918,459 72919,1119 72920,134 72921,1775 72922,200 72923,72924 72925,364 72926,1140 72926,5547 72927,140 72927,264 72928,2979 72929,83 72931,557 72932,779 72933,557 72934,346 72935,1133 72936,79 72937,219 72938,1551 72939,5547 72940,5547 72941,1143 72942,3003 72943,1127 72944,346 72945,5265 72946,72947 72946,112745 72946,228118 72948,949 72950,192 72951,207 72951,358 72951,366 72951,417 72951,1052 72951,1252 72951,1253 72951,1319 72951,1332 72951,1571 72951,1634 72951,2424 72951,2620 72951,2867 72951,2868 72952,577 72953,1235 72953,1335 72954,809 72955,2572 72956,48505 72957,70524 72958,336 72958,422 72959,137 72960,1285 72961,1201 72962,1858 72963,1860 72964,1072 72965,298 72966,485 72967,338 72968,30 72969,1608 72970,72971 72972,298 72973,485 72974,3895 72975,450 72975,4193 72976,4594 72977,8788 72978,1608 72979,72980 72981,1359 72982,195 72983,72 72984,72985 72986,1983 72987,72988 72989,743 72990,1285 72991,298 72992,485 72993,477 72994,557 72996,72997 72998,358 72999,18726 73000,163 73001,32475 73002,8270 73003,2775 73004,447 73005,493 73007,72 73008,811 73008,1465 73009,1551 73010,393 73011,452 73012,111 73013,73014 73015,1140 73015,2443 73016,149 73016,3194 73017,4597 73018,73019 73020,3297 73021,73022 73021,106675 73023,366 73024,70524 73025,366 73026,366 73027,366 73028,73029 73030,366 73031,1140 73031,5547 73032,70524 73033,70524 73034,366 73035,579 73036,70524 73037,70524 73038,2116 73039,70524 73040,73041 73042,70524 73043,118 73044,70524 73045,70524 73046,676 73047,907 73048,70524 73049,2073 73050,310 73051,70524 73052,1639 73053,70524 73054,577 73055,10 73056,805 73057,872 73058,422 73059,56 73061,70524 73062,5547 73063,70524 73064,1634 73065,422 73066,56 73067,70524 73068,70524 73069,2995 73070,70524 73071,70524 73072,70524 73073,70524 73075,1140 73075,5547 73076,70524 73077,1179 73078,23010 73079,70524 73080,70524 73081,70524 73082,70524 73083,70524 73084,2590 73085,70524 73086,2146 73087,70524 73088,70524 73089,50 73090,7358 73090,7363 73091,151 73092,70524 73093,70524 73094,70524 73095,70524 73096,70524 73097,70524 73098,422 73099,56 73100,8991 73101,5375 73102,70524 73103,70524 73104,70524 73105,5547 73106,70524 73107,70524 73108,70524 73109,3161 73110,4276 73111,4453 73112,393 73113,424 73116,70524 73118,171 73119,70524 73120,493 73121,473 73121,668 73121,712 73121,1313 73122,73123 73122,136215 73124,70524 73125,70524 73126,6068 73127,70524 73128,366 73129,366 73130,366 73131,366 73132,366 73133,10 73134,233 73135,644 73136,70524 73137,70524 73138,298 73139,485 73140,1285 73141,1133 73142,7363 73142,8270 73143,493 73143,1085 73144,364 73144,431 73145,2146 73147,163 73147,302 73147,2116 73148,70524 73149,323 73150,73151 73152,298 73153,485 73154,355 73155,707 73156,70524 73157,70524 73158,70524 73159,2989 73159,2991 73160,515 73162,5405 73162,189303 73163,298 73164,485 73165,44 73166,200 73167,70524 73168,70524 73169,479 73170,70524 73171,70524 73172,195 73172,332 73172,6837 73172,27217 73173,2116 73174,2116 73175,301 73176,70524 73177,3695 73178,298 73179,485 73180,309 73180,310 73180,1509 73181,1893 73182,1140 73182,5547 73183,298 73184,485 73185,10 73185,113156 73187,973 73188,1983 73189,1858 73190,1860 73191,1782 73192,2506 73193,1803 73194,1805 73194,3003 73195,255 73196,8788 73198,389 73199,298 73200,485 73201,192 73202,1140 73202,5547 73203,73203 73204,1801 73205,3209 73206,21944 73207,422 73207,1983 73208,640 73210,3161 73211,1659 73212,73213 73214,70524 73217,73218 73219,1227 73219,1229 73220,1010 73221,779 73222,248 73223,6068 73224,70524 73225,393 73226,70524 73227,393 73228,8822 73229,1579 73230,2995 73231,372 73231,685 73231,1285 73231,1776 73231,118336 73232,158 73232,171 73233,3260 73234,70524 73235,272 73236,310 73237,301 73237,1849 73238,70524 73239,1265 73239,1266 73240,920 73242,70524 73243,70524 73244,360 73245,70524 73246,366 73247,70524 73248,589 73248,1085 73248,6068 73249,217 73250,240 73251,422 73252,422 73253,70524 73254,422 73255,422 73256,19443 73257,70524 73258,70524 73259,278 73259,852 73260,818 73261,68 73262,304 73262,586 73262,694 73262,843 73263,5547 73264,240 73264,1181 73265,356 73265,852 73266,536 73267,422 73269,644 73270,518 73271,422 73272,422 73273,422 73274,422 73275,58 73276,46 73277,83 73278,264 73279,657 73279,44725 73282,20 73283,70524 73284,1858 73285,1860 73286,48 73287,217 73287,240 73287,3623 73288,1619 73288,205627 73289,1458 73290,972 73290,973 73291,5547 73292,5265 73294,346 73295,70524 73296,581 73298,592 73299,1247 73300,310 73300,805 73301,346 73302,733 73303,1858 73304,1860 73305,58 73306,46 73307,589 73308,749 73309,158 73309,1515 73311,749 73312,364 73313,68 73313,1844 73314,872 73315,749 73316,676 73317,1893 73318,171 73319,81 73319,439 73319,588 73319,590 73319,636 73319,841 73319,1033 73319,2674 73320,301 73320,968 73321,477 73322,1282 73323,1425 73324,2146 73325,1634 73326,5440 73328,907 73329,70524 73330,1227 73330,1229 73330,21944 73331,477 73332,920 73333,972 73334,431 73334,631 73334,1411 73335,118 73335,4597 73337,107 73337,346 73337,1888 73338,2178 73338,4545 73339,48 73340,48 73341,346 73342,167 73342,1300 73342,2083 73343,1983 73344,73345 73344,85322 73344,90366 73344,112873 73344,113052 73344,120488 73346,809 73347,5547 73349,48 73350,690 73351,301 73351,1522 73351,2083 73352,70524 73353,1381 73354,48 73355,86 73355,167 73355,968 73355,1293 73355,1359 73355,1837 73355,3207 73355,3422 73355,5301 73355,5662 73356,48 73357,298 73358,485 73359,358 73359,611 73362,163 73363,240 73363,818 73364,333 73364,992 73365,1559 73366,39247 73367,450 73369,298 73370,485 73371,298 73372,485 73373,3161 73374,1983 73375,3003 73376,1220 73376,1222 73376,41170 73377,477 73378,167 73379,2209 73381,1353 73382,7 73382,309 73382,310 73383,5547 73384,1400 73385,2620 73387,240 73388,872 73388,1453 73389,70524 73390,55849 73391,859 73392,1118 73393,1983 73394,48 73395,192 73396,1289 73397,147 73397,567 73397,1227 73397,1229 73397,1572 73397,3182 73398,875 73399,422 73399,602 73399,1204 73401,344 73401,5547 73402,1977 73402,1978 73403,1707 73404,1068 73405,1968 73406,714 73407,602 73408,2979 73409,58 73409,1140 73409,5547 73410,298 73411,485 73412,4355 73413,34 73413,1776 73413,4193 73414,760 73415,30 73416,30 73417,251 73417,252 73417,516 73417,1220 73417,1222 73417,2567 73417,41170 73418,1007 73419,83 73420,1983 73421,22 73421,873 73422,1803 73423,302 73424,346 73425,1140 73425,5547 73426,30 73427,1033 73428,21944 73429,70524 73430,298 73431,485 73432,433 73433,5405 73434,5547 73435,7358 73435,7363 73436,73437 73438,1140 73438,5547 73439,27621 73439,27623 73440,195 73441,225 73441,248 73442,1370 73443,5547 73444,1058 73445,22 73446,1983 73447,1240 73448,392 73449,217 73450,240 73451,455 73451,2424 73454,1274 73455,585 73456,1140 73456,5547 73457,1007 73457,30331 73458,4691 73458,114600 73459,779 73460,467 73461,1955 73462,5547 73463,1983 73464,30 73465,48 73466,315 73467,1858 73468,1860 73469,3507 73470,298 73471,58 73472,46 73473,1849 73474,1983 73475,1844 73476,22 73477,1844 73478,1983 73479,1010 73481,872 73482,298 73483,485 73484,30 73485,3069 73486,30 73487,2979 73488,1983 73489,346 73490,203 73490,2931 73491,1556 73492,980 73493,298 73494,485 73495,346 73496,5212 73497,5547 73498,298 73499,485 73500,1368 73501,1983 73502,392 73503,151 73504,50 73504,111 73504,158 73504,333 73504,538 73504,779 73504,1181 73504,1265 73504,1266 73504,2931 73504,3872 73504,8270 73505,187 73506,1983 73507,500 73509,167 73509,186 73509,301 73509,379 73509,717 73509,968 73509,1010 73509,1231 73509,1326 73509,1370 73509,1411 73509,1782 73509,1837 73509,2557 73509,3804 73510,252 73510,318 73510,1220 73510,1222 73511,298 73512,485 73513,137 73514,1359 73515,158 73516,1105 73517,259 73518,70524 73519,130 73520,4810 73521,5547 73522,70524 73524,1368 73525,1860 73526,420 73527,346 73528,79 73529,1860 73530,3612 73531,595 73532,2274 73533,392 73534,4760 73535,6059 73536,5658 73537,4252 73538,623 73539,697 73540,6955 73541,592 73542,932 73543,70524 73544,298 73545,298 73546,485 73547,259 73548,298 73549,485 73550,801 73550,5547 73551,79 73552,364 73553,333 73554,310 73554,805 73555,1634 73556,862 73556,1085 73556,1474 73556,1789 73556,2205 73556,33424 73558,298 73559,485 73560,483 73560,42009 73561,22 73561,893 73562,1247 73562,7124 73562,9010 73562,17588 73563,717 73564,30 73565,8270 73566,310 73566,805 73567,2574 73568,4771 73569,178 73569,259 73570,167 73570,299 73570,390 73570,459 73570,1085 73570,1167 73570,1284 73570,1319 73570,1436 73570,1522 73570,1616 73570,1837 73570,2083 73570,2479 73570,2979 73570,3207 73570,3407 73570,4286 73570,6712 73570,13252 73570,15588 73570,29759 73570,30253 73570,40513 73570,40987 73570,43346 73570,47153 73570,50565 73570,68733 73570,73660 73570,75912 73570,80310 73570,83321 73570,85459 73570,99759 73570,109838 73570,127858 73570,130798 73570,135145 73570,141050 73570,145187 73570,157363 73570,157375 73570,164357 73570,164449 73570,164879 73570,165005 73570,168526 73570,168778 73570,170638 73570,171204 73570,171295 73570,175310 73570,176096 73570,176645 73570,176776 73570,178611 73570,178695 73570,179041 73570,179575 73570,180115 73570,180991 73570,181021 73570,181110 73570,181279 73570,181290 73570,181835 73570,181901 73570,181906 73570,181950 73570,182002 73570,182077 73570,182327 73570,182446 73570,182508 73570,182521 73570,182554 73570,182620 73570,184948 73570,186532 73570,186651 73570,187534 73570,189876 73570,190469 73570,192899 73570,192915 73570,192952 73570,193627 73570,194494 73570,194517 73570,194603 73570,194611 73570,195984 73570,203101 73570,204098 73570,213752 73570,215383 73570,216755 73570,217335 73570,217992 73570,220347 73570,221163 73570,222421 73570,222510 73570,222652 73570,224029 73570,227233 73570,228432 73570,229660 73570,231071 73570,233956 73570,234686 73570,234815 73570,235274 73570,235944 73570,236100 73570,237828 73570,238691 73570,238778 73570,240432 73570,240973 73570,241317 73570,241878 73570,242187 73570,242285 73570,242412 73570,243639 73570,244135 73570,244612 73570,244733 73570,246033 73570,246039 73570,246077 73570,246443 73570,247178 73570,247223 73570,247746 73570,247790 73570,247974 73570,247977 73570,247998 73570,248014 73570,249179 73570,249303 73570,249830 73570,249866 73570,249885 73570,250066 73570,250649 73570,250814 73570,250926 73570,251498 73570,251923 73570,253395 73570,253397 73570,253801 73570,254392 73570,254444 73570,254565 73570,255137 73570,255612 73570,257026 73570,258373 73570,258917 73570,258940 73570,259358 73570,259554 73570,259560 73570,259655 73570,260016 73570,260929 73570,260938 73570,260949 73570,262305 73570,262313 73570,263393 73570,263936 73570,263943 73570,263952 73571,151 73572,83 73573,104 73573,289 73573,290 73573,298 73573,328 73573,704 73573,714 73573,1282 73573,1402 73573,2105 73573,2205 73573,2206 73573,2286 73573,2572 73573,4218 73573,33424 73573,94134 73574,1531 73575,267 73576,65 73577,65 73578,1240 73579,50 73580,147 73580,1462 73581,7358 73581,7363 73582,1235 73582,1335 73583,5547 73584,1858 73585,1860 73586,346 73587,273 73588,1860 73589,3612 73590,595 73591,2274 73592,392 73593,4760 73594,6059 73595,5658 73596,4252 73597,623 73598,697 73599,6955 73600,1133 73601,171 73602,5906 73603,557 73604,626 73605,278 73606,137 73607,862 73608,192 73608,622 73608,631 73608,841 73608,1033 73608,1181 73608,1388 73608,1531 73609,5547 73610,8719 73611,138 73612,865 73613,557 73614,137 73615,118 73615,4597 73616,56 73617,21944 73618,160 73619,31934 73620,5547 73621,333 73622,1983 73623,676 73624,376 73625,3474 73625,5547 73627,1858 73628,1860 73629,1085 73630,338 73630,389 73631,77 73632,298 73633,485 73634,392 73635,5547 73636,171 73637,406 73639,79 73639,136 73639,192 73639,217 73639,254 73639,6249 73640,30 73641,298 73642,485 73643,779 73644,809 73645,920 73646,346 73647,1858 73648,1860 73649,623 73650,1983 73651,489 73652,1983 73653,1411 73654,7124 73655,1133 73656,2048 73657,3148 73658,151 73658,364 73658,431 73659,1775 73660,1127 73660,1893 73660,2083 73660,2626 73660,3474 73660,49057 73660,73570 73661,30 73661,79 73661,393 73661,406 73661,493 73661,1265 73661,1266 73662,1608 73663,5405 73664,1274 73665,83 73666,364 73667,312 73667,1052 73668,187 73669,338 73670,5547 73671,5547 73672,640 73673,17588 73674,83 73675,1247 73676,32475 73677,338 73678,81 73679,392 73680,1117 73681,202 73681,203 73681,422 73682,44 73683,298 73684,485 73685,1181 73686,447 73687,3161 73688,1133 73689,305 73689,447 73689,538 73689,671 73690,424 73691,5405 73692,5547 73693,34 73693,35 73693,44 73693,50 73693,79 73693,106 73693,147 73693,178 73693,192 73693,195 73693,202 73693,203 73693,215 73693,252 73693,261 73693,285 73693,289 73693,290 73693,301 73693,323 73693,332 73693,336 73693,337 73693,346 73693,406 73693,422 73693,435 73693,439 73693,447 73693,503 73693,516 73693,525 73693,538 73693,585 73693,586 73693,592 73693,640 73693,671 73693,694 73693,760 73693,779 73693,788 73693,862 73693,907 73693,934 73693,968 73693,1085 73693,1175 73693,1220 73693,1222 73693,1247 73693,1326 73693,1370 73693,1425 73693,1515 73693,1531 73693,1722 73693,1732 73693,1782 73693,2178 73693,2205 73693,2244 73693,2296 73693,2567 73693,3085 73693,3804 73693,4455 73693,4545 73693,5726 73693,6119 73693,9007 73693,15573 73693,16019 73693,33424 73693,94134 73694,30 73695,338 73696,140 73696,264 73696,571 73696,1238 73696,1453 73696,6303 73696,7124 73696,16614 73697,107 73697,4771 73698,72 73699,424 73700,10 73701,5212 73702,893 73703,602 73704,602 73705,289 73705,290 73706,273 73707,328 73708,22 73709,30 73710,17334 73711,2351 73712,2995 73713,10 73713,1462 73714,9025 73715,81 73716,493 73717,72 73718,467 73718,155469 73719,32 73720,79 73721,934 73722,435 73723,269 73724,79 73725,70524 73726,298 73727,485 73728,171 73729,298 73730,485 73731,147 73731,406 73732,3422 73733,389 73734,30 73735,9018 73736,1265 73736,1266 73737,58 73737,292 73737,801 73737,1140 73737,1177 73737,1893 73737,2334 73737,2443 73737,3474 73737,5547 73738,346 73739,147 73739,178 73739,346 73739,663 73739,664 73739,779 73739,1247 73740,206 73741,760 73742,38634 73743,50 73743,192 73743,333 73743,1033 73743,4193 73744,483 73745,41 73745,134 73745,137 73745,442 73745,1179 73745,1368 73745,1962 73745,2156 73745,4222 73746,30 73747,6726 73748,6323 73749,1181 73750,30 73751,372 73752,203 73752,2931 73753,30 73754,1243 73755,1181 73756,30 73757,137 73758,73759 73760,2574 73761,30 73762,70524 73763,30 73764,70524 73765,338 73765,586 73765,772 73765,1014 73765,6424 73766,34 73766,1776 73766,4193 73767,3321 73768,70524 73769,8308 73770,70524 73771,1181 73772,1133 73773,222 73773,1462 73774,70524 73775,2590 73776,225 73777,8884 73778,1133 73779,45960 73780,6027 73781,1085 73782,8991 73783,32475 73784,2266 73785,406 73787,10 73787,247 73787,2146 73788,1210 73789,187 73790,850 73791,77 73792,17334 73793,97 73794,8270 73795,450 73795,4193 73796,4276 73797,344 73797,3474 73797,5547 73798,250 73798,424 73798,1634 73798,1684 73798,3467 73799,7416 73800,23010 73801,973 73802,211 73802,7363 73804,479 73804,640 73804,1745 73804,17228 73805,233 73806,5547 73807,18726 73808,160 73809,31934 73810,30 73811,70524 73812,1265 73812,1266 73813,70524 73814,70524 73815,406 73815,779 73816,3413 73817,355 73818,73819 73820,1175 73821,70524 73822,1007 73823,298 73824,485 73825,4672 73826,30 73828,302 73829,298 73830,485 73831,118 73831,4597 73832,79 73833,10 73834,2146 73835,93 73835,94 73836,999 73837,1639 73838,1227 73838,1229 73839,581 73840,46 73840,182 73840,1893 73841,298 73842,485 73843,215 73844,83 73845,1634 73846,1282 73846,4691 73846,6506 73846,90845 73847,298 73848,485 73849,298 73850,485 73851,3960 73852,70524 73853,7360 73854,48 73854,130 73854,1007 73854,1147 73854,3999 73855,298 73856,485 73857,298 73858,485 73859,1323 73860,102 73861,1326 73862,408 73863,298 73864,485 73865,83 73866,30 73867,536 73868,1210 73868,86479 73869,772 73870,70524 73871,493 73871,1266 73872,999 73873,420 73874,160 73875,1983 73876,30 73876,5440 73877,298 73878,485 73879,298 73880,485 73881,2617 73882,3069 73883,302 73884,16045 73885,422 73886,422 73887,422 73888,422 73889,422 73890,422 73891,422 73892,422 73893,422 73894,422 73895,72 73896,779 73897,298 73898,485 73899,1803 73900,10 73901,240 73901,779 73901,68069 73902,1623 73903,248 73904,72 73905,73906 73907,30 73909,158 73910,184 73911,206 73912,73906 73913,328 73913,1247 73913,1572 73913,7124 73914,1247 73915,957 73915,1815 73916,1458 73917,493 73918,1181 73919,175 73920,1368 73921,10 73922,1118 73923,1 73924,6726 73925,784 73926,957 73927,233 73928,602 73929,620 73930,383 73931,1133 73932,336 73933,72 73933,1363 73934,149 73935,336 73936,932 73937,73938 73939,1235 73939,1335 73940,23783 73941,73942 73941,99423 73943,28149 73944,663 73944,664 73945,30331 73946,2995 73947,841 73947,1462 73948,32475 73949,1113 73950,2528 73951,171 73952,682 73952,72439 73953,2244 73954,805 73955,10 73955,147 73955,2867 73955,2868 73956,275 73956,277 73957,874 73958,72 73958,79 73958,147 73958,192 73958,337 73958,772 73958,1181 73958,28203 73960,147 73960,158 73960,1803 73960,8027 73960,88604 73960,94871 73960,102472 73960,102473 73960,102474 73960,102475 73960,102476 73960,102477 73960,102478 73960,102479 73960,102480 73960,102481 73960,102485 73960,102577 73960,102679 73960,102680 73960,102681 73960,102732 73960,102733 73960,102748 73960,102749 73961,30 73962,390 73962,628 73963,8270 73964,420 73965,1118 73965,6051 73966,192 73966,1181 73967,973 73968,211 73968,7363 73969,657 73970,1102 73971,305 73971,2206 73971,33424 73972,219 73972,455 73973,79 73974,1479 73975,376 73976,1411 73977,24763 73978,8308 73980,1265 73980,1266 73981,640 73982,44 73983,1608 73984,72 73985,79 73986,72 73987,192 73988,1462 73988,8537 73989,160 73990,31934 73991,1241 73992,1 73992,5375 73993,10 73993,455 73993,571 73993,868 73993,1832 73994,2867 73994,22880 73995,364 73996,79 73997,79 73998,79 73999,2506 74000,1326 74000,1509 74001,163 74002,79 74003,160 74004,333 74005,79 74006,79 74007,2146 74008,493 74008,1266 74009,79 74010,79 74011,8270 74012,1551 74013,424 74014,704 74015,809 74016,907 74017,452 74018,7124 74019,628 74020,2697 74021,3960 74022,298 74023,485 74024,366 74025,160 74025,336 74025,827 74025,1058 74025,1968 74026,72 74027,2334 74028,2334 74029,72 74030,87 74031,233 74032,19005 74033,72 74034,107 74035,2416 74035,2417 74036,292 74037,338 74038,298 74039,1133 74040,3538 74041,9121 74042,657 74043,2379 74044,355 74045,588 74045,590 74046,2146 74047,240 74048,932 74049,72 74050,346 74051,298 74052,485 74053,222 74054,338 74054,389 74055,1707 74056,298 74057,485 74058,801 74059,602 74060,346 74061,298 74062,485 74063,779 74064,581 74065,211 74066,158 74067,72 74068,406 74069,79 74070,195 74070,247 74070,298 74070,622 74070,1309 74070,3538 74070,8235 74071,1415 74072,4276 74073,1323 74074,102 74075,1326 74076,408 74077,1415 74078,784 74079,1745 74080,2048 74081,240 74082,973 74083,3094 74084,694 74085,1462 74085,8537 74086,422 74087,56 74088,1983 74089,1151 74090,332 74090,934 74090,1776 74091,5405 74092,79 74092,215 74092,1289 74093,4475 74094,1983 74095,1983 74096,18726 74097,151 74098,1 74099,21944 74100,163 74101,4611 74102,483 74103,2944 74104,1 74105,872 74106,79 74107,72 74108,874 74109,483 74110,4810 74111,893 74112,372 74113,158 74114,704 74115,171 74116,175 74117,779 74118,23011 74119,3960 74120,202 74120,206 74120,252 74120,318 74120,1284 74120,1319 74121,10 74122,126 74122,623 74122,1359 74122,1805 74123,79 74124,8270 74125,2995 74126,50 74127,3161 74128,346 74129,184 74130,151 74131,3370 74131,14453 74132,1033 74133,422 74133,991 74134,178 74135,34 74135,35 74135,290 74136,664 74136,7360 74137,1888 74138,1140 74138,5547 74139,1531 74140,34 74140,158 74141,277 74141,1149 74142,1955 74143,664 74143,8991 74145,1556 74146,861 74147,22 74148,298 74148,372 74148,1962 74148,88820 74149,83 74150,222 74150,1462 74152,275 74152,277 74153,1085 74154,872 74155,248 74156,338 74157,805 74158,10 74158,79 74158,2867 74158,2868 74158,22880 74159,805 74160,805 74161,310 74162,310 74163,1983 74164,338 74165,333 74166,41 74167,217 74168,376 74169,79 74170,3804 74171,1955 74172,328 74173,779 74174,72 74175,17228 74176,195 74177,74178 74179,1927 74180,795 74181,72 74182,333 74182,1531 74183,298 74184,485 74185,44 74186,298 74187,485 74188,298 74189,485 74190,298 74191,485 74192,74193 74194,557 74195,557 74196,557 74197,557 74198,862 74199,5405 74200,571 74201,346 74202,79 74203,676 74204,1531 74205,298 74206,485 74207,275 74207,277 74208,1531 74209,1089 74209,1623 74212,158 74213,579 74213,602 74213,626 74213,4823 74213,7194 74214,1707 74215,10 74216,4611 74217,862 74218,3960 74219,1014 74220,1019 74221,79 74221,1323 74222,58 74223,2506 74224,99 74225,72 74226,1467 74227,1010 74228,2775 74229,447 74230,30 74232,1858 74233,1860 74234,439 74234,934 74235,534 74236,5976 74237,72 74238,875 74239,252 74239,318 74240,72 74241,70524 74242,79 74243,968 74244,70524 74246,1140 74246,5547 74247,1309 74248,206 74249,779 74250,5547 74251,72 74252,72 74253,70524 74254,255 74255,2296 74256,104 74257,70524 74258,503 74259,58 74259,1235 74260,302 74261,70524 74262,74263 74262,120505 74264,74263 74264,120505 74265,70524 74266,195 74267,70524 74268,7360 74269,70524 74270,3413 74271,70524 74272,70524 74273,70524 74274,292 74275,332 74275,2995 74276,294 74277,296 74278,298 74279,70524 74280,70524 74281,70524 74282,383 74282,420 74283,4276 74284,420 74285,222 74285,1462 74286,70524 74287,70524 74288,636 74289,70524 74290,70524 74291,70524 74292,70524 74293,7 74294,72 74295,70524 74296,3804 74297,795 74298,3193 74299,525 74300,1001 74301,1436 74302,1238 74303,70524 74304,70524 74305,70524 74306,70524 74307,79 74308,70524 74309,273 74309,459 74309,626 74310,1052 74311,1452 74312,70524 74313,298 74314,485 74315,10 74315,292 74315,337 74315,868 74315,1010 74315,1326 74315,16196 74315,21944 74316,70524 74317,70524 74318,248 74319,644 74320,70524 74321,602 74322,70524 74323,217 74323,222 74324,70524 74325,70524 74326,70524 74327,187 74328,70524 74329,298 74330,485 74331,70524 74332,298 74333,485 74334,70524 74335,1414 74336,298 74337,485 74338,636 74338,841 74338,1276 74338,1745 74338,2286 74339,70524 74340,676 74341,872 74342,668 74343,70524 74344,70524 74345,70524 74346,70524 74347,70524 74348,70524 74349,714 74349,1149 74349,3297 74350,70524 74351,1227 74351,1229 74351,1252 74351,1253 74351,86416 74352,70524 74353,557 74354,70524 74355,372 74355,442 74355,609 74355,1732 74355,2191 74356,70524 74357,424 74358,70524 74359,147 74359,167 74359,217 74359,1001 74359,1608 74359,2083 74360,1181 74362,70524 74363,70524 74364,70524 74365,1181 74366,79 74367,70524 74369,70524 74370,1181 74371,827 74372,1181 74373,70524 74374,344 74375,827 74377,298 74378,485 74379,1858 74380,1860 74381,1655 74382,5547 74383,1860 74384,70524 74385,70524 74386,652 74387,104 74387,254 74387,557 74387,953 74387,954 74387,1368 74388,70524 74389,70524 74390,516 74391,70524 74392,70524 74393,4748 74394,70524 74395,999 74396,70524 74398,455 74399,70524 74400,70524 74401,70524 74402,671 74403,147 74404,3079 74404,6387 74404,7117 74405,70524 74406,184 74407,70524 74408,70524 74409,355 74411,70524 74412,70524 74413,626 74414,70524 74415,301 74415,615 74415,968 74416,1803 74418,70524 74419,694 74420,70524 74421,70524 74422,493 74423,104 74423,134 74423,1882 74424,1119 74425,79 74426,70524 74427,312 74428,422 74429,422 74430,422 74431,422 74432,1127 74433,422 74434,422 74435,1070 74436,794 74437,422 74438,422 74439,422 74440,2646 74441,118 74441,4597 74442,222 74443,422 74444,30428 74447,79 74447,516 74450,70524 74451,30331 74452,671 74453,255 74454,79 74454,577 74454,788 74454,1181 74456,74456 74457,3724 74458,217 74459,79 74460,298 74460,6068 74461,70524 74463,70524 74464,991 74466,1102 74467,333 74468,70524 74469,1749 74470,222 74471,79 74471,1243 74472,70524 74473,70524 74474,467 74475,70524 74476,206 74476,1118 74477,171 74478,304 74478,356 74478,775 74478,852 74478,2334 74479,2205 74479,2206 74480,70524 74482,631 74482,4222 74483,640 74484,640 74485,9015 74486,301 74486,615 74486,968 74486,1293 74487,640 74488,1140 74488,5547 74490,240 74491,70524 74492,72 74493,302 74494,83 74495,340 74496,953 74497,356 74498,2480 74499,70524 74501,298 74502,485 74503,337 74504,17588 74505,215 74505,1010 74505,2210 74505,4237 74506,585 74507,302 74508,298 74509,485 74510,1955 74511,248 74512,298 74513,485 74514,252 74514,318 74514,1220 74514,1222 74515,356 74516,79 74517,160 74517,360 74517,3003 74517,3653 74518,255 74519,1556 74520,868 74521,298 74522,485 74524,298 74525,485 74526,178 74526,439 74526,1776 74527,255 74528,70524 74529,50 74530,195 74531,3804 74533,120 74533,3115 74534,251 74534,465 74535,795 74535,1619 74536,1465 74537,3161 74538,140 74538,1462 74539,32475 74540,2775 74542,75912 74543,1323 74544,102 74545,1326 74546,408 74548,779 74549,4611 74550,72 74551,1070 74551,1096 74552,1181 74553,949 74554,209 74555,278 74555,660 74555,781 74555,1274 74555,1718 74555,5034 74556,1 74556,149 74556,292 74556,435 74556,439 74556,483 74556,493 74556,538 74556,599 74556,868 74556,920 74556,972 74556,1010 74556,1133 74556,1241 74556,1326 74556,1359 74556,1837 74556,1844 74556,2083 74556,21944 74557,809 74558,79 74559,875 74560,2989 74560,2991 74561,21944 74562,338 74563,5547 74565,390 74566,1858 74567,1860 74568,209 74569,346 74570,134 74571,30 74572,338 74573,579 74573,861 74573,1556 74574,467 74574,868 74575,2045 74576,1955 74577,1293 74578,178 74579,209 74580,1531 74581,34 74581,35 74582,841 74585,843 74587,74588 74589,34 74589,35 74590,292 74591,1509 74592,1133 74593,4192 74593,4193 74594,310 74594,7363 74594,8270 74595,850 74596,1858 74597,1860 74598,1707 74599,1238 74600,222 74600,455 74600,1274 74601,628 74602,147 74602,158 74606,17228 74607,215 74609,74610 74611,862 74612,147 74612,911 74612,1844 74613,30 74614,500 74615,147 74615,158 74615,206 74615,1181 74615,1515 74615,2244 74615,30331 74615,42064 74615,80266 74616,1977 74616,1978 74617,6119 74618,1227 74618,1229 74619,147 74619,1276 74619,8332 74620,41 74621,298 74622,485 74623,74624 74623,97005 74626,1238 74627,415 74628,206 74629,15609 74630,1262 74631,941 74632,1181 74633,893 74633,4823 74634,745 74635,167 74635,299 74635,3630 74636,1877 74637,483 74638,801 74639,305 74640,178 74640,195 74640,406 74640,611 74640,740 74640,741 74640,877 74640,1010 74640,1118 74640,1181 74640,1241 74640,1294 74640,1572 74640,1837 74641,1531 74642,392 74643,292 74644,5308 74645,328 74645,8180 74646,171 74647,1070 74649,1425 74650,1370 74651,602 74652,422 74653,70524 74654,406 74655,302 74655,433 74655,538 74655,861 74657,620 74658,222 74658,278 74659,5547 74660,30 74661,298 74662,485 74663,72 74664,344 74665,285 74666,313 74667,68 74668,37 74669,1227 74669,1229 74670,1132 74670,1381 74670,1509 74671,605 74672,589 74673,31934 74674,1181 74675,70524 74676,1140 74677,70524 74678,344 74680,973 74682,72 74683,248 74684,285 74685,626 74685,775 74685,852 74685,3804 74687,973 74687,1707 74688,30 74689,406 74690,5547 74691,46 74692,247 74693,2979 74694,255 74695,309 74695,310 74696,372 74696,599 74696,714 74696,1282 74697,1776 74699,30 74700,99 74700,146 74701,2421 74703,301 74704,30 74704,200 74704,772 74704,4941 74704,28203 74705,1718 74706,493 74706,1266 74707,1181 74708,8270 74709,68 74710,1289 74711,171 74712,255 74713,4691 74714,717 74715,640 74716,211 74716,302 74716,919 74718,195 74718,74719 74720,379 74721,1411 74722,3695 74723,206 74724,6424 74725,30 74726,2979 74728,30 74729,255 74730,258 74731,875 74732,68 74733,455 74734,772 74735,577 74737,79 74738,158 74739,151 74740,195 74741,217 74742,206 74743,292 74744,481 74745,83 74745,143 74745,1204 74745,1844 74745,17346 74746,247 74747,843 74749,1370 74749,1821 74750,697 74751,255 74752,376 74753,298 74754,1749 74755,850 74756,8822 74757,1556 74758,305 74759,252 74759,318 74760,1033 74761,406 74762,872 74763,818 74764,206 74765,2146 74766,772 74767,483 74768,222 74769,30 74771,20 74771,309 74771,310 74771,577 74771,1400 74771,21442 74772,467 74772,868 74773,1078 74774,79 74774,192 74774,406 74774,435 74774,586 74774,980 74774,4192 74774,4193 74775,1181 74776,536 74777,1985 74778,83 74779,1634 74780,2671 74781,557 74782,1252 74782,1253 74783,557 74784,557 74785,557 74786,493 74786,1266 74787,4220 74788,298 74789,79 74790,852 74791,5547 74792,376 74793,885 74794,452 74795,3069 74796,875 74797,83 74798,875 74799,358 74800,184 74801,8270 74802,859 74803,358 74804,83 74805,13361 74806,158 74806,333 74807,1983 74808,664 74808,818 74808,14483 74808,23701 74809,312 74810,74811 74812,310 74813,1392 74814,106 74814,158 74814,192 74814,252 74814,285 74814,306 74814,307 74814,318 74814,337 74814,346 74814,406 74814,435 74814,447 74814,493 74814,516 74814,620 74814,1181 74814,1220 74814,1222 74814,1370 74814,1515 74814,1531 74814,6119 74815,305 74816,58 74817,46 74818,217 74818,1417 74819,74811 74820,147 74821,217 74822,1085 74823,310 74824,74825 74826,44 74827,70524 74828,74829 74828,88894 74828,123068 74830,4 74830,5 74830,65 74830,72 74830,97 74830,140 74830,147 74830,178 74830,184 74830,192 74830,206 74830,209 74830,296 74830,302 74830,304 74830,305 74830,333 74830,340 74830,344 74830,346 74830,431 74830,435 74830,440 74830,444 74830,457 74830,479 74830,491 74830,515 74830,516 74830,536 74830,577 74830,579 74830,589 74830,595 74830,622 74830,652 74830,671 74830,801 74830,809 74830,827 74830,835 74830,841 74830,861 74830,872 74830,918 74830,920 74830,932 74830,968 74830,994 74830,1007 74830,1019 74830,1058 74830,1102 74830,1118 74830,1177 74830,1181 74830,1267 74830,1294 74830,1326 74830,1381 74830,1392 74830,1417 74830,1452 74830,1466 74830,1531 74830,1579 74830,1590 74830,1612 74830,1677 74830,1707 74830,1818 74830,1968 74830,2073 74830,2244 74830,2334 74830,2353 74830,2443 74830,2867 74830,3999 74830,4823 74830,5440 74830,5911 74830,6303 74830,6661 74830,7270 74830,9018 74830,9028 74830,14945 74830,17309 74830,20359 74830,21944 74830,22880 74830,54202 74830,54243 74830,54272 74830,54284 74830,54362 74831,920 74833,247 74834,433 74835,2116 74836,602 74837,1858 74838,1860 74840,41 74841,2116 74842,70524 74843,450 74844,7358 74844,7363 74846,74847 74848,74849 74851,72 74852,323 74853,70524 74854,634 74855,31977 74856,70524 74857,70524 74858,74859 74860,70524 74861,70524 74862,70524 74863,70524 74864,70524 74865,70524 74866,333 74866,980 74866,1388 74866,1531 74866,4455 74866,4545 74866,15573 74866,139010 74867,147 74868,70524 74869,70524 74870,4549 74871,70524 74872,1631 74873,588 74873,590 74875,70524 74876,70524 74877,622 74878,70524 74879,70524 74880,70524 74881,70524 74882,70524 74883,74884 74885,70524 74886,70524 74887,393 74888,70524 74889,74890 74891,70524 74892,70524 74893,77 74894,70524 74895,70524 74896,70524 74897,70524 74898,1467 74899,70524 74900,70524 74901,70524 74902,70524 74903,70524 74904,388 74905,577 74906,2424 74907,70524 74908,70524 74909,2351 74910,70524 74911,1634 74912,74913 74914,70524 74915,70524 74916,577 74917,1871 74918,70524 74919,70524 74920,70524 74921,70524 74922,70524 74923,70524 74924,70524 74925,70524 74926,8990 74927,3161 74928,349 74929,70524 74930,3148 74930,4193 74931,13980 74932,70524 74933,70524 74934,310 74935,72 74936,70524 74937,19986 74938,70524 74939,70524 74940,70524 74941,70524 74943,70524 74944,1 74945,932 74946,22924 74947,818 74948,74949 74948,78294 74948,83620 74948,96438 74948,100982 74948,103273 74948,110412 74948,113219 74948,115368 74948,124662 74948,125656 74948,126202 74948,159561 74950,70524 74951,74952 74953,707 74954,503 74955,323 74956,70524 74957,233 74958,2146 74959,7124 74960,985 74961,70524 74962,994 74963,70524 74964,338 74965,70524 74966,70524 74967,70524 74968,70524 74970,41 74971,20 74971,48 74971,1010 74971,2244 74971,35750 74971,35751 74972,718 74973,1858 74974,1860 74975,1479 74976,70524 74977,70524 74978,70524 74979,622 74980,70524 74981,70524 74982,70524 74983,70524 74984,70524 74985,1858 74986,1860 74987,70524 74988,615 74989,3695 74990,83 74991,83 74992,70524 74993,70524 74994,70524 74995,269 74995,1531 74996,1 74996,7 74996,22 74996,2017 74997,58 74998,46 74999,1877 75000,422 75001,56 75002,86 75003,70524 75004,75005 75004,84781 75004,109370 75006,302 75007,97 75008,70524 75009,302 75010,207 75011,302 75012,70524 75013,70524 75014,252 75014,318 75015,1571 75015,2315 75016,467 75017,745 75018,104 75018,254 75018,557 75018,953 75019,1019 75020,70524 75021,467 75022,140 75023,70524 75024,70524 75025,70524 75026,70524 75027,1639 75028,70524 75029,70524 75030,1001 75031,140 75032,207 75033,70524 75034,70524 75035,4355 75036,32 75037,70524 75038,70524 75039,70524 75040,500 75041,292 75042,70524 75043,70524 75044,875 75045,340 75045,557 75045,671 75045,827 75045,1151 75045,1881 75045,2421 75045,9457 75045,30331 75045,81233 75046,70524 75047,70524 75048,779 75048,1181 75049,70524 75051,14483 75052,70524 75053,861 75054,932 75055,70524 75056,907 75057,972 75058,70524 75059,682 75059,1512 75059,5992 75059,72439 75060,70524 75061,422 75062,70524 75063,422 75064,70524 75065,422 75067,422 75068,70524 75069,422 75070,422 75071,422 75072,422 75073,70524 75074,140 75075,171 75076,70524 75077,422 75078,2797 75079,70524 75080,264 75080,1007 75080,1551 75080,5440 75081,70524 75082,70524 75083,408 75084,875 75084,6955 75085,70524 75086,70524 75089,1968 75090,70524 75091,1973 75092,1411 75093,292 75093,4771 75094,222 75094,1019 75095,1559 75096,140 75096,450 75097,70524 75098,497 75099,70524 75100,81 75101,70524 75102,788 75104,70524 75105,70524 75106,70524 75107,140 75108,8541 75109,70524 75110,70524 75111,1001 75113,6627 75115,70524 75116,70524 75117,70524 75119,21944 75120,623 75120,1805 75121,313 75122,70524 75123,264 75124,70524 75125,30 75126,772 75126,15807 75127,140 75128,83 75129,70524 75130,784 75131,70524 75132,626 75132,720 75132,2045 75132,2146 75132,3194 75132,5405 75133,70524 75134,171 75135,70524 75137,312 75138,640 75139,435 75139,440 75139,467 75140,140 75141,2146 75142,70524 75143,70524 75145,70524 75146,70524 75147,422 75148,240 75149,30 75150,70524 75151,1559 75152,422 75153,304 75153,356 75153,801 75153,5547 75154,70524 75156,5101 75156,15119 75157,70524 75158,70524 75159,70524 75160,70524 75161,422 75162,184 75164,23287 75165,70524 75166,24763 75167,2224 75167,2784 75168,652 75169,70524 75171,872 75172,23287 75173,70524 75174,70524 75175,70524 75176,442 75177,70524 75178,70524 75179,1805 75180,77 75180,862 75181,1058 75182,79 75183,1119 75184,41 75184,68 75184,240 75184,390 75184,431 75184,760 75184,784 75184,805 75184,818 75184,1119 75184,1285 75184,1309 75184,1608 75184,1631 75184,1888 75184,2590 75184,2620 75184,2995 75184,3135 75184,4220 75184,7194 75184,66297 75185,298 75186,30 75187,134 75188,2116 75189,211 75190,775 75190,911 75193,23287 75194,596 75194,5101 75195,1010 75198,202 75198,203 75199,3538 75200,2146 75201,346 75202,346 75203,1801 75204,1370 75204,1821 75204,2782 75205,6323 75209,2590 75210,215 75212,1323 75213,102 75214,1326 75215,408 75217,70524 75218,690 75219,70524 75220,346 75221,575 75222,346 75224,298 75225,485 75226,192 75227,788 75228,2590 75229,861 75229,4453 75230,2353 75231,272 75232,1388 75232,1984 75232,3949 75233,261 75234,158 75235,718 75236,663 75236,664 75237,2590 75238,527 75239,294 75239,631 75239,694 75239,4222 75240,949 75241,811 75242,1612 75243,893 75244,6323 75245,736 75246,1454 75247,5547 75248,493 75249,99 75249,406 75249,602 75249,620 75249,841 75249,1181 75249,240174 75250,1454 75251,1140 75251,5547 75253,251 75253,465 75254,217 75255,920 75256,248 75258,70524 75259,70524 75260,70524 75261,1707 75262,720 75263,6506 75264,805 75264,1326 75264,1955 75266,1977 75266,1978 75267,70524 75268,70524 75269,1715 75269,9018 75270,70524 75271,1796 75272,299 75272,1293 75272,3260 75273,422 75274,56 75275,467 75276,779 75277,81 75278,2266 75279,379 75279,577 75279,1454 75280,312 75282,130 75282,184 75282,422 75282,671 75282,1224 75283,920 75284,422 75285,56 75286,45022 75287,1133 75288,1619 75289,843 75290,372 75291,79 75292,397 75292,1663 75293,467 75293,868 75295,217 75295,301 75295,536 75295,1454 75295,75912 75296,1732 75296,2557 75298,1179 75298,1319 75298,6068 75299,772 75300,1785 75301,338 75303,337 75304,1359 75305,2116 75306,657 75307,14819 75308,302 75309,50 75309,620 75309,1623 75310,850 75311,30 75312,2274 75313,1836 75315,571 75315,2209 75317,30 75318,2209 75319,107 75320,30 75321,30 75322,30 75324,298 75325,485 75326,30 75327,620 75327,2367 75328,225 75329,69394 75330,175 75331,920 75332,50 75333,818 75334,366 75335,649 75335,3999 75336,298 75337,485 75338,467 75340,34 75340,35 75340,313 75340,536 75340,634 75340,1718 75340,2224 75340,2646 75340,5326 75341,805 75342,1181 75343,949 75344,1368 75345,1893 75346,1181 75347,873 75348,217 75349,439 75350,615 75351,290 75351,8855 75352,34 75352,663 75352,664 75353,277 75353,5366 75354,467 75354,1893 75355,852 75356,1608 75357,22 75357,48 75357,79 75357,87 75357,151 75357,163 75357,206 75357,209 75357,217 75357,240 75357,248 75357,358 75357,393 75357,435 75357,439 75357,538 75357,611 75357,622 75357,811 75357,920 75357,1019 75357,1033 75357,1068 75357,1188 75357,1210 75357,1289 75357,1305 75357,1749 75357,1785 75357,1796 75357,1962 75357,2017 75357,2116 75357,2205 75357,2206 75357,2260 75357,2353 75357,2367 75357,2617 75357,3695 75357,4066 75357,4411 75357,5358 75357,8180 75357,8820 75357,9024 75357,9029 75357,13136 75357,13538 75357,13910 75357,14352 75357,14556 75357,19356 75357,36985 75358,34 75358,35 75358,356 75358,852 75359,827 75360,2244 75361,184 75362,217 75362,252 75362,779 75362,920 75362,1033 75362,1181 75363,310 75363,313 75363,849 75363,1285 75363,1319 75363,1368 75363,1566 75363,3039 75364,346 75365,2210 75365,4237 75365,182162 75366,1014 75367,718 75368,70524 75369,298 75370,485 75371,2837 75372,3135 75373,346 75374,2867 75374,22880 75375,818 75376,1019 75377,779 75377,1515 75378,1454 75379,718 75380,207 75381,355 75382,240 75382,372 75383,217 75383,233 75383,240 75383,1417 75383,2334 75384,151 75385,1 75386,868 75387,207 75388,309 75388,310 75389,585 75390,788 75390,1388 75391,222 75392,86 75393,1634 75394,217 75394,301 75394,604 75394,3422 75395,626 75396,30 75397,83 75398,79 75399,2146 75401,1635 75402,30 75403,30 75404,346 75405,30 75406,30 75407,3 75408,21944 75409,247 75410,1033 75411,8788 75412,1381 75413,376 75414,48 75415,4611 75416,30 75417,2286 75418,58 75418,801 75418,1140 75418,1449 75418,3474 75418,4771 75418,5547 75419,346 75420,79 75421,1243 75422,171 75423,349 75424,292 75424,801 75424,1140 75424,1146 75424,3474 75425,818 75427,79 75428,1227 75428,1229 75428,21944 75429,30 75430,483 75431,663 75431,664 75431,2178 75431,4545 75431,56150 75432,640 75433,818 75434,1368 75435,79 75436,298 75437,485 75438,872 75439,1429 75440,298 75441,1132 75442,30 75443,140 75444,267 75445,30 75446,1319 75447,850 75448,668 75449,30 75450,30 75451,30 75452,280 75452,17245 75453,3507 75454,70524 75455,1983 75456,280 75456,17245 75457,72 75458,298 75459,485 75460,30 75461,358 75462,301 75462,687 75462,752 75462,893 75462,1837 75462,2116 75462,2266 75463,7416 75464,30 75465,557 75466,83 75467,843 75468,298 75469,485 75470,158 75471,5547 75472,1608 75472,2424 75472,4903 75473,861 75474,298 75475,485 75476,557 75477,557 75478,195 75479,83 75480,1544 75481,862 75482,644 75483,602 75484,1227 75484,1229 75485,872 75486,1143 75487,30 75488,146 75489,75490 75489,100727 75491,200 75492,184 75493,72 75494,693 75496,3069 75497,2116 75498,346 75499,972 75500,163 75501,1231 75501,1782 75502,75503 75505,17886 75506,338 75506,872 75506,1058 75506,1572 75506,1688 75506,1722 75506,1893 75506,3538 75506,191860 75507,745 75508,1707 75509,422 75510,56 75511,75512 75513,422 75514,56 75515,75516 75517,75518 75519,301 75519,861 75519,893 75519,2979 75520,1556 75521,55849 75522,58 75523,46 75524,589 75525,577 75526,313 75527,313 75528,264 75528,1659 75528,2979 75529,192 75529,1509 75530,1235 75530,1335 75531,7117 75532,75533 75532,95683 75534,75535 75536,75537 75540,516 75541,2784 75542,30 75543,81 75544,247 75545,30 75546,17886 75547,2775 75548,447 75549,346 75550,147 75551,30 75552,338 75555,2590 75557,1 75557,147 75557,149 75557,2244 75558,195 75559,72 75560,314 75560,392 75561,70524 75562,207 75563,30 75564,671 75565,70524 75566,1556 75567,70524 75568,70524 75569,872 75570,75571 75572,1429 75573,83 75574,70524 75575,30 75576,70524 75577,70524 75578,668 75580,1551 75581,75582 75583,75583 75584,75585 75586,72 75587,70524 75588,70524 75589,94 75589,2787 75590,70524 75591,75592 75591,100607 75593,87 75594,70524 75595,75596 75597,70524 75598,640 75599,70524 75600,70524 75601,1181 75602,70524 75603,75604 75605,30 75606,70524 75607,70524 75608,70524 75609,30 75610,70524 75611,2574 75611,75612 75611,83049 75611,104823 75611,120211 75611,121817 75611,124276 75613,70524 75614,70524 75615,1143 75616,70524 75617,70524 75618,70524 75619,70524 75620,70524 75621,72 75622,70524 75623,333 75623,1181 75624,70524 75625,70524 75626,30 75627,70524 75628,70524 75629,640 75630,70524 75631,30 75632,70524 75633,70524 75634,70524 75635,70524 75636,70524 75637,70524 75638,70524 75639,70524 75640,70524 75641,70524 75642,70524 75643,70524 75644,70524 75645,70524 75646,70524 75647,70524 75648,70524 75649,70524 75650,70524 75651,70524 75652,70524 75653,70524 75654,75654 75655,70524 75656,70524 75657,70524 75658,70524 75659,70524 75660,70524 75661,70524 75662,75663 75664,3872 75665,70524 75666,70524 75667,70524 75668,70524 75669,70524 75670,70524 75671,70524 75672,247 75672,2867 75672,22880 75673,70524 75674,70524 75675,70524 75676,70524 75677,70524 75678,70524 75679,70524 75680,70524 75681,70524 75682,70524 75683,70524 75684,70524 75685,70524 75686,70524 75687,70524 75688,70524 75689,70524 75690,70524 75691,70524 75692,70524 75693,70524 75694,872 75695,424 75697,338 75697,623 75698,70524 75699,70524 75700,70524 75701,70524 75702,30 75703,30 75704,70524 75705,70524 75706,70524 75707,640 75708,70524 75709,1220 75709,1222 75710,70524 75711,75712 75713,298 75714,485 75715,70524 75716,233 75717,70524 75718,75719 75718,99463 75720,70524 75721,70524 75722,70524 75723,70524 75724,70524 75725,70524 75726,75727 75728,75727 75729,70524 75730,70524 75731,70524 75732,70524 75733,70524 75734,70524 75735,75736 75737,70524 75738,298 75739,485 75740,70524 75741,70524 75742,70524 75743,70524 75744,79 75744,333 75745,70524 75746,70524 75747,70524 75748,70524 75749,70524 75750,70524 75752,70524 75753,70524 75756,1860 75757,652 75758,16196 75759,467 75760,75761 75762,2116 75763,355 75764,222 75764,932 75764,973 75764,1284 75764,1467 75764,1715 75764,2191 75764,2784 75765,2574 75766,70524 75767,70524 75768,3003 75769,70524 75770,70524 75771,70524 75772,70524 75773,70524 75774,70524 75775,70524 75777,1140 75777,3474 75777,5547 75778,140 75779,30 75780,70524 75781,70524 75783,333 75784,1983 75785,510 75787,379 75788,206 75789,70524 75790,70524 75791,75792 75793,30 75794,167 75794,2083 75795,233 75796,120 75797,70524 75798,41 75798,516 75798,779 75799,252 75799,318 75800,932 75801,872 75802,444 75803,70524 75804,70524 75805,1983 75806,2775 75807,70524 75808,70524 75809,75810 75811,2646 75812,70524 75813,278 75814,652 75815,70524 75817,147 75817,440 75817,5212 75818,70524 75819,333 75819,663 75819,664 75820,784 75821,70524 75822,70524 75823,71 75824,70524 75825,192 75825,309 75825,310 75825,577 75825,2073 75825,2626 75826,1983 75827,79 75828,640 75829,2775 75830,70524 75831,640 75832,640 75833,861 75834,70524 75835,147 75836,1983 75837,83 75838,70524 75839,70524 75840,1718 75840,2646 75842,70524 75843,70524 75844,1801 75845,70524 75846,227 75847,70524 75848,872 75848,7698 75849,70524 75850,70524 75851,481 75852,70524 75853,70524 75854,70524 75855,360 75856,577 75857,70524 75858,70524 75859,595 75859,1688 75859,5540 75860,2931 75862,1849 75863,137 75864,70524 75865,70524 75866,83 75867,1590 75868,75869 75870,70524 75871,70524 75872,240 75873,34 75873,35 75873,2266 75874,1983 75875,1133 75876,147 75876,158 75876,406 75876,779 75877,70524 75878,18726 75879,30 75879,1102 75880,70524 75881,1466 75882,70524 75883,259 75883,493 75883,577 75883,690 75883,788 75883,1001 75883,1531 75884,457 75886,70524 75887,70524 75888,70524 75889,50 75890,71 75890,1224 75891,515 75892,70524 75893,70524 75895,70524 75896,310 75896,3039 75897,70524 75898,571 75898,868 75899,30 75900,70524 75901,70524 75902,70524 75903,422 75904,4355 75906,422 75907,422 75908,422 75909,70524 75910,422 75911,422 75912,1 75912,3 75912,10 75912,34 75912,35 75912,41 75912,46 75912,58 75912,233 75912,240 75912,254 75912,255 75912,294 75912,298 75912,299 75912,301 75912,304 75912,314 75912,327 75912,372 75912,390 75912,397 75912,406 75912,417 75912,425 75912,439 75912,440 75912,444 75912,446 75912,452 75912,457 75912,518 75912,534 75912,535 75912,573 75912,589 75912,590 75912,592 75912,596 75912,599 75912,631 75912,632 75912,676 75912,685 75912,693 75912,714 75912,720 75912,733 75912,765 75912,775 75912,784 75912,788 75912,794 75912,795 75912,805 75912,810 75912,818 75912,838 75912,849 75912,852 75912,862 75912,872 75912,911 75912,932 75912,950 75912,972 75912,1001 75912,1010 75912,1011 75912,1014 75912,1045 75912,1085 75912,1118 75912,1119 75912,1130 75912,1133 75912,1181 75912,1191 75912,1195 75912,1220 75912,1222 75912,1262 75912,1282 75912,1284 75912,1285 75912,1300 75912,1402 75912,1417 75912,1445 75912,1459 75912,1462 75912,1464 75912,1505 75912,1518 75912,1522 75912,1564 75912,1566 75912,1572 75912,1580 75912,1663 75912,1715 75912,1796 75912,1825 75912,1844 75912,1973 75912,2069 75912,2095 75912,2191 75912,2193 75912,2204 75912,2224 75912,2253 75912,2296 75912,2373 75912,2511 75912,2512 75912,2572 75912,2747 75912,2995 75912,3488 75912,3504 75912,3507 75912,3524 75912,3582 75912,3623 75912,3724 75912,3841 75912,3944 75912,4222 75912,4308 75912,4415 75912,4514 75912,5186 75912,5472 75912,5486 75912,5695 75912,5851 75912,5961 75912,6004 75912,6068 75912,6474 75912,6837 75912,6904 75912,7109 75912,7117 75912,7194 75912,7386 75912,7759 75912,7790 75912,8261 75912,8537 75912,8807 75912,8884 75912,9028 75912,9342 75912,9457 75912,13412 75912,13657 75912,14011 75912,14358 75912,14414 75912,14674 75912,15109 75912,15221 75912,15254 75912,15259 75912,15386 75912,16192 75912,16524 75912,16955 75912,17116 75912,19061 75912,19560 75912,19592 75912,19798 75912,20757 75912,21589 75912,21721 75912,22268 75912,22389 75912,23468 75912,25385 75912,26032 75912,28545 75912,28832 75912,30373 75912,31794 75912,32692 75912,32725 75912,33339 75912,33764 75912,34117 75912,34876 75912,35561 75912,36755 75912,36761 75912,37743 75912,38770 75912,38822 75912,42839 75912,44725 75912,49027 75912,49121 75912,51666 75912,51972 75912,55827 75912,61089 75912,62461 75912,64026 75912,64197 75912,70032 75912,70981 75912,72677 75912,73248 75912,74542 75912,75295 75912,75912 75912,75936 75912,76037 75912,76704 75912,76836 75912,76971 75912,77551 75912,77743 75912,78621 75912,78672 75912,79235 75912,79238 75912,79240 75912,79242 75912,79528 75912,80268 75912,80354 75912,80368 75912,80464 75912,81239 75912,81508 75912,81563 75912,82568 75912,82587 75912,82731 75912,82735 75912,82741 75912,83151 75912,83159 75912,83160 75912,83161 75912,83162 75912,83164 75912,83167 75912,83220 75912,83222 75912,83317 75912,83383 75912,83920 75912,84377 75912,84381 75912,84382 75912,84385 75912,84402 75912,85702 75912,85705 75912,85716 75912,85717 75912,85723 75912,86582 75912,86619 75912,88596 75912,89040 75912,90079 75912,90192 75912,90620 75912,91749 75912,92838 75912,93038 75912,93040 75912,93053 75912,93526 75912,93707 75912,93752 75912,94156 75912,94870 75912,94873 75912,94876 75912,95301 75912,95365 75912,95585 75912,95757 75912,96649 75912,97867 75912,97897 75912,98772 75912,99756 75912,101466 75912,101473 75912,101475 75912,103822 75912,103910 75912,104275 75912,104277 75912,104305 75912,104564 75912,105327 75912,105496 75912,106892 75912,107417 75912,107885 75912,109834 75912,112212 75912,112727 75912,114364 75912,115474 75912,120830 75912,121863 75912,123664 75912,125866 75912,126694 75912,127158 75912,127171 75912,127173 75912,127179 75912,127216 75912,127217 75912,127218 75912,127220 75912,127843 75912,129696 75912,129745 75912,129855 75912,129869 75912,130755 75912,130756 75912,130762 75912,130764 75912,130765 75912,130766 75912,130767 75912,130768 75912,131211 75912,132935 75912,135918 75912,137974 75912,137991 75912,138094 75912,138114 75912,138116 75912,138143 75912,139918 75912,141073 75912,143238 75912,145128 75912,145235 75912,145386 75912,147810 75912,147888 75912,158950 75912,160884 75912,165214 75912,165344 75912,167667 75912,168470 75912,169878 75912,170595 75912,171053 75912,171727 75912,172522 75912,178576 75912,180936 75912,182303 75912,185874 75912,185877 75912,189196 75912,194403 75912,199161 75912,207659 75912,212692 75912,212916 75912,215874 75912,215915 75912,216138 75912,216519 75912,216522 75912,216621 75912,216634 75912,216636 75912,216639 75912,216640 75912,216705 75912,216711 75912,216716 75912,216719 75912,220268 75912,220285 75912,221068 75912,222501 75912,223719 75912,225328 75912,228841 75912,229559 75912,229824 75912,230254 75912,234677 75912,242949 75912,243185 75912,245975 75912,249055 75912,255475 75912,256175 75912,256178 75912,256183 75912,264559 75913,70524 75914,422 75915,70524 75916,70524 75917,70524 75918,70524 75919,422 75920,70524 75921,392 75922,70524 75923,70524 75924,801 75924,1177 75924,2443 75924,3474 75925,70524 75926,70524 75927,70524 75928,70524 75929,70524 75930,70524 75931,408 75932,200 75933,70524 75934,2116 75935,147 75938,30 75939,70524 75940,171 75941,70524 75942,1323 75943,102 75944,1326 75945,408 75946,30 75947,70524 75948,604 75949,70524 75950,70524 75951,493 75952,149 75953,70524 75955,70524 75956,70524 75958,70524 75960,493 75961,70524 75963,907 75965,70524 75968,70524 75969,805 75970,70524 75971,694 75973,240 75974,70524 75976,70524 75978,70524 75980,70524 75981,70524 75982,827 75982,1326 75983,20 75984,70524 75985,70524 75986,70524 75987,10 75988,70524 75989,309 75989,310 75990,70524 75991,70524 75992,579 75992,682 75992,2373 75992,72439 75993,70524 75994,70524 75995,70524 75996,136 75997,304 75997,795 75998,70524 75999,70524 76000,83 76001,70524 76002,70524 76003,1007 76004,70524 76005,70524 76006,70524 76007,70524 76008,1326 76009,1805 76010,70524 76011,1707 76012,1983 76013,111 76015,682 76015,1858 76016,70524 76017,70524 76018,70524 76019,1977 76019,1978 76021,76020 76021,233740 76021,240223 76022,1955 76023,70524 76024,1089 76025,346 76026,70524 76027,70524 76028,2334 76029,76030 76029,85338 76029,89034 76029,92382 76029,97133 76029,98726 76029,106729 76029,114770 76029,114934 76029,114968 76029,117366 76029,119635 76029,120049 76029,123730 76029,124258 76029,126429 76029,131307 76029,131327 76029,132608 76031,70524 76032,70524 76033,3069 76034,70524 76035,70524 76036,70524 76037,75912 76038,3724 76039,1265 76039,1266 76040,264 76040,1007 76040,1551 76041,718 76042,76043 76042,81868 76044,2105 76045,1556 76046,1509 76047,682 76048,6837 76049,1860 76050,184 76050,1891 76051,1782 76052,467 76054,457 76055,4895 76056,1531 76057,1238 76058,146 76058,15807 76059,163 76059,2116 76060,1 76060,20 76060,86 76060,118 76060,675 76060,957 76060,1815 76060,1893 76060,2605 76060,4597 76061,70524 76062,70524 76063,70524 76064,772 76065,70524 76066,70524 76067,70524 76068,70524 76069,70524 76070,70524 76071,70524 76072,1140 76072,5547 76073,70524 76074,70524 76075,1140 76076,70524 76078,557 76078,1939 76079,217 76080,97 76080,313 76080,406 76080,435 76080,516 76080,622 76080,1370 76081,309 76081,310 76081,1623 76081,6556 76082,10 76082,175 76083,76084 76085,1531 76087,1241 76088,18726 76089,19010 76090,1381 76092,55849 76093,1858 76094,1860 76096,167 76096,392 76096,779 76096,127158 76097,298 76098,485 76099,516 76099,599 76099,1531 76100,70524 76101,287 76101,338 76101,862 76101,27041 76102,70524 76103,70524 76104,1749 76104,14550 76105,70524 76106,663 76106,664 76106,1849 76107,70524 76108,21944 76108,79349 76109,70524 76110,1858 76111,1860 76112,70524 76113,70524 76114,70524 76115,70524 76116,70524 76117,70524 76118,70524 76119,70524 76120,70524 76121,70524 76122,70524 76123,298 76124,485 76125,2421 76126,70524 76127,406 76128,346 76129,447 76129,752 76130,1551 76131,70524 76132,859 76133,70524 76134,356 76134,631 76135,70524 76137,252 76137,318 76138,70524 76139,1462 76139,8537 76140,843 76141,34 76141,35 76141,283 76141,455 76141,949 76141,2266 76142,467 76142,868 76144,313 76145,644 76145,1132 76145,1238 76146,70524 76147,72 76147,81 76147,111 76147,215 76147,227 76147,233 76147,312 76147,372 76147,388 76147,557 76147,605 76147,626 76147,1085 76147,1140 76147,1149 76147,1179 76147,1238 76147,1479 76147,1572 76147,2209 76147,3538 76147,3695 76147,8798 76147,9018 76147,14797 76147,33611 76148,1 76149,885 76150,1010 76151,1118 76152,251 76152,465 76152,1927 76153,48 76154,875 76155,21944 76156,2244 76157,206 76158,79 76159,843 76160,298 76161,485 76162,779 76163,72 76164,147 76164,158 76165,70524 76166,70524 76167,852 76168,70524 76170,140 76170,515 76171,2867 76171,2868 76171,22880 76172,147 76173,102 76174,577 76175,21944 76176,1274 76177,346 76178,483 76179,2697 76181,356 76181,442 76181,862 76181,1368 76181,185877 76182,111 76182,240 76182,503 76182,932 76182,1085 76182,1462 76182,1818 76182,2205 76182,2206 76182,4355 76182,8537 76182,33424 76182,245910 76183,366 76183,500 76184,151 76186,34 76186,35 76186,261 76186,313 76186,431 76186,442 76186,518 76186,609 76186,626 76186,634 76186,749 76186,775 76186,818 76186,1001 76186,1235 76186,1285 76186,1313 76186,1335 76186,1715 76186,1718 76186,2209 76186,2443 76186,2646 76186,3474 76186,3804 76186,5326 76186,13575 76186,15807 76186,21711 76187,70524 76188,72 76189,30 76190,1882 76191,41 76191,97 76191,285 76191,640 76191,668 76192,3 76192,34 76192,35 76192,63 76192,106 76192,158 76192,178 76192,192 76192,202 76192,203 76192,217 76192,251 76192,252 76192,318 76192,337 76192,346 76192,435 76192,465 76192,516 76192,586 76192,622 76192,640 76192,663 76192,664 76192,694 76192,1175 76192,1181 76192,1220 76192,1222 76192,1243 76192,1294 76192,1370 76192,1590 76192,1635 76192,2567 76192,2931 76192,3161 76192,4192 76192,4193 76192,5874 76192,5976 76192,6119 76192,8598 76192,8771 76192,8811 76192,8822 76192,8907 76192,16201 76193,852 76194,861 76195,120 76196,1085 76197,1623 76198,116 76198,2087 76199,467 76199,1345 76199,9457 76200,920 76201,579 76202,1801 76203,298 76204,485 76205,71 76207,1556 76208,1293 76208,1818 76208,2620 76208,5718 76209,1467 76210,104 76211,30 76212,628 76212,7358 76212,7363 76213,1368 76214,1939 76215,4192 76215,4193 76216,70524 76217,1983 76218,1241 76220,298 76221,485 76222,5343 76223,581 76224,18726 76225,298 76226,485 76227,602 76228,192 76228,6323 76229,163 76230,390 76231,346 76232,160 76233,328 76233,1608 76236,602 76238,772 76239,99 76240,58 76241,46 76242,850 76243,422 76244,56 76245,76246 76247,247 76248,298 76249,485 76250,48 76251,76252 76251,77291 76251,79805 76251,81622 76251,85296 76251,85394 76251,89845 76251,99841 76253,561 76254,3999 76256,83 76257,652 76258,72 76263,1149 76263,1631 76264,30 76265,6682 76276,1608 76277,30 76282,557 76283,107 76284,557 76285,2244 76286,76287 76288,298 76289,2367 76290,602 76291,76292 76293,65 76293,184 76293,195 76293,222 76293,571 76293,1572 76293,1837 76293,2089 76293,2940 76293,3297 76293,21944 76295,310 76296,147 76296,158 76296,206 76296,254 76296,406 76296,455 76296,779 76296,1282 76296,5343 76297,19413 76298,430 76299,577 76300,76301 76302,2797 76303,76304 76305,217 76305,1417 76306,76307 76308,79 76309,994 76310,76311 76312,366 76313,81 76314,298 76315,485 76316,602 76316,611 76316,1001 76316,5101 76317,76318 76319,70524 76320,1983 76321,76322 76323,1007 76324,280 76324,17245 76325,333 76326,1140 76326,3474 76326,5547 76327,417 76328,1 76330,43203 76331,4039 76332,140 76334,602 76335,1860 76336,30 76337,602 76338,147 76338,1462 76339,349 76340,1634 76341,479 76342,44 76343,626 76344,70524 76345,676 76346,70524 76347,192 76347,663 76347,1089 76348,76349 76350,151 76351,250 76351,1684 76352,70524 76353,76354 76355,602 76356,70524 76357,832 76358,50 76358,79 76358,393 76358,406 76358,493 76358,585 76358,586 76358,592 76358,704 76359,70524 76360,70524 76361,2351 76362,15573 76363,70524 76364,70524 76365,76366 76365,105351 76367,4475 76368,70524 76369,70524 76370,843 76371,70524 76372,70524 76373,70524 76374,70524 76375,70524 76376,70524 76377,4193 76377,8598 76378,850 76379,70524 76380,70524 76381,70524 76382,714 76383,70524 76384,70524 76385,70524 76386,261 76386,333 76386,1985 76387,70524 76388,17588 76389,2048 76390,1133 76391,272 76391,7363 76392,70524 76393,70524 76394,70524 76395,70524 76396,76397 76398,70524 76399,76397 76401,70524 76402,76403 76404,70524 76405,920 76406,70524 76407,2590 76408,70524 76409,70524 76410,72 76411,70524 76412,70524 76413,70524 76414,70524 76416,70524 76417,70524 76418,79 76418,704 76419,70524 76420,70524 76421,70524 76422,70524 76423,70524 76424,70524 76425,70524 76426,70524 76427,70524 76428,70524 76429,70524 76430,70524 76431,70524 76432,70524 76433,70524 76434,66 76434,1531 76435,70524 76436,70524 76437,70524 76438,70524 76439,70524 76440,70524 76441,70524 76442,70524 76443,8270 76444,70524 76445,70524 76446,1007 76447,70524 76448,70524 76449,70524 76450,70524 76451,70524 76452,1010 76453,76454 76455,1363 76456,70524 76457,298 76458,70524 76459,557 76460,70524 76462,70524 76463,671 76464,70524 76465,70524 76466,70524 76467,70524 76468,147 76469,70524 76470,70524 76471,70524 76472,70524 76473,70524 76474,70524 76475,70524 76476,620 76476,1515 76477,70524 76478,251 76478,465 76478,1531 76478,2567 76479,70524 76480,70524 76481,70524 76482,70524 76483,70524 76484,76485 76486,70524 76487,70524 76488,70524 76489,70524 76490,70524 76491,70524 76492,70524 76493,70524 76494,1238 76495,70524 76496,70524 76497,70524 76498,70524 76499,1452 76500,70524 76501,70524 76502,70524 76503,70524 76504,70524 76505,70524 76506,217 76507,70524 76508,70524 76509,70524 76510,70524 76511,70524 76512,70524 76513,70524 76514,3246 76515,30 76516,70524 76517,70524 76518,70524 76519,70524 76520,70524 76521,70524 76523,70524 76524,70524 76525,70524 76526,30 76527,30 76528,70524 76529,70524 76530,70524 76531,70524 76532,70524 76533,8270 76534,70524 76535,13 76536,70524 76537,2116 76538,70524 76539,349 76540,70524 76541,70524 76542,70524 76543,70524 76544,70524 76545,70524 76546,17309 76547,70524 76548,76549 76550,70524 76551,376 76552,70524 76553,70524 76554,76555 76556,233 76557,70524 76558,70524 76559,70524 76560,70524 76561,70524 76562,70524 76563,70524 76564,70524 76565,70524 76566,70524 76567,70524 76568,70524 76569,70524 76570,70524 76571,222 76571,592 76571,1818 76572,70524 76573,70524 76574,70524 76575,518 76576,70524 76577,70524 76578,70524 76579,2697 76580,8270 76581,70524 76582,1983 76583,70524 76584,70524 76585,70524 76586,76587 76588,70524 76589,70524 76590,70524 76591,30 76592,70524 76593,70524 76595,70524 76596,70524 76597,70524 76598,4101 76599,70524 76600,70524 76601,70524 76602,805 76603,70524 76604,70524 76605,70524 76606,298 76607,485 76608,47 76608,2469 76609,70524 76610,70524 76611,70524 76612,652 76613,70524 76614,76615 76616,70524 76617,70524 76618,70524 76619,70524 76620,70524 76621,70524 76622,70524 76623,70524 76624,868 76625,70524 76626,70524 76627,70524 76628,70524 76629,70524 76631,70524 76632,444 76633,70524 76634,422 76635,56 76636,1559 76637,70524 76638,70524 76639,70524 76640,1267 76641,70524 76642,119 76643,79 76644,70524 76645,70524 76646,70524 76647,70524 76648,192 76650,355 76651,70524 76652,70524 76653,70524 76654,70524 76656,70524 76658,70524 76659,70524 76660,516 76661,483 76662,70524 76663,70524 76664,70524 76665,55849 76666,70524 76667,70524 76668,76669 76670,70524 76671,76672 76673,70524 76674,94 76674,2787 76675,70524 76676,70524 76677,76678 76677,168333 76677,222692 76677,234264 76679,46 76679,1124 76680,70524 76681,70524 76682,70524 76683,70524 76684,604 76685,980 76686,70524 76687,70524 76688,70524 76689,2775 76690,447 76691,70524 76692,70524 76693,70524 76694,70524 76695,70524 76696,660 76697,70524 76698,70524 76699,76700 76701,1132 76702,781 76703,70524 76705,3 76705,388 76705,510 76706,70524 76707,422 76708,56 76709,862 76710,70524 76711,70524 76712,70524 76713,70524 76714,70524 76715,30 76715,333 76715,622 76716,70524 76718,726 76719,70524 76720,1370 76720,2782 76720,3876 76721,70524 76722,1414 76722,1608 76723,1140 76724,70524 76725,422 76726,171 76727,422 76728,422 76729,422 76730,70524 76731,25 76731,2088 76732,240 76732,818 76733,850 76734,422 76735,358 76735,611 76736,70524 76737,422 76738,422 76739,422 76740,70524 76741,76742 76743,1858 76744,1860 76745,430 76746,932 76747,70524 76749,175 76749,309 76749,310 76749,1177 76749,2210 76749,6556 76750,70524 76751,70524 76752,8270 76753,70524 76754,70524 76756,70524 76757,70524 76758,1359 76759,79 76760,70524 76761,70524 76762,70524 76763,406 76763,1181 76765,70524 76766,70524 76767,70524 76768,70524 76769,70524 76770,7757 76771,422 76772,56 76773,70524 76774,1381 76775,70524 76776,999 76777,70524 76778,70524 76779,70524 76780,70524 76781,83 76782,70524 76783,70524 76784,70524 76786,70524 76787,1381 76788,907 76788,2191 76789,6323 76790,70524 76791,444 76791,1608 76791,2574 76791,76792 76791,84173 76791,86074 76791,90536 76791,92214 76791,96867 76791,105286 76791,105426 76791,108308 76791,109714 76791,111247 76791,111784 76791,116330 76791,120298 76791,120328 76791,120798 76791,121120 76791,122754 76791,122817 76791,125685 76793,70524 76794,70524 76796,70524 76797,1381 76798,70524 76799,5591 76800,604 76801,652 76804,8994 76805,510 76806,70524 76807,70524 76808,509 76809,70524 76810,3 76811,1181 76812,70524 76813,275 76813,313 76813,775 76813,1381 76813,2782 76814,70524 76815,58 76815,126 76815,441 76815,535 76815,872 76816,70524 76817,1515 76818,1572 76819,6424 76820,192 76820,663 76820,1089 76821,312 76822,70524 76823,70524 76824,3538 76825,76826 76827,338 76828,104 76829,79 76830,178 76831,2697 76832,70524 76833,70524 76834,2116 76835,1 76835,147 76835,149 76835,158 76835,171 76835,184 76835,606 76835,1623 76835,2438 76835,26841 76835,39437 76835,65723 76835,71303 76835,77571 76835,87870 76835,112537 76835,151045 76836,75912 76837,76838 76839,1858 76840,1860 76841,1243 76842,70524 76843,79 76844,663 76844,664 76845,149 76846,70524 76848,70524 76849,2915 76850,147 76850,149 76850,184 76850,1425 76851,346 76852,70524 76853,1707 76855,302 76856,809 76857,219 76858,76859 76860,1149 76861,79 76862,70524 76863,467 76864,30 76865,70524 76866,106 76866,192 76866,337 76866,435 76866,447 76866,726 76866,1388 76866,3989 76866,6119 76867,333 76868,70524 76870,467 76870,868 76871,70524 76873,70524 76874,207 76875,7358 76875,7363 76876,217 76877,467 76878,1663 76879,1801 76880,70524 76881,1313 76882,664 76882,809 76882,1191 76882,3999 76883,726 76884,1858 76885,1860 76886,70524 76887,1556 76888,1140 76888,3474 76889,1323 76890,102 76891,1326 76892,408 76893,147 76893,195 76893,118336 76894,302 76894,893 76895,34 76895,35 76895,283 76895,455 76895,536 76895,949 76895,2266 76897,861 76897,2116 76898,1381 76899,862 76899,1381 76901,673 76902,43203 76903,70524 76904,15523 76906,1274 76907,70524 76908,1381 76909,859 76910,726 76911,1414 76912,4276 76913,4146 76914,2590 76915,278 76916,30428 76918,76919 76920,602 76921,467 76921,868 76922,3 76923,1977 76923,1978 76924,557 76924,1082 76925,171 76926,298 76927,485 76928,3194 76929,392 76930,602 76931,76932 76933,366 76934,366 76935,422 76935,602 76936,422 76937,56 76938,1849 76939,557 76939,1082 76940,310 76941,907 76942,70524 76943,1849 76944,859 76944,1429 76945,70524 76947,178 76948,7358 76948,7363 76949,76950 76951,37414 76952,79 76952,192 76952,483 76952,714 76952,1424 76952,2371 76952,2617 76952,32914 76952,58979 76952,88266 76953,1616 76954,163 76954,2116 76955,70524 76956,875 76957,70524 76959,247 76960,1313 76961,58 76962,46 76963,422 76964,56 76965,467 76966,310 76967,1381 76968,217 76968,455 76969,809 76969,920 76969,1844 76970,392 76972,304 76973,1210 76973,2372 76973,2480 76973,2979 76974,5405 76976,861 76977,9166 76978,1522 76979,868 76981,2574 76982,298 76983,485 76984,298 76985,485 76986,298 76987,485 76989,392 76989,1590 76989,1644 76991,1881 76993,393 76993,980 76993,1096 76994,422 76995,56 76996,217 76996,3507 76996,3804 76998,809 77000,2373 77001,70524 77003,390 77004,70524 77005,83 77007,366 77008,41 77008,68 77008,240 77008,294 77008,431 77008,631 77008,760 77008,784 77008,805 77008,818 77008,1119 77008,1285 77008,2995 77008,3135 77008,9021 77009,366 77010,366 77011,366 77012,366 77013,37 77014,206 77015,2379 77016,417 77017,861 77018,366 77019,750 77021,366 77022,1381 77023,422 77024,56 77025,366 77027,422 77028,56 77029,366 77030,3209 77031,77032 77033,70524 77034,83 77035,358 77035,440 77036,1001 77037,1235 77037,1335 77039,149 77040,640 77041,206 77042,4222 77043,1 77044,7572 77046,79 77047,602 77049,647 77049,1175 77050,83 77051,1556 77052,861 77053,22 77054,422 77055,56 77057,264 77058,298 77059,485 77060,1515 77060,30331 77061,273 77062,602 77063,77064 77065,151 77066,1849 77067,1564 77068,1955 77069,1893 77070,422 77071,56 77072,3804 77073,1715 77074,1231 77075,390 77076,3422 77077,5662 77078,968 77079,233 77080,3 77081,1001 77082,63 77083,14797 77084,518 77085,77086 77087,1449 77088,3 77088,510 77089,1432 77090,24763 77091,149 77091,184 77091,900 77091,1425 77092,1319 77093,1436 77094,30 77095,1287 77096,298 77097,485 77098,222 77098,1019 77099,9029 77100,615 77102,602 77103,626 77104,301 77104,968 77104,1782 77105,79 77105,1807 77106,1608 77107,1247 77109,518 77110,4691 77111,2421 77112,111 77113,10 77113,113156 77114,919 77115,79 77116,356 77116,2334 77117,682 77118,1962 77119,663 77119,664 77120,473 77121,376 77122,862 77123,247 77124,1639 77125,2443 77125,77126 77127,301 77127,604 77127,968 77128,907 77128,1462 77128,8537 77129,30 77130,2315 77131,640 77132,2146 77133,668 77134,333 77135,252 77135,318 77136,77137 77138,55849 77139,2367 77140,1458 77141,247 77142,261 77143,310 77144,5358 77144,14352 77147,2191 77148,59 77148,3794 77150,30 77151,1235 77151,1335 77152,83 77153,422 77154,56 77155,1983 77156,1983 77158,422 77159,56 77160,1983 77161,77162 77161,82456 77161,93408 77163,10 77164,934 77165,31896 77166,151 77167,1608 77168,4903 77169,417 77170,536 77171,640 77172,1515 77173,77174 77175,225 77177,1058 77178,77179 77180,2617 77182,72 77184,4 77184,5 77184,22 77184,65 77184,72 77184,119 77184,192 77184,195 77184,206 77184,209 77184,217 77184,248 77184,305 77184,340 77184,435 77184,442 77184,479 77184,491 77184,536 77184,595 77184,622 77184,628 77184,818 77184,861 77184,872 77184,893 77184,920 77184,994 77184,1019 77184,1052 77184,1305 77184,1417 77184,1466 77184,1612 77184,1639 77184,1644 77184,1818 77184,1893 77184,2017 77184,2073 77184,2209 77184,2353 77184,2443 77184,2617 77184,4039 77184,4823 77184,8541 77184,9018 77184,9029 77184,13538 77184,13910 77184,17309 77184,20359 77184,21944 77185,72 77186,72 77187,77188 77189,872 77190,267 77191,2048 77192,435 77193,1085 77194,338 77196,1556 77197,392 77197,697 77198,32 77198,34 77198,35 77198,50 77198,63 77198,99 77198,106 77198,134 77198,192 77198,195 77198,215 77198,217 77198,233 77198,251 77198,252 77198,272 77198,289 77198,290 77198,298 77198,318 77198,323 77198,332 77198,333 77198,336 77198,337 77198,392 77198,393 77198,406 77198,430 77198,447 77198,465 77198,493 77198,516 77198,525 77198,585 77198,586 77198,592 77198,609 77198,615 77198,620 77198,622 77198,663 77198,664 77198,779 77198,788 77198,805 77198,862 77198,907 77198,925 77198,980 77198,1001 77198,1010 77198,1033 77198,1220 77198,1222 77198,1231 77198,1294 77198,1326 77198,1388 77198,1425 77198,1515 77198,1531 77198,1551 77198,1722 77198,1955 77198,2205 77198,2206 77198,2210 77198,2334 77198,2567 77198,2782 77198,2931 77198,3115 77198,3148 77198,3321 77198,3804 77198,4237 77198,6119 77199,557 77200,557 77201,1181 77202,1227 77202,1229 77202,1252 77202,1253 77202,86416 77203,338 77204,1983 77205,9457 77206,77207 77208,77209 77210,151 77211,338 77212,376 77213,151 77214,827 77215,65 77216,217 77217,707 77219,283 77220,1623 77221,252 77221,318 77222,417 77223,885 77224,10 77225,338 77226,346 77227,1432 77228,6682 77229,77230 77231,18726 77232,338 77233,859 77234,70524 77235,1564 77236,6387 77237,184 77238,1068 77239,272 77240,1381 77241,736 77243,588 77243,590 77244,338 77245,3089 77247,77248 77249,1 77250,338 77251,1087 77252,644 77253,77254 77255,422 77256,422 77257,338 77258,596 77259,146 77259,158 77259,192 77259,202 77259,285 77259,620 77259,1893 77259,92476 77260,77261 77262,8180 77264,44 77265,151 77266,697 77267,1634 77268,77269 77270,346 77271,483 77272,4980 77273,10 77274,1858 77275,1860 77278,1782 77279,1858 77280,1860 77281,72 77282,393 77283,72 77284,1634 77285,72 77286,77287 77288,6695 77290,640 77292,70524 77294,2421 77296,1623 77297,422 77298,175 77299,77300 77299,119706 77301,250 77301,1684 77302,77303 77304,35687 77305,77306 77307,70524 77308,77309 77310,147 77310,149 77311,70524 77312,70524 77313,70524 77314,72 77315,1608 77315,77315 77316,77317 77318,1551 77319,70524 77320,77321 77322,77323 77326,70524 77327,70524 77328,70524 77329,298 77330,485 77331,70524 77332,34 77332,35 77333,289 77333,290 77334,70524 77335,70524 77337,70524 77338,422 77339,56 77340,70524 77341,422 77342,56 77343,70524 77344,70524 77345,862 77345,2590 77346,77347 77348,70524 77349,70524 77350,1188 77351,70524 77352,70524 77353,77354 77355,77356 77357,70524 77358,70524 77359,10 77360,77361 77363,72 77364,70524 77365,70524 77366,70524 77367,70524 77368,52 77369,70524 77370,70524 77371,70524 77372,72 77373,70524 77374,7358 77374,7363 77375,70524 77376,70524 77377,70524 77378,147 77378,158 77379,192 77380,70524 77381,70524 77382,70524 77384,70524 77386,717 77387,70524 77388,1659 77389,77390 77391,70524 77392,70524 77393,70524 77394,70524 77395,70524 77396,70524 77397,70524 77398,70524 77399,70524 77400,70524 77401,70524 77402,77403 77405,70524 77406,70524 77407,70524 77408,70524 77409,676 77410,70524 77411,77412 77413,70524 77414,70524 77415,30 77416,70524 77417,77418 77419,77418 77420,70524 77421,70524 77422,70524 77423,366 77424,22 77424,809 77425,366 77426,366 77427,366 77428,366 77429,366 77430,366 77431,366 77432,366 77433,366 77434,70524 77435,30 77436,77437 77438,70524 77439,200 77440,77441 77442,366 77443,1287 77444,422 77445,56 77446,784 77447,70524 77448,323 77449,1619 77450,70524 77451,70524 77452,70524 77453,70524 77454,70524 77455,70524 77456,422 77457,56 77458,70524 77459,70524 77461,652 77462,70524 77463,70524 77464,70524 77465,872 77466,70524 77467,4192 77467,4193 77468,70524 77469,77470 77471,70524 77472,70524 77473,37 77473,973 77473,1231 77473,1740 77473,189303 77474,70524 77475,70524 77476,70524 77477,70524 77478,70524 77479,70524 77480,70524 77481,602 77482,30 77483,70524 77484,298 77485,485 77486,1425 77487,30 77488,1544 77489,298 77490,70524 77491,70524 77492,77493 77494,70524 77496,355 77497,1381 77498,70524 77499,818 77500,233 77501,70524 77503,70524 77504,30 77505,1381 77506,338 77507,70524 77508,70524 77509,83 77510,70524 77511,158 77511,920 77511,1425 77511,1619 77512,217 77513,83 77514,73570 77515,70524 77516,602 77517,298 77518,485 77520,636 77521,70524 77522,70524 77524,70524 77525,1782 77528,258 77528,6179 77528,6180 77530,70524 77532,1983 77534,636 77535,70524 77536,1425 77537,70524 77538,433 77539,70524 77540,70524 77541,70524 77542,298 77543,485 77544,298 77545,485 77546,70524 77548,70524 77549,6955 77550,525 77552,70524 77553,70524 77554,682 77554,1353 77554,72439 77555,1425 77556,48 77557,77558 77560,707 77561,184 77562,79 77562,868 77564,77565 77566,1659 77566,2605 77566,13361 77566,68069 77568,3207 77569,2775 77570,2048 77572,2828 77573,70524 77574,70524 77575,292 77575,623 77575,644 77575,671 77575,877 77575,1058 77575,1179 77575,1619 77575,2567 77575,2701 77575,2737 77575,3089 77575,3331 77575,4771 77575,15807 77575,30331 77575,52232 77575,141912 77576,70524 77577,21944 77578,70524 77579,70524 77580,298 77581,485 77582,70524 77583,70524 77584,70524 77585,70524 77586,70524 77587,604 77589,70524 77590,70524 77591,70524 77593,70524 77594,422 77595,422 77596,70524 77597,604 77598,422 77599,859 77600,455 77601,422 77602,422 77603,422 77604,422 77605,70524 77606,422 77607,422 77608,70524 77609,70524 77610,392 77610,1240 77611,70524 77612,604 77613,70524 77614,318 77614,1220 77614,1222 77615,70524 77616,604 77617,70524 77618,70524 77619,70524 77620,77621 77622,70524 77623,70524 77624,70524 77625,70524 77626,83 77627,5405 77628,70524 77629,70524 77630,70524 77631,255 77632,70524 77633,663 77633,664 77634,473 77635,70524 77637,698 77637,1215 77637,13353 77637,46638 77637,80486 77637,82293 77637,82300 77637,82307 77637,82314 77637,82320 77637,82883 77637,82899 77637,172623 77637,175890 77637,176067 77637,178584 77637,184754 77637,189201 77638,217 77639,298 77640,485 77641,1579 77642,6824 77644,130 77645,30 77647,3069 77648,102 77649,310 77650,1619 77651,309 77651,310 77653,8270 77654,171 77655,70524 77657,77658 77659,222 77661,79 77661,704 77662,358 77663,136 77665,424 77666,77667 77666,86372 77666,196068 77666,206050 77666,207931 77666,241392 77668,70524 77669,422 77670,56 77671,34 77671,35 77671,1801 77671,1973 77671,3507 77672,22 77673,640 77674,640 77675,1436 77676,644 77677,77677 77678,167 77678,615 77678,2083 77679,1353 77680,422 77681,56 77682,885 77683,1203 77684,1962 77685,1323 77686,102 77687,1326 77688,408 77689,875 77690,1782 77691,1177 77691,2210 77692,1353 77694,557 77694,907 77694,1849 77694,4355 77695,81 77696,70524 77697,1001 77698,298 77699,485 77700,298 77701,485 77702,1467 77703,602 77704,1019 77705,602 77706,77707 77708,136 77710,81 77710,503 77710,3507 77712,298 77713,485 77714,70524 77715,13 77716,86 77716,491 77716,1522 77716,75912 77717,1973 77718,77719 77718,78625 77718,84997 77718,90021 77718,101215 77721,34 77721,35 77722,455 77722,1805 77723,70524 77724,151 77725,875 77725,1276 77726,8992 77727,31934 77729,158 77730,1977 77730,1978 77731,77732 77733,10 77733,158 77733,3999 77733,28149 77734,1402 77735,83 77735,211 77735,3297 77736,2737 77737,518 77738,3193 77739,31122 77740,4611 77741,1544 77742,309 77742,310 77743,147 77743,349 77743,668 77743,1402 77743,2373 77743,75912 77744,3 77745,346 77746,298 77747,485 77748,77749 77750,3769 77751,258 77752,818 77753,302 77754,298 77755,485 77756,298 77757,485 77758,4355 77759,34 77759,35 77759,2646 77760,70524 77761,1858 77762,1860 77763,1425 77764,310 77764,76096 77765,390 77766,298 77767,422 77768,56 77769,623 77769,1805 77771,77772 77773,2512 77774,1782 77775,83 77776,298 77777,485 77778,1983 77779,267 77780,1381 77781,623 77781,1805 77782,2205 77782,2206 77783,10 77784,58 77785,46 77786,859 77787,1858 77788,1860 77789,615 77789,1782 77790,1381 77791,392 77792,328 77793,2105 77794,18726 77795,835 77796,298 77797,485 77799,48 77800,77801 77800,87603 77802,48 77803,48 77804,48 77805,718 77806,83 77807,859 77808,609 77808,2315 77808,2775 77810,77811 77810,246626 77813,192 77815,3252 77816,287 77816,809 77816,19010 77817,818 77818,4771 77819,818 77820,8598 77821,2646 77822,77822 77823,1893 77824,392 77825,30 77826,1983 77827,55849 77828,25222 77830,713 77831,2775 77832,107 77832,2646 77833,1118 77836,97 77836,211 77836,861 77837,3 77838,827 77839,783 77840,77841 77842,392 77843,1531 77845,70524 77846,273 77846,313 77847,158 77848,93 77849,30 77851,77852 77853,151 77854,779 77854,1033 77855,536 77856,4597 77857,313 77857,2421 77858,1837 77859,1556 77860,994 77861,147 77861,1247 77861,164572 77862,450 77863,2379 77864,4192 77864,4193 77865,2626 77866,338 77867,516 77868,623 77868,1805 77869,7358 77869,7363 77870,843 77871,1289 77872,338 77873,2979 77874,3451 77874,3452 77875,1133 77876,302 77877,338 77879,336 77880,151 77881,289 77881,290 77882,602 77883,579 77883,811 77884,34 77884,35 77885,310 77886,206 77887,557 77888,72 77890,147 77891,72 77892,72 77893,22 77894,136 77895,1274 77896,72 77897,344 77898,285 77899,207 77900,15119 77901,358 77902,107 77903,298 77904,485 77905,818 77906,56 77906,1181 77907,346 77908,72 77909,252 77909,318 77910,29294 77911,298 77912,485 77913,72 77914,2116 77915,222 77916,1707 77918,202 77918,406 77918,1085 77918,1749 77919,72 77919,588 77919,590 77920,77921 77923,72 77924,349 77925,9012 77926,83 77927,489 77928,59870 77929,2931 77930,79 77931,104 77932,79 77933,1287 77934,577 77935,772 77936,9029 77937,8719 77938,138 77939,865 77940,557 77941,137 77942,72 77943,118 77943,4597 77944,21944 77945,349 77946,1858 77947,1860 77948,72 77949,252 77949,318 77949,1220 77950,134 77951,72 77952,452 77953,636 77954,557 77955,557 77956,557 77957,3297 77958,77959 77960,1019 77961,77962 77961,82463 77961,92449 77961,115846 77961,118796 77961,121834 77961,129276 77963,77964 77966,14989 77967,349 77968,219 77969,72 77970,1285 77971,2775 77972,447 77973,77974 77975,72 77976,527 77977,779 77978,30 77979,23010 77980,690 77981,7652 77982,602 77983,907 77984,6068 77985,30 77986,8855 77987,68069 77987,77988 77987,86832 77989,2351 77990,77991 77992,557 77993,147 77993,158 77993,206 77993,779 77993,6279 77993,23783 77993,80266 77994,2995 77995,70524 77996,5591 77997,779 77998,44 77999,795 77999,3804 77999,4039 78000,2590 78001,809 78002,636 78003,207 78004,602 78006,644 78007,10 78008,872 78009,1429 78010,640 78011,668 78012,78013 78012,97747 78012,111658 78012,116367 78012,120600 78012,140372 78012,153789 78012,172885 78012,186199 78012,224409 78014,9560 78015,779 78016,211 78017,78018 78019,483 78020,78021 78022,18726 78023,195 78024,2146 78025,78026 78025,78954 78027,261 78028,424 78028,1402 78029,577 78031,78032 78031,176598 78033,376 78034,70524 78035,70524 78036,70524 78037,30 78037,81 78037,104 78037,1745 78038,70524 78039,78040 78041,70524 78042,1143 78043,30 78044,805 78045,70524 78046,70524 78047,818 78049,31934 78050,225 78051,652 78052,333 78053,78054 78053,85207 78053,85603 78053,100580 78053,104957 78053,105191 78053,122814 78053,159237 78053,166565 78053,170102 78053,178345 78053,182324 78053,193740 78053,199000 78053,199163 78053,215758 78053,226420 78053,227824 78053,244524 78053,245216 78053,246877 78053,259926 78053,260713 78055,8884 78056,2411 78057,70524 78058,2048 78059,192 78059,663 78059,3872 78060,24505 78061,24505 78062,24505 78063,850 78064,779 78066,1085 78067,78067 78068,207 78069,78070 78071,8270 78072,78073 78074,1962 78075,72 78076,328 78077,68467 78078,70524 78079,78080 78079,128543 78081,422 78082,56 78084,18726 78085,366 78086,366 78087,366 78088,366 78089,70524 78090,333 78091,393 78092,70524 78093,233 78095,78096 78097,70524 78098,9195 78099,70524 78100,72 78101,702 78102,949 78103,78104 78105,713 78106,1711 78107,147 78107,602 78108,93 78109,431 78110,78111 78110,141106 78112,78113 78114,1231 78115,5405 78116,78117 78118,355 78119,70524 78122,70524 78123,1515 78124,503 78125,78126 78127,1608 78127,77315 78128,932 78129,72 78130,685 78131,298 78132,485 78133,994 78134,202 78134,203 78135,1379 78136,83 78137,1140 78137,5547 78138,83 78139,78140 78141,298 78142,485 78143,78144 78145,264 78145,1381 78146,1844 78147,5726 78148,1983 78149,83 78150,83 78151,83 78152,83 78153,83 78154,209 78154,1631 78155,1323 78156,102 78157,1326 78158,408 78159,720 78160,1033 78161,431 78161,1252 78161,1253 78162,2931 78163,1509 78164,628 78165,336 78165,718 78166,30 78167,18726 78168,872 78169,158 78170,586 78171,78172 78174,1425 78175,422 78176,78177 78178,7316 78179,298 78180,485 78181,392 78182,4039 78183,78184 78185,346 78186,1014 78188,15119 78189,6263 78190,1240 78190,6955 78191,55849 78192,192 78193,602 78194,304 78195,79 78196,3872 78197,298 78198,485 78199,1309 78200,30 78201,1983 78202,255 78203,602 78204,255 78205,8788 78206,78207 78208,30 78209,406 78210,78211 78213,10 78214,30 78215,30 78216,872 78217,206 78218,72 78219,72 78220,72 78221,72 78222,70524 78223,4980 78224,907 78225,366 78226,2048 78227,13136 78228,483 78229,1287 78230,72 78231,78232 78233,160 78234,805 78235,30 78236,39247 78237,86 78237,167 78237,217 78237,589 78237,605 78237,615 78237,907 78237,973 78237,1001 78237,1124 78237,1167 78237,1241 78237,1782 78237,1785 78237,1955 78237,3193 78238,78239 78240,70524 78241,70524 78242,1127 78242,1893 78243,178 78244,44 78245,30 78246,376 78247,258 78248,3447 78249,10 78250,137 78252,30 78253,298 78254,485 78255,1479 78256,68467 78257,22 78257,211 78257,1267 78257,37414 78258,779 78259,10 78261,78262 78263,78264 78265,640 78266,146 78268,151 78269,346 78270,78271 78272,78273 78272,128568 78275,1072 78278,1332 78279,4548 78280,151 78282,78283 78284,78283 78286,78287 78288,78289 78291,1983 78292,78293 78292,82960 78295,393 78296,8991 78297,450 78297,4193 78298,664 78298,4475 78299,70524 78301,292 78302,178 78303,30 78304,280 78304,17245 78306,78307 78308,78309 78310,2867 78310,22880 78311,175 78311,78312 78311,155612 78315,78316 78315,80810 78315,83522 78318,346 78319,78320 78321,167 78322,2787 78323,17588 78324,233 78325,78326 78327,1192 78328,355 78329,3413 78330,78331 78332,70524 78333,70524 78334,70524 78335,70524 78336,70524 78337,70524 78338,70524 78339,22924 78340,1133 78341,22 78342,30 78343,3069 78344,4810 78345,1419 78346,30 78347,623 78348,779 78349,379 78349,3538 78350,364 78351,240 78352,106 78352,586 78352,17772 78353,222 78354,188 78355,602 78356,7757 78357,3960 78359,219 78360,30 78361,30 78362,192 78363,70524 78364,83 78365,8991 78366,151 78367,209 78368,2506 78369,872 78370,872 78371,30 78372,68 78373,2697 78374,289 78374,290 78375,178 78376,70524 78378,147 78378,192 78378,1033 78378,1127 78378,1181 78378,1893 78378,3872 78378,5547 78378,49057 78379,575 78380,211 78381,94 78382,1634 78383,3413 78384,1188 78385,30 78386,267 78387,107 78388,2416 78388,2417 78389,292 78390,338 78391,298 78392,1133 78393,3538 78394,346 78395,30 78396,483 78397,640 78397,726 78397,7124 78397,7270 78398,187 78399,78400 78401,217 78402,34 78402,35 78403,30 78404,1634 78405,1962 78406,3003 78407,30 78408,30 78409,3999 78410,72 78411,644 78412,1962 78414,78415 78416,376 78417,5405 78418,431 78419,30 78420,450 78421,433 78422,273 78423,78424 78425,31934 78426,78427 78428,592 78429,349 78430,1707 78431,1634 78432,1707 78433,30 78434,1285 78435,102 78436,99 78437,602 78438,298 78439,485 78440,422 78441,56 78442,31934 78443,557 78444,862 78445,557 78446,45960 78447,30 78448,298 78449,9030 78450,557 78451,44 78452,557 78454,1707 78455,8270 78456,1127 78457,893 78458,1531 78459,72 78460,1849 78461,1 78461,4 78461,5 78461,8 78461,11 78461,20 78461,48 78461,130 78461,160 78461,430 78461,668 78461,736 78461,3612 78461,4252 78461,16687 78462,450 78463,3 78463,50 78463,147 78463,285 78463,392 78463,516 78463,779 78463,1243 78463,1289 78463,1298 78463,1411 78464,9195 78465,450 78466,450 78467,2929 78468,78469 78470,158 78471,349 78471,392 78472,1127 78473,30 78475,30 78476,78477 78478,30 78479,647 78480,31896 78481,30 78482,298 78483,485 78485,602 78486,10 78487,337 78488,78489 78490,602 78491,602 78492,602 78493,602 78494,602 78495,602 78496,602 78497,192 78497,202 78497,203 78497,422 78497,516 78498,70524 78499,1235 78499,1335 78500,1231 78500,1462 78501,693 78501,3370 78502,70524 78503,366 78504,49887 78505,8990 78506,70524 78507,70524 78508,70524 78509,70524 78510,55479 78511,70524 78512,70524 78513,70524 78514,50 78515,50 78516,70524 78517,70524 78518,70524 78519,78520 78519,95726 78519,110976 78521,70524 78522,70524 78523,70524 78524,70524 78525,586 78526,70524 78527,70524 78528,70524 78529,70524 78530,70524 78531,72 78532,63 78533,78534 78535,255 78536,72 78537,70524 78538,872 78539,70524 78540,10 78541,254 78542,70524 78543,70524 78544,70524 78545,70524 78546,70524 78547,70524 78548,70524 78549,70524 78550,70524 78551,70524 78552,292 78553,70524 78554,818 78555,294 78556,296 78557,298 78558,70524 78559,70524 78560,70524 78561,932 78562,70524 78563,652 78564,70524 78565,70524 78566,70524 78567,70524 78568,70524 78569,366 78570,366 78571,70524 78572,70524 78573,298 78574,70524 78575,70524 78576,70524 78577,70524 78578,70524 78579,70524 78580,70524 78581,70524 78582,70524 78583,17588 78584,140 78584,1462 78585,70524 78586,2048 78587,70524 78588,1238 78589,70524 78590,70524 78591,1181 78592,1452 78593,70524 78594,70524 78595,22924 78596,70524 78597,70524 78598,420 78599,70524 78600,70524 78601,233 78603,70524 78604,70524 78605,200 78605,248 78606,70524 78607,70524 78608,70524 78609,79 78610,70524 78611,70524 78612,70524 78613,70524 78614,70524 78615,70524 78616,66 78617,70524 78618,9560 78619,70524 78620,18726 78622,70524 78623,818 78623,32751 78624,355 78626,70524 78627,1773 78628,70524 78629,874 78630,70524 78632,70524 78633,70524 78634,70524 78636,70524 78637,70524 78638,2116 78639,862 78639,991 78640,70524 78641,70524 78642,78643 78642,123756 78645,70524 78646,2116 78647,255 78648,1201 78649,70524 78650,1332 78651,75912 78652,70524 78653,1122 78653,75912 78654,70524 78655,70524 78656,1287 78657,3413 78658,70524 78659,70524 78660,70524 78661,1247 78662,17334 78664,30 78665,25344 78666,943 78667,577 78667,1388 78669,527 78669,740 78669,741 78670,70524 78671,1012 78672,75912 78673,70524 78674,713 78675,875 78676,1284 78677,70524 78678,690 78680,70524 78681,70524 78685,78686 78687,70524 78688,60576 78689,70524 78690,97 78691,805 78692,70524 78693,70524 78694,70524 78695,671 78696,714 78696,1572 78697,14133 78697,16309 78697,38822 78698,298 78699,485 78700,310 78701,70524 78702,50 78702,779 78703,557 78703,1939 78703,5405 78704,70524 78705,1454 78706,70524 78709,298 78710,485 78711,79 78712,1127 78713,70524 78714,70524 78715,264 78715,1659 78716,698 78717,202 78717,301 78717,1688 78718,111 78718,289 78718,290 78718,94134 78719,78720 78719,89061 78721,991 78721,2312 78722,640 78723,640 78724,640 78725,579 78725,63471 78726,422 78727,10 78729,850 78730,422 78731,422 78732,422 78733,422 78734,422 78735,483 78736,422 78737,22 78737,366 78737,996 78738,422 78740,1052 78741,422 78742,422 78743,422 78744,875 78745,442 78746,104 78746,489 78747,2995 78748,70524 78751,920 78752,70524 78753,34 78753,35 78754,83 78755,72 78756,344 78757,285 78758,422 78759,140 78760,264 78761,70524 78762,3252 78763,34 78763,158 78765,5212 78766,70524 78767,392 78768,140 78769,70524 78770,298 78771,485 78772,104 78772,134 78772,1844 78773,70524 78774,298 78775,485 78776,3538 78777,70524 78778,70524 78779,1127 78780,70524 78781,1983 78782,298 78783,485 78784,70524 78785,70524 78786,70524 78788,70524 78789,70524 78790,1715 78791,70524 78792,347 78792,356 78792,1955 78792,2572 78792,4222 78793,70524 78794,79 78795,70524 78796,70524 78797,7 78798,309 78798,310 78799,70524 78800,70524 78802,78803 78804,3003 78806,240 78808,171 78809,2775 78810,447 78811,1127 78814,56 78814,1181 78815,58 78816,46 78817,70524 78818,72 78819,1323 78820,102 78821,1326 78822,408 78823,1782 78823,2353 78824,1556 78825,318 78825,1220 78825,1222 78826,477 78827,70524 78828,703 78828,843 78828,1453 78828,1465 78828,2697 78828,24763 78829,6638 78830,298 78831,485 78832,71 78832,811 78832,1634 78832,1881 78832,3769 78835,1012 78836,1836 78837,1506 78838,3413 78839,195 78839,457 78839,2367 78839,4039 78839,13136 78840,97 78841,302 78842,349 78843,79 78844,30 78845,1392 78846,136 78846,298 78846,417 78846,557 78846,1612 78847,171 78848,907 78849,1454 78850,852 78851,78852 78851,84073 78851,87636 78851,95765 78851,100545 78853,273 78853,483 78853,1116 78853,30427 78854,2116 78855,557 78856,477 78857,41 78858,485 78858,615 78859,7358 78859,7363 78860,2116 78861,217 78861,1274 78862,2116 78863,8270 78864,30 78865,1454 78866,801 78867,1962 78869,818 78870,79 78871,5405 78872,147 78872,158 78872,252 78874,1033 78875,60576 78877,248 78877,364 78878,9560 78879,493 78879,1927 78880,1052 78880,1623 78882,1732 78882,187176 78883,252 78884,1309 78885,1140 78885,5547 78886,30 78887,1033 78888,875 78889,30 78890,1801 78891,41 78891,104 78891,289 78891,298 78891,588 78891,590 78891,1085 78891,1119 78891,1179 78891,1715 78891,1749 78891,1962 78891,4237 78891,4771 78891,94134 78891,205488 78892,252 78893,827 78895,14989 78896,30 78897,1707 78898,775 78899,78900 78901,217 78903,30 78904,408 78907,503 78908,8270 78909,1 78909,79 78910,733 78911,217 78911,1417 78913,2048 78914,298 78915,485 78916,240 78917,304 78918,247 78919,1801 78920,422 78921,56 78922,1033 78924,592 78925,2116 78926,422 78927,56 78928,202 78928,203 78929,202 78929,203 78930,202 78930,203 78931,202 78931,203 78932,509 78932,510 78932,1043 78933,10 78934,136 78935,1181 78936,77 78936,233 78936,283 78936,1105 78936,1363 78937,298 78938,485 78939,1796 78942,417 78943,1556 78944,4 78944,5 78944,192 78945,298 78946,485 78947,111 78947,557 78948,1151 78949,1801 78950,827 78951,120 78951,1374 78952,318 78952,1220 78952,1222 78953,483 78955,72 78956,215 78957,1983 78958,1001 78959,980 78960,79 78961,1010 78962,872 78964,70524 78965,1506 78966,160 78966,1289 78966,49057 78967,332 78968,663 78968,664 78969,663 78969,664 78970,663 78970,664 78971,2178 78971,2979 78971,4545 78972,2156 78972,9343 78974,72 78975,252 78975,318 78976,151 78977,422 78978,56 78979,1227 78979,1229 78979,86416 78981,805 78981,1149 78982,516 78983,10 78983,251 78983,516 78983,1175 78983,1512 78983,5992 78983,78984 78986,1033 78988,79 78989,1983 78990,1243 78991,192 78992,602 78993,298 78994,602 78996,1133 78997,298 78998,485 78999,538 79000,557 79001,8798 79002,515 79003,577 79004,980 79005,151 79005,3623 79006,622 79006,1033 79007,557 79008,376 79009,1285 79010,934 79010,1033 79011,310 79012,83 79014,24505 79015,19443 79016,298 79017,485 79018,252 79018,318 79019,2416 79019,2417 79020,134 79021,1309 79022,247 79023,30 79024,30 79027,30 79028,30 79029,30 79030,2135 79031,233 79031,240 79031,590 79031,592 79031,631 79031,805 79031,1785 79031,1818 79031,2620 79031,5718 79032,693 79033,30 79034,126 79035,298 79036,485 79037,328 79037,932 79037,954 79037,1016 79037,1149 79037,10318 79038,30 79039,557 79040,657 79041,615 79042,1117 79043,160 79044,358 79045,30 79046,41 79047,104 79048,557 79049,8270 79050,30 79051,298 79052,485 79053,298 79054,485 79055,22 79055,2372 79056,1707 79057,1117 79058,557 79059,1298 79060,1298 79061,557 79062,557 79063,8854 79064,44 79065,83 79066,2116 79067,9560 79068,298 79069,485 79070,3069 79071,602 79072,481 79073,65 79074,622 79075,1227 79075,1229 79076,417 79077,452 79078,21944 79079,3 79080,2205 79080,2206 79081,298 79082,485 79083,577 79084,392 79084,1240 79084,1454 79085,30 79086,1782 79087,160 79088,626 79089,273 79090,417 79091,849 79093,450 79094,30 79095,30 79096,30 79097,602 79098,602 79099,30 79100,30 79101,602 79102,14366 79103,72 79104,30 79105,2590 79106,417 79107,72 79108,79109 79110,70524 79111,994 79112,70524 79114,1332 79115,636 79116,207 79117,900 79118,70524 79119,1019 79120,70524 79121,70524 79122,19986 79123,70524 79124,175 79125,70524 79126,70524 79127,872 79128,70524 79129,70524 79130,1429 79131,70524 79132,70524 79133,70524 79134,602 79135,70524 79136,70524 79137,83 79139,70524 79140,1127 79141,70524 79142,70524 79143,668 79145,4066 79146,70524 79147,70524 79148,70524 79149,70524 79150,70524 79151,70524 79152,70524 79153,862 79153,2590 79154,376 79155,885 79156,70524 79157,70524 79158,70524 79159,68467 79160,70524 79161,602 79162,70524 79163,70524 79164,70524 79165,70524 79166,70524 79167,70524 79168,70524 79169,70524 79170,70524 79171,70524 79172,70524 79173,70524 79174,70524 79175,70524 79176,79177 79178,70524 79179,70524 79180,70524 79182,70524 79183,70524 79184,70524 79185,70524 79186,577 79187,323 79188,70524 79189,70524 79190,968 79191,70524 79192,70524 79193,1210 79194,70524 79195,70524 79196,70524 79197,70524 79198,70524 79199,70524 79200,70524 79201,2574 79201,79202 79203,70524 79204,70524 79205,1007 79206,301 79206,968 79206,1837 79206,2083 79207,70524 79208,70524 79209,70524 79210,79211 79212,70524 79213,70524 79214,83 79215,70524 79216,1379 79217,70524 79218,298 79219,485 79220,602 79221,298 79222,485 79223,70524 79224,70524 79225,70524 79226,70524 79227,70524 79228,70524 79229,1085 79230,70524 79231,70524 79232,233 79233,70524 79234,70524 79236,70524 79237,70524 79239,70524 79241,70524 79243,2315 79243,2701 79244,366 79245,1977 79245,1978 79246,366 79247,70524 79248,366 79249,388 79250,70524 79251,70524 79252,2116 79253,70524 79254,309 79254,310 79255,79256 79257,70524 79258,70524 79259,70524 79260,70524 79261,10 79261,1235 79262,70524 79263,827 79264,70524 79265,298 79266,485 79267,4177 79268,247 79269,685 79269,4545 79269,21944 79269,139010 79270,195 79271,184 79272,2775 79273,447 79274,70524 79275,70524 79276,50 79277,10 79278,248 79279,70524 79280,81 79281,70524 79282,70524 79284,70524 79285,9012 79286,1353 79287,70524 79288,70524 79289,1467 79290,1381 79291,1381 79292,1381 79294,163 79295,222 79295,220502 79296,1143 79297,79298 79297,120544 79299,392 79301,328 79302,450 79303,5101 79303,5102 79304,158 79305,147 79305,195 79305,4193 79306,273 79306,360 79306,818 79306,6695 79307,1353 79308,8855 79309,298 79310,485 79311,298 79312,485 79313,657 79313,2421 79315,79316 79317,79318 79319,355 79320,4 79320,5 79320,134 79320,527 79320,743 79320,1984 79320,2674 79320,4810 79320,8714 79320,21944 79320,95152 79321,292 79322,1127 79323,1146 79324,1167 79325,79326 79327,222 79327,4637 79328,1893 79329,859 79331,24505 79332,8180 79334,1509 79334,1688 79337,1179 79338,1359 79340,389 79340,1313 79341,4504 79342,707 79343,433 79344,292 79345,305 79346,16153 79347,640 79348,640 79350,1140 79351,79352 79353,690 79355,2116 79356,285 79356,1655 79356,92476 79358,652 79359,251 79359,516 79359,663 79359,1175 79359,1243 79360,1016 79360,2209 79361,422 79362,18726 79363,422 79364,422 79365,422 79366,422 79367,577 79367,788 79367,1070 79367,138686 79370,7124 79371,3003 79372,79352 79373,2674 79373,16153 79375,422 79376,422 79377,422 79378,3960 79379,1010 79381,527 79381,740 79381,741 79381,743 79382,1707 79384,4691 79385,3413 79386,1635 79387,779 79388,874 79389,83 79390,1140 79391,1531 79392,868 79394,602 79396,483 79396,657 79396,6556 79396,232766 79397,278 79397,431 79397,1252 79397,1253 79398,299 79399,932 79400,17588 79401,422 79402,1119 79403,907 79405,422 79406,56 79407,657 79408,171 79409,360 79411,1227 79411,1229 79412,1 79412,79 79412,387 79413,1227 79413,1229 79413,86416 79414,622 79415,248 79416,602 79417,579 79417,868 79417,9457 79418,1012 79419,422 79420,56 79421,422 79422,79423 79422,99946 79425,151 79426,602 79429,301 79431,1001 79432,389 79433,206 79434,602 79435,58 79436,602 79437,1231 79438,5718 79439,1564 79440,2083 79441,2620 79442,388 79443,1837 79444,687 79445,3422 79446,5662 79447,3193 79448,1955 79449,1782 79450,301 79451,1522 79452,2191 79453,3194 79454,907 79455,1167 79456,968 79457,1544 79458,3218 79459,3207 79460,3138 79461,1298 79462,720 79463,195 79464,147 79464,195 79467,22293 79468,1231 79469,1858 79470,1860 79471,934 79471,1033 79473,586 79473,1001 79473,1285 79475,137 79475,200 79476,79477 79478,592 79479,171 79480,289 79480,290 79481,1893 79482,1571 79483,424 79483,1634 79484,516 79485,269 79485,315 79485,805 79485,994 79485,1147 79485,1844 79485,3695 79485,7698 79486,2205 79486,2206 79487,422 79488,79489 79490,56 79492,1323 79493,102 79494,240 79495,1326 79496,408 79497,2315 79498,6726 79499,2367 79500,9010 79501,8990 79503,2646 79504,310 79505,1210 79506,861 79507,417 79508,2775 79509,447 79510,68 79511,240 79512,467 79512,1893 79513,264 79515,389 79515,1072 79516,1033 79517,784 79517,2646 79519,720 79520,310 79521,2674 79522,252 79523,579 79524,104 79524,134 79524,138 79525,1058 79526,48 79527,707 79527,1447 79528,299 79528,457 79528,467 79528,623 79528,717 79528,972 79528,1001 79528,1240 79528,1293 79528,1776 79528,1803 79528,75912 79528,118336 79528,141912 79529,2674 79529,16153 79530,422 79531,56 79532,147 79532,149 79532,397 79533,34 79533,35 79533,1284 79533,7698 79534,640 79535,1019 79536,8868 79537,17588 79538,422 79539,56 79540,111 79540,240 79542,1010 79543,2574 79544,364 79544,431 79545,500 79546,222 79546,79547 79546,88092 79546,89930 79546,92627 79546,100608 79546,103615 79546,104566 79546,105301 79546,108480 79546,110465 79546,110900 79546,111003 79546,111061 79546,111347 79546,111670 79546,111991 79546,112038 79546,112144 79546,112718 79546,113289 79546,113432 79546,113600 79546,113821 79546,114311 79546,114609 79546,114758 79546,114879 79546,114972 79546,115148 79546,115331 79546,115442 79546,116231 79546,116354 79546,116851 79546,117347 79546,117372 79546,117491 79546,117515 79546,117524 79546,117574 79546,117709 79546,118067 79546,119632 79546,119762 79546,120051 79546,120650 79546,122129 79546,122311 79546,122625 79546,122846 79546,123162 79546,123711 79546,123741 79546,123810 79546,124826 79546,125210 79546,125438 79546,125766 79546,126547 79546,126645 79546,126857 79546,127552 79546,127811 79546,128021 79546,128531 79546,129665 79546,129721 79546,130055 79546,130098 79546,130106 79546,130641 79546,134161 79546,137125 79546,139551 79546,143710 79546,146918 79546,147107 79546,148644 79546,155542 79546,155998 79546,156969 79546,159118 79546,168203 79546,178044 79546,178053 79546,181456 79546,181557 79546,184433 79546,188313 79546,192482 79546,192800 79546,201573 79546,204910 79546,206251 79546,214770 79546,217017 79546,217132 79546,217242 79546,217444 79546,217743 79546,218725 79546,219412 79546,219454 79546,219485 79546,219494 79546,227982 79546,231471 79546,233726 79546,234585 79548,7757 79549,292 79550,167 79550,217 79550,301 79550,631 79550,1010 79550,1085 79551,657 79552,3161 79553,22924 79554,393 79554,435 79554,439 79556,4355 79558,298 79559,1 79559,10 79559,2244 79559,21826 79560,999 79562,1805 79563,1010 79564,310 79565,1019 79567,160 79568,158 79568,393 79569,1068 79570,1127 79570,1381 79571,63 79573,79 79574,83 79574,315 79575,79 79576,287 79577,509 79577,150022 79578,269 79579,1881 79581,298 79582,873 79583,217 79583,872 79584,4 79584,5 79585,1707 79586,503 79587,83 79588,873 79589,222 79590,808 79591,577 79592,1821 79593,302 79594,1579 79595,1796 79596,479 79597,1541 79600,1983 79601,2424 79602,158 79603,305 79604,79605 79606,79605 79608,209 79608,258973 79609,313 79609,852 79610,19010 79611,422 79612,56 79613,356 79613,615 79613,852 79615,6726 79616,248 79616,557 79616,875 79617,31934 79619,41 79619,68 79619,240 79619,390 79619,392 79619,431 79619,631 79619,760 79619,784 79619,805 79619,818 79619,1119 79619,1285 79619,1309 79619,1608 79619,1631 79619,1888 79619,2590 79619,2620 79619,2995 79619,3135 79619,4220 79619,7194 79619,66297 79619,84257 79620,1191 79621,2674 79622,83 79623,79624 79623,84797 79623,86121 79623,86212 79625,818 79626,932 79627,184 79627,2206 79628,83 79629,1179 79630,868 79631,775 79632,1374 79633,1132 79634,781 79635,422 79636,56 79637,1891 79641,1849 79642,240 79643,41 79644,2929 79645,1007 79646,994 79647,663 79647,664 79648,663 79648,664 79649,663 79649,664 79650,657 79651,58 79652,46 79653,251 79653,465 79656,79657 79658,79659 79660,2620 79661,2334 79662,772 79663,1983 79664,527 79664,740 79664,741 79665,83 79665,592 79667,2674 79667,16153 79668,1381 79669,1844 79670,422 79672,247 79673,433 79673,1634 79674,392 79676,809 79677,875 79678,206 79678,222 79678,254 79678,455 79678,1019 79678,1282 79678,5343 79678,73570 79679,1776 79680,657 79681,338 79682,217 79683,79 79683,1181 79683,2260 79684,2244 79685,206 79686,1556 79687,1858 79688,1860 79691,772 79692,660 79693,14989 79694,7416 79695,32 79695,302 79695,818 79695,957 79695,2979 79696,140 79697,267 79698,7 79700,1127 79702,72 79703,298 79704,485 79705,1858 79706,1860 79707,1033 79708,83 79709,483 79710,1147 79711,79712 79711,107985 79711,184056 79713,605 79713,2083 79714,3 79715,1458 79716,1243 79717,431 79718,8992 79719,557 79720,557 79721,2944 79722,2224 79722,13661 79723,134 79724,8270 79725,2209 79726,72 79727,72 79728,309 79728,310 79728,841 79728,994 79728,1566 79729,647 79730,344 79731,72 79732,3331 79733,333 79734,167 79734,446 79734,1522 79735,1893 79736,1749 79737,1782 79738,5101 79739,481 79740,726 79741,676 79742,596 79743,1860 79744,215 79744,233 79744,240 79744,289 79744,290 79744,298 79744,372 79744,417 79744,503 79744,592 79744,631 79744,760 79744,805 79744,932 79744,1016 79744,1082 79744,1085 79744,1282 79744,1285 79744,1309 79744,1462 79744,1564 79744,1608 79744,1715 79744,1785 79744,1818 79744,1955 79744,1962 79744,2205 79744,2296 79744,2620 79744,5718 79744,8537 79744,33424 79744,94134 79744,245910 79745,44 79746,794 79747,30 79748,2979 79749,336 79750,31934 79751,30 79752,106 79753,30 79754,298 79755,485 79756,30 79757,6837 79758,3999 79759,63 79760,2379 79761,298 79762,485 79763,5366 79764,79765 79766,30 79767,305 79769,72 79770,3467 79771,1515 79772,760 79773,392 79773,697 79773,1151 79773,3003 79774,920 79776,10 79777,422 79778,56 79779,6252 79780,41 79780,1012 79780,1177 79781,6556 79782,147 79783,30 79783,1179 79784,79785 79786,248 79788,577 79789,640 79790,393 79790,4545 79790,139010 79791,215 79793,392 79794,195 79794,306 79794,307 79794,406 79794,779 79794,1181 79794,1515 79795,79796 79797,631 79798,79799 79800,424 79801,862 79803,30 79806,79807 79808,79809 79810,3246 79811,75912 79812,79813 79814,79 79815,298 79816,485 79817,585 79818,397 79819,21944 79820,366 79821,640 79822,602 79823,79824 79825,118 79825,4597 79826,579 79827,79828 79829,932 79830,467 79831,7358 79831,7363 79832,160 79834,3246 79836,385 79837,134 79838,233 79839,2205 79839,2206 79840,222 79841,577 79841,2775 79842,6837 79843,355 79844,1191 79845,298 79846,485 79847,647 79848,344 79849,1849 79850,1359 79851,2480 79852,397 79853,207 79854,431 79855,2775 79856,447 79857,34 79857,35 79857,2266 79858,222 79858,1893 79858,103860 79859,333 79859,811 79859,1210 79860,2775 79861,671 79861,827 79862,79863 79864,640 79865,79866 79865,123109 79867,2116 79868,72 79869,518 79869,1955 79870,2775 79871,1467 79872,1559 79873,455 79874,336 79875,1807 79876,19 79876,743 79876,749 79876,1388 79876,142430 79876,142473 79876,142879 79877,2424 79878,1119 79879,493 79879,682 79879,1821 79879,21736 79879,72439 79883,44877 79883,80266 79883,174526 79884,602 79885,1623 79886,360 79888,422 79889,422 79890,422 79891,422 79892,422 79893,422 79894,178 79895,422 79896,663 79896,664 79897,422 79898,30 79899,151 79900,30 79901,41 79902,422 79903,56 79904,1871 79905,30 79906,6051 79907,907 79908,704 79908,1140 79908,5547 79909,932 79910,516 79911,775 79912,264 79912,1381 79913,1836 79914,83 79915,171 79916,907 79917,8463 79918,30 79919,485 79921,431 79922,493 79922,1411 79923,58 79923,184 79923,202 79923,203 79923,261 79923,273 79923,671 79923,994 79923,1309 79923,1821 79923,2528 79923,3148 79923,4222 79923,190492 79924,1087 79925,79926 79927,313 79927,1467 79928,225 79929,604 79930,697 79930,1010 79930,1117 79931,2421 79932,13980 79933,83 79934,620 79935,3 79936,455 79936,1019 79936,1467 79937,1243 79938,79 79939,690 79940,660 79941,5405 79942,775 79944,376 79945,934 79945,1033 79946,5547 79947,1579 79948,50 79949,1323 79950,102 79951,1326 79952,408 79953,515 79954,50 79955,20 79956,481 79957,20771 79958,79959 79958,97627 79958,103510 79958,114133 79958,141606 79960,136 79960,1332 79960,1619 79961,417 79962,79963 79964,298 79965,485 79966,54 79966,135 79966,278 79966,283 79966,455 79966,634 79966,660 79966,1353 79966,1539 79966,2424 79966,2553 79966,2646 79966,6506 79966,7768 79967,192 79968,1118 79970,1509 79972,1146 79974,805 79975,104 79976,620 79977,493 79977,652 79978,4060 79979,1509 79980,10 79981,30 79983,298 79984,485 79985,79986 79988,1240 79989,298 79990,485 79991,3207 79992,364 79993,298 79994,485 79995,6323 79996,79997 79998,302 79998,861 79999,298 80000,485 80001,80002 80001,83137 80003,873 80003,1419 80005,298 80006,485 80009,167 80009,518 80009,615 80009,1454 80009,2979 80010,298 80011,485 80012,140 80013,22 80014,1265 80014,1266 80016,417 80017,1983 80019,264 80021,79 80022,56 80022,147 80022,192 80022,30331 80023,500 80024,56 80024,30331 80025,275 80025,277 80026,56 80026,30331 80026,60576 80027,682 80028,56 80028,30331 80029,1893 80030,80031 80032,481 80033,192 80034,1326 80035,298 80036,111 80036,4771 80037,80038 80039,298 80040,485 80041,58 80042,515 80043,192 80044,24505 80046,1707 80049,289 80049,290 80049,483 80049,503 80049,631 80049,636 80049,805 80049,1282 80049,2443 80049,94134 80050,693 80051,298 80052,485 80053,579 80053,861 80053,1556 80054,518 80055,298 80056,1453 80056,2073 80056,68069 80056,86832 80057,673 80057,849 80057,2460 80058,1 80058,50 80058,147 80058,158 80058,406 80058,1181 80059,920 80059,1089 80059,1619 80060,604 80060,1293 80060,2480 80060,3422 80061,79 80062,301 80062,567 80062,604 80062,615 80062,1740 80063,22293 80064,843 80065,366 80065,500 80066,861 80067,3069 80069,3115 80070,477 80071,79 80072,358 80073,2867 80073,22880 80075,68069 80077,298 80078,485 80079,192 80081,647 80082,344 80083,192 80083,440 80083,489 80083,577 80083,893 80083,1400 80083,1796 80083,3804 80083,4453 80084,467 80084,868 80085,306 80085,307 80086,1287 80087,9029 80089,68069 80090,68069 80091,68069 80091,86832 80091,234030 80092,192 80093,68069 80094,68069 80095,68069 80096,392 80097,68069 80098,581 80099,147 80100,346 80101,34 80101,35 80102,611 80102,1370 80105,1117 80106,298 80107,485 80109,30 80110,24505 80111,2775 80112,376 80114,7092 80115,439 80115,538 80115,1590 80118,640 80119,663 80119,664 80121,640 80122,1849 80123,30 80124,571 80126,5591 80127,68069 80128,376 80129,68069 80130,4220 80131,240 80132,18726 80133,117 80133,2712 80134,301 80135,21944 80136,68069 80137,1010 80137,1298 80139,68069 80139,86832 80139,95770 80139,110058 80139,121419 80139,123767 80139,125129 80139,130183 80139,133313 80139,144465 80139,161810 80140,589 80141,6068 80142,1849 80143,390 80144,557 80145,640 80146,592 80148,68069 80149,1818 80150,68069 80150,86832 80152,68069 80153,949 80153,13980 80154,346 80155,301 80157,392 80158,1707 80159,422 80160,56 80161,30 80162,4 80162,5 80163,30 80164,557 80165,483 80166,996 80170,68069 80170,86832 80171,30 80172,1001 80173,206 80173,459 80173,827 80173,980 80173,1220 80173,1222 80173,2353 80174,640 80175,392 80175,1151 80176,640 80177,604 80178,358 80179,15573 80180,289 80180,290 80181,2351 80182,1556 80183,1891 80184,1252 80184,1253 80184,21944 80186,2775 80187,151 80188,292 80188,1688 80189,4672 80190,920 80192,392 80193,2367 80195,83 80196,1769 80197,206 80198,861 80199,83 80200,2116 80201,536 80202,920 80203,1238 80204,206 80205,586 80206,251 80206,465 80207,269 80208,577 80209,80210 80211,1381 80212,2146 80213,23010 80214,557 80215,34 80215,35 80215,83 80216,211 80217,1118 80218,557 80219,298 80220,485 80221,80222 80223,298 80224,485 80225,147 80225,89035 80226,1105 80227,676 80228,195 80229,364 80230,557 80231,5440 80232,298 80233,485 80234,1707 80235,640 80236,2590 80237,647 80238,344 80239,1381 80240,3069 80241,647 80242,344 80243,433 80244,509 80244,1572 80244,1722 80244,4039 80245,431 80246,80247 80248,192 80249,207 80250,500 80251,366 80252,187 80253,273 80254,68069 80255,1983 80256,1429 80257,875 80258,1983 80259,269 80260,640 80262,885 80263,668 80264,269 80265,500 80266,1 80266,147 80266,148 80266,158 80266,175 80266,206 80266,336 80266,406 80266,640 80266,1425 80266,1458 80266,2244 80266,5916 80266,13270 80266,15330 80266,15795 80266,16891 80266,19936 80266,25571 80266,30943 80266,42064 80266,44877 80266,60576 80266,66714 80266,79883 80266,80120 80266,80266 80266,80515 80266,81315 80266,81456 80266,82103 80266,82244 80266,83401 80266,87803 80266,89035 80266,91363 80266,92476 80266,93782 80266,100737 80266,118336 80266,128904 80266,139137 80266,149319 80266,153004 80266,154193 80266,163945 80266,177995 80266,183850 80266,187331 80266,188635 80266,214374 80266,217689 80266,219541 80266,227521 80266,237840 80267,44 80268,289 80268,290 80268,417 80268,1085 80268,2206 80268,2296 80268,75912 80268,94134 80268,144988 80269,481 80270,107 80271,640 80272,134 80273,647 80274,344 80275,872 80276,640 80277,79 80277,94409 80278,557 80279,256 80281,605 80282,640 80283,647 80284,344 80286,1143 80287,30 80288,2480 80289,2244 80290,477 80291,640 80292,640 80293,217 80293,536 80293,949 80293,13575 80294,2929 80295,364 80295,431 80295,1252 80295,1253 80296,640 80299,175 80300,873 80303,80304 80303,89903 80305,147 80307,99 80308,622 80309,195 80310,73570 80313,1639 80314,2146 80316,304 80317,3069 80318,312 80319,2528 80320,292 80321,44 80323,602 80324,8598 80325,2244 80326,1452 80327,298 80328,485 80329,80330 80331,80332 80333,233 80334,1238 80335,536 80335,852 80335,4672 80335,7698 80336,663 80336,664 80337,832 80338,406 80338,420 80338,760 80338,841 80338,1247 80338,1572 80338,2701 80338,4192 80338,4193 80339,255 80341,1 80342,1 80343,3 80344,80345 80346,636 80346,2135 80347,1707 80349,273 80350,422 80351,56 80352,30 80353,1639 80354,75912 80355,447 80356,355 80357,80358 80359,366 80362,97 80362,9457 80364,140 80365,80361 80366,3 80367,21944 80368,50 80368,130 80368,209 80368,393 80368,473 80368,602 80368,841 80368,1566 80368,1571 80368,1955 80368,3451 80368,3452 80368,4223 80368,6955 80368,75912 80368,88820 80369,3585 80370,1454 80371,1411 80372,704 80373,80374 80375,1298 80376,2626 80377,192 80377,202 80377,203 80377,516 80378,240 80378,301 80379,301 80379,973 80379,1160 80379,1293 80379,1300 80379,103860 80380,1359 80381,907 80382,30331 80385,4252 80386,920 80388,358 80389,80390 80391,80392 80394,1033 80395,1117 80396,202 80396,233 80396,1287 80397,333 80397,622 80397,1033 80398,424 80398,1634 80399,206 80400,302 80400,579 80401,752 80403,5405 80404,3413 80406,1132 80407,781 80408,44 80409,602 80410,278 80411,80412 80413,79 80413,2867 80413,2868 80413,22880 80414,422 80415,422 80416,422 80417,422 80418,1132 80419,781 80420,422 80421,422 80422,422 80423,7698 80424,422 80425,126 80425,217 80425,536 80425,872 80425,1417 80426,1181 80427,1247 80428,364 80429,1962 80430,972 80431,19010 80431,22293 80432,631 80433,30 80434,302 80435,298 80436,485 80437,8788 80438,3193 80439,779 80440,467 80440,868 80441,2244 80442,457 80443,2775 80444,447 80445,2775 80446,447 80447,1572 80448,68 80448,71 80448,86 80448,442 80448,795 80448,1821 80448,2367 80448,15179 80448,21736 80448,193129 80449,1715 80450,1623 80451,83 80451,302 80452,50 80453,2045 80454,818 80455,147 80455,622 80456,298 80457,485 80458,83 80459,589 80461,298 80462,485 80463,146 80463,92476 80463,106502 80464,58 80464,75912 80465,349 80466,417 80467,1132 80468,781 80471,298 80472,485 80475,515 80475,1052 80475,1579 80476,932 80477,2436 80478,10 80479,261 80480,34 80480,35 80480,333 80480,657 80481,30 80482,1796 80483,599 80484,298 80485,485 80487,631 80488,217 80489,431 80489,784 80491,80492 80493,171 80494,968 80495,2701 80496,994 80497,21944 80498,599 80499,497 80500,1332 80501,779 80501,68069 80502,515 80503,195 80504,5405 80506,80507 80509,10 80511,19010 80512,298 80513,485 80514,151 80516,1803 80517,2411 80518,292 80519,1801 80519,14061 80519,78949 80519,131253 80519,189266 80521,23783 80522,80523 80524,298 80525,485 80526,1556 80527,73570 80528,1370 80530,2668 80531,602 80532,1323 80533,102 80534,1326 80535,408 80536,919 80537,433 80538,119 80538,192 80538,309 80538,310 80538,577 80538,2073 80538,2626 80539,80540 80541,171 80542,3367 80542,3474 80542,162599 80543,717 80543,1782 80544,72 80545,344 80546,285 80547,467 80549,358 80550,660 80551,918 80552,931 80553,1858 80554,1860 80556,457 80557,731 80558,620 80560,207 80561,21944 80562,2480 80563,27041 80564,2244 80565,158 80566,5405 80567,596 80569,424 80570,1454 80571,269 80572,392 80573,80574 80575,158 80575,779 80576,1977 80576,1978 80577,1240 80577,20771 80578,151 80579,1132 80580,781 80581,81 80582,298 80583,34 80583,35 80583,283 80583,313 80583,455 80583,1019 80583,1539 80583,1881 80583,2319 80583,2944 80583,7768 80583,29475 80584,27041 80585,312 80587,379 80588,1556 80589,1132 80590,781 80591,1132 80592,781 80593,397 80594,1127 80595,171 80596,50 80597,1140 80597,5547 80598,222 80600,2244 80601,527 80602,207 80603,2105 80605,1983 80606,252 80607,75912 80608,811 80609,1172 80609,1844 80609,162599 80613,346 80614,1983 80615,2083 80616,240 80618,269 80618,435 80619,685 80620,2116 80621,2421 80622,999 80622,1192 80622,3538 80622,4165 80623,32 80624,7572 80625,80626 80627,8 80627,130 80627,862 80627,1016 80627,1147 80627,1818 80627,2315 80627,2411 80627,4637 80627,8714 80627,28130 80627,118336 80628,18726 80629,285 80631,116 80631,430 80631,994 80631,2087 80632,850 80633,2244 80634,1381 80635,10 80636,388 80637,217 80638,1072 80639,4637 80640,34 80640,35 80641,455 80642,2266 80643,1429 80644,1274 80645,2421 80646,1201 80647,919 80648,6955 80649,47 80649,2469 80650,406 80651,516 80652,750 80653,163 80654,312 80655,3630 80656,192 80656,663 80657,602 80658,431 80659,1010 80659,1298 80659,1837 80660,1140 80662,1033 80663,2116 80664,1132 80665,781 80666,301 80667,287 80667,809 80667,19010 80669,1467 80671,4895 80673,31934 80674,626 80675,309 80675,310 80675,483 80675,6556 80675,80676 80679,3695 80680,393 80681,333 80682,852 80682,2699 80683,346 80684,406 80685,515 80686,744 80687,2372 80688,941 80689,832 80690,615 80691,1544 80692,783 80693,2626 80694,298 80695,485 80696,602 80697,217 80697,1417 80697,5976 80698,1556 80699,158 80700,298 80701,326 80701,392 80701,3804 80702,1644 80703,30 80703,134 80703,349 80703,392 80703,1007 80703,2334 80703,2701 80703,3085 80703,3260 80704,126 80704,872 80704,4771 80705,1707 80706,10 80707,80708 80710,1007 80711,1415 80711,15807 80712,602 80713,420 80714,2626 80715,21944 80716,56 80718,72 80719,344 80720,285 80721,657 80722,158 80722,779 80723,247 80724,240 80725,134 80726,115 80726,118 80727,34 80727,35 80727,58 80727,111 80727,192 80727,264 80727,289 80727,290 80727,422 80727,479 80727,586 80727,1007 80727,1085 80727,1151 80727,1210 80727,1453 80727,1659 80727,1893 80727,3695 80727,5265 80727,8180 80728,392 80729,240 80732,644 80733,406 80734,136 80735,292 80736,247 80736,2867 80736,22880 80737,1773 80737,80731 80739,158 80740,298 80741,726 80742,30 80743,273 80744,30 80745,949 80747,72 80748,30 80749,557 80750,233 80751,818 80752,332 80753,875 80754,30 80755,2775 80756,1631 80756,55849 80757,358 80758,86 80759,30 80760,305 80760,467 80760,2105 80761,10 80763,158 80763,1515 80764,171 80765,1 80766,83 80767,2671 80768,477 80769,225 80770,557 80771,1298 80772,557 80773,557 80774,2244 80774,23783 80774,30331 80774,256681 80775,1644 80776,72 80777,2191 80778,2116 80779,30 80780,30 80781,267 80782,68 80783,392 80784,80785 80784,98945 80786,392 80787,302 80787,579 80787,1556 80788,80789 80788,83698 80790,30 80791,30 80792,516 80793,1235 80793,1335 80794,577 80795,151 80796,1707 80797,107 80798,3193 80799,805 80800,1608 80801,516 80802,147 80802,158 80803,481 80804,406 80805,30 80806,30 80807,1983 80808,30 80809,483 80811,420 80812,30 80813,130 80814,273 80816,358 80817,1707 80818,30 80819,4611 80820,252 80820,318 80820,1220 80820,1222 80821,72 80822,79 80823,217 80823,652 80823,1452 80823,1639 80824,1181 80825,3 80825,1085 80826,178 80827,2590 80828,1414 80829,195 80829,4039 80830,8798 80831,111 80831,309 80831,310 80831,1715 80831,6627 80832,10 80833,332 80834,207 80835,32 80835,392 80835,3003 80836,7 80836,211 80836,315 80836,788 80836,14989 80837,305 80838,80839 80840,571 80841,872 80842,1285 80843,1429 80844,10 80845,158 80846,668 80847,1467 80849,455 80850,1773 80850,80737 80851,2424 80852,1871 80853,7698 80855,30 80856,366 80857,366 80858,366 80859,250 80859,602 80859,1684 80859,1962 80860,80861 80862,1143 80863,620 80864,30 80865,278 80865,640 80865,3585 80866,2244 80867,366 80868,366 80869,80870 80871,50 80872,17588 80873,50 80874,80875 80876,3 80876,346 80876,439 80877,1745 80878,640 80879,1001 80879,1085 80880,80881 80882,32 80882,392 80883,1509 80884,704 80885,80886 80887,298 80888,485 80889,38634 80890,298 80891,485 80892,346 80893,640 80894,640 80895,30 80896,872 80897,376 80898,1590 80898,1644 80899,134 80900,80901 80902,233 80904,516 80905,6303 80906,972 80907,5212 80908,743 80909,358 80910,355 80911,415 80911,1143 80911,1454 80911,15523 80912,147 80913,147 80913,149 80913,158 80913,13654 80913,16003 80913,56006 80913,102586 80913,102587 80913,102588 80913,102589 80915,652 80916,1132 80917,781 80918,298 80919,485 80920,872 80921,298 80922,485 80923,690 80923,788 80924,1247 80925,703 80926,2048 80927,422 80928,56 80929,1177 80929,2210 80930,219 80931,8149 80933,206 80934,10 80934,301 80934,304 80934,440 80934,473 80934,652 80934,671 80934,736 80934,835 80934,968 80934,1085 80934,1392 80934,1677 80934,1785 80934,2244 80934,3999 80934,7270 80934,14556 80934,14945 80936,217 80937,217 80938,2073 80939,1392 80940,640 80941,309 80941,310 80941,483 80942,147 80942,399 80943,30 80944,694 80945,79 80946,6424 80947,872 80948,217 80948,1118 80949,222 80950,10 80951,102 80952,302 80952,579 80952,6303 80953,147 80954,217 80954,1014 80954,1204 80955,360 80955,1289 80956,2353 80956,3756 80957,309 80957,310 80957,809 80957,6556 80958,907 80959,422 80960,44 80961,422 80962,422 80963,422 80964,422 80965,422 80966,337 80966,657 80966,838 80966,1454 80967,422 80968,422 80969,718 80970,217 80970,457 80972,664 80972,1085 80973,50 80973,192 80974,192 80975,1417 80976,119 80976,1400 80977,80978 80979,83 80980,518 80982,1133 80982,1479 80983,893 80983,3769 80985,1010 80986,1132 80987,781 80988,344 80988,1564 80989,805 80990,254 80991,2286 80992,7 80992,97 80994,859 80995,360 80995,81070 80996,46 80997,269 80998,1132 80999,781 81000,50 81000,79 81001,30 81002,2286 81003,21944 81004,389 81004,1756 81005,305 81007,2173 81008,31934 81009,346 81010,3295 81011,907 81012,874 81013,1359 81014,808 81015,1132 81016,781 81018,233 81019,6638 81020,1515 81021,1132 81022,781 81024,379 81024,1417 81026,171 81027,392 81028,1132 81029,781 81030,217 81031,4637 81032,455 81033,2266 81034,1201 81035,1135 81036,2421 81037,240 81038,146 81039,346 81040,1132 81041,781 81043,2775 81044,349 81045,5987 81046,1590 81047,563 81047,809 81047,3467 81049,647 81050,344 81051,31934 81052,50 81052,192 81053,252 81053,1220 81053,1222 81054,3297 81055,1962 81057,2116 81058,697 81059,1608 81060,1417 81061,20 81061,538 81062,217 81062,1417 81063,1132 81064,781 81065,289 81065,290 81066,1977 81066,1978 81068,222 81068,283 81068,657 81068,949 81068,1201 81068,1467 81068,2266 81068,5906 81068,13136 81069,81070 81069,174550 81069,174561 81070,1298 81071,538 81071,934 81072,30 81073,392 81074,392 81075,1400 81077,2421 81078,874 81079,167 81080,1132 81081,781 81082,1132 81083,781 81084,134 81084,138 81085,1132 81086,781 81088,30 81089,1132 81090,781 81091,1580 81092,1274 81093,2989 81093,2991 81095,151 81096,171 81097,647 81098,344 81099,81100 81101,2626 81103,10 81104,1801 81105,81070 81106,6298 81107,1012 81108,1177 81109,41 81110,298 81111,485 81112,2244 81113,1132 81114,781 81115,1132 81116,781 81119,3 81120,1243 81121,251 81122,20 81124,527 81124,736 81124,781 81124,849 81124,1844 81124,2460 81125,1132 81126,781 81127,68069 81128,346 81129,298 81130,485 81131,605 81132,818 81133,818 81134,8270 81135,525 81135,1119 81135,1326 81135,1796 81136,1132 81137,781 81138,298 81139,485 81140,366 81141,875 81142,577 81143,1127 81144,602 81145,269 81146,1417 81147,392 81149,500 81149,37414 81150,602 81151,5034 81152,4903 81154,392 81154,433 81155,81156 81157,65 81157,79 81157,147 81157,202 81157,203 81157,217 81157,252 81157,318 81157,422 81158,422 81159,634 81161,602 81162,1132 81163,781 81164,2574 81165,2436 81166,58 81167,46 81168,81169 81170,158 81171,24505 81173,538 81174,118 81174,4597 81176,30 81178,1392 81179,83 81180,48 81181,1132 81182,781 81183,10 81184,592 81185,147 81185,158 81186,4672 81187,392 81188,479 81189,195 81190,30 81191,83 81192,875 81193,991 81193,2045 81194,222 81195,30 81196,318 81196,1220 81196,1222 81197,852 81198,392 81199,15523 81200,147 81200,422 81201,147 81201,158 81202,251 81202,465 81203,81204 81203,98705 81205,599 81205,1796 81206,5440 81207,431 81207,1252 81207,1253 81208,349 81209,81210 81211,13745 81212,671 81213,1010 81214,934 81215,1240 81216,312 81217,50 81218,1531 81219,1082 81220,2674 81220,16153 81221,4895 81222,376 81223,1749 81224,81225 81226,1962 81227,298 81228,485 81229,874 81230,657 81231,1274 81232,83 81233,126 81233,186 81233,314 81233,433 81233,440 81233,467 81233,538 81233,577 81233,676 81233,685 81233,693 81233,814 81233,868 81233,872 81233,911 81233,939 81233,1011 81233,1014 81233,1118 81233,1281 81233,1531 81233,1566 81233,1655 81233,1663 81233,2874 81233,5307 81233,6452 81233,7968 81233,8535 81233,18244 81233,18377 81233,20757 81233,29713 81233,34963 81233,38707 81233,39412 81233,41345 81233,43273 81233,47022 81233,58420 81233,68086 81233,72529 81233,83393 81233,83817 81233,83993 81233,84495 81233,84644 81233,84652 81233,84701 81233,84702 81233,85796 81233,85878 81233,87141 81233,94184 81233,95341 81233,95580 81233,95608 81233,100139 81233,112300 81233,112964 81233,116982 81233,117720 81233,119493 81233,119663 81233,125487 81233,134914 81233,137666 81233,138759 81233,138760 81233,138761 81233,138762 81233,138763 81233,138764 81233,138765 81233,142463 81233,146346 81233,146745 81233,148825 81233,150874 81233,152819 81233,152855 81233,156379 81233,162599 81234,83 81235,3069 81236,22 81236,515 81237,920 81238,261 81239,75912 81240,72 81241,255 81242,298 81243,4192 81243,4193 81244,298 81245,485 81246,332 81247,140 81247,160 81248,1556 81249,557 81250,1571 81250,2224 81250,2421 81250,5326 81250,19443 81251,366 81252,81070 81253,366 81254,366 81255,366 81256,366 81257,366 81258,24505 81259,19227 81260,392 81261,358 81263,81264 81265,809 81266,485 81266,138686 81268,1359 81269,392 81270,195 81271,1319 81272,24505 81273,2421 81274,392 81274,697 81275,72 81276,195 81277,137 81279,2116 81281,298 81282,485 81283,1962 81285,8719 81286,138 81287,865 81288,557 81289,137 81290,118 81290,4597 81291,21944 81292,5547 81295,5906 81296,557 81297,626 81298,278 81299,137 81300,862 81301,557 81302,2178 81302,4545 81303,301 81303,567 81303,968 81305,557 81306,2274 81307,422 81308,56 81309,24505 81310,577 81311,5310 81312,250 81312,1684 81313,9560 81314,1118 81314,4192 81314,4193 81315,516 81316,30 81317,346 81318,81318 81319,479 81320,1085 81321,346 81322,24505 81323,178 81324,289 81324,290 81324,1962 81324,2205 81324,2206 81324,2286 81324,2315 81324,3069 81325,261 81326,178 81327,2574 81328,30 81329,644 81330,586 81331,481 81332,2590 81333,623 81333,1805 81334,1298 81335,1509 81336,207 81337,83 81338,83 81339,872 81340,1429 81341,81342 81343,5547 81344,366 81345,668 81346,1033 81347,7360 81348,920 81348,1634 81348,81349 81348,123037 81350,3 81352,81353 81354,493 81355,298 81356,485 81357,483 81358,24505 81359,3297 81361,1143 81362,81363 81364,81365 81366,81367 81368,292 81369,225 81371,8884 81372,81373 81374,81373 81375,81373 81376,81373 81377,81373 81378,1085 81379,366 81380,366 81381,81382 81383,1284 81384,3297 81385,81386 81387,602 81389,81390 81391,233 81392,1001 81393,81394 81395,602 81396,355 81397,81398 81399,1977 81399,1978 81400,81401 81402,206 81403,147 81406,298 81407,485 81408,106 81408,302 81408,392 81408,758 81408,1043 81408,1122 81408,1858 81408,1881 81408,1984 81408,2353 81408,3003 81408,3069 81408,3193 81408,6059 81408,7956 81408,27041 81408,37088 81409,6682 81410,298 81411,485 81412,1132 81413,781 81414,298 81415,485 81416,81417 81419,298 81420,485 81421,81422 81423,163 81424,298 81425,485 81426,3695 81427,298 81428,485 81429,83 81430,81431 81432,81433 81434,2989 81434,2991 81435,346 81436,3 81436,304 81437,1323 81438,102 81439,1326 81440,408 81441,192 81441,206 81441,586 81441,720 81442,81443 81444,171 81446,516 81447,81448 81449,298 81450,485 81451,167 81452,609 81452,999 81452,1882 81452,2105 81453,107 81454,258 81455,10 81456,206 81456,80266 81458,1506 81458,22125 81459,81460 81463,81464 81465,34 81465,35 81465,106 81465,158 81465,192 81465,217 81465,251 81465,252 81465,318 81465,337 81465,346 81465,435 81465,465 81465,586 81465,640 81465,663 81465,664 81465,1181 81465,1220 81465,1222 81465,1243 81465,1294 81465,1590 81465,1635 81465,2567 81465,3161 81465,4192 81465,4193 81465,5976 81465,6119 81465,8598 81465,8771 81465,8811 81465,8822 81466,81467 81468,81469 81470,81471 81472,731 81473,30 81474,298 81475,485 81476,30 81477,3069 81478,17588 81479,48 81480,388 81481,3507 81482,1707 81483,1608 81484,592 81484,697 81484,1284 81484,2045 81485,81486 81487,72 81488,24505 81489,81490 81491,393 81492,2367 81493,252 81493,318 81494,1749 81495,22 81496,298 81497,485 81498,298 81499,485 81500,81501 81503,483 81504,298 81505,485 81506,376 81507,217 81508,10 81508,41 81508,104 81508,200 81508,298 81508,301 81508,417 81508,442 81508,534 81508,589 81508,631 81508,685 81508,745 81508,760 81508,827 81508,862 81508,1085 81508,1119 81508,1262 81508,1368 81508,1462 81508,1580 81508,2296 81508,2995 81508,3474 81508,3623 81508,4220 81508,4222 81508,6068 81508,7194 81508,8537 81508,8884 81508,9028 81508,31977 81508,44725 81508,75912 81508,178576 81508,185874 81508,185877 81509,1653 81510,47 81510,2469 81511,34 81511,35 81511,1313 81512,298 81513,485 81514,5547 81515,726 81515,743 81515,142409 81515,146280 81516,24505 81517,81518 81519,1274 81521,147 81522,479 81523,1033 81524,392 81525,6891 81526,72 81527,344 81528,285 81529,30 81530,81531 81532,72 81533,298 81534,485 81535,298 81536,485 81537,1132 81538,781 81539,298 81540,485 81541,30 81542,298 81543,485 81544,30 81545,30 81546,107 81547,81548 81549,3447 81550,1479 81551,72 81552,1381 81552,8868 81552,81553 81552,94581 81552,111751 81552,116726 81554,1612 81556,298 81557,485 81558,72 81559,72 81560,30 81561,81562 81563,75912 81564,1132 81565,781 81566,483 81567,1132 81568,781 81569,298 81570,485 81571,81572 81573,1127 81574,611 81575,2116 81576,1133 81578,481 81579,219 81579,743 81580,18726 81581,250 81581,1684 81583,30 81584,588 81584,590 81585,72 81586,81587 81588,1983 81589,9121 81590,663 81590,664 81591,81592 81593,81594 81595,1132 81596,781 81597,72 81598,30 81599,81600 81601,30 81602,1608 81603,81604 81605,81604 81606,1531 81607,366 81608,366 81609,366 81610,81611 81612,81613 81614,3209 81616,10 81617,1544 81618,4192 81618,4193 81619,81613 81620,1181 81623,72 81626,81627 81628,72 81629,422 81630,56 81631,15573 81632,81633 81634,1871 81635,81636 81637,81638 81639,72 81641,72 81642,195 81643,233 81644,72 81645,81646 81645,88905 81647,83 81647,81648 81647,88084 81649,346 81650,151 81651,195 81652,107 81653,2416 81653,2417 81654,292 81655,338 81656,195 81657,298 81658,1133 81659,3538 81660,81661 81662,81661 81663,30 81664,3246 81664,3247 81665,355 81666,30 81667,675 81668,81669 81668,81712 81668,87816 81668,256707 81671,187 81672,272 81673,8270 81674,81675 81676,175 81676,310 81677,1102 81678,3413 81680,211 81681,2775 81682,53763 81683,81684 81685,393 81686,233 81686,347 81687,83 81688,1836 81689,972 81689,1010 81689,1531 81690,158 81690,2574 81692,10 81694,81695 81696,2048 81697,298 81698,485 81699,7 81700,7360 81701,298 81702,485 81703,104 81703,254 81703,5405 81704,81705 81704,101079 81704,122272 81704,122431 81704,160152 81704,261358 81706,2889 81706,3260 81707,81707 81708,1287 81708,1531 81709,81710 81711,516 81713,81714 81713,243145 81715,1052 81716,81717 81718,1707 81719,392 81720,81721 81722,81721 81723,81724 81725,861 81726,1007 81727,81728 81727,170410 81729,81730 81731,72 81732,344 81733,285 81734,298 81735,485 81736,1983 81737,81738 81737,120140 81739,255 81741,81742 81743,81744 81745,13661 81746,269 81746,1684 81747,1127 81748,483 81749,349 81750,298 81751,485 81752,1634 81753,1983 81754,30 81755,19986 81756,188 81757,417 81758,861 81759,22 81760,81761 81762,862 81763,72 81764,3447 81765,72 81766,8149 81767,5405 81768,72 81769,81770 81771,81772 81773,81772 81774,81772 81775,685 81775,26450 81776,1844 81777,687 81778,158 81779,72 81780,78232 81781,81782 81784,338 81786,577 81787,333 81787,435 81787,440 81787,1033 81788,298 81789,485 81790,3872 81791,30 81792,298 81793,485 81794,298 81795,485 81797,72 81798,81070 81799,3331 81800,202 81800,203 81801,376 81802,557 81803,1010 81804,557 81805,862 81807,2146 81808,557 81809,81810 81811,557 81812,81813 81814,81813 81815,1309 81816,34 81816,158 81817,15573 81818,1983 81820,30 81821,1983 81822,2334 81823,81824 81825,433 81826,206 81827,149 81828,323 81829,333 81830,30 81831,119 81831,200 81832,1177 81832,2775 81833,718 81834,1688 81834,2989 81834,2991 81835,1220 81835,1222 81835,2775 81836,81837 81838,81839 81838,85472 81838,126213 81840,2168 81841,252 81841,318 81842,455 81843,81844 81845,602 81846,602 81848,422 81849,422 81850,422 81851,422 81852,81853 81854,422 81855,422 81856,422 81857,422 81859,422 81860,24505 81861,15573 81862,1858 81863,1860 81864,14366 81866,24505 81867,31934 81869,81870 81872,1 81873,81874 81873,112870 81873,134308 81873,171545 81875,31934 81876,72 81878,81879 81880,31934 81881,602 81882,602 81883,602 81884,907 81885,30 81886,72 81888,81889 81890,602 81891,602 81892,30 81893,602 81894,5547 81895,24505 81896,602 81897,1238 81898,30 81898,328 81899,1452 81900,30 81901,81902 81901,251698 81901,262210 81903,81904 81905,2787 81906,33082 81907,2292 81908,94 81909,818 81910,652 81911,292 81912,294 81913,296 81914,298 81917,10 81918,652 81920,818 81921,81922 81923,81924 81925,233 81926,30 81927,81928 81927,105016 81929,433 81930,58 81931,46 81932,30 81934,298 81935,485 81936,4865 81936,4866 81937,1010 81938,302 81939,195 81940,818 81941,81942 81943,355 81944,1715 81945,2574 81946,1127 81946,1381 81948,749 81950,818 81951,652 81952,81953 81954,2989 81954,2991 81955,5908 81957,2923 81958,81959 81960,81961 81962,31934 81963,255 81964,1983 81965,147 81967,2048 81968,72 81969,30 81969,772 81969,4941 81971,104 81971,252 81971,1001 81971,1707 81971,21442 81972,298 81973,485 81975,72 81976,818 81977,19 81977,278 81977,1571 81977,2224 81977,2421 81977,5326 81978,302 81979,3135 81980,1707 81981,2775 81982,447 81983,1058 81984,209 81985,366 81986,868 81987,366 81988,366 81989,366 81990,671 81992,72 81994,392 81995,259 81996,389 82000,417 82001,99 82002,1634 82003,2048 82005,151 82005,631 82007,392 82008,82009 82010,1962 82011,2048 82012,83 82017,626 82018,195 82019,431 82020,862 82022,2116 82023,304 82024,130 82024,1007 82027,996 82028,85 82029,34 82029,35 82029,1313 82030,15 82031,1319 82032,72 82033,1556 82034,366 82035,3612 82036,175 82037,81 82038,1983 82040,957 82040,82013 82041,195 82042,30 82043,441 82043,1722 82044,195 82045,302 82045,579 82046,640 82047,640 82048,338 82048,1127 82048,1722 82049,82050 82051,1082 82051,1149 82052,1566 82053,557 82057,649 82058,805 82059,24505 82060,18726 82061,206 82062,93 82062,94 82063,206 82064,2334 82065,1608 82066,1323 82067,102 82068,1326 82069,408 82070,273 82071,1983 82072,1392 82073,2073 82074,862 82075,1803 82076,2334 82077,455 82078,818 82079,178 82080,1132 82081,781 82082,24505 82083,1858 82084,1860 82085,1231 82085,1370 82085,1782 82086,2116 82087,151 82088,192 82089,602 82090,1243 82091,3999 82092,301 82093,1707 82094,252 82094,272 82094,1370 82094,1893 82095,718 82095,1631 82096,1326 82097,1608 82098,447 82100,949 82101,283 82101,7698 82101,9743 82102,18298 82103,10 82103,175 82103,94409 82104,23783 82105,2116 82106,1631 82108,192 82109,527 82109,743 82109,8714 82109,95583 82110,20 82110,489 82110,1133 82110,1147 82111,82112 82113,1284 82115,1147 82115,1707 82116,604 82117,1707 82118,332 82119,83 82119,563 82120,406 82121,1033 82122,211 82123,2421 82124,34 82124,35 82124,313 82124,431 82124,442 82124,609 82124,626 82124,749 82124,1046 82124,1235 82124,1335 82124,1715 82124,1718 82124,13575 82124,15807 82124,21711 82125,134 82126,8270 82128,527 82128,743 82128,8714 82129,1227 82129,1229 82131,422 82132,422 82133,422 82134,422 82135,209 82136,422 82137,1844 82138,48 82139,30 82140,3115 82141,30 82142,392 82144,1132 82145,781 82146,1983 82147,663 82147,664 82147,2867 82147,2868 82149,240 82150,222 82151,366 82151,760 82152,81070 82153,1983 82154,247 82155,579 82156,1983 82157,2274 82158,1454 82159,1836 82160,663 82160,664 82161,713 82162,120 82162,694 82164,442 82164,749 82165,503 82166,79 82167,2620 82168,30 82169,120 82170,1522 82171,280 82171,17245 82172,872 82173,328 82173,3538 82174,433 82175,1241 82175,3422 82176,34 82176,536 82176,2266 82177,1858 82178,1860 82179,1132 82180,781 82181,1231 82182,406 82183,2367 82184,1132 82185,781 82186,1858 82187,1860 82188,9010 82189,82190 82191,649 82192,1127 82193,1132 82194,781 82195,82196 82197,240 82197,283 82197,491 82197,1052 82197,1201 82197,1509 82198,30 82199,151 82201,82202 82203,30 82204,104 82204,557 82204,953 82205,360 82205,762 82206,444 82207,86 82209,872 82210,82211 82212,298 82213,485 82214,82215 82216,264 82218,1509 82218,1551 82220,30 82221,483 82222,82223 82222,83653 82222,104810 82222,111362 82222,111701 82222,114656 82222,172840 82222,191766 82222,199160 82222,242349 82222,250743 82225,24505 82226,82227 82228,489 82229,772 82230,772 82232,272 82232,314 82233,859 82234,1522 82235,360 82235,1893 82235,6695 82236,107 82236,111 82236,4771 82237,22 82237,207 82237,314 82238,82239 82240,406 82241,34 82241,35 82241,79 82241,147 82241,158 82241,406 82241,622 82241,640 82241,779 82241,809 82241,1425 82241,1515 82241,5874 82242,192 82243,392 82244,107 82244,200 82244,1462 82244,8180 82244,8537 82244,80266 82245,493 82247,304 82248,4691 82250,30 82251,1313 82252,733 82254,392 82254,2699 82255,611 82255,1370 82256,30 82257,1298 82257,1616 82258,302 82258,1374 82259,431 82260,433 82261,30 82262,1844 82263,259 82264,1844 82265,1844 82266,72 82267,602 82268,2775 82269,72 82270,207 82271,82272 82271,84529 82273,1132 82274,781 82275,1287 82276,252 82277,167 82278,1151 82279,631 82280,3507 82281,875 82282,33201 82283,151 82284,417 82285,59931 82286,1119 82287,536 82288,557 82289,3413 82290,1635 82291,4039 82292,333 82296,349 82297,151 82298,255 82301,832 82303,240 82303,1309 82304,442 82304,1140 82304,3474 82305,3069 82308,2048 82309,1132 82310,781 82312,247 82313,222 82313,1019 82315,980 82316,338 82316,1127 82317,1531 82318,1132 82319,781 82321,809 82322,1983 82323,30331 82324,2244 82325,82326 82328,48 82329,217 82330,388 82331,1072 82332,34 82332,35 82333,4637 82334,455 82335,2266 82336,1429 82337,1274 82338,1201 82339,919 82340,2421 82341,6955 82342,298 82343,485 82344,422 82345,5034 82346,58 82347,46 82348,827 82349,516 82349,1220 82349,1222 82350,34 82350,35 82350,949 82350,13980 82351,536 82352,1631 82353,602 82355,2671 82356,83 82358,30 82359,30 82360,30 82361,433 82362,718 82363,3413 82364,47 82364,2469 82365,1983 82366,1983 82367,481 82368,4611 82369,1983 82371,760 82371,1149 82372,602 82373,602 82374,30 82375,134 82376,3069 82377,298 82378,485 82379,82380 82381,82382 82381,99457 82383,175 82384,861 82385,874 82386,516 82387,557 82388,1556 82390,557 82391,298 82392,485 82394,424 82395,626 82396,30 82397,10 82398,250 82398,1684 82399,82400 82401,298 82402,485 82403,30 82404,1608 82405,30 82406,1844 82407,515 82408,1392 82409,83 82410,72 82411,206 82412,30 82413,18726 82414,602 82415,82416 82418,72 82419,49887 82420,640 82421,1289 82421,1509 82422,433 82422,818 82423,1551 82424,72 82425,72 82427,1608 82428,82429 82430,82431 82430,83223 82430,88175 82430,90853 82430,112618 82432,72 82433,298 82434,485 82435,640 82436,30 82437,72 82438,9457 82439,30 82440,301 82440,861 82440,893 82440,2979 82441,809 82442,1688 82443,82444 82445,72 82447,1 82448,106 82449,82450 82451,79 82452,602 82453,602 82454,602 82455,779 82457,72 82459,82460 82461,247 82462,3804 82464,1962 82465,875 82467,202 82467,203 82468,82469 82470,72 82471,344 82472,285 82473,82474 82475,82476 82477,82478 82480,10 82481,1149 82481,5101 82481,5102 82481,15119 82481,55077 82483,82484 82483,121912 82485,994 82486,72 82488,72 82490,1181 82491,30 82492,149 82493,392 82494,636 82495,82496 82495,107860 82495,110957 82497,1849 82498,202 82499,333 82499,1181 82502,602 82503,671 82504,147 82505,184 82507,77 82508,1467 82509,2089 82509,2940 82509,21944 82509,107196 82509,129403 82509,138617 82509,141492 82509,172048 82510,82511 82512,366 82513,406 82514,9030 82515,388 82516,344 82517,2116 82519,209 82520,366 82521,366 82522,247 82522,809 82523,393 82524,485 82525,1085 82526,302 82526,893 82527,406 82528,893 82529,21944 82530,30 82532,1860 82534,79 82535,160 82536,233 82537,344 82538,298 82539,1210 82540,392 82540,623 82540,1143 82541,1132 82542,1132 82543,1419 82544,1132 82545,195 82546,82547 82546,84984 82546,85387 82546,87646 82546,89932 82546,91222 82546,93319 82546,98700 82546,100187 82546,118797 82546,119069 82546,122509 82546,123972 82546,126656 82546,129356 82546,137787 82546,139860 82546,140078 82546,142006 82546,144467 82548,14472 82549,1132 82551,366 82552,366 82553,211 82553,5101 82554,82555 82557,652 82558,781 82559,7155 82560,1132 82561,34 82561,35 82561,536 82561,949 82561,1019 82561,1274 82561,1467 82561,1718 82561,2266 82561,2944 82561,4594 82561,6888 82561,29475 82562,455 82563,647 82564,66500 82565,366 82566,2775 82567,32 82569,209 82570,222 82570,455 82570,536 82570,694 82571,781 82572,676 82573,323 82574,360 82574,1893 82575,207 82576,1871 82577,781 82578,781 82579,1818 82580,1844 82581,83 82583,1132 82584,781 82585,875 82586,2048 82587,75912 82588,1082 82589,298 82590,485 82591,973 82592,10 82592,79 82592,206 82592,435 82592,622 82592,1370 82592,1776 82592,5310 82592,7614 82593,10 82594,875 82595,875 82596,781 82597,872 82599,195 82600,2146 82601,781 82602,2116 82602,6303 82604,1132 82605,781 82606,1132 82607,333 82609,73570 82610,1132 82611,781 82612,1132 82613,781 82614,312 82615,366 82616,1381 82616,21944 82617,781 82618,2572 82619,647 82620,82621 82620,100612 82620,100634 82622,1132 82623,781 82624,875 82625,1132 82626,2867 82626,2868 82628,34 82628,35 82628,222 82628,313 82628,536 82628,588 82628,590 82628,634 82628,1313 82628,1419 82628,2224 82628,2646 82628,5326 82629,24505 82630,2048 82631,781 82632,366 82633,1130 82634,1326 82635,1132 82636,11 82637,1140 82638,1860 82639,82533 82640,366 82641,640 82643,298 82645,406 82645,779 82645,1181 82646,1983 82647,364 82648,298 82649,485 82650,298 82651,485 82653,292 82654,18726 82655,30 82656,298 82657,485 82658,1247 82658,1644 82658,1844 82659,1718 82659,5034 82660,577 82661,298 82662,485 82664,726 82664,859 82665,360 82665,1289 82666,920 82666,1181 82667,818 82668,30 82669,1506 82670,577 82670,1466 82671,781 82672,292 82673,1370 82673,2782 82673,3876 82673,36398 82674,1132 82675,781 82676,1 82676,20 82676,668 82676,1623 82677,292 82678,1132 82679,781 82680,1983 82681,48 82682,292 82683,298 82684,485 82686,406 82686,2931 82688,6068 82689,82690 82691,171 82692,422 82693,2116 82694,82694 82695,1118 82696,1132 82697,781 82698,392 82699,1132 82700,781 82701,30 82702,3 82703,631 82703,1085 82703,1579 82703,1893 82703,2590 82703,3623 82703,185877 82704,1132 82705,781 82706,1043 82706,1267 82707,1323 82708,102 82709,1326 82710,408 82711,10 82711,113156 82712,22 82713,1132 82714,781 82716,1167 82716,2292 82716,2334 82717,1274 82719,298 82720,485 82722,72 82723,344 82724,285 82725,240 82726,298 82727,485 82728,1132 82729,781 82730,2116 82731,827 82731,1818 82731,3069 82731,3695 82731,75912 82733,390 82733,1580 82733,4222 82734,1274 82736,818 82737,1132 82738,781 82739,134 82739,493 82739,626 82739,685 82739,973 82739,1240 82739,1323 82739,3538 82739,221828 82739,227376 82742,298 82743,485 82744,1888 82744,2590 82746,3804 82746,187176 82748,1298 82749,160 82750,1860 82751,4192 82751,4193 82752,298 82753,485 82754,1132 82755,781 82756,1860 82759,376 82760,376 82761,184 82761,2244 82763,1284 82763,148742 82764,278 82765,1572 82766,1977 82766,1978 82767,14458 82769,65 82770,82771 82772,140 82773,2116 82774,1722 82775,82776 82777,93 82777,94 82778,83 82779,222 82779,1019 82780,2048 82781,192 82782,518 82783,3 82784,1805 82785,1805 82786,1711 82787,50 82788,8798 82789,417 82790,1837 82791,1893 82793,444 82794,663 82794,664 82795,1836 82796,227 82797,1265 82797,1266 82798,718 82799,579 82801,372 82802,72 82803,344 82804,285 82805,850 82807,5405 82808,827 82809,298 82810,485 82811,392 82812,47 82812,2469 82813,850 82814,140 82815,82816 82817,713 82819,104 82819,289 82819,290 82819,337 82819,726 82819,94134 82819,149534 82820,82821 82822,795 82822,14797 82823,140 82825,1608 82826,1860 82828,140 82829,209 82830,140 82831,1151 82831,2697 82831,4903 82832,82833 82835,140 82836,850 82837,640 82838,1220 82838,1222 82839,1688 82839,26288 82839,32978 82839,78717 82840,1359 82841,2421 82842,2574 82843,2372 82844,1858 82845,1860 82846,850 82847,1132 82848,1132 82849,781 82850,781 82852,805 82853,1132 82854,781 82855,147 82856,72 82857,344 82858,285 82859,1181 82860,202 82860,203 82861,79 82862,720 82863,2421 82864,1132 82865,781 82866,1983 82867,54 82868,2646 82869,289 82869,290 82869,1631 82870,337 82870,500 82871,301 82871,968 82872,439 82872,1474 82872,1612 82872,1789 82873,136 82873,1332 82873,1368 82874,202 82874,203 82875,2105 82876,467 82877,302 82879,4039 82880,713 82881,298 82884,58 82884,1140 82885,885 82886,50 82886,1515 82887,240 82888,10 82889,968 82890,24505 82891,151 82892,248 82893,2421 82896,1140 82897,1392 82898,406 82900,349 82900,809 82901,1515 82902,68069 82903,1837 82904,140 82905,82906 82905,86955 82905,101654 82905,105045 82905,108544 82905,124950 82907,1837 82908,4 82908,5 82908,184 82908,602 82908,3218 82909,1160 82910,483 82911,77 82912,1608 82913,850 82914,82915 82916,34 82916,35 82917,485 82919,298 82920,1983 82921,79 82922,222 82922,1019 82923,298 82924,485 82925,8270 82926,640 82927,72 82928,640 82930,640 82931,30 82932,2048 82933,1531 82934,7360 82936,862 82937,82938 82939,1551 82940,422 82941,1392 82942,422 82943,422 82944,9560 82945,422 82946,82947 82948,422 82949,422 82950,2286 82951,72 82952,4192 82952,4193 82953,1118 82954,376 82955,885 82956,275 82957,422 82958,640 82959,422 82961,3367 82962,247 82963,1132 82964,781 82965,4039 82966,1608 82967,850 82968,82968 82969,140 82970,267 82971,861 82972,298 82973,485 82975,527 82975,1188 82977,261 82978,82979 82980,784 82981,647 82982,344 82983,206 82984,209 82985,72 82986,344 82987,285 82988,872 82989,5101 82990,247 82991,206 82992,134 82993,994 82994,510 82995,217 82995,1796 82996,392 82997,1127 82998,557 82999,557 83000,206 83001,515 83001,770 83001,49057 83002,255 83003,604 83004,1175 83005,83006 83007,2620 83008,10 83009,1983 83010,8788 83011,2351 83012,328 83013,175 83014,1623 83015,298 83016,485 83017,30 83018,392 83018,697 83019,305 83020,2296 83021,240 83021,1285 83022,250 83022,1684 83024,298 83025,485 83027,44 83028,602 83029,192 83030,4453 83031,1132 83032,781 83033,72 83034,46 83034,58 83034,994 83035,192 83036,310 83038,298 83039,485 83040,151 83041,72 83042,2411 83043,298 83044,1462 83044,8537 83045,83046 83045,86218 83045,100158 83045,105822 83045,111749 83047,83048 83050,33611 83051,192 83052,1096 83053,30 83054,5440 83055,211 83056,175 83057,298 83058,24505 83059,1860 83060,1181 83061,83062 83063,72 83065,72 83066,83067 83068,83069 83070,626 83071,83072 83073,146 83074,63 83075,3999 83076,83077 83078,298 83079,30 83081,192 83082,83083 83085,585 83087,1 83088,557 83091,392 83092,1522 83093,72 83095,388 83095,14126 83096,687 83097,602 83098,1359 83099,1556 83100,1844 83101,2266 83102,30 83103,83104 83105,5440 83106,30 83107,30 83108,83109 83110,83111 83112,818 83113,9007 83114,652 83115,72 83116,72 83117,119 83118,83119 83120,24505 83121,366 83122,366 83123,366 83124,366 83125,366 83126,366 83127,366 83128,366 83129,366 83130,366 83131,83132 83133,163 83134,1033 83135,134 83136,2048 83138,1130 83139,1392 83140,968 83140,1241 83140,1436 83141,83142 83143,422 83144,56 83145,140 83145,160 83146,233 83147,140 83148,1332 83149,83150 83152,83153 83154,140 83154,1381 83155,2312 83155,83156 83157,140 83158,5718 83163,30 83165,30 83166,72 83168,83169 83170,30 83171,163 83171,809 83171,83172 83174,968 83174,1293 83175,676 83177,868 83178,1749 83180,116 83180,994 83180,1010 83180,1849 83180,2087 83181,137 83183,136 83185,355 83186,83187 83188,1147 83188,1789 83188,75912 83189,3370 83189,14453 83191,83192 83193,175 83194,1247 83194,1644 83195,140 83196,579 83196,673 83198,178 83199,1105 83200,1132 83201,781 83202,422 83203,56 83204,79 83205,211 83205,1556 83205,2312 83206,45021 83207,45024 83208,83209 83210,45310 83211,45023 83212,45022 83213,78232 83214,30766 83215,32 83216,140 83217,338 83217,818 83218,518 83218,1326 83219,3413 83221,140 83221,16196 83224,1566 83225,868 83226,5326 83228,467 83229,972 83230,3 83231,83232 83231,111741 83234,422 83235,422 83236,360 83237,83238 83239,422 83241,422 83242,422 83243,422 83244,422 83245,422 83246,640 83247,640 83248,3069 83250,195 83251,489 83252,83253 83255,278 83255,338 83257,302 83258,557 83259,358 83260,2775 83261,447 83262,843 83262,1231 83263,15 83264,34 83264,35 83264,37 83264,41 83264,68 83264,71 83264,83 83264,86 83264,107 83264,136 83264,151 83264,167 83264,187 83264,222 83264,240 83264,248 83264,251 83264,294 83264,313 83264,347 83264,417 83264,424 83264,431 83264,467 83264,557 83264,589 83264,605 83264,615 83264,631 83264,736 83264,784 83264,795 83264,805 83264,818 83264,843 83264,861 83264,907 83264,920 83264,934 83264,957 83264,973 83264,980 83264,1001 83264,1012 83264,1119 83264,1124 83264,1133 83264,1140 83264,1167 83264,1210 83264,1235 83264,1241 83264,1243 83264,1285 83264,1335 83264,1370 83264,1612 83264,1782 83264,1785 83264,1815 83264,1955 83264,2260 83264,2590 83264,2620 83264,2931 83264,2979 83264,2995 83264,3135 83264,3193 83264,5547 83264,9021 83264,13136 83264,103860 83265,72 83266,344 83267,285 83269,3260 83270,72 83271,422 83272,56 83273,298 83274,485 83275,58 83276,1132 83277,781 83279,48 83280,30 83281,298 83282,485 83284,30 83285,93 83285,94 83286,4193 83287,2775 83288,1983 83289,83 83290,79 83291,973 83293,149 83294,920 83295,2626 83296,3804 83297,1132 83298,781 83299,20771 83300,18726 83301,217 83301,240 83301,392 83301,1085 83301,1417 83301,1467 83301,9005 83302,72 83303,439 83304,1556 83305,30 83306,733 83307,79 83308,81661 83310,75912 83311,3447 83312,1243 83313,2116 83314,68 83314,79 83314,192 83314,222 83314,333 83314,467 83314,516 83314,631 83314,1119 83314,1284 83314,1623 83314,1722 83315,275 83315,1265 83315,1266 83316,2775 83317,2353 83317,75912 83319,252 83319,586 83321,167 83321,972 83321,973 83321,1010 83321,1732 83321,73570 83322,83323 83326,31934 83328,3524 83329,14989 83330,30 83331,968 83332,298 83333,485 83334,50 83335,515 83337,30 83338,251 83338,516 83338,1512 83338,5992 83339,30 83340,389 83340,1019 83340,1467 83340,2421 83341,240 83341,1309 83342,79 83342,312 83342,1749 83343,240 83344,3069 83345,1284 83346,298 83347,485 83348,1707 83349,22 83349,718 83350,422 83351,56 83352,298 83353,485 83354,298 83355,485 83356,1983 83357,298 83358,485 83359,1551 83360,312 83360,525 83360,1749 83361,175 83362,1240 83363,1655 83364,2017 83365,30 83366,1132 83367,781 83368,794 83369,444 83370,493 83370,586 83370,1265 83370,1266 83370,1370 83372,158 83373,868 83374,557 83375,30 83376,72 83377,83378 83379,602 83379,694 83379,733 83379,1014 83379,1326 83379,1844 83379,1955 83379,13538 83380,919 83381,298 83382,485 83383,336 83383,75912 83384,392 83384,433 83384,875 83385,3069 83386,83387 83388,1122 83389,726 83390,83391 83392,136 83393,733 83394,312 83395,1243 83396,83397 83396,202253 83398,298 83399,485 83400,111 83401,147 83401,336 83401,1888 83401,149534 83402,477 83403,83404 83405,336 83405,640 83406,240 83406,406 83407,58 83408,46 83409,58 83410,46 83411,83412 83413,1977 83413,1978 83414,30 83415,20 83416,693 83417,1147 83418,1983 83419,72 83420,344 83421,285 83422,251 83422,1927 83423,2116 83424,30 83425,489 83425,1531 83428,178 83428,346 83428,435 83428,439 83428,447 83428,1531 83428,1590 83428,5212 83428,6119 83429,1381 83430,83431 83432,596 83433,302 83433,344 83434,22 83434,240 83434,516 83435,4611 83436,302 83437,875 83439,599 83441,372 83441,1888 83442,63 83444,1118 83445,81 83445,1392 83445,1745 83446,349 83446,392 83446,623 83447,406 83448,22 83449,462 83449,872 83450,2775 83451,222 83454,1983 83456,340 83457,1298 83459,595 83460,160 83462,2116 83463,30 83464,30 83465,72764 83466,72 83467,147 83467,1803 83468,344 83469,285 83470,83471 83472,1181 83473,178 83474,406 83475,83476 83477,83476 83478,83476 83479,83476 83480,302 83480,811 83480,893 83481,30 83483,147 83483,158 83484,158 83484,406 83485,30 83486,83487 83489,875 83490,861 83490,2116 83491,10 83492,272 83493,301 83493,1782 83494,298 83495,485 83496,104 83496,134 83496,631 83496,1119 83496,1179 83496,1282 83496,1715 83496,2286 83498,1955 83498,2089 83498,2286 83498,2940 83498,21944 83499,1132 83500,781 83502,264 83503,178 83504,41 83504,72 83504,79 83504,104 83504,120 83504,163 83504,178 83504,192 83504,200 83504,211 83504,222 83504,275 83504,301 83504,315 83504,328 83504,349 83504,358 83504,366 83504,372 83504,389 83504,390 83504,392 83504,397 83504,406 83504,467 83504,481 83504,500 83504,544 83504,562 83504,571 83504,588 83504,590 83504,596 83504,602 83504,660 83504,666 83504,671 83504,694 83504,760 83504,779 83504,784 83504,801 83504,809 83504,818 83504,868 83504,920 83504,949 83504,957 83504,972 83504,1010 83504,1019 83504,1085 83504,1119 83504,1140 83504,1149 83504,1188 83504,1220 83504,1222 83504,1224 83504,1240 83504,1276 83504,1284 83504,1345 83504,1359 83504,1385 83504,1419 83504,1462 83504,1515 83504,1616 83504,1623 83504,1631 83504,1707 83504,1801 83504,1815 83504,1858 83504,1893 83504,1904 83504,1908 83504,1983 83504,2371 83504,2557 83504,2572 83504,2775 83504,3115 83504,3182 83504,3258 83504,4455 83504,5102 83504,5405 83504,8270 83504,8332 83504,8537 83504,17309 83504,21442 83504,28130 83504,30365 83504,31803 83504,40566 83504,68069 83504,75912 83504,80519 83504,81070 83504,86832 83504,95278 83504,127158 83504,128466 83504,141912 83504,142430 83504,162599 83504,175323 83504,178576 83504,201326 83504,220502 83505,713 83506,178 83507,83508 83509,104 83509,557 83510,261 83510,333 83511,302 83511,893 83512,301 83512,444 83512,1300 83513,515 83514,1 83514,1227 83514,86416 83516,83517 83518,483 83519,972 83520,581 83520,750 83520,2923 83520,4571 83521,48 83524,516 83525,70631 83527,21944 83528,30 83529,298 83530,485 83531,671 83533,1181 83534,1078 83535,586 83536,6682 83537,563 83538,2292 83539,8788 83540,272 83541,1140 83542,868 83543,602 83544,392 83544,1010 83545,22 83546,2557 83547,111 83547,2209 83548,992 83548,1631 83548,1973 83548,2045 83548,2266 83548,6638 83548,29475 83548,88653 83548,88654 83549,827 83550,222 83551,832 83552,1220 83552,1222 83554,202 83554,203 83555,83556 83557,272 83558,272 83559,622 83560,1515 83561,620 83562,1467 83563,296 83564,83565 83566,264 83567,388 83568,1888 83569,557 83570,34 83570,35 83571,657 83572,1 83573,660 83574,72 83575,344 83576,285 83577,24505 83578,406 83580,1132 83581,781 83582,147 83582,195 83584,557 83585,30 83587,1 83588,289 83588,290 83588,94134 83589,1983 83590,72 83591,30 83593,83594 83595,704 83596,424 83597,885 83598,1220 83598,4220 83599,175 83600,298 83601,485 83602,3507 83603,1466 83604,298 83605,72 83606,9121 83607,2421 83608,1370 83609,647 83610,344 83611,809 83612,602 83613,10 83614,264 83615,2674 83616,83617 83618,1370 83619,1607 83619,1634 83621,3 83622,298 83623,485 83624,4611 83625,1789 83626,779 83626,1515 83627,247 83628,1132 83629,781 83630,455 83630,1019 83631,811 83632,83632 83633,1127 83635,493 83636,5405 83637,1860 83638,1227 83638,1229 83639,671 83640,83 83641,83642 83643,83644 83645,30 83646,298 83647,485 83648,1782 83649,422 83650,56 83651,240 83651,289 83651,290 83651,338 83651,144988 83652,527 83654,3161 83655,83656 83657,557 83658,557 83659,50 83660,527 83660,743 83661,422 83662,56 83663,287 83664,298 83665,485 83666,422 83667,56 83668,1181 83668,3507 83669,1363 83670,30 83671,298 83672,485 83673,376 83674,885 83675,1707 83676,118 83676,4597 83677,4 83677,5 83677,280 83677,483 83677,644 83677,731 83677,743 83677,885 83677,994 83677,1116 83677,1172 83677,1432 83677,1775 83677,2411 83677,2735 83677,4611 83677,4691 83677,4810 83677,4903 83677,6487 83677,13704 83677,17245 83677,88820 83677,94510 83677,171294 83678,2574 83679,83680 83682,628 83683,278 83683,595 83683,1151 83683,1287 83683,1634 83683,1871 83683,3507 83684,1127 83685,346 83686,1983 83687,805 83688,22 83689,83690 83691,5375 83692,1983 83693,10 83694,1133 83695,577 83696,450 83697,1274 83699,450 83700,58 83701,46 83702,247 83703,1556 83704,602 83705,483 83706,30 83707,83708 83707,217449 83707,223015 83707,223246 83707,224902 83707,226531 83707,257261 83709,1285 83710,273 83711,1227 83711,1229 83712,44 83713,83714 83715,30 83716,134 83717,1608 83718,72764 83719,7360 83720,450 83721,83722 83723,862 83723,1085 83724,93 83724,94 83725,2351 83726,3069 83727,278 83728,1452 83729,3069 83730,4548 83731,516 83732,1363 83733,83734 83735,83734 83736,18726 83737,104 83737,134 83737,136 83738,366 83739,366 83740,366 83741,1019 83742,872 83743,450 83744,872 83745,222 83745,657 83745,1019 83745,1467 83745,2421 83745,5343 83746,376 83747,376 83748,30 83749,72 83750,872 83751,1238 83753,83754 83755,83754 83756,83754 83757,83754 83758,18726 83759,83760 83761,167 83761,2083 83762,72 83763,258 83766,240 83768,72 83769,455 83770,83771 83772,298 83773,485 83774,1984 83774,8714 83775,83776 83777,422 83778,56 83780,3 83780,304 83782,83783 83784,233 83785,390 83786,83787 83788,83789 83792,8855 83794,50 83794,422 83796,408 83798,151 83798,4678 83799,8270 83801,1132 83802,781 83804,83805 83806,22 83806,515 83807,7757 83808,2574 83809,355 83812,309 83812,310 83813,37414 83814,481 83815,652 83818,968 83819,1132 83820,781 83821,2351 83822,8270 83824,2567 83825,302 83827,2782 83829,264 83831,5212 83832,865 83833,118 83833,4597 83834,8719 83835,21944 83836,298 83837,485 83838,255 83839,387 83840,1160 83842,818 83843,779 83844,222 83846,1983 83847,31934 83848,31934 83849,640 83850,1267 83851,5547 83852,83853 83855,151 83856,192 83858,200 83858,225 83858,248 83858,1332 83859,911 83860,422 83861,422 83862,422 83863,422 83864,349 83865,147 83865,158 83865,89035 83866,392 83867,422 83868,422 83869,422 83870,422 83871,1608 83873,652 83876,493 83876,779 83877,298 83878,485 83879,424 83880,58 83881,46 83883,713 83884,63 83885,1858 83886,1860 83887,1556 83888,932 83889,24505 83890,285 83890,1515 83891,203 83891,479 83892,640 83892,146280 83892,159365 83895,1122 83896,3 83897,83 83898,663 83898,664 83900,83901 83902,2797 83903,3623 83904,304 83905,1985 83905,2775 83906,602 83907,175 83908,83909 83911,298 83912,68 83913,704 83915,920 83917,1388 83918,602 83921,516 83922,83923 83922,87342 83924,577 83925,264 83926,1247 83926,1644 83927,120 83927,455 83927,1019 83928,302 83929,24505 83930,200 83932,48 83932,731 83933,4611 83934,1544 83935,2411 83936,240 83937,980 83938,10 83939,1559 83940,805 83940,1001 83940,1085 83940,1659 83940,4222 83940,6068 83940,178576 83940,212692 83941,1181 83943,1323 83944,102 83945,1326 83946,408 83947,272 83947,447 83947,1033 83947,1877 83949,275 83949,72439 83950,1983 83951,1983 83953,818 83954,557 83955,605 83956,5405 83957,811 83958,328 83960,2782 83961,1167 83962,647 83963,344 83966,479 83967,392 83967,2699 83968,298 83969,485 83970,736 83971,10 83971,113156 83972,83973 83974,120 83974,283 83974,455 83974,949 83974,1201 83974,1801 83974,2779 83974,2784 83974,4637 83974,13980 83975,83976 83977,5547 83978,18726 83979,22 83980,1509 83982,24505 83983,298 83984,485 83985,1977 83985,1978 83986,9121 83987,1082 83988,477 83989,251 83990,1634 83991,827 83992,604 83994,264 83995,18298 83996,93 83996,94 83997,647 83997,1893 83998,58 83999,46 84000,1181 84001,784 84002,3422 84003,4672 84005,63 84005,252 84005,516 84005,1220 84005,1222 84006,1181 84007,581 84009,184 84010,302 84011,58 84012,46 84013,1181 84014,3555 84015,4611 84016,1544 84017,745 84017,1677 84018,312 84018,516 84019,596 84020,72 84021,171 84022,81 84023,107 84023,675 84023,1515 84023,1849 84023,89035 84024,310 84024,3039 84025,160 84026,2737 84027,518 84028,3193 84029,31122 84030,84031 84032,247 84033,310 84034,217 84034,278 84034,356 84034,536 84035,84036 84037,267 84038,313 84038,1309 84038,1805 84038,2105 84038,4597 84038,75912 84039,668 84040,84041 84043,994 84044,304 84044,644 84044,994 84044,1801 84045,1010 84048,120 84048,1419 84049,2421 84050,158 84050,247 84051,15523 84052,1608 84053,1235 84053,1335 84054,84055 84056,79 84057,872 84058,379 84060,84061 84060,113361 84060,123893 84060,124641 84060,132810 84060,142700 84062,485 84066,2421 84067,2421 84068,1359 84070,3069 84071,1722 84072,30 84074,660 84075,1590 84076,10 84077,1836 84078,336 84079,84080 84081,192 84083,146 84083,779 84083,1515 84084,720 84084,877 84084,907 84084,1284 84084,1522 84084,1732 84084,2191 84084,3194 84084,3422 84085,86 84086,605 84087,5662 84088,1849 84089,301 84090,1231 84091,5718 84092,1564 84093,2083 84094,2620 84095,1837 84096,3422 84097,3193 84098,1241 84099,1782 84100,1522 84101,2191 84102,907 84103,3194 84104,1167 84105,968 84106,1544 84107,3218 84108,3207 84109,3138 84110,2557 84111,1298 84112,720 84113,1210 84114,1359 84115,2421 84116,104 84117,146 84118,328 84119,84120 84121,589 84121,818 84121,907 84121,953 84121,1414 84121,2351 84121,2995 84121,6068 84121,8788 84121,15573 84123,2775 84124,447 84125,264 84126,406 84127,433 84128,58 84129,46 84130,30 84131,30 84132,356 84133,415 84133,431 84133,509 84133,631 84133,1453 84133,1454 84133,1949 84133,3258 84133,21982 84134,392 84135,192 84135,333 84135,84136 84137,202 84137,203 84138,247 84139,30 84140,698 84141,84142 84143,1082 84144,779 84145,10 84146,30 84147,84148 84149,222 84149,240 84149,657 84150,10 84151,10 84152,30 84153,1556 84154,10 84155,30 84157,713 84158,30 84159,1118 84160,615 84160,968 84160,1293 84160,1300 84161,2048 84162,450 84164,72 84165,1181 84166,30 84167,450 84168,3321 84169,589 84169,5358 84170,84171 84172,1634 84174,72 84176,1085 84177,15119 84178,1203 84179,10 84180,577 84183,10 84184,557 84185,30 84186,657 84187,1531 84188,25873 84189,1608 84190,483 84192,358 84193,694 84193,2775 84194,84195 84196,20 84196,309 84196,310 84196,577 84196,929 84196,1400 84196,2372 84196,21442 84196,21944 84197,577 84198,640 84199,1807 84200,298 84201,485 84202,462 84202,1673 84203,1181 84204,2775 84205,10 84206,72 84207,8990 84208,516 84209,3999 84210,267 84211,10 84212,32 84212,392 84212,1363 84212,2274 84212,2699 84213,84214 84215,298 84216,485 84217,84218 84219,557 84220,557 84221,30 84222,376 84223,15179 84224,885 84225,44 84226,6682 84227,2116 84228,314 84228,698 84229,626 84230,118 84230,4597 84231,536 84232,2146 84233,58 84234,46 84236,84237 84238,175 84239,298 84240,602 84241,440 84242,30 84243,577 84244,298 84245,485 84246,406 84247,72 84248,9025 84249,3872 84250,1608 84251,1782 84252,84253 84254,72 84255,83 84255,1235 84255,1335 84256,84257 84258,250 84258,1684 84259,1711 84260,72 84261,72 84262,84263 84264,1888 84264,1962 84265,30 84266,602 84267,1235 84267,1335 84268,72 84269,450 84270,72 84271,32475 84272,664 84272,20359 84273,644 84274,13 84275,30 84276,73452 84277,84278 84279,30 84280,479 84281,30 84282,84283 84284,2590 84285,1298 84286,602 84287,1893 84288,1849 84289,84290 84289,100895 84289,109798 84289,112126 84291,84292 84293,84294 84295,84296 84295,96506 84297,84292 84298,207 84299,30 84300,84301 84302,872 84303,1429 84304,30 84305,920 84306,84307 84309,668 84310,84311 84312,84313 84314,697 84314,1769 84315,18726 84316,4895 84318,1238 84320,2073 84321,84322 84324,84325 84324,215733 84327,310 84328,309 84328,310 84329,1143 84330,72 84331,84331 84334,30 84335,676 84337,346 84338,366 84339,366 84340,2782 84342,84343 84344,84345 84346,431 84347,84348 84349,84350 84351,84352 84353,72 84354,84355 84356,10 84357,779 84358,84359 84360,72 84361,84362 84361,129382 84361,130126 84363,310 84364,72 84365,84366 84368,233 84369,84370 84371,818 84373,2775 84374,211 84375,10 84375,113156 84378,2048 84379,298 84380,485 84381,75912 84384,72 84385,75912 84386,8854 84387,17228 84388,349 84389,2443 84392,298 84393,485 84394,4611 84395,1544 84396,3447 84397,355 84398,298 84399,485 84400,298 84401,485 84402,75912 84403,107 84403,118 84403,306 84403,307 84403,309 84403,310 84403,417 84403,483 84403,644 84403,784 84403,1240 84403,1432 84403,1571 84403,1722 84403,1912 84403,2315 84403,2367 84403,4597 84403,4771 84403,6556 84403,15807 84403,19010 84403,232766 84405,272 84406,84407 84406,117511 84406,200790 84408,644 84408,668 84409,392 84410,805 84411,1432 84412,298 84413,485 84414,298 84415,485 84416,146 84416,2699 84417,298 84418,485 84419,79 84420,298 84421,485 84422,72 84424,298 84425,485 84426,72 84427,298 84428,485 84429,911 84430,298 84431,485 84432,72 84433,376 84434,2116 84435,24505 84436,314 84437,147 84437,158 84437,1181 84437,2244 84438,298 84439,485 84440,298 84441,485 84442,140 84444,346 84445,171 84446,163 84447,1847 84448,298 84449,485 84450,1247 84450,1644 84451,130 84452,222 84453,298 84454,485 84455,171 84456,298 84457,485 84458,336 84458,422 84458,1803 84458,1837 84460,298 84461,485 84462,298 84463,485 84464,160 84464,424 84466,211 84467,298 84468,485 84469,640 84470,298 84471,485 84472,640 84473,640 84474,259 84474,577 84475,24505 84476,104 84476,138 84476,503 84476,1212 84476,1282 84476,1882 84477,1274 84478,310 84478,3039 84479,392 84479,1893 84480,920 84481,24505 84482,84483 84484,217 84485,497 84486,483 84486,602 84489,87 84490,63 84490,140 84490,360 84491,298 84492,485 84493,392 84493,809 84493,872 84493,15609 84495,527 84495,81233 84496,84497 84498,178 84498,779 84499,2775 84500,1087 84501,104 84501,557 84501,953 84501,954 84502,1844 84503,2116 84504,83 84505,356 84507,563 84507,2782 84508,1353 84509,422 84510,422 84511,422 84512,422 84513,422 84514,422 84515,298 84516,485 84520,298 84521,485 84522,1172 84523,1085 84524,30 84525,298 84526,485 84527,10 84530,911 84531,304 84532,84533 84532,90660 84534,602 84535,1807 84537,84538 84539,1227 84539,1229 84540,171 84543,298 84544,485 84545,406 84546,1323 84547,102 84548,1326 84549,408 84550,72 84551,104 84551,136 84551,138 84551,557 84551,1368 84552,2775 84553,907 84554,298 84555,485 84556,41 84556,1119 84557,1132 84558,781 84559,1 84559,130 84559,138 84559,160 84559,163 84559,256 84559,287 84559,294 84559,299 84559,305 84559,349 84559,459 84559,596 84559,634 84559,663 84559,664 84559,668 84559,690 84559,718 84559,832 84559,968 84559,1298 84559,1345 84559,1381 84559,1454 84559,1837 84559,1860 84559,1871 84559,1891 84560,84561 84564,602 84567,596 84569,602 84570,491 84571,84572 84573,6323 84574,6323 84575,809 84575,2116 84576,1149 84578,6323 84579,79 84580,171 84581,422 84582,1220 84582,1222 84583,252 84584,251 84585,2775 84586,749 84587,1858 84589,21944 84590,147 84591,298 84592,485 84594,2116 84595,43610 84596,602 84597,1133 84598,8598 84599,372 84599,2146 84601,1140 84602,1707 84603,298 84604,485 84606,149 84606,158 84607,10 84608,557 84609,259 84609,273 84609,415 84609,22293 84610,206 84611,1522 84612,2205 84612,2206 84612,33424 84613,84614 84615,392 84615,697 84616,84617 84618,3413 84619,175 84620,298 84621,273 84621,682 84621,72439 84622,30 84623,84624 84625,211 84625,500 84626,252 84627,2017 84628,577 84630,393 84631,920 84634,1033 84635,873 84635,1052 84635,5405 84636,1191 84637,84638 84641,2205 84641,2206 84641,33424 84642,1370 84643,4504 84643,8989 84645,206 84645,2487 84646,422 84647,720 84648,9098 84649,30 84650,84651 84650,85511 84650,86766 84650,98676 84650,101139 84650,101664 84653,252 84654,1113 84655,1191 84655,5405 84656,111 84657,668 84658,805 84659,192 84661,30 84662,302 84663,81 84663,192 84664,3161 84665,84666 84667,1010 84668,84669 84668,157996 84670,1531 84671,30 84672,720 84673,93 84673,94 84676,30 84677,120 84678,84679 84678,95319 84678,122232 84680,30 84681,843 84681,75912 84683,84684 84686,1634 84687,749 84688,147 84688,149 84688,184 84688,1623 84690,84691 84692,30 84693,1425 84696,1181 84697,84698 84699,3069 84700,861 84702,1345 84702,1655 84703,417 84704,827 84705,5469 84706,24505 84707,1608 84708,30 84709,5440 84710,1227 84710,1229 84711,929 84712,652 84713,4611 84714,3135 84715,1858 84716,1860 84717,275 84718,280 84718,1877 84718,17245 84719,126 84719,1300 84720,589 84721,1419 84722,1070 84723,994 84724,2379 84725,118 84725,4597 84726,72 84727,2205 84727,2206 84728,147 84728,149 84729,1539 84730,19443 84731,859 84732,84733 84732,84956 84732,97001 84732,97634 84732,104904 84732,124724 84732,129617 84734,1860 84735,84733 84736,1858 84737,1860 84739,259 84740,852 84741,83 84742,23010 84743,640 84744,211 84745,2045 84746,84747 84748,693 84749,30331 84750,372 84751,195 84752,118 84752,4597 84753,620 84754,298 84755,485 84757,2797 84759,1240 84760,72 84761,24505 84762,84763 84764,84763 84765,84763 84765,90852 84766,749 84767,640 84768,118 84768,4597 84769,84770 84771,84772 84773,84774 84775,1556 84776,175 84777,298 84778,640 84779,557 84780,3 84782,1858 84783,1860 84784,72 84785,72 84786,355 84787,84257 84788,84789 84790,84791 84792,640 84793,536 84794,2073 84795,30 84795,557 84795,1332 84795,5405 84795,84796 84798,358 84799,868 84800,72 84801,433 84802,3260 84803,8719 84804,138 84805,865 84806,557 84807,137 84808,118 84808,4597 84809,21944 84810,68069 84811,809 84812,84813 84814,84815 84814,86980 84814,91457 84814,176987 84816,1132 84817,781 84819,248 84820,1836 84821,1782 84822,106 84822,586 84822,1370 84822,6119 84823,676 84824,586 84825,4193 84825,8822 84826,72 84827,72 84828,1983 84829,84830 84831,72 84832,83 84833,84834 84835,72 84836,84837 84838,84837 84839,577 84840,217 84841,2797 84842,505 84843,255 84844,211 84845,298 84846,485 84847,1181 84848,347 84848,1402 84849,4611 84850,72 84851,557 84852,557 84853,83 84854,557 84855,2775 84856,83 84858,84859 84860,518 84860,622 84860,682 84860,891 84860,1326 84860,2646 84860,2775 84860,57354 84860,72439 84860,156379 84861,2116 84862,72 84863,72 84864,602 84865,422 84866,422 84867,422 84868,422 84870,84871 84872,136 84873,289 84873,290 84874,72 84875,422 84876,422 84877,298 84878,485 84879,743 84880,72 84881,84882 84883,477 84884,310 84885,44 84886,72 84887,577 84888,248 84889,422 84890,4611 84891,422 84892,1 84893,298 84894,485 84895,422 84896,72 84898,7614 84899,84900 84901,525 84902,72 84903,50 84903,211 84903,571 84903,868 84905,72 84907,72 84908,84909 84910,30 84912,83 84913,644 84914,72 84916,187 84917,84918 84919,2351 84920,8788 84921,72 84922,30 84923,636 84925,615 84926,704 84927,2590 84928,84929 84930,72 84931,72 84932,1359 84933,72 84934,1118 84934,1181 84935,84936 84937,72 84938,207 84939,84940 84941,305 84942,72 84943,301 84944,84945 84944,132646 84944,144847 84946,72 84947,81 84948,872 84949,1429 84950,1590 84951,10 84952,3413 84953,668 84954,640 84957,84958 84957,99950 84957,124351 84959,84956 84960,84961 84962,1379 84963,175 84965,298 84967,167 84967,392 84967,1240 84968,30 84969,188 84970,2266 84971,3331 84972,63 84973,615 84974,483 84975,1749 84976,1143 84977,2292 84978,167 84979,704 84980,84981 84982,84983 84985,72 84986,872 84987,222 84988,84989 84988,100529 84988,255613 84990,84991 84992,65 84992,252 84992,994 84992,1572 84992,2797 84992,3260 84992,3846 84993,84994 84993,258743 84995,151 84996,84997 84998,225 84999,175 85000,298 85001,147 85001,158 85002,85003 85004,85005 85006,85007 85008,85009 85010,1977 85010,1978 85011,872 85012,8884 85013,1085 85014,366 85015,9195 85016,85017 85018,68 85019,8270 85020,233 85021,85022 85024,30 85025,28072 85026,85027 85028,1531 85029,72 85030,481 85030,2083 85030,4637 85031,140 85032,85033 85034,72 85036,355 85037,1001 85038,1858 85039,1860 85040,1140 85040,2443 85040,32751 85041,622 85041,1531 85042,85043 85044,1247 85044,1644 85045,743 85046,45024 85047,45310 85048,45023 85049,30766 85050,83209 85051,49887 85052,392 85053,9195 85054,175 85055,298 85056,13 85057,78400 85058,34 85058,35 85058,106 85058,586 85058,588 85058,590 85058,17772 85059,85060 85062,33082 85063,202 85063,203 85064,349 85065,83 85066,422 85067,56 85068,85069 85070,85071 85073,85072 85074,30 85075,83 85076,195 85077,30 85078,240 85079,171 85080,85081 85080,94625 85082,85083 85082,87354 85082,98408 85082,100544 85082,106204 85082,231907 85084,1323 85085,102 85086,1326 85087,408 85088,48 85089,3447 85090,298 85091,485 85092,615 85093,485 85094,158 85094,192 85094,252 85095,163 85097,6323 85098,489 85099,4101 85100,3069 85101,30 85102,1181 85103,417 85104,1287 85105,119 85106,264 85107,93 85107,94 85108,85108 85109,32475 85110,1235 85110,1335 85111,647 85112,285 85113,85114 85115,298 85116,485 85117,2931 85118,225 85119,76096 85120,1096 85121,30 85122,1151 85123,252 85124,3999 85125,8270 85126,85127 85128,48 85129,85130 85129,86948 85129,107056 85131,3413 85132,16045 85133,85134 85135,907 85136,1181 85137,85137 85138,85139 85138,86158 85138,88327 85138,108438 85138,127628 85138,129527 85140,1634 85141,30 85142,450 85143,30 85144,30 85145,1381 85146,85147 85149,994 85150,30 85151,85152 85153,9195 85154,1309 85155,907 85156,718 85157,1332 85158,1132 85159,781 85160,376 85161,206 85162,3447 85163,85164 85165,10 85165,113156 85166,1579 85167,1983 85168,85169 85170,3148 85172,85173 85174,1300 85176,50321 85177,85178 85179,1381 85180,44 85181,85182 85181,150236 85183,271 85184,477 85185,85186 85187,298 85188,485 85189,30 85190,298 85191,485 85193,85194 85195,85196 85197,85198 85199,1479 85200,298 85201,485 85203,15573 85204,50 85205,85206 85208,3079 85209,85210 85211,636 85212,595 85213,298 85214,485 85215,146 85216,85217 85218,10 85219,85220 85221,85222 85223,85224 85225,85226 85227,602 85228,85229 85230,4060 85231,126 85232,85233 85234,850 85235,602 85236,298 85237,485 85238,85239 85240,85241 85242,6837 85243,1844 85244,146 85245,85246 85247,85248 85249,393 85250,31934 85251,85252 85253,31934 85254,175 85255,298 85256,4611 85257,483 85258,6682 85259,1309 85260,85261 85262,347 85263,85264 85265,85266 85267,85268 85269,85270 85272,85272 85273,3321 85274,85275 85276,85277 85276,96902 85276,104624 85276,107586 85278,85279 85280,72 85281,85282 85283,85284 85285,85286 85287,85288 85289,10 85290,83 85291,72 85293,85294 85295,85294 85295,109784 85295,145006 85297,233 85298,30 85300,862 85302,72 85303,1181 85304,85305 85304,145784 85306,602 85307,602 85308,8270 85309,18726 85310,107 85311,2416 85311,2417 85312,292 85313,338 85314,298 85316,3538 85317,1133 85318,85319 85323,85324 85325,85324 85326,355 85327,872 85328,1858 85329,1860 85330,85331 85332,85333 85334,298 85335,485 85336,85337 85339,85340 85343,85344 85345,45021 85346,45022 85347,78232 85348,85349 85350,392 85351,4691 85352,602 85353,85354 85355,259 85358,63 85359,376 85360,298 85361,275 85362,275 85363,240 85364,275 85365,275 85366,749 85367,275 85368,275 85369,275 85370,1323 85371,102 85372,1326 85373,408 85374,85375 85376,693 85377,640 85378,333 85379,1102 85380,652 85381,8788 85382,953 85383,2351 85384,6068 85385,589 85388,85389 85390,184 85391,1227 85391,1229 85391,86416 85392,536 85393,72 85395,85396 85397,72 85398,85399 85400,602 85401,827 85402,85403 85404,2506 85405,298 85406,485 85407,85408 85409,872 85410,872 85411,2351 85412,85413 85414,195 85416,85417 85418,450 85419,18298 85420,292 85421,85422 85425,2048 85426,85427 85428,85429 85430,211 85432,652 85433,336 85434,1983 85435,1116 85436,818 85437,85438 85439,6682 85440,85441 85443,18726 85444,7155 85445,298 85446,485 85447,1132 85448,781 85449,278 85449,455 85450,85451 85452,72 85453,85454 85455,333 85456,217 85457,85458 85459,1160 85459,73570 85460,577 85460,862 85461,22 85462,31934 85463,22 85464,72 85465,1844 85466,24505 85467,30 85468,147 85469,99 85470,841 85473,1531 85474,872 85475,636 85476,85477 85478,298 85479,485 85481,81070 85482,4903 85483,52 85483,175 85483,140269 85485,30 85486,852 85486,4218 85486,4222 85488,1247 85488,1644 85489,72 85490,636 85491,376 85492,85493 85494,85495 85496,85495 85497,31934 85498,14434 85499,298 85500,485 85502,1844 85503,349 85504,85505 85506,18726 85507,85508 85509,85510 85512,206 85512,1096 85513,85514 85515,2779 85516,85517 85518,9195 85519,9560 85520,72 85521,346 85522,1287 85523,298 85524,485 85525,147 85525,158 85525,779 85525,1515 85525,240174 85526,72 85527,44 85528,422 85529,422 85530,56 85531,417 85533,557 85535,104 85536,1007 85537,1939 85538,137 85539,85540 85541,4611 85542,392 85543,149 85544,417 85545,85546 85547,85548 85549,366 85550,366 85551,366 85552,557 85553,862 85554,557 85555,309 85555,310 85555,483 85555,6556 85555,232766 85556,557 85557,85558 85559,85560 85561,602 85562,1860 85563,85564 85565,483 85566,333 85567,360 85567,1227 85567,1229 85567,21944 85568,45022 85569,602 85570,392 85571,602 85572,602 85573,4504 85574,602 85575,422 85576,422 85577,422 85578,422 85579,588 85579,590 85580,602 85581,422 85582,422 85583,422 85584,422 85585,422 85586,422 85588,602 85589,602 85590,1506 85591,602 85592,874 85593,3069 85594,93 85594,94 85595,602 85596,1181 85597,310 85598,3258 85599,30 85600,72 85601,8990 85602,3413 85604,310 85605,310 85606,7358 85606,7363 85607,85608 85607,199480 85609,30 85610,4 85610,5 85610,104 85610,557 85610,885 85610,953 85610,954 85610,1368 85610,5405 85611,184 85612,417 85613,175 85614,298 85615,118 85615,333 85616,5366 85617,85618 85619,41 85620,72 85621,1175 85622,10 85622,872 85623,417 85625,417 85626,106 85626,1888 85627,85628 85630,85631 85632,255 85633,85634 85635,85634 85636,85634 85637,932 85638,424 85639,3 85640,640 85641,2334 85642,2572 85643,85644 85645,85646 85647,652 85648,32475 85649,130 85650,85651 85652,4060 85653,85654 85655,206 85656,2244 85656,30331 85657,79 85658,292 85659,294 85660,296 85661,298 85663,3260 85664,175 85665,298 85666,424 85667,13 85668,2048 85669,85670 85671,30 85672,1247 85672,1644 85673,24505 85674,233 85675,3209 85676,599 85677,85678 85680,1238 85681,1452 85682,779 85683,23701 85684,1776 85686,346 85687,273 85688,1132 85689,781 85690,872 85691,1132 85692,781 85693,493 85693,843 85693,3148 85694,872 85695,868 85696,2224 85697,2116 85698,1707 85699,85700 85701,355 85701,873 85703,355 85704,255 85706,636 85707,171 85708,850 85709,24505 85710,217 85711,217 85712,1544 85713,30236 85714,1160 85715,1531 85718,79 85719,360 85719,1235 85719,1335 85720,671 85721,30 85722,3069 85723,75912 85725,4101 85726,104 85727,657 85728,2867 85728,2868 85729,292 85730,372 85731,2779 85731,4594 85734,994 85735,250 85735,1684 85736,14126 85737,15 85738,30 85739,167 85739,252 85739,949 85739,1385 85740,118 85740,4597 85741,30 85742,206 85742,16614 85742,66297 85743,1231 85743,1782 85745,278 85746,48 85747,85748 85747,87424 85749,2719 85751,175 85751,693 85752,206 85752,704 85752,760 85752,1220 85752,1531 85752,1707 85753,805 85754,30 85755,2116 85756,1370 85757,850 85759,85760 85761,640 85762,1479 85762,4545 85762,139010 85763,85764 85763,141317 85765,640 85766,640 85768,1608 85769,1298 85770,18726 85775,85776 85777,81 85778,640 85779,1235 85779,1335 85780,302 85781,850 85782,1556 85783,1837 85784,5405 85785,209 85786,1634 85787,71 85788,83 85789,1983 85790,579 85793,615 85794,2421 85795,900 85796,81233 85797,622 85798,1858 85799,1860 85800,1210 85801,1085 85801,2296 85801,2995 85803,338 85804,104 85804,457 85804,18790 85805,83 85806,147 85807,2775 85808,302 85808,579 85808,861 85809,452 85810,1247 85811,184 85812,34 85812,35 85813,304 85813,1429 85813,1955 85814,30 85814,175 85814,200 85814,225 85814,248 85814,328 85814,364 85814,557 85814,596 85814,772 85814,784 85814,1309 85814,1332 85814,1368 85814,4276 85814,4936 85814,4941 85814,5405 85814,15807 85814,28203 85814,95554 85815,85816 85817,149 85817,859 85817,1623 85818,2867 85818,2868 85819,248 85820,422 85823,13980 85824,85825 85826,875 85827,271 85828,3003 85829,30 85829,328 85829,440 85829,622 85829,809 85829,992 85829,1276 85829,1515 85829,2744 85829,3246 85829,3247 85829,4355 85831,8270 85832,779 85833,171 85834,309 85834,310 85834,473 85834,497 85834,644 85834,872 85834,1058 85834,1188 85835,872 85836,192 85837,1323 85838,102 85839,1326 85840,408 85841,602 85842,178 85842,424 85842,668 85842,698 85842,873 85842,874 85842,1801 85843,93 85843,94 85844,849 85845,4611 85846,85847 85848,571 85848,868 85849,1390 85850,2017 85850,17309 85852,289 85852,290 85852,644 85852,3003 85852,94134 85853,240 85854,30 85855,137 85856,1749 85857,9457 85858,3769 85859,120 85859,315 85859,694 85859,726 85859,953 85859,1353 85859,3585 85860,1983 85861,1132 85862,781 85863,433 85864,252 85864,278 85864,694 85865,850 85866,920 85867,1844 85870,66 85870,527 85870,3246 85872,195 85873,1284 85874,337 85874,586 85876,534 85877,167 85879,147 85879,149 85879,158 85879,206 85879,406 85879,1458 85879,1515 85879,2244 85879,80266 85879,89035 85879,149534 85880,392 85881,372 85882,718 85883,850 85884,2116 85885,310 85886,85887 85889,1068 85890,175 85891,298 85892,406 85893,602 85894,3695 85895,360 85895,602 85896,77 85897,24505 85898,85899 85900,602 85901,3069 85902,636 85903,195 85904,2626 85905,1 85906,1454 85907,714 85907,15119 85908,48 85909,366 85909,389 85909,697 85909,779 85909,21442 85909,76096 85910,76096 85911,433 85912,636 85914,538 85915,920 85916,1436 85916,1454 85917,171 85918,151 85920,875 85921,1265 85921,1266 85921,3297 85922,267 85923,477 85924,1181 85925,30 85926,557 85927,1072 85928,6303 85929,58 85931,1285 85931,59931 85931,84257 85932,1659 85933,151 85934,32 85935,5718 85937,420 85938,20 85939,222 85939,1133 85940,30 85941,1203 85942,2146 85943,195 85943,2868 85944,994 85945,48 85947,1432 85948,94 85948,2787 85949,14434 85950,273 85952,1782 85953,30 85954,390 85956,1522 85957,717 85958,1149 85959,85960 85959,96450 85959,114811 85959,177534 85959,238938 85959,261583 85959,263163 85961,1785 85962,2929 85963,24505 85964,1298 85967,1203 85969,843 85969,2146 85969,5440 85970,1203 85971,1146 85972,1203 85973,85974 85975,333 85975,85974 85976,85974 85976,95129 85977,85974 85977,95129 85978,107 85978,1167 85979,10 85979,65 85979,66 85979,147 85979,149 85979,171 85979,184 85979,192 85979,252 85979,726 85979,859 85979,868 85979,957 85979,1247 85979,1262 85979,1559 85979,1815 85979,2253 85979,21442 85979,164572 85980,663 85980,664 85981,85982 85983,301 85983,968 85983,1782 85984,252 85984,1220 85984,1222 85986,1052 85987,3585 85988,85989 85990,32 85990,392 85991,63 85991,106 85991,337 85991,516 85992,87 85993,406 85994,211 85995,1789 85996,406 85997,8270 85998,536 85999,147 86000,158 86001,390 86002,571 86002,868 86003,178 86003,1531 86003,1541 86005,392 86005,1240 86006,1105 86007,671 86008,535 86009,602 86010,301 86011,1402 86012,509 86012,510 86013,422 86014,56 86015,298 86015,304 86015,3069 86016,1782 86018,309 86018,310 86019,14434 86020,1235 86020,1335 86020,1400 86021,1 86022,1608 86023,83 86024,29380 86025,86026 86027,58 86028,46 86029,3177 86030,58 86031,46 86032,48 86033,1715 86034,422 86035,56 86036,493 86037,48 86038,104 86038,557 86038,953 86038,1939 86039,7 86039,596 86040,636 86041,32 86041,34 86041,35 86041,77 86041,111 86041,202 86041,203 86041,217 86041,261 86041,283 86041,323 86041,346 86041,358 86041,388 86041,392 86041,406 86041,455 86041,493 86041,509 86041,536 86041,623 86041,694 86041,805 86041,859 86041,862 86041,873 86041,874 86041,919 86041,949 86041,996 86041,1001 86041,1072 86041,1119 86041,1201 86041,1240 86041,1274 86041,1454 86041,1465 86041,1467 86041,1564 86041,1572 86041,1590 86041,1635 86041,1644 86041,1722 86041,1801 86041,1927 86041,2045 86041,2266 86041,2274 86041,2671 86041,2784 86041,2979 86041,2989 86041,2991 86041,3135 86041,3182 86041,3538 86041,4594 86041,4637 86041,6955 86041,7092 86041,8180 86041,13546 86041,14126 86042,704 86042,1257 86043,272 86043,422 86043,788 86043,911 86044,772 86045,994 86045,3816 86045,3817 86046,86047 86048,86049 86050,1332 86050,1955 86050,8276 86051,1179 86052,79 86053,417 86054,483 86055,1844 86056,86057 86058,86059 86060,657 86061,3297 86062,417 86065,4 86065,5 86065,65 86065,160 86065,355 86065,390 86065,743 86065,1623 86065,3209 86065,3451 86065,3452 86065,17593 86065,142879 86066,620 86067,30 86067,1179 86068,86069 86071,10 86071,1881 86072,808 86073,10 86075,302 86076,47 86076,2469 86077,1858 86078,1860 86079,296 86079,647 86079,991 86079,1749 86080,697 86081,1607 86082,4223 86083,146 86084,86085 86087,392 86087,433 86088,86089 86090,22 86090,5101 86090,258973 86091,577 86092,136 86093,417 86094,500 86095,493 86096,2775 86097,14989 86098,1531 86099,32475 86100,79 86101,68 86102,294 86103,24505 86104,305 86105,175 86106,1608 86107,298 86109,640 86110,1052 86111,355 86112,1201 86113,663 86113,664 86113,2178 86113,4545 86113,6119 86114,10 86115,3297 86116,772 86117,516 86122,2048 86123,175 86124,298 86125,1274 86126,86127 86128,1359 86129,1556 86130,417 86131,31934 86132,86133 86134,86133 86135,376 86136,602 86137,602 86138,602 86139,657 86139,1033 86139,75912 86140,1749 86141,1122 86142,58 86143,46 86144,1116 86145,158 86145,307 86146,4611 86147,83 86148,2671 86149,818 86150,1634 86150,5547 86151,158 86151,307 86152,3135 86153,749 86154,312 86155,557 86156,557 86157,30 86159,4611 86160,30 86161,1467 86162,3069 86163,48 86164,872 86165,1140 86166,86167 86168,86169 86170,31934 86171,455 86172,30 86173,2424 86174,336 86174,406 86175,175 86176,1370 86176,1821 86177,298 86178,1247 86178,1644 86179,1467 86180,222 86181,1871 86182,424 86183,344 86184,2434 86185,2421 86186,83 86187,13980 86188,338 86189,298 86190,485 86191,202 86191,203 86192,248 86193,86194 86195,86194 86196,86197 86199,79 86199,195 86199,217 86199,302 86199,388 86199,452 86199,455 86199,457 86199,467 86199,535 86199,579 86199,588 86199,590 86199,599 86199,631 86199,668 86199,687 86199,849 86199,872 86199,1149 86199,1274 86199,1294 86199,1417 86199,1639 86199,2266 86199,2443 86199,2605 86199,4177 86199,4760 86199,5874 86199,14368 86199,156379 86200,10 86201,83 86202,86203 86202,106189 86202,113239 86202,123304 86202,123651 86202,131159 86204,79 86206,258 86207,640 86208,602 86209,602 86210,86211 86213,310 86214,1359 86215,72 86216,344 86217,285 86219,1201 86220,843 86221,10 86222,1235 86222,1335 86223,86224 86225,10 86225,312 86226,644 86227,422 86228,422 86229,17309 86230,86231 86232,422 86233,422 86234,1010 86235,422 86236,422 86237,422 86238,602 86239,422 86240,171 86241,422 86242,310 86243,602 86245,86246 86247,86248 86249,130 86249,1381 86250,86251 86252,602 86253,850 86253,1572 86257,30 86258,602 86259,417 86260,602 86261,250 86261,1684 86262,4611 86263,192 86263,622 86263,631 86263,841 86263,1033 86263,1181 86263,1388 86263,1531 86264,30 86265,86266 86267,58 86268,46 86269,58 86270,46 86271,557 86272,24505 86273,86274 86275,493 86276,207 86277,30 86278,30 86279,310 86280,1105 86281,255 86282,473 86283,86284 86285,30 86287,713 86288,393 86289,63 86291,44 86292,1085 86293,30 86294,333 86295,6556 86296,994 86297,86298 86299,30 86300,86300 86301,30 86302,302 86302,687 86302,861 86302,893 86302,1556 86303,10 86304,1688 86305,86306 86307,4193 86307,8270 86308,664 86308,991 86309,9015 86310,1414 86311,640 86312,86313 86314,3161 86315,1313 86316,1033 86317,8992 86318,417 86319,7652 86320,652 86321,118 86321,8270 86322,10 86323,1149 86324,310 86325,86326 86327,86328 86329,63 86329,136 86329,261 86330,195 86331,28 86331,4571 86332,53763 86333,86334 86335,86336 86337,1085 86338,1844 86339,289 86339,290 86340,1509 86341,467 86342,34 86342,35 86343,79 86343,1247 86344,233 86345,24505 86346,86347 86348,86349 86350,86351 86352,86026 86353,48 86354,392 86355,140 86355,338 86355,1224 86355,1968 86357,24505 86358,58 86359,46 86360,50 86361,211 86362,355 86363,86364 86365,86366 86367,86366 86368,86366 86369,366 86370,3148 86370,6323 86371,1127 86373,81 86374,6556 86375,1612 86376,505 86377,505 86378,86379 86380,1235 86380,1335 86381,207 86383,48 86384,1618 86384,4223 86384,13137 86385,3297 86386,462 86387,158 86388,24505 86391,1289 86392,2506 86393,137 86394,86395 86396,86395 86397,4101 86398,1118 86401,2506 86402,10 86402,485 86402,571 86402,920 86402,1715 86402,127158 86403,2506 86404,2506 86405,2506 86406,2506 86407,2506 86408,2506 86409,2506 86410,2506 86411,2506 86412,2506 86413,2506 86414,147 86415,2506 86417,184 86418,86419 86422,310 86423,602 86424,1644 86425,500 86426,178 86426,272 86426,337 86426,346 86426,393 86426,435 86426,439 86426,447 86426,516 86426,934 86426,980 86426,1033 86426,1175 86426,1294 86426,1531 86426,1541 86426,2178 86426,3989 86426,4455 86426,4545 86427,360 86427,515 86428,392 86430,1240 86431,58 86432,46 86433,660 86434,18726 86435,79 86435,195 86435,779 86435,1515 86436,1745 86437,571 86438,712 86441,202 86441,203 86442,1247 86443,86444 86446,184 86447,2315 86448,86449 86450,431 86452,86453 86455,500 86456,1962 86457,1052 86458,1882 86459,2775 86460,54 86461,217 86461,19443 86462,1118 86463,626 86464,452 86464,457 86464,918 86464,1417 86464,75912 86464,143287 86465,338 86466,217 86466,264 86466,893 86467,86468 86469,86468 86471,1149 86472,86473 86474,509 86474,510 86475,215 86476,875 86477,586 86478,1052 86478,1118 86478,1298 86478,6695 86480,1631 86481,83 86482,953 86484,3321 86485,86486 86487,32475 86488,1284 86488,1522 86489,83 86492,1181 86493,1118 86495,907 86496,86497 86498,86497 86499,86500 86501,49887 86502,86503 86504,1893 86506,298 86506,626 86506,693 86506,2995 86507,1707 86508,86509 86510,420 86511,30 86511,1179 86513,1181 86514,34 86514,35 86516,86517 86518,301 86518,968 86518,1454 86519,30331 86520,485 86521,1955 86522,28072 86523,1858 86524,1860 86525,86526 86528,54 86529,1749 86530,83 86530,217 86530,379 86530,536 86530,1240 86530,2784 86530,4637 86531,875 86532,406 86533,178 86534,1179 86535,602 86536,217 86537,1132 86538,781 86539,422 86541,86542 86543,209 86543,302 86543,579 86544,3079 86545,81070 86546,86547 86548,2266 86549,219 86549,1058 86549,1509 86549,1653 86549,1844 86550,21944 86551,136 86552,86553 86554,872 86556,1836 86557,3507 86558,301 86558,2083 86559,660 86561,22 86561,3079 86562,972 86564,86565 86566,1381 86567,713 86568,1132 86569,781 86570,83 86571,20 86572,175 86573,240 86574,1033 86575,1323 86576,102 86577,1326 86578,408 86579,1983 86580,298 86581,36985 86583,30 86583,1179 86584,3135 86585,818 86586,2244 86587,602 86588,515 86588,3555 86589,801 86590,147 86591,1635 86592,859 86593,86594 86595,86594 86596,298 86597,485 86598,104 86598,225 86598,953 86598,1179 86598,1368 86598,1939 86598,5405 86598,7270 86600,1749 86601,2812 86602,779 86603,1132 86604,781 86605,86606 86607,4165 86607,75912 86608,973 86609,1390 86610,187 86611,292 86612,10 86612,30 86612,693 86612,127158 86613,104 86613,225 86613,248 86613,953 86613,1368 86613,1939 86613,5405 86613,7270 86614,104 86614,225 86614,248 86614,953 86614,1368 86614,1939 86614,5405 86614,7270 86615,104 86615,225 86615,248 86615,953 86615,1368 86615,1939 86615,5405 86615,7270 86616,720 86617,3695 86618,1133 86619,694 86619,75912 86620,604 86620,861 86620,5265 86621,818 86622,292 86623,3297 86624,1058 86625,292 86626,805 86626,1955 86627,83 86628,1132 86629,781 86630,292 86632,292 86633,1805 86634,1132 86635,781 86636,292 86637,10 86638,292 86639,86640 86641,207 86642,292 86643,1033 86644,292 86645,175 86646,30 86646,1179 86647,298 86648,477 86649,1132 86650,781 86653,1132 86654,781 86655,647 86656,344 86657,301 86658,1436 86658,1707 86658,3769 86659,579 86659,694 86659,75912 86660,602 86661,1392 86662,2274 86664,13546 86665,444 86666,192 86667,743 86667,8714 86667,95583 86668,86669 86670,406 86671,592 86672,1118 86673,217 86673,1417 86674,217 86674,1212 86674,1462 86674,8537 86674,9015 86676,5440 86677,106 86678,2434 86680,298 86681,485 86682,301 86683,577 86684,2334 86686,314 86686,779 86686,141912 86687,875 86688,509 86689,493 86690,1454 86691,30 86691,328 86691,1179 86692,147 86693,1506 86694,178 86695,1634 86698,5440 86699,1458 86701,779 86702,30 86703,195 86704,30 86705,2744 86706,602 86707,163 86708,1132 86709,781 86710,5213 86711,2006 86713,602 86714,602 86715,1509 86716,1181 86717,1102 86718,86718 86719,31934 86720,1509 86721,1132 86722,781 86723,24505 86724,1240 86724,1634 86725,442 86726,406 86726,640 86726,841 86726,1181 86726,104843 86726,106302 86727,86728 86729,9537 86730,34 86730,35 86730,222 86730,313 86730,536 86730,588 86730,590 86730,634 86730,1313 86730,1419 86730,1718 86730,2224 86730,2646 86731,86732 86733,809 86734,2944 86735,312 86735,949 86736,255 86737,3474 86738,1132 86739,781 86740,5405 86741,68069 86742,1033 86743,86744 86745,640 86746,10 86747,1149 86748,918 86749,3474 86750,596 86751,86752 86753,240 86753,589 86753,1001 86753,1019 86753,8541 86753,14797 86754,58 86755,46 86756,1149 86757,86758 86759,1326 86760,818 86761,588 86761,590 86762,1849 86763,356 86764,72 86765,493 86765,586 86765,682 86765,72439 86767,217 86767,536 86767,18831 86768,72 86770,483 86771,267 86772,140 86773,86774 86776,1801 86777,24505 86779,10 86779,113156 86781,10 86781,113140 86783,10 86783,113140 86784,72 86785,247 86786,104 86786,111 86786,248 86786,289 86786,290 86786,372 86786,588 86786,590 86786,631 86786,636 86786,714 86786,1181 86786,1282 86786,1462 86786,1745 86786,1955 86786,2205 86786,2206 86786,2443 86786,3804 86786,8180 86786,8537 86787,10 86787,113140 86787,221302 86789,376 86791,1012 86791,1119 86791,1177 86792,994 86793,2006 86794,222 86795,167 86795,73570 86796,86797 86798,30 86799,1858 86800,1860 86801,86802 86803,3724 86804,86805 86806,83 86807,518 86808,376 86809,885 86810,86811 86812,1181 86813,86814 86815,30 86815,328 86817,86818 86817,102115 86817,103009 86819,86820 86819,119420 86819,120180 86821,1132 86822,781 86823,86824 86823,91597 86823,91617 86823,101371 86823,124255 86823,132255 86823,178510 86823,195143 86823,200567 86823,259478 86825,86826 86828,289 86828,290 86828,1392 86828,2205 86828,2206 86828,3069 86829,4611 86830,94 86830,2787 86830,86832 86831,557 86832,1776 86832,80340 86832,166410 86832,166502 86832,166694 86832,167072 86832,167074 86832,167118 86832,167124 86832,167127 86832,167129 86832,167132 86832,167138 86832,167141 86832,167151 86832,167154 86832,167165 86832,167168 86832,167169 86832,167197 86832,167202 86832,167239 86832,167240 86832,167248 86832,167267 86832,167283 86832,167311 86832,167354 86832,168711 86833,704 86835,1188 86836,301 86836,1085 86838,171 86839,1556 86840,1531 86841,1132 86842,781 86844,24505 86845,86846 86847,392 86848,250 86848,1684 86849,1844 86850,358 86851,40497 86853,298 86854,485 86855,801 86856,704 86857,557 86858,557 86859,1454 86860,24505 86861,1590 86862,298 86863,485 86864,406 86865,118 86865,4597 86867,340 86868,217 86868,406 86868,788 86868,3135 86870,516 86871,86872 86873,1132 86874,781 86875,602 86876,86877 86878,1247 86878,164572 86879,2315 86881,200 86882,310 86884,406 86885,602 86886,602 86887,602 86888,602 86889,301 86890,3148 86891,2116 86892,1285 86893,10 86893,22 86893,120 86893,211 86893,309 86893,310 86893,360 86893,406 86893,483 86893,493 86893,657 86893,682 86893,694 86893,784 86893,1749 86893,2045 86893,2210 86893,2617 86893,4237 86893,6556 86893,72439 86893,232766 86894,86895 86896,422 86897,422 86898,422 86899,1181 86900,422 86901,422 86902,86903 86904,86903 86905,422 86906,422 86907,292 86908,2209 86909,86910 86911,3094 86912,8270 86913,577 86914,202 86914,203 86915,861 86916,175 86917,298 86918,86919 86921,86922 86921,98930 86921,120410 86923,649 86924,920 86925,83209 86926,45024 86927,45310 86928,45021 86929,254 86930,557 86931,10 86931,113156 86932,586 86933,704 86934,86935 86936,779 86937,323 86938,366 86939,3331 86940,2224 86941,1033 86941,2045 86942,97 86943,704 86944,596 86945,2590 86947,779 86949,63 86950,1844 86951,207 86952,175 86953,298 86954,818 86956,146 86957,163 86958,310 86959,704 86960,872 86961,1429 86962,86963 86964,668 86965,86966 86967,86968 86969,86970 86971,86972 86973,72 86974,72 86975,72 86976,872 86977,2048 86978,86979 86981,994 86982,48 86984,1432 86985,94 86985,2787 86986,14434 86987,273 86988,1143 86989,932 86990,86991 86992,86993 86994,1977 86994,1978 86995,900 86995,1332 86996,130 86997,292 86998,298 86999,417 87000,1247 87000,1644 87001,233 87002,1149 87003,87004 87003,118231 87006,97 87006,269 87007,2017 87008,783 87008,1294 87009,160 87009,567 87009,611 87009,663 87009,712 87009,760 87009,1147 87009,1429 87009,1579 87009,1612 87009,2210 87009,2605 87009,2668 87009,4237 87009,4678 87010,1522 87011,911 87012,1319 87013,4475 87014,4193 87014,8822 87015,8991 87016,2506 87017,87018 87017,88895 87017,93834 87019,79 87020,45023 87021,49887 87022,78232 87023,45022 87024,30766 87025,278 87026,79 87026,192 87026,1070 87027,1132 87028,781 87029,1132 87030,781 87031,140 87032,355 87033,3069 87034,1132 87035,781 87036,929 87037,66 87037,1579 87038,160 87038,1147 87039,1203 87040,2116 87041,312 87042,1132 87043,781 87044,2797 87045,136 87046,2191 87047,298 87048,485 87049,72 87050,344 87051,285 87052,1058 87053,298 87054,485 87055,1132 87056,781 87057,1241 87058,481 87059,1132 87060,781 87061,1319 87061,2668 87062,20 87063,1515 87064,171 87065,586 87066,356 87066,852 87067,920 87067,1127 87068,1132 87069,781 87070,292 87071,640 87072,1132 87073,781 87074,640 87075,392 87076,640 87077,2296 87078,149 87079,240 87079,392 87079,1240 87079,1572 87080,79 87081,1010 87082,44 87083,75912 87084,1326 87085,1149 87087,1132 87088,781 87089,58 87090,46 87091,1707 87092,1132 87093,781 87094,1132 87095,781 87096,980 87096,1531 87097,87098 87100,1436 87101,5405 87103,602 87105,1512 87105,5992 87106,58 87107,46 87108,1132 87109,781 87110,31073 87111,1566 87112,349 87112,356 87112,697 87112,801 87112,852 87112,3507 87113,1227 87113,86416 87114,68 87115,592 87116,422 87117,56 87118,525 87118,1837 87118,3297 87119,577 87120,93 87120,94 87121,390 87121,1085 87122,579 87122,1294 87122,2146 87122,2353 87122,109187 87123,178 87123,406 87124,631 87124,693 87125,299 87126,1132 87127,781 87128,83 87129,79 87130,215 87131,2286 87132,442 87134,13538 87135,30 87136,333 87137,58 87138,46 87139,2367 87142,1707 87143,779 87143,68069 87144,1147 87145,620 87146,188 87147,1070 87148,1287 87149,167 87150,1132 87151,781 87152,1235 87152,1335 87153,1509 87154,422 87155,56 87156,298 87157,485 87158,1118 87159,9457 87160,2379 87161,2506 87162,602 87163,2434 87164,147 87165,1016 87166,87167 87168,136 87168,717 87168,733 87168,1332 87168,7757 87169,1175 87170,346 87170,1612 87170,1877 87170,2353 87170,6661 87172,1467 87174,602 87175,843 87176,87177 87178,32 87178,3003 87179,72 87180,344 87181,285 87182,1132 87183,781 87185,171 87186,1644 87187,422 87188,87189 87188,150626 87190,1390 87193,255 87193,563 87193,2867 87193,2868 87194,285 87195,34 87195,35 87196,1309 87197,20 87198,18726 87199,693 87200,1 87200,304 87200,481 87200,3830 87200,6424 87200,28107 87201,1070 87202,2266 87203,33082 87204,1419 87205,87206 87207,192 87210,19 87210,56 87210,146 87210,272 87210,743 87210,749 87210,3538 87210,60576 87210,92476 87211,602 87212,298 87213,485 87214,1858 87215,1860 87216,980 87217,72 87218,344 87219,1359 87220,285 87221,1132 87222,781 87224,2460 87225,298 87226,485 87227,1132 87228,781 87229,1267 87230,1323 87231,102 87232,1326 87233,408 87234,592 87234,1085 87235,611 87235,733 87236,1132 87237,781 87239,676 87240,83 87241,307 87241,1181 87241,4193 87242,4355 87243,225 87246,631 87247,175 87248,298 87249,87250 87251,215 87252,298 87253,485 87254,8270 87255,8270 87256,240 87257,87258 87259,312 87260,1893 87261,557 87262,592 87263,158 87264,2315 87265,87266 87265,103639 87267,72 87268,344 87269,285 87270,442 87272,1893 87273,287 87273,733 87274,1220 87274,1222 87275,2750 87276,1274 87277,779 87277,1803 87277,68069 87277,141912 87278,87279 87280,87281 87282,106 87282,330 87282,1181 87283,298 87284,485 87285,106 87286,2146 87287,301 87287,968 87287,1782 87288,589 87288,1655 87289,9560 87290,48 87291,151 87292,1580 87293,1858 87294,1860 87295,483 87296,1776 87297,264 87297,649 87297,1289 87297,3999 87298,87299 87300,885 87302,349 87302,575 87303,3069 87307,83 87307,1240 87308,1240 87310,668 87311,87312 87314,58 87315,46 87316,72 87317,344 87318,285 87319,1454 87322,1265 87322,1266 87323,158 87325,602 87325,144457 87325,216487 87326,626 87329,97 87329,491 87329,15609 87330,602 87333,640 87334,1381 87335,219 87335,949 87336,87337 87338,30 87338,1179 87339,3252 87341,649 87341,1132 87341,1432 87343,298 87344,485 87345,954 87345,10318 87349,1359 87350,1436 87351,1130 87352,175 87353,187 87356,298 87357,1432 87358,87359 87360,392 87360,1151 87360,1769 87360,2274 87361,58 87362,46 87363,602 87364,392 87365,1796 87366,184 87367,1293 87367,3422 87368,87369 87370,392 87370,2775 87370,3003 87370,6627 87371,2775 87372,536 87372,7698 87373,5405 87374,1370 87375,298 87376,485 87377,467 87377,1368 87378,1556 87379,1707 87380,447 87381,527 87382,287 87383,1955 87384,1425 87385,3 87387,30331 87389,1116 87390,392 87391,298 87392,485 87393,10 87394,1007 87395,406 87396,225 87397,1381 87398,68 87399,301 87399,968 87399,1782 87399,189303 87400,527 87401,87402 87403,86 87404,34 87404,35 87404,217 87404,949 87405,1983 87406,65 87407,2351 87408,87409 87410,779 87411,422 87412,56 87413,175 87414,87415 87416,298 87417,1983 87418,3413 87419,422 87420,56 87421,376 87422,87423 87422,96183 87425,392 87426,3 87427,1893 87428,647 87429,344 87430,217 87431,2797 87432,120 87433,1332 87434,422 87435,56 87436,2797 87437,376 87438,885 87439,104 87440,298 87441,485 87442,240 87442,3069 87443,87444 87445,34 87445,35 87445,217 87445,5976 87446,422 87447,56 87448,192 87449,87450 87451,134 87452,509 87452,1010 87453,87453 87454,433 87455,1449 87456,298 87457,485 87458,30 87459,72 87460,158 87461,872 87461,1659 87461,1893 87462,4611 87463,1579 87464,477 87465,298 87466,485 87467,392 87467,697 87468,388 87469,149 87469,21944 87470,631 87471,4980 87472,6726 87473,87474 87475,1274 87476,333 87477,406 87478,1132 87479,781 87480,1688 87481,1707 87482,875 87483,298 87484,485 87485,647 87486,344 87487,2146 87487,95222 87487,108489 87488,178 87488,1572 87488,2045 87488,5343 87489,87490 87491,875 87492,406 87493,349 87493,697 87493,3260 87494,1983 87495,2797 87496,390 87496,589 87497,907 87498,30 87499,87500 87501,30 87502,557 87503,30 87504,1001 87505,647 87506,344 87507,41 87507,1119 87508,30 87509,505 87510,6837 87511,9030 87512,45022 87513,30 87514,557 87515,30 87516,557 87517,647 87518,344 87519,30 87520,647 87521,344 87522,652 87524,158 87524,516 87525,1881 87526,30 87527,358 87529,87530 87531,298 87532,485 87533,1363 87534,4771 87536,298 87537,485 87538,30 87541,577 87541,794 87543,5440 87544,1289 87545,333 87546,3999 87547,264 87548,1381 87549,1381 87550,20 87551,1807 87553,779 87554,3041 87555,1007 87556,1551 87558,255 87559,1381 87560,1639 87561,87562 87563,433 87564,358 87564,3409 87567,1140 87568,2116 87569,87569 87570,30 87574,1235 87574,1335 87575,473 87575,8149 87576,13919 87577,73570 87578,1556 87579,87580 87579,96127 87581,30 87582,292 87583,252 87584,422 87585,422 87586,422 87587,422 87588,422 87589,1149 87590,422 87591,6726 87592,4980 87593,422 87594,422 87595,577 87596,1033 87597,6726 87598,30 87599,422 87601,87602 87604,1858 87605,1860 87607,1132 87608,781 87609,87610 87611,859 87612,392 87613,30 87614,7155 87615,328 87616,2775 87617,447 87618,87618 87619,8270 87620,577 87622,671 87623,3409 87624,2626 87625,30 87626,87627 87628,79 87629,360 87630,3069 87631,2210 87631,4237 87632,1014 87633,676 87634,285 87635,104 87637,10 87637,87638 87639,862 87640,726 87641,13 87642,252 87643,2292 87644,3413 87645,24505 87647,393 87647,87648 87649,87650 87651,30 87652,87652 87653,779 87655,4980 87656,6726 87657,175 87658,304 87659,298 87661,4101 87662,87663 87664,222 87664,278 87664,349 87664,389 87664,577 87664,1871 87665,349 87666,393 87667,872 87668,973 87668,1968 87669,298 87670,1143 87671,87672 87671,100468 87671,111527 87673,4611 87674,1544 87675,4611 87676,1544 87677,209 87677,302 87677,859 87677,861 87677,1127 87677,2979 87678,87679 87680,1639 87681,310 87682,186 87683,10 87684,1707 87685,1238 87687,233 87688,151 87688,1417 87689,510 87690,1452 87692,8 87692,1072 87692,2646 87693,1132 87694,781 87695,424 87696,1707 87697,358 87697,3409 87698,24505 87699,581 87701,5405 87702,1707 87702,2867 87702,2868 87703,87704 87705,493 87705,1181 87705,1370 87705,2867 87705,2868 87706,4611 87708,68 87708,697 87708,1175 87708,2590 87709,455 87709,536 87709,2944 87710,355 87711,167 87711,240 87711,818 87711,949 87711,2334 87711,2480 87711,6695 87713,87714 87715,784 87716,34 87716,35 87716,1466 87717,30 87717,34 87717,35 87717,134 87717,158 87717,200 87717,536 87717,663 87717,664 87717,1085 87717,1572 87717,2048 87717,7358 87717,7363 87717,19227 87717,20359 87718,1016 87719,1466 87720,676 87721,2867 87721,2868 87722,87723 87724,818 87726,87727 87728,4760 87730,3999 87731,3252 87732,872 87733,392 87733,1240 87734,2574 87735,273 87736,1891 87737,58 87738,46 87739,586 87739,1634 87739,16614 87740,602 87741,78400 87742,1151 87743,1181 87743,240174 87745,535 87746,287 87747,160 87747,1033 87748,985 87749,356 87750,477 87751,477 87752,2048 87753,27041 87755,44 87756,535 87757,87758 87760,920 87764,1122 87765,907 87766,24505 87768,1634 87769,71 87771,1983 87773,477 87775,356 87776,87777 87778,15141 87779,344 87780,6726 87781,4980 87782,87783 87784,422 87785,422 87786,422 87787,422 87788,422 87789,211 87790,76096 87791,56 87791,175 87791,417 87791,626 87791,1220 87791,1222 87791,1285 87791,1319 87791,1566 87791,1571 87792,422 87793,779 87793,1181 87794,422 87795,192 87796,195 87797,298 87798,485 87799,158 87799,280 87799,337 87799,393 87799,714 87799,1181 87799,2989 87799,2991 87799,17245 87799,118336 87799,180487 87799,189839 87799,248431 87800,467 87801,1436 87802,1556 87803,516 87803,80266 87804,309 87804,310 87805,1983 87806,298 87807,485 87808,34 87808,35 87808,626 87809,932 87810,3003 87812,929 87813,446 87813,1033 87814,211 87815,83 87818,225 87818,557 87818,772 87818,1368 87819,72 87820,140 87820,264 87820,779 87820,1515 87821,87822 87821,102829 87825,158 87826,3507 87827,298 87828,72 87829,485 87830,516 87830,1220 87830,1222 87830,1983 87831,1977 87831,1978 87832,259 87833,87834 87835,21944 87836,13538 87837,1381 87838,301 87838,968 87838,1782 87839,217 87839,13546 87840,1511 87840,2315 87840,3069 87841,389 87841,1849 87842,861 87842,893 87845,2443 87846,7 87846,309 87846,310 87847,171 87848,1118 87849,87850 87851,1058 87852,97 87854,1707 87855,222 87856,577 87856,1105 87857,30 87858,30 87859,87860 87861,87862 87863,640 87864,602 87865,2045 87866,415 87866,557 87867,433 87868,611 87869,1531 87870,1 87870,147 87870,149 87870,158 87870,175 87870,606 87870,733 87870,859 87870,1089 87870,1619 87870,1623 87870,23861 87870,26841 87870,34806 87870,39437 87870,61320 87870,66472 87870,71303 87870,76835 87870,77571 87870,85817 87870,87843 87870,87870 87870,89035 87870,91055 87870,107083 87870,112537 87870,117881 87870,119388 87870,121575 87870,138831 87870,146001 87870,147380 87870,147935 87870,150013 87870,151045 87870,159028 87870,165851 87870,181904 87870,220022 87870,220042 87870,227294 87870,245896 87870,246034 87870,249110 87870,251478 87870,257659 87870,259650 87871,388 87871,446 87871,518 87871,1113 87871,1326 87871,3193 87871,6638 87871,48505 87872,602 87873,87874 87876,1231 87877,2528 87878,83 87879,310 87880,1247 87880,1644 87881,1623 87883,596 87884,557 87884,1082 87885,406 87886,167 87887,577 87889,225 87890,310 87892,135 87892,2017 87893,467 87893,868 87895,1390 87896,261 87897,217 87897,406 87897,599 87898,852 87899,1983 87900,30 87901,500 87902,58 87903,46 87904,192 87905,15 87907,2867 87907,2868 87908,1122 87908,1849 87908,32784 87909,1977 87909,1978 87910,97 87911,323 87912,68 87913,389 87913,873 87913,1240 87913,1465 87913,2620 87914,949 87915,87916 87918,379 87918,2944 87919,87920 87921,302 87921,346 87921,827 87921,934 87921,1294 87921,1319 87921,31206 87922,160 87923,1241 87924,818 87925,392 87925,5547 87926,87927 87926,100184 87926,104232 87926,105417 87928,2315 87928,3069 87929,68 87929,104 87929,2436 87929,4571 87929,5405 87930,1132 87931,422 87932,56 87933,87934 87935,63 87935,6119 87936,87937 87938,72 87939,422 87940,56 87941,209 87942,30 87943,292 87944,602 87945,207 87946,420 87947,596 87948,620 87949,1231 87950,87951 87953,247 87954,217 87954,222 87954,467 87954,1019 87955,1359 87956,87957 87958,21944 87959,255 87960,1133 87961,10 87962,356 87962,21982 87963,6726 87964,4980 87965,602 87966,611 87967,87968 87969,3623 87970,206 87971,147 87971,158 87972,1265 87972,1266 87973,3069 87974,602 87976,106 87976,408 87977,83 87978,657 87979,872 87980,4411 87982,21944 87983,1016 87984,87985 87986,240 87987,18726 87988,83 87989,7155 87990,247 87990,393 87991,818 87992,7155 87995,2646 87999,3413 88000,30 88001,1531 88002,278 88003,175 88004,137 88004,30331 88005,843 88006,298 88007,479 88008,298 88009,485 88011,22 88012,158 88012,192 88012,663 88012,664 88013,1149 88014,192 88015,473 88017,1151 88017,1893 88019,209 88021,1181 88022,111 88023,330 88024,72 88025,602 88026,3474 88027,1370 88028,8270 88029,6323 88030,217 88031,248 88032,1564 88032,3094 88033,1983 88034,406 88035,622 88035,1033 88036,1016 88036,2210 88036,4237 88037,192 88038,8270 88039,206 88040,158 88040,192 88040,406 88040,422 88041,2775 88042,447 88043,22 88043,240 88044,336 88045,907 88047,30 88048,1370 88050,30 88051,292 88052,48 88053,467 88053,868 88054,994 88055,30 88056,163 88056,305 88056,447 88056,563 88056,733 88056,1132 88056,1201 88056,8501 88056,15573 88057,893 88058,704 88059,18726 88060,602 88061,310 88061,3039 88062,22 88062,41 88062,81 88062,104 88062,192 88062,215 88062,442 88062,503 88062,957 88062,1392 88062,1815 88062,3507 88062,9005 88062,111142 88063,713 88064,483 88065,305 88066,88067 88068,88069 88071,72 88072,217 88073,137 88074,240 88074,332 88075,3 88076,5662 88077,4980 88078,6726 88079,175 88080,310 88081,298 88082,1033 88083,66 88085,269 88085,1782 88086,206 88087,217 88087,1019 88088,247 88089,72 88090,68069 88091,88092 88093,72 88094,784 88094,59931 88094,84257 88095,647 88096,344 88097,88098 88099,147 88099,158 88099,406 88099,1181 88101,72 88103,862 88104,298 88105,4691 88106,175 88107,147 88109,298 88110,72 88111,1579 88112,1707 88113,4611 88114,4771 88115,19986 88116,88117 88118,310 88119,3474 88120,233 88120,518 88120,775 88120,795 88120,1326 88120,1715 88120,3094 88120,3804 88120,4146 88120,5130 88121,16196 88122,2626 88123,420 88124,949 88125,4691 88126,843 88127,10 88128,1201 88130,292 88131,72 88132,1688 88133,104 88133,2209 88134,338 88135,827 88136,557 88137,225 88138,1707 88139,1359 88140,298 88141,485 88142,358 88143,483 88144,602 88145,247 88146,41 88147,557 88148,557 88149,862 88150,1556 88151,88152 88153,4810 88154,77 88155,8270 88156,1566 88157,250 88157,1684 88158,72 88159,704 88160,2979 88161,88162 88164,4980 88165,6726 88166,298 88167,485 88168,10 88169,1707 88169,2260 88170,8992 88171,30 88172,10 88172,222 88173,968 88173,1436 88174,2646 88176,577 88177,2116 88178,88179 88180,195 88181,30 88182,298 88183,485 88184,30 88185,88186 88187,88188 88189,4594 88190,175 88191,298 88192,18726 88193,163 88194,88195 88196,333 88198,30 88199,682 88199,72439 88200,2590 88201,8788 88202,88203 88204,4895 88205,88206 88207,207 88208,146 88209,5366 88210,30 88211,626 88212,676 88213,872 88214,483 88215,30 88217,88218 88219,88220 88221,1531 88222,668 88223,862 88224,376 88225,88226 88228,255 88229,187 88230,1429 88231,3447 88232,88233 88235,3413 88236,13 88237,252 88238,2626 88239,88240 88239,139802 88239,140598 88239,144820 88241,88242 88243,1143 88244,640 88245,88245 88246,640 88247,88248 88249,88250 88251,366 88252,366 88253,88254 88253,101685 88253,115907 88255,88255 88256,233 88257,30 88258,298 88259,485 88260,298 88261,485 88262,298 88263,485 88264,88265 88267,10 88268,88269 88270,10 88271,88272 88273,111 88274,872 88275,219 88276,3003 88277,88278 88279,88278 88280,88281 88282,740 88282,741 88283,28130 88284,3069 88285,24505 88286,818 88287,292 88288,88289 88288,148103 88288,213398 88290,209 88291,355 88292,298 88293,485 88294,7360 88295,2867 88295,2868 88296,392 88296,697 88297,79 88297,1644 88298,292 88300,2146 88301,6556 88302,88303 88302,94526 88304,292 88305,2116 88306,390 88306,431 88306,631 88306,968 88306,973 88306,1326 88306,3756 88306,5301 88307,1983 88309,48 88310,1016 88311,1132 88312,781 88313,1983 88314,4276 88315,30 88316,217 88317,88318 88319,647 88320,344 88322,217 88323,931 88324,1016 88325,83 88326,292 88328,868 88328,1309 88329,292 88330,88331 88332,72 88333,344 88334,285 88335,527 88335,743 88335,1984 88335,8714 88336,292 88337,1858 88338,1860 88340,349 88342,1220 88342,1222 88343,252 88344,251 88345,2979 88346,602 88347,891 88348,149 88348,184 88348,1623 88349,30 88350,88351 88352,726 88353,4691 88354,192 88354,200 88355,518 88355,1326 88356,663 88356,1089 88357,640 88358,640 88359,44 88360,602 88361,640 88362,195 88363,1531 88364,88365 88366,2048 88367,315 88367,6661 88368,88369 88370,718 88371,447 88372,2506 88373,88374 88375,422 88376,1722 88377,422 88378,968 88378,1782 88379,422 88380,422 88381,7117 88382,422 88383,422 88384,422 88385,422 88386,8270 88387,422 88388,422 88389,72 88389,126 88389,312 88389,314 88389,323 88389,784 88389,872 88389,991 88389,1052 88389,1078 88389,1127 88389,1188 88389,1267 88389,1453 88389,1579 88389,1659 88389,1663 88389,1893 88389,2605 88389,3260 88389,3538 88389,3695 88389,6824 88389,13538 88389,49057 88389,81070 88390,485 88391,252 88392,2646 88393,1983 88394,425 88394,2744 88395,360 88396,1132 88397,781 88399,712 88400,1240 88400,1419 88400,5591 88401,720 88402,22 88403,392 88404,861 88404,893 88404,1118 88404,1374 88405,83 88406,932 88407,1983 88408,8270 88409,301 88409,968 88410,2173 88411,88412 88413,8270 88414,313 88414,328 88416,827 88418,1801 88420,481 88420,1381 88420,3999 88421,1247 88421,1644 88422,2367 88423,911 88423,1564 88424,88425 88426,726 88428,248 88430,493 88430,516 88430,733 88431,195 88432,298 88433,485 88434,292 88435,1983 88436,579 88437,349 88437,1590 88437,1805 88437,3260 88438,17228 88439,818 88440,1016 88441,595 88442,215 88443,302 88443,340 88444,779 88444,68069 88445,3585 88446,195 88447,818 88448,34 88448,35 88448,2224 88449,3585 88451,2574 88452,366 88454,8270 88455,779 88456,10 88457,87 88458,171 88459,2719 88460,3370 88460,14453 88461,192 88462,48 88463,202 88463,203 88464,72 88465,344 88466,285 88467,192 88467,211 88467,366 88467,500 88468,48 88470,493 88471,10 88472,1390 88474,175 88475,392 88475,1722 88476,302 88476,687 88476,861 88477,298 88478,980 88479,88480 88481,310 88482,1707 88483,693 88484,8270 88485,1133 88486,2411 88487,579 88488,88489 88488,103975 88490,493 88491,23701 88492,326 88493,340 88493,6638 88494,120 88495,171 88495,379 88495,968 88495,1434 88495,1939 88496,298 88497,485 88498,515 88499,875 88500,5591 88501,146 88501,383 88501,403 88501,27041 88502,88503 88504,30 88505,1955 88506,88506 88508,88509 88510,586 88511,2434 88512,4549 88513,7572 88514,192 88517,433 88518,577 88518,900 88519,875 88520,2744 88521,2073 88522,30 88524,88525 88526,195 88527,30 88528,30 88529,21944 88530,88531 88532,298 88533,485 88534,240 88535,2146 88536,2744 88537,1149 88538,48 88539,467 88540,515 88540,1267 88540,1289 88541,83 88541,97 88541,305 88541,366 88543,663 88543,664 88544,875 88545,1181 88546,18726 88547,581 88548,137 88549,934 88550,4611 88551,1544 88552,4611 88553,1544 88554,187 88555,304 88556,1785 88557,195 88558,298 88559,485 88560,1140 88561,225 88562,2944 88563,48 88564,877 88565,1284 88566,397 88567,298 88568,485 88570,1368 88571,1531 88572,406 88573,3413 88574,252 88575,202 88575,203 88576,1019 88577,1559 88578,10 88578,217 88579,49057 88580,444 88581,7 88581,3295 88581,4980 88581,6263 88581,19986 88581,23049 88581,49887 88581,58621 88583,579 88584,1531 88585,119 88586,2784 88587,1949 88588,298 88589,485 88590,859 88591,455 88592,1531 88595,1007 88596,126 88596,596 88596,75912 88597,1374 88598,1309 88598,1955 88600,147 88601,88602 88603,1085 88604,147 88604,158 88605,1631 88606,1417 88607,338 88608,1010 88609,83 88610,602 88611,22 88611,450 88612,893 88613,493 88614,171 88616,2045 88617,30 88618,8788 88620,151 88621,72 88621,312 88622,68069 88623,588 88623,590 88624,304 88625,72 88626,72 88627,406 88627,586 88628,1359 88629,86 88630,500 88631,30 88632,3069 88633,217 88633,379 88633,1240 88633,3182 88633,6955 88634,2146 88635,4411 88636,21944 88637,292 88638,1274 88639,83 88640,83 88641,10 88641,147 88642,41 88643,13 88644,592 88645,3623 88646,248 88647,1132 88648,781 88649,292 88650,631 88651,175 88652,275 88655,298 88656,10 88658,88659 88660,6323 88661,287 88661,809 88661,2116 88661,3769 88662,10 88663,88664 88663,93917 88665,1133 88666,30 88667,2421 88668,1531 88669,195 88670,88671 88672,861 88673,88674 88673,95507 88673,100214 88673,105234 88675,1634 88676,126 88676,1392 88676,1572 88676,9195 88677,50 88678,720 88679,515 88680,479 88681,1556 88682,920 88683,88684 88685,88684 88686,30 88687,30 88688,713 88689,195 88690,1939 88691,376 88692,779 88692,141912 88693,893 88694,175 88695,298 88696,272 88697,310 88698,79 88699,72 88700,344 88701,285 88702,500 88703,30 88704,1659 88705,111 88705,595 88705,1151 88705,1572 88705,3538 88706,68 88707,175 88708,809 88709,309 88709,310 88710,298 88711,657 88711,2989 88711,2991 88712,372 88713,310 88714,88715 88716,1860 88717,1882 88718,483 88719,72 88720,344 88721,285 88722,2436 88723,88724 88725,30 88726,500 88728,88729 88730,289 88730,290 88731,30 88732,88733 88734,107 88735,83 88736,30 88737,850 88739,310 88740,602 88741,160 88742,88743 88744,640 88744,4355 88745,30 88745,48 88745,63 88745,106 88745,140 88745,147 88745,149 88745,158 88745,202 88745,203 88745,261 88745,296 88745,302 88745,323 88745,332 88745,333 88745,337 88745,406 88745,503 88745,515 88745,516 88745,588 88745,590 88745,622 88745,647 88745,652 88745,736 88745,1052 88745,1102 88745,1289 88745,1381 88745,1509 88745,1551 88745,1579 88745,1639 88745,1659 88745,3585 88745,3999 88745,5440 88745,9007 88745,14945 88747,481 88748,1 88749,306 88749,307 88749,1707 88750,422 88751,422 88752,422 88753,422 88754,422 88755,422 88756,422 88757,422 88758,422 88759,50 88759,273 88759,671 88759,1149 88760,640 88761,88762 88763,88764 88765,30 88766,88767 88768,1149 88769,489 88770,10 88771,862 88772,557 88773,557 88774,557 88775,8719 88776,138 88777,865 88778,557 88779,137 88780,118 88780,4597 88781,21944 88782,30 88783,5906 88784,557 88785,626 88786,278 88787,137 88788,862 88789,1531 88789,2178 88789,4545 88789,56150 88789,139010 88790,298 88791,485 88792,298 88793,485 88794,1888 88795,298 88796,485 88797,200 88798,1515 88799,305 88801,7652 88802,2626 88803,652 88804,24505 88805,356 88806,1858 88807,1860 88808,1007 88809,254 88810,644 88811,24505 88813,88814 88815,6726 88816,4980 88818,88819 88820,40 88820,502 88820,590 88820,967 88820,994 88820,1282 88820,1962 88820,2237 88820,2286 88820,3794 88820,4114 88820,4571 88820,6621 88820,8812 88820,9516 88820,16709 88820,21944 88820,34060 88820,34180 88820,36250 88820,38272 88820,88820 88820,91386 88820,105810 88820,105811 88820,122486 88820,127001 88820,142493 88820,147530 88820,159140 88820,161125 88820,173282 88820,195898 88820,198711 88820,214704 88821,310 88823,393 88823,980 88823,1531 88824,88825 88826,640 88827,1608 88828,163 88829,88830 88831,88832 88831,88846 88833,88834 88835,30 88836,88837 88838,30 88839,88840 88841,88842 88843,126 88844,949 88845,30 88847,30 88848,24505 88849,88850 88851,1882 88852,88853 88856,88857 88858,676 88859,88860 88861,433 88863,302 88863,420 88863,1466 88864,88865 88866,1001 88867,146 88867,779 88867,68069 88867,92476 88867,118336 88867,141912 88868,88869 88870,88871 88870,92441 88870,93282 88870,93407 88870,94470 88870,97035 88870,110926 88870,111001 88870,112047 88870,122367 88870,125336 88872,88873 88874,88873 88875,88873 88877,88878 88879,44013 88880,225 88881,134 88881,588 88881,590 88881,1381 88882,8884 88883,88884 88885,72 88886,88887 88888,1085 88890,88889 88890,179022 88891,72 88892,483 88893,30 88896,137 88897,1247 88897,1644 88898,88899 88900,88901 88902,640 88903,72 88904,72 88906,366 88907,366 88909,72 88910,3447 88911,233 88912,88913 88914,652 88915,88916 88918,83 88919,1844 88920,1419 88921,252 88922,202 88922,203 88923,355 88924,88925 88926,72 88927,392 88928,431 88929,18726 88930,88931 88932,88933 88934,2292 88935,298 88936,192 88937,3069 88938,1531 88939,440 88940,579 88941,392 88941,1659 88942,45021 88943,45022 88944,83209 88945,45024 88946,45310 88947,49887 88948,30766 88949,45023 88950,275 88951,589 88952,88953 88954,44 88956,93 88956,94 88957,360 88958,88959 88960,88961 88962,88961 88963,88964 88965,88966 88967,22 88967,360 88967,515 88967,1381 88968,932 88969,88970 88971,88972 88973,2266 88974,3999 88975,83 88976,5250 88977,595 88977,1453 88977,1572 88977,1722 88978,30 88979,24505 88980,1608 88981,83 88982,171 88983,388 88984,18726 88985,163 88986,310 88987,298 88988,485 88989,24505 88991,2048 88992,298 88993,485 88994,88995 88996,88997 88998,88999 89000,1070 89001,13 89002,3331 89003,1151 89004,1368 89005,30 89006,89007 89008,372 89010,13980 89011,417 89012,861 89013,48 89014,1235 89014,1335 89015,1181 89016,298 89017,485 89018,89019 89020,1085 89021,779 89021,21442 89022,89023 89024,1052 89025,30 89026,10 89027,292 89028,89029 89030,146 89031,63 89032,718 89033,3585 89035,1 89035,126 89035,146 89035,147 89035,149 89035,158 89035,171 89035,184 89035,206 89035,336 89035,406 89035,505 89035,640 89035,1089 89035,1425 89035,1458 89035,1515 89035,2244 89035,2528 89035,80266 89035,89035 89035,92476 89035,118336 89036,89037 89038,72 89040,589 89041,89042 89043,2045 89043,29253 89044,2411 89045,298 89046,485 89047,483 89048,1132 89049,781 89050,1247 89050,1644 89051,89052 89053,89054 89053,89866 89053,92054 89053,92483 89053,104290 89053,106660 89053,113206 89053,113611 89053,114479 89053,120379 89053,125549 89053,127091 89053,128090 89053,129349 89053,130000 89053,131160 89053,131590 89055,217 89055,1417 89057,72 89058,3447 89059,89060 89062,89063 89064,89063 89065,206 89066,72 89067,392 89067,779 89068,72 89070,4453 89071,1 89072,72 89073,72 89074,713 89075,89076 89077,89076 89078,89076 89079,89080 89079,117322 89079,143003 89079,156097 89079,157335 89079,163507 89079,184665 89079,193928 89081,27621 89081,27623 89082,6068 89083,89084 89085,1556 89086,72 89087,72 89088,14434 89089,9026 89091,18726 89092,1531 89093,89094 89095,932 89096,6682 89097,195 89098,163 89099,72 89100,589 89101,30 89102,3467 89103,1531 89103,14366 89104,10 89104,1844 89104,2073 89104,2274 89104,8270 89104,9024 89104,13136 89105,72 89106,310 89107,328 89108,89109 89110,3260 89111,6682 89113,18726 89114,850 89115,30 89116,30 89117,1287 89118,178 89118,1522 89119,1479 89120,72 89121,3447 89123,72 89124,1707 89124,14434 89125,72 89127,481 89128,30 89129,4192 89129,4193 89130,89131 89132,3161 89133,147 89134,89135 89136,89135 89137,89135 89138,89135 89139,89135 89140,72 89141,72 89142,89143 89144,24505 89145,3148 89147,920 89147,1639 89148,83 89148,304 89148,309 89148,310 89148,389 89148,415 89148,538 89148,631 89148,673 89148,714 89148,920 89148,973 89148,1033 89148,1122 89148,1167 89148,1179 89148,1181 89148,1294 89148,1474 89148,1644 89148,1805 89148,1849 89148,1891 89148,2224 89148,2334 89148,2590 89148,3769 89148,5405 89148,21944 89148,124668 89148,143287 89149,89150 89151,302 89152,24505 89153,6387 89154,24505 89155,68467 89156,30 89156,217 89156,264 89156,278 89156,328 89156,2979 89157,89158 89159,89158 89160,89158 89161,89158 89162,89158 89163,89158 89164,430 89164,1571 89164,1821 89164,4903 89165,72 89166,89167 89168,72 89169,2146 89170,366 89171,72 89172,72 89173,89174 89173,89336 89173,120323 89175,89176 89177,9026 89178,89179 89181,89182 89183,602 89184,6051 89185,272 89187,89188 89189,676 89190,175 89191,65 89192,187 89193,200 89195,8270 89196,89197 89198,187 89199,89200 89202,89203 89205,1353 89206,31896 89207,2929 89208,184 89209,233 89210,89211 89212,3447 89213,89214 89215,3413 89216,107 89217,2416 89217,2417 89218,292 89219,338 89220,298 89221,3538 89222,1133 89223,120 89223,1235 89224,1977 89224,1978 89225,355 89226,2351 89227,89228 89229,89228 89230,89228 89231,89232 89233,4039 89234,1509 89235,6837 89236,89237 89236,100111 89238,89239 89240,89241 89242,72 89243,344 89244,285 89246,89247 89248,30 89249,24505 89250,2048 89251,6387 89253,805 89254,1247 89254,1644 89255,620 89257,89258 89259,31934 89260,422 89261,422 89262,422 89263,422 89264,422 89265,422 89266,422 89267,422 89268,422 89269,422 89270,72 89271,344 89272,285 89273,1531 89274,89275 89276,89277 89278,158 89279,89280 89281,89280 89283,718 89284,1235 89284,1335 89285,2867 89285,2868 89288,89289 89290,6179 89290,6180 89291,577 89293,89292 89295,78232 89296,126 89297,126 89297,23011 89298,89299 89298,92631 89300,393 89301,89302 89301,92806 89303,89304 89305,72 89306,211 89307,3209 89308,328 89309,18726 89310,344 89311,48 89312,349 89313,175 89314,310 89315,163 89316,89317 89318,392 89319,994 89320,89321 89322,89321 89323,89324 89325,3447 89326,89327 89328,89328 89329,89330 89331,2782 89332,366 89333,18726 89335,3003 89337,1707 89338,483 89339,89340 89341,577 89342,298 89343,485 89344,298 89345,485 89346,500 89347,644 89348,89349 89350,1368 89351,376 89352,652 89353,2351 89354,151 89355,89356 89357,301 89358,89359 89360,89361 89362,18298 89363,298 89364,485 89366,718 89367,50 89367,79 89367,86 89367,102 89367,163 89367,195 89367,206 89367,314 89367,397 89367,422 89367,503 89367,631 89367,652 89367,744 89367,758 89367,996 89367,1113 89367,1117 89367,1160 89367,1238 89367,1247 89367,1326 89367,1509 89367,1572 89367,1631 89367,1644 89367,1871 89367,4231 89367,34879 89368,178 89369,89370 89371,89370 89372,89370 89373,743 89374,89375 89376,298 89377,485 89380,298 89381,485 89382,298 89383,485 89384,298 89385,485 89386,178 89387,389 89389,9121 89390,298 89391,485 89392,439 89393,349 89394,89395 89396,298 89397,485 89398,602 89399,1117 89399,1122 89401,312 89402,298 89403,485 89404,89405 89406,151 89407,44 89409,557 89410,862 89411,557 89412,557 89413,557 89414,557 89415,298 89416,485 89417,602 89418,602 89419,602 89420,89421 89422,187 89423,907 89423,1122 89424,89425 89426,89425 89427,146 89427,383 89427,403 89427,1127 89427,27041 89427,92476 89428,10 89429,34 89429,35 89429,6789 89430,89431 89432,366 89433,366 89434,175 89434,693 89435,298 89436,485 89437,258 89438,298 89439,485 89440,298 89441,485 89442,175 89443,89444 89445,195 89446,89447 89448,1458 89449,577 89449,1531 89450,805 89451,62561 89452,1313 89453,30 89454,1983 89455,1509 89456,850 89457,175 89458,298 89459,30 89460,30 89462,424 89463,89464 89466,30 89467,89468 89470,89471 89472,298 89473,485 89474,1749 89474,3585 89475,2146 89476,349 89477,33082 89478,7155 89479,188 89480,89481 89480,90592 89480,92233 89482,89483 89484,222 89485,422 89486,56 89487,72 89488,72 89489,420 89490,10 89491,89492 89491,117404 89493,1452 89494,328 89496,652 89497,1531 89498,818 89499,292 89500,294 89501,296 89502,298 89503,175 89504,298 89505,2048 89506,24505 89507,89508 89509,1238 89510,292 89511,89512 89513,89512 89514,233 89515,79 89516,874 89517,376 89518,726 89519,1571 89520,89521 89522,698 89523,89524 89525,252 89526,89527 89528,211 89529,827 89529,1803 89529,5213 89530,1247 89530,1644 89531,89531 89532,8 89533,89534 89535,1085 89536,1127 89537,485 89537,6263 89538,89539 89540,140 89541,390 89541,1010 89541,2146 89542,252 89542,1220 89542,1222 89543,302 89543,1294 89544,838 89545,192 89546,302 89546,579 89546,1556 89548,298 89549,485 89550,79 89551,1359 89552,1016 89553,255 89554,567 89555,30 89556,326 89556,2116 89558,577 89558,1070 89558,1105 89558,1531 89559,1132 89560,781 89562,21944 89563,160 89564,671 89565,1531 89566,18726 89567,83 89568,671 89569,147 89570,1096 89571,620 89572,184 89573,9457 89575,271 89576,1240 89577,1122 89578,538 89579,473 89580,663 89580,664 89580,994 89580,1556 89581,934 89582,3069 89583,563 89584,41 89584,631 89586,640 89587,640 89588,640 89589,931 89590,89591 89593,217 89594,79 89595,4455 89596,473 89596,8149 89597,89598 89599,1118 89600,147 89600,158 89600,779 89601,1844 89602,415 89603,422 89604,388 89605,93 89605,94 89606,206 89607,818 89608,1151 89608,1836 89609,779 89610,2784 89611,875 89612,264 89612,749 89612,1381 89612,2605 89613,1417 89614,24926 89615,151 89616,992 89616,19488 89618,827 89619,932 89620,209 89620,489 89621,1400 89622,760 89622,1149 89622,1631 89623,392 89623,84257 89624,225 89624,248 89624,450 89624,850 89624,1332 89624,5405 89625,83 89626,2626 89627,298 89628,485 89630,1240 89631,48 89632,516 89633,269 89634,3724 89635,392 89636,48 89638,356 89638,1326 89639,422 89640,215 89641,298 89642,485 89643,500 89644,422 89645,422 89646,310 89647,422 89648,422 89649,422 89650,422 89651,422 89652,422 89653,89654 89655,1796 89658,30331 89660,10 89661,287 89661,809 89662,104 89662,134 89662,137 89662,138 89663,89664 89665,1010 89666,1688 89667,1707 89667,1893 89668,1132 89669,2379 89670,30 89671,305 89672,1179 89673,1467 89674,623 89674,1805 89675,1390 89676,859 89677,30 89678,158 89679,312 89679,1177 89679,1235 89680,89681 89680,157835 89680,160137 89680,184275 89680,190234 89680,218779 89680,219892 89680,229218 89680,239074 89680,241030 89680,251877 89682,500 89683,89684 89685,485 89686,784 89687,779 89687,68069 89688,2775 89689,447 89690,1285 89692,1359 89693,1556 89694,2775 89695,447 89696,298 89697,485 89699,340 89699,473 89700,30 89701,10 89702,30 89704,302 89704,811 89704,893 89705,72 89706,344 89707,285 89709,200 89709,1033 89711,999 89711,1119 89713,30 89714,3297 89716,1381 89717,30 89718,1977 89718,1978 89719,477 89720,1087 89721,433 89722,217 89723,3507 89724,467 89724,536 89725,358 89725,1252 89725,1253 89725,1465 89725,1634 89725,2867 89725,2868 89726,516 89727,30 89728,1087 89729,406 89730,137 89731,623 89731,1805 89732,120 89733,868 89734,31934 89735,310 89737,1381 89738,15 89738,207 89738,713 89738,4172 89739,195 89740,3207 89741,89741 89743,1220 89743,1222 89744,252 89745,251 89746,360 89746,703 89749,622 89751,171 89752,337 89752,439 89752,538 89753,868 89754,663 89754,2480 89755,41 89755,1243 89755,1544 89756,1220 89756,1222 89757,137 89758,477 89759,477 89760,206 89761,779 89762,932 89763,147 89763,158 89763,1181 89763,118336 89764,47 89764,467 89764,2469 89766,852 89767,3756 89768,861 89769,1381 89770,209 89771,310 89772,313 89772,634 89772,783 89772,1058 89772,2646 89773,68069 89773,86832 89774,1531 89775,89776 89779,1893 89780,1769 89781,527 89781,740 89781,741 89781,743 89782,222 89783,200 89784,247 89785,17309 89786,599 89786,1707 89786,1983 89787,652 89789,68069 89790,843 89791,79 89792,298 89793,485 89795,8991 89796,1127 89796,1893 89797,6323 89798,483 89799,89799 89800,417 89801,222 89802,287 89803,217 89803,872 89804,68069 89805,422 89806,56 89807,68069 89807,86832 89807,103860 89809,392 89810,772 89811,68069 89812,163 89812,209 89812,438 89813,557 89814,89815 89816,2646 89816,3623 89817,1818 89818,15523 89819,420 89820,1888 89821,1381 89822,772 89823,1240 89823,3182 89823,6955 89824,809 89825,392 89827,349 89827,1072 89827,13361 89828,298 89829,485 89830,1836 89831,500 89832,3069 89834,68069 89835,1147 89835,1891 89836,68069 89837,167 89837,2083 89838,83 89839,2292 89839,2889 89841,175 89842,298 89843,682 89843,1353 89843,72439 89844,3069 89847,104 89848,30 89850,1381 89852,30 89853,1231 89854,68069 89854,86832 89855,1381 89856,1381 89857,247 89857,269 89857,516 89858,994 89859,48 89860,1432 89861,94 89861,2787 89862,14434 89863,273 89864,89865 89868,2319 89870,48 89871,973 89871,1179 89872,392 89873,30 89874,602 89876,872 89877,247 89878,158 89879,89879 89880,1818 89881,83 89882,195 89884,89885 89886,3069 89887,1818 89888,1818 89889,1818 89890,22 89890,255 89890,563 89890,818 89891,89892 89893,376 89894,1818 89895,1818 89896,107 89897,1818 89898,579 89900,149 89901,1082 89901,1807 89901,1818 89902,30 89904,88820 89905,68069 89906,1818 89907,48 89907,275 89907,980 89908,1818 89909,137 89910,10 89911,1572 89911,1818 89912,264 89913,30 89914,1453 89915,107 89915,200 89915,1462 89915,8180 89915,8537 89915,88820 89916,89917 89918,1818 89919,292 89920,89921 89922,89921 89923,1818 89924,805 89925,392 89926,89927 89929,358 89929,1844 89931,30 89933,2775 89934,447 89935,1707 89936,1 89937,1298 89938,175 89939,298 89940,2775 89941,447 89942,89943 89944,326 89944,1313 89945,10 89946,843 89948,1453 89949,29380 89950,89951 89952,206 89953,89953 89954,644 89955,68069 89956,1363 89957,89958 89959,640 89960,1515 89961,6298 89962,1465 89963,717 89963,784 89963,1381 89964,859 89965,175 89966,68069 89967,298 89968,56 89968,192 89969,89970 89971,557 89972,557 89973,89974 89975,89976 89977,89976 89978,89976 89979,1818 89980,1 89981,323 89982,89983 89984,516 89985,20004 89986,89987 89988,184 89989,89990 89991,89992 89993,21944 89994,1082 89994,1818 89995,89996 89997,481 89998,89996 89998,143208 90000,90001 90002,18726 90003,90004 90005,68069 90006,623 90007,1127 90008,90009 90010,8854 90011,72 90012,21944 90013,90014 90015,1983 90016,657 90017,1983 90018,1983 90019,90020 90022,9598 90023,602 90024,1983 90025,90026 90027,68069 90028,130 90029,48 90030,66 90030,868 90030,2371 90032,10 90033,2750 90034,631 90034,1085 90034,2083 90034,3115 90035,90036 90035,101949 90035,140202 90035,140209 90037,68069 90038,3413 90039,862 90040,90041 90042,195 90043,3447 90044,90045 90046,602 90047,77 90048,104 90049,1467 90050,14366 90051,388 90053,30 90054,2424 90055,30 90056,90057 90058,2668 90059,30 90060,30 90061,1871 90062,90063 90062,194311 90064,255 90065,2146 90066,2319 90067,147 90067,1462 90068,1801 90069,366 90070,366 90071,13980 90072,90073 90074,90073 90075,90073 90076,222 90076,455 90076,657 90076,2424 90076,21435 90076,90076 90076,98961 90076,234754 90077,392 90078,233 90080,310 90081,577 90083,77 90084,90085 90086,90087 90088,68069 90089,1818 90090,34 90090,35 90091,7652 90092,2168 90093,1893 90094,1479 90095,907 90096,1467 90097,868 90098,90099 90100,346 90101,10 90102,1818 90103,388 90104,90105 90106,302 90107,2424 90108,298 90109,485 90110,1818 90111,5034 90112,104 90113,1849 90114,90115 90116,571 90117,21944 90119,175 90121,1871 90122,298 90123,1 90124,207 90125,602 90126,10 90127,859 90128,1818 90129,602 90130,862 90131,640 90132,1019 90132,5250 90134,90135 90136,149 90137,392 90138,20 90138,182 90138,440 90138,489 90138,1011 90138,1133 90138,1172 90138,1204 90138,1844 90139,68069 90139,141912 90140,1119 90141,209 90142,447 90143,1143 90144,623 90144,1805 90144,4760 90145,1359 90146,497 90147,200 90148,503 90150,30 90151,422 90152,56 90153,640 90154,640 90155,90155 90156,1983 90157,2116 90159,30 90160,640 90161,104 90161,953 90162,19443 90163,872 90164,22 90164,211 90164,141912 90165,30 90166,1132 90167,781 90168,1893 90169,81070 90170,1807 90170,1818 90171,30 90172,143 90173,79 90173,1289 90174,779 90174,68069 90175,120 90176,49887 90177,1564 90177,1785 90177,4146 90180,206 90181,337 90181,1370 90182,477 90183,1298 90183,2979 90184,83 90185,167 90185,1300 90186,932 90188,90189 90190,90189 90191,1033 90192,75912 90193,602 90194,298 90195,485 90196,447 90197,1287 90199,163 90199,1511 90199,3069 90200,392 90201,726 90202,97 90203,3538 90204,90205 90204,105971 90206,1181 90207,1052 90208,1849 90209,209 90211,439 90211,68069 90212,68467 90213,360 90213,872 90214,90215 90216,626 90217,298 90218,485 90219,192 90220,4146 90221,21944 90222,477 90223,90224 90225,493 90225,586 90226,1590 90227,90228 90229,90230 90231,90230 90232,90230 90233,90234 90235,1458 90236,15523 90237,1631 90238,620 90239,171 90240,477 90241,356 90242,1287 90243,30 90244,9560 90245,9029 90246,379 90248,477 90249,81070 90250,3695 90252,477 90253,305 90253,762 90254,46 90254,444 90254,567 90254,968 90254,973 90255,687 90256,16196 90259,292 90260,422 90262,422 90263,422 90264,422 90265,422 90266,209 90267,422 90268,422 90269,422 90270,422 90272,422 90273,422 90274,200 90275,875 90276,72 90277,344 90278,285 90279,248 90280,175 90281,90281 90282,298 90284,647 90285,344 90286,1323 90287,102 90288,1326 90289,408 90290,200 90290,772 90291,209 90292,626 90293,422 90293,1127 90294,1732 90296,852 90299,79 90300,457 90301,2205 90301,2206 90301,2775 90301,33424 90302,272 90302,1294 90303,209 90304,406 90305,599 90307,1001 90309,1001 90310,589 90311,240 90312,269 90313,1390 90314,81070 90315,209 90316,17309 90317,392 90318,1466 90319,298 90320,485 90321,9457 90322,90323 90322,109424 90324,1381 90326,79 90326,1257 90326,3085 90327,809 90328,79 90329,2367 90331,298 90332,485 90336,22 90336,2750 90338,875 90339,90340 90341,90342 90343,90344 90345,442 90346,720 90349,861 90350,1634 90351,48 90352,3 90353,167 90354,697 90355,2073 90356,233 90357,1368 90357,1509 90357,1639 90359,657 90360,1240 90361,30 90362,195 90363,264 90363,1509 90363,191860 90364,202 90364,203 90365,147 90367,90368 90369,360 90369,515 90369,1151 90369,1381 90369,1639 90369,2617 90370,406 90370,779 90370,68069 90371,22 90372,104 90373,298 90374,485 90375,10 90376,48 90377,313 90378,30 90379,86 90380,1453 90384,90385 90386,247 90387,195 90388,34 90388,35 90388,313 90388,634 90389,1293 90389,1417 90389,1844 90390,875 90391,72 90392,663 90392,664 90392,994 90392,1837 90393,392 90393,483 90394,209 90395,206 90395,280 90395,17245 90396,72 90397,30 90398,473 90399,72 90400,10 90401,1912 90402,30 90403,1019 90404,72764 90405,779 90405,68069 90406,392 90407,392 90408,10 90409,68069 90410,931 90411,251 90411,252 90411,516 90411,925 90411,1220 90411,1222 90411,2567 90413,72 90415,72 90416,483 90417,30 90417,200 90418,309 90418,310 90418,760 90419,483 90419,862 90420,376 90421,885 90422,81 90423,72 90424,344 90425,285 90426,2526 90427,34 90427,35 90428,850 90429,392 90430,850 90431,267 90432,1871 90432,2421 90433,850 90434,30 90435,1127 90436,376 90437,247 90438,30 90439,90440 90441,90440 90442,1323 90443,30 90444,90445 90446,65 90447,872 90448,30 90449,106 90450,195 90450,6323 90451,90452 90453,457 90454,433 90455,147 90455,1515 90456,2782 90457,68069 90458,209 90459,760 90460,557 90461,90461 90462,140 90463,267 90464,1983 90465,158 90466,167 90466,299 90466,2083 90467,209 90468,134 90468,3135 90469,1707 90470,868 90471,3260 90472,34 90472,35 90473,136 90475,50 90475,388 90476,358 90477,4355 90478,90479 90480,90481 90480,95457 90482,779 90482,68069 90483,202 90483,203 90484,70631 90485,1836 90486,24505 90487,1 90487,184 90487,620 90488,32 90488,760 90489,72 90490,389 90491,779 90492,3422 90493,557 90494,2116 90495,1983 90496,90497 90498,433 90499,557 90500,90501 90502,298 90503,485 90504,1458 90505,298 90506,485 90507,647 90508,344 90509,1818 90510,577 90511,850 90512,90513 90514,90515 90516,850 90517,285 90518,850 90520,4611 90521,602 90522,602 90523,422 90524,56 90525,885 90526,298 90527,485 90528,467 90528,588 90528,590 90528,75912 90529,90530 90531,90532 90533,1381 90535,68069 90537,5440 90538,10 90539,1181 90540,250 90540,1684 90541,79 90543,72 90544,90545 90546,1531 90546,2178 90546,4545 90546,56150 90547,90548 90549,5366 90550,2995 90551,90552 90553,18726 90554,77 90555,72 90556,217 90557,90558 90559,205 90560,850 90562,841 90563,1319 90564,275 90565,1571 90566,313 90567,313 90568,313 90569,289 90569,290 90570,195 90570,27217 90571,90572 90571,120558 90573,90574 90575,313 90576,1167 90578,195 90579,19986 90580,2178 90580,4545 90581,90582 90583,90584 90585,589 90585,1001 90586,390 90587,195 90588,90589 90590,90591 90593,4678 90594,344 90594,827 90595,3148 90596,5405 90597,872 90598,872 90599,3246 90600,671 90601,1210 90601,2083 90601,90602 90601,126606 90601,151521 90603,207 90604,90605 90606,90605 90607,175 90608,298 90609,72 90610,72 90611,90612 90614,90615 90616,30 90617,233 90619,3392 90621,2351 90622,2116 90624,704 90625,347 90626,90627 90629,298 90630,485 90631,90632 90633,149 90633,163 90633,703 90633,809 90634,97 90635,10 90636,1135 90637,90638 90639,355 90640,2867 90640,2868 90641,452 90642,1247 90643,184 90644,97 90645,602 90645,13661 90646,298 90647,485 90648,34 90648,35 90650,163 90650,2116 90651,626 90652,83 90652,577 90652,949 90653,313 90653,379 90653,1274 90654,90655 90656,305 90658,90659 90658,94437 90661,90660 90663,1309 90663,1955 90664,2146 90665,626 90665,1392 90665,93401 90668,1531 90669,90670 90671,32 90671,118336 90672,90673 90674,636 90675,868 90676,90677 90678,557 90679,1368 90680,491 90680,827 90680,2315 90681,347 90682,1983 90683,200 90684,736 90685,255 90686,2048 90687,360 90688,843 90689,90690 90691,187 90692,972 90693,640 90694,640 90695,79 90696,843 90697,640 90698,90699 90700,30 90701,1149 90702,726 90702,868 90703,835 90703,1893 90706,1531 90707,843 90708,140 90709,90710 90711,718 90712,264 90713,97 90714,140 90715,22293 90716,167 90717,147 90717,158 90717,336 90718,932 90719,83 90720,843 90720,1590 90722,611 90723,481 90724,1858 90725,809 90726,1579 90727,90728 90729,90728 90730,90728 90731,90728 90732,10 90733,1556 90734,140 90735,58 90736,338 90736,1238 90736,4039 90737,626 90738,422 90740,90741 90742,422 90743,422 90744,422 90745,422 90746,422 90747,90748 90749,1181 90750,422 90751,422 90752,3413 90753,859 90755,455 90756,581 90757,264 90757,302 90757,893 90758,557 90759,3507 90761,151 90761,685 90762,301 90762,717 90762,1293 90762,1782 90763,422 90764,861 90765,39564 90766,1715 90767,1127 90768,1 90769,1359 90770,137 90770,611 90770,50318 90770,75912 90771,1220 90771,1222 90772,477 90773,171 90774,252 90775,1467 90776,477 90778,931 90778,1127 90778,1893 90778,4823 90779,20 90780,1243 90782,1284 90783,1983 90784,298 90785,485 90786,2266 90787,217 90789,477 90790,1359 90792,13538 90794,779 90794,68069 90794,118336 90794,141912 90795,2146 90796,527 90796,8714 90797,1390 90798,1016 90800,536 90801,647 90802,344 90803,1707 90804,467 90804,1143 90805,2379 90806,8990 90807,136 90808,510 90809,336 90809,631 90811,1983 90812,1977 90812,1978 90813,26181 90814,90815 90816,158 90818,602 90819,302 90819,579 90819,1556 90820,90821 90823,406 90824,1983 90825,90826 90828,1096 90829,2105 90830,2116 90831,8072 90832,175 90833,30 90834,298 90835,433 90836,1983 90838,1983 90839,240 90840,849 90841,1274 90842,90843 90844,477 90845,71 90845,7087 90845,90845 90845,123847 90845,170952 90845,264446 90845,264454 90845,264773 90846,433 90848,1298 90849,477 90850,90851 90854,86 90854,1089 90855,1381 90856,420 90857,225 90857,248 90857,431 90857,932 90857,941 90857,968 90857,1832 90857,22799 90858,1983 90859,138 90859,360 90859,21944 90860,9560 90861,1132 90862,781 90863,640 90864,54 90864,83 90864,140 90864,660 90864,752 90864,919 90864,1287 90864,1309 90864,1871 90864,2424 90865,3297 90866,90867 90868,18298 90869,72 90870,151 90870,2668 90873,1326 90874,1132 90875,781 90876,1805 90877,90878 90879,1132 90880,781 90881,2979 90882,90883 90884,868 90885,314 90886,79 90886,346 90886,525 90887,647 90888,344 90889,1132 90890,781 90891,1132 90892,781 90893,850 90894,483 90894,90845 90895,3252 90895,7092 90896,1551 90897,346 90898,1132 90899,781 90900,160 90901,1132 90902,781 90903,442 90903,557 90903,2334 90904,1116 90905,299 90905,1837 90905,5301 90907,1132 90908,781 90909,65 90909,85 90910,3003 90911,85 90912,718 90912,3069 90913,117 90913,885 90913,994 90913,1212 90913,1432 90913,2712 90914,1132 90915,781 90916,1707 90917,31934 90918,1796 90919,1267 90920,636 90921,3 90922,843 90923,3207 90924,347 90925,111 90925,1119 90925,2989 90925,2991 90926,15523 90927,1983 90928,90929 90930,48 90930,147 90930,1425 90931,72 90932,2646 90933,315 90933,439 90933,671 90933,996 90933,1474 90934,68069 90935,500 90936,136 90936,137 90938,83 90938,333 90939,50 90940,1836 90941,90941 90942,68069 90943,200 90944,1289 90944,3474 90945,417 90946,90947 90948,248 90949,592 90950,90951 90950,130019 90952,140 90953,3422 90954,30 90955,2244 90957,83 90957,278 90958,10 90959,278 90959,1417 90960,852 90961,298 90962,485 90963,30 90964,510 90965,907 90966,1151 90967,788 90968,1381 90970,140 90970,2353 90971,200 90972,459 90973,22 90974,175 90975,298 90976,44725 90977,30 90978,376 90980,90981 90983,10 90984,657 90985,90986 90985,92612 90985,200654 90985,204933 90987,264 90987,1289 90988,636 90989,298 90990,485 90991,10 90991,113156 90993,149 90994,90995 90994,97770 90994,123934 90996,20771 90997,90998 90999,467 91000,247 91001,417 91003,1274 91004,91005 91006,58 91007,46 91008,97 91009,2775 91010,447 91011,393 91012,31934 91013,211 91014,147 91014,158 91015,2867 91015,2868 91016,1531 91017,450 91018,1877 91020,298 91021,485 91022,91023 91024,91023 91025,88820 91026,207 91026,2668 91027,450 91028,298 91029,485 91030,10 91030,1235 91031,309 91031,310 91032,22 91033,91034 91036,366 91037,366 91038,366 91039,483 91040,91041 91042,91041 91043,217 91043,1417 91044,136 91045,3 91045,233 91047,393 91048,1531 91049,647 91050,344 91053,302 91054,102 91055,147 91055,149 91055,1623 91056,298 91057,485 91058,1033 91059,1319 91060,143 91061,557 91062,557 91063,298 91064,485 91065,298 91066,485 91067,687 91068,779 91069,30 91070,602 91071,865 91071,994 91072,602 91073,91074 91075,171 91076,1363 91077,1359 91078,8854 91079,968 91080,158 91081,140 91082,450 91083,298 91084,485 91085,602 91086,433 91087,1359 91088,602 91089,91090 91092,875 91093,1608 91094,602 91095,91096 91097,72 91098,2775 91099,447 91100,175 91101,298 91102,195 91103,195 91105,91106 91107,1983 91108,206 91109,417 91110,83 91111,258 91112,68069 91113,392 91114,859 91115,636 91116,850 91117,91118 91119,91120 91121,91122 91123,313 91124,306 91124,307 91125,68467 91126,68069 91127,255 91128,536 91129,3161 91130,30 91131,91132 91134,195 91135,2671 91136,91137 91136,96400 91138,602 91139,175 91140,298 91141,366 91142,682 91142,72439 91143,151 91144,1238 91145,1452 91146,34 91146,35 91146,536 91147,91148 91149,30 91150,233 91151,195 91152,91153 91155,862 91156,91157 91159,30 91160,1132 91161,781 91162,30 91164,298 91165,485 91166,1983 91167,4611 91168,1544 91169,483 91171,91172 91171,113108 91173,4611 91174,1544 91175,298 91176,485 91177,760 91179,91180 91181,415 91183,355 91184,6556 91185,58 91186,1821 91187,302 91187,579 91188,1001 91190,1298 91191,30 91193,91194 91195,298 91196,485 91197,784 91198,91199 91200,1634 91201,1858 91202,1860 91203,298 91204,485 91205,3695 91208,1010 91209,1359 91210,285 91212,7572 91213,298 91214,485 91215,602 91216,298 91217,485 91218,1016 91219,63 91220,861 91220,893 91220,2750 91221,251 91223,91224 91225,298 91226,485 91227,4611 91228,1544 91229,158 91230,240 91230,588 91230,590 91230,592 91233,640 91235,640 91236,91237 91238,91237 91239,640 91240,91241 91242,640 91243,77 91244,2775 91245,447 91247,3524 91248,1983 91249,91250 91251,91237 91252,91253 91252,151630 91254,4571 91255,147 91256,406 91257,289 91257,290 91261,298 91262,485 91263,120 91263,1858 91264,91265 91266,298 91267,485 91268,1608 91269,693 91270,994 91272,3447 91273,980 91274,136 91274,137 91275,1132 91276,781 91277,649 91278,1818 91279,783 91280,932 91281,160 91282,1983 91283,83 91284,32 91284,392 91284,644 91284,2699 91284,3003 91284,4903 91285,1776 91285,68069 91286,649 91287,14126 91288,107 91289,457 91290,875 91291,868 91292,1454 91294,30236 91295,1085 91297,1359 91298,206 91299,1287 91301,1085 91302,140 91303,1858 91304,1860 91305,298 91306,485 91308,736 91308,14366 91310,1238 91311,1955 91312,868 91313,1359 91314,2292 91315,91316 91317,652 91318,424 91319,647 91320,344 91321,18726 91322,752 91323,171 91324,2915 91325,1639 91326,392 91327,163 91328,91328 91329,104 91329,2626 91330,818 91331,1983 91332,175 91333,298 91334,403 91335,171 91336,171 91337,1127 91337,1287 91339,10 91340,536 91340,1019 91340,1274 91342,390 91343,72 91344,1556 91345,184 91347,171 91348,794 91349,91350 91351,91352 91351,96486 91353,91354 91355,609 91355,60576 91356,1390 91357,422 91357,602 91358,392 91359,251 91360,91361 91362,30 91364,1220 91364,1222 91365,171 91366,1359 91368,2017 91369,252 91370,83 91371,392 91372,298 91373,485 91374,5547 91375,298 91376,485 91377,195 91378,171 91379,875 91380,832 91381,91382 91383,91384 91383,115156 91383,120261 91383,167362 91385,147 91385,306 91385,307 91385,620 91385,682 91385,72439 91386,4571 91386,88820 91387,21944 91388,364 91389,137 91389,703 91390,602 91391,91392 91391,97652 91391,113312 91391,128508 91393,91392 91394,1133 91394,1566 91395,652 91397,147 91398,217 91398,222 91398,1417 91398,2168 91399,592 91400,1298 91401,1359 91402,1019 91403,247 91404,91405 91404,91927 91404,93376 91404,99906 91404,102354 91404,105347 91404,106243 91404,109742 91404,114362 91404,114739 91404,114891 91404,117411 91404,120878 91404,138237 91406,1235 91406,1335 91407,372 91408,175 91409,58 91410,46 91411,32 91411,697 91412,2334 91413,298 91414,2574 91415,192 91416,929 91417,536 91418,91419 91420,91421 91422,31977 91423,602 91424,596 91425,2116 91427,1160 91428,973 91430,1353 91431,91432 91433,868 91435,366 91435,500 91437,5547 91438,136 91439,424 91440,136 91441,240 91442,1243 91443,3413 91445,422 91445,602 91445,707 91446,1509 91447,91448 91449,973 91450,1955 91451,422 91452,56 91454,192 91455,1265 91455,1266 91456,433 91458,1509 91458,1551 91459,79 91461,247 91462,1425 91463,392 91464,247 91465,202 91465,91466 91467,195 91468,818 91469,1309 91470,1807 91471,4980 91472,6726 91473,91474 91475,30 91476,91477 91478,91479 91480,30 91481,875 91482,1359 91483,91484 91485,91486 91488,1085 91488,1298 91488,1326 91489,83 91490,536 91491,91492 91493,91492 91495,81 91496,875 91497,302 91498,48 91499,602 91500,2867 91500,2868 91501,104 91502,72 91503,602 91504,247 91505,240 91505,818 91506,647 91507,344 91508,5213 91509,79 91510,602 91511,1634 91512,1474 91513,66 91513,868 91514,273 91515,86 91516,1715 91517,1564 91518,158 91519,4355 91520,72 91520,91521 91522,34 91522,35 91522,536 91522,657 91522,4672 91523,626 91524,72 91525,346 91525,510 91525,91526 91527,376 91528,3 91529,3135 91530,344 91530,647 91531,30 91532,91533 91534,422 91535,56 91536,254 91536,1282 91536,5343 91537,1151 91538,298 91539,485 91541,272 91542,119 91542,516 91543,298 91544,485 91545,298 91546,485 91547,1132 91548,781 91549,217 91549,1007 91549,1289 91550,30 91552,1235 91552,1335 91553,91554 91555,1167 91556,171 91557,5405 91558,980 91559,91560 91559,103949 91559,111648 91559,125558 91559,128782 91559,133248 91559,141547 91559,141730 91559,142223 91559,150314 91559,152300 91561,91560 91562,4355 91563,868 91564,875 91565,30 91566,557 91567,875 91568,450 91569,91570 91571,91572 91571,174078 91573,225 91574,289 91574,290 91575,91576 91577,1118 91578,1132 91579,781 91580,247 91581,483 91582,358 91583,91584 91585,240 91585,442 91585,805 91585,1962 91586,72 91587,97 91588,579 91588,2116 91589,3 91590,91591 91592,1849 91593,557 91594,91595 91596,557 91598,602 91599,356 91599,615 91600,602 91602,1572 91603,298 91604,485 91606,217 91606,872 91606,918 91606,2574 91606,2617 91606,16196 91607,72 91608,1010 91609,2116 91610,91611 91612,422 91614,91615 91616,850 91618,65 91619,328 91620,1240 91620,1454 91621,1608 91622,772 91622,26251 91622,28203 91623,577 91624,17772 91625,602 91626,91627 91626,118180 91628,393 91629,30 91630,91631 91633,850 91634,107 91635,1359 91636,4594 91637,72 91638,450 91639,1257 91640,450 91641,3367 91642,3367 91643,91644 91645,187 91646,392 91647,91648 91649,304 91649,4411 91650,298 91651,485 91653,91654 91655,509 91656,91657 91658,1724 91659,424 91660,602 91661,91662 91663,72 91664,2590 91665,91666 91667,91668 91669,8788 91670,91671 91672,422 91673,422 91674,422 91675,422 91676,422 91677,422 91678,83 91678,269 91678,1014 91679,422 91680,422 91681,91682 91683,422 91684,422 91685,72 91686,344 91687,285 91688,207 91689,91690 91691,250 91691,1684 91692,805 91693,872 91694,1429 91695,668 91696,602 91697,6556 91698,30 91699,222 91700,91701 91702,30 91703,91704 91705,20813 91706,14434 91707,424 91708,872 91709,481 91711,1133 91712,91713 91714,1143 91715,1370 91715,1821 91715,2782 91715,21736 91716,91717 91718,91719 91721,78120 91722,1007 91723,88820 91724,91725 91726,392 91727,91728 91729,83 91729,278 91730,586 91731,640 91732,3 91733,2620 91734,366 91735,366 91736,366 91737,65 91738,91739 91740,671 91741,87 91741,392 91741,1363 91741,2699 91742,233 91743,91744 91745,7 91745,126 91745,332 91745,1392 91745,3872 91745,6837 91745,9195 91745,17228 91746,302 91746,579 91747,91748 91749,75912 91750,91751 91753,750 91754,91755 91756,3422 91757,304 91758,91759 91760,1566 91761,355 91762,872 91763,298 91764,485 91766,72 91767,795 91768,859 91769,30 91770,140 91771,500 91772,1962 91773,1052 91774,1882 91775,2775 91776,54 91777,503 91778,1326 91779,2979 91780,115 91780,118 91780,4597 91781,171 91781,1623 91782,862 91783,1247 91784,500 91785,1962 91786,1052 91787,1882 91788,2775 91789,54 91791,615 91791,1243 91791,1319 91791,2572 91792,192 91794,1132 91795,781 91796,178 91796,805 91796,1368 91796,5405 91797,30 91798,818 91799,1572 91800,835 91800,3177 91801,31977 91802,5405 91803,349 91804,1359 91805,1977 91805,1978 91806,91807 91808,206 91808,1118 91809,433 91810,439 91811,527 91812,992 91813,72 91814,222 91817,217 91818,872 91819,88820 91821,75912 91822,91823 91824,63 91824,252 91824,516 91825,30 91826,392 91829,91830 91831,1707 91831,1955 91831,66500 91832,3538 91833,147 91833,333 91833,1181 91834,379 91835,30 91836,455 91837,868 91838,1001 91841,571 91842,575 91842,1284 91843,83 91844,452 91844,535 91844,918 91844,1655 91845,275 91846,694 91847,91848 91849,687 91851,457 91852,626 91854,2319 91855,1381 91856,877 91857,1381 91858,5440 91859,932 91860,86 91861,605 91862,195 91863,32 91863,392 91863,697 91863,918 91863,3003 91864,1313 91865,184 91865,251 91865,313 91865,44725 91866,422 91867,422 91868,422 91869,422 91870,422 91871,422 91872,422 91873,422 91874,422 91875,422 91876,298 91877,485 91879,15 91879,2292 91880,818 91880,6059 91881,301 91882,1265 91882,1266 91883,3069 91884,91885 91886,19443 91887,75912 91888,2371 91890,536 91890,230514 91891,3182 91892,19010 91892,22293 91893,479 91894,3297 91895,1243 91896,736 91896,1289 91898,1282 91899,34 91899,35 91900,136 91901,1400 91902,1836 91903,151 91903,657 91904,875 91905,581 91906,1019 91906,13137 91907,485 91908,140 91909,175 91910,298 91911,527 91912,1390 91913,1429 91914,1146 91915,91916 91915,103754 91915,104070 91915,104125 91917,1011 91918,298 91919,485 91920,302 91921,1556 91924,298 91925,485 91926,1212 91928,91929 91930,91931 91933,207 91934,592 91935,1659 91936,310 91936,3039 91937,264 91937,6323 91938,58 91939,46 91940,75912 91941,298 91943,4935 91945,920 91947,467 91948,200 91949,4475 91950,298 91951,485 91953,390 91954,433 91955,91956 91957,1191 91958,875 91959,72 91961,58 91962,46 91963,75912 91964,58 91965,46 91966,75912 91967,392 91967,697 91967,1722 91967,2697 91967,3538 91968,58 91969,46 91970,75912 91971,58 91972,75912 91973,46 91974,1359 91974,1882 91975,240 91975,301 91975,372 91975,589 91975,631 91975,1010 91975,1085 91976,760 91976,1149 91977,299 91977,21944 91978,175 91979,298 91980,287 91980,809 91981,918 91982,1220 91982,1222 91983,872 91984,130 91985,663 91985,664 91986,1118 91987,907 91988,726 91989,626 91990,5213 91991,167 91992,872 91993,818 91995,3260 91996,827 91998,973 92001,240 92002,599 92003,1837 92004,92005 92006,3069 92007,850 92008,333 92009,628 92010,1140 92010,5547 92011,392 92012,4611 92013,2775 92014,447 92015,72 92016,2926 92017,972 92018,298 92019,485 92021,252 92022,92023 92024,1381 92025,1010 92026,30 92027,298 92028,485 92029,72 92031,872 92032,92033 92034,30 92035,294 92035,500 92037,1579 92038,850 92039,1326 92040,92041 92042,579 92043,92044 92045,779 92045,6323 92046,34 92046,35 92047,104 92049,392 92050,81070 92051,20771 92052,92053 92055,215 92056,2697 92057,137 92057,304 92057,1332 92057,1888 92058,298 92059,485 92060,1983 92061,920 92062,92063 92064,167 92065,1893 92067,56 92068,620 92069,1 92070,50 92071,158 92072,1515 92073,99 92074,714 92075,703 92076,5213 92077,30 92078,2867 92078,2868 92079,92080 92081,30 92082,652 92083,1608 92084,3193 92085,2553 92086,92087 92088,557 92089,68069 92089,141912 92090,30 92091,779 92091,68069 92091,141912 92093,34 92093,35 92094,72 92095,30 92096,30 92097,92098 92099,2646 92101,772 92103,83 92104,358 92105,19 92106,602 92107,8270 92108,4220 92109,178 92109,406 92109,714 92109,779 92109,801 92109,1001 92109,1203 92109,1265 92109,1266 92109,1715 92109,1955 92109,2626 92109,4146 92109,9024 92109,21711 92109,54243 92109,72750 92109,92133 92110,809 92111,310 92112,285 92113,1370 92114,640 92115,92116 92115,94007 92117,557 92118,557 92119,557 92120,1010 92120,1122 92120,1241 92120,1849 92120,2620 92120,32784 92121,8719 92122,138 92123,865 92124,557 92125,1016 92126,137 92127,3507 92128,118 92128,4597 92129,21944 92130,88820 92131,187 92132,1467 92133,146 92134,92135 92134,100159 92136,92137 92138,6682 92139,22 92140,192 92140,19413 92141,81 92141,175 92141,215 92141,233 92141,290 92141,328 92141,590 92141,592 92141,693 92141,704 92141,714 92141,1118 92141,1149 92141,1212 92141,1257 92141,1402 92141,2210 92141,3069 92141,30124 92141,33424 92142,2116 92143,294 92144,2411 92145,1353 92146,328 92147,10 92148,298 92149,485 92150,3872 92151,72 92152,1363 92154,92155 92156,92157 92158,1515 92159,577 92160,1893 92161,72 92162,406 92162,779 92163,247 92164,2334 92165,273 92166,92167 92166,100533 92166,105684 92168,92169 92170,92171 92172,1132 92173,781 92174,175 92175,68069 92176,92177 92178,92179 92180,92181 92182,72 92183,704 92184,72 92185,68069 92186,68069 92187,92188 92189,158 92190,298 92191,485 92193,298 92194,485 92195,298 92196,485 92197,298 92198,485 92199,301 92200,92201 92202,704 92203,72 92204,92205 92206,92206 92207,2590 92208,92209 92210,376 92211,207 92212,772 92213,87 92215,92216 92217,92218 92219,8270 92220,920 92220,92221 92220,93477 92220,129394 92220,131878 92220,157132 92220,239692 92220,240899 92222,92223 92222,92499 92222,108789 92224,1796 92225,872 92226,1429 92227,225 92228,668 92229,92230 92229,131578 92231,92232 92234,8884 92235,92236 92237,240 92237,389 92237,455 92237,694 92238,1085 92239,704 92239,5547 92240,92241 92242,968 92242,1462 92242,1564 92242,1785 92242,1818 92242,8537 92243,92244 92245,72 92246,72 92247,92248 92249,158 92250,92251 92252,366 92253,366 92254,4980 92255,6726 92256,589 92257,920 92258,233 92259,872 92260,1143 92261,1243 92262,872 92263,92264 92265,1243 92266,72 92267,92268 92269,652 92270,388 92271,92272 92271,100523 92273,718 92274,671 92275,355 92276,298 92277,485 92278,15573 92279,92280 92281,158 92282,92283 92284,72 92285,298 92286,485 92287,92288 92289,41 92289,83 92289,671 92289,850 92289,1807 92289,6387 92289,142473 92290,1977 92290,1978 92291,92292 92293,44 92294,577 92296,92297 92298,32475 92300,83 92301,298 92302,485 92303,602 92304,875 92305,298 92306,485 92308,602 92309,92310 92311,1634 92311,6638 92312,298 92313,485 92314,2784 92316,92317 92318,92319 92318,119575 92320,92321 92322,72 92323,92324 92325,422 92326,422 92327,422 92328,422 92329,422 92330,422 92331,422 92332,422 92333,310 92334,92335 92336,5547 92337,875 92338,602 92339,92340 92341,875 92342,219 92343,10 92346,406 92348,240 92349,92350 92351,9195 92352,25873 92353,34 92353,35 92354,3538 92355,872 92356,5250 92357,693 92358,17228 92359,92360 92362,333 92362,59021 92363,171 92364,72 92365,92366 92365,171817 92365,184741 92365,217981 92367,298 92368,485 92369,92370 92369,106531 92369,108680 92369,238519 92371,136 92372,92373 92372,103365 92372,135339 92372,139049 92376,92377 92378,1247 92379,6303 92380,1247 92381,483 92383,92384 92385,586 92386,640 92387,92388 92389,30 92390,16207 92391,195 92392,1732 92393,4611 92394,298 92395,485 92396,92397 92398,24505 92399,376 92400,1707 92401,92402 92403,92404 92405,92404 92406,92407 92408,333 92409,92410 92411,10 92411,515 92411,652 92411,872 92411,1052 92411,1127 92411,1151 92411,1659 92411,1893 92411,3695 92412,298 92413,485 92414,298 92415,485 92416,298 92417,485 92418,92419 92420,1479 92421,390 92422,136 92423,875 92424,298 92425,485 92426,92427 92429,991 92430,2146 92431,602 92432,72 92434,602 92435,92436 92437,298 92438,485 92439,7652 92442,92443 92444,338 92444,2244 92446,1 92447,175 92447,92448 92447,105891 92447,222590 92450,92451 92452,83 92453,417 92454,92455 92456,92457 92458,1201 92459,92460 92461,92460 92462,97 92463,92464 92465,92466 92467,289 92467,290 92468,92469 92471,92472 92473,92474 92476,10 92476,106 92476,146 92476,336 92476,406 92476,620 92476,841 92476,1425 92476,92476 92476,118336 92477,92478 92479,92480 92479,105093 92481,92482 92484,2867 92484,2868 92485,92486 92487,92488 92489,92488 92490,92488 92491,92492 92493,92494 92495,92496 92497,92498 92500,1983 92501,1983 92502,872 92504,310 92505,147 92506,4691 92507,92508 92509,92510 92511,233 92512,35486 92513,175 92514,298 92515,92516 92517,54362 92518,366 92519,704 92520,366 92521,366 92522,107 92523,2416 92523,2417 92524,292 92525,338 92526,298 92527,1133 92528,3538 92529,24505 92530,68069 92532,92533 92534,355 92535,146 92536,175 92537,92538 92539,298 92540,392 92541,104 92542,24505 92543,298 92544,485 92545,298 92546,485 92547,175 92548,298 92549,298 92550,485 92551,92552 92553,72 92554,298 92555,485 92556,92557 92558,92559 92560,1132 92561,781 92562,2674 92562,16153 92563,500 92564,1962 92565,1052 92566,1882 92567,2775 92568,54 92569,175 92571,298 92572,211 92573,92574 92575,298 92576,485 92577,21944 92578,273 92579,92580 92581,1127 92581,1893 92581,49057 92582,602 92583,1871 92584,92585 92586,586 92587,602 92588,92589 92590,240 92591,1983 92592,2506 92593,872 92594,872 92595,298 92596,485 92597,602 92598,92599 92600,571 92602,92603 92604,875 92605,83 92606,875 92608,92609 92611,178 92613,92614 92615,676 92616,1072 92617,298 92618,485 92619,1400 92620,298 92621,485 92623,450 92624,72 92625,72 92626,875 92630,497 92632,4691 92633,55849 92634,779 92635,298 92636,485 92637,92638 92639,92640 92642,92643 92644,483 92646,298 92647,485 92648,1983 92649,1983 92650,298 92651,485 92652,868 92653,92654 92655,126 92655,1392 92655,17228 92656,588 92656,590 92656,714 92656,2008 92656,7768 92657,92658 92659,92660 92661,298 92662,485 92663,298 92664,485 92665,72 92666,516 92667,2779 92668,72 92669,92670 92671,298 92672,485 92673,92674 92675,72 92676,151 92677,1247 92678,3447 92679,298 92680,485 92681,92682 92683,92682 92684,92685 92686,92687 92688,779 92689,557 92690,72 92692,376 92693,21944 92694,1132 92695,781 92696,72 92697,72 92699,92700 92701,2775 92702,447 92703,1 92705,92706 92707,557 92708,557 92709,862 92710,72 92711,1432 92712,72 92713,72 92714,298 92715,485 92716,72 92717,72 92718,557 92719,72 92720,557 92721,92722 92724,192 92724,217 92724,439 92724,527 92724,877 92724,1844 92724,5265 92725,2617 92726,72 92727,72 92728,622 92730,298 92731,485 92732,779 92733,302 92734,92735 92734,103949 92734,124712 92734,129415 92734,141521 92734,144581 92734,149687 92736,68069 92737,72 92738,433 92739,68467 92740,850 92742,298 92743,485 92744,1858 92744,14126 92745,298 92746,485 92747,58 92748,2979 92749,818 92750,602 92751,72 92753,602 92754,92755 92756,92757 92758,195 92759,72 92760,72 92761,439 92763,72 92764,92765 92766,72 92767,92768 92769,1359 92770,92771 92772,72 92773,92773 92774,63 92774,209 92774,893 92774,992 92774,1579 92774,1891 92775,875 92776,92777 92778,92779 92780,450 92781,72 92782,92783 92784,8270 92785,10 92786,1544 92792,620 92792,8244 92794,92795 92796,92797 92798,92799 92800,1 92801,195 92802,21944 92803,1238 92805,178 92807,92808 92809,261 92810,10 92810,2574 92810,3297 92811,1776 92812,178 92813,292 92814,294 92815,296 92816,298 92817,1452 92818,30 92819,72 92820,92821 92822,92823 92822,125712 92824,872 92825,175 92827,298 92828,2178 92828,4545 92829,366 92830,366 92831,366 92832,366 92833,233 92834,92835 92836,37 92836,301 92836,1293 92836,1782 92839,485 92840,72 92841,309 92841,310 92842,146 92843,850 92844,1782 92845,355 92846,893 92847,147 92848,7698 92849,186 92850,92851 92852,994 92853,48 92854,1432 92855,94 92855,2787 92856,14434 92857,273 92858,47 92858,1381 92858,2469 92859,2083 92860,211 92861,1572 92862,310 92862,3039 92863,875 92864,92865 92866,92866 92868,893 92869,1016 92870,1531 92872,420 92873,626 92874,760 92874,1149 92874,1631 92875,671 92877,1058 92878,349 92879,206 92880,515 92881,516 92881,1243 92881,206297 92882,850 92883,278 92883,356 92883,852 92883,2699 92883,5591 92884,285 92885,175 92886,92887 92888,92889 92891,298 92893,7 92894,158 92895,818 92896,3447 92897,406 92898,3258 92898,94409 92899,422 92900,92901 92902,422 92903,422 92904,422 92905,483 92906,579 92907,158 92907,1805 92908,1983 92909,22 92909,861 92910,640 92912,640 92913,1033 92914,2146 92915,422 92916,422 92917,422 92918,422 92919,2286 92920,422 92921,422 92922,283 92922,634 92922,781 92922,1436 92923,872 92924,1132 92925,781 92927,50 92928,225 92929,72 92930,344 92931,285 92932,852 92933,422 92934,22 92934,178 92934,1849 92934,20535 92935,68 92935,186 92935,264 92935,301 92935,1837 92936,195 92937,1267 92939,1132 92940,781 92941,72 92942,1983 92943,175 92943,4980 92944,56 92944,102 92944,344 92944,1001 92944,1789 92944,2205 92944,2310 92944,33424 92946,1132 92947,781 92948,1305 92949,932 92950,72 92952,500 92953,366 92954,72 92955,1927 92955,92956 92955,119111 92957,92956 92958,92956 92959,1033 92960,827 92961,92962 92963,602 92964,417 92965,30 92966,525 92966,26306 92967,35486 92968,83 92969,92969 92970,202 92970,203 92972,1179 92973,298 92974,485 92975,30 92976,1130 92977,1858 92978,1860 92979,140 92979,577 92979,1289 92979,1474 92979,7698 92980,5405 92981,72 92982,30 92983,1201 92984,779 92984,68069 92985,211 92986,358 92987,1370 92987,2782 92988,356 92989,217 92990,1240 92991,72 92992,1608 92993,8991 92994,422 92994,459 92995,783 92996,92997 92998,92999 93000,1146 93000,1240 93001,671 93001,3999 93001,4771 93001,30331 93002,862 93003,392 93004,178 93005,934 93006,779 93007,2812 93008,516 93008,1243 93008,3507 93009,298 93010,72 93011,485 93012,1556 93013,1390 93014,298 93015,485 93016,178 93017,285 93017,422 93017,1381 93017,139010 93018,72 93019,93020 93022,1983 93023,72 93028,4771 93029,760 93031,167 93033,1267 93035,93036 93039,1983 93042,1118 93044,48 93044,2353 93045,1983 93047,136 93048,1323 93049,102 93050,1326 93051,408 93054,240 93055,93056 93058,264 93058,479 93058,1147 93059,30 93060,68069 93061,202 93061,203 93062,1419 93064,72 93065,1837 93066,222 93068,1132 93069,781 93070,1181 93070,23783 93071,1235 93071,1335 93071,1368 93071,3207 93075,809 93076,72 93077,1132 93078,781 93080,301 93081,442 93081,1078 93081,1659 93081,60576 93084,862 93085,134 93085,138 93085,1368 93085,2105 93086,72 93087,93088 93089,2923 93089,3524 93090,2353 93091,1082 93092,2646 93093,167 93096,1849 93097,779 93098,72 93099,615 93099,1564 93100,30 93101,72 93102,93103 93104,225 93104,703 93104,1688 93105,9195 93106,93107 93108,72 93109,596 93111,72 93112,483 93113,22 93113,175 93113,207 93113,240 93113,287 93113,326 93113,392 93113,397 93113,433 93113,446 93113,693 93113,702 93113,752 93113,818 93113,873 93113,874 93113,1634 93113,5667 93114,15 93115,30 93116,247 93118,439 93119,130 93119,795 93119,861 93119,1149 93119,1531 93119,1782 93119,4355 93119,21982 93120,93121 93122,310 93122,3039 93123,5547 93124,3 93125,779 93125,68069 93125,141912 93126,1722 93127,3260 93128,88820 93129,72 93130,79 93132,3 93133,1392 93133,1745 93134,1882 93135,2353 93137,602 93138,779 93138,68069 93139,93140 93141,296 93142,1359 93143,104 93143,338 93143,360 93143,462 93143,835 93143,3695 93143,4039 93143,21408 93144,30 93145,146 93147,861 93148,1359 93149,7698 93150,843 93151,72 93152,726 93153,843 93154,811 93155,1893 93156,140 93156,1285 93156,3585 93156,6263 93157,22 93157,861 93158,222 93159,30 93160,862 93161,483 93162,298 93163,485 93164,779 93164,68069 93166,72 93167,333 93168,1415 93169,72 93170,146 93172,779 93173,30 93173,200 93173,772 93173,28203 93174,147 93174,158 93174,1181 93175,772 93176,30 93178,4355 93179,72 93180,30 93181,149 93182,302 93183,72 93184,6955 93185,1274 93186,83 93186,304 93187,422 93189,72 93190,72 93191,72 93192,30 93193,392 93194,72 93195,779 93196,93197 93198,30 93199,192 93199,314 93199,920 93200,30 93201,30 93202,93203 93204,72 93205,72 93206,733 93206,1082 93207,251 93207,44725 93208,175 93209,30 93210,298 93211,3193 93212,72 93213,72 93214,344 93215,285 93216,298 93217,485 93218,298 93219,485 93220,30 93221,68069 93222,72 93223,93224 93225,30 93226,6789 93227,178 93228,72 93229,28130 93230,252 93231,93232 93233,852 93234,167 93235,687 93235,1556 93235,6303 93236,3507 93237,312 93238,72 93239,663 93239,779 93240,298 93241,485 93242,376 93243,93244 93245,93246 93247,83 93248,3623 93249,536 93250,93251 93252,254 93252,503 93252,704 93253,298 93254,485 93255,72 93256,344 93257,285 93258,592 93259,1467 93260,450 93261,72 93262,455 93264,392 93264,697 93265,2424 93266,298 93267,485 93269,30 93270,1871 93271,2421 93272,72 93273,298 93274,485 93275,30 93276,2421 93277,83 93278,13980 93279,2421 93280,72 93281,72 93283,10 93284,852 93285,136 93285,252 93285,272 93285,333 93285,435 93285,516 93285,1033 93285,1370 93285,1893 93285,4545 93285,139010 93285,240174 93286,602 93287,68069 93288,298 93289,485 93290,779 93290,68069 93291,93292 93293,93294 93295,30 93296,8373 93297,298 93298,485 93299,72 93300,1837 93301,602 93302,72 93303,72 93304,83 93305,22 93306,2319 93307,298 93308,485 93309,450 93310,10 93311,251 93311,516 93311,1243 93311,93311 93311,189788 93311,189794 93311,234695 93312,72 93313,1635 93314,920 93315,1 93316,72 93317,557 93318,920 93320,6789 93321,93322 93323,93322 93324,4611 93325,557 93326,557 93328,358 93329,1143 93330,1927 93331,99 93331,68069 93332,422 93333,56 93334,29380 93335,72 93336,72 93337,72 93338,408 93338,3769 93339,3447 93340,93341 93342,72 93343,93322 93344,72 93345,4611 93346,2379 93347,72 93348,298 93349,485 93350,72 93351,1983 93352,8855 93353,6682 93354,4980 93355,6726 93356,298 93357,485 93358,93359 93360,72 93361,602 93362,298 93363,485 93364,130 93366,10 93367,602 93369,671 93370,93371 93372,450 93373,872 93375,477 93377,298 93378,485 93379,93380 93381,126 93382,93383 93384,577 93385,1858 93386,1860 93387,22 93388,450 93389,93390 93389,97859 93391,298 93392,485 93393,1608 93394,93395 93396,602 93397,202 93397,203 93399,240 93400,1117 93402,93403 93404,481 93405,1983 93406,255 93409,72 93410,1132 93411,781 93412,104 93412,134 93412,135 93412,136 93412,137 93412,138 93412,557 93412,850 93412,1368 93412,2105 93413,93414 93415,2590 93416,93417 93420,3370 93420,14453 93421,163 93422,93423 93424,1983 93426,1 93427,207 93428,34 93428,35 93429,104 93430,30 93431,93432 93433,1001 93434,93435 93436,107 93437,93438 93439,93440 93439,99637 93439,100406 93439,115532 93439,117371 93439,123787 93439,124728 93439,149399 93439,153518 93439,168767 93439,238928 93439,239026 93439,242969 93441,872 93442,1429 93443,4771 93444,668 93445,93446 93447,93448 93449,15748 93450,93451 93452,93451 93453,93451 93454,93455 93456,872 93457,2867 93457,2868 93459,93460 93461,872 93462,346 93463,640 93464,676 93466,296 93467,422 93468,56 93469,93470 93471,233 93472,93473 93474,93474 93476,1143 93478,10 93478,113156 93479,93480 93481,704 93482,1707 93483,1977 93483,1978 93484,3413 93485,9457 93486,171 93487,346 93489,149 93490,30 93491,1132 93492,781 93493,171 93494,171 93495,2353 93496,1359 93497,355 93498,577 93500,119 93500,577 93500,1400 93500,21944 93501,1983 93502,93503 93504,207 93505,41 93506,247 93507,1240 93508,175 93510,1776 93511,298 93512,217 93513,9010 93514,697 93515,106 93516,408 93517,911 93518,147 93520,931 93522,640 93523,640 93524,671 93525,640 93526,75912 93527,178 93527,211 93528,2775 93529,1983 93530,931 93531,8270 93532,93532 93534,920 93535,406 93535,1181 93538,422 93539,406 93539,602 93540,477 93543,422 93544,422 93545,422 93546,422 93547,160 93548,422 93549,2506 93550,422 93551,422 93552,422 93553,93554 93555,93554 93557,1805 93558,81 93559,93560 93561,93560 93562,1247 93562,164572 93563,1580 93564,2506 93565,1634 93567,1140 93568,2506 93570,93571 93572,805 93573,1033 93574,72 93575,30 93577,957 93577,1247 93577,1815 93577,164572 93578,151 93579,932 93580,83 93581,171 93582,586 93583,19010 93584,255 93585,255 93586,273 93586,313 93587,1608 93588,34 93588,35 93588,167 93588,283 93588,289 93588,290 93588,631 93588,760 93588,1149 93588,1181 93588,1240 93588,1282 93588,1631 93588,2266 93588,3507 93588,94134 93589,151 93590,167 93590,2979 93591,30 93592,1326 93593,23783 93594,483 93595,93596 93598,79 93599,1010 93599,1849 93600,287 93600,393 93600,447 93600,516 93600,980 93600,1612 93600,15573 93601,720 93603,2867 93603,2868 93604,10 93607,1284 93610,175 93611,160 93612,298 93614,809 93615,907 93615,2191 93616,360 93616,628 93616,1147 93616,1149 93616,4823 93617,615 93617,7698 93618,2775 93619,356 93620,79 93620,1181 93621,2436 93622,602 93623,991 93623,1749 93624,1284 93625,1858 93626,1860 93627,30 93628,500 93629,302 93630,2506 93632,602 93633,104 93633,217 93633,346 93634,602 93635,79 93636,222 93636,657 93636,1467 93636,2266 93636,2421 93636,6424 93637,602 93638,393 93638,450 93638,671 93638,893 93638,1012 93638,1243 93638,1294 93638,1309 93638,15573 93639,93640 93641,602 93642,217 93643,356 93643,843 93643,1432 93644,209 93645,356 93645,843 93645,1432 93646,1390 93647,1127 93648,1163 93649,147 93649,158 93649,1803 93650,158 93652,1580 93654,93655 93656,477 93657,1132 93658,781 93660,1132 93661,781 93662,1417 93663,1267 93664,602 93665,356 93666,356 93667,1400 93668,1132 93669,781 93670,408 93672,137 93672,586 93672,2574 93672,4039 93673,6661 93674,563 93674,2867 93674,2868 93675,1220 93675,1222 93676,252 93677,251 93678,2506 93680,13538 93681,1132 93682,781 93683,1462 93683,8537 93684,1240 93684,1454 93685,1181 93686,93687 93688,934 93689,640 93690,209 93691,34 93691,35 93691,68 93691,1085 93691,185877 93692,525 93692,973 93692,4146 93694,779 93694,68069 93695,509 93696,240 93697,93698 93699,2506 93700,1132 93701,781 93702,366 93705,30 93706,1849 93708,200 93709,302 93709,579 93709,861 93709,893 93710,1381 93711,535 93711,1014 93711,1118 93712,1132 93713,781 93714,1118 93714,6695 93715,779 93717,972 93718,676 93718,1566 93721,467 93721,868 93721,1745 93722,93723 93724,302 93724,579 93725,147 93725,1803 93726,602 93727,392 93728,30 93728,571 93728,622 93728,868 93729,30 93729,28203 93731,1374 93732,240 93733,875 93734,93735 93737,2146 93738,302 93740,4222 93742,1677 93744,298 93745,485 93746,1392 93748,424 93749,171 93750,93751 93752,1085 93752,1118 93752,6695 93752,75912 93753,209 93755,1012 93755,1309 93755,1983 93756,452 93756,535 93756,918 93756,1655 93757,4039 93758,577 93758,868 93759,192 93761,93762 93764,3 93766,849 93766,1844 93768,19 93768,278 93768,283 93768,356 93768,1571 93768,1871 93768,2421 93768,5326 93768,6068 93768,19443 93769,1580 93771,1118 93772,93773 93775,178 93776,5405 93777,920 93778,192 93778,452 93778,516 93778,685 93778,849 93778,1370 93778,30331 93778,207659 93779,1203 93780,192 93781,147 93781,158 93781,406 93783,30 93784,68069 93785,68069 93786,749 93787,1001 93788,68069 93789,68069 93790,146 93790,2274 93790,92476 93791,3258 93792,202 93792,203 93793,6638 93794,406 93795,171 93796,93797 93799,1454 93800,1707 93801,1140 93801,5547 93802,4504 93803,184 93803,779 93804,713 93805,3 93806,438 93807,2995 93808,3161 93809,34 93809,35 93810,3895 93811,158 93812,151 93813,68069 93813,141912 93814,875 93815,175 93816,298 93817,1220 93817,1222 93818,93819 93820,392 93821,920 93822,726 93823,577 93824,636 93825,72 93826,310 93828,1010 93830,178 93831,2274 93832,809 93833,406 93835,167 93835,2083 93836,4637 93837,4637 93838,252 93840,195 93840,19005 93841,1983 93842,1179 93843,657 93845,1370 93846,602 93847,602 93848,3623 93849,1983 93850,1085 93851,557 93852,920 93853,10 93853,113156 93854,602 93856,875 93857,222 93858,483 93859,602 93860,22 93860,332 93860,1776 93860,21442 93861,1132 93862,781 93863,346 93865,376 93866,602 93867,93868 93869,358 93870,93871 93872,93873 93874,93873 93875,93873 93877,1132 93878,781 93879,93879 93880,269 93881,140 93882,267 93883,1 93884,147 93884,1803 93885,93886 93887,178 93888,1133 93889,861 93890,10 93892,2116 93893,93894 93895,93896 93897,1177 93897,2210 93899,1140 93899,1151 93900,30 93901,557 93902,557 93903,1016 93903,2210 93904,93905 93906,577 93907,439 93908,2367 93909,1983 93910,255 93911,93912 93914,206 93914,1181 93915,93916 93918,2506 93919,1224 93920,138 93923,602 93924,93925 93926,206 93927,577 93928,93929 93930,1388 93931,1370 93931,1821 93932,30 93933,287 93934,931 93935,2590 93936,516 93937,305 93938,93939 93940,1127 93941,250 93941,1684 93942,207 93943,50 93944,631 93944,2083 93945,250 93945,1684 93946,93947 93948,1807 93950,83 93951,93952 93953,2617 93953,93954 93953,108419 93955,602 93956,1818 93957,872 93958,1429 93959,240 93959,1285 93960,4101 93961,5405 93962,215 93963,435 93964,1012 93965,668 93966,323 93967,346 93968,859 93969,2668 93970,41 93971,1634 93972,93973 93975,5547 93976,602 93977,602 93978,602 93979,602 93980,602 93981,602 93982,602 93983,481 93984,602 93985,1143 93986,718 93987,861 93988,1983 93989,90481 93990,7 93990,211 93991,93992 93993,93994 93995,247 93996,602 93997,72 93998,252 93999,158 94000,2351 94002,72 94003,332 94004,801 94006,97 94008,323 94009,872 94010,366 94011,3297 94012,31977 94013,1181 94014,63 94015,94016 94017,94018 94017,206827 94019,1085 94020,704 94021,704 94022,366 94023,366 94024,366 94025,366 94026,48 94027,94028 94030,94031 94032,233 94033,1424 94034,94035 94036,149 94037,106 94038,94039 94040,94039 94041,94039 94042,94039 94043,344 94044,160 94045,344 94047,163 94048,2867 94048,2868 94049,422 94050,56 94051,355 94052,206 94052,577 94053,195 94054,1983 94055,1132 94056,781 94057,1132 94058,781 94059,310 94060,1132 94061,781 94062,192 94064,389 94064,660 94064,6556 94064,19443 94065,392 94066,372 94067,1132 94068,781 94069,1566 94070,1776 94071,94072 94073,393 94075,21944 94076,3258 94077,217 94077,457 94077,818 94077,872 94077,1417 94078,151 94079,663 94079,664 94079,2178 94079,4545 94080,640 94081,640 94082,2674 94083,640 94084,1132 94085,781 94086,1033 94087,167 94088,298 94089,485 94090,171 94091,37414 94093,356 94094,422 94095,920 94095,1619 94096,422 94097,760 94098,422 94099,422 94100,827 94101,762 94102,422 94103,422 94104,422 94105,422 94106,422 94107,1860 94108,3612 94109,595 94110,2274 94111,392 94112,4760 94113,6059 94114,5658 94115,4252 94116,623 94117,697 94118,6955 94119,422 94120,422 94122,704 94123,20 94123,287 94124,850 94125,30 94126,285 94126,3585 94128,875 94130,30331 94132,980 94133,10 94134,289 94134,290 94134,304 94134,372 94134,704 94134,714 94134,1402 94134,1608 94134,2008 94134,2205 94134,2286 94134,2315 94134,33424 94134,144988 94135,94136 94138,355 94138,991 94139,1939 94140,94141 94142,94141 94142,155946 94143,44 94144,158 94145,818 94146,3069 94147,2775 94148,94149 94150,1466 94151,1204 94151,1663 94151,127158 94152,2205 94152,33424 94153,7092 94154,664 94154,20359 94155,1082 94155,1085 94157,953 94158,602 94158,5213 94160,83 94161,809 94162,1058 94163,1274 94164,94165 94166,94165 94167,457 94168,932 94169,79 94169,1512 94169,5992 94169,189788 94169,189794 94169,189842 94169,223738 94170,873 94171,515 94172,515 94173,366 94174,358 94174,510 94176,207 94176,1058 94176,1151 94176,1556 94177,1132 94178,781 94179,1240 94180,422 94181,56 94182,1564 94183,68069 94185,366 94186,1220 94186,1222 94187,252 94188,251 94189,30 94190,147 94190,149 94190,2244 94190,21826 94191,392 94192,2775 94193,447 94194,920 94195,852 94195,1274 94195,1571 94195,2944 94195,18831 94196,272 94197,30 94198,2424 94199,602 94200,602 94201,1983 94203,68069 94204,94205 94206,195 94206,652 94206,794 94207,366 94208,602 94210,187 94211,2436 94211,3474 94212,94213 94214,868 94215,94216 94217,422 94218,72 94219,875 94220,358 94221,1019 94222,392 94222,697 94223,87 94223,1363 94224,209 94226,1390 94227,809 94229,2266 94230,10 94231,149 94232,5405 94233,20 94234,1983 94235,1983 94236,602 94237,1425 94239,3252 94240,209 94241,861 94243,195 94244,4980 94245,6726 94247,44725 94248,385 94248,32751 94249,126 94249,467 94249,868 94250,366 94251,68 94251,119 94252,809 94253,1087 94254,30331 94255,3422 94256,77 94256,557 94257,310 94257,3039 94257,21944 94258,3 94258,34 94258,35 94258,106 94258,178 94258,192 94258,202 94258,203 94258,217 94258,251 94258,252 94258,337 94258,346 94258,435 94258,516 94258,586 94258,663 94258,664 94258,1175 94258,1181 94258,1220 94258,1222 94258,1243 94258,1294 94258,1370 94258,1590 94258,1635 94258,2567 94258,3161 94258,5976 94258,6119 94258,16201 94259,22580 94260,602 94261,366 94262,704 94262,1140 94262,5547 94263,30 94264,2867 94264,2868 94265,94266 94267,247 94268,94269 94270,273 94271,356 94272,94273 94274,602 94275,30 94277,422 94278,56 94280,1381 94282,1572 94283,703 94285,344 94286,171 94287,1070 94288,304 94288,4455 94289,862 94290,557 94291,1877 94293,697 94294,1240 94295,68467 94296,805 94297,99 94298,949 94299,34 94299,35 94299,313 94299,697 94299,7698 94300,366 94300,500 94302,420 94303,602 94305,349 94306,1068 94307,1007 94308,852 94310,602 94311,1146 94313,5405 94314,422 94316,740 94316,741 94317,200 94317,328 94317,772 94317,4936 94318,22 94319,192 94319,195 94319,200 94319,278 94319,285 94319,372 94319,392 94319,406 94319,640 94319,694 94319,779 94319,843 94319,1010 94319,1175 94319,1181 94319,1298 94319,1515 94319,1955 94319,2210 94319,2286 94319,2416 94319,2417 94319,3585 94319,3804 94319,4237 94319,5874 94319,6119 94320,850 94321,1033 94322,58 94323,46 94324,75912 94326,94327 94326,100224 94328,3 94329,5547 94330,450 94332,68069 94333,346 94334,666 94334,991 94334,1052 94334,1127 94334,1749 94334,3585 94334,5130 94334,6695 94334,49057 94335,717 94336,818 94336,1118 94336,127158 94337,1836 94339,195 94340,54 94341,1127 94342,222 94343,94344 94345,94346 94347,298 94348,485 94349,94350 94351,22293 94352,68 94353,1515 94354,175 94355,1939 94356,298 94357,68 94357,852 94358,184 94359,4672 94360,79 94360,203 94360,333 94360,1181 94361,1140 94362,872 94363,9560 94364,376 94365,2646 94365,3623 94366,516 94367,1580 94368,581 94369,862 94369,2590 94370,1133 94371,72 94372,3069 94373,392 94374,94375 94376,7652 94377,3 94378,920 94379,2867 94379,2868 94380,1858 94381,483 94382,68069 94383,779 94384,7 94385,83 94386,1449 94387,258 94388,2837 94389,4748 94390,151 94391,1132 94392,781 94393,1983 94394,579 94395,861 94396,602 94397,289 94397,290 94398,30 94399,1556 94400,302 94401,5708 94402,611 94403,7117 94404,251 94405,859 94406,1849 94407,72 94408,94409 94409,2244 94409,15795 94409,25348 94409,45225 94409,79559 94409,80277 94409,82103 94409,94408 94409,94409 94409,95508 94409,95511 94409,95512 94409,95518 94409,95526 94409,99500 94409,100326 94409,103800 94409,104951 94409,106347 94410,72 94411,366 94412,406 94413,72 94414,72 94415,406 94416,94417 94418,72 94419,346 94420,10 94421,30 94422,252 94422,1220 94422,1222 94423,72 94424,30 94425,885 94426,1805 94427,1370 94428,72 94429,1 94430,1368 94431,1016 94431,2210 94431,4237 94432,72 94433,94434 94435,280 94435,932 94435,1177 94435,3148 94435,17245 94439,557 94440,557 94441,72 94442,346 94443,94444 94445,72 94446,298 94447,485 94448,94449 94450,37 94451,393 94452,1745 94454,79 94455,611 94456,48 94456,980 94457,94458 94459,273 94461,7117 94462,72 94463,1556 94465,48 94466,392 94467,818 94468,3 94469,310 94471,346 94472,94473 94472,118574 94472,240536 94474,94475 94476,264 94476,15573 94477,72 94478,1556 94479,435 94480,30 94481,72 94482,450 94483,30 94484,94485 94486,94485 94487,3321 94488,809 94489,72 94490,72 94491,302 94492,602 94493,217 94494,72 94495,843 94496,72 94497,450 94498,991 94499,356 94500,94501 94502,14989 94503,1118 94504,72 94506,72 94507,72 94508,267 94509,72 94511,602 94512,158 94513,72 94514,72 94515,149 94517,72 94518,94519 94520,602 94521,72 94522,118 94522,4597 94523,72 94524,94525 94527,1860 94528,3612 94529,595 94530,2274 94531,392 94532,4760 94533,6059 94534,5658 94535,4252 94536,623 94537,697 94538,6955 94539,72 94540,72 94541,72 94542,72 94543,175 94543,94544 94543,172484 94543,205752 94545,72 94546,72 94547,72 94548,72 94549,72 94550,72 94551,72 94552,94553 94555,72 94556,72 94557,6068 94558,72 94559,72 94560,2931 94561,1688 94563,72 94564,72 94565,4903 94567,72 94568,72 94569,18726 94570,126 94570,256 94570,435 94570,668 94570,1191 94570,1192 94570,2373 94570,7316 94570,13136 94571,50 94571,79 94571,393 94571,406 94571,493 94571,585 94571,586 94571,592 94571,704 94572,163 94574,252 94575,72 94576,72 94579,50 94580,3345 94582,72 94583,346 94584,72 94585,267 94586,72 94587,72 94588,72 94589,94590 94591,481 94592,94593 94594,94595 94596,72 94598,94599 94598,155696 94600,72 94601,72 94602,104 94603,206 94603,932 94603,6323 94603,8270 94604,1001 94605,72 94606,94607 94608,72 94610,7 94611,1608 94612,3209 94613,346 94614,967 94615,10 94616,1238 94617,94618 94619,1452 94620,72 94621,72 94622,2867 94622,2868 94623,94624 94626,602 94627,68069 94629,4192 94629,4193 94630,304 94631,323 94632,94633 94634,94635 94636,589 94636,1001 94637,94638 94639,862 94640,875 94642,72 94643,72 94644,94645 94646,515 94647,255 94648,72 94649,72 94650,72 94651,30 94652,366 94653,366 94654,366 94655,366 94656,366 94657,94658 94657,110495 94657,124068 94657,127566 94659,366 94660,366 94661,72 94662,366 94663,483 94665,298 94666,485 94667,3069 94668,72 94669,94670 94671,163 94672,48 94673,48 94674,48 94675,48 94676,48 94677,30 94678,104 94678,94679 94678,106437 94678,116889 94678,120425 94680,811 94681,1274 94682,79 94682,24500 94683,94684 94685,233 94686,211 94687,94688 94689,94690 94691,94692 94693,693 94694,994 94695,3 94696,72 94697,48 94697,58 94697,130 94697,146 94697,151 94697,158 94697,200 94697,269 94697,306 94697,307 94697,309 94697,310 94697,313 94697,349 94697,364 94697,439 94697,589 94697,660 94697,736 94697,749 94697,760 94697,862 94697,934 94697,992 94697,994 94697,1033 94697,1113 94697,1151 94697,1293 94697,1298 94697,1345 94697,1368 94697,1417 94697,1556 94697,1860 94697,1973 94697,2205 94697,2260 94697,2812 94697,3218 94697,4903 94697,30331 94697,33424 94697,90845 94697,92476 94697,162599 94697,227061 94697,245910 94698,422 94699,72 94700,163 94701,392 94702,1181 94704,346 94706,510 94707,298 94708,485 94709,1132 94710,781 94711,72 94712,2286 94713,72 94714,72 94715,344 94716,285 94717,2116 94718,72 94719,94720 94721,72 94723,13137 94724,1235 94724,1335 94725,72 94727,72 94728,72 94729,385 94731,72 94732,3003 94733,94734 94735,1132 94736,781 94737,355 94738,1381 94739,736 94740,972 94742,390 94743,72 94744,388 94745,167 94745,2083 94746,781 94747,1118 94748,94749 94750,1033 94751,602 94752,503 94752,577 94752,949 94754,72 94755,30 94756,215 94757,2775 94758,447 94759,577 94760,640 94761,118 94761,668 94761,1070 94761,4597 94762,175 94763,298 94764,485 94765,298 94766,1220 94766,1222 94767,493 94768,202 94768,203 94769,252 94770,1512 94770,5992 94772,1240 94773,682 94773,72439 94774,106 94775,1243 94777,72 94779,104 94779,1659 94780,72 94781,1052 94782,3069 94783,422 94784,333 94785,422 94786,422 94787,422 94788,422 94789,422 94790,1188 94791,422 94792,20 94793,422 94794,1458 94795,422 94796,422 94797,94798 94799,717 94800,287 94801,503 94801,6661 94802,94803 94804,94803 94805,175 94806,118 94806,4597 94807,298 94808,136 94808,2379 94808,5405 94809,344 94810,2334 94811,9560 94812,298 94813,485 94814,760 94815,94816 94818,783 94819,1201 94820,44 94821,712 94822,2775 94823,356 94826,676 94827,1531 94828,340 94829,1243 94830,1415 94831,1531 94832,30 94833,30 94834,11 94834,178 94834,211 94834,305 94834,309 94834,310 94834,333 94834,422 94834,452 94834,527 94834,579 94834,622 94834,698 94834,718 94834,740 94834,741 94834,750 94834,762 94834,1117 94834,1181 94834,1392 94834,1417 94834,1740 94834,1782 94834,1891 94834,3367 94834,5718 94834,6303 94834,14183 94834,37414 94835,1118 94836,1707 94837,30 94838,83 94839,356 94840,94841 94842,1118 94842,6695 94845,567 94845,750 94845,762 94845,968 94845,1293 94846,586 94847,8992 94848,2995 94849,58 94850,46 94851,75912 94853,9010 94854,626 94854,1381 94855,932 94856,68069 94857,298 94858,485 94859,68069 94859,141912 94860,298 94861,485 94862,167 94863,20 94863,694 94863,717 94863,872 94864,3804 94865,151 94865,577 94865,1400 94866,22 94867,94868 94869,328 94871,147 94871,158 94871,1515 94872,868 94874,424 94875,347 94875,873 94877,163 94877,818 94878,1390 94879,94880 94881,467 94881,934 94881,1370 94882,186 94883,310 94884,6051 94885,1140 94885,5547 94886,195 94887,192 94888,298 94889,485 94891,1220 94891,1222 94892,94893 94894,850 94895,3872 94896,22 94898,147 94898,1803 94899,66 94899,252 94900,2784 94900,7698 94902,68069 94903,1556 94904,252 94904,1220 94904,1222 94905,1151 94906,63 94906,251 94906,435 94906,516 94906,1243 94906,1844 94907,2775 94908,447 94909,49887 94910,673 94911,3115 94913,30418 94914,1531 94914,4545 94914,139010 94915,273 94916,1707 94916,31976 94917,302 94917,861 94917,1556 94918,72 94919,175 94920,31934 94921,298 94922,72 94923,344 94924,285 94926,479 94927,893 94928,79 94929,1881 94930,323 94931,252 94932,390 94932,592 94932,675 94932,918 94932,1010 94932,1140 94933,68069 94934,5976 94935,779 94935,68069 94937,215 94937,503 94937,1212 94937,1282 94937,1392 94938,167 94938,301 94939,3507 94939,204124 94940,240 94940,1285 94941,3069 94943,79 94943,422 94944,1688 94945,1118 94947,94948 94949,44725 94950,467 94950,868 94951,312 94951,1151 94952,278 94952,577 94954,346 94956,79 94957,406 94958,673 94958,1130 94958,2373 94959,171 94960,346 94962,178 94963,1043 94964,1707 94966,4672 94967,349 94968,326 94969,994 94970,107 94971,298 94972,485 94973,94974 94975,6506 94976,251 94977,275 94978,167 94978,2083 94979,2421 94980,1294 94981,30 94982,252 94983,94984 94983,123475 94985,346 94986,301 94986,406 94987,302 94988,10 94988,2146 94989,736 94990,151 94991,1707 94993,1465 94994,346 94995,893 94995,980 94996,2116 94997,567 94998,1454 94999,1323 95000,102 95001,1326 95002,408 95003,68069 95004,30 95005,20 95006,589 95008,385 95010,973 95011,850 95013,1531 95014,1118 95015,644 95016,200 95016,586 95016,772 95016,1033 95016,1332 95017,7652 95018,175 95019,298 95020,920 95021,302 95022,30 95023,95024 95025,292 95026,21944 95026,31206 95027,1551 95028,980 95029,676 95030,217 95030,1417 95031,479 95032,95033 95034,5547 95035,72 95036,8308 95037,72 95038,346 95039,1465 95040,406 95042,30 95042,1179 95043,240 95044,79 95045,95046 95047,861 95048,1635 95049,1392 95049,1796 95049,3804 95050,68069 95051,1381 95051,1551 95052,422 95053,56 95054,957 95054,1815 95054,1871 95055,302 95055,579 95055,159365 95056,827 95057,207 95058,671 95059,536 95061,30 95062,10 95064,818 95065,949 95066,809 95067,310 95068,3069 95069,1454 95070,72 95071,298 95072,485 95073,2460 95074,95075 95076,861 95077,8270 95078,30 95079,623 95080,3538 95081,1509 95082,28072 95083,30 95084,1836 95085,30 95086,298 95087,485 95088,95089 95090,6726 95091,376 95092,104 95092,557 95092,953 95093,1133 95094,644 95095,1644 95096,158 95097,83 95100,158 95101,30 95102,736 95103,485 95104,907 95105,310 95107,503 95107,2620 95107,4771 95108,420 95109,392 95110,1707 95111,932 95111,1298 95112,233 95113,920 95114,136 95114,5405 95115,72 95116,171 95118,972 95118,973 95118,1284 95119,225 95120,10 95121,72 95122,346 95123,95124 95125,376 95126,885 95127,3447 95128,1983 95130,83 95131,72 95132,8822 95133,202 95133,203 95134,2424 95136,1116 95137,483 95138,346 95139,95140 95139,253841 95142,557 95143,557 95144,95145 95146,95147 95148,1133 95149,68069 95150,1133 95151,346 95152,5 95152,741 95152,776 95152,3847 95152,6226 95152,9526 95152,14316 95152,21389 95152,33292 95152,34988 95152,54742 95152,56400 95152,71944 95152,106726 95152,114542 95152,148738 95152,152892 95152,154710 95152,176340 95152,181787 95152,186301 95152,195680 95152,222578 95152,224469 95152,233311 95153,1634 95154,779 95154,68069 95155,1359 95156,2617 95157,95158 95159,2704 95160,41 95161,493 95162,781 95163,1132 95164,95165 95166,178 95167,29380 95168,72 95169,163 95170,602 95173,2506 95174,4594 95175,95176 95177,628 95178,4192 95178,4193 95178,5265 95179,2351 95180,500 95181,1962 95182,1052 95183,1882 95184,2775 95185,54 95186,30 95188,72 95189,95190 95191,2319 95192,1556 95193,72 95194,1381 95195,41 95195,1368 95196,72 95197,95198 95199,95200 95201,2367 95202,346 95203,58 95204,46 95205,75912 95206,140 95206,95207 95208,21944 95209,95209 95210,422 95211,56 95212,95213 95215,644 95216,406 95217,95218 95219,1 95220,250 95220,1684 95221,72 95223,72 95224,95225 95226,222 95227,21944 95228,72 95229,1235 95229,1335 95230,3 95231,72 95232,95233 95234,1590 95235,72 95236,95237 95238,875 95239,184 95240,72 95241,30 95242,973 95243,292 95244,95245 95246,1785 95247,95248 95249,95250 95252,89035 95253,95254 95255,779 95256,95257 95258,95259 95260,30 95261,19 95261,77 95261,442 95262,95263 95264,30 95265,30 95266,95267 95268,202 95268,203 95269,95270 95271,1265 95271,1266 95272,872 95273,2506 95274,14483 95275,95276 95277,872 95279,779 95280,366 95281,366 95282,366 95283,366 95284,3260 95285,5718 95286,366 95287,233 95288,366 95289,366 95290,366 95291,72 95292,366 95293,366 95294,95295 95297,3209 95298,95299 95300,251 95301,1085 95302,30331 95303,2116 95304,911 95306,95307 95308,623 95309,1359 95310,698 95311,178 95312,97 95313,1977 95313,1978 95314,1449 95314,240174 95315,676 95317,953 95317,2201 95317,24500 95318,9560 95320,991 95321,289 95321,290 95322,310 95323,95324 95325,1858 95326,1860 95327,41 95327,671 95328,95329 95328,95348 95330,1238 95331,675 95332,2073 95333,47 95333,2469 95334,718 95335,479 95335,17228 95336,310 95337,252 95340,302 95341,81233 95342,95343 95344,668 95345,690 95347,292 95347,1619 95349,1132 95350,781 95351,907 95352,37 95353,1132 95354,781 95355,68069 95356,473 95357,1132 95358,781 95360,68069 95361,972 95363,1132 95364,781 95365,75912 95366,258 95367,1132 95368,781 95369,44 95370,1181 95371,68069 95373,195 95374,349 95375,760 95376,95377 95378,457 95379,2315 95380,852 95380,72764 95381,217 95382,1001 95383,298 95384,485 95385,68069 95386,15 95386,163 95386,233 95386,1113 95386,1402 95386,1634 95387,259 95388,95389 95390,83 95391,147 95391,158 95391,1803 95392,333 95393,9195 95394,586 95394,3297 95395,932 95396,217 95397,515 95397,736 95398,1181 95399,310 95401,1132 95402,781 95403,1085 95403,75912 95404,1858 95405,1860 95406,1359 95407,1132 95408,781 95410,360 95410,515 95410,1893 95412,1467 95414,2173 95415,99 95416,95417 95416,115022 95419,493 95420,422 95421,336 95423,422 95424,68069 95425,30 95426,95427 95428,95427 95429,95427 95430,95427 95431,95427 95432,72 95433,422 95434,422 95435,422 95436,422 95437,422 95438,446 95438,693 95438,16196 95439,422 95440,422 95441,422 95442,422 95443,95443 95444,302 95444,372 95444,628 95444,704 95444,868 95444,941 95444,1370 95444,1572 95444,2312 95444,2371 95444,5440 95444,6789 95445,779 95446,1551 95448,206 95449,3207 95450,1707 95451,95452 95453,30 95454,147 95454,158 95454,206 95454,333 95454,42064 95455,6424 95456,34 95456,35 95458,2590 95459,571 95460,202 95460,203 95461,1983 95462,1294 95462,2775 95463,1132 95464,781 95465,68069 95465,118336 95465,141912 95466,893 95469,663 95469,103860 95470,515 95471,95472 95473,95474 95475,1390 95476,920 95477,1105 95478,422 95479,151 95480,202 95480,203 95481,2244 95482,620 95483,602 95484,422 95485,195 95486,1465 95487,356 95488,1551 95489,340 95490,2424 95491,8235 95492,1179 95493,1454 95494,118 95494,1133 95495,356 95496,1927 95496,2775 95497,68069 95498,356 95499,994 95500,1551 95501,296 95501,968 95502,3003 95503,55849 95504,389 95505,1151 95505,2574 95509,287 95510,433 95514,95515 95517,779 95517,68069 95519,433 95521,364 95522,2995 95523,119 95523,192 95523,1400 95524,68069 95525,68069 95527,392 95528,68069 95529,2646 95530,68069 95531,175 95532,298 95533,422 95534,333 95535,302 95536,22 95537,41 95538,119 95539,102 95539,698 95539,1634 95539,2315 95539,3769 95540,1860 95541,779 95542,1323 95543,102 95544,1326 95545,408 95546,1639 95547,577 95548,422 95549,56 95550,2116 95551,1551 95552,34 95552,35 95552,217 95552,5976 95553,5547 95554,200 95554,772 95554,805 95554,1368 95554,3474 95554,4941 95554,9516 95554,9529 95554,16551 95554,28203 95554,95554 95554,95567 95554,95586 95554,102647 95554,111317 95554,114088 95554,114463 95554,116544 95554,129534 95554,142901 95554,146501 95556,95557 95558,30 95559,920 95560,392 95561,3960 95562,104 95562,1939 95562,7270 95563,425 95563,1276 95563,3698 95564,779 95564,68069 95564,141912 95565,95566 95567,30331 95567,95554 95568,95569 95572,1983 95573,95574 95575,925 95576,425 95576,1298 95577,1096 95578,841 95579,3999 95580,81233 95581,95582 95585,75912 95587,779 95587,68069 95588,256 95588,1078 95590,1127 95590,1893 95591,217 95592,287 95593,1220 95593,1222 95594,252 95595,251 95596,388 95597,1368 95599,1392 95600,111 95601,1220 95601,1222 95602,252 95603,251 95605,1179 95607,206 95608,81233 95609,516 95609,1118 95610,175 95611,240 95612,2979 95613,163 95614,298 95615,392 95616,240 95617,10 95617,11 95617,50 95617,195 95617,252 95617,272 95617,305 95617,485 95617,920 95617,1319 95617,1891 95617,5213 95617,7117 95618,4193 95618,7360 95619,1132 95620,781 95621,95622 95623,623 95624,1531 95626,95627 95628,68069 95629,2775 95630,95631 95630,255330 95633,861 95634,1033 95635,346 95636,1266 95636,5714 95637,326 95638,175 95639,996 95640,298 95641,72 95642,87638 95644,72 95645,68069 95646,202 95646,203 95647,3804 95648,95649 95650,167 95651,440 95651,1531 95652,310 95653,1466 95654,994 95655,32751 95656,1265 95656,1266 95657,95658 95659,809 95660,255 95661,72 95662,1068 95663,95664 95665,8270 95666,1220 95666,1222 95667,252 95668,251 95669,273 95670,32 95670,349 95670,697 95671,95672 95673,171 95675,95675 95676,94409 95677,1370 95678,30 95679,2244 95680,714 95681,376 95682,95583 95684,1551 95685,483 95686,875 95687,30 95688,1220 95688,1222 95689,252 95690,251 95691,151 95692,68069 95693,994 95694,953 95695,68069 95696,346 95697,687 95699,95700 95701,1132 95702,781 95703,72 95704,68069 95705,68069 95706,83 95707,72 95708,215 95709,14989 95710,349 95711,994 95712,4611 95713,4611 95714,72 95715,779 95715,68069 95716,346 95717,95718 95719,95720 95721,95720 95722,932 95725,58 95725,1140 95725,1177 95727,95728 95729,95730 95731,1844 95732,5906 95733,557 95734,626 95735,278 95736,137 95737,862 95738,8719 95739,138 95740,865 95741,557 95742,137 95743,118 95743,4597 95744,21944 95745,88820 95746,557 95747,557 95748,779 95748,68069 95748,141912 95749,68069 95750,72 95751,557 95752,516 95753,1353 95754,1326 95755,493 95756,493 95757,10 95757,417 95757,1085 95757,75912 95758,994 95759,68069 95760,2775 95761,83 95762,4453 95763,83 95764,717 95764,1167 95766,118 95766,4597 95767,516 95768,68069 95769,30 95772,7124 95774,30 95776,30 95777,30 95778,611 95778,852 95778,2775 95779,95780 95781,202 95781,203 95782,30 95783,206 95784,52 95784,175 95784,68069 95785,30 95786,779 95786,68069 95787,644 95789,1096 95790,13919 95791,30 95792,30 95793,313 95794,346 95795,1359 95796,136 95796,5405 95797,95798 95799,95800 95801,481 95802,95803 95804,289 95804,290 95806,175 95806,3111 95806,4980 95807,994 95808,72 95809,72 95810,422 95811,422 95812,422 95813,422 95814,422 95815,422 95816,422 95817,422 95818,422 95819,422 95820,30 95821,676 95822,1776 95822,68069 95823,79 95823,493 95823,682 95823,1175 95823,72439 95823,189839 95823,189842 95824,72 95825,422 95826,56 95827,422 95828,56 95829,2351 95830,30 95831,72 95832,406 95833,95834 95835,72 95837,1893 95839,95840 95841,30 95842,95843 95844,95845 95846,72 95847,95848 95850,1265 95850,1266 95851,72 95852,95853 95854,588 95854,590 95854,1419 95855,483 95856,175 95857,779 95858,72 95859,95860 95861,289 95861,290 95862,72 95863,30 95864,95865 95866,72 95867,240 95868,72 95869,95869 95870,95871 95872,95873 95874,1368 95875,225 95876,95877 95878,8884 95879,72 95880,1085 95881,72 95882,7652 95883,72 95884,1133 95885,95886 95887,72 95888,72 95889,72 95890,72 95891,233 95892,95893 95894,72 95895,95896 95897,72 95899,95899 95900,9121 95901,72 95903,95904 95905,95906 95905,138838 95905,150648 95907,298 95908,485 95909,4548 95910,72 95911,95912 95913,119 95913,577 95913,1400 95913,21944 95914,118 95914,4597 95915,72 95916,95917 95918,95917 95919,95920 95921,1509 95921,3041 95922,158 95923,95924 95925,72 95926,3804 95927,809 95928,95929 95930,44 95931,79 95931,994 95932,95933 95934,83 95936,932 95937,95938 95939,95940 95939,104722 95939,262307 95941,192 95941,309 95941,310 95942,298 95943,3 95944,485 95945,72 95946,95938 95947,95948 95950,50 95950,99 95950,285 95950,336 95950,622 95950,818 95950,8055 95950,35447 95951,393 95952,366 95953,83 95954,104 95955,30 95956,30 95958,31934 95959,309 95959,310 95960,31977 95961,95962 95963,668 95964,676 95965,95966 95967,95968 95969,95970 95971,9457 95972,72 95973,1323 95974,102 95975,1326 95976,408 95977,5547 95979,1 95981,36985 95982,4355 95983,68069 95984,422 95985,56 95987,5547 95988,21487 95989,28072 95990,95991 95992,72 95993,483 95994,30 95997,72 95998,72 95999,72 96000,72 96001,72 96003,200 96004,366 96005,366 96006,1572 96007,227 96008,1590 96008,1644 96009,366 96010,366 96011,366 96012,366 96013,30 96014,366 96015,366 96016,151 96017,1608 96019,1722 96020,1635 96021,301 96021,304 96021,372 96021,631 96021,932 96021,1001 96021,1085 96021,1122 96021,1715 96022,68069 96023,72 96024,55585 96025,72 96026,8270 96027,48 96028,1776 96029,96030 96031,72 96032,96033 96034,795 96035,1379 96036,72 96037,72 96038,96039 96040,96041 96042,7360 96043,1 96043,1309 96044,96045 96046,2296 96047,96048 96049,43203 96050,72 96051,30 96052,96053 96054,96055 96056,376 96057,285 96057,779 96057,68069 96058,96059 96060,147 96060,252 96061,72 96062,96063 96064,72 96065,72 96066,30 96067,30 96068,96069 96070,622 96070,861 96070,21589 96071,72 96072,344 96073,285 96074,30 96076,24505 96077,96077 96078,298 96079,485 96080,1479 96081,390 96082,96083 96084,1977 96084,1978 96085,83 96086,96087 96088,52261 96089,417 96090,233 96091,68069 96092,93 96092,94 96093,30 96094,417 96095,96096 96097,779 96097,68069 96098,30 96099,96100 96101,94409 96102,72 96103,602 96104,72 96105,96106 96107,84257 96108,510 96109,119 96109,577 96110,30 96112,68069 96112,141912 96113,872 96114,72 96115,96116 96117,126 96118,366 96119,366 96120,72 96122,72 96124,68069 96125,72 96126,158 96128,6682 96129,1749 96131,72 96132,72 96133,5440 96134,72 96135,72 96136,96137 96136,96904 96138,72 96139,163 96141,96142 96143,96144 96145,30 96146,10 96148,96149 96150,8855 96151,3538 96153,7360 96154,52 96154,206059 96155,96156 96157,96158 96159,3413 96160,126 96161,3413 96162,3161 96163,72 96164,72 96165,233 96166,96167 96168,96169 96170,72 96171,72 96172,393 96173,96174 96175,1033 96176,107 96177,2416 96177,2417 96178,292 96179,338 96180,298 96181,1133 96182,3538 96184,366 96185,346 96186,96187 96188,1655 96189,452 96190,355 96191,252 96192,390 96192,592 96192,675 96192,918 96192,1010 96192,1140 96193,497 96194,918 96195,96196 96197,72 96198,96199 96200,72 96201,96202 96203,96204 96205,5375 96207,72 96209,96210 96211,535 96212,640 96213,72 96214,44 96215,72 96216,96217 96218,96219 96220,575 96220,697 96221,298 96222,485 96223,932 96224,298 96225,485 96226,96227 96228,1043 96229,676 96230,72 96231,96232 96231,124248 96233,31934 96234,292 96235,457 96236,96237 96239,473 96240,222 96240,2266 96241,3447 96242,2528 96243,96244 96245,96246 96247,1891 96248,96249 96250,96251 96252,72 96253,30 96254,1402 96255,1287 96256,9029 96257,1983 96258,779 96259,96260 96261,14434 96262,3960 96263,96264 96265,1707 96266,222 96266,301 96266,536 96266,577 96267,30 96268,72 96269,602 96270,96271 96272,671 96273,805 96274,96275 96276,2506 96278,872 96279,1210 96280,1580 96281,96282 96283,96284 96285,30 96286,30 96288,289 96288,290 96288,682 96288,2286 96288,72439 96289,640 96290,147 96290,158 96292,422 96293,56 96294,30 96295,96296 96297,366 96299,17588 96300,147 96300,158 96301,1146 96302,111 96302,1962 96303,83 96304,72 96306,30 96307,4101 96308,41 96309,10 96310,3297 96311,96312 96313,72 96314,18726 96316,163 96317,389 96318,2334 96319,72 96320,240 96321,30 96322,1247 96323,1776 96323,68069 96324,516 96325,467 96326,30 96327,2371 96328,72 96329,7117 96330,10 96331,2775 96332,447 96333,1608 96334,3967 96335,192 96336,515 96337,96338 96340,30 96341,273 96343,827 96344,389 96345,483 96346,1085 96346,1608 96347,96348 96349,96348 96350,8270 96351,30 96353,1888 96354,758 96355,72 96356,200 96356,1177 96356,1241 96357,48 96357,118 96357,340 96357,589 96357,596 96357,647 96357,649 96357,694 96357,749 96357,752 96357,861 96357,934 96357,1033 96357,1179 96357,1298 96357,1432 96357,1449 96357,1644 96357,1715 96357,1818 96357,2083 96357,2315 96357,3182 96357,4223 96357,4597 96357,6789 96357,16019 96357,37414 96358,72 96359,8270 96360,827 96361,1531 96362,1132 96363,781 96364,96365 96366,557 96367,862 96368,1132 96369,781 96370,557 96371,557 96372,557 96375,9195 96376,3413 96377,269 96380,72 96382,22 96383,2424 96384,96385 96387,452 96388,8788 96389,30 96390,30 96391,333 96392,96393 96395,850 96396,72 96397,72 96398,602 96399,697 96401,72 96402,96403 96404,349 96405,72 96406,96407 96408,96409 96410,332 96411,30 96412,72 96413,1572 96414,8788 96415,72 96416,72 96417,1118 96418,96419 96418,96529 96420,96419 96421,96419 96422,96419 96423,96419 96424,310 96425,2995 96426,30 96427,96427 96428,96429 96430,1238 96431,175 96432,298 96433,8180 96434,96435 96436,1452 96437,10 96439,323 96440,292 96441,96442 96443,294 96444,296 96445,298 96446,50 96447,376 96448,96449 96451,30 96452,726 96453,233 96454,1085 96456,96457 96459,96460 96461,868 96462,6861 96463,96464 96466,1 96466,285 96466,534 96466,620 96466,4453 96466,5874 96467,2351 96468,292 96468,24500 96468,193129 96469,96469 96470,9029 96471,795 96473,1580 96473,103860 96474,21944 96475,96476 96478,79 96480,3003 96481,75912 96482,968 96482,103860 96484,30 96487,571 96488,973 96489,30 96490,602 96491,422 96492,56 96493,151 96494,96495 96496,21944 96497,415 96498,202 96498,203 96499,96500 96501,1732 96502,671 96503,366 96504,298 96505,485 96507,356 96508,72 96509,50 96511,8788 96512,875 96515,1858 96516,1860 96517,96518 96517,130566 96519,44 96520,217 96520,240 96520,397 96520,1172 96520,1370 96520,2310 96522,30 96523,422 96524,422 96525,422 96526,422 96527,422 96528,422 96530,422 96531,422 96532,422 96533,422 96534,422 96535,422 96536,30 96538,3367 96539,872 96540,868 96541,326 96542,3413 96543,760 96544,30 96545,932 96546,1203 96547,455 96548,66 96549,163 96549,312 96549,811 96549,1619 96549,205627 96550,360 96551,255 96552,875 96553,467 96554,83 96555,146 96555,779 96556,827 96557,873 96557,1210 96558,360 96559,298 96560,485 96561,779 96561,141912 96562,1132 96563,781 96564,640 96565,1556 96566,1132 96567,781 96568,364 96568,2590 96569,433 96570,298 96571,485 96573,859 96574,663 96574,1436 96574,2979 96574,32577 96575,752 96576,422 96577,56 96579,493 96580,130 96581,15 96582,1127 96583,151 96583,1179 96584,2779 96585,1220 96585,1222 96586,252 96587,251 96588,96588 96589,134 96589,493 96591,585 96593,66 96594,58 96595,640 96596,640 96597,309 96597,310 96598,252 96598,1220 96598,1222 96599,3297 96601,1572 96601,96602 96601,159270 96601,172021 96601,201886 96601,204912 96603,298 96604,485 96605,1608 96606,59931 96606,84257 96607,54 96608,433 96609,943 96609,2867 96609,2868 96610,7092 96611,167 96612,671 96615,252 96616,192 96617,356 96618,1220 96618,1222 96619,252 96620,251 96622,934 96623,2775 96624,96625 96626,626 96627,96628 96629,6627 96631,301 96631,1293 96632,97 96633,97 96634,344 96636,1556 96637,192 96637,406 96638,515 96639,859 96640,1877 96641,184 96642,1707 96643,240 96644,697 96644,3260 96645,163 96645,302 96645,1556 96646,1531 96647,818 96648,657 96648,7092 96649,269 96649,406 96649,75912 96650,19986 96651,30 96652,30 96655,72 96656,872 96657,104 96658,483 96658,1776 96659,99 96661,13546 96662,1390 96663,97 96664,195 96667,255 96668,86 96669,171 96670,579 96670,589 96670,868 96670,6119 96671,1453 96671,1881 96672,72 96673,918 96674,202 96674,240 96674,17309 96675,911 96676,563 96677,298 96678,485 96679,358 96681,868 96682,1612 96683,273 96684,392 96685,390 96685,1298 96687,1235 96687,1335 96688,30 96689,973 96690,1010 96691,1118 96692,3260 96695,96696 96697,118 96697,4597 96699,433 96700,516 96701,875 96702,2334 96704,775 96705,96706 96707,9560 96708,1181 96708,1515 96709,96710 96712,714 96713,1287 96715,422 96718,1019 96718,190492 96720,137 96721,195 96721,30331 96722,30 96724,663 96724,1089 96725,118 96725,4597 96726,146 96727,30 96728,140 96728,1893 96729,1140 96730,875 96731,96732 96733,66 96733,868 96733,156379 96734,96735 96736,58 96737,994 96738,46 96739,75912 96740,1417 96741,718 96742,30 96743,30 96744,1707 96745,3367 96746,96747 96748,298 96748,442 96748,805 96749,118 96749,4597 96751,875 96752,301 96753,875 96754,298 96755,485 96756,2146 96757,1 96758,96759 96758,113116 96760,809 96762,949 96763,968 96764,48 96764,63 96764,118 96764,306 96764,307 96764,340 96764,589 96764,647 96764,649 96764,749 96764,752 96764,934 96764,994 96764,1151 96764,1179 96764,1289 96764,1298 96764,1432 96764,1449 96764,1644 96764,1818 96764,2296 96764,4223 96764,4597 96764,16019 96764,37414 96764,142879 96765,23783 96766,302 96766,309 96766,310 96766,415 96766,657 96766,827 96766,862 96766,1715 96766,2411 96766,4218 96766,5326 96766,142405 96767,3367 96768,1274 96769,83 96770,151 96771,96772 96773,192 96773,827 96774,195 96775,292 96776,1370 96776,1821 96778,843 96780,827 96781,1893 96782,120 96782,240 96782,406 96783,772 96784,1332 96785,850 96786,577 96787,697 96788,83 96788,222 96789,68 96789,326 96789,392 96789,671 96789,934 96789,1805 96789,2116 96789,4760 96789,4823 96789,177883 96790,96791 96792,2929 96793,843 96794,134 96794,657 96795,433 96796,72 96797,313 96798,175 96799,298 96800,360 96800,1893 96801,298 96802,485 96803,602 96804,602 96805,3623 96806,1 96807,1188 96808,298 96809,485 96810,2073 96811,96812 96813,579 96814,2048 96815,424 96816,285 96816,779 96816,68069 96817,315 96817,934 96818,202 96818,203 96819,579 96821,96822 96823,14989 96824,422 96825,1432 96826,872 96827,301 96827,1293 96827,3422 96828,809 96829,10 96830,2646 96830,3623 96832,96833 96834,252 96834,1220 96834,1222 96835,1571 96837,1231 96837,1782 96838,3115 96839,333 96840,96841 96842,586 96842,1243 96844,8270 96845,720 96845,1837 96846,442 96846,54362 96847,65 96847,123721 96848,2775 96849,1019 96850,34 96850,35 96851,525 96851,841 96852,72 96853,8180 96854,1572 96855,446 96858,271 96859,72 96860,1462 96860,8537 96861,843 96863,96864 96865,557 96866,1133 96868,2210 96868,4237 96869,518 96869,22293 96870,1983 96871,657 96872,875 96874,72 96875,209 96876,209 96878,358 96879,72 96880,72 96881,3695 96882,483 96883,96884 96883,97769 96883,120805 96883,121432 96883,124290 96883,129290 96883,139166 96883,140383 96883,162827 96883,175507 96883,177767 96883,235248 96883,248311 96885,24505 96886,96887 96889,392 96891,96892 96893,500 96894,255 96895,8270 96896,516 96897,640 96897,1181 96898,652 96898,96899 96898,169961 96898,173020 96900,72 96901,872 96903,72 96905,72 96906,557 96907,557 96908,2116 96909,96910 96911,323 96912,21944 96913,195 96913,222 96913,1019 96914,301 96916,862 96917,96918 96919,207 96920,96921 96922,184 96923,96924 96926,577 96927,298 96928,485 96929,3260 96930,255 96931,217 96932,3260 96933,68 96934,23783 96935,298 96936,485 96938,309 96938,310 96939,1634 96940,298 96941,485 96942,21487 96943,602 96944,151 96945,8180 96946,96947 96948,23010 96949,1007 96950,483 96951,626 96952,360 96953,96954 96955,2590 96956,96957 96958,72 96959,96960 96959,120071 96961,1983 96962,96963 96964,96965 96966,207 96967,96968 96969,592 96970,96971 96972,267 96973,96974 96975,344 96976,4604 96977,872 96978,1429 96979,96980 96981,489 96982,668 96983,424 96984,96985 96986,96987 96988,323 96989,323 96990,255 96992,9560 96993,96994 96995,3 96996,704 96997,96998 96999,97000 97002,97003 97004,97001 97006,97007 97008,97009 97010,97011 97012,203 97012,372 97013,1467 97014,1143 97015,481 97016,34 97016,158 97017,97018 97019,2424 97020,206 97021,1871 97022,515 97023,447 97024,8270 97026,422 97027,56 97028,116 97028,994 97028,2087 97029,306 97029,307 97030,13980 97031,9026 97032,6119 97033,77 97034,388 97036,1181 97037,289 97037,290 97038,376 97040,97041 97042,258 97043,310 97044,310 97045,2506 97046,32 97048,72 97049,298 97050,485 97051,3079 97052,151 97053,682 97053,72439 97054,312 97055,79 97056,10 97057,805 97058,151 97059,310 97060,264 97060,1659 97061,527 97062,30 97063,163 97064,827 97065,1977 97065,1978 97066,206 97067,195 97068,697 97068,1454 97069,233 97070,252 97070,1220 97070,1222 97071,7360 97072,30 97073,97074 97076,298 97077,485 97078,467 97079,97080 97081,500 97082,1782 97083,14126 97084,1509 97085,932 97087,406 97088,623 97089,355 97090,1298 97091,862 97092,1893 97093,97094 97093,120783 97093,153500 97093,174708 97093,185030 97093,185776 97093,223300 97095,340 97095,579 97096,207 97097,97098 97099,500 97100,605 97101,393 97102,184 97104,849 97104,1844 97105,1381 97106,1849 97108,47 97108,2469 97109,298 97110,485 97111,634 97112,137 97113,1968 97114,298 97115,485 97116,264 97116,577 97117,97118 97119,1939 97120,147 97121,50 97122,2351 97123,500 97124,97125 97126,1566 97127,1240 97128,30 97129,1132 97130,781 97131,1 97132,130 97132,462 97132,872 97132,1127 97134,298 97135,485 97137,422 97138,422 97139,298 97140,485 97141,422 97142,422 97143,422 97144,422 97145,422 97146,422 97147,999 97147,1801 97147,4760 97147,5591 97148,298 97149,485 97150,298 97151,485 97152,3422 97153,97154 97155,406 97156,298 97157,485 97158,1531 97159,97160 97161,298 97162,485 97163,1130 97164,298 97165,485 97166,2699 97167,1132 97168,781 97169,6682 97170,283 97171,314 97172,1722 97173,97174 97173,112982 97175,640 97176,640 97177,422 97178,14819 97179,640 97180,422 97181,422 97182,640 97183,3252 97184,255 97185,217 97186,355 97187,422 97188,56 97189,932 97190,1782 97191,579 97192,693 97193,1616 97194,596 97196,1368 97196,2353 97197,149 97198,72 97199,626 97200,2626 97201,1724 97202,3161 97203,1132 97204,781 97205,273 97205,1118 97207,217 97208,980 97209,1745 97210,2995 97211,1677 97212,7 97212,1289 97212,1381 97212,3999 97212,14366 97213,1381 97214,671 97215,581 97215,717 97215,784 97215,204093 97216,298 97217,485 97218,1132 97219,781 97220,455 97220,657 97221,3135 97222,1132 97223,781 97224,2416 97224,2417 97225,294 97226,147 97227,97228 97229,298 97230,485 97231,510 97232,151 97233,577 97234,622 97235,184 97236,835 97236,49057 97237,383 97238,3623 97239,818 97240,920 97241,83 97242,97243 97244,805 97245,809 97246,302 97247,1087 97249,264 97250,4276 97251,72 97252,97253 97254,1132 97255,781 97256,3623 97257,77 97258,1118 97259,3135 97260,58 97261,994 97262,46 97263,75912 97264,626 97265,298 97266,485 97267,1305 97268,15068 97269,1274 97270,1127 97271,97272 97273,500 97274,8270 97275,298 97276,485 97277,298 97278,485 97280,13361 97281,97282 97284,97285 97286,99 97286,146 97286,314 97286,779 97286,8055 97287,1132 97288,781 97289,147 97289,220502 97291,861 97292,2224 97293,1551 97294,97295 97296,97297 97298,602 97299,1390 97300,589 97301,298 97302,485 97303,261 97305,602 97306,920 97307,19 97307,34 97307,35 97307,222 97307,278 97307,283 97307,313 97307,389 97307,536 97307,634 97307,657 97307,781 97307,949 97307,1019 97307,1072 97307,1274 97307,1467 97307,1539 97307,1571 97307,1718 97307,1871 97307,1881 97307,2168 97307,2266 97307,2319 97307,2424 97307,2784 97307,2944 97307,4594 97307,5976 97307,6789 97307,6888 97307,7768 97307,13137 97307,29475 97308,1634 97309,217 97310,949 97312,79 97313,491 97314,392 97315,298 97316,485 97317,392 97317,1151 97318,1616 97319,97320 97321,163 97321,31206 97323,602 97324,1939 97325,972 97326,151 97326,388 97326,536 97327,97328 97327,124242 97329,1298 97330,167 97330,3138 97331,676 97332,298 97333,485 97334,1132 97335,781 97338,1149 97338,3085 97339,6119 97340,1370 97340,1821 97341,97342 97343,302 97344,310 97345,1323 97346,102 97347,1326 97348,408 97349,97350 97353,6323 97354,302 97354,489 97355,781 97356,1132 97357,298 97358,485 97360,485 97361,344 97362,685 97363,720 97365,1939 97366,267 97367,200 97369,1181 97370,298 97371,485 97373,206 97376,500 97377,1962 97378,1052 97379,1882 97380,2775 97381,54 97382,118 97382,4597 97383,2436 97384,500 97385,272 97386,30 97387,3695 97388,500 97389,225 97395,500 97396,310 97396,483 97396,3039 97398,1454 97399,30 97400,515 97400,862 97401,30 97402,184 97403,252 97403,1220 97403,1222 97405,3209 97406,1016 97406,1119 97408,272 97409,30 97410,30 97411,187 97412,10 97412,67343 97413,500 97414,1220 97414,1222 97415,252 97416,251 97418,272 97420,1877 97422,240 97423,333 97423,406 97423,493 97423,733 97423,779 97423,4190 97423,6119 97423,60576 97423,141912 97424,97425 97426,211 97426,500 97431,1707 97433,6323 97434,97434 97435,326 97440,272 97441,1939 97443,8149 97444,147 97444,158 97446,255 97447,97448 97449,72 97450,1019 97451,805 97451,1118 97451,4237 97451,182162 97452,97453 97454,7360 97455,406 97456,149 97457,749 97458,298 97459,485 97460,333 97462,10 97463,97464 97465,3413 97466,83 97467,483 97468,97469 97470,97471 97472,467 97473,467 97474,467 97475,1058 97476,693 97477,994 97478,30 97479,3623 97480,255 97481,10 97482,1001 97483,72 97484,1381 97486,920 97487,151 97489,97488 97490,149 97492,5440 97493,3 97494,3999 97495,83 97495,309 97495,310 97495,1235 97495,1335 97496,344 97497,3623 97498,264 97498,1749 97498,14550 97499,406 97499,439 97500,58 97501,994 97502,46 97503,75912 97504,255 97505,801 97505,1140 97505,3474 97505,5547 97507,2719 97508,3370 97508,14453 97509,920 97510,1805 97511,1033 97512,671 97513,3246 97514,920 97515,1010 97516,3804 97517,2590 97518,518 97519,1381 97520,1715 97521,9015 97522,86 97523,605 97524,444 97525,1837 97526,215 97527,298 97528,485 97529,195 97531,622 97532,1590 97533,192 97534,586 97535,252 97536,217 97536,1796 97536,1844 97536,2512 97538,333 97539,875 97540,217 97540,1417 97541,1893 97542,602 97543,1210 97544,247 97544,920 97545,694 97545,1466 97545,1796 97546,485 97547,697 97548,588 97548,590 97550,72 97551,406 97552,644 97553,2266 97554,932 97555,452 97556,171 97557,622 97558,1590 97559,192 97560,586 97562,795 97563,72 97564,97565 97566,622 97567,333 97568,68069 97569,22 97570,14366 97571,97572 97571,111628 97571,120512 97571,121839 97571,139017 97573,9323 97574,30 97575,9195 97577,7 97579,3069 97580,72 97581,6263 97582,4980 97583,19986 97584,14989 97585,16045 97586,30 97587,97588 97589,1132 97590,781 97591,1556 97592,233 97593,8855 97594,3623 97595,1531 97596,920 97597,372 97600,1462 97600,2697 97601,7124 97602,211 97603,5440 97604,97605 97606,406 97607,332 97607,356 97608,5911 97609,97609 97610,72 97611,784 97612,30 97613,202 97613,203 97613,509 97613,2266 97613,2784 97613,7092 97614,333 97614,5906 97615,192 97616,1381 97617,2775 97619,217 97620,393 97621,3623 97622,298 97623,485 97624,30 97625,140 97626,5911 97628,259 97629,358 97630,2224 97631,147 97633,192 97633,222 97633,577 97633,626 97635,97634 97636,34 97636,35 97637,640 97638,1210 97639,718 97640,140 97641,267 97642,83 97643,72 97644,862 97645,72 97646,3949 97647,1068 97647,1789 97648,349 97649,4455 97649,68069 97653,994 97654,292 97655,33611 97656,1132 97657,781 97658,1227 97658,86416 97659,1132 97660,781 97661,647 97662,97663 97664,72 97666,516 97667,1210 97668,622 97669,72 97670,97671 97673,72 97674,72 97675,557 97676,652 97677,72 97678,557 97679,72 97680,344 97681,3079 97682,30 97683,118 97683,4597 97684,1266 97684,1462 97684,2048 97685,30 97686,72 97687,184 97689,72 97690,72 97691,72 97692,137 97693,30 97694,10 97694,1235 97695,4101 97696,30 97697,485 97697,3447 97698,72 97699,5301 97700,206 97700,3524 97701,968 97701,2353 97702,435 97703,1262 97704,885 97704,13704 97705,422 97706,56 97707,1181 97708,344 97709,298 97710,485 97712,3623 97713,171 97714,1118 97714,2617 97715,872 97716,298 97717,485 97718,392 97718,1151 97719,30 97720,356 97721,422 97722,56 97723,438 97723,1181 97724,97725 97726,1619 97727,72 97729,1 97729,4 97729,5 97729,32 97729,65 97729,160 97729,206 97729,283 97729,392 97729,433 97729,509 97729,577 97729,626 97729,644 97729,685 97729,697 97729,784 97729,809 97729,1082 97729,1363 97729,1807 97729,1858 97729,2274 97729,2699 97729,2926 97729,3999 97729,4903 97729,18726 97729,76096 97729,109503 97730,893 97731,3555 97732,298 97733,485 97734,273 97735,17588 97736,994 97737,30 97738,2436 97739,264 97740,1531 97741,97742 97743,1381 97744,972 97744,973 97744,4504 97745,885 97745,13704 97746,1634 97748,424 97749,97750 97751,392 97752,207 97753,97754 97755,874 97756,97757 97758,4504 97760,10 97761,97762 97764,72 97765,250 97765,1684 97766,240 97766,1955 97766,3135 97767,1007 97768,211 97768,256 97771,323 97772,431 97772,631 97773,1 97774,310 97775,323 97776,2867 97776,2868 97777,3447 97778,2146 97779,126 97780,4066 97781,3413 97782,3161 97783,1313 97784,192 97785,1939 97786,10 97787,676 97788,393 97789,1381 97790,1265 97790,1266 97791,3209 97792,859 97793,332 97794,225 97795,3148 97796,5405 97797,2797 97798,158 97799,2048 97800,5366 97801,1149 97802,479 97803,333 97804,2931 97805,7358 97805,7363 97806,714 97807,3872 97808,2697 97809,1102 97810,652 97811,5440 97812,953 97813,6068 97814,589 97815,1414 97816,2995 97817,7652 97818,240 97819,1 97820,97821 97822,1033 97823,2719 97824,503 97825,34 97825,35 97825,217 97825,536 97825,1417 97826,861 97827,376 97828,4805 97829,192 97830,8270 97831,30 97832,366 97833,1085 97835,171 97836,1175 97837,671 97838,481 97839,97840 97841,973 97842,671 97844,30 97845,118 97845,4597 97846,1515 97846,68069 97847,97848 97849,918 97850,805 97851,118 97851,4597 97852,97853 97854,97855 97856,97857 97858,1181 97860,779 97861,8270 97862,298 97863,485 97864,8270 97865,298 97866,485 97867,46 97867,58 97867,75912 97869,30 97871,397 97871,783 97872,862 97873,97874 97875,97876 97877,406 97878,97879 97881,7124 97882,47 97882,2469 97883,1531 97884,298 97885,485 97886,3623 97887,269 97888,163 97890,97891 97892,1619 97893,485 97895,292 97896,893 97898,17588 97899,298 97900,485 97901,406 97902,355 97903,137 97904,388 97905,79 97905,217 97906,2371 97907,30 97908,20 97908,1072 97909,30 97910,222 97910,455 97911,292 97912,3 97913,292 97914,1983 97915,32 97915,349 97915,392 97915,697 97915,875 97915,1363 97916,1381 97917,298 97918,485 97919,1479 97919,1858 97919,6068 97920,2353 97921,233 97922,97923 97924,283 97924,455 97924,477 97924,536 97924,862 97924,1419 97924,1465 97924,1466 97924,1467 97924,1608 97924,2168 97924,2784 97925,868 97926,467 97927,27041 97929,671 97930,79 97931,450 97932,1326 97933,217 97934,240 97934,272 97934,299 97934,379 97934,483 97934,1118 97934,1119 97934,1429 97934,1796 97934,2512 97934,6556 97935,640 97936,3447 97937,2146 97938,126 97939,3161 97940,874 97941,192 97942,10 97943,44 97944,676 97945,1381 97946,1265 97946,1266 97947,859 97948,332 97949,225 97950,5405 97951,2797 97952,158 97953,2048 97954,5366 97955,1149 97956,479 97957,333 97958,611 97959,2931 97960,714 97961,3872 97962,1102 97963,652 97964,953 97965,6068 97966,589 97967,1414 97968,2995 97969,7652 97970,119 97970,577 97970,918 97970,2073 97970,3507 97971,209 97972,292 97973,1893 97974,3367 97975,4192 97975,4193 97976,2334 97977,292 97978,209 97979,97980 97979,132510 97979,161932 97981,301 97982,298 97983,485 97984,30 97985,1858 97986,1860 97989,315 97989,671 97990,22 97990,130 97990,163 97990,192 97990,195 97990,206 97990,267 97990,269 97990,272 97990,301 97990,302 97990,333 97990,422 97990,433 97990,457 97990,483 97990,622 97990,687 97990,697 97990,712 97990,868 97990,1033 97990,1117 97990,1127 97990,1181 97990,1188 97990,1191 97990,1240 97990,1509 97990,1634 97990,1837 97990,2017 97990,2371 97990,2812 97990,5874 97990,6303 97990,17309 97990,54284 97990,72811 97991,875 97992,3724 97993,338 97993,697 97993,1127 97994,5101 97995,97996 97997,209 97998,2617 97999,422 98000,422 98001,422 98002,422 98003,1612 98004,98005 98007,1181 98008,98009 98010,32475 98011,1235 98011,1335 98013,298 98014,485 98015,209 98016,98017 98018,9195 98019,338 98019,3003 98019,6059 98020,98021 98022,827 98023,1551 98024,1506 98025,209 98026,98027 98028,98029 98030,3623 98031,875 98033,98034 98035,298 98036,485 98037,626 98038,1332 98039,330 98039,957 98039,1815 98041,422 98042,56 98043,372 98043,1082 98043,1467 98043,2296 98044,579 98045,14989 98046,50 98046,3653 98046,14989 98047,1096 98049,779 98050,98051 98052,98053 98054,298 98055,485 98056,433 98057,626 98058,875 98059,393 98060,1381 98061,28072 98062,1033 98063,586 98064,72 98065,58 98066,538 98067,206 98068,417 98069,1265 98069,1266 98070,422 98071,422 98072,872 98073,596 98073,668 98073,19010 98074,298 98075,485 98076,1479 98077,298 98078,485 98079,422 98081,422 98082,3003 98083,5375 98084,209 98085,304 98085,631 98085,932 98085,1122 98086,1572 98087,98088 98089,98090 98091,640 98092,1087 98093,16045 98094,726 98095,390 98095,444 98095,1085 98096,868 98097,98098 98099,202 98099,203 98099,252 98099,406 98099,516 98100,298 98101,485 98102,875 98103,209 98104,292 98105,209 98106,298 98107,485 98109,72 98110,872 98111,1436 98112,78232 98113,134 98113,289 98113,94134 98114,1590 98115,5310 98116,1293 98116,1417 98116,3392 98117,1556 98118,292 98119,875 98120,209 98121,98122 98123,227 98124,1052 98124,1078 98125,422 98126,875 98127,30 98128,563 98129,175 98130,3161 98131,298 98132,2574 98132,14989 98133,736 98133,3612 98133,16687 98134,872 98135,509 98135,510 98136,292 98139,292 98140,875 98141,500 98142,1252 98142,1253 98143,585 98145,7358 98145,7363 98146,72 98147,366 98148,98149 98150,292 98151,98149 98152,417 98152,1531 98153,676 98154,422 98155,56 98156,1132 98157,781 98158,130 98159,779 98160,292 98161,1313 98162,433 98163,1893 98164,2424 98165,292 98166,433 98167,20 98168,5547 98169,2989 98169,2991 98170,1893 98171,1096 98172,1390 98173,422 98174,875 98175,56 98176,875 98177,1 98177,4 98177,5 98177,8 98177,11 98177,20 98177,48 98177,130 98177,160 98177,430 98177,497 98177,712 98177,736 98177,1016 98177,1113 98177,1147 98177,3612 98177,4252 98177,16687 98177,28130 98177,124668 98178,97 98179,21944 98181,126 98181,457 98181,1293 98183,147 98184,1010 98186,1309 98187,1096 98188,5405 98190,2617 98191,3769 98193,215 98193,240 98193,328 98194,1033 98196,209 98197,875 98198,1284 98199,267 98200,72 98202,875 98203,875 98204,23011 98205,718 98207,467 98208,2353 98211,83 98212,809 98213,450 98215,1544 98216,875 98217,3623 98218,795 98218,4355 98219,1284 98220,1132 98221,781 98222,68069 98223,676 98224,65 98225,305 98226,278 98226,5405 98227,41 98227,698 98227,1419 98227,2775 98227,60576 98228,3623 98229,9121 98230,298 98231,485 98232,3623 98233,7155 98234,3331 98235,6837 98237,388 98238,187 98239,827 98241,483 98242,184 98243,298 98244,485 98245,298 98246,485 98247,4 98247,5 98247,406 98247,431 98247,483 98247,1776 98248,3003 98249,98250 98251,693 98252,5405 98253,1983 98254,8714 98255,30 98256,50 98256,138 98256,360 98256,579 98256,805 98256,1033 98256,1140 98256,1572 98256,1955 98256,37414 98257,30 98258,333 98260,258 98261,287 98262,657 98262,1363 98262,13361 98264,1323 98265,102 98266,1326 98267,408 98268,302 98269,98270 98271,372 98272,525 98273,261 98274,4177 98275,79 98275,104 98275,186 98275,302 98275,805 98275,861 98275,1417 98276,298 98277,485 98278,1332 98279,615 98279,666 98279,783 98279,941 98280,7652 98281,3872 98282,298 98283,485 98284,372 98284,442 98284,1962 98285,1436 98286,302 98287,1893 98288,298 98289,485 98290,527 98292,217 98292,536 98293,72 98294,843 98295,98296 98298,450 98299,3623 98300,1556 98301,332 98301,1955 98302,1655 98303,462 98303,8149 98304,406 98305,187 98306,298 98307,485 98308,37 98309,140 98310,106 98311,862 98312,283 98313,6068 98314,2073 98316,248 98317,2995 98319,392 98319,1151 98320,30 98321,852 98322,406 98323,1179 98324,1871 98325,392 98325,697 98326,258 98327,392 98328,805 98329,222 98329,301 98329,2421 98329,5343 98330,7652 98331,240 98332,843 98333,1400 98334,1102 98335,760 98336,726 98337,158 98338,818 98339,58 98341,1417 98342,72 98343,5405 98344,1181 98345,8180 98346,3623 98347,217 98348,1749 98349,98350 98351,30 98352,98353 98352,119257 98354,292 98356,1939 98357,3413 98358,843 98359,98360 98361,3623 98362,8270 98363,292 98364,467 98365,269 98366,81070 98367,2319 98368,292 98369,483 98370,298 98371,485 98372,3135 98373,2224 98374,422 98375,56 98376,3623 98378,3623 98379,147 98379,151 98380,2775 98380,3623 98381,2421 98382,392 98383,106 98383,1147 98383,2605 98383,3999 98384,693 98385,7092 98386,333 98387,98388 98389,1 98390,255 98391,1181 98392,873 98393,298 98394,485 98395,98396 98397,392 98398,805 98400,1033 98400,2244 98401,171 98402,772 98403,289 98403,290 98403,94134 98404,467 98405,72 98406,1608 98409,86 98410,1453 98411,3623 98412,376 98413,195 98414,30 98415,527 98416,1707 98417,298 98418,485 98419,72 98420,94409 98421,885 98421,13704 98422,620 98423,72 98425,171 98428,30 98430,3623 98431,422 98432,56 98433,171 98434,98435 98436,98437 98438,98437 98439,98437 98440,98437 98441,171 98442,3623 98443,1266 98443,2048 98444,30 98445,1085 98446,435 98447,219 98448,5405 98449,1858 98450,1860 98451,818 98452,72 98453,2646 98454,843 98455,356 98456,622 98457,30 98458,668 98459,664 98459,20359 98460,98461 98462,98463 98464,1118 98464,1531 98465,271 98466,994 98467,298 98468,485 98469,1305 98470,72 98471,98472 98473,2867 98473,2868 98474,292 98475,292 98476,1381 98477,30 98478,298 98479,485 98480,620 98480,1515 98481,30 98482,72 98483,298 98484,485 98485,30 98486,298 98487,485 98488,652 98489,98490 98491,1016 98492,760 98493,137 98494,422 98495,56 98496,852 98497,98498 98499,98500 98501,72 98502,30 98503,2671 98504,151 98507,1326 98508,430 98508,758 98509,98510 98511,30 98512,1282 98513,366 98514,557 98515,557 98516,30 98517,3246 98517,3247 98518,1939 98519,63 98520,676 98521,1265 98521,1266 98522,3209 98523,332 98524,8855 98525,3148 98526,5405 98527,158 98528,48 98528,130 98528,1007 98528,1381 98528,1551 98528,3999 98529,1149 98530,333 98531,2931 98532,7358 98532,7363 98533,3872 98534,2697 98535,1102 98536,652 98537,953 98538,6068 98539,192 98540,1414 98541,7652 98542,5101 98543,623 98544,202 98544,203 98544,925 98545,2146 98546,83 98547,98548 98549,30 98550,1140 98551,30 98552,147 98552,149 98552,158 98552,622 98553,98554 98555,192 98556,1143 98557,98558 98559,72 98560,72 98561,72 98562,72 98563,2867 98563,2868 98564,72 98565,72 98566,1458 98567,34 98567,35 98567,2146 98568,644 98569,516 98570,68069 98571,72 98572,72 98573,406 98574,8854 98575,422 98576,56 98578,516 98579,298 98580,485 98581,98582 98583,98584 98583,131897 98585,3193 98586,4355 98587,5405 98588,1531 98589,72 98590,8788 98591,422 98592,56 98593,298 98594,485 98595,1531 98596,2073 98597,3413 98598,98599 98600,2146 98601,1882 98602,72 98603,217 98603,1417 98604,2867 98604,2868 98605,207 98607,72 98608,20 98609,298 98610,485 98612,3209 98613,98614 98615,1515 98616,430 98616,994 98617,72 98618,98619 98621,178 98622,178 98623,872 98624,72 98625,1429 98626,671 98627,269 98628,98629 98630,3069 98631,98632 98633,30 98634,118 98634,4597 98635,72 98636,14989 98637,7358 98637,7363 98638,195 98639,34 98639,35 98641,2146 98642,72 98643,577 98643,21944 98644,3069 98645,481 98646,874 98646,1210 98647,557 98649,98648 98650,50 98650,79 98650,393 98650,406 98650,493 98650,585 98650,586 98650,592 98650,704 98651,98648 98652,211 98653,5440 98654,98655 98656,3724 98657,1531 98658,158 98658,406 98659,483 98660,2146 98661,873 98661,874 98661,1210 98662,9026 98663,147 98664,98665 98666,652 98667,98668 98669,358 98670,30 98671,98672 98673,450 98674,146 98675,289 98675,290 98677,1789 98678,98679 98680,859 98681,450 98683,98684 98685,10 98686,45021 98687,49887 98688,45024 98689,30766 98690,98691 98693,3148 98694,5405 98695,652 98696,72 98697,98698 98699,1238 98701,98702 98703,98704 98706,2116 98707,682 98707,72439 98708,151 98709,2590 98710,2671 98711,72 98712,843 98714,693 98715,301 98715,1133 98716,1782 98717,98718 98720,137 98721,98722 98723,72 98724,98725 98728,255 98729,366 98730,366 98731,98732 98733,366 98734,34 98734,158 98735,1452 98736,1939 98737,147 98738,50 98739,577 98740,98741 98742,72 98744,30 98745,366 98746,861 98746,1556 98747,805 98748,3872 98749,272 98750,714 98751,98752 98751,103623 98753,72 98754,98755 98756,515 98757,70631 98758,328 98759,2367 98760,98761 98762,687 98763,98764 98765,72 98766,98767 98768,575 98769,4475 98770,72 98771,510 98772,75912 98773,292 98774,98775 98774,184886 98776,118 98776,4597 98777,1449 98778,292 98779,355 98781,1893 98782,1858 98783,1860 98784,118 98784,4597 98786,1132 98787,781 98789,98790 98791,233 98793,98794 98795,261 98796,872 98797,1359 98798,48 98799,1132 98800,781 98801,1381 98802,868 98803,98804 98805,31122 98806,209 98807,809 98808,178 98809,1132 98810,781 98811,811 98811,1619 98812,72 98813,446 98814,192 98815,527 98816,868 98817,1531 98821,1977 98821,1978 98822,875 98823,72 98825,862 98826,483 98827,21944 98828,104 98829,693 98830,994 98831,137 98832,97 98834,76096 98835,3623 98836,3370 98836,14453 98837,200 98837,772 98837,28203 98838,163 98839,34 98839,158 98840,240 98841,340 98841,1058 98842,1132 98843,781 98844,1417 98845,313 98845,1881 98846,158 98848,2590 98849,9195 98850,581 98851,9195 98852,1801 98853,1181 98855,422 98856,72 98857,422 98858,422 98859,422 98860,98861 98862,422 98863,422 98864,1287 98865,422 98866,422 98867,422 98868,422 98869,292 98870,333 98875,1133 98876,1556 98877,98878 98879,83 98881,98882 98885,907 98886,30 98887,1132 98888,781 98889,140 98889,149 98890,2424 98891,422 98893,30 98894,10 98897,72 98898,652 98899,455 98900,98901 98902,147 98902,1803 98903,72 98905,292 98906,932 98907,30 98908,22 98909,991 98910,483 98911,1276 98912,991 98913,1243 98914,7652 98915,261 98916,1983 98917,714 98917,1955 98918,83 98918,455 98919,1132 98920,781 98921,171 98923,1238 98924,48 98925,596 98925,784 98925,805 98925,1973 98925,2416 98925,2417 98926,2784 98927,336 98929,79 98932,372 98933,760 98935,63 98936,87 98936,40360 98937,620 98939,278 98940,217 98940,313 98940,503 98940,1417 98940,5130 98941,1132 98942,781 98943,23783 98944,1192 98946,1201 98947,5591 98948,30 98949,98950 98949,103636 98949,104636 98949,110396 98949,198056 98951,1191 98952,1188 98953,30 98954,17228 98955,9121 98956,45024 98957,4066 98958,184 98959,2209 98960,1509 98961,455 98961,212983 98961,214114 98961,217616 98962,1707 98963,2719 98964,3370 98964,14453 98966,1390 98968,392 98969,422 98970,56 98971,98972 98974,175 98975,98975 98976,850 98977,298 98978,420 98979,98980 98981,312 98982,850 98983,87 98984,390 98985,628 98986,33611 98987,269 98988,24763 98989,2205 98989,33424 98990,298 98991,485 98992,104 98993,184 98994,126 98995,2626 98996,98997 98998,1506 98999,22 99001,30 99002,406 99003,788 99003,1849 99003,44725 99004,875 99005,1515 99006,99007 99008,273 99008,39247 99011,8270 99012,1203 99012,1955 99013,1203 99014,99015 99016,1181 99018,163 99020,609 99020,805 99021,99022 99024,18726 99025,310 99026,623 99027,207 99028,3623 99030,422 99031,392 99032,56 99033,77 99034,99035 99036,21944 99037,1769 99038,202 99038,203 99038,8996 99039,72 99040,99041 99042,1085 99043,364 99044,1247 99045,503 99046,3623 99047,99048 99049,4611 99050,1007 99050,3041 99050,8868 99051,81 99052,3585 99055,538 99058,240 99063,726 99064,99065 99066,1983 99067,99068 99069,647 99070,344 99071,30 99072,30 99073,99074 99075,1381 99076,852 99077,1980 99077,8270 99078,34 99078,134 99079,1414 99080,151 99080,493 99081,99082 99083,99084 99085,392 99085,1151 99085,2436 99086,206 99087,647 99088,344 99089,175 99090,3623 99091,3209 99092,298 99093,647 99094,344 99095,79 99096,287 99097,192 99097,779 99098,72 99099,99100 99101,146 99101,733 99102,3695 99104,1132 99105,781 99106,31934 99107,1019 99109,99109 99110,3209 99111,1019 99112,3 99113,349 99114,702 99114,1210 99115,104 99115,557 99115,953 99115,954 99116,48 99117,58 99118,994 99119,46 99120,75912 99122,10 99123,877 99124,30 99124,200 99124,772 99124,28203 99126,48 99127,1231 99129,72 99130,15523 99131,99132 99134,1860 99136,167 99139,1132 99140,781 99141,30 99142,1983 99143,137 99144,1235 99144,1335 99145,1181 99148,356 99149,1203 99150,1776 99151,10 99152,1235 99152,1335 99153,3138 99154,248 99155,171 99157,99158 99159,30 99160,151 99160,1844 99161,439 99162,306 99162,307 99163,271 99164,2506 99166,3 99166,932 99166,8788 99168,309 99168,310 99168,21944 99169,58 99169,71 99169,251 99169,255 99169,287 99169,493 99169,563 99169,577 99169,626 99169,671 99169,698 99169,788 99169,795 99169,801 99169,811 99169,991 99169,1012 99169,1068 99169,1070 99169,1133 99169,1309 99169,1368 99169,1449 99169,1474 99169,1789 99169,2367 99169,2436 99169,5961 99169,6837 99169,16331 99169,185874 99169,193129 99170,1118 99171,1132 99172,781 99173,1235 99173,1335 99174,99175 99176,99177 99178,298 99179,485 99180,599 99181,99182 99183,1983 99184,292 99185,72 99186,21944 99187,83 99188,99189 99190,202 99190,203 99190,1243 99191,515 99192,536 99193,588 99193,590 99196,302 99198,1821 99201,850 99202,99203 99204,175 99205,298 99206,406 99207,1511 99207,3069 99208,2697 99209,3 99210,267 99211,19986 99212,23011 99213,30 99214,1181 99215,337 99215,2244 99216,577 99217,21944 99219,147 99220,72 99221,3623 99222,3724 99223,2867 99223,2868 99224,99225 99226,422 99227,56 99228,72 99229,225 99230,3623 99231,99232 99233,99234 99235,557 99236,72 99238,30 99239,3623 99240,3623 99241,358 99242,99243 99244,2626 99245,6323 99246,557 99247,676 99248,298 99249,485 99250,557 99251,99252 99253,338 99254,1531 99255,333 99255,336 99255,406 99256,14434 99257,1085 99258,292 99259,577 99260,1 99261,818 99262,1983 99263,187 99264,439 99265,3623 99266,99267 99266,160603 99268,99269 99270,1284 99271,455 99272,652 99273,30 99274,18639 99275,843 99276,72 99277,2116 99278,850 99279,1983 99280,1983 99281,481 99282,875 99283,99284 99285,137 99285,586 99285,4039 99285,99287 99286,376 99288,99289 99290,298 99291,485 99292,250 99292,1684 99293,151 99294,874 99295,1359 99296,16153 99297,577 99298,2371 99299,118 99299,4597 99300,99301 99302,885 99302,13704 99303,1118 99304,422 99305,56 99306,10 99307,99308 99309,192 99310,1939 99311,10 99312,1381 99313,1265 99313,1266 99314,3209 99315,859 99316,225 99317,8855 99318,5405 99319,2048 99320,1149 99321,333 99322,2931 99323,7358 99323,7363 99324,450 99325,8270 99326,714 99327,2697 99329,5440 99330,298 99331,485 99333,953 99334,6068 99335,589 99336,1414 99337,1235 99337,1335 99338,99339 99340,99341 99340,109726 99340,126436 99340,153837 99342,149 99343,1260 99344,298 99345,485 99346,310 99347,8822 99348,422 99349,56 99350,72 99351,99352 99354,118 99354,4597 99355,868 99355,1151 99356,18726 99357,298 99358,485 99359,3413 99360,207 99361,338 99362,1132 99363,781 99364,338 99365,2590 99366,99367 99366,155451 99368,1133 99369,644 99370,3413 99371,255 99372,366 99373,99374 99375,493 99376,483 99377,835 99378,32 99379,1983 99380,99381 99382,207 99383,1149 99384,4101 99385,99386 99387,120 99388,99389 99390,850 99391,99392 99393,99394 99395,99396 99397,872 99398,1429 99399,99400 99403,99404 99405,668 99407,4487 99408,30 99408,772 99409,258 99412,104 99412,134 99412,135 99412,136 99412,137 99412,850 99413,99414 99416,1181 99416,1515 99417,843 99418,99419 99420,2506 99421,30 99422,2699 99424,99425 99426,264 99427,298 99428,485 99429,99430 99431,310 99432,589 99433,17588 99434,4039 99435,2351 99436,372 99437,6323 99438,697 99438,1465 99438,1836 99439,1608 99440,99441 99442,3623 99443,298 99444,485 99445,811 99446,1143 99447,795 99448,119 99449,1163 99450,872 99451,99452 99453,44 99454,99455 99456,72 99458,255 99459,99460 99464,280 99464,17245 99465,58 99466,994 99467,46 99468,75912 99469,99470 99471,99472 99473,44 99474,206 99475,850 99476,14989 99477,99478 99479,602 99480,920 99481,99482 99483,99484 99486,99487 99488,779 99488,21944 99489,2017 99490,314 99491,151 99492,850 99493,931 99494,99495 99497,920 99498,30 99499,20 99500,1135 99500,94409 99501,30 99502,1776 99504,104 99504,134 99504,136 99505,99506 99507,355 99508,137 99509,697 99509,1769 99510,602 99511,872 99512,99513 99514,99515 99516,298 99517,485 99519,99520 99521,818 99522,781 99523,1132 99524,1612 99525,801 99525,1224 99525,1241 99526,30 99526,200 99526,772 99526,28203 99527,83 99527,801 99527,99528 99529,86 99529,4823 99530,389 99531,2574 99532,1566 99533,99534 99535,99536 99537,233 99539,1132 99540,781 99541,273 99543,22 99544,1631 99545,1983 99546,298 99547,485 99548,1415 99549,118 99549,4597 99550,79 99551,30 99552,640 99553,640 99554,99555 99556,872 99558,3538 99559,422 99560,56 99561,1983 99562,1210 99562,2620 99562,5718 99563,99564 99563,181390 99565,2646 99566,272 99567,298 99568,485 99569,99570 99571,34 99571,35 99571,389 99572,422 99574,3422 99575,422 99576,3623 99577,422 99578,422 99579,422 99580,422 99581,56 99582,422 99583,422 99584,422 99585,422 99586,422 99587,10 99588,298 99589,485 99590,1858 99591,1860 99592,868 99593,8072 99594,811 99595,2775 99596,447 99597,907 99597,148742 99598,83 99599,1983 99600,1983 99601,1983 99602,392 99602,1240 99602,1465 99603,3623 99604,298 99605,485 99606,406 99606,579 99606,620 99606,118336 99608,579 99609,1132 99610,781 99611,134 99611,137 99611,1368 99612,99613 99612,105194 99612,105323 99614,1132 99615,781 99616,1893 99617,1983 99618,1983 99619,99620 99621,298 99622,485 99623,2699 99624,1132 99625,781 99626,167 99626,1231 99626,1241 99626,1837 99626,2083 99626,2557 99627,932 99629,1033 99630,3623 99631,422 99632,56 99633,77 99634,422 99635,56 99636,1983 99638,72 99639,850 99640,3623 99641,372 99642,1298 99643,2782 99644,3524 99645,1983 99646,1559 99647,3623 99648,83 99649,175 99650,850 99651,298 99652,30 99653,1983 99654,509 99655,1803 99657,72 99658,1132 99659,781 99660,3623 99661,97 99662,217 99663,99664 99665,1370 99666,818 99667,2048 99668,422 99669,56 99670,298 99671,485 99673,3623 99675,240 99676,72 99677,3623 99679,516 99679,2168 99680,1390 99681,390 99681,1085 99681,1522 99683,97 99684,3623 99685,1149 99686,1 99687,392 99688,1707 99689,538 99689,2353 99690,72 99692,1287 99693,171 99694,346 99694,1033 99695,9029 99696,3138 99697,3069 99698,72 99699,72 99700,99701 99700,103539 99700,170238 99700,243818 99702,3623 99703,192 99703,202 99703,203 99703,663 99704,10 99705,3069 99706,72 99708,1983 99709,1983 99710,99711 99710,129460 99712,298 99713,485 99714,99715 99716,202 99716,203 99716,4177 99717,72 99719,3069 99720,623 99720,1240 99722,1608 99723,240 99723,298 99723,1462 99723,8180 99723,8537 99724,79 99724,760 99726,99727 99730,99731 99732,849 99732,9457 99732,207659 99733,302 99735,1977 99735,1978 99736,536 99736,1417 99737,579 99737,2373 99738,1132 99739,781 99740,248 99741,1132 99742,781 99744,393 99745,397 99746,1313 99747,137 99748,158 99749,538 99750,160 99750,693 99750,3538 99751,99752 99753,151 99755,195 99757,3069 99758,850 99759,167 99759,73570 99760,58 99761,622 99764,99765 99767,58 99768,972 99769,175 99770,2979 99771,1085 99772,1127 99773,775 99774,298 99776,8270 99777,192 99777,500 99778,1474 99779,1818 99780,147 99780,422 99781,301 99782,442 99783,1220 99783,1222 99784,160 99785,24505 99786,151 99786,1070 99786,3804 99786,7429 99790,852 99792,536 99793,104 99794,200 99794,772 99795,240 99797,5440 99798,7358 99798,7363 99799,818 99799,3247 99801,240 99802,968 99802,1293 99803,163 99804,21944 99805,302 99805,809 99805,1289 99805,1509 99805,3999 99806,850 99807,109568 99807,178422 99809,10 99811,775 99812,5326 99813,160 99814,3623 99815,772 99816,72 99817,647 99818,344 99819,406 99819,620 99820,647 99821,344 99822,72 99824,309 99824,310 99824,3623 99824,221292 99825,1298 99825,1749 99825,72764 99827,772 99828,99829 99830,3623 99831,2620 99833,3623 99835,1939 99836,50 99838,192 99839,1983 99840,3623 99842,1818 99843,99844 99845,392 99846,1181 99847,481 99848,1803 99850,1983 99851,6424 99852,953 99853,1140 99853,2443 99854,557 99855,805 99856,973 99858,3623 99859,1479 99859,48505 99860,99861 99862,99863 99864,3623 99865,76096 99867,4691 99868,850 99869,99870 99871,2116 99872,209 99873,217 99873,1417 99874,392 99875,83 99875,1058 99875,1370 99875,1821 99875,2168 99875,2292 99875,8235 99876,392 99877,22 99878,120 99878,590 99878,1419 99879,99880 99879,120860 99882,99883 99884,980 99885,1010 99886,83 99887,1132 99888,781 99889,640 99890,841 99891,99892 99893,99894 99895,4078 99896,1980 99896,8991 99897,99898 99899,536 99901,862 99902,1379 99903,309 99903,310 99904,920 99905,364 99905,2590 99907,973 99908,640 99910,1243 99911,118 99911,4597 99912,676 99913,178 99914,4935 99915,2244 99916,126 99916,1118 99917,344 99917,647 99918,1608 99919,31934 99920,366 99921,875 99922,83 99922,668 99922,841 99922,843 99922,1801 99923,3623 99924,1247 99925,310 99926,743 99927,493 99928,261 99929,1181 99930,298 99931,485 99932,10 99933,2775 99934,809 99935,99936 99937,1001 99938,99939 99940,215 99941,406 99942,187 99943,99944 99945,312 99947,99948 99951,72 99952,99953 99955,147 99955,158 99955,192 99955,195 99955,202 99955,203 99955,252 99955,301 99955,337 99955,406 99955,493 99955,509 99955,663 99955,664 99955,1181 99955,1235 99955,1335 99955,1590 99955,1782 99955,2178 99955,4545 99955,21944 99956,72 99957,3804 99958,151 99959,1844 99960,72 99961,72 99962,1462 99962,9010 99963,1046 99964,99965 99966,8719 99967,138 99968,865 99969,557 99970,137 99971,118 99971,4597 99972,21944 99973,88820 99975,99976 99977,72 99978,557 99979,333 99980,3623 99981,557 99982,557 99983,557 99984,8270 99986,99987 99988,72 99989,1801 99990,493 99990,682 99990,72439 99991,818 99992,13661 99993,99994 99995,30 99996,99997 99998,611 99998,920 99999,1 100001,100002 100003,21944 100004,289 100004,290 100005,72 100006,20757 100007,100008 100009,9195 100010,693 100011,994 100014,100015 100016,2719 100017,3370 100017,14453 100018,178 100019,192 100020,2506 100021,115 100021,118 100029,141912 100030,118 100030,4597 100031,31934 100032,264 100034,862 100035,356 100036,100037 100038,10 100038,577 100038,2017 100039,376 100040,920 100041,100042 100043,100044 100045,100046 100047,100046 100048,1572 100049,2048 100050,72 100051,200 100052,433 100053,1287 100053,9030 100054,100055 100056,72 100057,151 100058,100059 100060,106 100060,195 100060,1033 100061,1556 100062,151 100063,72 100064,2737 100064,100065 100066,100067 100068,1 100069,862 100070,8270 100071,252 100072,158 100072,336 100072,1425 100073,100074 100075,195 100076,310 100077,682 100077,72439 100078,151 100080,483 100081,611 100081,920 100082,72 100083,72 100087,100088 100089,19986 100090,10 100091,7358 100091,7363 100092,2105 100093,1773 100094,4980 100095,693 100095,3370 100096,192 100098,30 100098,1235 100099,111 100100,536 100101,422 100102,422 100103,422 100104,422 100105,422 100106,422 100107,422 100108,422 100109,422 100110,422 100112,1353 100113,1955 100114,2506 100116,18726 100117,269 100118,163 100119,97 100120,100121 100122,628 100123,850 100124,918 100125,536 100125,3247 100126,6888 100127,2868 100127,2995 100128,225 100129,4101 100130,100131 100132,8884 100134,1085 100135,18726 100136,100137 100138,7360 100139,240 100139,435 100139,818 100140,100141 100142,344 100142,5547 100144,4101 100145,841 100146,2797 100148,100149 100150,872 100151,100152 100153,44 100154,100155 100154,131524 100154,133324 100157,872 100160,100161 100162,100163 100164,79 100165,233 100166,435 100167,676 100168,63 100169,310 100170,100171 100172,366 100173,366 100174,366 100175,366 100176,366 100178,1033 100179,859 100180,859 100181,859 100182,859 100183,859 100185,8180 100188,372 100189,8180 100190,3370 100190,14453 100191,85 100191,4549 100192,355 100193,872 100194,994 100195,100196 100197,99762 100198,310 100199,795 100200,68 100200,859 100201,2828 100202,30 100202,310 100203,874 100204,1419 100205,10 100206,489 100207,100208 100210,100211 100212,1132 100213,781 100215,1132 100216,781 100217,3069 100218,68 100218,697 100218,1175 100218,2590 100219,510 100220,100221 100225,697 100225,1151 100225,1769 100226,298 100227,485 100228,100229 100230,100231 100232,41 100234,68467 100235,83 100236,932 100238,93 100238,94 100239,147 100240,100241 100242,100243 100244,18726 100245,2048 100246,918 100247,497 100248,163 100249,2244 100250,1127 100251,1181 100252,850 100253,100254 100255,841 100256,86 100257,4611 100258,2797 100259,100260 100261,100262 100263,535 100264,850 100265,100266 100267,1323 100268,102 100269,1326 100270,779 100270,68069 100271,100272 100274,1058 100275,1010 100277,1983 100278,34 100278,35 100279,2995 100280,15573 100281,1659 100282,2697 100283,240 100284,100285 100286,100287 100286,128496 100288,100289 100290,850 100291,1132 100292,781 100293,2244 100294,872 100295,731 100296,1181 100297,202 100297,203 100298,298 100299,485 100300,1983 100301,72 100302,68467 100304,72 100305,1241 100305,2083 100306,588 100306,590 100307,859 100308,30 100310,49887 100311,333 100311,1893 100312,30 100313,1085 100314,30 100315,1132 100316,781 100317,100318 100320,100321 100322,827 100323,3623 100324,100325 100326,94409 100328,100329 100330,100331 100332,2506 100333,1983 100334,100335 100336,30 100337,100338 100339,873 100339,2557 100340,100341 100342,72 100343,1551 100344,72 100345,30 100346,30 100347,100348 100349,30 100350,309 100350,310 100351,693 100352,100353 100354,30 100355,30 100358,100359 100360,805 100361,3447 100362,298 100363,485 100364,100365 100366,10 100367,72 100368,433 100369,72 100370,100371 100372,100373 100375,14483 100377,6051 100378,97 100379,30 100381,1181 100382,72 100383,859 100384,2989 100384,2991 100385,100386 100387,1479 100388,390 100389,1132 100390,781 100391,1132 100392,781 100395,1132 100396,781 100397,100398 100399,83 100400,151 100401,30 100402,217 100403,100404 100405,151 100407,100408 100409,149 100409,602 100410,100411 100410,100452 100412,100413 100414,160 100415,1132 100416,781 100417,3413 100418,100419 100420,100421 100422,8270 100423,515 100424,71 100424,217 100424,663 100425,483 100426,100411 100427,100428 100429,843 100430,100431 100432,1016 100432,2210 100433,671 100434,795 100435,72 100436,55849 100437,100438 100439,72 100441,1 100441,859 100442,44 100443,100444 100445,298 100446,485 100447,1282 100448,273 100449,100450 100451,2351 100453,207 100454,1149 100456,1655 100457,255 100458,18726 100459,163 100460,452 100461,100462 100463,100464 100465,100466 100467,10 100469,5405 100471,100472 100473,100473 100474,100475 100476,497 100477,918 100478,100479 100480,3623 100481,100481 100482,8270 100483,2867 100483,2868 100484,100485 100486,795 100489,8180 100490,100491 100492,676 100493,21944 100494,1188 100495,44013 100496,292 100497,58 100497,72 100498,8855 100499,100500 100501,1181 100502,1368 100503,1634 100504,9121 100505,3960 100506,45023 100507,96187 100508,9560 100509,2574 100510,17334 100511,45310 100512,309 100512,310 100513,44013 100514,5976 100515,31977 100515,100516 100517,3413 100518,34 100518,35 100518,1019 100518,1572 100518,5265 100519,100520 100521,195 100522,24505 100524,973 100525,2797 100526,714 100526,2797 100527,273 100528,503 100530,704 100531,588 100531,590 100532,100533 100534,2244 100535,5405 100536,203 100536,3872 100537,714 100538,100539 100541,3209 100542,100543 100546,2797 100547,100548 100549,657 100550,100551 100552,907 100553,6068 100554,100555 100556,588 100556,590 100557,872 100558,535 100559,107 100560,2416 100560,2417 100561,292 100562,338 100563,298 100564,1133 100565,3538 100566,100567 100568,15573 100569,20790 100570,973 100571,2995 100572,158 100573,452 100574,9010 100575,292 100576,100577 100578,233 100579,2931 100581,8180 100582,100583 100584,100585 100586,100587 100589,100590 100591,10 100592,217 100593,1462 100593,9010 100594,1309 100595,628 100596,100597 100598,100599 100600,1462 100600,9010 100601,366 100602,366 100603,192 100604,366 100605,3999 100606,20790 100609,349 100610,100611 100613,862 100614,118 100614,4597 100615,100616 100617,134 100618,1313 100619,310 100620,8855 100621,8855 100622,872 100623,355 100624,72 100625,344 100626,285 100627,100628 100629,100630 100631,100630 100632,100630 100633,100630 100636,100637 100636,109422 100638,100639 100638,184800 100640,10 100641,78232 100642,100643 100644,7652 100645,1769 100646,30 100647,59313 100648,406 100649,2797 100650,100651 100652,7652 100653,63 100654,9195 100655,1414 100656,2697 100657,8788 100658,22924 100659,1359 100660,310 100661,72 100662,344 100663,285 100664,65 100665,273 100666,211 100667,1379 100668,8991 100670,100671 100672,4453 100673,171 100674,1858 100675,1860 100676,1858 100677,1860 100678,48 100679,2266 100680,252 100681,33082 100682,100683 100684,100685 100686,298 100687,485 100688,100689 100688,236961 100690,6068 100691,8270 100692,5440 100693,417 100694,9195 100695,8270 100696,23010 100697,100698 100699,30 100700,100701 100703,100704 100705,8270 100706,932 100707,3999 100708,100709 100710,682 100710,72439 100711,8270 100712,100713 100714,1 100715,202 100715,203 100716,850 100717,1462 100717,7124 100718,1133 100719,868 100720,907 100721,2351 100722,23010 100723,6068 100724,206 100726,364 100728,83 100729,310 100730,3161 100731,1313 100732,309 100732,310 100733,1634 100734,100735 100736,726 100737,80266 100738,589 100739,1414 100741,100741 100743,100744 100745,310 100746,953 100747,298 100748,485 100749,171 100750,676 100751,2995 100752,4571 100753,100754 100755,240 100756,795 100757,5405 100759,21944 100760,7652 100761,20813 100762,2995 100763,100764 100765,973 100766,3413 100767,206 100768,8992 100769,10 100770,841 100770,1634 100770,6051 100770,18726 100771,100772 100773,3999 100774,1118 100775,372 100776,2146 100777,1252 100777,1253 100778,290 100778,1572 100779,6027 100780,2697 100781,3413 100782,100783 100784,30 100785,932 100786,1033 100787,457 100788,310 100789,310 100790,4475 100791,100792 100793,126 100794,310 100795,1102 100796,973 100797,516 100798,23011 100799,100800 100801,100802 100804,45023 100805,17334 100806,96187 100807,9560 100808,3960 100809,27356 100810,45024 100811,14366 100812,704 100813,389 100814,202 100814,203 100815,13661 100816,2506 100817,861 100818,872 100819,872 100820,30 100821,843 100822,97 100823,1707 100824,2697 100825,973 100826,8855 100827,1659 100828,34 100828,292 100829,452 100830,158 100831,779 100832,3148 100833,1011 100834,5726 100835,100836 100837,310 100838,8822 100839,795 100841,100842 100843,100844 100845,1016 100846,8855 100847,100848 100849,45021 100850,45024 100851,49887 100852,30766 100853,100854 100855,178 100857,100858 100859,2697 100860,100861 100862,126 100863,8855 100864,100865 100866,3148 100867,626 100868,34 100868,158 100869,8463 100870,147 100871,184 100872,10 100873,34 100873,19227 100874,479 100875,333 100875,406 100876,5405 100877,100878 100879,310 100880,640 100881,100882 100883,100884 100885,160 100886,8855 100887,100888 100890,126 100891,100892 100893,4078 100894,652 100896,21944 100897,8855 100898,1684 100898,2334 100899,2929 100900,1052 100901,2697 100902,100903 100904,100903 100905,100903 100906,100903 100907,100903 100908,2506 100909,2574 100910,50 100911,1368 100912,875 100913,714 100914,3872 100916,8855 100917,100918 100919,192 100920,10 100921,14989 100922,1201 100923,589 100924,994 100925,50 100926,10 100927,100928 100929,9560 100930,192 100931,406 100932,100933 100934,8855 100935,406 100937,714 100938,3872 100939,779 100940,202 100940,203 100940,372 100940,1572 100941,2105 100942,841 100945,850 100946,207 100947,2697 100950,100951 100952,1 100953,652 100954,628 100955,275 100956,1102 100957,310 100958,1265 100958,1266 100959,100960 100961,714 100962,8270 100963,203 100963,17588 100964,3872 100965,100966 100965,117585 100967,1266 100967,5714 100968,818 100969,1634 100970,78232 100971,726 100972,779 100974,557 100975,1181 100976,31934 100977,192 100977,332 100979,3161 100980,652 100981,479 100983,18726 100984,536 100985,1016 100986,1181 100987,163 100988,7360 100989,704 100990,100991 100992,100993 100994,1235 100994,1335 100995,2867 100995,2868 100996,100997 100998,652 100998,1007 100999,406 101000,8270 101001,663 101001,664 101002,640 101003,184 101004,2574 101005,101006 101007,1133 101009,2929 101010,101011 101013,1285 101014,693 101015,5440 101016,2697 101017,953 101018,8270 101019,6068 101020,589 101021,1414 101022,30 101023,211 101024,5405 101025,1379 101026,2697 101027,2668 101028,298 101029,485 101030,34580 101031,1016 101031,2868 101032,918 101033,2995 101034,1033 101035,628 101036,6888 101037,2574 101039,101040 101041,30 101042,3872 101043,101044 101045,333 101046,3413 101047,1265 101047,1266 101048,1181 101048,1392 101050,298 101051,485 101052,1181 101053,258 101054,101055 101056,337 101057,1414 101058,307 101058,20359 101059,663 101059,664 101060,589 101061,3161 101062,2931 101063,6068 101064,4039 101065,219 101066,7652 101067,45960 101068,101069 101070,859 101071,101072 101073,1181 101074,2379 101075,3447 101076,7360 101077,8270 101078,862 101080,3447 101081,8270 101082,1449 101084,393 101086,6027 101087,1707 101088,17228 101089,968 101089,101090 101091,10 101092,24505 101093,24505 101094,4060 101095,31934 101096,9560 101097,101098 101097,101856 101099,298 101100,485 101101,1133 101101,7363 101102,557 101103,101104 101105,557 101106,862 101107,101108 101109,557 101110,557 101112,406 101113,2048 101115,18726 101116,1043 101117,859 101118,298 101119,485 101120,101121 101122,1266 101122,2048 101123,479 101124,101125 101124,105955 101126,392 101127,326 101128,298 101129,485 101131,3846 101132,146 101133,22 101135,298 101136,485 101137,225 101138,1179 101140,1414 101141,101142 101144,206 101145,30 101146,34 101146,35 101146,1801 101147,298 101148,485 101149,202 101149,203 101150,78400 101151,17588 101152,34 101152,290 101152,7652 101153,420 101154,422 101155,19986 101157,298 101158,485 101159,101160 101161,2719 101162,1287 101163,101164 101165,101164 101166,1163 101167,2797 101168,7155 101169,393 101170,4276 101171,87 101172,8992 101173,4192 101173,4193 101174,298 101175,485 101176,206 101177,4165 101179,101180 101181,8992 101182,298 101183,485 101184,30 101185,101186 101187,101186 101188,101186 101189,101186 101190,101186 101191,1939 101192,101193 101194,101195 101196,1033 101197,184 101198,151 101199,101200 101201,101202 101203,137 101204,682 101204,72439 101205,2048 101206,151 101208,151 101209,3258 101209,6682 101210,10 101211,101212 101213,101214 101216,151 101217,1359 101218,101219 101218,104206 101218,104738 101218,105484 101220,3069 101221,44 101222,2353 101223,101224 101225,779 101226,788 101227,273 101228,7124 101229,9560 101230,184 101231,101232 101233,195 101234,3804 101235,101236 101237,211 101238,3623 101239,3623 101240,202 101240,203 101240,925 101241,33611 101242,30 101242,211 101242,557 101242,1102 101242,5440 101243,953 101244,6068 101245,422 101246,422 101247,422 101248,422 101249,422 101250,422 101251,422 101252,422 101253,422 101254,422 101255,1414 101256,841 101256,1801 101257,422 101258,417 101259,422 101260,56 101261,101262 101264,1939 101265,147 101266,50 101267,5375 101268,676 101269,310 101270,489 101271,100888 101272,647 101273,344 101274,652 101275,805 101276,779 101277,1287 101277,9030 101278,272 101279,13 101280,184 101281,101282 101283,101284 101285,980 101286,31896 101287,1181 101288,3413 101289,101290 101291,2868 101291,2995 101292,24505 101293,101294 101295,713 101296,483 101297,175 101298,151 101299,479 101300,298 101301,657 101302,1419 101303,18726 101304,424 101304,1634 101305,101306 101307,101306 101308,101306 101309,30766 101310,163 101311,118 101311,4597 101312,68467 101314,8270 101315,704 101316,1119 101317,1181 101318,8270 101320,843 101321,187 101323,45960 101324,17772 101325,2868 101325,2995 101326,8598 101327,119 101328,3447 101330,6726 101331,14366 101332,9323 101333,9195 101334,7 101335,6263 101336,4980 101337,3295 101338,19986 101339,16045 101340,9560 101341,24332 101342,23011 101343,17334 101344,9121 101345,3960 101346,2574 101347,28072 101348,3246 101349,118 101349,4597 101350,175 101351,298 101352,101353 101354,151 101355,8270 101357,3413 101358,68467 101359,126 101360,289 101360,290 101361,9025 101362,1181 101363,118 101363,4597 101364,3413 101365,3370 101365,14453 101366,101367 101368,192 101369,779 101369,1181 101370,9121 101372,8822 101373,3447 101374,1939 101375,101376 101378,41 101379,310 101380,101381 101382,101381 101383,101381 101384,101381 101385,101381 101386,6051 101387,101388 101387,109297 101389,298 101390,3413 101391,41 101392,101393 101394,292 101395,294 101396,298 101397,292 101398,1452 101399,296 101400,1955 101401,1188 101402,290 101402,372 101403,101404 101405,2697 101406,81 101407,676 101408,9195 101409,101410 101411,21944 101412,693 101413,406 101414,3148 101415,907 101416,872 101417,8991 101418,175 101419,298 101420,1046 101421,406 101422,1238 101424,30 101425,1181 101426,872 101427,872 101428,101429 101430,68467 101431,101432 101433,1392 101434,1133 101435,3413 101436,693 101437,5343 101438,7358 101438,7363 101439,1102 101440,2105 101441,101441 101442,101443 101444,83 101445,8868 101447,83 101448,23011 101449,101450 101451,366 101452,366 101453,101454 101455,101456 101457,2931 101458,310 101459,101460 101461,101460 101462,101463 101465,101464 101467,2574 101468,333 101469,222 101470,1572 101471,147 101472,240 101473,611 101474,68 101475,75912 101476,63471 101477,101478 101479,233 101480,1210 101481,264 101482,151 101483,101484 101485,301 101485,968 101485,1782 101486,2048 101487,310 101488,483 101489,7360 101490,1119 101491,7360 101492,707 101494,298 101495,485 101496,7652 101497,1881 101498,187 101498,302 101498,305 101498,868 101498,1130 101498,1326 101498,8149 101499,254 101500,392 101501,19986 101502,298 101503,485 101504,644 101505,744 101505,2083 101506,1381 101506,1436 101507,101507 101508,31896 101509,101510 101511,622 101512,1046 101513,298 101514,485 101515,973 101516,452 101517,15573 101518,328 101519,3413 101520,1381 101520,2620 101521,136 101522,2048 101523,2416 101523,2417 101524,101525 101526,1118 101527,1467 101529,101530 101531,1265 101531,1266 101532,406 101533,101534 101535,206 101536,3447 101537,101538 101539,163 101540,175 101541,3960 101542,2351 101543,1132 101544,298 101545,781 101548,24505 101549,184 101550,835 101551,22 101551,349 101551,444 101551,1300 101551,1805 101551,2979 101551,3207 101551,5662 101553,389 101554,101555 101556,356 101557,355 101558,3623 101559,1479 101559,48505 101560,160 101561,99 101561,779 101561,141912 101562,310 101563,203 101563,3872 101564,272 101565,2436 101567,298 101568,485 101569,217 101569,872 101570,65 101571,481 101572,10 101574,585 101575,217 101575,3507 101576,273 101577,389 101578,1010 101579,640 101580,1072 101581,1132 101582,781 101583,158 101583,240 101584,101585 101586,1118 101587,134 101587,137 101587,850 101589,1132 101590,781 101591,1016 101592,3447 101593,671 101594,252 101594,1220 101594,1222 101595,2296 101596,3623 101597,1392 101598,809 101599,406 101600,1132 101601,781 101602,611 101603,58 101604,994 101605,46 101606,75912 101607,272 101608,58 101609,994 101610,46 101611,75912 101612,623 101612,1805 101613,2617 101613,4193 101614,356 101615,2296 101616,13 101617,1388 101619,3623 101620,28072 101621,346 101622,58 101623,994 101624,46 101625,75912 101626,333 101626,462 101626,483 101626,571 101626,861 101626,1181 101626,2116 101626,3555 101627,101628 101629,390 101629,1167 101630,980 101631,101632 101633,175 101634,58 101635,6861 101636,298 101637,1224 101638,31206 101640,31977 101642,3246 101643,58 101644,101645 101647,312 101648,68 101648,195 101648,3804 101649,222 101649,657 101650,1132 101651,781 101652,33328 101652,102413 101655,697 101656,872 101657,158 101657,3193 101658,417 101659,147 101660,68467 101661,1132 101661,1801 101662,151 101663,333 101665,4146 101667,192 101667,217 101668,7652 101669,58 101670,535 101671,1001 101672,101673 101674,1381 101675,272 101676,101677 101678,259 101678,577 101678,859 101678,2373 101678,4165 101678,192522 101679,255 101680,1556 101681,1298 101682,272 101682,841 101683,6068 101687,25348 101687,101688 101688,197740 101690,16614 101691,310 101692,1858 101693,1860 101694,640 101695,83 101696,1132 101697,781 101698,1118 101699,83 101700,1132 101701,101702 101701,117546 101703,781 101704,493 101705,306 101705,307 101706,72 101707,422 101708,56 101709,1001 101710,101711 101712,1132 101713,781 101714,337 101714,358 101714,586 101714,1319 101714,1402 101714,1837 101714,3297 101714,6789 101715,151 101716,390 101716,1715 101717,101718 101719,392 101719,1146 101720,1298 101721,302 101721,2116 101722,147 101722,149 101722,158 101722,206 101722,406 101722,1458 101722,1515 101722,2244 101722,80266 101722,89035 101722,149534 101724,3623 101725,101726 101727,2443 101728,1390 101729,3623 101732,859 101733,101734 101735,217 101735,536 101735,657 101735,4223 101735,7768 101735,13137 101736,101737 101738,422 101739,118 101739,4597 101740,302 101740,489 101740,1556 101741,47 101741,2469 101742,101743 101744,1132 101745,781 101747,1132 101748,781 101749,101750 101751,1289 101752,5440 101753,1707 101754,178 101755,101756 101758,3999 101759,264 101760,333 101761,626 101762,1132 101763,781 101764,75912 101765,602 101767,1381 101768,6027 101769,2744 101770,149 101771,577 101771,980 101772,577 101773,101774 101775,676 101777,298 101778,485 101779,1247 101780,101781 101782,1452 101783,3041 101784,255 101785,1551 101786,101787 101788,1551 101789,1007 101790,2367 101791,34 101791,605 101791,33424 101792,1105 101793,1033 101794,3623 101795,457 101797,4078 101799,1381 101800,3623 101801,347 101802,1639 101803,7124 101804,22 101804,1634 101806,996 101807,626 101808,97 101808,192 101808,302 101808,483 101808,615 101808,843 101808,929 101808,1068 101808,1782 101809,1983 101809,138686 101809,188791 101811,240 101812,6303 101813,596 101814,994 101815,3148 101816,1132 101817,781 101818,611 101818,1619 101819,788 101820,264 101820,1509 101821,3698 101822,101823 101824,2574 101825,79 101827,1836 101828,34 101828,35 101828,634 101828,2646 101829,862 101830,1749 101831,671 101832,752 101834,2626 101835,97 101836,663 101838,663 101839,602 101840,93319 101841,467 101843,31934 101844,422 101845,1836 101846,56 101847,1151 101848,1070 101849,447 101850,269 101851,134 101852,1363 101853,1715 101855,4192 101855,4193 101857,101858 101859,1238 101860,3804 101861,602 101864,1085 101865,5375 101866,31896 101867,2017 101868,406 101869,58 101870,58 101871,994 101872,46 101873,75912 101874,1634 101874,1877 101875,101876 101877,309 101877,310 101878,202 101878,203 101878,697 101878,1175 101878,2590 101879,147 101879,158 101879,269 101880,344 101882,2737 101883,140 101883,1132 101883,1289 101883,1509 101883,1968 101884,6303 101886,349 101887,992 101888,1149 101889,1238 101890,30 101890,200 101891,1381 101892,1072 101893,1313 101894,202 101894,203 101895,349 101896,248 101896,949 101896,1133 101897,207 101899,2646 101900,585 101901,623 101902,1243 101903,991 101904,272 101905,1149 101906,1089 101908,101909 101910,101911 101913,120 101914,392 101915,1659 101916,592 101917,447 101919,433 101920,101921 101922,151 101922,682 101922,72439 101923,310 101924,21487 101925,3507 101926,21487 101927,21487 101928,516 101928,925 101929,1220 101929,1222 101930,252 101931,101932 101933,251 101934,2296 101934,101935 101936,9018 101937,1634 101938,682 101938,72439 101939,388 101940,151 101941,1231 101942,1265 101942,1266 101943,4355 101944,1509 101945,2266 101945,25348 101946,115 101946,118 101947,2701 101948,907 101951,9195 101952,217 101952,9005 101953,119 101954,852 101954,1454 101954,2436 101955,775 101955,3804 101956,7117 101957,310 101959,3161 101960,255 101961,1836 101962,1551 101965,493 101966,138 101967,949 101968,3079 101969,1836 101970,349 101971,14550 101972,2048 101973,8992 101974,7155 101975,151 101975,33424 101976,3846 101977,1149 101978,1235 101978,8270 101979,8270 101980,6824 101981,104 101982,18726 101983,1531 101984,175 101985,1773 101986,298 101987,623 101988,859 101989,1531 101990,843 101991,356 101992,258 101993,1132 101994,781 101996,1181 101997,920 101998,859 101998,8855 101999,801 102000,130 102000,151 102000,292 102000,310 102000,473 102000,527 102000,1089 102000,1572 102000,2617 102000,3039 102001,1285 102002,704 102002,1140 102002,5547 102003,479 102004,31934 102007,1133 102009,184 102010,3507 102011,102012 102014,22 102014,861 102015,5976 102016,248 102017,3148 102018,5405 102019,22 102020,417 102022,2146 102023,137 102024,1220 102024,1222 102025,252 102026,251 102027,1266 102027,5714 102028,102029 102028,108944 102030,17772 102031,772 102032,1238 102033,269 102033,1551 102034,850 102035,1181 102036,772 102037,1201 102038,102039 102041,102042 102043,147 102043,195 102043,779 102044,592 102044,1085 102045,31934 102046,693 102047,333 102048,1102 102049,652 102050,953 102051,2351 102052,6068 102053,589 102054,1414 102055,1133 102057,15573 102058,2995 102059,376 102060,563 102061,58 102062,493 102063,795 102064,58 102066,2351 102067,273 102068,438 102069,372 102070,44 102071,1939 102072,147 102073,252 102073,1220 102073,1222 102074,50 102075,30 102075,225 102075,772 102076,1 102077,399 102078,290 102078,859 102079,1188 102080,731 102081,949 102082,557 102083,2646 102084,652 102085,417 102085,2417 102086,58 102087,586 102088,167 102088,301 102089,102090 102091,102090 102092,5547 102093,14434 102094,602 102095,697 102096,403 102096,693 102097,8788 102098,483 102099,2351 102100,28072 102101,874 102103,602 102104,1132 102105,781 102107,663 102108,663 102109,102110 102111,1282 102112,920 102113,302 102113,579 102114,422 102116,760 102116,1149 102118,28072 102119,1782 102120,31934 102121,72 102122,602 102123,25348 102123,101688 102124,557 102125,306 102125,307 102126,72 102126,312 102126,1052 102127,58 102128,58 102129,994 102130,46 102131,75912 102132,8855 102133,269 102134,920 102135,390 102135,399 102135,557 102135,17309 102136,358 102137,534 102138,2073 102139,102140 102141,23011 102142,1623 102143,644 102144,1634 102145,41 102146,383 102147,7 102148,34 102148,290 102148,652 102149,7652 102150,298 102151,485 102152,467 102153,493 102154,1175 102155,1659 102156,1844 102157,355 102158,1132 102159,781 102160,1509 102161,102161 102163,389 102164,1745 102165,602 102166,3804 102167,217 102168,920 102169,158 102170,1016 102171,20359 102172,8855 102173,49887 102174,704 102175,1368 102176,1181 102177,2116 102178,310 102178,805 102179,102180 102181,557 102182,557 102183,102184 102183,122832 102185,309 102185,310 102186,518 102188,602 102189,6323 102190,444 102191,602 102192,1653 102192,6027 102193,452 102194,3 102195,1119 102196,298 102197,485 102198,563 102199,577 102200,68 102201,30 102201,1235 102202,209 102203,8270 102204,779 102205,306 102205,307 102207,298 102208,485 102209,393 102210,718 102211,102212 102213,102214 102213,110653 102215,8270 102216,330 102216,1235 102216,1335 102217,102218 102219,9026 102220,9560 102221,151 102221,344 102221,457 102221,577 102221,579 102221,671 102221,827 102221,1118 102221,1392 102221,1400 102221,1417 102221,1509 102221,1612 102221,1818 102221,2073 102221,2353 102221,3999 102221,4823 102221,5440 102221,6661 102222,3069 102223,693 102223,1707 102224,102225 102226,1983 102228,38158 102229,184 102230,102231 102232,178 102233,102234 102235,3999 102236,557 102237,7360 102238,102239 102240,299 102241,433 102242,602 102243,3960 102244,19227 102245,158 102246,102247 102248,21944 102249,2620 102250,104 102250,289 102250,290 102250,298 102250,332 102250,372 102250,588 102250,590 102250,805 102250,1001 102250,1046 102250,1962 102250,2209 102250,2286 102250,94134 102251,306 102251,307 102252,15573 102253,1016 102254,87638 102255,146 102256,8788 102257,93 102257,94 102258,2590 102259,366 102260,72 102261,481 102262,72 102263,102264 102263,126370 102265,134 102265,636 102266,2995 102267,949 102267,968 102268,206 102269,1016 102270,72 102271,207 102272,146 102272,489 102272,615 102272,2116 102273,1353 102274,620 102277,102278 102279,195 102280,1201 102281,3804 102282,72 102283,872 102284,8270 102285,1745 102286,1419 102287,663 102288,1429 102289,102290 102291,1266 102291,2048 102292,588 102292,590 102293,4066 102294,668 102295,2626 102296,126 102297,102297 102298,102299 102300,81 102301,3370 102301,14453 102302,227 102303,146 102304,652 102305,980 102306,200 102307,772 102308,1276 102308,4193 102309,134 102310,2048 102311,1285 102312,312 102313,2719 102314,3370 102314,14453 102315,1179 102315,1305 102315,2701 102316,192 102316,292 102317,58 102318,1143 102319,5366 102321,7360 102322,137 102323,315 102324,1414 102325,2351 102326,4276 102327,137 102328,102329 102330,1515 102331,32 102331,114929 102332,32 102333,30 102334,102335 102336,3258 102337,65 102337,163 102337,392 102337,868 102337,1010 102338,102339 102340,102339 102341,406 102341,1068 102342,102343 102344,536 102345,1556 102346,178 102347,832 102348,102349 102350,163 102351,1939 102352,102353 102355,3 102355,301 102355,302 102355,372 102355,518 102355,932 102355,1007 102355,1082 102355,1241 102355,1479 102355,1818 102356,134 102357,1285 102357,4193 102358,118 102358,4597 102359,175 102360,298 102361,1849 102362,151 102363,102364 102365,102366 102367,333 102367,108554 102368,779 102370,455 102371,14483 102372,222 102373,2367 102374,298 102375,485 102376,4475 102377,135 102378,102379 102380,827 102381,1238 102382,102383 102384,30 102385,102386 102387,233 102388,2782 102389,6506 102390,1983 102391,932 102392,5192 102393,3724 102394,30 102395,861 102396,805 102396,1745 102396,2205 102396,111142 102396,255969 102397,1837 102398,102399 102400,644 102401,602 102401,808 102402,1132 102403,781 102404,195 102405,5405 102406,178 102406,215 102406,861 102406,877 102406,21944 102407,868 102407,2146 102408,515 102410,406 102410,1515 102411,704 102412,1977 102412,1978 102414,1227 102414,86416 102415,2146 102416,298 102417,485 102418,2607 102419,9166 102420,1133 102421,134 102422,536 102424,415 102425,102426 102427,4594 102428,14126 102429,187 102431,1247 102432,298 102433,485 102434,406 102435,872 102436,102437 102438,675 102439,675 102440,835 102441,1298 102442,355 102443,862 102444,151 102445,2646 102446,1893 102447,2889 102448,30 102449,1392 102450,298 102451,485 102452,207 102454,8820 102455,872 102456,872 102457,22 102458,1052 102459,2626 102460,3413 102461,749 102462,102463 102464,1849 102465,23783 102465,30331 102466,273 102467,58 102468,994 102469,46 102470,75912 102471,1140 102482,1127 102483,994 102484,206 102484,1572 102484,8180 102486,72 102487,102487 102489,1608 102490,1912 102491,861 102492,2646 102493,151 102495,217 102496,1590 102497,68 102498,1240 102499,872 102500,72 102501,5540 102502,209 102504,2646 102505,137 102506,1177 102507,666 102507,972 102507,1849 102507,32784 102507,72764 102507,124668 102508,818 102510,435 102511,1132 102512,781 102513,310 102513,631 102513,1177 102513,3039 102513,232766 102514,1707 102515,973 102517,22 102519,872 102520,72 102522,285 102522,422 102522,1381 102523,483 102524,147 102525,2266 102526,622 102527,65 102528,2699 102529,1531 102530,1531 102532,760 102533,3069 102534,102535 102538,3182 102539,1722 102540,1238 102541,14819 102542,422 102543,422 102544,422 102545,422 102546,3623 102547,422 102548,422 102549,422 102551,296 102552,422 102553,647 102553,872 102554,422 102555,2411 102556,422 102558,83 102559,259 102559,397 102560,56 102560,106 102560,147 102560,149 102560,158 102560,175 102560,192 102560,195 102560,285 102560,336 102560,406 102560,446 102560,505 102560,620 102560,640 102560,841 102560,1370 102560,1425 102560,1458 102560,1515 102560,1518 102560,3449 102560,3810 102560,21442 102560,30428 102560,30577 102560,38976 102560,55849 102560,60576 102560,62686 102560,102560 102560,103852 102560,104926 102560,118336 102560,123797 102560,124889 102560,125411 102560,126059 102560,126850 102560,127158 102560,128671 102560,130247 102560,135273 102560,135312 102560,142496 102560,144231 102560,173854 102560,179708 102560,180487 102560,188662 102560,191355 102560,197495 102560,198435 102560,230380 102560,232928 102560,253203 102560,255046 102562,30 102563,102564 102566,30 102567,1132 102568,781 102569,18831 102569,55210 102570,104 102571,137 102572,1033 102573,2646 102574,217 102576,30331 102584,2168 102585,577 102585,949 102590,58 102591,994 102592,46 102593,75912 102594,577 102595,147 102595,158 102595,1546 102595,8027 102595,58612 102595,80266 102595,81185 102595,83483 102595,102595 102595,102596 102595,102597 102595,102598 102595,102599 102595,102678 102595,102741 102595,102742 102595,102743 102595,102744 102601,622 102603,9560 102604,217 102605,3623 102608,383 102609,5440 102614,209 102616,1390 102619,349 102620,538 102621,56 102621,147 102621,158 102621,192 102622,102623 102624,102623 102625,8270 102626,171 102627,77 102628,14674 102629,1132 102630,781 102631,389 102632,1454 102633,298 102634,485 102636,1227 102636,86416 102637,1893 102638,355 102640,104 102640,557 102640,953 102641,827 102642,481 102643,3069 102644,1977 102644,1978 102645,1983 102646,167 102646,3218 102649,102650 102651,557 102652,358 102653,1220 102653,1222 102654,252 102655,251 102656,217 102656,1417 102657,690 102658,850 102659,1326 102660,298 102661,485 102662,676 102663,20 102664,760 102665,1001 102666,175 102667,217 102669,298 102670,261 102671,86 102673,2353 102674,83 102674,240 102675,920 102677,3623 102683,21944 102685,21944 102686,79 102686,192 102687,240 102688,1983 102689,1332 102690,1531 102691,862 102692,120 102693,1046 102695,444 102695,567 102695,685 102695,849 102695,1043 102695,1653 102695,2460 102695,6955 102695,214131 102696,4218 102697,2735 102698,22 102698,136 102698,137 102698,207 102698,455 102698,623 102698,744 102698,1293 102698,1479 102698,1955 102699,462 102699,1659 102700,2784 102701,3260 102702,623 102703,171 102704,920 102704,1345 102705,289 102705,290 102705,2296 102705,94134 102707,1323 102708,102 102709,1326 102710,720 102712,104 102712,137 102713,58 102714,1231 102716,240 102718,392 102719,338 102719,340 102719,1381 102719,1893 102720,2590 102721,298 102722,485 102723,102724 102723,107337 102725,2590 102726,56 102727,192 102728,349 102731,349 102734,102735 102736,493 102736,1927 102737,310 102739,328 102739,622 102740,83 102743,147 102743,80266 102745,527 102746,408 102747,1309 102750,3623 102751,2995 102753,1836 102754,1465 102754,1801 102757,271 102758,225 102759,1531 102760,493 102761,9098 102762,8798 102763,7572 102764,4549 102765,1132 102766,493 102766,577 102766,1105 102766,1927 102767,874 102768,515 102769,2574 102770,2590 102771,273 102772,5540 102774,1298 102775,102776 102777,450 102778,818 102778,868 102779,275 102780,827 102781,2775 102782,447 102783,841 102784,2797 102785,872 102786,1 102786,171 102786,957 102786,1815 102787,171 102788,30 102789,251 102789,252 102789,1220 102789,1222 102790,1837 102791,20 102792,393 102793,305 102794,3623 102795,4146 102796,366 102796,515 102797,240 102797,1285 102798,1849 102799,163 102800,588 102800,590 102801,209 102801,217 102801,302 102802,931 102803,388 102804,3804 102805,3623 102806,1707 102807,101534 102808,87 102809,1132 102810,781 102812,102813 102814,294 102815,586 102816,1893 102816,1968 102817,1515 102817,21944 102818,102819 102820,1836 102821,10 102823,184 102824,160 102825,615 102826,1 102827,10 102828,195 102830,932 102831,106 102831,192 102831,337 102831,435 102831,447 102831,726 102831,1388 102831,3989 102831,6119 102832,118 102832,4597 102833,72 102834,1370 102835,146 102837,30 102838,4771 102839,2286 102840,178 102841,392 102842,21944 102843,3623 102844,1132 102845,781 102846,872 102848,1707 102849,602 102850,140 102851,267 102852,6638 102854,425 102854,1276 102854,3507 102854,3698 102855,628 102856,298 102857,485 102858,483 102859,102860 102861,843 102862,333 102863,298 102864,485 102865,1247 102867,102868 102869,557 102870,102871 102872,8788 102873,557 102874,192 102875,310 102876,30 102877,79 102878,102879 102880,310 102881,18726 102882,862 102883,298 102884,485 102885,32 102885,575 102885,918 102885,3003 102886,102887 102888,861 102889,102890 102892,151 102893,579 102893,1801 102894,1127 102895,500 102896,102897 102898,102899 102900,7360 102901,21408 102902,83 102903,8270 102904,206 102905,79 102907,1033 102908,250 102908,1684 102909,298 102910,485 102911,450 102912,264 102913,1452 102914,1551 102915,203 102915,372 102916,1639 102917,1381 102918,102919 102920,3413 102921,1220 102921,1222 102922,147 102922,158 102923,450 102924,292 102925,312 102926,149 102927,146 102927,106502 102928,1623 102929,1425 102930,158 102931,640 102932,42064 102933,60576 102934,336 102935,102936 102937,2737 102938,518 102939,3193 102940,31122 102942,450 102943,1181 102944,30 102945,422 102946,56 102947,102948 102949,261 102951,102952 102954,1282 102955,1370 102956,102957 102959,102960 102962,306 102962,307 102963,795 102965,102966 102967,1085 102968,450 102969,1181 102970,450 102971,102972 102973,184 102974,58 102975,3161 102976,310 102977,1556 102979,175 102980,298 102981,171 102982,261 102983,102984 102985,72 102987,34 102987,8270 102988,7652 102989,2590 102990,102991 102992,874 102993,290 102993,850 102994,1188 102995,671 102996,72 102997,58 102998,102999 103000,1544 103001,298 103002,485 103003,818 103003,907 103003,1414 103003,2351 103003,2995 103003,6068 103003,8180 103003,15573 103005,4611 103006,1544 103007,4611 103008,1544 103010,527 103011,9457 103012,103013 103014,184 103015,225 103016,4453 103017,563 103018,1893 103019,647 103020,2744 103021,8855 103022,2626 103023,1201 103024,640 103025,58 103026,30 103027,366 103028,269 103029,30 103030,9121 103031,431 103032,809 103033,477 103034,640 103035,775 103036,30 103037,103038 103039,24505 103040,192 103041,233 103042,248 103043,23701 103044,10 103045,694 103046,850 103047,1572 103048,206 103048,209 103049,103050 103051,697 103053,171 103054,240 103055,355 103056,103057 103059,640 103061,4220 103062,103063 103064,2775 103065,447 103066,130 103068,175 103069,140 103070,302 103071,298 103072,58 103073,422 103074,422 103075,2421 103076,422 103077,1 103078,103079 103080,2626 103082,563 103083,1836 103084,50 103085,592 103086,726 103087,872 103088,273 103089,7 103091,273 103093,136 103094,1515 103095,422 103096,422 103097,406 103098,422 103099,779 103100,422 103101,422 103102,285 103103,422 103104,56 103106,422 103108,422 103109,422 103111,602 103112,1363 103113,1363 103114,50321 103115,103116 103117,1858 103118,430 103118,2674 103119,4066 103120,248 103121,1893 103122,195 103123,943 103124,1801 103125,97 103126,30331 103127,23783 103128,1858 103130,1531 103131,3413 103132,422 103133,302 103134,30 103135,211 103136,7124 103137,2574 103138,222 103139,97 103140,805 103141,1132 103142,781 103143,1572 103144,433 103145,640 103146,298 103147,485 103148,1782 103149,50 103150,7 103151,10 103152,103153 103154,306 103154,307 103155,55849 103156,1118 103157,23783 103158,1127 103159,1363 103161,1132 103162,781 103163,269 103163,356 103163,1381 103163,1844 103163,9457 103163,13538 103163,21944 103164,500 103165,1962 103166,1052 103167,1882 103168,2775 103169,54 103173,620 103173,1058 103174,267 103177,862 103179,3623 103180,305 103181,2334 103182,1132 103183,781 103184,1858 103185,1860 103186,103187 103188,2244 103189,104 103190,5310 103191,83 103193,2646 103194,356 103195,467 103196,103197 103198,167 103199,1707 103200,968 103201,5405 103202,973 103203,4678 103204,2979 103205,83 103206,827 103207,907 103207,1284 103207,148742 103208,30 103208,841 103208,850 103209,103210 103211,1010 103212,714 103213,1849 103214,103215 103216,596 103216,1368 103217,2334 103220,1085 103220,156379 103222,323 103222,462 103222,4453 103223,779 103223,4193 103224,103225 103226,479 103226,861 103226,1579 103227,690 103227,3724 103228,1390 103229,336 103229,1572 103230,349 103231,2889 103234,103235 103236,211 103237,48 103237,326 103237,31896 103238,579 103238,1707 103238,162599 103239,273 103240,149 103240,3089 103241,779 103241,2244 103242,30331 103243,1181 103244,1659 103245,1955 103246,1052 103247,1623 103248,1 103249,422 103250,336 103252,149 103253,422 103254,192 103254,217 103254,9005 103255,184 103256,261 103256,1203 103257,1220 103257,1222 103258,252 103259,103260 103261,103260 103262,103260 103263,251 103264,103260 103265,103260 103266,103267 103268,103267 103269,240 103269,1203 103270,1177 103271,1043 103275,1257 103276,87 103276,1058 103276,1454 103276,1634 103276,3260 103276,3367 103277,1203 103278,493 103279,2286 103280,349 103281,503 103281,862 103281,1392 103281,5101 103281,27041 103283,1359 103284,209 103285,3 103288,805 103289,2574 103291,538 103291,1284 103292,171 103293,1220 103293,1222 103294,252 103295,251 103296,175 103297,4060 103298,3623 103299,298 103300,2867 103300,2868 103301,58 103302,994 103303,46 103304,75912 103305,171 103306,1323 103307,102 103308,1326 103309,518 103309,1955 103310,10 103311,850 103312,72 103313,103314 103315,298 103316,485 103317,3 103318,10 103318,3297 103319,1240 103319,1465 103320,1132 103321,781 103323,240 103324,202 103324,203 103325,32 103325,285 103325,392 103325,644 103325,697 103325,809 103325,2699 103325,3003 103326,1467 103327,481 103328,103329 103330,103331 103332,1359 103333,147 103333,3135 103334,918 103335,10 103336,252 103337,2371 103338,75912 103340,1172 103341,1572 103342,2334 103343,140 103344,1085 103345,1033 103346,4192 103346,4193 103347,1133 103349,7572 103350,6789 103351,103352 103353,1634 103354,302 103355,1801 103356,240 103356,372 103356,805 103358,1388 103359,285 103360,579 103361,68069 103362,663 103363,103364 103366,760 103366,1149 103366,1511 103366,1631 103366,3069 103367,151 103368,450 103369,647 103370,3623 103372,302 103373,640 103374,2334 103375,103376 103377,1247 103378,2017 103379,4220 103379,66297 103380,298 103381,485 103382,344 103383,302 103384,1359 103385,406 103386,23701 103387,1 103387,119 103388,3 103390,3623 103391,103392 103393,1151 103393,1836 103395,356 103396,422 103397,56 103398,1836 103399,736 103400,50 103401,515 103404,392 103405,1858 103406,1860 103407,1955 103408,255 103410,171 103411,2674 103411,16153 103412,1284 103414,3 103415,1 103416,103417 103418,1220 103418,1222 103419,252 103420,251 103421,151 103422,255 103423,289 103423,290 103424,1955 103425,1146 103426,3623 103427,2620 103428,103429 103430,68 103431,20771 103432,1085 103434,1240 103435,103436 103437,731 103437,3297 103438,192 103439,3623 103440,283 103441,217 103443,184 103444,30 103445,103446 103447,106 103448,10 103450,392 103451,1359 103452,103453 103454,202 103454,203 103455,2574 103456,3138 103457,83 103458,1085 103459,72 103460,1608 103461,9598 103462,1608 103463,861 103464,310 103465,1707 103467,360 103468,269 103469,3653 103470,376 103471,392 103472,3623 103473,422 103474,298 103475,485 103476,1462 103476,2334 103477,17588 103478,1127 103479,479 103479,682 103479,72439 103480,1247 103481,192 103482,2605 103483,3585 103484,3623 103485,72 103486,30766 103487,53763 103488,68467 103489,45024 103490,45023 103491,68467 103492,973 103493,72 103494,3623 103496,485 103497,28755 103498,1782 103499,718 103500,3623 103501,557 103502,557 103503,55849 103504,795 103505,1016 103505,2379 103506,10 103507,103508 103509,3623 103511,772 103512,2944 103513,83 103514,1319 103515,103516 103517,103518 103519,103520 103521,663 103522,1227 103522,2089 103522,2940 103522,86416 103523,10 103524,167 103524,301 103524,1119 103524,1177 103524,1785 103524,1818 103525,1284 103525,1955 103526,431 103526,631 103526,1659 103527,5540 103528,1 103529,217 103529,1417 103530,1531 103531,72 103532,202 103532,203 103532,682 103532,949 103532,72439 103533,636 103533,1262 103533,1332 103533,1844 103534,10 103535,1298 103536,435 103537,1634 103538,103539 103540,2590 103541,103542 103544,536 103545,4611 103546,147 103546,158 103547,72 103548,48 103549,1132 103550,781 103551,149 103552,103552 103553,588 103553,590 103554,843 103555,356 103556,3 103557,397 103558,1556 103559,577 103560,160 103561,6789 103562,103563 103564,919 103565,72 103566,68 103567,1707 103569,483 103570,68 103571,34 103571,35 103572,72 103573,72 103574,10 103575,272 103575,315 103575,479 103576,118 103576,4597 103577,2146 103578,72 103579,1243 103580,2775 103581,447 103582,72 103583,1132 103584,781 103585,450 103586,292 103587,103588 103589,72 103591,72 103592,72 103593,103594 103595,1235 103595,1335 103596,312 103597,103598 103599,406 103601,1359 103602,1 103603,1659 103604,72 103605,422 103606,422 103607,422 103608,192 103609,422 103610,422 103611,301 103611,1385 103612,422 103613,422 103614,422 103616,422 103617,422 103618,247 103619,422 103621,103622 103621,120522 103624,72 103625,103626 103625,111302 103625,144497 103627,103628 103630,2646 103631,406 103632,9598 103633,973 103634,1203 103635,136 103635,450 103635,563 103635,2867 103635,2868 103637,103638 103640,103641 103642,72 103643,255 103645,103646 103647,252 103649,103650 103652,103653 103654,103655 103656,158 103657,87 103657,301 103657,392 103657,1722 103657,16614 103658,304 103659,195 103660,103661 103662,1238 103663,269 103663,590 103664,1452 103665,72 103667,103668 103669,676 103670,37 103674,1722 103675,3079 103677,272 103678,693 103678,14366 103678,14483 103679,19227 103680,5714 103681,267 103682,1265 103682,1266 103683,202 103683,203 103684,258 103685,1381 103686,366 103687,147 103687,158 103687,206 103687,2244 103688,420 103690,103691 103692,1326 103693,103694 103695,103696 103697,2367 103699,103700 103701,206 103702,3474 103703,72 103704,103705 103704,110938 103704,110973 103704,111013 103704,111808 103704,111926 103704,123418 103706,233 103707,3297 103708,2557 103709,934 103710,563 103711,46 103712,206 103713,30 103714,397 103717,5405 103719,3623 103720,1294 103721,1659 103723,10 103723,20 103723,22 103723,447 103724,1058 103726,657 103727,309 103727,310 103728,30 103729,973 103730,136 103730,137 103731,704 103732,1977 103732,1978 103733,292 103734,195 103734,360 103734,392 103734,1572 103734,37414 103735,1284 103736,877 103737,195 103738,510 103740,640 103741,103742 103743,640 103744,3623 103745,1983 103746,202 103746,203 103747,911 103747,1634 103747,2460 103748,2995 103749,364 103750,1912 103751,103752 103753,3623 103755,1955 103755,2775 103756,264 103756,1289 103757,1415 103758,1415 103759,1415 103760,500 103761,2146 103762,2371 103763,3474 103764,1400 103765,2572 103766,1893 103767,718 103767,4810 103768,805 103769,1415 103770,489 103770,795 103770,1400 103773,10 103774,1983 103776,63 103776,877 103776,985 103776,3999 103776,75912 103777,30 103779,634 103781,147 103781,158 103781,192 103781,779 103782,1805 103783,89035 103784,1167 103784,2979 103785,287 103786,2244 103787,55995 103788,158 103789,158 103790,349 103791,1556 103792,1284 103793,718 103794,3623 103795,298 103796,485 103797,925 103798,72 103799,222 103800,94409 103802,994 103802,21944 103803,83 103804,611 103805,137 103805,1274 103806,50 103807,452 103808,1247 103809,184 103810,72 103811,6119 103812,3623 103814,733 103815,31977 103816,1454 103817,1390 103818,247 103819,68069 103820,868 103821,392 103823,140 103824,23010 103825,1860 103826,809 103826,1836 103827,1359 103828,2646 103828,141912 103829,309 103829,310 103829,6556 103830,147 103831,1607 103832,30 103832,991 103833,336 103834,306 103834,307 103835,171 103836,1858 103837,1860 103839,1 103840,893 103841,256 103842,1 103842,422 103843,1179 103845,611 103846,536 103847,14483 103848,3623 103849,1707 103850,13137 103851,932 103852,336 103852,406 103852,620 103852,622 103852,841 103852,1425 103852,102560 103853,79 103853,862 103855,387 103855,1058 103856,1785 103857,72 103858,1332 103859,1293 103860,46 103860,301 103860,372 103860,444 103860,567 103860,663 103860,783 103860,937 103860,968 103860,1160 103860,1293 103860,1300 103860,1580 103860,1627 103860,1715 103860,1852 103860,5186 103860,31784 103860,38446 103860,62439 103860,64027 103860,95469 103860,96482 103860,103860 103860,112994 103860,113698 103860,114178 103860,114664 103860,114685 103860,115046 103860,115095 103860,115098 103860,115099 103860,115680 103860,115707 103860,116695 103860,117327 103860,117346 103860,120510 103860,123021 103860,123173 103860,123422 103860,124082 103860,126572 103860,127158 103860,128729 103860,130993 103860,131214 103860,131217 103860,133141 103860,136301 103860,137759 103860,137760 103860,138194 103860,151155 103860,160923 103860,164635 103860,164638 103860,165987 103860,167092 103860,172724 103860,173207 103860,174995 103860,181028 103860,186657 103860,188791 103860,189303 103860,195265 103860,195747 103860,195762 103860,199736 103860,199785 103860,213238 103860,215591 103860,221730 103860,222563 103860,222565 103860,222567 103860,222575 103860,222652 103860,239992 103860,240018 103860,241970 103860,251473 103860,254249 103860,255136 103860,257078 103860,265026 103861,1247 103862,1556 103863,175 103864,298 103865,485 103866,29380 103867,298 103868,333 103869,1983 103871,252 103873,3260 103874,3623 103875,1359 103876,2116 103877,356 103878,312 103878,205627 103879,2989 103879,2991 103880,581 103882,103883 103884,103883 103885,252 103886,66 103886,252 103887,779 103888,65 103888,66 103888,467 103889,875 103890,483 103891,563 103893,298 103894,485 103896,623 103896,697 103896,1240 103896,1805 103898,252 103899,875 103900,893 103900,3258 103901,581 103902,72 103903,344 103904,285 103905,1359 103906,1033 103907,406 103908,5726 103909,1467 103910,1381 103910,75912 103911,195 103912,252 103913,283 103913,389 103913,13137 103913,19443 103914,455 103915,2424 103917,298 103917,626 103917,1284 103917,1381 103919,1359 103923,1871 103924,252 103925,493 103925,1893 103926,58 103927,760 103929,2421 103930,83 103931,13980 103932,252 103933,1188 103935,1381 103936,503 103937,83 103938,252 103939,676 103940,103941 103942,1773 103943,3623 103944,103944 103945,227 103946,264 103947,3623 103950,146 103951,5405 103952,3623 103953,4549 103954,252 103955,843 103956,21944 103957,195 103958,147 103958,215 103958,392 103958,779 103958,1010 103958,1801 103959,217 103960,615 103961,184 103962,9025 103963,10 103964,215 103965,1434 103966,1220 103966,1222 103967,3623 103968,252 103969,872 103970,663 103971,663 103972,9560 103973,103974 103976,4611 103977,103978 103979,1858 103980,1860 103981,302 103983,3623 103984,6068 103985,252 103986,3623 103987,1220 103987,1222 103988,252 103989,251 103990,640 103991,252 103992,309 103992,310 103992,1531 103992,13546 103992,23487 103993,290 103993,23701 103994,103995 103996,30 103997,72 103998,435 103999,252 104001,1220 104001,1222 104002,65 104003,104004 104005,4935 104006,271 104007,2146 104008,151 104009,392 104010,435 104011,592 104012,481 104013,171 104014,104015 104014,129671 104016,251 104016,252 104016,1220 104016,1222 104017,843 104018,356 104019,1429 104020,158 104020,192 104020,247 104020,252 104020,516 104020,622 104020,717 104020,1012 104020,1238 104021,875 104022,422 104023,56 104024,136 104025,68 104026,301 104027,261 104028,7124 104029,3623 104030,304 104031,104032 104033,1467 104033,1871 104033,2421 104033,5906 104034,6789 104035,175 104036,1326 104037,1122 104038,298 104039,192 104040,663 104041,104042 104043,187 104044,5440 104045,111 104045,309 104045,310 104046,302 104046,579 104046,687 104047,292 104048,104049 104050,269 104051,718 104052,2797 104053,217 104053,1019 104054,7416 104055,104056 104057,21944 104058,252 104058,516 104058,1220 104058,1222 104059,104060 104059,139461 104061,3623 104062,21944 104063,10 104064,2506 104065,104066 104067,4101 104068,1858 104069,1860 104071,72 104072,298 104073,485 104074,605 104075,30 104076,104077 104078,663 104079,251 104080,3623 104081,72 104082,360 104083,104084 104086,1955 104087,72 104088,72 104089,225 104090,72 104091,48 104092,6682 104093,104094 104095,72 104097,72 104098,557 104099,557 104100,557 104101,3148 104102,503 104103,2923 104104,4903 104105,770 104106,30 104107,151 104107,1293 104108,673 104109,349 104110,323 104111,30 104112,862 104112,1010 104113,358 104114,30 104115,3260 104116,949 104118,483 104119,433 104120,104121 104122,4594 104123,10 104124,72 104126,10 104127,104128 104129,366 104131,298 104132,485 104133,250 104133,1684 104134,376 104135,20 104136,2083 104137,1782 104138,2116 104139,104140 104141,1572 104142,83 104143,805 104144,310 104145,298 104146,485 104147,3623 104148,72 104149,795 104150,298 104151,485 104153,72 104154,433 104155,104156 104157,2048 104158,104159 104160,30 104161,1033 104162,920 104163,104164 104165,104166 104167,149 104168,644 104169,455 104169,750 104169,1893 104170,1467 104171,104172 104173,577 104174,1 104175,862 104176,3623 104177,2434 104178,104179 104181,104182 104183,3041 104184,16196 104185,252 104185,1220 104185,1222 104186,310 104188,602 104188,994 104188,2931 104189,104190 104191,63 104192,21944 104193,104194 104195,118 104195,4597 104196,104197 104198,366 104198,859 104199,30 104200,2590 104201,406 104202,372 104203,2697 104204,1058 104205,118 104205,4597 104207,1201 104208,1046 104209,290 104209,4193 104209,8270 104210,1188 104211,1332 104212,151 104213,72 104214,72 104215,72 104216,872 104217,1429 104218,1181 104219,3474 104219,84257 104220,72 104221,310 104222,137 104223,668 104224,1188 104225,694 104225,1659 104226,1102 104228,1019 104228,2051 104228,3474 104230,72 104233,104234 104236,292 104237,104238 104240,207 104241,72 104242,439 104243,1 104244,2626 104245,390 104246,206 104247,3623 104248,676 104250,433 104251,298 104252,485 104253,1284 104254,2697 104255,289 104255,290 104256,850 104257,694 104257,1659 104258,872 104259,1893 104260,298 104261,485 104262,3769 104263,1541 104264,22 104264,1467 104264,2784 104265,233 104266,868 104267,1143 104268,1985 104269,72 104270,1096 104271,104272 104273,9024 104274,298 104274,305 104274,628 104278,93 104278,94 104279,298 104280,485 104281,875 104282,137 104283,310 104284,298 104285,485 104286,875 104287,652 104288,1623 104289,1252 104289,1253 104291,3623 104292,3413 104293,104294 104295,3623 104296,298 104297,485 104300,2775 104301,447 104302,104303 104304,527 104305,1181 104306,8270 104307,355 104308,1893 104309,298 104310,485 104311,48 104313,3623 104314,1265 104314,1266 104315,104316 104317,56 104319,104320 104321,1 104321,209 104321,779 104321,4237 104322,3623 104323,222 104323,535 104323,1293 104323,2421 104323,75912 104324,1238 104325,3724 104326,206 104327,337 104328,104329 104330,1359 104331,640 104332,1707 104333,1707 104334,137 104335,640 104336,37414 104338,1893 104339,160 104339,473 104339,567 104339,663 104339,712 104339,1147 104339,1429 104339,1579 104339,1612 104339,2605 104339,2668 104339,3967 104339,4678 104340,302 104342,273 104343,298 104344,485 104345,1462 104345,8537 104346,972 104347,671 104348,72 104349,3623 104350,1284 104351,602 104352,422 104353,422 104354,693 104355,34 104355,35 104356,298 104357,485 104358,620 104359,264 104359,1893 104360,298 104361,485 104362,422 104363,422 104365,422 104367,422 104368,422 104369,422 104370,422 104371,422 104372,422 104373,422 104374,422 104375,298 104376,485 104377,422 104379,310 104380,712 104381,1659 104382,104383 104384,991 104386,1983 104387,399 104387,781 104387,1052 104388,994 104389,1955 104391,868 104392,6303 104393,158 104394,111 104394,290 104394,309 104394,310 104394,111142 104395,422 104396,56 104397,392 104398,2620 104399,104400 104402,147 104403,809 104404,202 104404,203 104405,58 104406,1559 104410,1298 104411,273 104411,1052 104412,2334 104413,406 104414,1390 104415,302 104416,192 104419,7270 104420,1572 104421,5213 104422,83 104423,298 104424,485 104426,202 104426,203 104428,79 104429,302 104429,2116 104430,6556 104431,298 104432,485 104433,3209 104434,104435 104436,500 104437,58 104438,994 104439,46 104440,75912 104441,298 104442,485 104443,344 104444,298 104445,485 104446,941 104447,1634 104448,2812 104449,349 104450,147 104451,247 104452,1289 104454,346 104455,703 104456,151 104456,586 104458,861 104459,1181 104460,252 104460,1659 104460,3331 104461,493 104462,657 104463,302 104463,861 104463,1374 104464,657 104466,104467 104468,1052 104469,1359 104470,151 104471,579 104472,192 104472,663 104473,644 104473,1836 104473,13361 104474,660 104474,3695 104474,19010 104475,628 104476,1 104477,2590 104478,217 104478,8270 104479,1181 104479,1515 104480,9195 104481,392 104482,1893 104483,4903 104483,13136 104484,515 104484,1052 104484,49057 104485,310 104486,272 104487,483 104488,269 104489,2506 104490,918 104490,1010 104492,1370 104493,2506 104496,58 104498,1191 104499,481 104500,690 104501,5405 104502,302 104503,1096 104504,392 104505,862 104506,3507 104507,301 104507,623 104508,515 104509,206 104510,14366 104511,7092 104515,104516 104517,8270 104518,657 104519,175 104520,298 104521,805 104523,779 104524,1181 104525,1323 104526,102 104527,1326 104528,3623 104529,298 104530,485 104531,2797 104532,3623 104533,3623 104534,1370 104534,14989 104535,1143 104536,440 104536,1085 104536,1796 104537,63 104537,1949 104538,775 104539,1130 104539,1844 104539,204124 104540,392 104541,1368 104541,1715 104541,1962 104543,682 104543,72439 104544,493 104545,104546 104547,1058 104548,1707 104550,1858 104551,1860 104552,4078 104553,1572 104554,3623 104555,225 104555,248 104555,1962 104555,8180 104555,28203 104556,6638 104557,392 104558,240 104559,907 104560,1118 104560,1284 104561,3260 104562,7360 104563,302 104564,75912 104565,390 104565,415 104565,623 104565,1070 104565,1140 104565,1805 104565,1860 104565,3367 104565,4760 104565,5591 104565,26041 104567,1192 104568,779 104569,440 104570,657 104571,602 104572,1801 104575,1359 104576,41 104577,1836 104578,192 104579,3069 104580,15573 104581,211 104582,2266 104584,3623 104585,1309 104586,65 104587,4611 104588,1544 104589,907 104590,107 104590,200 104590,227 104590,240 104590,372 104590,442 104590,714 104590,805 104590,1962 104590,4237 104592,1001 104592,4771 104592,162599 104593,1590 104594,104595 104596,171 104597,801 104599,376 104600,885 104600,13704 104601,2506 104602,360 104603,30 104604,1359 104605,252 104605,314 104605,1220 104605,1222 104606,104607 104608,1359 104609,298 104610,485 104611,104612 104613,195 104614,104 104615,3623 104616,389 104617,298 104618,485 104619,298 104620,485 104621,805 104622,5213 104623,301 104625,1052 104625,2312 104625,6695 104626,195 104626,301 104626,332 104626,430 104626,1001 104626,1235 104626,1335 104627,862 104627,1434 104628,779 104629,202 104629,203 104630,309 104630,310 104630,483 104630,1119 104630,1807 104630,1888 104630,6556 104630,193486 104632,390 104633,1381 104633,1551 104634,6323 104635,104636 104637,609 104637,55849 104638,779 104639,17334 104640,45023 104641,52270 104642,104643 104644,9560 104645,68467 104646,27356 104647,10 104648,392 104649,652 104650,1235 104650,1335 104651,1033 104652,2266 104654,20771 104655,588 104655,590 104656,3 104658,1984 104661,43203 104662,72 104663,4504 104664,1132 104665,781 104667,104 104668,104669 104670,30 104671,2989 104671,2991 104672,809 104674,30 104675,55849 104676,920 104677,104678 104679,389 104679,588 104679,590 104679,1531 104680,30331 104681,273 104682,1117 104683,850 104685,104686 104687,104686 104688,104686 104689,298 104690,485 104691,222 104692,376 104693,55849 104694,55849 104695,104696 104697,515 104698,2210 104698,4237 104699,255 104700,248 104700,5405 104701,8719 104702,138 104703,865 104704,557 104705,388 104706,137 104707,118 104707,4597 104708,88820 104709,21944 104710,557 104711,557 104712,557 104713,137 104714,104715 104716,261 104717,184 104718,10 104719,657 104721,1789 104723,2421 104724,55849 104725,222 104727,682 104727,72439 104728,104729 104730,77 104731,72 104732,83 104733,104734 104735,49887 104736,264 104736,736 104737,406 104739,118 104739,4597 104740,298 104741,485 104742,30 104743,483 104744,332 104745,1564 104745,3094 104746,356 104747,346 104748,932 104749,30 104750,6323 104751,1572 104752,222 104753,104754 104755,104756 104757,298 104758,485 104759,779 104760,1243 104761,104762 104761,107150 104761,253566 104761,261694 104761,264156 104763,10 104764,9323 104765,2719 104765,104766 104767,30 104768,7360 104769,10 104770,1368 104771,206 104773,104774 104775,104776 104777,1359 104778,192 104778,6119 104779,310 104780,805 104781,2506 104782,195 104783,1085 104784,1326 104785,1353 104787,1860 104788,104789 104790,32 104790,392 104790,697 104791,104792 104793,104794 104795,18726 104796,163 104797,1776 104798,10 104799,207 104800,104801 104802,104801 104803,104801 104804,104801 104806,104807 104808,225 104809,8884 104811,1085 104813,925 104814,1085 104816,779 104817,9195 104818,420 104819,30 104820,34 104820,35 104820,58 104820,111 104820,158 104820,192 104820,264 104820,289 104820,290 104820,312 104820,333 104820,406 104820,422 104820,479 104820,585 104820,620 104820,872 104820,1007 104820,1078 104820,1085 104820,1140 104820,1151 104820,1181 104820,1210 104820,1453 104820,1659 104820,1749 104820,1893 104820,2073 104820,2782 104820,2931 104820,3695 104820,3876 104820,5265 104820,8180 104820,8270 104820,8788 104820,8907 104821,1181 104824,1274 104825,240 104826,2590 104827,104828 104829,32475 104830,147 104830,1462 104831,7124 104832,8855 104835,1 104836,65 104836,255 104836,292 104836,315 104836,390 104836,592 104836,675 104836,918 104836,1010 104836,1363 104836,1414 104836,4252 104837,366 104838,2697 104839,7124 104840,953 104841,3370 104841,31896 104842,439 104844,151 104846,271 104847,187 104848,104849 104850,233 104851,104852 104853,693 104853,14366 104853,14483 104854,310 104856,72 104857,1305 104858,32475 104859,20359 104860,79 104861,515 104861,1085 104862,7155 104863,1070 104865,104866 104867,104868 104869,355 104870,809 104871,671 104872,72 104874,994 104875,83 104876,586 104877,310 104877,406 104878,2116 104878,4453 104878,6303 104879,104880 104882,1046 104883,188 104884,875 104885,843 104886,422 104888,3260 104889,83 104890,1436 104891,8180 104892,525 104893,366 104894,3161 104895,1564 104896,1181 104897,1072 104898,500 104899,366 104900,104901 104902,195 104905,104904 104906,104907 104908,310 104909,491 104910,104911 104913,586 104913,21944 104916,3804 104918,718 104919,809 104919,868 104920,422 104921,56 104922,55849 104923,805 104924,805 104925,310 104926,147 104926,158 104926,336 104926,406 104926,1425 104926,1803 104926,16083 104926,26234 104926,80266 104926,102560 104926,103852 104926,116651 104926,118336 104926,126767 104926,126769 104926,126772 104926,126926 104926,126930 104926,126988 104926,126990 104926,126998 104926,127203 104926,127204 104926,127278 104926,127280 104926,127283 104926,127290 104926,127324 104926,127332 104926,127703 104926,128223 104926,128228 104926,128282 104926,128294 104926,128344 104926,128810 104926,128937 104926,240174 104927,3 104927,1012 104927,1177 104927,1564 104927,3094 104928,104929 104928,105907 104928,113864 104928,116378 104930,1359 104931,850 104932,481 104933,104934 104935,626 104936,3538 104937,104938 104939,333 104940,875 104941,3161 104942,104943 104944,87 104945,290 104945,4193 104945,8270 104946,45960 104947,7360 104948,68 104949,225 104950,1 104951,682 104951,72439 104951,94409 104952,8907 104953,626 104954,104955 104956,118 104956,4597 104958,9457 104959,8270 104962,310 104963,805 104964,104965 104966,119 104966,192 104966,309 104966,310 104966,577 104966,1400 104966,21944 104967,118 104967,4597 104969,626 104970,273 104971,2784 104972,310 104973,3069 104974,346 104976,346 104977,200 104978,292 104979,605 104981,2590 104982,104983 104984,10 104985,346 104986,1019 104987,160 104988,107 104988,137 104988,346 104988,720 104988,1119 104988,1177 104988,2210 104988,2668 104988,4237 104988,182162 104989,3 104990,8270 104991,32 104992,104993 104994,1479 104995,390 104996,298 104997,485 104998,104999 105000,18726 105001,290 105001,714 105001,1962 105001,2205 105001,2286 105001,3069 105001,33424 105003,72 105004,344 105005,285 105006,217 105006,240 105006,818 105007,1 105008,8270 105009,105010 105011,4691 105012,408 105013,347 105013,994 105015,6263 105017,269 105017,809 105017,1133 105017,4193 105018,105019 105021,2646 105022,1 105023,310 105024,1227 105024,86416 105025,105026 105028,137 105029,105030 105031,2379 105032,105033 105034,843 105035,151 105036,346 105037,104999 105038,151 105039,137 105040,3804 105041,387 105041,1912 105041,22071 105042,310 105043,30 105046,18726 105047,105048 105049,1181 105050,349 105051,35905 105052,97 105053,105054 105055,105056 105058,115 105058,118 105059,4039 105060,272 105061,203 105061,424 105061,479 105062,676 105064,4504 105065,104 105066,151 105068,8788 105069,45021 105070,45022 105071,9121 105072,3960 105073,24332 105074,17487 105075,105075 105076,105077 105078,105079 105080,693 105080,3370 105081,105082 105083,118 105083,4597 105084,8270 105085,1133 105086,105087 105088,105089 105090,105091 105094,105095 105097,273 105098,105099 105100,105101 105102,30 105103,118 105103,4597 105104,779 105105,107 105106,2416 105106,2417 105107,292 105108,338 105109,298 105111,1133 105112,3538 105113,105114 105115,105116 105117,233 105118,483 105119,30 105120,158 105121,376 105122,310 105123,105124 105125,406 105126,1977 105126,1978 105127,758 105128,503 105129,105130 105131,225 105132,328 105133,8270 105134,872 105135,355 105136,5366 105138,79 105140,332 105140,479 105141,8270 105142,310 105143,105144 105146,215 105147,137 105148,137 105149,9323 105150,406 105151,105152 105153,102 105154,105155 105156,932 105157,907 105157,932 105157,973 105157,1010 105157,1284 105157,1298 105157,1837 105157,1849 105157,2191 105159,105160 105161,105162 105163,1962 105164,1977 105164,1978 105165,1313 105166,4980 105167,30 105168,105169 105170,30 105171,2334 105172,7358 105172,7363 105175,1140 105175,3474 105175,5547 105176,105177 105178,713 105179,27356 105180,68467 105181,45023 105182,45023 105183,105184 105185,105186 105187,481 105188,1323 105189,102 105190,1326 105192,859 105192,9195 105193,88820 105195,841 105196,105197 105198,222 105199,105200 105201,3872 105202,87 105203,255 105204,1515 105205,7092 105206,1359 105207,2620 105208,644 105208,949 105208,1801 105208,4549 105210,211 105211,10 105212,3872 105213,292 105214,115 105214,118 105215,211 105216,862 105217,3161 105218,192 105219,973 105220,872 105221,760 105221,1149 105221,1631 105222,2266 105223,105224 105226,105227 105228,105229 105232,30 105233,2590 105235,920 105236,30 105237,105238 105239,346 105240,779 105241,44013 105242,1983 105243,1132 105244,781 105245,30 105246,105247 105248,30 105249,118 105249,4597 105250,483 105251,493 105252,527 105253,206 105254,292 105255,30 105257,2244 105258,30 105259,184 105259,1089 105259,1619 105259,1623 105260,676 105261,105262 105264,1181 105265,30 105266,30 105268,30 105269,3623 105270,2244 105271,6682 105273,779 105274,105275 105276,55849 105277,55849 105278,3623 105279,105280 105281,717 105283,2244 105284,55849 105285,55849 105288,105289 105290,3413 105291,872 105293,24505 105295,310 105296,1313 105297,376 105298,273 105299,105300 105302,105303 105305,298 105306,485 105307,105308 105309,105310 105311,81 105312,30 105313,439 105315,298 105316,485 105317,1467 105317,2266 105318,972 105319,366 105319,972 105320,1014 105321,393 105322,55849 105324,602 105325,31934 105326,602 105327,41 105327,1119 105328,640 105329,298 105330,485 105331,557 105332,862 105333,557 105334,557 105335,557 105336,5906 105337,557 105338,626 105339,278 105340,137 105341,862 105342,105343 105344,31977 105345,160 105346,219 105348,13538 105349,105350 105352,850 105353,105354 105357,5547 105358,7117 105359,1359 105360,366 105361,105362 105364,298 105365,485 105366,779 105367,1298 105368,118 105368,4597 105369,10 105370,105371 105372,602 105373,105374 105375,211 105376,292 105377,140 105378,433 105379,602 105380,422 105381,422 105382,422 105383,422 105384,422 105385,422 105386,422 105387,422 105388,422 105390,7124 105391,422 105393,640 105394,225 105395,2929 105396,417 105397,1893 105398,2744 105399,8822 105400,2146 105401,996 105402,3246 105403,175 105404,298 105405,779 105406,1181 105407,105408 105409,175 105410,298 105411,9018 105412,392 105413,24505 105414,1634 105416,2979 105418,105419 105421,105422 105423,1452 105424,105425 105427,151 105429,72764 105430,292 105431,19986 105432,294 105433,296 105434,298 105435,1238 105436,5976 105437,79 105438,346 105439,105440 105441,151 105443,178 105444,4192 105444,4193 105445,23701 105446,2334 105447,2371 105448,192 105449,23701 105450,1033 105451,72 105452,119 105453,1634 105454,105455 105456,9560 105457,671 105458,105459 105460,233 105461,422 105462,56 105463,5103 105464,298 105465,485 105466,298 105467,485 105468,298 105469,485 105470,1939 105470,14453 105471,30 105472,338 105473,602 105474,105475 105476,1 105478,310 105479,1238 105479,1653 105480,1132 105481,781 105482,105483 105485,403 105486,1801 105487,3297 105488,406 105490,355 105491,79 105491,9457 105492,2116 105494,586 105495,668 105496,1085 105496,75912 105497,273 105499,868 105500,611 105501,310 105502,809 105503,72 105505,151 105506,493 105507,105508 105509,338 105510,422 105511,56 105512,811 105513,579 105514,3413 105515,868 105517,850 105519,868 105520,571 105521,27041 105521,37414 105522,640 105523,640 105524,344 105525,2557 105529,1688 105530,3804 105532,972 105532,1122 105532,1298 105533,640 105534,255 105535,1623 105536,22 105537,105538 105539,657 105540,358 105541,105541 105542,79 105543,953 105544,2697 105545,1070 105546,298 105547,485 105548,192 105549,779 105550,749 105551,861 105552,1118 105554,105555 105556,1782 105557,1634 105558,298 105559,485 105560,2574 105562,2146 105563,714 105563,1085 105563,2286 105564,149 105564,1776 105566,97 105568,30331 105569,687 105569,2073 105570,1556 105571,326 105571,702 105572,2646 105573,5405 105574,9030 105575,481 105576,254 105576,557 105576,954 105576,1939 105576,10318 105577,158 105578,1644 105579,447 105580,5405 105581,332 105581,644 105582,326 105582,356 105582,775 105582,1127 105582,1143 105582,2210 105582,3623 105582,4237 105583,1224 105585,1118 105587,1531 105588,160 105589,850 105590,2146 105591,1368 105592,663 105594,217 105595,192 105595,1893 105596,14719 105597,493 105599,83 105600,16196 105601,209 105602,392 105603,392 105604,1105 105604,193578 105605,675 105605,1058 105605,1298 105606,1749 105607,17487 105608,27356 105609,8907 105610,264 105611,406 105612,149 105613,356 105615,1836 105615,3538 105616,63 105617,447 105617,1590 105618,4611 105619,1544 105621,1390 105622,417 105623,4611 105624,1544 105625,1515 105626,5547 105627,676 105629,4611 105630,24332 105631,1544 105632,640 105632,1284 105633,298 105634,485 105635,298 105636,485 105637,30 105638,171 105639,433 105641,136 105641,5405 105642,1479 105643,718 105644,980 105645,312 105646,441 105647,861 105648,4611 105649,1544 105650,5213 105652,302 105653,2646 105654,240 105655,811 105657,255 105659,779 105660,352 105660,1172 105661,147 105662,718 105663,929 105665,1289 105666,758 105667,3623 105668,392 105669,536 105670,278 105671,3623 105672,1130 105672,4260 105673,544 105674,818 105676,187 105677,1634 105678,10 105678,3297 105679,1718 105680,1462 105680,8537 105681,1983 105682,718 105683,1659 105685,105684 105685,118305 105686,852 105686,1740 105688,1608 105690,140 105691,2089 105691,2940 105691,21944 105692,285 105692,1127 105693,1608 105694,3623 105696,105697 105698,269 105699,718 105700,1133 105701,217 105702,718 105703,718 105704,56 105704,192 105704,602 105705,1509 105706,713 105707,3623 105708,4548 105709,147 105710,3623 105711,1983 105712,3623 105713,433 105714,663 105715,8270 105716,392 105717,2274 105719,536 105720,209 105720,302 105722,1801 105723,356 105724,105725 105726,557 105726,859 105726,2191 105727,2244 105728,431 105729,79 105729,4453 105731,1298 105731,1326 105732,1085 105733,66 105733,252 105733,314 105733,467 105733,868 105733,1140 105734,217 105734,1370 105735,298 105736,485 105737,861 105738,87 105738,1235 105738,1335 105740,1564 105742,304 105743,907 105743,1001 105745,417 105746,663 105748,1235 105748,1335 105749,3623 105752,1 105753,30 105754,1368 105755,3209 105756,105757 105758,588 105758,590 105759,1655 105760,1515 105761,175 105762,298 105763,106 105764,184 105765,58 105765,1082 105766,2266 105767,147 105768,171 105769,973 105771,298 105772,485 105773,489 105774,1425 105775,1801 105776,852 105777,850 105778,105779 105780,972 105780,1284 105780,1298 105781,34 105781,35 105782,1467 105783,302 105783,420 105783,1414 105783,1466 105784,809 105784,893 105784,3769 105785,3260 105786,1175 105787,893 105788,158 105789,2989 105789,2991 105790,442 105791,1608 105792,105793 105794,310 105795,298 105796,485 105797,805 105798,72 105799,72 105800,2351 105801,422 105802,56 105803,30 105803,200 105803,5405 105804,15573 105805,994 105806,192 105807,87312 105807,153007 105808,6789 105809,72 105810,1282 105810,4571 105810,88820 105810,105811 105811,588 105811,590 105811,994 105811,1282 105811,4571 105811,88820 105812,2719 105813,184 105813,2224 105813,2244 105813,21826 105815,3370 105815,3447 105815,14453 105816,4611 105818,136 105819,72 105820,2073 105823,483 105824,852 105826,994 105827,1274 105828,136 105829,602 105830,72 105831,217 105832,105833 105834,275 105834,954 105834,72439 105835,83 105836,30 105837,105838 105839,557 105840,175 105841,1116 105842,1265 105842,1266 105843,105843 105844,298 105845,136 105846,875 105847,105848 105849,671 105850,105851 105852,160 105854,195 105855,105856 105855,106821 105855,108262 105857,358 105858,10 105859,105860 105861,3003 105862,6387 105863,481 105864,809 105866,1707 105867,875 105869,581 105870,184 105872,527 105873,3209 105874,602 105875,6387 105876,2995 105877,3161 105878,636 105879,298 105880,4177 105881,247 105882,195 105883,3960 105884,254 105885,1309 105886,54284 105887,3 105888,79 105889,8788 105890,83 105892,302 105892,2116 105893,8992 105894,298 105895,485 105896,1151 105897,13 105898,392 105899,273 105900,2116 105902,1012 105903,557 105904,30 105905,557 105906,10 105906,67343 105908,105907 105909,72 105910,346 105911,105912 105913,431 105913,784 105914,158 105914,333 105915,602 105916,346 105916,2590 105917,2626 105918,105919 105920,105921 105922,577 105923,602 105924,862 105925,1506 105926,8270 105927,4611 105928,450 105929,83 105930,5301 105931,272 105932,269 105933,261 105934,4611 105935,105936 105937,105938 105939,1707 105940,310 105941,442 105941,1368 105941,3474 105944,23701 105945,602 105946,298 105947,485 105948,4101 105949,34 105949,35 105949,2784 105950,255 105951,72 105952,10 105953,1402 105954,72 105956,298 105957,485 105958,376 105959,422 105960,422 105961,422 105962,422 105963,2590 105964,422 105965,422 105966,422 105967,422 105968,105969 105970,346 105972,207 105974,1634 105975,105976 105977,872 105978,1429 105979,668 105980,1087 105981,1891 105982,422 105983,422 105984,1127 105985,422 105986,105987 105988,105989 105991,72 105993,105994 105995,3623 105996,55849 105997,105998 105999,2315 106000,1143 106001,202 106002,14453 106004,37 106004,63 106004,447 106004,493 106004,1512 106004,1740 106004,1821 106004,5992 106005,1983 106006,106007 106008,422 106009,106010 106011,4545 106011,106012 106011,139010 106013,126 106014,106015 106014,108478 106014,125155 106014,125687 106016,422 106017,1467 106018,72 106019,23011 106020,346 106021,862 106022,843 106023,175 106024,1871 106025,298 106026,602 106027,2590 106028,13980 106030,376 106031,2671 106032,1634 106033,106034 106035,118 106035,4597 106036,106037 106038,72 106039,1436 106040,7358 106040,7363 106041,77 106042,72 106043,72 106044,217 106045,106046 106047,106048 106049,146 106050,388 106051,4453 106052,58 106053,106054 106055,2424 106056,1634 106057,118 106057,4597 106058,118 106058,333 106059,28072 106060,106061 106062,1571 106064,9015 106065,106066 106065,106671 106067,585 106068,171 106069,1130 106071,693 106072,106073 106072,108324 106074,366 106075,3260 106076,718 106077,233 106078,106079 106080,298 106081,485 106082,273 106083,1127 106083,1590 106083,2353 106084,175 106085,298 106087,515 106087,4039 106087,68069 106088,2244 106090,503 106091,104 106092,2353 106093,2266 106094,872 106095,355 106096,358 106097,106098 106097,157231 106099,195 106100,151 106100,5440 106101,15573 106102,536 106102,33424 106103,4475 106104,222 106104,536 106104,18831 106105,3177 106107,298 106108,485 106109,515 106109,1381 106110,1983 106111,32 106112,222 106112,455 106112,1019 106113,309 106113,310 106115,298 106116,485 106117,219 106118,106119 106120,310 106121,875 106122,106123 106124,72 106125,344 106126,285 106127,1140 106129,219 106130,134 106131,949 106132,647 106133,344 106134,1556 106135,207 106137,30 106138,647 106139,3695 106140,6837 106141,269 106143,431 106144,1983 106145,1379 106146,481 106147,75912 106148,2353 106149,968 106150,647 106151,344 106152,596 106154,4611 106155,1544 106158,1479 106159,1983 106160,647 106161,344 106162,106163 106165,178 106166,1181 106167,206 106168,111 106168,273 106168,652 106169,195 106170,280 106170,17245 106171,134 106172,8822 106173,704 106174,79 106175,1326 106175,5547 106176,1167 106176,1204 106176,1319 106176,1544 106177,417 106178,779 106179,483 106180,3 106180,251 106180,3003 106181,1858 106182,1860 106183,875 106185,3623 106186,30 106188,2867 106188,2868 106190,1326 106191,8180 106192,805 106193,3623 106194,10 106194,1608 106198,2995 106199,652 106200,72 106200,94 106201,843 106202,30 106203,338 106203,392 106203,918 106203,3260 106205,500 106206,3623 106207,30 106209,3623 106210,1181 106211,941 106212,1722 106214,1285 106214,2620 106215,83 106216,3623 106217,1801 106218,259 106218,336 106219,872 106220,1014 106221,1179 106222,1285 106223,497 106224,1285 106225,269 106225,1684 106226,1509 106228,872 106229,1285 106230,467 106231,393 106232,3623 106233,310 106234,41 106234,1285 106235,647 106236,344 106237,3538 106238,527 106240,106241 106242,483 106242,232766 106244,440 106245,1285 106246,536 106246,2979 106246,3804 106247,211 106247,4078 106247,7124 106248,146 106249,1453 106250,818 106251,4039 106255,356 106255,852 106255,1801 106255,5591 106256,195 106257,184 106258,1983 106259,20 106259,707 106259,713 106260,872 106261,685 106262,106263 106264,1151 106265,861 106266,1326 106267,615 106268,195 106268,640 106269,30 106270,195 106271,1390 106272,34 106272,35 106273,102 106274,79 106274,192 106274,392 106274,1177 106274,1400 106274,1402 106274,2210 106275,1323 106277,106278 106279,17228 106280,17334 106281,83 106282,3960 106283,2574 106284,106285 106286,1983 106287,647 106288,344 106289,2506 106290,403 106291,3623 106293,1243 106294,3623 106295,875 106296,1132 106297,781 106298,326 106299,760 106300,366 106300,640 106303,1977 106303,1978 106305,440 106306,146 106306,106502 106307,106307 106308,1419 106311,726 106312,2460 106313,1983 106314,79 106315,949 106316,206 106317,79 106319,843 106320,26041 106321,79 106322,861 106323,647 106324,344 106325,3623 106327,435 106328,175 106329,240 106330,298 106332,1243 106333,663 106334,32 106335,207 106336,3138 106337,7757 106338,171 106342,106343 106344,106345 106346,3623 106347,94409 106349,2353 106350,106351 106354,843 106355,704 106357,356 106358,163 106358,305 106358,489 106358,1132 106359,298 106360,485 106361,1332 106361,1844 106362,3623 106363,760 106364,1127 106365,301 106365,615 106366,30 106368,503 106369,720 106370,3623 106371,760 106372,106373 106374,301 106374,372 106374,907 106374,968 106374,1544 106374,1837 106374,1955 106374,2620 106376,68 106377,671 106377,1590 106377,1644 106377,1776 106377,33298 106378,30 106379,3623 106380,2334 106381,1257 106383,289 106383,290 106383,1274 106384,30 106386,485 106388,23783 106389,23783 106390,3623 106391,907 106392,1415 106393,30 106394,106395 106397,106398 106399,106400 106399,110005 106401,23783 106402,1631 106403,326 106405,63 106405,202 106405,203 106405,251 106405,252 106405,516 106405,663 106405,1243 106405,1512 106405,1927 106405,5992 106405,17772 106406,3623 106407,30 106408,1955 106409,1151 106410,6051 106411,3623 106412,72 106413,23783 106414,1289 106415,298 106416,485 106417,289 106417,290 106418,1509 106419,1639 106419,3695 106421,994 106423,72 106424,344 106425,285 106426,366 106427,106428 106429,30 106430,140 106430,264 106431,862 106432,1462 106432,8537 106433,1639 106434,422 106435,30 106436,10 106438,1016 106440,2775 106441,447 106442,111 106443,215 106444,285 106445,596 106446,106447 106448,571 106448,868 106449,1016 106450,827 106451,44013 106452,5976 106453,1332 106454,217 106455,44 106456,2867 106456,2868 106457,3447 106458,2146 106459,126 106460,4066 106461,3413 106462,3161 106463,1313 106464,874 106465,192 106466,1939 106467,10 106468,676 106469,1381 106470,1265 106470,1266 106471,3209 106472,859 106473,332 106474,225 106475,3148 106476,5405 106477,2797 106478,158 106479,1572 106480,346 106481,333 106482,2931 106483,30 106484,8270 106485,2697 106486,1102 106487,302 106488,1414 106489,1001 106490,3804 106491,1579 106492,1955 106492,66500 106493,3 106494,206 106495,422 106496,56 106497,717 106498,2867 106498,2868 106499,707 106499,156379 106501,58 106503,211 106505,195 106506,106507 106508,1220 106508,1222 106509,252 106510,251 106511,240 106512,106513 106515,136 106516,175 106517,68 106518,298 106519,1381 106520,1235 106520,1335 106520,21944 106522,994 106523,106524 106525,305 106526,557 106527,1893 106528,106529 106530,3507 106532,106533 106534,2574 106535,255 106536,41 106537,30 106539,376 106540,30 106541,483 106542,30 106543,217 106544,255 106545,875 106546,255 106547,267 106548,140 106549,255 106550,106551 106552,106552 106553,79 106554,1132 106555,781 106556,467 106557,557 106558,106559 106560,557 106561,1140 106562,106563 106564,106565 106566,30 106567,631 106568,184 106569,1983 106570,1 106571,557 106572,875 106573,72 106574,344 106575,285 106576,106577 106578,323 106579,289 106579,290 106580,106581 106582,310 106583,106584 106585,255 106586,1332 106587,647 106588,344 106589,106590 106591,106592 106593,1033 106594,30 106595,1298 106596,44 106597,972 106598,30 106599,106600 106601,275 106604,3623 106605,298 106606,485 106607,134 106607,138 106607,5694 106608,106608 106609,1509 106610,207 106611,298 106612,485 106613,68 106614,106615 106616,358 106617,2797 106618,1893 106619,704 106620,4611 106621,4611 106622,192 106622,602 106623,250 106623,1684 106624,280 106624,17245 106625,106626 106627,2173 106627,19413 106629,392 106630,3623 106632,647 106633,344 106634,1235 106634,1335 106636,493 106638,106639 106638,118697 106640,106641 106642,602 106643,2116 106645,1556 106646,106647 106649,841 106650,577 106652,323 106653,10 106654,636 106655,106656 106655,108617 106655,109483 106655,111542 106655,123477 106655,123915 106655,124520 106655,125751 106655,125760 106655,125798 106655,131526 106655,150579 106657,252 106658,106659 106661,105912 106662,106663 106664,55849 106666,106667 106668,106669 106670,310 106672,106673 106674,195 106674,202 106674,203 106674,27217 106676,106677 106678,106679 106680,2590 106681,106682 106683,3623 106684,2590 106685,875 106686,32475 106687,17588 106688,178 106688,346 106689,68 106690,2995 106691,106692 106693,106692 106694,106692 106695,118 106695,4597 106697,207 106698,760 106699,1149 106700,8822 106701,106692 106703,392 106704,106705 106706,704 106707,626 106707,1881 106708,872 106709,1429 106710,106711 106712,184 106713,1001 106714,668 106715,1531 106716,586 106717,32 106719,106720 106722,233 106724,167 106725,1240 106726,527 106726,95152 106727,106728 106730,718 106731,338 106732,273 106733,106734 106735,78232 106736,106737 106738,207 106739,106740 106741,72 106742,30 106743,10 106744,106745 106746,366 106747,366 106748,298 106749,485 106750,366 106751,1220 106751,1222 106752,252 106753,251 106754,3623 106755,875 106756,106757 106758,1402 106759,682 106759,1353 106759,72439 106760,1860 106761,1572 106762,1118 106763,195 106764,1096 106765,717 106766,309 106766,310 106767,379 106767,1010 106768,366 106769,48 106769,254 106769,647 106770,106771 106772,298 106773,485 106774,518 106775,32 106775,1515 106775,141912 106776,422 106777,422 106778,422 106779,422 106780,422 106781,422 106782,312 106783,1132 106784,781 106785,344 106787,379 106787,2784 106788,30 106789,202 106789,203 106790,1132 106791,781 106792,422 106793,422 106794,1143 106796,1579 106796,1893 106796,3538 106797,106798 106799,106798 106800,356 106801,3507 106802,422 106803,422 106804,298 106805,485 106806,106807 106808,3623 106809,493 106810,31893 106810,110762 106811,1860 106813,657 106814,310 106815,843 106815,991 106815,992 106815,1014 106816,298 106817,485 106818,6119 106819,184 106819,602 106819,1515 106820,1118 106822,1132 106823,781 106824,79 106830,602 106833,22 106834,134 106834,135 106834,137 106834,138 106834,1415 106834,2638 106834,2675 106834,2775 106834,2804 106834,3247 106834,3678 106834,5694 106834,7938 106834,8049 106834,16235 106834,16717 106834,16966 106834,21795 106834,21867 106834,48188 106834,72021 106834,79314 106834,101440 106834,106835 106834,111223 106834,113501 106834,113735 106834,119924 106834,120010 106834,120965 106834,120966 106834,152199 106834,174393 106836,106837 106838,22 106839,349 106840,175 106841,77 106841,862 106842,106843 106842,117294 106844,72 106845,3623 106846,749 106847,30 106848,442 106849,3507 106850,1860 106852,106853 106854,1860 106855,1453 106856,1332 106857,1732 106858,1390 106859,4355 106860,3467 106861,3328 106862,3467 106863,1132 106864,781 106865,3623 106866,872 106867,1070 106867,6837 106869,3623 106870,304 106871,175 106873,422 106875,298 106876,626 106877,106878 106879,298 106880,485 106881,106882 106883,1858 106884,1860 106886,868 106887,259 106887,493 106888,1127 106889,83 106891,994 106893,147 106893,158 106894,1836 106895,106896 106895,114788 106895,123791 106895,139087 106895,151260 106897,920 106898,493 106899,66 106899,868 106901,872 106902,1019 106903,406 106904,1559 106905,366 106906,1276 106907,313 106908,493 106909,3 106910,7 106911,1247 106912,3623 106913,1132 106914,781 106915,503 106916,10 106917,252 106918,657 106919,483 106919,588 106919,590 106920,805 106921,3623 106922,3623 106923,579 106924,760 106925,1860 106926,338 106927,151 106927,1400 106927,2073 106928,1858 106930,1072 106931,360 106931,1127 106931,1893 106932,994 106933,215 106934,640 106935,3623 106936,3138 106937,126 106937,640 106938,957 106940,1983 106941,1623 106942,1045 106942,137589 106943,1977 106943,1978 106944,1983 106945,372 106945,1085 106946,1130 106947,1132 106948,781 106949,14366 106950,3 106950,230509 106950,230517 106951,450 106952,515 106953,450 106955,875 106956,30331 106957,1858 106958,1860 106959,140 106962,1323 106963,102 106964,1326 106965,1220 106965,1222 106966,252 106967,251 106968,45437 106969,622 106970,217 106970,272 106970,489 106970,1370 106970,1623 106972,602 106973,55849 106974,647 106975,344 106977,422 106978,56 106979,106980 106981,760 106983,272 106984,1474 106985,500 106985,2073 106986,999 106987,99 106988,358 106989,30 106992,518 106993,1243 106994,338 106994,1151 106996,298 106997,485 106998,30 106999,30 107000,1465 107002,30 107003,660 107004,1085 107005,21944 107006,247 107007,893 107008,89035 107010,298 107011,485 107012,107013 107015,10 107016,302 107017,1515 107018,206 107018,1326 107018,156379 107020,510 107021,1515 107022,79 107023,171 107025,356 107026,972 107027,388 107028,1019 107029,273 107030,406 107031,1515 107032,68069 107032,141912 107033,79 107034,158 107035,713 107036,107037 107038,22 107039,392 107041,843 107042,1370 107043,477 107043,32475 107044,779 107045,273 107046,647 107047,344 107048,360 107048,1893 107049,779 107049,1181 107049,68069 107050,3003 107051,68069 107051,141912 107052,302 107052,579 107053,818 107054,1181 107055,206 107057,240 107058,743 107058,8714 107059,843 107060,10 107061,843 107062,1556 107063,107064 107065,107064 107065,188227 107066,657 107067,1326 107069,3623 107070,563 107071,30 107072,151 107073,301 107073,615 107073,1293 107075,202 107075,203 107076,115 107076,118 107077,2436 107078,406 107079,644 107079,697 107080,217 107080,1417 107081,217 107081,1417 107082,3182 107083,775 107083,1619 107084,83 107084,304 107085,107086 107087,2315 107088,298 107089,485 107090,422 107091,56 107092,3623 107094,602 107095,30 107096,3 107096,372 107097,4101 107098,1707 107099,30 107100,34 107100,35 107100,313 107100,634 107100,1724 107100,2646 107100,115474 107101,718 107103,83 107104,726 107105,3623 107106,433 107107,2073 107108,493 107109,862 107109,1010 107110,30 107111,30 107112,151 107115,309 107115,310 107115,483 107116,433 107117,298 107118,485 107119,3623 107120,107121 107120,129340 107120,185161 107120,241521 107122,3623 107125,1113 107126,175 107127,3193 107128,298 107129,3623 107130,772 107131,30 107132,3003 107134,30 107135,557 107136,151 107137,577 107138,422 107139,56 107140,302 107140,1240 107140,1436 107140,1465 107141,415 107142,14126 107144,273 107145,107146 107147,146 107147,106502 107148,158 107149,3623 107151,1132 107152,781 107153,298 107154,485 107156,358 107157,1085 107157,1955 107158,107158 107159,298 107160,485 107161,1837 107162,72764 107163,104 107163,136 107163,254 107163,557 107163,953 107163,954 107163,1368 107163,1939 107163,10318 107164,107165 107167,222 107168,2779 107169,1467 107170,1132 107171,781 107172,1012 107172,1119 107172,1177 107173,557 107174,557 107175,3623 107176,298 107177,485 107178,693 107179,2116 107180,206 107181,192 107181,219 107181,240 107182,28072 107183,120 107183,273 107183,1052 107184,1132 107185,781 107186,3623 107187,1417 107188,872 107189,30 107191,1891 107192,107193 107194,217 107194,536 107194,1417 107195,107196 107197,862 107198,577 107199,222 107199,2266 107200,107201 107202,477 107203,1043 107204,310 107205,862 107206,273 107207,704 107208,718 107209,392 107210,1033 107211,1181 107213,376 107215,272 107215,4455 107216,1181 107217,175 107218,298 107219,1509 107220,422 107221,56 107222,298 107223,485 107224,298 107225,485 107226,3623 107227,107228 107229,107230 107231,192 107232,644 107233,392 107234,596 107235,2590 107236,298 107237,485 107239,37 107239,717 107240,2867 107240,2868 107241,32 107241,392 107242,406 107243,1181 107244,1452 107245,207 107246,862 107247,581 107248,10 107249,298 107250,485 107251,589 107253,872 107254,1429 107255,107256 107258,1265 107258,1266 107259,929 107260,668 107261,68 107262,309 107262,310 107262,483 107263,2367 107265,273 107266,1089 107266,107267 107269,1677 107270,22 107271,192 107272,602 107273,602 107274,107275 107276,37759 107277,107278 107279,338 107279,107548 107280,338 107281,1143 107282,30 107283,3623 107284,1241 107285,107286 107287,1085 107288,107289 107290,107289 107292,2266 107294,2590 107295,34 107295,202 107295,203 107295,1001 107295,1572 107295,3252 107295,7092 107296,107297 107298,557 107299,312 107299,358 107299,509 107300,3623 107301,1238 107302,779 107303,30 107304,72 107305,118 107305,4597 107306,175 107307,483 107308,298 107309,1452 107310,1871 107311,30 107312,107313 107316,107317 107318,107319 107320,255 107322,107323 107324,8991 107327,233 107328,481 107330,571 107332,1181 107333,107334 107335,1252 107335,1253 107336,355 107338,107339 107340,344 107342,99 107343,718 107344,388 107345,275 107346,310 107347,309 107347,310 107347,31976 107349,422 107350,56 107351,1454 107352,2178 107352,4545 107353,175 107354,590 107354,2178 107354,4545 107354,17245 107355,298 107356,222 107356,2266 107357,422 107360,422 107361,422 107362,422 107363,1204 107364,422 107365,422 107366,3538 107367,107368 107369,217 107369,278 107370,500 107371,602 107372,107373 107374,652 107375,151 107376,195 107376,285 107376,1515 107377,500 107377,1227 107377,86416 107378,30 107379,779 107379,1515 107379,92476 107379,106502 107380,1181 107381,30 107382,137 107383,340 107384,422 107385,697 107386,760 107387,4611 107388,1544 107389,811 107390,30 107391,137 107392,647 107393,344 107395,1181 107396,595 107397,72 107398,344 107399,285 107401,72 107402,344 107403,285 107404,3585 107404,9030 107407,1531 107408,372 107408,390 107409,72 107410,30 107411,671 107412,671 107413,1556 107414,919 107415,23783 107416,136 107416,137 107418,349 107419,1860 107422,336 107423,278 107423,141912 107425,861 107426,252 107427,302 107427,861 107428,589 107429,447 107430,30331 107431,392 107432,1467 107433,1821 107434,1580 107435,3623 107436,130 107437,1515 107438,1821 107439,795 107440,422 107441,3079 107442,46 107442,744 107442,775 107442,3422 107442,5662 107443,1132 107444,781 107445,83 107446,1400 107446,1612 107447,99807 107448,202 107448,203 107449,107450 107451,337 107452,356 107452,615 107452,968 107453,3623 107454,47 107454,2469 107455,219 107457,516 107458,222 107458,588 107458,590 107458,991 107458,1177 107458,8270 107458,182162 107459,592 107460,130 107460,1289 107461,3069 107462,417 107463,1181 107464,1955 107466,690 107467,801 107467,1033 107467,1160 107467,3474 107467,40566 107467,66297 107468,392 107468,697 107468,1363 107468,2699 107468,4903 107469,872 107469,150022 107470,107471 107472,3623 107473,3623 107474,7358 107474,7363 107475,2557 107476,292 107477,422 107478,1381 107480,4611 107481,1544 107482,1803 107483,264 107483,497 107483,1579 107483,3258 107483,13538 107484,30 107485,2116 107485,258973 107486,1323 107487,102 107488,1326 107489,2205 107489,2296 107489,33424 107490,1381 107491,2116 107492,920 107492,1782 107492,7092 107493,310 107494,622 107495,1580 107497,704 107498,137 107499,107500 107501,310 107503,287 107503,809 107504,795 107505,107506 107507,827 107508,636 107509,422 107510,422 107511,4611 107512,1544 107514,1821 107515,422 107516,872 107517,79 107518,1243 107519,4611 107520,1544 107521,567 107522,827 107523,872 107524,302 107525,151 107525,1891 107525,3585 107526,1893 107526,1968 107526,17346 107527,310 107529,406 107530,14650 107531,30 107532,481 107533,346 107534,518 107535,107536 107537,72 107538,261 107540,30 107541,1132 107542,781 107543,1390 107544,1235 107544,1335 107545,3623 107546,68069 107547,28072 107549,299 107550,2443 107551,1289 107551,1551 107552,22 107553,107554 107555,2443 107556,647 107557,344 107558,647 107559,344 107560,83 107563,72 107564,2353 107565,1860 107566,79 107567,30 107569,30 107570,107571 107572,32 107572,697 107572,809 107573,1782 107574,202 107574,203 107574,440 107574,631 107575,7124 107576,181063 107577,222 107578,240 107579,97 107580,217 107581,3623 107583,302 107584,4611 107585,1572 107587,4455 107588,50 107589,10 107590,107591 107595,3623 107596,83 107597,167 107598,222 107598,2266 107599,22 107600,690 107601,1644 107602,1805 107604,3623 107605,433 107606,30 107607,973 107608,209 107609,392 107609,772 107611,27621 107611,27623 107612,585 107613,10 107613,328 107613,704 107613,705 107613,134822 107614,439 107615,30 107617,30 107618,861 107619,1782 107620,107621 107622,3623 107623,13 107623,72 107624,2178 107624,4545 107625,107626 107627,1983 107628,1235 107628,1335 107629,440 107629,631 107630,563 107631,55077 107632,1179 107633,175 107634,298 107635,206 107636,30 107637,167 107638,252 107639,660 107643,151 107644,1033 107645,217 107647,417 107648,1177 107649,107650 107651,34 107651,35 107652,392 107653,4611 107654,1544 107655,102 107655,107 107655,207 107655,273 107655,1058 107655,1313 107655,2315 107655,4571 107655,6387 107655,13136 107655,30331 107656,2719 107657,3094 107658,146 107658,106502 107659,1381 107660,809 107661,72 107662,586 107662,920 107663,272 107663,435 107663,516 107663,1893 107664,107665 107666,422 107667,58 107668,994 107669,46 107670,75912 107671,406 107672,805 107673,557 107673,954 107674,107675 107676,577 107676,21944 107677,175 107678,298 107679,48 107680,4611 107681,1544 107684,4611 107685,557 107686,137 107687,310 107689,15 107690,2590 107691,195 107692,991 107693,750 107693,1849 107694,22 107694,861 107695,298 107696,485 107697,358 107698,4611 107699,1544 107700,149 107700,406 107701,107701 107702,2979 107703,422 107704,72 107705,1644 107706,30 107707,83 107708,298 107709,485 107710,2266 107711,2671 107712,609 107713,72 107714,422 107715,3623 107716,2073 107717,30 107718,107719 107718,129529 107720,536 107721,2116 107722,1639 107723,873 107724,1801 107725,433 107726,805 107727,31977 107728,850 107729,72 107730,390 107731,557 107732,557 107733,107734 107735,30 107736,1655 107737,577 107738,83 107739,527 107740,4594 107741,483 107742,805 107743,652 107744,30 107745,31977 107746,713 107747,310 107748,107749 107750,30 107751,202 107751,203 107752,79 107753,1707 107754,192 107755,2775 107756,447 107757,1238 107758,589 107758,775 107758,1001 107759,302 107759,861 107759,893 107759,1220 107759,1222 107759,2775 107760,2260 107761,261 107761,60576 107762,278 107762,1252 107762,1253 107763,2775 107764,447 107766,289 107766,290 107767,1782 107768,2797 107769,2590 107770,862 107771,30 107771,772 107771,3623 107772,298 107773,485 107775,861 107776,3623 107777,1381 107778,330 107778,1313 107779,207 107780,206 107781,294 107782,30 107783,4611 107784,1544 107785,6252 107786,389 107787,872 107788,1429 107789,20 107790,346 107791,107792 107793,644 107794,4101 107795,1285 107795,3328 107796,668 107797,255 107798,298 107799,485 107800,261 107800,333 107801,1177 107801,4237 107801,182162 107802,557 107803,1566 107804,107805 107806,184 107807,178 107807,222 107807,1289 107807,2671 107807,4545 107807,6298 107807,56150 107807,139010 107808,1143 107809,779 107810,1238 107811,107812 107811,108443 107813,107814 107815,107816 107817,1590 107818,147 107818,2867 107818,2868 107819,30 107820,433 107821,107822 107823,2506 107824,72 107825,4611 107826,1544 107827,1235 107827,1335 107828,310 107829,30 107830,850 107831,310 107832,30 107833,1566 107834,30 107835,83 107836,310 107838,392 107839,107840 107841,72 107842,14453 107843,248 107844,843 107845,107846 107847,147 107848,376 107849,1 107850,310 107851,37759 107852,72 107853,72 107854,2244 107855,72 107856,10 107857,72 107858,805 107859,310 107861,107862 107863,1983 107864,107865 107864,116939 107864,123450 107864,123552 107866,107867 107869,872 107870,72 107871,107872 107873,2929 107874,107875 107876,107877 107878,392 107879,255 107880,107881 107882,2617 107883,107881 107884,3623 107886,75912 107887,1132 107888,781 107889,455 107890,192 107890,309 107890,310 107891,3623 107892,1132 107893,781 107894,827 107895,233 107896,72 107897,8270 107898,83 107899,298 107900,485 107901,192 107902,107903 107904,107903 107905,1417 107907,1282 107908,273 107909,4611 107910,1544 107912,4611 107913,1544 107914,4220 107915,184 107916,65 107918,1707 107919,2173 107920,1127 107921,298 107922,485 107924,811 107925,433 107926,20 107927,3623 107928,107928 107929,355 107930,861 107931,22 107932,861 107933,22 107934,2699 107935,1132 107936,781 107937,273 107937,313 107938,4611 107939,1544 107940,1132 107941,781 107942,3756 107943,107944 107945,315 107946,433 107947,44725 107948,483 107949,22 107950,861 107951,83 107952,647 107953,344 107954,222 107955,861 107956,22 107957,1607 107958,160 107960,2699 107961,1707 107961,13538 107962,68 107963,134 107964,107965 107967,20 107968,195 107968,332 107968,17228 107968,27217 107970,206 107971,3161 107972,135 107974,1449 107975,130 107975,718 107976,994 107977,779 107977,1803 107977,68069 107977,141912 107978,2699 107979,1619 107980,994 107980,2995 107981,81 107982,346 107984,690 107986,5591 107987,134 107988,1715 107989,3413 107990,178 107991,72 107992,663 107992,1265 107992,1266 107993,2699 107994,450 107995,1556 107996,23701 107997,48 107998,592 107999,222 107999,2266 108000,1 108000,130 108000,252 108000,340 108000,626 108000,647 108000,726 108000,827 108000,994 108000,1309 108000,1313 108000,2411 108000,3474 108000,21442 108001,302 108001,697 108001,1381 108001,1769 108001,19010 108003,298 108004,485 108005,79 108006,108007 108008,298 108009,485 108011,72 108012,7 108013,2779 108014,200 108015,298 108016,485 108017,433 108018,586 108019,994 108020,240 108020,2296 108021,433 108022,200 108022,1419 108023,1467 108024,611 108025,298 108026,485 108027,298 108028,485 108030,1132 108031,781 108033,994 108034,994 108035,1332 108036,6955 108037,1566 108039,714 108039,33424 108040,83 108042,252 108042,1220 108042,1222 108043,557 108044,298 108045,485 108046,1390 108047,611 108048,838 108048,1293 108049,861 108050,861 108051,22 108052,22 108053,108054 108055,273 108057,310 108058,676 108059,255 108060,1132 108061,781 108062,336 108062,868 108063,589 108064,108065 108067,171 108067,330 108068,1132 108069,781 108070,346 108071,163 108071,579 108071,893 108071,1556 108071,2674 108071,162599 108072,30 108074,704 108075,388 108076,206 108077,192 108077,1113 108078,171 108079,2411 108080,1287 108081,108082 108084,467 108086,17476 108087,272 108087,1332 108088,467 108089,1634 108090,1132 108091,781 108092,328 108093,1803 108094,108095 108096,718 108097,7360 108098,392 108102,1247 108102,164572 108103,30331 108104,3297 108105,3 108106,72 108107,310 108108,2867 108108,2868 108109,310 108110,1359 108111,1181 108113,79 108114,289 108114,290 108114,94134 108115,149 108116,397 108118,108119 108120,108119 108121,718 108122,3623 108123,372 108124,2626 108125,72 108126,602 108129,2260 108130,301 108130,304 108130,968 108131,240 108131,372 108131,1001 108132,579 108133,516 108134,1688 108135,217 108137,602 108138,779 108138,1052 108138,68069 108139,298 108140,485 108142,298 108143,485 108144,2506 108145,1707 108147,433 108148,985 108150,108151 108152,704 108153,328 108154,433 108155,602 108156,712 108157,298 108158,485 108161,22 108162,861 108163,328 108164,450 108165,1429 108165,1509 108166,137 108166,163 108166,349 108166,663 108166,968 108166,1572 108166,2750 108166,3612 108167,1983 108168,298 108169,485 108170,1287 108171,72 108172,483 108173,718 108174,41 108175,302 108175,2116 108176,41 108177,602 108178,2699 108180,108181 108182,298 108183,485 108184,298 108185,485 108186,433 108187,305 108188,34 108188,7652 108189,298 108190,485 108191,217 108192,108193 108194,346 108196,55849 108197,1515 108198,3623 108199,72 108200,30 108200,328 108201,657 108202,3623 108203,126 108204,298 108205,485 108207,55849 108209,108210 108211,19 108211,146 108211,743 108211,749 108211,106502 108212,3 108213,1309 108214,328 108215,175 108216,298 108217,1939 108218,108219 108220,108219 108221,55849 108222,72 108223,55849 108224,55849 108225,108226 108227,3623 108228,3872 108229,3193 108230,1556 108232,5591 108233,809 108234,8270 108235,298 108236,485 108237,9006 108238,13546 108239,2868 108239,3413 108240,1392 108241,2351 108242,108243 108244,8719 108245,138 108246,557 108247,137 108248,118 108248,4597 108249,21944 108251,865 108252,137 108253,557 108254,596 108254,843 108254,1801 108255,108256 108257,310 108258,151 108259,298 108260,485 108261,217 108263,10 108264,376 108265,557 108266,557 108267,557 108268,298 108269,485 108270,718 108271,298 108272,485 108273,68069 108273,141912 108274,510 108275,743 108275,1140 108275,130618 108276,108277 108278,718 108280,346 108281,79 108282,536 108282,2006 108282,2620 108282,3367 108282,44725 108284,298 108285,485 108286,298 108287,485 108288,215 108289,934 108290,527 108291,1773 108292,450 108293,108294 108295,7358 108295,7363 108296,20 108297,772 108298,72 108299,344 108301,285 108303,108304 108305,298 108306,485 108309,298 108310,485 108311,289 108311,290 108312,108313 108314,298 108315,485 108316,557 108317,5908 108318,310 108319,298 108320,485 108321,298 108322,485 108323,72 108325,6068 108326,309 108326,310 108327,298 108328,485 108329,298 108330,485 108331,72 108333,30 108334,2931 108335,72 108336,72 108338,636 108339,108340 108339,157792 108341,1939 108342,147 108342,1265 108342,1266 108343,108344 108345,628 108346,108347 108348,108349 108350,58 108351,1147 108352,108353 108354,108353 108355,108353 108356,108353 108357,108353 108358,72 108359,1235 108359,1247 108359,1335 108359,3148 108359,19031 108359,164572 108360,147 108361,21944 108362,779 108363,108364 108366,108367 108368,30 108369,7416 108371,225 108372,2146 108373,108374 108375,8884 108376,1085 108377,483 108378,2867 108378,2868 108379,10 108379,198 108379,1773 108379,108379 108379,206059 108379,221314 108380,872 108381,108382 108383,6027 108384,290 108384,2797 108385,2697 108386,30 108387,195 108388,3069 108390,481 108391,28072 108392,9195 108393,72 108394,72 108395,344 108396,285 108397,2915 108397,72439 108399,393 108400,108401 108400,113187 108400,113705 108402,366 108403,366 108404,366 108405,72 108406,417 108407,108408 108409,184 108410,4066 108411,355 108412,5547 108413,515 108414,640 108415,5366 108416,72 108417,206 108418,2605 108420,385 108421,1707 108422,108423 108424,30 108425,206 108427,366 108428,108429 108430,30 108431,30 108432,30 108433,718 108434,481 108435,2351 108436,298 108437,485 108439,83 108441,433 108442,65567 108444,718 108445,83 108446,346 108448,72 108449,344 108450,285 108451,1177 108452,1566 108453,108454 108455,1983 108456,3585 108457,108458 108459,72 108460,344 108461,285 108462,108463 108464,72 108465,479 108466,393 108467,805 108468,108469 108470,4597 108471,298 108472,485 108473,310 108474,805 108475,108476 108477,779 108477,68069 108477,141912 108479,30 108481,108482 108481,114936 108483,481 108484,30 108485,973 108485,1968 108486,106 108487,298 108488,485 108491,628 108491,1796 108493,5547 108494,108495 108494,133152 108497,108498 108499,1983 108499,111142 108500,202 108501,30 108502,30 108503,302 108504,261 108505,72 108506,72 108507,108508 108509,72 108510,344 108511,285 108512,240 108513,72 108515,72 108516,718 108518,108519 108520,72 108521,298 108522,485 108523,1984 108524,108525 108524,122698 108526,108527 108526,216019 108526,217160 108529,760 108530,108531 108532,72 108533,72 108534,72 108535,134 108536,72 108537,108538 108539,72 108540,346 108541,108542 108543,2083 108545,1608 108546,72 108547,108548 108549,346 108550,875 108551,72 108552,344 108553,285 108555,192 108555,44725 108556,108557 108559,83 108559,130 108559,1616 108559,8072 108560,108561 108562,108561 108563,30 108565,2334 108566,1353 108567,310 108569,2995 108570,206 108571,1847 108572,72 108573,9029 108574,3623 108575,108576 108577,7 108578,376 108579,640 108580,333 108581,1102 108582,652 108583,8788 108584,108585 108586,108587 108588,192 108588,3367 108589,108590 108591,2506 108592,118 108592,4597 108593,108594 108595,108596 108597,770 108598,2779 108599,298 108600,485 108601,779 108602,72 108603,4 108603,5 108604,1479 108605,30 108606,390 108607,4810 108608,2073 108609,779 108610,30 108611,72 108612,72 108613,72 108615,108616 108618,389 108619,273 108620,108621 108622,1556 108623,6323 108624,108625 108626,907 108626,7363 108627,1531 108628,1085 108629,108630 108631,108632 108633,1359 108634,287 108635,108636 108637,1402 108638,358 108639,30 108640,108641 108643,102 108644,30 108645,30 108646,108647 108648,366 108649,366 108650,392 108650,1151 108651,72 108652,72 108653,108654 108655,2995 108656,108657 108658,108657 108659,30 108660,108661 108662,108663 108664,30 108666,483 108667,108667 108668,671 108669,349 108671,108672 108673,108674 108675,83 108676,108677 108676,171675 108678,1634 108681,872 108683,32 108683,392 108683,697 108684,23783 108685,310 108686,3447 108687,3413 108688,8270 108689,206 108690,233 108691,108692 108693,108694 108695,557 108696,107 108697,292 108698,2416 108698,2417 108699,338 108700,298 108701,108702 108703,1133 108704,3538 108707,310 108708,108709 108710,30 108711,108712 108713,108714 108715,108716 108715,122826 108715,126240 108718,83 108719,355 108721,3804 108721,8270 108723,310 108724,108725 108726,298 108727,485 108731,9195 108732,1359 108733,1579 108733,1659 108734,255 108735,255 108736,255 108737,255 108738,13980 108739,481 108740,118 108740,4597 108741,71 108741,72 108741,485 108741,611 108741,1612 108741,255750 108742,240 108743,108744 108746,2506 108747,108748 108749,872 108750,872 108751,392 108752,255 108753,30 108754,509 108754,510 108754,872 108754,150022 108755,422 108756,422 108757,422 108758,422 108759,422 108760,422 108761,422 108762,422 108763,872 108764,422 108765,422 108766,422 108767,3538 108768,779 108769,108770 108772,108772 108773,108774 108775,941 108776,602 108777,255 108778,30 108779,108780 108781,1608 108782,483 108783,247 108784,269 108785,17228 108786,2699 108787,254 108787,557 108788,261 108790,273 108791,1326 108791,15573 108792,2506 108793,108794 108795,108794 108796,108797 108798,108799 108800,108801 108802,108803 108804,108805 108806,192 108806,222 108807,1414 108808,108809 108810,805 108811,108812 108813,108814 108815,68069 108817,108818 108819,850 108820,108821 108822,3079 108823,108824 108825,108826 108827,30 108828,850 108830,2224 108832,108833 108834,20 108834,408 108834,668 108834,1087 108834,1388 108835,30 108836,760 108836,1368 108837,310 108838,338 108839,108840 108841,310 108842,298 108843,485 108844,108844 108845,2506 108846,805 108847,718 108848,50 108849,108850 108851,108852 108853,81070 108854,298 108855,485 108856,108857 108858,81070 108859,1 108859,147 108859,158 108860,298 108861,485 108862,108863 108865,30 108866,713 108868,108869 108870,108871 108872,72 108873,310 108874,72 108875,72 108876,108877 108878,10 108879,1796 108880,108881 108882,108883 108884,108885 108886,30 108887,108888 108889,108890 108891,108890 108892,37 108892,717 108893,7698 108894,310 108895,108896 108897,602 108899,1955 108900,455 108900,2266 108901,406 108902,30 108903,1133 108905,79 108905,479 108905,1181 108905,1572 108906,108907 108908,1238 108909,108910 108911,1452 108912,292 108913,294 108914,296 108915,298 108916,872 108917,108918 108919,376 108920,333 108921,222 108922,120 108923,184 108925,108926 108927,187 108928,233 108929,2574 108930,108931 108932,30 108933,30 108934,30 108935,3161 108936,22 108936,108937 108938,108939 108938,139162 108941,108942 108943,108944 108945,108944 108946,1722 108947,108948 108949,671 108950,1359 108951,704 108953,44 108954,422 108955,422 108956,422 108957,422 108958,422 108959,422 108960,422 108961,422 108962,422 108963,422 108964,422 108965,422 108966,422 108968,349 108969,30 108971,3297 108972,83 108973,298 108974,485 108975,108976 108977,30 108978,1556 108979,872 108980,406 108981,108982 108983,1551 108984,392 108985,108986 108987,310 108988,83 108989,433 108990,1179 108991,1284 108991,1634 108992,973 108993,592 108994,6424 108995,30 108996,20 108997,30 108998,485 108999,707 109000,109001 109002,109003 109004,850 109006,251 109007,255 109008,718 109009,1977 109009,1978 109010,2574 109011,10 109012,167 109013,1181 109014,536 109015,240 109016,859 109016,874 109017,109018 109019,72 109020,298 109021,485 109022,109023 109024,136 109024,137 109024,309 109024,310 109024,312 109025,109026 109027,433 109030,535 109031,72 109032,344 109033,285 109034,2416 109034,2417 109036,222 109036,657 109036,992 109037,109038 109039,109040 109041,72 109042,344 109043,285 109044,109045 109046,932 109047,109048 109049,22 109049,861 109050,420 109051,795 109052,8788 109053,2083 109053,2191 109053,5301 109054,2867 109054,2868 109055,515 109056,109057 109058,818 109059,217 109059,536 109059,1417 109060,450 109061,450 109062,9195 109063,743 109064,55849 109065,55849 109066,109067 109068,1257 109069,55849 109070,968 109070,1370 109071,772 109072,109073 109074,102 109075,298 109076,485 109078,557 109079,862 109080,137 109081,557 109082,109083 109084,376 109085,298 109086,485 109087,3623 109088,298 109089,485 109090,298 109091,485 109092,2699 109093,298 109094,485 109095,109096 109097,1983 109099,483 109100,298 109101,485 109102,206 109103,557 109104,557 109105,718 109106,346 109107,79 109108,557 109109,109110 109111,109112 109113,2699 109114,109115 109116,346 109117,109118 109119,72 109120,1181 109121,1402 109122,760 109123,30 109124,298 109125,485 109126,298 109127,485 109128,577 109128,1707 109129,1181 109130,704 109131,21442 109132,1707 109133,72 109134,109135 109136,30 109137,775 109138,3623 109139,3094 109140,2266 109141,72 109143,30 109144,109145 109146,30 109147,72 109148,72 109149,109150 109151,862 109152,109153 109154,192 109155,72 109156,447 109157,447 109158,171 109159,209 109160,2244 109161,1313 109162,366 109163,109164 109163,116832 109165,72 109166,516 109167,109168 109169,109170 109171,72 109172,72 109173,1 109174,1955 109175,3413 109176,2379 109176,2868 109177,2931 109178,13546 109179,8991 109180,109181 109182,109183 109184,109185 109184,115649 109186,106 109186,586 109186,17772 109188,109189 109190,704 109191,109192 109193,843 109194,17334 109196,109197 109198,109198 109199,422 109200,56 109201,202 109201,203 109201,493 109202,119 109203,422 109204,56 109205,640 109206,109207 109208,109209 109210,704 109211,3804 109212,22 109213,109214 109215,1773 109216,109217 109218,147 109219,109220 109221,109220 109222,109223 109224,267 109225,109226 109228,178 109230,862 109231,109232 109233,30 109234,1368 109235,30 109237,109236 109237,112509 109238,30 109239,30 109240,1572 109240,19005 109241,4611 109242,1544 109243,2506 109244,109245 109244,151252 109244,153214 109246,109247 109248,233 109249,2353 109250,1556 109251,30 109252,30 109253,35486 109254,298 109255,485 109256,1454 109257,1556 109258,2083 109259,433 109259,68069 109259,141912 109260,3623 109261,23011 109262,30 109263,30 109264,79 109265,184 109265,258 109265,332 109265,379 109265,3467 109266,1844 109267,1241 109268,392 109268,1769 109268,68069 109270,611 109271,850 109273,217 109273,2671 109274,287 109274,652 109275,81 109276,298 109277,485 109278,2373 109280,433 109281,450 109284,207 109289,718 109291,704 109292,3297 109293,72 109294,109295 109296,109295 109298,660 109299,1402 109300,44 109301,431 109304,690 109304,1782 109305,6068 109306,1359 109307,109308 109309,22 109310,861 109311,538 109312,287 109313,579 109314,3 109316,3413 109317,338 109317,1631 109320,79 109321,2867 109321,2868 109323,302 109324,3623 109325,779 109326,3623 109327,676 109328,269 109328,1172 109328,1844 109329,151 109329,1235 109329,72439 109330,104 109330,134 109331,109332 109333,1313 109334,2775 109335,447 109336,874 109337,109338 109339,136 109340,109341 109342,5440 109344,355 109345,109346 109347,147 109348,392 109349,481 109350,455 109351,72 109352,309 109352,310 109352,333 109352,433 109352,536 109352,577 109352,623 109352,626 109352,907 109352,919 109352,1001 109352,1133 109352,1151 109352,1715 109352,3804 109352,13546 109354,1298 109356,302 109357,355 109358,68069 109358,141912 109359,1467 109360,397 109361,2867 109361,2868 109362,557 109363,422 109364,1707 109365,422 109366,422 109367,146 109367,285 109367,406 109367,585 109367,620 109367,1515 109367,92476 109368,3623 109369,149 109369,406 109369,1425 109371,422 109372,422 109373,422 109374,422 109375,422 109376,422 109377,422 109378,872 109378,1151 109379,298 109380,485 109381,1359 109382,1359 109383,358 109384,192 109385,1844 109386,843 109387,640 109388,640 109389,640 109390,640 109392,72 109392,408 109392,417 109392,1891 109392,2607 109392,9457 109393,919 109394,171 109395,932 109396,1983 109397,55849 109398,298 109399,485 109400,252 109400,1220 109400,1222 109401,192 109403,192 109403,256 109404,72 109405,298 109406,485 109407,109408 109411,206 109411,333 109411,60576 109413,9560 109414,1177 109415,175 109416,4611 109417,2116 109418,298 109419,760 109421,22293 109423,809 109425,493 109426,175 109426,264 109426,693 109427,586 109428,1390 109429,83 109430,364 109430,1010 109431,109432 109433,3623 109434,809 109434,19010 109435,287 109436,577 109437,388 109438,2244 109439,72 109440,1688 109441,2931 109442,298 109443,485 109444,483 109444,1927 109445,1082 109446,126 109448,298 109449,485 109450,252 109452,868 109453,340 109454,2416 109454,2417 109454,3209 109456,175 109457,109458 109459,298 109460,355 109460,873 109461,795 109462,1782 109463,30 109464,109465 109466,149 109467,1467 109468,440 109469,1085 109469,6068 109470,72 109471,30 109472,109473 109474,298 109475,485 109476,22 109476,1007 109476,3999 109477,422 109478,56 109479,356 109479,852 109480,2353 109481,79 109482,79 109484,298 109485,485 109486,72 109487,109488 109490,72 109491,392 109491,918 109492,720 109494,3623 109495,1509 109496,2590 109497,72 109498,1235 109498,1335 109502,483 109503,957 109503,1246 109503,1247 109503,1815 109503,5244 109503,7159 109503,14650 109503,49809 109503,109503 109503,125572 109503,127910 109503,134398 109503,139025 109503,151719 109503,151724 109503,154049 109503,154091 109503,154484 109503,163588 109503,163793 109503,164572 109503,166429 109503,168933 109503,170004 109503,170392 109503,182645 109505,138 109506,1551 109507,1388 109508,1849 109509,1293 109510,772 109511,135 109512,718 109513,207 109514,1566 109515,1566 109516,1566 109517,1566 109518,1722 109519,843 109520,3623 109521,356 109522,79 109524,1977 109524,1978 109525,108193 109526,703 109527,406 109528,657 109529,109530 109531,406 109532,872 109534,1429 109535,109536 109537,222 109537,455 109537,2266 109538,314 109538,1425 109540,55849 109541,55849 109542,602 109543,151 109544,668 109545,302 109545,861 109545,893 109546,1888 109547,109548 109549,109548 109550,2607 109551,6303 109552,3538 109554,779 109554,68069 109554,141912 109556,109557 109559,703 109560,1113 109560,1619 109561,2045 109563,118 109563,4597 109564,1608 109565,30 109566,21487 109567,302 109568,30 109568,200 109568,772 109568,99807 109569,298 109570,485 109571,344 109572,192 109573,102 109573,1326 109573,14797 109574,2699 109575,31977 109576,22 109577,202 109577,203 109577,516 109578,79 109579,861 109580,3695 109581,1143 109582,30 109583,1105 109584,809 109585,694 109587,1285 109588,718 109589,809 109591,30 109593,4 109593,5 109594,333 109595,349 109596,579 109596,1509 109597,109598 109599,292 109600,72 109601,850 109603,376 109604,885 109604,13704 109605,872 109606,304 109606,1085 109606,156379 109607,72 109608,55849 109609,9010 109610,209 109610,273 109611,175 109612,298 109613,392 109614,10 109615,4810 109616,292 109617,1608 109618,744 109619,356 109620,941 109621,163 109621,302 109621,861 109622,1181 109623,1381 109624,104 109624,631 109624,1458 109625,615 109626,8993 109627,178 109627,2677 109627,3000 109627,5728 109627,80427 109627,110336 109627,110338 109627,110345 109628,1544 109629,783 109630,2135 109632,147 109632,158 109632,422 109633,1983 109634,376 109635,140 109636,267 109637,467 109638,439 109638,1370 109638,1512 109638,5992 109639,3769 109640,485 109641,1019 109641,1590 109641,2931 109641,8811 109642,1707 109643,718 109644,35486 109645,72 109646,72 109647,1531 109648,1319 109649,1844 109650,1132 109651,781 109652,72 109653,1132 109654,781 109655,30 109655,200 109655,772 109655,99807 109656,932 109657,30 109658,30 109659,422 109660,56 109661,356 109662,557 109663,1058 109664,557 109666,41 109667,72 109669,109670 109671,287 109671,1607 109673,3069 109674,287 109675,422 109676,56 109677,109678 109679,5906 109680,227 109681,536 109683,72 109684,991 109685,202 109685,203 109686,147 109686,422 109687,1151 109689,435 109692,1639 109693,1149 109694,996 109695,843 109696,356 109697,109698 109699,2353 109700,255 109701,278 109701,536 109701,577 109701,595 109701,13575 109702,109703 109704,137 109705,795 109706,34 109706,35 109706,217 109706,222 109706,278 109706,455 109706,657 109706,781 109706,949 109706,1072 109706,1274 109706,1467 109706,1571 109706,1718 109706,1881 109706,2168 109706,2944 109706,4594 109706,6888 109706,29475 109707,118 109707,4597 109708,87 109708,392 109708,1453 109708,1572 109708,1722 109708,1836 109708,2697 109708,14458 109709,271 109710,1803 109711,30 109712,596 109713,2351 109715,160 109715,360 109715,2411 109715,3653 109716,217 109717,2620 109718,273 109719,109720 109721,435 109722,202 109722,203 109724,72 109725,843 109727,356 109728,313 109728,328 109728,994 109729,72 109733,109732 109734,109735 109737,30 109738,68069 109739,109740 109739,120312 109741,72 109743,2574 109744,109745 109746,72 109747,72 109748,147 109749,30 109750,366 109751,779 109752,366 109753,118 109753,4597 109754,195 109755,109756 109757,109758 109759,106 109760,109761 109762,109763 109765,72 109766,255 109767,275 109768,1634 109769,30 109770,72 109771,30 109772,30 109773,30 109774,8992 109775,4192 109775,4193 109776,151 109778,109779 109780,109781 109782,298 109783,485 109786,704 109788,109789 109790,109791 109790,111580 109790,114498 109790,114753 109792,3507 109793,534 109795,557 109796,109797 109799,1085 109800,79 109801,233 109802,397 109803,109804 109805,206 109806,1132 109807,781 109808,2620 109809,919 109810,72 109810,233 109810,346 109810,1939 109810,2205 109810,4146 109810,7124 109810,33424 109811,8270 109812,109813 109814,1893 109817,109818 109819,120 109819,588 109819,590 109819,1466 109820,326 109821,328 109822,109823 109824,109825 109826,30 109827,452 109827,535 109827,918 109827,1655 109828,9560 109829,3258 109830,563 109832,595 109832,703 109833,1634 109834,75912 109835,206 109837,1888 109838,209 109838,299 109838,388 109838,390 109838,775 109838,907 109838,972 109838,1012 109838,1167 109838,1241 109838,1284 109838,1298 109838,1359 109838,1436 109838,1544 109838,1616 109838,1635 109838,1837 109838,2191 109838,3207 109838,3218 109838,4146 109838,73570 109838,103860 109839,577 109840,717 109840,1293 109841,1893 109841,49057 109842,1257 109843,2506 109844,31073 109845,344 109846,44 109847,2797 109848,422 109849,422 109850,422 109852,422 109853,422 109854,422 109855,422 109857,422 109858,1796 109859,422 109860,422 109861,422 109862,422 109863,1635 109863,2750 109864,805 109865,393 109866,433 109867,1001 109868,3623 109869,79 109870,726 109871,852 109872,1151 109873,79 109874,206 109875,298 109876,485 109877,431 109877,602 109877,631 109877,3218 109878,3623 109879,467 109879,868 109879,4252 109879,162599 109880,209 109880,861 109881,5440 109882,298 109883,485 109884,302 109885,996 109885,1033 109885,7872 109885,7992 109885,17426 109885,17904 109885,19191 109885,30390 109885,45018 109885,76718 109885,109885 109885,109888 109885,111702 109885,114603 109885,118970 109885,119522 109885,129917 109885,138011 109885,138153 109885,139545 109885,145511 109885,145514 109885,147357 109885,150113 109885,165251 109886,10 109887,30331 109889,872 109890,1612 109891,305 109891,2646 109892,372 109892,1285 109894,222 109895,3623 109897,206 109898,1619 109899,278 109900,636 109901,19010 109902,1122 109903,452 109904,1247 109905,184 109906,298 109907,485 109908,623 109909,1556 109910,1858 109911,1860 109912,477 109913,980 109914,1858 109915,1860 109916,1688 109917,1983 109918,694 109919,536 109919,1980 109920,1177 109921,1608 109922,1818 109924,20 109925,5591 109926,1177 109927,298 109928,485 109929,795 109930,2699 109932,485 109933,563 109934,406 109935,81070 109936,467 109936,868 109936,152855 109937,493 109938,481 109939,310 109941,392 109942,298 109943,485 109944,388 109945,332 109945,344 109946,79 109946,3804 109947,718 109947,893 109948,752 109949,298 109950,485 109952,663 109952,2178 109952,4545 109953,838 109953,1417 109954,34 109954,35 109955,2266 109956,310 109957,3623 109958,104 109958,136 109958,557 109958,1179 109958,1368 109959,493 109959,1265 109959,1266 109960,1402 109961,6051 109962,393 109963,1381 109964,1033 109965,586 109966,72 109967,222 109968,58 109969,206 109970,417 109971,1265 109971,1266 109972,178 109973,1955 109974,1796 109975,9025 109976,289 109976,290 109977,23701 109978,8868 109979,2334 109980,631 109981,8822 109982,16196 109983,5405 109984,258 109985,907 109985,31896 109986,450 109987,23010 109988,1939 109989,1707 109990,17588 109991,7124 109992,640 109993,211 109993,718 109993,44725 109994,47 109994,2469 109994,227061 109995,272 109996,497 109997,1130 109998,1390 109999,240 109999,818 110000,3623 110001,1634 110002,6789 110003,718 110004,47 110004,2469 110006,1968 110007,3623 110009,3623 110010,697 110010,3769 110011,233 110011,518 110012,422 110013,184 110014,110015 110016,278 110016,660 110016,891 110017,298 110018,485 110019,1977 110019,1978 110020,301 110021,298 110022,485 110023,2797 110024,1821 110025,1858 110026,1860 110027,973 110028,72 110030,1858 110031,1860 110032,292 110032,332 110032,1619 110032,2782 110033,192 110033,442 110033,1392 110033,30331 110034,920 110035,1858 110036,1860 110037,849 110038,360 110039,1323 110040,102 110041,1326 110042,83 110043,134 110045,795 110046,298 110047,485 110048,626 110050,788 110052,110053 110054,779 110055,298 110056,485 110057,1326 110059,298 110060,485 110061,298 110062,485 110064,110065 110066,3623 110067,298 110068,485 110069,3623 110070,1285 110071,1381 110072,298 110073,485 110074,3623 110075,392 110075,1417 110076,1179 110077,298 110078,485 110079,577 110079,647 110080,298 110081,485 110082,2775 110083,447 110084,252 110085,1370 110086,298 110087,485 110088,1285 110089,171 110090,435 110091,344 110093,1775 110093,1962 110094,3623 110095,30 110096,110097 110098,920 110099,3623 110100,1285 110101,77 110101,269 110103,298 110104,485 110105,1285 110106,298 110107,485 110108,3623 110110,10 110111,298 110112,485 110113,636 110116,392 110116,1143 110117,50 110118,240 110118,299 110118,2083 110118,127158 110119,622 110119,1033 110120,3623 110121,2506 110122,143 110123,3623 110124,30 110125,1462 110125,8537 110126,240 110127,452 110127,590 110128,79 110129,146 110130,20359 110131,843 110132,1769 110132,5547 110133,1033 110134,356 110135,140 110136,592 110138,30 110139,298 110140,485 110142,63 110143,32751 110145,110146 110147,298 110148,485 110150,287 110150,433 110151,467 110151,868 110152,462 110153,119 110153,644 110153,1363 110154,1085 110156,3623 110158,1572 110159,647 110161,298 110162,485 110163,5366 110164,298 110165,485 110166,1860 110167,483 110168,346 110169,30 110169,200 110169,772 110169,128491 110171,30 110172,198 110173,252 110174,868 110175,298 110177,485 110178,3623 110179,1 110180,1590 110181,516 110182,298 110183,485 110184,298 110185,485 110187,861 110188,22 110189,920 110190,326 110190,589 110190,1001 110190,1210 110191,255 110192,1769 110193,1265 110193,1266 110194,192 110195,1177 110196,389 110197,222 110200,1634 110201,571 110202,3623 110203,175 110204,298 110205,20 110206,657 110207,3079 110208,72 110209,557 110210,10 110211,3623 110212,72 110213,72 110214,47 110214,852 110214,1332 110214,2469 110214,189303 110215,110216 110217,240 110217,372 110218,861 110220,3148 110221,3623 110222,240 110223,406 110223,602 110224,110225 110226,3623 110227,88820 110228,2286 110229,146 110229,406 110229,779 110231,298 110232,485 110233,264 110234,1240 110235,1749 110235,14550 110236,557 110237,557 110239,110240 110241,298 110242,485 110243,3623 110244,406 110245,3623 110246,1849 110247,779 110248,1282 110249,3623 110250,1085 110252,3623 110253,151 110255,6387 110256,10 110256,113156 110257,151 110258,1458 110259,118 110259,4597 110260,346 110261,795 110262,2244 110263,467 110263,868 110264,3623 110265,309 110265,310 110265,1566 110266,72 110267,1749 110268,3623 110270,202 110271,2506 110272,110273 110272,175851 110274,110275 110276,32 110276,3003 110277,110278 110279,2506 110280,110281 110282,3623 110283,818 110284,31977 110285,72 110286,3623 110287,772 110288,302 110289,1644 110290,10 110291,577 110292,4903 110293,72 110294,392 110295,147 110295,192 110295,1243 110296,118 110296,4597 110297,1001 110298,481 110299,515 110300,72 110302,72 110303,110304 110305,697 110306,1252 110306,1253 110307,184 110308,110309 110310,110311 110312,406 110314,2574 110315,72 110316,657 110317,79 110318,2266 110319,1359 110321,1192 110322,973 110322,1732 110323,557 110324,557 110325,171 110326,366 110327,207 110328,392 110329,298 110330,485 110331,110332 110333,110332 110334,310 110335,30 110336,493 110336,795 110337,30 110339,872 110340,1429 110341,2353 110342,298 110343,485 110344,668 110345,110346 110345,133228 110345,133229 110345,133231 110345,133232 110345,133233 110345,133234 110345,135501 110345,136802 110345,147232 110345,170347 110345,187763 110345,255129 110347,3695 110348,1118 110349,250 110349,1684 110350,704 110351,310 110352,10 110353,66297 110354,310 110355,149 110356,1381 110357,72 110358,1564 110358,3094 110359,72 110360,2411 110361,47 110361,2469 110362,8308 110363,250 110363,1684 110364,72 110365,72 110366,1143 110367,110368 110369,158 110370,192 110371,1707 110372,310 110373,1858 110374,1860 110375,298 110376,485 110379,2590 110380,304 110381,994 110382,72 110383,1007 110384,110385 110388,557 110389,30 110390,516 110391,3041 110392,110393 110394,1227 110394,86416 110395,358 110397,72 110398,30 110399,920 110400,110401 110402,30 110403,1983 110404,602 110405,3623 110406,30 110407,868 110408,247 110409,83 110410,298 110411,485 110414,310 110415,2116 110416,704 110417,30 110418,110419 110420,10 110420,34 110420,35 110420,83 110420,261 110420,283 110420,455 110420,536 110420,1072 110420,1467 110420,2266 110420,2671 110420,2989 110420,2991 110420,7092 110420,13546 110420,31977 110421,110422 110424,110425 110426,72 110428,35905 110429,110430 110431,72 110432,1181 110433,72 110434,30 110435,1085 110436,809 110438,30 110439,110440 110441,175 110442,298 110443,110444 110445,435 110445,447 110445,1033 110445,1590 110446,392 110447,1452 110448,255 110449,392 110450,1590 110451,30 110452,110453 110454,68069 110455,126 110455,640 110456,30 110457,1238 110458,81 110459,1571 110460,110461 110462,294 110463,110464 110466,332 110467,304 110468,2671 110469,581 110470,110471 110472,30 110473,147 110474,110475 110476,1167 110477,35687 110478,392 110480,110481 110482,2574 110483,2319 110484,222 110484,2266 110485,8 110486,809 110486,22293 110488,310 110489,602 110490,233 110491,6303 110492,289 110492,290 110492,94134 110492,144988 110493,483 110494,459 110496,192 110497,110498 110499,110500 110501,385 110502,3246 110504,1590 110504,1644 110506,106 110506,1370 110506,59021 110506,168463 110506,168479 110507,431 110508,77 110509,1119 110509,1962 110509,2205 110509,4222 110509,13361 110509,33424 110509,111142 110510,302 110510,3769 110510,162599 110511,264 110511,515 110511,1381 110511,1968 110512,868 110513,6955 110514,355 110515,1247 110516,356 110517,22 110518,116 110518,430 110518,2087 110519,206 110520,178 110521,1453 110522,996 110523,920 110524,1634 110525,1740 110526,44 110528,1782 110529,422 110530,422 110531,422 110532,422 110533,2646 110534,80266 110535,640 110536,588 110536,590 110537,294 110538,130 110540,360 110540,1224 110541,1962 110542,1293 110543,298 110544,485 110545,163 110546,1985 110547,1096 110548,647 110549,344 110551,4691 110552,298 110553,485 110554,1247 110555,1285 110556,2867 110556,2868 110557,1118 110558,298 110559,485 110560,1707 110561,2244 110562,110563 110564,1556 110565,287 110566,1858 110567,1860 110568,323 110569,415 110570,147 110570,1181 110571,298 110572,485 110573,1858 110574,1860 110575,167 110575,852 110575,968 110575,1849 110575,5301 110575,32784 110575,73570 110576,323 110577,58 110578,994 110579,46 110580,75912 110581,1858 110582,1860 110583,907 110585,1858 110586,1860 110587,298 110588,485 110589,163 110589,302 110590,72 110591,344 110592,285 110593,167 110593,433 110593,811 110593,861 110593,76096 110593,127158 110594,2699 110595,2867 110595,2868 110597,392 110598,349 110598,575 110598,3260 110600,467 110600,868 110601,215 110602,1402 110603,252 110603,1220 110603,1222 110604,1262 110605,301 110605,861 110605,1231 110605,3422 110606,6027 110607,2506 110608,1105 110609,392 110610,510 110611,2506 110612,2506 110613,31977 110614,893 110615,83 110616,1293 110617,130 110619,1707 110620,215 110622,1707 110623,50 110623,206 110623,841 110625,2646 110626,298 110627,485 110628,8270 110629,302 110629,861 110630,2574 110631,713 110632,1 110633,72 110635,346 110635,435 110635,586 110635,1294 110635,1963 110635,6119 110636,408 110637,1323 110638,102 110639,1326 110640,65 110640,467 110640,868 110640,31896 110641,1871 110641,2421 110642,2506 110645,178 110646,1293 110647,450 110647,1118 110647,1388 110648,483 110649,1634 110650,278 110651,298 110652,485 110654,1745 110655,1634 110657,302 110658,422 110659,298 110660,485 110662,298 110663,485 110664,1082 110665,1359 110666,1707 110667,422 110668,298 110669,1082 110670,485 110671,483 110672,192 110679,110680 110681,7698 110684,2506 110685,298 110686,485 110687,1105 110688,7698 110689,83 110692,1515 110693,273 110694,110695 110694,120423 110697,1130 110698,200 110698,772 110700,1707 110701,298 110702,485 110703,726 110705,298 110706,485 110707,107 110707,124668 110709,907 110710,175 110711,3161 110712,312 110712,1882 110713,1096 110714,298 110715,3161 110716,1235 110716,1335 110717,294 110717,328 110717,2416 110717,2417 110717,227061 110718,273 110719,34 110719,35 110719,97 110720,119 110721,1858 110722,1860 110723,859 110724,435 110725,222 110726,110727 110729,79 110730,406 110731,5405 110732,302 110733,2775 110734,447 110735,1177 110736,149 110736,622 110736,1776 110738,843 110739,356 110740,795 110742,1368 110743,72 110744,392 110745,3260 110746,118 110746,4597 110747,72 110748,1881 110749,356 110750,217 110750,467 110752,1276 110753,439 110753,2991 110754,406 110755,2351 110756,118 110756,1414 110757,222 110758,130 110759,360 110759,1639 110760,717 110760,1381 110761,447 110762,111142 110763,518 110763,1955 110764,2506 110765,850 110766,83 110767,818 110768,252 110769,726 110770,1284 110771,240 110772,247 110773,79 110774,623 110774,1805 110775,340 110775,4548 110778,30 110779,298 110780,485 110781,2178 110781,4545 110782,557 110783,1368 110784,1608 110785,130 110786,313 110787,1515 110788,406 110789,298 110790,485 110791,298 110792,485 110793,298 110794,485 110795,10 110795,841 110795,1175 110796,72 110797,431 110799,110800 110801,72 110802,110803 110802,111860 110804,483 110805,31977 110806,175 110807,425 110807,583 110807,690 110807,1805 110808,3467 110809,298 110810,4895 110811,72 110812,158 110813,1298 110814,30 110815,1381 110816,30 110817,10 110818,323 110819,1130 110820,50 110821,1893 110822,6837 110823,7360 110824,392 110825,299 110826,298 110827,485 110828,557 110829,298 110830,485 110831,298 110832,485 110833,298 110834,485 110835,110836 110837,298 110838,485 110839,158 110840,360 110841,358 110842,292 110843,949 110844,83 110845,298 110846,485 110847,3623 110848,1531 110849,3623 110850,536 110850,1515 110851,518 110852,3623 110853,3623 110854,298 110855,110856 110857,485 110858,200 110858,1033 110858,1085 110858,1572 110858,2617 110858,3297 110858,4039 110859,2506 110860,175 110861,2506 110862,298 110863,3623 110864,704 110865,392 110866,2506 110867,2506 110868,110869 110870,718 110871,2116 110872,30 110873,110874 110875,949 110876,1368 110877,110878 110880,130 110881,704 110882,1773 110883,3507 110885,392 110886,110887 110888,79 110889,577 110890,1718 110891,273 110892,557 110893,30 110894,557 110895,83 110896,211 110897,452 110897,918 110897,1655 110898,338 110899,5908 110901,22125 110902,30 110903,536 110904,217 110905,366 110907,4903 110908,3623 110909,1113 110910,491 110911,1707 110912,110913 110914,2590 110915,1773 110917,110918 110919,207 110920,130 110921,79 110921,333 110922,22 110923,481 110924,298 110925,485 110927,110928 110929,872 110930,1429 110931,175 110932,2266 110933,86 110933,167 110933,301 110933,968 110933,1160 110933,1462 110933,1564 110933,2372 110933,2620 110933,5718 110933,7416 110933,8537 110935,605 110936,107 110937,668 110940,72 110941,81 110942,392 110943,72 110944,1289 110945,5440 110946,269 110947,3999 110948,264 110949,298 110950,485 110951,1381 110952,110953 110955,110956 110958,843 110959,704 110960,602 110961,310 110962,313 110962,326 110962,2421 110963,1143 110964,422 110965,56 110966,3041 110967,1452 110968,1551 110969,1007 110971,1117 110971,3260 110974,1033 110975,602 110978,1381 110979,1639 110981,602 110982,1531 110983,184 110984,72 110985,207 110986,110987 110988,110989 110990,255 110991,110992 110993,872 110994,292 110995,406 110995,620 110995,1515 110995,8244 110996,346 110997,110998 110999,255 111000,872 111002,392 111004,72 111006,2506 111007,2506 111008,2506 111009,2506 111010,2506 111011,111012 111014,167 111015,390 111015,717 111016,111017 111018,1977 111018,1978 111019,1140 111019,5547 111020,233 111021,111022 111023,8788 111024,111025 111026,111027 111028,68 111029,399 111030,2646 111034,111035 111036,136 111038,704 111039,111040 111041,206 111041,1707 111042,623 111048,1082 111051,1082 111052,355 111053,346 111054,2506 111055,433 111056,1359 111057,298 111058,485 111059,1033 111060,827 111063,1631 111064,376 111066,23011 111068,207 111069,302 111070,298 111071,485 111072,118 111072,4597 111073,1105 111075,849 111076,433 111077,111078 111079,312 111080,111081 111082,1001 111083,37 111085,693 111085,1132 111086,3623 111087,264 111087,191860 111090,811 111091,3623 111092,467 111093,422 111094,56 111095,5375 111096,515 111097,849 111098,973 111099,3623 111100,1177 111101,1893 111102,408 111102,599 111103,422 111104,56 111105,2889 111106,326 111107,3830 111108,1133 111110,44 111111,749 111112,349 111112,3260 111113,34 111113,35 111113,250 111113,1684 111114,433 111115,422 111116,422 111117,422 111118,72764 111119,422 111120,392 111121,422 111122,422 111123,422 111124,422 111125,422 111127,422 111128,422 111129,422 111130,422 111131,1949 111132,151 111133,72 111134,1238 111135,3623 111136,346 111138,1085 111138,2296 111139,850 111142,5 111142,104 111142,289 111142,304 111142,328 111142,704 111142,714 111142,1402 111142,1511 111142,1745 111142,1962 111142,2008 111142,2089 111142,2940 111142,3069 111142,3565 111142,4114 111142,4218 111142,4367 111142,4532 111142,25385 111142,28811 111142,31893 111142,34403 111142,76704 111142,94134 111142,104394 111142,108499 111142,110509 111142,110762 111142,111142 111142,123824 111142,130229 111142,130254 111142,131812 111142,132216 111142,133627 111142,136546 111142,138074 111142,140142 111142,164735 111142,176782 111142,180854 111142,183075 111142,191198 111142,191291 111142,212968 111142,216643 111142,228899 111142,235862 111142,243209 111142,254215 111142,254422 111142,259608 111143,72 111144,72 111145,72 111146,30 111147,805 111147,1564 111148,298 111149,485 111150,72 111151,158 111151,406 111151,779 111151,1181 111151,1515 111152,72 111153,72 111154,72 111155,1544 111156,4611 111157,4611 111158,1544 111159,1858 111160,1860 111161,346 111162,3804 111163,346 111164,217 111165,66 111165,868 111166,30 111168,298 111169,485 111170,301 111170,1293 111170,1782 111172,217 111173,217 111174,1983 111175,1556 111176,1769 111177,289 111177,290 111178,83 111179,111180 111181,2775 111182,447 111183,3769 111184,83 111185,3623 111186,151 111187,163 111188,392 111190,2931 111191,302 111193,1860 111196,111197 111200,310 111201,2371 111201,220502 111202,1096 111203,2371 111204,111205 111206,206 111207,1326 111208,298 111209,485 111210,1807 111211,72 111212,344 111213,285 111214,2334 111215,298 111216,485 111217,160 111217,779 111217,1381 111217,1551 111217,68069 111217,118336 111218,417 111218,1635 111219,1220 111219,1222 111220,252 111221,251 111222,949 111222,1618 111222,13980 111224,2506 111225,195 111226,862 111226,27041 111227,111228 111229,58 111230,994 111231,46 111232,75912 111234,2506 111235,298 111236,485 111237,1858 111238,1860 111239,1293 111240,1860 111241,868 111242,83 111243,1858 111244,1860 111245,247 111246,1390 111248,298 111249,485 111250,192 111253,50 111254,346 111255,862 111255,27041 111256,120 111256,6303 111257,1749 111259,247 111260,298 111261,485 111262,1858 111263,1860 111264,1983 111265,32 111268,2244 111269,135 111270,1070 111271,408 111272,1323 111273,102 111274,1326 111275,671 111276,111277 111276,117508 111278,3623 111279,107 111280,158 111280,192 111280,1181 111281,97 111281,1319 111281,7117 111282,1096 111284,647 111285,111286 111287,349 111288,3367 111290,107230 111291,27356 111292,1745 111292,1849 111292,4237 111292,182162 111293,302 111294,1707 111295,1247 111296,23287 111297,1210 111299,862 111300,1801 111301,1707 111303,111304 111306,1849 111306,32784 111308,111309 111310,592 111313,595 111313,1058 111314,298 111315,485 111316,1522 111317,200 111317,116400 111318,313 111319,1436 111320,106 111322,346 111323,149 111325,30 111326,8788 111327,4611 111328,1544 111329,452 111329,918 111329,1655 111330,1240 111330,1466 111331,801 111332,2699 111333,1127 111334,4604 111335,7768 111336,3069 111337,30 111338,298 111339,485 111340,106 111340,596 111340,1368 111340,1564 111340,4548 111341,111342 111343,861 111344,1118 111345,360 111346,3161 111348,37 111348,301 111348,717 111348,968 111348,1231 111348,1782 111349,861 111349,1374 111350,72 111351,240 111352,10 111353,88820 111354,175 111355,557 111356,1368 111357,43203 111358,392 111359,298 111360,485 111361,358 111363,298 111364,2929 111365,1359 111366,298 111366,1085 111368,30 111369,2867 111369,2868 111371,1454 111372,83 111373,1858 111374,1860 111375,298 111376,485 111377,994 111378,72 111379,72 111380,72 111381,366 111383,366 111384,366 111385,366 111386,366 111387,30 111388,72 111389,366 111390,366 111391,704 111392,3623 111393,278 111394,346 111395,72 111396,2506 111398,704 111400,3507 111401,346 111402,640 111403,392 111404,346 111406,287 111407,818 111408,422 111409,56 111410,392 111411,158 111412,2750 111413,1858 111414,1860 111415,23783 111416,111417 111418,72 111419,2506 111420,135 111421,346 111422,252 111422,516 111422,1220 111422,1222 111424,137 111425,48 111427,48 111428,30331 111429,217 111430,298 111430,1085 111432,1590 111432,6661 111433,535 111434,79 111435,72 111436,30 111437,30 111438,72 111439,447 111440,72 111441,1796 111442,1096 111443,147 111443,89035 111444,72 111445,344 111446,285 111447,422 111448,56 111449,704 111450,30 111451,3623 111452,120 111453,298 111454,485 111455,704 111456,557 111457,809 111458,3623 111459,868 111460,79 111461,389 111462,298 111463,485 111464,3585 111465,111466 111467,111468 111469,30 111470,376 111471,392 111472,111473 111474,30 111475,358 111476,4611 111477,1544 111478,30 111479,111480 111482,111483 111484,298 111485,485 111486,72 111487,805 111488,111489 111490,592 111491,298 111492,485 111493,389 111493,1046 111493,54284 111494,557 111495,1289 111496,557 111497,557 111498,5906 111499,557 111500,626 111501,278 111502,137 111503,862 111504,8719 111505,704 111506,138 111507,865 111508,557 111509,2867 111509,2868 111510,137 111511,118 111511,4597 111512,88820 111513,809 111514,1858 111515,1860 111516,2116 111517,298 111518,485 111519,111520 111521,72 111522,298 111523,485 111524,111525 111526,111525 111528,3623 111529,289 111529,290 111530,346 111531,259 111532,346 111533,111534 111535,577 111536,298 111537,485 111538,346 111539,217 111539,809 111540,358 111541,920 111543,111544 111545,83 111546,111547 111548,111549 111550,10 111550,113156 111551,111552 111551,121210 111551,133395 111553,973 111554,111555 111556,346 111557,111558 111559,247 111561,652 111561,1133 111561,6068 111562,2590 111564,247 111565,30 111566,111567 111568,111569 111570,1359 111571,207 111573,872 111574,1429 111575,72 111576,72 111577,1132 111578,781 111579,668 111581,640 111582,483 111583,58621 111584,52270 111585,9560 111586,96187 111587,27356 111588,1353 111589,310 111590,10 111590,113156 111591,71 111592,83 111593,298 111594,485 111595,422 111596,56 111597,8270 111598,298 111599,485 111600,1143 111601,72 111602,30 111603,366 111604,366 111605,202 111605,203 111606,44725 111607,72 111608,111609 111611,225 111612,111613 111614,111615 111616,1467 111617,372 111618,111619 111620,8884 111621,455 111622,2424 111623,1085 111624,704 111625,538 111626,1871 111627,328 111629,2421 111630,83 111631,13980 111632,195 111633,503 111634,3367 111635,111636 111637,111638 111639,111640 111641,175 111642,298 111644,72 111646,111647 111649,72 111650,233 111651,111652 111653,111654 111655,111656 111657,72 111660,111661 111662,72 111663,267 111664,206 111665,72 111666,355 111667,111668 111669,206 111671,111672 111673,96187 111674,298 111675,485 111676,332 111677,38634 111678,41 111679,4276 111681,111682 111683,422 111684,56 111685,687 111685,1556 111686,72 111688,422 111689,422 111690,422 111691,422 111692,422 111693,422 111694,422 111695,422 111696,346 111697,422 111698,83 111699,346 111700,422 111703,875 111704,422 111705,56 111706,94 111706,2787 111707,16153 111708,422 111709,56 111710,111711 111712,671 111713,536 111714,83 111715,872 111715,7698 111716,623 111717,111718 111717,111765 111717,111807 111717,111810 111719,111720 111722,973 111723,408 111724,1323 111725,102 111726,1326 111727,1559 111729,346 111730,973 111731,247 111733,346 111734,973 111735,111736 111737,111738 111739,714 111739,1818 111740,920 111742,298 111743,485 111744,298 111745,485 111746,30 111747,1181 111748,30 111750,30 111752,973 111753,392 111754,111755 111756,111757 111758,298 111759,485 111760,346 111761,577 111762,111763 111766,1707 111767,743 111768,850 111769,111770 111771,1608 111772,111773 111774,111773 111775,1010 111775,1243 111775,189128 111776,111777 111778,3161 111779,298 111780,485 111781,106 111783,151 111785,111786 111787,622 111788,310 111789,2266 111790,298 111791,485 111792,690 111793,79 111793,97 111793,147 111793,192 111793,203 111793,206 111793,255 111793,305 111793,323 111793,346 111793,352 111793,435 111793,438 111793,516 111793,585 111793,622 111793,1135 111793,1181 111793,1222 111793,1238 111793,1326 111793,1400 111793,1844 111793,1891 111793,3370 111793,3804 111793,5213 111793,5726 111793,7117 111793,7614 111793,9179 111793,9208 111793,25222 111794,146 111794,106502 111795,111796 111797,310 111798,111799 111800,827 111801,111802 111803,111804 111803,111834 111805,422 111806,56 111809,34 111809,35 111809,77 111809,111 111809,202 111809,203 111809,313 111809,358 111809,493 111809,536 111809,623 111809,859 111809,862 111809,919 111809,949 111809,1240 111809,1274 111809,1465 111809,1467 111809,1572 111809,1644 111809,2045 111809,2266 111809,2671 111809,2931 111809,2979 111809,4594 111809,6955 111809,7092 111809,8180 111809,13546 111809,14126 111809,29475 111811,1127 111811,1769 111812,111813 111812,112987 111814,1181 111815,111816 111817,72 111818,571 111818,1465 111819,50 111820,5101 111821,483 111822,111823 111824,72 111826,111827 111829,376 111830,1181 111831,1181 111832,111833 111835,111836 111837,111838 111839,1479 111840,390 111841,111842 111843,111844 111845,72 111846,310 111847,6837 111848,298 111849,485 111850,147 111850,158 111850,217 111850,252 111850,406 111850,516 111850,779 111850,968 111850,1001 111850,1370 111851,111852 111853,349 111856,111857 111858,111859 111861,72 111862,111863 111864,111865 111866,72 111867,72 111868,631 111869,111870 111871,8270 111872,111873 111874,310 111875,79 111876,72 111877,72 111878,72 111879,9098 111880,44725 111881,72 111882,3623 111883,111884 111887,160 111888,366 111889,366 111890,366 111891,8992 111892,366 111893,779 111894,2146 111895,310 111896,310 111897,111898 111899,104 111900,1033 111902,83 111904,72 111905,111906 111905,127123 111907,310 111908,83 111912,83 111913,111914 111916,111917 111918,206 111919,111920 111919,113260 111919,113264 111921,83 111922,602 111923,111924 111925,83 111927,111928 111929,233 111930,1181 111931,111932 111933,602 111934,953 111935,107 111936,2416 111936,2417 111937,292 111938,338 111939,333 111939,240174 111940,298 111941,1133 111942,3538 111943,206 111944,206 111945,222 111946,1 111946,2617 111947,355 111948,5102 111949,310 111950,111950 111951,9457 111952,310 111954,3804 111955,2266 111956,118 111956,4597 111957,72 111958,72 111959,72 111960,5102 111961,111962 111963,805 111965,140 111966,8270 111967,973 111968,1323 111970,66297 111971,907 111973,718 111974,111975 111974,134040 111976,72 111977,346 111979,310 111980,72 111981,312 111981,525 111981,868 111982,72 111983,3135 111984,72 111985,111986 111987,2506 111988,111989 111990,209 111990,302 111992,44013 111993,1332 111994,44 111995,2867 111995,2868 111996,3447 111997,2146 111998,126 111999,4066 112000,3413 112001,3161 112002,1313 112003,874 112004,192 112005,1939 112006,10 112007,676 112008,393 112009,1381 112010,1265 112010,1266 112011,3209 112012,859 112013,8855 112014,3148 112015,5405 112016,272 112016,1531 112017,3207 112018,602 112019,217 112020,422 112021,56 112023,349 112024,805 112025,1235 112025,1335 112026,10 112027,112028 112029,1837 112030,112031 112032,818 112033,567 112033,1345 112034,112035 112034,118203 112036,406 112037,859 112039,1132 112040,781 112041,602 112042,112043 112044,30 112045,112046 112048,112049 112050,34 112050,35 112056,1634 112059,376 112060,713 112061,79 112061,269 112061,422 112061,663 112061,779 112061,868 112062,1655 112063,2506 112064,622 112065,9560 112066,493 112067,557 112068,862 112069,557 112070,557 112071,557 112072,298 112073,485 112074,298 112075,485 112076,112077 112078,22 112079,298 112080,485 112081,862 112081,27041 112082,392 112083,136 112084,994 112085,112086 112087,805 112088,287 112089,3769 112090,2775 112091,447 112092,4611 112093,859 112095,4611 112096,1544 112097,1858 112098,1860 112099,586 112099,5101 112100,72 112101,1707 112104,30 112105,112106 112107,158 112108,175 112109,112110 112111,994 112112,112113 112114,112115 112116,1181 112117,1608 112118,217 112118,536 112119,160 112120,433 112121,779 112123,178 112124,112125 112127,112128 112130,1359 112132,112133 112134,640 112135,8788 112136,273 112137,112138 112139,222 112140,112141 112143,483 112145,827 112146,151 112147,151 112148,112149 112148,113689 112148,148169 112148,153744 112150,112151 112152,112151 112153,3585 112154,112155 112157,872 112158,872 112159,1238 112160,292 112161,294 112162,296 112163,298 112164,1452 112165,112166 112167,872 112168,435 112168,586 112169,392 112170,310 112171,112172 112174,147 112174,1623 112175,112176 112177,392 112178,112179 112180,112181 112182,298 112183,485 112185,1192 112186,298 112187,485 112188,30 112189,58 112190,994 112191,46 112192,75912 112193,4611 112194,1544 112195,2506 112196,390 112197,671 112199,147 112200,184 112201,30 112203,30 112204,112205 112206,424 112207,251 112208,19010 112208,22293 112209,366 112210,366 112211,366 112213,671 112215,298 112216,485 112217,868 112218,1132 112219,781 112220,1782 112221,433 112223,390 112223,422 112223,717 112223,1294 112223,1644 112223,3003 112225,447 112227,202 112228,861 112229,22 112230,283 112230,5265 112231,397 112232,626 112233,2353 112234,623 112234,1805 112235,72 112236,112237 112240,49057 112241,140 112242,259 112243,868 112244,1531 112245,397 112245,142430 112246,251 112246,516 112247,2205 112247,33424 112248,640 112249,112250 112251,640 112252,640 112253,1085 112254,2775 112255,447 112256,19 112256,2424 112256,5326 112257,309 112257,310 112258,255 112260,422 112261,56 112262,392 112263,5326 112264,1436 112265,1436 112266,1010 112267,953 112268,271 112269,112270 112271,422 112272,422 112273,5547 112274,49057 112275,34 112275,35 112276,422 112277,489 112277,893 112277,1556 112277,6303 112278,422 112279,422 112280,422 112281,422 112282,1132 112283,781 112284,422 112285,364 112286,422 112288,422 112289,112290 112291,422 112292,422 112293,422 112294,79 112295,2416 112295,2417 112296,1132 112297,781 112298,72 112299,843 112300,309 112300,310 112300,868 112300,81233 112302,30 112303,392 112304,112305 112306,640 112307,79 112308,302 112309,392 112310,483 112311,44 112312,83 112313,1858 112314,1860 112315,1001 112316,433 112317,272 112317,273 112317,422 112317,1803 112318,973 112319,417 112321,178 112321,1465 112321,6059 112322,356 112323,3297 112324,195 112325,1252 112325,1253 112326,217 112327,298 112328,390 112328,1001 112329,485 112331,77 112332,298 112333,485 112334,310 112336,112337 112338,973 112339,450 112340,344 112340,3967 112341,112342 112343,1127 112344,315 112345,1252 112345,1253 112346,137 112347,10 112347,3297 112348,112349 112350,298 112351,485 112352,452 112352,457 112352,676 112352,918 112352,1655 112353,3623 112354,1085 112355,450 112355,5405 112356,3623 112357,389 112358,1860 112359,1858 112360,3623 112361,104 112362,2480 112363,1556 112365,1130 112367,273 112368,3623 112369,1977 112369,1978 112370,112371 112372,379 112373,5440 112374,602 112376,932 112377,489 112378,868 112379,358 112379,509 112380,146 112380,779 112380,13361 112380,92476 112380,141912 112381,298 112382,485 112383,298 112384,485 112385,1634 112386,112387 112388,72 112390,623 112391,1983 112392,510 112393,2353 112394,1983 112395,1132 112396,781 112397,1265 112397,1266 112398,586 112399,920 112400,6051 112401,422 112402,56 112403,130 112403,1007 112403,1551 112403,3999 112403,36819 112405,1634 112406,6051 112407,1132 112408,781 112409,779 112410,1014 112411,392 112412,21408 112413,298 112414,485 112415,217 112416,302 112417,3623 112418,392 112419,298 112420,485 112421,1132 112422,781 112423,47 112423,2469 112424,1132 112425,781 112426,1132 112427,781 112428,1132 112429,781 112430,298 112431,485 112432,2480 112433,202 112433,346 112433,358 112433,671 112433,3804 112434,1634 112435,158 112436,920 112437,850 112437,4193 112438,788 112438,148742 112439,392 112439,535 112440,310 112441,676 112442,22 112442,1374 112443,37 112444,112445 112446,1132 112447,781 112448,422 112449,56 112450,1043 112451,112452 112453,1132 112454,781 112455,158 112455,252 112456,1132 112457,781 112458,302 112459,809 112460,467 112460,920 112461,112462 112463,1132 112464,2989 112464,2991 112465,781 112466,222 112466,455 112467,217 112469,147 112469,158 112469,118336 112470,1265 112470,1266 112471,1132 112472,781 112473,392 112474,2989 112474,2991 112475,1001 112476,467 112477,563 112478,3623 112479,718 112479,1127 112480,406 112480,1749 112481,4691 112482,1893 112483,477 112484,477 112485,1127 112485,49057 112486,215 112487,4611 112488,1544 112490,3623 112491,31977 112492,298 112493,485 112495,4611 112496,1544 112497,3 112498,973 112498,1298 112499,406 112500,1240 112502,422 112503,1332 112503,1590 112504,372 112504,1082 112505,254 112505,557 112505,954 112505,1939 112506,3623 112507,3623 112508,240 112510,215 112511,850 112512,18831 112513,6638 112514,298 112515,485 112516,563 112517,875 112518,3623 112519,112520 112521,1619 112522,206 112522,5726 112522,6119 112523,1298 112525,3623 112527,372 112527,444 112527,2191 112527,148742 112528,2436 112529,72 112530,1285 112530,84257 112531,657 112532,379 112533,135 112534,83 112535,2775 112536,447 112537,1 112537,147 112537,149 112537,171 112537,184 112537,859 112537,1623 112537,89035 112543,298 112544,485 112545,356 112546,2572 112546,2590 112547,175 112549,298 112550,2191 112551,50 112551,138 112551,1087 112551,1140 112551,1332 112551,1572 112551,1860 112551,1955 112551,2286 112551,5265 112552,3623 112553,372 112553,1001 112554,4411 112555,336 112556,272 112557,330 112558,1 112558,209 112559,779 112559,1515 112560,657 112561,3 112561,230509 112561,230517 112562,72 112563,626 112564,240 112565,3623 112566,4411 112567,750 112568,907 112569,671 112571,146 112571,106502 112572,483 112573,779 112574,1298 112575,941 112576,21408 112577,442 112578,112579 112580,536 112581,310 112582,112583 112584,850 112585,392 112586,130 112587,175 112588,309 112588,310 112589,298 112590,827 112591,147 112593,439 112593,671 112594,112595 112596,171 112597,83 112598,862 112599,298 112600,485 112601,1634 112602,862 112603,1132 112604,781 112605,4411 112607,862 112608,850 112609,6506 112610,1631 112611,336 112611,1033 112612,72 112613,298 112614,485 112615,112616 112617,136 112619,392 112619,433 112619,1634 112620,1127 112621,112622 112623,392 112623,1240 112624,112625 112624,123385 112626,3695 112627,862 112628,272 112628,435 112628,1893 112629,795 112630,3161 112631,415 112632,72 112633,586 112634,195 112634,422 112634,80266 112635,5547 112636,861 112637,3 112638,941 112639,2506 112640,298 112641,485 112642,4691 112643,801 112643,189842 112644,112645 112646,112647 112648,941 112649,298 112650,485 112651,376 112652,875 112653,240 112654,30 112655,687 112656,586 112656,1243 112657,298 112658,485 112659,175 112659,112660 112659,118747 112659,120222 112659,132178 112659,133855 112659,134407 112659,136952 112659,139105 112659,141612 112659,142224 112659,143355 112659,144587 112659,146739 112659,149776 112659,151894 112659,154925 112659,156065 112659,157157 112659,170424 112659,172454 112659,172925 112659,181502 112659,182688 112659,204052 112659,206649 112659,208008 112659,212704 112659,214014 112659,217250 112659,217379 112659,218707 112659,219643 112659,221813 112659,225756 112659,225839 112659,226808 112661,1085 112662,2867 112662,2868 112663,818 112664,298 112665,485 112666,877 112667,2146 112668,72 112669,211 112669,2775 112670,78232 112671,557 112672,557 112673,586 112674,602 112675,112676 112677,32 112678,310 112679,2205 112679,33424 112680,435 112681,1113 112682,147 112683,996 112684,112685 112686,298 112686,596 112687,1085 112688,843 112689,112690 112691,3872 112692,356 112693,875 112694,3207 112696,2797 112697,3623 112698,712 112699,175 112699,1773 112699,171297 112700,3623 112701,72 112703,302 112704,298 112705,485 112707,112707 112708,2351 112709,112710 112709,113049 112711,333 112712,920 112713,250 112713,1684 112714,112715 112716,4455 112719,68 112719,127158 112722,809 112722,973 112723,602 112725,809 112726,83 112727,83 112727,1085 112727,75912 112728,631 112729,34 112729,35 112729,2266 112730,269 112731,112732 112731,113293 112731,118973 112731,121178 112731,123489 112734,72 112735,83 112736,861 112737,22 112738,119 112739,30 112741,346 112742,65 112743,704 112744,192 112746,112747 112748,310 112751,112752 112753,112754 112755,72 112756,435 112757,298 112758,485 112759,112760 112761,1149 112762,442 112763,195 112764,112765 112767,1844 112768,126 112770,23011 112771,298 112772,485 112773,310 112774,112775 112776,233 112777,861 112778,22 112779,1132 112780,781 112781,2671 112782,893 112786,657 112787,1983 112788,68 112789,1240 112789,1465 112790,3 112791,298 112792,485 112793,298 112794,485 112795,81 112796,112797 112798,611 112799,403 112800,298 112801,485 112802,207 112803,112804 112805,760 112807,422 112808,298 112809,485 112810,44 112810,15609 112810,27041 112811,571 112811,872 112812,192 112812,663 112814,2045 112816,422 112817,298 112818,485 112819,467 112820,1659 112821,298 112822,485 112823,1359 112824,366 112825,21408 112826,310 112827,366 112828,893 112829,907 112829,2191 112830,298 112831,485 112833,640 112834,298 112835,485 112836,640 112837,83 112838,640 112841,1276 112841,1639 112842,83 112842,536 112844,1634 112845,355 112847,422 112848,422 112849,422 112850,422 112851,422 112852,422 112853,1019 112854,422 112855,422 112856,422 112857,422 112858,1509 112859,314 112859,623 112859,1240 112860,112860 112861,422 112862,422 112863,422 112864,2173 112865,422 112866,422 112867,644 112868,3 112869,1188 112871,298 112872,485 112874,392 112875,252 112875,516 112875,1220 112875,1222 112876,717 112877,298 112878,485 112879,287 112880,112881 112882,500 112884,4060 112885,344 112886,671 112887,298 112888,485 112889,34 112889,35 112890,749 112891,422 112892,56 112893,392 112894,79 112896,1240 112897,364 112898,175 112899,941 112900,298 112901,83 112903,2812 112903,172181 112904,1089 112905,252 112906,240 112907,389 112907,861 112907,919 112907,2315 112908,1019 112910,1722 112910,3367 112910,112912 112911,298 112913,485 112914,1289 112915,2244 112916,1019 112917,72 112918,441 112919,372 112919,805 112919,1149 112921,1927 112923,392 112923,1143 112923,1151 112923,1240 112923,1454 112923,1836 112923,2443 112924,19010 112925,72 112926,3623 112927,575 112928,996 112929,1309 112930,1467 112932,72 112933,1858 112934,1860 112935,1715 112936,668 112937,1634 112939,1390 112940,112941 112943,720 112944,586 112945,175 112946,298 112947,435 112947,1179 112949,30 112951,298 112952,485 112953,631 112954,581 112954,2604 112954,34092 112954,37787 112954,64736 112954,112954 112954,176970 112954,207006 112955,1983 112956,1132 112957,781 112959,112960 112959,133925 112959,159106 112961,3872 112962,631 112962,1212 112963,68 112964,1019 112964,115474 112965,623 112965,1590 112965,1644 112966,602 112967,302 112968,1220 112968,1222 112969,79 112970,1983 112971,3297 112973,932 112976,1858 112977,1860 112978,861 112979,2626 112980,146 112981,1983 112983,893 112984,49057 112985,435 112986,107 112988,298 112989,485 112990,408 112991,1323 112992,102 112993,1326 112995,615 112997,298 112998,485 112999,103860 113000,113001 113002,301 113003,657 113003,1019 113003,2266 113003,181063 113004,602 113005,1983 113006,240 113007,79 113008,1634 113009,304 113010,435 113011,2443 113011,5547 113012,3 113013,1984 113013,3949 113014,146 113015,1707 113016,1983 113017,1465 113018,788 113019,21408 113020,1849 113020,3003 113021,685 113021,1130 113022,13910 113023,360 113024,79 113025,248 113026,5405 113027,149 113027,220502 113028,298 113029,485 113030,467 113031,158 113032,298 113033,485 113034,312 113035,1087 113036,843 113037,861 113038,22 113039,58 113040,994 113041,46 113042,75912 113043,861 113044,22 113045,113046 113048,907 113050,406 113051,1179 113053,660 113054,2315 113055,3623 113056,1745 113057,140 113058,1240 113059,146 113060,1844 113060,113060 113061,356 113061,387 113062,83 113063,298 113064,485 113066,1085 113068,269 113069,1634 113070,720 113071,602 113072,209 113072,861 113073,1388 113074,515 113075,298 113076,485 113077,510 113078,433 113079,3623 113080,3623 113081,644 113082,3769 113083,3367 113084,113085 113086,24763 113087,83 113088,298 113089,485 113090,113091 113092,136 113092,459 113092,2557 113093,1837 113094,1019 113094,3367 113095,920 113096,515 113096,1381 113096,1511 113096,3069 113098,3507 113099,435 113100,941 113101,1801 113102,4611 113103,503 113106,843 113107,356 113109,175 113111,178 113111,1033 113112,298 113113,835 113114,252 113115,557 113117,3872 113118,298 113119,485 113120,298 113121,485 113122,3069 113123,1235 113123,1335 113123,5375 113125,106 113126,358 113127,298 113128,485 113129,2411 113131,3367 113132,175 113133,850 113134,113135 113136,298 113137,1309 113138,772 113139,392 113140,10 113140,86780 113140,86782 113140,86790 113141,113142 113143,113144 113145,827 113146,271 113147,68 113148,704 113149,113150 113149,227725 113151,376 113152,536 113153,1858 113154,1860 113155,893 113156,10 113156,73 113156,175 113156,693 113156,1113 113156,1306 113156,4260 113156,8664 113156,19336 113156,20107 113156,20351 113156,23217 113156,30946 113156,32699 113156,38121 113156,39039 113156,39492 113156,41041 113156,42900 113156,43180 113156,45929 113156,51557 113156,55437 113156,61577 113156,64935 113156,66724 113156,67399 113156,69509 113156,73185 113156,83971 113156,85165 113156,86779 113156,86790 113156,93853 113156,106436 113156,110256 113156,113156 113156,113160 113156,125118 113156,125719 113156,126055 113156,127825 113156,130522 113156,134100 113156,136289 113156,136644 113156,136923 113156,140274 113156,140276 113156,142083 113156,142093 113156,143023 113156,143473 113156,153202 113156,153350 113156,154531 113156,154864 113156,156186 113156,157508 113156,159259 113156,159659 113156,160577 113156,161025 113156,162698 113156,163661 113156,163875 113156,163883 113156,164163 113156,164166 113156,164200 113156,164307 113156,166742 113156,166999 113156,167188 113156,167881 113156,169041 113156,169050 113156,169631 113156,170027 113156,171449 113156,172382 113156,174123 113156,174345 113156,175608 113156,176207 113156,176627 113156,177045 113156,177554 113156,180746 113156,181552 113156,181982 113156,182667 113156,183089 113156,183917 113156,184084 113156,185041 113156,186029 113156,186737 113156,188926 113156,189672 113156,190358 113156,191541 113156,198950 113156,212205 113156,214302 113156,215749 113156,216445 113156,217810 113156,218248 113156,226069 113156,226614 113156,227490 113156,227588 113156,228765 113156,229289 113156,229964 113156,232339 113156,232401 113156,236151 113156,242535 113156,244472 113156,244904 113156,248991 113156,250982 113156,251020 113156,252752 113156,252917 113156,253020 113156,253380 113156,254395 113156,259835 113156,259852 113156,260644 113156,262200 113157,372 113157,1085 113157,2812 113158,298 113159,485 113161,140 113162,267 113163,2116 113164,113165 113167,59 113167,83 113167,994 113167,1252 113167,1253 113167,3794 113167,4691 113168,2244 113169,1458 113170,147 113171,184 113172,206 113173,113173 113174,113175 113176,113175 113177,704 113178,81 113179,577 113180,422 113181,422 113182,3695 113183,83 113183,991 113183,1089 113183,1623 113183,30331 113184,298 113185,485 113188,422 113189,422 113190,142870 113190,148600 113192,113193 113194,252 113195,113196 113197,6119 113198,147 113199,113200 113201,113201 113202,3623 113203,147 113203,195 113204,83 113205,994 113207,2867 113207,2868 113208,392 113209,611 113211,586 113212,29380 113213,872 113214,483 113215,2590 113216,149 113217,298 113218,485 113220,207 113221,10 113221,113140 113222,10 113222,693 113222,1188 113222,32475 113223,175 113224,149 113225,113226 113225,114903 113227,298 113228,89035 113229,872 113230,1429 113231,994 113232,885 113232,13704 113233,298 113234,485 113235,113236 113237,668 113238,406 113240,1240 113241,1962 113242,957 113242,1815 113243,113244 113243,120191 113245,872 113246,602 113247,1143 113248,206 113249,818 113250,217 113250,20359 113251,113252 113253,406 113254,309 113254,310 113255,113256 113257,333 113258,113259 113258,147634 113261,1803 113262,10 113263,137 113265,113266 113267,184 113268,366 113270,113271 113270,125076 113270,129595 113270,179581 113270,220371 113270,238471 113270,239384 113272,294 113273,35687 113274,1133 113275,289 113275,290 113276,2590 113277,222 113277,1019 113278,113279 113280,2146 113281,3321 113282,7416 113284,113285 113286,113287 113288,581 113290,1769 113290,5547 113291,310 113292,772 113294,77 113295,1458 113296,346 113297,1821 113298,273 113298,2367 113299,202 113300,1085 113301,657 113302,1467 113303,392 113304,206 113305,217 113306,388 113307,2424 113308,298 113309,485 113310,328 113311,175 113314,113315 113316,233 113317,1871 113318,811 113319,113319 113320,175 113321,298 113322,298 113323,485 113324,861 113325,22 113326,2373 113328,873 113330,435 113330,515 113330,1381 113330,2867 113330,2868 113332,113333 113334,1977 113334,1978 113335,355 113336,225 113336,932 113336,1252 113336,1253 113336,141912 113337,6119 113338,79 113340,4 113340,5 113341,63 113341,79 113341,251 113341,442 113341,516 113341,779 113341,30331 113342,862 113342,1631 113343,13980 113344,83 113345,298 113346,485 113347,298 113348,485 113349,31977 113350,861 113351,22 113352,302 113353,68 113353,356 113353,852 113353,2590 113353,4411 113355,387 113358,718 113359,452 113359,535 113359,918 113359,1655 113360,929 113363,207 113364,640 113365,640 113366,640 113367,640 113368,640 113369,467 113370,79 113371,1927 113372,861 113373,22 113374,422 113375,13661 113376,22 113377,861 113378,852 113379,557 113381,8270 113382,22 113383,861 113385,422 113386,557 113387,422 113388,422 113389,422 113390,422 113391,422 113393,422 113394,422 113395,422 113396,422 113397,1858 113398,1860 113399,1132 113400,781 113401,217 113403,422 113404,422 113405,422 113406,1132 113407,781 113408,251 113408,516 113409,422 113410,9010 113411,872 113412,146 113413,626 113415,467 113416,28072 113418,113419 113420,83 113422,1132 113423,781 113425,1860 113425,6955 113426,13538 113427,2775 113428,447 113429,850 113429,1118 113430,1785 113431,3 113433,592 113434,3695 113435,647 113436,344 113437,2572 113438,1309 113439,113440 113441,397 113442,340 113443,19986 113446,217 113446,1118 113447,772 113447,1282 113447,1332 113448,1858 113449,1860 113450,1655 113451,459 113451,518 113451,631 113451,973 113451,1479 113452,175 113453,298 113454,349 113455,592 113458,15179 113459,89035 113460,119 113460,151 113460,192 113460,309 113460,310 113460,577 113460,1167 113460,1400 113461,586 113462,151 113463,1531 113464,113465 113467,1707 113469,934 113470,3367 113471,137 113471,200 113471,772 113471,1332 113472,50 113473,113474 113475,515 113476,356 113477,586 113479,1289 113479,1509 113479,131675 113480,1467 113482,1058 113483,221 113484,20 113486,113487 113488,79 113489,221 113490,119 113491,298 113492,485 113493,71 113494,113495 113494,122080 113496,222 113496,1019 113498,83 113499,973 113500,107 113500,805 113502,113503 113504,390 113504,626 113504,649 113504,1151 113504,1381 113504,1452 113504,1579 113504,6027 113505,83 113506,222 113506,13661 113507,264 113508,275 113509,1390 113510,1390 113511,347 113512,1893 113512,191860 113514,298 113515,485 113516,1707 113518,113519 113520,1007 113521,893 113521,35092 113522,1007 113523,1007 113524,25222 113525,408 113526,1323 113527,102 113528,1326 113529,657 113530,941 113531,536 113532,1130 113532,1844 113535,868 113536,30 113537,968 113538,1688 113539,3695 113540,1 113541,760 113541,1368 113542,113542 113543,1085 113544,3623 113545,1132 113546,781 113547,301 113548,1007 113549,713 113551,1132 113552,781 113553,1072 113554,30 113555,10 113555,693 113556,68069 113557,240 113558,1659 113559,104 113561,1836 113561,13361 113562,626 113563,1608 113564,657 113565,1007 113566,298 113567,485 113568,1007 113569,30 113570,657 113571,9121 113572,2617 113573,459 113573,980 113573,1381 113574,366 113575,83209 113578,113579 113580,1240 113581,184 113582,718 113583,346 113584,2116 113585,2266 113585,23287 113585,127158 113585,181063 113585,190492 113585,212914 113586,406 113587,200 113588,1132 113589,781 113590,10 113591,72 113592,113593 113597,30 113598,392 113598,918 113598,2979 113599,1181 113601,211 113602,1436 113603,140 113604,1 113604,147 113604,1515 113605,1298 113606,379 113607,1132 113608,781 113609,175 113610,389 113612,113613 113614,298 113615,30 113616,1001 113617,30 113618,1479 113618,1801 113619,113620 113621,493 113622,215 113623,158 113623,406 113623,779 113623,1515 113624,4611 113625,1927 113626,14483 113627,6051 113628,626 113629,536 113630,83 113631,217 113632,994 113633,83 113634,843 113635,1417 113636,104 113637,392 113638,3297 113639,660 113640,151 113641,2146 113642,2353 113644,30 113645,994 113646,30 113647,602 113648,3804 113649,1715 113650,1231 113651,3422 113652,626 113653,968 113654,1298 113655,233 113656,5662 113657,3 113658,1001 113659,63 113660,518 113661,14797 113662,779 113663,30 113664,366 113665,136 113666,30 113667,298 113668,485 113669,72 113670,366 113671,862 113672,175 113673,3623 113674,298 113675,7360 113676,66297 113677,2105 113678,6487 113679,4220 113680,333 113681,1608 113682,818 113683,3623 113684,72 113685,113686 113687,30 113688,994 113690,209 113691,1858 113692,1860 113693,1858 113694,1860 113695,72 113696,217 113697,3623 113698,103860 113700,83 113701,3623 113702,3623 113703,994 113704,113704 113707,557 113707,954 113707,1939 113708,918 113710,483 113711,298 113712,485 113713,2923 113713,4190 113714,3623 113715,30 113716,113717 113718,599 113719,2506 113720,30 113721,240 113722,1983 113723,255 113724,862 113725,106 113726,1132 113727,781 113728,1132 113729,781 113730,1326 113731,2782 113732,557 113733,872 113736,30 113738,222 113739,994 113740,113741 113742,657 113743,160 113744,160 113745,252 113745,1220 113745,1222 113746,43203 113747,1556 113748,113749 113750,206 113751,30 113752,1359 113753,113754 113755,483 113756,1132 113757,781 113758,483 113758,644 113759,1085 113760,372 113760,1285 113761,442 113763,10 113763,113156 113764,657 113765,113765 113766,113767 113768,1858 113769,1860 113770,113771 113772,602 113773,435 113774,83 113775,113776 113777,682 113777,72439 113778,843 113779,356 113780,1227 113780,5405 113780,86416 113781,647 113782,34 113782,35 113782,283 113782,536 113782,1201 113782,1274 113782,2266 113782,2671 113782,2784 113782,7092 113784,113785 113786,861 113787,22 113788,195 113789,175 113790,298 113791,163 113791,818 113791,868 113793,304 113794,850 113795,850 113796,113797 113798,104 113798,136 113798,1368 113799,7 113799,22 113799,211 113799,2017 113800,113801 113802,32 113803,1001 113804,72 113805,72 113806,1235 113806,1335 113807,255 113808,184 113809,1659 113810,8992 113811,602 113812,30 113813,113814 113815,1927 113817,68 113817,843 113818,30 113819,72 113820,479 113822,72 113823,2506 113824,1235 113824,1335 113825,113826 113827,30 113828,1449 113829,113830 113831,72 113833,366 113834,366 113836,1019 113837,30 113838,113839 113840,406 113841,346 113842,233 113843,146 113843,994 113843,1204 113844,1132 113845,781 113846,113847 113848,525 113848,1326 113849,491 113850,355 113851,5987 113852,557 113853,406 113853,422 113853,779 113853,113854 113853,116327 113853,120682 113855,252 113856,298 113857,485 113858,269 113859,113860 113861,312 113862,72 113865,328 113866,217 113866,392 113866,779 113868,1858 113869,1860 113870,10 113870,175 113871,433 113872,55849 113873,1181 113874,5405 113875,1858 113876,1860 113877,32 113877,3003 113878,403 113878,693 113878,7795 113878,20030 113878,147758 113879,1105 113880,298 113881,485 113882,328 113883,640 113884,640 113885,640 113886,37 113886,1782 113887,50 113888,3623 113889,1858 113890,1860 113891,422 113892,452 113892,535 113892,918 113892,1655 113893,349 113894,2699 113895,422 113896,422 113897,422 113898,657 113899,422 113900,422 113902,422 113903,422 113904,408 113905,1983 113906,298 113907,485 113908,1130 113909,682 113909,72439 113910,1782 113911,5405 113912,298 113913,485 113915,1983 113916,991 113917,113918 113919,433 113920,422 113921,647 113922,422 113923,422 113924,422 113925,422 113927,579 113928,252 113929,1983 113931,599 113933,510 113934,1688 113935,3623 113936,87 113937,1531 113937,2178 113937,4545 113937,139010 113939,631 113939,1285 113939,84257 113940,68 113941,30 113942,1962 113943,577 113944,1449 113945,920 113946,6119 113947,206 113948,3623 113949,626 113950,298 113951,485 113952,973 113953,217 113954,602 113955,794 113958,158 113958,192 113958,1181 113958,1531 113958,103153 113959,481 113959,1135 113959,1172 113959,1191 113959,1204 113959,1663 113959,5213 113959,14674 113960,298 113961,485 113962,510 113963,509 113964,113965 113966,859 113967,292 113969,760 113969,1177 113969,2210 113970,536 113971,1118 113973,360 113973,1893 113973,49057 113974,1556 113975,298 113976,485 113977,298 113978,485 113979,3623 113980,72 113981,299 113982,41 113982,1285 113983,298 113984,485 113985,1181 113987,1285 113988,1181 113989,1285 113990,1977 113990,1978 113991,1285 113992,30 113993,30 113994,4611 113995,30 113996,298 113997,485 113998,1298 113999,1509 114000,137 114001,850 114002,1151 114003,21408 114004,5933 114004,6506 114005,114006 114007,114006 114008,1474 114009,452 114009,1655 114010,1858 114011,1860 114012,30 114013,536 114014,206 114015,510 114016,83 114016,385 114016,447 114016,5874 114017,1240 114018,4193 114019,149 114019,158 114019,406 114020,130 114021,147 114022,7155 114023,6068 114024,97 114025,21408 114026,30 114027,83 114027,784 114028,1390 114029,1858 114030,1860 114031,577 114032,611 114033,30 114034,1860 114035,794 114036,114037 114038,114037 114039,120 114040,58 114041,760 114043,3585 114044,4611 114045,1544 114046,30 114047,1634 114048,1127 114048,1893 114048,49057 114049,175 114050,298 114051,298 114052,485 114053,47 114053,2469 114054,422 114056,184 114057,1010 114058,1274 114059,602 114060,59931 114060,84257 114061,2775 114062,175 114062,485 114063,3623 114064,72 114064,240 114064,372 114064,442 114064,588 114064,590 114064,714 114064,1016 114064,1368 114064,1745 114064,8180 114066,875 114067,602 114069,31237 114071,875 114072,289 114072,290 114072,94134 114073,403 114074,2989 114074,2991 114075,163 114076,4611 114077,1544 114078,302 114078,861 114079,714 114080,623 114080,1805 114081,4611 114082,1544 114083,302 114083,579 114084,3209 114085,37 114086,775 114087,827 114089,1983 114090,200 114091,493 114092,1119 114092,84257 114094,483 114095,1983 114096,7698 114097,1983 114098,1240 114099,752 114100,298 114101,485 114102,1274 114102,5933 114102,6506 114103,298 114104,485 114105,1130 114106,467 114107,298 114108,485 114109,120 114110,72 114111,433 114112,269 114113,626 114114,14434 114115,79 114116,114117 114118,417 114120,298 114121,485 114122,805 114123,2989 114123,2991 114124,30 114125,7117 114126,160 114126,1381 114127,1285 114128,58 114129,994 114130,46 114131,75912 114132,859 114134,294 114135,1285 114136,393 114136,980 114137,349 114138,1871 114139,392 114140,298 114141,485 114142,30 114143,298 114144,485 114145,30 114146,68 114147,1181 114148,1082 114149,207 114151,175 114152,1082 114153,298 114154,647 114155,1235 114155,1335 114156,30 114157,30 114158,623 114158,852 114158,1240 114159,3507 114160,1007 114161,850 114162,289 114162,290 114163,3623 114164,1235 114164,1335 114164,1684 114167,640 114168,28072 114169,3623 114170,1860 114172,2646 114173,1381 114174,586 114175,516 114176,251 114176,693 114176,1677 114177,251 114178,103860 114179,1983 114180,114181 114182,66297 114183,392 114185,441 114186,1891 114187,301 114189,114190 114191,83 114192,1238 114194,2915 114194,72439 114195,209 114195,2253 114196,1749 114197,120 114198,72 114199,2244 114201,733 114202,1556 114203,349 114203,809 114204,1955 114205,114206 114207,346 114208,5366 114209,114210 114211,211 114211,809 114212,175 114213,298 114214,114215 114216,114217 114218,72 114220,1033 114222,862 114223,114224 114225,298 114226,485 114227,72 114228,30 114229,592 114230,114231 114233,114234 114235,83 114236,206 114237,30 114238,34 114238,6068 114240,586 114241,2506 114242,111 114242,13136 114243,2506 114244,114244 114245,66297 114246,160 114247,1677 114248,557 114249,114250 114251,346 114253,435 114254,376 114255,885 114255,13704 114256,302 114257,233 114262,298 114263,485 114264,843 114265,233 114266,356 114267,310 114269,1608 114270,415 114271,920 114272,298 114273,485 114274,178 114275,30 114276,346 114277,30 114278,1082 114279,483 114280,872 114282,538 114282,577 114282,1294 114282,33298 114283,114284 114285,114286 114287,1243 114288,14989 114289,1010 114290,1801 114291,31896 114292,388 114293,23701 114294,72 114295,392 114296,3069 114297,44 114297,861 114298,114299 114300,1181 114301,30 114302,72 114303,114304 114305,72 114306,114307 114308,602 114309,298 114310,485 114312,30 114313,1243 114314,222 114315,1235 114315,17588 114317,980 114318,310 114319,1243 114320,118 114320,4597 114321,1243 114322,114323 114324,1238 114325,114326 114327,30 114330,366 114331,585 114332,4475 114333,7270 114334,366 114335,366 114336,72 114337,1243 114338,346 114339,175 114340,872 114341,1243 114342,805 114343,2048 114344,298 114345,485 114346,298 114347,485 114348,310 114349,1243 114350,1243 114351,1243 114352,1243 114353,467 114353,1167 114353,1368 114354,941 114355,602 114356,1243 114357,32 114358,702 114358,873 114359,233 114360,137 114361,137 114363,1243 114364,75912 114365,794 114366,298 114367,485 114368,1243 114369,298 114370,485 114371,30 114372,1243 114373,1452 114374,452 114374,457 114374,535 114374,676 114374,918 114374,1655 114375,114376 114377,209 114378,1243 114379,1860 114380,1243 114381,255 114382,1858 114383,1860 114384,1858 114385,1860 114386,1243 114387,3003 114388,298 114389,485 114390,114391 114392,104 114393,32475 114394,1058 114395,1983 114396,1860 114398,1243 114399,1243 114400,6955 114401,536 114402,1243 114403,1243 114404,425 114405,298 114406,485 114407,1858 114408,1860 114409,5213 114410,1776 114411,602 114412,5405 114413,2506 114414,289 114414,609 114414,2315 114414,94134 114415,107 114416,114417 114418,298 114419,485 114420,298 114421,485 114423,640 114424,640 114425,298 114426,485 114427,217 114429,114430 114431,2353 114432,298 114433,485 114434,298 114435,485 114436,1243 114437,726 114438,30 114439,209 114439,861 114440,30 114441,1243 114442,422 114443,422 114444,422 114445,79 114445,301 114445,760 114446,292 114446,2367 114447,30 114448,663 114449,1243 114451,907 114452,1243 114453,2674 114453,16153 114455,2590 114456,536 114456,1860 114457,422 114458,56 114461,1096 114463,95554 114464,1837 114465,875 114466,422 114467,422 114469,422 114470,422 114471,2775 114472,447 114473,422 114474,1243 114475,422 114476,264 114476,1509 114477,1243 114478,209 114480,1243 114481,779 114481,1181 114481,1515 114482,422 114483,56 114485,301 114486,114487 114488,1243 114489,346 114490,1858 114491,1860 114492,355 114493,1127 114493,49057 114494,1243 114495,1243 114496,68069 114497,1332 114497,1844 114499,483 114500,1572 114501,2979 114502,422 114503,56 114504,1977 114504,1978 114505,114506 114507,1983 114508,1007 114509,718 114510,114511 114512,425 114513,1243 114514,422 114515,56 114516,137 114517,83 114519,1836 114519,13361 114520,1243 114521,50 114522,1243 114523,682 114523,72439 114524,1243 114525,994 114526,1243 114527,5265 114528,1243 114529,1133 114530,994 114533,1983 114534,3623 114536,1983 114537,44 114538,1243 114540,104 114540,302 114541,1243 114542,527 114542,1663 114542,95152 114543,63 114543,106 114543,251 114543,439 114543,516 114543,1220 114543,1222 114543,1243 114543,1512 114543,5992 114543,6119 114543,16201 114544,779 114544,3769 114545,1243 114546,693 114547,718 114547,45437 114548,1243 114549,269 114550,1243 114551,195 114552,2244 114554,79 114555,298 114556,485 114557,114558 114560,50 114560,79 114560,192 114560,195 114560,422 114560,859 114560,994 114560,4455 114560,6051 114560,6119 114561,536 114562,86 114564,298 114565,485 114566,417 114568,2266 114569,589 114570,676 114571,1243 114572,3069 114573,1243 114574,1243 114575,107 114576,1243 114577,147 114577,158 114578,114579 114580,920 114581,733 114581,1257 114582,420 114582,114590 114583,1298 114584,875 114585,3367 114586,843 114587,1644 114588,3367 114589,6119 114591,408 114592,1323 114593,102 114594,1326 114595,72 114596,493 114597,287 114597,809 114598,3623 114599,1390 114600,693 114602,3623 114604,209 114604,861 114605,2607 114606,467 114606,868 114607,1522 114608,1805 114610,107 114611,503 114611,114581 114612,2574 114614,81 114615,200 114616,186 114616,801 114617,1298 114618,4220 114619,79 114620,314 114620,392 114620,599 114621,83 114622,694 114622,1240 114623,1837 114624,83 114625,301 114625,1782 114626,3602 114627,349 114628,83 114629,202 114629,203 114630,301 114630,968 114630,1167 114630,1544 114630,1837 114630,2083 114630,3194 114630,3207 114630,3218 114630,5662 114631,1425 114632,83 114633,160 114633,671 114633,1147 114633,1623 114636,483 114637,346 114638,1010 114639,1983 114640,19 114641,2371 114643,392 114643,1210 114644,392 114645,346 114646,338 114647,941 114648,278 114649,298 114650,485 114651,2506 114652,13980 114653,72 114654,392 114658,298 114659,485 114661,175 114662,298 114663,346 114664,103860 114667,1858 114668,1860 114670,1659 114671,994 114671,1052 114673,222 114674,83 114675,240 114675,1955 114677,114677 114678,3623 114680,289 114680,304 114680,1119 114680,4411 114680,94134 114681,83 114682,972 114682,973 114682,1010 114682,1298 114682,3804 114682,124668 114682,171641 114682,187176 114683,55849 114684,8308 114685,103860 114686,55849 114687,195 114688,55849 114689,447 114689,538 114690,809 114691,55849 114692,114693 114694,55849 114695,83 114696,72 114697,304 114698,4611 114699,1544 114700,147 114701,4611 114702,1544 114703,743 114705,298 114706,485 114707,1467 114710,717 114712,1220 114712,1222 114713,252 114714,251 114715,3623 114716,114717 114718,3623 114719,86 114720,114721 114722,557 114723,8719 114724,138 114725,865 114726,557 114727,137 114728,118 114728,4597 114729,88820 114730,557 114731,1556 114732,557 114733,1801 114734,114735 114734,140049 114734,143176 114736,557 114737,140 114738,240 114738,301 114741,114742 114743,240 114743,1715 114744,1243 114745,114746 114747,704 114748,222 114749,1001 114749,1326 114749,3193 114749,3804 114749,14797 114750,1801 114751,676 114752,146 114754,114755 114756,114757 114759,255 114760,114761 114762,114763 114764,114765 114767,3297 114768,114769 114772,114773 114775,4453 114776,114777 114778,114778 114779,114780 114781,114780 114782,114780 114783,114780 114784,114785 114786,225 114789,114790 114791,114792 114793,114794 114795,850 114796,233 114797,206 114798,267 114799,292 114800,585 114801,4453 114803,8884 114804,30 114805,355 114806,114807 114808,1085 114809,83 114812,366 114813,366 114814,366 114815,366 114816,366 114817,83 114818,652 114819,333 114820,25348 114820,101688 114821,25348 114821,101688 114822,83 114823,114824 114825,114826 114829,114830 114832,83 114833,83 114834,83 114835,83 114836,968 114838,130 114838,1007 114838,1289 114839,1634 114840,439 114840,586 114840,875 114840,1284 114840,1293 114840,1370 114840,1740 114840,23287 114840,127158 114841,657 114842,779 114843,760 114843,1119 114843,1149 114843,1631 114844,424 114845,1860 114846,333 114846,1289 114847,310 114848,592 114849,44 114850,114851 114852,1298 114853,114854 114855,114856 114857,114858 114859,366 114860,422 114861,56 114862,1298 114863,408 114864,1323 114865,102 114866,1326 114867,9318 114868,114869 114870,114871 114872,406 114873,805 114874,310 114875,114876 114877,1127 114878,267 114880,602 114881,1474 114882,1019 114883,3623 114884,2334 114885,392 114886,114887 114888,72 114889,72 114890,1058 114892,298 114893,485 114894,192 114895,10 114896,3003 114897,72 114898,536 114899,114900 114901,66297 114902,483 114904,3623 114905,3623 114906,3623 114907,3623 114908,240 114908,1402 114908,1818 114908,178576 114909,3623 114910,2146 114911,114912 114913,2266 114914,346 114915,114916 114917,114918 114919,79 114919,106 114919,192 114919,202 114919,333 114919,586 114919,1033 114919,1370 114919,17772 114920,114921 114923,406 114924,114925 114926,118 114926,4597 114927,1238 114928,1116 114928,1332 114928,1844 114930,114931 114932,114933 114935,30 114937,255 114938,557 114939,1522 114940,30 114942,1479 114943,390 114944,296 114945,298 114946,485 114947,72 114948,114949 114950,114951 114952,48 114952,140 114952,1052 114953,503 114954,406 114954,21442 114955,1247 114956,114957 114958,72 114959,114960 114961,805 114962,3 114962,50 114962,68 114962,81 114962,106 114962,120 114962,147 114962,158 114962,178 114962,186 114962,200 114962,202 114962,215 114962,217 114962,233 114962,240 114962,252 114962,261 114962,264 114962,289 114962,294 114962,328 114962,332 114962,337 114962,372 114962,387 114962,388 114962,406 114962,422 114962,431 114962,435 114962,493 114962,510 114962,516 114962,586 114962,592 114962,611 114962,631 114962,694 114962,704 114962,707 114962,760 114962,784 114962,818 114962,875 114962,1001 114962,1016 114962,1068 114962,1082 114962,1149 114962,1175 114962,1181 114962,1212 114962,1243 114962,1257 114962,1282 114962,1285 114962,1309 114962,1419 114962,1466 114962,1511 114962,1564 114962,1608 114962,1631 114962,1635 114962,1715 114962,1785 114962,1796 114962,1801 114962,1807 114962,1818 114962,1821 114962,1877 114962,1888 114962,1927 114962,1955 114962,1962 114962,1985 114962,2045 114962,2205 114962,2286 114962,2315 114962,2411 114962,2590 114962,2620 114962,2775 114962,2797 114962,2812 114962,2989 114962,2991 114962,3069 114962,3115 114962,3135 114962,3182 114962,3319 114962,3328 114962,3467 114962,4193 114962,4218 114962,4237 114962,4545 114962,5440 114962,5718 114962,6424 114962,6638 114962,6837 114962,7155 114962,8180 114962,9001 114962,9005 114962,9015 114962,9021 114962,9024 114962,9025 114962,11147 114962,20535 114962,21736 114962,26041 114962,27041 114962,27550 114962,28107 114962,33424 114962,54004 114962,56150 114962,94134 114962,101473 114962,101474 114962,182162 114964,114965 114966,114967 114970,147 114970,23783 114973,1955 114974,114975 114976,114977 114978,113156 114979,713 114980,109308 114981,109308 114982,109308 114983,114984 114985,114986 114987,503 114987,33424 114988,114989 114990,114991 114992,114993 114994,114994 114995,72 114996,233 114999,115000 115002,107 115003,2416 115003,2417 115004,292 115005,338 115006,298 115007,1133 115008,3538 115009,115010 115011,206 115012,355 115014,2266 115015,115016 115018,115019 115020,346 115021,795 115023,298 115024,485 115025,137 115026,83 115027,1458 115028,147 115028,1458 115029,44 115030,147 115030,1458 115031,841 115032,115033 115034,115035 115036,135 115037,346 115038,115039 115040,2779 115041,255 115042,255 115043,58 115044,115045 115046,103860 115047,115048 115049,10 115049,251 115049,1370 115050,250 115050,493 115050,1453 115050,1684 115050,118054 115050,164657 115052,269 115053,1515 115054,14434 115055,115056 115057,1462 115057,20790 115058,602 115059,602 115060,206 115061,2506 115062,872 115063,872 115064,68069 115065,392 115066,287 115066,809 115066,19010 115068,115069 115070,1436 115071,115072 115073,115072 115074,72 115075,115 115075,118 115076,1796 115077,158 115078,115079 115080,422 115081,56 115082,483 115084,115085 115084,116328 115086,346 115087,1927 115088,305 115089,920 115090,422 115091,56 115092,115093 115094,83 115095,103860 115096,30 115097,1146 115098,103860 115100,2506 115101,255 115102,115103 115105,115105 115106,115 115106,118 115107,433 115108,1102 115109,115110 115111,115112 115113,115114 115115,115116 115117,1149 115119,557 115120,862 115121,115122 115123,115123 115124,1058 115125,298 115126,485 115128,34 115128,35 115128,1313 115129,115130 115131,115132 115133,115132 115134,115132 115135,115136 115137,1007 115138,477 115139,455 115139,1019 115140,704 115141,1149 115143,1014 115144,968 115145,115146 115150,3260 115151,2775 115152,447 115153,115154 115153,172167 115155,120 115155,4691 115157,83 115157,217 115157,222 115157,261 115157,283 115157,379 115157,455 115157,536 115157,657 115157,694 115157,781 115157,1072 115157,1274 115157,1467 115157,1608 115157,1718 115157,1881 115157,2266 115157,2646 115157,2671 115157,2779 115157,2784 115157,3252 115157,4594 115157,6888 115157,29475 115157,37088 115158,115159 115160,115161 115162,10 115164,30 115164,1179 115165,7416 115166,640 115167,843 115168,83 115168,259 115168,500 115168,3507 115169,1707 115170,301 115171,115172 115173,19227 115175,115176 115177,292 115178,115179 115180,294 115181,1238 115182,296 115183,779 115183,4193 115184,298 115185,115186 115187,1452 115188,222 115189,137 115190,83 115191,233 115192,115193 115194,83 115195,83 115196,393 115197,115198 115199,115200 115201,115202 115203,115204 115205,366 115206,366 115207,366 115208,366 115209,452 115209,535 115209,676 115209,918 115209,1655 115210,115211 115213,115214 115215,115216 115217,115216 115218,346 115220,312 115221,2867 115221,2868 115222,256 115222,1014 115223,20813 115224,258 115225,349 115226,355 115227,1118 115229,4355 115230,298 115231,485 115232,602 115233,73570 115234,115235 115234,243312 115236,704 115237,10 115238,1572 115239,1837 115240,298 115241,920 115242,422 115243,20 115243,577 115243,2931 115244,602 115245,389 115246,72 115247,79 115248,602 115249,2083 115250,640 115251,818 115251,1807 115251,1955 115252,718 115253,1019 115254,422 115255,422 115256,422 115257,422 115258,422 115259,422 115260,422 115261,422 115262,1977 115262,1978 115263,302 115263,2116 115264,309 115264,310 115265,422 115266,422 115267,115268 115269,422 115270,83 115271,6119 115272,83 115273,83 115274,115275 115276,255 115277,827 115278,875 115279,115280 115281,83 115282,49057 115283,1118 115285,302 115286,1634 115287,841 115288,44 115289,217 115289,872 115289,1796 115289,2626 115290,406 115290,779 115291,2367 115294,222 115295,1659 115296,217 115298,588 115298,590 115298,805 115299,22 115299,192 115299,217 115300,595 115301,302 115302,500 115303,200 115304,200 115305,795 115306,301 115308,115309 115310,483 115311,1556 115312,10 115313,115314 115316,1289 115318,718 115319,422 115320,56 115321,171 115322,252 115322,1220 115322,1222 115325,175 115326,1722 115327,298 115328,163 115329,1619 115330,907 115332,1122 115333,149 115335,1858 115336,1860 115337,3367 115338,115339 115340,442 115341,147 115341,23783 115342,422 115343,56 115344,115345 115346,115347 115348,115348 115349,298 115350,485 115351,240 115352,222 115353,2605 115354,859 115355,171 115356,217 115357,10 115357,175 115357,184 115357,206 115358,115359 115360,577 115361,1465 115362,920 115363,1274 115364,536 115365,261 115366,309 115366,310 115367,13538 115369,248 115369,1284 115370,422 115371,56 115372,149 115372,406 115373,215 115374,2989 115374,2991 115375,49887 115376,704 115377,175 115378,3623 115379,79 115380,298 115381,3960 115382,337 115383,115384 115385,115386 115388,310 115389,536 115389,779 115390,1769 115391,536 115392,30 115393,483 115394,34 115394,349 115394,392 115394,433 115394,623 115394,644 115394,697 115394,1860 115396,195 115397,104 115398,704 115399,1 115400,1531 115401,1363 115402,200 115402,225 115402,772 115403,1659 115404,717 115405,50 115406,2367 115407,3623 115408,536 115410,422 115411,56 115412,1007 115413,79 115414,55849 115415,55849 115416,55849 115417,55849 115418,55849 115419,115420 115421,843 115422,55849 115423,1070 115424,346 115425,717 115426,376 115427,3623 115428,885 115428,13704 115429,55849 115430,4611 115431,818 115432,175 115433,298 115434,389 115435,358 115436,862 115437,557 115438,298 115439,485 115440,477 115440,23287 115440,127158 115440,214240 115441,3623 115443,278 115444,55849 115445,115446 115447,115446 115448,387 115449,115450 115451,704 115452,115453 115454,2116 115455,1807 115456,328 115457,2701 115458,1509 115459,1893 115460,406 115461,192 115461,406 115462,2506 115463,158 115463,30428 115464,115465 115467,577 115468,175 115469,298 115470,704 115471,202 115471,203 115472,298 115473,485 115474,8 115474,34 115474,35 115474,54 115474,83 115474,222 115474,278 115474,283 115474,302 115474,313 115474,314 115474,336 115474,338 115474,379 115474,397 115474,452 115474,455 115474,457 115474,536 115474,599 115474,634 115474,635 115474,676 115474,781 115474,838 115474,843 115474,849 115474,891 115474,949 115474,1011 115474,1014 115474,1118 115474,1130 115474,1274 115474,1417 115474,1434 115474,1566 115474,1618 115474,1663 115474,1881 115474,1916 115474,2159 115474,2224 115474,2319 115474,2373 115474,2421 115474,2424 115474,2646 115474,2784 115474,2821 115474,3672 115474,4048 115474,4190 115474,4234 115474,4579 115474,6822 115474,6880 115474,6904 115474,7092 115474,7698 115474,7767 115474,7768 115474,9457 115474,13622 115474,13868 115474,14094 115474,17116 115474,17273 115474,18831 115474,19413 115474,19443 115474,20757 115474,24274 115474,25272 115474,28130 115474,37088 115474,63097 115474,107100 115474,112964 115474,115474 115474,120759 115474,127158 115474,127776 115474,138701 115474,146304 115474,151760 115474,157052 115474,160809 115474,168522 115474,171621 115474,171710 115474,173332 115474,175944 115474,175945 115474,176430 115474,181063 115474,188791 115474,190108 115474,194138 115474,194315 115474,207659 115474,212914 115474,221547 115474,236740 115474,237026 115474,238184 115474,241554 115474,244132 115474,248552 115476,2506 115477,788 115478,1509 115479,3 115479,32 115479,37 115479,255 115479,337 115479,392 115479,467 115479,510 115479,516 115479,586 115479,595 115479,663 115479,697 115479,707 115479,818 115479,932 115479,972 115479,973 115479,1010 115479,1085 115479,1118 115479,1175 115479,1243 115479,1265 115479,1266 115479,1284 115479,1370 115479,1462 115479,1465 115479,1580 115479,1776 115479,1801 115479,1821 115479,1837 115479,1860 115479,1927 115479,1985 115479,2045 115479,2191 115479,2296 115479,2782 115479,2995 115479,3182 115479,3804 115479,3999 115479,6303 115479,6424 115479,6638 115479,7194 115479,8537 115479,9028 115479,44725 115480,3209 115481,406 115482,356 115483,8854 115484,1309 115485,115486 115487,147 115487,158 115488,1707 115490,298 115491,485 115492,1608 115494,1181 115495,516 115496,207 115498,207 115499,115500 115503,536 115504,2590 115505,9195 115506,1429 115507,115508 115509,668 115510,602 115512,115513 115514,258 115515,872 115516,115517 115518,115519 115521,1776 115522,269 115523,422 115524,56 115525,1143 115526,779 115527,171 115528,918 115529,7124 115530,1955 115531,104 115531,134 115531,136 115531,137 115531,138 115531,205627 115533,115534 115536,115537 115536,170475 115536,172505 115538,289 115538,290 115539,147 115539,1458 115539,80266 115539,89035 115539,102560 115540,115541 115542,115543 115544,4545 115545,1509 115546,115547 115548,115549 115550,115551 115552,4545 115552,139010 115553,215 115554,227 115556,2671 115557,251 115558,115559 115560,115559 115561,115559 115562,115559 115563,115564 115565,516 115565,2146 115566,994 115567,48 115568,1432 115569,94 115569,2787 115570,3 115571,14434 115572,273 115573,175 115574,298 115576,1509 115577,403 115578,366 115579,366 115580,233 115581,115582 115583,1240 115583,1454 115584,2315 115585,452 115585,535 115585,676 115585,918 115585,1655 115586,115587 115588,115587 115589,206 115590,115591 115592,115593 115594,175 115595,298 115596,310 115597,115598 115599,115600 115601,115602 115603,355 115605,115606 115607,310 115608,240 115609,1119 115609,1462 115609,8537 115610,2989 115610,2991 115611,422 115612,115613 115614,422 115615,1220 115615,1222 115616,252 115617,251 115618,422 115619,422 115620,422 115621,422 115622,422 115623,422 115624,422 115625,422 115626,422 115627,422 115628,422 115629,452 115630,1247 115631,184 115632,3623 115633,1801 115634,442 115634,1177 115634,2334 115635,931 115636,356 115636,615 115637,175 115638,298 115639,346 115640,115641 115643,920 115643,1043 115644,595 115644,657 115644,1453 115644,2617 115645,602 115646,481 115647,275 115647,1927 115648,406 115650,1392 115651,261 115653,2506 115654,1127 115654,1289 115654,49057 115655,115656 115657,333 115657,1531 115657,4455 115657,15573 115658,50 115659,660 115659,4260 115659,6506 115659,40566 115659,115659 115659,142409 115659,142870 115659,143287 115659,144962 115659,145502 115659,145524 115659,146280 115659,146314 115659,146952 115659,154423 115659,155480 115659,155481 115659,155493 115659,155497 115659,159115 115659,159365 115660,115661 115662,379 115663,875 115664,1556 115665,115666 115667,392 115667,1240 115667,1453 115667,1837 115668,1289 115668,2617 115669,389 115670,240 115671,392 115672,222 115673,1181 115674,1580 115676,298 115677,485 115678,83 115679,1531 115680,103860 115681,1284 115681,1715 115682,44 115683,302 115684,49057 115685,115686 115687,483 115688,4 115688,5 115688,59 115688,94 115688,114 115688,117 115688,250 115688,885 115688,1212 115688,1235 115688,1335 115688,1432 115688,1684 115688,2088 115688,2089 115688,2712 115688,2787 115688,2940 115688,3794 115688,13704 115688,154690 115689,2775 115690,447 115691,298 115692,485 115693,602 115694,408 115695,1323 115696,102 115697,1326 115698,809 115699,805 115699,2995 115700,602 115701,1390 115702,1977 115702,1978 115703,3695 115704,557 115704,772 115705,1119 115706,1749 115707,103860 115708,72 115709,2209 115710,115711 115712,640 115713,1240 115713,1465 115714,1033 115715,158 115715,1001 115716,720 115717,147 115717,158 115717,206 115718,115719 115720,147 115720,149 115720,158 115720,206 115720,406 115720,1458 115720,1515 115720,2244 115720,80266 115720,89035 115720,149534 115721,718 115722,115723 115724,115725 115726,602 115727,602 115728,602 115729,267 115731,450 115732,115733 115734,3623 115735,298 115736,346 115737,302 115738,206 115739,3623 115740,5591 115741,3623 115742,3695 115744,195 115745,1479 115746,827 115747,115748 115749,147 115749,158 115749,206 115749,1458 115750,3507 115751,602 115752,72 115753,1939 115754,115755 115756,450 115756,640 115757,393 115758,72 115759,602 115760,406 115761,717 115761,1167 115762,115763 115764,72 115765,72 115766,344 115767,285 115768,663 115769,96187 115770,3623 115771,309 115771,310 115771,577 115771,1400 115772,3623 115773,1127 115774,1454 115775,222 115776,323 115776,1102 115777,55849 115778,3623 115779,483 115780,356 115781,3623 115782,779 115783,115784 115786,1769 115787,602 115788,195 115789,588 115789,590 115789,84257 115790,72 115791,349 115791,3260 115792,1 115792,79 115792,149 115792,273 115792,1983 115792,6556 115792,16953 115793,1119 115794,602 115796,346 115797,115798 115799,1509 115800,115801 115802,72 115803,94 115803,2787 115804,222 115805,852 115806,222 115807,211 115808,70631 115809,115810 115811,1608 115813,346 115814,34 115814,35 115815,1309 115816,1623 115817,78232 115818,175 115819,115820 115821,115822 115823,298 115825,140 115826,267 115827,447 115828,1608 115829,115830 115831,72 115832,344 115833,285 115835,14434 115836,557 115837,1531 115838,726 115839,1133 115840,2797 115841,332 115842,115843 115844,115845 115847,175 115848,298 115849,269 115849,760 115849,1149 115849,1631 115850,557 115851,557 115852,3846 115853,3623 115854,1515 115855,72 115856,302 115857,602 115858,602 115859,406 115860,859 115860,972 115861,4066 115862,358 115863,2146 115864,298 115865,298 115866,485 115867,485 115868,779 115868,1515 115869,72 115870,355 115871,175 115872,355 115873,298 115874,72 115875,72 115876,622 115877,704 115878,697 115879,704 115880,115881 115882,2116 115883,158 115883,779 115884,115885 115887,115 115887,118 115888,77 115889,3135 115890,602 115891,602 115892,115893 115894,1247 115895,704 115896,704 115897,175 115898,298 115899,41 115900,704 115901,2315 115901,2620 115901,5718 115901,33424 115902,577 115903,310 115904,2379 115905,4545 115905,139010 115906,17228 115909,115910 115909,121689 115909,139246 115911,206 115915,72 115916,215 115918,2590 115919,115920 115921,3246 115923,115924 115925,366 115926,366 115927,393 115928,83 115929,207 115932,298 115933,485 115934,1238 115935,602 115936,1452 115937,83 115938,349 115939,843 115940,3370 115940,14453 115941,104 115942,1282 115943,872 115944,1509 115945,1429 115946,233 115948,81070 115949,1634 115950,668 115951,2931 115952,931 115953,115954 115955,388 115956,10 115956,33424 115957,2351 115958,1019 115959,1359 115962,48 115963,1181 115964,4611 115965,1105 115966,602 115967,493 115967,1608 115972,111 115973,985 115974,392 115975,48 115977,640 115978,640 115979,240 115979,588 115979,590 115980,30 115981,640 115982,640 115983,209 115984,115985 115986,510 115987,425 115988,115989 115988,237138 115990,795 115991,355 115993,422 115994,56 115995,2312 115996,843 115996,1130 115997,717 115998,422 115999,6955 116000,422 116001,422 116002,422 116003,422 116004,38634 116005,422 116006,422 116007,805 116008,422 116009,422 116010,422 116011,422 116012,422 116013,422 116014,1955 116016,1326 116018,481 116019,66 116020,3623 116022,3135 116023,1089 116024,4611 116025,1544 116026,130 116026,1132 116027,4611 116028,1544 116029,264 116029,649 116029,1381 116029,1893 116029,36819 116030,192 116030,202 116031,388 116031,694 116031,859 116031,1298 116032,1143 116033,195 116033,779 116034,557 116035,1089 116036,1359 116037,1955 116037,2812 116038,1359 116039,2083 116040,2979 116041,135 116041,137 116041,620 116041,2105 116042,3653 116042,5192 116043,442 116043,1962 116044,467 116044,868 116045,1132 116046,781 116047,750 116048,84257 116049,292 116050,1132 116051,781 116052,292 116053,30 116054,5547 116056,779 116057,175 116058,298 116059,1238 116061,116062 116063,713 116064,55849 116065,1132 116066,781 116067,30 116068,149 116068,406 116069,30 116070,1132 116071,781 116072,195 116073,30 116074,222 116074,3623 116074,172243 116075,1556 116076,44 116077,261 116077,2512 116077,2989 116077,2991 116078,408 116079,1323 116080,102 116081,1326 116082,2434 116084,1551 116084,3041 116085,644 116085,19443 116086,344 116089,292 116090,1977 116090,1978 116092,818 116094,81 116095,934 116095,1033 116096,718 116097,30 116098,408 116099,30 116100,20771 116101,30 116102,372 116102,1580 116104,298 116105,1623 116106,1858 116107,1860 116108,30 116109,30 116110,515 116111,50 116112,332 116113,3 116114,192 116114,217 116114,467 116114,1118 116114,1417 116115,509 116116,1118 116117,356 116119,49057 116120,602 116121,72 116122,344 116123,285 116124,17228 116125,406 116125,602 116126,116127 116128,1019 116129,1132 116130,781 116131,841 116132,406 116133,202 116133,203 116134,2379 116136,1313 116137,525 116138,30 116139,233 116139,294 116139,631 116140,1220 116140,1222 116141,252 116142,251 116144,1572 116145,48 116146,106 116146,1241 116147,83 116148,15523 116149,30 116150,71 116150,1782 116151,602 116152,298 116153,485 116155,72 116156,344 116157,285 116158,149 116159,116160 116161,116160 116163,406 116164,1085 116166,406 116167,1220 116167,1222 116168,252 116169,251 116170,315 116171,116172 116173,5101 116173,5103 116174,116175 116176,79 116177,808 116177,1240 116178,2083 116179,116180 116181,116182 116183,743 116184,1715 116187,116188 116190,48 116192,2699 116194,116195 116198,1782 116199,3623 116200,2506 116204,704 116205,1117 116206,602 116207,302 116207,467 116208,175 116209,298 116210,192 116212,22 116213,861 116214,206 116215,30 116216,97 116217,255 116218,1893 116218,49057 116219,255 116220,255 116221,255 116222,1118 116223,483 116224,116225 116226,1220 116226,1222 116227,252 116228,251 116229,452 116229,918 116229,1655 116230,467 116232,116233 116232,121760 116232,129339 116232,141263 116234,273 116236,1220 116236,1222 116237,252 116238,251 116239,269 116240,1127 116241,1 116242,422 116243,56 116244,116245 116246,392 116247,994 116248,209 116248,302 116248,1556 116249,1181 116250,175 116251,116252 116253,298 116254,287 116254,809 116255,116256 116257,116258 116259,68 116259,1888 116259,2443 116260,1326 116261,252 116263,704 116264,2146 116265,86 116266,1511 116266,3069 116267,72 116268,344 116269,285 116270,147 116270,158 116270,89035 116271,222 116272,1284 116273,175 116274,298 116275,1010 116276,376 116277,885 116277,13704 116278,192 116278,663 116279,403 116280,22 116281,861 116282,175 116283,298 116284,116285 116286,83 116286,178 116286,779 116287,116288 116289,483 116290,192 116291,116292 116293,557 116294,557 116295,116296 116298,206 116299,116299 116300,298 116301,485 116302,602 116303,602 116304,602 116305,175 116306,298 116307,116308 116309,160 116309,397 116309,515 116309,1132 116309,1381 116309,5440 116310,861 116311,30 116312,3 116313,116314 116315,116314 116316,30 116317,356 116318,1127 116319,99 116320,116321 116323,30 116324,30 116325,175 116326,298 116329,217 116329,536 116331,116332 116333,200 116334,227 116335,843 116336,298 116337,485 116338,30 116339,920 116340,72 116341,72 116342,30 116343,1235 116343,1335 116344,116345 116346,72 116347,1522 116348,1522 116349,72 116350,116351 116352,704 116353,1368 116355,255 116356,178 116357,35687 116358,1522 116360,116361 116362,1509 116363,323 116364,116365 116366,72 116368,304 116369,83 116370,116371 116373,2367 116374,83 116375,872 116377,233 116379,17309 116380,581 116382,116383 116384,250 116384,1684 116385,861 116386,116387 116388,116387 116389,81070 116390,22 116391,861 116392,366 116393,2274 116394,1132 116395,781 116396,217 116396,20359 116397,422 116398,56 116399,66 116400,493 116400,682 116400,72439 116402,349 116404,116405 116406,1608 116407,893 116408,1132 116409,781 116411,83 116412,602 116414,392 116415,861 116416,1374 116417,302 116418,433 116419,687 116420,314 116421,602 116422,116423 116424,4823 116425,861 116426,22 116427,22 116428,861 116429,861 116430,22 116431,875 116432,346 116433,292 116434,22 116435,861 116436,22 116437,861 116438,1007 116439,1070 116440,861 116441,22 116442,209 116443,973 116444,781 116445,1132 116446,415 116447,589 116448,1298 116449,579 116450,163 116450,302 116450,323 116451,872 116452,2373 116453,447 116454,1052 116455,1118 116456,586 116457,640 116458,893 116459,1070 116460,1132 116461,781 116462,81070 116463,861 116464,22 116465,298 116466,485 116467,920 116468,355 116469,422 116470,422 116472,422 116473,422 116474,422 116475,422 116476,2668 116477,422 116478,422 116479,149 116479,269 116479,406 116480,968 116481,392 116482,422 116483,875 116484,861 116485,22 116486,116487 116488,861 116489,22 116490,298 116491,485 116492,422 116493,422 116494,422 116496,422 116497,222 116498,422 116499,1370 116500,116501 116502,292 116504,1580 116505,9025 116508,1580 116509,48 116510,313 116510,660 116510,1805 116510,2006 116511,298 116512,485 116514,481 116515,509 116516,30 116518,8991 116519,298 116520,485 116521,140 116521,1052 116521,1893 116521,49057 116521,191860 116522,192 116523,1515 116524,49057 116524,81070 116525,1414 116526,592 116527,417 116528,1132 116529,781 116530,167 116531,30 116531,248 116531,599 116532,861 116533,22 116534,252 116535,516 116535,868 116535,1983 116536,920 116536,1623 116537,2379 116539,202 116539,203 116541,222 116542,485 116543,167 116543,299 116543,349 116543,714 116543,1001 116543,1544 116543,1715 116543,2253 116543,2620 116543,127158 116544,111 116544,95554 116544,111317 116545,907 116546,483 116547,3 116548,84257 116549,536 116550,861 116551,22 116552,861 116553,22 116557,292 116558,56 116559,4895 116560,1837 116561,298 116562,485 116563,356 116564,298 116565,485 116566,309 116566,310 116568,827 116570,868 116571,206 116572,206 116572,240 116573,44 116574,843 116575,175 116576,58 116577,994 116578,46 116579,75912 116580,298 116581,83 116582,932 116583,1390 116584,49057 116585,160 116586,292 116587,136 116587,137 116587,1240 116587,1465 116590,120 116590,158 116590,167 116590,240 116590,289 116590,301 116590,312 116590,372 116590,392 116590,406 116590,431 116590,592 116590,631 116590,784 116590,805 116590,809 116590,919 116590,1001 116590,1085 116590,1119 116590,1133 116590,1240 116590,1241 116590,1285 116590,1287 116590,1466 116590,1467 116590,1511 116590,1871 116590,2205 116590,2421 116590,2443 116590,2557 116590,2620 116590,2671 116590,2995 116590,3069 116590,3135 116590,5906 116590,8788 116590,15609 116590,33424 116590,94134 116590,245910 116591,4 116591,5 116592,861 116593,22 116594,516 116597,1085 116598,1285 116598,84257 116600,1001 116601,1556 116602,422 116603,1400 116604,278 116604,1240 116604,1370 116604,1466 116604,2266 116605,3138 116606,356 116607,1977 116607,1978 116608,3999 116608,162599 116609,116610 116611,592 116612,1707 116613,134 116613,1282 116615,1893 116616,827 116616,934 116617,467 116619,1220 116619,1222 116620,252 116621,251 116623,861 116624,22 116625,4611 116626,1544 116627,4611 116628,1544 116629,1466 116630,1400 116630,2073 116631,147 116632,4 116632,5 116632,355 116633,861 116634,22 116635,611 116636,1453 116637,240 116638,406 116639,406 116640,602 116641,1177 116642,1282 116644,493 116645,5591 116646,861 116647,22 116648,4823 116649,222 116649,1019 116651,147 116651,158 116651,422 116652,202 116652,203 116653,248 116656,49057 116657,83 116658,2867 116658,2868 116659,298 116660,485 116661,417 116662,10 116663,30 116664,2379 116665,22 116666,861 116667,298 116668,485 116669,592 116670,175 116671,861 116672,22 116673,22 116674,861 116675,14550 116676,298 116677,1289 116678,861 116679,22 116680,30 116681,252 116682,1858 116683,1860 116684,861 116685,22 116686,2379 116687,536 116687,1201 116688,1381 116690,2775 116691,447 116692,147 116692,252 116692,1220 116692,1222 116693,1001 116695,103860 116696,2379 116697,435 116697,5212 116698,861 116699,50 116700,861 116701,22 116702,861 116703,22 116704,158 116705,22 116706,72 116707,344 116708,285 116710,252 116710,1220 116710,1222 116711,333 116712,200 116712,2089 116712,2940 116713,406 116714,861 116715,22 116716,34 116716,35 116716,389 116716,536 116716,949 116717,483 116718,779 116718,991 116718,1287 116718,1515 116718,2605 116718,141912 116719,175 116720,2379 116721,1634 116721,116722 116723,298 116724,718 116725,875 116727,55849 116728,116729 116730,346 116731,83 116732,30 116733,2379 116734,1085 116735,116736 116737,875 116738,875 116739,1635 116740,704 116741,1001 116742,55849 116743,3623 116744,872 116745,875 116746,3623 116748,467 116749,503 116749,1149 116750,1 116751,920 116752,30 116753,3367 116754,30 116755,875 116756,267 116757,493 116758,850 116759,1849 116760,1132 116761,781 116762,1551 116762,3041 116762,5440 116763,1132 116764,781 116765,1132 116766,781 116767,376 116768,250 116768,1684 116769,1522 116770,392 116771,358 116772,158 116773,3079 116774,116775 116776,116777 116778,850 116779,431 116780,1522 116781,949 116782,8719 116783,138 116784,865 116785,557 116786,137 116787,118 116787,4597 116788,4545 116789,88820 116790,222 116791,1033 116791,118336 116792,557 116793,557 116794,1127 116795,55849 116796,1132 116797,781 116798,602 116799,602 116800,850 116801,116802 116803,72 116804,344 116805,285 116806,55849 116807,623 116807,1805 116808,55849 116809,222 116810,55849 116811,116812 116813,4545 116814,1453 116815,30 116816,215 116817,116818 116819,264 116820,1381 116821,1007 116822,30236 116823,2775 116824,447 116825,640 116826,116827 116828,1927 116830,356 116831,88820 116833,116834 116836,83 116837,116838 116839,72 116840,58 116841,1414 116842,4980 116843,116844 116845,455 116845,599 116845,1019 116846,116847 116848,14989 116849,620 116850,872 116852,366 116853,5547 116854,366 116855,366 116856,42419 116857,832 116858,233 116859,116860 116861,4611 116862,1544 116863,4611 116864,1544 116865,4611 116866,1544 116867,4611 116868,1544 116869,4611 116870,1544 116871,4611 116872,1544 116873,255 116874,1653 116876,30 116878,207 116878,874 116880,30 116881,137 116882,1238 116883,1132 116884,781 116885,1132 116886,781 116887,861 116888,1167 116890,1452 116891,215 116892,32 116893,167 116894,30 116896,298 116897,485 116898,838 116899,116900 116901,30 116902,852 116903,186 116904,30 116905,310 116906,3585 116907,55849 116908,252 116909,640 116910,602 116911,634 116912,355 116914,1707 116915,602 116916,366 116917,392 116918,184 116919,422 116919,1149 116921,1132 116922,781 116923,116924 116925,55849 116926,30 116927,116928 116930,30 116931,422 116932,422 116933,422 116934,422 116936,422 116937,422 116938,1985 116940,422 116941,422 116942,422 116943,422 116944,422 116945,422 116946,422 116947,422 116948,240 116949,849 116950,22 116951,1132 116952,781 116953,991 116954,10 116955,457 116955,4066 116957,515 116958,217 116958,294 116958,592 116958,1818 116959,620 116959,2244 116959,80266 116961,116962 116963,640 116964,116965 116966,481 116967,217 116967,536 116967,577 116967,1608 116968,72 116969,2210 116969,4237 116970,1132 116971,781 116972,158 116973,49057 116974,1007 116975,1127 116975,1893 116975,49057 116975,81070 116976,1893 116976,49057 116977,1201 116978,1893 116979,2775 116980,447 116981,1893 116981,49057 116982,272 116982,467 116982,868 116982,162599 116983,827 116984,406 116985,509 116985,1151 116986,105304 116987,861 116988,647 116989,344 116990,116991 116992,116993 116994,15523 116995,1309 116996,55849 116997,10 116999,1132 117000,781 117001,805 117001,1007 117002,30 117002,63 117002,1309 117003,1955 117004,83 117005,875 117006,175 117007,298 117008,592 117008,872 117009,49057 117009,81070 117010,397 117011,2867 117011,2868 117012,273 117012,1400 117013,388 117013,525 117013,838 117013,843 117013,1014 117013,1130 117013,1326 117013,1844 117014,1556 117015,217 117015,1417 117016,2867 117016,2868 117017,994 117018,83 117018,1085 117018,1181 117019,809 117020,310 117021,30 117022,44 117023,264 117024,83 117026,932 117027,200 117028,195 117029,72 117030,222 117031,1388 117032,117033 117034,292 117035,1132 117036,781 117037,602 117038,1836 117039,30 117040,861 117041,22 117043,392 117044,313 117045,636 117046,31977 117047,104 117048,1977 117048,1978 117049,392 117050,1132 117051,781 117052,861 117053,22 117054,1390 117055,861 117056,22 117057,147 117058,333 117060,149 117060,467 117060,868 117060,2991 117062,217 117062,872 117063,1132 117064,781 117065,1858 117066,1860 117067,200 117068,117069 117070,30 117071,151 117072,147 117072,149 117072,158 117072,1014 117074,1590 117076,1019 117077,298 117078,485 117079,30 117080,1007 117082,264 117083,222 117084,264 117084,1912 117085,636 117086,4611 117087,1544 117088,4611 117089,1544 117090,1298 117091,1858 117092,1860 117093,17228 117094,5405 117095,4611 117096,1544 117097,4611 117098,1544 117099,1117 117099,148742 117100,861 117101,1858 117102,1860 117103,2674 117103,30331 117104,818 117104,1749 117105,557 117106,72 117107,949 117108,366 117109,467 117109,868 117110,1243 117111,30 117113,333 117114,217 117115,868 117115,156379 117115,162599 117116,30 117118,41 117118,84257 117119,30 117120,117121 117122,920 117123,147 117123,202 117123,516 117123,663 117123,920 117123,1181 117124,2626 117125,30 117126,602 117127,175 117128,298 117129,640 117130,1893 117130,49057 117131,356 117132,1388 117133,483 117134,59931 117134,84257 117135,222 117137,1858 117138,1860 117139,117140 117141,1818 117142,222 117142,455 117143,1590 117144,222 117145,1220 117145,1222 117146,2416 117146,2417 117146,5908 117147,222 117147,455 117148,192 117149,117150 117149,129445 117151,222 117152,392 117152,1151 117152,1893 117153,192 117154,119 117155,2411 117156,30 117157,435 117157,1644 117158,175 117159,158 117159,192 117160,298 117161,72 117162,117163 117164,117165 117166,72 117167,55849 117168,147 117169,6506 117170,9015 117171,2312 117172,117173 117174,1353 117175,215 117176,622 117179,1332 117180,809 117181,1132 117182,781 117183,30 117183,200 117183,772 117184,835 117184,1509 117184,3041 117186,1132 117187,781 117189,248 117190,1132 117191,781 117193,557 117194,20771 117195,309 117195,310 117196,1454 117197,1181 117198,2266 117200,171 117201,4611 117202,450 117203,117204 117205,1556 117206,1844 117207,450 117208,298 117209,485 117210,117211 117212,450 117213,536 117214,392 117215,17346 117217,117218 117219,117220 117221,55849 117222,16196 117223,117224 117225,1544 117226,72 117226,94 117227,994 117228,358 117229,117230 117231,283 117231,509 117231,536 117231,801 117231,907 117231,1122 117231,1177 117231,1467 117231,1511 117231,1522 117231,2620 117231,2784 117231,3069 117231,4545 117232,602 117233,602 117234,72 117235,72 117236,2116 117237,516 117238,30 117239,10 117240,30 117241,376 117242,2421 117243,2929 117244,563 117245,195 117245,640 117246,1118 117247,32 117247,302 117247,779 117247,2292 117248,117249 117250,30 117251,117252 117253,233 117254,577 117255,292 117256,366 117257,366 117258,431 117259,30 117260,4935 117261,1531 117261,1985 117263,9015 117264,4192 117264,4193 117265,175 117266,298 117267,355 117268,2506 117269,336 117270,1858 117271,1860 117272,217 117272,872 117272,1118 117273,2574 117274,117275 117276,1858 117277,1860 117278,219 117279,83 117280,2590 117281,200 117281,772 117282,6119 117283,1509 117284,222 117285,117286 117287,117288 117289,207 117291,973 117292,1531 117293,392 117293,1085 117295,452 117296,1247 117297,184 117298,408 117299,1323 117300,102 117301,1326 117302,4691 117303,117304 117305,44 117306,269 117307,932 117308,222 117308,455 117309,1844 117310,433 117311,9457 117312,872 117314,1429 117316,117317 117316,136916 117316,137814 117316,138604 117316,141143 117319,1132 117320,781 117321,1085 117323,1132 117324,781 117325,99 117326,30 117327,103860 117328,872 117329,1132 117330,781 117331,298 117332,485 117333,586 117334,668 117335,117336 117337,3804 117339,117340 117341,1983 117342,298 117343,485 117344,298 117345,485 117346,103860 117348,875 117348,5718 117349,55849 117350,117351 117352,240 117353,55849 117354,393 117355,1181 117356,117357 117358,117357 117359,117357 117360,1453 117361,50 117362,483 117363,2135 117364,994 117365,1707 117367,298 117368,485 117370,376 117373,117374 117375,704 117377,117378 117379,10 117380,117381 117382,3316 117383,175 117384,1070 117385,994 117386,687 117387,158 117388,994 117389,1368 117390,30 117391,30 117392,6387 117393,117394 117395,3623 117396,83 117396,585 117396,1177 117396,182162 117397,704 117397,1140 117397,5547 117398,1479 117399,117400 117401,117402 117403,390 117405,779 117407,175 117408,30 117409,117410 117412,117413 117412,125808 117412,129967 117412,132572 117415,135 117416,117417 117418,310 117419,310 117420,117421 117422,117423 117424,147 117425,843 117426,117427 117428,1143 117429,147 117430,843 117431,72 117432,10 117433,117434 117435,207 117436,117437 117438,117439 117440,255 117441,366 117442,366 117443,366 117444,117445 117446,663 117447,117448 117449,117450 117451,117452 117453,117453 117454,117455 117456,83 117457,83 117458,83 117459,117460 117459,261995 117461,117462 117461,190725 117463,233 117464,117465 117466,107 117467,2416 117467,2417 117468,292 117469,338 117470,298 117471,1133 117472,3538 117473,30 117474,355 117475,117476 117477,117478 117479,536 117481,117482 117483,1572 117484,117485 117486,3623 117487,3623 117488,117489 117490,406 117492,827 117493,84906 117494,84906 117495,333 117496,298 117497,485 117498,859 117499,55849 117500,117501 117502,592 117503,30 117504,117504 117505,388 117506,117507 117509,602 117510,117511 117512,117511 117513,117511 117514,44 117517,117518 117519,117520 117521,602 117522,994 117523,4545 117525,22293 117527,30 117528,2620 117529,30 117530,620 117530,8244 117531,483 117532,333 117533,184 117534,875 117535,875 117536,875 117537,657 117537,2017 117537,2266 117538,117539 117540,2989 117540,2991 117543,117544 117545,310 117547,117548 117549,117548 117550,875 117552,287 117552,326 117552,1607 117552,1634 117552,127158 117553,117554 117555,217 117556,994 117557,718 117558,1 117558,206 117559,433 117560,117561 117562,117561 117563,433 117564,376 117565,117566 117565,118204 117567,117568 117569,33082 117570,389 117572,22 117575,2351 117576,14797 117577,117578 117579,862 117581,994 117582,713 117584,557 117587,30 117588,252 117588,516 117589,134 117590,1181 117591,30 117592,175 117593,30 117594,30 117595,298 117596,994 117597,30 117598,298 117599,485 117600,147 117601,2146 117602,30 117604,34 117604,7358 117604,7363 117605,994 117606,298 117607,485 117608,171 117609,973 117610,32 117611,117612 117613,1132 117614,781 117615,202 117615,203 117616,72 117617,30 117618,72 117619,117620 117619,151192 117619,158963 117619,241940 117621,83 117622,422 117623,422 117624,422 117625,422 117626,422 117627,422 117628,422 117629,422 117630,422 117631,422 117632,422 117633,143 117634,30 117635,310 117636,640 117637,30 117638,602 117639,117640 117641,2351 117642,117643 117644,602 117645,9560 117646,1179 117647,6068 117648,1235 117648,8992 117649,175 117650,298 117651,310 117652,261 117653,346 117654,117655 117654,123719 117656,1238 117657,117658 117659,1282 117659,2045 117659,2244 117659,3999 117660,1452 117661,292 117662,694 117662,2266 117662,13137 117663,294 117664,861 117665,22 117666,83 117667,83 117668,296 117670,366 117671,366 117672,366 117673,30 117674,298 117675,233 117676,117677 117678,1033 117679,310 117681,22 117682,861 117683,117684 117686,602 117687,184 117688,707 117689,117690 117691,18790 117693,298 117694,485 117697,3999 117698,455 117699,1715 117700,931 117701,355 117702,1105 117703,346 117704,875 117705,671 117706,2367 117707,1860 117708,18790 117710,1276 117712,30 117712,772 117712,99807 117713,1127 117715,875 117716,211 117716,366 117716,861 117717,2775 117718,447 117719,206 117720,66 117720,147 117720,217 117720,571 117720,81233 117721,1572 117722,2353 117723,779 117724,15 117725,1007 117726,60576 117727,18790 117728,298 117729,485 117730,4611 117731,1544 117732,4611 117733,1544 117734,447 117735,1284 117736,20 117737,3331 117738,1860 117739,1132 117740,781 117743,1133 117744,22 117745,861 117746,640 117747,96187 117748,192 117749,1010 117750,298 117751,485 117752,843 117753,422 117754,56 117755,1132 117756,781 117757,1968 117758,117759 117760,338 117761,586 117762,481 117764,1033 117765,515 117766,117767 117768,1556 117769,71 117771,146 117771,147 117771,313 117771,489 117771,685 117771,92476 117772,349 117773,843 117774,2260 117775,292 117775,1688 117776,1033 117777,1977 117777,1978 117778,298 117779,485 117781,1033 117782,1105 117783,298 117784,485 117785,14434 117786,3623 117789,140 117789,264 117789,390 117789,515 117789,1381 117789,1968 117789,2017 117789,2626 117789,16687 117790,1132 117791,781 117792,117793 117795,685 117795,2460 117796,250 117796,1684 117797,408 117798,1580 117799,240 117799,626 117799,1085 117799,1715 117800,83 117801,298 117802,485 117803,298 117804,485 117805,973 117806,875 117807,9457 117808,2460 117809,63 117810,366 117810,500 117811,718 117812,1132 117813,781 117814,1359 117815,55849 117816,332 117817,536 117817,2168 117817,2266 117818,79 117818,841 117818,911 117818,1319 117818,1707 117818,2315 117819,302 117820,843 117821,408 117822,1323 117823,102 117824,1326 117825,843 117826,4611 117827,1544 117828,140 117829,298 117830,485 117831,298 117832,485 117833,4611 117834,1544 117836,1247 117837,298 117838,485 117839,140 117840,158 117840,202 117840,203 117840,252 117840,622 117841,68 117842,120 117842,733 117842,818 117842,1146 117843,298 117844,485 117845,4611 117846,1544 117847,5265 117848,4611 117849,1544 117850,355 117852,298 117853,485 117854,932 117855,298 117856,485 117857,861 117858,22 117859,1181 117859,1381 117860,1955 117861,2379 117862,557 117863,175 117864,4355 117865,298 117866,485 117867,98192 117868,117869 117870,298 117871,298 117872,485 117873,298 117874,485 117875,117876 117877,255 117878,255 117879,255 117880,3507 117881,147 117881,1089 117881,1623 117883,2926 117884,79 117885,467 117886,346 117887,58 117887,338 117887,340 117887,442 117887,609 117887,801 117887,1140 117887,1147 117887,1177 117887,1381 117887,1509 117887,2443 117887,3474 117887,5547 117887,60576 117890,4611 117891,1544 117892,779 117893,1140 117893,5547 117894,1803 117895,309 117895,310 117897,425 117898,5405 117899,79 117900,298 117901,485 117902,49057 117902,81070 117903,175 117904,298 117905,240 117906,22 117907,861 117908,811 117909,111 117910,22 117911,861 117912,515 117913,1181 117913,1544 117914,1085 117915,389 117916,10 117917,79 117918,433 117919,743 117919,8714 117920,392 117921,136 117923,346 117924,44725 117925,485 117926,251 117927,19443 117928,718 117929,298 117930,485 117931,298 117932,485 117933,117934 117935,298 117936,485 117938,704 117939,1072 117940,868 117941,1181 117942,1220 117942,1222 117943,252 117944,251 117945,30 117946,760 117947,1556 117948,811 117949,120 117950,10 117951,491 117952,3316 117953,298 117954,485 117955,175 117956,136 117956,137 117957,595 117957,703 117958,1070 117959,252 117960,687 117962,1572 117963,1010 117964,10 117964,2574 117965,657 117965,6789 117966,1877 117966,21442 117967,3623 117968,273 117970,298 117971,485 117972,298 117973,485 117974,79 117974,178 117974,435 117974,663 117974,1033 117974,1385 117974,1877 117974,21442 117975,298 117976,485 117977,1072 117978,298 117979,485 117980,467 117981,298 117982,485 117984,80266 117985,298 117986,485 117987,579 117988,267 117989,1368 117990,117991 117992,1381 117993,34 117993,35 117994,222 117994,455 117994,599 117995,779 117998,392 117998,809 117999,298 118000,485 118001,462 118001,2646 118002,849 118003,4545 118004,602 118005,264 118006,252 118008,298 118009,485 118010,622 118010,1844 118011,298 118012,485 118013,483 118014,30 118015,264 118015,1893 118016,673 118016,1011 118017,79 118018,255 118019,30331 118020,760 118020,1119 118020,1631 118022,99 118023,422 118024,56 118025,422 118026,30 118027,30 118028,1010 118029,187 118030,118031 118032,1212 118033,1010 118035,2371 118036,388 118037,2083 118038,406 118039,3623 118040,875 118041,907 118043,30 118045,30 118046,1644 118047,206 118048,536 118049,285 118049,1515 118050,4545 118050,56150 118050,139010 118051,55849 118052,1001 118053,151 118055,118056 118057,217 118058,602 118059,602 118060,1522 118061,1608 118062,79 118062,136 118062,137 118062,203 118062,333 118062,1181 118063,147 118063,158 118064,298 118065,485 118066,3252 118069,30 118070,175 118071,2224 118072,298 118073,376 118075,30 118076,1467 118077,118078 118079,192 118080,2434 118081,9024 118082,1776 118083,1968 118084,10 118085,467 118085,868 118086,393 118086,980 118087,30 118088,30 118089,1033 118090,2244 118091,163 118092,868 118093,743 118094,258 118095,171 118096,2506 118097,30 118098,118099 118100,301 118101,1033 118102,30 118103,118104 118103,173026 118105,2421 118106,557 118107,557 118108,4475 118109,118110 118112,171 118113,2506 118114,1127 118115,376 118117,885 118117,13704 118118,30 118119,406 118120,30 118121,202 118121,203 118122,2210 118122,4237 118122,182162 118123,30 118125,13361 118126,175 118126,7795 118126,14483 118127,30 118128,118129 118130,118131 118132,1007 118133,30 118134,88820 118135,44725 118136,178 118136,435 118136,439 118136,538 118136,671 118136,1033 118136,1294 118137,30 118138,1509 118139,30 118140,120 118140,1466 118142,1707 118143,1 118144,372 118144,1285 118144,2989 118144,2991 118145,30 118146,30 118147,1556 118148,55849 118149,1359 118150,30 118151,30 118152,30 118153,704 118154,158 118155,435 118156,862 118156,44725 118157,30 118158,994 118159,920 118160,843 118161,356 118162,346 118163,875 118164,2460 118164,2923 118164,4190 118165,861 118166,2224 118167,30 118168,536 118169,30 118170,30 118171,435 118172,118173 118174,843 118175,356 118176,392 118177,30 118178,72 118179,202 118179,203 118181,557 118182,1010 118183,72 118184,118185 118186,30 118187,118188 118189,422 118191,118192 118193,1140 118193,5547 118194,3258 118195,2244 118196,72 118197,893 118198,175 118199,298 118200,1837 118201,393 118202,809 118205,704 118206,704 118207,1 118208,255 118208,221307 118209,808 118210,346 118211,118212 118213,118212 118214,346 118215,118216 118217,2367 118218,640 118219,178 118220,75912 118221,106 118221,337 118222,233 118223,346 118224,99 118224,146 118224,911 118224,1285 118224,92476 118225,366 118226,4611 118227,1544 118230,1849 118232,346 118233,58 118234,994 118235,46 118236,75912 118237,1177 118237,2210 118239,58 118240,994 118241,46 118242,75912 118244,346 118245,340 118245,682 118245,2244 118245,72439 118246,1688 118246,1707 118247,207 118248,289 118248,290 118248,1119 118248,1149 118248,1326 118248,31977 118248,94134 118249,206 118249,1888 118250,1453 118251,1 118253,420 118253,493 118255,861 118256,22 118257,83 118258,1522 118258,1619 118259,195 118261,372 118261,852 118262,360 118262,49057 118264,119 118264,151 118264,192 118264,202 118264,500 118264,577 118264,622 118264,1118 118264,1224 118265,1467 118266,118267 118268,2506 118269,1509 118270,118271 118272,1070 118273,118274 118275,571 118276,422 118277,422 118278,422 118279,422 118280,422 118281,718 118281,1210 118282,1116 118283,195 118284,422 118285,422 118286,422 118287,626 118288,422 118289,2574 118290,911 118290,2073 118291,422 118292,422 118293,467 118294,422 118295,2424 118296,422 118297,355 118298,422 118299,136 118300,55849 118301,1749 118301,14550 118302,1096 118303,50321 118304,118305 118306,873 118307,2353 118308,151 118309,149 118310,1105 118311,1927 118312,217 118312,3804 118313,422 118314,56 118315,1436 118316,1983 118317,497 118317,527 118318,518 118318,3260 118319,3623 118320,143 118321,118322 118321,141121 118321,144609 118321,145742 118321,179368 118321,205658 118321,214162 118321,244229 118321,249109 118321,258610 118323,264 118324,389 118325,3623 118326,557 118326,784 118326,968 118328,1983 118329,415 118329,717 118330,481 118331,10 118331,30 118331,32 118331,34 118331,35 118331,37 118331,50 118331,58 118331,65 118331,72 118331,94 118331,104 118331,106 118331,111 118331,115 118331,120 118331,134 118331,137 118331,146 118331,158 118331,163 118331,167 118331,171 118331,192 118331,202 118331,206 118331,207 118331,240 118331,248 118331,264 118331,272 118331,273 118331,283 118331,287 118331,289 118331,290 118331,301 118331,309 118331,310 118331,314 118331,333 118331,338 118331,356 118331,372 118331,392 118331,417 118331,422 118331,433 118331,450 118331,452 118331,473 118331,479 118331,500 118331,503 118331,516 118331,525 118331,536 118331,567 118331,615 118331,628 118331,631 118331,640 118331,647 118331,652 118331,657 118331,673 118331,698 118331,714 118331,736 118331,760 118331,772 118331,781 118331,795 118331,805 118331,843 118331,859 118331,872 118331,907 118331,932 118331,949 118331,980 118331,994 118331,1014 118331,1019 118331,1043 118331,1046 118331,1072 118331,1089 118331,1118 118331,1133 118331,1140 118331,1175 118331,1181 118331,1210 118331,1220 118331,1222 118331,1231 118331,1265 118331,1266 118331,1284 118331,1285 118331,1370 118331,1374 118331,1381 118331,1402 118331,1462 118331,1467 118331,1511 118331,1551 118331,1572 118331,1634 118331,1635 118331,1659 118331,1718 118331,1724 118331,1749 118331,1782 118331,1844 118331,1881 118331,1893 118331,1955 118331,1968 118331,2048 118331,2205 118331,2266 118331,2292 118331,2334 118331,2460 118331,2512 118331,2574 118331,2671 118331,2719 118331,2744 118331,2750 118331,2782 118331,2784 118331,2787 118331,2807 118331,3069 118331,3129 118331,3207 118331,3238 118331,3252 118331,3295 118331,3321 118331,3345 118331,3370 118331,3695 118331,3724 118331,3804 118331,4223 118331,4276 118331,4355 118331,4453 118331,4455 118331,4487 118331,4594 118331,4637 118331,4823 118331,5358 118331,5591 118331,5718 118331,5874 118331,6184 118331,6888 118331,7124 118331,7270 118331,7360 118331,7572 118331,8180 118331,8270 118331,8537 118331,8989 118331,8992 118331,8993 118331,9007 118331,9008 118331,9010 118331,9024 118331,9179 118331,13136 118331,13575 118331,13910 118331,14352 118331,14453 118331,14556 118331,14945 118331,17772 118331,21650 118331,21716 118331,22663 118331,25222 118331,29475 118331,33424 118331,34006 118331,42232 118331,49193 118331,58376 118331,92476 118331,94134 118331,125569 118331,164068 118331,164085 118331,164097 118331,164102 118331,164106 118331,164108 118331,164109 118331,175362 118331,175363 118331,175365 118331,216631 118331,216638 118332,63 118333,875 118334,118335 118336,1 118336,11 118336,20 118336,50 118336,146 118336,147 118336,149 118336,158 118336,175 118336,192 118336,206 118336,285 118336,314 118336,336 118336,397 118336,406 118336,452 118336,457 118336,505 118336,599 118336,620 118336,640 118336,676 118336,685 118336,779 118336,818 118336,838 118336,849 118336,920 118336,1011 118336,1014 118336,1089 118336,1118 118336,1147 118336,1262 118336,1370 118336,1425 118336,1445 118336,1458 118336,1619 118336,1623 118336,1663 118336,1776 118336,1803 118336,1901 118336,2102 118336,2244 118336,2373 118336,2400 118336,2511 118336,2609 118336,3221 118336,3571 118336,3895 118336,4109 118336,4514 118336,4663 118336,5592 118336,5981 118336,6684 118336,6904 118336,7818 118336,8421 118336,8867 118336,9394 118336,13520 118336,14113 118336,15330 118336,15587 118336,16019 118336,17285 118336,18327 118336,20371 118336,21253 118336,21442 118336,24835 118336,26450 118336,28930 118336,31796 118336,35623 118336,38386 118336,42064 118336,46609 118336,49343 118336,49586 118336,50543 118336,60576 118336,61626 118336,64258 118336,68069 118336,68149 118336,70138 118336,71830 118336,71845 118336,73231 118336,76893 118336,79528 118336,80266 118336,87799 118336,88867 118336,89035 118336,89763 118336,90794 118336,92476 118336,94986 118336,95465 118336,102560 118336,104926 118336,111217 118336,112469 118336,113357 118336,116479 118336,116791 118336,118336 118336,118904 118336,119592 118336,121001 118336,123962 118336,124016 118336,124347 118336,126717 118336,127158 118336,127170 118336,131284 118336,131813 118336,134640 118336,135378 118336,136174 118336,137183 118336,138471 118336,138472 118336,138682 118336,139577 118336,140760 118336,141790 118336,141912 118336,145035 118336,154168 118336,155025 118336,155652 118336,155680 118336,156225 118336,157361 118336,158267 118336,160689 118336,160787 118336,160912 118336,161094 118336,161221 118336,161578 118336,165536 118336,166992 118336,167567 118336,167641 118336,168480 118336,169385 118336,169620 118336,171748 118336,171761 118336,174450 118336,176396 118336,176961 118336,177590 118336,177934 118336,179615 118336,180487 118336,181210 118336,181764 118336,182339 118336,183449 118336,183772 118336,185387 118336,186631 118336,188874 118336,192449 118336,192456 118336,193170 118336,204227 118336,207513 118336,214808 118336,215276 118336,215874 118336,217984 118336,218391 118336,218740 118336,218866 118336,218958 118336,220502 118336,220935 118336,222842 118336,224568 118336,225795 118336,227210 118336,227283 118336,227372 118336,227373 118336,227392 118336,227393 118336,227400 118336,227423 118336,227458 118336,227466 118336,227566 118336,227572 118336,227810 118336,228297 118336,228513 118336,228908 118336,229134 118336,232152 118336,232772 118336,233429 118336,233645 118336,233651 118336,234382 118336,234693 118336,235881 118336,236120 118336,236899 118336,240174 118336,241558 118336,241719 118336,241735 118336,241827 118336,242345 118336,242420 118336,242826 118336,244263 118336,244679 118336,245845 118336,245974 118336,246075 118336,247217 118336,249055 118336,252482 118336,255710 118336,256199 118336,256412 118336,256660 118336,258284 118336,258723 118336,258840 118336,258902 118336,260213 118336,261702 118337,3623 118338,388 118339,1983 118340,4545 118340,139010 118341,907 118342,118343 118345,346 118345,439 118345,447 118345,671 118345,934 118345,980 118345,1033 118345,1181 118345,1265 118345,1266 118345,1590 118346,118305 118347,292 118347,2209 118348,3623 118349,273 118349,1116 118350,393 118351,718 118352,356 118353,146 118354,3623 118355,704 118356,22 118358,5547 118360,63 118360,516 118360,733 118361,3623 118362,1285 118362,84257 118364,118365 118366,1509 118367,68 118368,3623 118369,310 118370,1247 118371,2209 118373,30 118375,467 118375,13599 118376,2083 118377,240 118378,83 118378,2775 118379,1983 118380,3623 118381,1983 118382,30 118383,1888 118384,1858 118385,1860 118386,479 118387,118388 118389,3623 118390,516 118391,3623 118393,3623 118395,118396 118397,408 118398,1323 118399,102 118400,1326 118401,1220 118401,1222 118403,1146 118409,920 118410,1858 118411,1860 118412,158 118413,1858 118414,1860 118415,3623 118416,49057 118417,298 118418,485 118419,1888 118419,2590 118419,6068 118420,83 118421,83 118422,29380 118423,298 118424,485 118425,120 118425,240 118425,406 118425,877 118426,932 118427,852 118428,602 118429,171 118430,2617 118432,2209 118433,422 118434,56 118437,118 118437,4545 118437,4597 118439,1983 118440,298 118441,485 118442,3623 118443,298 118444,485 118445,422 118446,56 118448,175 118449,19443 118449,188791 118450,72 118451,1635 118452,302 118453,143 118454,22 118454,467 118455,3623 118456,63 118457,2116 118458,1133 118459,120 118459,3115 118460,1707 118461,34 118461,35 118462,422 118463,56 118464,171 118466,406 118467,333 118467,406 118468,1179 118469,30 118470,302 118471,158 118472,949 118473,422 118474,358 118475,422 118476,56 118477,143 118478,3207 118479,392 118480,467 118480,868 118481,2205 118481,33424 118482,392 118483,10 118486,392 118487,1370 118488,1151 118489,2572 118490,240 118490,818 118491,315 118492,6119 118493,41 118494,2775 118495,447 118496,30 118497,393 118498,704 118499,422 118500,56 118501,893 118502,309 118502,310 118502,588 118502,590 118502,6556 118503,104 118503,636 118504,483 118505,422 118506,56 118507,3623 118508,65 118509,3 118509,34 118509,35 118509,106 118509,158 118509,178 118509,192 118509,202 118509,203 118509,217 118509,251 118509,252 118509,337 118509,346 118509,435 118509,516 118509,586 118509,622 118509,640 118509,663 118509,1175 118509,1181 118509,1220 118509,1222 118509,1243 118509,1294 118509,1370 118509,1590 118509,1635 118509,2567 118509,3161 118509,4192 118509,4193 118509,5874 118509,5976 118509,6119 118509,8598 118509,8771 118509,8811 118509,8822 118509,8907 118509,16201 118510,167 118510,301 118511,599 118512,1962 118513,66 118514,636 118515,1282 118516,72 118517,346 118518,3538 118518,19005 118519,34 118519,35 118520,200 118520,772 118521,372 118522,63 118523,240 118523,1285 118524,1007 118525,151 118526,647 118527,344 118528,219 118529,310 118530,389 118532,991 118532,33424 118533,563 118534,2351 118536,2244 118537,602 118539,356 118540,240 118540,326 118540,379 118540,615 118540,626 118540,631 118540,702 118540,873 118540,874 118540,968 118540,1085 118540,1177 118540,1715 118540,1801 118541,37 118542,1608 118544,1285 118545,994 118546,55849 118547,875 118548,1285 118549,118550 118554,994 118555,994 118556,1707 118557,1453 118558,22 118558,861 118560,1285 118562,1983 118563,34 118565,3623 118567,3623 118568,298 118569,485 118570,1151 118571,298 118572,485 118575,30 118578,298 118579,485 118581,1332 118582,1858 118583,1860 118584,30 118585,516 118585,1512 118586,118587 118588,3623 118589,779 118590,83 118591,467 118593,557 118594,991 118595,3623 118596,392 118597,3623 118598,30 118599,704 118600,704 118601,3623 118602,140 118603,267 118604,422 118605,56 118606,118607 118606,119809 118606,129176 118609,376 118610,422 118611,704 118612,298 118613,485 118614,109503 118615,1631 118616,358 118617,1707 118618,435 118619,206 118620,215 118621,346 118623,392 118624,647 118625,344 118626,298 118627,485 118628,136 118628,596 118629,217 118630,298 118631,485 118632,346 118633,704 118634,104 118635,118636 118635,178178 118635,181337 118635,203841 118635,215390 118635,215445 118635,217357 118635,219710 118635,221466 118635,222413 118635,227475 118635,227958 118635,232549 118635,240606 118635,242882 118635,247579 118635,249031 118635,250388 118635,254393 118635,264947 118637,346 118639,298 118640,485 118641,557 118642,557 118643,2421 118644,298 118645,485 118647,1707 118648,207 118649,310 118650,3623 118651,1590 118652,647 118653,344 118654,1955 118655,30 118656,843 118657,644 118658,356 118659,118660 118661,280 118661,17245 118662,972 118663,30 118664,850 118665,1858 118666,1860 118667,1368 118668,1238 118669,393 118670,861 118671,68 118671,4220 118672,118673 118672,127711 118675,515 118676,872 118677,2574 118678,107 118678,111 118678,240 118678,298 118678,372 118678,442 118678,805 118678,2209 118678,2775 118678,8180 118679,3653 118680,30 118681,298 118682,485 118683,885 118683,13704 118684,3623 118685,171 118686,167 118686,301 118686,2557 118687,3623 118688,827 118689,240 118690,136 118690,137 118691,2116 118692,6789 118693,1052 118694,3623 118695,3623 118696,2334 118698,875 118699,151 118700,250 118700,1684 118701,118702 118703,118704 118705,1359 118706,30 118707,298 118708,485 118709,704 118710,1298 118711,292 118712,1858 118713,1860 118714,298 118715,485 118716,15 118717,134 118718,452 118718,457 118718,535 118718,676 118718,918 118718,1655 118719,577 118720,118721 118722,30 118723,1858 118724,1860 118725,949 118725,1133 118726,30 118727,3260 118728,328 118729,192 118729,1243 118730,118731 118732,602 118733,602 118734,9006 118735,171 118736,118737 118738,2351 118739,118740 118741,431 118741,631 118741,44725 118742,118743 118744,602 118745,2590 118746,356 118746,516 118748,805 118749,862 118752,592 118752,1085 118753,207 118754,872 118756,1070 118757,309 118757,310 118758,118759 118760,118761 118762,872 118763,1429 118764,323 118766,668 118767,118768 118769,366 118770,366 118771,366 118772,366 118773,301 118774,118775 118776,118777 118778,647 118779,344 118781,647 118782,344 118783,233 118784,1247 118785,83 118786,83 118787,83 118789,118790 118791,83 118792,1509 118793,136 118794,346 118795,30 118798,264 118798,1289 118798,1381 118798,1551 118798,3999 118799,516 118800,1983 118802,30 118803,743 118804,2296 118805,30 118806,1298 118806,1927 118808,1860 118809,2460 118810,118811 118813,647 118814,344 118815,862 118816,527 118816,740 118816,741 118816,743 118817,992 118818,3297 118819,1807 118820,718 118821,240 118821,631 118821,818 118821,1749 118821,1785 118821,2334 118821,5718 118821,9010 118822,602 118823,30 118824,118825 118826,118827 118828,225 118829,338 118830,1359 118832,355 118833,298 118834,485 118835,283 118835,477 118835,536 118835,1201 118835,1417 118835,2944 118836,518 118836,900 118836,1096 118836,1345 118836,1793 118836,19421 118836,68913 118837,30 118838,160 118839,2205 118839,33424 118840,647 118841,344 118844,30 118846,192 118847,718 118848,760 118848,1860 118849,333 118850,349 118851,422 118852,3623 118853,422 118854,1143 118855,422 118856,422 118857,422 118858,422 118859,422 118860,626 118862,422 118863,422 118864,195 118865,422 118866,310 118867,310 118868,422 118869,422 118870,515 118871,422 118872,222 118873,192 118874,298 118875,485 118876,422 118877,1210 118878,801 118878,81070 118879,22 118879,211 118880,1623 118880,2379 118881,861 118882,397 118883,346 118884,3182 118885,481 118886,298 118887,485 118888,10 118892,1105 118895,1175 118896,14100 118897,337 118898,500 118899,118900 118902,302 118903,5547 118904,337 118904,118336 118905,557 118906,1368 118907,760 118908,2775 118909,447 118912,1509 118916,875 118917,315 118918,1608 118919,1977 118919,1978 118920,516 118921,1001 118922,118 118922,422 118922,557 118922,852 118922,4597 118924,788 118925,920 118926,473 118927,4545 118927,56150 118927,139010 118928,1147 118929,10 118930,920 118931,7 118931,302 118931,2775 118931,3846 118932,301 118932,3422 118934,175 118935,657 118936,298 118937,579 118938,455 118940,852 118941,54 118942,54 118942,2775 118943,83 118944,298 118945,485 118946,417 118947,30 118949,147 118949,1458 118950,849 118951,447 118951,6955 118952,302 118954,58 118955,907 118956,356 118956,852 118957,346 118959,264 118959,1132 118959,1381 118960,408 118961,298 118962,485 118963,366 118965,118966 118967,1977 118967,1978 118968,134 118969,493 118971,390 118972,949 118974,72 118975,2436 118976,136 118977,609 118979,30 118980,48 118981,392 118981,1453 118982,356 118982,1844 118983,79 118984,58 118985,30 118986,30 118987,575 118988,875 118989,1284 118989,2083 118991,1298 118992,631 118993,1130 118994,3474 118995,3474 118996,30 118997,136 118998,4220 119000,1881 119001,623 119002,1105 119003,1133 119004,140 119005,22 119006,801 119007,6506 119009,119010 119012,358 119013,1105 119014,37 119014,1782 119015,1836 119016,1113 119017,1105 119019,195 119020,1359 119021,136 119022,134 119022,254 119023,515 119024,50 119025,483 119026,932 119027,22 119028,861 119029,1707 119030,1436 119031,455 119032,1381 119033,310 119034,920 119035,298 119036,485 119037,1789 119038,483 119039,1655 119040,10 119041,4 119041,5 119041,527 119042,4504 119042,6323 119043,1105 119044,5662 119045,717 119046,264 119046,1893 119047,30 119048,389 119049,920 119050,861 119051,22 119052,623 119053,217 119053,283 119053,1019 119053,1417 119054,425 119054,3507 119055,119056 119058,10 119059,209 119060,175 119061,1370 119062,298 119063,340 119064,1285 119067,81 119067,503 119068,2421 119068,22293 119070,422 119071,56 119072,79 119074,907 119075,5547 119076,119077 119079,390 119080,588 119080,590 119080,805 119081,119082 119083,86 119088,3297 119090,6506 119091,1370 119093,175 119094,119 119095,298 119096,3623 119097,1285 119098,745 119099,392 119099,2292 119099,2889 119100,3079 119101,107 119102,120 119102,1353 119103,479 119104,222 119105,557 119106,875 119107,119108 119109,55849 119112,1181 119113,298 119114,485 119115,119116 119117,1118 119118,119119 119120,248 119120,5405 119121,298 119122,485 119123,366 119124,1105 119125,310 119126,3623 119127,805 119128,579 119129,298 119130,485 119131,30 119132,3804 119132,14797 119133,346 119134,81 119135,280 119135,17245 119136,289 119136,290 119136,94134 119137,2867 119137,2868 119138,868 119140,1210 119141,1506 119142,3623 119143,5906 119144,557 119145,626 119146,278 119147,137 119148,862 119149,557 119150,557 119151,579 119152,30 119153,6506 119154,634 119155,206 119156,356 119156,1332 119156,2436 119157,862 119158,19519 119159,119160 119161,304 119162,483 119163,158 119164,301 119164,615 119166,31977 119167,4545 119168,209 119169,310 119170,56 119171,130 119172,356 119173,30 119174,30 119175,392 119176,292 119177,269 119178,192 119178,1243 119179,999 119180,1243 119181,240 119182,1007 119183,130 119184,48 119185,30 119186,119187 119188,175 119189,298 119190,30 119191,435 119192,79 119193,843 119194,356 119195,309 119195,310 119195,403 119196,13137 119197,346 119198,119199 119200,13980 119201,417 119201,1285 119202,586 119203,1818 119204,119205 119206,72 119207,119208 119209,119209 119210,346 119211,119212 119213,77 119214,119215 119217,119218 119217,172004 119219,1001 119219,1085 119220,136 119220,137 119220,809 119221,1467 119222,3 119223,1882 119223,2210 119223,4237 119224,1381 119225,862 119226,388 119227,872 119228,4545 119228,139010 119229,2424 119230,301 119230,968 119230,1837 119230,2083 119231,346 119232,1871 119233,310 119235,233 119236,893 119236,6059 119237,366 119238,366 119239,1118 119240,298 119241,485 119243,106 119244,158 119245,346 119246,1293 119247,30 119248,192 119249,202 119249,203 119250,1096 119251,355 119252,1927 119253,1149 119254,255 119255,137 119256,83 119256,775 119256,1127 119258,134 119259,30 119260,1241 119261,333 119262,859 119263,6506 119266,1240 119267,30 119268,861 119269,22 119271,206 119272,248 119273,11 119274,30 119275,313 119275,1313 119276,22 119277,861 119278,206 119279,3804 119279,14797 119280,4611 119281,1544 119282,795 119283,422 119284,56 119285,30 119286,943 119287,602 119288,861 119289,22 119290,6506 119291,22 119292,119293 119294,861 119295,287 119296,298 119297,485 119298,1888 119298,4220 119299,119300 119303,298 119304,485 119305,818 119307,1326 119308,615 119309,422 119310,56 119311,1782 119312,3507 119313,872 119314,298 119315,485 119317,422 119318,422 119319,422 119320,2045 119321,422 119322,422 119323,422 119324,422 119325,788 119325,841 119326,422 119327,1293 119328,4611 119329,1544 119330,422 119331,417 119332,422 119333,1707 119334,760 119335,422 119336,422 119337,1220 119337,1222 119338,1983 119341,79 119342,1087 119343,4548 119344,392 119346,861 119347,22 119348,1087 119349,657 119349,1616 119349,2266 119350,3623 119351,2274 119352,1474 119353,83 119354,1858 119355,1860 119356,3623 119357,22 119358,861 119360,3623 119361,3623 119362,920 119363,2353 119364,1556 119365,298 119366,485 119367,4545 119369,3623 119370,1590 119371,422 119372,56 119373,1805 119374,3623 119375,390 119376,298 119377,485 119378,119379 119380,72 119382,5547 119382,54362 119383,2775 119384,447 119385,422 119386,56 119388,251 119388,920 119389,1983 119390,663 119390,1147 119392,79 119394,818 119395,1220 119395,1222 119396,252 119397,251 119398,525 119398,4039 119399,877 119400,422 119401,56 119402,1072 119402,5375 119403,861 119404,79 119405,818 119407,1240 119408,83 119409,743 119410,195 119411,4672 119411,18831 119412,18831 119413,1983 119414,134 119416,818 119417,328 119418,1985 119419,32 119419,178 119419,439 119419,493 119419,875 119419,1010 119419,1429 119419,1927 119421,714 119422,115 119422,118 119422,2991 119423,7270 119424,408 119425,1323 119426,102 119427,1326 119429,22 119430,861 119431,536 119431,872 119431,1072 119431,1240 119432,1011 119433,1359 119434,406 119435,83 119436,406 119438,147 119438,149 119438,406 119438,585 119439,1977 119439,1978 119440,298 119441,485 119442,818 119443,671 119443,1188 119443,144962 119444,137 119447,119448 119449,298 119450,485 119451,392 119452,743 119453,3623 119454,192 119454,779 119454,1515 119456,366 119456,1749 119457,14797 119458,14797 119460,14797 119461,1392 119462,14797 119463,417 119464,483 119465,119466 119467,809 119468,1474 119469,30 119470,3623 119471,5130 119473,3769 119474,1058 119475,862 119477,1634 119478,309 119478,310 119478,577 119479,37 119479,717 119479,1782 119480,571 119480,868 119481,269 119482,422 119483,4545 119483,139010 119484,932 119485,1147 119486,298 119487,485 119488,843 119489,104 119489,134 119490,4545 119490,56150 119490,139010 119491,843 119492,1467 119493,467 119493,81233 119493,152855 119494,455 119495,2424 119497,1118 119498,4611 119499,1544 119500,3 119501,1871 119502,106 119503,119504 119505,175 119506,83 119507,2421 119508,13980 119509,44 119510,1284 119513,1607 119514,2436 119515,1140 119515,5547 119516,72 119517,344 119518,285 119519,1363 119520,4066 119521,3623 119524,861 119525,22 119526,406 119527,809 119528,119529 119530,72 119531,344 119532,285 119533,392 119533,3003 119534,119535 119537,312 119538,392 119539,4545 119540,422 119541,349 119541,392 119541,1151 119542,192 119542,663 119542,1089 119543,211 119544,313 119545,1235 119545,1335 119546,30 119547,149 119547,406 119548,298 119549,30 119550,1240 119551,515 119552,934 119553,483 119554,602 119555,298 119556,485 119558,779 119558,1515 119559,1151 119560,694 119560,2775 119561,671 119562,4220 119563,30 119564,2315 119565,30 119567,30 119568,192 119569,697 119570,30 119571,406 119572,72 119573,968 119574,516 119576,861 119578,22 119580,2421 119583,5405 119584,104 119585,3623 119586,1634 119587,3474 119588,3623 119590,1381 119591,3653 119592,3367 119592,3846 119592,118336 119593,450 119594,392 119595,1458 119596,240 119597,296 119598,3623 119599,3623 119600,346 119601,3623 119602,30 119603,1247 119604,273 119605,175 119606,298 119608,1436 119609,450 119610,167 119611,3623 119612,1522 119613,366 119614,1227 119614,1252 119614,1253 119614,86416 119615,628 119616,31977 119617,120 119617,261 119617,588 119617,590 119617,1419 119617,2416 119617,2417 119617,3331 119618,34 119618,35 119619,577 119620,3623 119621,358 119622,30 119623,211 119624,2421 119625,120 119626,1769 119627,136 119627,137 119627,2557 119628,30 119629,50 119629,146 119629,151 119629,1556 119631,3623 119633,202 119633,203 119636,3623 119637,10 119638,422 119639,56 119640,1556 119641,119642 119641,150344 119641,175891 119643,50 119643,862 119644,623 119646,3623 119647,119648 119649,1962 119650,1462 119650,8537 119651,346 119651,510 119652,2205 119652,33424 119653,138 119654,1085 119655,206 119656,269 119657,557 119658,557 119659,862 119660,557 119661,158 119662,23783 119667,1133 119668,1860 119669,3612 119670,595 119671,2274 119672,392 119673,4760 119674,6059 119675,5658 119676,4252 119677,623 119678,697 119679,6955 119680,1860 119681,3612 119682,595 119683,2274 119684,392 119685,4760 119686,6059 119687,5658 119688,4252 119689,623 119690,697 119691,6955 119692,818 119695,119696 119695,121074 119695,227710 119698,1631 119699,119700 119702,298 119703,485 119704,366 119705,1707 119710,3623 119711,192 119711,779 119712,30 119713,1266 119713,8788 119714,323 119715,298 119716,485 119717,30 119718,1240 119719,119720 119721,557 119722,119723 119724,30 119725,30 119726,2775 119727,447 119728,392 119728,623 119729,140 119731,500 119731,929 119732,392 119734,6789 119735,843 119736,72 119737,344 119738,285 119739,119740 119741,119742 119743,510 119744,602 119745,818 119746,119747 119748,31977 119750,206 119751,63 119752,310 119754,30 119755,30 119757,130 119758,158 119758,1181 119760,149 119761,118192 119763,346 119764,10 119765,278 119766,13980 119767,346 119768,1353 119769,107 119769,852 119770,4545 119771,119772 119773,255 119774,872 119775,4545 119775,139010 119777,1454 119778,872 119779,4545 119779,139010 119780,298 119781,485 119782,704 119783,119784 119785,872 119787,30 119788,233 119789,760 119790,3207 119791,119792 119793,644 119794,714 119795,4611 119796,1544 119797,366 119798,366 119799,366 119800,1238 119801,1001 119802,310 119804,872 119805,1 119806,119807 119808,349 119808,567 119808,1436 119808,1837 119810,119811 119812,63 119813,119814 119815,298 119816,485 119817,298 119818,485 119819,861 119820,22 119821,861 119822,22 119823,119824 119825,309 119825,310 119826,63 119827,450 119828,355 119829,2351 119830,151 119831,1133 119832,20790 119833,1388 119834,30 119835,707 119836,875 119837,298 119838,485 119839,22 119840,392 119840,2553 119841,1359 119843,1359 119844,30 119845,611 119846,15 119847,119848 119849,298 119850,485 119851,1452 119852,717 119853,972 119853,1284 119855,1359 119856,30 119857,2191 119858,326 119858,1572 119858,1749 119859,726 119860,1818 119861,119862 119863,68 119863,631 119863,59931 119863,84257 119865,397 119866,119867 119868,22 119869,861 119870,337 119870,483 119870,509 119870,1118 119870,1345 119872,1590 119872,1644 119873,397 119874,861 119875,22 119876,41 119877,596 119878,1888 119879,422 119880,500 119881,1962 119882,1052 119883,1882 119884,2775 119885,54 119886,422 119887,422 119888,422 119889,422 119890,1240 119891,422 119892,422 119893,422 119895,422 119896,3804 119897,422 119898,422 119899,422 119900,422 119901,795 119902,1808 119903,30 119904,422 119905,383 119906,111 119906,202 119906,203 119907,571 119908,298 119909,485 119910,422 119912,615 119913,66 119914,20 119914,65 119914,66 119914,83 119914,140 119914,147 119914,158 119914,171 119914,195 119914,202 119914,203 119914,217 119914,240 119914,252 119914,269 119914,309 119914,310 119914,346 119914,366 119914,439 119914,447 119914,467 119914,510 119914,516 119914,538 119914,626 119914,687 119914,752 119914,779 119914,818 119914,868 119914,874 119914,920 119914,949 119914,1001 119914,1019 119914,1133 119914,1151 119914,1231 119914,1285 119914,1289 119914,1368 119914,1370 119914,1590 119914,1644 119914,1782 119914,1801 119914,2073 119914,2244 119914,3804 119914,31206 119914,31896 119915,119916 119917,2572 119918,143 119919,41 119920,151 119922,893 119925,2244 119926,30 119927,178 119928,392 119929,481 119930,1179 119931,3623 119932,389 119933,425 119934,750 119935,72 119936,30 119937,30 119938,302 119938,493 119939,392 119939,1309 119940,1392 119941,68069 119942,3623 119944,1858 119945,1860 119946,1132 119947,781 119948,30 119949,301 119949,631 119949,968 119950,134 119951,328 119953,818 119954,302 119955,83 119956,3003 119959,22 119960,1818 119961,1133 119963,175 119964,22 119965,861 119966,298 119967,83 119968,1506 119969,68069 119970,467 119971,346 119972,346 119974,30 119975,1688 119976,497 119976,874 119977,97 119978,703 119978,874 119978,949 119978,1240 119978,1805 119978,3182 119978,3258 119978,19443 119979,693 119980,1368 119981,1983 119982,1370 119983,22 119983,360 119983,536 119984,119985 119986,3555 119987,134 119988,48 119989,1436 119990,3967 119991,14100 119991,210028 119992,968 119993,1010 119993,119994 119995,392 119996,571 119997,119998 119997,125333 119999,714 119999,111142 120000,392 120001,63 120002,202 120002,203 120003,175 120004,298 120005,360 120006,1515 120007,120008 120007,121823 120009,2626 120011,298 120012,485 120013,79 120014,1844 120015,120016 120017,269 120018,1608 120019,298 120020,485 120021,3422 120022,875 120023,467 120023,156379 120024,861 120025,22 120026,602 120027,298 120028,485 120029,30 120029,328 120030,4611 120031,1544 120032,120033 120032,244517 120035,240 120036,875 120037,4611 120038,1544 120039,58 120040,994 120041,46 120042,75912 120044,805 120046,861 120047,22 120048,346 120050,192 120052,435 120052,447 120052,538 120052,671 120052,1877 120052,5996 120053,450 120054,1977 120054,1978 120056,408 120057,1323 120058,102 120059,1326 120060,50 120060,2923 120061,34 120061,35 120061,536 120062,58 120063,994 120064,46 120065,75912 120066,302 120067,289 120067,290 120067,94134 120069,1449 120070,1458 120070,42064 120072,450 120073,392 120074,30 120075,195 120077,30 120078,3094 120079,30 120080,120081 120083,503 120084,30 120085,579 120086,46 120086,48 120086,56 120086,130 120086,138 120086,278 120086,304 120086,444 120086,455 120086,459 120086,575 120086,660 120086,726 120086,744 120086,749 120086,795 120086,859 120086,996 120086,1117 120086,1122 120086,1274 120086,1644 120086,2315 120086,2424 120086,2646 120086,2944 120086,3115 120086,3623 120086,4220 120086,7768 120086,13137 120086,76096 120087,1531 120089,3507 120090,447 120090,671 120091,1388 120093,1818 120094,217 120095,209 120096,7117 120097,346 120098,1293 120099,106 120100,130 120100,1544 120100,1807 120101,2590 120103,1590 120104,252 120104,516 120104,1220 120104,1222 120105,30 120106,206 120106,4611 120109,1033 120109,1590 120109,1644 120110,2017 120111,957 120111,1815 120112,258 120115,1293 120116,140 120117,140 120118,2191 120119,2750 120120,3623 120121,422 120122,195 120123,1983 120124,640 120125,1749 120126,3623 120127,30 120128,467 120129,1607 120130,4691 120131,63 120132,592 120132,1001 120133,422 120133,1707 120134,50 120135,269 120136,240 120137,120138 120139,704 120141,30 120142,30331 120143,120144 120143,183712 120146,1132 120147,781 120150,44 120151,1821 120152,1001 120153,120154 120155,20 120155,79 120155,202 120155,203 120155,292 120155,333 120155,360 120155,435 120155,439 120155,440 120155,447 120155,538 120155,557 120155,579 120155,671 120155,794 120155,808 120155,996 120155,1033 120155,1068 120155,1118 120155,1167 120155,1294 120155,1332 120155,1368 120155,1370 120155,1474 120155,1544 120155,1590 120155,1644 120155,1663 120155,1776 120155,2224 120155,2353 120155,3422 120155,3582 120155,4823 120155,5662 120155,6661 120155,6824 120155,21442 120155,190492 120157,233 120157,589 120157,1085 120158,868 120159,304 120160,435 120161,120162 120164,366 120165,875 120166,120167 120168,120167 120169,1019 120170,2867 120170,2868 120171,175 120172,298 120173,843 120174,1293 120175,346 120176,4611 120177,1544 120178,4611 120179,1544 120181,1133 120182,202 120182,203 120183,1551 120184,392 120185,2353 120186,694 120187,346 120188,158 120188,269 120188,406 120188,622 120188,5874 120188,8308 120189,55849 120194,875 120195,120196 120195,129526 120198,392 120199,1285 120201,120202 120201,148495 120201,207165 120201,223072 120203,137 120204,136 120205,192 120205,663 120206,9195 120207,195 120208,195 120208,442 120208,500 120209,875 120210,1544 120212,809 120213,2353 120214,147 120215,450 120216,843 120217,932 120218,47 120218,2469 120219,779 120220,808 120221,450 120223,5366 120224,6051 120225,8719 120226,138 120227,865 120228,557 120229,120230 120231,137 120232,118 120232,4597 120233,88820 120234,557 120235,557 120236,557 120237,120238 120239,240 120239,372 120239,1082 120239,1955 120240,34 120240,35 120241,5547 120242,136 120244,120245 120247,503 120247,1773 120248,206 120249,1474 120250,9743 120251,30 120252,34 120252,35 120253,1858 120254,1860 120255,217 120256,4895 120257,1 120257,859 120257,980 120257,1368 120257,1571 120257,4571 120257,4691 120257,30331 120259,885 120259,13704 120260,202 120260,203 120262,175 120263,1983 120264,195 120265,1359 120266,483 120267,30 120268,83 120269,2083 120271,298 120272,485 120273,158 120274,240 120275,120276 120275,204525 120277,22 120278,861 120279,22 120280,861 120281,120282 120283,120284 120285,120286 120287,120288 120289,1072 120290,3623 120292,120293 120295,120296 120297,120296 120299,120300 120301,120302 120304,211 120305,120306 120307,72 120308,120309 120310,120311 120314,120315 120316,483 120318,120319 120320,120321 120322,323 120324,120325 120326,1313 120327,20771 120329,7 120330,72 120332,120333 120334,120335 120336,1368 120337,7316 120338,120339 120340,120341 120342,366 120343,366 120344,120345 120346,120347 120348,120349 120351,233 120352,120353 120354,120355 120356,1127 120357,120358 120359,130 120360,875 120361,893 120362,120363 120364,120363 120365,120366 120367,120368 120369,120370 120371,355 120372,120373 120375,120376 120377,406 120378,83 120380,120381 120382,120381 120383,120384 120386,422 120387,422 120388,422 120389,422 120390,422 120391,422 120392,422 120393,422 120394,422 120395,422 120396,422 120397,422 120398,4545 120398,139010 120400,346 120401,1267 120402,312 120403,83 120404,298 120405,485 120406,333 120407,83 120408,3623 120409,30 120411,859 120412,500 120413,120414 120415,1 120416,160 120418,2617 120419,120420 120419,134439 120419,139354 120419,141281 120419,143615 120419,158028 120419,180624 120421,26041 120422,30 120424,657 120426,30 120427,120428 120429,861 120430,22 120431,120432 120433,4193 120434,298 120435,485 120436,280 120436,1821 120436,17245 120436,21736 120437,10 120438,10 120439,714 120440,203 120440,7270 120441,1247 120442,647 120443,1335 120444,758 120445,1235 120445,1684 120446,3960 120447,44 120448,6556 120449,217 120449,536 120449,571 120449,1284 120449,1417 120449,1782 120449,162599 120451,973 120452,602 120453,120454 120456,310 120457,120458 120459,120460 120462,83 120463,30 120464,14797 120466,4193 120468,859 120472,120473 120474,1707 120475,479 120476,83 120477,269 120479,1858 120480,1860 120481,3846 120482,516 120482,1425 120483,346 120484,6627 120485,1 120486,30 120487,602 120489,602 120490,7757 120491,422 120492,56 120493,14797 120494,571 120495,485 120496,422 120497,30 120498,120499 120500,2979 120500,15179 120501,120502 120501,120504 120502,1402 120503,202 120503,203 120503,333 120503,500 120503,588 120503,590 120503,1531 120503,1724 120503,1968 120503,2073 120503,3804 120503,5310 120506,120507 120509,151 120510,103860 120511,68 120511,84257 120513,273 120514,298 120515,485 120516,346 120518,120519 120520,120521 120523,120524 120525,483 120526,120 120527,450 120528,4545 120528,56150 120528,139010 120529,450 120530,120531 120532,120533 120534,2719 120535,15573 120536,184 120537,120538 120539,1479 120540,72 120541,344 120542,285 120543,390 120545,120546 120547,450 120548,602 120549,120550 120551,120552 120553,450 120554,137 120555,602 120557,4355 120559,202 120559,203 120560,640 120561,450 120562,83 120563,120564 120565,120566 120567,120568 120569,120570 120571,1821 120572,233 120573,120574 120576,366 120577,107 120578,310 120578,805 120579,310 120580,2416 120580,2417 120581,292 120582,338 120583,298 120584,450 120585,1133 120586,3538 120587,563 120588,355 120589,1181 120590,346 120591,120592 120593,120594 120595,2574 120595,3297 120596,120597 120598,120599 120601,697 120602,1634 120604,55849 120605,120606 120607,120608 120609,22 120610,861 120612,980 120613,1085 120614,2367 120615,72 120616,30 120617,408 120618,1323 120619,102 120620,1326 120621,120622 120623,1231 120624,120625 120626,1707 120627,120628 120629,120630 120631,44 120632,120633 120634,1425 120635,72 120636,1181 120638,5250 120639,30 120640,30 120641,120642 120643,120642 120644,120642 120645,9015 120646,151 120647,2506 120648,872 120649,872 120652,483 120653,99 120654,118 120654,4597 120655,2244 120656,20813 120657,309 120657,310 120659,4218 120660,1368 120661,240 120662,422 120663,500 120664,120665 120666,120667 120668,358 120669,187 120670,1449 120671,30 120672,2135 120673,120 120673,273 120673,1052 120674,2775 120675,447 120677,83 120678,120679 120680,37414 120681,72 120683,818 120684,120685 120686,435 120686,439 120687,120688 120687,128495 120687,173079 120687,260684 120689,120690 120692,1707 120694,2620 120696,450 120697,120698 120699,206 120700,120701 120702,120703 120704,120704 120705,120706 120707,120708 120709,120710 120712,602 120713,72 120714,120715 120716,120717 120716,192362 120718,120719 120720,1388 120721,557 120722,557 120723,298 120724,485 120725,893 120726,3 120727,467 120728,55849 120729,602 120730,1388 120732,1509 120733,557 120734,602 120735,602 120737,422 120738,422 120739,422 120740,422 120741,422 120742,422 120743,422 120744,422 120745,422 120746,422 120747,422 120748,120749 120750,422 120751,422 120752,433 120753,527 120755,33611 120756,1072 120757,1181 120758,72 120759,536 120761,175 120762,298 120763,120764 120765,1007 120766,120767 120768,104 120769,184 120770,72 120771,120772 120773,602 120775,120776 120775,159821 120777,72 120778,120779 120780,292 120781,72 120782,294 120784,296 120785,298 120786,450 120787,302 120788,120789 120790,120791 120792,120793 120794,120795 120794,141493 120796,120797 120799,1238 120800,72 120801,298 120802,485 120803,1452 120804,30 120806,233 120807,120808 120809,4611 120810,1544 120811,1359 120812,19227 120813,275 120814,337 120814,1370 120815,120816 120817,30 120818,687 120818,811 120818,861 120818,893 120818,1509 120819,1240 120819,1465 120820,872 120821,120822 120823,355 120824,433 120825,264 120827,298 120828,485 120829,527 120830,86 120832,66 120832,868 120834,1007 120835,4771 120836,4611 120837,1544 120838,1010 120838,2006 120839,163 120839,209 120839,302 120839,326 120839,489 120839,579 120839,589 120839,687 120839,893 120839,2116 120840,222 120841,3467 120842,83 120843,4771 120844,503 120845,120846 120847,227 120848,931 120848,1149 120848,14458 120849,4355 120850,107 120851,225 120852,111 120853,623 120854,30 120856,269 120857,120858 120859,18831 120861,431 120862,298 120863,485 120864,4190 120865,640 120866,640 120867,527 120867,743 120868,120869 120870,1983 120871,120872 120873,83 120874,392 120875,760 120876,252 120876,1220 120876,1222 120877,660 120880,605 120880,1118 120881,346 120882,1566 120883,147 120884,1458 120885,120886 120887,4545 120887,139010 120888,120889 120890,120891 120892,149 120893,140 120893,652 120893,818 120893,1289 120893,1381 120893,1509 120893,1968 120893,4453 120894,120895 120897,255 120898,859 120899,406 120900,3209 120901,355 120901,1374 120902,500 120904,875 120906,1556 120907,818 120908,500 120909,808 120910,647 120911,344 120912,3538 120913,119 120914,209 120917,4611 120918,1544 120919,3422 120921,83 120922,1167 120923,620 120923,8244 120925,233 120925,1608 120927,673 120927,1844 120928,4611 120929,1544 120930,1452 120931,261 120933,120934 120935,422 120936,56 120937,5547 120938,4611 120939,1544 120940,66 120940,1116 120941,22 120942,861 120943,861 120944,22 120945,22 120946,861 120947,861 120948,22 120950,120951 120950,131012 120950,215032 120952,4611 120953,1544 120954,298 120955,485 120956,389 120957,872 120958,457 120960,718 120964,673 120964,5908 120968,861 120969,22 120970,1085 120971,422 120972,56 120973,298 120974,485 120975,861 120976,22 120977,1715 120978,5301 120979,392 120980,2367 120981,2224 120982,1849 120983,65 120984,158 120985,36985 120986,30 120988,30 120990,408 120991,298 120992,485 120993,2051 120993,49057 120995,4771 120996,1132 120997,781 120999,1707 121000,760 121001,118336 121003,298 121004,485 121005,14797 121006,14797 121008,14797 121009,14797 121010,4771 121011,14797 121012,1707 121014,415 121014,717 121014,2646 121015,994 121016,298 121017,485 121018,298 121019,485 121020,355 121021,422 121022,107 121022,4771 121023,72 121024,516 121024,1220 121024,1222 121025,121026 121029,1977 121029,1978 121030,63 121031,121032 121033,104 121033,134 121033,227 121033,240 121033,248 121033,264 121033,289 121033,290 121033,298 121033,503 121033,631 121033,636 121033,714 121033,1119 121033,1282 121033,1392 121033,1462 121033,1955 121033,2205 121033,2209 121033,8180 121033,8537 121033,33424 121033,94134 121034,850 121035,388 121036,30 121038,298 121039,485 121040,1634 121041,932 121042,875 121043,349 121043,1769 121044,2367 121045,626 121046,264 121046,835 121047,9560 121048,589 121049,1293 121050,693 121051,2744 121052,264 121052,1381 121053,298 121054,485 121055,647 121056,344 121057,557 121058,422 121059,56 121060,660 121060,868 121060,949 121061,121062 121063,647 121064,344 121065,875 121066,3623 121068,90845 121069,344 121070,647 121071,647 121072,344 121073,893 121075,433 121075,1888 121076,104 121077,121078 121079,302 121080,872 121080,1151 121080,1836 121080,127158 121081,557 121082,273 121083,5405 121084,392 121085,209 121085,302 121085,861 121087,121088 121090,417 121090,1085 121091,49887 121092,1388 121093,366 121095,202 121095,203 121095,32475 121096,1132 121097,781 121098,147 121098,158 121098,184 121098,779 121098,1458 121098,118336 121099,1858 121100,1860 121101,19010 121102,19443 121103,72 121104,5405 121106,1359 121107,852 121109,10 121109,4220 121109,178576 121110,192 121110,336 121110,422 121110,602 121110,1619 121110,1623 121110,4272 121112,121113 121114,121115 121117,301 121117,1782 121118,602 121121,251 121122,422 121123,56 121124,206 121125,107 121126,215 121127,1882 121128,323 121129,3507 121130,301 121132,536 121132,557 121133,14797 121134,1220 121134,1222 121135,252 121136,251 121137,72 121139,14797 121140,14797 121142,1220 121142,1222 121143,252 121144,251 121145,389 121146,577 121147,518 121147,1298 121148,6955 121149,536 121150,55849 121151,121152 121153,55849 121154,1466 121155,516 121156,104 121157,121158 121159,79 121160,536 121160,657 121161,217 121161,1417 121162,1010 121163,301 121163,968 121163,1782 121164,158 121165,422 121166,56 121167,861 121168,298 121169,485 121170,121171 121172,4895 121173,175 121174,298 121175,422 121176,56 121177,6506 121179,222 121180,34 121180,35 121181,3422 121182,1181 121183,483 121184,13361 121185,1893 121185,3474 121186,509 121187,107 121188,358 121189,1556 121190,83 121191,4771 121192,2367 121193,687 121194,779 121195,406 121196,158 121197,278 121197,455 121198,516 121199,2828 121200,302 121200,861 121200,893 121201,1096 121202,302 121203,14797 121204,704 121205,1010 121206,557 121208,2506 121209,818 121211,4771 121212,358 121213,217 121213,467 121213,592 121214,121215 121216,779 121217,557 121218,557 121219,1001 121220,121221 121222,3804 121223,307 121223,3846 121224,452 121224,2991 121225,991 121227,72 121228,861 121229,121230 121231,217 121231,240 121231,592 121231,1001 121231,1818 121232,72 121233,298 121234,485 121236,121237 121238,4222 121238,87415 121240,121241 121242,430 121242,994 121242,3816 121242,3817 121243,30 121244,328 121245,30 121246,215 121248,8854 121249,121250 121251,121252 121254,72 121255,79 121256,422 121257,56 121258,298 121259,485 121260,2116 121261,72 121262,206 121263,1381 121264,4691 121265,248 121265,2156 121266,647 121267,344 121268,175 121269,298 121270,72 121271,424 121272,1927 121273,72 121274,1531 121275,30 121276,577 121277,592 121278,118192 121279,121280 121281,422 121282,56 121283,2146 121284,72 121285,121286 121287,4545 121287,139010 121288,920 121289,206 121290,104 121291,5366 121292,2719 121292,2868 121293,72 121294,79 121295,72 121297,83 121298,72 121299,121300 121299,129654 121301,94 121301,2787 121302,4545 121304,8270 121305,83 121306,192 121308,72 121309,1566 121310,422 121311,56 121312,872 121313,1429 121314,121315 121316,121317 121318,72 121319,121320 121321,60576 121322,298 121323,485 121324,302 121325,83 121325,209 121325,3507 121325,55849 121325,60576 121326,72 121327,1147 121328,668 121329,2135 121330,72 121331,72 121332,1132 121333,781 121334,19356 121334,19443 121335,147 121336,233 121337,1515 121338,121339 121340,72 121341,366 121342,366 121343,726 121344,140 121344,264 121344,809 121345,121346 121347,355 121348,652 121349,338 121349,462 121349,473 121349,491 121349,1058 121349,1238 121349,2367 121349,2626 121349,4039 121349,8149 121350,422 121351,72 121352,4611 121353,1544 121354,71 121354,2512 121354,123847 121355,1860 121356,1241 121357,4611 121358,1544 121359,452 121359,457 121359,535 121359,676 121359,918 121359,1655 121360,795 121361,50 121362,376 121363,861 121364,22 121365,435 121366,518 121367,631 121368,4611 121369,1544 121371,455 121372,1282 121374,1858 121375,1860 121376,2334 121377,567 121378,1212 121379,660 121380,333 121381,818 121381,1801 121381,2319 121381,2991 121381,3182 121381,6424 121382,2209 121383,20 121383,3507 121384,467 121384,868 121385,690 121387,647 121388,344 121389,640 121390,525 121391,30428 121392,1068 121393,30 121394,1143 121395,1085 121396,18831 121397,259 121398,422 121399,422 121400,422 121401,422 121402,422 121403,422 121404,422 121405,422 121406,422 121407,422 121408,422 121409,392 121410,452 121411,1247 121412,68069 121413,184 121414,121415 121416,808 121417,149 121417,406 121418,3474 121420,269 121421,1659 121423,207 121424,81 121425,1284 121426,4611 121427,1544 121428,298 121429,485 121430,4611 121431,1544 121434,455 121435,422 121436,4545 121436,56150 121436,139010 121437,671 121437,1177 121437,182162 121438,2671 121439,1381 121441,146 121441,92476 121442,195 121442,27217 121447,30 121448,1860 121450,83 121451,388 121452,30 121454,30 121455,1844 121456,58 121457,994 121458,46 121459,75912 121460,30 121461,3585 121462,1858 121463,1860 121464,433 121465,1072 121466,872 121467,121468 121469,1663 121470,875 121471,1010 121472,81 121473,968 121473,1240 121474,652 121474,1893 121475,455 121476,693 121476,1608 121477,392 121478,30 121479,121480 121481,269 121483,623 121484,972 121485,298 121486,72 121487,344 121488,285 121490,575 121491,30 121492,30 121493,673 121494,1181 121496,2312 121497,1803 121497,5213 121498,34 121498,35 121499,298 121500,485 121501,41 121501,158 121501,160 121501,15573 121502,2296 121503,2334 121504,72 121505,392 121505,433 121505,435 121505,849 121505,919 121505,934 121505,1607 121505,1805 121506,269 121507,1220 121507,1222 121508,252 121509,251 121510,72 121512,1983 121513,1983 121514,121515 121516,1436 121517,30 121517,200 121517,772 121517,99807 121518,1381 121519,1782 121520,121521 121522,175 121523,298 121524,240 121525,408 121526,1323 121527,102 121528,1326 121530,634 121531,760 121532,3695 121533,417 121534,66 121535,1 121536,1247 121537,1509 121538,2617 121539,602 121540,7155 121542,1012 121543,801 121544,7155 121545,907 121546,184 121547,422 121548,56 121549,298 121550,485 121551,1132 121552,781 121553,30331 121554,1241 121555,1722 121556,760 121557,467 121558,907 121560,1858 121561,1860 121562,2572 121563,1551 121563,3999 121564,121565 121566,644 121567,298 121568,485 121569,222 121570,1381 121571,647 121572,344 121574,1849 121575,184 121576,2116 121576,19010 121577,178 121579,515 121580,1983 121581,121582 121583,158 121584,1509 121584,1551 121585,323 121586,72 121587,149 121587,406 121588,1363 121589,32 121590,298 121591,485 121592,392 121593,2699 121594,79 121594,251 121594,3585 121595,298 121596,485 121597,932 121598,433 121599,222 121600,1119 121600,1462 121601,743 121602,30 121603,1983 121604,1983 121605,30 121607,72 121608,264 121609,457 121610,435 121611,3 121612,1140 121613,406 121614,121614 121615,1326 121616,215 121616,714 121616,1282 121616,111142 121616,176782 121617,1449 121618,30 121619,217 121619,1417 121621,247 121622,30 121623,455 121623,1019 121625,200 121626,175 121627,30 121628,298 121629,1052 121629,1127 121629,1893 121629,2626 121629,49057 121630,30 121631,72 121632,65 121632,868 121632,31896 121633,647 121634,344 121636,1474 121637,30 121638,30 121639,72 121640,557 121642,34 121642,35 121643,121644 121645,636 121646,222 121646,1881 121647,1240 121648,30 121649,1745 121650,135 121651,44 121652,875 121654,304 121655,135 121656,217 121657,1068 121658,1509 121659,298 121660,485 121661,192 121661,309 121661,310 121661,13910 121663,252 121663,1220 121663,1222 121664,240 121664,1955 121665,135 121666,55849 121667,30 121668,647 121669,344 121670,872 121671,72 121672,30 121673,30 121674,30 121675,41 121676,422 121677,56 121679,147 121679,158 121680,72 121681,1132 121682,781 121683,406 121684,304 121685,483 121686,30 121687,63 121688,30 121690,30 121691,30 121693,1359 121694,269 121695,136 121695,137 121696,885 121696,13704 121697,1467 121698,417 121698,862 121698,1119 121698,2184 121698,3094 121698,13828 121698,16077 121698,18425 121698,19944 121698,75912 121698,121090 121699,206 121700,1556 121701,83 121702,8213 121703,30 121704,2782 121705,206 121706,850 121707,503 121708,140 121709,267 121710,30 121711,1265 121711,1266 121712,3960 121713,1326 121714,195 121715,4895 121716,79 121717,22 121717,292 121717,337 121717,1844 121717,75912 121718,151 121718,577 121718,1400 121718,2073 121719,30 121720,10 121721,707 121722,5405 121723,10 121724,222 121725,30 121726,30 121727,13919 121728,30 121729,788 121730,1608 121731,118 121731,4597 121732,30 121733,433 121734,1132 121735,781 121736,30 121737,171 121738,2797 121739,171 121740,121741 121742,516 121743,557 121744,55849 121745,121746 121747,158 121748,557 121749,372 121750,104 121751,217 121751,536 121753,10 121754,333 121755,392 121756,175 121757,298 121758,160 121758,515 121759,209 121759,3695 121759,4691 121761,589 121761,775 121761,843 121761,1001 121762,121763 121764,135 121765,121766 121765,170185 121765,220065 121768,1 121769,1531 121770,30 121771,121772 121773,121774 121775,1 121777,714 121778,631 121779,121780 121781,251 121782,121783 121784,424 121785,422 121786,422 121787,422 121788,422 121789,422 121790,422 121791,422 121792,422 121793,422 121794,2373 121795,422 121796,422 121797,422 121798,422 121799,240 121800,121801 121802,30 121803,1265 121803,1266 121804,121805 121806,1821 121808,30 121809,1309 121810,121811 121812,121813 121815,121816 121818,175 121820,298 121821,1818 121822,222 121824,4545 121824,139010 121825,994 121826,17245 121827,121828 121829,626 121830,240 121831,171 121832,121833 121835,2244 121836,11147 121837,932 121838,20813 121840,121841 121842,121843 121844,872 121845,280 121845,17245 121846,462 121847,72 121848,121849 121850,1849 121851,200 121853,269 121854,121855 121856,310 121857,557 121858,1368 121859,1238 121860,581 121861,1782 121862,392 121863,46 121863,589 121863,596 121863,75912 121863,178576 121863,185874 121864,859 121865,1452 121866,121867 121868,121869 121870,298 121871,485 121872,121873 121874,121875 121876,121877 121879,121880 121881,872 121882,720 121883,72 121884,121885 121886,75912 121887,310 121888,104 121889,872 121890,1983 121891,158 121892,34 121892,35 121892,406 121892,657 121893,1172 121894,104 121896,1707 121898,104643 121901,298 121902,485 121903,186 121903,1707 121904,2979 121905,298 121906,485 121907,200 121908,298 121909,485 121910,1370 121910,1385 121911,7652 121913,264 121914,298 121915,485 121917,355 121918,972 121919,41 121919,671 121922,356 121923,2989 121923,2991 121924,527 121925,298 121926,485 121927,178 121929,1368 121930,151 121930,497 121931,1326 121932,2979 121934,298 121935,485 121936,433 121937,298 121938,485 121939,79 121941,298 121942,485 121943,302 121944,298 121945,485 121946,298 121947,485 121948,4545 121949,2979 121952,298 121953,485 121954,146 121954,567 121954,1634 121954,92476 121955,158 121957,215 121957,16755 121958,30 121959,3474 121959,19010 121961,861 121962,22 121963,615 121964,298 121965,485 121966,121967 121968,1293 121970,121970 121971,379 121971,1274 121971,1353 121972,298 121973,485 121974,298 121975,485 121976,2574 121977,147 121977,149 121978,1293 121979,657 121980,121981 121982,10 121983,114217 121984,114217 121985,1007 121985,1509 121985,1551 121985,3999 121986,192 121987,4611 121988,1544 121989,6955 121990,298 121991,485 121992,22 121993,861 121995,298 121996,485 121997,200 121998,5405 121999,1556 122000,1381 122001,298 122002,485 122004,4611 122005,1544 122006,2979 122007,1590 122008,287 122008,314 122009,1509 122010,4545 122010,139010 122011,175 122012,298 122013,1149 122014,4545 122014,56150 122014,139010 122016,269 122018,1085 122019,298 122020,485 122021,122022 122023,122024 122025,298 122026,485 122027,298 122028,485 122029,919 122030,83 122032,149 122032,406 122032,1776 122033,298 122034,485 122035,536 122036,71 122038,3260 122039,818 122040,1181 122041,515 122042,111 122042,1151 122042,1572 122043,81 122044,298 122045,485 122046,175 122047,3003 122048,298 122049,106 122050,934 122051,240 122051,5547 122052,647 122053,344 122055,718 122056,298 122057,485 122058,309 122058,310 122060,4611 122061,1544 122062,393 122063,97 122063,2812 122064,122065 122066,83 122067,2146 122068,718 122069,4611 122070,1544 122071,122072 122073,4691 122075,298 122076,485 122077,298 122078,285 122079,30 122081,254 122082,287 122083,30 122084,30 122085,893 122087,439 122088,298 122089,485 122090,509 122090,150022 122091,663 122091,685 122091,1058 122091,1220 122091,1222 122091,5192 122091,5540 122092,22 122093,81 122094,200 122094,299 122094,515 122094,2674 122094,2779 122094,28130 122094,30331 122094,142433 122095,408 122096,1323 122097,102 122098,1326 122099,515 122100,30 122101,577 122102,6323 122103,83 122104,195 122105,920 122107,4545 122108,122109 122110,1590 122110,1644 122111,843 122112,4611 122113,1544 122114,30 122115,217 122116,349 122116,2784 122117,1590 122118,920 122120,240 122121,1181 122122,4545 122122,56150 122122,139010 122123,1149 122124,586 122125,206 122126,433 122127,536 122127,1881 122128,79 122130,344 122130,2646 122130,3209 122131,1359 122132,968 122132,1293 122133,1374 122134,50 122135,192 122135,309 122135,310 122135,13910 122136,255 122136,4701 122136,6895 122136,9689 122136,13445 122136,24916 122136,34524 122136,93134 122136,119416 122136,120907 122136,121951 122136,122136 122136,122207 122136,122425 122136,123355 122136,123396 122136,123397 122136,126053 122136,126589 122136,128472 122136,128965 122136,129101 122136,130197 122136,130519 122136,130761 122136,130840 122136,131532 122136,131860 122136,131861 122136,131944 122136,132068 122136,133020 122136,134909 122136,134958 122136,134967 122136,134968 122136,145207 122136,146030 122136,146413 122138,994 122139,1143 122139,1836 122140,248 122140,5405 122141,328 122141,1608 122142,1181 122143,515 122144,23701 122145,79 122145,1052 122146,122147 122148,859 122149,1235 122149,1335 122150,346 122151,310 122152,310 122153,1181 122155,122156 122157,328 122158,30 122159,106 122159,1231 122159,2083 122159,5662 122160,283 122160,626 122161,649 122162,30 122164,1893 122165,1033 122167,1220 122167,1222 122168,252 122169,251 122171,2784 122172,1085 122174,726 122176,557 122177,2205 122177,33424 122177,245910 122179,264 122180,422 122181,56 122183,72 122184,3623 122185,579 122185,2116 122186,30 122187,3623 122188,175 122189,462 122189,8149 122190,298 122191,30 122193,44 122194,1010 122195,389 122196,355 122197,516 122197,1512 122199,30 122200,392 122200,697 122200,1240 122200,1454 122200,1465 122200,3260 122200,15523 122201,2371 122202,134 122202,203 122203,1010 122204,122205 122206,440 122208,3623 122209,483 122210,4545 122210,56150 122210,139010 122211,417 122213,30 122214,3623 122215,980 122216,450 122217,406 122218,122219 122220,140 122221,30 122222,358 122223,406 122224,1551 122225,1033 122226,3 122226,372 122226,390 122226,968 122226,8992 122227,30 122228,122229 122231,885 122231,13704 122233,333 122234,3623 122235,122236 122237,122238 122239,289 122239,290 122239,94134 122240,122241 122242,557 122243,5906 122244,557 122245,626 122246,278 122247,137 122248,862 122249,255 122250,557 122251,30 122252,122253 122255,19 122256,30 122257,147 122258,920 122259,1531 122260,346 122261,147 122262,147 122263,147 122264,30 122265,1043 122266,440 122267,4771 122268,872 122269,2929 122270,393 122271,433 122273,122274 122273,147206 122276,3623 122277,500 122278,1962 122279,1052 122280,1882 122281,2775 122282,54 122283,289 122283,290 122283,94134 122284,89035 122285,2146 122285,2574 122286,122287 122288,422 122289,660 122290,30 122291,175 122292,392 122293,122294 122295,298 122296,298 122297,485 122298,30 122300,122301 122302,298 122303,485 122304,931 122305,122306 122307,634 122307,994 122308,122309 122310,1001 122312,72 122313,344 122314,285 122315,1113 122316,122317 122318,211 122319,30 122320,10 122320,2574 122321,122322 122323,30 122324,195 122325,4 122325,5 122326,2775 122327,447 122328,72 122329,122330 122329,152723 122331,636 122332,310 122333,1001 122333,1326 122333,3193 122333,3804 122333,14797 122334,240 122335,644 122335,122336 122338,83 122339,255 122340,122341 122342,122343 122344,54 122345,872 122347,636 122348,298 122349,485 122350,122351 122353,10 122354,657 122355,171 122356,636 122357,304 122358,122359 122360,122361 122362,217 122363,779 122363,141912 122365,4611 122366,1544 122368,122369 122370,425 122371,1722 122372,366 122373,704 122374,366 122377,366 122378,122379 122380,305 122381,366 122382,366 122383,72 122384,779 122385,30 122386,310 122387,872 122388,122389 122391,481 122392,292 122394,83 122395,941 122396,289 122396,290 122396,3003 122396,94134 122397,83 122399,827 122400,859 122401,122402 122403,718 122404,1370 122405,355 122407,314 122407,779 122407,141912 122412,2353 122416,2353 122417,2353 122418,175 122419,1240 122420,298 122421,2089 122421,2940 122423,779 122424,2353 122426,602 122427,2315 122428,151 122429,192 122429,663 122430,779 122430,141912 122432,264 122433,697 122434,175 122435,298 122436,2353 122437,779 122438,503 122439,211 122439,314 122439,599 122439,775 122439,784 122439,1001 122439,3094 122440,355 122440,760 122442,1707 122443,3653 122444,122445 122446,122447 122448,372 122449,25573 122450,1619 122451,167 122451,261 122451,301 122451,333 122451,444 122451,592 122451,615 122451,919 122451,968 122451,1133 122451,2205 122451,2557 122451,3422 122451,5662 122451,33424 122453,1474 122454,783 122455,1509 122456,1172 122458,2775 122459,447 122460,147 122461,3623 122462,2979 122463,422 122464,422 122465,422 122466,2574 122467,422 122468,422 122469,422 122470,1133 122471,422 122472,1479 122473,2411 122474,264 122475,356 122476,422 122477,422 122478,685 122478,26450 122479,422 122480,422 122481,72 122482,30 122483,106 122484,1773 122485,843 122486,4571 122487,718 122488,1368 122489,146 122489,779 122489,141912 122490,1220 122490,1222 122491,252 122492,251 122493,83 122496,83 122497,83 122497,5591 122498,79 122499,652 122500,1240 122501,843 122502,158 122503,660 122504,30 122505,49887 122506,328 122506,372 122506,2812 122506,4222 122507,861 122508,160 122508,1381 122510,718 122512,388 122513,175 122514,298 122515,1634 122516,240 122516,592 122516,1818 122517,697 122517,2626 122517,3260 122518,1556 122520,1240 122520,1465 122521,697 122522,1220 122522,1222 122523,252 122524,251 122525,818 122526,79 122527,30 122528,685 122529,1146 122529,13136 122530,23287 122530,200543 122531,1860 122532,1181 122532,30331 122533,1289 122533,1968 122534,349 122535,30 122536,72 122537,875 122538,1147 122539,1454 122540,2929 122541,30 122542,596 122543,527 122544,147 122545,809 122546,647 122547,344 122548,433 122549,122550 122551,72 122552,2017 122552,2626 122552,17309 122554,30 122555,122556 122559,30 122560,4691 122562,304 122562,1068 122562,1294 122564,647 122565,344 122567,254 122568,207 122569,1240 122569,1345 122570,30 122571,596 122572,240 122573,87 122573,140 122573,323 122573,392 122573,510 122573,1151 122573,1453 122573,1572 122573,1722 122573,2697 122574,809 122575,1001 122576,1220 122576,1222 122577,252 122578,251 122579,30 122580,1849 122581,130 122582,1147 122583,122584 122585,985 122586,392 122586,1151 122587,41 122587,217 122588,811 122589,298 122590,485 122592,1220 122592,1222 122593,252 122594,251 122595,1858 122596,1860 122597,122598 122599,30 122600,273 122601,30 122602,1608 122603,3474 122604,2373 122605,34 122605,35 122606,805 122606,81233 122609,313 122610,122611 122612,1220 122612,1222 122613,252 122614,811 122615,251 122616,83 122616,1240 122617,1220 122617,1222 122618,252 122619,251 122621,217 122621,714 122621,1282 122621,9005 122623,126 122624,326 122626,349 122627,298 122628,485 122629,907 122630,122631 122632,72 122633,1220 122633,1222 122634,252 122635,251 122637,1844 122638,72 122639,1381 122640,83 122641,433 122642,122643 122644,296 122645,3623 122646,527 122647,850 122648,175 122649,298 122650,818 122651,17309 122652,2867 122652,2868 122653,122654 122653,141243 122655,440 122656,126 122657,440 122657,1033 122658,122659 122661,663 122662,7092 122663,273 122664,252 122665,46 122666,10 122667,240 122667,611 122668,46 122668,48 122668,56 122668,130 122668,138 122668,278 122668,304 122668,444 122668,459 122668,575 122668,660 122668,726 122668,744 122668,749 122668,795 122668,859 122668,996 122668,1117 122668,1122 122668,1274 122668,1644 122668,2315 122668,2424 122668,2646 122668,2944 122668,3115 122668,3623 122668,4220 122668,7768 122668,13137 122668,76096 122669,1052 122670,652 122671,356 122671,852 122671,1722 122672,1634 122673,1858 122674,1860 122675,435 122675,440 122676,872 122677,4611 122680,3623 122681,298 122682,485 122683,32 122684,63 122684,489 122684,1623 122685,1220 122685,1222 122686,252 122687,251 122688,338 122689,399 122690,1522 122691,1888 122692,795 122692,96471 122693,3623 122694,310 122695,1010 122696,298 122697,485 122699,393 122700,920 122701,406 122702,99 122702,779 122702,141912 122703,122704 122705,65 122705,586 122706,30 122707,652 122708,83 122709,557 122710,9121 122713,142433 122714,4771 122716,30 122717,358 122718,389 122719,949 122720,30 122721,22 122722,10 122723,122724 122726,596 122727,557 122728,557 122729,704 122730,862 122731,122732 122733,557 122734,122732 122735,2083 122736,122737 122738,122739 122740,483 122741,72 122742,72 122743,344 122744,285 122745,3246 122746,1235 122746,1335 122747,861 122748,22 122751,1556 122752,994 122753,23783 122755,122756 122757,30 122758,1844 122759,122760 122761,949 122762,994 122763,72 122764,122765 122766,893 122767,872 122769,206 122770,873 122771,200 122772,30 122773,255 122774,175 122775,298 122776,122777 122778,920 122779,122780 122781,122782 122783,55849 122784,184 122785,10 122786,577 122787,7270 122788,1608 122789,485 122790,1235 122790,1335 122791,647 122792,122793 122794,1227 122794,86416 122795,431 122795,631 122795,760 122795,784 122796,2572 122797,46 122797,387 122798,602 122799,366 122800,366 122801,366 122802,4545 122803,366 122804,323 122806,440 122807,3367 122808,805 122809,2590 122810,72 122811,4545 122812,122813 122815,31977 122816,704 122818,207 122819,72 122821,122822 122824,72 122825,4545 122825,139010 122827,34 122827,35 122828,872 122829,1429 122830,255 122831,3695 122833,668 122835,30 122836,122837 122839,122840 122841,122842 122843,72 122844,872 122845,602 122847,72 122848,4771 122849,122850 122851,72 122852,122853 122854,298 122855,485 122856,72 122857,1143 122858,872 122859,240 122861,366 122863,122864 122865,233 122866,287 122867,298 122868,485 122869,1238 122870,1293 122871,122872 122871,130717 122873,122874 122875,1058 122876,1707 122877,79 122877,489 122878,149 122878,406 122879,2168 122881,626 122882,861 122883,22 122884,298 122885,485 122886,160 122887,122888 122889,1452 122890,440 122891,4545 122891,56150 122892,83 122893,704 122894,779 122895,557 122896,1556 122897,2775 122898,447 122899,22 122900,861 122901,2353 122902,1220 122902,1222 122903,252 122904,251 122905,685 122905,1619 122905,193129 122906,171 122907,861 122908,22 122909,83 122910,55849 122911,252 122912,83 122913,859 122915,3474 122917,72 122918,422 122919,422 122920,422 122921,120 122921,240 122921,332 122921,372 122921,818 122921,1082 122921,1807 122922,422 122923,422 122924,422 122925,422 122926,422 122927,422 122928,392 122929,422 122930,422 122931,422 122932,422 122933,422 122935,783 122936,872 122937,7757 122938,652 122940,1370 122941,56 122941,313 122941,733 122941,775 122941,1313 122941,1623 122941,4545 122943,1631 122945,215 122946,122947 122948,298 122949,485 122950,1858 122951,1860 122952,7092 122953,783 122954,346 122955,2572 122957,647 122958,344 122959,323 122959,358 122959,388 122959,623 122959,694 122959,1072 122959,1465 122959,1927 122959,3135 122959,4549 122959,14126 122960,23783 122961,122962 122963,2775 122964,447 122965,111 122966,4611 122967,1544 122968,980 122969,1188 122970,660 122971,861 122972,22 122976,779 122977,3653 122978,4 122978,5 122978,355 122979,158 122981,160 122983,158 122985,298 122986,485 122987,500 122988,875 122989,1235 122989,1335 122990,254 122991,862 122992,1285 122992,84257 122994,122995 122996,500 122997,1962 122998,1052 122999,1882 123000,264 123001,2775 123002,54 123003,349 123003,3260 123004,636 123005,861 123006,22 123007,120 123007,332 123007,372 123007,818 123007,1082 123007,1807 123008,298 123009,485 123010,264 123011,2867 123011,2868 123012,175 123013,1309 123014,298 123015,298 123016,485 123017,779 123017,141912 123018,346 123019,2775 123020,447 123022,7092 123023,442 123023,1140 123024,1243 123025,192 123025,406 123026,920 123028,8308 123029,346 123030,422 123031,3585 123032,1116 123033,123034 123036,422 123038,1220 123038,1222 123039,252 123040,251 123041,538 123041,1010 123042,83 123043,6303 123044,968 123045,3507 123046,346 123047,4545 123047,56150 123047,139010 123049,240 123050,2590 123051,97 123052,123053 123054,123055 123056,310 123057,1419 123057,3115 123058,4611 123059,1544 123060,211 123061,1531 123061,4545 123062,1289 123063,1858 123064,1860 123065,422 123066,422 123067,1634 123069,123070 123071,1858 123072,1860 123073,422 123074,467 123074,868 123074,156379 123074,162599 123075,346 123076,2045 123078,123079 123081,123082 123083,123079 123084,79 123084,422 123086,422 123087,79 123087,3804 123089,160 123090,346 123091,206 123092,485 123093,123094 123095,298 123096,485 123097,968 123098,298 123099,485 123100,207 123101,37 123102,30 123102,200 123102,772 123104,222 123106,123107 123108,22 123110,440 123111,304 123112,602 123113,309 123113,310 123114,134 123115,3623 123116,862 123117,875 123118,392 123118,1860 123119,175 123120,298 123122,68069 123123,72 123124,1531 123125,123126 123127,30 123129,222 123131,2784 123132,557 123133,934 123134,298 123135,485 123136,1133 123137,1 123138,10 123139,440 123140,5405 123141,623 123142,346 123143,640 123145,3695 123146,30 123149,467 123150,932 123151,206 123152,392 123153,1983 123154,5405 123155,356 123156,994 123157,123158 123159,264 123160,704 123161,1203 123163,440 123164,312 123165,515 123165,1033 123166,298 123167,485 123168,301 123168,1298 123169,440 123170,1284 123171,647 123172,344 123174,2048 123175,2156 123176,1001 123177,140 123177,586 123178,920 123179,175 123180,72 123181,344 123182,285 123183,697 123184,298 123185,104 123186,312 123186,338 123187,440 123189,10 123190,55849 123192,920 123193,920 123194,273 123195,147 123196,147 123197,3623 123198,147 123199,147 123201,111 123201,3538 123202,920 123203,10 123204,1151 123205,22 123205,809 123205,861 123205,2017 123205,17309 123206,4545 123207,206 123208,87 123209,9030 123210,211 123211,809 123212,1132 123213,781 123214,123215 123214,123740 123214,129390 123214,129763 123214,130300 123216,406 123218,10 123218,113156 123219,123220 123221,346 123222,30 123224,30 123225,557 123226,557 123227,123228 123229,557 123230,30 123231,8719 123232,138 123233,865 123234,557 123235,137 123236,118 123236,4597 123237,88820 123238,86 123238,167 123238,240 123238,301 123238,567 123238,605 123238,615 123238,631 123238,720 123238,907 123238,968 123238,972 123238,973 123238,1010 123238,1122 123238,1124 123238,1167 123238,1231 123238,1241 123238,1284 123238,1298 123238,1436 123238,1522 123238,1544 123238,1564 123238,1782 123238,1785 123238,1818 123238,1837 123238,2191 123238,2372 123238,2557 123238,2620 123238,2979 123238,3193 123238,3207 123238,3218 123240,994 123241,994 123242,123243 123244,1143 123245,346 123247,63 123247,493 123248,1012 123249,440 123250,222 123251,55849 123252,801 123253,123254 123255,1140 123255,5547 123256,302 123257,346 123258,338 123260,2173 123261,30 123262,123263 123264,123265 123266,422 123267,123268 123269,422 123270,422 123271,422 123272,422 123273,422 123274,422 123275,422 123276,422 123277,422 123278,72 123279,602 123280,123281 123282,779 123282,123281 123283,123281 123284,2775 123285,447 123286,516 123287,379 123288,123289 123290,30 123291,1085 123292,1465 123293,30 123294,72 123295,175 123296,298 123297,338 123298,123299 123300,704 123301,123302 123303,72 123305,123306 123307,72 123308,123309 123310,602 123311,72 123312,184 123313,123314 123315,862 123316,123317 123318,123319 123320,1 123321,72 123322,123323 123324,123325 123326,72 123327,72 123328,123329 123330,72 123331,72 123332,255 123333,72 123334,1860 123335,310 123336,72 123337,233 123338,8884 123339,81 123341,1085 123342,366 123343,366 123344,366 123345,366 123346,123347 123348,304 123349,355 123351,862 123352,30 123353,330 123354,1127 123354,1368 123356,862 123357,117163 123358,79 123359,1631 123360,83 123361,222 123362,123363 123364,206 123365,123366 123367,72 123368,83 123369,72 123371,2266 123372,72 123373,123374 123373,226007 123375,2574 123377,123377 123378,704 123378,1821 123379,843 123379,1474 123380,273 123381,1522 123382,406 123383,123384 123386,72 123387,344 123388,285 123389,72 123390,949 123391,30 123392,30 123393,123394 123398,392 123399,273 123400,72 123401,393 123402,72 123403,14434 123404,206 123405,302 123406,1572 123408,123409 123410,1623 123411,3653 123412,123413 123414,123415 123414,256642 123416,841 123417,392 123417,433 123419,206 123420,79 123421,704 123422,73570 123422,103860 123423,72 123424,1479 123425,390 123426,483 123427,50 123427,147 123427,202 123427,203 123427,285 123427,333 123427,406 123427,620 123427,994 123427,1181 123427,1515 123427,2782 123427,4545 123428,123429 123430,1608 123430,1801 123432,298 123433,485 123434,123435 123436,1359 123437,346 123439,1285 123440,994 123441,2744 123442,49057 123443,346 123444,79 123445,298 123446,485 123447,34 123447,35 123447,1715 123448,406 123449,83 123451,53763 123452,346 123453,920 123454,875 123455,123456 123457,123458 123459,44 123460,1181 123462,17487 123463,366 123464,123465 123466,310 123467,310 123468,310 123469,192 123469,326 123469,397 123469,702 123469,1211 123469,2307 123469,4315 123469,18383 123469,49978 123469,114643 123469,130241 123469,143959 123469,151386 123470,123471 123472,72 123473,7358 123473,7363 123474,72 123476,9025 123478,83 123479,123480 123482,123483 123484,123485 123486,158 123487,123488 123490,123491 123492,805 123493,949 123495,233 123496,346 123497,123498 123499,123500 123499,123510 123499,123559 123499,124447 123499,124680 123499,129469 123499,131567 123499,131896 123499,144405 123501,123502 123501,151568 123503,355 123505,467 123506,346 123507,818 123508,123509 123511,1955 123512,123513 123514,123515 123517,1571 123518,1235 123518,1335 123519,123520 123521,111 123521,949 123521,1072 123522,123523 123524,72 123525,344 123526,285 123528,123529 123531,652 123532,123533 123534,2526 123535,304 123536,123537 123538,72 123539,344 123540,285 123541,10 123542,140 123542,287 123542,392 123542,809 123542,191860 123543,123544 123545,123546 123547,104 123547,136 123547,557 123547,1939 123548,123549 123550,72 123553,273 123554,1181 123555,123556 123557,298 123558,485 123560,714 123561,1179 123561,1305 123561,2701 123562,72 123563,123564 123565,72 123566,123567 123569,123570 123571,123572 123573,123574 123575,346 123576,31896 123577,20813 123578,932 123579,1707 123581,3623 123582,44 123583,123584 123585,123586 123587,694 123587,1623 123588,123589 123590,1688 123592,875 123593,72 123594,783 123594,1241 123594,1294 123595,123596 123597,72 123598,72 123599,344 123600,72 123601,285 123602,123603 123604,123605 123606,389 123607,389 123607,1849 123608,467 123609,2373 123610,123610 123611,422 123612,56 123613,2373 123614,346 123615,123616 123617,298 123618,485 123619,346 123620,123621 123622,500 123623,788 123624,123624 123625,123626 123627,949 123628,346 123629,123630 123632,55849 123633,55849 123634,602 123635,392 123636,30 123637,123638 123639,19 123640,123641 123642,1707 123643,123644 123646,8854 123647,406 123648,406 123648,585 123649,72 123650,72 123652,273 123653,557 123654,557 123655,640 123656,72 123657,557 123658,557 123659,433 123660,72 123661,123662 123663,72 123664,86 123664,75912 123665,123666 123667,123666 123668,192 123670,41 123670,920 123670,1881 123670,4355 123670,5405 123670,227669 123671,72 123672,123673 123674,72 123675,996 123676,68 123676,240 123677,72 123678,2775 123679,447 123680,123681 123682,72 123683,30 123684,298 123685,485 123686,72 123687,344 123688,285 123690,1282 123691,123692 123693,123694 123696,875 123697,72 123698,344 123699,285 123700,123701 123702,123703 123704,503 123705,123706 123707,123708 123710,30 123712,2411 123713,23011 123714,483 123715,195 123715,123716 123717,123718 123720,1265 123720,1266 123723,30 123724,72 123725,809 123725,141912 123726,2807 123727,602 123729,4771 123731,123732 123733,292 123734,1285 123735,294 123736,296 123737,298 123738,72 123742,123743 123744,1238 123745,72 123746,1452 123747,72 123748,233 123749,123750 123751,72 123752,366 123753,366 123754,366 123755,206 123757,2205 123757,33424 123757,245910 123758,217 123759,123760 123761,58 123762,994 123763,46 123764,75912 123765,298 123766,485 123768,920 123769,72 123770,355 123771,671 123772,147 123773,775 123774,184 123775,72 123776,872 123777,72 123778,41 123780,211 123780,193129 123780,220502 123781,1983 123782,516 123783,298 123784,485 123785,240 123785,968 123785,1479 123785,1955 123785,189303 123788,602 123789,171 123790,171 123792,1844 123793,72 123794,861 123795,171 123796,289 123796,760 123796,2617 123796,81070 123796,94134 123797,841 123797,7794 123797,8867 123797,14091 123797,14511 123797,24835 123797,25571 123797,60576 123797,82819 123797,87799 123797,89915 123797,180487 123797,182933 123797,184739 123797,189839 123797,190344 123797,193661 123797,199529 123797,201152 123797,201164 123797,201277 123797,203984 123797,204048 123797,219855 123797,219856 123797,219906 123797,221744 123797,225542 123797,234810 123797,243622 123797,250838 123797,254451 123798,1014 123799,171 123800,1580 123801,1860 123802,72 123803,123804 123805,657 123806,123807 123809,68 123809,1707 123811,1070 123811,2828 123812,673 123813,1888 123814,149 123814,406 123814,1425 123815,72 123816,298 123817,485 123818,1983 123819,298 123820,485 123821,859 123822,920 123824,111142 123825,1580 123826,5405 123827,72 123828,344 123829,285 123830,261 123830,32751 123831,123832 123833,30 123833,440 123833,622 123833,1033 123833,1179 123835,422 123836,56 123837,720 123837,907 123838,1580 123839,72 123841,422 123842,422 123843,56 123844,811 123845,2146 123846,256 123846,440 123846,13538 123847,90845 123848,1381 123850,481 123851,972 123851,1010 123852,1631 123852,6627 123853,827 123854,1070 123855,97 123856,83 123858,171 123859,312 123861,422 123862,422 123863,422 123864,422 123865,422 123866,422 123867,422 123868,422 123869,422 123870,79 123871,422 123872,422 123873,422 123874,255 123875,422 123876,433 123876,1590 123876,7092 123878,1556 123879,1566 123880,195 123881,123882 123883,298 123884,485 123885,1016 123885,2209 123886,94 123886,430 123886,2787 123886,3816 123886,3817 123887,79 123888,298 123889,485 123890,106 123890,149 123890,158 123890,406 123890,1425 123890,102560 123891,408 123895,269 123896,422 123897,56 123898,1359 123899,134 123899,2105 123900,1359 123901,2205 123901,33424 123902,30 123903,671 123903,3846 123904,175 123905,298 123906,72 123907,123908 123909,298 123910,485 123911,392 123912,440 123913,217 123916,2421 123917,483 123918,5591 123919,1151 123920,195 123921,2775 123922,447 123923,893 123924,298 123925,485 123926,406 123927,1381 123928,19010 123929,298 123930,485 123932,1132 123933,781 123935,2205 123935,33424 123938,72 123939,344 123940,285 123941,985 123942,79 123943,1179 123944,192 123944,1509 123945,671 123946,30 123947,843 123948,652 123949,187 123950,388 123951,392 123952,1282 123952,2205 123952,33424 123953,269 123954,79 123955,30 123957,579 123958,2867 123958,2868 123960,120 123961,171 123962,118336 123963,668 123964,431 123964,2784 123966,1858 123967,1860 123968,4691 123970,202 123970,843 123970,1370 123971,301 123973,843 123974,1858 123975,1860 123976,30 123979,932 123980,843 123981,861 123982,22 123983,422 123984,56 123985,920 123986,640 123987,30 123988,3507 123989,1888 123990,760 123991,202 123991,203 123992,788 123993,1127 123994,872 123995,58 123996,994 123997,46 123998,75912 123999,1019 124000,30 124001,305 124002,298 124003,485 124004,626 124005,5405 124006,30 124007,718 124007,891 124009,66 124009,920 124011,344 124012,261 124013,1370 124015,3 124015,775 124015,8992 124016,118336 124017,968 124017,1293 124018,2867 124018,2868 124019,2253 124019,142426 124020,14989 124021,160 124022,248 124023,2512 124024,875 124025,1858 124026,1860 124027,536 124027,2319 124029,298 124030,485 124031,124032 124033,1370 124033,21736 124034,124035 124036,124037 124038,875 124039,124040 124039,136283 124041,83 124043,200 124044,44 124046,124047 124048,175 124049,298 124050,2048 124051,1001 124052,333 124052,59021 124053,124054 124055,83 124056,2379 124057,79 124058,72 124059,344 124060,285 124063,3260 124065,30331 124066,222 124067,861 124069,1644 124070,261 124070,292 124070,337 124070,435 124070,538 124070,602 124070,671 124070,1293 124072,440 124073,124073 124075,124075 124076,875 124077,202 124077,203 124078,1707 124079,30 124080,30 124081,30 124082,103860 124083,2797 124084,1323 124085,124085 124086,392 124088,30 124089,30 124090,1007 124091,34 124091,35 124091,217 124092,124093 124094,19010 124095,30 124096,30 124097,149 124097,21442 124098,30 124099,30 124100,175 124101,298 124102,1955 124103,697 124104,1132 124105,781 124106,379 124107,30 124109,1227 124109,86416 124110,30 124111,483 124112,4771 124113,5310 124114,97 124115,30 124116,314 124116,467 124116,1556 124117,602 124118,310 124118,3039 124119,48 124120,602 124121,557 124122,4060 124123,557 124124,557 124125,171 124126,500 124127,1962 124128,1052 124129,1882 124130,2775 124131,54 124132,124133 124134,124135 124136,158 124137,124138 124139,358 124140,104 124140,200 124141,124142 124143,298 124144,485 124145,124146 124147,30 124148,124148 124149,298 124150,485 124151,30 124152,158 124154,30 124156,171 124157,30 124158,4672 124159,30 124160,872 124161,72 124162,30 124163,885 124163,13704 124164,3538 124165,30 124166,2334 124167,158 124167,2775 124168,1888 124169,2775 124170,602 124171,298 124172,485 124175,124176 124177,124178 124179,2116 124180,298 124181,485 124182,515 124183,72 124184,344 124185,285 124187,5908 124189,124190 124191,779 124192,273 124193,422 124194,56 124195,264 124196,1381 124197,30 124199,422 124200,56 124202,1007 124203,124204 124205,124206 124207,124208 124209,577 124210,1722 124210,3538 124211,124212 124213,240 124214,124215 124216,422 124217,119205 124217,140995 124218,422 124219,602 124220,422 124221,422 124222,422 124223,422 124224,422 124225,422 124226,124227 124228,422 124229,422 124230,422 124231,422 124232,602 124233,124234 124235,3804 124236,14797 124237,2737 124238,518 124239,3193 124240,31122 124241,346 124243,1467 124244,72 124245,147 124246,1309 124247,269 124247,1844 124249,124250 124251,30 124253,2590 124254,72 124255,124255 124256,124257 124259,2915 124260,589 124260,1001 124261,30 124262,843 124263,171 124264,640 124265,68 124265,2590 124266,207 124267,30 124268,596 124269,124270 124271,602 124272,124273 124274,2292 124275,30 124277,346 124278,124279 124280,1381 124281,346 124283,872 124284,1458 124285,872 124286,1429 124287,346 124288,772 124291,35905 124292,124293 124294,30 124295,202 124296,124297 124298,1179 124299,389 124300,1085 124301,366 124302,366 124303,83 124304,366 124305,366 124306,124307 124308,366 124309,366 124310,366 124312,30 124313,668 124314,4771 124315,10 124316,124317 124318,657 124320,644 124322,233 124323,1132 124324,781 124325,2411 124326,1007 124328,346 124329,920 124330,103860 124331,489 124332,579 124334,872 124335,124336 124337,124338 124339,97 124340,124341 124342,4455 124343,309 124343,310 124344,872 124345,294 124346,1143 124347,1776 124347,118336 124348,355 124349,124350 124349,143331 124352,72 124353,63 124355,30 124356,1707 124358,30 124360,30 124362,907 124363,3804 124364,1449 124365,1631 124366,2209 124367,30 124368,217 124368,536 124368,3507 124369,30 124370,124371 124372,13538 124373,640 124375,68 124375,1210 124376,124377 124378,457 124378,596 124379,346 124380,58 124381,994 124382,46 124383,75912 124384,994 124385,5547 124386,79 124386,192 124387,1608 124388,442 124389,264 124390,222 124391,349 124391,422 124391,668 124391,801 124392,58 124393,1132 124394,781 124395,215 124396,217 124397,450 124398,920 124399,58 124400,994 124401,46 124402,75912 124403,264 124404,663 124405,22 124406,124407 124408,1551 124409,1803 124410,994 124411,481 124412,79 124412,192 124413,1531 124414,302 124417,1400 124418,124419 124420,30 124422,503 124423,160 124423,1749 124424,1001 124425,302 124425,579 124425,2116 124426,422 124426,30365 124427,422 124428,2867 124428,2868 124429,56 124430,252 124431,2574 124432,2671 124434,707 124434,1201 124436,140 124437,760 124438,35905 124440,1033 124440,1294 124441,2310 124443,355 124445,124446 124448,107 124449,5547 124450,868 124451,980 124452,298 124453,485 124454,626 124455,83 124456,22 124457,536 124458,861 124459,346 124459,538 124461,22 124462,868 124463,175 124464,298 124465,1252 124465,1253 124466,332 124467,3474 124468,192 124469,1417 124470,217 124470,390 124470,631 124470,872 124470,932 124470,968 124470,1001 124470,1085 124470,1118 124470,1122 124470,1796 124470,1962 124471,146 124473,79 124473,147 124473,192 124474,1118 124476,298 124477,485 124478,202 124478,203 124479,1177 124480,485 124481,298 124482,1579 124483,2979 124484,298 124485,485 124486,4545 124486,139010 124487,23287 124489,1858 124490,1860 124491,299 124492,440 124493,1572 124494,1400 124496,1801 124497,147 124497,206 124497,406 124498,298 124499,485 124500,503 124501,406 124502,240 124504,2775 124505,447 124506,298 124507,485 124508,1531 124509,1 124510,298 124511,485 124513,760 124515,485 124516,298 124517,2620 124518,809 124519,760 124522,1285 124523,392 124525,336 124526,1326 124527,1635 124528,124529 124530,124531 124532,217 124533,2979 124534,332 124535,267 124536,22 124537,146 124538,720 124540,203 124540,920 124541,408 124542,1323 124543,102 124544,1326 124545,1010 124546,87 124548,147 124548,202 124548,439 124548,516 124548,663 124548,920 124548,1181 124549,510 124551,510 124552,264 124553,346 124554,611 124555,124556 124557,124558 124559,124558 124560,124558 124561,124558 124562,222 124563,1564 124564,22 124565,124566 124567,1858 124568,1860 124569,175 124570,298 124571,712 124573,1285 124575,567 124576,349 124576,455 124576,697 124576,1860 124576,6955 124577,457 124577,515 124577,557 124577,581 124577,868 124577,941 124577,1130 124577,2373 124577,4545 124577,56150 124577,139010 124578,1265 124578,1266 124579,30 124580,1881 124581,602 124582,217 124583,178 124585,130 124585,292 124585,462 124585,483 124585,1639 124585,1653 124586,1639 124587,275 124588,30 124589,147 124589,149 124589,158 124589,206 124589,406 124589,1458 124589,1515 124589,2244 124589,80266 124589,89035 124589,149534 124590,1285 124590,8537 124590,84257 124591,30 124592,422 124592,473 124592,577 124592,615 124592,640 124592,762 124592,949 124592,1010 124592,1058 124592,1265 124592,1266 124592,1607 124592,1749 124592,1807 124592,4146 124592,4355 124592,5961 124592,8072 124592,9457 124592,90845 124592,131675 124593,536 124594,247 124595,455 124595,31896 124597,1 124598,1608 124599,72 124600,1858 124601,1860 124602,1858 124603,1860 124604,536 124605,346 124606,907 124607,301 124607,1231 124607,1293 124607,1782 124608,693 124609,406 124610,1010 124611,30 124612,124613 124614,301 124614,1001 124615,1801 124616,4611 124617,1858 124618,1860 124619,346 124620,4611 124621,261 124621,333 124622,1105 124623,872 124624,809 124625,22 124626,83 124627,30 124628,124629 124630,30 124631,485 124632,298 124633,1014 124634,175 124635,298 124636,124637 124639,217 124639,536 124639,1417 124639,4672 124639,18831 124640,1227 124640,86416 124642,483 124643,195 124643,5874 124643,6119 124643,16767 124644,222 124644,455 124645,113156 124647,298 124648,485 124649,31977 124651,1285 124652,217 124653,323 124654,298 124655,485 124656,124657 124659,30 124660,140 124661,267 124663,1370 124664,22 124665,124666 124667,30 124668,287 124668,666 124668,676 124668,877 124668,907 124668,937 124668,972 124668,1010 124668,1117 124668,1122 124668,1298 124668,1575 124668,1849 124668,7530 124668,21249 124668,32784 124668,38299 124668,56430 124668,72764 124668,92017 124668,102507 124668,107616 124668,124668 124668,131798 124668,131799 124668,131801 124668,131802 124668,131803 124668,131804 124668,131805 124668,131806 124668,135074 124668,135075 124668,137058 124668,137059 124668,140357 124668,158556 124668,159112 124668,159116 124668,162739 124668,163010 124668,164960 124668,166285 124668,168252 124668,171641 124668,176427 124668,177254 124668,177362 124668,180341 124668,182790 124668,183568 124668,185991 124668,187176 124668,195145 124668,195575 124668,196038 124668,196197 124668,196657 124668,198235 124668,204791 124668,204801 124668,205673 124668,211899 124668,217539 124668,218495 124668,225480 124668,232771 124668,240457 124668,244105 124668,244800 124668,247499 124668,255471 124668,259293 124669,30 124670,140 124671,1985 124672,30 124673,2828 124674,200 124675,557 124676,30 124677,1429 124678,2353 124679,30 124681,1085 124682,285 124683,704 124684,4691 124685,124686 124687,206 124688,358 124690,872 124691,557 124693,557 124694,1309 124695,30 124696,388 124697,184 124698,124699 124700,1140 124700,5547 124701,344 124703,219 124705,1001 124706,358 124707,1556 124708,615 124709,217 124709,1417 124710,79 124711,1359 124714,124715 124716,124717 124718,50176 124719,298 124720,485 124721,2116 124722,30 124723,346 124725,298 124726,485 124727,124724 124729,433 124731,1707 124732,22 124733,124734 124735,1181 124735,2931 124736,124737 124738,577 124739,124740 124741,22 124742,149 124743,489 124744,358 124745,1715 124746,1858 124747,1860 124748,124749 124751,124752 124753,124754 124755,920 124756,1807 124757,31977 124758,30 124759,124760 124761,1849 124762,862 124763,479 124764,124765 124764,132566 124766,134 124766,72439 124767,1467 124768,2590 124769,346 124770,455 124771,2424 124772,206 124773,346 124774,366 124775,366 124776,346 124777,366 124778,1871 124779,366 124780,366 124781,366 124782,83 124783,2421 124784,13980 124785,30 124786,124787 124788,124789 124788,137818 124788,190203 124788,234074 124790,207 124791,30 124792,346 124793,134 124793,991 124794,7358 124794,7363 124795,22 124796,124797 124798,124799 124800,124801 124802,872 124803,1429 124804,1238 124806,124807 124809,1452 124810,233 124811,124812 124813,264 124814,668 124815,1133 124816,147 124816,149 124817,158 124818,718 124819,1707 124820,422 124821,56 124822,120 124822,1419 124823,1474 124824,22 124825,2557 124827,346 124828,346 124830,124831 124832,124833 124834,79 124835,4611 124836,647 124837,344 124838,1881 124839,346 124840,119 124841,579 124842,289 124842,290 124842,94134 124843,4611 124844,1544 124845,124846 124847,56 124847,333 124847,406 124847,422 124847,505 124847,602 124847,3218 124847,4866 124847,124847 124848,2775 124849,447 124850,1939 124851,640 124852,640 124853,640 124854,1007 124854,1551 124854,3999 124855,1608 124856,41 124856,1608 124858,1007 124859,422 124860,56 124861,355 124862,124863 124864,1257 124865,422 124866,56 124867,592 124868,611 124869,500 124870,63 124870,106 124870,337 124870,1175 124870,1821 124871,151 124872,240 124872,1888 124873,22 124874,968 124874,1293 124874,1782 124875,346 124876,980 124877,1888 124878,22 124879,124880 124882,682 124882,1353 124882,72439 124883,503 124884,1803 124885,79 124886,602 124887,718 124888,1143 124889,1 124889,147 124889,336 124889,406 124889,620 124889,841 124889,1425 124889,2244 124889,8244 124889,9532 124889,55254 124889,102560 124889,124889 124889,126059 124889,130379 124889,135245 124889,145651 124890,485 124891,298 124892,1151 124893,481 124894,1707 124895,493 124896,19010 124897,278 124897,726 124897,1001 124897,3182 124897,3585 124898,1133 124898,2334 124899,503 124900,124901 124902,124901 124903,868 124905,467 124905,868 124906,22 124907,1191 124908,31073 124909,4223 124910,862 124910,27041 124911,1635 124912,22 124913,1983 124914,422 124915,422 124916,358 124917,422 124918,302 124919,422 124920,422 124921,422 124922,422 124923,422 124924,422 124925,422 124927,422 124929,422 124930,2073 124931,1509 124932,425 124932,1276 124932,142430 124933,178 124934,422 124935,273 124936,422 124937,1580 124938,563 124939,1844 124940,868 124941,3507 124942,467 124943,219 124946,1556 124947,1556 124948,207 124949,1769 124949,59021 124951,1007 124952,1983 124953,467 124954,602 124956,30 124957,1326 124957,31122 124958,202 124958,203 124959,124960 124961,22 124962,30 124963,626 124965,599 124966,852 124967,30 124967,248 124968,124969 124971,83 124972,577 124972,1388 124973,124973 124974,22 124975,68 124976,885 124976,13704 124978,124979 124980,346 124982,406 124982,60576 124983,1417 124984,30 124985,346 124988,346 124989,557 124992,22 124993,48 124996,175 124997,298 124998,647 124998,3218 125001,264 125002,485 125003,298 125004,72 125006,1559 125007,30 125008,389 125009,760 125010,602 125012,125013 125012,139891 125012,141972 125014,868 125015,344 125016,647 125017,392 125018,841 125019,72 125020,1033 125021,48 125022,994 125023,500 125024,125025 125027,337 125029,175 125030,827 125032,298 125033,4545 125034,1359 125035,1010 125036,72 125037,1983 125038,433 125039,868 125040,1544 125041,2557 125043,356 125044,1807 125045,615 125047,1359 125048,222 125049,68069 125050,941 125051,744 125052,783 125053,58 125053,140 125053,346 125053,358 125053,515 125053,647 125053,835 125053,1381 125053,1400 125053,1579 125053,1893 125053,5440 125054,1345 125054,3474 125055,1707 125056,694 125057,397 125058,1072 125059,843 125060,83 125060,207 125062,125063 125064,818 125065,1608 125065,1984 125065,8072 125066,3769 125067,72 125068,22 125069,125070 125071,3804 125072,22 125073,1105 125074,125075 125077,811 125078,392 125079,1001 125079,1177 125080,125081 125081,125081 125083,135 125084,885 125084,13704 125085,596 125087,1417 125088,30 125089,859 125090,1140 125090,5547 125091,264 125092,392 125092,697 125093,515 125093,1619 125094,30 125095,15 125096,485 125097,3830 125098,602 125099,602 125100,285 125101,893 125101,992 125101,5908 125102,852 125103,125104 125105,991 125105,1707 125105,2605 125106,125107 125106,131400 125108,602 125109,602 125110,151 125112,130 125113,718 125114,649 125115,1285 125116,30 125117,1381 125118,10 125118,309 125118,310 125118,113156 125119,602 125120,1983 125121,338 125122,609 125123,175 125124,697 125125,298 125126,602 125127,3447 125128,20771 125130,893 125132,30 125133,120 125134,483 125135,392 125136,83 125137,22 125139,83 125141,298 125142,485 125143,467 125144,23783 125145,22 125146,1167 125147,83 125148,125149 125150,217 125150,1608 125151,79 125152,200 125153,872 125154,973 125154,1235 125154,1335 125156,125156 125157,30 125158,920 125159,125160 125161,392 125162,536 125163,1801 125164,72 125164,515 125164,827 125165,10 125166,298 125167,485 125168,125169 125170,125171 125172,264 125172,1381 125173,44725 125175,125176 125177,125178 125179,2744 125179,127158 125180,125181 125182,515 125183,422 125184,56 125185,515 125186,22 125187,22 125188,718 125189,125190 125191,30 125192,30 125193,932 125195,364 125196,125197 125198,55849 125199,125200 125201,3623 125202,2135 125203,55849 125204,697 125205,30 125206,875 125207,125208 125209,872 125211,5906 125212,557 125213,626 125214,278 125215,137 125216,862 125217,557 125218,1722 125219,557 125220,130 125222,1467 125223,280 125223,17245 125224,1453 125225,125226 125227,298 125228,485 125229,1467 125230,6387 125231,346 125232,389 125233,872 125234,72 125236,158 125237,440 125239,3623 125240,8798 125242,455 125242,657 125242,213089 125243,118 125243,4597 125244,406 125245,248 125245,760 125246,125247 125248,72 125249,885 125249,13704 125250,557 125251,44 125252,68 125253,6506 125254,1860 125255,125256 125257,647 125258,30 125259,125260 125261,1860 125262,422 125263,1454 125264,862 125265,379 125266,125267 125268,2367 125269,2572 125270,1127 125271,22 125272,211 125273,30 125274,195 125275,72 125276,125277 125278,2775 125279,447 125280,302 125280,861 125280,893 125281,30 125282,298 125283,485 125284,4611 125285,125286 125287,255 125288,125289 125290,240 125290,333 125290,1085 125291,1388 125292,72 125293,72 125294,125295 125296,217 125296,516 125297,52 125297,175 125298,312 125299,7155 125300,125301 125302,392 125303,72 125305,125306 125307,30 125308,125309 125310,1143 125311,125312 125313,72 125314,125314 125315,116 125315,994 125315,2087 125316,4611 125317,125318 125319,389 125320,872 125321,312 125322,72 125323,125324 125326,366 125327,366 125328,366 125329,125330 125331,107 125332,366 125334,72 125335,83 125337,1634 125338,125339 125340,222 125341,125342 125343,125344 125345,125344 125346,233 125347,125348 125349,125350 125351,7155 125352,31977 125354,1579 125356,255 125357,192 125358,125359 125360,22 125361,125362 125363,22 125364,2574 125365,22 125366,518 125366,3804 125367,217 125367,1805 125368,7155 125369,217 125369,1844 125369,2557 125370,192 125372,920 125372,1243 125374,298 125375,485 125376,3207 125377,781 125378,1132 125381,125382 125383,872 125384,1105 125385,1082 125386,305 125387,125388 125389,1893 125391,698 125392,22 125393,298 125394,485 125395,640 125396,640 125397,125397 125398,640 125399,7155 125400,1284 125401,406 125401,493 125402,217 125403,125404 125406,1001 125407,340 125408,1058 125409,4039 125410,406 125412,424 125413,22 125414,893 125415,273 125416,125417 125418,1381 125419,330 125420,602 125421,298 125422,485 125423,3653 125424,827 125425,248 125425,2436 125425,4237 125425,7155 125425,182162 125426,22 125427,22 125428,2379 125429,1133 125430,7155 125431,22 125432,125433 125434,22 125437,393 125437,439 125437,671 125437,893 125437,1243 125439,481 125440,389 125441,422 125442,7155 125444,422 125445,2671 125446,422 125447,422 125448,422 125449,422 125450,422 125451,422 125452,422 125453,422 125454,422 125455,125456 125457,298 125458,485 125459,240 125460,22 125461,442 125461,852 125462,1425 125463,2775 125464,447 125465,83 125467,22 125468,125469 125470,1983 125471,5547 125472,358 125472,1058 125472,2572 125472,8714 125474,1556 125475,22 125476,134 125477,192 125478,22 125480,704 125481,19010 125482,222 125482,2424 125483,1140 125484,671 125486,22 125488,3724 125489,125490 125491,467 125492,500 125493,1962 125494,1052 125495,1882 125496,2775 125497,54 125498,408 125499,5375 125501,392 125501,644 125502,455 125503,861 125503,2116 125504,7155 125505,907 125507,22 125510,424 125511,843 125512,17309 125514,3623 125515,298 125516,485 125518,406 125519,72 125520,4691 125521,125522 125523,125524 125526,347 125527,1837 125528,626 125529,273 125530,175 125531,298 125532,479 125533,171 125534,3623 125535,125536 125537,30 125539,106 125540,366 125541,408 125542,1323 125543,102 125544,1326 125545,1608 125546,358 125548,509 125548,510 125548,872 125550,424 125551,251 125552,7155 125553,3252 125555,2367 125556,125557 125559,340 125560,809 125560,1143 125560,1860 125561,147 125562,30 125564,252 125564,868 125565,125566 125567,22 125568,30 125569,5358 125569,14352 125569,125569 125570,298 125571,485 125572,109503 125573,298 125574,485 125575,2205 125575,33424 125576,994 125577,346 125578,22 125580,1707 125581,1608 125582,292 125582,3370 125582,14453 125584,932 125585,125586 125587,30 125590,22 125591,30 125593,211 125594,2373 125595,500 125596,1962 125597,1052 125598,1882 125599,2775 125600,54 125601,103860 125602,1167 125603,22 125605,1983 125607,994 125609,22 125610,467 125611,1707 125612,54284 125614,175 125615,171 125616,298 125617,30 125618,298 125619,485 125620,171 125621,1235 125621,1335 125623,30 125624,2416 125624,2417 125625,1849 125626,994 125627,48 125628,1432 125629,94 125629,2787 125630,14434 125631,171 125632,200 125633,273 125634,439 125634,595 125634,2424 125634,3182 125635,72 125636,344 125637,285 125638,868 125639,877 125640,302 125640,861 125640,893 125641,1235 125641,1335 125642,994 125643,125643 125644,392 125644,1240 125644,6955 125645,346 125646,81 125646,622 125647,346 125648,171 125649,503 125652,1 125653,72 125654,125655 125658,2205 125658,33424 125660,994 125661,406 125662,994 125663,192 125664,71 125665,30 125666,30 125667,125668 125669,355 125670,125671 125672,151 125673,872 125674,125675 125674,199985 125676,3252 125677,171 125678,147 125679,4192 125679,4193 125680,7360 125681,1707 125682,1425 125683,557 125684,30 125686,30 125688,125689 125690,7155 125691,483 125692,233 125693,704 125695,72 125696,125697 125698,358 125699,171 125700,55849 125701,1608 125702,422 125703,56 125704,422 125705,56 125707,125708 125709,125710 125713,760 125713,7155 125714,366 125715,366 125716,1515 125717,862 125718,72 125720,125721 125722,125723 125724,285 125725,634 125725,2266 125726,30 125727,34 125727,35 125727,907 125727,973 125727,1001 125727,1133 125727,3507 125727,8180 125727,19946 125728,30 125729,30236 125730,125731 125732,22 125733,22 125734,30 125735,1634 125736,30 125737,557 125738,72 125740,557 125741,30 125742,862 125743,206 125744,557 125745,158 125746,3846 125747,72 125748,125749 125750,178 125750,1776 125752,219 125753,8714 125754,149 125754,585 125754,1425 125755,356 125755,2989 125755,2991 125757,1247 125758,248 125759,3555 125761,158 125763,872 125764,79 125765,577 125768,130 125769,250 125769,1684 125772,79 125772,125773 125772,126575 125774,105793 125775,206 125777,255 125778,125779 125780,640 125781,563 125783,125784 125785,1983 125786,72 125789,72 125790,125791 125792,72 125793,125794 125795,872 125796,125797 125799,602 125800,720 125800,1052 125800,4980 125801,125802 125804,30 125805,125806 125807,30 125809,255 125810,255 125811,125812 125813,366 125814,3148 125815,34 125815,6323 125816,2989 125816,2991 125817,211 125818,652 125818,1266 125819,1551 125820,1096 125821,125822 125823,125824 125825,233 125826,850 125827,79 125828,626 125829,1888 125830,1983 125831,7652 125832,3555 125833,1238 125834,355 125835,125836 125837,264 125837,1289 125837,1893 125839,1452 125841,972 125842,125843 125844,1860 125845,103860 125846,7155 125847,500 125848,222 125848,455 125849,302 125850,788 125851,125852 125853,1392 125854,192 125855,788 125856,493 125857,647 125858,30 125859,30 125860,30 125861,7155 125862,125863 125864,805 125864,7155 125865,615 125866,75912 125867,943 125868,809 125870,1181 125871,473 125872,184 125872,206 125873,1070 125874,30 125877,222 125878,34 125878,35 125879,772 125879,28203 125880,673 125880,1130 125881,72 125882,72 125883,1515 125885,510 125885,852 125886,163 125886,1556 125886,2116 125888,202 125888,203 125888,393 125889,125890 125891,79 125892,298 125893,485 125894,2775 125895,447 125896,104643 125897,298 125898,485 125899,577 125899,980 125900,1240 125901,72 125902,344 125903,285 125904,481 125905,5547 125906,19010 125907,1019 125908,298 125909,485 125911,30 125913,30 125914,2443 125915,30 125916,2574 125917,2367 125918,83 125919,22 125920,192 125921,192 125922,1359 125923,647 125924,344 125925,422 125926,422 125927,422 125928,422 125929,422 125930,422 125931,422 125932,422 125933,68069 125934,422 125935,422 125936,422 125937,422 125938,422 125939,125940 125941,422 125942,125943 125944,125945 125946,875 125948,1368 125950,1707 125951,1359 125952,4222 125954,302 125955,186 125955,392 125955,1893 125955,3474 125956,287 125957,302 125958,298 125959,485 125960,18831 125961,18831 125964,79 125965,602 125966,1707 125967,32 125967,104 125967,392 125967,1836 125967,6556 125968,4545 125968,56150 125969,788 125971,1282 125972,18831 125973,264 125973,1284 125974,1132 125975,781 125976,6837 125977,125978 125979,852 125979,1298 125979,1436 125980,222 125980,536 125980,55233 125984,1983 125985,30 125986,18831 125987,1001 125988,125989 125988,126591 125990,217 125991,298 125992,485 125994,30 125995,175 125996,298 125997,485 125998,298 125999,126000 126001,850 126002,126003 126004,30 126005,1235 126005,1335 126006,4545 126006,139010 126007,907 126008,718 126009,200 126010,2784 126011,485 126012,22 126013,58 126013,71 126013,251 126013,255 126013,287 126013,298 126013,493 126013,563 126013,577 126013,626 126013,663 126013,671 126013,698 126013,788 126013,795 126013,801 126013,811 126013,991 126013,1012 126013,1068 126013,1070 126013,1133 126013,1309 126013,1368 126013,1429 126013,1449 126013,1474 126013,1634 126013,1789 126013,2367 126013,2436 126013,5405 126013,5961 126013,6837 126013,16331 126013,185874 126013,193129 126014,515 126015,408 126016,1323 126017,102 126018,1326 126019,809 126020,298 126021,485 126022,563 126023,422 126024,422 126025,106 126025,3069 126026,760 126026,1715 126027,2006 126028,510 126029,1118 126031,10 126033,932 126035,2373 126037,222 126037,7768 126038,563 126039,206 126040,202 126040,203 126041,640 126042,640 126044,1247 126045,5547 126046,163 126047,163 126049,3115 126050,1210 126051,126052 126053,818 126054,652 126057,1849 126058,20771 126059,102560 126060,222 126061,192 126062,30 126063,652 126064,2367 126065,126066 126067,779 126067,68069 126068,1052 126069,422 126070,56 126071,126072 126073,107 126074,72 126075,344 126076,285 126077,1849 126078,1085 126080,422 126081,56 126082,44 126083,717 126084,1722 126086,1359 126087,30 126088,1556 126089,200 126090,46 126091,949 126091,1849 126092,126093 126094,10 126095,1458 126096,195 126098,332 126099,298 126100,485 126101,875 126102,22 126104,200 126105,175 126106,298 126107,406 126107,620 126107,779 126107,1515 126108,126109 126110,843 126110,1849 126111,2646 126113,222 126114,1363 126115,77 126116,805 126117,126118 126119,217 126120,302 126120,861 126120,893 126120,1556 126121,126122 126123,1635 126124,217 126125,868 126126,107 126127,2416 126127,2417 126128,292 126129,338 126130,175 126131,298 126132,298 126133,1580 126134,332 126135,1775 126136,30 126137,1133 126138,3538 126139,1285 126140,50 126141,3623 126142,22 126143,4545 126145,30 126146,175 126147,332 126148,130 126149,298 126150,126151 126152,809 126153,125197 126154,406 126155,126156 126157,41 126157,1462 126157,3135 126157,8537 126158,30331 126159,195 126160,4545 126160,139010 126161,175 126161,49857 126161,126161 126161,150910 126163,932 126164,72 126165,56 126165,94 126165,147 126165,192 126165,602 126165,1243 126165,2787 126165,240174 126166,298 126167,485 126169,557 126170,126171 126172,557 126173,8719 126174,138 126175,557 126176,865 126177,885 126177,13704 126178,137 126179,118 126179,4597 126180,1359 126181,88820 126182,118 126182,4597 126183,516 126184,126185 126186,222 126187,113156 126188,557 126189,1635 126190,178 126190,20757 126191,126192 126193,126192 126194,126195 126196,516 126197,4545 126198,557 126199,557 126200,30 126201,107 126203,22 126204,72 126205,2775 126206,447 126207,151 126208,1238 126209,126210 126211,30 126214,1515 126215,126216 126217,22 126218,30 126219,30 126220,1370 126221,1849 126222,422 126223,56 126224,118 126224,4597 126226,200 126227,483 126229,126230 126231,30 126232,1849 126233,392 126234,310 126235,1769 126236,126237 126238,126239 126241,602 126242,602 126243,126244 126245,126246 126247,126248 126249,17334 126250,126251 126252,126253 126254,233 126255,602 126256,422 126257,422 126258,422 126259,422 126260,355 126261,422 126262,422 126263,422 126264,422 126265,422 126266,422 126267,422 126268,422 126269,126270 126272,298 126273,485 126274,6556 126275,23783 126276,22 126277,30 126278,441 126279,392 126280,126281 126282,283 126282,657 126282,2266 126283,83 126284,481 126285,2574 126286,83 126287,1955 126288,79 126288,203 126288,333 126288,1181 126289,126290 126292,158 126292,406 126292,2995 126292,141912 126294,2931 126294,2991 126295,126296 126297,3612 126298,818 126299,48 126299,3695 126300,3585 126301,126302 126303,2367 126304,30 126305,30 126307,79 126308,841 126309,586 126309,920 126310,30 126311,1289 126312,392 126314,30 126315,292 126316,126317 126318,602 126319,30 126320,30 126321,907 126322,30 126323,602 126324,1285 126325,30 126326,55849 126327,640 126328,126329 126330,1359 126331,22 126332,827 126334,125479 126335,126336 126337,30 126338,126339 126340,422 126341,56 126342,30 126343,22 126344,483 126345,22 126346,309 126346,310 126347,1467 126348,126349 126351,273 126352,126353 126354,30 126355,126356 126357,126358 126359,147 126359,158 126359,206 126359,1425 126359,118336 126360,126361 126362,126363 126364,5405 126365,126366 126367,72 126368,147 126369,72 126371,310 126372,126373 126375,8270 126376,30 126377,104 126377,200 126377,1572 126378,68 126379,3297 126380,743 126380,8714 126381,30 126382,355 126383,126384 126385,126386 126387,22 126388,364 126389,1479 126391,390 126392,875 126393,107 126394,994 126395,22 126396,126397 126398,22 126400,349 126400,2274 126400,5540 126401,171 126402,30 126403,298 126404,485 126405,126406 126407,104 126408,298 126409,485 126410,149 126411,994 126412,1844 126413,126414 126415,126416 126418,30 126419,126420 126419,133777 126419,139243 126421,72 126422,344 126423,285 126424,126425 126427,126428 126430,30 126431,126432 126433,126434 126437,126438 126440,704 126441,233 126443,107 126445,2416 126445,2417 126446,292 126447,338 126448,298 126450,1133 126451,3538 126452,126453 126454,355 126455,346 126456,30 126457,126458 126460,171 126461,126462 126463,557 126464,72 126465,344 126466,285 126468,126469 126470,994 126471,171 126472,994 126473,481 126474,588 126474,590 126475,1231 126476,690 126477,22 126479,126480 126481,171 126482,126483 126484,126485 126486,126487 126488,1359 126489,126490 126489,225773 126491,126492 126493,1608 126494,859 126495,30 126496,126497 126498,126498 126499,3069 126500,44725 126501,408 126502,1323 126503,102 126504,1326 126505,9195 126507,440 126508,31977 126509,932 126510,30 126511,994 126512,115 126512,118 126513,302 126514,126515 126516,1983 126517,195 126517,417 126518,346 126519,435 126519,1033 126520,2506 126521,872 126522,872 126523,126524 126525,30 126526,30 126527,30 126528,126528 126529,126530 126531,30 126532,346 126534,346 126535,30 126536,30 126537,2105 126538,1807 126539,859 126540,4611 126541,22 126542,126543 126544,1983 126545,126546 126549,22 126550,22 126551,346 126552,22 126553,126554 126555,1118 126556,126557 126558,171 126559,126560 126561,171 126562,1773 126565,83 126566,346 126567,346 126569,346 126571,22 126572,103860 126573,273 126574,483 126576,126577 126579,171 126581,22 126582,19010 126583,991 126584,273 126585,557 126586,557 126587,557 126588,557 126589,818 126590,83 126594,83 126596,126597 126599,602 126600,6506 126601,344 126602,126603 126605,30 126607,2224 126608,1252 126608,1253 126609,3769 126610,2574 126611,358 126612,171 126613,192 126613,202 126613,203 126613,602 126613,663 126613,1623 126614,1858 126615,1860 126616,30 126617,1135 126618,22 126618,2421 126619,690 126620,186 126620,2646 126620,2979 126621,126622 126621,132924 126621,133731 126621,140246 126621,143120 126621,148913 126623,126624 126625,30 126626,126627 126629,30 126630,30 126631,30 126632,30 126633,240 126634,126635 126636,126635 126637,30 126638,126639 126640,137 126641,557 126643,219 126644,1010 126646,422 126647,56 126648,4545 126648,139010 126649,292 126650,30 126651,126652 126653,1238 126654,294 126655,296 126657,298 126658,1452 126659,126659 126660,406 126661,22 126662,388 126663,872 126664,233 126665,571 126665,1556 126665,162599 126666,206 126667,579 126668,333 126669,30 126670,1359 126671,146 126672,2379 126676,83 126677,83 126678,579 126680,118 126680,4597 126683,83 126684,355 126686,736 126687,30 126688,1893 126689,3413 126690,2567 126691,571 126692,171 126693,171 126695,171 126696,315 126696,346 126696,571 126696,934 126696,1033 126696,1294 126697,3724 126699,30 126700,579 126701,79 126702,171 126703,163 126704,2574 126705,120 126705,389 126706,392 126706,1465 126707,4611 126708,1544 126709,2775 126710,447 126711,298 126712,485 126713,298 126714,485 126716,30 126717,1776 126717,118336 126718,298 126719,485 126720,809 126721,304 126722,55849 126723,640 126724,595 126724,703 126724,1151 126724,1453 126724,1722 126724,3258 126725,640 126726,640 126728,450 126729,298 126730,485 126732,217 126733,422 126734,56 126735,577 126735,919 126736,356 126737,972 126738,640 126739,422 126740,175 126741,657 126742,422 126743,422 126744,422 126745,422 126746,422 126747,422 126748,422 126749,422 126750,6303 126751,422 126753,647 126754,344 126755,422 126756,422 126757,872 126758,1858 126759,1860 126761,32 126762,450 126763,83 126764,158 126764,309 126764,310 126764,1001 126764,2646 126765,48 126765,1619 126766,481 126768,1467 126770,596 126771,3623 126773,589 126774,126775 126774,128241 126774,128836 126776,126777 126778,76096 126779,83 126780,433 126781,287 126781,809 126781,19010 126782,1544 126783,4611 126784,1326 126784,3555 126785,71 126786,79 126787,1167 126787,1616 126787,2979 126788,5130 126789,4545 126790,1556 126791,994 126792,48 126793,1432 126795,94 126795,2787 126796,22 126797,14434 126798,273 126799,4611 126800,1544 126801,22 126802,207 126803,178 126805,3623 126806,240 126806,17309 126807,1298 126808,852 126808,1298 126809,1858 126810,1860 126812,818 126812,1085 126813,1805 126814,577 126814,3207 126816,1579 126817,366 126817,1392 126818,3207 126819,7194 126821,4895 126822,5547 126823,1436 126824,126825 126826,3623 126827,433 126828,175 126829,126830 126831,1238 126831,3474 126832,298 126833,4611 126834,1544 126835,126836 126837,1127 126839,3623 126841,192 126841,657 126841,1531 126841,191355 126842,22 126843,873 126843,874 126844,577 126845,652 126846,126847 126848,22 126849,4545 126850,102560 126851,77 126852,772 126853,2367 126855,626 126855,126918 126856,620 126858,68467 126861,809 126862,1082 126863,259 126863,1143 126864,452 126865,30331 126867,3623 126872,433 126873,609 126873,2775 126873,3623 126873,48505 126874,920 126875,1082 126877,1082 126878,30 126879,126880 126881,589 126881,3623 126881,178576 126881,185877 126882,1082 126883,872 126884,1776 126885,422 126886,56 126887,298 126888,485 126889,171 126890,22 126891,408 126892,1323 126893,102 126894,1326 126895,298 126896,485 126897,171 126899,500 126902,1132 126903,781 126904,647 126905,146 126906,344 126907,1082 126908,356 126908,788 126909,693 126910,171 126911,146 126912,647 126913,344 126914,5405 126914,189303 126915,22 126916,10 126917,1181 126919,158 126920,63 126920,104 126920,200 126920,289 126920,290 126920,406 126920,818 126920,1177 126920,1749 126920,2605 126920,6955 126920,94134 126921,302 126922,298 126923,485 126924,772 126927,2006 126928,171 126929,347 126931,126932 126933,602 126934,126935 126937,171 126938,563 126939,1837 126940,83 126941,726 126942,175 126942,5591 126943,171 126944,483 126945,809 126946,217 126947,22 126948,422 126949,56 126950,126951 126952,1082 126952,1955 126953,222 126953,455 126954,450 126955,206 126956,1160 126957,30 126958,171 126959,126960 126961,30 126962,20063 126963,30 126965,126966 126967,126968 126969,718 126970,248 126971,104 126971,1417 126972,346 126973,46 126973,240 126973,631 126973,973 126973,1122 126973,1160 126973,1284 126973,1544 126973,1785 126973,1837 126973,2191 126973,3194 126973,3207 126973,3218 126973,5662 126973,5718 126973,20359 126974,171 126975,4355 126976,868 126977,358 126978,1466 126979,14989 126980,301 126980,467 126981,1359 126982,2205 126982,33424 126983,104 126984,575 126985,298 126986,485 126989,222 126992,1220 126992,1222 126993,252 126994,251 126995,1368 126996,2367 126997,175 126999,298 127000,211 127000,366 127002,146 127003,647 127004,344 127005,146 127006,647 127007,344 127008,52270 127009,127010 127009,132201 127011,222 127013,1531 127014,7092 127015,346 127016,775 127017,30 127018,392 127019,557 127020,1832 127022,217 127023,175 127024,298 127027,127028 127029,200 127029,372 127029,1962 127030,30 127031,255 127032,30 127033,146 127034,647 127035,344 127036,30 127037,55849 127038,192 127039,30 127040,30 127041,298 127042,485 127043,1860 127044,1707 127045,55849 127046,192 127046,333 127047,30 127048,83 127049,107 127050,58 127050,107 127050,647 127051,358 127052,107 127053,422 127054,22 127055,557 127056,557 127057,30 127058,579 127059,76096 127060,30 127061,258 127062,127063 127064,298 127065,485 127066,4611 127067,1151 127068,30 127069,30 127070,137 127071,10 127072,536 127072,852 127072,4672 127073,175 127074,298 127075,158 127077,30 127078,175 127079,298 127080,422 127081,56 127082,389 127082,1072 127083,953 127083,72439 127084,255 127085,255 127086,349 127087,22 127088,22 127089,30 127090,6027 127092,1509 127093,577 127094,1085 127095,1467 127095,1871 127095,2421 127095,5906 127096,30 127097,2775 127098,447 127099,602 127100,442 127100,818 127101,22 127102,18831 127103,211 127104,14366 127104,14483 127105,289 127105,290 127105,94134 127106,22 127107,240 127108,22 127109,1016 127109,4237 127110,2931 127111,83 127112,1458 127113,772 127114,602 127115,207 127116,1085 127117,330 127118,657 127119,294 127120,113474 127121,267 127122,171 127124,843 127125,127126 127127,1571 127128,636 127129,127130 127131,5366 127132,1607 127132,19010 127133,127134 127135,233 127136,2353 127137,389 127138,22 127139,6303 127140,48505 127141,298 127142,485 127143,333 127144,119 127145,1707 127146,355 127147,868 127148,657 127148,2266 127148,2646 127148,6424 127149,743 127150,207 127151,1707 127152,972 127153,1707 127154,1983 127154,48505 127156,68069 127157,5405 127158,34 127158,35 127158,50 127158,68 127158,83 127158,126 127158,149 127158,158 127158,167 127158,186 127158,192 127158,195 127158,202 127158,217 127158,240 127158,261 127158,278 127158,283 127158,287 127158,289 127158,290 127158,294 127158,298 127158,299 127158,301 127158,332 127158,333 127158,349 127158,372 127158,389 127158,392 127158,397 127158,406 127158,417 127158,433 127158,439 127158,455 127158,505 127158,510 127158,516 127158,536 127158,577 127158,586 127158,588 127158,590 127158,592 127158,622 127158,623 127158,631 127158,693 127158,694 127158,697 127158,714 127158,752 127158,779 127158,809 127158,818 127158,861 127158,872 127158,907 127158,918 127158,949 127158,951 127158,968 127158,973 127158,1001 127158,1010 127158,1019 127158,1023 127158,1045 127158,1058 127158,1085 127158,1146 127158,1151 127158,1210 127158,1240 127158,1241 127158,1284 127158,1285 127158,1309 127158,1370 127158,1453 127158,1462 127158,1465 127158,1466 127158,1467 127158,1498 127158,1515 127158,1518 127158,1522 127158,1531 127158,1564 127158,1566 127158,1580 127158,1619 127158,1623 127158,1634 127158,1715 127158,1785 127158,1796 127158,1805 127158,1818 127158,1821 127158,1837 127158,1860 127158,1955 127158,1985 127158,1996 127158,2008 127158,2083 127158,2205 127158,2235 127158,2253 127158,2296 127158,2470 127158,2480 127158,2511 127158,2557 127158,2620 127158,2671 127158,2812 127158,2903 127158,2979 127158,2989 127158,2991 127158,3135 127158,4146 127158,4234 127158,4382 127158,4532 127158,5208 127158,5231 127158,5388 127158,6837 127158,8243 127158,8537 127158,9021 127158,9025 127158,9330 127158,13390 127158,13546 127158,13637 127158,15277 127158,15424 127158,15493 127158,15556 127158,16362 127158,16455 127158,17116 127158,17151 127158,17813 127158,19454 127158,21414 127158,21420 127158,21580 127158,21736 127158,22259 127158,22808 127158,23287 127158,24778 127158,25863 127158,26125 127158,26318 127158,26362 127158,26480 127158,28353 127158,28545 127158,28973 127158,29866 127158,31745 127158,32650 127158,33424 127158,35624 127158,36512 127158,39059 127158,39564 127158,39695 127158,41206 127158,44972 127158,45666 127158,46271 127158,50987 127158,51359 127158,51727 127158,52539 127158,53726 127158,54493 127158,59012 127158,59077 127158,59226 127158,59990 127158,63411 127158,66297 127158,72889 127158,74696 127158,75912 127158,76096 127158,86402 127158,86612 127158,94134 127158,94151 127158,98275 127158,102560 127158,103860 127158,110593 127158,112722 127158,112938 127158,113585 127158,114840 127158,116543 127158,118336 127158,121080 127158,127158 127158,138139 127158,138686 127158,139641 127158,141377 127158,142109 127158,144231 127158,144849 127158,146001 127158,147034 127158,147812 127158,148970 127158,152152 127158,160247 127158,160870 127158,162008 127158,165586 127158,168271 127158,169948 127158,171129 127158,171641 127158,171648 127158,174327 127158,176115 127158,176510 127158,176541 127158,177455 127158,178573 127158,178576 127158,179278 127158,179804 127158,180244 127158,180992 127158,181945 127158,182506 127158,187420 127158,187464 127158,187805 127158,187950 127158,187975 127158,187976 127158,187977 127158,188542 127158,188753 127158,189103 127158,189152 127158,190737 127158,190756 127158,191355 127158,191358 127158,193977 127158,194645 127158,194963 127158,195048 127158,207045 127158,207600 127158,214197 127158,217531 127158,218455 127158,221407 127158,223391 127158,225336 127158,228348 127158,228456 127158,231436 127158,233709 127158,236252 127158,245910 127158,250326 127158,256222 127158,256312 127158,257994 127158,262551 127159,647 127160,344 127161,1579 127161,4691 127163,146 127164,104 127165,1058 127166,805 127167,127168 127169,663 127170,118336 127172,4545 127172,56150 127172,139010 127173,75912 127174,22 127176,579 127177,422 127178,1564 127179,75912 127180,794 127180,8541 127181,920 127182,772 127183,58 127184,994 127185,46 127186,75912 127187,2083 127188,227 127188,2379 127189,602 127190,19010 127191,1118 127192,192 127193,1556 127194,422 127195,422 127196,422 127197,4 127197,5 127198,1608 127199,422 127200,422 127201,422 127202,422 127205,422 127206,779 127207,41 127208,479 127209,422 127210,147 127210,158 127211,22 127212,127213 127214,422 127216,75912 127218,75912 127219,481 127220,75912 127221,302 127221,433 127221,687 127221,861 127221,893 127221,1659 127221,4453 127222,63 127223,248 127223,1332 127225,83 127226,22 127227,167 127227,2083 127228,50 127228,1181 127229,605 127230,298 127231,485 127232,422 127233,1858 127234,1860 127235,743 127236,602 127237,217 127238,2367 127239,298 127240,485 127241,22 127242,1564 127243,146 127244,647 127245,344 127246,340 127247,485 127248,298 127249,2574 127250,1858 127251,1860 127252,72 127253,344 127254,285 127255,275 127256,127257 127258,344 127259,285 127260,72 127261,647 127262,146 127263,344 127264,17897 127265,146 127266,994 127267,818 127268,175 127269,298 127270,30331 127271,72 127272,5405 127273,30 127274,147 127275,602 127276,1983 127277,1118 127279,1707 127281,1707 127282,305 127284,1707 127285,1149 127287,338 127288,184 127289,1707 127291,1392 127292,1707 127293,937 127294,1973 127294,2310 127295,30 127296,3623 127297,779 127298,422 127299,694 127300,6119 127301,184 127302,217 127303,37 127304,22 127305,127306 127307,477 127308,1881 127309,30 127310,3467 127311,3328 127312,3467 127313,1707 127314,2209 127315,269 127316,500 127316,1381 127318,104 127319,79 127320,175 127321,298 127323,1119 127325,1436 127326,1888 127328,298 127329,485 127331,250 127331,1684 127334,435 127335,1454 127335,148742 127336,1556 127337,1707 127338,63 127338,251 127338,516 127339,200 127339,2995 127340,811 127342,408 127342,1326 127342,1707 127343,302 127343,433 127344,83 127345,636 127346,58 127347,994 127348,46 127349,58 127350,1 127351,147 127352,1181 127353,30 127354,79 127355,631 127356,200 127357,1707 127358,146 127359,647 127360,344 127361,408 127362,1323 127363,102 127364,1326 127365,907 127366,158 127367,83 127367,206 127367,2553 127368,58 127369,328 127370,843 127371,634 127372,192 127372,1688 127373,3623 127374,1509 127375,252 127376,22 127377,79 127379,72 127380,344 127381,285 127382,127383 127384,3623 127385,843 127387,1 127388,22 127389,72 127390,344 127391,285 127392,3148 127394,7323 127394,127395 127396,720 127397,557 127398,22 127399,22 127400,175 127401,298 127402,861 127405,79 127405,195 127406,3623 127407,30 127408,146 127409,647 127410,344 127411,140 127412,2671 127413,1359 127414,1285 127415,3623 127416,3623 127417,22 127418,1293 127418,1782 127419,1033 127420,314 127420,599 127423,328 127424,1285 127425,3623 127426,86 127426,538 127426,1133 127426,1241 127426,1313 127426,31206 127428,269 127430,1 127432,22 127433,467 127434,3467 127435,217 127436,1509 127437,1707 127438,111 127439,1881 127440,58 127440,801 127441,301 127442,328 127443,298 127444,485 127445,875 127446,30 127447,22 127448,184 127449,211 127449,269 127449,622 127449,1014 127450,127451 127452,200 127453,3260 127455,30 127456,3623 127457,450 127458,22 127459,151 127460,485 127461,1177 127462,602 127463,602 127464,602 127465,252 127466,192 127466,217 127466,439 127466,877 127466,1844 127466,5265 127467,22 127468,602 127469,2775 127470,5908 127471,872 127472,312 127472,5101 127473,30 127474,192 127474,1089 127475,30 127476,1019 127477,347 127478,3069 127479,346 127481,41 127482,171 127483,483 127485,602 127486,4549 127487,50 127487,146 127487,147 127487,158 127487,192 127487,195 127487,206 127487,333 127487,585 127487,640 127487,841 127487,1181 127488,140 127489,267 127492,30 127493,127494 127495,3623 127496,1858 127497,1860 127498,602 127499,1220 127499,1222 127500,1659 127501,79 127502,1860 127503,4 127503,5 127504,222 127504,657 127505,2205 127505,33424 127506,3623 127507,127508 127509,58 127510,127511 127512,171 127513,697 127515,784 127515,1381 127515,2373 127516,83 127517,784 127517,1345 127517,1381 127517,2373 127518,127519 127521,72 127522,127523 127524,127525 127526,557 127527,557 127528,30 127529,55849 127530,55849 127531,309 127531,310 127532,127533 127534,127535 127536,5405 127537,885 127537,13704 127538,58 127539,55849 127540,3967 127541,22 127542,1458 127543,1167 127544,22 127545,875 127546,5405 127547,22 127548,1608 127549,83 127550,2779 127551,2116 127553,602 127554,602 127555,192 127555,1243 127556,5405 127557,137 127558,137 127559,19413 127560,127561 127560,199950 127562,273 127563,602 127564,22 127565,5547 127567,875 127568,255 127569,22 127570,171 127571,127572 127573,22 127574,264 127575,1381 127576,450 127577,1007 127578,450 127579,1608 127580,602 127581,602 127582,602 127583,602 127584,30 127586,801 127587,1203 127588,2083 127589,310 127590,127591 127592,422 127593,56 127594,127595 127596,127597 127599,83 127600,310 127601,306 127601,307 127602,137 127602,2105 127603,127604 127605,932 127607,83 127610,2617 127611,127612 127613,127614 127616,83 127618,592 127619,127620 127621,34 127621,35 127623,1238 127624,171 127625,30 127626,1452 127627,10 127629,1707 127630,6303 127631,233 127632,1707 127633,491 127633,1143 127633,1363 127633,1453 127633,1653 127633,19519 127633,40360 127634,171 127635,30 127636,408 127639,104 127640,127641 127642,355 127643,22 127644,452 127644,457 127644,535 127644,676 127644,918 127644,1655 127645,518 127645,1010 127645,1452 127649,3370 127649,14453 127652,1877 127655,273 127656,222 127657,171 127658,1370 127659,22 127660,875 127661,79 127662,1544 127663,147 127664,118 127664,137 127664,252 127664,264 127664,589 127664,720 127664,749 127664,779 127664,872 127664,907 127664,1085 127664,1368 127664,1467 127664,1939 127664,2105 127664,4237 127664,4597 127664,6119 127664,182162 127665,1888 127666,22 127667,1882 127669,1556 127670,718 127671,273 127672,640 127673,640 127674,640 127675,640 127676,2719 127676,73938 127677,422 127678,1564 127679,422 127680,422 127681,422 127682,422 127683,422 127684,422 127685,422 127686,422 127687,422 127688,422 127689,702 127689,1608 127689,6424 127690,422 127691,1551 127692,315 127693,298 127694,485 127695,127696 127697,907 127698,344 127699,647 127700,146 127701,3623 127704,425 127707,22 127708,2574 127709,22 127710,75912 127713,481 127714,248 127715,1631 127716,22 127717,3623 127719,332 127719,27041 127720,287 127720,809 127720,19010 127721,163 127721,2116 127723,315 127724,932 127726,1014 127726,1434 127727,22 127728,83 127730,1659 127731,34 127731,35 127734,298 127735,485 127736,589 127739,4355 127741,1849 127741,6424 127743,6789 127744,127745 127746,127747 127751,127752 127755,22 127756,1732 127761,827 127762,1085 127762,1285 127763,127764 127763,138940 127765,22 127766,22 127767,22 127768,631 127769,422 127770,56 127771,240 127771,760 127771,84257 127772,22 127773,1623 127775,3623 127776,83 127776,18831 127777,22 127778,2017 127780,13538 127782,171 127784,406 127786,1556 127787,6955 127790,2590 127791,2073 127793,1509 127794,1118 127795,252 127795,1220 127795,1222 127797,631 127798,1564 127802,84257 127803,861 127804,557 127805,2411 127806,1983 127807,1849 127807,5301 127808,287 127808,809 127808,19010 127809,3246 127810,827 127812,127813 127815,602 127816,801 127817,22 127818,433 127819,2434 127820,22 127821,1556 127822,422 127823,56 127824,3623 127825,113156 127826,1603 127827,690 127830,3585 127831,557 127832,158 127833,1607 127835,1238 127836,111 127836,4771 127838,994 127839,22 127840,994 127841,809 127842,1181 127843,1082 127843,1085 127843,75912 127844,175 127845,298 127846,714 127848,408 127849,1323 127850,102 127851,1326 127853,358 127855,622 127855,1033 127856,1326 127857,408 127858,301 127858,968 127858,1167 127858,1300 127858,1522 127858,73570 127859,30 127860,843 127862,127863 127862,157214 127865,875 127866,1616 127867,127867 127868,72 127869,1177 127869,4548 127869,6263 127870,127871 127872,538 127872,1284 127873,328 127874,84257 127875,843 127877,1531 127878,127879 127880,22 127881,127882 127883,1849 127884,127885 127888,827 127889,994 127890,31073 127891,1556 127892,72 127893,332 127894,22 127896,994 127897,86 127899,22 127901,467 127902,22 127903,22 127904,1191 127905,22 127906,422 127907,1776 127908,54 127909,440 127911,994 127912,1381 127913,994 127914,859 127915,22 127916,175 127917,298 127918,455 127919,1298 127920,79 127920,192 127920,2674 127920,16153 127921,127922 127923,1140 127923,49057 127924,27041 127925,1085 127927,72 127928,48 127929,772 127930,994 127931,1881 127932,312 127932,510 127933,893 127934,5405 127935,467 127936,127937 127938,30 127938,99807 127939,1893 127940,77 127941,1858 127942,1860 127943,127944 127945,48 127946,996 127947,22 127948,127949 127951,366 127952,298 127953,485 127954,801 127954,5547 127955,272 127955,255911 127956,3623 127957,127958 127959,818 127959,2017 127960,127961 127962,583 127963,22 127964,127965 127966,483 127967,72 127968,422 127969,56 127970,206 127971,3623 127972,7124 127973,1608 127974,72 127975,149 127976,72 127977,415 127978,22 127979,127980 127981,1539 127983,687 127984,22 127985,392 127985,1240 127986,557 127987,59021 127988,602 127989,406 127990,4805 127991,919 127992,72 127993,346 127994,72 127996,55849 127997,3623 127998,127999 128000,907 128001,269 128001,4548 128001,142433 128001,143287 128002,379 128002,2784 128003,2460 128004,192 128005,337 128006,298 128007,485 128008,358 128011,22 128012,22 128013,358 128014,22 128015,557 128016,5906 128017,557 128018,626 128019,278 128020,137 128022,862 128023,557 128024,22 128025,55849 128026,22 128027,72 128028,72 128029,685 128030,72 128031,344 128032,285 128033,850 128034,72 128035,298 128036,485 128038,968 128039,72 128040,809 128041,1849 128041,5301 128041,20359 128042,431 128043,1531 128044,128045 128047,435 128048,298 128049,485 128050,1298 128051,30 128052,450 128053,843 128056,30 128058,433 128059,422 128060,56 128061,128062 128064,2775 128065,447 128066,128067 128068,298 128069,485 128070,2379 128071,3 128072,128073 128074,22 128075,30 128076,22 128077,22 128078,206 128079,333 128079,435 128079,440 128079,1033 128079,1531 128081,171 128082,217 128082,536 128083,602 128084,1749 128085,602 128086,128087 128088,44725 128089,2411 128091,128092 128091,139605 128093,862 128094,128095 128096,128097 128098,30 128100,35905 128101,304 128102,128103 128104,298 128105,485 128106,22 128107,128108 128109,233 128110,602 128111,452 128111,457 128111,535 128111,676 128111,918 128111,1655 128112,406 128113,255 128114,202 128115,22 128117,355 128118,104 128119,602 128120,1559 128121,1309 128122,875 128124,602 128125,72 128126,1181 128128,5547 128129,718 128131,209 128132,63 128133,187 128134,1033 128135,22 128136,151 128137,209 128138,328 128139,209 128140,640 128141,5101 128141,5102 128142,1509 128143,1715 128143,21442 128144,20 128144,63 128144,736 128144,1151 128144,1247 128144,1368 128144,1881 128145,726 128146,264 128146,1381 128147,1326 128148,83 128149,83 128151,83 128152,83 128153,146 128154,647 128155,344 128156,104 128157,424 128158,7092 128159,1285 128160,18831 128162,287 128162,809 128162,19010 128163,1285 128164,1608 128164,1801 128165,424 128167,358 128168,22 128169,481 128170,251 128171,68 128172,3695 128173,22 128175,94 128175,994 128175,2787 128176,704 128177,827 128177,142473 128178,298 128179,485 128180,171 128181,83 128182,22 128183,1984 128184,22 128185,34 128185,35 128186,422 128187,422 128188,22 128189,422 128190,422 128191,422 128192,422 128193,422 128194,422 128195,422 128196,422 128197,994 128198,22 128199,422 128200,128201 128202,22 128203,22 128204,22 128205,992 128207,22 128208,30 128209,3135 128210,146 128211,772 128212,772 128213,772 128214,772 128215,328 128217,968 128218,772 128219,1359 128220,772 128222,63 128222,252 128222,344 128222,602 128222,685 128222,841 128222,911 128222,1070 128222,1085 128222,1566 128222,2572 128224,1007 128225,22 128226,163 128226,1556 128227,171 128229,2205 128229,33424 128230,209 128231,571 128232,298 128233,485 128235,1608 128236,146 128237,647 128238,344 128242,596 128243,3 128246,772 128247,1789 128248,1556 128249,4810 128250,1612 128251,1551 128252,217 128253,1293 128254,493 128254,626 128255,1556 128256,22 128257,5547 128258,3623 128259,171 128260,20 128260,1368 128261,1509 128261,4571 128263,3623 128264,209 128265,298 128266,485 128267,298 128268,485 128270,392 128270,592 128270,1805 128271,158 128272,20813 128273,536 128274,4611 128275,1544 128276,73570 128277,712 128277,1113 128277,3218 128277,28130 128278,22 128279,22 128280,207 128280,326 128280,874 128280,5667 128280,13457 128280,17305 128281,175 128283,136 128283,137 128284,298 128285,128286 128287,1010 128287,1715 128288,1 128289,1282 128290,128291 128292,994 128295,30 128295,333 128295,622 128296,779 128297,26041 128298,22 128300,30 128301,209 128303,1566 128304,259 128305,298 128306,485 128307,22 128308,801 128309,3582 128311,298 128312,485 128314,338 128314,8149 128315,422 128316,56 128318,980 128319,733 128319,2424 128320,818 128321,313 128322,485 128323,298 128325,467 128325,872 128326,1860 128327,1858 128328,4 128328,5 128328,1243 128329,22 128330,344 128331,83 128332,1309 128333,22 128334,217 128335,4545 128335,139010 128336,697 128338,1776 128339,1509 128340,22 128341,5440 128344,147 128344,158 128345,1590 128346,41 128347,22 128348,1072 128349,1707 128350,171 128351,3623 128352,83 128353,2867 128353,2868 128354,30 128355,130 128356,1085 128357,403 128358,22 128359,22 128360,83 128362,22 128363,209 128364,2367 128365,248 128366,861 128367,22 128368,718 128369,718 128370,2421 128371,175 128372,5908 128373,298 128374,1381 128375,20771 128376,483 128377,920 128378,1388 128379,1381 128380,14483 128381,30 128382,1284 128383,1001 128384,128384 128385,124889 128386,285 128387,422 128388,56 128389,1773 128390,422 128391,56 128392,2480 128393,1858 128394,1860 128395,30 128396,563 128397,671 128398,999 128399,298 128400,485 128401,1531 128401,4545 128401,56150 128401,139010 128402,1962 128403,954 128403,10318 128404,72 128405,344 128406,285 128407,1707 128409,128410 128411,2590 128412,333 128412,337 128413,4771 128414,22 128415,113156 128416,22 128418,298 128419,485 128421,68 128422,420 128423,128424 128425,22 128426,467 128427,1556 128428,22 128429,128430 128431,264 128432,346 128433,1479 128434,3623 128435,1181 128436,393 128437,128438 128440,3623 128441,1181 128442,128443 128445,1458 128446,1143 128447,346 128448,217 128451,30 128452,72 128456,1282 128456,1882 128458,298 128459,485 128460,30 128461,874 128462,2567 128463,298 128464,485 128465,1381 128467,298 128468,485 128469,515 128470,22 128471,1522 128472,818 128473,949 128474,440 128475,1663 128476,128477 128478,450 128479,128477 128480,557 128481,557 128482,626 128483,557 128484,862 128485,557 128486,147 128487,2210 128487,4237 128488,355 128489,772 128490,128491 128492,128493 128494,128495 128497,58 128498,994 128499,46 128500,602 128501,885 128501,13704 128502,22 128503,1072 128504,200 128505,298 128506,485 128507,431 128509,1531 128510,128511 128512,356 128512,611 128513,22 128514,107 128515,171 128516,86 128516,167 128516,299 128516,676 128516,744 128516,2372 128517,22 128518,1072 128519,261 128520,255 128521,417 128522,72 128523,344 128524,285 128526,3623 128527,435 128529,310 128530,149 128532,22 128533,366 128534,366 128535,3623 128536,22 128537,2048 128538,130 128539,1007 128540,48 128541,171 128542,843 128544,1247 128546,128547 128548,310 128549,86 128550,128551 128552,450 128553,128554 128555,22 128556,422 128557,56 128558,1149 128559,15573 128560,714 128561,307 128561,8788 128563,579 128564,22 128565,128566 128567,151 128569,1 128570,128571 128572,406 128572,1181 128573,128574 128575,1181 128576,2421 128577,2590 128579,128580 128582,128583 128584,52 128584,140269 128584,206059 128585,171 128586,175 128587,128588 128590,207 128591,147 128591,158 128592,602 128593,2296 128594,515 128594,647 128594,1289 128597,147 128597,149 128598,128599 128600,128601 128602,872 128603,128604 128605,1429 128606,128607 128608,536 128609,668 128610,872 128611,298 128612,485 128613,30 128614,128615 128618,994 128619,128620 128621,128620 128622,850 128623,128624 128625,233 128626,128627 128628,128629 128630,83 128631,128632 128634,259 128635,718 128636,158 128636,292 128638,128639 128640,493 128642,389 128642,626 128643,2146 128644,22 128645,355 128646,1749 128647,22 128648,202 128648,203 128649,452 128650,1381 128651,255 128652,4611 128653,1544 128655,128656 128657,366 128658,146 128659,647 128660,344 128663,158 128664,424 128665,433 128667,240 128667,269 128668,422 128669,56 128670,640 128671,102560 128672,406 128673,163 128674,310 128675,2775 128676,447 128677,128678 128680,1400 128681,1608 128682,43203 128683,48 128684,146 128685,647 128686,344 128687,146 128688,647 128689,344 128690,657 128691,1332 128692,146 128693,647 128694,344 128695,422 128696,422 128697,422 128698,422 128699,422 128700,422 128701,1326 128702,422 128704,2045 128704,189834 128705,1140 128705,5547 128706,1359 128707,171 128709,1151 128709,1453 128710,22 128711,406 128712,872 128713,647 128714,344 128715,146 128716,992 128717,422 128718,222 128719,1326 128720,422 128721,146 128722,647 128723,344 128724,422 128725,422 128726,422 128727,1204 128728,107 128728,795 128728,1177 128728,1257 128728,1388 128728,1888 128728,2775 128728,3085 128729,1580 128729,103860 128730,422 128731,312 128732,481 128733,3 128733,136 128733,137 128733,217 128733,301 128733,388 128733,510 128733,615 128733,657 128733,973 128733,1010 128733,1210 128733,1231 128733,1241 128733,1284 128733,1298 128733,1544 128733,1801 128733,1837 128733,1844 128733,2045 128733,2266 128733,2372 128733,2557 128735,3 128735,372 128736,22 128737,1893 128737,49057 128738,873 128739,22 128740,994 128741,1608 128742,1284 128743,206 128744,1238 128745,250 128745,1684 128746,128747 128748,1749 128749,422 128750,56 128751,1608 128752,1285 128753,1118 128753,1663 128754,647 128755,146 128756,647 128757,344 128758,83 128759,1858 128760,1860 128763,175 128764,298 128766,298 128767,485 128768,422 128770,83 128770,217 128770,379 128770,1019 128770,1417 128771,22 128772,79 128773,83 128773,668 128774,994 128775,186 128776,22 128778,595 128778,1453 128779,1888 128780,13136 128781,5908 128783,809 128784,178 128784,467 128785,2779 128786,596 128788,536 128789,171 128790,788 128791,298 128792,485 128793,422 128794,56 128795,596 128796,22 128798,111 128799,175 128800,298 128802,1181 128803,140 128803,292 128803,515 128803,1659 128804,22 128805,843 128807,1010 128808,843 128809,818 128811,22 128812,22 128813,1368 128814,801 128816,298 128817,485 128818,994 128819,310 128820,4252 128821,22 128822,388 128822,973 128822,1298 128822,1326 128822,1849 128824,22 128826,22 128827,146 128828,647 128829,344 128830,697 128831,178 128831,346 128831,435 128831,447 128831,538 128831,671 128831,934 128831,1294 128831,1877 128832,146 128833,647 128834,344 128835,934 128837,298 128838,485 128839,146 128840,647 128841,344 128842,647 128843,344 128844,146 128845,392 128846,304 128847,273 128848,1983 128849,515 128850,1452 128851,1983 128852,37 128852,136 128852,557 128852,1368 128852,2006 128853,5547 128854,1858 128855,1860 128857,146 128858,647 128859,344 128860,450 128861,128862 128863,994 128864,304 128866,200 128867,985 128867,75912 128868,868 128870,240 128870,859 128870,972 128870,1326 128871,1425 128872,304 128872,349 128872,1326 128872,2460 128872,3003 128872,6059 128872,26041 128873,30 128875,298 128876,485 128877,932 128878,151 128879,994 128880,1644 128881,994 128882,3623 128883,30 128884,442 128885,22 128886,128887 128888,694 128890,920 128891,596 128892,128893 128894,3467 128895,862 128896,80266 128897,636 128897,1844 128898,128899 128900,128901 128902,663 128902,2205 128902,33424 128903,48 128904,422 128904,80266 128905,697 128907,918 128907,1454 128908,22 128909,577 128910,222 128911,22 128912,7652 128913,2048 128914,602 128915,611 128916,22 128918,192 128919,843 128920,1400 128921,30 128922,299 128922,1544 128922,2083 128922,2588 128922,3848 128922,128929 128922,128945 128922,128946 128922,131329 128922,134179 128922,134871 128922,135367 128922,143540 128923,48505 128924,934 128925,875 128926,843 128927,77 128928,35687 128929,1522 128929,128922 128930,302 128930,2116 128931,128932 128933,1436 128934,1284 128934,2750 128935,1070 128936,934 128938,346 128939,346 128940,22 128941,30 128942,1140 128942,3474 128942,5547 128944,873 128945,128922 128946,128922 128947,149 128948,301 128948,1466 128948,32751 128949,875 128951,356 128952,146 128953,647 128954,344 128955,30 128956,510 128956,2045 128957,30 128958,30 128959,835 128960,30 128961,22 128962,30 128963,3623 128964,30 128965,818 128966,333 128967,175 128968,298 128969,663 128969,809 128969,1381 128969,1414 128969,1639 128969,1805 128969,2889 128969,141912 128970,516 128971,55849 128972,596 128973,128974 128976,406 128977,1284 128978,314 128978,1001 128979,515 128980,298 128981,485 128982,994 128983,647 128984,146 128985,344 128987,128988 128989,313 128990,994 128991,510 128992,30 128993,30 128994,994 128995,30 128996,525 128996,843 128996,1849 128997,5547 128999,129000 129001,72 129002,3260 129003,129004 129005,151 129006,2048 129007,298 129008,485 129009,8332 129009,129010 129011,7652 129012,779 129013,55849 129014,72 129015,55849 129016,129017 129018,1858 129019,1860 129020,1858 129021,1860 129022,129023 129024,596 129025,55849 129026,1858 129027,1860 129028,31977 129029,55849 129031,298 129032,485 129033,76096 129034,1983 129035,19 129035,83 129035,949 129035,1010 129035,1881 129035,211889 129036,358 129036,626 129038,994 129040,1512 129040,5992 129042,994 129044,129045 129046,809 129047,422 129048,56 129049,3623 129050,30 129051,5911 129052,298 129053,485 129054,994 129055,158 129056,129057 129058,994 129059,994 129060,129061 129062,875 129063,3623 129064,994 129065,129066 129067,865 129068,129069 129070,332 129071,81 129071,215 129072,557 129073,3623 129074,158 129075,137 129076,88820 129077,129078 129079,55849 129080,8719 129081,118 129081,4597 129082,151 129083,557 129084,55849 129085,41 129085,332 129085,1608 129085,32751 129087,2353 129088,557 129089,557 129090,1381 129091,287 129091,809 129092,129093 129094,346 129095,138 129096,7 129097,7 129097,79 129098,31977 129100,227 129102,34 129102,35 129102,2646 129103,1559 129105,298 129106,485 129107,346 129108,129109 129110,22 129111,167 129111,301 129111,907 129112,22 129113,129114 129115,113156 129116,2083 129117,525 129118,577 129120,129121 129122,2367 129123,647 129124,129125 129127,516 129128,129129 129130,72 129131,344 129132,285 129134,171 129135,10 129136,240 129137,22 129138,129139 129140,129141 129142,298 129143,485 129145,1102 129146,129147 129148,171 129149,206 129150,298 129151,485 129153,1509 129154,393 129155,83 129156,346 129157,116 129157,994 129157,2087 129157,2590 129158,113156 129160,129161 129162,129161 129163,129164 129165,129166 129167,129168 129169,483 129170,129171 129172,129173 129174,1001 129175,30 129175,328 129177,862 129178,129179 129180,366 129181,366 129182,233 129183,129184 129185,636 129185,1319 129186,30 129187,129188 129189,30 129190,5547 129191,72 129192,72 129193,72 129194,1085 129195,158 129195,779 129195,1515 129196,2506 129197,113156 129198,298 129199,485 129200,355 129202,346 129203,192 129203,217 129203,285 129203,536 129203,779 129203,1454 129203,1515 129203,3193 129203,3999 129203,6119 129203,6638 129204,22 129205,129206 129207,1181 129208,129209 129210,273 129210,313 129210,1122 129211,1836 129217,52270 129219,481 129220,1309 129221,6068 129222,602 129224,22 129225,83 129226,22 129227,406 129228,200 129229,1983 129230,1531 129231,129232 129231,235021 129234,22 129235,22 129236,222 129237,22 129238,2506 129240,22 129241,1860 129242,30 129243,22 129244,129245 129248,129249 129250,4748 129251,30 129252,22 129253,129254 129255,215 129256,298 129257,485 129258,477 129259,30 129260,1531 129261,22 129262,129263 129264,240 129264,818 129265,22 129266,450 129267,22 129268,483 129269,1635 129270,22 129271,129272 129273,129274 129275,875 129277,450 129278,994 129279,994 129280,994 129282,30 129283,2210 129283,4237 129284,1454 129285,129286 129287,184 129288,920 129289,22 129291,129292 129293,129294 129295,298 129296,485 129297,275 129299,346 129300,129301 129302,129303 129304,22 129306,129307 129308,1882 129309,31977 129309,129310 129309,131141 129311,994 129312,483 129313,994 129315,422 129316,392 129316,433 129316,623 129319,4611 129320,743 129321,129322 129323,30 129324,30 129325,30 129326,422 129327,56 129328,129329 129330,1479 129331,22 129332,390 129333,129334 129337,346 129338,2574 129341,129342 129343,129344 129346,30 129347,129348 129350,129351 129352,298 129353,485 129354,31977 129355,30 129358,129359 129360,211 129361,22 129362,2116 129363,129364 129366,129367 129368,72 129370,58 129372,58 129373,422 129374,422 129375,422 129376,422 129377,422 129378,422 129379,422 129380,422 129381,171 129383,30 129384,129385 129384,198038 129386,129387 129388,129389 129391,129392 129391,153717 129393,127257 129395,129396 129397,129398 129399,129400 129401,52 129401,175 129401,140270 129401,212234 129402,1353 129404,346 129405,129406 129408,30 129409,129410 129411,129412 129413,129414 129413,154005 129416,129417 129418,129419 129420,10 129421,1572 129422,704 129425,129426 129427,129428 129429,129430 129431,602 129432,30 129434,129435 129436,129437 129438,129439 129438,173611 129440,129441 129442,129443 129444,233 129446,366 129447,366 129448,1381 129448,33424 129449,7124 129450,129451 129452,30 129453,107 129454,2416 129454,2417 129455,292 129456,338 129457,129458 129459,298 129461,1133 129462,3538 129463,355 129464,129464 129465,346 129466,30 129467,455 129470,129471 129472,298 129473,485 129474,129475 129476,83 129477,1284 129478,1631 129479,346 129480,818 129481,129482 129483,875 129484,81 129484,106 129484,1579 129484,2073 129484,6119 129484,251515 129487,22 129489,346 129491,22 129492,129493 129494,1566 129495,22 129496,1566 129497,22 129498,602 129499,1181 129500,1133 129501,298 129502,485 129503,129504 129505,1531 129505,4545 129505,56150 129506,450 129507,129508 129509,22 129510,129511 129512,206 129513,129514 129516,999 129517,1544 129519,79 129522,129523 129524,129525 129528,994 129530,22 129531,30 129532,994 129533,195 129534,134 129534,200 129534,772 129534,1282 129534,4941 129534,34321 129534,92289 129534,172810 129534,200694 129535,760 129536,1133 129536,2334 129537,302 129537,818 129538,123465 129540,129541 129542,129543 129544,379 129545,4611 129545,103860 129546,103860 129547,129548 129549,22 129550,22 129551,1284 129552,483 129553,1140 129554,129555 129556,586 129557,1962 129558,219 129559,875 129560,129561 129560,240344 129562,22 129563,694 129564,481 129565,129566 129567,129568 129569,72 129570,1635 129571,1326 129572,129573 129574,79 129575,129576 129577,129578 129579,1849 129580,3585 129581,557 129582,72 129583,557 129584,557 129585,22 129586,557 129587,718 129588,22 129589,1773 129590,298 129591,485 129592,146 129593,647 129594,344 129596,30 129597,129598 129599,433 129600,743 129601,1043 129602,875 129603,129604 129605,602 129606,602 129607,602 129608,134 129608,2421 129609,779 129610,129611 129612,217 129613,30 129614,97 129615,1773 129616,346 129618,2775 129619,447 129620,129621 129623,30 129624,30 129625,30 129626,515 129626,652 129627,129628 129629,72 129630,72 129631,129632 129633,129634 129635,129636 129637,72 129638,129639 129638,132350 129640,129641 129642,310 129643,129644 129645,2697 129646,3872 129647,222 129648,30 129650,147 129650,149 129651,310 129652,129653 129655,366 129657,366 129658,366 129659,516 129660,41 129660,784 129661,292 129662,294 129663,296 129664,298 129666,129667 129668,129669 129670,30 129672,275 129673,129674 129675,129676 129677,129678 129679,129680 129681,129682 129683,129684 129686,129687 129688,19005 129689,19005 129690,129691 129692,907 129692,972 129692,1117 129692,2191 129692,13474 129692,14077 129692,31383 129692,50607 129692,54083 129692,125505 129692,135910 129692,136382 129693,129694 129695,261 129697,1 129697,273 129698,1238 129699,129687 129700,1566 129701,1033 129702,872 129703,671 129704,147 129705,252 129706,1452 129707,184 129708,2646 129709,129710 129711,136 129712,129713 129714,83 129718,355 129722,1962 129724,875 129725,392 129726,994 129727,22 129728,994 129728,1227 129728,1252 129728,1253 129728,21944 129728,86416 129729,129730 129731,129732 129733,129734 129735,393 129735,980 129736,1452 129737,272 129737,1033 129738,129739 129741,994 129742,58 129743,46 129744,1052 129744,1368 129745,75912 129746,1616 129747,299 129748,422 129749,129750 129751,422 129752,422 129753,422 129754,422 129755,422 129756,500 129757,1132 129758,781 129759,312 129760,22 129764,818 129765,87 129765,1454 129766,994 129767,129768 129769,149 129769,163 129771,298 129772,485 129773,850 129774,626 129775,775 129776,1284 129778,1014 129779,209 129780,602 129781,602 129782,313 129783,994 129785,602 129786,79 129787,1326 129788,298 129789,485 129790,10 129790,119 129790,267 129790,309 129790,310 129790,657 129790,795 129790,1167 129790,1400 129790,1659 129790,1677 129790,2073 129790,2626 129790,2646 129790,3804 129791,222 129792,22 129793,22 129794,718 129796,920 129798,31934 129799,83 129801,3623 129802,340 129803,1132 129804,781 129805,760 129806,575 129807,3960 129808,129809 129809,3258 129810,801 129810,5547 129811,596 129812,6888 129813,200 129814,41 129815,736 129816,22 129817,809 129818,272 129819,1127 129820,273 129821,129822 129824,1052 129826,129827 129828,2867 129828,2868 129829,255 129830,255 129831,697 129832,1085 129832,3507 129833,980 129834,312 129836,516 129837,48 129838,762 129839,79 129840,48505 129841,65 129845,1893 129846,525 129847,3161 129848,146 129849,647 129850,344 129851,809 129854,68 129854,22071 129856,718 129856,1745 129857,129858 129860,994 129861,9743 129862,2867 129862,2868 129863,129864 129865,1465 129866,129867 129869,75912 129870,697 129871,298 129872,485 129873,7155 129874,298 129875,129876 129877,431 129878,697 129879,30 129880,240 129882,298 129883,485 129884,143 129886,493 129889,697 129890,392 129890,809 129890,1143 129891,30331 129892,4611 129893,1544 129894,1132 129895,781 129896,11 129897,83 129898,129899 129900,994 129901,422 129902,255 129903,192 129903,206 129903,577 129903,590 129903,1177 129903,1844 129903,2073 129903,2626 129903,4237 129903,8270 129903,182162 129904,302 129904,579 129905,433 129907,58 129909,433 129911,58 129912,994 129913,46 129914,818 129914,1014 129915,2620 129916,760 129918,801 129919,200 129920,4823 129921,302 129922,346 129925,163 129925,305 129925,447 129925,1132 129925,8501 129925,15573 129926,135 129926,149 129926,1515 129927,852 129929,68 129930,30 129931,1332 129932,3 129934,143 129935,129936 129937,994 129938,30 129939,129940 129941,349 129942,657 129942,1479 129942,1522 129943,129944 129945,1707 129946,30 129947,129948 129949,129948 129951,577 129952,30 129953,525 129956,30 129957,134 129958,129959 129960,30 129961,30 129962,602 129963,602 129964,68 129965,129966 129968,481 129969,1289 129970,149 129971,310 129972,818 129973,8788 129974,2045 129976,146 129977,647 129978,344 129979,957 129980,1181 129983,129984 129985,483 129986,22 129989,129990 129989,184774 129989,199648 129989,230676 129991,957 129992,957 129993,1807 129994,275 129995,222 129996,129997 129998,5547 129999,1888 130001,130002 130003,215 130004,255 130005,130006 130008,130009 130008,135741 130008,137878 130011,130011 130012,22 130013,1016 130013,2210 130013,4237 130014,579 130015,1177 130016,302 130017,130018 130017,164695 130020,258 130021,130022 130023,861 130024,30 130025,171 130026,1458 130027,1 130027,149 130027,1803 130027,21442 130029,957 130030,269 130032,30 130033,557 130034,79 130035,557 130036,704 130036,1707 130037,330 130038,30 130039,130040 130041,130042 130043,130044 130045,178 130045,586 130046,310 130047,760 130048,697 130049,697 130050,1773 130052,30 130053,9195 130054,1085 130056,130057 130058,15573 130059,1370 130060,585 130061,307 130061,45960 130062,209 130064,130065 130066,22 130067,875 130069,72 130070,151 130070,17772 130071,305 130072,1252 130072,1253 130073,298 130074,485 130075,130076 130077,305 130077,2146 130079,14472 130080,1298 130081,15 130082,957 130083,994 130084,346 130085,184 130086,346 130087,957 130088,30 130090,602 130091,298 130092,485 130093,640 130094,360 130095,1370 130095,1821 130096,302 130096,861 130096,893 130097,7416 130099,2083 130100,130101 130102,30 130103,292 130104,130105 130107,779 130108,130109 130110,588 130110,590 130111,333 130112,289 130112,290 130112,94134 130114,130115 130116,447 130117,130118 130119,832 130120,4597 130121,3538 130122,872 130123,1 130123,2787 130123,30331 130125,94 130125,795 130127,366 130128,366 130129,366 130130,366 130132,202 130132,203 130132,1181 130133,192 130133,333 130135,417 130136,175 130137,30 130138,55849 130139,130140 130141,233 130142,79 130142,1181 130143,211 130144,2460 130145,1707 130146,130147 130148,30 130150,1458 130151,1132 130152,781 130153,298 130154,485 130155,130156 130157,130158 130159,355 130160,2105 130161,130162 130164,49057 130165,211 130166,3094 130167,415 130167,1465 130168,1001 130169,736 130170,83 130171,130172 130173,130174 130175,48 130176,389 130177,130178 130179,7092 130180,586 130181,1571 130182,167 130182,301 130182,510 130182,2979 130184,557 130184,636 130185,859 130185,1127 130186,104 130187,1425 130188,130189 130190,130191 130192,30 130193,1849 130194,640 130195,417 130196,346 130198,1509 130199,1509 130200,1509 130201,980 130202,1509 130203,30 130204,808 130205,3623 130207,30 130208,1509 130209,313 130209,1224 130210,2205 130210,33424 130212,209 130213,9457 130214,422 130215,422 130216,422 130217,422 130218,422 130219,422 130220,422 130221,422 130222,30428 130223,22 130224,422 130225,30 130226,30 130227,1509 130228,873 130229,111142 130230,433 130231,980 130231,1509 130232,130233 130234,1509 130235,589 130236,130237 130238,1849 130238,2372 130239,1849 130239,32784 130240,1247 130241,1210 130242,66500 130243,200 130244,130245 130246,83 130249,1140 130250,1509 130250,4771 130251,422 130252,56 130253,392 130254,111142 130255,130256 130257,83 130258,1381 130259,151 130261,134 130262,30 130263,827 130264,868 130265,422 130266,56 130267,2480 130269,760 130270,718 130272,35687 130274,30 130275,120 130275,222 130275,278 130275,389 130275,455 130275,949 130275,1635 130275,1860 130275,2424 130275,2671 130275,6955 130275,37088 130276,2411 130277,875 130278,372 130279,717 130280,171 130281,130282 130283,994 130284,6323 130285,171 130286,1858 130287,1860 130288,217 130289,994 130290,1509 130291,994 130292,1556 130293,264 130293,697 130293,1551 130293,1769 130293,191860 130294,130295 130297,392 130297,1949 130298,994 130299,30 130301,2646 130302,999 130303,79 130304,868 130305,994 130306,994 130307,994 130308,17525 130309,146 130310,344 130311,647 130312,22 130313,406 130314,10 130315,843 130316,298 130317,485 130318,2460 130319,994 130320,337 130320,346 130320,671 130320,726 130320,934 130320,980 130320,1181 130320,1531 130321,623 130322,58 130323,843 130324,1509 130325,255 130326,994 130327,294 130328,55849 130329,1 130331,2944 130332,1983 130333,5212 130334,994 130336,760 130338,1983 130339,1078 130340,147 130340,406 130340,663 130340,779 130340,1515 130341,1014 130343,130344 130345,298 130346,485 130347,392 130348,994 130349,79 130350,586 130351,346 130352,1326 130353,452 130354,1247 130355,184 130357,107 130357,200 130357,227 130357,240 130357,372 130357,442 130357,588 130357,590 130357,805 130357,1659 130358,130359 130360,1252 130360,1253 130361,1745 130362,3 130363,809 130363,861 130364,4 130364,5 130365,5265 130366,1001 130367,130368 130369,72 130370,344 130371,285 130372,1509 130373,406 130374,130375 130376,809 130377,1127 130378,206 130380,30 130381,147 130382,433 130383,1722 130384,515 130385,994 130386,278 130387,217 130388,130389 130390,83 130392,171 130393,994 130394,130395 130396,1722 130397,175 130398,298 130399,19413 130400,30 130401,130402 130403,862 130405,447 130406,2775 130407,315 130407,447 130407,671 130407,996 130407,1068 130407,1474 130407,1789 130408,481 130409,3623 130410,697 130411,1722 130412,130413 130414,30 130416,83 130417,408 130418,1323 130419,102 130420,1326 130421,123415 130422,3623 130424,636 130424,1332 130424,1572 130425,957 130426,130427 130428,202 130428,203 130429,957 130430,306 130430,307 130431,147 130431,2867 130431,2868 130432,1474 130433,30 130434,994 130435,1805 130436,30 130437,3623 130439,140 130441,30 130442,167 130442,567 130442,666 130442,783 130442,1284 130442,3193 130442,124668 130443,217 130445,3138 130446,868 130447,515 130448,22 130449,1556 130450,2671 130451,1608 130453,433 130454,1105 130455,1298 130455,1616 130456,151 130457,2995 130458,649 130459,3623 130460,302 130461,119 130462,875 130463,1285 130464,346 130465,1955 130465,2989 130465,2991 130466,557 130466,772 130467,1326 130468,151 130468,685 130468,2460 130469,1515 130470,86832 130471,1837 130471,1882 130471,5718 130472,30 130473,2784 130474,536 130475,149 130476,30 130477,206 130478,147 130479,30 130480,588 130480,590 130481,30 130482,483 130483,175 130484,298 130485,192 130485,620 130485,8244 130485,102560 130486,885 130486,13704 130487,872 130488,158 130489,557 130490,760 130492,30 130493,59021 130494,455 130494,1019 130495,202 130495,203 130496,1644 130498,697 130498,1240 130498,2620 130499,79 130501,417 130502,72 130503,358 130504,1274 130506,72 130507,328 130508,130509 130510,595 130511,10 130512,72 130513,107 130513,364 130514,313 130515,255 130516,557 130516,772 130517,44 130518,3623 130520,171 130522,113156 130523,602 130524,2205 130524,2334 130524,3207 130524,33424 130525,130526 130527,140 130528,267 130529,222 130529,2266 130530,602 130531,1467 130532,779 130533,130534 130536,477 130537,10 130538,264 130539,477 130540,893 130541,30 130542,602 130543,2116 130544,30 130545,30 130546,1285 130548,557 130549,557 130550,30 130552,1400 130552,2073 130553,289 130553,290 130553,94134 130554,525 130555,1849 130556,2209 130557,1309 130558,577 130559,704 130560,255 130561,852 130562,72 130563,631 130564,332 130564,3135 130565,294 130567,1888 130567,2775 130568,72 130569,536 130570,130571 130572,130573 130574,875 130575,30 130576,1238 130577,500 130578,1962 130579,1052 130580,1882 130581,2775 130582,54 130583,1220 130583,1222 130584,298 130585,485 130586,31934 130587,113156 130588,1449 130589,872 130590,31934 130591,7 130591,97 130592,192 130592,779 130593,1858 130594,1860 130595,1858 130596,1860 130597,30 130598,704 130599,393 130600,1467 130601,130602 130604,2434 130605,72 130606,72 130607,500 130608,1962 130609,1052 130610,1882 130611,2775 130612,54 130613,292 130615,301 130616,2590 130619,1381 130620,4146 130621,3041 130622,22 130623,72 130624,207 130625,30 130626,130627 130629,30 130630,298 130631,485 130632,130633 130634,479 130635,1238 130636,872 130637,1429 130638,1033 130639,130640 130642,171 130643,668 130644,59021 130645,130646 130647,79 130648,1 130649,130650 130651,13980 130652,22 130654,779 130655,2574 130656,9018 130657,693 130658,1467 130659,455 130660,130661 130662,2424 130663,130664 130665,130666 130668,1143 130669,13980 130670,31977 130671,1871 130672,130673 130674,240 130675,252 130676,130677 130678,83 130679,2421 130680,13980 130681,346 130682,77 130683,1773 130685,83 130685,97 130685,120 130685,140 130685,158 130685,305 130685,372 130685,387 130685,392 130685,439 130685,493 130685,497 130685,596 130685,628 130685,685 130685,690 130685,717 130685,718 130685,736 130685,809 130685,868 130685,919 130685,949 130685,1127 130685,1181 130685,1238 130685,1240 130685,1326 130685,1453 130685,1466 130685,1572 130685,1844 130685,1893 130685,2371 130685,3297 130685,4455 130685,5102 130685,26749 130685,30365 130685,37759 130685,68069 130685,72764 130685,88820 130685,130686 130685,130980 130685,131171 130685,132004 130685,132282 130685,139045 130685,139048 130685,161537 130685,161790 130685,162453 130687,957 130688,1467 130689,83 130690,393 130691,626 130691,217389 130691,218731 130691,228846 130692,233 130693,30 130694,130695 130696,388 130697,2424 130698,1238 130699,328 130701,366 130702,1452 130703,366 130704,366 130705,366 130706,366 130709,130710 130711,1454 130712,671 130713,130714 130715,1983 130716,1016 130716,2210 130716,4237 130718,1509 130720,355 130721,1871 130723,34 130723,35 130724,697 130725,2224 130726,7117 130728,30 130729,1118 130730,30 130731,104 130731,134 130732,222 130732,18831 130733,712 130734,467 130735,146 130735,92476 130736,809 130737,1402 130739,1860 130739,15179 130740,422 130741,422 130742,422 130743,422 130744,422 130745,422 130746,422 130747,422 130748,392 130749,3218 130750,422 130751,422 130752,3507 130754,615 130756,75912 130758,22 130759,130760 130762,850 130762,75912 130764,75912 130767,75912 130769,697 130770,22 130771,104 130771,736 130771,1458 130772,30 130772,328 130772,622 130772,1276 130773,515 130773,1007 130773,1147 130773,1289 130773,1509 130773,1551 130773,3041 130773,3999 130773,36819 130774,2989 130774,2991 130775,302 130777,1608 130778,58 130778,801 130778,1140 130778,1653 130778,2436 130780,433 130781,83 130782,147 130782,158 130783,2646 130783,4672 130783,18831 130784,1289 130784,1551 130787,130788 130790,818 130791,130792 130793,130792 130794,609 130795,217 130795,326 130795,349 130795,379 130795,388 130795,518 130795,595 130795,949 130795,1010 130795,1133 130795,1722 130795,1985 130795,2979 130795,3538 130796,130797 130798,299 130798,1319 130798,73570 130799,557 130800,1572 130801,3 130801,240 130801,372 130801,1001 130802,1105 130803,130804 130803,147809 130803,179117 130803,223084 130803,233461 130803,250477 130803,253851 130805,254 130806,167 130806,301 130806,328 130806,442 130806,455 130806,1012 130806,1370 130806,1465 130806,1522 130806,1801 130806,1949 130806,2006 130806,2083 130806,2334 130806,55849 130807,1732 130808,302 130808,861 130809,7092 130810,515 130811,50 130812,130813 130814,980 130815,192 130816,347 130816,1801 130817,685 130817,1436 130818,3623 130819,217 130820,200 130821,83 130822,994 130823,6119 130824,312 130825,577 130826,264 130827,994 130828,1607 130829,72 130831,7 130832,7 130833,7 130834,611 130835,957 130837,83 130838,406 130839,36985 130841,240 130842,1556 130843,417 130844,3194 130845,994 130846,1127 130847,1132 130848,781 130849,55849 130850,171 130851,392 130851,918 130852,217 130853,1160 130854,852 130854,941 130855,1284 130856,273 130859,30331 130860,175 130861,222 130863,298 130865,1188 130866,120 130866,694 130866,1419 130867,298 130868,485 130869,2620 130870,697 130871,577 130872,4611 130873,1544 130874,827 130875,3193 130876,130876 130877,83 130878,760 130879,147 130880,298 130881,485 130882,59021 130883,1458 130884,1326 130885,726 130886,30 130887,130888 130889,240 130889,301 130889,1818 130890,1332 130892,30 130893,571 130894,79 130894,1181 130895,3 130897,203 130897,7052 130897,130897 130897,131014 130897,133712 130897,138408 130898,818 130899,994 130900,626 130901,30 130904,592 130905,79 130906,433 130907,30 130908,10 130909,30 130910,1332 130911,843 130912,1332 130913,344 130914,1326 130915,827 130915,2367 130916,408 130917,1323 130918,102 130919,1326 130920,130921 130922,240 130922,467 130922,868 130923,1653 130925,640 130926,30 130927,660 130928,30 130929,22 130930,130931 130932,1016 130933,1 130934,907 130934,1122 130935,1313 130935,1479 130937,1634 130938,1572 130938,1623 130939,1388 130940,1392 130941,1479 130943,577 130944,1707 130945,130946 130947,130946 130949,301 130950,30 130952,30 130953,55849 130954,481 130955,30 130958,717 130959,130960 130961,55849 130962,55849 130963,104 130963,557 130963,953 130963,954 130963,1939 130964,83 130965,167 130965,1544 130966,1805 130967,79 130968,55849 130970,1983 130972,171 130973,215 130974,130975 130976,366 130978,1509 130979,31934 130981,5440 130983,1181 130983,240174 130985,1 130986,1298 130986,1436 130986,1785 130986,1818 130987,55849 130988,192 130989,1434 130990,217 130990,1417 130991,248 130992,1007 130993,103860 130994,720 130994,1326 130994,5662 130995,130996 130997,130998 130997,136842 130999,175 131000,1096 131001,483 131002,298 131003,34 131003,35 131005,1132 131006,781 131007,131008 131007,141339 131009,406 131010,1 131011,104 131011,605 131011,1564 131011,2210 131011,4237 131013,202 131014,130897 131015,1370 131015,2671 131016,957 131017,389 131018,957 131020,72 131021,344 131022,285 131023,131024 131025,206 131027,167 131027,1001 131027,1167 131027,1231 131027,2191 131027,3422 131028,5908 131029,957 131030,760 131032,957 131033,2334 131034,120 131035,1722 131036,10 131037,30 131039,251 131039,252 131039,516 131039,1220 131039,1222 131039,1512 131039,5992 131040,1707 131041,1033 131041,1590 131042,328 131044,406 131046,267 131047,131048 131047,138322 131047,139450 131047,184530 131049,120 131050,1370 131051,79 131052,885 131052,13704 131053,30 131054,273 131055,8854 131056,131057 131058,294 131058,805 131059,602 131060,59021 131061,59021 131062,2775 131063,447 131064,131065 131066,557 131067,5906 131068,557 131069,626 131070,278 131071,137 131072,862 131073,557 131074,131075 131076,219 131077,30 131078,30 131081,392 131081,644 131082,602 131083,1515 131084,30 131085,2048 131086,30 131087,131088 131089,131090 131091,131092 131093,346 131094,30 131095,30 131096,9457 131097,862 131098,435 131099,131100 131101,30 131102,2460 131103,280 131103,17245 131105,30 131107,818 131108,22 131109,30 131110,131111 131112,131111 131113,225 131114,1556 131115,30 131116,131117 131118,30 131119,1359 131120,30 131121,131122 131123,22 131124,30 131125,86 131126,292 131127,131128 131129,131130 131131,22 131132,1400 131132,2073 131133,980 131133,1096 131134,22 131135,957 131136,957 131137,255 131138,17228 131140,30 131142,30 131143,131144 131145,1 131146,346 131146,1033 131147,131148 131149,30 131150,30 131151,957 131152,131153 131154,3474 131155,131156 131157,10 131157,1773 131161,131162 131163,366 131164,366 131165,366 131166,602 131167,749 131168,171 131169,861 131172,131173 131174,131175 131177,280 131177,17245 131179,872 131180,255 131181,333 131182,131183 131184,315 131185,131186 131187,233 131189,422 131190,1132 131191,781 131192,68069 131193,602 131194,298 131195,485 131196,34 131196,35 131196,389 131196,13137 131197,5908 131198,30 131199,131200 131199,134719 131199,146955 131199,154958 131201,272 131202,1707 131203,406 131204,872 131205,217 131205,313 131205,536 131205,843 131207,68467 131208,171 131210,1191 131210,2253 131211,3392 131211,21442 131211,75912 131212,55849 131213,258 131214,103860 131215,355 131216,34 131216,35 131216,120 131216,134 131216,222 131216,225 131216,278 131216,283 131216,313 131216,389 131216,431 131216,455 131216,657 131216,694 131216,949 131216,1072 131216,1177 131216,1860 131216,2424 131216,6955 131216,7768 131216,13137 131216,19349 131216,182162 131218,104 131219,104 131220,104 131221,406 131222,862 131222,27041 131222,118815 131222,144079 131222,190204 131223,841 131224,34 131224,35 131224,120 131224,283 131224,455 131224,467 131224,657 131224,694 131224,949 131224,1019 131224,2424 131224,2646 131224,3115 131224,8180 131225,175 131227,298 131228,366 131228,500 131229,1881 131230,30 131231,422 131232,422 131233,422 131234,422 131235,422 131236,422 131237,422 131239,422 131240,422 131241,422 131242,676 131243,58 131244,994 131245,46 131247,2574 131248,663 131248,1370 131248,6119 131249,772 131251,859 131254,1590 131254,1644 131255,2775 131256,447 131257,211 131257,264 131258,56 131259,158 131260,83 131261,89035 131262,1608 131263,309 131263,310 131264,30 131265,215 131266,254 131266,424 131266,2315 131267,106 131268,313 131269,1267 131270,254 131271,83 131272,305 131273,1556 131275,83 131276,3367 131277,97 131277,192 131278,652 131280,736 131281,22 131282,1707 131283,340 131284,118336 131286,135 131287,131288 131287,139432 131289,192 131289,663 131290,240 131291,171 131292,801 131293,1240 131294,41 131295,440 131295,1033 131296,602 131296,620 131296,8244 131298,83 131299,83 131300,22 131301,392 131302,68069 131304,392 131305,1285 131306,907 131309,702 131310,103860 131311,22 131312,302 131313,83 131314,22 131315,83 131316,158 131317,994 131319,718 131320,175 131321,406 131322,298 131324,50 131324,79 131324,261 131324,333 131324,406 131324,585 131324,4192 131324,4193 131325,718 131326,1580 131328,195 131328,247 131328,298 131328,636 131328,1309 131328,4177 131329,128922 131330,694 131330,784 131331,30331 131332,79 131333,340 131334,1479 131336,392 131336,697 131336,1836 131336,15609 131336,214734 131337,868 131337,5101 131338,1983 131339,557 131340,433 131341,994 131342,1803 131343,195 131344,2209 131345,1634 131346,22 131347,66 131347,202 131347,240 131347,599 131347,911 131347,1188 131347,1796 131347,1844 131347,2073 131349,1509 131350,850 131351,439 131351,493 131353,1474 131355,1300 131357,131358 131359,379 131359,536 131359,949 131360,818 131361,25222 131362,48505 131363,313 131364,1284 131365,994 131366,15 131367,932 131368,83 131368,852 131369,424 131370,2373 131371,107 131371,298 131371,503 131371,588 131371,590 131371,631 131371,784 131371,805 131371,1119 131371,1149 131371,1326 131371,1392 131371,1635 131371,1801 131371,1818 131371,2205 131371,33424 131371,60576 131372,2312 131373,919 131374,503 131374,1392 131375,10 131376,3 131377,673 131378,30 131379,72 131380,718 131381,134 131382,30 131383,1801 131384,18831 131385,6661 131387,907 131389,852 131390,283 131391,1167 131392,30 131393,5591 131394,30 131395,30 131396,131397 131398,73570 131399,1284 131401,158 131402,30 131403,72 131404,30 131405,304 131406,994 131407,72 131408,192 131408,217 131408,439 131408,877 131408,1844 131408,5265 131409,467 131410,298 131411,340 131412,273 131413,30 131415,420 131416,392 131417,875 131418,313 131420,1240 131421,30 131422,10 131423,72 131424,285 131425,131426 131427,83 131428,175 131429,192 131429,1392 131429,30331 131431,146 131432,344 131433,647 131434,9004 131435,149 131436,515 131437,455 131438,3623 131439,875 131440,652 131441,30 131442,1608 131443,875 131444,30 131445,515 131446,30 131447,72 131448,344 131449,285 131450,4771 131451,217 131452,217 131452,1417 131453,30 131454,2146 131455,592 131456,83 131457,158 131457,252 131458,2266 131459,72 131460,30 131461,1556 131462,104 131463,158 131464,1515 131465,30 131466,131467 131466,131909 131466,132666 131466,141092 131466,206553 131466,216875 131466,225526 131466,226884 131468,1858 131469,1860 131471,72 131472,72 131473,72 131474,1235 131474,1335 131475,30 131476,3623 131477,72 131478,200 131479,557 131481,72 131482,131483 131484,349 131485,131486 131487,289 131487,290 131487,94134 131488,1181 131489,192 131489,663 131490,483 131491,994 131492,392 131493,72 131494,1309 131495,1509 131496,255 131497,54 131497,222 131497,278 131497,1019 131497,2424 131498,358 131499,1072 131500,131501 131502,30 131503,10 131503,102 131503,211 131504,37 131504,1370 131504,2782 131504,150022 131504,150037 131505,557 131506,557 131507,557 131508,131509 131508,132237 131510,500 131511,862 131512,171 131513,72 131514,3 131514,388 131514,510 131514,3182 131514,6638 131514,28107 131515,72 131516,346 131518,1608 131519,1556 131520,30 131521,222 131522,994 131523,55849 131525,30 131527,147 131528,147 131529,2116 131530,147 131531,1010 131534,346 131535,131536 131537,147 131537,195 131537,1515 131538,131539 131540,994 131541,10 131542,957 131543,131544 131545,358 131546,131547 131548,957 131549,379 131550,957 131551,175 131552,392 131553,298 131554,30 131555,563 131555,1070 131556,30 131557,3 131559,602 131560,30 131561,55849 131562,30 131563,30 131564,240 131565,779 131566,30 131568,585 131569,131570 131571,1458 131572,1033 131572,1590 131572,1789 131573,83 131574,131575 131576,805 131577,72 131579,131578 131580,131581 131582,1235 131582,1335 131583,481 131585,131586 131587,131588 131589,131588 131591,31977 131591,131592 131593,195 131594,310 131595,1429 131596,131597 131598,131599 131598,132925 131600,30 131601,668 131602,131603 131605,131606 131607,131606 131608,131609 131610,481 131611,481 131612,131613 131614,131615 131616,131617 131618,1019 131619,2617 131620,3413 131621,1143 131623,30 131624,233 131625,131626 131627,131628 131629,131630 131631,2260 131632,30 131633,1043 131634,131635 131636,131637 131638,83 131639,355 131640,1893 131641,668 131642,151 131646,392 131647,131648 131649,206 131650,30 131650,328 131650,435 131650,440 131650,622 131650,794 131650,1191 131650,4355 131651,1707 131652,222 131652,389 131652,972 131652,1010 131652,1298 131652,6506 131653,392 131653,697 131654,131655 131656,131657 131658,131657 131659,6119 131660,1238 131661,22 131662,1424 131662,5192 131663,1782 131664,1858 131665,1860 131666,1033 131667,131668 131670,602 131671,15 131672,147 131672,158 131672,1181 131673,1474 131675,1381 131676,30 131677,264 131678,72 131679,131680 131681,1046 131682,5250 131683,192 131684,30 131685,192 131686,422 131687,422 131688,422 131689,422 131690,340 131691,422 131692,422 131693,422 131694,422 131695,160 131696,422 131698,422 131699,422 131700,30 131701,2674 131702,2553 131703,79 131704,366 131705,131706 131707,131706 131708,30 131709,392 131710,30 131711,1858 131712,1860 131714,14366 131715,131716 131717,1368 131718,63 131718,134 131719,1452 131721,255 131723,563 131724,131725 131726,2116 131727,30 131728,994 131729,1962 131730,30 131730,200 131731,30 131732,422 131733,1544 131734,4611 131735,1858 131736,1860 131737,83 131738,131739 131740,872 131741,338 131742,160 131743,994 131744,795 131745,83 131746,309 131746,310 131746,483 131747,32 131748,222 131749,233 131750,264 131751,657 131752,304 131753,388 131753,48505 131754,682 131754,72439 131757,626 131758,994 131759,131760 131762,30 131763,30 131764,827 131764,849 131764,1132 131764,1844 131765,2557 131766,994 131767,994 131768,477 131769,422 131770,422 131771,31977 131771,131772 131771,132809 131773,252 131773,516 131773,1220 131773,1222 131774,455 131775,779 131776,131777 131779,65 131779,602 131779,795 131779,818 131779,868 131779,1849 131780,536 131781,107 131783,973 131783,1167 131783,1241 131783,127158 131786,206 131787,1512 131787,5992 131788,131789 131790,209 131791,571 131792,868 131793,131794 131793,139408 131793,152761 131795,131796 131797,264 131798,124668 131799,124668 131800,136 131801,124668 131803,124668 131805,124668 131807,209 131808,467 131808,868 131808,1345 131808,156379 131808,162599 131809,1122 131811,3623 131813,118336 131814,304 131814,392 131814,435 131814,538 131814,640 131814,794 131814,795 131814,861 131814,1559 131814,1590 131814,2334 131814,3474 131815,75912 131816,1707 131816,2553 131817,30 131818,2296 131819,1512 131819,5992 131820,209 131822,34 131822,35 131822,278 131822,349 131822,392 131822,433 131822,138686 131823,20 131824,2371 131825,252 131826,1512 131826,5992 131827,628 131827,1118 131827,1210 131827,1639 131827,2266 131827,8235 131828,1949 131828,13136 131828,171641 131829,131830 131831,1512 131831,5992 131832,1058 131833,1512 131833,5992 131834,406 131836,192 131836,285 131836,779 131836,1515 131836,6119 131836,6638 131837,2668 131838,131839 131840,349 131841,131842 131843,22 131844,1220 131844,1222 131845,1370 131845,1821 131846,79 131846,192 131847,55849 131848,55849 131849,55849 131850,55849 131851,2089 131851,2940 131852,481 131853,131853 131854,1326 131855,3623 131857,1515 131858,1370 131858,1821 131859,200 131863,622 131864,195 131865,3623 131866,55849 131868,131869 131870,131869 131871,167 131872,131873 131872,138294 131874,200 131875,2371 131876,292 131877,131878 131879,1151 131880,356 131880,1119 131881,563 131884,515 131885,3623 131886,1127 131887,55849 131888,124668 131889,301 131889,861 131889,1231 131889,2979 131889,3422 131890,248 131890,1844 131890,1860 131891,10 131892,137 131894,313 131895,1707 131898,136 131899,1860 131900,131901 131902,111 131902,217 131902,509 131902,536 131902,873 131902,1210 131902,4252 131903,422 131904,56 131905,158 131906,358 131907,192 131908,1323 131910,509 131910,510 131911,44 131912,1612 131913,147 131914,264 131915,175 131916,298 131917,1210 131919,248 131919,1631 131920,131921 131920,135315 131920,137952 131922,124668 131923,131924 131925,1579 131926,261 131926,1466 131927,694 131929,973 131930,131931 131932,1715 131932,4146 131933,30 131935,392 131937,1370 131938,1257 131940,131941 131942,131943 131945,3804 131946,131947 131948,131949 131950,131951 131950,137972 131950,141378 131952,104 131952,1368 131953,994 131954,131955 131954,132699 131954,133373 131956,30 131957,131958 131959,131958 131960,131961 131962,994 131963,485 131963,3447 131964,718 131966,131967 131966,141300 131968,18726 131970,151 131971,1722 131972,372 131972,205226 131973,1132 131974,781 131975,233 131976,920 131977,1181 131978,1001 131979,6323 131980,131981 131982,72 131983,392 131984,493 131985,392 131986,131987 131988,131987 131989,131987 131990,131991 131990,132664 131990,134868 131990,135355 131990,137988 131990,138611 131990,144584 131990,144735 131990,145209 131990,149807 131990,159395 131992,2116 131993,134 131993,248 131994,131995 131996,6303 131997,1458 131998,30 131999,406 131999,422 131999,620 131999,1181 132001,132002 132001,132003 132005,372 132005,760 132005,1149 132006,2626 132009,1556 132010,589 132011,83 132012,1298 132013,132014 132016,1116 132017,192 132018,132019 132020,132021 132022,132023 132024,132025 132027,132025 132028,309 132029,178 132030,132031 132032,132033 132034,809 132035,132036 132037,577 132038,22 132039,2296 132040,134 132041,4895 132042,1247 132043,994 132044,6726 132045,663 132045,4545 132045,6119 132045,139010 132046,132047 132048,406 132049,349 132050,557 132051,557 132052,8719 132053,138 132054,865 132055,557 132056,137 132057,88820 132058,118 132058,4597 132059,1608 132060,994 132061,557 132062,292 132062,389 132063,58 132064,147 132064,206 132065,132066 132067,225 132068,818 132069,132070 132071,132072 132073,132072 132074,132075 132076,2590 132077,1181 132078,30 132079,516 132080,770 132081,132082 132083,132084 132085,379 132085,385 132085,536 132085,634 132085,1274 132085,1618 132085,2253 132085,2784 132085,2944 132085,148742 132086,207 132087,2051 132088,8884 132089,872 132090,1429 132091,332 132092,1033 132093,132094 132095,668 132096,1085 132097,132098 132099,132098 132100,132101 132102,994 132103,422 132104,422 132105,422 132106,422 132107,422 132108,132109 132110,132111 132110,141389 132110,147663 132110,151600 132112,132113 132114,1509 132115,30 132116,132117 132116,140664 132116,234884 132116,235294 132118,132119 132120,1143 132121,72 132122,920 132123,422 132124,171 132125,132126 132125,179584 132127,132128 132127,134943 132127,139752 132129,3260 132130,132131 132132,132133 132134,422 132135,132136 132137,132136 132138,132136 132139,872 132140,483 132141,132142 132141,132227 132141,132710 132143,557 132144,422 132145,422 132146,843 132146,1849 132147,132148 132147,136741 132149,422 132150,422 132151,200 132152,358 132153,132154 132155,233 132156,132157 132158,366 132159,366 132160,1983 132162,132163 132164,132165 132167,132168 132169,132170 132171,2116 132172,355 132173,30 132174,132175 132176,83 132177,83 132179,132180 132181,132182 132183,663 132183,972 132183,973 132183,1010 132183,1297 132183,1298 132183,1749 132183,1991 132183,2625 132183,4359 132183,4696 132183,7936 132183,13771 132183,15330 132183,34140 132184,132185 132187,132188 132189,132190 132189,133159 132189,135789 132191,422 132192,132193 132194,310 132195,422 132196,422 132197,132198 132199,132200 132199,147075 132199,149768 132199,157266 132199,159153 132202,132203 132202,133835 132202,134799 132202,136817 132202,137970 132202,140591 132202,140696 132204,132205 132206,72 132207,132208 132207,135179 132207,135820 132209,132210 132211,83 132212,132213 132212,138939 132212,141380 132212,141499 132214,132215 132216,304 132216,483 132216,1085 132216,4222 132216,6068 132217,481 132218,500 132219,1267 132219,2989 132219,2991 132220,132221 132222,132223 132224,4771 132225,1631 132226,422 132228,30 132229,406 132230,132231 132232,107 132232,372 132233,422 132234,132235 132236,287 132236,657 132236,1210 132238,779 132239,3653 132239,245431 132240,714 132241,636 132242,1188 132243,3872 132244,104 132245,72 132246,372 132247,1462 132247,4276 132248,932 132249,2146 132250,132251 132252,356 132252,1247 132253,44 132254,477 132257,222 132258,422 132259,481 132260,132261 132260,171458 132262,132263 132264,120 132265,779 132266,3538 132267,326 132268,132269 132270,4060 132271,132272 132273,132274 132275,132276 132277,132278 132280,132281 132283,132284 132285,132286 132287,132288 132289,3474 132290,132291 132292,483 132293,104643 132294,310 132295,132296 132297,132298 132299,158 132299,252 132299,622 132299,1749 132300,132301 132300,149926 132302,1590 132303,932 132304,132305 132304,132617 132306,1634 132309,1858 132310,1860 132311,333 132311,588 132311,590 132313,192 132314,527 132315,217 132315,862 132315,872 132315,1118 132315,1181 132315,1796 132315,2266 132315,7194 132316,132317 132318,132319 132320,132319 132323,171 132324,167 132325,132326 132327,355 132328,509 132329,132330 132331,132332 132333,132334 132335,1033 132336,269 132337,422 132338,32751 132339,132340 132341,588 132341,590 132342,455 132342,2146 132342,132343 132342,155565 132342,177199 132342,177668 132342,185992 132344,422 132345,1479 132346,5101 132347,390 132348,298 132349,485 132351,30 132352,422 132353,132354 132355,132356 132357,132357 132358,72 132359,285 132360,344 132361,118 132361,333 132362,132363 132364,209 132365,132366 132367,132368 132369,298 132370,485 132371,132372 132373,132374 132375,132376 132375,132721 132377,255 132378,132379 132382,1243 132383,132384 132385,22 132386,132387 132388,22 132389,132390 132391,31934 132392,298 132393,485 132394,132395 132396,30 132397,422 132398,132399 132400,132401 132402,292 132403,200 132404,147 132405,132406 132407,22 132408,805 132409,310 132410,704 132411,462 132413,422 132414,132415 132416,422 132417,132418 132417,141110 132417,143448 132419,132420 132421,83 132423,1773 132424,233 132425,132426 132427,132428 132427,138848 132427,141731 132427,144658 132427,152591 132429,132430 132432,132433 132432,133989 132434,132435 132434,134106 132437,366 132438,366 132439,366 132440,366 132441,441 132441,626 132441,1653 132441,4771 132441,17068 132441,39355 132441,71165 132441,108728 132441,147073 132441,149287 132441,150644 132441,154331 132441,164885 132441,164902 132441,176219 132441,176400 132441,176429 132441,176753 132442,355 132443,366 132444,366 132445,366 132446,366 132447,132448 132449,1745 132449,132450 132449,132451 132452,1509 132453,83 132454,132455 132456,30331 132457,298 132458,485 132459,4611 132460,1544 132461,132462 132463,72 132464,72 132465,285 132466,285 132467,344 132468,344 132470,132471 132472,72 132473,344 132474,285 132475,132476 132478,16153 132479,422 132480,852 132481,298 132482,485 132483,132484 132483,169074 132485,422 132486,30 132487,132488 132489,132490 132491,132492 132491,132861 132493,132494 132495,640 132496,22 132497,132498 132499,1072 132500,132501 132502,132503 132504,132505 132506,132507 132509,137 132511,1564 132511,3194 132512,1415 132513,422 132514,132515 132516,132517 132518,422 132519,422 132520,72 132521,285 132522,344 132523,994 132524,422 132525,994 132526,422 132527,56 132528,132529 132530,932 132531,953 132532,132533 132534,422 132535,195 132536,714 132537,132538 132539,132540 132541,192 132542,118 132542,4597 132543,132544 132545,1116 132546,422 132547,422 132548,132549 132550,1983 132551,132552 132553,312 132554,333 132554,2782 132554,2931 132554,3872 132555,132556 132557,132558 132557,135041 132557,135084 132557,135634 132557,138605 132557,139213 132557,141508 132557,141585 132557,141619 132557,148146 132560,30 132562,602 132563,602 132564,137 132565,2506 132567,132568 132569,872 132570,872 132571,30 132573,72 132574,344 132575,285 132576,132577 132578,72 132579,344 132580,285 132581,298 132582,485 132583,481 132584,364 132585,132586 132587,1467 132589,132590 132591,30 132592,1773 132594,132595 132596,132597 132598,132599 132600,872 132601,994 132602,132603 132604,372 132604,1285 132604,2989 132604,2991 132605,171 132606,483 132607,873 132609,1515 132610,132611 132612,393 132613,22 132614,132615 132616,1837 132618,132619 132621,132622 132623,132624 132623,132700 132623,132942 132623,133195 132623,134839 132623,135604 132623,135688 132623,135768 132623,139269 132623,142671 132623,144410 132623,144521 132623,144540 132625,132626 132627,132628 132629,132630 132631,422 132632,132633 132632,133825 132634,994 132635,132636 132637,422 132638,477 132640,422 132641,240 132642,557 132643,557 132644,557 132645,557 132647,132648 132649,994 132650,132651 132650,143687 132650,144749 132652,132653 132654,137 132655,1509 132656,132657 132656,226258 132656,229090 132658,4611 132659,1544 132660,134 132660,417 132661,422 132662,999 132663,5310 132665,422 132667,422 132668,1247 132669,22 132670,289 132670,290 132670,718 132670,94134 132671,298 132672,485 132673,132674 132675,602 132676,602 132677,83 132678,298 132679,485 132680,298 132681,485 132682,132683 132682,137876 132682,139625 132684,132685 132686,1479 132687,515 132688,298 132689,485 132690,298 132691,485 132692,5662 132693,132694 132695,63 132695,171 132695,250 132695,1363 132695,1684 132696,132697 132698,10 132701,14434 132702,8332 132703,602 132704,393 132704,980 132704,1531 132705,132706 132707,132706 132708,602 132709,422 132711,289 132711,290 132711,94134 132712,22 132714,132715 132716,132717 132718,68 132720,200 132722,132723 132724,132725 132726,8270 132728,132729 132728,159523 132730,4545 132731,132732 132733,292 132734,132735 132736,294 132737,296 132738,298 132739,422 132740,422 132741,1414 132742,4039 132743,30 132744,132745 132746,422 132747,422 132748,132749 132750,30 132751,132752 132753,132754 132755,422 132756,233 132757,132758 132759,14989 132761,72 132762,422 132763,132763 132764,422 132765,83 132766,422 132769,302 132769,861 132770,79 132771,366 132772,366 132773,1238 132774,366 132775,366 132776,422 132777,366 132778,366 132779,298 132780,485 132781,366 132782,366 132783,422 132784,264 132785,422 132787,30 132788,2557 132789,72 132790,344 132791,285 132792,3207 132793,422 132794,422 132795,14989 132796,132797 132798,3069 132799,663 132801,1983 132802,647 132803,146 132804,344 132805,1452 132806,355 132807,132808 132811,422 132812,56 132813,1118 132814,649 132815,358 132816,875 132817,2411 132818,298 132819,485 132821,2353 132823,200 132823,372 132823,805 132824,146 132825,647 132826,344 132827,500 132828,1962 132829,1052 132830,1882 132831,2775 132832,54 132833,76096 132834,2411 132835,868 132836,255 132837,875 132838,10 132839,30 132840,1962 132841,500 132842,1052 132843,1882 132844,2775 132845,54 132846,1113 132847,477 132848,2931 132849,7652 132850,118 132850,4597 132851,146 132852,647 132853,344 132855,298 132856,485 132857,1465 132858,994 132859,1212 132862,422 132865,298 132866,485 132867,200 132868,34 132868,35 132868,222 132868,389 132868,455 132868,536 132868,657 132869,479 132871,298 132872,485 132873,1467 132874,209 132875,579 132876,873 132877,994 132879,1332 132880,104 132880,136 132880,275 132880,298 132880,379 132880,408 132880,626 132880,694 132880,736 132880,801 132880,859 132880,873 132880,934 132880,980 132880,1070 132880,1140 132880,1143 132880,1220 132880,1222 132880,1309 132880,1368 132880,1424 132880,1881 132880,2105 132880,2209 132880,2224 132880,2266 132880,2750 132880,3367 132880,3370 132880,3507 132880,7117 132880,9457 132880,14453 132880,193578 132881,422 132883,481 132884,104 132884,134 132884,135 132885,132886 132887,83 132888,333 132890,147 132891,347 132891,356 132893,1556 132894,1007 132895,1241 132896,588 132896,590 132896,8180 132897,132898 132899,192 132900,225 132901,809 132902,83 132903,192 132903,30331 132905,187 132906,1590 132907,422 132908,467 132909,136 132910,1707 132911,146 132912,647 132913,344 132914,132915 132916,994 132917,1210 132917,1801 132918,718 132919,994 132920,195 132921,134 132921,205627 132922,59931 132922,84257 132923,20 132923,30 132923,403 132923,602 132923,762 132923,794 132923,849 132923,1016 132923,1607 132923,1805 132923,142405 132926,652 132927,592 132928,332 132929,406 132932,146 132933,647 132934,344 132935,119 132935,75912 132936,875 132937,119 132939,422 132941,306 132941,307 132943,209 132944,132945 132946,408 132947,1323 132948,102 132949,1326 132950,631 132950,84257 132952,1 132952,149 132952,406 132953,1 132954,477 132955,30 132956,175 132957,298 132958,146 132959,647 132960,344 132961,1282 132963,30 132964,1515 132966,422 132968,422 132969,509 132970,422 132971,4252 132972,3111 132973,120 132974,30 132975,422 132976,422 132977,918 132978,22 132979,485 132980,298 132981,30 132982,422 132983,1634 132984,72 132985,344 132986,285 132987,932 132988,422 132989,875 132990,875 132991,22 132992,1326 132992,2353 132993,422 132994,44 132995,30 132996,7155 132997,1085 132998,264 132998,2779 132998,16687 132998,57354 132999,1983 133000,3585 133001,133002 133005,306 133005,307 133005,406 133005,620 133005,779 133005,1515 133005,8244 133006,422 133007,875 133008,1332 133009,422 133010,875 133011,22 133012,5034 133013,422 133014,294 133015,104 133015,557 133015,953 133015,954 133016,137 133017,422 133018,30 133019,309 133019,310 133019,483 133020,818 133022,133023 133024,536 133024,2784 133024,7698 133025,72 133026,344 133027,285 133028,22 133029,30 133030,389 133031,406 133032,422 133033,147 133035,422 133036,133037 133038,422 133039,579 133040,422 133041,22 133042,1127 133042,1893 133042,5547 133042,49057 133043,422 133044,217 133044,1085 133044,1417 133045,259 133046,1 133046,500 133047,309 133047,310 133048,1012 133049,1860 133050,133051 133052,422 133053,907 133054,1181 133055,483 133056,1860 133057,422 133058,30 133059,422 133060,56 133061,422 133062,358 133063,422 133064,422 133065,422 133066,422 133067,81 133068,422 133069,422 133070,422 133071,422 133072,1579 133072,2312 133072,2626 133073,592 133074,422 133075,222 133076,30 133077,388 133078,136 133079,133080 133081,4678 133082,146 133083,647 133084,344 133086,222 133087,827 133087,1033 133088,417 133089,422 133090,56 133091,518 133091,3260 133092,217 133093,433 133094,22 133095,312 133096,133097 133098,509 133100,83 133101,202 133102,178 133104,875 133105,134 133105,222 133105,283 133106,1984 133107,1425 133108,133109 133110,1127 133110,1551 133110,1893 133111,372 133111,631 133112,440 133112,538 133113,120 133114,251 133114,516 133115,133116 133117,22 133118,240 133118,818 133118,1240 133119,1127 133120,30 133121,63 133123,422 133124,22 133125,477 133126,175 133127,422 133128,422 133129,422 133130,422 133131,422 133132,15748 133133,79 133134,10 133135,364 133136,1425 133137,1133 133138,1749 133138,3585 133139,32 133139,392 133139,644 133139,697 133139,3003 133140,22 133141,103860 133142,217 133144,133145 133144,134190 133144,139005 133144,140942 133144,141123 133144,141209 133144,189235 133146,22 133147,649 133148,422 133149,133150 133151,1212 133153,301 133154,1247 133155,1381 133156,422 133157,133158 133157,151641 133157,202100 133157,222966 133157,226224 133157,229424 133157,234537 133157,241459 133157,250462 133160,1052 133160,2626 133161,333 133162,136 133163,7 133163,3846 133164,346 133165,133166 133167,509 133167,510 133167,1332 133168,10 133169,133170 133172,10 133174,406 133175,422 133176,133177 133178,1531 133179,22 133180,133181 133182,422 133183,192 133183,602 133183,663 133183,5726 133184,422 133185,56 133186,957 133187,957 133188,1454 133188,21982 133189,133190 133189,142704 133189,173172 133189,184712 133192,957 133193,957 133194,577 133196,392 133197,171 133198,158 133199,1531 133200,133201 133200,136684 133200,181310 133200,184163 133202,392 133203,852 133203,1722 133203,21982 133204,264 133205,133206 133207,133208 133209,557 133210,557 133211,344 133212,72 133213,285 133214,133215 133216,22 133217,640 133218,240 133219,422 133220,762 133221,718 133222,1 133223,602 133224,255 133225,72 133226,344 133227,285 133230,2590 133235,422 133236,5101 133237,872 133239,298 133240,485 133241,133242 133243,298 133244,485 133245,2353 133246,1359 133247,671 133249,133249 133250,5101 133251,149 133252,994 133253,79 133254,72 133255,344 133256,285 133257,151 133258,206 133259,885 133259,13704 133260,298 133261,485 133262,422 133263,3623 133264,994 133265,133266 133267,525 133268,209 133269,1309 133270,1116 133271,422 133272,631 133273,422 133274,294 133275,422 133276,133277 133278,422 133279,1368 133279,1639 133280,30 133281,10 133282,422 133283,83 133284,891 133285,875 133286,133287 133288,760 133288,943 133288,1149 133289,252 133290,1177 133291,640 133293,264 133294,202 133295,620 133295,8244 133296,1007 133297,37 133298,133299 133300,175 133301,298 133302,1556 133303,133304 133305,30 133306,192 133307,1381 133308,422 133309,372 133309,390 133309,1085 133311,3258 133312,3246 133314,862 133314,1085 133314,2590 133315,481 133316,134 133317,222 133318,602 133319,302 133320,133321 133322,422 133323,422 133325,133326 133325,133425 133327,163 133327,868 133327,21442 133328,133329 133330,298 133331,1663 133331,6824 133332,673 133333,422 133334,422 133335,422 133336,422 133337,422 133338,422 133339,133340 133341,422 133342,422 133343,422 133344,422 133345,1983 133346,233 133347,1425 133348,346 133349,302 133349,861 133349,893 133349,1556 133350,602 133351,422 133352,30 133353,1276 133354,3258 133355,346 133356,406 133357,346 133359,58 133360,994 133361,46 133362,366 133363,366 133364,868 133364,1085 133366,83 133367,346 133368,104 133368,1118 133369,355 133370,58 133371,994 133372,46 133374,1392 133375,433 133376,868 133377,22 133378,1326 133379,868 133380,1722 133381,392 133382,298 133383,485 133385,30 133387,577 133388,364 133389,364 133390,19443 133391,994 133392,72 133393,118336 133394,364 133396,452 133397,1247 133398,184 133399,1001 133400,346 133401,422 133402,577 133403,994 133404,843 133405,743 133406,133407 133408,805 133409,298 133410,485 133411,985 133412,298 133413,485 133414,287 133415,422 133416,22 133417,269 133417,346 133417,1052 133417,1085 133418,447 133419,240 133419,784 133419,805 133419,943 133419,1359 133419,2205 133419,33424 133420,422 133421,2574 133422,1204 133423,22 133424,22 133426,805 133427,1858 133428,1860 133429,994 133430,1860 133431,1858 133432,843 133433,392 133433,467 133434,932 133434,996 133434,1010 133435,25348 133435,101688 133436,422 133437,3321 133438,133439 133441,298 133442,485 133444,2574 133445,483 133446,298 133447,485 133448,1776 133449,298 133450,485 133451,68069 133453,301 133454,195 133455,2775 133456,447 133457,104 133458,1432 133458,133527 133459,634 133461,417 133462,435 133462,440 133463,1955 133464,1566 133465,422 133466,868 133467,58 133468,994 133469,46 133470,422 133471,2480 133472,874 133473,2989 133473,2991 133474,264 133474,1151 133475,422 133476,1722 133477,422 133478,287 133479,726 133480,392 133482,422 133483,37 133483,1740 133486,2168 133487,55849 133488,34 133488,35 133488,18831 133489,8072 133490,994 133491,298 133492,485 133493,4545 133494,2775 133495,447 133496,422 133497,56 133498,657 133498,5326 133499,868 133500,872 133501,538 133502,298 133503,485 133504,83 133505,422 133506,83 133507,422 133508,422 133509,133510 133511,195 133512,422 133513,994 133514,422 133515,147 133515,192 133515,406 133515,1181 133516,175 133517,298 133518,298 133519,485 133520,42 133521,994 133522,516 133523,63 133524,133525 133526,63 133528,422 133529,994 133530,298 133531,485 133533,994 133534,72 133535,1608 133537,34 133537,35 133538,200 133538,1462 133538,8537 133540,15 133540,2260 133541,850 133541,1453 133542,326 133544,175 133545,167 133545,762 133545,783 133545,1241 133546,104 133547,298 133548,467 133549,1370 133550,278 133551,298 133552,485 133553,59 133553,79 133553,138 133553,3794 133555,693 133557,717 133557,1782 133558,192 133559,133560 133562,408 133563,1323 133564,102 133565,1326 133566,388 133566,518 133566,6638 133567,2989 133567,2991 133568,422 133569,56 133570,2701 133571,133572 133573,160 133574,994 133575,209 133575,302 133575,571 133575,893 133575,1849 133577,481 133578,422 133579,72 133580,1417 133580,1796 133581,305 133583,118 133583,4597 133586,805 133588,175 133589,2371 133590,720 133591,206 133592,298 133594,292 133595,130 133596,1608 133597,3769 133598,30 133599,852 133600,133601 133603,30 133604,133605 133606,301 133606,592 133606,919 133606,1955 133606,2557 133607,133608 133609,30 133610,107 133611,83 133612,1359 133613,2416 133613,2417 133614,292 133615,338 133616,298 133617,852 133618,422 133619,1368 133620,1133 133621,30 133622,3538 133623,1326 133625,1210 133626,406 133627,111142 133630,1 133631,1452 133632,422 133633,58 133634,994 133635,46 133636,4895 133637,422 133638,515 133640,1359 133641,422 133642,83 133643,408 133644,1801 133645,30 133646,422 133647,1001 133647,3094 133648,805 133649,4748 133650,1858 133651,1860 133652,1282 133653,422 133654,72 133655,344 133656,285 133657,30 133658,30 133659,3623 133660,422 133661,30 133662,422 133663,30 133664,3623 133665,852 133666,200 133666,2443 133667,301 133668,1001 133669,4193 133670,843 133671,779 133673,577 133674,77 133675,292 133676,175 133677,422 133678,56 133679,422 133680,2460 133681,298 133682,485 133683,298 133684,422 133685,56 133686,133687 133688,640 133689,34 133689,35 133689,13980 133690,1127 133690,6837 133691,422 133692,602 133693,422 133694,422 133695,422 133696,422 133697,422 133698,422 133699,422 133701,422 133702,1016 133702,2210 133702,4237 133703,422 133704,30 133705,136 133706,147 133706,158 133707,1220 133707,1222 133708,133709 133710,133709 133711,920 133712,130897 133715,217 133715,283 133715,388 133715,392 133715,862 133715,949 133715,1240 133715,1454 133715,1465 133715,1564 133715,2274 133715,4637 133715,8180 133716,422 133717,422 133718,3623 133719,133720 133721,422 133722,34 133722,536 133723,24505 133724,133725 133726,422 133727,442 133728,195 133729,2371 133730,455 133732,818 133733,602 133734,393 133735,406 133736,422 133737,422 133738,133739 133740,422 133741,355 133742,422 133743,422 133744,861 133746,422 133747,920 133748,422 133749,422 133750,422 133751,422 133752,422 133753,175 133754,298 133755,483 133756,668 133757,422 133758,1858 133759,1860 133760,515 133761,994 133762,422 133763,2867 133763,2868 133765,278 133766,13980 133767,850 133768,3 133768,240 133768,590 133769,140 133770,435 133771,3623 133772,736 133772,1370 133773,3252 133774,18831 133775,298 133776,485 133778,158 133779,3252 133780,1556 133781,557 133782,267 133783,140 133784,752 133785,783 133786,920 133787,843 133788,1572 133789,79 133790,133791 133792,1707 133793,195 133794,557 133795,557 133796,298 133797,485 133798,422 133799,493 133799,586 133799,1265 133799,1266 133799,1370 133800,217 133801,2797 133802,56 133803,422 133804,536 133805,302 133806,240 133807,2224 133808,133809 133810,313 133811,55849 133812,41 133813,133814 133815,2989 133815,2991 133816,393 133817,712 133818,171 133819,79 133820,1368 133821,934 133822,435 133823,41 133824,269 133826,2574 133827,1551 133829,34 133829,35 133830,2646 133832,1085 133833,104 133836,10 133836,2574 133837,447 133838,2775 133839,602 133840,171 133841,133842 133843,1805 133844,4805 133845,2775 133846,447 133847,2744 133848,289 133848,290 133848,2868 133848,94134 133849,133850 133851,1566 133852,133853 133854,1181 133856,298 133857,485 133858,133859 133858,138187 133858,139899 133858,149982 133860,133861 133862,133863 133864,3623 133865,602 133866,133867 133868,133869 133870,52270 133871,483 133872,130 133872,1551 133873,1085 133873,2590 133875,22 133876,267 133877,671 133878,422 133879,1001 133881,422 133882,133883 133882,171513 133882,184284 133882,237089 133882,239437 133884,422 133885,422 133886,133887 133888,1010 133888,1012 133889,346 133890,392 133891,1515 133892,192 133892,663 133893,3695 133894,233 133895,422 133896,422 133897,422 133898,1238 133899,422 133900,133901 133902,422 133903,422 133904,422 133905,422 133906,422 133907,422 133908,133909 133910,133909 133911,133909 133912,133909 133913,133909 133914,422 133915,1452 133916,133917 133918,422 133919,355 133920,929 133921,209 133922,439 133923,422 133924,15 133926,422 133927,264 133928,422 133929,1359 133930,422 133931,931 133932,133933 133932,155600 133934,133935 133936,704 133937,58 133938,994 133939,46 133940,862 133941,292 133942,58 133943,994 133944,46 133945,422 133947,79 133948,592 133949,422 133950,133951 133952,422 133953,3623 133954,931 133955,1285 133956,485 133957,473 133957,3003 133958,209 133959,442 133959,694 133959,749 133959,2775 133959,136072 133960,647 133960,835 133960,1522 133961,192 133962,338 133963,779 133963,68069 133964,133965 133966,133966 133967,31977 133968,2574 133969,89035 133970,209 133972,298 133973,485 133974,2572 133975,1715 133976,3079 133977,1807 133978,752 133978,10216 133978,29009 133978,133784 133978,227348 133979,801 133980,147 133983,333 133983,60576 133984,1326 133985,994 133986,422 133987,56 133990,626 133991,422 133992,1293 133993,422 133994,133995 133994,137951 133996,313 133997,422 133998,3623 133999,134000 134001,134002 134003,280 134003,980 134003,17245 134004,481 134005,422 134007,994 134008,422 134009,868 134010,920 134011,422 134012,422 134013,3623 134014,422 134015,13136 134016,422 134017,994 134018,175 134019,298 134020,55849 134022,422 134023,68 134023,6119 134024,8820 134025,422 134026,2926 134027,8072 134028,140 134029,422 134031,422 134032,56 134034,827 134035,178 134036,406 134037,134038 134041,1188 134042,389 134042,1858 134042,2671 134042,4637 134042,7698 134042,40566 134042,148742 134043,422 134044,422 134045,56 134046,422 134048,809 134049,422 134050,200 134051,422 134052,1509 134053,422 134054,7698 134055,58 134056,4672 134056,18831 134057,158 134057,779 134058,222 134059,46 134060,422 134061,422 134062,83 134063,309 134063,310 134064,994 134065,134066 134067,287 134067,809 134067,19010 134068,299 134068,1243 134068,90845 134069,83 134070,134071 134072,134071 134073,134071 134074,134071 134075,134071 134076,134071 134077,134071 134078,134071 134079,783 134079,3207 134080,920 134080,1181 134080,4545 134080,139010 134081,1068 134082,58 134083,994 134084,46 134085,563 134086,1858 134087,1860 134088,422 134091,2209 134092,636 134093,1033 134094,422 134095,2436 134096,3623 134097,356 134097,1580 134099,83 134100,113156 134101,83 134103,726 134104,422 134105,509 134107,1858 134108,1860 134110,422 134112,134113 134114,663 134115,332 134116,875 134117,994 134118,1353 134119,422 134120,56 134121,1551 134122,422 134123,422 134124,56 134125,515 134126,195 134127,1298 134128,146 134129,647 134130,344 134131,408 134132,1323 134133,102 134134,1326 134135,72 134136,994 134137,37 134138,195 134139,340 134140,1285 134140,1888 134140,5933 134140,40566 134141,1556 134142,1776 134143,835 134143,1522 134144,333 134145,784 134146,2116 134147,217 134147,420 134147,515 134147,1453 134147,1579 134147,1722 134147,1893 134147,2626 134147,4039 134148,2557 134149,175 134150,72 134151,422 134152,422 134153,298 134155,3507 134156,994 134157,134158 134159,422 134160,56 134162,1381 134163,79 134164,503 134164,1257 134165,1749 134166,907 134167,1631 134168,536 134168,7092 134168,40566 134169,422 134170,134171 134172,3623 134173,406 134174,222 134175,134176 134177,852 134179,167 134179,2083 134179,128922 134180,1858 134181,1860 134182,366 134183,302 134183,663 134184,1801 134186,422 134187,1210 134187,1544 134187,2083 134188,1801 134189,7155 134191,1001 134192,422 134193,1634 134194,287 134194,809 134194,19010 134195,1359 134196,134197 134198,333 134200,134201 134202,83 134202,1467 134203,809 134204,422 134205,34 134205,35 134205,222 134205,536 134205,2266 134206,1241 134207,422 134208,118 134208,4597 134209,72 134210,422 134211,422 134212,337 134212,623 134212,3367 134212,27041 134213,422 134214,72 134215,422 134216,422 134217,422 134218,422 134219,422 134220,422 134221,422 134222,206 134223,1590 134224,422 134225,422 134227,3260 134228,1033 134229,919 134230,134231 134232,422 134233,175 134234,113156 134235,422 134236,2371 134237,298 134238,68069 134239,557 134240,393 134241,422 134242,652 134243,422 134244,1151 134245,1837 134246,422 134247,338 134248,422 134249,536 134249,18831 134250,20771 134251,801 134252,202 134252,1623 134252,2371 134253,298 134254,485 134255,801 134256,163 134257,693 134258,298 134259,485 134260,8854 134261,134262 134261,138368 134261,141482 134261,151685 134261,161004 134263,298 134264,485 134265,37 134266,195 134267,536 134268,3623 134269,422 134270,136 134270,557 134270,920 134270,1368 134270,1623 134271,557 134273,298 134274,485 134275,422 134276,1285 134277,861 134278,3623 134279,175 134280,298 134281,557 134282,195 134283,493 134285,622 134286,50 134287,422 134288,134289 134290,577 134290,138686 134291,37 134291,1231 134292,422 134293,392 134294,3135 134295,30 134296,422 134298,685 134299,30 134300,30 134301,30 134302,994 134303,663 134304,30 134305,30 134306,433 134307,30 134309,5405 134310,30 134311,134312 134313,3 134314,477 134315,1001 134316,424 134317,900 134318,134319 134320,8854 134321,781 134322,602 134323,30 134324,3069 134325,1983 134326,483 134327,422 134328,56 134329,298 134329,714 134330,147 134331,134332 134333,134334 134335,422 134336,422 134337,885 134337,13704 134338,22 134339,134340 134341,1179 134341,2923 134341,3695 134342,4 134342,5 134343,134344 134345,809 134346,4545 134346,139010 134347,2867 134347,2868 134348,255 134349,134350 134351,298 134352,485 134353,138 134354,865 134355,137 134356,118 134356,4597 134357,557 134358,8719 134359,88820 134360,577 134361,134362 134361,139102 134361,170831 134361,214364 134361,262219 134363,240 134363,301 134363,592 134363,615 134363,968 134363,1785 134363,1818 134363,2620 134363,5718 134364,134365 134366,134367 134368,1556 134369,557 134370,422 134371,557 134372,557 134373,422 134374,557 134375,422 134376,5906 134377,557 134378,278 134379,626 134380,137 134381,862 134382,485 134383,298 134384,149 134385,134386 134387,420 134388,298 134389,485 134390,1782 134391,134392 134393,1363 134394,79 134395,602 134396,843 134397,422 134400,34 134400,35 134400,313 134401,222 134402,422 134403,1252 134403,1253 134404,422 134405,134406 134408,422 134409,422 134410,113156 134411,2146 134412,422 134413,72 134414,344 134415,285 134416,602 134417,31977 134418,994 134421,2775 134422,447 134423,422 134424,1462 134424,8537 134425,1983 134426,647 134427,1983 134428,34 134428,35 134428,1417 134429,3 134429,233 134429,304 134429,328 134429,347 134429,682 134429,893 134429,1458 134429,1511 134429,3069 134429,72439 134430,3623 134431,83 134432,9537 134433,124734 134434,859 134435,134436 134437,1949 134438,392 134438,918 134440,4 134440,5 134441,602 134442,422 134443,289 134443,290 134443,94134 134444,6303 134445,30 134446,134447 134448,195 134449,422 134450,134451 134452,134453 134454,134455 134456,850 134457,422 134458,422 134459,366 134460,366 134461,366 134462,366 134463,366 134464,366 134465,366 134466,304 134467,134468 134469,134470 134471,422 134472,422 134474,1531 134475,134476 134477,192 134478,233 134479,134480 134479,136375 134481,873 134481,1801 134481,3182 134482,132387 134483,422 134484,255 134485,16153 134486,355 134487,467 134487,516 134487,1385 134488,134489 134491,22 134494,872 134495,1860 134496,835 134497,392 134497,1860 134498,1149 134498,1782 134498,2116 134498,2411 134499,30 134500,1089 134501,736 134502,30 134505,1949 134506,1860 134506,6955 134507,202 134507,1085 134508,602 134509,30 134510,422 134511,298 134512,485 134513,146 134514,602 134515,134516 134517,440 134518,588 134518,590 134519,393 134520,22 134521,302 134521,861 134521,893 134524,283 134525,1512 134525,5992 134526,2416 134526,2417 134528,718 134529,602 134530,657 134531,252 134532,602 134533,1608 134534,649 134535,1983 134536,195 134537,261 134540,83 134541,1983 134542,602 134543,760 134543,1631 134544,83 134545,483 134545,1058 134545,1559 134545,8149 134546,298 134547,485 134548,718 134549,668 134550,1007 134551,602 134552,1983 134554,344 134555,72 134556,285 134557,422 134558,602 134560,714 134561,481 134562,167 134562,73570 134563,22 134564,22 134565,422 134566,175 134567,346 134567,1877 134568,298 134569,264 134569,16687 134570,1181 134570,1531 134571,509 134572,195 134573,3260 134574,779 134575,3769 134576,1285 134576,1888 134577,104 134578,346 134579,1580 134580,2926 134581,192 134582,83 134583,3209 134584,301 134584,868 134585,875 134586,134587 134589,55849 134590,875 134592,134593 134594,1860 134595,1858 134596,3623 134597,222 134597,389 134597,1608 134597,7757 134597,13361 134598,422 134601,422 134602,1130 134602,5213 134603,422 134604,422 134605,422 134606,422 134607,422 134608,422 134609,422 134610,422 134611,3 134612,422 134613,422 134614,422 134615,1556 134616,422 134617,422 134618,422 134619,48 134619,56 134619,252 134619,408 134619,422 134619,652 134619,1052 134619,1465 134619,1644 134619,2312 134619,2315 134619,189839 134619,215276 134622,175 134623,422 134624,298 134626,422 134627,97 134630,219 134631,222 134632,66297 134633,217 134633,1417 134636,83 134637,5591 134638,219 134642,1370 134643,287 134644,83 134645,422 134647,1149 134648,422 134651,195 134651,1515 134652,171 134653,422 134654,56 134655,1818 134656,1293 134657,55849 134658,1579 134658,1659 134659,333 134659,60576 134663,55849 134664,346 134665,13136 134666,134667 134669,304 134671,1147 134672,809 134672,973 134672,1010 134672,1085 134672,112722 134672,134672 134672,161880 134672,220728 134672,220729 134672,220732 134673,779 134673,68069 134675,422 134676,6955 134677,252 134677,516 134678,1968 134679,1968 134680,111 134681,579 134681,893 134681,1556 134681,1659 134681,221828 134682,134683 134684,783 134686,408 134687,1323 134688,1326 134689,102 134690,346 134691,760 134692,1608 134693,83 134694,140 134694,3003 134695,733 134697,720 134698,346 134699,147 134700,433 134701,99 134702,718 134705,1019 134707,346 134708,31977 134708,134709 134710,422 134711,56 134712,1858 134713,1860 134714,1858 134715,1860 134717,433 134718,392 134720,760 134721,1858 134722,30 134723,1551 134724,973 134725,3193 134726,1454 134727,1007 134728,13538 134730,2750 134731,994 134733,980 134734,2244 134734,80266 134735,1370 134737,175 134738,298 134739,422 134740,920 134741,485 134742,298 134743,30 134744,346 134746,1252 134746,1253 134748,483 134748,577 134748,1130 134748,2373 134748,4165 134748,192522 134749,83 134750,392 134750,697 134750,875 134751,30 134752,422 134755,392 134756,298 134757,485 134759,200 134761,5405 134762,1181 134763,483 134764,1985 134765,422 134766,467 134767,422 134768,435 134769,1415 134770,83 134771,422 134773,287 134773,809 134773,19010 134775,175 134776,422 134777,809 134778,439 134779,211 134780,298 134781,158 134782,422 134783,1326 134784,192 134785,34 134785,35 134786,346 134787,346 134789,422 134790,422 134791,422 134792,622 134793,422 134794,1590 134795,285 134796,1515 134800,37 134801,422 134802,467 134803,1983 134804,134805 134806,83 134807,304 134808,623 134809,134810 134811,134810 134812,175 134813,55849 134814,298 134815,422 134816,1983 134817,636 134818,422 134819,422 134820,3111 134821,422 134823,134824 134825,1983 134826,346 134827,422 134828,602 134829,134830 134829,227852 134831,31977 134832,30 134833,586 134834,557 134835,1072 134836,652 134837,1858 134838,1860 134840,885 134840,13704 134841,211 134842,435 134844,439 134847,30 134848,129412 134849,134850 134851,422 134852,1019 134853,557 134854,134855 134856,1515 134857,3623 134858,875 134859,422 134860,843 134861,346 134862,602 134863,2367 134866,2048 134867,301 134867,615 134867,968 134867,1832 134867,1837 134867,2083 134867,3756 134870,422 134871,2083 134871,128922 134872,219 134874,422 134875,422 134876,30 134877,557 134878,557 134879,557 134881,862 134882,640 134883,31977 134883,141176 134884,631 134885,298 134886,485 134887,346 134888,663 134889,602 134890,2073 134892,134893 134894,358 134895,422 134896,422 134897,422 134898,422 134899,422 134900,422 134901,422 134902,30 134903,5366 134904,200 134904,240 134904,592 134904,1462 134904,8180 134904,8537 134905,704 134907,1085 134908,631 134910,134911 134912,422 134913,949 134914,81233 134915,333 134916,298 134917,485 134918,1522 134919,1556 134920,30 134921,2116 134922,30 134923,202 134924,30 134925,30 134926,134927 134928,30 134929,217 134929,1417 134930,30 134931,422 134932,134933 134932,139204 134932,144401 134934,346 134935,30 134936,602 134937,392 134937,918 134938,134939 134938,164691 134940,602 134941,602 134942,422 134944,422 134945,134946 134947,422 134948,718 134949,422 134950,422 134951,271 134952,134953 134954,2443 134955,577 134956,30 134957,240 134959,134960 134959,138818 134959,152742 134961,2421 134962,134963 134964,872 134965,1515 134966,422 134969,30 134970,422 134971,422 134972,171 134973,422 134974,83 134975,1359 134976,264 134977,30 134978,134979 134980,30 134981,1381 134982,779 134983,634 134985,240 134986,406 134987,134988 134989,30 134990,30 134991,30 134992,83 134993,422 134994,83 134995,134996 134997,2590 134998,200 134999,30 135000,30 135001,207 135002,346 135003,135004 135005,34 135005,35 135006,1007 135007,135008 135009,135010 135011,135010 135012,872 135013,1429 135015,668 135016,135017 135016,147063 135016,157147 135016,172892 135016,178760 135016,226373 135016,233207 135016,257451 135016,257787 135018,1849 135019,310 135019,779 135019,861 135019,1313 135019,1332 135019,1688 135019,5375 135019,8868 135020,30 135021,693 135021,1033 135021,9018 135021,20813 135022,79 135022,252 135022,333 135023,44 135023,676 135023,850 135023,1722 135023,1955 135023,2697 135023,8990 135023,17588 135023,32475 135024,422 135025,135026 135027,72 135028,135029 135030,4545 135030,139010 135031,422 135032,422 135033,255 135034,2367 135035,422 135036,310 135037,135038 135039,1012 135040,536 135040,7698 135042,30 135044,30 135046,135047 135048,355 135049,233 135050,1143 135051,1983 135052,135053 135054,298 135055,485 135056,344 135057,285 135058,72 135059,333 135062,192 135064,135065 135066,1659 135067,422 135069,83 135070,63 135071,2367 135073,1359 135074,124668 135077,2944 135079,178 135080,1238 135081,417 135081,1564 135082,417 135082,1564 135083,372 135085,83 135088,1983 135089,622 135090,30 135091,422 135092,602 135093,703 135095,58 135097,602 135098,1381 135098,1715 135100,440 135101,931 135102,424 135103,1276 135105,1119 135106,649 135107,1285 135108,2779 135109,1983 135110,2574 135112,515 135113,366 135114,366 135115,872 135116,366 135117,366 135118,433 135119,366 135120,366 135121,6323 135122,366 135123,86 135125,2572 135126,422 135127,298 135128,485 135129,222 135130,838 135130,1012 135130,1419 135131,877 135131,1117 135132,83 135133,287 135133,809 135133,19010 135134,4 135134,5 135134,65 135134,72 135134,87 135134,97 135134,178 135134,184 135134,192 135134,206 135134,209 135134,217 135134,296 135134,301 135134,302 135134,304 135134,305 135134,333 135134,340 135134,346 135134,406 135134,431 135134,435 135134,440 135134,444 135134,479 135134,515 135134,516 135134,536 135134,589 135134,595 135134,622 135134,631 135134,652 135134,736 135134,801 135134,809 135134,835 135134,841 135134,861 135134,872 135134,918 135134,920 135134,932 135134,968 135134,994 135134,996 135134,1007 135134,1019 135134,1058 135134,1102 135134,1118 135134,1177 135134,1267 135134,1294 135134,1326 135134,1359 135134,1370 135134,1381 135134,1452 135134,1466 135134,1531 135134,1579 135134,1590 135134,1677 135134,1707 135134,1968 135134,2017 135134,2244 135134,2334 135134,2443 135134,2867 135134,2868 135134,2979 135134,5911 135134,6119 135134,6303 135134,7270 135134,8541 135134,9018 135134,14945 135134,17309 135134,20359 135134,54202 135134,54243 135134,54272 135134,54284 135134,54362 135135,206 135136,1452 135138,592 135138,1818 135139,932 135140,83 135141,10 135142,135143 135144,135143 135145,37 135145,46 135145,68 135145,86 135145,167 135145,217 135145,240 135145,264 135145,299 135145,301 135145,312 135145,349 135145,372 135145,388 135145,390 135145,392 135145,435 135145,444 135145,510 135145,518 135145,536 135145,589 135145,615 135145,626 135145,631 135145,717 135145,720 135145,744 135145,775 135145,818 135145,832 135145,862 135145,877 135145,907 135145,932 135145,968 135145,972 135145,973 135145,1001 135145,1010 135145,1012 135145,1085 135145,1117 135145,1122 135145,1160 135145,1167 135145,1210 135145,1231 135145,1241 135145,1284 135145,1285 135145,1298 135145,1319 135145,1326 135145,1359 135145,1370 135145,1436 135145,1453 135145,1462 135145,1479 135145,1522 135145,1531 135145,1544 135145,1564 135145,1715 135145,1732 135145,1740 135145,1782 135145,1785 135145,1818 135145,1832 135145,1837 135145,1849 135145,2045 135145,2083 135145,2191 135145,2205 135145,2372 135145,2480 135145,2557 135145,2620 135145,2812 135145,2979 135145,2989 135145,2991 135145,3207 135145,3218 135145,3392 135145,3422 135145,3630 135145,3804 135145,4146 135145,5301 135145,5662 135145,5718 135145,8276 135145,8537 135145,14819 135145,32784 135145,33424 135145,73570 135145,103860 135146,7 135146,22 135146,2017 135146,17309 135147,872 135148,994 135149,1224 135150,135151 135152,783 135153,73938 135154,344 135155,72 135156,285 135158,79 135159,781 135160,1132 135161,175 135162,298 135163,137 135164,3999 135164,4066 135165,481 135169,79 135174,720 135175,1220 135175,1222 135176,252 135177,251 135178,200 135181,278 135182,259 135187,422 135188,83 135189,1860 135190,1858 135191,72 135192,344 135193,285 135195,84257 135197,135198 135199,79 135200,135201 135208,868 135214,994 135215,698 135216,1285 135217,135218 135219,31977 135222,2775 135223,135224 135225,135226 135227,1252 135227,1253 135228,809 135229,1789 135230,135231 135233,217 135233,388 135233,510 135233,1240 135234,83 135236,685 135236,841 135236,911 135236,973 135236,2310 135236,44725 135238,20 135238,957 135238,1815 135238,4218 135239,72 135240,344 135241,285 135242,663 135243,422 135244,195 135244,393 135244,1149 135246,299 135246,3207 135247,1235 135247,1335 135248,422 135249,30331 135250,3623 135251,1782 135252,301 135253,192 135253,217 135253,309 135253,310 135254,875 135255,2979 135256,340 135257,107 135258,97 135259,1252 135259,1253 135260,577 135261,72 135262,1522 135263,1707 135264,135265 135266,4355 135269,1181 135270,120 135270,222 135270,278 135270,455 135270,694 135270,3115 135270,7768 135270,13137 135271,140 135272,623 135272,1805 135273,102560 135274,215 135274,278 135274,301 135274,328 135274,694 135274,1019 135274,1033 135274,1282 135274,1962 135275,1147 135277,146 135278,337 135279,1844 135280,135281 135282,135281 135283,10 135284,1122 135285,120 135285,1001 135286,254 135286,289 135286,290 135286,636 135286,784 135286,862 135286,94134 135288,1001 135291,422 135292,422 135293,56 135294,56 135296,422 135297,135298 135299,360 135299,1122 135300,1608 135301,3 135310,1033 135311,932 135312,102560 135313,907 135314,72 135316,392 135319,278 135319,431 135322,195 135322,640 135322,21487 135323,200 135324,344 135325,285 135326,72 135327,72 135328,344 135329,285 135330,3623 135332,392 135336,731 135337,135338 135340,3623 135341,50 135341,406 135341,622 135341,141912 135342,298 135343,485 135344,875 135345,3623 135346,22 135347,2209 135348,602 135349,602 135350,135351 135352,344 135353,72 135354,285 135356,72 135357,1608 135358,1257 135359,72 135360,72 135361,439 135362,72 135363,20771 135364,298 135365,485 135366,466 135366,868 135366,6761 135366,81233 135366,106899 135367,128922 135368,850 135371,171 135372,10 135373,862 135374,536 135375,298 135376,485 135377,406 135378,84257 135378,118336 135379,217 135380,135381 135382,1707 135383,862 135384,118 135384,450 135384,4597 135385,3623 135386,1564 135387,72 135389,178 135389,439 135390,579 135391,455 135392,135393 135394,135395 135396,135397 135398,875 135399,175 135400,298 135401,72 135402,240 135403,483 135404,809 135405,30 135406,557 135407,135408 135407,149355 135407,175816 135409,6955 135410,557 135411,557 135412,557 135413,8719 135414,138 135415,865 135416,557 135417,137 135418,88820 135419,118 135419,4597 135420,1623 135421,225 135422,149 135423,1623 135424,3538 135425,30 135426,636 135426,1844 135427,422 135428,332 135429,1882 135430,850 135431,457 135431,497 135431,535 135431,676 135431,918 135432,72 135433,344 135434,285 135435,135436 135437,1983 135438,72 135439,285 135440,344 135441,68069 135442,135443 135444,422 135445,422 135446,422 135447,422 135448,422 135449,8884 135451,406 135451,779 135452,255 135453,422 135454,135455 135456,83 135457,135458 135459,1085 135460,22 135461,22 135462,1052 135463,175 135464,298 135465,87 135465,200 135466,135467 135468,893 135469,503 135470,346 135471,135472 135473,2590 135474,135475 135476,422 135477,56 135478,344 135479,72 135480,285 135481,147 135482,2286 135483,72 135484,344 135485,285 135488,135489 135490,135489 135491,233 135492,72 135493,72 135494,422 135495,422 135496,647 135497,355 135498,571 135499,1392 135503,135504 135503,149696 135505,994 135506,994 135507,994 135508,481 135509,366 135510,366 135511,366 135512,366 135513,366 135514,135514 135515,79 135516,83 135517,135518 135519,422 135520,422 135521,994 135522,422 135523,138 135525,422 135526,1411 135527,3193 135528,783 135529,994 135530,408 135531,102 135532,1323 135533,1326 135543,809 135544,287 135545,140 135545,287 135545,809 135545,19010 135550,809 135558,287 135558,809 135558,19010 135559,287 135559,809 135559,19010 135563,287 135563,809 135564,135565 135566,422 135567,135568 135569,255 135570,932 135571,251 135572,118 135572,4597 135573,118 135573,422 135573,4597 135574,422 135575,949 135576,932 135577,422 135578,118 135578,4597 135579,422 135580,422 135581,113156 135582,72 135583,344 135584,285 135585,175 135585,841 135585,1247 135586,422 135587,1415 135588,422 135589,422 135590,135591 135592,422 135593,135594 135595,358 135596,422 135597,135598 135599,422 135600,422 135601,602 135602,1847 135603,137 135605,422 135606,422 135607,602 135608,312 135609,344 135610,285 135611,72 135612,422 135613,30 135614,72 135615,994 135616,422 135617,422 135618,422 135619,83 135620,4771 135621,422 135623,1479 135624,390 135625,718 135626,1353 135627,130 135627,184 135627,298 135627,422 135627,1224 135628,248 135628,1631 135629,135630 135631,135632 135633,147 135635,1388 135636,135637 135638,135639 135640,135641 135642,135643 135644,640 135645,393 135646,392 135647,135648 135649,483 135650,20 135650,151 135650,2923 135651,31977 135652,135653 135654,372 135655,34 135655,35 135655,313 135656,602 135657,422 135658,366 135659,366 135660,366 135661,233 135662,2367 135662,8235 135663,107 135664,2416 135664,2417 135665,292 135666,338 135667,298 135669,1133 135670,3538 135671,422 135672,422 135673,1238 135674,422 135675,355 135676,147 135676,622 135677,151 135678,1241 135679,1715 135680,298 135681,485 135682,135683 135684,135685 135686,83 135687,481 135689,4 135689,5 135690,479 135691,433 135692,135693 135694,485 135695,298 135696,298 135697,485 135699,83 135700,1241 135701,130 135702,422 135703,422 135704,422 135705,422 135706,158 135706,252 135706,622 135706,862 135707,72 135708,113481 135709,392 135710,55849 135711,422 135712,422 135713,422 135714,422 135715,422 135716,422 135717,422 135718,422 135719,20004 135720,422 135721,433 135722,137 135723,422 135724,135725 135726,1983 135727,422 135728,84257 135729,422 135730,2775 135731,447 135732,1414 135733,485 135734,298 135735,2779 135737,200 135739,875 135739,907 135739,972 135739,24107 135739,36918 135739,45853 135743,135744 135746,2416 135746,2417 135747,163 135748,1332 135749,55849 135750,135751 135752,135753 135754,483 135755,1151 135756,118 135756,4597 135757,1983 135758,1860 135759,1858 135760,704 135761,79 135761,333 135762,602 135763,422 135764,422 135766,135767 135769,5375 135771,2296 135772,406 135772,818 135773,1782 135780,240 135781,515 135782,557 135783,557 135784,135785 135786,116 135786,2087 135787,2674 135788,138 135790,994 135791,994 135792,636 135793,72 135794,994 135795,994 135796,994 135797,83 135798,2210 135798,4237 135799,30 135800,2979 135801,994 135802,557 135803,557 135804,994 135805,994 135806,30 135807,485 135808,298 135809,298 135810,485 135811,875 135812,1117 135812,124668 135813,135814 135815,422 135816,4611 135817,1707 135818,135819 135821,111 135821,240 135821,805 135821,1085 135821,1462 135821,8537 135822,994 135823,994 135824,1181 135825,994 135826,22 135827,135828 135829,135828 135830,602 135831,602 135832,135833 135834,309 135834,310 135835,146 135835,306 135835,307 135835,704 135835,2626 135835,5375 135835,8868 135836,135837 135838,2674 135839,135840 135841,135842 135843,135844 135845,135846 135848,422 135849,422 135850,818 135851,1151 135852,135853 135854,72 135855,135856 135857,3623 135858,3999 135859,1417 135860,135861 135862,372 135864,135865 135866,135867 135868,292 135869,366 135870,366 135871,366 135872,294 135873,44 135874,296 135875,298 135876,389 135877,452 135877,457 135877,497 135877,535 135877,676 135877,918 135877,1655 135878,135879 135880,333 135880,346 135880,366 135880,1247 135880,164572 135881,392 135881,918 135882,390 135883,119 135884,135885 135886,602 135887,671 135888,147 135889,135890 135891,184 135893,2209 135894,1284 135895,422 135896,41 135897,135898 135899,1238 135900,1619 135901,1452 135902,1381 135903,269 135905,439 135906,515 135906,1381 135907,355 135908,718 135910,907 135911,298 135912,485 135914,422 135915,485 135916,298 135917,994 135919,292 135921,287 135921,433 135922,1858 135923,1860 135924,298 135925,485 135926,1122 135926,6059 135927,10 135927,2146 135927,54284 135929,602 135930,135931 135932,135933 135934,72 135935,83 135936,1370 135937,8180 135939,4611 135940,1544 135941,994 135942,994 135943,255 135944,233 135945,340 135945,515 135946,1167 135946,2979 135950,360 135950,509 135950,1119 135951,30 135951,328 135951,1179 135951,1305 135952,631 135953,994 135954,337 135955,22 135955,805 135955,920 135955,1293 135956,298 135957,1285 135958,1782 135959,994 135960,79 135961,130 135962,79 135963,485 135964,422 135965,481 135966,79 135967,439 135968,1858 135969,3507 135970,1564 135972,1293 135973,1147 135974,56 135975,1860 135976,372 135977,859 135979,994 135981,58 135981,801 135981,1140 135981,1147 135981,1653 135981,2436 135981,4771 135982,328 135983,56 135983,209 135985,422 135986,56 135987,10 135987,628 135987,991 135987,4260 135988,994 135989,473 135989,8149 135990,868 135990,1782 135991,41 135992,178 135992,1877 136001,190492 136005,178 136009,1612 136009,2173 136011,1556 136012,609 136012,1257 136012,1359 136012,2315 136013,344 136015,337 136016,136017 136018,760 136018,1149 136018,1631 136019,4545 136019,56150 136019,139010 136020,298 136021,485 136022,202 136022,497 136022,505 136022,516 136022,676 136022,843 136022,1220 136022,1222 136022,1417 136022,1512 136022,1663 136022,72439 136023,1639 136024,83 136025,136026 136028,287 136028,809 136028,19010 136029,1238 136031,3507 136032,1983 136033,968 136033,1436 136033,1740 136033,5301 136034,192 136036,372 136037,1663 136038,875 136039,15 136040,360 136040,4571 136041,22 136042,79 136042,1175 136042,189839 136042,189842 136043,1043 136045,298 136046,485 136047,602 136048,72 136049,422 136050,3830 136050,174849 136051,81070 136053,15 136054,408 136054,493 136054,518 136055,200 136056,32 136056,3260 136056,76096 136057,97 136058,209 136059,1151 136060,298 136061,485 136062,602 136063,222 136063,1019 136064,3524 136065,949 136066,94 136066,795 136067,1 136067,2787 136067,4691 136067,30331 136067,142430 136068,34 136068,35 136069,6303 136070,13361 136071,72 136072,58 136072,104 136072,135 136072,292 136072,441 136072,784 136072,795 136072,1415 136072,7768 136073,147 136073,158 136074,200 136074,772 136075,136076 136077,222 136077,1010 136078,147 136079,136080 136081,485 136082,298 136085,1844 136087,1175 136088,44 136089,298 136090,485 136091,147 136092,147 136094,907 136095,1631 136096,515 136098,136099 136100,422 136101,136102 136103,147 136104,1370 136104,1715 136106,605 136107,287 136108,217 136110,30 136110,772 136111,422 136112,872 136113,136114 136113,151940 136115,1559 136117,298 136118,485 136120,34 136120,35 136120,217 136120,536 136121,577 136122,298 136123,485 136124,134 136126,1749 136126,81233 136127,1402 136128,175 136129,56 136129,175 136129,626 136129,1285 136129,1319 136129,1571 136130,1127 136131,298 136132,827 136134,392 136135,388 136136,392 136138,1087 136138,1707 136140,2744 136141,136142 136143,1707 136144,17476 136145,406 136146,178 136146,233 136146,240 136146,269 136146,1085 136146,1531 136147,298 136148,485 136151,136152 136154,1707 136155,72 136156,344 136157,285 136158,31977 136159,1515 136160,22 136161,1240 136162,287 136162,809 136162,19010 136163,202 136163,251 136164,84257 136167,602 136168,588 136168,590 136168,1419 136169,200 136170,22 136171,206 136172,136173 136174,68069 136174,118336 136175,58 136175,1140 136176,422 136177,301 136178,136179 136180,1707 136181,406 136184,717 136185,147 136186,388 136186,48505 136188,489 136188,577 136188,1400 136188,1844 136190,919 136193,2837 136194,104 136194,697 136194,704 136194,862 136194,4545 136195,875 136196,175 136197,298 136198,344 136199,72 136200,285 136201,83 136202,17772 136203,49057 136204,136205 136206,136207 136208,579 136209,5130 136210,30 136211,718 136212,1462 136212,8537 136213,422 136214,2224 136216,1893 136217,248 136217,1332 136217,5405 136218,1634 136219,422 136220,146 136221,344 136222,647 136223,1773 136224,215 136225,422 136227,215 136228,694 136229,422 136230,483 136231,337 136232,240 136233,1052 136233,1749 136233,1968 136236,136072 136237,3804 136238,1893 136239,217 136240,278 136241,83 136242,3804 136243,885 136243,13704 136244,525 136245,957 136246,1309 136247,5405 136248,422 136249,631 136250,294 136251,136252 136253,872 136254,13136 136255,222 136256,671 136257,310 136258,72 136259,631 136259,1635 136260,2224 136261,2674 136262,138 136263,116 136263,2087 136264,920 136265,116 136265,138 136265,2087 136266,397 136266,483 136267,272 136268,349 136269,136270 136271,1181 136272,2371 136273,346 136274,1151 136276,136277 136280,240 136281,536 136282,136072 136286,422 136287,422 136288,1332 136290,2224 136291,994 136292,83 136293,79 136294,994 136295,557 136296,557 136297,760 136297,1631 136298,2048 136299,994 136300,2574 136301,103860 136301,189303 136302,422 136303,1370 136304,422 136305,1556 136306,1220 136306,1222 136307,500 136308,1962 136309,2775 136310,1052 136311,54 136312,1882 136313,171 136314,868 136315,30331 136316,149 136317,136318 136319,309 136319,310 136320,136321 136322,136323 136324,151 136325,422 136326,392 136327,718 136328,3623 136329,1127 136330,875 136331,515 136332,485 136333,298 136334,589 136334,1001 136335,298 136336,485 136337,994 136338,1359 136339,733 136340,136341 136342,83 136343,83 136345,515 136346,422 136347,147 136348,304 136350,250 136350,1684 136351,1052 136352,1181 136353,2944 136354,2674 136355,138 136356,116 136356,2087 136357,2205 136357,2209 136357,6184 136357,33424 136358,72 136359,344 136360,285 136361,422 136362,809 136363,167 136364,136173 136365,72 136366,2590 136367,118 136367,4597 136369,79 136370,136371 136372,393 136373,1983 136374,30 136376,383 136377,147 136378,346 136379,147 136380,577 136381,422 136382,907 136383,389 136383,596 136383,1849 136383,32784 136384,2590 136385,422 136386,195 136387,1849 136388,957 136389,136390 136391,77 136392,949 136392,17263 136393,83 136394,602 136395,602 136396,1467 136398,366 136399,366 136400,366 136401,366 136402,388 136403,422 136404,422 136405,422 136406,2424 136407,136408 136409,233 136410,1983 136411,1359 136412,136072 136413,136072 136414,1955 136415,4190 136416,136417 136418,422 136419,298 136420,485 136421,355 136422,1871 136423,248 136425,2701 136426,422 136427,136 136428,355 136429,298 136430,485 136431,620 136432,302 136433,455 136434,4066 136435,312 136436,718 136437,2353 136437,4190 136438,30 136439,485 136440,298 136441,136442 136443,134 136444,7416 136446,2889 136447,397 136448,13980 136449,2674 136450,138 136451,116 136451,2087 136452,4771 136452,9010 136454,2775 136455,447 136456,3507 136457,1105 136458,433 136459,647 136460,344 136461,146 136462,135 136462,294 136462,431 136462,784 136462,805 136462,1052 136462,1119 136462,1177 136462,1368 136462,1608 136462,1635 136462,182162 136463,192 136463,516 136463,1370 136463,1619 136463,30331 136465,422 136466,83 136468,137 136469,158 136469,252 136469,622 136470,1858 136471,79 136472,136473 136474,163 136475,602 136476,79 136478,217 136478,1019 136479,1220 136479,1222 136480,252 136481,251 136483,1019 136491,1419 136496,283 136499,1467 136509,1381 136511,1298 136512,693 136514,1240 136516,209 136516,2116 136517,163 136519,422 136522,2674 136523,116 136523,2087 136524,138 136525,805 136526,3630 136527,136528 136529,805 136529,1285 136530,949 136531,1052 136532,146 136533,344 136534,647 136535,195 136536,54 136536,195 136536,1274 136537,827 136538,467 136539,3524 136540,83 136541,254 136542,452 136543,1247 136544,184 136547,146 136548,647 136549,344 136551,301 136551,968 136551,1293 136552,175 136553,775 136553,795 136553,3804 136553,23437 136554,298 136555,1860 136556,146 136557,647 136558,269 136559,344 136561,647 136562,146 136563,344 136564,647 136565,344 136566,718 136567,146 136568,634 136569,167 136569,2083 136570,5405 136572,1146 136573,515 136575,2590 136576,137 136577,58 136578,46 136579,994 136582,146 136583,647 136584,344 136585,611 136586,515 136587,248 136588,344 136589,1608 136590,1531 136590,4545 136590,139010 136591,209 136592,994 136593,1105 136594,444 136595,515 136596,875 136597,146 136598,647 136599,344 136600,77 136601,422 136602,581 136603,99 136603,314 136603,779 136603,141912 136604,1608 136605,22 136606,120 136607,1962 136608,209 136609,422 136610,718 136611,422 136612,868 136613,720 136614,217 136616,422 136617,120 136617,261 136619,83 136620,2460 136621,3623 136624,302 136625,175 136627,298 136628,1984 136629,58 136631,3507 136632,4611 136633,1544 136634,58 136635,1715 136637,577 136637,919 136638,333 136639,44 136641,163 136641,6303 136642,811 136643,467 136644,10 136646,392 136647,433 136648,515 136650,200 136650,772 136651,287 136651,809 136651,19010 136654,1298 136655,302 136656,22 136656,48 136656,79 136656,151 136656,163 136656,240 136656,358 136656,392 136656,393 136656,439 136656,538 136656,622 136656,934 136656,1033 136656,1068 136656,1188 136656,1210 136656,1289 136656,1305 136656,1785 136656,1796 136656,1962 136656,2116 136656,2205 136656,2260 136656,2312 136656,3089 136656,4066 136656,8180 136656,8820 136656,9024 136656,13910 136656,19356 136656,33424 136656,36985 136657,801 136657,1085 136657,75912 136658,136 136658,1014 136660,1147 136662,563 136663,4611 136664,1544 136665,7768 136666,58 136667,192 136668,596 136668,1332 136669,994 136670,192 136671,1096 136672,422 136673,422 136674,483 136674,852 136674,2646 136674,2775 136675,713 136677,422 136678,422 136680,602 136681,602 136682,589 136683,417 136683,525 136683,805 136683,1085 136683,1140 136683,1749 136683,1818 136683,2286 136683,2620 136685,313 136686,379 136687,1181 136689,422 136690,136691 136690,152737 136692,2296 136693,7124 136694,422 136695,379 136696,422 136697,467 136698,801 136699,397 136702,422 136703,422 136704,827 136705,422 136706,422 136707,389 136708,422 136709,422 136710,422 136711,3623 136712,406 136716,225 136718,1019 136719,481 136720,4 136720,5 136720,1381 136721,147 136722,760 136724,599 136725,422 136726,19010 136727,1220 136727,1222 136728,252 136729,251 136730,602 136731,875 136732,147 136732,1458 136733,949 136734,811 136735,422 136736,55849 136737,1285 136738,79 136738,192 136738,202 136738,333 136739,83 136740,1749 136742,3331 136742,13136 136743,1749 136744,801 136745,1858 136746,1860 136747,1 136747,859 136747,3069 136748,1858 136749,1860 136750,406 136751,136752 136753,372 136753,1082 136754,577 136755,206 136756,994 136758,111 136758,875 136759,304 136760,163 136761,186 136761,1118 136762,202 136763,58 136764,1240 136765,158 136766,171 136767,1722 136768,346 136769,994 136770,483 136771,30 136772,136773 136774,1454 136775,10 136775,2574 136775,31977 136776,422 136777,406 136778,422 136779,406 136779,779 136779,1181 136780,422 136781,217 136781,1417 136782,149 136783,2224 136784,1001 136785,30 136786,557 136788,2674 136789,116 136789,2087 136790,138 136791,149 136791,184 136792,934 136792,1033 136794,885 136794,13704 136795,3585 136796,779 136797,5405 136798,136799 136800,1882 136801,130 136801,140 136801,323 136801,332 136801,1007 136801,1105 136801,1289 136801,1429 136801,1509 136801,1551 136801,2797 136801,3319 136801,3328 136801,3331 136801,3999 136803,392 136803,918 136804,3630 136805,30 136806,1118 136806,1566 136807,158 136807,2931 136807,8822 136808,389 136809,358 136810,312 136811,113156 136812,140 136813,267 136814,192 136814,779 136815,2750 136816,1332 136818,8270 136819,557 136820,557 136821,417 136822,298 136823,485 136824,175 136825,298 136826,994 136827,298 136828,485 136829,151 136830,811 136831,255 136832,3623 136833,422 136834,30 136835,422 136836,313 136837,22 136838,1082 136839,422 136840,30 136841,178 136841,439 136843,994 136844,2083 136845,136 136846,58 136847,994 136848,46 136849,136850 136851,30 136852,206 136853,1 136854,6323 136855,457 136855,497 136855,535 136855,676 136855,918 136855,1655 136856,136857 136858,136859 136860,389 136861,22 136862,1007 136863,779 136864,30 136865,920 136866,136867 136868,779 136869,2116 136870,467 136871,192 136872,602 136873,136874 136875,602 136876,83 136877,30 136878,22 136879,602 136880,136881 136882,602 136883,602 136884,602 136885,1571 136886,171 136887,136888 136887,154093 136889,22 136890,861 136891,72 136892,136893 136894,72 136895,136896 136897,1515 136898,30 136899,138 136900,2674 136901,116 136901,2087 136903,10 136904,422 136905,422 136906,422 136907,136908 136909,135 136909,137 136910,668 136911,422 136912,422 136913,22 136914,1556 136915,422 136917,136918 136917,140960 136919,422 136920,111 136921,3069 136922,1467 136923,113156 136924,422 136925,422 136926,455 136927,2424 136928,422 136929,366 136930,1871 136931,366 136932,422 136933,422 136934,2421 136935,83 136936,13980 136937,422 136938,19010 136939,136940 136941,422 136942,422 136943,1085 136944,422 136945,344 136945,647 136945,1544 136946,4355 136947,640 136948,298 136949,485 136951,5375 136953,294 136954,30 136955,30 136956,422 136957,602 136958,422 136959,136960 136961,422 136962,818 136963,1821 136964,718 136965,422 136966,422 136967,422 136968,1238 136971,222 136972,1033 136973,1452 136974,136975 136976,422 136977,355 136978,893 136979,333 136979,59021 136980,233 136981,509 136982,1462 136982,8537 136983,932 136984,422 136987,1544 136988,298 136989,485 136992,647 136992,1175 136993,287 136993,809 136993,19010 136994,2286 136995,2205 136995,33424 136996,206 136996,217 136996,406 136996,694 136997,805 136997,2620 136998,811 136999,1359 137000,1907 137001,698 137003,171 137004,2674 137005,116 137005,2087 137006,138 137007,206 137010,515 137011,315 137012,1818 137020,433 137021,843 137023,843 137024,861 137025,843 137026,328 137027,137028 137029,240 137030,949 137032,433 137033,1849 137034,435 137034,439 137035,298 137036,485 137037,577 137038,422 137039,1353 137040,137041 137042,949 137043,392 137044,918 137045,1631 137046,248 137046,1631 137047,994 137048,1118 137048,19005 137049,481 137050,22 137051,298 137052,485 137053,422 137055,137056 137055,142230 137057,163 137058,171641 137059,877 137059,124668 137059,187176 137059,227669 137060,298 137061,485 137062,273 137063,175 137064,6027 137065,298 137066,287 137067,137068 137067,138607 137067,142233 137069,134 137069,372 137070,1984 137071,2116 137072,422 137073,22 137074,200 137075,1707 137076,422 137077,298 137078,485 137079,137080 137081,2224 137082,30 137083,422 137084,298 137085,485 137086,107 137087,298 137088,485 137090,422 137091,843 137092,994 137093,447 137094,83 137095,30 137096,41 137096,1608 137097,422 137098,1531 137099,1962 137100,6303 137101,772 137102,1381 137103,994 137105,712 137106,30 137107,2979 137108,240 137108,760 137108,1010 137109,158 137110,298 137111,485 137112,843 137113,968 137114,1140 137115,72 137116,285 137117,344 137118,269 137119,3507 137120,843 137121,843 137122,175 137123,298 137124,68 137127,640 137128,467 137129,467 137129,1893 137130,158 137131,158 137133,158 137136,994 137137,58 137138,46 137139,298 137140,485 137141,81070 137144,2146 137144,19986 137145,287 137146,58 137147,994 137148,46 137150,698 137151,379 137152,406 137152,422 137152,457 137152,620 137152,1458 137153,298 137154,485 137155,30 137156,30 137157,292 137157,2775 137158,1749 137158,1962 137159,957 137160,3 137161,433 137162,58 137163,46 137164,994 137165,2775 137166,447 137167,372 137168,602 137169,301 137169,717 137169,1782 137170,135 137171,1220 137171,1222 137172,252 137173,251 137174,65 137175,1415 137176,957 137177,433 137179,137180 137182,107 137182,200 137182,2443 137183,118336 137184,467 137185,5469 137186,957 137187,195 137188,422 137189,19010 137190,1220 137190,1222 137191,251 137192,252 137193,1118 137194,3623 137196,30 137197,19010 137199,433 137200,422 137201,72 137201,442 137201,1962 137201,155473 137202,433 137203,175 137204,805 137205,442 137205,1282 137205,2089 137205,2156 137205,2940 137205,4571 137206,256 137207,298 137208,310 137210,957 137211,422 137212,56 137213,83 137214,366 137215,868 137216,3623 137217,54 137218,30 137219,298 137220,485 137221,195 137222,136072 137224,30 137225,745 137226,211 137227,30 137228,30 137228,1179 137229,298 137230,485 137231,30 137232,2979 137233,68 137234,30 137235,602 137236,366 137237,2312 137238,3 137240,1118 137241,137242 137243,1085 137244,200 137244,225 137244,772 137244,1332 137246,30 137246,1179 137247,44 137249,30 137249,1179 137250,818 137251,602 137252,602 137253,808 137256,479 137257,631 137259,811 137260,775 137260,843 137262,422 137263,422 137264,509 137265,868 137265,152855 137265,156379 137271,202 137271,2371 137272,392 137272,4252 137273,312 137274,536 137275,760 137275,1149 137276,557 137277,68069 137278,137279 137284,1345 137292,640 137296,1284 137302,50 137302,79 137311,861 137311,50321 137330,202 137410,5101 137420,467 137420,571 137420,868 137426,809 137463,2371 137499,2371 137525,467 137525,868 137526,162599 137534,2371 137540,2371 137563,1653 137563,220502 137660,760 137670,346 137704,206 137713,366 137733,422 137734,1860 137736,602 137737,1458 137738,483 137739,3623 137740,1749 137741,22 137742,2260 137744,422 137745,30 137746,1860 137747,1858 137749,30 137750,422 137751,4252 137752,431 137752,1326 137752,1782 137752,5961 137752,156379 137753,1782 137754,30 137755,422 137756,137757 137758,3623 137761,87 137762,422 137763,422 137764,3409 137766,422 137767,68 137769,240 137769,818 137769,1608 137770,994 137771,55849 137772,422 137773,422 137774,422 137775,422 137776,920 137777,422 137778,422 137779,422 137780,4611 137781,1544 137784,422 137785,30 137786,1515 137788,30 137789,602 137790,1515 137791,120 137792,137792 137793,68069 137793,141912 137794,994 137796,422 137797,34 137797,35 137797,634 137797,2646 137798,149 137800,422 137801,1149 137802,422 137803,422 137804,885 137804,13704 137805,30 137806,872 137807,137808 137809,626 137810,137811 137812,56 137812,147 137812,158 137813,5440 137815,602 137816,302 137816,861 137816,893 137817,107 137819,126 137819,872 137819,1151 137820,240 137821,248 137822,137823 137824,30 137825,557 137826,137827 137828,2379 137829,493 137831,30 137832,563 137833,192 137834,160 137835,422 137836,1298 137837,302 137838,1175 137839,994 137840,72 137841,1175 137842,657 137842,2266 137843,1962 137844,500 137845,2775 137846,1052 137847,54 137848,1882 137849,171 137850,30 137851,30 137852,557 137853,557 137854,56 137855,422 137856,5906 137857,557 137858,626 137859,278 137860,137 137861,862 137862,137863 137864,538 137865,417 137866,151 137867,422 137868,1551 137868,3999 137870,68069 137871,30 137872,1556 137873,623 137874,30 137875,16153 137877,6789 137879,137880 137881,2105 137881,4220 137881,66297 137882,422 137883,137884 137885,30 137886,1882 137887,30 137888,30 137889,973 137889,9018 137890,6252 137891,422 137892,137893 137894,538 137895,30 137896,30 137897,346 137898,2146 137899,346 137900,192 137901,2574 137902,30 137903,861 137904,435 137905,422 137906,994 137907,8854 137908,422 137909,4895 137910,994 137911,843 137912,137913 137914,2750 137915,422 137916,422 137917,56 137918,422 137919,137920 137921,602 137922,602 137923,2421 137924,602 137925,2116 137927,143 137928,493 137930,30 137931,994 137932,137933 137934,137934 137935,22 137936,30 137937,2146 137937,3297 137937,42419 137938,72 137939,81233 137940,72 137941,81 137941,1511 137941,3069 137941,4771 137942,640 137943,30 137944,30 137945,481 137946,72 137947,392 137948,34 137948,35 137948,2784 137949,818 137950,2244 137953,862 137953,2590 137954,1849 137955,137956 137957,714 137958,872 137959,137960 137959,144490 137959,148698 137959,151855 137959,152484 137961,87 137961,192 137961,200 137961,240 137961,278 137961,285 137961,333 137961,388 137961,503 137961,694 137961,1033 137961,1072 137961,1151 137961,1181 137961,1257 137961,1298 137961,1515 137961,1805 137961,1836 137961,1871 137961,1955 137961,2421 137961,3138 137961,3585 137961,60576 137962,22 137963,383 137964,10 137964,130 137964,140 137964,515 137964,640 137964,647 137964,736 137964,801 137964,835 137964,1052 137964,1381 137964,1893 137964,1968 137964,2626 137964,3297 137964,5440 137965,422 137966,2867 137966,2868 137967,137968 137969,1052 137971,255 137973,392 137975,422 137976,1 137976,163 137976,859 137976,980 137976,4571 137976,30331 137977,422 137978,137979 137982,219 137983,2944 137983,6506 137984,134406 137985,233 137986,422 137987,83 137989,1181 137990,72 137993,355 137994,818 137995,972 137996,312 137997,1033 137998,137999 138000,137999 138001,137999 138002,137999 138003,22 138004,346 138005,1858 138006,1860 138008,392 138008,849 138008,1132 138010,222 138012,138013 138014,72 138015,3653 138016,477 138016,536 138016,2168 138017,1085 138018,75912 138028,3538 138029,113156 138030,32 138030,104 138030,868 138030,1326 138030,1345 138030,1796 138030,3623 138030,3804 138030,156379 138032,75912 138034,1370 138035,120 138035,332 138035,392 138035,809 138035,1284 138035,1858 138035,2989 138035,2991 138036,278 138036,13361 138041,1860 138050,41 138051,2668 138053,217 138053,1531 138054,30 138055,68069 138056,302 138058,1177 138059,875 138060,620 138061,72 138063,1224 138063,3177 138064,192 138065,749 138066,1509 138067,557 138068,2266 138069,138070 138071,302 138072,1858 138073,1860 138074,111142 138075,515 138077,247 138078,500 138079,2775 138080,1962 138081,1052 138082,1882 138083,54 138085,1467 138086,1858 138087,1860 138088,175 138089,298 138090,58 138091,994 138092,46 138093,97 138093,32475 138095,481 138096,22 138100,346 138101,1556 138103,200 138103,772 138103,1368 138103,5405 138104,671 138105,4810 138106,302 138107,994 138108,1479 138109,422 138110,422 138111,1479 138112,1479 138113,147 138114,75912 138115,41 138115,671 138116,75912 138117,346 138119,83 138120,527 138120,8714 138121,422 138122,2671 138123,163 138123,209 138123,302 138123,435 138123,2116 138124,579 138124,4823 138125,1776 138125,1877 138126,422 138128,422 138129,422 138130,557 138131,422 138132,338 138133,422 138134,175 138135,602 138136,657 138136,1284 138136,1363 138136,13361 138137,298 138138,264 138138,4548 138140,994 138141,209 138142,1149 138143,75912 138144,422 138145,994 138146,422 138147,2146 138148,850 138149,195 138150,138151 138154,22 138156,3111 138157,83 138163,333 138166,333 138167,364 138168,83 138168,217 138169,251 138169,994 138170,422 138171,56 138172,850 138173,1240 138176,640 138177,104 138177,254 138177,557 138177,953 138177,954 138177,1939 138177,10318 138178,510 138179,171 138180,527 138181,1858 138182,1860 138183,3367 138184,3297 138185,111 138185,714 138186,1707 138188,408 138189,1326 138190,1323 138191,827 138192,102 138193,868 138194,103860 138195,1220 138195,1222 138196,592 138197,195 138198,660 138199,1013 138199,1241 138199,1479 138199,1522 138199,2557 138199,13593 138199,42433 138199,46271 138199,140689 138200,302 138201,779 138202,195 138203,4823 138204,22 138205,313 138205,425 138206,647 138207,146 138208,344 138211,158 138212,4276 138214,2775 138218,1 138228,1688 138229,1858 138230,1860 138232,1688 138233,248 138233,312 138233,557 138235,875 138236,312 138238,385 138240,602 138241,392 138242,215 138243,422 138244,240 138244,622 138244,818 138244,127158 138246,760 138247,571 138247,868 138248,81 138250,195 138251,195 138252,392 138252,697 138253,907 138254,1983 138255,116 138255,2087 138256,138 138257,2674 138258,3623 138259,138260 138261,195 138262,2205 138262,33424 138263,875 138264,3623 138265,3623 138266,3623 138267,994 138268,3623 138269,195 138270,195 138271,760 138272,563 138273,30 138274,577 138275,171 138276,392 138276,697 138277,251 138278,18831 138279,68 138279,2620 138280,577 138281,30 138282,30 138283,77 138284,620 138285,30 138286,30 138287,30 138288,435 138288,538 138288,671 138289,138290 138291,1181 138292,602 138293,175 138300,298 138301,3623 138302,79 138303,2371 138304,273 138305,422 138306,56 138307,10 138308,760 138309,372 138312,10 138313,1127 138314,406 138315,5405 138316,147 138316,406 138316,622 138317,893 138318,1285 138318,1635 138319,422 138320,1010 138321,1 138323,5469 138324,46 138325,58 138326,46 138327,994 138328,6506 138329,1707 138330,1133 138331,1326 138332,3069 138333,994 138334,435 138336,422 138337,68 138338,8788 138339,23783 138340,422 138341,130 138341,264 138341,628 138341,687 138341,859 138341,893 138341,1122 138341,1140 138341,1400 138341,1462 138341,1551 138341,1556 138341,3345 138341,5358 138341,8537 138341,9029 138341,13136 138341,13538 138341,14352 138342,195 138343,515 138344,79 138344,217 138344,247 138344,467 138344,1181 138345,2750 138346,422 138348,422 138350,843 138351,72 138352,5213 138353,68 138354,72 138355,422 138356,56 138357,875 138358,138359 138360,233 138361,885 138361,13704 138362,30 138363,1235 138363,1335 138364,422 138365,72 138366,346 138367,875 138369,171 138370,1608 138371,30 138372,536 138373,72 138374,72 138375,72 138376,801 138376,1140 138376,1177 138376,1893 138376,3474 138377,3507 138378,1707 138379,34 138379,35 138380,328 138381,140 138382,1634 138383,422 138384,56 138385,1544 138386,2701 138387,252 138388,557 138389,202 138390,1564 138391,557 138392,2557 138393,1939 138394,264 138394,736 138394,1007 138394,1010 138394,1289 138394,1509 138394,1551 138394,3041 138394,3999 138394,5440 138395,980 138396,557 138397,1298 138398,406 138399,248 138400,862 138401,1231 138402,714 138403,873 138404,383 138405,72 138406,1893 138407,5405 138408,130897 138409,390 138410,1837 138411,422 138412,56 138413,1381 138414,2353 138415,3422 138416,862 138417,509 138418,1515 138419,752 138421,1522 138422,3207 138423,264 138424,525 138425,3538 138426,215 138427,56 138428,422 138429,19010 138430,1133 138431,3804 138432,3218 138433,1749 138434,493 138435,2045 138436,3138 138437,439 138438,704 138439,5662 138440,1821 138441,1849 138441,32784 138442,1436 138443,1522 138444,1001 138445,3507 138446,5718 138447,518 138448,63 138449,6068 138450,907 138451,1715 138452,1326 138453,192 138454,717 138455,301 138456,1181 138457,14797 138458,1392 138459,795 138460,3182 138461,3194 138462,6955 138463,2620 138464,72 138465,158 138466,138467 138466,144690 138468,422 138469,1877 138470,175 138471,147 138471,158 138471,1458 138471,118336 138472,147 138472,158 138472,663 138472,1458 138472,118336 138473,298 138474,422 138475,56 138476,968 138477,81 138478,2979 138479,113156 138480,1010 138481,8180 138482,372 138483,346 138484,720 138485,1634 138486,1007 138487,72 138488,333 138489,957 138489,1815 138490,1085 138491,107 138492,58 138493,994 138494,46 138495,72 138496,1240 138497,393 138498,779 138499,72 138500,622 138501,1590 138502,388 138503,285 138504,631 138505,2205 138505,33424 138506,111 138507,1181 138508,1149 138509,2699 138510,1608 138511,1167 138512,919 138513,1722 138514,392 138515,422 138516,56 138517,592 138518,1282 138519,4771 138520,1707 138521,1359 138522,8270 138523,1210 138524,255 138525,9001 138526,72 138527,1309 138528,138529 138530,1381 138531,200 138532,58 138533,994 138534,46 138535,195 138536,422 138537,483 138538,58 138539,994 138540,46 138541,72 138542,72 138543,422 138544,56 138545,8270 138546,2574 138547,422 138548,138549 138550,138551 138552,147 138555,138556 138555,175790 138557,298 138557,714 138557,1118 138557,1313 138557,1939 138557,2205 138557,3538 138557,24763 138557,33424 138557,33611 138558,1608 138559,138560 138561,138560 138562,138563 138564,192 138565,602 138566,422 138567,56 138568,8270 138569,452 138569,497 138569,918 138569,1655 138570,138571 138572,83 138573,861 138574,138575 138576,273 138577,138 138577,200 138578,602 138579,138580 138581,138582 138581,148189 138583,19010 138584,589 138584,631 138584,1001 138585,393 138586,135 138587,431 138587,1085 138587,2296 138587,2590 138588,805 138589,138590 138591,1140 138591,5547 138592,30 138593,779 138594,72 138595,30 138596,138597 138598,30 138599,138600 138601,138602 138603,72 138606,72 138608,255 138609,994 138610,994 138612,138613 138614,138613 138615,138616 138615,190656 138618,30 138619,264 138619,1659 138619,2979 138620,138621 138622,30 138623,30 138624,58 138625,46 138626,994 138627,233 138628,30 138629,366 138630,355 138631,217 138632,366 138633,209 138634,366 138635,366 138636,366 138637,718 138637,893 138638,138639 138640,30 138641,30 138642,138643 138642,140833 138642,146566 138644,1238 138645,138646 138648,602 138649,1425 138650,392 138651,994 138652,58 138653,46 138655,872 138656,1837 138657,138658 138659,1381 138659,191860 138660,1509 138661,1608 138662,1381 138662,1893 138663,202 138664,136072 138666,264 138666,1381 138666,1509 138666,191860 138667,1452 138668,171 138669,138670 138671,640 138672,56 138673,422 138674,149 138677,557 138678,557 138679,46 138679,58 138682,118336 138683,1359 138686,259 138686,392 138686,577 138686,697 138686,726 138686,788 138686,902 138686,1070 138686,1105 138686,1805 138686,6646 138686,13302 138686,25398 138686,28282 138686,33728 138686,48078 138686,53286 138686,54493 138686,57143 138686,67395 138686,77566 138686,83845 138686,127158 138686,132992 138686,134290 138686,138686 138686,138713 138686,140460 138686,140829 138686,141819 138686,141846 138686,142758 138686,144231 138686,147500 138686,147507 138686,147524 138686,147544 138686,147554 138686,147566 138686,147974 138686,148008 138686,148035 138686,148056 138686,148057 138686,148069 138686,148070 138686,148071 138686,148072 138686,148248 138686,148253 138686,148278 138686,148280 138686,148282 138686,148283 138686,148437 138686,148449 138686,148450 138686,148455 138686,148458 138686,148464 138686,148465 138686,148467 138686,150151 138686,158981 138686,160320 138686,160870 138686,165683 138686,165717 138686,166981 138686,167709 138686,167716 138686,168330 138686,168956 138686,171567 138686,171584 138686,171589 138686,171593 138686,171737 138686,171760 138686,172511 138686,172731 138686,173708 138686,174504 138686,174510 138686,174518 138686,174532 138686,175219 138686,175298 138686,175301 138686,175311 138686,175410 138686,175939 138686,176839 138686,179156 138686,187483 138686,192522 138686,193276 138686,215420 138686,215879 138686,216118 138686,216126 138686,224263 138686,226462 138686,228435 138686,229792 138686,230487 138686,243649 138686,250526 138687,515 138688,178 138689,1149 138690,850 138691,30 138692,195 138693,19010 138694,309 138694,310 138694,55849 138695,647 138696,146 138697,344 138698,1564 138699,79 138700,808 138701,115474 138702,388 138703,30 138704,292 138705,146 138706,647 138707,344 138708,893 138709,63 138710,195 138711,30 138712,227 138712,1635 138712,2421 138712,2750 138712,8855 138713,138686 138714,175 138715,298 138716,138717 138721,795 138722,850 138723,1983 138724,30 138725,994 138726,147 138726,158 138726,178 138727,996 138728,1220 138728,1222 138729,252 138730,251 138732,3623 138733,83 138734,298 138735,485 138736,248 138736,1631 138737,1363 138739,1509 138740,310 138741,1858 138742,1860 138744,292 138745,422 138746,422 138747,314 138748,422 138749,422 138750,575 138751,195 138752,71 138753,138754 138753,139789 138753,139834 138753,140600 138753,140933 138753,140991 138753,141055 138753,141084 138753,141721 138753,141955 138753,142128 138753,142132 138753,143232 138753,143431 138753,150443 138755,68 138756,17897 138758,1544 138763,868 138763,1345 138766,2315 138767,136 138768,422 138769,56 138770,1858 138771,1860 138772,138773 138774,1608 138776,868 138776,9029 138777,1858 138778,1860 138779,146 138780,647 138781,344 138782,356 138782,1888 138783,349 138783,356 138784,175 138785,481 138786,298 138787,770 138788,138789 138790,422 138791,56 138792,215 138793,151 138794,673 138795,592 138795,138795 138795,165739 138795,166489 138796,22 138797,206 138797,620 138797,1181 138798,138799 138800,408 138801,1323 138802,102 138803,1326 138804,138805 138806,85354 138807,3724 138808,344 138809,58 138810,994 138811,46 138812,138813 138814,1181 138815,146 138816,682 138816,42064 138816,72439 138817,349 138817,1769 138819,1805 138819,1860 138820,30 138821,22 138823,972 138825,252 138825,1220 138825,1222 138826,697 138827,195 138828,195 138829,217 138829,861 138831,147 138831,149 138831,171 138831,89035 138832,72 138833,577 138834,22 138835,46 138836,58 138837,994 138839,138840 138839,178455 138841,994 138842,58 138843,46 138844,309 138844,310 138846,392 138847,1149 138849,422 138850,56 138851,81070 138852,171 138853,515 138854,515 138855,467 138856,22 138857,30 138858,111 138860,406 138861,1363 138862,1983 138865,30 138866,1220 138866,1222 138867,206 138868,794 138869,298 138870,485 138871,3111 138872,138873 138875,147 138876,779 138876,68069 138876,141912 138877,536 138877,1417 138878,918 138879,255 138880,392 138880,3260 138881,406 138882,4355 138883,23783 138885,138886 138887,138888 138889,957 138891,30 138892,146 138893,647 138894,344 138895,31977 138895,138896 138895,143660 138897,15 138898,66297 138898,178576 138899,1132 138900,30 138902,8854 138903,175 138905,346 138906,298 138907,30 138908,2944 138909,55849 138910,30 138911,55849 138912,393 138913,1007 138915,389 138915,1353 138916,1688 138917,907 138918,30 138919,516 138919,1220 138919,1222 138920,422 138921,56 138922,1776 138923,30 138924,138925 138926,957 138927,1052 138927,2626 138928,138929 138930,949 138931,392 138932,30 138933,72 138934,200 138934,328 138935,314 138936,467 138936,818 138937,30 138938,1359 138941,406 138942,1220 138942,1222 138943,251 138944,252 138945,138946 138947,30 138948,1220 138948,1222 138949,252 138950,251 138951,30 138952,30 138955,3623 138956,516 138957,68069 138958,30 138959,30 138960,206 138961,55849 138962,557 138963,536 138964,435 138965,875 138966,406 138967,1888 138969,422 138970,56 138971,346 138972,30 138973,138974 138975,358 138976,30 138977,994 138978,147 138978,206 138978,80266 138979,346 138980,557 138981,8719 138982,138 138983,865 138984,557 138985,137 138986,118 138986,4597 138987,88820 138988,30 138989,175 138990,500 138991,1882 138992,1962 138993,1052 138994,2775 138995,54 138996,1010 138996,1122 138997,298 138998,8270 138999,225 139002,1212 139003,1707 139004,79 139004,358 139007,146 139008,647 139009,344 139011,332 139012,151 139013,424 139014,2443 139015,79 139016,609 139018,139019 139018,142777 139020,932 139021,332 139022,1368 139023,2367 139024,392 139024,697 139024,918 139026,8884 139027,801 139029,56 139030,422 139031,346 139032,525 139034,16153 139035,4545 139035,139010 139036,1309 139037,139038 139039,631 139040,294 139041,30 139042,139043 139044,30 139046,957 139047,346 139050,1085 139051,483 139052,139053 139054,139055 139056,1001 139057,516 139057,1370 139058,30 139059,252 139059,1220 139059,1222 139060,1849 139060,32784 139061,589 139062,1001 139063,139064 139065,30 139066,192 139067,30 139068,1007 139069,139070 139071,139070 139072,139070 139073,10 139074,366 139075,1181 139076,10 139077,779 139078,344 139079,72 139080,285 139081,233 139082,346 139083,355 139084,285 139085,344 139086,72 139088,3260 139090,957 139091,139092 139093,139094 139093,141161 139095,1001 139095,2205 139095,33424 139096,139097 139098,298 139099,485 139100,104 139101,30 139103,139104 139106,481 139108,139109 139110,83 139111,104 139111,137 139111,1282 139112,687 139113,647 139114,146 139115,344 139117,2048 139118,306 139118,307 139119,83 139121,5102 139122,72 139123,344 139124,285 139125,1707 139126,408 139127,1323 139128,102 139129,1326 139130,779 139131,1370 139132,58 139133,994 139134,46 139135,1858 139136,1860 139137,206 139137,80266 139138,16153 139139,30 139140,44 139141,450 139142,7757 139143,1608 139144,22 139145,333 139146,4611 139147,217 139148,30 139149,30 139150,422 139151,56 139152,22 139153,481 139153,731 139154,58 139155,1102 139156,158 139157,809 139158,2367 139159,1983 139160,139161 139163,30 139164,1181 139165,346 139167,1983 139168,139169 139170,146 139171,1849 139171,32784 139172,72 139173,920 139173,949 139173,3769 139174,240 139175,30 139176,934 139176,949 139176,2744 139177,72 139178,160 139179,139180 139181,1983 139182,2574 139183,16153 139184,116 139184,2087 139185,138 139186,2674 139187,139188 139189,139190 139191,481 139192,1381 139193,1858 139194,1860 139195,457 139195,535 139195,918 139195,1655 139196,957 139197,139198 139199,602 139200,483 139201,760 139202,72 139203,602 139205,602 139206,139207 139208,146 139209,647 139210,344 139211,366 139212,1181 139214,1531 139215,139216 139217,146 139218,647 139219,344 139220,139221 139222,55849 139223,79 139224,83 139225,83 139226,139227 139228,1392 139228,1745 139229,139230 139231,139232 139233,139234 139235,2506 139236,30 139237,19010 139238,30 139239,139240 139239,181426 139241,139242 139244,30 139247,366 139248,366 139249,30 139251,233 139252,139253 139254,107 139255,2416 139255,2417 139256,292 139257,338 139258,30 139259,298 139260,1133 139261,3538 139262,355 139263,602 139264,602 139265,9007 139266,500 139267,366 139268,1118 139270,63 139271,22 139272,481 139273,718 139274,481 139275,918 139276,30 139277,171 139278,30 139279,861 139280,21442 139281,195 139282,30 139283,139284 139285,957 139286,55849 139287,149 139288,957 139289,783 139290,30 139291,957 139292,30 139293,72 139294,344 139295,285 139296,372 139297,30 139298,994 139299,30 139300,344 139301,72 139302,285 139303,9001 139304,358 139305,171 139306,2506 139307,139308 139307,142727 139307,144736 139307,151261 139309,920 139310,872 139311,872 139312,139313 139314,344 139315,72 139316,285 139317,30 139318,30 139319,287 139320,957 139321,631 139322,72 139323,285 139324,344 139325,30 139326,920 139326,1634 139327,957 139328,957 139329,6068 139330,483 139331,240 139332,309 139332,310 139333,34 139333,35 139334,30 139335,149 139336,1262 139337,957 139338,957 139339,957 139340,344 139341,285 139342,72 139343,957 139344,957 139345,957 139346,957 139347,30 139348,139349 139350,6303 139351,30 139352,30 139355,30 139356,72 139357,139358 139357,144406 139359,30 139360,2797 139361,32 139362,72 139363,344 139364,285 139365,30 139366,515 139367,366 139368,79 139369,957 139370,83 139371,422 139372,56 139373,302 139374,957 139375,389 139376,219 139377,843 139377,4545 139377,56150 139377,139010 139378,957 139379,248 139380,957 139381,957 139382,30 139383,30 139384,557 139386,557 139387,557 139388,68069 139389,1298 139389,1749 139390,30 139391,731 139392,1220 139392,1222 139393,850 139394,344 139395,72 139396,285 139397,392 139398,107 139399,718 139400,516 139401,83 139402,139403 139402,144453 139404,56 139405,422 139406,422 139407,56 139409,139410 139411,422 139412,422 139413,422 139414,422 139415,422 139416,422 139417,422 139418,422 139419,422 139420,422 139421,422 139422,422 139423,147 139424,139425 139426,72 139427,344 139428,285 139429,30 139430,957 139431,30 139433,139434 139435,366 139436,278 139437,32 139437,202 139437,283 139437,323 139437,392 139437,455 139437,536 139437,577 139437,623 139437,874 139437,949 139437,1201 139437,1274 139437,1454 139437,1644 139437,1722 139437,2266 139437,2671 139437,2784 139437,2931 139437,7092 139438,158 139439,1019 139440,1837 139441,30 139442,292 139443,366 139444,34 139444,35 139445,294 139446,30 139447,30 139448,296 139449,298 139451,139451 139452,30 139454,139455 139456,233 139457,1983 139458,72 139459,344 139460,285 139462,1238 139463,314 139464,2105 139466,1452 139467,355 139468,139469 139470,872 139471,1858 139472,1860 139475,30 139476,55849 139477,58 139478,2312 139479,58 139480,697 139481,644 139482,827 139483,827 139484,139485 139486,30 139487,134 139488,292 139489,980 139490,55849 139491,139492 139493,1417 139494,579 139494,1257 139495,818 139495,127158 139496,79 139497,4545 139497,56150 139497,139010 139499,500 139500,366 139501,433 139502,272 139503,920 139504,147 139504,158 139504,206 139504,406 139504,1515 139505,30 139506,392 139507,344 139508,285 139509,72 139510,255 139511,602 139513,481 139514,516 139517,1556 139518,602 139519,137 139520,718 139521,195 139522,106 139522,134 139522,1119 139522,1745 139522,2156 139522,2205 139522,33424 139523,827 139524,58 139527,760 139528,289 139528,290 139528,94134 139530,1515 139531,408 139532,932 139533,302 139534,602 139535,83 139536,1983 139538,5358 139538,14352 139539,309 139539,310 139539,536 139540,149 139541,4611 139542,1072 139543,1285 139544,4222 139545,433 139545,934 139546,22 139547,647 139548,146 139549,344 139550,302 139550,489 139550,579 139550,687 139550,811 139550,818 139550,861 139550,893 139550,1556 139550,2116 139553,332 139555,752 139556,344 139557,72 139558,285 139559,794 139561,22 139563,1070 139565,3069 139566,527 139566,743 139567,63 139568,44 139570,83 139570,467 139570,694 139570,1181 139570,1623 139570,3623 139570,136014 139571,372 139572,1118 139573,873 139574,647 139575,146 139576,344 139578,59021 139579,515 139580,146 139581,647 139582,344 139583,596 139584,702 139585,30 139586,346 139588,30 139590,1983 139591,273 139591,1132 139592,1276 139593,2205 139593,33424 139594,140 139595,647 139596,146 139597,344 139599,22482 139600,996 139601,366 139602,366 139603,366 139604,1177 139604,2210 139606,577 139607,139608 139609,72 139610,344 139611,285 139613,46 139614,1085 139615,1359 139616,2989 139616,2991 139617,4545 139617,139010 139618,139619 139620,417 139621,3507 139622,30 139623,5440 139624,457 139624,1267 139626,259 139627,843 139628,22 139629,3585 139630,4691 139631,22 139632,25 139632,33 139632,40 139632,60 139632,117 139632,1255 139632,1432 139632,1775 139632,2469 139632,2674 139632,2712 139632,4079 139632,5871 139632,9539 139632,44244 139632,154690 139633,920 139633,1805 139634,1326 139635,663 139636,392 139637,392 139639,139640 139641,818 139641,127158 139642,843 139643,994 139644,30 139645,2620 139646,932 139647,579 139647,2373 139648,137 139650,406 139651,1368 139652,130 139652,315 139652,372 139652,1285 139652,1888 139652,2989 139652,2991 139653,79 139654,30 139655,79 139656,139657 139658,663 139659,240 139661,41 139662,139663 139664,30 139665,30 139666,1688 139667,557 139668,22 139669,72 139670,483 139671,306 139671,307 139672,30 139673,146 139674,647 139675,344 139676,994 139677,58 139678,46 139679,994 139680,1370 139681,139682 139683,139684 139685,222 139685,2989 139685,2991 139686,30 139688,34 139688,35 139688,222 139688,283 139688,389 139688,536 139688,657 139688,781 139688,949 139688,1019 139688,1072 139688,1467 139688,1718 139688,1881 139688,2266 139688,2671 139688,2784 139688,4594 139688,5976 139688,6888 139688,29475 139688,42232 139689,83 139689,130 139689,305 139689,489 139689,668 139689,805 139689,941 139689,1058 139689,1096 139689,1147 139689,1479 139689,1837 139689,2704 139689,3218 139689,3769 139689,6487 139690,34 139690,35 139690,536 139690,949 139691,515 139691,818 139692,1117 139693,58 139694,1608 139695,760 139695,1149 139696,636 139697,151 139699,32751 139701,809 139702,372 139703,139704 139705,994 139706,346 139707,30 139708,200 139709,227 139710,134 139711,140 139712,1001 139713,22 139714,1466 139715,6955 139716,516 139717,652 139718,247 139719,1289 139720,1579 139721,861 139722,10 139722,68 139722,94 139722,111 139722,119 139722,195 139722,227 139722,309 139722,310 139722,315 139722,323 139722,420 139722,442 139722,452 139722,473 139722,489 139722,510 139722,704 139722,818 139722,1001 139722,1052 139722,1085 139722,1659 139722,1715 139722,1776 139722,1893 139722,2209 139722,2626 139722,2787 139722,3039 139722,3041 139722,4039 139722,4453 139722,5213 139722,6051 139722,6955 139722,32475 139722,54264 139723,72 139724,285 139725,344 139726,392 139727,175 139728,298 139729,30 139730,425 139731,298 139732,485 139733,500 139734,251 139735,920 139736,1608 139737,7 139738,30 139739,48 139740,130 139741,485 139742,298 139743,1871 139744,48 139745,752 139745,9024 139746,22 139747,536 139747,44725 139748,285 139748,392 139748,433 139748,623 139748,1181 139748,1590 139748,1644 139748,1805 139748,68069 139748,92476 139749,10 139749,2574 139750,2224 139751,1564 139753,346 139756,158 139757,994 139758,10 139758,2574 139759,68069 139760,1119 139760,48505 139761,139762 139763,5265 139764,364 139765,808 139765,6955 139766,139767 139769,139770 139771,2574 139772,1639 139773,139774 139775,31977 139776,171 139777,602 139778,139779 139780,1707 139781,415 139783,344 139784,285 139785,72 139786,481 139787,852 139788,8854 139790,139791 139792,30 139793,1210 139794,602 139795,2083 139796,83 139797,406 139798,30 139799,9015 139800,557 139801,493 139803,435 139804,861 139805,843 139806,72 139807,139808 139809,1590 139810,149 139811,30 139813,30 139814,3623 139815,392 139816,139817 139818,72 139819,994 139820,298 139821,72 139822,3999 139823,422 139824,422 139825,422 139826,422 139827,422 139828,422 139829,422 139830,422 139831,467 139831,1590 139832,919 139833,32 139835,1515 139837,139838 139839,139838 139840,139838 139841,139838 139842,139838 139843,139838 139844,139838 139845,139838 139846,602 139847,31977 139847,140171 139848,714 139849,527 139849,581 139850,536 139851,139852 139851,145292 139851,219527 139853,366 139854,2620 139855,366 139856,366 139857,366 139858,1749 139859,59021 139859,60576 139861,255 139862,920 139863,1181 139864,1556 139865,139866 139865,160144 139867,30 139868,30 139869,139870 139869,141243 139869,141768 139869,185815 139869,217107 139869,217263 139869,234203 139869,235137 139869,246782 139871,30 139872,139873 139874,310 139875,843 139876,175 139876,1773 139877,431 139877,631 139877,44725 139878,346 139879,1458 139880,1012 139880,1122 139880,1849 139880,32784 139881,389 139882,139883 139882,150938 139884,30 139885,640 139886,862 139887,2411 139888,30 139889,294 139890,657 139892,1821 139893,1801 139894,139895 139896,602 139897,406 139898,6837 139900,30 139901,298 139902,485 139903,299 139904,2116 139905,843 139906,516 139907,2266 139908,309 139908,310 139909,1847 139911,233 139912,602 139913,103860 139915,30 139916,139917 139919,167 139919,775 139920,139921 139922,139923 139924,5213 139925,298 139926,485 139927,264 139927,861 139928,657 139928,762 139929,849 139929,9457 139930,118 139930,4597 139931,119 139932,139933 139934,298 139935,485 139938,718 139939,1402 139940,2411 139941,30 139942,3367 139943,240 139943,1818 139944,298 139945,485 139947,433 139948,422 139949,1181 139950,6506 139951,717 139953,72 139954,72 139954,225 139954,248 139954,296 139954,358 139954,383 139954,509 139954,850 139954,1052 139954,1179 139954,1332 139954,1722 139954,1893 139954,1939 139954,3538 139954,3695 139954,5405 139955,1634 139956,1566 139957,83 139958,1010 139959,1522 139960,56 139961,422 139962,72 139964,1983 139966,5667 139967,1118 139968,481 139969,4545 139969,139010 139970,273 139971,139972 139973,588 139973,590 139974,3079 139975,1118 139976,392 139976,433 139977,1118 139978,10 139979,893 139980,1419 139981,1285 139982,358 139983,302 139985,2312 139986,422 139988,875 139989,3623 139990,3623 139991,875 139992,4455 139994,298 139994,818 139994,44725 139994,178576 139995,1893 139996,994 139997,46 139998,58 139999,714 140000,1893 140001,233 140001,301 140001,525 140001,1235 140002,5405 140003,1893 140004,104 140005,557 140006,784 140007,209 140008,248 140008,1332 140009,22 140010,779 140010,68069 140011,1564 140012,408 140013,1323 140014,102 140015,1326 140016,690 140017,1425 140018,209 140019,1262 140021,217 140021,932 140021,1010 140022,30 140023,298 140024,1012 140025,1807 140026,4611 140027,623 140028,175 140029,298 140031,1070 140032,285 140033,425 140034,1085 140035,1564 140036,1127 140037,920 140038,697 140038,2620 140039,994 140040,7155 140041,269 140043,3695 140045,44 140046,147 140047,932 140048,818 140050,1544 140051,15119 140053,1058 140055,283 140055,313 140055,455 140055,657 140055,1019 140055,2421 140055,2424 140055,5192 140055,7768 140055,20757 140055,115474 140056,167 140056,1849 140056,5301 140056,32784 140057,1130 140058,718 140059,515 140060,1220 140060,1222 140061,252 140062,251 140063,72 140065,720 140066,30 140067,72 140069,1181 140070,1132 140071,994 140073,980 140074,392 140075,2209 140076,640 140077,1983 140080,2353 140081,1644 140082,3367 140085,104 140086,240 140087,134 140088,163 140089,55849 140090,1411 140092,289 140092,290 140092,94134 140092,144988 140094,623 140094,1805 140095,397 140095,592 140095,1818 140096,140097 140099,346 140100,440 140100,694 140100,1284 140101,206 140102,127158 140103,515 140104,206 140105,140106 140107,140108 140109,140108 140110,140108 140111,140108 140112,140108 140113,55849 140114,1014 140115,167 140115,1284 140116,1284 140118,2224 140119,346 140121,136072 140122,178 140122,315 140122,622 140122,1033 140123,1858 140124,18831 140125,30 140126,30 140127,356 140127,577 140127,852 140128,175 140129,298 140130,55849 140131,663 140135,392 140136,481 140137,1749 140138,217 140138,536 140138,1417 140139,301 140140,2224 140141,15119 140143,1149 140144,1968 140145,1612 140146,875 140147,3623 140148,140149 140150,1612 140151,1392 140152,515 140153,841 140154,217 140155,344 140156,72 140157,285 140158,30 140160,994 140161,46 140162,58 140163,1010 140164,298 140165,485 140166,483 140167,406 140168,301 140168,467 140169,79 140170,7360 140172,1001 140173,1983 140174,1411 140176,135 140177,920 140178,240 140179,222 140179,1415 140181,406 140181,779 140182,406 140183,557 140184,72 140185,885 140185,13704 140186,267 140187,140 140188,872 140189,1058 140190,872 140191,435 140192,907 140193,301 140194,2574 140195,873 140195,874 140196,2421 140197,13485 140198,56 140199,422 140200,255 140201,358 140203,843 140204,171 140205,422 140206,56 140207,79 140207,1181 140210,30 140211,1983 140212,255 140213,403 140214,106 140215,417 140216,171 140217,994 140218,2116 140219,872 140220,1177 140220,6263 140221,1116 140223,255 140225,278 140226,577 140227,4611 140228,8854 140229,160 140229,707 140230,30 140231,1707 140231,20004 140232,22 140233,72 140234,72 140235,22 140236,872 140237,72 140238,323 140239,72 140240,1556 140241,30 140242,2590 140243,72 140244,140245 140247,640 140247,3695 140248,1659 140249,30236 140250,207 140251,140252 140253,140252 140254,306 140254,307 140255,22 140256,140257 140258,392 140259,140260 140261,872 140262,1429 140263,668 140264,140265 140266,22 140267,217 140267,1417 140268,602 140271,1143 140272,7416 140273,310 140274,113156 140275,269 140276,113156 140277,140278 140279,366 140280,72 140281,827 140282,251 140283,140284 140285,1818 140286,233 140287,140288 140287,145288 140287,156789 140287,158089 140291,31977 140294,3 140295,1388 140295,142430 140295,142473 140296,355 140297,515 140298,22 140299,222 140300,872 140301,140302 140303,140304 140305,626 140306,59021 140307,3724 140308,808 140308,6424 140308,212914 140309,207 140309,693 140310,298 140311,485 140312,647 140313,596 140314,602 140316,911 140318,811 140319,4355 140320,808 140321,140322 140323,140322 140324,1181 140325,137 140325,138 140326,1359 140327,72 140329,718 140330,557 140331,1298 140332,1844 140333,1224 140333,3507 140334,72 140335,422 140336,344 140338,309 140338,310 140339,920 140340,3193 140342,222 140342,389 140342,455 140342,657 140343,302 140344,422 140345,422 140346,422 140347,422 140348,422 140349,422 140350,422 140351,422 140352,422 140353,37 140356,3182 140358,328 140359,140360 140359,141667 140361,298 140362,485 140363,872 140364,818 140366,140367 140368,30 140369,1414 140371,30 140373,1019 140374,140375 140376,332 140378,536 140379,1284 140380,4571 140381,200 140382,140383 140385,481 140386,779 140387,195 140388,3623 140390,77 140391,304 140392,775 140393,1417 140394,79 140395,439 140396,175 140397,72 140398,58 140399,298 140400,2017 140401,1238 140402,309 140402,310 140403,309 140403,310 140404,124668 140405,35750 140405,35751 140406,58 140407,1452 140408,1509 140409,663 140410,775 140411,138 140412,16153 140413,116 140413,2087 140414,2674 140417,83 140418,72 140419,113156 140420,433 140421,140422 140423,622 140424,200 140424,2443 140425,292 140427,356 140427,852 140428,408 140429,1323 140430,1326 140431,102 140432,657 140432,6506 140434,671 140435,79 140435,202 140435,251 140435,252 140435,516 140435,1181 140435,1220 140435,1222 140435,1243 140436,811 140437,994 140438,1715 140439,136 140440,920 140441,779 140442,920 140443,920 140444,1556 140445,1893 140446,920 140447,1140 140447,5547 140448,663 140449,957 140449,1815 140450,44 140451,4611 140452,7768 140452,37088 140453,1181 140455,31073 140456,1782 140457,209 140458,167 140459,200 140460,79 140460,389 140460,676 140460,138686 140461,209 140462,2989 140462,2991 140463,3218 140464,6027 140465,22293 140466,140467 140468,3623 140469,264 140469,1289 140470,56 140471,83 140472,83 140473,779 140474,406 140475,30331 140476,140477 140478,140477 140479,1007 140480,3623 140481,579 140484,146 140485,647 140486,344 140488,1707 140489,422 140490,56 140492,58 140493,366 140494,1400 140495,366 140496,602 140497,1085 140498,893 140499,422 140500,56 140502,1127 140504,2775 140505,447 140506,5101 140507,772 140508,2775 140509,447 140511,289 140511,290 140511,304 140511,4411 140511,94134 140513,515 140514,30 140515,30 140516,1118 140517,3623 140518,663 140519,718 140520,949 140520,208669 140521,663 140522,22 140523,68 140524,200 140525,3623 140528,602 140529,3623 140530,1359 140531,873 140532,200 140533,3623 140534,1149 140535,175 140537,298 140538,861 140539,207 140540,809 140542,875 140543,875 140544,111142 140545,147 140546,3623 140548,644 140549,72 140550,7092 140551,175 140552,602 140553,920 140554,72 140555,240 140556,1402 140557,255 140558,79 140559,1127 140560,592 140561,835 140562,2506 140563,298 140564,485 140565,298 140566,485 140567,392 140568,920 140569,99 140569,1363 140569,1465 140569,13361 140569,148742 140570,485 140571,298 140572,298 140573,485 140574,485 140575,298 140576,298 140577,485 140578,392 140580,138 140581,116 140581,2087 140582,16153 140583,2674 140584,4611 140585,2979 140586,1707 140587,602 140588,115474 140589,972 140590,72 140592,140593 140594,240 140595,577 140596,557 140597,7360 140599,104 140601,19010 140602,366 140603,366 140604,366 140605,366 140606,366 140607,366 140608,920 140609,2590 140610,140611 140612,140613 140614,435 140615,207 140616,140617 140618,872 140619,1429 140620,2995 140621,2617 140622,255 140623,668 140624,1634 140625,304 140626,140627 140628,31977 140629,7155 140630,140 140632,140633 140636,233 140637,714 140638,140639 140640,140639 140641,140642 140643,140644 140643,141673 140643,142585 140645,1143 140647,6506 140648,140649 140650,217 140650,1417 140651,1882 140652,355 140653,356 140653,852 140654,602 140654,1425 140655,602 140656,1465 140658,140659 140660,140661 140662,140661 140666,44725 140667,422 140668,422 140669,422 140670,422 140671,422 140672,422 140673,422 140674,422 140675,422 140676,422 140677,422 140678,422 140680,30 140681,75912 140682,140683 140684,2443 140686,392 140686,697 140686,1769 140687,2105 140689,2557 140691,1631 140692,743 140692,8714 140694,408 140694,1326 140698,140699 140703,83 140704,623 140704,1805 140705,1231 140706,83 140709,83 140710,72 140712,140713 140714,1204 140716,481 140717,433 140718,875 140719,118 140719,4597 140720,442 140721,497 140722,151 140723,298 140724,485 140725,1122 140726,136 140727,634 140728,980 140730,393 140731,175 140732,298 140733,1849 140733,32784 140734,2671 140735,252 140735,415 140735,1454 140736,809 140737,259 140738,111 140739,1556 140740,83 140741,1300 140742,1556 140743,4223 140744,200 140746,808 140748,918 140749,6506 140750,388 140751,1893 140752,652 140753,79 140754,920 140755,634 140757,663 140758,5034 140761,485 140762,298 140763,408 140764,1323 140765,1326 140766,102 140767,455 140768,1252 140768,1253 140769,298 140770,485 140771,509 140771,510 140772,827 140773,104 140773,134 140773,137 140773,138 140773,205627 140774,1782 140775,113156 140776,1612 140779,392 140780,222 140781,56 140781,2244 140782,310 140783,1707 140784,1707 140786,292 140787,1167 140787,5718 140788,596 140789,392 140790,861 140792,30 140793,872 140795,859 140796,581 140797,309 140797,310 140798,206 140798,2105 140799,3623 140800,140801 140802,309 140802,310 140803,309 140803,310 140804,44 140805,949 140806,26041 140807,1305 140808,273 140808,313 140809,4545 140809,139010 140810,309 140810,310 140812,140813 140814,450 140816,22 140817,779 140819,30 140820,140821 140822,58 140823,994 140824,46 140825,875 140826,1192 140827,714 140829,1130 140829,138686 140830,22 140831,663 140832,278 140832,2421 140834,258 140834,72439 140835,663 140836,163 140837,30 140839,30 140840,1252 140840,1253 140841,309 140841,310 140842,586 140843,14126 140844,663 140845,1564 140846,358 140847,328 140848,1298 140849,1515 140850,455 140851,636 140852,34 140852,35 140853,586 140854,3804 140855,30331 140856,2989 140856,2991 140857,1466 140858,294 140858,2620 140859,631 140860,1274 140861,392 140862,261 140862,493 140862,2045 140863,217 140864,140865 140866,333 140867,875 140868,5440 140869,217 140870,440 140871,1579 140872,247 140873,217 140874,79 140875,1 140875,184 140876,1467 140877,30 140878,393 140879,136 140879,137 140880,9001 140881,1359 140882,3623 140883,283 140884,10 140884,222 140884,446 140885,697 140886,827 140887,2116 140888,875 140889,1465 140890,2353 140891,192 140892,175 140893,298 140894,516 140895,219 140896,1984 140897,79 140898,1522 140899,22 140900,602 140901,1836 140902,538 140903,808 140904,10 140905,149 140906,1298 140907,140908 140909,140908 140910,885 140910,13704 140911,718 140912,140913 140914,406 140915,483 140916,192 140917,200 140917,332 140917,1177 140918,557 140919,1016 140920,140921 140922,140923 140924,140925 140926,79 140927,1235 140927,1335 140928,107 140928,240 140928,1462 140928,8537 140929,83 140930,358 140931,697 140932,872 140934,41 140934,68 140934,240 140934,294 140934,631 140934,760 140934,805 140934,1119 140934,1285 140934,2995 140934,3135 140935,949 140936,770 140937,2116 140938,392 140939,1252 140939,1253 140940,1224 140943,577 140944,140945 140946,140945 140947,602 140948,602 140949,140950 140951,862 140951,907 140952,171 140953,920 140954,298 140955,485 140956,140957 140958,10 140959,364 140961,140962 140961,141025 140961,141484 140961,141611 140961,145799 140961,213896 140961,218101 140961,257854 140961,259305 140961,265037 140963,140964 140965,140966 140967,140966 140968,207 140969,140970 140971,140972 140973,872 140974,1429 140975,310 140976,10 140977,289 140977,290 140977,2205 140977,2296 140977,33424 140977,94134 140978,140979 140980,668 140981,140982 140983,140984 140985,30 140987,140988 140989,1143 140990,697 140992,140993 140994,113156 140996,140997 140998,140999 140998,141352 141000,141001 141003,255 141004,141005 141006,72 141007,3209 141008,233 141009,366 141010,366 141011,366 141012,366 141013,366 141014,366 141015,366 141016,366 141018,355 141019,861 141021,323 141022,1238 141023,30 141024,366 141026,1452 141027,1068 141028,298 141029,485 141030,422 141031,809 141032,422 141033,422 141034,422 141035,422 141036,422 141037,422 141038,422 141039,422 141040,72 141041,422 141042,422 141043,422 141044,422 141045,298 141046,485 141047,536 141048,81 141049,33611 141050,167 141051,175 141052,298 141053,1634 141054,481 141056,83 141057,602 141059,83 141060,79 141061,248 141061,1332 141062,141063 141064,1608 141065,875 141066,141067 141066,151654 141066,195248 141066,196822 141066,198591 141066,220525 141066,236393 141066,242482 141066,243133 141066,245042 141068,217 141069,1458 141070,1298 141071,83 141071,1467 141072,602 141073,589 141073,75912 141074,1181 141075,147 141076,141077 141078,392 141079,408 141080,1326 141081,1323 141082,102 141083,2116 141085,312 141086,872 141087,510 141088,1531 141089,1149 141089,1266 141090,175 141091,298 141093,120 141094,422 141095,446 141096,3422 141097,44 141098,2116 141099,1688 141100,141101 141100,161001 141100,181232 141100,252233 141100,257349 141102,79 141103,79 141104,663 141105,1436 141107,1458 141108,596 141109,30 141111,141112 141113,3 141113,2620 141114,140 141114,1052 141114,1127 141114,1579 141114,1639 141114,1893 141114,2312 141114,3695 141114,6695 141115,3 141115,2620 141116,30 141118,312 141119,55849 141120,760 141122,68 141124,779 141125,107 141125,579 141126,141127 141128,634 141128,6298 141129,72 141130,141131 141132,1631 141133,1955 141134,141135 141136,34 141136,35 141136,83 141136,222 141136,278 141136,283 141136,389 141136,406 141136,536 141136,657 141136,694 141136,720 141136,781 141136,877 141136,907 141136,949 141136,1019 141136,1072 141136,1284 141136,1467 141136,1522 141136,1718 141136,1732 141136,1881 141136,1955 141136,2191 141136,2266 141136,2671 141136,2699 141136,2784 141136,3115 141136,3194 141136,3422 141136,4594 141136,5976 141136,6888 141136,29475 141136,42232 141137,1033 141138,141139 141138,142937 141142,1939 141144,298 141145,485 141146,141147 141148,1282 141149,301 141149,968 141150,1240 141151,663 141152,175 141153,875 141154,298 141155,333 141156,289 141156,290 141156,94134 141157,875 141158,885 141158,13704 141159,158 141159,406 141159,1181 141162,1509 141163,424 141164,141165 141166,141165 141167,2590 141168,50 141168,79 141169,255 141170,72 141171,141172 141173,1465 141174,30 141177,364 141178,422 141179,298 141179,714 141179,805 141179,2205 141179,33424 141179,136072 141179,245910 141180,206 141180,72764 141181,481 141182,422 141183,56 141184,620 141184,4611 141185,1188 141186,1085 141187,264 141188,697 141188,808 141188,1240 141188,1453 141188,2699 141188,3367 141188,24763 141189,30 141190,141191 141190,149676 141192,30 141193,1556 141194,1983 141195,875 141196,3623 141197,10 141197,273 141198,422 141199,56 141200,932 141201,141202 141203,104 141204,141205 141206,72 141207,225 141208,1707 141210,557 141211,5906 141212,626 141213,278 141214,137 141215,862 141216,557 141217,8719 141218,138 141219,865 141220,557 141221,137 141222,118 141222,4597 141223,88820 141224,171 141225,332 141226,141226 141227,30 141228,255 141229,255 141231,83 141232,68069 141233,72 141234,525 141236,1707 141237,1359 141238,1309 141239,1509 141240,631 141241,1247 141242,294 141244,8884 141245,1252 141245,1253 141246,779 141247,1117 141248,726 141248,852 141249,255 141250,141251 141250,186181 141252,1085 141253,141254 141255,30 141256,1556 141257,141258 141257,144934 141259,346 141259,873 141259,996 141259,1105 141259,1119 141259,1564 141259,1635 141259,1801 141259,1927 141259,2274 141259,2784 141259,7092 141260,141261 141262,20257 141264,30 141265,2367 141266,30 141267,30 141268,344 141269,72 141270,285 141271,141272 141273,141274 141273,154178 141275,30 141276,8373 141277,141278 141279,141278 141280,141278 141282,2334 141283,141284 141285,447 141285,1181 141286,141287 141289,141290 141291,141292 141293,483 141294,30 141295,304 141296,30 141297,30 141298,141299 141301,1 141302,141303 141304,30 141305,141306 141307,366 141308,366 141309,366 141310,366 141311,366 141312,366 141313,30 141314,30 141315,217 141315,1417 141316,1007 141318,158 141319,233 141321,54 141321,278 141321,283 141321,455 141321,1019 141321,1467 141321,1871 141321,2421 141321,6789 141321,37088 141323,55849 141324,355 141325,83 141326,31977 141326,151807 141326,207317 141326,220677 141327,141328 141327,151587 141327,156888 141329,83 141330,141331 141333,141334 141336,83 141337,141338 141341,83 141342,83 141343,141344 141343,145832 141347,861 141348,83 141349,481 141350,141351 141353,30 141354,83 141355,30 141355,99807 141356,2266 141357,1149 141358,141359 141360,994 141361,30 141362,83 141363,141364 141365,141364 141366,141364 141367,141364 141368,141364 141369,141364 141370,141371 141372,141373 141374,44 141375,30 141376,149 141376,195 141377,406 141377,127158 141379,994 141381,141382 141383,141382 141384,141382 141385,141382 141386,994 141387,141388 141390,392 141390,1001 141391,255 141392,255 141393,994 141394,141395 141394,149386 141394,151811 141396,72 141397,393 141398,141399 141400,141401 141400,142241 141402,994 141403,30 141404,636 141405,1607 141406,1359 141407,141408 141409,149 141410,72 141411,72 141412,1608 141413,141414 141415,141416 141417,129410 141418,22 141419,141420 141421,366 141422,366 141423,30 141424,141425 141426,192 141427,72 141428,72 141429,171 141430,30 141431,141432 141433,72 141434,483 141435,141436 141437,141436 141438,141439 141440,72 141441,30 141442,78400 141443,994 141444,994 141445,483 141446,141447 141448,141449 141451,602 141453,1509 141454,3260 141455,141456 141457,611 141458,3079 141459,1509 141460,3079 141461,1983 141462,141463 141464,602 141465,72 141466,1479 141467,141468 141469,390 141470,30 141471,72 141472,1983 141473,3148 141474,2989 141474,2991 141475,141476 141477,141478 141480,602 141481,135179 141483,1247 141485,602 141486,1531 141487,83 141488,106 141488,60576 141489,72 141490,151 141491,1983 141494,151 141495,141496 141497,141498 141500,258 141501,875 141502,141503 141507,663 141509,141510 141511,30 141512,141513 141514,141515 141516,141517 141518,141519 141520,104 141520,134 141520,135 141520,136 141520,137 141520,138 141520,557 141520,850 141520,1368 141520,2105 141522,30 141523,141524 141525,30 141526,1181 141527,141528 141529,141528 141531,83 141532,72 141534,107 141535,292 141536,2416 141536,2417 141537,338 141538,298 141539,1133 141540,141541 141542,3538 141543,141544 141545,355 141546,137 141549,2784 141550,83 141551,141552 141553,141552 141554,30 141555,4611 141556,83 141558,83 141559,119 141560,302 141561,83 141562,83 141563,1818 141564,567 141564,1345 141565,83 141567,83 141567,1467 141568,298 141569,485 141571,141572 141573,1983 141574,1858 141575,1860 141576,19519 141577,481 141580,298 141581,485 141582,298 141583,485 141584,3524 141586,602 141587,141588 141589,83 141592,1707 141593,141594 141595,141596 141597,1955 141597,3623 141598,141599 141600,44 141602,141603 141604,72 141605,602 141607,1241 141608,30 141609,141610 141613,1955 141614,32 141615,55849 141616,141617 141620,30 141621,48 141622,289 141622,290 141622,94134 141623,557 141624,875 141625,240 141625,127158 141626,671 141627,141628 141627,155532 141629,141630 141631,141630 141632,83 141632,1313 141633,872 141634,1374 141635,372 141635,631 141636,358 141637,141638 141639,1220 141639,1222 141639,1512 141640,141641 141642,141643 141644,55849 141645,141646 141647,141646 141648,72 141649,602 141650,141651 141652,850 141653,141654 141655,141654 141656,6424 141656,28107 141657,602 141658,602 141659,8270 141660,3623 141661,328 141662,1267 141663,850 141664,557 141665,557 141666,557 141668,141669 141670,30 141671,850 141672,50 141674,850 141675,850 141676,141677 141678,850 141679,141680 141681,1983 141682,141683 141684,141683 141685,141686 141687,141686 141688,141686 141689,141686 141690,141686 141691,141686 141692,850 141693,1983 141694,16153 141695,2674 141696,116 141696,2087 141697,138 141698,1105 141699,1294 141700,141701 141702,141703 141704,2266 141705,422 141706,422 141707,422 141708,422 141709,422 141710,422 141711,422 141712,422 141713,422 141714,422 141715,1983 141717,1983 141718,30 141719,141720 141723,602 141724,1117 141725,141726 141725,151300 141727,447 141728,2775 141729,83 141732,141733 141734,30 141735,141736 141737,10 141737,37 141737,50 141737,106 141737,147 141737,158 141737,192 141737,195 141737,267 141737,333 141737,337 141737,505 141737,586 141737,640 141737,663 141737,779 141737,872 141737,1177 141737,1370 141737,1572 141737,1985 141737,2782 141737,3148 141737,6323 141737,27217 141738,366 141739,366 141740,366 141741,30 141742,483 141743,30 141744,30 141745,200 141746,141747 141748,292 141749,294 141750,296 141751,298 141752,141753 141754,141753 141755,151 141756,141757 141758,30 141759,393 141760,2590 141761,141762 141763,1849 141763,32784 141765,141766 141767,207 141769,83 141770,14989 141771,14989 141772,14989 141773,690 141774,1381 141776,83 141777,1983 141778,1238 141779,450 141780,538 141781,141782 141783,872 141785,1429 141786,1452 141787,872 141788,200 141790,147 141790,149 141790,158 141790,178 141790,406 141790,585 141790,602 141790,622 141790,1425 141791,83 141793,1241 141794,647 141795,2574 141796,1983 141797,1782 141798,141799 141800,141799 141801,141799 141802,141799 141803,141799 141804,141799 141805,141799 141806,141799 141808,668 141810,483 141811,850 141812,149 141813,273 141815,2574 141816,136072 141817,467 141818,7698 141820,447 141822,149 141823,1243 141824,1531 141825,55849 141826,872 141827,5101 141828,1370 141829,141830 141831,1235 141831,1335 141832,433 141833,149 141833,195 141834,784 141835,392 141837,298 141838,485 141839,843 141840,278 141840,176782 141841,843 141842,30 141843,843 141845,1983 141847,602 141848,1580 141849,1127 141852,1220 141852,1222 141853,137 141854,579 141855,63 141856,22 141857,481 141859,1659 141860,760 141860,818 141860,1149 141860,1631 141860,142473 141862,30 141863,1559 141864,30 141865,30 141869,55849 141870,1531 141871,1858 141872,1860 141874,30 141875,2312 141876,2116 141877,30 141878,872 141879,1149 141880,1858 141881,1860 141882,1238 141883,217 141883,336 141883,1163 141883,1181 141883,1531 141884,872 141885,22 141886,5718 141887,671 141888,141889 141888,145279 141888,150284 141890,7698 141891,83 141893,22 141895,1556 141896,22 141897,141898 141899,141900 141901,30 141902,37 141903,668 141904,2989 141904,2991 141905,141906 141907,141906 141908,141906 141909,31977 141910,2989 141910,2991 141911,2989 141911,2991 141912,50 141912,146 141912,149 141912,175 141912,195 141912,211 141912,285 141912,328 141912,336 141912,406 141912,505 141912,620 141912,622 141912,779 141912,809 141912,841 141912,903 141912,1502 141912,1521 141912,1604 141912,2418 141912,3449 141912,4354 141912,4465 141912,4558 141912,4617 141912,5601 141912,5604 141912,5678 141912,6646 141912,13235 141912,13390 141912,14040 141912,18400 141912,18646 141912,20494 141912,24835 141912,26133 141912,29055 141912,31942 141912,32786 141912,35623 141912,38989 141912,40288 141912,43239 141912,43893 141912,46609 141912,49547 141912,49585 141912,49586 141912,49838 141912,64684 141912,68069 141912,68089 141912,70995 141912,77566 141912,79528 141912,84059 141912,86686 141912,87277 141912,88692 141912,88867 141912,90139 141912,90794 141912,92091 141912,92476 141912,93125 141912,94859 141912,95465 141912,95599 141912,95628 141912,95748 141912,96561 141912,97423 141912,100029 141912,103828 141912,106775 141912,107032 141912,107051 141912,107423 141912,107977 141912,108273 141912,108477 141912,109259 141912,109358 141912,112380 141912,116718 141912,118336 141912,122407 141912,122430 141912,122437 141912,122489 141912,122702 141912,123725 141912,126292 141912,135341 141912,136603 141912,137793 141912,141790 141912,141912 141912,143192 141912,145035 141912,147316 141912,149343 141912,150096 141912,150452 141912,152788 141912,152795 141912,152798 141912,152836 141912,152904 141912,152921 141912,153133 141912,153192 141912,154390 141912,154750 141912,155437 141912,155722 141912,156702 141912,158280 141912,158539 141912,159778 141912,164187 141912,164354 141912,165211 141912,165230 141912,165374 141912,165756 141912,165784 141912,166386 141912,166409 141912,166528 141912,167832 141912,169460 141912,171748 141912,171813 141912,176455 141912,185461 141912,187768 141912,189927 141912,191939 141912,204235 141912,207570 141912,207691 141912,211746 141912,214621 141912,219634 141912,219917 141912,221250 141912,221261 141912,221934 141912,221936 141912,222121 141912,224650 141912,224670 141912,229182 141912,230737 141912,237579 141912,237580 141912,237623 141912,238330 141912,241504 141912,243853 141912,245440 141912,247061 141912,249788 141912,253323 141912,255484 141912,255532 141912,258288 141912,259513 141912,260788 141913,779 141913,1515 141914,48 141914,1151 141915,141916 141917,225 141917,4039 141917,5405 141918,2367 141920,298 141921,485 141922,1238 141923,611 141925,30 141926,1167 141927,1289 141928,22 141929,255 141930,255 141931,175 141932,298 141933,22 141935,44 141936,30 141937,1858 141938,1860 141939,932 141940,30 141941,16153 141942,116 141942,2087 141943,2674 141944,138 141945,99 141945,779 141945,68069 141946,3756 141947,579 141948,1983 141949,2782 141950,55849 141951,1143 141952,1204 141953,663 141954,1531 141956,79 141957,2979 141958,211 141959,1119 141961,37 141962,83 141963,697 141966,141967 141968,406 141969,510 141970,1801 141975,205 141976,1127 141977,141978 141979,141978 141980,349 141981,1722 141983,255 141984,1849 141984,32784 141985,592 141985,1001 141986,247 141987,1175 141988,422 141989,422 141990,422 141991,422 141992,422 141993,422 141994,422 141995,422 141996,55849 141997,516 141997,1243 141997,206297 141998,298 141999,485 142000,1509 142001,1119 142002,349 142002,392 142002,595 142002,694 142002,1240 142002,1453 142002,1454 142002,2699 142002,3367 142002,9098 142002,24763 142003,298 142004,485 142005,127158 142007,142008 142007,153096 142009,30 142010,5440 142011,142012 142011,246895 142013,178 142015,2574 142017,1370 142018,424 142020,30 142022,994 142023,515 142024,2266 142025,4455 142026,1368 142027,3623 142028,435 142029,1849 142029,15807 142029,32784 142030,406 142031,14458 142032,356 142032,852 142032,1179 142032,6068 142033,195 142034,1 142034,83 142034,160 142034,702 142034,712 142035,72 142036,536 142037,2867 142037,2868 142038,30 142039,422 142039,602 142040,1119 142041,175 142042,455 142043,298 142045,811 142046,843 142047,424 142049,433 142051,251 142051,252 142051,577 142051,1105 142051,1220 142051,1222 142051,1429 142053,142054 142055,874 142055,1210 142056,973 142057,94 142057,116 142057,994 142057,1235 142057,2087 142058,872 142059,907 142060,3 142061,392 142062,433 142063,2274 142064,298 142065,485 142066,372 142068,142069 142071,83 142072,1515 142073,142073 142075,2989 142075,2991 142076,827 142077,973 142078,149 142079,142080 142081,483 142082,3507 142084,240 142085,142086 142087,142086 142089,142090 142091,406 142092,392 142096,30 142097,142098 142099,142100 142101,142102 142101,148645 142101,149611 142103,527 142104,30 142105,1127 142106,2379 142107,142108 142109,439 142109,1370 142109,127158 142110,142111 142112,142113 142114,142113 142116,149 142117,312 142118,142119 142120,4220 142121,3846 142122,178 142123,1955 142124,149 142125,113156 142126,1434 142127,171 142129,142130 142131,1452 142131,21982 142133,379 142134,3111 142135,1247 142136,1188 142137,142138 142137,158969 142139,142140 142141,264 142141,1381 142142,4545 142142,139010 142143,142144 142145,280 142145,17245 142146,55849 142147,422 142148,56 142149,298 142150,485 142151,149 142151,406 142152,30 142153,602 142154,142155 142156,120 142157,489 142158,142159 142160,142161 142162,113156 142163,663 142164,142165 142166,298 142167,485 142168,30 142169,3 142170,151 142171,515 142172,138 142173,116 142173,2087 142174,16153 142175,2674 142176,298 142177,485 142178,30 142179,142180 142181,647 142182,344 142183,146 142184,1381 142185,366 142186,647 142187,146 142188,344 142189,1149 142190,264 142191,142192 142193,30 142194,30 142195,30 142196,147 142197,158 142198,30 142199,255 142200,142201 142202,2590 142203,142204 142205,657 142206,30 142207,142208 142209,142210 142211,142212 142213,142214 142215,30 142216,30 142217,142218 142219,63 142220,142221 142222,142221 142225,312 142225,358 142226,602 142228,83 142231,142232 142231,152355 142234,142235 142236,1522 142237,1252 142237,1253 142238,142239 142240,30 142242,16196 142243,142244 142245,843 142246,298 142247,485 142248,355 142249,660 142250,326 142250,433 142250,934 142250,1559 142251,671 142252,147 142253,184 142254,298 142255,485 142257,1252 142257,1253 142259,222 142259,657 142260,349 142260,392 142260,433 142261,2699 142262,2073 142263,1608 142264,50 142264,595 142265,142266 142267,1509 142269,142270 142271,346 142272,142273 142274,663 142275,1849 142275,32784 142276,346 142278,481 142279,1858 142280,1860 142282,862 142282,2105 142283,41 142284,1608 142285,142286 142287,160 142287,515 142287,1298 142287,1749 142288,30 142289,1580 142290,151 142291,4760 142292,875 142293,875 142294,233 142295,4411 142296,332 142296,636 142297,422 142298,422 142299,422 142300,422 142301,422 142302,422 142303,422 142304,422 142305,422 142306,422 142307,422 142308,422 142309,1188 142310,142311 142312,167 142312,186 142312,301 142312,379 142312,717 142312,968 142312,1010 142312,1231 142312,1326 142312,1370 142312,1411 142312,1782 142312,1837 142312,2557 142312,3804 142313,83 142314,717 142315,972 142316,287 142317,10 142317,175 142318,149 142319,809 142320,344 142321,360 142321,579 142321,1298 142322,149 142323,850 142324,30 142325,175 142326,55849 142327,142328 142329,142328 142330,298 142331,72 142332,294 142333,1962 142334,481 142335,136 142335,557 142336,298 142337,485 142338,240 142338,818 142339,1722 142340,392 142340,1465 142341,360 142342,808 142343,137 142343,602 142344,136 142345,142346 142347,142346 142348,872 142349,142350 142351,358 142352,72 142353,298 142354,485 142355,900 142356,2989 142356,2991 142357,30 142358,485 142359,298 142360,30 142361,1635 142363,142364 142365,142364 142366,142364 142367,462 142367,4039 142367,5405 142368,33424 142369,298 142369,647 142369,994 142370,720 142371,30 142372,1707 142373,142374 142375,142374 142376,142374 142377,142374 142378,206 142379,1608 142380,116 142380,2087 142381,138 142382,2674 142383,16153 142384,893 142384,999 142384,1146 142385,1070 142386,30 142387,328 142388,4260 142388,142405 142388,142870 142388,148412 142388,154423 142388,178654 142389,408 142390,1323 142391,1326 142392,102 142394,850 142395,217 142395,1019 142395,1274 142396,1181 142397,305 142397,1265 142397,1266 142398,314 142399,717 142400,1010 142401,142402 142403,1149 142404,142405 142405,175 142405,4260 142406,142407 142408,142409 142408,146280 142412,298 142413,485 142414,611 142415,346 142416,158 142417,2296 142418,44 142419,1858 142420,1860 142421,30 142423,13538 142424,195 142425,142426 142429,142430 142430,142405 142430,142430 142430,142473 142430,142879 142430,147191 142431,2296 142432,142433 142434,298 142435,485 142436,142405 142436,148412 142437,30 142438,30 142440,657 142441,1019 142442,912 142442,40566 142443,356 142443,392 142443,852 142443,2699 142444,30 142445,1608 142446,104 142446,254 142446,557 142446,953 142446,954 142447,602 142448,1608 142449,390 142450,2266 142452,875 142454,390 142455,2617 142457,1858 142458,1860 142459,3474 142460,718 142461,30 142462,875 142464,3507 142464,4980 142465,406 142466,1860 142467,1858 142468,142430 142468,142473 142468,142879 142469,346 142470,3623 142471,424 142473,4260 142473,142405 142473,142430 142473,142473 142473,142879 142473,148412 142474,142430 142474,142473 142474,142879 142475,694 142476,372 142476,631 142477,175 142479,567 142479,609 142480,298 142482,30 142483,346 142484,3260 142485,1188 142485,4101 142485,13538 142486,142405 142487,907 142487,2191 142488,251 142489,850 142490,142426 142491,30 142492,907 142493,4571 142493,88820 142494,298 142495,485 142496,102560 142496,124889 142497,137 142498,298 142499,485 142500,515 142500,652 142502,30 142503,1821 142504,151 142505,58 142506,389 142506,795 142507,128103 142508,3367 142509,30 142510,994 142511,30 142512,30 142513,1635 142514,200 142514,772 142517,346 142518,30 142520,171 142521,1782 142521,5440 142522,631 142522,1635 142523,142409 142523,146280 142525,602 142526,142527 142528,142527 142529,3 142531,772 142532,1298 142533,142534 142535,1204 142536,602 142537,2334 142538,142539 142540,22 142541,509 142541,510 142541,575 142541,875 142542,1858 142543,1860 142544,142545 142547,752 142548,1544 142549,1893 142550,356 142552,34 142552,35 142552,536 142554,615 142555,779 142556,1001 142557,6068 142558,694 142559,30 142560,647 142561,146 142562,344 142563,22 142564,312 142564,1151 142564,1240 142565,941 142566,744 142567,783 142568,760 142569,1241 142569,2083 142570,20 142570,83 142570,497 142570,602 142570,142433 142571,142572 142573,536 142573,55233 142574,299 142574,6357 142575,142576 142577,142576 142578,515 142579,1983 142580,631 142581,267 142582,140 142583,424 142584,10 142586,142587 142588,1858 142589,1860 142590,4611 142592,83 142593,390 142594,37 142595,240 142596,1844 142596,142430 142596,142473 142596,142879 142597,1655 142598,557 142599,142600 142601,63 142602,483 142603,30 142604,160 142604,250 142604,310 142604,346 142604,1058 142604,1381 142604,1684 142604,3039 142604,29380 142605,113156 142606,1955 142607,1133 142608,920 142609,18831 142610,50 142610,387 142610,599 142610,2931 142610,86820 142610,115843 142610,118336 142610,142611 142610,143226 142610,149816 142610,154204 142610,156453 142610,156554 142610,157276 142610,157278 142610,157818 142610,157908 142610,157954 142610,157964 142610,158025 142610,158500 142610,158613 142610,158626 142610,158628 142610,158832 142610,158849 142610,159197 142610,159263 142610,159642 142610,159653 142610,159662 142610,159911 142610,159991 142610,160236 142610,160268 142610,160424 142610,160485 142610,161161 142610,161799 142610,162436 142610,167278 142610,168203 142610,168306 142610,168468 142610,168603 142610,168968 142610,170244 142610,170266 142610,170345 142610,170447 142610,170489 142610,170664 142610,171879 142610,173090 142610,176928 142610,181032 142610,181419 142610,183725 142610,183912 142610,184008 142610,184185 142610,184315 142610,184362 142610,185337 142610,186006 142610,212170 142610,214184 142610,215209 142610,216241 142610,218800 142610,219714 142610,220063 142610,221150 142610,222674 142610,225919 142610,226284 142610,226862 142610,226933 142610,227713 142610,227816 142610,227931 142610,227947 142610,228198 142610,231659 142610,231662 142610,231670 142610,231829 142610,232164 142610,232287 142610,232352 142610,233095 142610,233591 142610,233887 142610,236482 142610,237110 142610,239304 142610,239341 142610,239506 142610,239669 142610,240315 142610,245153 142610,246681 142610,247643 142610,247953 142610,248705 142610,250412 142610,253416 142610,253712 142610,254962 142610,257084 142610,257448 142610,257471 142610,260151 142610,263604 142610,264300 142612,142613 142614,885 142614,13704 142615,355 142616,1551 142616,3999 142617,850 142618,298 142619,485 142621,358 142622,1707 142623,602 142623,3218 142624,142625 142626,79 142627,30 142628,280 142629,346 142630,435 142631,30 142632,1707 142633,346 142634,77 142635,142636 142637,760 142638,1001 142639,366 142640,346 142641,30 142642,171 142643,843 142644,872 142645,1300 142646,158 142647,142430 142647,147191 142648,142649 142650,298 142651,485 142652,861 142653,1298 142654,602 142655,1962 142656,16153 142657,116 142657,2087 142658,2674 142659,138 142660,292 142661,872 142662,1962 142663,142664 142665,30 142666,142667 142668,72 142669,30 142670,30 142672,116 142672,2087 142673,138 142674,1385 142675,2674 142676,16153 142677,142678 142679,30 142680,142681 142682,30 142683,142684 142685,323 142686,2116 142687,72 142688,809 142689,147 142689,158 142690,72 142691,142692 142693,142692 142694,142692 142695,142692 142696,142692 142697,142692 142698,142692 142699,346 142701,323 142702,344 142703,4260 142705,3 142706,30 142707,872 142708,72 142709,346 142710,577 142711,72 142712,142713 142714,240 142715,356 142716,636 142717,1607 142718,1608 142719,366 142720,366 142721,366 142722,366 142723,83 142724,485 142725,298 142726,485 142728,355 142730,298 142731,485 142732,142733 142734,142733 142735,142733 142736,142733 142737,142733 142738,142733 142739,142733 142740,142733 142742,3 142743,1858 142744,1860 142745,481 142746,422 142747,56 142748,849 142748,6068 142749,147 142749,1458 142749,1515 142749,2244 142749,21442 142749,42064 142751,302 142752,142430 142752,142473 142752,142879 142753,233 142754,424 142755,333 142756,346 142757,626 142757,852 142758,138686 142759,602 142760,72 142763,422 142764,422 142765,422 142766,422 142767,422 142768,142769 142770,107 142771,481 142772,406 142772,2205 142772,33424 142773,602 142774,682 142774,1353 142774,72439 142778,30 142779,163 142780,1274 142781,1608 142782,142426 142783,493 142783,1181 142784,1608 142785,58 142786,97 142787,663 142789,175 142790,298 142791,58 142792,994 142793,46 142794,1608 142795,2775 142796,447 142797,481 142798,663 142799,142800 142801,302 142801,328 142801,602 142803,640 142804,663 142805,663 142806,1888 142807,1133 142808,134 142808,372 142809,18831 142810,2191 142811,518 142812,1634 142813,2590 142814,718 142814,1127 142815,285 142817,1858 142818,1860 142819,30 142820,1983 142821,1858 142822,1860 142823,1858 142824,1860 142825,1858 142826,1860 142827,2989 142827,2991 142828,1888 142829,875 142830,146 142831,647 142832,344 142833,873 142834,417 142834,2296 142835,859 142836,195 142838,346 142839,142840 142841,83 142842,647 142843,146 142844,344 142845,175 142846,1608 142847,298 142848,875 142851,298 142852,485 142854,1849 142854,32784 142856,1608 142857,83 142858,15 142860,58 142861,994 142862,46 142864,252 142864,516 142865,79 142866,599 142867,309 142867,310 142868,22293 142869,142870 142871,2506 142872,1323 142873,1326 142874,408 142875,102 142876,346 142877,309 142877,310 142878,142879 142880,994 142881,406 142881,779 142881,1515 142882,920 142882,1089 142882,1619 142884,406 142885,207 142886,2671 142887,1240 142888,2334 142890,217 142891,309 142891,310 142893,30 142894,920 142894,1118 142895,1210 142896,333 142897,142898 142899,1608 142900,1181 142902,83 142902,192 142902,211 142902,455 142902,949 142902,1623 142903,142904 142905,1608 142906,2260 142907,1415 142908,2312 142909,4545 142909,139010 142910,142911 142912,147 142912,158 142912,406 142912,779 142913,106 142913,586 142913,1370 142913,6119 142914,631 142915,366 142915,525 142917,3602 142918,44 142919,1133 142920,30 142921,1001 142922,309 142922,310 142922,1707 142923,1001 142924,142925 142926,346 142927,877 142928,3623 142930,588 142930,590 142930,805 142931,875 142932,140 142933,142934 142935,10 142938,1608 142940,30 142941,20771 142942,1359 142943,1608 142944,2312 142945,861 142946,3507 142947,717 142948,81 142949,1132 142950,781 142951,893 142952,4545 142952,139010 142953,30 142954,843 142955,1293 142955,2373 142956,72 142956,1135 142957,861 142958,623 142958,1805 142959,1429 142960,3260 142961,1608 142962,920 142963,171 142964,142965 142966,1608 142967,68 142968,1644 142969,885 142969,1252 142969,1253 142969,13704 142971,251 142972,1608 142973,30 142974,346 142975,298 142976,485 142977,68069 142978,30 142979,346 142980,1983 142981,30 142982,30 142983,994 142984,994 142985,1284 142986,349 142987,5101 142988,455 142989,1983 142990,1167 142990,2979 142991,668 142992,872 142993,140 142994,301 142995,30 142996,30 142997,332 142998,2334 142999,68069 143000,1983 143001,112707 143001,143741 143001,147369 143002,142426 143004,158 143005,30 143006,424 143007,200 143008,143009 143010,143009 143011,143009 143012,143009 143013,143009 143014,143009 143015,143009 143016,30 143017,1132 143018,781 143019,483 143020,72 143021,143022 143023,10 143023,113156 143024,1858 143025,1860 143026,30 143027,30 143028,143029 143030,34 143030,35 143031,143032 143034,30 143035,346 143037,379 143038,1143 143039,171 143040,143041 143043,875 143045,113156 143047,72 143048,72 143049,72 143050,143051 143052,305 143052,1818 143053,2443 143054,18831 143055,146 143056,647 143057,344 143058,272 143059,30 143060,346 143062,72 143063,934 143064,760 143065,143066 143067,392 143069,143070 143071,332 143071,1119 143072,58 143073,72 143074,72 143075,30 143076,30 143077,1556 143078,1893 143079,2506 143080,83 143081,1085 143082,1849 143082,32784 143083,247 143084,30 143085,72 143086,10 143087,30 143088,602 143089,3 143090,72 143091,15119 143092,149 143093,1140 143095,1132 143096,781 143097,1127 143098,493 143099,3623 143100,1326 143102,422 143103,56 143104,1007 143104,3041 143106,872 143107,211 143108,30 143109,516 143109,1644 143110,1127 143111,2334 143112,417 143112,2296 143113,346 143114,1 143115,346 143116,32 143116,392 143117,1210 143118,72 143119,30 143121,516 143122,1143 143123,143124 143125,143126 143127,143128 143129,5906 143130,557 143131,240 143132,626 143133,278 143134,137 143135,862 143137,920 143138,30 143139,41 143139,634 143140,2073 143141,79 143141,136 143141,192 143141,202 143141,217 143141,254 143141,333 143141,1181 143142,254 143143,406 143144,1556 143145,30 143146,30 143147,485 143148,298 143149,298 143150,485 143151,481 143152,355 143153,450 143154,1983 143155,355 143156,346 143157,920 143158,1983 143159,346 143160,143161 143162,2989 143162,2991 143163,346 143164,171 143165,298 143166,485 143167,1 143168,1179 143169,292 143170,30 143171,893 143172,424 143173,30 143174,72 143175,192 143177,143178 143179,142405 143180,2506 143181,143182 143183,49057 143184,422 143185,56 143186,34 143186,35 143187,13919 143188,146 143189,647 143190,344 143191,372 143191,631 143191,1212 143192,406 143192,141912 143193,1149 143193,1177 143193,2210 143193,4237 143194,1016 143194,2210 143194,4237 143194,182162 143195,30 143195,1608 143196,30 143197,72 143198,30 143199,143200 143201,30 143202,344 143203,4691 143204,30 143205,143206 143207,72 143209,143210 143211,58 143212,143213 143214,143213 143215,143213 143216,143213 143217,143213 143218,143213 143219,143213 143220,143213 143221,143222 143223,30 143224,255 143225,143213 143227,4545 143227,56150 143227,139010 143228,30 143229,142870 143230,298 143231,485 143233,30 143233,328 143233,1179 143234,273 143235,872 143236,1707 143237,309 143237,310 143239,143240 143241,2244 143242,602 143243,140 143243,285 143243,92476 143245,920 143246,211 143247,333 143248,143249 143250,143249 143251,143249 143252,143249 143253,143249 143254,143249 143255,143249 143256,143249 143257,355 143258,4260 143259,861 143260,602 143261,1639 143263,143264 143265,30 143266,1983 143267,171 143268,140 143269,920 143270,485 143271,509 143272,784 143273,1509 143274,663 143275,143249 143276,143249 143277,30 143278,602 143279,626 143280,1132 143281,781 143282,120 143283,302 143283,861 143284,207 143286,143287 143287,10 143288,602 143289,143290 143291,422 143292,422 143293,422 143294,455 143295,422 143296,422 143297,422 143298,422 143299,356 143299,843 143300,1962 143301,422 143302,422 143303,422 143304,422 143305,422 143307,1425 143308,142426 143308,145751 143309,207 143310,781 143311,1132 143312,30 143313,301 143314,707 143315,30 143316,16153 143317,143318 143319,4411 143320,1238 143321,1608 143322,1381 143323,467 143323,868 143324,1243 143325,233 143326,1052 143327,1452 143328,346 143329,481 143332,808 143333,1068 143334,515 143335,1608 143336,26041 143336,136072 143337,1849 143337,32784 143338,195 143338,333 143339,206 143342,346 143343,1118 143344,682 143344,72439 143345,4411 143345,162599 143347,462 143348,1001 143349,1608 143350,626 143350,1381 143350,1452 143350,1639 143351,485 143352,392 143352,3260 143353,83 143354,2480 143356,493 143357,515 143358,577 143359,143360 143361,1070 143362,143363 143364,1608 143365,146 143366,647 143367,344 143369,1016 143369,2210 143369,4237 143369,182162 143372,142430 143372,142473 143372,142879 143373,142430 143373,142473 143373,142879 143374,21442 143375,1608 143376,577 143378,1608 143379,920 143380,1556 143382,34 143382,35 143382,907 143382,973 143382,1001 143382,1133 143382,8180 143382,19946 143383,949 143384,140 143385,1608 143388,872 143389,743 143390,175 143391,298 143392,142473 143392,142879 143393,289 143393,290 143393,2286 143393,94134 143394,1983 143394,14352 143396,779 143397,1983 143398,312 143399,149 143399,406 143400,312 143403,1105 143404,58 143405,994 143407,46 143408,264 143408,1127 143408,1381 143408,1893 143409,31073 143410,292 143410,48505 143411,1300 143412,130 143412,1332 143413,120 143416,130 143416,1332 143417,900 143418,333 143418,346 143418,366 143418,1247 143419,217 143420,30 143421,2073 143422,312 143423,1392 143424,217 143424,314 143424,493 143424,682 143424,1417 143424,72439 143425,579 143426,602 143428,14434 143429,143430 143429,152733 143432,1608 143433,312 143434,702 143435,563 143437,298 143438,485 143440,30 143441,452 143442,1247 143443,184 143444,298 143445,485 143446,10 143446,175 143447,44 143449,2224 143450,30 143451,1608 143452,1608 143453,248 143454,1608 143455,2089 143455,2940 143456,2315 143457,1818 143458,1608 143459,134 143459,588 143459,590 143459,714 143459,2156 143460,481 143461,142430 143461,142473 143461,142879 143462,1983 143463,874 143463,1210 143464,4895 143465,1359 143466,467 143467,171 143468,467 143468,571 143469,1860 143470,1858 143471,435 143472,1659 143473,113156 143474,2045 143475,312 143476,292 143477,1140 143477,5547 143478,1962 143479,577 143479,1105 143480,292 143482,843 143483,1983 143484,1572 143485,2045 143486,264 143486,652 143487,5212 143488,298 143489,485 143490,22 143491,483 143492,301 143494,19 143496,31977 143497,143498 143499,79 143500,1019 143500,1888 143501,575 143502,1858 143503,1860 143504,2646 143504,18831 143505,248 143506,2572 143508,68069 143509,301 143510,850 143511,536 143512,3 143513,536 143514,143515 143516,4192 143516,4193 143517,143518 143519,143520 143521,50 143521,333 143521,779 143521,1181 143522,1983 143523,312 143524,143525 143526,104 143526,137 143526,138 143527,3623 143528,442 143528,1434 143529,310 143529,3039 143530,872 143531,3623 143532,809 143533,516 143534,703 143534,918 143534,1453 143535,79 143535,192 143535,202 143535,333 143535,1181 143536,525 143537,143538 143539,3623 143541,215 143542,885 143542,13704 143543,1844 143543,27834 143544,515 143545,83 143546,136072 143547,424 143547,907 143548,149 143549,557 143550,143551 143552,30 143553,1860 143554,1858 143555,283 143555,862 143555,949 143555,1240 143555,1465 143555,1564 143555,2274 143555,4637 143556,9743 143557,1467 143558,30 143559,30 143561,30 143562,252 143563,2867 143563,2868 143564,30 143565,30 143566,1235 143566,1335 143567,718 143568,1515 143569,358 143570,30 143571,30 143572,255 143573,2434 143574,1773 143575,192 143575,30331 143576,30 143577,493 143577,586 143577,1265 143577,1266 143577,1370 143578,143579 143580,30 143581,30 143582,1707 143583,30 143584,3623 143585,81 143586,657 143587,30 143588,143589 143588,170332 143588,249765 143591,557 143592,862 143593,358 143594,1235 143594,1335 143595,143596 143597,143596 143598,143596 143599,143596 143600,143596 143601,113156 143602,957 143603,2116 143604,298 143605,485 143606,957 143607,147 143607,149 143607,158 143607,171 143607,184 143607,2244 143607,73906 143608,7760 143609,22 143609,599 143609,920 143610,346 143611,1983 143612,3507 143613,527 143614,4594 143616,309 143616,310 143618,55849 143619,850 143620,885 143620,13704 143621,143622 143623,192 143624,143625 143626,143625 143627,143625 143628,143625 143629,1707 143630,493 143631,16153 143632,217 143633,435 143635,151 143636,72 143638,211 143639,843 143640,142405 143641,577 143642,142405 143643,142405 143644,147 143644,192 143644,1243 143645,240 143646,104 143646,134 143647,4637 143648,143649 143650,22 143651,602 143652,1801 143653,143654 143655,2590 143656,1282 143657,207 143658,143659 143661,10 143661,2929 143661,143662 143661,161414 143661,169271 143663,872 143664,1429 143665,143666 143667,143666 143668,143666 143669,143666 143670,143666 143671,668 143672,872 143673,158 143673,55849 143674,171 143675,366 143676,366 143677,366 143678,366 143679,366 143680,366 143681,366 143682,366 143683,4545 143683,139010 143684,72 143685,143686 143688,30 143689,30 143690,143691 143692,779 143693,143694 143693,150753 143695,1007 143696,1143 143697,192 143697,663 143698,30 143699,1467 143700,455 143701,2424 143702,1871 143703,493 143704,83 143705,13980 143706,2421 143707,143708 143709,142433 143711,450 143712,143713 143714,485 143715,298 143716,143717 143718,255 143719,795 143720,143287 143721,355 143722,312 143724,1019 143725,289 143725,290 143725,657 143725,932 143725,94134 143726,143727 143728,143729 143730,285 143730,994 143731,736 143731,835 143732,30 143733,16153 143734,485 143735,298 143736,140 143737,5718 143739,636 143740,240 143742,143743 143744,1858 143745,1860 143746,167 143747,483 143747,675 143747,1241 143748,128922 143749,1707 143750,1238 143751,202 143752,390 143752,1436 143753,143754 143755,143756 143757,143758 143759,143760 143761,143762 143763,143764 143765,143766 143767,143768 143769,143770 143771,143772 143773,143774 143775,143776 143777,143778 143779,143780 143781,143782 143783,143784 143785,143786 143787,143788 143789,143790 143791,143792 143793,2371 143794,143287 143795,143796 143797,143798 143799,143800 143801,143802 143803,143804 143805,143806 143807,143808 143809,143810 143811,143812 143813,143814 143815,143816 143817,143818 143819,143820 143821,143822 143823,143824 143825,143826 143827,143828 143829,143830 143831,143832 143833,143834 143835,143836 143837,143838 143839,143840 143841,143842 143843,143844 143845,143846 143847,143848 143849,143850 143851,143852 143853,143854 143855,143856 143857,143858 143859,143860 143861,143862 143863,143864 143865,143866 143867,143868 143869,143870 143871,143872 143873,143874 143875,143876 143877,143878 143879,143880 143881,143882 143883,143884 143885,143886 143887,143888 143889,143890 143891,143892 143893,143894 143895,143896 143897,143898 143899,143900 143901,143902 143903,143904 143905,143906 143907,143908 143909,143910 143911,143912 143913,143914 143915,143916 143917,143918 143919,143920 143921,143922 143923,143924 143925,143926 143943,1010 143945,143946 143947,918 143948,1452 143949,422 143950,30 143951,142405 143952,1241 143957,571 143957,868 143959,752 143959,873 143959,1210 143960,1639 143961,104 143961,332 143962,143963 143964,571 143965,63 143966,233 143967,30 143969,515 143970,481 143972,781 143973,1132 143974,760 143975,22 143977,22 143978,143979 143980,175 143981,298 143983,35486 143984,980 143985,726 143986,83 143987,843 143988,422 143989,422 143990,422 143991,422 143992,422 143993,356 143993,611 143993,795 143993,1113 143993,1319 143993,193129 143994,422 143995,422 143996,422 143997,422 143998,1070 143998,142426 143999,920 144000,346 144001,957 144001,1815 144004,1634 144005,292 144006,485 144007,298 144008,30 144010,571 144010,868 144011,447 144011,996 144011,1474 144012,640 144013,843 144014,2775 144015,500 144016,1962 144017,54 144018,1052 144019,1882 144020,640 144021,640 144022,146 144022,422 144022,467 144022,620 144022,673 144022,1172 144022,1425 144022,1663 144022,4411 144022,30331 144022,92476 144023,1858 144024,1860 144025,1608 144026,55849 144027,55849 144028,1983 144030,868 144031,481 144032,211 144032,697 144035,147 144035,158 144036,1858 144037,1860 144038,781 144039,1132 144040,285 144040,309 144040,310 144041,1858 144042,1860 144044,1608 144045,1789 144046,973 144046,9457 144047,1608 144048,48 144049,1132 144050,781 144051,868 144052,500 144053,1962 144054,1052 144055,1882 144056,2775 144057,54 144058,1608 144059,1663 144060,442 144061,1132 144062,781 144063,775 144064,2989 144064,2991 144065,175 144066,144067 144068,298 144069,743 144071,149 144072,120 144073,251 144073,516 144073,1512 144074,408 144075,102 144076,1323 144077,1326 144078,406 144079,862 144081,577 144082,949 144083,605 144084,1608 144085,872 144086,4545 144086,139010 144087,1177 144088,2209 144089,579 144090,55849 144092,1130 144092,1616 144093,30 144094,44 144095,30 144096,32 144096,392 144096,76096 144097,30 144098,760 144099,1 144100,252 144100,1220 144100,1222 144101,1359 144102,611 144103,1858 144104,1860 144105,136 144106,611 144107,563 144108,48 144108,1133 144109,22 144111,5718 144112,1608 144113,849 144114,1175 144115,516 144116,30 144117,65 144118,22 144119,313 144119,6556 144120,433 144121,392 144121,536 144121,1118 144121,1284 144122,611 144123,666 144123,693 144123,973 144123,1117 144123,1298 144123,4359 144123,7349 144123,28289 144123,30376 144123,72764 144123,80993 144123,90404 144123,98227 144123,107162 144123,131828 144123,147958 144123,157131 144123,162996 144123,163117 144123,170883 144123,172827 144123,174967 144124,4611 144125,1544 144127,5405 144128,22 144131,818 144132,3 144134,144135 144136,852 144137,22 144138,217 144140,72 144141,4260 144141,142433 144141,143287 144142,192 144144,144145 144146,20771 144147,850 144148,2944 144148,18831 144149,663 144150,859 144151,668 144151,3367 144153,18831 144154,140 144156,18831 144157,144158 144161,515 144161,1381 144162,30 144163,1359 144165,390 144167,175 144168,298 144169,30 144170,144171 144172,144173 144174,406 144174,779 144174,1181 144175,424 144176,144177 144178,3538 144179,388 144179,1849 144180,55849 144181,1294 144182,72 144183,144184 144185,1707 144186,1368 144187,704 144188,30 144189,406 144189,35000 144189,45495 144189,237013 144190,55849 144191,1983 144192,142405 144192,154408 144193,55849 144194,55849 144195,557 144196,137 144197,595 144198,144199 144200,30 144201,202 144202,202 144203,346 144204,346 144205,1140 144206,346 144207,30 144208,151 144209,1001 144209,1955 144210,332 144211,3999 144212,424 144213,592 144214,30 144215,144216 144217,346 144218,123546 144219,144220 144221,2506 144222,9743 144223,663 144224,596 144225,30 144226,30 144228,30 144229,144230 144231,68 144231,240 144231,301 144231,392 144231,446 144231,457 144231,693 144231,697 144231,818 144231,861 144231,1240 144231,2480 144231,2944 144231,4220 144231,23287 144231,66297 144231,102560 144231,127158 144231,138686 144231,179804 144231,207045 144232,30 144233,144234 144235,144234 144236,144234 144237,144234 144238,144234 144239,1132 144240,575 144241,144242 144243,525 144244,1309 144245,175 144245,1773 144246,8719 144247,138 144248,865 144249,557 144250,107 144251,1133 144252,292 144253,298 144254,3538 144255,137 144256,118 144256,4597 144257,88820 144258,611 144259,557 144260,1983 144261,631 144262,1803 144263,294 144264,72 144265,184 144266,920 144267,2590 144268,2646 144268,18831 144269,4748 144270,2367 144271,364 144272,450 144273,3989 144274,5708 144275,144276 144277,144278 144279,16953 144280,7117 144281,63 144282,2867 144282,2868 144283,1309 144284,1821 144285,980 144286,1927 144287,144288 144289,392 144289,1836 144290,1612 144291,859 144292,485 144293,144294 144295,144294 144296,144294 144297,144294 144298,144294 144299,144294 144300,144294 144301,144294 144302,144294 144303,144294 144304,175 144305,175 144306,298 144307,2006 144308,30 144309,2506 144310,30 144311,356 144311,1722 144312,72 144313,146 144314,344 144315,647 144316,30 144317,30 144318,144319 144320,144321 144322,202 144323,222 144323,455 144323,657 144323,2266 144324,171 144325,30 144326,255 144327,485 144328,298 144329,32475 144330,144331 144332,1284 144333,452 144333,818 144334,450 144334,717 144335,30 144336,144337 144338,393 144339,364 144339,450 144339,611 144339,980 144339,1619 144339,2367 144339,4748 144339,16953 144340,175 144341,298 144343,30 144345,2674 144345,16153 144346,481 144347,450 144348,144349 144350,144349 144351,83 144351,356 144352,450 144353,175 144354,298 144355,704 144356,704 144357,422 144358,422 144359,422 144360,422 144361,422 144362,422 144363,422 144364,422 144365,422 144366,144367 144368,144369 144370,144369 144371,144369 144372,144369 144373,450 144374,450 144375,120 144375,588 144375,590 144375,1419 144376,1133 144377,483 144378,393 144379,144380 144381,225 144382,30 144383,72 144384,72 144385,2506 144386,366 144387,14472 144388,72 144389,144390 144391,30 144392,30 144393,144394 144395,298 144396,485 144397,144398 144399,8884 144400,30 144403,143287 144404,1085 144407,355 144408,144409 144411,158 144411,2244 144412,144413 144414,30 144416,144417 144418,171 144419,1014 144420,298 144421,485 144422,2506 144424,144425 144426,1962 144427,144428 144429,336 144429,406 144429,620 144429,779 144429,1163 144429,1181 144429,5726 144429,8055 144430,142473 144430,142879 144431,1608 144432,83 144433,996 144434,2506 144435,144436 144437,3 144438,144439 144440,144439 144441,144439 144442,144439 144443,144439 144444,1118 144445,144446 144447,346 144448,408 144449,1323 144450,1326 144451,102 144452,450 144454,2506 144455,144456 144455,172883 144458,44 144459,144460 144461,298 144462,485 144463,298 144464,485 144466,202 144468,146 144469,647 144470,344 144471,72 144472,622 144472,1033 144473,192 144474,144475 144476,144477 144478,142405 144479,206 144480,144481 144482,144481 144483,144481 144484,144481 144485,144481 144486,144481 144487,144481 144488,58 144489,30 144491,144492 144493,2411 144494,298 144495,485 144496,142870 144498,114206 144499,114206 144500,114206 144501,10 144501,2574 144502,81 144503,144504 144505,144504 144506,1001 144507,358 144508,83 144509,144510 144511,2506 144512,144513 144514,2506 144515,805 144515,2572 144515,2775 144516,144517 144518,144517 144519,144517 144520,144517 144522,1773 144523,72 144524,184 144524,2244 144524,21826 144525,1608 144526,144527 144528,171 144529,1566 144530,144531 144532,144533 144534,144533 144535,144533 144536,144533 144537,144533 144538,144533 144539,144533 144541,2506 144542,4 144542,5 144543,483 144544,144545 144546,144547 144548,596 144549,346 144550,144551 144552,1479 144553,390 144554,144555 144557,144558 144559,2506 144560,144561 144562,144563 144564,144563 144565,6068 144566,144567 144568,9743 144569,144570 144571,2572 144572,144573 144574,1284 144575,32475 144576,3585 144577,144578 144579,158 144580,920 144582,3538 144582,103860 144583,626 144585,144586 144588,144589 144590,144589 144591,144589 144592,144589 144593,144589 144594,144589 144595,144589 144596,144597 144598,1776 144599,346 144600,298 144601,485 144602,2146 144603,144604 144605,875 144606,30 144607,144608 144610,3507 144611,144612 144613,3623 144614,366 144615,366 144616,144617 144618,142405 144619,1860 144620,1858 144621,15573 144623,144624 144625,144624 144626,107 144627,2416 144627,2417 144628,292 144629,338 144630,298 144631,1133 144632,3538 144633,83 144635,355 144638,144639 144640,760 144641,83 144642,83 144643,433 144644,233 144648,144649 144650,144651 144652,83 144654,7155 144655,1359 144656,158 144659,144660 144662,144663 144664,144665 144664,147719 144666,1381 144667,144668 144669,1707 144671,83 144672,144673 144674,144675 144676,144677 144678,144679 144680,760 144681,83 144682,22 144683,144684 144687,130 144688,192 144688,195 144688,1877 144688,4545 144688,139010 144689,2931 144691,1247 144693,144694 144696,144697 144698,144699 144700,44 144701,144702 144701,153944 144701,158885 144701,159525 144701,182165 144703,144704 144703,214406 144703,217221 144703,221633 144703,224436 144705,144706 144707,144708 144709,134 144709,309 144709,310 144709,611 144709,626 144709,717 144709,862 144709,1151 144709,1265 144709,1266 144709,1285 144709,1381 144709,1749 144709,1782 144710,146 144711,647 144712,344 144713,138 144714,83 144716,6068 144717,144718 144719,31977 144720,144721 144722,144723 144724,144725 144726,134 144727,144728 144729,222 144729,379 144729,634 144731,2506 144733,872 144734,872 144737,1085 144738,144739 144740,144741 144742,144743 144744,144745 144746,144747 144748,1807 144750,30 144751,240 144752,298 144753,485 144754,144755 144756,589 144757,144758 144759,444 144760,326 144760,579 144761,113156 144762,657 144763,144764 144765,500 144766,2775 144767,1962 144768,54 144769,1052 144770,1882 144771,222 144772,144773 144774,718 144775,30 144776,144777 144778,144777 144779,144780 144781,30 144782,144783 144784,144785 144786,144787 144788,144787 144789,144787 144790,144791 144792,557 144793,30 144795,557 144796,557 144797,3138 144798,144799 144800,142473 144801,483 144802,481 144803,144804 144805,1252 144805,1253 144806,577 144807,2146 144808,298 144809,485 144810,298 144811,485 144812,144813 144814,144815 144816,144817 144818,298 144819,485 144821,30 144822,2775 144823,447 144824,16153 144825,2989 144825,2991 144826,142405 144827,251 144828,422 144829,56 144830,144831 144832,83 144833,142473 144834,805 144835,140 144836,160 144836,310 144836,346 144836,1381 144836,1684 144836,3039 144836,29380 144837,668 144837,3367 144838,1210 144839,144840 144841,1188 144842,1052 144843,86 144844,144845 144846,149 144848,118 144848,4597 144849,56 144849,99 144849,192 144849,202 144849,439 144849,516 144849,1370 144849,23287 144849,102560 144849,127158 144849,138686 144849,191355 144849,207045 144849,212914 144850,422 144851,422 144852,422 144853,422 144854,422 144855,422 144856,422 144857,30 144858,72 144859,312 144860,144861 144862,4545 144862,139010 144863,422 144864,56 144865,1285 144866,292 144867,294 144868,296 144869,298 144870,175 144871,298 144872,704 144873,406 144874,16331 144876,195 144877,83 144878,1070 144879,72 144880,22 144881,142430 144881,147191 144883,485 144884,298 144885,144886 144889,1509 144890,366 144891,366 144892,21442 144893,79 144894,1509 144895,50 144895,149 144895,406 144895,1425 144895,21442 144896,142426 144897,3695 144898,485 144899,298 144900,663 144901,83 144903,87 144905,515 144907,1479 144908,48 144909,671 144910,171 144911,355 144912,4611 144913,1544 144914,4611 144915,1544 144916,1531 144916,4545 144916,139010 144918,640 144919,346 144921,636 144922,144923 144924,171 144925,217 144926,1544 144927,4611 144928,783 144929,4611 144930,1544 144933,171 144935,143287 144936,285 144937,192 144938,4611 144939,1544 144940,251 144941,4611 144942,1544 144943,2989 144943,2991 144944,144945 144946,178 144947,1007 144948,1474 144949,144950 144949,152318 144951,22293 144952,144953 144952,157046 144954,577 144954,1033 144955,1252 144955,1253 144956,43203 144957,30 144958,1417 144958,19443 144959,3585 144960,1608 144961,1564 144962,148600 144963,1688 144964,1608 144965,285 144966,1608 144967,144968 144969,985 144970,668 144971,1531 144972,144973 144974,79 144975,2775 144976,447 144977,1 144979,65 144981,19010 144982,175 144983,298 144984,1133 144985,467 144986,1082 144987,827 144988,304 144988,704 144988,714 144988,1402 144988,1818 144988,1962 144988,2205 144988,2286 144988,2315 144988,3069 144988,33424 144989,875 144990,146 144991,647 144992,344 144993,360 144994,1082 144995,1012 144997,10 144998,372 144998,1285 144999,733 145000,145001 145002,1849 145002,32784 145003,106 145003,1082 145003,1732 145004,255 145005,255 145007,779 145008,1326 145009,1151 145010,140 145011,54362 145012,6298 145013,145014 145015,106 145015,1370 145015,6119 145016,175 145017,934 145018,1052 145019,1285 145020,298 145021,143287 145023,1151 145023,1836 145023,2274 145025,515 145026,252 145027,1707 145028,44 145031,1252 145031,1253 145031,4823 145032,1612 145033,1773 145034,2989 145034,2991 145035,779 145036,577 145037,1608 145038,718 145039,200 145040,142405 145041,50 145041,79 145041,111 145041,147 145041,158 145041,178 145041,192 145041,195 145041,333 145041,346 145041,406 145041,435 145041,538 145041,622 145041,631 145041,640 145041,779 145041,1033 145041,1181 145041,1265 145041,1266 145041,1388 145041,1531 145041,2931 145041,3872 145041,4192 145041,4193 145042,657 145044,424 145045,72 145046,187 145048,2989 145048,2991 145052,146 145053,344 145054,647 145055,22 145058,20 145059,146 145060,647 145061,344 145062,1544 145063,4611 145064,4611 145065,1544 145067,957 145068,957 145069,10 145070,30 145071,22 145073,1544 145074,4611 145075,4611 145076,1544 145077,273 145079,146 145080,142473 145082,1133 145083,50 145084,278 145086,1955 145087,1707 145088,538 145088,1289 145088,1877 145089,1707 145090,957 145091,3769 145092,134 145092,2105 145094,3623 145096,3804 145097,1821 145097,21736 145098,30 145099,433 145100,120 145100,588 145100,590 145101,663 145102,509 145103,1247 145105,217 145106,252 145107,240 145108,1579 145108,2312 145109,72 145110,83 145111,4611 145112,1544 145113,4611 145114,1544 145115,298 145116,485 145117,875 145118,447 145119,2775 145120,264 145120,1509 145120,1551 145121,1282 145122,83 145123,2224 145124,1285 145125,991 145125,1707 145126,1300 145128,1085 145129,919 145131,392 145132,145133 145135,30 145136,690 145136,2073 145137,97 145138,1877 145138,40497 145139,424 145140,145141 145142,58 145142,87 145142,292 145142,801 145142,872 145142,1140 145142,1146 145142,1177 145142,1326 145142,1392 145142,1653 145142,1836 145142,1893 145142,2436 145142,2443 145142,3474 145142,3804 145142,54004 145143,175 145144,298 145145,145146 145147,875 145148,287 145149,852 145150,1359 145150,19755 145151,145152 145154,83 145155,3069 145156,1149 145157,72 145158,1149 145159,875 145160,145161 145162,30 145163,83 145164,65 145164,71 145164,272 145164,611 145166,145167 145166,151833 145168,142405 145169,406 145170,875 145171,10 145172,171 145173,433 145174,200 145175,72 145176,4545 145176,56150 145176,139010 145177,19356 145178,344 145179,145180 145181,145182 145183,3111 145184,136 145185,55849 145187,73570 145188,145189 145190,55849 145191,145192 145193,83 145193,259 145194,72 145195,217 145196,251 145197,775 145198,809 145198,1210 145198,1342 145198,2053 145198,34775 145198,145148 145198,173423 145199,346 145200,996 145201,483 145202,145203 145204,145205 145206,72 145207,818 145208,30 145210,217 145210,1417 145211,10 145211,2626 145212,586 145213,145214 145215,2590 145216,557 145217,657 145218,1052 145219,145220 145223,586 145224,145225 145226,135 145226,1843 145226,4799 145227,30 145228,142405 145229,72 145230,30 145231,145232 145233,145234 145235,75912 145236,1509 145237,255 145238,255 145239,707 145241,1608 145242,30 145243,30 145245,251 145246,145247 145248,30 145249,145250 145251,255 145252,422 145253,15119 145254,72 145255,15748 145256,145257 145258,30 145259,22 145260,1858 145261,1860 145262,145263 145264,1858 145265,1860 145266,30 145267,55849 145268,145268 145269,30 145270,2421 145272,145273 145274,145275 145276,328 145277,175 145278,592 145280,72 145281,175 145282,298 145283,184 145284,255 145285,255 145286,6068 145287,1085 145287,2747 145287,6068 145287,7819 145287,16955 145287,36015 145287,73248 145287,75912 145287,132216 145287,147789 145287,148196 145289,30 145290,145291 145293,30 145294,145295 145296,145297 145298,366 145299,366 145300,366 145301,631 145301,1085 145302,145303 145304,145305 145306,622 145307,4545 145307,139010 145308,145309 145310,1773 145312,1381 145312,142426 145313,355 145314,9457 145315,30 145317,143287 145318,1241 145319,248 145321,827 145322,4611 145323,1544 145324,4611 145325,1544 145326,215 145327,717 145328,1608 145329,4611 145330,1544 145331,4611 145332,1544 145333,222 145334,481 145335,68069 145336,534 145337,233 145338,87 145340,71 145340,685 145342,130 145343,15 145344,640 145345,500 145346,1882 145347,2775 145348,54 145349,1052 145350,1962 145351,32 145352,422 145353,422 145354,422 145355,422 145356,422 145357,422 145358,422 145359,422 145360,422 145361,422 145362,452 145363,1247 145364,184 145365,1177 145366,663 145366,937 145367,907 145368,283 145370,1858 145371,1860 145372,1858 145373,1860 145375,63 145376,142405 145377,3769 145378,83 145379,623 145380,30 145381,666 145383,1332 145384,145385 145389,663 145392,175 145393,200 145394,298 145395,809 145396,336 145397,255 145398,1962 145399,577 145401,1858 145402,1860 145404,206 145405,285 145405,779 145406,60576 145407,1293 145407,1522 145407,28107 145407,213089 145408,811 145409,392 145410,113156 145411,973 145412,500 145413,1962 145414,1052 145415,1882 145416,2775 145417,54 145418,142430 145418,142473 145418,142879 145421,337 145422,500 145423,1052 145424,1882 145425,2775 145426,54 145427,1962 145428,4355 145429,287 145430,145431 145430,152225 145430,154188 145432,145433 145434,563 145435,1612 145436,563 145437,957 145438,1608 145439,145440 145441,30 145442,666 145443,137 145444,1858 145445,1860 145446,2168 145447,388 145448,666 145449,60576 145450,227 145452,663 145453,142430 145453,142473 145453,142879 145454,30 145455,957 145456,2572 145457,424 145457,6556 145459,1147 145459,2989 145459,2991 145460,55849 145462,3724 145462,15179 145463,996 145464,663 145466,1454 145467,211 145467,949 145467,1655 145467,1844 145467,2209 145467,8270 145468,30 145469,4455 145470,275 145471,1149 145472,663 145473,225 145473,332 145473,1515 145474,1608 145476,500 145477,1962 145478,2775 145479,1052 145480,54 145481,1882 145482,717 145483,1608 145484,717 145485,1556 145487,147 145487,663 145488,1608 145489,44 145490,1608 145492,312 145493,217 145494,1983 145495,932 145496,875 145497,34 145497,389 145497,536 145497,2784 145498,4611 145499,1544 145500,4611 145501,1544 145502,877 145503,422 145504,56 145505,30 145506,4611 145507,1544 145508,4611 145509,1544 145510,278 145513,1014 145515,1801 145516,30 145517,663 145518,160 145519,115659 145519,142870 145520,440 145521,1556 145522,485 145523,298 145525,151 145525,2073 145526,663 145527,666 145528,663 145529,4 145529,5 145529,1235 145529,1335 145530,760 145531,30 145532,4571 145535,175 145537,278 145538,298 145540,278 145541,278 145542,663 145543,278 145544,278 145546,77 145548,1858 145549,1860 145550,2775 145551,447 145553,16153 145554,138 145555,116 145555,2087 145556,2674 145557,1608 145558,1608 145559,30 145562,278 145564,1608 145565,1608 145567,2979 145568,877 145569,1247 145570,364 145571,663 145573,663 145574,49057 145575,30 145577,515 145577,1241 145577,3585 145578,4611 145579,1544 145581,1544 145582,4611 145583,622 145585,4611 145586,1544 145587,1544 145588,4611 145589,663 145591,4611 145592,1544 145593,4611 145594,1544 145595,206 145596,5591 145597,175 145598,372 145599,298 145600,602 145601,859 145602,72 145604,663 145605,135 145606,72 145609,145610 145611,663 145612,145613 145614,145613 145615,145613 145616,145613 145617,145613 145618,145613 145619,145613 145620,145613 145621,663 145622,1149 145624,663 145625,104 145625,240 145625,850 145626,784 145627,1243 145628,1860 145629,1858 145632,1564 145633,467 145633,152855 145634,1564 145636,467 145636,868 145636,162599 145637,167 145637,252 145638,663 145639,240 145639,1955 145640,1210 145641,1140 145643,1749 145643,2006 145645,2436 145647,3297 145648,663 145650,663 145651,124889 145652,868 145653,2775 145654,717 145655,393 145656,772 145657,795 145658,1332 145659,2646 145659,18831 145660,2590 145661,1370 145662,455 145663,106 145664,116 145664,2087 145665,6119 145666,138 145667,16153 145668,2674 145669,145670 145671,493 145671,1265 145671,1266 145673,56 145674,422 145675,422 145676,56 145677,349 145678,16153 145679,2674 145680,138 145681,116 145681,2087 145682,140 145683,267 145684,433 145685,557 145686,663 145687,55849 145688,1509 145689,116 145689,2087 145690,138 145691,16153 145692,2674 145693,30 145694,1019 145695,278 145696,30 145697,9743 145698,145699 145700,623 145701,358 145702,278 145703,63 145703,877 145703,3538 145704,485 145705,298 145706,406 145707,207 145708,893 145709,145710 145711,485 145712,298 145713,145714 145715,145714 145716,145714 145717,145714 145718,145719 145720,222 145720,657 145721,278 145722,13980 145723,72 145724,145725 145726,145725 145727,145725 145728,717 145728,2480 145729,30 145730,430 145730,994 145730,1235 145730,1335 145731,147 145732,435 145733,743 145733,145734 145735,171 145736,372 145737,145738 145739,145739 145740,145741 145743,843 145744,145745 145746,298 145747,485 145748,30 145749,415 145750,142426 145750,145751 145752,145753 145754,358 145755,145756 145757,278 145758,217 145759,83 145760,278 145761,145762 145763,7155 145764,149 145765,663 145766,3 145767,30 145768,2116 145769,145770 145771,577 145772,483 145773,264 145774,113156 145775,1381 145776,3321 145777,2416 145777,2417 145778,1634 145779,30 145780,145781 145782,30 145783,1007 145785,158 145786,356 145787,72 145788,145789 145790,2590 145791,267 145792,72 145793,581 145794,145795 145796,72 145797,255 145798,207 145800,431 145800,631 145800,1085 145800,2296 145801,2146 145802,142405 145803,30 145804,30 145805,30 145806,872 145807,668 145808,145809 145810,145811 145812,83 145813,143287 145815,298 145816,485 145817,145818 145819,143287 145820,83 145822,119 145822,14126 145823,510 145824,355 145825,422 145826,129639 145827,760 145829,1087 145830,1454 145831,536 145834,145835 145836,1238 145837,919 145838,145839 145841,337 145842,138 145843,16153 145844,116 145844,2087 145845,2674 145846,3207 145847,1983 145848,1452 145852,5591 145853,4611 145854,1544 145855,671 145856,83 145857,1132 145858,1983 145859,233 145860,4611 145861,1544 145862,259 145863,48 145864,1634 145865,2775 145868,2775 145869,1983 145870,563 145872,893 145874,1608 145876,309 145876,310 145876,3039 145876,6556 145877,1146 145878,534 145878,4260 145879,83 145880,500 145880,718 145881,143287 145882,8854 145883,75912 145885,142426 145885,145502 145885,145751 145886,1556 145887,577 145888,30 145889,30 145890,83 145891,302 145891,2116 145892,175 145893,298 145894,1160 145895,32 145896,217 145896,127158 145897,424 145898,48 145899,1332 145900,65 145900,1118 145901,424 145902,3804 145902,14797 145903,140 145904,206 145905,1608 145906,422 145907,56 145908,289 145908,290 145908,144988 145909,602 145909,3218 145910,467 145911,145912 145913,1 145913,81 145913,106 145913,134 145913,251 145913,273 145913,275 145913,298 145913,340 145913,497 145913,567 145913,620 145913,626 145913,663 145913,694 145913,736 145913,760 145913,827 145913,859 145913,861 145913,862 145913,931 145913,1058 145913,1082 145913,1113 145913,1122 145913,1127 145913,1402 145913,1415 145913,1732 145913,1807 145913,2315 145913,2867 145913,2868 145913,3003 145913,4039 145913,145502 145914,79 145915,634 145916,779 145917,717 145917,1332 145918,111 145918,631 145918,752 145918,795 145918,873 145918,919 145918,1001 145918,1210 145918,1274 145918,1309 145918,1522 145918,2045 145918,3182 145918,6068 145918,6955 145919,1363 145920,248 145920,1332 145921,1240 145922,682 145922,1512 145922,5992 145922,72439 145923,145924 145925,422 145927,30 145928,1707 145929,175 145930,714 145931,818 145932,298 145934,455 145935,3585 145936,312 145937,2775 145938,3653 145939,145940 145942,3585 145943,422 145944,3653 145945,422 145946,422 145947,422 145948,422 145949,422 145950,422 145951,422 145952,567 145953,422 145954,422 145955,158 145956,1860 145957,1858 145958,1571 145960,2105 145961,1556 145962,1983 145963,356 145965,142430 145965,142473 145966,206 145967,9008 145970,136 145971,1608 145972,1608 145973,1858 145974,1860 145975,663 145976,444 145977,240 145977,2205 145977,33424 145979,538 145979,1837 145980,818 145981,130 145981,483 145981,4223 145981,75912 145982,1392 145983,130 145983,261 145983,298 145983,305 145983,473 145983,557 145983,647 145983,666 145983,694 145983,703 145983,726 145983,877 145983,893 145983,1058 145983,1368 145983,1388 145983,1619 145983,2135 145983,3089 145983,3999 145983,4172 145983,5540 145983,5658 145983,6638 145983,191355 145984,46 145987,83 145988,136 145989,298 145990,485 145991,385 145991,408 145991,2421 145991,37088 145993,1353 145994,718 145997,298 145998,485 145999,1858 146000,1860 146001,240 146001,818 146001,872 146001,1623 146001,1955 146001,2512 146001,2989 146001,2991 146001,127158 146001,194645 146002,1181 146003,44 146004,1608 146005,1096 146005,3555 146006,500 146007,1052 146008,1962 146009,1882 146010,2775 146011,54 146012,81233 146013,392 146013,644 146014,406 146015,146016 146018,422 146019,56 146020,579 146021,142473 146022,142409 146023,1241 146023,1522 146023,2083 146024,805 146025,660 146025,40566 146025,142870 146025,144962 146025,145502 146025,146280 146025,146314 146025,189792 146026,302 146028,843 146029,50 146029,192 146029,2244 146029,2931 146031,663 146032,1608 146033,875 146034,349 146035,146036 146037,146036 146038,146036 146039,694 146040,269 146041,422 146041,707 146042,175 146043,435 146044,298 146045,3 146046,760 146046,1085 146046,2296 146047,1284 146048,843 146049,875 146050,146051 146052,500 146053,1962 146054,1882 146055,1052 146056,2775 146057,54 146058,393 146058,1096 146059,72 146060,1782 146061,301 146062,4810 146063,3623 146064,980 146065,2557 146066,87 146067,167 146068,48505 146069,146070 146071,483 146073,3 146073,32 146073,217 146073,222 146073,326 146073,349 146073,388 146073,392 146073,433 146073,509 146073,657 146073,697 146073,720 146073,752 146073,809 146073,872 146073,873 146073,874 146073,907 146073,919 146073,932 146073,973 146073,1010 146073,1019 146073,1133 146073,1143 146073,1210 146073,1240 146073,1284 146073,1363 146073,1453 146073,1454 146073,1465 146073,1634 146073,1801 146073,1805 146073,1836 146073,1837 146073,1860 146073,1871 146073,1881 146073,2045 146073,2191 146073,2266 146073,2421 146073,2699 146073,3182 146073,4252 146073,6789 146073,6955 146073,7092 146074,1479 146075,3623 146076,392 146077,175 146078,298 146079,3623 146080,83 146081,83 146082,1707 146083,269 146085,83 146086,87 146087,83 146088,1858 146089,1860 146090,885 146090,13704 146092,1983 146095,1858 146096,1860 146098,83 146099,83 146100,455 146101,1858 146102,1860 146104,83 146105,149 146107,843 146107,3467 146108,3623 146109,3623 146110,81 146111,3623 146112,255 146113,142870 146114,1019 146115,516 146116,647 146117,1149 146118,3623 146119,500 146120,1052 146121,1962 146122,1882 146123,2775 146124,54 146125,71 146125,491 146125,611 146125,843 146125,852 146125,859 146125,1449 146126,592 146127,1282 146128,704 146129,2923 146130,862 146131,9001 146132,1983 146133,118 146133,4597 146135,278 146135,28130 146136,118 146136,4597 146137,104 146137,254 146139,1359 146140,5906 146141,557 146142,626 146143,278 146144,137 146145,862 146146,146147 146148,55849 146149,83 146150,10 146150,113156 146151,22 146152,809 146153,34 146153,35 146154,500 146155,1962 146156,1882 146157,2775 146158,1052 146159,54 146160,1265 146160,1266 146161,1133 146162,1983 146163,30 146164,500 146165,1882 146166,2775 146167,1962 146168,54 146169,1052 146170,2944 146170,18831 146171,255 146172,575 146173,861 146175,200 146176,55849 146177,146178 146179,918 146180,240 146180,372 146180,1082 146180,1285 146180,1309 146180,1955 146181,195 146182,171 146183,83 146184,500 146185,54 146186,1962 146187,1052 146188,2775 146189,1882 146190,929 146191,718 146192,146193 146194,675 146194,743 146195,146196 146197,146198 146199,30331 146200,5591 146201,107 146202,146203 146204,143287 146205,868 146206,146207 146208,602 146209,255 146210,146211 146212,30 146213,146214 146215,184 146216,146217 146219,4545 146219,56150 146219,139010 146220,109308 146221,1474 146222,1309 146223,1127 146224,146225 146226,146227 146228,146229 146230,146231 146232,146231 146233,146231 146234,146231 146235,146231 146236,146231 146237,862 146238,30 146239,146240 146241,222 146242,3999 146243,304 146244,146245 146246,452 146246,535 146246,918 146246,1655 146247,557 146248,255 146249,104 146250,219 146250,535 146250,731 146250,957 146250,1815 146250,1888 146251,628 146252,355 146253,48 146254,358 146255,647 146257,146258 146260,344 146260,360 146261,422 146262,422 146263,422 146264,422 146265,422 146266,422 146267,422 146268,422 146269,30 146270,422 146271,422 146272,718 146273,422 146274,422 146275,240 146276,1551 146277,2480 146278,3507 146279,142409 146279,146280 146279,148600 146279,159365 146280,40566 146280,115659 146280,146280 146280,148600 146280,159365 146282,21442 146283,233 146284,4823 146286,146287 146288,171 146289,146 146290,344 146291,647 146292,1858 146293,1860 146294,217 146295,298 146296,485 146297,146298 146299,663 146300,592 146300,1001 146301,2915 146302,225 146302,431 146303,808 146303,1860 146304,222 146304,18831 146307,3585 146308,931 146309,171 146310,142405 146310,154408 146313,146314 146315,420 146316,500 146317,1962 146318,2775 146319,54 146320,1052 146321,1882 146322,97 146323,943 146324,1146 146325,843 146326,1556 146327,500 146328,1882 146329,2775 146330,1962 146331,54 146332,1052 146333,175 146334,310 146334,3039 146335,2671 146336,298 146337,287 146338,344 146338,5547 146339,500 146340,1052 146341,1882 146342,1962 146343,2775 146344,54 146345,299 146346,1130 146346,81233 146347,215 146348,83 146350,5405 146351,312 146352,2083 146354,142405 146355,809 146356,83 146357,2989 146357,2991 146359,1983 146360,146361 146362,163 146362,660 146363,346 146365,146366 146367,623 146367,1805 146368,3218 146369,83 146370,200 146371,315 146372,500 146373,2775 146374,1962 146375,1052 146376,54 146377,1882 146378,175 146379,5213 146380,298 146381,406 146382,636 146383,1608 146384,58 146385,994 146386,46 146387,827 146389,1608 146390,1983 146391,602 146392,736 146393,66500 146395,3507 146396,1294 146397,55849 146398,1608 146399,1608 146400,1608 146401,694 146402,1749 146402,14719 146403,146404 146405,83 146406,1608 146407,58 146408,994 146409,46 146410,79 146410,120 146411,252 146413,818 146414,4504 146415,3623 146416,30 146417,447 146418,2775 146419,30 146420,22 146421,79 146422,171 146423,146424 146425,55849 146426,1181 146428,1707 146430,1608 146432,875 146433,1531 146434,167 146435,994 146436,58 146437,46 146438,2083 146439,775 146440,83 146441,184 146441,182744 146442,1860 146443,2775 146444,447 146447,1531 146449,3069 146451,175 146452,171 146454,63 146455,58 146456,994 146457,46 146458,50 146459,1858 146460,1860 146461,390 146462,301 146462,717 146462,1782 146464,577 146465,406 146466,801 146467,557 146468,1014 146469,58 146470,994 146471,46 146472,389 146472,455 146473,298 146474,859 146475,968 146477,1085 146478,557 146479,557 146480,577 146481,55849 146482,2646 146483,68 146484,34 146484,35 146484,2646 146485,146486 146487,2105 146488,366 146489,146490 146491,440 146492,366 146493,200 146493,1177 146494,717 146495,1429 146496,949 146496,968 146497,346 146497,435 146497,586 146497,1294 146497,6119 146498,861 146499,640 146500,280 146502,2210 146502,4237 146502,182162 146503,483 146504,3474 146505,907 146506,309 146506,310 146507,72 146508,120 146509,406 146510,435 146511,392 146512,515 146513,850 146514,63 146515,146516 146517,167 146518,30 146518,1179 146519,843 146520,588 146520,590 146520,805 146521,3623 146522,1381 146523,207 146524,1255 146524,1462 146524,8537 146524,50943 146525,48 146526,349 146527,142405 146528,200 146528,1177 146529,146530 146531,146530 146532,872 146533,1429 146534,1608 146535,1608 146536,2590 146538,668 146539,1179 146540,1298 146541,557 146542,862 146543,949 146545,577 146546,2073 146547,13745 146548,104 146549,146550 146551,949 146551,968 146552,640 146553,3623 146554,1243 146555,862 146556,2567 146557,146558 146559,3623 146560,3069 146561,1556 146562,30 146564,1143 146565,358 146567,994 146568,557 146570,142426 146571,130 146573,116 146573,2087 146574,16153 146575,138 146576,2674 146577,850 146578,1143 146579,1235 146579,1335 146580,120 146581,358 146582,149 146583,30 146584,146585 146586,875 146587,3623 146588,5310 146589,4355 146590,1188 146591,264 146592,30 146593,1381 146594,222 146595,120 146596,1007 146597,146598 146599,142405 146600,577 146601,2116 146602,10 146603,301 146603,717 146603,1782 146604,146605 146606,146607 146606,157885 146608,146609 146610,346 146611,671 146612,577 146613,30 146614,146615 146616,2083 146617,146618 146619,272 146620,2590 146621,146622 146623,1707 146624,30 146625,30 146626,22 146626,818 146627,56 146628,422 146629,146630 146631,622 146632,146633 146634,146635 146634,153015 146637,355 146638,3260 146640,72 146641,1010 146642,143287 146643,146644 146645,1436 146646,694 146646,1968 146647,538 146648,255 146649,420 146649,515 146649,652 146649,1893 146649,117163 146650,104 146651,119 146653,1707 146654,30331 146655,146656 146657,30 146658,30331 146659,30 146661,1326 146662,1608 146663,3218 146664,640 146665,2296 146666,1707 146667,1238 146668,1007 146669,1544 146670,4611 146671,835 146671,1298 146672,83 146672,278 146672,366 146672,949 146672,1274 146672,1571 146672,1881 146672,2779 146672,5906 146673,30 146674,1033 146676,424 146677,328 146678,422 146679,422 146680,422 146681,422 146682,422 146683,422 146684,422 146685,422 146686,422 146687,422 146688,1522 146689,1452 146690,287 146691,146692 146693,4611 146694,1544 146695,302 146695,861 146695,893 146696,579 146697,146698 146699,146698 146700,146698 146701,146698 146702,146698 146703,146698 146704,146698 146705,147 146706,18831 146707,422 146708,809 146709,4611 146710,1544 146711,356 146713,233 146714,3623 146715,481 146716,6068 146717,146718 146719,575 146719,1769 146720,1556 146721,65 146722,676 146722,801 146722,1140 146723,1544 146724,4611 146725,4611 146726,1544 146727,424 146728,302 146729,827 146730,393 146731,4611 146732,1544 146733,5405 146734,83 146735,175 146736,58 146737,298 146738,142426 146740,1608 146741,1608 146742,1608 146744,1608 146746,949 146747,269 146748,818 146749,3 146750,483 146751,2083 146752,859 146753,663 146754,175 146755,298 146756,424 146758,22 146759,424 146760,1240 146761,146762 146763,577 146765,994 146766,138 146767,116 146767,2087 146768,2674 146769,16153 146770,602 146771,872 146772,760 146773,592 146774,261 146775,718 146776,2775 146777,447 146778,592 146779,602 146780,14797 146781,2737 146782,518 146783,3193 146784,3804 146785,31122 146786,19010 146787,192 146787,408 146787,536 146787,1313 146787,1893 146787,2617 146787,24763 146788,1323 146789,102 146790,408 146791,1326 146794,252 146794,1220 146794,1222 146795,538 146796,255 146797,2979 146799,1608 146800,106 146802,4611 146803,1544 146804,4611 146805,1544 146806,1181 146808,5213 146810,72 146811,72 146812,2923 146813,167 146813,299 146814,195 146815,640 146817,146818 146819,273 146820,58 146820,301 146820,304 146820,356 146820,360 146820,442 146820,872 146820,1010 146820,1363 146820,1715 146820,1836 146820,1893 146820,2334 146820,3474 146820,13361 146820,81070 146821,30 146822,65 146823,248 146824,22 146826,302 146827,8990 146828,30 146829,146830 146831,435 146832,843 146833,422 146834,56 146835,992 146835,1300 146835,1579 146835,1718 146836,439 146836,671 146837,509 146838,149 146838,406 146839,2319 146840,346 146841,467 146841,868 146842,784 146843,171 146845,202 146847,72 146848,818 146849,483 146850,1531 146851,272 146852,292 146853,1326 146854,433 146855,344 146856,72 146857,285 146858,1608 146859,447 146860,4895 146861,622 146862,1893 146862,5547 146863,1381 146864,22 146866,209 146866,302 146867,980 146868,663 146869,192 146870,142473 146871,146871 146872,146873 146874,146873 146875,146873 146876,146873 146877,146873 146878,146873 146879,30 146880,30 146881,22 146882,3623 146883,298 146884,485 146885,818 146886,1415 146887,55849 146888,1392 146889,1353 146890,248 146891,809 146892,23783 146893,1298 146894,146895 146896,146895 146897,146895 146898,1181 146899,525 146900,50 146900,158 146900,192 146900,195 146900,285 146900,306 146900,307 146900,393 146900,406 146900,422 146900,620 146900,1181 146900,1370 146900,1515 146900,5874 146901,557 146902,30 146903,1265 146903,1266 146904,298 146905,485 146906,8719 146907,138 146908,865 146909,557 146910,137 146911,118 146911,4597 146912,88820 146913,557 146914,313 146915,2989 146915,2991 146916,313 146917,336 146917,676 146917,1010 146919,72 146920,2867 146920,2868 146921,358 146922,30 146923,481 146925,72 146926,72 146927,525 146928,30 146929,146930 146931,130 146932,195 146933,1309 146934,1983 146935,22 146936,1556 146937,30 146938,72 146939,527 146939,138686 146940,175 146941,298 146942,631 146943,146944 146945,850 146946,332 146947,294 146949,2116 146950,1983 146951,146952 146953,40566 146954,175 146956,298 146957,408 146957,1298 146958,35 146959,577 146960,1007 146961,146962 146963,146964 146963,190918 146965,34 146965,35 146966,146967 146968,146969 146970,34 146970,35 146970,202 146970,217 146970,283 146970,455 146970,536 146970,949 146970,1001 146970,1201 146970,1274 146970,1467 146970,1927 146970,2266 146970,2784 146970,2979 146970,4637 146970,7092 146971,424 146972,146973 146972,151555 146974,273 146975,146976 146977,146978 146979,372 146979,1231 146980,30 146981,309 146981,310 146982,422 146983,422 146984,422 146985,422 146986,422 146987,422 146988,422 146989,422 146990,422 146991,422 146992,1085 146993,225 146994,146994 146995,207 146996,146997 146998,2590 146999,1414 147001,147002 147001,147893 147003,147002 147003,147893 147004,872 147005,1429 147006,225 147007,668 147008,393 147009,22 147010,586 147010,1243 147011,422 147012,8884 147013,1143 147014,1085 147015,147016 147017,355 147018,1247 147019,452 147020,184 147021,536 147023,147024 147025,147024 147026,147024 147027,147024 147028,147024 147029,147024 147030,147024 147031,147024 147032,171 147033,233 147034,818 147034,66297 147035,1858 147036,1860 147037,147038 147039,83 147040,1284 147040,1860 147041,22 147042,1983 147043,4101 147044,147045 147049,83 147050,481 147051,147052 147053,83 147054,147055 147056,10 147057,255 147058,147059 147060,147061 147062,158 147064,510 147065,1323 147066,408 147067,102 147068,1326 147069,2506 147070,2506 147071,1590 147071,1805 147072,44 147073,626 147074,30 147076,147077 147078,206 147079,586 147079,875 147080,147081 147082,366 147082,439 147082,536 147082,872 147082,1033 147082,1805 147082,30331 147083,147084 147085,32 147085,137 147085,275 147085,358 147085,417 147085,444 147085,615 147085,762 147085,770 147085,972 147085,1143 147085,1220 147085,1222 147085,1241 147085,1983 147085,3623 147085,5933 147085,15523 147085,103860 147085,115659 147085,144556 147085,154408 147086,1983 147087,147088 147089,147090 147091,147092 147093,147094 147095,704 147097,2191 147098,3094 147099,83 147099,694 147099,1837 147100,202 147101,147102 147103,779 147104,1370 147105,3623 147106,171 147108,3623 147109,147110 147111,3623 147112,30 147113,147114 147115,483 147116,3623 147117,240 147118,1010 147119,1235 147119,1335 147120,1479 147121,1370 147122,147123 147124,390 147125,147126 147125,149989 147127,1707 147128,592 147129,22 147129,1227 147129,86416 147130,1082 147131,22 147131,211 147133,72 147134,2506 147135,72 147136,1415 147137,255 147138,72 147139,222 147140,602 147141,19 147142,1858 147143,1860 147144,481 147145,841 147146,640 147147,366 147148,298 147149,422 147150,56 147151,147152 147153,107 147154,2416 147154,2417 147155,292 147156,338 147157,355 147158,298 147159,1133 147160,3538 147161,233 147162,2574 147163,1188 147164,893 147165,147166 147167,1127 147168,481 147170,147171 147173,1860 147174,1858 147175,1858 147176,1860 147177,485 147178,298 147180,147181 147182,2989 147182,2991 147183,54 147184,298 147185,485 147186,408 147187,1323 147188,102 147189,1326 147190,142430 147190,147191 147192,1983 147193,872 147194,932 147195,147196 147197,3258 147198,147199 147201,135 147202,5375 147203,79 147203,525 147204,1707 147205,3623 147207,72 147208,72 147209,140 147209,158 147209,160 147209,178 147209,340 147209,406 147209,479 147209,1287 147209,1659 147209,1893 147209,2931 147209,4504 147209,8598 147209,8822 147210,885 147210,13704 147211,957 147212,957 147213,147214 147215,957 147216,1707 147217,298 147218,485 147219,298 147220,485 147221,72 147222,298 147223,485 147224,195 147224,406 147224,779 147225,240 147227,289 147227,290 147227,144988 147228,2371 147230,850 147231,151 147233,137 147234,240 147235,557 147236,1983 147237,557 147238,1983 147239,1983 147240,30 147241,3623 147242,147243 147244,784 147244,258887 147245,1983 147246,1983 147247,1983 147248,1370 147249,626 147250,718 147251,422 147252,422 147253,422 147254,422 147255,422 147256,422 147257,422 147258,422 147259,422 147260,422 147261,7092 147262,72 147263,1392 147264,1983 147265,1983 147266,1983 147267,30 147268,743 147269,1844 147270,87 147270,217 147270,392 147270,509 147270,510 147270,595 147270,703 147270,843 147270,872 147270,1151 147270,1453 147270,1465 147270,1572 147270,1722 147270,1836 147270,2274 147270,2697 147270,24763 147271,142473 147272,289 147272,290 147272,144988 147273,602 147274,147275 147276,142433 147277,30 147278,147279 147280,1179 147281,602 147282,483 147283,269 147284,175 147285,147286 147287,147286 147288,968 147289,1370 147290,147291 147292,151 147293,292 147294,366 147295,366 147296,294 147297,296 147298,298 147299,147300 147301,147302 147303,41 147305,422 147306,56 147307,30 147308,1849 147308,32784 147309,192 147311,301 147311,717 147311,1231 147311,1782 147312,355 147313,298 147314,485 147315,83 147317,485 147318,298 147320,147321 147322,147323 147325,455 147326,640 147327,56 147327,422 147328,142426 147328,145751 147330,349 147331,312 147332,34 147332,35 147332,83 147332,217 147332,313 147332,634 147332,1313 147332,1718 147332,2224 147332,2931 147332,6298 147333,338 147334,640 147335,137 147336,30 147338,233 147339,1688 147340,22 147342,22 147343,422 147344,2191 147345,366 147346,500 147347,663 147348,22 147349,422 147350,2017 147352,3138 147353,217 147354,640 147355,107 147356,872 147358,10 147359,1238 147360,868 147361,1608 147362,805 147363,1608 147364,779 147364,2701 147365,795 147367,1849 147367,32784 147368,868 147368,156379 147370,1452 147371,671 147372,4066 147373,481 147374,1782 147375,795 147376,41 147376,58 147376,264 147376,309 147376,310 147376,328 147376,344 147376,390 147376,439 147376,455 147376,538 147376,779 147376,872 147376,877 147376,1289 147376,1381 147376,1436 147376,1452 147376,16687 147376,227669 147377,2244 147378,3507 147379,83 147380,149 147380,859 147380,1623 147381,1089 147382,175 147383,298 147384,147385 147386,671 147388,717 147389,1608 147393,147 147395,184 147396,1370 147397,309 147397,310 147398,142426 147399,3623 147400,431 147400,1789 147401,424 147402,1707 147403,22 147404,1860 147405,1858 147406,202 147407,22 147408,784 147408,1118 147408,2424 147409,255 147410,941 147411,37 147412,22 147413,58 147413,1140 147413,1653 147413,1836 147413,2436 147413,4771 147413,136072 147414,15 147415,356 147415,852 147417,1821 147418,1282 147420,41 147420,3135 147421,1282 147422,298 147423,485 147424,22 147425,2620 147426,222 147427,76096 147431,2620 147432,2312 147433,104 147433,136 147433,298 147433,1368 147433,2105 147435,2620 147437,626 147442,302 147442,579 147443,41 147446,752 147446,5540 147451,143287 147452,2620 147453,2146 147454,536 147455,485 147458,50 147458,994 147458,1181 147458,1425 147460,83 147461,127158 147462,22 147462,1860 147464,83 147465,136 147467,192 147467,406 147467,1623 147468,30 147470,83 147471,147472 147471,177375 147471,178776 147475,1132 147475,142473 147475,142879 147476,1616 147477,272 147478,447 147479,2775 147480,301 147481,1160 147482,10 147483,2784 147484,301 147485,292 147485,1776 147486,83 147487,83 147488,83 147490,875 147491,3623 147492,107 147492,745 147493,4691 147495,158 147495,192 147498,76096 147499,2620 147501,850 147502,1177 147503,919 147504,1467 147505,44 147506,86 147508,145240 147509,1238 147510,852 147512,1556 147514,1370 147515,207 147515,328 147515,390 147515,702 147515,873 147515,874 147515,1133 147516,147 147516,158 147516,406 147517,1634 147519,640 147520,1858 147521,1860 147522,1805 147525,1789 147526,3538 147527,673 147528,147529 147530,338 147530,4571 147530,88820 147532,167 147535,2620 147536,586 147538,147539 147541,1419 147543,2191 147545,1238 147547,30 147548,2083 147548,2557 147549,298 147550,485 147551,79 147552,393 147553,1119 147555,83 147556,142405 147556,154408 147557,2979 147558,2048 147559,571 147560,2775 147561,447 147562,623 147562,1805 147563,30 147564,19010 147565,217 147566,138686 147567,206 147568,147 147569,1370 147570,30 147571,8798 147572,2668 147573,435 147574,30 147575,640 147576,195 147577,483 147578,30 147579,772 147580,34 147580,1235 147580,3804 147580,15807 147582,65 147582,171 147582,467 147583,634 147583,2224 147583,2646 147584,30 147585,72 147586,344 147587,285 147588,147589 147590,2617 147591,30 147592,30 147593,850 147595,65 147595,71 147595,272 147595,611 147596,269 147597,1454 147598,2210 147598,4237 147599,147600 147601,248 147601,5405 147604,255 147605,142433 147606,1287 147607,1608 147608,536 147609,142405 147610,1370 147611,248 147611,5405 147612,30 147613,1370 147614,158 147614,406 147614,779 147614,1181 147614,1515 147615,1515 147617,147618 147619,147620 147621,1287 147622,406 147623,3507 147624,56 147624,147 147624,192 147624,1243 147624,3507 147624,240174 147625,147626 147627,1289 147628,2506 147629,885 147629,13704 147630,9024 147631,147632 147633,1282 147633,2210 147633,4237 147633,182162 147635,861 147636,1623 147637,644 147638,2146 147639,147640 147642,217 147643,30 147644,346 147646,58 147647,3507 147648,3370 147648,14453 147649,30 147650,346 147651,30 147652,79 147653,147654 147655,1707 147656,147657 147658,147659 147660,422 147661,56 147662,3623 147664,58 147665,994 147666,46 147667,147668 147669,30 147670,147671 147672,19 147673,473 147673,1240 147673,2173 147673,4252 147673,5405 147674,50 147674,146 147674,147 147674,158 147674,358 147674,406 147674,510 147674,779 147674,1181 147674,1515 147674,92476 147675,147123 147676,431 147677,406 147678,20 147678,207 147678,390 147678,424 147678,438 147678,736 147678,835 147678,874 147678,907 147678,1282 147678,1425 147678,1432 147678,1634 147678,7155 147679,30 147680,422 147681,56 147682,58 147683,994 147684,46 147685,2923 147686,58 147687,994 147688,46 147689,42220 147691,30 147692,623 147692,1805 147693,250 147693,1684 147694,298 147695,485 147696,733 147697,3538 147699,147700 147701,30 147702,147703 147704,406 147705,1551 147706,147707 147708,264 147709,147710 147711,850 147712,147713 147714,147715 147716,147717 147720,147721 147723,171 147724,30 147725,136 147725,137 147726,1319 147727,30 147728,68 147729,147730 147731,8854 147732,1769 147733,147734 147735,147736 147737,435 147738,843 147739,147740 147741,273 147742,843 147743,222 147744,34 147744,35 147744,313 147745,56 147746,422 147747,2889 147748,143287 147749,309 147749,310 147750,388 147751,104 147751,557 147751,885 147751,1368 147751,1939 147751,5405 147751,13704 147752,366 147753,366 147754,366 147755,366 147756,809 147756,811 147757,355 147758,113878 147759,809 147760,30 147761,772 147762,147763 147764,1818 147765,1858 147766,1860 147767,347 147767,702 147767,752 147767,873 147767,874 147767,1133 147767,1210 147767,1801 147767,3182 147767,28693 147767,44743 147769,1858 147770,1860 147771,1462 147771,4475 147772,435 147773,217 147773,467 147774,147775 147776,147777 147778,500 147779,1052 147780,1962 147781,1882 147782,2775 147783,54 147784,147785 147786,344 147787,72 147788,285 147790,30 147791,835 147792,147793 147794,500 147795,1052 147796,1962 147797,1882 147798,2775 147799,54 147800,147801 147802,147801 147803,147801 147804,147801 147805,147801 147806,147801 147807,147801 147808,147801 147810,75912 147812,1285 147812,127158 147813,346 147814,510 147817,349 147818,143287 147820,147821 147822,147823 147825,30 147826,1140 147826,1836 147826,3474 147827,671 147828,6895 147828,13445 147828,24605 147828,34524 147828,93134 147828,113791 147828,119416 147828,120907 147828,121209 147828,122136 147828,123396 147828,125472 147828,126053 147828,128472 147828,128825 147828,128965 147828,129101 147828,130840 147828,131532 147828,132068 147828,133020 147828,134958 147828,134968 147828,145207 147828,146413 147828,146748 147828,147828 147828,147847 147828,148531 147828,149567 147828,150477 147828,150561 147828,152526 147828,158399 147828,158474 147828,158550 147828,165734 147828,166779 147828,167617 147828,168644 147828,169191 147828,169517 147828,170450 147828,221942 147828,222032 147828,224143 147828,224171 147828,225684 147829,422 147830,422 147831,422 147832,422 147833,422 147834,422 147835,422 147836,422 147837,422 147838,422 147839,1707 147840,30 147841,147801 147842,30 147843,151 147844,147845 147846,784 147846,1118 147848,18831 147850,298 147851,485 147852,175 147853,83 147854,147855 147856,9010 147857,298 147858,1774 147858,147859 147859,663 147861,481 147862,233 147863,5547 147864,147865 147864,159902 147864,246879 147864,249827 147866,147867 147868,1579 147869,422 147870,3653 147873,390 147874,592 147875,298 147876,485 147877,264 147877,16687 147878,485 147879,298 147880,2671 147881,137 147882,104 147883,167 147883,299 147883,3218 147883,207045 147884,7155 147885,1807 147886,298 147888,1085 147888,75912 147889,1707 147890,119 147891,134 147892,1127 147894,1012 147895,1564 147896,30 147897,72 147898,344 147899,285 147900,184 147902,3695 147903,30 147904,640 147905,2775 147906,447 147907,818 147908,142426 147909,4895 147910,83 147911,215 147911,141840 147911,148456 147911,148875 147911,152789 147912,406 147913,422 147914,56 147915,217 147916,457 147916,673 147916,1070 147917,1858 147918,1860 147919,72 147920,344 147921,285 147923,389 147923,18831 147924,1293 147925,2191 147926,142405 147927,424 147928,1293 147929,7194 147930,697 147931,79 147931,217 147931,247 147931,1181 147932,175 147933,1462 147933,8537 147934,298 147936,269 147937,467 147938,1133 147939,278 147940,885 147940,13704 147941,72 147942,285 147943,344 147944,72 147945,285 147946,344 147948,1858 147949,1860 147950,31073 147951,1722 147952,7194 147953,1309 147955,1818 147956,147956 147957,818 147958,72764 147959,1707 147960,163 147961,389 147961,433 147962,852 147963,298 147964,485 147965,147966 147968,720 147969,289 147969,290 147969,144988 147970,72 147971,344 147972,285 147973,272 147975,455 147976,72 147977,344 147978,285 147979,3623 147982,34 147982,35 147982,18831 147983,79 147984,1274 147985,48 147985,583 147986,147987 147988,417 147989,1119 147989,103860 147990,142426 147991,72 147992,344 147993,285 147994,2191 147996,147997 147999,72 148000,344 148001,285 148002,30 148003,72 148004,344 148005,285 148006,586 148010,1274 148011,1274 148012,392 148012,875 148013,72 148014,344 148015,285 148016,485 148017,298 148020,99 148021,809 148022,148023 148024,72 148025,285 148026,344 148027,5213 148028,30 148029,148030 148031,1858 148032,1860 148036,187 148037,1252 148037,1253 148038,171 148039,1096 148040,1127 148041,2646 148042,1893 148043,875 148044,623 148044,1805 148045,175 148048,148049 148050,571 148051,298 148052,694 148052,852 148052,1085 148052,4222 148053,2797 148054,305 148054,841 148054,3695 148054,7429 148058,147 148059,264 148061,3 148062,2617 148063,104 148064,843 148066,1359 148067,2286 148068,30 148073,30 148074,2989 148074,2991 148075,809 148076,994 148076,1255 148076,1432 148076,1775 148076,2674 148076,50943 148076,171294 148078,148079 148080,784 148081,267 148082,94 148082,885 148082,2787 148082,13704 148083,9010 148084,1070 148085,148086 148087,298 148088,485 148089,1417 148090,79 148090,1462 148091,3 148092,9010 148093,326 148094,273 148094,399 148094,406 148095,4223 148096,34 148096,35 148097,21442 148098,167 148099,483 148100,389 148101,1019 148102,932 148104,147 148104,23783 148105,255 148106,148107 148108,994 148109,779 148110,885 148110,13704 148112,68 148113,907 148114,1127 148114,1893 148114,49057 148114,81070 148115,240 148116,1285 148117,1293 148118,30 148119,148120 148121,8270 148122,994 148123,2506 148124,148125 148126,435 148127,2191 148128,240 148129,5326 148130,18831 148131,81 148132,843 148133,200 148134,406 148135,24505 148136,175 148137,801 148138,140 148139,267 148140,298 148141,2205 148141,33424 148142,994 148143,406 148144,30236 148145,3474 148147,1381 148148,919 148149,994 148150,30 148151,175 148152,298 148153,1381 148154,994 148155,313 148156,1132 148157,994 148158,602 148159,602 148160,44 148161,148162 148163,2224 148164,1984 148164,3949 148165,3069 148166,148167 148168,515 148170,147 148170,158 148171,148172 148171,151008 148171,239106 148173,1381 148174,483 148175,142405 148176,148177 148178,1556 148179,148180 148179,183998 148179,239216 148179,239493 148179,249824 148179,253732 148179,262163 148179,263651 148181,920 148183,1707 148184,148185 148186,356 148187,148188 148190,1143 148191,389 148192,415 148192,1143 148193,147 148193,1458 148193,89035 148194,575 148194,697 148195,1 148196,6068 148197,2671 148198,516 148199,18831 148200,148201 148202,30 148203,808 148204,1467 148205,148206 148207,30 148208,148209 148210,1634 148211,148212 148213,140 148214,148215 148216,2989 148216,2991 148217,3 148218,72 148219,285 148220,344 148221,355 148222,366 148223,366 148224,571 148225,37414 148226,497 148226,1172 148227,58 148228,46 148229,994 148230,1984 148230,3949 148231,852 148232,143287 148233,148234 148235,30 148236,1385 148237,406 148238,137 148239,994 148241,1425 148242,292 148243,298 148244,485 148245,298 148246,485 148249,392 148250,148251 148252,5591 148254,97 148255,862 148256,206 148257,422 148258,422 148259,743 148260,422 148261,422 148262,422 148263,422 148264,422 148265,134 148266,422 148267,422 148268,422 148270,1608 148271,148272 148274,4260 148274,156379 148276,312 148276,991 148276,1707 148276,2605 148279,406 148281,136 148281,137 148281,312 148284,485 148285,994 148286,827 148287,1818 148288,292 148289,233 148290,1544 148291,4611 148292,1544 148293,4611 148294,868 148294,1572 148295,481 148296,292 148297,225 148297,805 148298,20 148298,1070 148298,1402 148298,1707 148298,2923 148299,83 148300,292 148301,1359 148302,136 148303,994 148304,636 148306,994 148307,577 148308,292 148309,3804 148310,338 148310,1326 148310,21827 148310,154469 148310,159294 148310,171069 148310,172880 148312,994 148314,138686 148315,175 148316,292 148317,298 148318,292 148319,1616 148321,994 148322,142433 148323,994 148324,83 148327,515 148328,142409 148328,146280 148329,305 148330,298 148331,485 148332,536 148333,41 148333,1462 148333,8537 148334,994 148336,1070 148338,302 148339,424 148340,184 148341,907 148342,298 148343,485 148344,2867 148344,2868 148345,30 148347,1984 148348,3653 148349,292 148350,485 148351,298 148353,668 148354,22 148356,626 148357,1033 148358,980 148359,148360 148361,1133 148361,1392 148363,9010 148364,292 148365,2296 148365,101935 148366,148367 148368,996 148369,602 148371,994 148373,298 148374,485 148375,30 148376,130776 148377,30 148379,107 148380,292 148381,994 148382,30 148383,138686 148384,175 148385,3623 148386,3623 148387,972 148387,1010 148388,292 148389,298 148392,518 148393,8373 148394,222 148395,4611 148396,1544 148397,4611 148398,1544 148399,994 148401,200 148401,832 148402,6068 148403,292 148404,1326 148405,934 148405,980 148406,292 148407,292 148408,292 148409,779 148410,292 148411,142405 148411,148412 148413,685 148413,2460 148414,1400 148415,142405 148415,148412 148416,1858 148417,1860 148418,298 148419,485 148420,1608 148421,1132 148422,843 148423,292 148424,1370 148426,1085 148427,1300 148427,3258 148428,509 148429,3769 148430,313 148431,37088 148432,146 148433,344 148434,647 148435,148436 148437,1105 148437,138686 148438,1298 148440,148441 148442,79 148444,872 148444,1796 148446,1608 148447,1132 148448,302 148448,1893 148451,577 148452,1132 148453,1608 148454,227 148456,176782 148457,264 148459,563 148460,5213 148462,2210 148462,4237 148463,211 148466,142473 148466,142879 148468,408 148469,1323 148470,102 148471,1326 148472,1877 148473,459 148474,142870 148475,491 148476,5547 148477,148478 148479,59021 148479,60576 148480,48 148481,435 148482,148483 148484,22 148485,119 148486,473 148487,932 148488,175 148488,206 148488,253147 148489,18831 148490,1392 148491,32 148491,392 148491,1363 148491,1858 148491,76096 148492,843 148493,146 148493,285 148493,406 148493,1655 148494,30 148496,994 148497,994 148498,885 148498,13704 148499,957 148499,1815 148501,885 148501,13704 148502,2146 148503,1305 148504,467 148505,779 148506,240 148508,68069 148510,147 148511,264 148512,920 148514,255 148515,68069 148517,1515 148518,467 148521,217 148522,579 148523,1556 148524,68069 148525,302 148526,861 148527,137 148528,148529 148530,1238 148532,1274 148533,148534 148535,1452 148536,417 148537,406 148538,1381 148539,148540 148541,68069 148542,1860 148543,5405 148544,22 148545,1707 148546,611 148547,446 148548,148548 148549,862 148549,6068 148550,30 148551,30 148552,2590 148553,30 148554,148555 148556,148557 148556,150907 148558,805 148559,5906 148560,557 148561,626 148562,278 148563,137 148564,862 148565,30 148566,15573 148567,207 148568,1858 148569,1860 148570,1127 148571,148572 148573,481 148574,483 148575,146 148576,647 148577,344 148578,18831 148578,55210 148579,1429 148580,668 148581,148582 148583,206 148584,1707 148585,148586 148587,148586 148588,148586 148589,148586 148590,148586 148591,557 148592,640 148593,148594 148595,2209 148596,467 148597,1707 148598,304 148599,1332 148601,56 148601,158 148601,175 148601,285 148601,336 148601,406 148601,620 148601,640 148601,779 148601,875 148601,1425 148601,1515 148601,68069 148602,1143 148603,143287 148604,44 148605,18831 148606,195 148606,406 148606,779 148607,1309 148607,1955 148607,2775 148608,148609 148608,204121 148610,1370 148611,358 148612,148613 148614,148615 148616,1319 148617,1235 148617,1335 148618,557 148619,148620 148621,1515 148622,144556 148623,1634 148624,795 148625,148626 148627,148626 148628,2116 148629,779 148629,1181 148630,1192 148631,2205 148631,33424 148632,148633 148634,344 148635,68069 148636,1201 148637,34 148637,35 148637,714 148638,30 148639,1871 148640,1556 148641,577 148642,148643 148646,697 148646,1769 148647,872 148648,862 148648,2590 148649,148650 148651,148650 148652,148653 148654,366 148655,366 148656,72 148657,255 148658,356 148658,1243 148659,850 148660,148661 148662,30 148664,30 148665,4611 148666,1544 148667,862 148668,467 148669,18831 148670,4611 148671,1544 148672,4611 148673,1544 148674,355 148675,671 148676,79 148677,1707 148679,726 148680,697 148681,75912 148682,726 148683,148684 148685,4611 148686,1544 148688,305 148689,5547 148690,493 148690,3148 148691,872 148692,83 148693,2782 148694,4611 148695,1544 148696,868 148697,68 148699,1634 148701,148702 148703,346 148704,809 148705,148706 148707,147 148708,148709 148710,4611 148711,1544 148712,3367 148713,1544 148714,2296 148715,148716 148717,148716 148718,148716 148720,18831 148721,366 148722,233 148723,422 148724,56 148725,1789 148726,148727 148728,292 148729,422 148730,422 148731,422 148732,422 148733,422 148734,422 148735,287 148735,314 148736,422 148737,422 148738,527 148738,95152 148739,302 148740,422 148742,380 148742,390 148742,907 148742,972 148742,973 148742,1284 148742,1544 148742,1732 148742,2191 148742,2372 148742,3207 148742,4362 148742,8032 148742,9684 148742,14572 148742,15272 148742,17154 148742,20055 148742,22544 148742,23351 148742,25272 148742,31785 148742,34258 148742,38974 148742,39562 148742,45590 148742,48283 148742,48892 148742,48895 148742,49647 148742,52520 148742,54504 148742,59920 148742,62204 148742,69679 148742,82763 148742,99597 148742,103207 148742,112527 148742,117099 148742,132085 148742,134042 148742,140569 148742,148742 148742,150114 148742,158990 148742,163057 148742,165669 148742,165894 148742,167287 148742,178252 148742,179336 148742,181948 148742,192627 148742,192668 148742,193765 148742,194407 148742,194532 148742,194533 148742,194540 148742,194546 148742,195168 148742,195173 148742,195180 148742,197614 148742,198780 148742,199511 148742,199763 148742,204041 148742,205673 148742,219861 148742,221896 148742,222808 148742,223916 148742,228158 148742,228439 148742,230305 148742,232032 148742,233453 148742,233472 148742,233583 148742,234055 148742,234088 148742,234140 148742,234171 148742,234227 148742,234267 148742,234343 148742,234803 148742,234804 148742,234807 148742,234818 148742,234859 148742,234976 148742,234996 148742,235263 148742,235786 148742,235868 148742,235878 148742,235928 148742,235989 148742,235998 148742,236009 148742,236014 148742,236032 148742,236045 148742,236067 148742,236070 148742,236084 148742,236114 148742,236125 148742,236146 148742,236152 148742,236164 148742,236169 148742,236184 148742,236320 148742,236341 148742,236347 148742,236448 148742,236452 148742,236542 148742,236549 148742,236571 148742,236612 148742,236644 148742,236652 148742,236775 148742,236847 148742,236894 148742,236898 148742,236941 148742,236970 148742,236977 148742,236982 148742,237565 148742,237917 148742,238221 148742,238248 148742,238277 148742,239863 148742,239934 148742,239968 148742,240044 148742,241825 148742,242171 148742,242457 148742,243320 148742,243331 148742,243478 148742,243575 148742,243605 148742,243931 148742,243987 148742,244116 148742,244143 148742,244147 148742,244172 148742,244178 148742,244213 148742,244237 148742,244265 148742,244887 148742,244978 148742,247829 148742,247927 148742,247962 148742,249701 148742,249843 148742,250760 148742,250988 148742,251318 148742,251538 148742,253312 148742,254174 148742,255456 148742,257403 148742,260158 148743,422 148745,148746 148748,500 148749,1962 148750,1052 148751,1882 148752,2775 148753,54 148754,143287 148756,292 148757,3653 148758,251 148758,516 148758,1243 148759,406 148760,4611 148761,1544 148762,850 148763,372 148763,809 148764,1556 148766,178 148766,315 148766,346 148766,393 148766,435 148766,439 148766,538 148766,671 148766,934 148766,996 148766,1068 148766,1294 148766,1590 148766,1612 148766,1644 148766,1877 148766,2353 148766,6661 148767,138686 148768,1466 148769,175 148770,83 148772,481 148773,1531 148773,4455 148773,4545 148773,56150 148774,298 148775,843 148776,298 148777,485 148778,872 148779,68 148780,217 148780,1419 148781,3653 148782,720 148782,1284 148783,298 148784,485 148785,68069 148786,2557 148787,148788 148790,195 148792,422 148793,56 148797,2671 148798,148799 148800,626 148801,872 148802,2371 148803,2784 148804,1370 148805,298 148806,485 148808,158 148809,283 148809,455 148811,83 148812,144556 148814,2353 148816,83 148818,302 148818,579 148819,1132 148820,1608 148821,6119 148822,337 148823,392 148823,697 148826,485 148827,83 148828,138686 148829,175 148831,298 148832,1893 148833,2353 148834,1634 148836,292 148837,222 148837,18831 148838,86 148839,50 148840,516 148841,160 148841,1298 148842,581 148846,1467 148847,1425 148850,292 148851,209 148852,640 148854,433 148855,1353 148856,1544 148857,4611 148858,292 148859,2353 148860,3846 148861,142426 148862,148863 148864,287 148865,577 148866,222 148866,536 148866,2784 148867,1467 148868,1608 148869,3555 148870,142405 148870,154408 148871,142433 148872,148873 148874,417 148874,1635 148876,301 148876,968 148877,142426 148878,1132 148879,1608 148880,1345 148881,1345 148882,292 148883,1167 148884,148885 148886,158 148886,336 148886,406 148886,620 148886,779 148886,1163 148886,1181 148886,5726 148886,8055 148887,240 148888,417 148889,2989 148889,2991 148890,3 148891,151 148892,1010 148893,795 148894,875 148896,141912 148897,875 148898,1544 148900,301 148902,22 148903,298 148904,485 148906,626 148909,30 148910,118 148910,4597 148911,622 148912,406 148914,843 148915,843 148917,406 148918,918 148919,83 148920,467 148921,918 148922,2626 148923,640 148924,843 148925,148926 148927,1984 148927,3949 148928,10 148928,455 148928,1122 148929,200 148930,292 148931,640 148932,885 148932,13704 148933,2353 148934,861 148935,2923 148936,1243 148936,240174 148937,577 148938,209 148938,302 148939,6068 148940,843 148941,1167 148942,222 148942,18831 148943,1235 148943,1335 148944,18831 148945,148946 148947,483 148948,292 148949,422 148950,56 148951,1893 148952,148953 148954,68 148954,356 148954,408 148954,852 148954,3069 148955,467 148956,422 148957,56 148958,1181 148960,72 148961,602 148962,602 148963,3138 148964,148965 148966,148965 148968,372 148968,589 148968,968 148969,142473 148970,192 148970,406 148970,439 148970,818 148970,2371 148970,103698 148970,118336 148970,127158 148971,408 148972,102 148973,1323 148974,1326 148975,83 148976,2979 148977,292 148978,2296 148979,640 148980,63 148981,83 148982,148983 148984,1509 148984,1551 148985,435 148986,5440 148988,142405 148989,1551 148990,1374 148991,3111 148992,30 148993,1467 148994,1235 148994,1335 148995,26041 148996,30 148997,422 148998,56 148999,422 149000,56 149001,356 149002,1370 149003,843 149004,1776 149005,885 149005,13704 149006,30 149007,72 149008,2312 149009,1983 149010,149011 149012,2719 149013,192 149014,1515 149015,788 149016,192 149017,22 149018,149018 149019,30 149020,68069 149021,30 149023,557 149024,862 149025,149026 149025,149072 149027,920 149028,440 149028,1033 149029,575 149030,994 149031,107 149031,4771 149032,850 149033,392 149034,2931 149035,1243 149036,149037 149038,422 149039,56 149040,323 149041,298 149042,485 149043,30 149044,149045 149046,142430 149047,138686 149048,175 149049,588 149049,590 149049,1072 149049,1419 149049,3252 149049,4637 149050,298 149051,217 149052,149053 149054,393 149055,422 149056,56 149057,30 149058,58 149059,30 149060,136 149061,298 149062,485 149063,1888 149065,83 149066,3623 149067,167 149068,30 149069,1449 149070,298 149071,485 149073,72 149074,1175 149075,149076 149077,420 149077,652 149078,30 149080,72 149081,344 149081,2646 149082,255 149083,72 149084,44 149085,72 149086,72 149087,563 149088,30 149089,72 149090,1659 149091,1849 149092,138686 149093,175 149094,298 149095,5547 149096,30 149097,1 149097,1572 149098,149099 149098,154187 149100,640 149101,1240 149101,1465 149102,1782 149103,640 149104,50 149105,1467 149106,455 149107,2424 149108,1871 149109,2421 149110,83 149111,13980 149112,192 149113,3804 149114,7416 149115,19 149115,34 149115,35 149115,217 149115,222 149115,313 149115,379 149115,385 149115,399 149115,477 149115,536 149115,634 149115,660 149115,781 149115,891 149115,949 149115,1201 149115,1274 149115,1571 149115,1618 149115,1881 149115,2224 149115,2266 149115,2553 149115,2646 149115,2784 149115,2944 149115,4672 149115,5326 149115,6298 149115,7092 149115,7698 149115,8463 149115,17346 149115,18831 149115,23287 149115,28130 149115,57354 149115,217598 149116,138686 149117,175 149118,298 149119,640 149120,149121 149122,149121 149123,149121 149124,149125 149126,366 149127,366 149128,255 149129,149130 149131,149130 149132,149130 149133,149134 149135,149134 149136,640 149137,1033 149138,3585 149139,149140 149142,59931 149142,84257 149143,5547 149145,30 149146,355 149147,30 149148,30 149150,143287 149152,13661 149154,149155 149156,30 149157,149158 149159,30 149160,292 149161,149162 149163,298 149164,485 149165,292 149166,292 149167,1241 149169,907 149170,292 149171,292 149172,30 149173,663 149174,206 149175,292 149176,1345 149177,994 149178,1392 149178,5662 149179,1181 149180,149181 149182,149183 149184,3623 149185,143287 149186,140 149187,1836 149189,149190 149191,292 149192,259 149192,788 149193,292 149194,146 149195,4355 149196,72 149197,1052 149198,389 149200,422 149201,422 149202,422 149203,422 149204,422 149205,422 149206,422 149207,1122 149208,422 149209,422 149210,422 149211,422 149212,422 149213,140 149214,30 149215,30 149216,30 149217,30 149218,422 149219,30 149220,30 149221,1070 149222,30 149223,222 149223,2944 149224,283 149225,2416 149225,2417 149226,1274 149227,158 149228,536 149229,138686 149230,175 149231,872 149232,298 149233,97 149233,440 149235,202 149236,481 149237,2210 149237,4237 149238,233 149240,2353 149242,298 149243,485 149245,79 149246,46 149246,666 149246,744 149246,750 149246,1124 149246,1167 149247,1326 149248,7768 149249,83 149250,843 149251,336 149251,5726 149252,389 149253,149254 149255,1467 149256,2209 149257,30 149258,1293 149259,750 149259,762 149259,854 149259,1040 149259,1616 149259,2942 149259,29015 149259,72764 149259,98279 149259,124668 149259,130442 149259,149246 149259,154325 149259,155010 149259,156287 149259,174776 149259,177293 149259,179067 149260,30 149261,868 149262,2173 149263,1603 149264,1220 149264,1222 149265,392 149266,138 149269,3623 149270,779 149270,21442 149271,1012 149271,7757 149272,422 149273,56 149274,30 149275,356 149276,392 149276,592 149277,356 149278,4355 149279,1359 149280,83 149281,149282 149283,3623 149284,1179 149285,1858 149286,1860 149287,626 149289,356 149290,302 149290,2116 149291,4611 149292,1544 149294,81070 149295,4611 149296,1544 149297,4611 149298,1544 149299,215 149299,417 149299,805 149299,1016 149299,1282 149299,1462 149299,8537 149300,657 149301,872 149302,97 149302,422 149302,2989 149302,2991 149303,30 149305,142426 149306,994 149307,30610 149307,149308 149309,3623 149310,442 149311,994 149313,202 149314,424 149315,891 149316,22 149318,586 149319,44877 149319,80266 149319,87803 149319,89035 149319,123892 149319,237840 149319,262657 149320,1231 149321,3623 149322,994 149324,422 149324,467 149324,602 149325,202 149326,422 149326,602 149327,1089 149328,447 149329,2775 149330,30 149331,72 149332,3623 149333,72 149334,160 149335,149336 149337,149336 149338,202 149339,393 149340,907 149341,72 149342,994 149343,392 149343,1454 149343,141912 149344,5212 149345,3623 149346,310 149346,3039 149347,149348 149349,602 149350,1608 149351,1132 149352,2979 149353,557 149354,4039 149356,356 149357,273 149357,313 149358,682 149358,72439 149359,149360 149362,2244 149363,2045 149364,149365 149366,1623 149366,4980 149366,5213 149367,525 149368,278 149369,8180 149370,1309 149371,720 149372,1370 149373,1844 149373,2460 149374,72 149375,631 149376,3585 149377,294 149378,918 149379,192 149380,1001 149381,23783 149382,22 149383,372 149384,6059 149385,518 149385,775 149387,932 149388,138686 149389,175 149390,149391 149392,149391 149393,298 149395,994 149396,72 149397,192 149398,518 149400,30 149401,994 149402,147 149403,30 149404,3623 149405,875 149406,4146 149407,86 149408,422 149409,56 149410,1715 149411,86 149412,1893 149413,605 149414,1955 149415,5662 149416,301 149417,1849 149418,1231 149419,5718 149420,1564 149421,2083 149422,752 149423,390 149424,3422 149425,388 149426,3193 149427,1782 149428,1522 149429,1241 149430,2191 149431,3194 149432,907 149433,1167 149434,968 149435,1544 149436,3218 149437,3207 149438,3138 149439,2557 149440,1298 149441,720 149442,1010 149443,240 149444,1359 149445,932 149446,2979 149447,1479 149448,302 149449,30 149451,178 149452,1001 149454,149455 149456,217 149457,2224 149458,8798 149459,7572 149461,1467 149462,477 149462,536 149462,2646 149462,18831 149462,57354 149463,536 149463,852 149463,2784 149463,18831 149464,217 149465,72 149466,30 149468,142430 149469,72 149470,640 149471,2224 149472,640 149473,147 149473,149 149473,158 149474,149475 149476,107 149477,149478 149477,169766 149477,170985 149477,177547 149477,181505 149477,242956 149477,246623 149479,149480 149481,137 149482,640 149483,30 149484,149485 149486,149487 149488,5547 149490,149491 149493,994 149494,493 149495,149496 149497,248 149498,217 149499,149500 149501,809 149502,149503 149504,149503 149505,149506 149507,149506 149508,149506 149509,149506 149510,149506 149511,149506 149512,149506 149513,149506 149514,149506 149515,149516 149517,138686 149518,175 149519,1858 149520,1860 149521,298 149522,1467 149523,640 149524,557 149525,8719 149526,138 149527,865 149528,557 149529,137 149530,118 149530,4597 149531,149532 149533,88820 149534,147 149534,158 149534,336 149534,640 149534,1458 149534,3449 149534,19413 149534,60304 149534,82819 149534,98201 149534,123399 149534,149534 149534,151061 149534,167063 149534,167670 149534,168325 149534,168326 149534,192624 149534,205211 149534,213699 149534,216446 149534,217886 149534,238920 149534,242744 149534,247455 149534,257778 149534,257844 149535,1132 149536,1608 149537,4895 149538,72 149539,1608 149540,1132 149541,138686 149542,175 149543,422 149544,422 149545,422 149546,422 149547,422 149548,298 149549,422 149550,149551 149552,422 149553,422 149554,65 149555,704 149556,422 149557,392 149558,200 149558,1177 149559,149560 149561,72 149562,1749 149563,332 149564,72 149566,1181 149568,72 149569,149570 149571,149570 149572,985 149573,72 149574,481 149575,147 149576,149577 149578,149577 149579,149577 149580,271 149581,147 149582,872 149583,1707 149584,149585 149586,149587 149588,536 149589,149587 149590,149587 149591,149587 149592,149587 149593,149587 149595,149596 149597,149598 149599,264 149600,149601 149602,149601 149603,149601 149604,149601 149605,149601 149606,149601 149607,149601 149608,1381 149609,149610 149612,149613 149614,422 149615,56 149616,1007 149617,123350 149617,149618 149617,224656 149617,257535 149619,225 149620,149621 149622,149621 149623,149621 149624,149621 149625,138686 149626,175 149627,298 149628,149629 149628,158366 149630,8884 149631,240 149632,240 149632,592 149632,1818 149633,149634 149635,149636 149637,149638 149639,149638 149640,149638 149641,149638 149642,1085 149643,483 149644,366 149645,355 149646,149647 149648,344 149649,233 149650,30 149651,30610 149651,149652 149651,227738 149651,227739 149651,227741 149651,231571 149651,242747 149651,262580 149653,149 149654,149655 149656,149657 149658,481 149659,422 149660,56 149662,1149 149663,149664 149665,652 149666,1151 149666,1253 149666,1266 149666,33424 149667,149668 149669,602 149670,149671 149672,779 149673,149674 149675,34 149675,35 149675,37 149675,44 149675,50 149675,58 149675,59 149675,79 149675,97 149675,104 149675,106 149675,111 149675,116 149675,135 149675,143 149675,147 149675,178 149675,195 149675,202 149675,264 149675,278 149675,289 149675,290 149675,312 149675,333 149675,337 149675,372 149675,393 149675,406 149675,422 149675,479 149675,493 149675,516 149675,577 149675,585 149675,588 149675,590 149675,592 149675,620 149675,622 149675,628 149675,640 149675,720 149675,779 149675,872 149675,877 149675,907 149675,949 149675,994 149675,1007 149675,1033 149675,1078 149675,1085 149675,1132 149675,1140 149675,1151 149675,1175 149675,1210 149675,1212 149675,1247 149675,1265 149675,1266 149675,1284 149675,1370 149675,1381 149675,1453 149675,1454 149675,1509 149675,1515 149675,1522 149675,1531 149675,1634 149675,1659 149675,1732 149675,1749 149675,1776 149675,1893 149675,2051 149675,2073 149675,2087 149675,2191 149675,2371 149675,2782 149675,2931 149675,3194 149675,3422 149675,3695 149675,3794 149675,3876 149675,4079 149675,4192 149675,4193 149675,5265 149675,5310 149675,5440 149675,5708 149675,8180 149675,8270 149675,8308 149675,8598 149675,8788 149675,8811 149675,8822 149675,8907 149675,9542 149675,31237 149675,44244 149675,94134 149675,103153 149675,164572 149677,83 149679,1323 149680,102 149681,1326 149682,408 149684,72 149685,72 149686,932 149688,6682 149689,149690 149691,56 149692,422 149693,72 149694,1149 149695,222 149695,1881 149695,18831 149697,149698 149699,5405 149700,1805 149701,481 149702,918 149703,44 149704,149705 149706,289 149706,290 149706,144988 149707,5540 149708,1370 149708,1877 149709,8270 149710,149711 149712,149 149713,149714 149715,149714 149716,149714 149717,149714 149718,149714 149719,1181 149720,83 149721,149 149723,72 149724,149 149725,996 149726,1181 149727,485 149728,298 149729,149730 149731,138686 149732,175 149733,247 149734,298 149735,72 149736,652 149737,1252 149737,1253 149738,1544 149739,4611 149740,1479 149741,390 149742,298 149743,485 149744,142405 149744,148412 149745,149745 149746,611 149747,117374 149748,850 149749,1707 149750,149751 149752,366 149753,485 149754,298 149755,149 149756,2312 149757,2567 149758,760 149759,72 149760,1252 149761,72 149762,1118 149763,217 149764,149765 149766,149767 149769,483 149770,885 149770,13704 149771,149772 149773,72 149774,5547 149775,30 149777,22 149778,30 149779,795 149780,422 149781,56 149782,142405 149783,30 149784,149785 149786,30 149787,30 149788,640 149789,366 149791,107 149792,2416 149792,2417 149793,292 149794,338 149795,355 149796,111 149797,298 149798,233 149799,1133 149800,3538 149805,195 149805,406 149805,779 149806,83 149811,83 149814,918 149815,134 149815,240 149815,372 149815,390 149815,431 149815,590 149815,818 149815,1061 149815,1081 149815,1082 149815,1085 149815,1285 149815,2512 149815,2812 149815,3879 149815,5186 149815,7805 149815,9342 149815,9739 149815,14597 149815,20560 149815,24839 149815,31796 149815,37368 149815,42839 149815,43343 149815,47173 149815,59208 149815,61896 149815,62591 149815,94134 149815,114064 149815,141635 149815,144998 149815,150741 149815,152226 149815,155547 149815,159383 149815,164857 149815,164975 149815,165387 149815,169103 149817,1858 149818,1860 149819,602 149822,83 149824,22 149826,481 149829,22 149830,79 149832,83 149840,22 149841,149842 149843,22 149844,636 149845,30 149846,907 149846,1522 149847,56 149848,422 149849,850 149850,1858 149851,1860 149852,932 149853,422 149854,56 149855,358 149856,22 149857,149858 149859,30 149860,149861 149862,149 149863,104 149863,134 149863,135 149864,918 149865,2506 149866,872 149867,872 149868,30 149869,136072 149870,149871 149873,149874 149875,1247 149876,149877 149878,149879 149880,149879 149881,957 149882,13661 149883,149884 149885,149 149886,149887 149888,240 149889,149890 149891,422 149892,56 149893,3653 149894,167 149895,149896 149897,149896 149898,149896 149899,149896 149900,149896 149901,298 149902,485 149903,340 149904,557 149905,557 149906,55849 149907,483 149908,1590 149908,1644 149911,422 149912,422 149913,422 149914,422 149915,422 149916,422 149917,422 149918,422 149919,422 149920,298 149921,485 149922,2312 149923,1102 149924,149925 149927,873 149927,1274 149927,4637 149928,151 149929,149930 149931,1102 149932,142405 149933,142473 149934,149935 149936,1849 149937,1849 149938,149939 149940,149941 149942,30 149943,301 149943,717 149943,1782 149944,30 149945,2048 149946,83 149947,493 149947,3148 149948,138686 149949,481 149950,175 149951,298 149952,149953 149954,149955 149956,2048 149957,2868 149957,7652 149958,862 149959,255 149959,7363 149960,1119 149961,41 149962,292 149963,1087 149964,2991 149964,7358 149964,7363 149965,479 149966,294 149967,296 149968,298 149969,138686 149970,175 149971,149972 149973,298 149974,422 149975,149976 149977,149976 149978,138686 149979,175 149980,298 149983,149984 149985,149984 149986,149984 149987,149984 149988,149984 149990,149991 149992,602 149993,233 149994,355 149995,143287 149997,788 149999,54 149999,83 149999,283 149999,313 149999,455 149999,1201 149999,19349 149999,117231 149999,168627 150000,22 150001,1877 150001,40497 150002,422 150003,56 150004,485 150005,298 150006,861 150007,150008 150009,1235 150009,1335 150010,301 150010,615 150010,968 150010,1782 150011,868 150011,81233 150012,3999 150013,184 150014,1326 150015,240 150015,872 150016,338 150016,390 150016,626 150016,657 150016,1241 150016,1289 150016,5906 150017,206 150018,14136 150018,150019 150018,150025 150018,150026 150018,150029 150018,150031 150018,150032 150018,150033 150018,150034 150018,150035 150018,150036 150018,150039 150018,150089 150018,150473 150018,150474 150018,150475 150018,150476 150018,151467 150018,151468 150018,151469 150018,152187 150018,154673 150018,154674 150018,154851 150018,154852 150018,156130 150018,157042 150018,158311 150018,158312 150018,158313 150018,158314 150018,158315 150018,159816 150018,159817 150018,159818 150018,160359 150018,160360 150018,162660 150018,165393 150018,167323 150020,346 150021,509 150022,509 150022,510 150022,872 150022,1025 150022,16455 150022,20591 150022,23626 150022,31080 150022,41886 150022,79577 150022,107469 150022,108754 150022,122090 150022,153129 150022,153165 150022,153776 150022,154180 150022,154183 150022,156482 150022,156972 150023,1608 150024,1132 150028,255 150030,1181 150037,509 150037,875 150037,47993 150037,150022 150037,150037 150037,150038 150037,151424 150037,151696 150037,151990 150037,154336 150037,154361 150037,154368 150037,154379 150037,154597 150037,154826 150037,154999 150037,155712 150037,156212 150037,156281 150037,156768 150037,156902 150037,157748 150037,159015 150038,106 150040,1608 150041,1132 150042,1179 150043,2353 150044,485 150045,298 150046,195 150047,142426 150048,647 150049,146 150050,344 150051,1818 150052,252 150053,22 150054,2620 150055,1001 150056,481 150057,483 150059,44725 150060,1608 150061,1132 150062,592 150063,143287 150065,1608 150066,1132 150068,83 150069,515 150070,652 150071,44725 150072,777 150072,150084 150073,1849 150074,671 150075,142426 150076,301 150076,1133 150077,150078 150081,1564 150083,356 150083,717 150084,187 150085,312 150086,500 150086,718 150087,422 150088,56 150090,21442 150091,1608 150092,1132 150093,687 150093,893 150093,1556 150094,19010 150095,1130 150096,141912 150097,219 150098,346 150099,2989 150099,2991 150100,1298 150101,563 150102,918 150103,1127 150104,356 150106,422 150107,2617 150108,4193 150108,5440 150108,25348 150109,111 150110,346 150111,30331 150112,20 150112,581 150112,712 150115,2979 150116,1284 150117,1033 150118,150119 150120,68069 150121,1224 150121,3999 150122,1556 150123,68069 150124,217 150124,536 150126,37 150127,1608 150129,68069 150130,408 150131,102 150132,1323 150133,1326 150134,2775 150135,447 150136,81 150136,749 150136,1417 150136,3507 150136,9015 150137,83 150138,192 150139,138686 150140,175 150141,298 150142,1133 150144,515 150145,1707 150146,779 150146,23991 150146,145405 150146,150171 150147,3297 150148,433 150149,784 150150,140 150151,843 150151,138686 150152,30 150154,306 150154,307 150155,455 150156,1010 150157,657 150158,150159 150160,809 150161,1119 150162,1801 150164,392 150166,2244 150167,8213 150168,2334 150169,83 150170,3138 150174,788 150175,195 150176,127158 150177,217 150177,18831 150178,1644 150179,83 150180,301 150182,2995 150183,907 150184,58 150185,994 150187,150188 150189,1132 150189,1381 150189,1452 150190,2923 150191,215 150192,273 150193,83 150194,209 150194,861 150195,994 150196,1639 150197,602 150198,907 150199,3 150200,142433 150201,1231 150202,631 150202,1119 150202,1888 150202,84257 150203,142405 150204,772 150205,251 150206,137 150206,994 150206,1070 150207,254 150208,150209 150211,240 150213,2528 150214,1368 150215,1590 150216,240 150217,150218 150217,172905 150219,422 150220,56 150221,406 150222,5310 150223,941 150224,302 150225,483 150226,30331 150227,760 150228,422 150229,56 150230,3474 150231,1238 150232,1452 150233,422 150234,56 150235,557 150237,302 150237,861 150238,3623 150239,2867 150239,2868 150240,222 150241,48 150242,358 150243,248 150244,1 150244,994 150245,269 150247,885 150247,13704 150248,30 150249,278 150250,3623 150251,72 150252,138686 150253,175 150254,2367 150255,675 150256,72 150257,298 150258,22 150259,873 150260,994 150261,1544 150262,994 150263,3 150264,298 150265,485 150266,150267 150268,150269 150270,3260 150271,150272 150273,1240 150274,1466 150275,150276 150277,818 150278,150279 150280,150281 150282,1805 150283,2116 150285,72 150286,577 150287,13 150288,150289 150290,387 150291,83 150291,299 150291,181063 150292,435 150293,83 150294,356 150295,843 150296,138686 150297,175 150298,424 150299,298 150300,1579 150300,2626 150301,422 150301,707 150302,3041 150303,818 150303,1140 150303,2436 150304,1127 150305,479 150306,298 150307,485 150308,1 150309,2590 150310,72 150311,207 150312,134 150312,2105 150315,302 150316,872 150317,668 150318,1644 150319,22 150320,72 150321,30 150322,795 150323,1429 150324,850 150325,72 150326,175 150327,392 150328,1143 150329,150330 150331,150332 150333,150334 150335,150336 150337,1801 150338,366 150339,150340 150341,30331 150341,259187 150342,54 150342,225 150342,269 150342,393 150342,3297 150343,312 150345,150346 150347,292 150348,150349 150350,467 150351,202 150352,150353 150354,355 150355,5662 150356,306 150356,307 150356,406 150357,18831 150358,107 150358,240 150358,425 150358,805 150359,586 150359,1531 150359,42628 150360,1132 150361,781 150362,298 150363,485 150364,138686 150365,175 150366,1556 150367,298 150368,273 150368,313 150369,781 150370,1132 150371,1608 150373,4611 150374,1544 150375,298 150376,485 150377,298 150378,485 150379,1801 150380,579 150381,298 150382,485 150383,1590 150384,48 150385,1132 150386,781 150387,422 150388,422 150389,422 150390,422 150391,422 150392,422 150393,422 150394,422 150395,422 150396,422 150397,422 150398,422 150399,483 150399,232766 150400,302 150402,422 150403,577 150404,136 150406,406 150406,620 150407,907 150408,143287 150409,143287 150410,907 150411,2775 150412,1635 150413,150414 150415,1146 150416,22 150417,192 150417,256 150418,8308 150419,481 150420,298 150421,485 150422,1241 150423,972 150424,298 150425,485 150426,264 150426,1968 150427,83 150428,2867 150428,2868 150429,668 150429,1607 150431,233 150432,3370 150432,14453 150433,3 150435,422 150436,56 150437,150438 150439,215 150440,1243 150441,579 150441,809 150442,1096 150444,160 150445,222 150445,536 150445,18831 150445,49057 150447,160 150448,389 150449,240 150449,392 150449,439 150450,9015 150451,145751 150452,141912 150453,215 150454,19413 150456,760 150457,299 150459,31977 150460,2744 150461,2073 150462,338 150463,7 150464,81 150464,215 150464,254 150464,503 150464,1282 150464,1368 150464,1392 150465,389 150466,150467 150468,872 150470,536 150472,366 150477,818 150478,1370 150479,660 150480,7124 150481,666 150482,298 150483,485 150484,485 150485,298 150486,247 150487,602 150488,720 150490,1718 150491,309 150491,310 150492,626 150493,4060 150494,1082 150495,150496 150497,160 150497,1127 150498,8149 150499,150500 150501,7087 150501,55871 150502,30 150503,1085 150504,2671 150505,827 150506,1014 150506,1235 150507,15 150507,358 150508,467 150509,1858 150511,1860 150512,861 150513,150514 150515,422 150516,56 150517,2620 150518,868 150519,202 150520,83 150521,571 150522,1818 150523,2572 150524,150525 150526,406 150528,1082 150530,10 150531,1368 150532,3260 150533,809 150533,22293 150534,186 150535,138686 150536,175 150537,298 150538,146 150538,92476 150540,1323 150541,408 150542,102 150543,1326 150544,50 150545,6556 150546,1293 150547,6556 150548,1181 150549,3623 150550,68069 150551,483 150552,932 150553,3623 150554,1381 150555,146 150556,83 150557,309 150557,310 150558,2244 150559,273 150559,313 150560,264 150562,1252 150562,1253 150563,1571 150564,2867 150564,2868 150565,893 150565,1556 150566,83 150567,843 150568,2209 150569,138686 150570,175 150571,298 150572,1836 150573,72 150574,240 150575,79 150576,72 150577,135 150577,885 150577,13704 150578,30 150580,261 150581,2867 150581,2868 150582,392 150583,640 150586,72 150587,150588 150589,30 150590,150591 150592,338 150593,68 150593,233 150593,1722 150593,1818 150594,620 150595,30 150596,579 150597,30 150599,30 150600,1001 150601,885 150601,13704 150602,422 150603,34 150603,35 150603,313 150603,634 150603,1718 150603,2646 150603,5326 150604,467 150605,30 150606,138686 150607,175 150608,10 150609,298 150610,150611 150612,150611 150613,44 150614,83 150615,150616 150617,202 150618,4611 150619,1544 150620,150621 150622,30 150623,957 150624,2979 150627,206 150627,309 150627,310 150628,272 150629,435 150630,422 150631,843 150632,516 150632,1370 150633,150634 150635,150634 150636,1556 150637,150638 150639,996 150640,862 150641,3041 150642,150643 150644,626 150645,452 150645,457 150645,535 150645,676 150645,918 150645,1655 150646,1132 150647,671 150649,143287 150650,31977 150652,19356 150653,355 150654,1531 150655,150267 150656,150657 150658,30 150659,150660 150661,150662 150663,150664 150665,1707 150666,21442 150667,150668 150669,30 150670,2266 150671,150672 150673,136 150674,1238 150675,596 150675,1368 150676,640 150677,146 150678,647 150679,344 150680,2319 150681,142870 150682,1452 150683,1332 150684,138686 150685,175 150686,422 150687,422 150688,422 150689,422 150690,422 150691,298 150692,422 150693,422 150694,483 150695,422 150696,422 150697,422 150698,422 150699,422 150701,455 150702,150703 150704,150703 150705,150703 150706,79 150707,30 150709,346 150711,143287 150712,919 150713,516 150714,252 150715,1220 150715,1222 150716,150717 150719,259 150720,1220 150720,1222 150721,516 150722,252 150723,996 150724,861 150725,150726 150727,481 150728,30 150729,150730 150731,83 150732,1293 150733,1773 150734,81233 150735,5591 150736,18831 150737,473 150738,83 150739,68 150741,261 150741,269 150741,346 150741,372 150741,818 150741,81233 150742,1556 150743,2244 150745,1707 150746,192 150746,1623 150747,518 150749,577 150750,150751 150752,30 150755,1707 150756,668 150757,872 150758,1858 150759,1860 150760,32 150761,30 150762,41 150762,999 150762,1177 150763,515 150764,818 150765,1353 150766,577 150766,1058 150767,22 150768,1096 150769,30 150770,240 150770,1955 150771,290 150771,2995 150771,144988 150772,1102 150773,5 150773,452 150774,2048 150776,5405 150777,644 150778,142208 150779,142208 150780,142208 150781,142208 150782,536 150783,3003 150783,4903 150785,217 150787,397 150788,336 150789,652 150790,298 150791,485 150792,447 150793,2775 150795,21826 150796,1 150797,289 150797,290 150797,3003 150797,94134 150798,872 150799,298 150800,485 150801,941 150802,1181 150803,298 150804,485 150805,41 150805,225 150805,1012 150805,1177 150805,7757 150806,151 150807,2312 150808,3999 150809,20 150810,626 150811,137 150812,3623 150813,219 150814,202 150815,626 150816,1707 150817,306 150817,307 150818,72 150818,160 150818,2744 150819,305 150820,408 150821,1323 150822,102 150823,843 150824,1326 150825,150826 150827,366 150828,259 150829,5405 150830,4193 150831,588 150831,590 150832,202 150833,150834 150835,1776 150836,26041 150837,1381 150838,333 150838,393 150838,980 150838,1388 150838,1531 150838,4455 150838,15573 150839,973 150839,1284 150839,1419 150840,167 150841,602 150841,60576 150842,392 150844,150845 150846,30 150847,151 150848,1381 150849,346 150850,1467 150851,217 150851,19443 150852,72 150853,34 150853,35 150853,1467 150854,138686 150855,175 150857,298 150858,222 150858,536 150858,2784 150858,18831 150859,2083 150860,1001 150861,1436 150862,2775 150863,30 150864,72 150866,1564 150867,217 150868,483 150869,1133 150870,5034 150871,1119 150872,34 150872,35 150873,406 150874,81233 150875,536 150876,2045 150877,422 150878,150879 150878,153513 150880,1707 150881,215 150882,809 150883,20771 150884,150885 150886,150885 150887,631 150888,309 150888,310 150889,577 150890,919 150891,805 150892,1118 150893,874 150894,261 150895,760 150896,3135 150897,2506 150898,283 150899,2506 150900,2421 150901,120 150902,138686 150903,175 150904,298 150905,81233 150906,1370 150908,30 150909,147 150911,72 150912,818 150913,65 150913,868 150914,150915 150916,5906 150917,557 150918,626 150919,278 150920,137 150921,862 150922,2668 150923,72 150924,447 150925,2775 150926,10 150927,298 150928,485 150929,996 150930,81 150931,1332 150932,310 150933,150934 150935,346 150936,885 150936,13704 150937,30 150939,3623 150940,150941 150942,2506 150943,76096 150944,150945 150946,150947 150948,150949 150950,150951 150952,1462 150952,8537 150953,72 150954,269 150955,862 150956,264 150957,255 150958,150959 150960,240 150961,1801 150962,72 150963,72 150964,79 150965,68 150966,424 150968,779 150969,133326 150970,366 150972,72 150973,30 150974,211 150974,314 150974,440 150974,466 150974,467 150974,536 150974,868 150974,872 150974,1345 150974,1623 150974,1796 150974,1797 150974,2373 150974,2907 150974,16522 150974,18326 150974,48998 150974,49337 150974,155761 150974,156379 150974,161339 150974,162599 150974,183424 150974,214199 150974,238634 150975,150976 150977,2296 150978,150979 150980,640 150981,150982 150983,211 150984,640 150985,72 150986,304 150987,1151 150988,957 150988,1815 150989,46 150990,3069 150991,1012 150992,255 150993,452 150993,457 150993,535 150993,676 150993,843 150993,918 150993,1655 150994,605 150995,406 150996,355 150997,1001 150998,150999 150998,201602 151000,640 151001,151002 151003,2292 151004,485 151005,298 151006,333 151007,1001 151009,1566 151010,1132 151011,1608 151012,425 151013,477 151013,2750 151014,422 151015,422 151016,422 151017,422 151018,422 151019,422 151020,422 151021,422 151022,2646 151023,818 151024,422 151025,422 151026,422 151027,577 151028,21442 151029,10 151029,2580 151031,22 151032,151033 151034,493 151035,333 151036,151037 151038,302 151039,2224 151040,996 151041,292 151042,1509 151043,233 151044,1247 151046,312 151047,1634 151048,1052 151048,1181 151048,30428 151049,217 151050,481 151051,1359 151052,217 151053,149 151054,151055 151054,264944 151056,209 151056,302 151056,2116 151057,1707 151058,788 151060,949 151061,336 151062,97 151063,818 151064,2292 151065,467 151066,1707 151068,1231 151069,83 151070,30 151071,588 151071,590 151071,592 151071,805 151071,1462 151071,1635 151071,2620 151071,8537 151072,3623 151073,3 151074,440 151077,605 151078,151079 151080,631 151080,84257 151082,406 151083,138686 151084,175 151085,298 151088,602 151089,151090 151092,527 151092,579 151092,611 151092,615 151092,675 151092,1113 151092,1305 151092,1572 151092,1881 151092,3258 151092,142473 151093,1434 151094,151095 151096,151095 151097,346 151098,605 151099,298 151100,485 151101,273 151102,227 151102,2379 151103,444 151104,1715 151106,30 151107,328 151108,390 151109,1381 151110,151111 151112,4771 151113,248 151114,605 151115,72 151116,605 151117,1858 151118,1860 151119,1 151120,160 151121,151122 151124,30 151125,1509 151126,1849 151127,151128 151129,602 151130,1454 151133,54 151134,1210 151135,393 151138,3623 151139,134 151139,1266 151140,2931 151141,433 151142,54 151143,1140 151143,2443 151144,142433 151145,30 151146,602 151147,151148 151149,1531 151149,4545 151149,56150 151150,1612 151151,298 151152,485 151153,779 151153,68069 151153,141912 151154,2073 151155,103860 151156,784 151157,283 151158,22 151159,596 151159,19010 151160,605 151161,211 151162,605 151163,30 151164,605 151165,273 151166,602 151167,605 151168,215 151168,217 151169,1019 151170,84257 151171,1888 151172,605 151173,605 151174,151175 151176,605 151177,19 151178,885 151178,13704 151179,2923 151180,184 151181,483 151182,1143 151183,1220 151183,1222 151184,346 151185,1556 151186,605 151187,296 151188,30 151189,138686 151190,175 151191,605 151193,577 151194,298 151195,30 151196,30 151197,392 151198,3623 151199,605 151200,605 151201,1247 151202,605 151203,818 151204,605 151205,292 151206,605 151207,30 151208,605 151209,605 151210,605 151211,79 151212,605 151213,605 151214,435 151215,605 151216,1085 151217,602 151218,151219 151220,34 151220,35 151221,949 151222,557 151223,843 151224,809 151225,2750 151226,406 151227,843 151228,1132 151229,781 151230,358 151231,269 151231,640 151232,247 151233,346 151234,605 151235,557 151236,862 151237,298 151238,485 151239,605 151240,22 151241,605 151242,3003 151243,1326 151244,298 151245,485 151246,278 151247,949 151248,2116 151249,2443 151250,171 151251,1707 151253,605 151254,346 151255,142426 151256,151257 151258,577 151259,2506 151262,202 151263,30 151264,346 151265,151266 151267,151266 151268,151266 151269,605 151270,346 151271,151272 151273,151272 151274,151272 151275,151272 151276,151272 151277,151272 151278,151272 151279,151272 151280,557 151281,2411 151282,233 151283,151284 151285,135 151286,72 151287,485 151288,298 151289,151290 151291,151292 151293,346 151293,435 151293,439 151293,447 151293,1033 151293,1590 151294,207 151295,1 151296,2506 151297,1707 151298,972 151299,2590 151301,872 151302,1429 151303,151304 151305,151306 151307,841 151308,1849 151309,389 151310,668 151311,178 151312,704 151313,151314 151313,155588 151315,1143 151316,366 151317,151318 151319,736 151320,151321 151322,46 151322,586 151322,1531 151323,3 151324,309 151324,310 151325,255 151326,2506 151327,2506 151328,355 151329,151330 151331,151330 151332,151330 151333,151330 151334,698 151334,1293 151334,1782 151335,900 151336,647 151337,146 151338,151339 151340,151339 151341,151339 151342,344 151343,392 151344,298 151345,485 151347,422 151348,298 151349,485 151350,68 151351,233 151352,3085 151353,479 151354,602 151355,344 151356,151357 151358,2421 151358,13661 151359,392 151360,1749 151361,32 151361,644 151361,2699 151361,3003 151361,76096 151362,907 151363,3507 151364,1983 151365,150022 151366,151367 151368,644 151368,859 151368,1151 151368,2224 151368,3507 151369,1238 151370,151371 151372,9015 151373,1072 151374,422 151375,422 151376,422 151377,422 151378,422 151379,422 151380,422 151381,422 151382,422 151383,422 151384,422 151385,422 151386,1210 151387,1143 151388,160 151389,302 151391,452 151391,457 151391,535 151391,676 151391,843 151391,918 151391,1655 151392,1300 151393,875 151394,1544 151395,4611 151396,2775 151397,447 151398,809 151398,22293 151398,186522 151399,142473 151400,111 151400,290 151400,309 151400,310 151400,94134 151400,144988 151401,579 151401,1556 151402,136 151403,602 151405,2146 151406,1634 151407,1452 151410,151411 151412,151411 151413,151411 151415,151411 151416,151411 151417,151411 151418,1298 151419,595 151421,344 151422,206 151423,1119 151423,84257 151425,1175 151426,1313 151426,2224 151427,83 151428,1089 151428,1623 151429,467 151431,151432 151433,217 151433,22580 151434,298 151435,485 151436,30 151437,602 151438,65 151438,467 151439,972 151439,1522 151439,1544 151440,1740 151441,602 151442,149 151442,21442 151443,592 151444,83 151446,718 151447,138686 151448,175 151449,298 151450,994 151451,1400 151451,1844 151452,142870 151453,142433 151455,483 151456,503 151458,30 151459,79 151460,907 151461,557 151464,1452 151464,1849 151465,929 151466,602 151471,408 151472,102 151473,1326 151474,1323 151475,779 151476,130 151476,140 151476,160 151476,264 151476,302 151476,515 151476,1052 151476,1085 151476,1132 151476,1147 151476,1381 151476,1551 151476,1659 151476,1893 151476,5440 151477,4260 151478,907 151479,225 151481,358 151483,406 151485,779 151486,1707 151487,4771 151488,302 151489,809 151489,872 151490,602 151491,850 151492,118 151492,4597 151493,3 151494,142426 151496,283 151497,435 151498,1522 151499,8180 151500,135 151501,1860 151502,595 151503,3612 151504,2274 151505,392 151506,4760 151507,6059 151508,5658 151509,4252 151510,623 151511,697 151512,6955 151513,6837 151514,1241 151517,137 151518,843 151520,779 151523,309 151523,310 151524,1983 151525,192 151526,151527 151528,20771 151530,209 151531,278 151531,852 151532,3623 151533,1983 151534,422 151535,151536 151537,151538 151539,1370 151540,809 151540,19010 151541,3507 151542,392 151543,704 151544,1332 151545,872 151546,55849 151547,3507 151548,147 151549,151550 151551,1983 151552,1231 151553,120 151554,1849 151556,10 151557,483 151558,809 151559,23783 151560,579 151560,63471 151561,151562 151561,153594 151563,151564 151565,151566 151567,151566 151569,151570 151571,138686 151572,175 151573,151574 151575,298 151576,862 151576,907 151576,1007 151576,1010 151577,557 151578,8719 151579,138 151580,865 151581,557 151582,137 151583,88820 151584,118 151584,4597 151585,137 151586,1359 151589,115659 151589,148600 151590,2210 151590,4237 151593,2210 151593,4237 151595,1368 151596,278 151597,7360 151598,142405 151599,4903 151601,151602 151603,222 151604,332 151605,10 151606,1181 151607,72 151608,344 151609,285 151610,20790 151611,663 151612,772 151613,2367 151614,481 151615,151616 151617,7652 151618,151619 151620,83 151621,31977 151623,278 151624,772 151625,525 151626,1309 151627,72 151628,344 151629,285 151631,631 151632,294 151633,663 151633,1253 151633,25348 151634,1149 151635,843 151637,151638 151639,151640 151642,151643 151644,366 151645,366 151646,366 151647,326 151648,151649 151650,151651 151652,151653 151655,225 151656,151657 151658,151 151659,862 151660,1 151661,827 151663,138686 151664,175 151665,298 151666,217 151666,1417 151667,8884 151668,251 151668,1151 151669,1085 151670,151671 151672,355 151673,577 151674,151675 151677,140 151677,5440 151678,233 151679,151680 151681,151680 151682,151680 151683,151680 151684,151680 151686,2334 151687,151688 151689,151690 151691,151692 151693,151694 151695,31977 151696,150037 151697,931 151699,2989 151699,2991 151700,151701 151703,151704 151705,422 151706,422 151707,422 151708,422 151709,422 151710,422 151711,422 151712,422 151713,422 151714,422 151715,422 151716,275 151717,452 151718,919 151720,1860 151721,1858 151722,83 151723,30 151725,602 151727,72 151728,118 151728,4597 151729,44 151730,151731 151732,422 151733,485 151734,298 151735,640 151736,151737 151736,183932 151736,261390 151738,147 151739,344 151740,72 151741,285 151742,151743 151744,483 151745,781 151746,1132 151747,4545 151747,56150 151748,151749 151750,151749 151751,1132 151752,781 151753,2266 151754,346 151755,158 151756,151757 151758,72 151759,7416 151760,707 151760,891 151760,115474 151761,2443 151762,818 151763,151764 151765,515 151766,602 151767,2210 151767,4237 151768,483 151769,346 151770,452 151770,457 151770,535 151770,676 151770,843 151770,918 151770,1655 151772,1773 151774,406 151775,1707 151777,1479 151778,390 151780,4611 151781,151782 151783,30 151784,992 151785,151786 151787,151786 151788,310 151789,779 151790,149534 151791,151792 151793,151794 151795,151796 151797,151798 151799,151798 151800,151798 151801,366 151802,366 151803,366 151804,147 151805,366 151806,346 151808,1773 151810,1133 151810,31977 151812,217 151813,151814 151815,107 151816,2416 151816,2417 151817,292 151818,338 151819,355 151821,298 151822,1133 151823,3538 151824,65 151824,292 151824,390 151824,430 151824,1016 151825,346 151826,30 151827,726 151828,726 151829,151830 151831,151830 151832,151830 151834,30 151835,233 151836,252 151837,151838 151839,151838 151840,336 151841,500 151842,366 151843,1368 151844,151845 151846,207 151847,151848 151850,481 151851,151852 151853,1 151853,106 151853,333 151853,602 151853,841 151853,1425 151853,13221 151853,148370 151853,148479 151854,151 151856,151857 151858,151859 151862,151863 151864,298 151865,485 151868,3538 151869,1893 151870,30 151871,151872 151873,72 151874,408 151875,1323 151876,1326 151877,102 151878,16953 151879,44 151880,336 151881,726 151882,483 151883,151884 151885,602 151886,151887 151888,657 151889,5213 151890,252 151891,2210 151891,4237 151891,182162 151892,151893 151895,640 151897,7 151898,151899 151901,151902 151904,1102 151905,862 151906,2797 151907,102 151908,1707 151910,557 151911,557 151912,931 151912,14458 151913,151914 151916,718 151917,693 151918,1608 151919,151920 151921,2210 151921,4237 151922,240 151922,1181 151922,4355 151923,406 151924,467 151924,996 151925,31977 151926,30 151927,151928 151929,30 151930,30 151931,1663 151932,142473 151933,1284 151934,151935 151936,151935 151937,151935 151938,151935 151939,1556 151941,452 151941,457 151941,535 151941,676 151941,843 151941,918 151941,1655 151942,1179 151943,142433 151944,447 151945,2775 151946,151947 151948,151949 151950,151949 151952,2944 151953,509 151954,151955 151956,151957 151958,493 151959,289 151959,290 151959,144988 151960,144556 151961,4611 151962,217 151962,1417 151963,30 151964,602 151966,292 151967,294 151968,296 151969,298 151970,366 151971,366 151972,693 151973,366 151974,366 151975,151976 151977,850 151978,72 151979,302 151980,151981 151982,233 151983,151984 151985,355 151986,406 151986,620 151986,1127 151987,626 151988,671 151990,150037 151992,628 151992,718 151993,147 151994,184 151998,577 151999,1132 152000,1608 152001,115 152001,118 152002,1238 152003,346 152004,1452 152005,640 152008,1127 152009,30 152010,430 152011,344 152012,647 152013,146 152014,346 152015,83 152016,1608 152017,1132 152018,516 152018,2312 152019,283 152020,152021 152023,467 152024,390 152025,250 152025,1684 152026,467 152028,450 152029,298 152030,485 152031,1133 152032,209 152033,146 152034,344 152035,647 152036,83 152037,481 152040,2105 152042,615 152043,152044 152045,1707 152046,422 152047,422 152048,1326 152049,422 152050,422 152051,422 152052,422 152053,422 152054,422 152055,422 152056,422 152057,422 152058,422 152059,146 152060,344 152061,647 152062,872 152063,422 152064,2750 152065,647 152066,146 152067,344 152068,255 152069,3623 152070,875 152071,152072 152074,994 152075,58 152076,46 152077,30 152078,5591 152079,146 152080,647 152081,344 152082,647 152083,344 152084,146 152085,1102 152086,178 152087,3367 152087,5540 152088,138686 152089,175 152090,298 152091,1282 152091,2210 152091,4237 152091,182162 152092,3804 152093,146 152094,647 152095,344 152096,1293 152097,146 152098,647 152099,344 152100,6424 152101,3602 152102,152103 152104,1776 152105,671 152106,72 152107,1462 152107,1707 152108,1551 152109,178 152110,72 152110,137 152110,447 152110,557 152110,611 152110,652 152110,704 152111,72 152112,1858 152113,1860 152114,2205 152114,33424 152115,1858 152116,1860 152117,10 152119,2750 152120,1983 152121,32475 152122,79 152123,6682 152123,72439 152124,483 152125,707 152126,248 152128,447 152129,809 152130,957 152131,72 152132,4545 152132,56150 152133,805 152133,1011 152133,1402 152134,2775 152135,447 152136,68069 152136,141912 152137,302 152138,134 152138,2105 152139,99 152140,422 152141,21442 152142,1058 152143,408 152144,1323 152145,1326 152146,102 152147,152148 152149,152150 152151,160 152152,240 152152,818 152152,127158 152153,873 152154,2775 152155,447 152156,671 152157,795 152158,1012 152159,875 152160,3623 152161,477 152162,1882 152163,152164 152165,30331 152166,5326 152167,932 152168,44 152169,781 152170,1132 152171,309 152171,310 152172,1132 152173,781 152174,358 152176,602 152177,298 152178,485 152180,588 152180,590 152181,71 152181,1619 152183,32 152185,1522 152186,717 152186,852 152186,2372 152188,269 152189,138686 152190,175 152191,1414 152192,34 152192,953 152193,2083 152194,298 152196,152197 152198,134 152198,137 152200,647 152201,146 152202,344 152203,577 152204,13661 152205,30 152206,1 152207,835 152208,261 152208,333 152209,152210 152211,932 152212,868 152212,156379 152213,152214 152215,30 152216,907 152217,302 152217,861 152218,861 152219,4545 152219,56150 152219,139010 152220,152221 152222,30 152223,7360 152226,372 152226,1001 152227,346 152228,152229 152230,138686 152231,175 152232,298 152233,697 152234,994 152235,957 152236,255 152237,602 152238,602 152239,392 152240,34 152240,35 152241,269 152242,885 152242,13704 152243,1983 152244,152245 152246,55233 152247,483 152248,2923 152249,602 152250,138686 152251,175 152252,298 152253,485 152254,298 152255,3069 152256,76096 152257,1893 152258,255 152259,1572 152260,483 152260,31206 152261,1707 152262,72 152263,483 152264,30 152265,138686 152266,175 152267,298 152268,264 152269,152270 152271,557 152273,310 152274,344 152275,285 152276,72 152277,72 152278,30 152279,358 152280,772 152281,30 152282,30 152283,30 152284,72 152285,240 152286,72 152287,152288 152289,30 152290,30 152291,72 152292,422 152293,56 152294,31977 152295,2443 152296,147 152296,158 152297,1238 152298,783 152298,1167 152298,1436 152298,1635 152298,1849 152298,2979 152298,3392 152298,7969 152298,39047 152298,55726 152298,152298 152298,162663 152298,164983 152298,165005 152298,165111 152298,165247 152298,165253 152298,167001 152298,167021 152298,167027 152298,167750 152298,167752 152298,168477 152298,170767 152298,170802 152298,171133 152298,171145 152298,171164 152298,171203 152298,171252 152298,171663 152298,172510 152298,176478 152298,179096 152298,179122 152298,182341 152298,187431 152298,188586 152298,193112 152298,194465 152298,195152 152298,214006 152299,163 152299,283 152299,668 152299,843 152299,1607 152301,160 152302,30 152303,2116 152304,152305 152306,152305 152307,152308 152309,1773 152310,79 152311,332 152312,1556 152313,152314 152315,10 152316,313 152316,447 152317,30 152319,30 152320,152321 152322,577 152323,72 152324,152325 152326,152325 152327,171 152328,152329 152330,10 152331,72 152332,18831 152333,255 152334,344 152335,72 152336,285 152337,1849 152338,285 152339,72 152340,344 152341,10 152342,10 152343,2590 152344,152345 152346,1007 152347,152348 152349,795 152350,152351 152352,207 152353,872 152354,1429 152356,152357 152359,972 152360,491 152361,152362 152361,159613 152363,152364 152365,152366 152367,152366 152368,152366 152369,668 152370,1522 152371,310 152372,843 152373,152374 152375,152376 152377,779 152378,1143 152379,1085 152379,2590 152380,8854 152380,255750 152381,264 152381,1551 152382,152383 152384,452 152384,457 152384,535 152384,676 152384,843 152384,918 152384,1655 152385,3209 152386,1465 152387,841 152388,1556 152389,8308 152390,1849 152392,485 152393,298 152394,366 152395,366 152396,366 152397,366 152398,366 152399,366 152400,366 152401,483 152402,355 152403,305 152404,30 152406,37 152407,2944 152408,795 152409,577 152410,3297 152411,602 152412,30 152414,141912 152415,233 152416,346 152417,640 152418,640 152419,577 152420,3507 152421,422 152422,422 152423,422 152424,422 152425,422 152426,422 152427,422 152428,422 152429,422 152430,422 152431,422 152432,422 152433,72 152435,1707 152436,240 152437,682 152437,1243 152437,72439 152437,189839 152438,2146 152439,142426 152440,48505 152441,152442 152443,79 152443,1572 152444,30 152445,30 152446,1172 152448,577 152448,1105 152449,312 152450,305 152450,563 152450,671 152451,326 152451,874 152452,83 152453,779 152454,152455 152456,392 152457,843 152458,107 152459,994 152461,94 152461,2787 152462,1715 152463,832 152464,1132 152465,781 152466,152467 152468,301 152468,444 152468,1160 152470,781 152471,1132 152472,152473 152472,253614 152474,3630 152475,302 152476,192 152477,2775 152478,447 152479,22 152480,298 152481,485 152482,835 152483,447 152486,72 152487,285 152488,344 152489,1566 152490,602 152491,1132 152492,1608 152493,152494 152495,1801 152496,152497 152498,1608 152499,1132 152500,3623 152501,87 152502,1707 152502,189788 152503,356 152504,467 152505,184 152505,2244 152506,1608 152507,1132 152508,577 152509,1 152509,149 152509,152515 152510,481 152511,1319 152513,424 152514,272 152516,1294 152518,3623 152519,152520 152521,58 152521,251 152521,255 152521,287 152521,493 152521,563 152521,577 152521,626 152521,663 152521,671 152521,698 152521,788 152521,795 152521,801 152521,1012 152521,1068 152521,1070 152521,1133 152521,1309 152521,1368 152521,1429 152521,1449 152521,1474 152521,2367 152521,2436 152521,5405 152521,5961 152521,6837 152521,16331 152522,720 152523,137 152524,781 152525,493 152525,1265 152525,1266 152527,72 152528,1132 152529,152530 152531,137 152531,1368 152533,1262 152534,206 152535,115 152535,118 152535,307 152536,255 152537,143287 152538,30 152539,827 152540,278 152541,577 152542,795 152543,158 152543,192 152544,602 152545,240 152545,152546 152545,246492 152548,152549 152550,158 152551,240 152554,1127 152555,138686 152556,175 152557,1707 152558,298 152559,152560 152559,248432 152559,264294 152561,932 152562,1 152563,1177 152564,37 152565,83 152566,685 152567,3602 152569,1007 152570,4504 152571,1282 152573,152574 152575,152574 152576,801 152577,171 152578,56 152579,779 152580,2512 152581,289 152581,290 152581,94134 152582,510 152583,222 152584,2116 152585,30 152586,784 152587,1033 152588,563 152589,631 152589,760 152593,152594 152595,113156 152596,1033 152597,801 152597,852 152597,3507 152598,726 152598,859 152598,1531 152599,1590 152599,1644 152600,44725 152601,254 152602,200 152603,406 152604,467 152605,1119 152606,1436 152606,2979 152607,30 152608,152609 152610,30 152611,152612 152613,152614 152615,663 152616,30 152617,3804 152618,30 152619,1140 152619,5547 152620,390 152620,2286 152621,152622 152624,30 152625,366 152626,206 152627,366 152628,366 152629,255 152630,313 152631,390 152632,48 152633,312 152634,1425 152635,30 152636,483 152637,30 152638,1252 152638,1253 152639,417 152640,152641 152642,435 152643,346 152644,104 152644,557 152644,953 152644,954 152644,1368 152644,5405 152645,931 152646,152647 152648,30 152649,9457 152650,1707 152651,346 152652,843 152653,152654 152655,72 152656,285 152657,344 152658,152659 152660,602 152661,422 152662,56 152663,30 152664,30 152665,22 152666,483 152667,1983 152668,30 152669,5213 152670,140 152671,267 152672,118 152672,4597 152673,30 152674,430 152674,994 152674,3816 152674,3817 152675,30 152676,30 152677,152678 152679,298 152680,485 152681,779 152682,1707 152683,152684 152685,536 152685,949 152686,7092 152688,1117 152689,920 152690,2371 152691,3 152692,152693 152692,236468 152694,1805 152695,1631 152696,30 152697,195 152698,152699 152700,1707 152701,152702 152701,157381 152701,229586 152703,34 152703,35 152703,4223 152704,346 152705,152706 152707,113156 152708,602 152709,138686 152710,175 152711,298 152712,1240 152713,9457 152714,623 152714,1805 152715,34 152715,35 152716,10 152717,18831 152718,424 152719,152720 152721,152722 152724,346 152725,152726 152727,1 152728,152729 152730,269 152731,222 152732,358 152734,152735 152736,1634 152738,1458 152739,772 152740,1085 152741,657 152743,30 152744,1556 152745,2590 152746,298 152747,485 152748,152749 152750,294 152751,1210 152752,30 152753,30 152754,452 152754,457 152754,535 152754,676 152754,843 152754,918 152754,1655 152755,298 152756,485 152757,152758 152759,30 152760,850 152762,152763 152764,152765 152767,292 152767,19519 152768,355 152769,3653 152770,850 152771,298 152772,485 152773,485 152774,298 152775,4771 152776,483 152776,1172 152777,647 152778,146 152779,344 152780,267 152781,3370 152781,14453 152783,30 152784,485 152785,298 152786,467 152787,158 152788,779 152788,141912 152789,4222 152790,233 152791,1238 152792,424 152793,424 152794,1452 152795,141912 152796,640 152797,640 152798,141912 152799,640 152800,422 152801,640 152802,422 152803,422 152804,422 152805,422 152806,422 152807,422 152808,422 152809,422 152810,422 152811,422 152812,390 152813,152814 152815,152814 152816,152814 152817,422 152819,81233 152820,1424 152821,1284 152822,1707 152823,920 152824,907 152825,444 152826,5662 152827,673 152829,784 152830,346 152831,372 152832,152833 152834,493 152835,626 152836,141912 152837,346 152838,835 152839,602 152840,602 152841,83 152842,3 152844,447 152845,2775 152846,138686 152847,175 152848,298 152849,355 152849,19010 152849,21442 152850,1072 152851,58 152852,994 152853,46 152854,358 152855,287 152855,467 152855,868 152855,6990 152855,18110 152855,18397 152855,18941 152855,34353 152855,38437 152855,45427 152855,109936 152855,119493 152855,131808 152855,137265 152855,145646 152855,155439 152855,155490 152855,155691 152855,155702 152855,156183 152855,158078 152855,158176 152855,159049 152855,160815 152855,160878 152855,165753 152856,481 152857,302 152858,852 152859,1085 152860,3623 152861,875 152862,493 152862,3148 152863,850 152864,406 152864,779 152865,1070 152866,30 152867,346 152868,31977 152869,657 152870,4895 152871,422 152872,3623 152873,1132 152874,781 152875,10 152876,1 152877,278 152878,1181 152879,178 152880,4611 152881,1544 152882,152883 152884,298 152885,485 152886,49057 152887,147 152889,439 152890,298 152891,485 152892,527 152893,207 152893,299 152895,2775 152896,447 152897,4611 152898,1544 152899,1127 152900,219 152901,3623 152902,406 152903,30 152904,141912 152905,299 152905,1267 152906,292 152907,932 152908,30 152909,485 152910,298 152911,3623 152912,3623 152913,953 152914,388 152915,222 152915,18831 152916,178 152917,1132 152918,781 152919,30 152920,861 152921,141912 152922,843 152924,424 152925,30 152926,483 152927,2006 152927,2620 152929,1509 152929,1551 152930,44 152931,3 152932,5405 152933,1326 152934,2784 152936,602 152937,1001 152938,801 152939,2646 152940,30 152941,30 152942,663 152943,30 152944,2146 152945,752 152945,968 152946,141912 152947,450 152948,355 152949,152950 152951,152952 152953,138686 152954,175 152955,298 152956,366 152957,366 152958,1016 152959,48505 152961,1285 152962,58 152963,994 152964,46 152965,366 152966,366 152967,366 152968,366 152969,227 152969,2379 152970,72 152971,602 152972,255 152973,493 152974,941 152974,2750 152975,313 152976,251 152976,252 152976,516 152976,1220 152976,1222 152976,1370 152977,147 152979,1285 152980,875 152983,346 152984,1985 152985,152986 152987,1252 152987,1253 152988,30 152989,152989 152990,152991 152992,152991 152993,30 152994,147 152994,158 152995,152996 152997,207 152997,252 152997,1243 152998,55233 152999,493 153000,3138 153001,23783 153002,602 153003,602 153005,3623 153006,1289 153008,240 153009,3623 153010,657 153011,657 153012,167 153012,968 153012,2083 153013,2334 153014,1274 153016,160 153016,3003 153017,17886 153018,153019 153020,72 153021,153022 153023,2797 153024,153025 153026,153025 153027,153025 153028,153025 153029,153025 153030,153025 153031,153025 153032,153025 153033,153025 153034,153025 153035,153036 153037,147191 153038,1 153039,5906 153040,557 153041,626 153042,278 153043,137 153044,862 153045,113156 153046,30 153047,450 153048,72 153049,346 153050,153051 153052,30 153053,118 153053,4597 153054,1181 153055,1181 153056,406 153057,153058 153059,1707 153060,255 153061,4355 153062,153063 153064,30 153065,2620 153066,483 153067,217 153068,1368 153069,1282 153070,153071 153072,1368 153073,2506 153074,153075 153076,34 153076,35 153078,269 153079,30 153080,406 153081,153082 153083,30 153084,142870 153085,2572 153086,153087 153088,2620 153089,247 153090,153091 153092,142870 153093,588 153093,590 153093,1419 153094,1 153094,32 153094,54 153094,87 153094,160 153094,192 153094,195 153094,269 153094,273 153094,285 153094,299 153094,302 153094,312 153094,323 153094,333 153094,336 153094,344 153094,364 153094,366 153094,372 153094,388 153094,392 153094,397 153094,403 153094,415 153094,441 153094,483 153094,485 153094,509 153094,510 153094,595 153094,596 153094,620 153094,640 153094,685 153094,703 153094,717 153094,784 153094,872 153094,918 153094,991 153094,1010 153094,1118 153094,1143 153094,1147 153094,1151 153094,1319 153094,1515 153094,1653 153094,1677 153094,1836 153094,1888 153094,1891 153094,2116 153094,2168 153094,2201 153094,2424 153094,2436 153094,2553 153094,2605 153094,3260 153094,3830 153094,4220 153094,4571 153094,16687 153094,22293 153094,27041 153094,37088 153094,118336 153094,189303 153094,258887 153095,452 153095,457 153095,535 153095,843 153095,918 153095,1655 153097,153096 153098,153096 153099,153096 153100,153096 153101,153096 153102,153096 153103,153096 153104,139010 153105,877 153106,349 153107,153108 153109,153108 153110,153108 153111,255 153112,30 153113,973 153114,980 153115,289 153115,290 153115,94134 153117,355 153119,579 153120,5547 153121,1298 153122,392 153123,97 153124,30 153125,30 153126,602 153127,1058 153128,97 153129,150022 153130,1298 153131,1858 153132,1860 153133,141912 153134,264 153135,145502 153136,422 153137,422 153138,422 153139,422 153140,31977 153141,1858 153142,1860 153143,422 153144,422 153145,422 153146,422 153147,422 153148,422 153149,422 153150,422 153151,422 153152,422 153153,1252 153153,1253 153154,640 153155,640 153156,422 153157,640 153158,640 153159,640 153160,1400 153161,153162 153163,957 153163,1815 153164,1368 153166,153167 153168,153167 153169,685 153170,233 153171,118 153171,4597 153172,9015 153173,141912 153174,153175 153178,420 153178,509 153178,510 153178,1836 153179,151 153180,167 153181,784 153181,1118 153182,459 153183,1608 153184,1132 153185,424 153186,907 153187,875 153188,1718 153189,1836 153190,2620 153191,141912 153192,141912 153193,399 153194,3623 153195,949 153196,63 153197,346 153198,1143 153198,1454 153200,147 153200,158 153201,160 153203,192 153203,1181 153204,153205 153206,809 153207,83 153208,3623 153209,4 153209,5 153210,515 153210,652 153211,1014 153211,1058 153212,251 153212,252 153215,406 153216,217 153217,19010 153218,2775 153220,447 153221,1419 153222,2775 153223,447 153224,439 153224,1033 153225,861 153225,893 153226,163 153226,447 153226,8501 153228,153229 153231,907 153232,1240 153233,167 153233,2083 153235,3623 153236,1181 153237,346 153238,178 153239,56 153240,422 153241,422 153242,56 153244,138686 153245,175 153246,775 153247,298 153248,536 153249,2424 153250,2353 153251,1070 153252,2421 153254,200 153258,1467 153259,3623 153260,3138 153261,287 153262,663 153263,852 153265,1133 153266,500 153267,1962 153268,1052 153269,1882 153270,2775 153271,54 153272,34 153272,35 153275,113156 153276,192 153277,1072 153278,3623 153279,30 153280,6424 153281,1858 153282,1860 153283,980 153283,1070 153285,153286 153287,328 153288,68069 153289,153290 153291,153290 153292,153290 153293,3623 153294,2244 153295,160 153296,3623 153297,3623 153298,1 153299,3623 153301,138686 153302,175 153303,298 153304,41 153304,332 153305,3623 153306,240 153306,372 153306,1001 153307,3623 153308,843 153309,483 153310,2421 153311,153312 153313,349 153314,1132 153315,1608 153316,389 153317,3623 153318,3630 153320,424 153321,2620 153322,151 153322,192 153322,309 153322,310 153322,577 153322,1167 153323,406 153323,585 153323,779 153323,1298 153324,503 153325,3623 153326,4490 153327,467 153328,1262 153329,145751 153330,3507 153331,726 153332,217 153332,536 153333,483 153334,145751 153335,68069 153336,2105 153337,48 153338,3623 153339,153340 153341,1571 153342,2224 153343,779 153344,408 153345,2923 153346,153347 153348,73570 153349,3623 153351,3623 153352,6051 153352,54272 153353,485 153354,298 153355,30 153356,1608 153357,58 153358,153359 153360,200 153361,2991 153361,7358 153361,7363 153362,479 153362,1462 153363,3623 153364,153365 153366,3623 153367,113156 153368,34 153368,35 153368,83 153369,153370 153371,312 153372,34 153372,35 153372,217 153373,314 153373,788 153373,1531 153374,18831 153375,406 153376,153377 153378,805 153379,251 153379,920 153380,435 153381,13361 153382,1531 153383,153384 153385,422 153385,589 153385,1425 153386,30 153387,1235 153387,1335 153388,843 153389,875 153390,153391 153392,2574 153393,1849 153394,536 153395,1419 153396,588 153396,590 153397,83 153398,217 153399,2209 153400,153401 153402,455 153402,1019 153403,4903 153404,83 153405,298 153406,485 153407,479 153407,1289 153407,1381 153407,1551 153408,2867 153408,2868 153409,1227 153409,86416 153410,1515 153411,1983 153412,153413 153414,153413 153415,557 153416,862 153417,1707 153418,72764 153419,973 153420,147 153420,158 153421,79 153422,644 153423,424 153424,153425 153426,1238 153427,1381 153428,2557 153429,153430 153431,106 153432,143287 153433,153434 153435,153434 153436,153434 153437,153434 153438,153434 153439,153434 153440,153434 153441,153434 153442,153434 153443,153434 153444,153434 153445,153434 153447,4594 153448,269 153450,153451 153452,146952 153453,435 153454,56 153455,422 153456,779 153457,149 153458,272 153458,333 153458,1877 153459,843 153460,366 153461,153462 153463,366 153464,366 153465,366 153466,366 153467,366 153468,1204 153468,1462 153469,2367 153470,1181 153471,153472 153473,994 153474,58 153475,46 153476,153477 153478,153479 153480,153479 153481,153479 153482,153483 153484,4193 153484,8270 153485,406 153486,1235 153486,1335 153487,23010 153488,138686 153489,175 153490,298 153491,1769 153492,795 153493,8270 153494,30 153495,30 153496,138686 153497,175 153498,891 153498,1881 153499,298 153501,153502 153503,9121 153504,153505 153506,3960 153507,45310 153508,17334 153509,9121 153510,14366 153511,153512 153514,8270 153515,83 153515,217 153516,8270 153517,18831 153519,8270 153520,372 153520,2991 153521,2367 153522,153523 153524,153525 153526,153525 153527,178 153528,153529 153530,153529 153531,255 153532,783 153533,30 153534,1096 153535,452 153535,457 153535,535 153535,676 153535,843 153535,918 153535,1655 153536,30 153538,298 153539,485 153540,355 153541,153542 153543,153544 153545,153544 153546,310 153547,310 153548,58 153549,994 153550,46 153551,30 153552,30331 153553,58 153554,994 153555,46 153556,153557 153558,153559 153560,843 153561,298 153562,485 153563,788 153564,485 153565,298 153566,104 153567,4192 153567,4193 153568,4193 153569,146 153570,8270 153571,2617 153572,264 153574,72 153575,58 153576,1400 153578,328 153579,640 153580,153581 153582,153583 153584,153583 153585,422 153586,422 153587,4453 153588,422 153589,422 153590,422 153591,422 153592,422 153593,422 153595,422 153596,422 153597,422 153598,259 153599,422 153600,1204 153600,1707 153602,233 153603,153604 153605,153606 153607,2146 153608,2671 153609,8822 153610,3999 153611,146 153612,647 153613,344 153614,30 153615,8855 153616,120 153618,58 153619,147 153619,795 153619,1417 153619,1572 153619,1616 153620,779 153622,1181 153623,146 153624,647 153625,344 153626,859 153627,994 153628,58 153629,46 153630,149 153630,1776 153631,2574 153632,439 153632,2411 153633,481 153635,72 153636,202 153637,1572 153638,153639 153640,153639 153641,153639 153642,8270 153643,1238 153644,153645 153646,153645 153647,392 153648,312 153648,1167 153648,1240 153648,1454 153648,5591 153649,1572 153649,2073 153649,19005 153649,44370 153650,146 153651,1105 153652,147 153653,292 153654,611 153655,1659 153656,138686 153657,175 153658,34 153658,35 153659,298 153660,1332 153660,5405 153661,1133 153662,222 153663,372 153663,2991 153664,1133 153665,153666 153667,153666 153669,1298 153669,1707 153671,379 153672,153666 153673,83 153674,153675 153676,779 153677,153678 153679,1133 153680,2775 153681,447 153682,1452 153683,1146 153685,1133 153686,2775 153687,447 153688,22 153688,120 153689,985 153690,726 153691,1133 153692,1132 153693,1608 153694,1133 153695,153696 153697,153698 153699,138686 153700,175 153701,298 153702,1181 153703,79 153704,3246 153705,1085 153706,2775 153707,447 153708,298 153709,485 153710,685 153711,1370 153712,406 153713,1370 153714,5356 153715,586 153716,30 153718,1326 153718,31122 153719,1133 153720,932 153720,1085 153720,1462 153720,1818 153720,4355 153720,8537 153720,33424 153721,10 153722,2116 153723,781 153724,1132 153725,433 153726,1309 153727,1623 153728,1132 153729,781 153731,781 153732,1132 153733,861 153734,872 153734,1796 153736,1509 153737,875 153738,1707 153739,289 153739,1133 153739,94134 153740,2244 153742,289 153742,290 153742,94134 153742,142433 153743,1133 153745,50321 153747,30 153748,2353 153749,4545 153749,56150 153749,139010 153750,1001 153750,2105 153751,153752 153753,142870 153754,305 153754,4101 153754,13538 153754,142426 153755,1133 153756,261 153757,781 153758,1132 153759,483 153760,296 153761,452 153762,44 153763,1181 153764,1522 153765,406 153765,622 153765,779 153766,283 153767,525 153768,1326 153769,1001 153770,195 153771,113156 153772,146 153773,143287 153775,56 153776,150022 153777,158 153777,1181 153777,1462 153777,8537 153778,30 153779,8270 153780,23783 153782,30 153783,153784 153783,160438 153783,206113 153783,217233 153783,220073 153783,223245 153785,483 153786,1235 153786,1335 153787,4545 153787,139010 153788,1241 153790,153791 153792,206 153793,296 153793,1659 153794,184 153795,153796 153797,1001 153798,202 153799,392 153800,525 153801,72 153802,298 153803,485 153804,8270 153805,200 153806,805 153807,30 153808,1133 153809,503 153810,973 153811,107 153812,447 153813,893 153815,153816 153817,422 153818,56 153819,72 153820,389 153821,795 153822,298 153823,485 153824,63 153825,483 153826,422 153827,333 153827,980 153827,4545 153827,15573 153827,139010 153828,1515 153828,153829 153830,5310 153831,72 153832,72 153833,153834 153835,298 153836,485 153838,45022 153839,1212 153840,809 153841,704 153842,153843 153844,137 153845,557 153846,8719 153847,138 153848,865 153849,557 153850,137 153851,118 153851,4597 153852,88820 153853,852 153854,385 153855,6068 153856,485 153857,298 153858,1163 153859,1522 153860,788 153860,852 153861,20359 153862,704 153863,704 153864,1309 153865,1285 153866,115 153866,118 153867,1149 153868,795 153869,333 153870,479 153871,113156 153872,631 153873,107 153873,3538 153874,525 153875,1 153876,3623 153877,356 153877,852 153878,153879 153878,218651 153880,294 153881,137 153881,200 153881,2931 153882,1266 153884,675 153885,255 153886,392 153887,107 153887,4771 153888,138686 153889,175 153890,298 153891,142426 153893,332 153894,310 153895,422 153896,422 153897,1722 153898,422 153899,422 153900,422 153901,422 153902,422 153903,422 153904,422 153905,422 153906,1019 153907,153908 153909,15573 153910,307 153910,45960 153911,615 153913,30 153914,153915 153916,298 153917,485 153918,10 153919,1285 153920,72 153921,153922 153923,3069 153924,255 153925,72 153926,56 153927,422 153928,72 153929,310 153930,406 153930,50321 153931,372 153932,72 153933,577 153934,1132 153935,333 153935,4545 153935,139010 153936,2590 153937,72 153938,72 153939,366 153940,366 153941,366 153942,366 153943,30 153945,153946 153947,153946 153948,153946 153949,153946 153950,153946 153951,113156 153952,153953 153954,313 153955,153956 153957,72 153958,668 153959,269 153960,72 153961,2617 153962,2995 153963,3297 153964,931 153965,255 153966,862 153966,2590 153967,515 153968,1113 153969,153970 153971,30 153972,310 153973,153974 153975,225 153976,30 153977,153978 153979,147 153980,192 153981,298 153982,8884 153983,233 153984,355 153985,1381 153986,1085 153987,452 153987,457 153987,535 153987,676 153987,843 153987,918 153988,931 153988,1453 153989,1479 153989,1849 153990,333 153991,1001 153992,485 153993,298 153994,485 153995,298 153996,1659 153997,1381 153998,132021 153998,153999 153998,157871 153998,219570 153998,228108 153998,230635 154000,154001 154002,485 154003,298 154004,356 154004,431 154004,852 154004,1010 154004,2646 154004,4222 154006,30 154007,141912 154008,872 154009,154010 154011,34 154011,35 154012,1707 154013,481 154014,310 154015,142870 154016,1381 154016,33424 154017,340 154018,795 154020,83 154021,154022 154023,154023 154024,154025 154024,157198 154024,173054 154024,183678 154026,1181 154027,447 154028,2775 154029,447 154030,2775 154032,298 154033,485 154034,222 154035,1085 154036,1210 154037,240 154038,247 154039,217 154040,310 154041,1085 154043,8270 154044,34 154044,35 154044,158 154044,275 154044,333 154044,1572 154044,2073 154044,9010 154044,17588 154044,20359 154044,135585 154045,310 154046,485 154047,298 154048,2697 154050,1163 154051,154052 154053,154052 154054,602 154055,31977 154056,240 154057,30 154059,154060 154061,3409 154062,483 154063,56 154064,422 154065,154066 154067,1551 154068,195 154069,154070 154071,5976 154072,1201 154072,1235 154073,6068 154074,154075 154076,171 154077,154078 154079,481 154080,557 154081,30 154082,154083 154084,2590 154085,154086 154087,154088 154089,154090 154091,5375 154091,109503 154092,10 154092,588 154092,590 154092,1419 154094,795 154095,145502 154096,1479 154097,154098 154099,390 154100,154101 154102,118 154102,4597 154103,219 154104,30 154106,273 154107,1 154108,1849 154109,154110 154111,485 154112,298 154113,827 154114,142870 154115,154116 154117,154116 154118,154116 154119,154120 154121,592 154123,143287 154124,154125 154124,207589 154124,230183 154124,236986 154126,154127 154128,366 154129,366 154130,1 154130,518 154130,557 154130,862 154130,6051 154131,154132 154133,30 154134,2617 154135,233 154136,452 154136,457 154136,535 154136,676 154136,843 154136,918 154136,1655 154137,809 154138,355 154139,107 154140,2416 154140,2417 154141,292 154142,338 154143,298 154144,154145 154144,213474 154144,213983 154144,228164 154144,240936 154144,241517 154144,247682 154146,1133 154147,3538 154148,154149 154150,4192 154150,4193 154151,602 154152,602 154153,602 154154,120 154155,154156 154157,30 154158,154159 154160,143 154161,485 154162,298 154163,1 154164,779 154165,781 154166,1132 154167,346 154168,149 154168,505 154168,16019 154168,38976 154168,118336 154169,30 154170,22 154171,313 154172,1773 154173,154174 154175,44 154176,1181 154177,1181 154179,134 154181,154182 154183,510 154183,872 154185,1132 154186,1608 154189,483 154190,154191 154192,222 154192,18831 154194,154195 154196,358 154197,943 154198,217 154198,222 154198,1417 154198,19010 154199,122732 154200,557 154201,557 154202,154203 154205,483 154206,795 154207,779 154208,56 154209,422 154210,273 154211,1132 154212,1608 154213,154214 154215,154216 154217,1132 154218,1608 154219,154220 154221,1132 154222,1608 154223,13 154224,1227 154224,86416 154225,483 154225,707 154226,154227 154228,3623 154229,184 154230,1247 154231,452 154232,222 154233,142473 154234,3623 154235,772 154237,1105 154238,154239 154240,30 154241,602 154242,602 154243,602 154244,602 154245,704 154246,1572 154247,154248 154249,4545 154249,139010 154250,154251 154250,157911 154250,177317 154250,198594 154250,220472 154250,231488 154250,250083 154250,252556 154252,154253 154254,875 154255,7416 154256,138686 154257,175 154258,298 154259,206 154260,1572 154261,292 154262,406 154263,294 154264,296 154265,298 154266,192 154266,406 154266,586 154266,4193 154267,452 154267,457 154267,535 154267,676 154267,843 154267,918 154267,1655 154268,83 154269,1807 154270,154271 154272,154273 154274,154275 154276,58 154277,994 154278,46 154279,58 154280,994 154281,46 154283,877 154284,4545 154284,139010 154285,355 154286,358 154287,602 154288,422 154289,56 154290,3623 154291,4545 154291,139010 154292,55077 154293,106 154293,1370 154293,6119 154294,206 154295,366 154296,106 154296,130 154296,663 154296,919 154296,1179 154296,1556 154296,28107 154297,358 154297,932 154297,941 154298,366 154299,154300 154301,408 154302,72 154303,1181 154304,485 154305,298 154306,640 154307,640 154308,640 154309,30 154310,1132 154311,781 154312,1238 154313,485 154314,298 154315,30 154316,309 154316,310 154316,483 154317,154318 154319,760 154320,72 154321,1452 154322,2775 154323,447 154324,760 154325,666 154326,671 154328,1068 154329,934 154330,455 154330,2424 154333,255 154334,146 154336,150037 154337,602 154338,1877 154339,149 154340,1370 154341,3623 154342,875 154343,149 154344,154345 154346,146 154347,344 154348,647 154349,83 154350,143287 154351,63 154351,251 154351,1220 154351,1222 154352,154353 154354,726 154355,1132 154356,1608 154357,285 154358,72 154359,344 154360,2073 154362,1241 154363,538 154364,195 154365,344 154365,360 154366,83 154367,1837 154368,150037 154369,138686 154370,175 154372,298 154373,30 154374,302 154376,252 154377,2073 154378,779 154379,150037 154380,211 154381,195 154381,1370 154382,907 154382,2191 154383,640 154384,417 154385,1010 154386,827 154387,30 154389,875 154391,19443 154393,30 154394,596 154395,615 154397,2253 154397,5213 154398,1749 154399,581 154400,34 154400,35 154401,154402 154403,2744 154404,217 154407,4260 154407,142433 154407,143287 154407,154408 154409,1052 154409,1102 154410,41 154412,323 154412,1052 154412,1102 154413,538 154414,17588 154415,818 154416,56 154417,422 154418,1608 154419,1132 154420,3623 154421,1287 154422,1052 154422,1102 154424,19443 154425,1363 154426,83 154427,154428 154429,154428 154430,154428 154431,760 154432,872 154433,332 154434,1927 154435,30 154437,113156 154438,1151 154439,602 154440,1052 154440,1102 154441,385 154441,3252 154443,154444 154445,138686 154446,175 154447,298 154448,154449 154450,261 154451,2244 154452,392 154453,65 154454,1052 154454,1102 154455,485 154456,298 154457,104 154458,72 154459,1151 154460,2923 154461,15 154462,154463 154462,181567 154464,356 154464,852 154465,1052 154465,1102 154466,195 154467,435 154468,1052 154468,1102 154470,30 154471,1467 154472,1052 154472,1102 154473,861 154474,30 154475,622 154476,83 154477,154478 154479,147 154479,158 154479,336 154480,147 154480,149 154480,158 154480,21442 154481,272 154482,779 154483,843 154485,147 154486,192 154487,49057 154488,525 154489,1151 154490,1298 154491,22 154492,255 154493,406 154493,1181 154494,406 154495,18831 154496,272 154497,2557 154498,2506 154499,872 154500,872 154501,515 154502,740 154502,741 154502,743 154503,154504 154505,154504 154506,154504 154507,154504 154508,1659 154508,2512 154509,861 154510,406 154510,779 154510,1181 154511,483 154512,1052 154512,1102 154513,1773 154514,154515 154516,154515 154517,72 154518,663 154520,2210 154520,4237 154522,154523 154524,30 154525,206 154526,1052 154526,1102 154527,694 154527,2646 154528,30 154529,30 154530,83 154532,872 154533,30 154534,422 154535,56 154536,79 154537,298 154538,485 154539,422 154540,56 154541,602 154542,485 154543,298 154544,171 154545,55233 154546,602 154547,149 154548,273 154549,30 154550,8855 154551,1467 154552,299 154553,30 154554,30 154555,154556 154557,2434 154558,247 154559,273 154560,184 154561,873 154562,22 154563,1247 154564,154565 154566,269 154567,41 154568,22 154569,149 154570,1603 154574,30 154575,2782 154576,575 154576,697 154577,146 154578,647 154579,344 154580,1181 154581,2506 154582,154583 154584,3507 154585,72 154586,602 154587,485 154588,298 154589,3623 154590,154591 154592,3623 154593,30 154594,439 154595,3623 154596,389 154597,150037 154598,30 154599,1370 154599,1877 154600,72 154601,142405 154602,1821 154603,3623 154604,1284 154605,154606 154607,949 154608,1052 154608,1102 154609,34 154609,35 154610,63 154611,312 154611,358 154611,595 154612,1467 154613,455 154614,2424 154615,30 154616,1871 154617,1052 154617,1102 154618,2421 154619,83 154620,13980 154621,30 154622,2590 154623,1033 154624,452 154624,457 154624,535 154624,676 154624,843 154624,918 154624,1655 154625,843 154626,72 154627,536 154628,83 154628,120 154628,217 154628,278 154628,493 154628,536 154628,949 154628,1274 154628,1467 154628,1608 154629,154630 154631,355 154632,358 154633,83 154634,138686 154635,175 154636,31977 154637,298 154638,366 154639,366 154640,467 154641,366 154642,1224 154643,1133 154644,233 154645,435 154647,289 154647,290 154647,94134 154648,818 154649,911 154650,72 154651,113156 154652,3 154653,72 154654,22293 154656,72 154658,255 154659,30 154660,640 154661,640 154662,422 154663,56 154664,640 154665,422 154666,56 154667,31977 154668,154669 154670,1893 154672,30 154675,56 154676,422 154677,1227 154677,86416 154678,392 154679,1188 154680,717 154681,30 154682,510 154682,150022 154683,1072 154684,72 154685,1556 154687,536 154688,2944 154688,4223 154689,83 154690,25 154690,1255 154690,2088 154690,50943 154691,509 154692,652 154694,1072 154695,920 154696,30 154697,154698 154699,30 154700,1132 154701,781 154702,875 154703,602 154704,154705 154706,154707 154708,72 154709,2989 154709,2991 154710,95152 154711,760 154712,158 154712,206 154712,640 154713,31977 154714,72 154715,781 154716,1132 154717,31977 154718,83 154719,278 154720,217 154721,149 154722,72 154723,344 154724,285 154725,72 154727,63 154728,1359 154729,1 154730,22293 154731,72 154732,1 154733,21442 154734,2782 154734,40782 154735,109503 154736,79 154736,388 154737,27041 154738,99 154738,852 154739,58 154740,994 154741,46 154742,72 154743,433 154744,868 154745,602 154745,779 154746,22 154746,861 154747,500 154748,109503 154749,483 154751,596 154752,154753 154754,30 154755,2334 154756,852 154757,720 154758,23783 154759,392 154760,299 154761,138686 154762,175 154763,298 154764,1151 154766,31977 154767,509 154767,1010 154768,1177 154769,1204 154770,779 154771,142433 154772,356 154772,852 154773,1634 154774,3623 154775,154776 154777,626 154778,171 154779,83 154780,1740 154781,2480 154782,313 154783,175 154784,142426 154786,30 154786,99807 154787,31977 154788,22 154789,934 154790,1359 154791,5310 154792,2421 154793,1309 154794,3328 154795,134 154795,225 154795,278 154795,289 154795,290 154795,364 154795,431 154795,510 154795,94134 154796,932 154797,312 154798,72 154799,3129 154800,304 154801,333 154801,1298 154802,3135 154803,392 154804,1955 154805,44 154806,392 154807,55849 154808,1068 154809,215 154810,138686 154811,175 154812,298 154813,483 154814,4146 154815,77 154815,5440 154816,372 154817,48 154818,4545 154818,139010 154821,83 154822,2671 154823,1043 154824,272 154824,811 154824,1556 154825,72 154826,150037 154827,406 154828,154829 154830,752 154831,718 154832,120 154833,154408 154834,217 154835,455 154836,222 154837,5343 154838,19443 154839,406 154839,779 154840,298 154841,485 154842,143287 154843,5440 154844,611 154845,143287 154846,10 154847,154848 154849,178 154853,171 154854,273 154855,163 154855,467 154856,720 154856,745 154856,862 154856,2411 154856,4571 154856,6789 154857,3260 154858,968 154859,86 154859,301 154859,615 154859,907 154859,973 154859,1001 154859,1241 154859,1284 154859,1522 154859,1782 154859,1955 154859,2083 154859,2557 154859,2979 154860,171 154861,3623 154863,1544 154864,10 154864,113156 154865,356 154866,615 154867,885 154867,13704 154868,192 154869,972 154870,941 154871,744 154872,783 154873,154874 154876,1871 154877,779 154878,1 154879,779 154880,1522 154881,296 154882,406 154883,843 154883,1293 154884,602 154885,56 154886,422 154888,779 154889,577 154890,852 154893,2371 154894,114600 154895,1133 154896,356 154896,852 154897,30 154898,640 154899,393 154900,843 154901,406 154902,1105 154903,144962 154904,240 154905,818 154906,143287 154907,1 154908,22 154909,50 154909,158 154909,406 154909,622 154910,298 154911,485 154912,72 154913,72 154914,113156 154915,292 154916,154917 154918,640 154919,154920 154921,171 154922,2506 154923,1151 154924,1639 154926,779 154927,510 154927,919 154927,1860 154928,154929 154928,160111 154930,154931 154932,779 154933,422 154934,56 154935,305 154936,175 154937,147 154938,424 154939,18790 154940,590 154941,640 154942,30 154943,72 154944,72 154945,154946 154947,850 154948,154949 154950,30 154951,366 154952,366 154953,1888 154954,154955 154956,920 154957,640 154959,640 154960,72 154961,393 154962,640 154963,30 154964,640 154965,323 154966,424 154967,1001 154968,154969 154970,862 154971,640 154972,192 154972,620 154973,452 154973,457 154973,535 154973,676 154973,843 154973,918 154973,1655 154974,355 154975,640 154976,911 154977,154978 154979,233 154980,602 154981,298 154982,485 154983,154984 154985,467 154986,21442 154987,1118 154988,154989 154991,1893 154991,2617 154992,424 154993,1179 154993,1293 154993,1821 154993,19010 154993,21736 154993,22293 154994,1238 154995,30 154996,788 154997,1860 154998,1858 154999,150037 155000,1452 155001,818 155002,640 155004,200 155005,155006 155007,422 155008,56 155010,666 155011,252 155012,175 155013,155014 155015,155014 155016,500 155017,366 155018,30 155021,240 155021,442 155021,805 155022,30 155023,22 155024,9457 155025,118336 155026,663 155026,1089 155028,1220 155028,1222 155028,189788 155031,1359 155032,15179 155033,141912 155034,6119 155035,6119 155036,7 155037,736 155038,994 155039,58 155040,46 155041,14989 155042,485 155043,298 155044,485 155045,298 155046,178 155046,211 155046,1891 155047,893 155048,175 155048,422 155049,1608 155050,1132 155051,1882 155052,422 155053,422 155054,1235 155054,1335 155054,2088 155054,154690 155055,872 155056,1 155057,1425 155058,422 155058,805 155059,510 155060,83 155061,1241 155062,1243 155063,240 155065,29380 155066,30 155067,184 155068,344 155069,1210 155070,298 155071,485 155072,240 155073,1119 155074,809 155075,1105 155076,155077 155078,4453 155081,206 155082,63 155083,485 155084,298 155085,23783 155086,83 155086,760 155087,76096 155088,2923 155089,298 155090,485 155091,788 155093,622 155093,1531 155094,1085 155094,1117 155094,1849 155094,124668 155094,171641 155095,22 155096,788 155097,142433 155098,1267 155099,142433 155100,433 155101,873 155102,467 155103,171 155104,4223 155106,671 155107,433 155108,388 155109,485 155110,298 155111,1132 155112,269 155112,861 155113,1773 155114,298 155115,485 155117,298 155118,200 155119,485 155120,298 155121,240 155121,417 155121,592 155121,1085 155121,1309 155121,1580 155121,2205 155121,3623 155121,33424 155122,1353 155123,83 155124,872 155125,302 155126,171 155127,32 155127,141912 155128,155129 155130,155129 155131,155129 155132,155129 155133,1181 155134,4223 155135,726 155136,379 155137,30 155138,932 155139,483 155140,843 155141,809 155142,392 155143,273 155144,392 155145,1284 155146,248 155147,1007 155149,1052 155149,1201 155150,861 155151,44 155152,34 155152,35 155153,30 155154,155155 155156,2048 155157,195 155158,911 155158,1803 155159,1188 155160,227 155160,433 155160,1635 155160,2421 155160,2750 155160,8855 155161,30 155162,18831 155163,1359 155164,259 155165,611 155166,920 155167,30 155168,389 155169,2775 155170,447 155172,779 155173,79 155174,30 155175,30 155176,497 155177,155178 155179,155178 155180,184 155182,302 155183,41 155183,1608 155184,557 155185,264 155185,736 155185,1289 155186,1400 155187,483 155188,126 155188,972 155189,1860 155190,1858 155191,1127 155192,142405 155193,298 155194,485 155195,195 155196,22 155197,83 155197,536 155197,660 155197,4637 155197,7092 155198,2334 155199,885 155199,13704 155200,4355 155201,1844 155202,30 155203,22 155204,862 155205,142433 155206,3623 155207,273 155208,158 155209,1078 155210,22 155211,536 155211,2944 155211,18831 155212,852 155213,1188 155214,294 155215,285 155216,3069 155217,255 155218,1305 155219,2590 155220,155221 155222,17309 155223,149 155224,1612 155225,240 155226,1368 155227,3801 155227,70166 155229,949 155229,1417 155230,30 155231,155232 155233,155232 155234,155232 155235,155232 155236,155232 155237,155232 155238,155232 155239,8844 155240,1210 155240,236180 155241,5906 155242,557 155243,626 155244,278 155245,137 155246,56 155247,422 155248,862 155249,920 155250,151 155251,422 155252,56 155253,485 155254,298 155255,158 155255,1181 155256,422 155257,56 155258,647 155259,344 155260,146 155261,30 155262,668 155262,1559 155263,306 155263,307 155264,7572 155265,932 155266,158 155267,636 155268,30 155269,389 155270,155271 155272,77 155273,56 155274,422 155275,30 155276,292 155277,30 155278,30 155278,248 155279,155280 155281,264 155282,1381 155283,1860 155284,1858 155285,30 155286,280 155286,17245 155287,30 155288,15 155289,30 155290,138686 155291,175 155292,298 155293,1007 155294,1235 155294,1335 155295,779 155296,138686 155297,175 155298,298 155299,155300 155301,72 155302,155303 155304,215 155305,4545 155305,139010 155306,536 155306,254009 155307,155308 155309,577 155310,138686 155311,175 155312,298 155313,115659 155313,148600 155313,155481 155314,4545 155314,56150 155314,139010 155316,366 155317,366 155318,155319 155320,1782 155321,5662 155322,37 155323,1231 155324,2750 155325,68 155326,1181 155327,155328 155329,255 155330,392 155331,292 155331,972 155332,304 155334,852 155335,72 155336,261 155337,346 155338,30 155339,63 155340,452 155340,457 155340,535 155340,676 155340,843 155340,918 155340,1655 155341,30 155342,142426 155343,1181 155344,332 155345,424 155346,355 155347,9029 155348,233 155350,704 155351,4545 155351,139010 155352,4545 155352,139010 155353,788 155354,79 155355,142430 155355,142879 155357,509 155357,1043 155358,298 155359,485 155360,704 155362,640 155363,758 155363,1385 155364,1773 155366,9457 155367,248 155368,72 155370,155371 155372,1474 155373,781 155374,1132 155375,422 155376,56 155377,647 155378,146 155379,344 155380,195 155381,536 155382,781 155383,1132 155384,328 155385,1181 155387,422 155388,56 155389,1453 155390,1241 155391,138686 155392,175 155393,605 155394,298 155395,1011 155396,1805 155398,726 155399,1608 155400,152855 155402,2266 155405,809 155405,19010 155408,30 155409,483 155410,83 155411,736 155412,13136 155413,22 155414,726 155415,19010 155416,2775 155417,447 155418,146 155418,92476 155419,714 155420,626 155421,385 155422,15523 155424,783 155424,2372 155426,1782 155427,640 155428,485 155429,18831 155430,30 155432,137 155433,247 155433,2867 155433,2868 155434,346 155436,143287 155438,2989 155438,2991 155439,152855 155440,22 155442,58 155443,994 155444,46 155446,155447 155448,390 155449,1282 155450,673 155452,3069 155453,1293 155453,2979 155454,18831 155455,483 155456,1132 155457,1608 155458,81233 155458,162580 155458,162583 155458,162585 155459,467 155460,138 155460,2105 155462,932 155464,1 155465,83 155466,602 155468,1127 155469,467 155469,73718 155469,156379 155469,162580 155469,162688 155469,162700 155470,77 155472,86 155472,167 155472,301 155472,843 155472,907 155472,1231 155472,1284 155472,1436 155472,2557 155472,2979 155473,298 155474,248 155475,602 155476,30 155477,588 155477,590 155477,8180 155478,30 155479,852 155482,68 155483,287 155484,30 155485,138686 155486,175 155487,44 155489,298 155491,30 155492,1105 155494,30 155495,1425 155496,30 155498,30 155499,42064 155500,195 155501,30 155502,1181 155503,893 155504,22 155505,422 155506,56 155507,818 155508,861 155510,577 155511,155512 155513,149 155513,192 155513,779 155514,195 155515,415 155516,30 155517,184 155518,192 155519,4771 155520,120 155521,290 155521,714 155521,33424 155521,94134 155523,155524 155525,1556 155526,2620 155527,2048 155528,687 155529,602 155531,72 155533,146 155534,344 155535,647 155536,1983 155538,72 155539,206 155541,72 155543,1769 155544,850 155545,155546 155547,372 155548,8854 155548,255750 155549,435 155550,127158 155551,2923 155552,1962 155553,557 155554,862 155555,563 155556,149018 155557,2006 155558,843 155559,83 155560,155561 155562,72 155563,83 155564,2590 155566,1181 155567,154408 155569,222 155570,298 155571,4594 155572,435 155573,289 155573,290 155573,94134 155574,843 155575,72 155576,1001 155576,1465 155577,1359 155578,30 155579,596 155580,640 155581,640 155582,563 155583,602 155584,30 155585,366 155586,155587 155586,218614 155586,240300 155586,262669 155586,264170 155586,264702 155589,2784 155590,192 155591,195 155593,30 155594,30 155595,8854 155595,255750 155596,1509 155597,30 155598,23132 155599,184 155601,577 155602,142405 155603,30 155604,1572 155605,1085 155606,155607 155608,479 155609,1415 155610,155611 155613,255 155614,30 155615,248 155616,34 155616,35 155617,452 155617,457 155617,535 155617,676 155617,843 155617,918 155617,1655 155618,355 155620,233 155621,5034 155622,818 155623,1240 155624,3804 155625,34 155625,35 155626,440 155627,30 155628,1707 155629,171 155630,485 155631,298 155633,298 155634,485 155635,171 155636,195 155637,155638 155637,155986 155637,158622 155637,183097 155637,189299 155637,204968 155637,262793 155639,442 155640,875 155641,3623 155642,155643 155644,485 155645,485 155646,843 155647,1238 155648,483 155649,2867 155649,2868 155650,30 155651,344 155653,2671 155654,3507 155655,1241 155656,158 155657,3623 155658,1133 155659,622 155659,1590 155660,2146 155661,1452 155662,21442 155663,1238 155664,72 155665,306 155665,307 155665,4571 155666,248 155668,420 155669,493 155669,1181 155670,2775 155671,447 155672,312 155673,417 155674,1564 155675,1132 155676,781 155677,192 155678,1370 155679,55849 155681,55849 155682,86 155683,63 155683,251 155684,56 155685,422 155686,4355 155687,30 155688,83 155689,877 155690,31073 155691,868 155691,152855 155692,63 155692,390 155692,1370 155692,3218 155694,171 155695,34 155695,35 155697,1284 155698,1068 155699,485 155700,147 155701,1707 155703,22 155704,298 155707,4672 155708,388 155708,567 155708,1284 155708,1326 155709,393 155710,1544 155713,155714 155715,30 155715,63 155715,516 155715,1231 155715,1381 155715,118336 155716,155717 155718,1181 155719,685 155720,155721 155722,141912 155723,2073 155725,697 155726,634 155727,146 155728,647 155729,344 155730,344 155731,155732 155733,509 155734,127158 155735,1 155735,433 155735,1877 155736,479 155736,841 155736,30331 155737,155738 155739,636 155740,104 155740,694 155740,795 155740,3623 155741,203 155742,138686 155743,1 155743,1019 155743,30331 155744,175 155745,298 155746,1127 155746,49057 155747,155748 155749,155748 155750,5405 155752,3069 155753,83 155754,4223 155755,3260 155756,95554 155757,1019 155758,3623 155759,146 155760,273 155760,305 155760,330 155760,420 155760,485 155760,663 155761,467 155762,1425 155763,1353 155764,3297 155764,27654 155765,113156 155766,233 155767,467 155768,435 155769,932 155770,72 155771,49057 155772,2048 155773,843 155774,2048 155775,44 155776,30 155777,1274 155778,83 155779,30 155780,392 155781,1381 155782,1127 155784,72 155785,2557 155786,292 155787,30 155788,83 155789,149 155789,240 155789,301 155789,336 155789,392 155789,406 155789,536 155789,808 155789,818 155789,823 155789,1001 155789,1370 155789,1453 155789,6935 155789,18996 155789,19663 155789,37147 155789,42112 155789,67363 155789,71678 155789,127158 155789,138139 155789,144231 155789,147828 155789,151063 155789,159832 155789,170734 155789,181439 155790,72 155791,158 155791,390 155791,406 155791,575 155791,592 155791,596 155791,760 155791,784 155791,1010 155791,1143 155791,1241 155791,1590 155791,2191 155791,2266 155791,2699 155791,2779 155791,6059 155791,13980 155792,3623 155793,525 155794,875 155795,155796 155797,3623 155798,1309 155799,422 155800,56 155801,155802 155803,1285 155804,5405 155805,1556 155807,631 155808,294 155809,202 155810,3507 155811,30 155812,155813 155814,72 155815,515 155816,30 155817,30 155818,1010 155818,1849 155819,118 155819,422 155819,4597 155819,5405 155820,72 155821,30 155822,55849 155823,3193 155824,155825 155826,1509 155827,1284 155828,155829 155830,30 155831,30 155832,30 155833,30 155834,30 155835,30 155836,875 155837,30 155838,424 155839,155840 155841,30 155842,852 155843,155844 155845,809 155846,885 155846,13704 155847,30 155848,30 155849,1749 155850,155851 155852,1359 155853,1359 155854,113156 155855,155856 155857,30 155858,155859 155858,169822 155860,1572 155861,875 155862,155863 155864,155865 155866,557 155867,8719 155868,138 155869,865 155870,137 155871,557 155872,118 155872,4597 155873,88820 155874,155875 155876,72 155877,30 155878,118 155878,4597 155879,72 155880,332 155881,72 155882,2671 155883,72 155884,72 155885,50 155885,79 155886,1707 155888,1359 155889,485 155890,298 155891,22 155892,155893 155894,155895 155896,155897 155898,138686 155900,175 155901,298 155902,255 155903,155904 155906,5405 155907,269 155908,72 155909,30 155910,366 155911,3623 155912,155913 155914,23783 155916,155917 155918,155919 155921,155922 155924,225 155925,155926 155927,146 155927,92476 155928,44725 155929,861 155930,155931 155932,1782 155933,155934 155935,155936 155937,30 155938,862 155939,155940 155941,155942 155943,155944 155945,233 155947,155948 155949,155950 155951,355 155952,155953 155954,1368 155955,483 155956,452 155956,457 155956,535 155956,676 155956,843 155956,918 155956,1655 155957,155958 155959,8884 155960,155961 155962,1220 155962,1222 155963,516 155964,252 155965,155966 155967,222 155968,726 155969,726 155970,726 155971,326 155972,1085 155973,202 155974,563 155975,422 155976,647 155977,1014 155978,358 155979,83 155980,72 155981,155982 155983,155984 155985,3507 155987,187 155988,1181 155989,155990 155991,155992 155993,138686 155994,175 155995,298 155996,932 155997,3538 155999,41 156000,156001 156002,292 156002,7698 156003,156004 156005,72 156006,422 156007,56 156008,2168 156009,72 156011,422 156012,56 156013,292 156014,72 156015,1247 156016,439 156017,156018 156019,156020 156021,192 156022,298 156023,72 156024,156025 156026,156027 156028,48 156029,72 156031,422 156032,422 156033,422 156034,422 156035,602 156036,422 156037,422 156038,422 156039,422 156040,422 156041,422 156042,422 156043,1240 156044,422 156045,1143 156045,1151 156045,2697 156046,358 156047,875 156048,30 156049,156050 156051,1118 156052,1479 156053,390 156054,1227 156054,86416 156055,346 156056,8270 156057,2626 156058,1087 156059,1414 156060,158 156061,818 156062,346 156063,72 156064,1509 156066,156067 156068,30 156069,156070 156071,156072 156071,205406 156073,156074 156075,130106 156076,156077 156078,452 156078,457 156078,535 156078,676 156078,843 156078,918 156078,1655 156079,156080 156081,30 156082,233 156083,30 156084,156085 156086,355 156087,312 156088,296 156089,156090 156091,954 156091,10318 156092,640 156093,184 156094,422 156095,56 156096,1559 156098,704 156099,779 156100,58 156101,46 156102,994 156103,309 156103,310 156104,156105 156106,3804 156107,41 156108,156109 156110,2209 156111,30 156112,907 156113,285 156113,330 156113,1247 156113,1425 156114,31977 156115,932 156116,636 156117,283 156119,2334 156120,850 156121,156122 156123,156122 156124,156122 156125,156122 156126,156122 156128,718 156129,392 156131,72 156133,875 156134,875 156135,147 156136,483 156137,171 156138,1204 156139,422 156140,56 156141,301 156142,1284 156143,2296 156143,101935 156144,30 156145,406 156145,1515 156146,156147 156148,156149 156150,310 156152,1849 156154,602 156155,4355 156156,557 156157,557 156158,957 156159,156159 156160,156161 156160,158024 156160,174711 156160,193302 156160,239460 156162,304 156163,30 156164,2205 156164,33424 156165,577 156165,127158 156166,1227 156166,86416 156167,88820 156168,447 156169,2775 156170,485 156171,298 156172,142870 156173,175 156174,206 156175,743 156176,156177 156178,142473 156179,2784 156180,72 156181,366 156182,366 156183,152855 156184,30 156185,3804 156186,113156 156188,156189 156190,640 156191,138686 156192,175 156193,298 156194,346 156195,2411 156196,1458 156197,1849 156198,292 156199,294 156200,296 156201,298 156202,1807 156203,160 156204,160 156205,160 156206,30 156207,147 156208,671 156209,184 156210,156211 156212,150037 156213,30 156214,30 156215,452 156215,457 156215,535 156215,676 156215,843 156215,918 156215,1655 156216,298 156217,485 156218,156219 156220,175 156221,233 156222,7155 156223,355 156224,663 156225,118336 156227,156228 156229,58 156230,994 156231,46 156232,83 156233,811 156234,298 156235,485 156236,1238 156238,358 156239,298 156240,485 156241,1452 156242,30 156243,941 156244,298 156245,485 156247,30 156248,22 156249,640 156250,1773 156251,872 156252,589 156253,2775 156254,447 156255,485 156256,298 156258,663 156259,346 156261,5101 156262,310 156263,1118 156263,22293 156264,467 156264,162599 156265,2105 156266,192 156267,22 156268,156269 156270,2775 156271,671 156272,422 156273,602 156274,1608 156275,1132 156276,1425 156277,1659 156278,1858 156279,1860 156280,149 156281,150037 156282,156283 156284,3623 156285,875 156286,557 156288,41 156289,83 156290,255 156291,222 156292,338 156292,360 156292,835 156292,1381 156292,1968 156292,4039 156293,72764 156294,636 156294,850 156295,6424 156296,222 156297,1983 156298,1177 156299,397 156300,868 156301,142433 156302,2353 156303,1240 156304,356 156305,602 156306,2312 156307,304 156308,1359 156311,156312 156314,30 156315,1368 156316,1608 156317,1132 156318,996 156319,1368 156321,41 156322,3623 156323,22 156324,872 156325,631 156326,861 156327,138686 156328,175 156329,1474 156329,1789 156330,298 156331,1858 156332,1860 156333,3138 156334,685 156334,2315 156335,516 156336,1220 156336,1222 156337,252 156340,972 156341,1127 156341,1893 156341,49057 156342,1220 156342,1222 156343,516 156344,252 156345,1240 156346,115659 156347,1608 156348,1132 156350,483 156351,1608 156352,261 156352,694 156352,32751 156353,30 156354,1425 156355,30 156357,298 156358,485 156359,171 156360,1323 156361,408 156362,102 156363,1326 156364,805 156365,156366 156367,485 156368,298 156370,640 156371,1247 156372,59021 156372,60576 156373,3623 156374,707 156375,81070 156376,44 156377,30 156378,30 156379,37 156379,68 156379,467 156379,868 156379,929 156379,1326 156379,1345 156379,1566 156379,1849 156379,3585 156379,5654 156379,5717 156379,5944 156379,8406 156379,8408 156379,8411 156379,14311 156379,14651 156379,17431 156379,18213 156379,18218 156379,18224 156379,18256 156379,18399 156379,18834 156379,20550 156379,21540 156379,32820 156379,40025 156379,44222 156379,96733 156379,131808 156379,136655 156379,137752 156379,138030 156379,148274 156379,155469 156379,156379 156379,160877 156379,160888 156379,161170 156379,161194 156379,161284 156379,161510 156379,161877 156379,162599 156379,162666 156379,162680 156379,162682 156379,162881 156379,163466 156379,164100 156379,165667 156379,165718 156379,167043 156379,169470 156379,171764 156379,173146 156379,174382 156379,174448 156379,174824 156379,175391 156379,177241 156379,180347 156379,182603 156379,186085 156379,188824 156379,188843 156379,190090 156379,194969 156379,195752 156379,197858 156379,213254 156379,219846 156379,221278 156379,224489 156379,229215 156379,229872 156379,230998 156379,232718 156379,234044 156379,237616 156379,237624 156379,237632 156379,244207 156379,247361 156379,249652 156379,249675 156379,252743 156379,256909 156379,256959 156379,262557 156379,263109 156379,263820 156380,874 156381,72 156382,1858 156383,1860 156384,142426 156384,145751 156384,147123 156385,280 156385,17245 156386,4545 156386,139010 156387,932 156388,30 156389,298 156390,485 156391,827 156392,192 156392,406 156393,467 156394,2048 156395,103860 156396,2048 156397,138686 156398,175 156399,1368 156400,1707 156401,298 156402,1983 156403,1068 156404,146 156404,779 156404,1515 156404,92476 156405,346 156406,156407 156408,850 156409,1010 156410,206 156411,141912 156413,346 156414,752 156415,2989 156415,2991 156416,158 156417,217 156418,83 156419,312 156420,459 156421,3623 156422,2923 156423,1388 156424,19 156424,356 156424,1571 156424,2421 156424,5326 156425,48 156426,1235 156426,1284 156426,1335 156426,7124 156427,843 156427,1388 156428,483 156429,298 156430,485 156431,79 156431,6119 156432,1353 156433,156434 156436,949 156437,119 156438,850 156439,30 156440,30 156441,30 156442,269 156443,1001 156444,1564 156445,640 156446,48 156448,1775 156449,285 156450,406 156451,885 156451,13704 156452,3623 156454,843 156455,323 156457,83 156458,1085 156459,217 156460,861 156461,240 156462,1556 156463,579 156464,302 156465,850 156466,156467 156468,156469 156468,158501 156468,158719 156468,159711 156468,160272 156470,6303 156471,393 156471,2782 156472,1556 156473,99 156474,255 156476,72 156477,200 156478,34 156478,35 156478,313 156478,536 156478,634 156478,1313 156478,1718 156478,2224 156478,2646 156479,247 156480,175 156481,1572 156482,150022 156483,30 156484,298 156485,485 156486,435 156487,3602 156488,657 156488,718 156488,2421 156489,843 156490,364 156491,657 156492,2319 156493,714 156494,138686 156495,1001 156496,175 156497,298 156498,779 156499,861 156500,202 156501,2929 156502,968 156503,156504 156505,1769 156506,389 156506,392 156506,2699 156507,72 156508,10 156508,2617 156508,2626 156508,3297 156508,21487 156509,1007 156510,563 156511,54 156512,366 156513,366 156514,77 156515,54 156516,563 156517,30 156518,346 156519,663 156520,99 156521,30 156522,388 156523,2424 156524,392 156524,1151 156525,1467 156526,366 156527,355 156527,2590 156528,818 156528,1776 156528,2617 156529,13980 156530,452 156530,457 156530,535 156530,676 156530,843 156530,918 156530,1655 156531,298 156532,485 156533,156534 156535,48 156536,355 156537,104 156537,557 156537,953 156537,954 156538,156539 156541,233 156542,360 156544,1659 156544,127158 156545,31977 156547,994 156548,58 156549,46 156550,30 156551,142426 156552,301 156553,30 156555,920 156556,1118 156557,1796 156558,872 156559,217 156560,515 156561,147 156562,1572 156563,151 156564,2421 156565,34 156565,35 156566,119 156567,30 156568,640 156569,640 156570,1203 156571,10 156571,104 156572,30 156573,30 156576,671 156576,1181 156577,1132 156578,781 156579,1707 156580,2889 156581,163 156581,579 156584,346 156585,309 156585,310 156586,147 156587,142405 156588,346 156589,1 156590,1319 156591,200 156591,248 156591,1332 156592,30 156594,356 156595,138686 156596,175 156597,298 156598,1151 156599,1749 156600,1556 156601,571 156601,868 156602,467 156602,571 156606,571 156606,868 156607,571 156614,30 156615,83 156616,875 156617,115659 156618,422 156620,206 156621,1740 156622,7 156623,602 156624,1179 156625,32 156626,156627 156628,714 156629,292 156630,994 156631,58 156632,46 156633,3804 156634,704 156635,192 156636,1836 156637,261 156638,30 156639,779 156640,592 156641,500 156642,142433 156643,68069 156644,30 156645,136 156646,2191 156646,142426 156646,145751 156647,1707 156648,30 156650,1402 156651,283 156653,298 156654,485 156655,726 156656,272 156656,1634 156656,22293 156657,2443 156658,58 156659,994 156660,46 156661,30 156662,156663 156664,2605 156665,30 156666,1782 156667,30 156668,160 156669,406 156670,1556 156671,392 156672,1465 156673,30 156674,1001 156675,156676 156677,366 156678,30 156679,240 156680,83 156681,120 156681,264985 156683,2775 156684,447 156685,302 156686,2775 156687,447 156688,1882 156689,104 156690,30 156691,356 156691,852 156691,185877 156692,30 156693,694 156694,30 156695,206 156696,142426 156696,145751 156697,156698 156700,536 156701,30 156702,141912 156703,113156 156704,79 156705,671 156706,620 156707,346 156708,156709 156710,1608 156712,273 156713,44 156714,50 156714,202 156714,349 156714,586 156714,875 156714,1175 156714,1289 156714,1370 156714,1454 156714,1877 156714,1985 156714,3999 156714,4545 156714,139010 156715,30 156716,1058 156717,147 156717,893 156717,1580 156719,146 156719,149 156719,158 156719,195 156719,252 156719,269 156719,1385 156719,92476 156720,9030 156721,50 156721,406 156721,779 156722,1265 156722,1266 156723,30 156724,83 156725,138686 156726,175 156728,298 156729,252 156730,422 156731,56 156732,113156 156733,302 156734,536 156735,1143 156736,843 156737,1058 156738,406 156739,156740 156739,164652 156739,167689 156739,171436 156741,140 156742,65 156743,483 156744,2620 156745,907 156746,811 156747,2210 156747,4237 156748,137 156749,5718 156750,10 156751,1454 156752,137 156753,137 156754,563 156755,346 156756,156757 156758,252 156759,83 156760,634 156761,557 156762,72 156763,147 156764,3623 156765,7416 156766,346 156767,1001 156768,150037 156769,358 156770,34 156770,35 156770,83 156770,217 156770,536 156770,660 156770,852 156770,1133 156770,4637 156770,7092 156771,1010 156772,30 156773,310 156774,5405 156775,346 156776,346 156777,346 156778,957 156778,1815 156779,602 156780,346 156781,3623 156782,3623 156783,1007 156784,312 156785,37 156785,717 156786,30 156787,2116 156788,13361 156791,346 156792,292 156792,304 156792,390 156792,626 156792,1285 156792,1479 156792,1801 156792,1858 156792,1881 156792,6068 156793,435 156794,30 156795,83 156795,222 156795,536 156795,631 156795,1085 156795,2334 156796,259 156797,156798 156799,843 156800,3182 156801,500 156802,1052 156803,1962 156804,1882 156805,2775 156806,54 156807,3623 156808,156809 156810,200 156811,1132 156812,30 156813,65 156814,3161 156816,83 156817,156818 156819,346 156820,389 156821,278 156822,22 156823,156824 156825,10 156826,167 156826,301 156826,605 156826,907 156826,1436 156827,668 156828,30 156829,1773 156830,175 156831,130 156832,424 156833,30 156834,160 156835,8308 156836,313 156837,313 156838,3370 156838,14453 156839,156840 156841,206 156842,310 156843,118 156844,1105 156845,155481 156846,1634 156847,269 156848,843 156849,3041 156850,366 156851,366 156852,202 156853,640 156854,83 156855,841 156856,346 156857,818 156858,657 156859,156860 156861,156862 156863,156862 156864,294 156865,2411 156866,805 156867,1801 156868,299 156869,422 156870,56 156871,7155 156872,424 156873,3507 156874,422 156875,56 156876,972 156877,156878 156879,536 156880,452 156880,457 156880,535 156880,676 156880,843 156880,918 156880,1655 156881,620 156881,779 156881,5310 156882,30 156883,156884 156886,1608 156887,355 156889,346 156890,330 156891,1858 156892,1860 156893,994 156894,46 156895,58 156896,1893 156897,1238 156899,141272 156899,156900 156901,671 156903,1452 156904,408 156905,631 156906,4411 156908,233 156909,640 156910,640 156911,577 156912,640 156913,663 156914,872 156914,2424 156915,3 156917,422 156918,3623 156919,457 156921,111 156921,760 156922,156923 156924,1132 156925,48 156926,994 156927,22 156928,156929 156930,2353 156932,292 156933,1707 156934,142433 156936,536 156937,178 156937,192 156938,1707 156939,435 156939,467 156940,138686 156941,175 156942,298 156943,358 156944,87 156946,156947 156948,1068 156948,4805 156949,314 156949,536 156950,622 156950,1033 156950,1531 156951,104 156952,302 156952,1579 156952,1659 156953,302 156954,83 156955,20771 156956,726 156957,41 156958,1177 156959,346 156960,809 156960,224874 156960,263956 156960,263958 156961,1782 156961,162599 156962,156963 156964,346 156965,24562 156966,861 156967,1177 156968,781 156970,808 156970,4355 156970,9457 156971,58 156972,150022 156973,647 156974,146 156975,344 156976,142426 156977,1052 156977,1151 156977,2697 156978,406 156979,146 156980,647 156981,344 156982,120 156982,1001 156982,1151 156982,1479 156983,156984 156985,809 156986,781 156987,200 156988,1968 156989,994 156990,192 156991,366 156994,1298 156994,18298 156995,30 156996,138686 156997,175 156998,527 156999,1608 157000,298 157001,563 157002,1241 157003,222 157004,157005 157006,192 157007,106 157008,3 157009,157010 157011,647 157012,146 157013,344 157014,483 157015,2146 157016,157017 157018,2083 157019,30 157020,81070 157021,346 157022,30 157023,433 157024,818 157025,2699 157026,720 157026,775 157028,200 157031,3623 157032,994 157033,58 157033,801 157034,852 157034,1740 157035,158 157036,640 157037,30 157038,3623 157039,3623 157040,346 157041,30 157043,200 157044,644 157047,346 157048,30 157049,5933 157049,6506 157051,392 157051,1858 157051,2274 157052,283 157052,115474 157053,843 157054,1285 157054,1888 157054,2083 157055,72 157056,344 157057,285 157058,30 157059,30 157060,1127 157062,346 157063,30 157064,30 157065,30 157066,157067 157068,346 157069,2048 157070,2048 157072,138686 157073,332 157074,175 157075,563 157076,298 157077,83 157077,178 157077,195 157077,442 157077,500 157078,862 157079,306 157079,307 157080,30 157081,77 157083,1363 157084,158 157085,346 157086,516 157087,1353 157088,157089 157090,1068 157091,415 157091,996 157092,346 157093,298 157094,485 157095,3260 157095,5540 157096,417 157097,175 157098,30 157099,346 157100,346 157101,157102 157103,56 157104,422 157105,346 157106,195 157106,406 157106,640 157107,113156 157108,1284 157109,44 157110,1181 157111,83 157112,346 157113,6506 157114,4545 157114,139010 157115,920 157116,157117 157118,30 157119,7124 157120,141912 157121,1133 157122,346 157123,157124 157125,346 157126,30 157127,360 157127,1893 157128,1240 157129,157130 157133,200 157133,772 157134,994 157135,157136 157137,1631 157138,1085 157138,1522 157139,146 157140,647 157141,344 157142,146 157143,647 157144,344 157145,50 157145,841 157145,2048 157146,87 157148,536 157149,157150 157151,254 157152,113156 157153,1608 157154,1132 157155,4545 157155,139010 157156,2334 157158,5906 157159,557 157160,626 157161,278 157162,137 157163,862 157164,30 157165,30 157166,1007 157167,298 157168,485 157169,30 157170,5265 157171,157172 157173,885 157173,13704 157174,1359 157175,2334 157176,435 157177,30 157178,146280 157178,159365 157179,72 157180,157181 157182,30 157183,157184 157185,346 157186,240 157186,430 157186,1001 157186,1235 157186,1335 157186,1368 157186,1381 157186,1882 157187,157188 157189,30 157190,30 157191,30 157192,843 157193,111 157193,292 157193,314 157193,373 157193,441 157193,27495 157193,33283 157193,46166 157193,135620 157193,152775 157193,153887 157193,179221 157193,217264 157193,223724 157194,949 157195,264 157195,491 157195,515 157197,309 157197,310 157199,10 157199,34 157199,35 157199,217 157199,222 157199,455 157199,5343 157200,346 157201,30 157202,920 157203,157204 157205,111 157205,1105 157206,557 157207,30 157208,30 157209,307 157209,682 157209,72439 157210,157211 157212,50 157213,2105 157215,30 157216,2205 157216,33424 157218,657 157219,269 157220,2210 157220,4237 157221,1860 157222,157223 157224,83 157224,219 157224,818 157224,1132 157224,1313 157225,30 157226,269 157227,435 157228,22 157229,843 157230,602 157232,157233 157234,157235 157236,30 157237,30 157238,30 157239,30 157240,30 157241,1087 157242,72 157243,1127 157244,202 157246,420 157246,467 157246,872 157246,1579 157247,841 157248,255 157249,113156 157250,861 157251,579 157252,302 157253,157254 157255,157256 157257,1085 157257,2590 157258,157259 157260,7757 157261,861 157262,72 157264,298 157265,485 157267,346 157268,509 157268,1836 157269,142473 157270,980 157270,1117 157271,452 157271,457 157271,535 157271,676 157271,843 157271,918 157271,1655 157272,671 157273,862 157273,1001 157274,157275 157277,355 157279,65 157280,157281 157282,2274 157283,346 157284,142426 157285,1544 157286,4611 157287,157288 157289,147 157289,158 157290,30 157292,447 157293,2775 157294,233 157295,30 157296,147 157297,992 157297,1276 157299,157300 157301,157302 157303,120 157304,157305 157306,15 157306,1179 157307,346 157309,1117 157310,366 157311,366 157312,640 157313,640 157314,366 157316,195 157317,79 157317,525 157317,4691 157318,875 157320,269 157322,760 157323,726 157325,10 157326,298 157326,417 157326,1085 157326,1212 157326,1285 157326,1785 157326,1818 157326,1955 157326,2205 157326,2296 157326,5718 157326,33424 157327,718 157328,346 157329,157330 157331,1068 157334,2915 157337,41 157339,264 157339,296 157339,14550 157340,138686 157341,175 157342,298 157343,1707 157344,1240 157346,1068 157347,1105 157347,1285 157348,1544 157349,4611 157350,818 157351,118 157351,4597 157352,309 157352,310 157353,158 157354,142433 157355,447 157356,2775 157357,1893 157358,1858 157359,1860 157360,30 157361,779 157361,68069 157361,118336 157362,873 157363,1837 157363,73570 157364,994 157365,147 157365,158 157366,4222 157368,83 157369,10 157369,2574 157370,1571 157371,202 157372,200 157373,1113 157374,717 157375,73570 157377,7360 157379,485 157380,298 157382,106 157383,356 157384,431 157385,1715 157387,868 157388,868 157389,157390 157391,328 157392,1893 157392,49057 157394,157395 157396,483 157397,2210 157397,4237 157398,143287 157399,83 157402,557 157403,1227 157403,86416 157404,146 157405,647 157406,344 157408,292 157409,261 157411,157412 157413,968 157414,147191 157416,592 157416,602 157418,14550 157419,3630 157420,312 157421,3194 157422,3623 157423,138686 157424,2048 157425,175 157426,994 157427,298 157428,3623 157429,298 157430,485 157431,2048 157432,358 157433,1877 157434,435 157435,30 157436,264 157437,3623 157439,1612 157440,157441 157440,189877 157440,215590 157440,217397 157442,346 157444,346 157445,843 157446,3623 157447,392 157448,4903 157449,138 157450,83 157451,1105 157452,4060 157453,3623 157454,149 157454,21442 157455,247 157455,2867 157455,2868 157457,801 157458,1836 157458,13361 157459,328 157460,344 157461,72 157462,285 157463,390 157464,72 157465,142405 157466,2266 157467,4223 157469,2048 157470,2334 157471,269 157472,1252 157472,1253 157473,44 157474,346 157475,83 157476,346 157477,30 157478,885 157478,13704 157479,435 157480,157481 157480,157884 157482,30 157483,1235 157483,1335 157484,58 157485,2244 157486,827 157487,217 157487,1417 157487,18831 157488,3 157489,557 157490,862 157491,843 157492,595 157493,1151 157494,344 157495,72 157496,285 157497,4594 157498,1274 157499,72 157500,10 157500,113156 157501,450 157502,1085 157503,30 157504,30 157505,4611 157506,30 157507,1058 157508,113156 157509,1238 157510,72 157511,72 157512,1385 157513,1235 157513,1335 157514,868 157515,151 157516,1087 157518,83 157519,1001 157520,919 157520,994 157521,779 157522,30 157523,760 157524,972 157525,157526 157527,30 157528,1556 157529,302 157530,392 157530,697 157532,346 157533,760 157534,760 157535,72 157536,760 157537,1462 157538,626 157539,850 157540,50 157540,147 157541,366 157542,366 157543,366 157544,366 157545,366 157546,452 157546,457 157546,535 157546,676 157546,843 157546,918 157546,1655 157547,255 157548,3695 157549,893 157550,355 157551,72 157552,510 157553,422 157554,56 157555,157556 157557,157558 157559,346 157560,292 157560,7698 157561,481 157562,346 157564,422 157565,56 157566,1837 157567,147 157567,406 157567,779 157567,1893 157567,2017 157568,50 157569,346 157571,3623 157572,483 157573,233 157574,972 157575,1012 157576,640 157577,4611 157578,1544 157579,2671 157580,2244 157581,647 157582,344 157583,146 157584,346 157586,4611 157587,1544 157588,861 157589,1238 157590,647 157591,146 157592,344 157593,299 157594,3207 157595,996 157596,142426 157597,4691 157599,852 157599,1888 157600,302 157601,868 157602,1807 157603,3623 157604,138686 157605,175 157606,298 157607,2146 157608,433 157609,1452 157610,671 157610,1181 157611,392 157612,760 157613,1454 157614,1551 157614,159477 157615,4571 157616,301 157617,1715 157618,118 157618,422 157618,4597 157618,5405 157619,647 157620,146 157621,344 157622,269 157623,994 157624,146 157625,647 157626,344 157627,2775 157628,3135 157629,1893 157630,5591 157631,592 157632,726 157633,83 157634,379 157635,157636 157637,485 157638,211 157639,298 157640,157641 157642,138686 157643,175 157644,298 157645,422 157646,56 157647,1 157647,104999 157648,406 157649,652 157650,310 157651,393 157652,113156 157653,302 157655,1860 157656,1858 157657,457 157658,875 157659,875 157660,138686 157661,175 157662,298 157663,1305 157664,302 157665,127158 157667,30 157668,3623 157669,1984 157670,1818 157672,620 157673,1844 157674,788 157675,3623 157676,3623 157677,3623 157678,3623 157679,50 157681,682 157681,1070 157681,72439 157682,3260 157684,760 157685,84257 157687,104 157687,557 157687,953 157687,954 157688,536 157688,2266 157689,1715 157690,200 157691,34 157691,35 157692,30 157693,157694 157695,1267 157696,30 157697,1181 157698,195 157699,146 157700,647 157701,344 157702,760 157703,275 157705,346 157706,261 157707,149 157707,622 157709,3367 157710,2048 157711,2048 157712,5405 157713,420 157713,595 157713,1688 157714,157715 157716,157715 157717,157715 157718,157715 157719,503 157721,1019 157722,145240 157723,104 157723,136 157723,254 157723,557 157723,953 157723,1368 157723,1939 157723,7270 157724,113156 157725,3138 157726,779 157727,676 157728,626 157729,1818 157730,138686 157731,175 157732,5405 157733,298 157734,157735 157736,30 157737,44 157738,30 157738,200 157738,772 157739,1805 157740,3623 157741,1220 157741,1222 157742,158 157743,3623 157744,1298 157745,1298 157746,406 157747,83 157748,150037 157749,1531 157750,1001 157751,312 157752,3623 157753,346 157754,157755 157756,843 157757,3623 157758,72 157759,818 157761,809 157762,157763 157764,473 157765,3623 157766,3623 157767,83 157768,3623 157769,2620 157770,332 157771,83 157772,358 157773,346 157774,1844 157775,779 157776,157777 157778,358 157779,557 157780,557 157781,8719 157782,138 157783,1882 157784,865 157785,557 157786,137 157787,118 157787,4597 157788,88820 157789,157790 157791,7416 157793,142405 157794,72 157795,760 157796,264 157796,1639 157797,16019 157798,1179 157799,72 157800,2367 157801,1087 157802,30 157803,135 157803,2105 157804,577 157805,2116 157806,1893 157807,1381 157808,254 157809,269 157811,452 157812,3370 157812,7124 157813,1149 157814,577 157815,862 157815,2590 157816,652 157817,2590 157819,31977 157820,355 157821,157822 157823,10 157824,157825 157826,157825 157827,157825 157828,157825 157829,157825 157830,452 157830,457 157830,497 157830,535 157830,676 157830,843 157830,918 157830,1655 157831,872 157832,207 157833,1429 157834,8884 157836,392 157837,668 157838,1085 157839,536 157839,18831 157840,1143 157841,157842 157844,1858 157845,1860 157846,157847 157848,2989 157848,2991 157849,4 157849,5 157850,83 157851,784 157852,225 157853,157854 157855,146 157856,647 157857,344 157858,1068 157859,994 157860,1858 157861,1860 157862,994 157863,485 157864,298 157865,157866 157868,1058 157868,13538 157869,30 157872,1359 157873,157874 157875,20257 157876,1805 157877,328 157878,44 157879,422 157880,56 157881,932 157882,346 157883,483 157886,827 157887,422 157888,422 157889,422 157890,422 157891,422 157892,422 157893,422 157894,422 157895,422 157896,422 157897,422 157898,422 157899,222 157900,10 157901,30 157902,2626 157903,83 157904,336 157905,30 157906,30 157907,536 157909,273 157910,72 157912,252 157913,157914 157915,640 157916,298 157917,485 157918,141912 157919,195 157919,1454 157920,10 157921,668 157922,1564 157923,592 157924,157925 157926,127158 157927,313 157928,2506 157929,493 157929,920 157930,422 157931,157932 157933,157934 157935,157936 157937,2168 157938,1773 157939,1181 157940,953 157941,15119 157941,31346 157942,298 157943,485 157944,298 157945,485 157946,157947 157948,157949 157950,2266 157951,157952 157953,30 157955,113156 157956,704 157957,135 157957,137 157959,1 157959,649 157960,157961 157962,157963 157965,640 157967,157968 157969,157968 157970,157968 157971,631 157972,157973 157974,252 157974,516 157974,1220 157974,1222 157975,157976 157975,160173 157977,355 157978,233 157979,107 157980,2416 157980,2417 157981,292 157982,338 157983,107 157983,338 157983,372 157983,862 157983,1001 157983,1133 157983,1837 157984,298 157986,157987 157988,157989 157990,1133 157991,3538 157992,157993 157992,224072 157992,227608 157992,228036 157994,298 157995,485 157997,157998 157999,72 158002,1058 158003,305 158003,1132 158004,647 158005,344 158006,146 158007,22 158008,158009 158010,1844 158011,187 158012,273 158013,158014 158015,2367 158016,3258 158017,158018 158019,44 158020,158021 158020,223216 158020,227856 158020,238758 158020,240856 158020,254185 158020,257701 158020,265001 158022,158023 158022,219579 158026,328 158027,932 158029,483 158030,48 158031,6387 158033,2506 158034,872 158035,872 158036,58 158036,328 158037,30 158038,158039 158040,30 158041,704 158042,175 158043,1722 158044,30 158045,240 158046,30 158047,30 158048,72 158049,1257 158049,3085 158051,72 158052,344 158053,285 158054,30 158056,483 158057,1359 158058,30 158059,1181 158060,1983 158060,1984 158060,3949 158061,72 158062,704 158063,171 158064,171 158065,10 158066,3524 158067,4545 158067,139010 158068,557 158069,557 158070,72 158071,72 158072,72 158073,20757 158074,298 158075,485 158076,1893 158077,72 158078,467 158078,152855 158079,760 158079,954 158079,1580 158079,10318 158080,158081 158083,211 158085,142473 158086,1566 158087,72 158088,3148 158090,158091 158092,158093 158094,310 158095,158096 158097,83 158097,86 158097,219 158097,818 158097,985 158097,1132 158097,1313 158098,4545 158098,139010 158099,328 158100,309 158101,158102 158103,309 158104,1849 158105,1458 158106,158107 158106,198047 158108,4939 158108,4940 158108,4941 158109,158110 158111,72 158112,309 158113,30 158114,309 158115,72 158116,255 158117,72 158118,72 158119,1644 158120,72 158122,72 158123,72 158124,292 158125,1070 158126,294 158127,32475 158128,296 158129,298 158130,302 158131,72 158132,158133 158134,233 158135,355 158137,56 158138,422 158139,358 158140,72 158141,647 158142,344 158143,146 158144,366 158146,366 158147,733 158148,733 158149,450 158150,1655 158151,158152 158153,1293 158154,1544 158155,4611 158156,1238 158157,452 158157,457 158158,3555 158159,726 158160,1715 158161,142409 158161,146280 158161,159365 158162,994 158163,58 158164,46 158166,1452 158167,255 158168,151 158169,58 158170,994 158171,46 158172,171 158174,298 158175,485 158177,117795 158178,467 158179,1014 158180,640 158181,3507 158182,868 158183,2775 158184,447 158185,138686 158186,175 158187,640 158188,298 158189,211 158190,298 158191,485 158192,1177 158193,676 158193,918 158194,485 158195,298 158196,2210 158196,4237 158197,631 158198,422 158199,283 158200,1151 158201,450 158202,255 158203,158204 158205,1707 158206,647 158207,146 158208,344 158209,647 158210,344 158211,146 158212,536 158212,694 158212,949 158213,1359 158214,647 158215,146 158216,344 158217,171 158218,872 158219,973 158219,1293 158220,1860 158221,1858 158222,3695 158223,872 158224,68069 158225,83 158226,138686 158227,175 158228,298 158229,298 158230,485 158231,647 158232,344 158233,146 158234,1608 158235,1132 158236,1715 158237,86 158238,158239 158240,671 158241,145751 158242,1319 158243,83 158244,72 158245,390 158246,87 158246,1274 158246,1454 158248,217 158248,314 158249,1559 158250,138686 158251,175 158252,298 158253,389 158254,2944 158255,1454 158256,760 158257,557 158258,1 158259,872 158260,1252 158260,1253 158261,1284 158262,346 158264,827 158265,30 158266,30 158268,1210 158269,1119 158270,287 158270,3999 158271,344 158271,685 158272,392 158274,1715 158275,1849 158276,868 158277,1860 158278,1858 158279,801 158282,30 158284,1474 158285,1089 158286,217 158286,1417 158287,801 158288,2460 158289,994 158289,190492 158290,344 158292,1962 158293,3769 158294,15 158295,158296 158298,535 158298,843 158300,596 158301,907 158303,5265 158304,200 158304,248 158305,138686 158306,175 158307,298 158308,1118 158309,292 158310,217 158316,850 158317,647 158318,256 158319,298 158320,485 158321,406 158322,30 158323,1117 158324,217 158324,455 158324,1417 158325,72 158326,86 158328,158329 158330,72 158331,255 158332,15573 158333,142473 158335,1010 158336,1844 158339,269 158340,136 158341,44 158343,79 158344,450 158345,932 158346,2048 158347,2048 158348,450 158349,406 158351,312 158352,422 158352,602 158353,83 158355,779 158355,141912 158356,1089 158357,158358 158359,516 158360,34 158360,35 158361,557 158362,2048 158363,483 158364,2048 158367,72 158368,138686 158369,175 158370,83 158370,278 158371,298 158372,602 158373,1707 158374,302 158375,158376 158377,255 158378,2209 158379,3 158379,704 158380,298 158381,485 158383,450 158384,72 158384,2782 158385,240 158386,217 158387,2045 158388,178 158388,259 158388,315 158388,346 158388,393 158388,435 158388,439 158388,538 158388,671 158388,934 158388,996 158388,1033 158388,1068 158388,1163 158388,1294 158388,1590 158388,1612 158388,1644 158388,1877 158388,2353 158388,6661 158389,138686 158390,175 158391,483 158392,17309 158393,298 158394,30 158395,450 158396,431 158398,5034 158400,6323 158402,885 158402,13704 158403,158404 158405,5034 158406,557 158407,158408 158409,158408 158410,158408 158411,158408 158412,1117 158413,1289 158414,2209 158414,14434 158415,358 158416,8854 158417,2574 158418,760 158419,158420 158421,760 158422,760 158423,158424 158425,1181 158426,760 158427,1556 158428,158429 158430,850 158431,240 158432,72 158433,247 158434,158435 158436,862 158437,602 158438,2083 158439,467 158440,2116 158441,34 158441,35 158442,516 158443,138686 158444,175 158445,516 158446,298 158447,20 158448,158449 158450,158451 158452,1556 158453,577 158454,72 158455,557 158456,980 158457,2775 158458,366 158459,647 158460,146 158461,344 158462,577 158463,158464 158465,10 158466,146 158467,344 158468,647 158469,158470 158471,158472 158475,818 158476,687 158478,158479 158480,1285 158481,760 158482,72 158483,142405 158484,255 158485,255 158486,1417 158487,158488 158489,255 158490,420 158491,420 158492,72 158493,72 158494,2697 158495,72 158496,184 158497,158498 158499,2590 158502,1235 158502,1335 158503,2146 158504,72 158505,158506 158507,4192 158507,4193 158508,178 158509,872 158510,1429 158511,72 158512,10 158512,3316 158513,704 158514,668 158515,30 158516,72 158517,72 158518,72 158519,2146 158520,862 158521,207 158522,146952 158523,72 158524,450 158525,158526 158527,158526 158528,167 158528,301 158528,972 158529,1143 158530,115659 158531,32475 158532,158533 158534,83 158535,3769 158536,233 158537,355 158538,255 158539,141912 158540,485 158541,298 158542,30 158543,452 158543,457 158543,535 158543,676 158543,843 158543,918 158543,1655 158544,298 158545,485 158546,289 158546,290 158546,94134 158547,1509 158548,485 158549,298 158550,818 158551,146 158552,647 158553,344 158554,298 158555,485 158556,72764 158556,124668 158557,41 158559,158560 158561,1151 158561,1363 158563,158564 158566,422 158566,602 158567,1127 158568,136072 158569,640 158570,640 158571,264 158571,999 158571,1147 158571,1179 158571,1515 158571,1559 158571,6880 158572,433 158572,1634 158573,1179 158573,1612 158574,1801 158575,171 158576,911 158577,143287 158578,4545 158578,139010 158579,557 158580,663 158583,663 158584,1267 158584,2605 158585,1479 158588,72 158590,106 158591,255 158592,1465 158593,1707 158595,450 158596,83 158598,138686 158599,175 158600,313 158601,298 158602,602 158603,3846 158604,356 158605,447 158606,2989 158606,2991 158607,7 158608,718 158609,467 158610,1019 158611,827 158612,356 158614,222 158615,784 158615,142473 158616,516 158617,309 158617,310 158617,483 158618,784 158619,1240 158620,968 158621,827 158623,1010 158624,779 158625,83 158627,467 158627,868 158627,156379 158627,162599 158629,104 158632,1085 158632,5213 158633,536 158633,18831 158634,720 158635,1151 158636,142409 158636,146280 158637,158 158639,931 158640,571 158641,743 158642,107 158643,142473 158644,195 158645,31977 158646,344 158647,647 158648,146 158649,158650 158651,217 158652,868 158653,2775 158654,718 158655,13361 158657,138686 158658,175 158659,298 158661,146 158662,647 158663,344 158664,2260 158665,827 158666,83 158667,788 158669,2083 158670,146 158671,647 158672,344 158673,450 158674,1 158674,1402 158675,447 158676,2775 158677,255 158678,1908 158678,55077 158679,1860 158680,1858 158681,433 158682,455 158682,657 158683,292 158684,240 158684,760 158684,1019 158685,1323 158686,102 158687,408 158688,1326 158689,994 158690,146 158691,647 158692,344 158693,602 158694,146 158695,647 158696,344 158697,1309 158698,852 158699,980 158700,192 158700,818 158701,360 158701,1893 158702,467 158704,663 158705,631 158705,1078 158705,4223 158707,518 158707,1955 158708,1127 158709,358 158710,146 158711,647 158712,344 158713,344 158714,146 158715,647 158716,142473 158717,991 158718,20 158718,118336 158720,146280 158721,2371 158722,44 158723,313 158724,84257 158725,932 158726,158727 158728,2048 158730,313 158731,602 158732,255 158733,2048 158734,312 158734,338 158734,3538 158735,71 158736,809 158737,536 158738,83 158739,1419 158740,972 158741,14797 158742,3804 158743,2737 158744,518 158745,3193 158746,31122 158747,1 158748,217 158749,588 158749,590 158750,868 158751,467 158751,868 158752,3148 158753,422 158754,515 158755,217 158756,278 158757,83 158758,146 158759,344 158760,647 158761,3623 158762,364 158762,609 158762,1844 158762,1973 158763,158763 158764,704 158765,994 158766,406 158767,781 158768,83 158769,138686 158770,175 158771,298 158772,483 158774,1891 158775,48 158775,86 158775,292 158775,315 158775,340 158775,483 158775,620 158775,663 158775,668 158775,1151 158775,1179 158775,1623 158775,1837 158775,4597 158775,6506 158776,158777 158778,158777 158779,3623 158780,158 158781,83 158782,435 158783,2244 158784,10 158785,2572 158786,877 158786,5101 158787,843 158788,206 158788,217 158788,283 158788,1019 158788,1417 158788,2266 158789,310 158789,3039 158790,72 158791,158792 158793,1381 158794,406 158795,158796 158797,310 158798,158799 158801,301 158801,968 158802,1 158804,215 158805,72 158806,1858 158807,1860 158809,704 158810,146 158811,647 158812,344 158813,536 158814,885 158814,13704 158815,178 158816,285 158816,1655 158816,92476 158817,1149 158818,158819 158818,175143 158820,83 158821,192 158822,83 158823,2989 158823,2991 158824,10 158825,3623 158826,4355 158827,795 158828,3623 158829,28755 158830,1983 158831,1618 158831,19443 158833,217 158834,2797 158835,107 158836,1877 158837,2460 158838,192 158838,336 158838,818 158838,127158 158839,647 158840,146 158841,344 158842,72 158843,893 158844,1001 158845,805 158845,2209 158846,83 158848,255 158850,269 158851,994 158852,302 158853,6837 158855,278 158856,72 158857,158858 158857,166816 158859,631 158860,30 158861,72 158862,2083 158863,450 158864,146 158865,647 158866,344 158867,346 158868,30 158869,255 158871,1149 158872,135 158873,647 158874,146 158875,344 158876,2889 158877,1353 158878,483 158879,158880 158881,158882 158883,158884 158883,190667 158886,158887 158888,1467 158889,455 158890,2424 158891,1871 158892,536 158893,2421 158894,83 158895,13980 158896,83 158897,158898 158899,843 158900,158901 158902,158903 158904,3345 158905,366 158906,310 158907,355 158908,1655 158909,2867 158910,452 158911,158912 158913,2367 158914,149 158916,146 158917,647 158918,344 158919,233 158920,657 158921,671 158922,452 158922,843 158922,918 158923,1132 158924,50 158924,30428 158925,1267 158925,1893 158925,3999 158925,49057 158926,717 158927,1238 158929,843 158930,818 158931,1452 158932,985 158932,1070 158933,58 158934,994 158935,46 158936,58 158937,994 158938,46 158939,376 158940,1860 158941,1858 158942,336 158943,97 158944,1801 158945,3623 158946,310 158946,3039 158949,805 158949,1659 158949,66297 158950,126 158951,2590 158952,72 158953,622 158954,592 158956,217 158958,1983 158960,1149 158961,994 158962,346 158964,138686 158965,22293 158966,175 158967,298 158968,41 158968,1252 158968,1253 158970,1033 158971,1522 158972,136 158973,158974 158975,358 158976,852 158976,1010 158977,83 158980,726 158982,980 158983,158984 158985,313 158986,647 158987,146 158988,344 158989,675 158989,1590 158990,392 158990,809 158990,877 158990,1284 158990,148742 158991,30 158992,579 158993,433 158994,485 158995,298 158996,1968 158998,138686 158999,1240 159000,175 159001,30 159002,159003 159004,415 159004,1143 159005,81 159006,298 159007,907 159008,4355 159009,1014 159010,160 159011,1001 159012,1016 159014,571 159017,809 159018,893 159019,452 159019,457 159019,535 159019,676 159019,843 159019,918 159019,1655 159020,302 159021,46 159021,233 159021,292 159021,332 159021,525 159021,586 159021,592 159021,954 159021,972 159021,1467 159021,2286 159021,3695 159021,10318 159021,42628 159022,743 159023,309 159023,310 159024,261 159025,698 159026,302 159026,2116 159026,6303 159027,1707 159028,1 159028,147 159028,149 159028,171 159028,1623 159030,146 159031,647 159032,344 159033,217 159033,379 159033,1454 159034,717 159035,485 159037,283 159038,302 159038,861 159038,893 159038,1556 159039,72 159040,83 159041,3555 159042,1860 159043,1858 159044,19010 159046,159047 159049,868 159049,152855 159050,1860 159051,1858 159052,130 159053,30 159055,1323 159056,1326 159057,408 159058,102 159059,717 159060,146 159061,72 159062,344 159063,285 159065,1326 159066,1893 159067,818 159067,4548 159068,3507 159069,733 159069,1623 159070,184 159071,1368 159072,138 159072,1858 159072,13136 159073,861 159074,124668 159075,1474 159076,485 159077,298 159079,697 159080,483 159081,149 159082,697 159082,49057 159083,843 159084,217 159085,178 159087,657 159088,2260 159089,671 159090,72 159091,312 159093,71 159093,859 159094,217 159094,2443 159095,17309 159096,392 159097,1531 159098,72 159099,44 159100,104 159101,138686 159102,175 159103,366 159103,1860 159104,298 159105,72 159107,2146 159108,151 159108,309 159108,310 159109,2205 159109,33424 159110,225 159111,2048 159113,2626 159114,2048 159116,283 159116,379 159116,431 159116,634 159116,5591 159117,366 159117,972 159119,4571 159120,1858 159121,1860 159122,72 159123,932 159124,1309 159126,3555 159127,760 159128,195 159129,784 159129,221306 159130,994 159131,1858 159132,1860 159133,149 159133,406 159134,32 159134,392 159134,509 159134,644 159134,697 159134,809 159134,1363 159134,1858 159134,2274 159134,2699 159134,4903 159134,76096 159135,195 159136,138686 159137,159138 159139,175 159140,4571 159141,298 159142,1007 159143,406 159144,6506 159145,1608 159146,83 159147,704 159148,676 159149,146 159150,647 159151,344 159152,994 159154,328 159155,68 159156,861 159157,30 159158,925 159159,247 159159,516 159160,269 159161,147 159162,30 159163,3949 159164,1566 159165,483 159166,136 159166,563 159167,1663 159168,4611 159169,1544 159170,2373 159171,1010 159172,1983 159173,861 159174,30 159175,3695 159176,457 159176,535 159176,676 159176,843 159176,918 159176,1655 159179,3 159180,493 159180,1265 159180,1266 159181,113156 159182,159183 159184,640 159185,1984 159186,159187 159188,247 159188,2867 159188,2868 159189,1274 159190,346 159191,83 159192,159193 159194,3069 159195,312 159195,358 159196,640 159198,1 159199,146 159200,647 159201,344 159202,2367 159203,1332 159204,159205 159206,13361 159207,577 159208,58 159209,10 159209,90388 159209,156760 159210,1715 159211,2620 159211,5908 159212,6027 159213,5906 159214,557 159215,626 159216,278 159217,137 159218,862 159219,636 159220,137 159221,1796 159221,19519 159222,159223 159224,435 159225,159226 159227,843 159228,647 159229,344 159230,146 159231,949 159232,2480 159233,455 159234,4222 159235,2617 159236,4192 159238,1140 159239,1188 159240,1181 159241,225 159242,444 159243,159244 159245,273 159246,980 159247,255 159248,1707 159249,602 159250,4223 159251,56 159252,422 159253,255 159254,255 159255,255 159256,1007 159259,113156 159260,920 159261,113156 159262,859 159264,269 159265,143287 159266,585 159266,622 159266,73938 159267,175 159268,1188 159269,83 159272,328 159272,779 159273,4549 159274,422 159275,142405 159276,147 159277,68069 159278,328 159279,63 159280,1313 159281,159282 159283,159284 159285,312 159286,273 159287,2626 159288,147 159289,104 159290,137 159290,1181 159291,581 159292,3695 159293,843 159295,22 159296,255 159297,269 159298,304 159299,72 159300,72 159301,119 159302,640 159303,1147 159304,298 159305,1807 159306,1012 159307,272 159307,439 159307,563 159307,980 159307,2353 159307,2367 159307,15573 159308,1458 159309,652 159310,75912 159311,255 159312,285 159313,355 159314,184 159315,151 159316,1127 159317,360 159318,707 159319,3447 159320,6627 159321,647 159322,146 159323,344 159324,159325 159326,305 159327,452 159327,457 159327,676 159327,843 159327,918 159328,647 159329,344 159330,146 159331,233 159332,142473 159333,827 159334,1326 159335,255 159336,366 159338,366 159340,1385 159342,536 159343,240 159344,142473 159345,592 159346,1 159348,433 159349,4223 159350,841 159351,275 159353,843 159354,1860 159355,1858 159356,200 159357,640 159358,1319 159359,58 159360,444 159360,720 159360,1001 159360,1732 159361,1844 159362,994 159363,58 159364,46 159367,344 159368,647 159369,146 159370,485 159371,298 159373,54 159374,372 159375,861 159375,893 159376,392 159377,4504 159378,138686 159379,175 159380,298 159381,1509 159382,54 159382,83 159382,140 159382,660 159382,752 159382,919 159382,1287 159382,1309 159382,1479 159382,1579 159382,1871 159382,2424 159382,6424 159383,372 159383,588 159383,590 159383,805 159383,1368 159385,920 159386,657 159386,1019 159386,2266 159387,251 159388,1858 159389,1860 159392,251 159393,1572 159394,138 159394,1616 159394,13361 159394,19413 159396,1210 159397,346 159399,920 159400,79 159400,818 159402,372 159403,1149 159404,920 159405,34 159405,35 159405,222 159405,2266 159407,1707 159408,2146 159411,151 159412,3 159413,83 159414,255 159415,2828 159416,1580 159416,2590 159418,255 159419,159420 159421,784 159422,1715 159423,2209 159425,372 159425,1285 159425,2991 159426,200 159427,1888 159429,211 159430,1001 159433,30 159434,779 159435,1243 159436,1010 159437,784 159438,2210 159438,4237 159440,1160 159441,1566 159442,850 159443,408 159444,102 159445,1323 159446,1326 159447,58 159448,994 159449,46 159450,83 159451,104 159452,872 159453,1267 159455,77 159455,269 159456,622 159457,19010 159458,83 159460,1241 159460,1474 159460,1927 159460,7757 159461,2557 159462,309 159462,310 159463,58 159464,994 159465,46 159466,1707 159467,439 159468,4260 159469,302 159470,994 159471,58 159472,46 159473,326 159474,704 159475,302 159478,138686 159479,175 159480,849 159480,187176 159481,298 159482,83 159483,240 159484,483 159485,72 159486,44 159487,302 159488,273 159489,44 159490,1454 159492,138 159492,302 159492,849 159492,1011 159492,1849 159493,2048 159494,302 159496,145751 159497,346 159498,932 159499,1419 159500,302 159501,588 159501,590 159502,217 159503,167 159504,3467 159505,379 159506,309 159506,310 159506,161171 159507,1983 159508,557 159509,602 159510,1010 159511,269 159512,557 159513,1243 159514,676 159515,159516 159517,1243 159518,557 159519,1151 159520,6638 159521,994 159522,360 159524,3623 159526,3623 159527,452 159527,127158 159528,138686 159529,175 159531,406 159532,292 159533,215 159533,240 159533,372 159533,417 159533,592 159533,631 159533,805 159533,932 159533,1082 159533,1282 159533,1462 159533,1564 159533,1608 159533,1785 159533,1818 159533,1955 159533,1962 159533,2620 159533,4237 159533,8537 159533,182162 159534,298 159535,349 159536,1370 159537,435 159538,406 159539,457 159540,406 159541,83 159542,536 159543,1821 159544,159545 159546,697 159547,3623 159548,30 159549,159550 159551,843 159552,843 159553,240 159554,8270 159555,4903 159556,358 159557,1474 159558,289 159558,290 159558,94134 159559,390 159560,30 159562,4260 159562,142430 159562,142473 159562,142879 159563,1983 159564,195 159565,159566 159567,83 159568,605 159569,330 159570,151 159571,949 159572,557 159573,862 159574,577 159575,2116 159576,184 159577,106954 159578,106954 159579,106954 159580,602 159581,306 159581,307 159582,602 159583,1773 159585,1773 159586,1773 159587,184 159588,1773 159589,137 159590,875 159591,1773 159592,1773 159593,171 159594,1773 159595,602 159596,1773 159597,697 159598,77 159599,202 159600,1773 159601,525 159602,107 159603,1309 159604,138686 159605,1881 159606,175 159607,1285 159608,298 159609,1298 159610,83 159611,631 159612,294 159614,113156 159615,184 159616,557 159617,4594 159618,149 159619,159620 159621,9457 159622,159623 159624,83 159624,278 159626,138686 159627,175 159628,298 159629,640 159630,159631 159632,563 159633,206 159634,1235 159634,1335 159635,1773 159636,2411 159637,779 159638,159639 159640,2620 159641,30 159643,49057 159644,1773 159644,182728 159645,1 159646,2590 159647,159648 159649,872 159650,1429 159651,920 159652,247 159654,159655 159656,668 159657,159658 159659,113156 159660,159661 159663,337 159663,338 159663,393 159663,439 159663,626 159663,649 159663,772 159663,2367 159664,1474 159665,2506 159666,301 159666,968 159666,1001 159666,1837 159666,2083 159667,358 159668,255 159669,2506 159670,424 159671,1143 159672,417 159674,355 159675,76096 159676,344 159676,671 159676,1425 159676,1619 159676,23783 159677,626 159678,994 159679,46 159680,58 159681,366 159683,366 159685,58 159686,46 159687,994 159688,302 159690,3555 159693,280 159693,733 159693,17245 159694,868 159695,1891 159696,868 159697,233 159698,58 159699,994 159700,46 159701,2353 159702,868 159704,868 159705,63471 159707,349 159708,1773 159709,1631 159710,310 159712,41 159712,1119 159712,1462 159712,8537 159713,850 159714,58 159715,994 159716,46 159718,240 159719,907 159720,259 159720,775 159721,483 159723,1284 159725,433 159726,240 159726,818 159727,356 159727,852 159727,5591 159728,1293 159729,500 159730,450 159731,302 159732,1359 159734,138686 159735,175 159736,1425 159737,9015 159738,298 159739,2671 159740,2775 159741,447 159742,68 159743,30 159743,175 159743,227 159743,1179 159743,2782 159743,3148 159743,6051 159743,8501 159743,14472 159743,27834 159745,1238 159746,772 159747,1117 159748,30 159749,704 159750,4260 159751,4411 159752,675 159752,784 159752,76096 159753,392 159753,1454 159753,1572 159753,3804 159754,1417 159755,1274 159758,251 159760,159761 159762,31206 159763,58 159764,994 159765,46 159766,1556 159767,1749 159768,4771 159770,3 159771,1452 159772,760 159773,83 159774,48 159775,360 159776,332 159777,135 159778,779 159778,68069 159778,86832 159778,141912 159779,138686 159780,175 159781,298 159782,535 159785,163 159785,6303 159786,202 159787,4611 159788,1326 159789,16687 159790,5591 159791,1773 159793,104 159793,254 159793,557 159793,953 159793,954 159793,1939 159794,222 159794,657 159794,1140 159794,2266 159795,159796 159797,30 159798,516 159799,30 159801,1070 159802,726 159803,907 159804,356 159805,1608 159806,1132 159807,192 159807,195 159807,406 159807,422 159807,620 159807,1181 159808,397 159809,159810 159811,159810 159812,195 159813,313 159815,1773 159819,392 159822,159823 159824,222 159825,254 159826,159827 159828,30 159829,920 159830,2944 159831,1773 159832,261 159834,159835 159836,159835 159837,536 159839,861 159840,1707 159841,44 159842,1858 159843,1860 159844,875 159845,1773 159846,3 159847,2620 159848,159365 159849,393 159850,435 159851,126 159851,649 159851,731 159852,1858 159853,1860 159854,779 159855,673 159856,2146 159857,1715 159858,2048 159859,2048 159860,349 159861,3507 159862,159863 159864,843 159865,907 159866,467 159867,54 159867,278 159867,304 159867,392 159867,577 159867,589 159867,626 159867,859 159867,932 159867,1151 159867,1175 159867,1212 159867,1289 159867,1298 159867,1309 159867,1479 159867,1509 159867,1634 159867,1871 159867,2421 159867,3585 159867,9015 159867,14483 159867,14797 159867,189266 159868,1749 159869,932 159870,779 159871,1285 159873,1298 159874,149 159874,406 159875,83 159876,146 159877,647 159878,344 159879,2775 159880,447 159881,602 159882,159883 159884,1639 159885,3 159886,392 159886,1143 159886,1240 159886,2699 159887,1284 159888,2083 159889,4571 159890,19010 159891,611 159892,1287 159894,435 159895,467 159896,138686 159897,175 159898,298 159899,13661 159900,420 159901,859 159903,1274 159904,5874 159904,6955 159905,83 159906,467 159906,868 159907,843 159908,41 159908,328 159908,704 159908,760 159908,784 159908,805 159908,1149 159908,1285 159908,1402 159908,1631 159908,8180 159908,232709 159909,30 159910,269 159912,1773 159913,159914 159915,536 159916,1509 159917,340 159917,668 159918,1181 159919,957 159920,1238 159921,225 159921,248 159922,885 159922,13704 159923,118 159923,4597 159924,159925 159926,58 159926,217 159926,1449 159926,1612 159926,1983 159927,8719 159928,138 159929,865 159930,557 159931,137 159932,88820 159933,118 159933,4597 159934,137 159935,1298 159936,809 159937,99 159938,1274 159945,3 159946,159947 159948,483 159949,622 159950,516 159951,252 159952,1220 159952,1222 159953,973 159954,49057 159954,81070 159955,1983 159956,450 159956,2719 159957,30 159959,861 159960,8719 159961,138 159962,865 159963,557 159964,137 159965,118 159965,4597 159966,88820 159968,557 159969,920 159970,718 159971,171 159973,34 159973,35 159974,159975 159976,298 159977,485 159978,7416 159980,4571 159982,184 159983,222 159984,87 159984,217 159984,392 159984,595 159984,872 159984,1572 159984,2274 159985,332 159986,159987 159988,2979 159989,760 159990,358 159992,2506 159993,485 159994,37 159995,994 159996,158 159997,1298 159998,1298 159999,269 160000,211 160001,160002 160003,160002 160004,160005 160006,536 160006,4672 160007,147 160008,1 160009,160010 160009,172108 160011,160012 160013,160012 160014,160012 160015,640 160016,289 160016,290 160016,94134 160017,626 160018,225 160019,160020 160021,160020 160022,160020 160023,160020 160024,160020 160025,356 160026,366 160028,160029 160030,292 160030,644 160030,1012 160030,2699 160030,5469 160031,160032 160033,233 160034,355 160035,452 160036,8884 160037,160038 160039,1773 160039,132423 160039,160040 160039,207905 160039,212200 160039,213441 160039,213442 160039,213443 160039,213444 160039,213445 160039,213452 160039,213455 160039,214970 160039,216375 160039,216796 160039,216911 160039,216919 160040,1773 160041,99 160042,1085 160043,485 160044,298 160045,160046 160047,726 160048,726 160049,726 160050,760 160051,994 160052,1639 160053,1359 160054,83 160056,485 160057,298 160058,760 160059,4 160059,5 160060,408 160061,1323 160062,102 160063,1326 160064,760 160065,1016 160066,72 160067,200 160068,893 160070,1983 160071,167 160072,760 160073,640 160074,1564 160074,2620 160074,5718 160075,687 160075,861 160075,893 160077,142405 160078,160079 160080,875 160081,99 160082,622 160083,1177 160084,483 160085,99 160086,83 160087,602 160088,160089 160090,760 160091,151 160092,2989 160092,2991 160093,483 160094,602 160095,760 160096,136 160097,760 160098,760 160099,7416 160100,388 160101,714 160102,760 160103,160104 160105,596 160106,949 160107,640 160108,160109 160110,1010 160112,160113 160114,160113 160115,160116 160117,1210 160118,160119 160120,160121 160122,10 160123,30 160124,160125 160126,160127 160128,160129 160130,160131 160132,160133 160134,1544 160135,160136 160138,1707 160139,160140 160141,160142 160143,65 160145,72 160146,233 160147,355 160148,107 160149,2416 160149,2417 160150,292 160151,338 160153,298 160154,8180 160155,1631 160156,1133 160157,3538 160158,160159 160160,160161 160162,1133 160162,103860 160163,505 160163,5913 160163,13556 160163,14289 160163,21394 160163,157904 160163,207659 160165,160166 160167,760 160168,1052 160169,1893 160170,160171 160172,760 160174,160175 160176,160175 160177,160175 160178,160175 160180,310 160181,160182 160183,72 160184,217 160185,261 160185,372 160185,390 160186,1298 160187,1773 160188,160189 160190,535 160191,408 160192,1323 160193,1326 160194,102 160195,631 160196,160197 160196,162238 160198,44 160199,55849 160200,55849 160201,1212 160202,154408 160203,48 160204,346 160205,55849 160206,30 160207,55849 160208,160209 160210,50 160211,160212 160213,310 160214,160215 160216,483 160217,30 160220,2260 160221,779 160222,344 160223,647 160224,146 160225,1425 160226,920 160227,4545 160227,139010 160228,160229 160230,160231 160232,875 160233,99 160235,657 160237,1282 160238,457 160239,160240 160241,366 160242,557 160243,557 160245,160246 160247,509 160247,872 160247,127158 160248,8180 160249,358 160250,336 160250,1803 160251,422 160252,422 160253,422 160254,422 160255,422 160256,422 160257,422 160258,422 160259,422 160260,422 160261,160262 160263,50 160264,187 160265,73938 160266,1707 160267,1252 160267,1253 160269,1985 160270,1773 160273,269 160274,142473 160277,30 160278,31977 160279,3623 160280,389 160281,8855 160282,309 160282,310 160283,72 160283,184 160284,72 160285,328 160286,30 160287,217 160287,267 160287,872 160287,1118 160287,1796 160289,772 160290,160291 160292,346 160293,843 160294,292 160295,294 160296,296 160297,298 160298,160299 160300,160299 160301,83 160302,147 160303,671 160304,184 160305,83 160306,41 160307,160308 160310,233 160311,355 160312,259 160313,99 160314,1844 160315,875 160316,366 160317,160318 160320,138686 160322,5034 160323,160324 160326,30 160327,30 160328,397 160329,2867 160329,2868 160331,99 160332,160333 160334,1238 160335,309 160335,310 160336,211 160337,640 160338,1452 160339,1572 160339,2116 160341,333 160342,259 160343,1212 160345,631 160346,392 160347,875 160348,3623 160349,673 160350,779 160351,1132 160352,1608 160353,217 160354,1132 160355,1608 160356,875 160357,56 160357,422 160357,92476 160358,149 160361,875 160362,15 160362,58 160362,994 160362,3538 160362,7360 160363,328 160364,4611 160365,1544 160366,138686 160367,175 160368,298 160369,8855 160370,868 160371,1436 160372,30 160372,313 160373,301 160373,1293 160373,3422 160373,229644 160374,83 160375,3 160375,16687 160378,1240 160379,16687 160381,477 160382,640 160383,16687 160384,994 160385,3623 160386,146 160387,1085 160388,1085 160389,4260 160390,158 160391,477 160392,994 160393,15 160395,264 160396,10 160397,760 160398,55233 160399,393 160401,3623 160402,1117 160403,360 160403,1893 160404,1572 160405,3623 160406,872 160407,1608 160409,140 160409,1010 160409,1298 160410,636 160410,1807 160411,83 160412,48 160412,349 160412,809 160413,160414 160415,217 160415,536 160416,760 160417,79 160418,3623 160419,160420 160421,671 160422,1267 160423,1163 160423,1789 160425,160426 160427,861 160427,2116 160428,34 160428,35 160429,160430 160431,1132 160432,1608 160433,136 160435,99 160439,577 160440,760 160441,433 160441,907 160442,4218 160443,843 160445,41 160446,3769 160447,483 160448,808 160448,1639 160449,1274 160450,48 160450,58 160450,104 160450,111 160450,248 160450,264 160450,312 160450,442 160450,503 160450,557 160450,636 160450,749 160450,801 160450,862 160450,1016 160450,1082 160450,1147 160450,1149 160450,1257 160450,1267 160450,1282 160450,1332 160450,1381 160450,1466 160450,1564 160450,1659 160450,1745 160450,1807 160450,1882 160450,1955 160450,1962 160450,2205 160450,3115 160450,3135 160450,3474 160450,33424 160452,422 160453,422 160454,422 160455,72 160456,344 160457,285 160458,269 160459,160460 160461,406 160462,422 160463,422 160464,422 160465,422 160466,422 160467,422 160468,422 160469,422 160470,2373 160471,83 160472,273 160473,1179 160474,477 160475,1326 160476,44 160477,663 160478,41 160479,1118 160480,3623 160481,2373 160482,1773 160483,1893 160484,714 160486,99 160487,809 160488,217 160489,3507 160490,86 160490,388 160490,589 160490,1284 160490,1522 160490,1844 160491,3623 160492,142430 160492,142879 160493,1274 160494,1801 160495,932 160496,941 160496,1149 160497,516 160498,22 160498,247 160498,14472 160499,2048 160500,389 160502,87 160503,63 160504,2590 160505,240 160506,3 160506,1467 160506,16687 160507,1419 160508,875 160509,588 160509,590 160510,83 160511,252 160512,252 160513,1893 160514,1465 160515,505 160516,875 160517,328 160518,248 160519,515 160520,106 160520,1370 160522,138686 160523,32751 160524,175 160525,1564 160526,1564 160528,298 160529,1274 160529,1634 160530,192 160531,48 160532,30 160533,2116 160534,994 160535,3623 160536,925 160537,850 160538,392 160539,640 160539,1175 160540,151 160541,424 160542,151 160543,30 160545,1274 160545,1634 160546,920 160547,72 160547,312 160547,1052 160547,2605 160549,1140 160550,118 160550,422 160550,4597 160551,994 160552,1 160553,287 160554,278 160555,13980 160556,640 160557,1551 160558,447 160559,2775 160560,192 160560,3872 160561,1773 160562,805 160564,160565 160566,1436 160567,4490 160568,83 160568,278 160569,72 160570,344 160571,285 160572,68069 160573,571 160574,240 160576,30236 160577,113156 160578,83 160579,1844 160579,5405 160580,994 160581,994 160582,233 160583,861 160584,217 160585,579 160586,1556 160587,302 160588,146 160589,647 160590,344 160591,255 160592,255 160593,171 160594,861 160594,1287 160594,3148 160595,255 160596,1479 160597,1381 160598,647 160599,146 160600,344 160601,1474 160602,358 160604,1707 160605,557 160606,1247 160607,1247 160608,34 160608,35 160608,83 160609,30 160610,447 160611,2775 160612,1773 160613,3252 160614,4637 160615,344 160615,142433 160616,843 160617,8270 160618,994 160619,138686 160620,175 160621,298 160622,34 160622,35 160623,801 160624,15 160625,30 160626,171 160627,72 160628,1659 160629,30 160630,479 160630,1289 160630,1381 160630,1551 160631,3003 160631,3258 160631,3653 160632,1298 160633,160634 160635,160634 160636,2116 160637,30 160638,749 160639,932 160640,435 160641,843 160642,30 160643,1007 160644,22 160645,160646 160647,72 160648,577 160649,356 160650,247 160651,54 160652,160653 160654,2244 160655,175 160656,1381 160656,2292 160657,83 160658,30 160659,366 160660,366 160661,366 160662,1773 160663,2590 160664,2590 160665,1001 160666,77 160667,200 160667,772 160667,1332 160668,167 160668,301 160668,2083 160669,1467 160670,872 160671,207 160672,1429 160673,48 160674,10 160675,388 160676,586 160677,2424 160678,150022 160679,668 160680,306 160680,307 160681,1419 160681,3297 160682,640 160683,745 160684,1181 160685,355 160686,745 160687,1849 160688,3 160688,230509 160688,230517 160689,118336 160690,1224 160691,781 160692,1132 160693,783 160693,2737 160694,893 160695,4611 160696,1544 160697,671 160698,336 160698,1803 160698,21442 160699,141292 160701,233 160702,893 160703,13980 160704,1782 160705,3612 160706,1860 160707,595 160708,392 160709,2274 160710,4760 160711,6059 160712,5658 160713,4252 160714,623 160715,697 160716,6955 160717,1151 160718,2373 160720,142433 160721,433 160723,1014 160724,631 160725,355 160726,313 160726,1718 160726,2646 160726,5326 160727,104 160728,1789 160729,294 160730,1240 160731,147 160732,1634 160733,79 160734,160735 160736,72 160737,1143 160738,379 160738,2784 160740,1849 160741,972 160742,72 160743,8 160743,48 160743,86 160743,178 160743,340 160743,483 160743,647 160743,707 160743,3582 160744,1033 160745,718 160746,1247 160747,422 160748,422 160749,422 160750,422 160751,422 160752,422 160753,422 160754,422 160755,640 160756,640 160757,422 160758,422 160759,422 160760,422 160761,30 160762,1160 160763,160764 160765,160766 160767,83 160768,406 160769,206 160770,158 160770,406 160770,779 160771,160772 160773,718 160774,809 160775,138686 160776,175 160777,160778 160779,298 160780,336 160781,2671 160782,118 160782,4597 160783,2116 160784,2105 160785,72 160787,1776 160787,118336 160788,907 160789,623 160789,1805 160790,433 160791,30 160792,1608 160793,1132 160794,1509 160794,1551 160795,72 160796,344 160797,285 160798,222 160799,433 160800,1085 160800,33424 160801,6303 160801,148742 160802,1608 160803,1132 160804,30 160805,119 160805,347 160805,364 160805,372 160805,455 160805,525 160805,626 160805,805 160805,907 160805,1019 160805,1274 160805,1718 160805,2553 160806,3623 160807,1133 160808,557 160809,34 160809,35 160809,18831 160809,115474 160810,1807 160811,433 160812,868 160813,206 160813,15119 160816,217 160816,1559 160817,72 160818,360 160818,1893 160820,240 160821,760 160822,72 160823,344 160824,285 160825,301 160825,1010 160825,1241 160825,1522 160826,872 160827,1118 160828,1212 160829,336 160829,422 160830,6303 160831,687 160831,1556 160832,652 160833,389 160834,126 160834,818 160834,874 160834,1293 160834,1294 160834,1326 160835,994 160836,2156 160836,9343 160837,1167 160838,68 160838,240 160839,720 160840,1149 160841,160842 160843,306 160843,307 160844,809 160846,1323 160847,30 160848,63 160849,1559 160850,1541 160851,1849 160852,301 160853,907 160854,592 160855,151 160855,309 160855,310 160856,83 160857,1467 160858,636 160861,818 160862,160863 160864,919 160865,23783 160866,2989 160866,2991 160868,152855 160870,392 160870,779 160870,788 160870,809 160870,23287 160870,127158 160870,138686 160870,207837 160871,1274 160872,160873 160874,30 160875,192 160875,406 160876,1893 160876,49057 160879,14193 160880,68069 160881,2590 160882,31977 160883,999 160885,1130 160886,1370 160887,269 160889,68069 160890,72 160891,3623 160893,743 160894,760 160895,68 160896,58 160896,801 160896,1140 160897,1385 160897,115659 160898,973 160899,7 160900,2048 160901,663 160902,1458 160903,406 160904,138686 160905,175 160906,298 160908,703 160909,44 160910,390 160911,3623 160912,336 160912,118336 160913,861 160914,527 160915,83 160916,264 160917,49057 160918,483 160919,298 160920,485 160921,932 160922,240 160923,301 160923,1293 160923,103860 160924,592 160925,83 160925,2671 160926,485 160927,298 160928,135 160928,66297 160929,160930 160931,138686 160932,175 160933,301 160934,298 160935,3260 160936,195 160937,3 160937,264 160938,72 160940,622 160942,41 160943,32751 160944,18831 160945,313 160945,2646 160946,160947 160948,30 160949,302 160949,720 160950,467 160952,536 160953,477 160954,2719 160955,83 160956,217 160956,2116 160957,420 160958,424 160959,2750 160960,171 160961,907 160962,163 160962,346 160964,138686 160965,175 160966,893 160967,298 160968,406 160969,30 160970,5366 160971,417 160971,483 160971,2105 160972,83 160973,217 160974,269 160975,34 160975,35 160975,240 160975,283 160975,332 160975,536 160975,657 160975,949 160975,1019 160975,1072 160975,1539 160975,1955 160975,2168 160975,2319 160975,4594 160976,171 160977,557 160978,267 160979,2373 160980,160981 160982,72 160983,160984 160985,1773 160986,2867 160986,2868 160987,994 160988,392 160989,160990 160991,160990 160992,160990 160993,160990 160994,160990 160995,160990 160996,1332 160997,843 160998,264 160998,3538 160998,5213 160999,1631 161000,3138 161002,192 161003,255 161005,1509 161006,467 161007,207 161008,1474 161009,390 161010,2421 161011,358 161012,406 161013,843 161013,1241 161014,115659 161015,19010 161016,355 161017,217 161018,83 161019,298 161020,485 161021,358 161022,1984 161022,3949 161023,161024 161025,113156 161026,161027 161028,34 161028,35 161028,83 161028,158 161028,217 161028,278 161028,313 161028,634 161028,660 161028,852 161028,1133 161028,1313 161028,1466 161028,1467 161028,1718 161028,2224 161028,2646 161028,4637 161028,5326 161028,7092 161029,72 161030,19413 161031,161032 161033,536 161034,86 161035,79 161036,142870 161037,171 161038,671 161039,301 161040,563 161041,269 161042,312 161043,87 161044,1309 161046,563 161047,346 161048,356 161049,536 161050,161051 161052,142405 161053,1118 161054,577 161055,217 161056,640 161057,2116 161058,2923 161059,310 161060,289 161060,290 161060,94134 161061,920 161062,330 161063,332 161064,202 161065,1458 161066,3041 161067,640 161068,467 161069,366 161070,366 161071,366 161072,2146 161073,473 161074,2073 161075,1285 161076,640 161077,577 161078,2590 161079,640 161080,50 161081,355 161082,72 161083,344 161084,285 161086,422 161087,56 161088,161089 161090,233 161091,1267 161092,119 161094,118336 161095,358 161096,142870 161097,1033 161098,161099 161101,310 161102,2607 161103,2146 161104,714 161105,1465 161107,760 161108,760 161109,1238 161110,422 161111,805 161112,640 161113,1452 161114,589 161115,809 161116,714 161117,161118 161119,749 161120,1284 161121,161122 161123,1858 161124,1860 161125,4571 161126,8072 161128,994 161129,626 161130,422 161131,422 161132,422 161133,422 161134,422 161135,422 161136,422 161137,422 161138,422 161139,920 161140,138686 161141,422 161142,175 161143,422 161144,422 161146,298 161147,994 161148,1639 161149,994 161151,171 161153,450 161154,1722 161156,795 161157,147 161158,509 161158,510 161159,631 161162,885 161162,13704 161163,83 161164,328 161164,22482 161165,644 161167,794 161168,72 161169,200 161172,192 161172,663 161173,467 161174,5405 161175,142405 161177,151 161178,10 161178,3111 161179,2989 161179,2991 161180,596 161181,389 161181,920 161181,3769 161182,135 161183,65 161183,71 161183,611 161184,19010 161185,171 161185,1434 161186,202 161187,779 161187,1033 161187,1181 161188,333 161189,2424 161192,106 161192,2923 161193,97 161195,8270 161197,634 161197,6298 161198,422 161199,56 161200,187 161201,250 161201,1684 161202,113156 161203,222 161203,1467 161203,2923 161203,3524 161204,515 161205,161206 161207,2224 161208,146 161209,358 161210,252 161210,493 161211,1085 161212,1479 161213,202 161214,393 161215,1132 161216,781 161218,120 161218,1210 161218,1240 161218,1466 161219,1359 161220,1070 161221,118336 161222,2590 161223,30 161224,127158 161225,535 161226,408 161227,102 161228,1323 161229,1326 161230,1849 161231,3623 161232,1749 161233,83 161234,56 161235,422 161236,388 161237,8180 161238,3367 161239,1172 161240,161241 161242,1085 161243,772 161244,467 161245,1210 161246,298 161247,485 161248,1467 161249,911 161250,1313 161251,1220 161251,1222 161252,516 161253,252 161254,1773 161256,663 161257,8854 161258,158 161259,3623 161260,1240 161261,843 161262,1326 161263,1949 161265,10 161266,907 161267,2590 161268,772 161269,3623 161270,1240 161271,95554 161272,315 161272,538 161273,422 161274,7416 161275,422 161276,422 161277,422 161278,422 161279,422 161280,422 161281,1893 161282,211 161283,422 161285,422 161286,422 161287,120 161288,422 161289,433 161289,467 161289,1607 161289,162599 161290,2048 161291,328 161292,83 161293,2620 161294,622 161295,623 161296,175 161297,68069 161298,79 161299,390 161299,1580 161300,1058 161301,10 161302,1858 161303,1860 161304,1392 161305,932 161306,217 161307,1332 161308,58 161309,994 161310,46 161311,1007 161312,1052 161312,14550 161313,515 161314,207 161316,1634 161323,406 161324,161325 161326,30 161328,663 161330,483 161333,994 161334,314 161334,788 161336,872 161338,1429 161339,467 161340,138686 161341,175 161343,298 161347,287 161349,72 161350,151 161351,247 161351,2867 161351,2868 161352,5987 161353,301 161354,217 161354,1417 161355,3246 161356,536 161356,652 161356,2784 161357,34 161357,35 161358,161359 161360,668 161361,255 161362,1515 161363,217 161364,138686 161365,467 161366,175 161367,83 161368,83 161369,298 161370,126 161371,22 161372,298 161373,485 161374,850 161375,596 161375,1465 161376,1319 161377,161378 161379,1639 161380,1274 161381,483 161382,364 161382,2590 161383,372 161384,636 161384,1844 161385,1298 161386,640 161387,161388 161389,2146 161390,83 161392,634 161393,1309 161394,5906 161395,557 161396,626 161397,278 161398,137 161399,862 161400,83 161401,467 161402,631 161403,59021 161404,435 161405,843 161406,86 161407,602 161408,1359 161409,22 161410,138686 161411,1359 161412,175 161413,298 161415,171 161416,340 161416,142426 161417,1359 161418,885 161418,13704 161419,1415 161420,161421 161422,289 161422,290 161422,94134 161423,147 161424,1052 161425,920 161426,252 161426,1370 161426,1877 161427,1033 161428,252 161429,278 161430,442 161431,30 161432,1143 161433,563 161434,3 161435,161436 161437,366 161438,366 161439,366 161440,366 161441,366 161442,366 161443,366 161444,1001 161444,5911 161445,10 161446,509 161446,510 161447,119 161448,155481 161449,161450 161451,2105 161452,5405 161453,6424 161454,19986 161455,161456 161457,255 161458,636 161459,30 161460,66297 161461,485 161462,1235 161462,1335 161463,1326 161464,200 161465,355 161466,107 161466,417 161466,3069 161467,233 161468,779 161469,579 161470,138686 161471,175 161472,298 161473,59021 161474,485 161475,298 161476,6661 161477,147 161478,222 161479,1177 161480,298 161481,485 161482,467 161483,1130 161484,788 161485,1882 161486,1012 161488,1014 161489,483 161490,171 161491,749 161492,718 161493,397 161494,422 161495,422 161496,422 161497,422 161498,422 161499,422 161500,422 161502,422 161503,422 161504,86 161505,126 161505,337 161505,1370 161506,422 161507,422 161508,422 161509,929 161512,1130 161512,2373 161513,872 161515,83 161516,2775 161517,447 161518,1566 161519,83 161519,356 161519,388 161519,750 161519,1274 161519,1454 161519,1718 161519,2168 161519,5591 161519,6068 161519,37088 161519,57354 161520,309 161520,310 161521,626 161521,2995 161522,4611 161525,1556 161526,2931 161527,640 161528,130 161529,130 161530,687 161531,1267 161532,417 161532,1085 161533,130 161534,240 161534,877 161534,145502 161534,179804 161535,8990 161536,1707 161538,138686 161539,175 161540,79 161541,30331 161542,298 161543,3804 161544,118 161544,4597 161545,4066 161546,292 161546,1274 161549,2443 161551,3129 161552,752 161553,1309 161554,3328 161555,264 161555,301 161555,1531 161556,49057 161557,130 161558,138686 161559,175 161560,698 161561,1392 161562,298 161563,83 161564,3129 161565,390 161566,4611 161567,298 161568,485 161569,3135 161570,1955 161571,81 161571,192 161571,2312 161572,749 161573,200 161574,20 161575,784 161576,278 161576,657 161576,1019 161576,3409 161576,5911 161576,8855 161577,138686 161578,118336 161579,175 161580,298 161582,252 161583,516 161586,1955 161587,83 161588,1313 161589,805 161591,868 161592,1127 161592,49057 161593,1220 161593,1222 161594,55849 161595,2744 161596,406 161598,408 161599,1323 161600,1326 161601,102 161602,130 161603,58 161604,994 161605,46 161606,1836 161607,775 161608,143287 161609,6303 161610,1381 161611,178 161612,4691 161613,1147 161614,671 161615,4218 161616,2784 161617,315 161617,457 161618,1001 161619,83 161620,493 161620,3148 161621,72 161622,301 161623,305 161624,1285 161625,1127 161626,1210 161627,760 161629,34 161629,35 161630,1210 161631,1370 161632,2048 161634,563 161634,920 161635,779 161636,1805 161636,207837 161637,535 161637,1010 161638,83 161639,30 161640,83 161641,1453 161642,1309 161643,130 161643,1452 161644,2411 161645,483 161646,7 161646,3846 161647,264 161648,1432 161649,44 161650,932 161651,953 161652,104 161653,704 161654,178 161655,72 161656,10 161657,30 161659,1 161659,2443 161659,6955 161660,647 161661,433 161662,2784 161663,23783 161665,6695 161666,83 161667,634 161668,138686 161669,175 161670,184 161671,72 161672,298 161673,4637 161674,30 161675,10 161676,30 161677,907 161678,2744 161679,6726 161680,77 161681,55849 161682,55849 161683,536 161684,192 161684,309 161684,310 161685,852 161686,30 161687,467 161688,406 161689,2424 161690,49057 161691,55849 161692,2989 161692,2991 161693,2784 161694,81 161695,435 161696,1235 161696,1335 161697,217 161698,30 161699,289 161699,290 161699,94134 161700,1132 161701,781 161702,781 161703,1132 161704,697 161705,557 161706,1132 161707,781 161708,134 161709,843 161710,1282 161711,1181 161712,3 161713,6303 161714,130 161715,358 161716,217 161717,192 161718,1257 161719,358 161721,557 161722,862 161724,107 161724,745 161724,2678 161725,693 161726,30 161727,1474 161728,527 161729,278 161730,296 161731,1 161732,240 161733,79 161734,726 161734,3967 161735,704 161736,2775 161737,2373 161738,267 161739,2116 161740,2944 161741,30 161742,278 161743,2646 161744,885 161744,13704 161745,49057 161746,726 161747,726 161748,30 161749,1419 161750,2828 161751,49057 161752,1688 161753,217 161753,1417 161754,760 161755,4594 161756,516 161757,1266 161757,5714 161758,118 161758,4597 161759,68069 161760,142870 161761,693 161762,7614 161763,577 161764,298 161765,485 161766,760 161767,298 161768,485 161770,1551 161771,760 161772,760 161773,22924 161774,563 161775,900 161776,862 161777,269 161778,118 161778,4597 161779,202 161780,581 161782,1001 161783,30 161784,1509 161785,760 161786,611 161787,760 161788,161789 161791,30 161792,2590 161793,58 161794,850 161795,151 161796,1634 161797,4545 161797,139010 161798,247 161800,207 161801,1634 161802,872 161803,30 161804,602 161805,2626 161806,30 161807,1429 161808,255 161809,1247 161809,1363 161809,164572 161811,366 161812,668 161813,366 161814,366 161815,366 161816,366 161817,366 161818,366 161819,366 161820,366 161821,355 161822,994 161823,58 161824,994 161825,46 161826,30 161827,30 161828,920 161829,233 161830,1858 161831,1860 161832,130 161832,36819 161833,58 161834,46 161835,994 161836,58 161837,994 161838,46 161839,161840 161839,178035 161841,784 161842,1181 161843,467 161843,868 161843,162599 161844,874 161845,781 161846,1132 161847,640 161848,861 161849,1143 161850,994 161851,3182 161852,171 161854,298 161855,485 161856,202 161856,493 161857,13136 161858,1282 161860,726 161861,19443 161862,187 161863,873 161864,422 161865,366 161866,500 161867,422 161868,56 161869,146 161870,647 161871,344 161872,760 161872,1631 161873,1388 161875,298 161876,485 161877,156379 161878,859 161879,2671 161880,809 161881,779 161882,4260 161882,143287 161883,515 161884,22 161885,422 161886,422 161887,433 161888,422 161889,422 161890,422 161891,422 161893,390 161894,422 161895,422 161896,422 161897,422 161898,422 161899,1238 161900,30 161901,726 161902,2812 161903,138686 161904,175 161905,298 161907,358 161908,447 161909,2775 161910,5708 161911,1298 161912,146 161913,1639 161915,415 161915,1849 161915,2083 161916,81070 161917,422 161918,422 161919,72 161919,104 161919,147 161919,592 161919,1010 161919,1289 161920,1452 161921,1132 161922,781 161923,22 161924,217 161925,49057 161926,577 161927,83 161928,1955 161929,1381 161930,1001 161931,1117 161933,392 161934,2775 161935,447 161936,22 161937,393 161939,1363 161940,240 161940,8180 161941,83 161941,217 161941,261 161941,379 161941,536 161941,694 161941,1072 161941,1467 161941,2421 161941,2784 161941,13546 161942,868 161943,1749 161944,22 161946,17346 161947,1572 161947,4771 161948,1313 161949,1326 161950,49057 161951,227 161952,49057 161953,1773 161954,1756 161955,585 161955,718 161956,161957 161959,251 161960,406 161960,1515 161962,602 161964,1001 161965,1707 161966,602 161967,49057 161968,215 161969,602 161970,22 161971,760 161972,49057 161974,138686 161975,175 161976,30 161978,298 161979,298 161980,485 161981,602 161982,298 161983,485 161984,3582 161985,1844 161986,211 161986,366 161986,640 161987,21442 161988,161989 161990,222 161991,1449 161991,1927 161992,1881 161993,1363 161994,536 161995,72 161996,602 161997,355 161998,349 161998,392 161998,697 161999,718 162000,340 162002,994 162003,602 162004,35750 162004,35751 162005,58 162006,46 162007,994 162008,192 162008,406 162008,620 162008,818 162008,1370 162008,2371 162008,103698 162008,118336 162008,127158 162009,30 162009,682 162009,772 162009,72439 162010,192 162011,336 162012,726 162013,697 162014,22 162015,130 162017,634 162019,1707 162020,4611 162021,1167 162022,2590 162023,22 162024,15 162025,1 162026,217 162026,1417 162027,749 162028,1252 162028,1253 162029,162030 162031,2048 162032,154408 162033,44 162034,1284 162035,592 162036,162037 162038,843 162039,22 162040,1151 162041,417 162042,19010 162043,309 162043,310 162044,162045 162046,1381 162047,58 162047,71 162047,1449 162047,1612 162047,2590 162047,5718 162048,30 162050,1163 162051,994 162052,34 162052,35 162052,217 162053,30 162054,2367 162055,1985 162055,8270 162055,32475 162055,67343 162056,525 162057,30 162058,79 162059,162060 162061,4453 162062,707 162063,1212 162064,1052 162065,49057 162066,628 162067,83 162068,760 162069,1033 162070,2168 162071,142870 162072,162073 162074,483 162075,1893 162076,932 162077,1452 162078,1659 162079,861 162080,65 162081,34 162081,35 162082,1499 162083,252 162084,1220 162084,1222 162085,516 162086,467 162087,21442 162088,2266 162089,147 162090,162091 162092,615 162093,30 162094,8719 162095,159365 162096,138 162097,865 162098,557 162099,222 162100,3 162101,137 162102,118 162102,4597 162103,30 162104,88820 162105,113156 162106,346 162107,137 162108,3623 162109,1132 162110,781 162111,760 162112,2146 162113,162114 162115,30 162116,215 162117,996 162118,30 162119,30 162120,875 162121,240 162121,301 162121,631 162121,775 162121,1785 162122,49057 162123,3623 162124,467 162125,3623 162126,178 162126,1033 162127,323 162128,18831 162129,3623 162130,8270 162131,323 162132,200 162132,1212 162133,4611 162134,760 162135,162136 162137,1276 162138,162139 162141,4691 162142,809 162143,255 162144,3 162146,162147 162148,171 162149,485 162150,298 162151,1298 162152,79 162153,72 162154,134 162155,525 162156,1309 162157,1285 162158,151 162159,298 162160,485 162161,631 162162,294 162163,557 162164,2590 162165,2590 162166,557 162168,147 162168,158 162170,7316 162172,932 162173,3148 162174,217 162174,1417 162175,1240 162176,222 162177,1566 162178,8463 162179,788 162179,852 162180,663 162181,489 162182,1265 162182,1266 162183,1085 162184,885 162184,13704 162185,298 162186,485 162187,30 162188,1882 162189,298 162190,485 162191,332 162192,2367 162193,485 162194,298 162195,663 162196,22 162197,1212 162198,577 162199,138686 162200,420 162201,175 162202,30 162203,50 162204,298 162205,875 162206,657 162207,477 162208,346 162209,516 162210,1474 162211,2373 162212,358 162213,30 162214,30 162215,267 162216,81 162217,388 162218,86 162219,86 162220,86 162221,22580 162222,280 162222,17245 162223,22580 162224,151 162225,900 162226,30 162227,3623 162228,30 162229,3623 162230,30 162231,2590 162232,225 162233,162234 162235,1085 162236,622 162237,30 162239,162240 162241,8884 162242,589 162242,1001 162243,1085 162244,5343 162245,30 162246,3623 162247,30 162248,3623 162249,2073 162250,233 162251,355 162253,366 162254,366 162255,366 162256,1238 162257,298 162258,485 162259,366 162260,366 162261,366 162262,187 162263,118 162263,4597 162264,8992 162265,2116 162266,275 162267,22 162268,5366 162269,585 162270,1551 162272,79 162273,49057 162274,30 162275,718 162276,1247 162277,192 162277,1089 162278,8270 162279,8991 162280,30 162281,200 162282,264 162283,30 162284,30 162285,30 162286,30 162287,24505 162288,30 162289,30 162290,83 162291,1707 162292,3209 162293,2266 162294,118 162294,333 162294,33424 162295,1893 162296,30 162297,3623 162298,3623 162299,162300 162299,197504 162301,577 162302,872 162303,3079 162304,162305 162306,72 162307,162308 162309,72 162311,3724 162312,30 162313,298 162314,483 162315,932 162316,195 162317,1773 162318,994 162319,162320 162321,1773 162322,1240 162323,509 162324,30 162325,1359 162326,2590 162327,485 162328,298 162329,146 162329,92476 162330,346 162331,2224 162332,240 162333,30 162334,1479 162335,22 162336,390 162338,760 162339,346 162340,298 162341,30 162342,760 162343,72 162344,358 162345,4611 162346,207 162347,3623 162348,872 162349,1429 162350,749 162351,30 162352,30 162353,298 162354,485 162355,668 162356,30 162357,346 162358,760 162359,72 162360,22580 162361,1773 162362,65 162363,2775 162364,447 162365,447 162366,2775 162367,30 162368,72 162369,30 162370,162371 162372,640 162373,1143 162374,2146 162375,178 162376,162377 162378,346 162379,355 162380,107 162381,2416 162381,2417 162382,292 162383,338 162384,298 162385,1133 162386,3538 162387,366 162388,366 162389,366 162390,366 162391,366 162392,366 162393,298 162394,485 162395,346 162396,1572 162397,872 162398,269 162399,167 162400,304 162400,2334 162401,3297 162402,41 162403,22 162404,22 162405,586 162406,1871 162407,1983 162408,483 162409,760 162410,918 162411,918 162412,72 162413,455 162414,623 162415,30 162416,346 162417,994 162418,72 162419,72 162420,346 162421,932 162422,868 162423,1983 162424,2506 162425,30 162426,872 162427,872 162428,1608 162429,872 162430,8463 162431,1983 162432,10 162432,113156 162433,2797 162434,332 162435,158 162435,596 162435,1368 162437,1769 162438,240 162439,557 162440,557 162441,1983 162442,142405 162443,1983 162444,30 162445,55849 162446,255 162447,644 162448,222 162448,588 162448,590 162448,1419 162449,485 162450,298 162451,1289 162452,171 162454,485 162455,298 162456,372 162456,1085 162457,142473 162458,162459 162460,1659 162461,749 162462,137 162463,145751 162464,175 162465,30 162466,1203 162467,795 162468,273 162469,83 162470,83 162471,360 162472,292 162473,294 162474,296 162475,298 162476,422 162477,56 162478,1149 162479,1949 162480,233 162481,1118 162482,355 162483,152855 162484,1252 162484,1253 162485,41 162486,366 162487,366 162488,366 162489,1238 162490,298 162491,485 162492,1385 162493,58 162494,994 162495,58 162496,46 162497,455 162498,1452 162499,149 162499,1639 162500,273 162501,996 162502,602 162503,332 162504,779 162505,358 162506,330 162507,278 162508,360 162509,1639 162510,424 162511,1240 162512,312 162513,477 162514,34 162514,35 162516,422 162517,422 162518,422 162519,422 162520,422 162521,390 162522,422 162523,422 162524,422 162525,422 162526,422 162527,422 162528,422 162529,422 162530,422 162533,1467 162534,671 162535,784 162536,148412 162537,192 162538,346 162538,671 162540,516 162541,1220 162541,1222 162542,252 162543,71 162543,1782 162543,256380 162544,55849 162545,718 162546,760 162547,309 162547,310 162547,1147 162548,3 162550,55849 162551,162552 162554,422 162555,56 162556,794 162557,483 162558,323 162558,1052 162558,1102 162559,718 162560,6627 162561,483 162564,83 162568,44725 162570,298 162571,485 162572,1179 162572,28107 162573,200 162573,1962 162574,68 162574,685 162574,849 162574,1085 162574,1844 162574,26450 162575,3623 162576,875 162579,358 162580,155469 162584,3623 162585,155469 162586,1453 162587,5405 162588,1146 162589,3623 162590,875 162591,364 162592,390 162594,1252 162594,1253 162595,130 162596,21442 162597,49057 162598,424 162599,32 162599,158 162599,259 162599,272 162599,278 162599,287 162599,314 162599,433 162599,466 162599,467 162599,495 162599,658 162599,676 162599,868 162599,911 162599,973 162599,1011 162599,1021 162599,1130 162599,1345 162599,1368 162599,1370 162599,1373 162599,1916 162599,4251 162599,5183 162599,6059 162599,6685 162599,6990 162599,8274 162599,14304 162599,16286 162599,16357 162599,16522 162599,18203 162599,18244 162599,18248 162599,18275 162599,18310 162599,18333 162599,18397 162599,18398 162599,19854 162599,20295 162599,21540 162599,22391 162599,25395 162599,26242 162599,31280 162599,32929 162599,32978 162599,35204 162599,36920 162599,38300 162599,38733 162599,43826 162599,44157 162599,46321 162599,48404 162599,50420 162599,51794 162599,55924 162599,56334 162599,64069 162599,64722 162599,68155 162599,70870 162599,76722 162599,97423 162599,98802 162599,103238 162599,108071 162599,110510 162599,116982 162599,117115 162599,120449 162599,123074 162599,124116 162599,124942 162599,126665 162599,131808 162599,136467 162599,136501 162599,137526 162599,137663 162599,143345 162599,147489 162599,150350 162599,156264 162599,156379 162599,156931 162599,158627 162599,161289 162599,161510 162599,161843 162599,162599 162599,163934 162599,165667 162599,171259 162599,172654 162599,173761 162599,175409 162599,176082 162599,176452 162599,176609 162599,177307 162599,177315 162599,177582 162599,177818 162599,177819 162599,177960 162599,178797 162599,180970 162599,182515 162599,183815 162599,183962 162599,186105 162599,188251 162599,188406 162599,188529 162599,188830 162599,189179 162599,189204 162599,189228 162599,189786 162599,191878 162599,191879 162599,191880 162599,191881 162599,191986 162599,192662 162599,192986 162599,193418 162599,194320 162599,194433 162599,194441 162599,195535 162599,195690 162599,196167 162599,197858 162599,204581 162599,207438 162599,211911 162599,211915 162599,212099 162599,214634 162599,214736 162599,214895 162599,215343 162599,216103 162599,216713 162599,219849 162599,220396 162599,220407 162599,220521 162599,222524 162599,223741 162599,224020 162599,229068 162599,229195 162599,229839 162599,229856 162599,229946 162599,230351 162599,230585 162599,231190 162599,231763 162599,233609 162599,233618 162599,233630 162599,234064 162599,234081 162599,234736 162599,234779 162599,234790 162599,234838 162599,234866 162599,235875 162599,235951 162599,235958 162599,236062 162599,236396 162599,236922 162599,236949 162599,236950 162599,237357 162599,238098 162599,238353 162599,241535 162599,244207 162599,244705 162599,245303 162599,245595 162599,247041 162599,248574 162599,248839 162599,248856 162599,249679 162599,249767 162599,250993 162599,252506 162599,252554 162599,255210 162599,255239 162599,255243 162599,255649 162599,258519 162599,260344 162599,260558 162599,260806 162599,260811 162599,262412 162599,263287 162599,263433 162599,264383 162599,264386 162599,264392 162601,4039 162602,1400 162603,718 162605,577 162605,138686 162606,283 162607,875 162608,233 162608,1616 162608,2334 162608,19010 162609,356 162609,843 162610,309 162610,310 162612,3949 162613,1175 162614,636 162615,1323 162616,1326 162617,102 162618,408 162619,875 162621,622 162622,358 162623,1309 162624,3328 162625,5405 162627,3129 162628,3135 162629,1955 162630,1769 162631,1 162631,209 162632,344 162632,1512 162632,5992 162634,233 162635,1769 162636,760 162637,34 162637,35 162637,2646 162638,302 162640,602 162641,1127 162641,1893 162641,49057 162642,30 162643,142473 162644,422 162645,760 162646,875 162647,298 162648,485 162649,145240 162650,358 162651,113156 162652,298 162653,485 162654,240 162654,818 162655,1983 162656,1133 162657,147 162658,151 162659,609 162659,2775 162662,2605 162663,1635 162664,5440 162665,1509 162667,117 162667,250 162667,1684 162667,2712 162667,3089 162667,3524 162667,4691 162668,145240 162669,2334 162670,718 162671,515 162672,79 162673,1068 162674,30 162675,2775 162677,2775 162678,2048 162679,2775 162681,932 162682,156379 162683,30 162684,1782 162685,2944 162685,18831 162686,1 162687,30 162689,30 162690,302 162690,893 162691,30 162694,392 162697,893 162698,113156 162699,422 162700,155469 162701,772 162705,349 162706,3623 162707,885 162707,13704 162708,1326 162709,83 162710,3161 162711,30 162712,113156 162713,346 162714,252 162714,1220 162714,1222 162715,298 162716,485 162717,285 162718,142430 162719,392 162720,2775 162721,447 162722,760 162723,467 162724,349 162725,138686 162726,175 162727,56 162728,422 162729,920 162730,298 162731,72 162732,439 162732,103860 162733,1 162734,145240 162735,760 162736,72 162737,422 162738,56 162739,663 162739,877 162739,1117 162739,1284 162739,124668 162740,30 162741,107 162742,2105 162743,2105 162744,1179 162745,30 162746,1 162747,30 162748,72 162749,4672 162750,557 162751,2775 162752,447 162753,620 162754,2105 162755,222 162756,875 162757,557 162758,147 162759,3 162760,875 162761,55849 162762,2210 162762,4237 162763,302 162764,302 162765,477 162766,875 162767,657 162768,1474 162769,358 162770,358 162771,5375 162773,72 162775,875 162777,640 162778,406 162779,640 162780,862 162781,640 162782,146 162783,344 162783,1512 162783,1888 162783,5992 162784,1544 162784,2083 162785,56 162786,422 162787,843 162788,875 162789,1590 162790,264 162790,1551 162791,4611 162792,83 162792,87 162792,818 162792,985 162792,1132 162792,1313 162793,72 162794,500 162795,175 162796,346 162797,19 162797,2266 162798,2116 162799,818 162800,72 162801,1359 162802,8308 162803,358 162804,255 162805,30 162806,247 162807,6303 162808,264 162809,422 162810,56 162811,175 162812,323 162812,1052 162812,1102 162813,392 162813,862 162813,949 162813,1240 162813,1465 162813,1564 162813,2274 162813,4637 162813,8180 162814,760 162815,760 162816,760 162817,875 162818,422 162819,422 162820,162821 162820,204684 162822,162823 162824,390 162824,467 162824,4220 162825,875 162826,178 162828,818 162829,2590 162830,577 162831,366 162832,366 162833,366 162834,366 162835,366 162836,366 162838,207 162840,493 162840,3148 162841,79 162842,346 162843,872 162844,240 162845,704 162846,872 162847,1429 162848,13136 162849,30 162850,485 162851,298 162852,668 162853,1893 162854,779 162855,358 162855,1052 162856,1381 162857,760 162858,269 162859,233 162860,1363 162862,145240 162863,422 162864,56 162865,403 162865,693 162866,2105 162867,127158 162868,818 162869,795 162870,217 162871,360 162872,273 162872,1893 162873,48 162874,1332 162875,44725 162876,1224 162877,344 162877,5547 162878,1118 162879,1140 162880,217 162883,875 162884,81 162885,298 162886,485 162887,302 162888,3135 162889,392 162891,2744 162892,1353 162895,147 162896,422 162897,422 162898,422 162899,422 162900,422 162901,1058 162902,1962 162904,422 162905,422 162906,422 162907,920 162908,422 162909,422 162910,422 162911,422 162912,3367 162913,422 162914,422 162915,557 162916,1368 162917,1143 162918,868 162919,1466 162920,217 162921,489 162922,1449 162923,138686 162924,175 162925,794 162926,298 162927,2931 162928,83 162929,957 162929,1247 162929,1815 162929,164572 162931,1655 162932,994 162932,2168 162932,2744 162932,22293 162933,1436 162934,206 162935,676 162936,3135 162937,4611 162938,145502 162938,145751 162939,1326 162940,336 162941,992 162942,457 162943,22 162944,135 162944,682 162944,72439 162945,9457 162946,452 162947,65 162947,71 162947,272 162947,611 162948,1240 162949,2671 162951,349 162952,457 162955,358 162956,30 162957,920 162958,285 162958,1149 162959,720 162960,801 162961,81070 162962,146 162963,647 162964,344 162965,1033 162966,87 162966,323 162966,1143 162966,2697 162967,424 162968,422 162969,56 162970,994 162971,355 162973,422 162974,56 162976,636 162977,1837 162978,752 162978,1274 162979,805 162980,79 162981,254 162982,1274 162983,83 162986,56 162987,422 162988,298 162989,485 162991,272 162993,254 162994,136 162994,137 162995,142473 162996,72764 162997,269 162998,406 162999,149 163001,18831 163002,83 163003,192 163006,1983 163008,779 163010,124668 163012,459 163014,557 163014,631 163016,1531 163017,77 163017,557 163018,585 163018,1776 163019,1181 163020,298 163021,485 163022,65 163022,217 163023,3260 163024,1836 163025,130 163026,571 163027,875 163028,406 163029,1860 163030,1858 163031,289 163031,290 163031,94134 163032,2073 163033,497 163034,918 163035,2867 163035,2868 163036,202 163037,1388 163038,34 163038,536 163038,1571 163038,2944 163039,147 163040,1167 163041,32 163042,805 163043,1 163043,3769 163044,861 163046,2590 163047,302 163048,2048 163049,577 163050,1860 163051,1858 163054,920 163055,184 163056,875 163057,1284 163057,148742 163058,30 163059,861 163060,99 163061,647 163062,344 163063,406 163064,932 163065,146 163066,1255 163066,1775 163066,50943 163066,171294 163067,389 163069,3138 163070,44 163072,893 163073,1220 163073,1222 163074,516 163075,252 163076,138686 163077,175 163078,298 163080,130 163080,743 163080,36819 163081,83 163081,119 163081,222 163081,278 163081,285 163081,347 163081,364 163081,366 163081,372 163081,389 163081,417 163081,455 163081,525 163081,626 163081,795 163081,805 163081,907 163081,949 163081,972 163081,1012 163081,1019 163081,1085 163081,1274 163081,1309 163081,1363 163081,1465 163081,1467 163081,1718 163081,1756 163081,1801 163081,1881 163081,2266 163081,2286 163081,2434 163081,2553 163081,2590 163081,2646 163081,2779 163081,3507 163081,4172 163081,13575 163081,141912 163082,631 163083,72 163084,1392 163085,1072 163086,704 163087,4611 163088,1544 163089,388 163090,163091 163092,8598 163093,83 163094,704 163095,72 163096,83 163097,1220 163097,1222 163098,252 163099,516 163100,2371 163101,4611 163102,1544 163104,535 163106,56 163107,422 163108,3804 163109,483 163110,366 163111,366 163112,366 163113,366 163114,422 163114,1623 163115,2411 163116,294 163118,273 163119,779 163120,1149 163120,1635 163121,779 163122,704 163123,372 163124,83 163125,34 163125,35 163125,217 163125,389 163125,455 163125,536 163125,1019 163126,107 163128,217 163129,68069 163130,852 163131,509 163132,585 163133,1968 163134,422 163135,56 163136,7 163136,2931 163137,7416 163138,310 163138,3039 163139,1572 163140,146 163140,92476 163141,647 163142,344 163143,1132 163144,1608 163145,83 163146,156379 163147,640 163148,1085 163149,3069 163150,211 163151,312 163152,83 163153,147 163155,302 163156,333 163157,1512 163157,5992 163158,779 163160,222 163161,536 163162,83 163163,217 163164,30 163165,2697 163166,206 163167,422 163168,467 163169,99 163170,861 163171,9018 163172,1370 163172,1877 163173,30 163174,920 163175,30 163176,267 163177,142870 163178,2373 163179,5976 163180,760 163181,772 163182,435 163183,1939 163184,72 163185,760 163186,843 163187,1509 163188,30 163189,1274 163190,240 163191,447 163192,2775 163193,30 163194,631 163195,10 163196,72 163197,113156 163198,2590 163199,30 163200,178 163200,211 163201,292 163202,760 163203,900 163204,30 163205,406 163206,138686 163207,175 163208,298 163209,143287 163210,843 163211,155481 163212,885 163212,13704 163213,2006 163214,900 163215,366 163216,366 163217,875 163218,366 163219,107 163219,3538 163220,278 163221,1773 163222,1773 163223,875 163224,779 163224,1181 163225,424 163226,72 163227,72 163228,72 163229,81 163230,30 163231,2048 163232,72 163233,1010 163234,72 163235,862 163236,1 163237,104 163237,134 163237,135 163238,516 163239,217 163239,1417 163240,1085 163240,2590 163241,147 163242,289 163242,290 163242,94134 163243,298 163244,772 163245,2146 163246,41 163246,631 163246,784 163246,1119 163246,1462 163246,2995 163246,8537 163247,163248 163249,138686 163250,175 163251,163252 163253,392 163254,1462 163254,8537 163256,760 163257,298 163258,485 163259,163260 163261,155481 163262,233 163263,4223 163264,366 163265,83 163266,366 163267,355 163268,344 163269,192 163269,202 163269,206 163269,217 163269,222 163269,310 163269,333 163269,500 163269,588 163269,590 163269,760 163269,1181 163269,1210 163269,1531 163269,1724 163269,1844 163269,1968 163269,2073 163269,2626 163269,3039 163269,3804 163269,5310 163269,5358 163269,8270 163269,14352 163269,25222 163269,41767 163271,83 163271,104 163271,147 163271,252 163271,538 163271,1001 163271,1644 163271,1707 163271,5213 163271,21442 163275,379 163276,417 163276,677 163276,852 163276,1085 163276,1130 163276,2572 163276,2747 163276,3623 163276,3944 163276,4220 163276,19805 163276,21589 163276,33728 163276,34419 163276,48087 163276,59273 163276,73745 163276,74482 163276,75912 163276,154004 163276,159234 163276,160400 163276,184926 163276,186065 163276,191888 163276,192238 163277,1147 163278,1238 163280,1572 163281,1238 163282,697 163283,156379 163283,162599 163284,1452 163285,1118 163286,433 163287,794 163288,760 163289,6556 163290,126 163290,264 163290,1147 163291,1571 163292,301 163293,980 163293,1326 163294,422 163295,56 163296,422 163297,422 163298,422 163299,690 163300,422 163301,422 163302,2105 163304,1113 163304,7194 163305,422 163306,422 163307,422 163308,142879 163309,422 163310,422 163311,302 163311,893 163312,422 163313,422 163314,931 163315,1769 163317,358 163318,59021 163319,14366 163320,868 163322,872 163323,422 163324,422 163325,65 163326,818 163326,127158 163327,433 163329,872 163330,269 163331,200 163332,1014 163333,4611 163334,1544 163335,505 163336,163337 163339,875 163340,138686 163341,175 163342,142430 163342,142473 163342,142879 163343,298 163344,417 163345,849 163345,1345 163345,1707 163345,13538 163346,1132 163347,2989 163347,2991 163348,671 163349,406 163350,217 163351,372 163352,1796 163353,269 163354,1252 163354,1253 163355,788 163356,6424 163357,1167 163358,83 163359,1012 163359,1241 163360,3258 163360,6424 163360,13136 163361,4252 163362,127158 163363,1616 163364,389 163365,649 163366,818 163366,3695 163367,1309 163368,3328 163369,3129 163370,41 163370,1616 163371,3135 163372,1955 163373,336 163373,1623 163374,406 163374,2334 163375,1462 163375,8537 163376,1844 163376,5213 163378,315 163378,538 163378,671 163378,1294 163378,103698 163379,875 163380,968 163381,1140 163382,3 163382,907 163383,209 163384,1388 163385,809 163385,6837 163386,875 163387,985 163389,72 163390,1332 163391,510 163392,1467 163393,312 163395,68 163395,254 163395,1010 163396,2775 163397,447 163398,505 163399,186 163400,278 163401,10 163402,875 163403,1458 163404,34 163404,35 163405,623 163405,1860 163406,3507 163407,557 163408,893 163409,6323 163410,875 163411,1252 163411,1253 163412,312 163413,113156 163414,779 163414,1623 163415,63 163415,1512 163415,5992 163416,269 163417,6303 163418,668 163420,827 163420,1147 163421,1983 163423,358 163424,1634 163425,22 163425,877 163426,192 163427,358 163428,801 163431,634 163432,1983 163433,2646 163434,2867 163434,2868 163435,875 163436,163 163437,1252 163437,1253 163438,3507 163439,422 163440,557 163441,1608 163442,1132 163443,1001 163444,536 163445,19010 163446,298 163447,485 163448,313 163448,1345 163449,509 163450,388 163450,744 163450,762 163450,852 163450,877 163450,1113 163450,3756 163450,48505 163451,801 163451,852 163452,1608 163453,1132 163454,968 163454,1231 163454,1564 163454,1832 163455,269 163456,1983 163457,1983 163458,809 163459,843 163461,298 163462,485 163463,298 163464,485 163465,158 163465,217 163465,269 163465,493 163465,622 163465,779 163465,920 163465,1033 163467,298 163468,485 163469,298 163470,485 163471,227 163471,298 163471,310 163472,1893 163473,422 163474,2590 163475,1252 163475,1253 163476,1118 163477,417 163478,422 163479,56 163481,72 163482,16019 163483,422 163484,2048 163485,1001 163486,644 163487,473 163487,4220 163487,81070 163488,1319 163489,302 163490,644 163491,483 163492,138686 163493,175 163494,3623 163495,298 163496,298 163497,485 163498,452 163499,184 163500,1247 163501,509 163502,875 163503,1167 163504,135 163504,596 163504,784 163504,1052 163504,1368 163505,1359 163506,55849 163508,30 163509,1252 163509,1253 163510,932 163511,875 163512,55849 163513,3623 163514,704 163515,3507 163516,1085 163517,1001 163518,4545 163518,139010 163519,149 163520,752 163521,1474 163522,592 163523,10 163524,1474 163525,875 163526,83 163527,171 163527,330 163527,957 163527,1815 163528,516 163529,252 163530,1220 163530,1222 163531,779 163531,4193 163532,217 163533,875 163534,422 163535,1132 163536,781 163537,862 163538,1462 163538,8537 163539,312 163540,1511 163540,3069 163541,1467 163542,217 163543,252 163544,872 163545,163546 163547,749 163548,392 163549,718 163550,861 163551,247 163551,2867 163551,2868 163552,147 163553,536 163553,2944 163554,44 163556,73570 163557,875 163558,875 163559,875 163560,467 163561,875 163562,875 163563,875 163564,875 163565,875 163566,875 163567,1181 163568,885 163568,13704 163569,431 163570,4823 163571,99 163572,155481 163573,1927 163574,1467 163575,358 163576,2373 163577,259 163578,3804 163579,5906 163580,626 163581,278 163582,557 163583,137 163584,1326 163585,862 163586,1572 163587,1252 163587,1253 163588,330 163588,957 163588,1247 163588,14650 163588,109503 163588,164572 163589,577 163590,1511 163590,3069 163591,2434 163592,3623 163593,358 163594,6387 163595,6387 163596,72 163597,392 163598,1019 163599,30 163600,3623 163601,563 163602,72 163603,301 163603,968 163603,1837 163604,875 163605,875 163606,1298 163607,491 163608,557 163609,868 163610,240 163611,306 163611,307 163612,298 163613,485 163614,1102 163615,485 163616,298 163618,13538 163619,920 163620,358 163621,1983 163622,30 163623,130 163624,72 163625,557 163626,77 163627,247 163628,1085 163628,75912 163629,442 163630,784 163631,563 163633,83 163634,298 163635,485 163636,8854 163637,485 163638,298 163639,138686 163640,175 163641,298 163642,1149 163643,292 163644,2590 163646,1058 163647,2775 163648,563 163649,138686 163650,175 163651,68069 163652,298 163653,5906 163654,8270 163655,628 163655,3295 163656,2923 163657,4453 163658,1474 163659,1474 163660,358 163661,113156 163662,358 163663,875 163664,875 163665,640 163666,99 163667,862 163667,1001 163667,1085 163667,2590 163667,8884 163668,1238 163669,99 163670,240 163671,366 163672,366 163673,389 163674,366 163675,366 163676,1238 163677,2590 163678,1467 163679,455 163680,2424 163681,1871 163682,2421 163683,83 163684,13980 163685,289 163685,290 163685,94134 163686,30 163687,13919 163688,1 163689,832 163690,83 163691,255 163692,304 163693,298 163694,485 163695,298 163696,485 163697,581 163698,1544 163699,4611 163700,433 163701,1881 163702,649 163704,3999 163705,5469 163706,355 163707,233 163708,163709 163710,298 163711,485 163712,1058 163713,1551 163713,3041 163714,142405 163715,516 163716,252 163717,1220 163717,1222 163719,167 163719,2083 163720,298 163721,485 163722,30 163723,392 163724,850 163725,1707 163726,809 163727,109503 163728,467 163728,5440 163728,242246 163730,30331 163731,206 163733,328 163734,30 163735,1117 163736,358 163737,2105 163738,1274 163739,592 163740,1707 163743,2989 163743,2991 163745,393 163746,557 163746,954 163746,1939 163747,2779 163748,360 163748,2617 163749,422 163750,1707 163751,422 163752,450 163753,422 163754,422 163755,422 163756,557 163757,422 163758,171 163759,592 163759,1010 163760,647 163761,146 163761,92476 163762,344 163763,422 163764,422 163765,422 163767,907 163768,1001 163770,20535 163771,200 163771,252 163772,13661 163773,269 163774,1181 163775,195 163776,344 163777,647 163778,146 163778,92476 163779,200 163779,28203 163780,852 163780,1085 163781,358 163786,50 163786,631 163787,485 163788,298 163789,500 163790,247 163791,138686 163792,4545 163792,56150 163792,139010 163793,957 163793,1247 163793,1815 163793,109503 163793,164572 163794,175 163795,875 163796,312 163797,298 163798,586 163799,79 163800,422 163801,1454 163803,3207 163805,518 163805,1955 163806,2750 163807,875 163808,1955 163809,745 163810,1844 163812,30 163813,2116 163814,3623 163815,1252 163815,1253 163816,81070 163817,299 163818,1385 163819,602 163820,589 163821,138 163821,1212 163821,1882 163822,640 163823,536 163824,875 163825,1807 163826,1983 163827,447 163828,2775 163830,1955 163831,146 163831,92476 163832,344 163833,647 163834,1983 163835,772 163836,647 163837,344 163838,875 163839,3623 163841,146 163841,92476 163842,142426 163843,1130 163845,83 163846,81 163847,717 163848,3367 163849,1893 163850,7360 163851,269 163852,1118 163853,703 163854,422 163855,422 163856,589 163857,703 163858,1370 163859,1252 163859,1253 163860,1274 163860,2266 163861,602 163862,920 163863,745 163863,868 163864,138686 163865,30 163866,175 163867,104 163867,557 163867,953 163867,954 163867,1368 163868,2353 163870,666 163871,145240 163872,393 163873,81 163874,356 163874,2590 163875,113156 163876,875 163877,1019 163878,358 163879,493 163880,536 163880,1019 163882,206 163884,126 163885,599 163886,389 163887,1368 163888,2205 163888,33424 163889,875 163890,1001 163891,134 163891,248 163892,875 163893,577 163894,3 163895,344 163896,647 163897,146 163897,92476 163898,34 163898,290 163898,671 163898,919 163898,1133 163898,1210 163898,1785 163898,2045 163898,2191 163898,2205 163898,2209 163898,3804 163898,33424 163898,94134 163899,2244 163900,298 163901,485 163902,211 163904,1927 163905,3623 163906,328 163907,3623 163908,30 163909,34 163909,35 163910,875 163911,3623 163912,3623 163913,1858 163914,1860 163915,861 163917,372 163919,77 163919,563 163919,581 163920,379 163921,985 163922,302 163923,1551 163923,1893 163924,957 163924,1815 163926,30 163927,1983 163930,861 163932,1370 163932,156379 163933,431 163935,1858 163936,1860 163937,1454 163938,248 163939,155481 163940,195 163941,2048 163942,3804 163943,301 163944,424 163945,439 163946,1381 163947,1345 163948,192 163949,83 163950,142433 163951,151 163952,697 163953,83 163953,126 163953,305 163953,805 163953,941 163953,1058 163953,1096 163953,1479 163953,1837 163953,3218 163953,3769 163953,6487 163954,1332 163957,2590 163958,687 163959,102 163960,483 163961,1285 163962,360 163962,1893 163962,2617 163963,55849 163965,2244 163966,28130 163966,142473 163968,435 163969,54 163969,283 163969,455 163969,3792 163969,15694 163969,30549 163969,165053 163969,172486 163970,292 163971,5440 163972,30 163973,278 163974,13980 163975,54 163976,8822 163977,1298 163978,192 163978,30331 163979,37 163980,6303 163981,772 163982,843 163983,22 163984,406 163985,406 163986,392 163987,647 163988,344 163989,146 163989,92476 163990,920 163991,994 163992,147 163992,184 163994,1257 163995,467 163996,5366 163997,1580 163998,146 163998,92476 163999,647 164000,344 164001,393 164002,697 164002,1769 164003,509 164004,50 164004,192 164004,1181 164004,4193 164005,2744 164006,1243 164008,647 164009,146 164009,92476 164010,344 164011,2296 164012,72 164013,1608 164014,861 164015,83 164016,30 164017,1474 164018,146 164018,92476 164019,344 164020,647 164021,994 164022,217 164022,538 164022,663 164022,779 164022,809 164022,920 164022,1033 164022,1181 164022,1381 164022,1414 164022,1639 164022,1805 164022,2073 164022,2889 164022,3193 164022,5440 164022,141912 164023,301 164023,717 164023,1181 164023,1782 164024,1019 164025,875 164026,192 164027,366 164028,1181 164029,442 164030,65 164031,1160 164032,44 164033,885 164033,13704 164034,435 164035,781 164036,1132 164037,1132 164038,781 164039,72 164040,151 164041,358 164042,875 164043,875 164044,875 164045,72 164046,1274 164047,749 164048,366 164049,30 164050,1 164051,30 164053,164054 164055,137 164056,83 164056,217 164056,278 164056,509 164056,1019 164056,3409 164057,718 164057,2929 164058,30 164059,30 164060,563 164061,330 164062,843 164063,30 164064,592 164065,30 164066,72 164067,875 164069,557 164070,862 164071,72 164072,406 164073,289 164073,290 164073,94134 164074,557 164075,178 164076,83 164077,1381 164078,563 164079,151 164080,323 164080,1052 164080,1102 164081,704 164082,1132 164083,781 164084,72 164086,1235 164086,1335 164087,1973 164088,980 164089,72 164090,994 164091,30 164092,1319 164093,1210 164094,949 164095,50 164095,58 164095,86 164095,104 164095,106 164095,135 164095,136 164095,137 164095,167 164095,217 164095,227 164095,247 164095,252 164095,254 164095,269 164095,332 164095,364 164095,392 164095,393 164095,420 164095,433 164095,515 164095,516 164095,538 164095,589 164095,596 164095,636 164095,644 164095,720 164095,749 164095,779 164095,795 164095,907 164095,968 164095,1007 164095,1085 164095,1179 164095,1363 164095,1381 164095,1453 164095,1522 164095,1544 164095,1715 164095,1818 164095,1837 164095,2083 164095,2105 164095,2191 164095,2620 164095,2931 164095,3003 164095,3367 164095,4355 164095,4545 164095,5405 164095,5718 164095,6119 164095,55849 164095,139010 164096,1556 164098,7416 164099,358 164100,147 164100,156379 164101,2371 164103,4260 164103,142405 164103,142473 164103,147123 164104,644 164105,640 164107,83 164107,278 164110,302 164111,63049 164111,188749 164112,72 164113,344 164114,285 164115,83 164116,4594 164117,267 164118,2373 164119,68069 164120,302 164120,2105 164121,32 164121,392 164121,509 164121,875 164122,557 164123,1181 164124,861 164125,1113 164126,2590 164127,72 164128,3846 164129,406 164129,620 164130,516 164131,72 164132,1474 164133,1102 164134,422 164135,2574 164136,1181 164137,358 164138,206 164139,209 164140,366 164141,1773 164142,3623 164143,22 164144,875 164145,875 164146,1381 164147,298 164148,485 164149,1419 164150,30 164151,920 164152,875 164153,195 164154,900 164156,298 164157,485 164158,344 164159,647 164160,146 164160,92476 164161,305 164162,30365 164164,30 164165,207 164167,233 164168,2367 164169,72 164170,577 164171,30 164172,328 164173,72 164174,1429 164175,30 164176,872 164177,49057 164178,668 164179,389 164180,44725 164182,862 164183,2244 164184,298 164185,485 164187,79 164187,141912 164188,298 164189,485 164190,323 164192,366 164193,366 164194,366 164195,366 164196,366 164197,255 164198,355 164199,233 164200,113156 164201,2116 164202,647 164203,146 164203,92476 164204,344 164205,146 164205,92476 164206,647 164207,344 164208,330 164209,255 164210,68069 164213,818 164214,1052 164215,46 164215,233 164215,292 164215,332 164215,525 164215,631 164215,760 164215,843 164215,954 164215,972 164215,1467 164215,1531 164215,2286 164215,3507 164215,3695 164215,10318 164216,255 164217,358 164219,4455 164221,3041 164222,868 164223,749 164224,571 164225,252 164225,516 164225,1220 164225,1222 164227,422 164228,422 164229,422 164230,422 164231,422 164232,1612 164233,422 164234,15 164234,1400 164235,217 164235,240 164236,1052 164237,278 164238,784 164239,422 164240,422 164241,422 164242,422 164243,422 164244,422 164245,358 164246,240 164247,422 164248,1608 164249,147 164249,158 164250,310 164250,3039 164252,240 164253,3623 164254,1082 164255,1220 164255,1222 164256,516 164257,252 164258,1181 164260,1858 164261,1860 164263,273 164263,313 164264,417 164264,1635 164265,1238 164267,68 164267,104 164267,298 164267,323 164267,631 164267,714 164267,1085 164267,1659 164267,2205 164267,6068 164267,33424 164268,292 164269,941 164270,3623 164272,931 164273,3623 164274,256 164275,1400 164276,2083 164277,907 164278,1858 164279,1860 164280,43613 164281,358 164282,1417 164284,827 164285,1452 164287,557 164288,211 164290,344 164291,72 164292,102 164293,285 164294,138686 164295,175 164296,298 164297,602 164298,259 164299,1556 164301,240 164302,146 164302,779 164302,92476 164302,141912 164303,358 164305,206 164307,113156 164309,875 164310,83 164311,358 164312,1122 164313,1130 164314,328 164315,1385 164317,2671 164318,1143 164319,843 164320,273 164321,2775 164322,447 164324,171 164325,3135 164326,467 164326,801 164327,217 164328,1220 164328,1222 164329,577 164330,1072 164331,146 164331,92476 164332,647 164333,344 164334,2979 164335,301 164336,136 164336,137 164337,703 164338,1 164339,158 164339,406 164340,647 164341,344 164342,146 164342,92476 164343,195 164345,195 164346,647 164347,344 164348,146 164348,92476 164349,647 164350,344 164351,146 164351,92476 164352,1509 164354,68069 164354,141912 164355,991 164356,195 164357,73570 164358,18831 164359,138686 164360,175 164361,298 164362,698 164362,1782 164363,1172 164364,77 164364,269 164365,1001 164366,162599 164367,439 164367,671 164369,312 164369,525 164371,240 164372,1068 164372,1370 164375,360 164375,406 164375,1014 164377,1773 164379,192 164380,1479 164381,128906 164382,184 164383,58 164384,2590 164385,690 164385,788 164386,261 164387,439 164387,80266 164388,8463 164389,455 164389,1019 164390,358 164391,136 164392,137 164393,2371 164394,302 164395,602 164396,211 164396,1001 164397,392 164397,440 164397,644 164397,1117 164398,18831 164399,11 164399,97 164400,392 164402,861 164404,207 164405,424 164406,283 164407,1085 164408,379 164408,1274 164408,2646 164409,151 164409,273 164409,306 164409,307 164409,338 164409,390 164409,489 164409,589 164409,626 164409,675 164409,762 164409,861 164409,862 164409,973 164409,1127 164409,1285 164409,1381 164409,1644 164409,1881 164409,2590 164409,3258 164409,3585 164409,5326 164409,5469 164410,872 164411,2048 164412,1429 164413,2421 164414,99 164415,227 164416,690 164417,1203 164417,1955 164418,138686 164419,195 164420,175 164421,298 164422,7768 164423,631 164425,536 164426,50 164428,264 164429,146 164429,92476 164430,647 164431,344 164432,760 164433,217 164434,385 164435,2244 164436,1749 164437,298 164438,485 164439,2944 164440,264 164441,1085 164442,1893 164443,1127 164444,920 164445,1147 164446,312 164447,2244 164448,68 164448,985 164448,1837 164449,73570 164450,1462 164450,8537 164451,467 164452,83 164453,668 164454,2989 164454,2991 164455,2590 164456,875 164457,2590 164458,104 164458,225 164458,557 164458,1368 164459,841 164460,195 164461,602 164462,577 164463,467 164464,349 164465,217 164466,273 164467,87 164468,195 164470,972 164470,1010 164471,1143 164472,83 164473,195 164474,247 164475,8719 164476,392 164477,346 164477,18831 164478,1858 164479,1860 164480,142473 164481,195 164482,8719 164483,138 164484,865 164485,557 164486,137 164487,118 164487,4597 164488,88820 164489,358 164490,818 164491,3623 164492,2574 164493,875 164494,2372 164495,809 164496,973 164497,56 164498,422 164499,55849 164500,493 164501,302 164502,134 164503,358 164504,861 164505,164506 164507,885 164507,13704 164508,1 164509,6303 164510,994 164511,389 164512,389 164513,557 164514,406 164515,72 164516,269 164517,55849 164518,489 164519,358 164522,332 164523,147 164524,749 164525,298 164526,485 164527,312 164528,485 164529,298 164530,1323 164531,6387 164532,1860 164533,1858 164534,1860 164535,1858 164536,6387 164537,83 164538,861 164539,485 164540,298 164541,3367 164542,68 164543,72 164544,932 164545,147 164545,2048 164546,164547 164549,269 164550,280 164550,17245 164551,2210 164551,4237 164552,536 164553,225 164554,631 164554,1085 164554,4222 164555,366 164556,483 164557,8884 164558,1085 164559,2353 164560,206 164561,875 164562,818 164563,233 164564,355 164565,1860 164566,1858 164567,83 164568,346 164569,298 164570,485 164571,581 164572,147 164572,158 164572,175 164572,336 164572,957 164572,1247 164572,1815 164572,2244 164572,118336 164572,164572 164574,1 164574,94 164574,184 164574,934 164574,2787 164575,422 164576,30 164577,422 164578,422 164579,422 164580,422 164581,422 164582,422 164583,298 164584,485 164585,72 164586,631 164587,171 164588,158 164589,406 164590,83 164591,72 164592,3872 164593,72 164594,72 164595,818 164596,81070 164597,577 164598,83 164598,217 164598,536 164598,13575 164599,1893 164599,49057 164600,358 164601,138686 164602,175 164603,298 164604,142405 164605,72 164606,408 164607,1326 164608,102 164609,1323 164610,1522 164612,346 164612,586 164613,1608 164614,1132 164615,483 164616,195 164617,195 164618,217 164619,298 164620,485 164621,72 164622,503 164623,164624 164625,668 164627,3161 164628,647 164629,146 164629,92476 164630,344 164631,30 164632,135 164632,2775 164634,328 164636,85 164637,72 164638,103860 164639,1479 164640,298 164641,485 164642,390 164643,10 164644,72 164645,726 164646,30 164647,72 164648,72 164649,72 164650,602 164651,195 164653,72 164654,146 164654,92476 164655,79 164656,160 164658,430 164658,4571 164659,366 164660,366 164661,366 164662,1381 164663,195 164664,151 164666,99 164667,195 164668,312 164669,366 164670,366 164671,366 164672,164673 164674,366 164675,366 164676,366 164677,366 164678,137 164679,233 164680,366 164681,366 164682,4691 164683,2620 164684,355 164685,107 164686,2416 164686,2417 164687,292 164688,338 164689,50 164690,298 164692,1133 164693,3538 164694,30 164697,4611 164699,1849 164700,1509 164701,344 164702,146 164702,92476 164703,647 164704,109503 164705,994 164707,1309 164708,72 164709,1983 164710,1052 164711,1 164712,136 164713,138686 164714,175 164715,298 164716,118 164716,4597 164717,1452 164718,772 164719,1983 164720,30 164721,3260 164722,861 164723,72 164724,30 164725,1452 164726,142405 164727,440 164728,298 164729,485 164730,299 164731,44 164732,30 164733,422 164734,56 164735,111142 164736,164737 164738,3623 164739,48 164740,366 164741,393 164742,2989 164742,2991 164743,726 164744,1212 164745,358 164746,72 164747,366 164748,366 164749,366 164750,366 164751,164752 164753,88820 164754,1238 164755,1769 164756,1983 164757,557 164758,557 164759,557 164760,202 164761,2779 164762,483 164763,7416 164764,1983 164765,875 164766,1181 164767,158 164767,406 164767,438 164767,585 164767,2931 164768,30 164771,30 164772,1983 164773,875 164774,72 164775,142473 164776,72 164777,30 164778,72 164779,875 164780,72 164781,171 164781,957 164781,1815 164782,310 164783,72 164784,72 164785,30 164786,72 164787,602 164788,875 164789,72 164790,30 164791,1289 164792,424 164793,72 164794,56 164795,422 164796,72 164797,72 164798,1467 164799,8308 164800,269 164801,72 164802,875 164804,310 164805,2319 164806,292 164807,294 164808,296 164809,298 164810,83 164811,589 164811,75912 164812,72 164813,233 164814,72 164815,1287 164816,22 164816,272 164816,152855 164816,239153 164817,355 164818,72 164819,19 164820,1707 164821,30 164822,934 164823,209 164823,299 164823,6654 164824,1454 164825,868 164826,14556 164827,714 164827,1238 164828,32 164829,72 164830,726 164831,393 164833,251 164833,6556 164835,1458 164836,301 164836,968 164836,3422 164837,48 164838,422 164839,56 164840,772 164841,872 164842,422 164843,56 164844,225 164845,1368 164847,68069 164848,615 164849,640 164850,640 164851,640 164852,640 164853,10 164854,640 164855,5908 164856,137 164856,269 164856,273 164857,372 164858,422 164859,422 164860,252 164861,1634 164863,1293 164863,115659 164864,920 164865,2775 164866,447 164867,252 164868,422 164869,422 164870,422 164871,422 164872,422 164873,422 164874,422 164875,422 164876,841 164877,682 164877,1353 164877,72439 164878,657 164879,73570 164880,1113 164881,1608 164882,1132 164884,1707 164885,626 164886,309 164886,310 164886,31976 164887,30 164888,54 164890,30 164891,631 164892,671 164893,1224 164894,3193 164895,30 164896,72 164897,7698 164898,30 164899,835 164900,107 164900,1151 164901,294 164903,1983 164904,1282 164905,301 164906,1801 164907,328 164908,240 164909,1983 164910,102560 164911,5375 164912,138686 164913,175 164914,298 164915,1284 164916,140 164916,736 164916,1289 164916,1551 164916,1968 164918,1117 164918,1284 164920,299 164921,58 164922,994 164923,46 164924,30 164925,1888 164926,760 164927,349 164928,10 164928,175 164928,1118 164928,20792 164930,30 164931,136 164931,137 164932,457 164932,852 164933,1983 164934,503 164935,1983 164936,1801 164937,195 164938,142433 164939,1566 164941,1096 164941,2073 164941,6452 164942,3769 164943,44 164944,102 164944,1326 164944,14797 164945,200 164945,1939 164945,2443 164946,79 164946,206 164946,315 164946,435 164946,690 164946,1326 164946,1612 164946,1877 164946,2353 164947,22 164947,86 164948,30 164949,2944 164949,4223 164951,240 164951,877 164952,1849 164953,2867 164953,2868 164954,138686 164955,175 164956,298 164958,298 164959,485 164961,142473 164961,142879 164962,794 164963,994 164967,83 164968,269 164971,850 164972,4571 164973,358 164975,372 164975,442 164976,872 164979,516 164981,1033 164982,4571 164984,3804 164985,14797 164986,2737 164987,518 164988,3193 164989,31122 164990,138686 164991,175 164992,298 164993,1247 164993,164572 164995,3623 164997,1247 164997,164572 164998,615 164999,852 165001,72 165002,3623 165003,99 165004,875 165005,73570 165006,143287 165007,422 165008,3193 165009,19 165010,55849 165011,4571 165013,1579 165013,2646 165014,1608 165016,1118 165018,163 165018,6303 165019,1634 165020,631 165022,1590 165022,1644 165023,392 165023,1240 165024,467 165026,72 165027,422 165028,1385 165030,192 165031,907 165032,408 165033,1323 165034,102 165035,1326 165036,467 165037,111 165038,784 165039,2944 165042,136 165043,1580 165043,103860 165044,557 165045,134 165046,202 165047,3079 165049,563 165050,2989 165050,2991 165051,1858 165052,1860 165055,151 165056,5 165056,94 165056,114 165056,117 165056,1235 165056,2089 165056,2712 165056,3794 165056,13704 165056,154690 165057,1479 165058,165059 165060,138686 165061,175 165062,5405 165063,298 165064,682 165064,1474 165064,72439 165065,1454 165066,592 165067,72 165067,222 165068,393 165069,30 165070,794 165071,1085 165072,2334 165073,1319 165074,631 165075,1860 165076,1454 165077,1955 165078,302 165079,146 165079,92476 165080,344 165081,647 165082,1707 165083,328 165084,30 165086,233 165087,1888 165088,217 165089,195 165090,333 165090,980 165090,4545 165090,15573 165090,139010 165091,217 165092,278 165093,83 165094,640 165095,1381 165095,1452 165096,2590 165097,134 165098,146 165098,92476 165099,344 165100,647 165101,44 165102,30 165103,72 165104,2620 165105,852 165105,1085 165106,72 165107,273 165108,932 165109,4504 165110,247 165112,55849 165113,30 165114,788 165115,1385 165116,1385 165117,920 165118,30 165119,483 165120,72 165121,2590 165122,160 165123,1983 165124,72 165125,4611 165126,4355 165127,2506 165128,138 165128,2674 165128,16153 165129,30 165130,55849 165131,72 165132,30 165133,195 165134,1559 165135,50 165135,79 165136,72 165137,30 165138,4260 165138,142473 165138,165139 165140,3623 165142,779 165143,875 165144,30 165145,3623 165146,72 165147,1509 165148,1509 165149,1257 165150,72 165151,72 165152,72 165153,346 165154,818 165155,875 165156,72 165157,589 165158,240 165159,346 165160,875 165161,56 165162,422 165163,72 165164,32751 165165,346 165166,366 165167,366 165168,1033 165169,72 165170,2979 165171,5343 165172,843 165173,77 165174,72 165175,30 165176,1467 165177,147 165178,671 165179,184 165180,2506 165181,388 165182,2424 165183,72 165184,147 165184,158 165184,206 165185,366 165186,3623 165187,1181 165188,163 165188,2116 165189,1085 165190,1707 165191,355 165192,142426 165193,233 165194,165195 165196,346 165197,623 165198,392 165198,1769 165199,346 165200,1858 165201,1860 165202,1983 165203,1844 165204,1247 165204,164572 165205,673 165205,1130 165206,158 165208,1238 165209,72 165210,72 165212,1452 165213,30 165215,72 165216,596 165217,13980 165219,843 165220,41 165221,3538 165222,146 165222,92476 165223,647 165224,344 165225,145240 165226,138686 165227,175 165228,298 165230,697 165230,141912 165231,1149 165232,313 165232,685 165233,41 165234,422 165235,422 165236,422 165237,422 165238,422 165239,422 165240,422 165241,422 165242,422 165243,422 165244,422 165245,1227 165245,86416 165248,41 165249,79 165252,147 165254,1188 165255,592 165255,1818 165255,4062 165255,4596 165255,13294 165255,14376 165255,14554 165255,22562 165255,87262 165255,103085 165255,188867 165256,717 165257,287 165258,344 165259,358 165260,392 165261,136 165262,694 165263,875 165264,1220 165264,1222 165265,516 165266,252 165267,1849 165268,762 165269,500 165270,1052 165271,1882 165272,2775 165273,1962 165274,54 165275,298 165276,485 165277,138686 165278,175 165279,298 165280,206 165281,1436 165282,1522 165284,1893 165285,893 165286,392 165286,849 165286,3003 165286,6068 165287,298 165288,485 165289,6627 165290,165291 165292,206 165293,631 165294,298 165295,485 165296,809 165297,48 165298,1849 165299,1805 165300,72 165301,433 165302,104 165302,2210 165302,4237 165303,694 165304,298 165305,485 165306,1707 165307,1571 165308,717 165309,298 165310,485 165312,55849 165313,171 165314,485 165315,298 165316,79 165317,349 165318,760 165320,818 165321,2116 165322,298 165323,485 165325,298 165326,485 165327,1425 165329,358 165330,312 165332,165333 165334,1631 165335,875 165336,3623 165337,333 165337,2671 165338,718 165340,158 165340,406 165341,34 165341,35 165342,1118 165343,652 165347,1132 165348,781 165349,843 165350,22 165350,130 165351,2744 165352,152855 165353,65 165353,71 165353,611 165355,1425 165356,406 165356,2626 165357,393 165358,34 165358,35 165359,298 165360,485 165362,760 165363,567 165363,5540 165364,206 165366,31977 165368,1590 165369,707 165372,240 165373,147 165373,356 165373,447 165373,852 165374,141912 165376,673 165377,720 165378,875 165379,875 165381,1085 165382,640 165383,298 165384,485 165385,1305 165386,1188 165387,372 165387,1285 165389,794 165390,850 165391,202 165392,4545 165392,139010 165394,1227 165394,86416 165395,1425 165396,298 165397,485 165398,439 165399,557 165400,287 165401,55849 165402,192 165403,346 165404,302 165405,333 165406,779 165407,794 165407,3949 165408,393 165409,1590 165410,302 165411,861 165412,861 165413,217 165414,178 165415,579 165416,1556 165417,22 165418,703 165419,1363 165420,141912 165422,893 165422,1434 165423,142870 165424,1449 165426,671 165426,2868 165427,1309 165429,3328 165432,557 165433,3129 165434,138 165435,1522 165436,3135 165437,1955 165438,1782 165439,301 165439,818 165439,881 165439,907 165439,972 165439,973 165439,1010 165439,1271 165439,1284 165439,1298 165439,1360 165439,1518 165439,1798 165439,1849 165439,1853 165439,2307 165439,2595 165439,7969 165439,13513 165439,21127 165439,24962 165439,33799 165439,58284 165439,81937 165439,116275 165439,123851 165439,127158 165439,131652 165439,154385 165439,160409 165439,178900 165439,187818 165439,218020 165439,231447 165439,232267 165439,236039 165440,707 165441,209 165443,346 165444,68069 165445,2048 165446,2590 165447,1220 165447,1222 165448,516 165449,252 165450,415 165452,158 165452,192 165452,406 165452,422 165452,424 165452,493 165453,1118 165454,1282 165455,749 165456,1425 165458,563 165459,138686 165460,175 165461,298 165462,192 165462,457 165464,344 165465,972 165465,973 165465,4504 165466,483 165467,1127 165468,72 165469,1167 165469,1298 165469,2979 165470,389 165471,389 165472,433 165473,4545 165473,139010 165474,1274 165475,302 165476,2210 165476,4237 165478,2671 165479,861 165480,1220 165480,1222 165481,406 165482,252 165483,251 165484,55849 165485,3129 165486,3129 165487,72 165488,4611 165489,1544 165492,118 165492,422 165492,4597 165492,5405 165493,50 165493,406 165493,1181 165493,1414 165493,1515 165493,2931 165494,240 165495,222 165496,640 165497,240 165498,72 165499,1247 165499,164572 165500,893 165501,2989 165501,2991 165502,68 165503,1858 165504,1860 165505,795 165506,328 165507,147 165508,83 165509,1619 165510,72 165511,44 165512,269 165513,406 165514,1452 165515,30 165516,467 165517,392 165518,516 165519,1220 165519,1222 165520,252 165521,358 165522,392 165523,167 165524,8308 165525,248 165526,72 165527,563 165528,330 165529,83 165530,4411 165531,485 165532,298 165533,525 165534,1381 165535,1309 165536,1776 165536,118336 165537,1285 165538,83 165539,72 165540,631 165541,575 165543,294 165544,23783 165545,364 165546,314 165546,141912 165547,795 165548,330 165549,138686 165550,175 165551,298 165552,1381 165553,13361 165554,4611 165555,83 165556,30 165557,30 165558,187 165559,493 165560,165561 165562,278 165563,22 165564,1608 165565,72 165566,68 165567,72 165568,55849 165569,850 165570,707 165571,165572 165573,2989 165573,2991 165574,19010 165575,130 165576,346 165577,138686 165578,175 165579,165580 165581,30 165582,298 165583,588 165583,590 165584,72 165585,72 165586,388 165586,392 165586,623 165586,779 165586,1424 165586,127158 165586,171641 165586,207837 165587,447 165588,2775 165589,2146 165590,3623 165591,255 165592,72 165593,165594 165595,1243 165596,8270 165597,273 165598,72 165599,217 165600,1983 165601,1247 165601,164572 165602,30 165603,5366 165604,72 165605,138686 165606,175 165607,1715 165608,298 165609,165610 165611,30 165612,30 165613,30 165614,30 165615,165616 165617,72 165618,3623 165619,68069 165620,1381 165621,1007 165622,760 165622,2292 165623,424 165624,104 165624,557 165624,953 165624,954 165624,5405 165626,1 165627,175 165628,579 165629,2775 165630,634 165630,1313 165630,5034 165632,493 165633,875 165634,355 165635,875 165636,1353 165637,1238 165638,4611 165639,1544 165640,28130 165641,30 165642,1893 165642,2312 165643,2210 165643,4237 165645,147 165645,21442 165645,240174 165646,202 165648,1608 165649,30 165650,3623 165651,3756 165652,1415 165653,2353 165655,344 165657,8072 165658,72 165659,447 165660,285 165661,1860 165662,3623 165663,1858 165664,285 165665,72 165666,1241 165668,328 165669,1284 165669,148742 165670,72 165671,30 165672,592 165673,233 165675,698 165675,175914 165675,175946 165675,177380 165675,179148 165675,179149 165675,183862 165675,185309 165675,188674 165675,188720 165675,189170 165675,189192 165675,190427 165675,191898 165675,192384 165675,194529 165675,194992 165675,200584 165675,200585 165675,202949 165675,202953 165675,202960 165676,682 165676,72439 165677,408 165677,1326 165678,1452 165679,30 165680,309 165680,310 165680,1400 165681,462 165682,3623 165684,422 165685,422 165686,422 165687,509 165689,1773 165690,779 165691,422 165692,422 165693,422 165694,422 165695,422 165696,875 165697,622 165698,136 165699,142879 165700,30 165701,1368 165702,30331 165703,312 165704,873 165704,3182 165705,344 165706,422 165707,1052 165708,3623 165709,1332 165710,503 165711,184 165712,141912 165713,1983 165714,875 165715,301 165716,304 165718,156379 165719,171 165720,165721 165722,4611 165723,1544 165724,30 165725,605 165726,272 165727,1634 165728,346 165729,431 165729,784 165730,760 165731,136 165732,83 165735,920 165736,972 165738,467 165740,1531 165741,4545 165741,139010 165742,83 165743,138686 165744,972 165745,175 165746,972 165747,972 165748,403 165748,693 165749,298 165751,640 165754,1639 165757,1 165757,83 165758,83 165759,1257 165760,2210 165760,4237 165761,3623 165762,252 165762,1220 165762,1222 165763,79 165764,1001 165766,136 165768,563 165769,37 165769,968 165769,1001 165769,1068 165769,1231 165769,1326 165769,1370 165769,3585 165769,3804 165769,14797 165771,136 165772,4611 165773,1544 165774,1127 165776,1388 165776,30331 165777,1983 165778,718 165779,127158 165780,1388 165780,1531 165781,83 165782,301 165783,1983 165785,717 165786,718 165786,8180 165787,875 165788,360 165789,809 165790,571 165791,30 165792,1511 165792,3069 165793,994 165794,994 165795,3507 165797,298 165798,485 165799,693 165800,485 165801,298 165802,137 165802,1891 165803,592 165804,358 165806,588 165806,590 165808,3585 165809,138686 165810,175 165811,298 165812,818 165813,397 165815,1132 165816,1608 165817,1608 165818,1132 165820,1132 165821,1608 165822,2367 165823,79 165824,4611 165825,1544 165826,1608 165827,1132 165828,907 165829,707 165830,248 165831,1132 165832,1608 165833,1132 165834,1608 165835,186 165836,1181 165837,1927 165838,668 165839,485 165840,298 165841,1132 165842,781 165843,687 165844,83 165845,7572 165847,875 165849,1132 165850,781 165851,1 165851,147 165851,149 165851,158 165851,184 165851,1619 165852,626 165853,2209 165854,1821 165855,1085 165856,72 165857,406 165858,1722 165859,346 165860,1634 165861,875 165862,1132 165863,1608 165865,1425 165866,1983 165867,5212 165868,2105 165869,406 165870,4571 165871,65 165871,868 165873,2837 165874,1858 165875,1860 165876,328 165877,843 165878,3999 165879,467 165879,571 165879,872 165880,4101 165881,1789 165882,435 165884,693 165885,972 165886,406 165887,3623 165888,1522 165889,1118 165889,5250 165890,972 165891,994 165892,1287 165894,148742 165895,344 165896,72 165897,285 165898,30 165898,1179 165899,435 165900,1511 165900,3069 165901,2048 165902,611 165903,1177 165906,563 165907,843 165908,83 165909,620 165909,893 165912,178 165914,1740 165916,1132 165917,781 165918,301 165919,356 165919,852 165919,973 165919,1544 165920,138686 165921,175 165922,30 165923,298 165924,1118 165925,83 165926,83 165927,28130 165929,1801 165930,1323 165931,1326 165932,408 165933,102 165934,83 165935,1572 165937,2048 165938,83 165939,483 165940,72 165941,83 165942,346 165943,23783 165947,13661 165948,83 165949,136 165951,252 165953,72 165954,30 165955,406 165956,68 165957,3623 165958,3695 165959,55849 165960,30 165962,136 165963,151 165964,83 165965,72 165966,72 165967,83 165968,1 165968,86 165968,117 165968,273 165968,485 165968,2712 165968,5212 165969,634 165970,467 165971,1240 165972,760 165973,72 165974,142473 165975,34 165975,35 165976,907 165977,118 165977,953 165978,479 165979,657 165979,1240 165979,1805 165979,6059 165980,273 165981,301 165982,30 165983,83 165984,83 165985,503 165986,557 165988,818 165989,698 165990,1149 165991,3623 165992,2784 165993,631 165995,3623 165996,1474 165997,358 165998,30 165999,217 165999,1007 166000,9029 166001,2367 166002,1309 166003,788 166004,1414 166005,5906 166006,557 166007,626 166008,278 166009,137 166010,862 166011,392 166012,991 166013,175 166014,72 166015,107 166016,34 166016,35 166017,1188 166018,861 166019,222 166020,77 166020,5440 166021,301 166022,184 166023,155481 166024,841 166026,38634 166027,302 166028,2620 166029,781 166030,1132 166031,8854 166032,298 166033,485 166034,44 166035,1 166036,10 166036,192 166037,206 166038,72 166039,30 166040,485 166041,298 166042,72 166043,72 166044,1571 166045,72 166046,1511 166046,3069 166047,1655 166048,2506 166049,1188 166050,779 166051,285 166052,294 166053,1305 166054,2116 166055,347 166056,577 166057,5265 166058,676 166059,707 166060,285 166061,77 166061,85 166062,1515 166063,920 166064,30 166065,298 166066,485 166067,457 166068,267 166069,467 166069,868 166070,278 166071,298 166072,485 166073,452 166074,304 166075,23783 166076,1860 166077,1858 166078,455 166079,885 166079,13704 166081,1381 166082,623 166082,1805 166083,1274 166084,1 166085,1132 166086,1608 166087,1608 166088,1132 166089,2923 166090,2572 166091,30 166092,2590 166093,602 166094,536 166095,1634 166096,2995 166097,227 166098,4066 166099,2526 166100,693 166101,30 166103,450 166104,589 166105,3321 166106,784 166107,211 166108,1019 166109,34 166109,35 166110,8270 166111,289 166111,290 166111,94134 166112,3960 166113,118 166113,907 166114,1010 166115,433 166116,27356 166117,6027 166118,16045 166119,3960 166120,4078 166121,1133 166122,200 166123,602 166124,118 166124,4597 166125,1019 166126,383 166127,5366 166128,146 166128,92476 166129,200 166130,1462 166130,8537 166131,9121 166132,2620 166133,2073 166134,714 166135,9018 166136,1247 166136,164572 166137,622 166138,1133 166139,187 166140,1001 166141,7360 166142,907 166143,4453 166144,1392 166145,557 166146,2051 166147,211 166148,585 166149,1149 166150,21826 166151,1939 166152,6068 166153,158 166154,332 166155,8270 166156,2995 166157,3161 166158,1659 166159,8180 166160,32475 166161,383 166162,9166 166163,1849 166164,207 166165,254 166166,5366 166167,8788 166168,1818 166168,17245 166169,772 166170,7270 166171,1807 166172,2995 166173,140 166174,1227 166174,86416 166175,115 166175,118 166176,33201 166177,146 166177,92476 166178,515 166179,151 166180,9121 166181,693 166182,1688 166183,2379 166184,264 166185,1402 166186,4980 166187,557 166188,622 166189,622 166190,50 166190,222 166190,248 166190,1939 166191,126 166192,589 166193,115 166193,118 166194,779 166195,9560 166196,126 166197,49887 166198,2929 166199,267 166200,953 166200,3872 166201,1181 166202,275 166203,1019 166204,336 166205,146 166205,92476 166206,7652 166207,8180 166208,3413 166209,96187 166210,784 166211,515 166212,42220 166213,275 166214,49057 166215,2719 166216,2292 166217,8992 166218,5976 166219,30370 166220,383 166221,435 166222,2209 166223,4252 166224,1235 166224,1335 166225,10 166226,313 166227,2574 166228,298 166229,5405 166230,9030 166231,1844 166232,3999 166233,248 166234,631 166235,222 166236,151 166237,50 166238,682 166238,72439 166239,455 166240,312 166241,225 166242,163 166243,8235 166244,2224 166245,137 166246,151 166246,72439 166247,83 166248,36985 166249,1379 166250,42220 166251,267 166252,166253 166254,171 166255,171 166256,273 166257,872 166258,1429 166259,184 166260,10 166261,30 166262,389 166263,8788 166264,577 166265,1143 166266,668 166267,273 166268,497 166269,30 166270,3041 166271,83 166273,195 166274,355 166275,192 166275,256 166278,1188 166279,3769 166280,217 166280,13546 166281,83 166282,1132 166283,781 166284,255 166285,124668 166286,142473 166288,313 166288,455 166288,657 166288,1274 166288,1718 166288,2779 166288,3252 166288,4637 166288,37088 166288,45437 166289,422 166291,1860 166292,1858 166293,422 166294,592 166295,422 166296,298 166297,485 166298,422 166299,422 166300,422 166301,422 166302,422 166303,422 166304,422 166305,422 166306,146 166306,92476 166307,647 166308,344 166309,83 166310,388 166311,5405 166312,233 166313,259 166314,640 166315,1381 166316,1058 166317,602 166318,467 166319,602 166320,1453 166322,273 166323,1608 166324,1132 166325,1608 166326,1132 166327,1749 166329,240 166329,4355 166330,611 166330,1718 166331,240 166331,1085 166331,1955 166332,72 166333,285 166334,344 166335,1181 166336,1801 166338,1458 166338,183670 166339,217 166339,240 166339,292 166339,861 166339,1204 166339,1796 166339,2017 166340,1860 166341,1858 166342,417 166343,332 166344,602 166345,166346 166347,1449 166347,1927 166349,217 166349,1417 166350,115 166350,118 166351,2915 166353,602 166354,79 166355,217 166356,83 166357,1467 166358,994 166359,493 166360,1927 166361,72 166362,1749 166364,138686 166366,175 166368,147 166368,158 166368,184 166369,333 166369,59021 166370,252 166372,298 166373,20 166373,743 166374,68069 166374,86832 166376,83 166378,10 166378,1252 166378,1253 166379,510 166382,462 166385,2083 166386,141912 166390,68069 166390,86832 166391,68069 166391,86832 166392,68069 166392,86832 166393,920 166395,106 166395,147 166395,149 166395,406 166397,200 166398,68069 166398,86832 166399,68069 166399,86832 166400,579 166402,557 166403,3623 166404,118 166404,4597 166406,68069 166407,328 166408,151 166409,141912 166411,68069 166411,86832 166412,68069 166412,86832 166413,660 166414,1688 166416,68069 166417,1983 166419,68069 166421,68069 166421,86832 166422,1181 166423,195 166425,68069 166425,86832 166426,68069 166426,86832 166430,68069 166430,86832 166431,68069 166431,86832 166432,440 166432,622 166432,1033 166432,141912 166433,1631 166434,994 166436,68069 166436,86832 166438,3623 166441,68069 166441,86832 166444,6387 166445,6387 166446,6387 166448,68069 166448,86832 166450,1132 166451,1608 166453,720 166453,907 166453,973 166453,1284 166453,1715 166453,1837 166453,9024 166454,760 166457,68069 166457,86832 166458,68069 166458,86832 166460,83 166463,275 166466,166467 166468,644 166471,138686 166472,1858 166473,1860 166474,994 166475,175 166479,2460 166480,298 166481,1241 166483,68069 166483,86832 166485,417 166487,338 166487,4039 166491,68069 166491,86832 166492,83 166492,818 166493,68069 166493,86832 166494,1390 166495,1860 166496,1858 166498,1559 166499,147 166499,149 166500,68069 166500,86832 166503,68069 166503,86832 166504,707 166505,68069 166505,86832 166506,346 166507,1707 166508,707 166510,251 166511,2443 166512,166513 166512,178954 166514,1837 166516,68069 166519,68069 166520,68069 166520,86832 166521,1240 166521,1644 166521,68069 166521,86832 166522,3623 166524,779 166524,68069 166524,86832 166524,141912 166525,68069 166525,86832 166526,1858 166527,1860 166528,141912 166530,68069 166530,86832 166531,68069 166532,83 166533,4411 166535,68069 166535,86832 166536,195 166537,422 166538,56 166540,68069 166540,86832 166541,1619 166542,68069 166542,86832 166543,907 166544,743 166544,1983 166545,994 166547,37414 166548,1363 166550,68069 166550,86832 166551,254 166554,579 166556,138686 166557,175 166559,298 166562,422 166563,68069 166563,86832 166563,169205 166563,206795 166563,214444 166564,68069 166567,731 166569,406 166570,2353 166571,68069 166571,86832 166575,68069 166575,86832 166582,2353 166583,2353 166584,251 166584,2353 166598,68069 166599,68069 166599,86832 166600,158 166602,68069 166603,2274 166603,68069 166603,86832 166603,184321 166604,68069 166604,86832 166605,68069 166605,86832 166606,360 166606,2617 166607,72 166609,4411 166610,68069 166610,86832 166611,7 166613,68069 166613,86832 166615,1467 166616,775 166617,775 166620,718 166621,301 166621,68069 166624,8822 166625,1381 166628,760 166629,1984 166629,3949 166630,1467 166632,1858 166633,1860 166634,19488 166635,72 166636,602 166637,302 166638,104 166638,852 166639,4455 166640,1860 166641,1858 166642,1858 166643,1860 166644,60576 166645,167 166646,406 166647,563 166648,330 166649,809 166650,333 166651,255 166652,1118 166653,972 166654,408 166655,1326 166656,1323 166657,102 166659,72 166660,72 166661,1608 166662,1132 166663,1515 166666,240 166667,1955 166667,8180 166668,68069 166669,2784 166670,1 166671,2048 166672,278 166673,934 166675,247 166675,2867 166675,2868 166676,602 166677,72 166678,1984 166679,2944 166680,760 166680,1631 166681,2784 166683,195 166684,875 166685,142430 166685,142473 166685,142879 166685,215276 166686,304 166687,68069 166687,86832 166688,2353 166689,151 166692,2784 166693,10 166696,247 166697,2353 166698,760 166699,72 166700,805 166701,1392 166702,2784 166703,151 166704,240 166704,1359 166705,2784 166706,72 166707,1241 166707,1298 166707,1436 166707,1479 166707,1522 166707,1616 166707,2480 166707,2557 166707,2979 166708,483 166709,1284 166710,2784 166711,422 166712,56 166714,808 166715,2784 166716,151 166717,209 166718,2784 166719,2784 166720,875 166721,2784 166722,2296 166723,68069 166724,2784 166725,56 166726,422 166727,68069 166727,86832 166728,2784 166729,2784 166730,536 166731,72 166732,217 166733,252 166734,72 166735,2784 166736,795 166737,2373 166738,2784 166739,2784 166740,2784 166741,2784 166742,113156 166743,192 166743,1243 166744,2784 166745,2784 166746,467 166748,306 166748,307 166748,406 166748,620 166749,301 166750,2784 166751,2784 166752,72 166753,72 166754,2784 166755,2784 166756,140 166758,72 166759,72 166760,30 166761,392 166762,2979 166763,301 166764,30 166765,408 166766,2784 166767,166768 166769,2784 166770,920 166771,631 166772,861 166773,301 166774,44 166775,4594 166776,752 166777,968 166778,72 166780,1381 166781,250 166781,1058 166781,1381 166781,1684 166781,29380 166782,72 166783,1133 166784,30 166785,83 166786,1235 166786,1335 166787,222 166788,30 166789,994 166790,4220 166791,2784 166792,2784 166793,406 166794,1300 166795,72 166796,107 166797,146 166797,92476 166798,647 166799,344 166800,3003 166801,142405 166802,83 166803,2784 166804,1531 166805,557 166806,862 166807,707 166808,72 166809,209 166809,489 166810,72 166811,843 166812,1363 166813,1659 166814,302 166815,147 166818,58 166819,72 166820,760 166821,1235 166821,1335 166822,68069 166822,86832 166823,166824 166825,195 166826,592 166826,1818 166827,2671 166828,1707 166829,485 166830,298 166831,420 166832,1085 166833,267 166835,298 166836,485 166837,602 166838,298 166839,485 166840,647 166841,146 166841,92476 166842,344 166843,72 166844,111924 166845,2784 166846,2671 166847,581 166848,302 166849,994 166850,3623 166851,602 166852,310 166852,805 166853,885 166853,13704 166854,72 166855,4192 166855,4193 166857,2784 166858,1274 166859,72 166860,3623 166861,3623 166862,217 166863,861 166864,784 166865,138686 166866,175 166867,298 166868,861 166869,2784 166870,72 166871,900 166872,72 166873,3623 166874,4 166874,5 166874,994 166874,1252 166874,1253 166875,3041 166876,255 166877,602 166878,269 166879,424 166880,14472 166881,485 166882,298 166883,1858 166884,1860 166885,2367 166886,577 166887,1247 166887,164572 166888,1381 166889,83 166890,1179 166891,309 166891,310 166892,1 166894,2411 166895,72 166896,30 166897,355 166898,207 166899,422 166900,56 166901,422 166902,56 166903,298 166904,485 166905,647 166906,344 166907,146 166907,92476 166908,485 166909,298 166910,1087 166911,72 166912,344 166913,285 166914,1612 166915,1634 166916,1509 166917,65 166918,302 166919,222 166920,3623 166921,233 166922,2353 166923,1010 166924,640 166925,344 166926,146 166926,92476 166927,640 166928,647 166929,344 166930,2353 166931,30 166934,893 166935,2312 166936,1858 166937,1860 166938,146 166938,92476 166939,647 166940,344 166941,4260 166942,195 166943,1132 166944,781 166945,146 166945,92476 166946,647 166947,344 166948,779 166950,15748 166951,1238 166952,2671 166954,422 166955,422 166956,422 166957,422 166958,422 166959,647 166960,146 166960,92476 166961,344 166962,422 166963,422 166964,422 166965,422 166966,422 166967,422 166968,422 166969,1663 166970,852 166970,75912 166971,140 166972,467 166972,156379 166973,2353 166974,195 166975,1663 166976,30 166977,1612 166978,158 166978,779 166979,138686 166980,175 166981,2460 166981,138686 166982,1243 166983,41 166983,1462 166983,8537 166984,298 166986,49057 166987,1010 166989,346 166993,3 166994,1707 166995,4222 166996,1608 166997,1132 166998,693 166998,14366 166999,113156 167002,592 167003,30 167004,1452 167005,83 167006,10 167007,1262 167008,1858 167009,1860 167010,3623 167011,255 167013,147 167014,138686 167015,337 167016,175 167017,30 167018,337 167018,852 167019,298 167020,22 167022,302 167023,422 167024,56 167025,68069 167025,86832 167026,1172 167028,195 167029,104 167030,1052 167032,516 167033,50 167034,195 167036,79 167036,1181 167037,644 167037,1117 167038,843 167039,536 167040,18831 167041,843 167042,592 167044,2557 167045,3623 167046,269 167047,718 167048,3623 167050,1363 167051,1425 167052,1118 167053,577 167055,841 167056,611 167058,2421 167059,211 167061,252 167062,483 167063,104 167063,714 167063,760 167063,1458 167064,397 167066,86832 167067,779 167068,602 167069,932 167069,991 167069,9029 167070,86832 167073,192 167075,602 167076,1659 167077,86832 167077,207750 167078,292 167079,138686 167080,175 167081,298 167082,893 167083,390 167083,968 167083,1326 167083,3756 167083,5301 167084,1181 167085,86832 167086,435 167086,1612 167087,1566 167088,6506 167089,104 167089,314 167089,392 167090,264 167091,2353 167092,103860 167093,4146 167094,55849 167095,83 167096,1298 167097,518 167098,467 167099,86832 167100,408 167101,1326 167102,1323 167103,972 167104,102 167105,34 167105,35 167106,248 167107,86832 167108,264 167108,1381 167109,86832 167110,86832 167111,146 167111,92476 167112,647 167113,344 167114,2048 167115,187 167117,175 167119,298 167120,72 167121,86832 167122,733 167123,289 167123,290 167123,94134 167125,3623 167126,602 167128,195 167130,120 167131,146280 167131,159365 167133,86832 167134,158 167135,301 167136,779 167137,86832 167139,868 167140,195 167142,592 167142,1818 167142,2315 167143,167143 167144,647 167145,146 167145,92476 167146,344 167147,1707 167148,273 167149,86832 167150,431 167150,6506 167152,1132 167153,781 167155,83 167156,30 167157,1147 167158,298 167159,485 167160,1368 167162,30 167163,158 167164,2334 167166,2209 167167,393 167170,48 167171,120 167172,1127 167173,467 167174,657 167175,809 167176,932 167177,1240 167182,289 167182,290 167182,94134 167183,344 167184,72 167185,285 167186,338 167187,44 167188,113156 167189,366 167190,366 167191,366 167192,366 167193,366 167194,911 167195,366 167196,1160 167198,1782 167199,72 167200,86832 167201,885 167201,13704 167203,302 167204,557 167205,8719 167206,138 167207,865 167208,557 167209,137 167210,118 167210,4597 167211,1070 167212,88820 167213,1623 167214,72 167215,861 167216,72 167217,577 167218,326 167219,431 167220,83 167221,167222 167223,622 167224,1893 167225,332 167226,489 167227,83 167228,1001 167229,30 167230,151 167231,2312 167232,273 167233,167234 167235,2797 167236,779 167237,30 167238,622 167241,3623 167242,30 167243,424 167244,72 167245,577 167246,267 167247,1072 167249,167250 167251,167252 167251,220846 167253,422 167254,422 167255,422 167256,422 167257,167258 167259,422 167260,422 167261,422 167262,422 167263,422 167264,422 167265,422 167266,422 167268,147 167269,72 167270,900 167271,1001 167272,167273 167272,219415 167274,973 167275,225 167276,392 167277,72 167279,2048 167280,72 167281,72 167282,8884 167284,72 167285,366 167286,503 167287,148742 167288,1085 167289,483 167290,167291 167290,230604 167292,298 167293,485 167294,355 167295,233 167296,167297 167298,1458 167299,83 167300,255 167301,171 167302,72 167303,105793 167304,707 167305,875 167306,167307 167308,406 167309,781 167310,1132 167312,592 167312,1818 167313,784 167314,509 167315,640 167316,1220 167316,1222 167317,516 167318,252 167319,360 167320,2617 167321,602 167322,30 167324,4545 167324,139010 167325,1359 167326,408 167327,1326 167328,1323 167329,102 167330,272 167330,2868 167331,7358 167331,7363 167332,134 167333,818 167333,4193 167334,2797 167335,907 167336,58 167337,1313 167338,72 167339,972 167340,4799 167341,611 167343,3085 167344,134 167345,366 167346,44 167347,602 167348,192 167351,5 167351,1253 167351,1432 167351,2089 167351,2940 167351,5871 167351,13704 167351,171294 167352,1962 167353,206 167355,72 167356,41 167357,592 167358,30 167359,30 167360,483 167361,72 167363,3623 167364,22071 167365,760 167366,72 167367,1227 167367,86416 167368,72 167369,3804 167370,1436 167371,8 167372,1479 167373,390 167374,72 167375,72 167376,167377 167378,3623 167379,200 167379,1282 167380,22 167381,200 167382,261 167383,167384 167385,72 167386,167387 167388,72 167389,72 167390,4611 167391,72 167392,113156 167393,72 167394,63 167395,1284 167395,3474 167396,994 167396,48955 167397,72 167398,72 167399,7416 167400,72 167401,1572 167402,72 167403,10 167404,72 167405,72 167406,142405 167407,72 167408,2051 167409,2574 167410,850 167411,233 167412,1381 167413,355 167414,1939 167415,602 167416,255 167417,298 167418,107 167419,292 167420,1133 167421,338 167422,2416 167422,2417 167423,3538 167424,68069 167425,175 167426,663 167427,1252 167427,1253 167428,83 167428,390 167429,631 167430,171 167432,55849 167433,1227 167433,86416 167434,72 167435,167436 167437,22 167438,158 167439,136 167439,137 167440,1631 167441,167441 167442,994 167443,338 167443,439 167443,649 167444,385 167445,1087 167446,872 167447,72 167448,328 167449,167450 167451,557 167452,972 167453,7360 167455,994 167456,2506 167457,872 167458,872 167459,4223 167460,167461 167462,48 167463,4594 167464,30 167465,298 167466,485 167467,55849 167468,41 167469,79 167470,135 167471,72 167472,6303 167473,72 167474,302 167475,1707 167476,885 167476,13704 167477,137 167478,355 167480,994 167481,557 167482,557 167483,557 167484,298 167485,485 167486,772 167486,6051 167487,994 167488,2607 167489,994 167490,994 167491,483 167492,3115 167493,2979 167494,5726 167495,1425 167496,4611 167498,240 167500,167501 167502,2424 167503,344 167504,647 167505,146 167505,92476 167506,736 167507,972 167508,113156 167509,422 167511,142473 167516,167517 167518,167517 167519,167517 167521,167 167521,301 167521,3207 167522,278 167523,5440 167527,620 167528,72 167529,22 167529,760 167529,818 167530,406 167531,137 167532,6249 167533,306 167533,307 167534,72 167535,1515 167536,779 167538,72 167539,422 167541,4545 167541,139010 167544,652 167545,292 167546,294 167547,296 167548,298 167549,2889 167550,247 167551,1238 167552,3507 167553,1452 167554,7155 167555,167556 167557,1849 167558,4545 167558,139010 167559,346 167560,355 167561,233 167562,10 167562,30 167562,34 167562,35 167562,65 167562,79 167562,120 167562,158 167562,192 167562,206 167562,217 167562,264 167562,267 167562,278 167562,305 167562,309 167562,310 167562,328 167562,333 167562,417 167562,435 167562,440 167562,485 167562,493 167562,509 167562,628 167562,712 167562,718 167562,760 167562,779 167562,872 167562,1010 167562,1033 167562,1118 167562,1179 167562,1276 167562,1282 167562,1313 167562,1509 167562,1572 167562,1659 167562,1749 167562,1939 167562,1955 167562,2146 167562,2979 167562,3297 167562,5130 167562,5265 167562,6119 167562,6837 167562,16687 167562,54284 167562,127158 167562,141912 167563,41 167564,86832 167565,968 167566,72 167568,48 167569,3804 167569,4411 167570,2334 167571,1284 167572,843 167573,1181 167574,389 167575,83 167577,1858 167578,1860 167582,83 167583,736 167584,142430 167585,86832 167586,704 167587,107 167587,4771 167588,222 167590,417 167591,873 167592,1210 167593,919 167594,1132 167595,781 167596,1858 167597,1860 167598,422 167599,422 167600,422 167601,838 167601,1014 167602,422 167603,422 167604,422 167606,422 167607,422 167608,422 167609,422 167610,422 167611,422 167612,919 167613,366 167614,1132 167615,1608 167616,736 167618,850 167619,510 167621,3 167622,795 167624,30 167625,1241 167626,1572 167627,3 167628,138686 167629,1417 167630,175 167631,602 167632,602 167633,252 167633,1220 167633,1222 167634,298 167635,330 167636,248 167636,1745 167637,1566 167638,690 167639,1566 167640,743 167641,868 167641,1033 167641,118336 167642,2312 167643,2312 167645,9457 167646,760 167647,907 167648,337 167649,390 167650,79 167651,652 167652,3555 167653,406 167654,392 167654,19010 167655,640 167656,142879 167657,640 167658,671 167659,151 167660,640 167661,640 167662,640 167663,640 167664,872 167665,178 167666,22 167667,75912 167668,217 167668,536 167671,868 167673,433 167674,1252 167674,1253 167675,138686 167676,440 167677,175 167678,298 167679,4545 167679,139010 167680,972 167681,907 167682,1556 167683,435 167685,79 167686,6119 167687,1893 167687,2312 167688,134 167690,294 167692,3003 167693,136 167694,994 167695,184 167697,142433 167698,225 167699,48 167701,1072 167702,941 167703,302 167704,255 167705,255 167706,255 167707,167708 167709,138686 167710,577 167710,1722 167713,79 167715,1127 167717,269 167718,875 167719,4545 167719,139010 167720,779 167721,2353 167722,10 167724,422 167725,56 167726,1801 167727,1608 167728,1132 167729,273 167732,1231 167733,72 167734,4545 167734,139010 167735,422 167736,56 167737,818 167738,302 167739,22293 167740,346 167741,1544 167742,1151 167743,202 167744,2353 167745,30 167746,557 167747,657 167748,841 167751,149 167754,931 167755,2989 167755,2991 167760,2371 167761,1773 167762,1544 167763,408 167764,102 167765,1326 167766,1323 167768,2411 167769,328 167770,328 167770,784 167770,805 167770,1119 167771,818 167772,477 167773,299 167774,392 167776,184 167777,206 167777,142473 167778,200 167779,302 167780,2073 167781,861 167781,2116 167782,1579 167783,72 167784,285 167785,344 167786,579 167787,1122 167788,1531 167789,1058 167790,1231 167791,850 167792,255 167793,107 167795,579 167796,13361 167797,483 167798,111 167798,290 167798,309 167798,310 167798,760 167798,94134 167799,557 167800,2048 167801,852 167801,2590 167801,4220 167802,3695 167803,3623 167804,106 167805,83 167806,59 167806,94 167806,2787 167806,3794 167807,3 167808,2083 167808,5301 167809,843 167810,138686 167811,175 167812,104 167813,298 167814,298 167815,142426 167816,1773 167817,636 167818,68069 167819,301 167821,1858 167822,1860 167823,1807 167824,285 167825,1127 167826,167827 167828,119 167829,2146 167830,30 167831,63 167831,202 167831,247 167831,516 167832,141912 167833,422 167834,372 167835,184 167836,104 167837,312 167838,932 167839,1821 167840,338 167841,209 167841,302 167841,2116 167843,146 167843,92476 167844,344 167845,647 167846,104 167846,248 167846,636 167846,1282 167848,44 167849,849 167851,344 167852,647 167853,146 167853,92476 167854,104 167855,2775 167856,447 167857,104 167857,557 167858,1785 167859,4545 167859,139010 167860,30 167861,338 167863,1608 167864,406 167865,302 167866,1227 167866,86416 167867,885 167867,13704 167868,1220 167868,1222 167869,516 167870,252 167871,1220 167871,1222 167872,252 167873,516 167874,167875 167876,30 167877,106 167878,861 167879,1151 167880,1467 167882,818 167883,1634 167884,435 167885,647 167886,146 167886,92476 167887,344 167888,137 167889,1849 167890,2315 167891,467 167892,536 167893,145240 167894,30 167895,106 167896,2315 167897,19010 167898,422 167899,1983 167900,55849 167901,289 167901,290 167901,2296 167901,94134 167902,302 167903,843 167904,7416 167905,818 167906,55849 167908,6119 167909,2797 167910,332 167911,3331 167912,3319 167913,2797 167914,3328 167915,736 167916,332 167917,3331 167918,3319 167919,3328 167920,2797 167921,332 167922,3331 167923,344 167924,72 167925,285 167926,2797 167927,2797 167928,3319 167929,332 167930,332 167931,3331 167932,2797 167933,302 167934,2797 167935,3319 167936,2797 167937,2797 167938,332 167939,2797 167940,332 167941,788 167942,332 167943,3331 167944,2797 167945,406 167946,2797 167947,217 167948,3331 167949,3328 167950,2797 167951,332 167952,3331 167953,332 167954,2797 167955,332 167956,3331 167957,2797 167958,2797 167959,4411 167960,79 167961,2797 167962,332 167963,422 167964,56 167965,2797 167966,2797 167967,2797 167968,2797 167969,332 167970,3331 167971,388 167972,167973 167974,3331 167975,332 167976,3331 167978,2797 167979,332 167980,332 167981,3331 167982,3331 167983,332 167984,3331 167985,2797 167986,332 167987,3331 167988,2797 167989,332 167990,332 167991,332 167992,3331 167993,332 167994,2797 167995,332 167996,422 167997,2797 167998,2797 167999,2797 168000,2797 168001,2797 168002,3328 168003,3331 168004,3331 168005,3319 168006,3319 168007,3319 168008,3331 168009,332 168010,3331 168011,3331 168012,332 168013,332 168014,30 168015,332 168016,3331 168017,2797 168018,332 168019,2797 168020,332 168021,3331 168022,2797 168023,332 168024,332 168025,3331 168026,2797 168027,2797 168028,749 168029,3319 168030,3328 168031,3319 168032,3319 168033,3319 168034,3331 168035,3331 168036,3319 168037,3319 168038,3331 168039,3331 168040,3319 168041,3331 168042,2797 168043,3331 168044,332 168045,3331 168046,332 168047,332 168048,3331 168049,2797 168050,2797 168051,332 168052,2797 168053,2797 168054,2797 168055,332 168056,247 168057,3319 168058,3328 168059,3319 168060,3328 168061,4222 168062,3328 168063,3319 168064,3319 168065,861 168066,3319 168067,3319 168068,3331 168069,3319 168070,332 168071,2797 168072,332 168073,3319 168074,3319 168075,3319 168076,332 168077,3331 168078,332 168079,3331 168080,3328 168081,3319 168082,3319 168083,3328 168084,3319 168085,3319 168086,3319 168087,3328 168088,2797 168089,406 168090,3319 168091,3331 168092,2797 168093,332 168094,3331 168095,3331 168096,3319 168097,3331 168098,3319 168099,332 168100,3331 168103,3328 168104,3319 168105,3328 168106,3328 168107,3328 168108,168109 168110,3319 168111,3328 168112,30 168113,332 168114,3331 168115,3331 168116,3328 168117,3319 168118,3319 168119,3319 168120,3328 168121,3328 168122,3328 168123,3328 168124,467 168125,3328 168126,3328 168127,3328 168128,3319 168129,3328 168130,3319 168131,3328 168132,3331 168133,3319 168134,3328 168135,3328 168136,3328 168137,3319 168138,3319 168139,3328 168140,3328 168141,3319 168142,3328 168143,3328 168144,72 168145,344 168146,3328 168147,285 168148,3328 168149,3328 168150,3328 168151,3328 168152,3328 168153,3328 168154,3328 168155,3328 168156,3328 168157,168158 168157,246843 168159,772 168160,68 168160,932 168161,273 168162,704 168163,2146 168164,247 168165,283 168165,455 168165,2266 168165,9343 168166,72 168167,326 168168,72 168169,704 168170,72 168171,72 168172,772 168173,72 168174,240 168175,592 168176,1033 168177,72 168178,344 168179,285 168180,72 168181,344 168182,285 168183,206 168184,516 168184,717 168184,920 168185,516 168186,332 168187,2797 168188,3331 168189,4545 168189,139010 168190,3319 168191,3328 168192,202 168193,1133 168194,337 168194,338 168194,393 168194,439 168194,626 168194,649 168194,772 168194,2367 168195,360 168195,1893 168196,168197 168198,240 168199,493 168199,1265 168199,1266 168200,72 168201,72 168202,72 168204,72 168205,72 168206,72 168207,72 168208,72 168209,72 168210,72 168212,2051 168213,392 168214,72 168215,72 168216,269 168217,72 168218,72 168219,202 168219,142405 168220,72 168221,72 168222,4545 168222,139010 168223,843 168224,83 168225,72 168226,72 168227,255 168228,779 168229,1 168229,10 168229,65 168229,217 168229,222 168229,444 168229,704 168229,932 168229,1001 168229,1118 168229,1122 168229,1564 168229,1962 168230,168231 168232,422 168233,56 168234,292 168234,644 168234,723 168234,1012 168234,2699 168234,3999 168234,5469 168235,366 168236,366 168237,366 168238,366 168239,366 168240,366 168241,1414 168242,344 168243,72 168244,285 168245,146 168245,779 168245,92476 168246,433 168247,366 168248,433 168249,355 168250,251 168251,640 168252,124668 168254,485 168255,298 168257,63 168259,622 168260,209 168263,1353 168265,596 168266,1860 168267,1858 168268,4545 168268,139010 168269,298 168270,485 168271,240 168271,818 168271,1623 168271,127158 168272,1707 168273,749 168274,301 168275,233 168276,1052 168277,30 168278,640 168279,640 168280,1220 168280,1222 168281,3695 168284,1860 168285,422 168286,422 168287,422 168288,422 168289,422 168290,422 168291,422 168292,422 168293,422 168294,422 168295,422 168296,3218 168297,1860 168298,934 168299,4545 168299,139010 168302,3999 168302,36819 168303,142433 168304,1118 168304,6837 168305,147 168307,1858 168308,1860 168309,818 168310,439 168310,22293 168312,340 168313,4545 168313,139010 168314,1983 168316,149 168317,72 168318,1220 168318,1222 168319,202 168320,1844 168321,1844 168322,1844 168323,3260 168324,2266 168325,149534 168326,149534 168327,518 168327,1326 168328,1860 168329,97 168330,577 168331,248 168331,1332 168332,209 168334,138686 168335,175 168336,389 168337,298 168338,302 168339,934 168340,736 168341,1893 168342,206 168343,772 168344,1453 168345,1177 168346,736 168347,2646 168348,1133 168350,2674 168351,30 168352,207 168353,2083 168354,158 168355,1849 168356,577 168356,1105 168358,1227 168358,86416 168359,1332 168361,1359 168362,200 168362,8537 168363,301 168364,140 168364,736 168364,1289 168364,1968 168364,2367 168367,140 168368,247 168369,158 168369,1181 168369,1515 168369,21442 168369,221309 168369,221311 168371,138686 168372,175 168373,298 168374,251 168375,510 168376,934 168377,41 168378,1983 168379,71 168380,346 168381,168382 168383,2310 168384,158 168387,2310 168388,3 168388,509 168388,510 168388,693 168388,872 168388,875 168388,29008 168389,611 168391,328 168392,72 168394,1522 168394,2979 168395,171 168396,360 168396,1893 168397,149 168398,130897 168399,46 168400,934 168401,2083 168403,72 168404,34 168404,35 168405,697 168406,1326 168407,1893 168408,346 168410,83 168411,167 168412,340 168412,459 168412,874 168412,1818 168412,3999 168413,602 168414,994 168415,138686 168416,175 168417,4571 168418,298 168419,72 168420,269 168421,1556 168422,720 168423,431 168424,3769 168425,2315 168426,1893 168427,1001 168428,827 168429,1436 168430,86832 168431,4611 168432,1544 168434,893 168436,1085 168437,1860 168438,1858 168439,4548 168440,186 168442,818 168443,1818 168444,19443 168445,657 168448,893 168448,1659 168449,19443 168450,2224 168451,5540 168452,1893 168453,217 168454,818 168455,19443 168458,1707 168459,1858 168460,1860 168461,1122 168462,6661 168467,1274 168469,795 168470,1085 168470,2296 168470,75912 168471,1893 168472,30 168473,302 168474,20 168474,46 168474,107 168474,146 168474,151 168474,207 168474,273 168474,332 168474,349 168474,390 168474,424 168474,438 168474,479 168474,497 168474,536 168474,579 168474,647 168474,657 168474,736 168474,794 168474,835 168474,874 168474,907 168474,1058 168474,1188 168474,1282 168474,1293 168474,1425 168474,1749 168474,1775 168474,1818 168474,2191 168474,2315 168474,2480 168474,2528 168474,2620 168474,2701 168474,2744 168474,3041 168474,3538 168474,4691 168474,7155 168474,28130 168474,88820 168474,92476 168474,171294 168475,340 168476,2353 168478,861 168480,184 168480,118336 168481,158 168482,1718 168483,2590 168484,2590 168485,503 168486,592 168487,56 168488,422 168489,435 168490,408 168491,1323 168492,102 168493,1326 168494,72 168495,2048 168496,435 168497,1285 168498,4260 168499,264 168499,808 168499,1118 168500,3 168501,1140 168502,360 168503,72 168505,184 168507,2506 168508,996 168509,272 168509,934 168509,1449 168509,1612 168510,868 168512,919 168513,302 168513,2116 168514,843 168515,55849 168516,298 168517,485 168518,1122 168519,994 168520,168521 168522,115474 168523,994 168524,326 168524,1151 168525,5908 168526,73570 168527,83 168528,422 168529,56 168530,178 168530,1877 168531,623 168533,2775 168534,2775 168535,83 168536,588 168536,590 168536,1419 168537,509 168537,875 168538,35750 168538,35751 168539,2620 168544,346 168548,3623 168549,994 168550,55849 168551,34 168551,35 168552,1531 168553,1531 168554,4165 168555,184 168556,233 168557,422 168558,56 168559,302 168560,861 168561,579 168562,1556 168563,168564 168563,190299 168565,217 168567,875 168568,2266 168569,3623 168570,1220 168570,1222 168571,516 168572,252 168573,626 168575,994 168577,72 168578,344 168579,285 168581,1769 168582,72 168583,83 168584,83 168585,349 168585,575 168587,111 168587,240 168587,588 168587,590 168587,8180 168588,178 168589,366 168590,302 168591,2373 168592,142430 168592,147191 168593,30 168594,192 168594,195 168594,302 168595,1181 168595,1220 168595,1222 168595,1266 168595,2782 168596,83 168598,1893 168599,168600 168601,278 168604,994 168605,743 168606,8788 168606,17263 168606,29253 168606,29294 168607,1556 168608,3623 168609,72 168610,298 168611,485 168612,647 168613,146 168613,92476 168614,344 168615,794 168616,72 168617,344 168618,72 168619,285 168620,72 168621,932 168622,2607 168623,861 168625,557 168626,1556 168627,283 168628,588 168628,590 168628,1419 168629,56 168629,1243 168630,72 168631,861 168632,483 168633,366 168634,247 168635,298 168636,485 168637,207 168638,72 168639,298 168640,485 168641,87 168641,217 168641,392 168641,595 168641,843 168641,872 168641,1453 168641,1465 168641,1572 168641,2274 168641,2697 168641,24763 168642,1623 168643,222 168643,1572 168645,4571 168646,63 168646,90845 168647,83 168649,1801 168650,485 168651,298 168652,302 168653,72 168654,302 168655,934 168656,2073 168657,2372 168658,72 168659,885 168659,13704 168660,422 168661,56 168662,358 168663,1 168664,861 168665,72 168666,217 168667,406 168668,72 168669,2367 168670,859 168671,577 168672,140 168673,1860 168674,435 168675,536 168676,467 168677,83 168678,392 168679,217 168680,1010 168681,2797 168682,195 168683,1474 168684,302 168685,843 168686,222 168687,267 168688,4545 168688,139010 168689,222 168690,2646 168691,278 168692,622 168693,344 168694,72 168695,285 168696,134 168697,1419 168698,588 168698,590 168699,83 168700,151 168701,875 168702,435 168703,640 168704,467 168704,1590 168705,72 168706,843 168707,671 168708,30 168709,83 168710,72 168712,72 168713,168714 168715,72 168716,900 168717,83 168718,571 168719,147 168720,83 168721,1860 168722,1858 168723,255 168724,65 168724,586 168725,577 168726,631 168726,760 168727,1132 168728,264 168729,83 168730,72 168731,2116 168732,1381 168733,313 168734,4545 168734,139010 168735,424 168736,168737 168739,72 168740,1007 168741,72 168742,23783 168743,1001 168744,86832 168745,292 168745,801 168745,1177 168745,1893 168745,3370 168745,14453 168746,1240 168747,1181 168748,1007 168749,2590 168750,298 168751,485 168752,168753 168752,246247 168754,72 168755,636 168757,168758 168759,435 168760,366 168761,366 168762,72 168763,4545 168763,139010 168764,355 168765,1089 168768,251 168769,302 168771,302 168772,1298 168773,83 168774,4611 168775,4611 168776,1544 168777,1544 168778,73570 168779,1544 168780,4611 168781,1238 168782,1452 168783,1143 168784,1033 168786,3507 168787,907 168788,671 168789,48 168790,1132 168791,142879 168793,795 168794,859 168795,6627 168796,4545 168796,139010 168798,1707 168800,142433 168801,48 168802,640 168803,640 168805,640 168806,1007 168807,640 168808,1454 168809,22 168810,640 168811,640 168812,83 168813,392 168813,509 168813,1240 168814,298 168815,485 168816,422 168817,422 168818,422 168819,422 168820,422 168821,422 168822,422 168823,1 168823,149 168824,422 168825,422 168826,422 168827,422 168828,207 168829,2671 168830,107 168830,1984 168831,65 168832,868 168833,1893 168834,1359 168835,2775 168835,4548 168836,15 168837,1113 168838,2209 168839,1326 168840,58 168841,104 168841,136 168841,557 168841,1368 168842,59021 168845,1052 168846,83 168847,1238 168848,23783 168849,1707 168851,1551 168852,298 168853,485 168854,22 168854,760 168855,1707 168856,4545 168856,139010 168857,875 168858,104 168859,1551 168860,2590 168861,1769 168861,3260 168862,1551 168863,1551 168864,298 168865,485 168866,441 168868,63 168869,302 168870,209 168871,3830 168872,138686 168873,175 168876,298 168877,328 168878,137 168879,209 168880,1745 168881,1231 168883,636 168884,994 168885,1801 168886,126 168886,2253 168886,5310 168887,1707 168888,19 168888,1881 168889,752 168889,2590 168891,1001 168893,3258 168894,142409 168895,760 168895,6556 168896,273 168897,1363 168898,142473 168899,647 168900,146 168900,92476 168901,344 168902,1429 168903,168904 168905,151 168906,209 168907,1616 168908,3370 168908,14453 168909,104 168909,557 168909,953 168909,954 168909,1939 168910,31073 168911,779 168912,38158 168913,682 168913,72439 168914,202 168914,252 168914,516 168915,301 168916,202 168917,83 168918,4545 168918,139010 168919,1143 168920,158 168921,1580 168922,178 168922,302 168922,467 168923,72 168925,5366 168925,8598 168926,328 168926,1282 168926,173296 168927,477 168928,68069 168929,79 168930,72 168931,872 168932,996 168933,109503 168935,557 168936,10 168937,31073 168938,1566 168939,2460 168940,337 168941,360 168942,2371 168943,3148 168943,6323 168944,649 168945,141912 168946,138686 168947,175 168948,3623 168949,893 168950,3769 168951,298 168952,302 168953,22 168954,673 168956,138686 168957,424 168958,301 168959,736 168960,209 168961,104 168962,957 168962,1815 168963,79 168964,994 168966,668 168969,805 168970,302 168972,1298 168974,127158 168975,30 168976,406 168977,138686 168978,175 168979,217 168979,240 168979,818 168980,298 168981,2296 168982,707 168983,579 168984,168985 168986,431 168987,72 168988,344 168989,285 168993,1149 168994,762 168995,302 168996,30 168997,209 168998,83 168999,2209 169000,536 169001,3 169002,1319 169003,273 169004,58 169005,994 169006,46 169007,141912 169008,83 169009,811 169010,843 169011,134 169012,19010 169013,8822 169014,3474 169015,592 169016,5405 169019,88820 169020,736 169021,169022 169023,920 169024,577 169024,852 169025,5547 169026,1252 169026,1253 169028,273 169029,77 169031,169032 169033,422 169034,56 169035,1425 169036,408 169037,1323 169038,102 169039,1326 169041,113156 169042,301 169043,255 169044,1400 169045,83 169046,1707 169047,147 169049,1240 169051,59021 169052,30 169054,2048 169055,577 169056,10 169056,302 169056,304 169056,579 169056,932 169056,1118 169056,1122 169056,1522 169056,1572 169057,4545 169057,56150 169057,139010 169059,996 169060,852 169061,877 169063,83 169064,72 169065,1149 169067,195 169068,7360 169069,209 169070,752 169072,301 169072,302 169072,690 169072,818 169072,868 169072,2292 169072,3089 169072,3507 169072,68069 169073,444 169075,147 169076,240 169077,1381 169077,9015 169078,30 169079,195 169080,447 169081,83 169082,30 169083,2867 169083,2868 169084,158 169085,1323 169086,344 169087,852 169088,2210 169088,4237 169089,3623 169090,422 169091,56 169092,169093 169094,30 169095,602 169096,42064 169097,30 169098,2775 169099,169100 169101,1117 169101,1715 169102,83 169103,372 169104,1425 169105,200 169105,299 169105,2674 169105,2779 169105,30331 169105,142433 169106,557 169108,1012 169109,30 169110,72 169111,72 169112,1551 169113,417 169114,209 169115,127617 169116,994 169117,169118 169119,142473 169120,1231 169121,622 169122,22 169123,1566 169124,510 169125,557 169126,1608 169127,30 169128,72 169129,30 169130,4545 169130,139010 169131,626 169132,467 169133,980 169134,217 169134,240 169134,592 169134,1818 169135,592 169136,178 169136,435 169136,1590 169137,267 169138,422 169139,56 169140,6303 169141,2923 169142,1531 169143,431 169144,83 169145,3623 169146,875 169147,1782 169149,2626 169150,516 169151,252 169152,1220 169152,1222 169153,932 169154,10 169155,200 169156,72 169157,615 169158,406 169159,516 169160,1353 169161,596 169163,994 169165,885 169165,13704 169166,406 169167,3623 169168,372 169168,1085 169169,2775 169170,3623 169171,247 169172,83 169173,563 169174,483 169175,72 169176,491 169176,1449 169177,248 169178,254 169180,207 169180,874 169180,1133 169181,72 169183,72 169184,72 169185,72 169186,328 169187,1274 169188,1381 169189,366 169190,309 169190,310 169191,818 169192,72 169193,483 169194,269 169195,5906 169196,557 169197,278 169198,626 169199,137 169200,862 169201,48 169202,34 169202,536 169203,2506 169204,72 169206,6837 169207,13919 169208,920 169209,146 169209,92476 169210,1 169212,34 169212,35 169212,222 169212,1618 169212,2224 169212,2944 169213,25348 169213,101688 169214,406 169215,81 169216,1181 169217,72 169218,2775 169219,1655 169220,83 169220,278 169221,1801 169222,4545 169222,139010 169223,2292 169223,2889 169224,676 169225,233 169225,3135 169226,355 169227,3585 169228,72 169229,372 169230,22 169231,2083 169232,457 169233,48 169234,452 169235,2244 169236,1688 169237,169238 169239,3003 169240,596 169241,72 169242,4545 169242,139010 169243,255 169244,1655 169245,885 169245,13704 169246,48 169247,48 169248,72 169249,169250 169251,920 169252,72 169253,72 169254,22 169255,30 169256,147 169257,169258 169259,30 169260,1363 169261,169262 169261,199537 169263,3260 169264,206 169265,1849 169266,422 169267,56 169268,1556 169269,918 169270,497 169272,147 169273,424 169274,72 169277,1432 169278,875 169279,169280 169281,1467 169282,455 169283,2424 169284,72 169285,30 169286,1871 169287,862 169287,2590 169288,2421 169289,83 169290,13980 169291,195 169292,3041 169293,255 169294,169295 169296,169297 169298,304 169299,169300 169301,1707 169302,626 169302,2995 169303,366 169304,366 169305,366 169306,366 169307,2048 169308,355 169309,22 169310,30 169311,21442 169312,19010 169313,358 169314,104 169315,312 169316,22 169317,1149 169318,801 169318,1177 169319,2443 169321,3207 169322,1707 169323,22 169324,55849 169325,467 169325,868 169326,425 169328,585 169328,718 169329,1227 169329,86416 169330,1631 169331,640 169332,697 169332,1769 169333,142430 169333,147191 169334,1927 169335,636 169336,79 169338,1608 169339,431 169339,631 169340,704 169341,2646 169342,1298 169343,72 169344,344 169345,285 169346,79 169347,6726 169348,673 169349,200 169351,292 169352,79 169353,422 169354,422 169355,422 169356,422 169357,422 169359,422 169360,422 169361,422 169362,83 169363,422 169364,422 169365,302 169367,217 169367,1417 169369,171 169370,422 169372,760 169374,827 169375,2989 169375,2991 169376,118 169376,4597 169377,222 169377,283 169377,743 169377,1983 169377,35486 169379,267 169382,9005 169383,138686 169384,175 169385,149 169385,158 169385,406 169386,1033 169388,62561 169389,298 169390,2244 169393,818 169394,233 169396,313 169397,1860 169398,1858 169399,134 169401,467 169401,571 169401,868 169402,1707 169404,843 169406,2671 169407,493 169408,169409 169410,718 169410,1968 169411,849 169412,652 169413,1579 169414,217 169415,1849 169416,657 169417,1363 169417,5591 169418,447 169419,2775 169422,372 169423,1118 169424,302 169424,893 169425,843 169426,337 169427,169428 169429,138686 169430,175 169431,1955 169432,660 169433,298 169434,50 169435,843 169436,397 169436,483 169437,859 169438,3623 169439,3623 169441,4545 169441,139010 169442,209 169443,431 169445,169446 169445,224354 169445,235366 169447,169446 169448,302 169449,489 169449,258973 169450,1858 169451,1860 169452,649 169453,247 169453,2867 169453,2868 169455,19443 169456,158 169456,406 169457,146 169457,92476 169458,647 169459,344 169460,68069 169460,141912 169461,843 169462,1181 169463,1011 169464,5726 169465,2367 169466,1241 169467,720 169468,195 169468,147191 169469,1188 169470,156379 169471,1858 169472,1860 169473,392 169474,79 169475,151 169476,169477 169478,147 169479,309 169479,310 169479,3039 169480,37 169480,356 169480,717 169480,1782 169481,1172 169483,209 169484,1511 169484,3069 169485,138686 169486,175 169487,298 169488,336 169489,1858 169490,1860 169491,292 169492,775 169493,1707 169494,392 169495,1858 169496,1860 169497,113156 169498,622 169499,781 169500,408 169501,1323 169502,102 169503,1326 169504,3695 169508,500 169509,1882 169510,1962 169511,2775 169512,1052 169513,54 169515,3830 169516,217 169518,126 169519,1858 169520,1860 169521,146 169521,92476 169522,647 169523,344 169524,577 169525,254 169526,809 169527,577 169528,718 169529,3623 169530,272 169531,424 169533,1181 169534,149534 169535,72 169536,467 169537,1140 169538,592 169539,1381 169539,1634 169540,3 169541,577 169542,302 169544,1058 169545,83 169546,843 169547,360 169547,1893 169548,104 169548,592 169548,1745 169549,146 169549,92476 169550,862 169551,138686 169552,175 169553,417 169556,1782 169557,392 169559,298 169560,192 169563,4545 169563,139010 169564,283 169564,455 169566,3623 169567,497 169567,1655 169568,4903 169569,50 169569,192 169569,1181 169569,1425 169570,169571 169572,145751 169573,483 169576,500 169577,366 169578,19010 169579,2373 169580,5310 169581,4549 169582,1353 169583,2735 169584,4545 169584,139010 169585,1607 169586,1390 169587,72 169588,4220 169589,328 169590,83 169591,1265 169591,1266 169592,2083 169593,1381 169594,7360 169595,379 169595,2646 169596,360 169600,240 169600,301 169600,372 169600,589 169600,801 169600,968 169600,1140 169600,1309 169600,1522 169600,1544 169600,1818 169600,1893 169600,1955 169601,1836 169603,13661 169604,44 169605,4611 169606,169607 169608,81 169608,107 169608,111 169608,233 169608,240 169608,292 169608,294 169608,298 169608,323 169608,338 169608,372 169608,390 169608,417 169608,442 169608,503 169608,525 169608,557 169608,592 169608,818 169608,862 169608,932 169608,953 169608,1046 169608,1085 169608,1133 169608,1149 169608,1179 169608,1370 169608,1392 169608,1564 169608,1580 169608,1608 169608,1635 169608,1715 169608,1749 169608,1782 169608,1818 169608,1837 169608,1893 169608,2205 169608,2209 169608,2296 169608,2334 169608,2416 169608,2417 169608,2744 169608,2812 169608,3507 169608,3538 169608,4294 169608,4355 169608,5265 169608,6068 169608,7155 169608,7233 169608,8537 169608,9021 169608,9025 169608,21711 169608,33424 169610,435 169611,1 169612,392 169612,1769 169613,477 169614,72 169615,3148 169616,1983 169617,467 169618,50 169619,163 169619,1127 169619,1893 169621,72 169622,18831 169623,366 169624,636 169624,1332 169624,1844 169625,843 169626,7416 169627,192 169627,272 169627,336 169627,337 169627,393 169627,435 169627,516 169627,663 169627,980 169627,1033 169627,1175 169627,1265 169627,1266 169627,1370 169627,1590 169627,1776 169627,4545 169627,139010 169628,366 169629,861 169630,217 169632,579 169633,1556 169634,302 169635,289 169635,290 169635,94134 169636,557 169637,1429 169638,2266 169639,217 169640,1201 169641,455 169642,34 169642,35 169643,388 169644,2421 169645,1274 169647,1 169649,596 169650,4545 169650,139010 169651,872 169652,392 169653,312 169654,358 169655,1474 169656,169657 169656,170533 169656,188832 169656,190378 169658,563 169659,8854 169661,72 169662,330 169663,875 169664,4594 169665,1177 169666,557 169667,862 169668,2775 169669,447 169670,2989 169670,2991 169671,169671 169672,83 169673,2671 169674,72 169675,169676 169677,113156 169678,596 169679,145502 169680,72 169681,72 169682,1058 169683,30 169684,875 169685,211 169685,240 169685,518 169685,1326 169685,1659 169685,6556 169686,209 169687,389 169687,455 169688,302 169689,142426 169690,2260 169691,72 169692,22 169693,1235 169693,1335 169694,875 169695,72 169696,949 169697,885 169697,13704 169698,30 169699,3182 169700,1722 169701,344 169702,138686 169703,1078 169704,72 169705,175 169706,366 169707,298 169708,435 169709,68069 169710,72 169711,72 169712,843 169713,861 169714,581 169715,48505 169716,809 169717,4771 169718,46 169719,994 169720,58 169721,169722 169723,72 169725,1068 169726,169727 169728,267 169729,106 169730,72 169731,581 169731,918 169732,72 169733,301 169734,72 169735,515 169736,72 169737,920 169739,72 169740,972 169741,72 169742,255 169743,34 169743,217 169743,536 169743,1417 169744,422 169745,56 169746,72 169747,240 169748,8854 169749,4411 169750,72 169751,330 169752,563 169753,577 169754,72 169755,388 169755,1113 169756,169757 169758,306 169758,307 169759,392 169760,900 169761,142870 169763,15609 169764,875 169765,77 169767,169768 169769,83 169770,8854 169771,169772 169773,852 169774,2590 169775,169776 169777,668 169779,72 169780,22 169781,169782 169783,862 169784,4220 169785,120774 169786,72 169787,207 169788,75912 169789,72 169790,72 169791,72 169792,872 169793,72 169794,366 169795,577 169796,366 169797,366 169798,1143 169799,1429 169800,809 169801,72 169802,104 169802,136 169802,138 169803,1893 169804,133560 169805,155481 169807,355 169808,128905 169808,173664 169808,173712 169808,189173 169809,1 169810,1085 169811,1113 169811,48505 169812,255 169813,169814 169816,6556 169819,1983 169821,209 169823,717 169824,142405 169825,2353 169826,209 169827,72 169828,760 169828,1243 169829,356 169830,875 169831,2775 169832,447 169833,875 169834,875 169835,1235 169835,1335 169837,1082 169838,809 169838,19010 169839,34 169839,35 169839,313 169839,634 169839,1313 169839,1718 169839,2224 169839,2646 169840,136072 169841,1247 169841,164572 169842,485 169843,360 169844,439 169845,640 169846,192 169847,422 169848,422 169849,422 169850,422 169851,422 169852,422 169853,422 169854,146 169854,92476 169855,647 169856,344 169857,422 169858,422 169859,1370 169860,4222 169863,1452 169863,1579 169863,2312 169864,685 169864,1688 169865,252 169865,1220 169865,1222 169865,2400 169865,108042 169865,165762 169865,190346 169866,3623 169867,1011 169867,1381 169867,3999 169868,169869 169870,422 169871,1238 169872,1072 169872,13661 169873,626 169874,155481 169875,1289 169876,622 169877,138686 169878,75912 169879,313 169880,175 169881,13661 169882,107 169882,805 169883,980 169884,298 169885,1276 169886,497 169888,2671 169889,1177 169889,2210 169889,182162 169890,752 169891,1608 169892,1132 169893,2775 169894,447 169895,784 169896,818 169897,289 169897,290 169897,2296 169897,94134 169901,302 169902,1452 169904,146 169904,92476 169905,647 169906,344 169907,596 169908,1715 169909,151 169909,788 169910,1240 169911,1177 169911,6263 169912,2989 169912,2991 169913,602 169914,1096 169915,1425 169916,68 169917,805 169918,1132 169919,1282 169920,2775 169921,447 169922,3623 169923,626 169924,1151 169925,781 169926,302 169927,1370 169928,1140 169929,3724 169930,22 169931,1033 169932,3623 169933,779 169936,557 169937,169938 169939,192 169940,18831 169941,1608 169942,304 169942,356 169942,852 169943,302 169945,875 169947,222 169947,657 169947,1019 169947,1871 169947,2266 169947,6789 169948,818 169948,127158 169949,1893 169950,138686 169951,175 169953,298 169954,195 169954,406 169954,599 169954,640 169957,1072 169958,3623 169959,22524 169960,1634 169962,360 169962,589 169963,1608 169964,1132 169965,1319 169966,34 169966,35 169966,406 169967,79 169968,145240 169969,72 169970,818 169971,698 169971,873 169972,392 169972,1240 169973,743 169974,72 169975,3623 169976,392 169978,200 169980,72 169982,4771 169983,22 169984,145751 169985,1509 169986,355 169986,4571 169987,1608 169988,920 169989,5591 169990,718 169991,932 169991,991 169991,2416 169991,2417 169991,5908 169992,209 169993,657 169994,1332 169994,145524 169995,611 169996,1370 169997,622 169999,163 169999,305 169999,489 169999,1132 169999,3003 170000,779 170000,21442 170002,79 170002,127158 170003,1175 170005,1019 170006,1085 170007,19010 170008,72 170009,155481 170010,158 170010,366 170010,694 170011,2244 170012,1436 170012,1882 170013,1140 170014,592 170015,155481 170016,1359 170017,23783 170018,850 170019,1984 170020,72 170021,2590 170022,72 170023,72 170024,298 170025,485 170027,113156 170028,298 170029,485 170030,980 170031,557 170032,240 170032,818 170032,1285 170032,1807 170032,1888 170032,127158 170032,179804 170033,697 170034,192 170035,392 170036,192 170036,1033 170038,811 170039,435 170040,1319 170041,240 170042,155481 170044,72 170045,467 170046,1801 170047,289 170047,290 170047,94134 170048,83 170048,278 170049,302 170050,30 170051,4545 170051,139010 170052,301 170053,795 170054,968 170055,510 170056,170057 170058,1893 170059,861 170060,255 170062,138686 170063,175 170064,1893 170065,72 170066,298 170067,505 170068,87 170069,392 170070,202 170071,72 170072,170073 170074,72 170075,392 170076,155481 170077,809 170078,467 170079,752 170080,44 170081,72 170082,72 170083,294 170083,631 170084,302 170085,72 170087,392 170087,2699 170088,72 170089,170090 170092,72 170093,298 170094,485 170095,2367 170096,298 170097,485 170098,1522 170099,1285 170100,577 170101,72 170103,5375 170104,1368 170105,338 170106,72 170107,170108 170109,9343 170110,1836 170111,72 170112,107 170113,68069 170114,1001 170115,5987 170116,3623 170117,875 170118,109503 170119,809 170120,1425 170121,304 170122,72 170124,63 170124,202 170124,251 170124,346 170125,422 170126,56 170127,72 170128,489 170129,328 170129,704 170129,134822 170130,30 170131,13 170132,83 170133,704 170133,134822 170134,1265 170134,1266 170135,1177 170136,206 170136,254 170137,2373 170139,8719 170140,8719 170141,557 170142,138 170143,865 170144,557 170145,137 170146,118 170146,4597 170147,88820 170148,72 170149,285 170149,406 170149,620 170149,779 170149,118336 170149,149534 170150,602 170151,30236 170152,269 170153,3003 170154,563 170155,304 170156,83 170157,1220 170157,1222 170158,516 170159,252 170160,422 170161,56 170162,1179 170163,5310 170164,1133 170165,170166 170167,1773 170168,1474 170169,332 170170,72 170171,170172 170173,360 170174,718 170175,72 170176,467 170177,1235 170177,1335 170178,358 170179,1531 170180,489 170182,483 170183,697 170184,779 170186,1551 170187,1247 170187,164572 170188,207 170189,292 170190,72 170191,170192 170193,868 170194,30 170195,328 170196,267 170197,1608 170198,1132 170199,170200 170201,2353 170202,30 170203,175 170204,107 170205,30 170206,30 170207,30 170208,30 170209,2671 170210,247 170211,900 170212,1181 170213,30 170214,918 170215,30 170216,577 170217,2116 170218,225 170219,30 170220,30 170221,1659 170222,30 170223,170224 170225,8884 170226,536 170228,703 170228,784 170229,704 170230,3846 170231,3538 170232,358 170233,134 170234,366 170235,30 170236,1167 170236,1241 170236,2083 170237,2105 170239,310 170239,657 170239,818 170239,1010 170239,25222 170240,171 170241,1085 170242,1849 170243,302 170245,104 170246,422 170247,56 170248,366 170249,366 170250,72 170251,8270 170252,170253 170254,743 170255,83 170256,485 170257,298 170258,934 170259,30 170260,72 170261,72 170262,158 170263,72 170264,2353 170265,493 170267,2719 170268,366 170269,137 170270,72 170271,55849 170272,980 170273,972 170273,1010 170274,72 170275,640 170275,805 170276,30 170277,3623 170278,1143 170279,142433 170281,158 170282,72 170283,298 170284,485 170285,72 170286,79 170287,72 170288,44 170290,55849 170291,6252 170292,72 170293,170294 170295,72 170296,170297 170298,170297 170299,170297 170300,1773 170301,72 170302,592 170304,2135 170305,1001 170306,72 170307,515 170308,72 170309,138686 170310,175 170311,298 170312,358 170313,170314 170315,170316 170317,3623 170317,171641 170318,3623 170319,30 170320,3623 170321,3623 170322,994 170323,1149 170324,58 170325,1479 170326,4223 170327,390 170328,298 170329,485 170330,994 170331,72 170333,485 170334,298 170335,485 170336,72 170337,358 170338,170339 170340,344 170341,5101 170341,15119 170342,298 170343,485 170346,483 170348,875 170349,1284 170350,72 170351,170352 170353,602 170354,602 170355,269 170356,602 170357,7124 170358,602 170359,850 170360,170361 170362,72 170363,366 170364,366 170365,366 170366,83 170369,170370 170371,50 170372,170373 170374,170375 170377,83 170378,107 170379,2416 170379,2417 170380,292 170381,338 170383,298 170384,1133 170385,3538 170386,170387 170390,392 170391,1893 170393,170394 170393,228610 170395,83 170397,2334 170398,1220 170398,1222 170399,516 170400,252 170401,843 170402,5726 170403,1011 170404,170405 170406,1381 170407,1458 170408,170409 170411,30 170412,994 170413,1 170414,192 170414,336 170414,1623 170415,15748 170416,2146 170417,170418 170419,1146 170420,749 170421,366 170422,126 170423,2244 170425,1058 170426,170427 170429,30 170430,170431 170432,103860 170433,1363 170434,170435 170436,1544 170437,48 170438,1238 170439,138686 170440,175 170441,298 170442,170443 170444,440 170445,3209 170448,3422 170449,72 170452,170453 170454,358 170455,994 170456,392 170457,170458 170459,1984 170461,462 170462,144962 170462,173366 170463,55849 170464,557 170465,557 170466,557 170467,72 170468,535 170469,485 170470,298 170471,510 170472,620 170473,41 170474,72 170476,170477 170478,505 170478,33298 170479,447 170480,2775 170481,20004 170483,126 170485,592 170486,328 170487,30 170488,142473 170490,602 170491,106 170491,178 170491,393 170491,439 170491,538 170491,1033 170492,269 170493,483 170494,149 170495,149 170496,104 170496,136 170496,225 170496,248 170496,254 170496,557 170496,953 170496,954 170496,1179 170496,1332 170496,1368 170496,1939 170496,9010 170496,10318 170497,30 170498,170499 170500,170501 170502,1247 170502,164572 170504,30 170505,30 170506,30 170507,200 170508,4545 170508,139010 170509,393 170510,292 170511,294 170512,296 170513,298 170514,366 170515,366 170516,366 170517,366 170518,366 170519,366 170520,366 170521,147 170522,671 170523,184 170524,147 170525,83 170527,4165 170528,22 170529,698 170530,1085 170530,1522 170532,355 170534,818 170535,195 170536,2421 170538,30 170539,48 170541,1238 170542,315 170543,22 170543,861 170544,30 170545,48 170546,718 170547,718 170548,1452 170549,147191 170550,1801 170552,1181 170553,63 170553,3218 170555,170556 170557,113156 170558,579 170559,2353 170560,83 170562,422 170562,620 170562,1425 170562,1515 170562,21442 170563,1151 170564,147191 170565,312 170566,142433 170567,640 170568,640 170569,640 170570,145240 170571,640 170572,48 170573,811 170574,255 170575,109503 170576,422 170577,387 170578,422 170579,422 170580,422 170581,422 170582,422 170583,422 170584,422 170585,801 170586,422 170587,422 170588,356 170589,392 170590,1122 170591,422 170592,640 170593,640 170594,137 170595,41 170595,68 170595,233 170595,1085 170595,1119 170595,1132 170595,1608 170595,1745 170595,3135 170595,75912 170596,1522 170597,251 170597,1363 170598,170599 170600,994 170601,994 170601,1235 170601,1335 170602,48 170603,671 170605,30 170606,107 170607,175 170609,138 170610,126 170611,55849 170613,2048 170613,6279 170614,55849 170615,1983 170617,48 170618,1132 170619,1608 170621,752 170622,1149 170624,875 170625,158 170625,500 170627,1363 170629,2373 170630,1608 170631,1132 170633,170634 170635,5469 170636,843 170638,73570 170639,138686 170640,779 170642,175 170643,167 170644,1425 170645,298 170646,147 170646,1381 170646,2116 170647,120 170647,240 170647,406 170647,877 170649,2373 170650,21442 170651,929 170653,784 170654,358 170655,2373 170656,99 170657,30331 170658,811 170659,875 170660,634 170661,171 170662,406 170662,602 170665,676 170665,2373 170666,1623 170667,298 170668,2373 170669,1033 170670,1010 170671,1776 170672,872 170673,690 170674,489 170675,872 170676,1010 170677,489 170678,707 170679,707 170680,3629 170680,3836 170680,6424 170680,23311 170680,26249 170680,60781 170680,76819 170680,124423 170680,127170 170680,137578 170680,170681 170680,172665 170680,176040 170680,183942 170680,183943 170680,183944 170680,183946 170680,183947 170680,183948 170680,183949 170680,183950 170680,183951 170680,183952 170680,184766 170680,189156 170680,189768 170680,189770 170680,190279 170680,190285 170680,190288 170680,192909 170680,193498 170680,212357 170680,220431 170680,225576 170680,250659 170680,254871 170680,258186 170682,5405 170683,718 170686,563 170687,356 170687,48505 170687,141912 170688,30 170689,1688 170690,811 170692,145240 170693,99 170695,2460 170696,30 170697,1309 170698,3328 170704,346 170705,30 170706,586 170707,3135 170708,1955 170709,81 170710,58 170711,994 170712,46 170713,1 170714,4223 170715,170716 170717,138686 170718,175 170720,298 170721,104 170721,111 170721,240 170721,1085 170721,1181 170721,1462 170721,1818 170721,8537 170722,22 170723,192 170724,1151 170726,586 170727,269 170728,1955 170729,301 170729,937 170729,968 170729,1293 170729,1782 170729,21435 170729,37983 170729,134681 170729,142806 170729,177568 170729,218675 170729,220326 170729,221828 170729,221920 170729,224790 170729,227376 170729,241017 170729,241141 170729,243302 170729,245835 170729,245850 170730,3623 170731,1749 170733,192 170734,818 170735,55849 170737,760 170738,298 170739,485 170741,3769 170742,1284 170743,1 170744,80469 170745,809 170746,149 170746,622 170747,818 170748,170090 170749,5405 170752,2775 170753,447 170754,717 170755,252 170756,170757 170758,206 170758,240174 170759,872 170760,392 170761,141912 170762,1276 170763,209 170764,779 170766,305 170768,137 170768,649 170769,392 170770,1707 170771,273 170771,36985 170772,994 170775,302 170776,704 170777,195 170778,1274 170780,302 170781,44 170782,147 170782,406 170782,779 170782,1515 170784,718 170786,3695 170787,4545 170787,139010 170788,932 170789,195 170790,3623 170791,146 170791,92476 170792,647 170793,344 170794,957 170794,1247 170794,1815 170794,164572 170795,314 170796,483 170797,137 170799,146 170799,92476 170800,647 170801,344 170804,516 170805,3623 170806,83 170806,2671 170807,1220 170807,1222 170808,516 170809,252 170810,301 170812,516 170813,126 170813,462 170813,872 170813,1151 170815,55849 170816,1893 170817,483 170819,717 170820,304 170821,170821 170822,37 170823,1289 170824,7 170825,3999 170826,14366 170827,1509 170829,1381 170830,718 170832,23783 170833,10 170835,158 170835,640 170835,1572 170836,1284 170837,875 170838,485 170839,298 170840,707 170841,1955 170842,1220 170842,1222 170843,252 170844,516 170845,885 170845,13704 170846,1623 170847,2931 170849,1623 170850,30 170851,571 170852,752 170853,733 170853,1140 170855,2373 170856,749 170857,1149 170858,1332 170859,202 170860,145240 170861,3804 170862,467 170863,72 170864,285 170865,344 170866,8854 170867,1309 170868,30 170869,333 170870,298 170871,485 170872,2989 170872,2991 170873,671 170875,2146 170876,852 170877,301 170878,55849 170879,1858 170880,1860 170882,577 170882,1429 170884,72 170885,83 170886,588 170886,590 170887,1419 170888,104 170889,563 170890,1085 170891,779 170892,30 170893,30 170894,1893 170895,30 170897,207 170897,852 170898,1849 170899,358 170900,30 170901,30 170902,850 170903,55849 170904,30 170904,328 170905,994 170906,1368 170907,1955 170908,302 170909,702 170909,873 170910,170911 170910,176592 170910,184423 170910,188308 170910,218339 170910,229433 170910,243505 170912,592 170913,435 170914,1119 170914,1282 170914,2205 170914,33424 170915,1983 170916,2411 170917,602 170918,1133 170919,147 170919,417 170919,1635 170920,843 170921,707 170922,1983 170923,1983 170924,278 170925,68 170926,602 170927,240 170928,1 170928,149 170928,602 170928,1425 170929,2292 170930,3218 170931,861 170932,850 170933,215 170934,301 170935,170936 170937,525 170938,55849 170939,1309 170940,1285 170941,1509 170942,346 170943,631 170944,294 170945,1359 170946,30 170947,126 170947,118336 170948,298 170949,255 170950,30 170951,968 170952,90845 170953,30 170954,30 170955,330 170956,150313 170957,30 170958,602 170959,602 170960,30 170961,467 170962,30 170963,424 170964,2048 170965,252 170966,13 170967,2146 170968,77 170969,1653 170970,442 170971,392 170972,2266 170973,1467 170974,1556 170975,247 170976,920 170977,388 170978,843 170979,2424 170980,1235 170980,1335 170981,861 170982,3 170983,875 170984,167 170984,1544 170986,170987 170988,170989 170990,13980 170991,68 170992,1707 170993,171 170994,602 170995,79 170996,79 170997,366 170998,366 170999,366 171000,932 171001,366 171002,366 171003,390 171004,72 171005,30 171006,355 171007,536 171008,83 171009,1653 171010,972 171011,2292 171013,55849 171014,477 171014,644 171014,2944 171015,192 171015,1294 171019,209 171021,302 171022,1220 171022,1222 171024,79 171025,31977 171026,1773 171027,1309 171028,323 171029,707 171030,2590 171031,718 171032,225 171033,269 171033,313 171033,949 171035,707 171036,1012 171037,83 171038,171039 171040,309 171040,310 171041,2296 171042,30 171042,328 171043,640 171044,2184 171044,148365 171044,171041 171045,77 171046,158 171046,252 171046,309 171046,310 171046,622 171046,1749 171047,1359 171048,1707 171049,1858 171050,1860 171051,360 171052,717 171052,1326 171053,589 171053,75912 171054,640 171055,195 171055,336 171056,493 171056,1425 171057,68 171058,10 171059,252 171060,1243 171061,3999 171062,1132 171063,1608 171064,3218 171065,907 171066,422 171067,422 171068,422 171070,422 171071,422 171072,422 171073,422 171074,422 171075,83 171076,30331 171077,422 171078,360 171078,4571 171079,217 171080,34 171080,35 171081,4637 171082,1072 171083,455 171084,2266 171085,1201 171086,1274 171087,1429 171088,2421 171089,120 171090,107 171090,240 171091,920 171092,422 171093,422 171094,138686 171095,467 171096,175 171097,602 171098,602 171099,3252 171100,2944 171101,3238 171102,298 171103,1619 171103,1623 171104,134 171106,422 171107,784 171108,808 171110,422 171111,707 171112,685 171113,171 171114,336 171115,278 171116,147 171116,158 171117,272 171118,171119 171120,718 171121,217 171122,13661 171123,301 171124,1124 171125,2671 171126,929 171127,2671 171128,2590 171129,872 171129,127158 171130,30 171131,877 171132,609 171134,30 171134,175 171134,227 171134,1179 171134,2782 171134,3148 171134,6051 171134,8501 171134,14472 171134,27834 171135,79 171136,893 171137,97 171137,1659 171138,7698 171139,1147 171140,63471 171141,292 171142,292 171143,60576 171144,60576 171146,171 171147,86416 171148,167 171150,1801 171151,209 171152,346 171153,356 171154,422 171155,1011 171156,561 171156,911 171157,1858 171158,1860 171159,41 171160,2775 171161,447 171162,355 171163,292 171165,623 171166,146 171166,92476 171167,647 171168,344 171170,30 171171,3538 171172,147 171172,158 171172,333 171172,435 171172,15573 171173,875 171174,1688 171175,134 171176,2353 171177,720 171179,1241 171180,72 171181,2646 171181,2775 171182,1359 171183,852 171184,146 171184,92476 171185,647 171186,344 171187,577 171188,843 171189,3769 171190,5405 171191,30 171192,72764 171193,1201 171194,2775 171195,919 171196,1522 171197,138686 171198,175 171200,298 171201,6424 171202,1087 171204,73570 171205,59021 171207,200 171208,32 171208,440 171209,634 171209,1083 171209,171210 171211,202 171212,273 171213,868 171214,393 171215,217 171215,949 171215,1019 171216,336 171217,406 171218,592 171219,1556 171220,4771 171221,217 171221,949 171221,1019 171221,5976 171222,349 171223,83 171224,949 171224,4252 171225,302 171226,30 171227,8822 171228,1858 171229,1860 171230,272 171231,104 171232,83 171232,1014 171233,485 171234,298 171236,143287 171237,298 171238,485 171239,1151 171240,1149 171241,861 171242,579 171243,1556 171244,217 171245,1012 171246,48 171247,111924 171248,1118 171249,999 171249,4355 171250,849 171250,1011 171250,2083 171251,1707 171253,285 171254,779 171255,1019 171256,209 171257,435 171258,134 171258,248 171259,1 171260,206 171260,2073 171260,2626 171260,13910 171260,142426 171262,2353 171263,2312 171264,298 171265,485 171266,726 171267,15573 171268,406 171268,920 171269,19227 171270,483 171271,2480 171272,83 171273,83 171274,217 171275,278 171276,843 171277,356 171278,515 171279,647 171280,515 171281,9098 171282,515 171283,8270 171284,4571 171285,1858 171286,1860 171287,302 171288,158 171288,406 171289,171290 171292,22 171292,760 171292,818 171293,200 171295,301 171295,73570 171296,1127 171298,200 171299,697 171300,222 171300,657 171300,2266 171301,577 171302,72 171303,7416 171304,1634 171305,366 171306,920 171307,843 171307,2373 171308,417 171308,525 171308,1818 171309,287 171310,861 171311,171312 171313,1132 171314,3623 171315,3623 171316,2620 171317,415 171319,861 171320,155481 171321,252 171321,516 171322,760 171323,8854 171324,1007 171325,1309 171326,1294 171327,4571 171328,252 171329,861 171330,1274 171331,126 171332,2210 171332,4237 171333,252 171333,516 171334,467 171336,1417 171337,388 171338,636 171339,171340 171341,1326 171342,21408 171343,932 171344,717 171345,712 171346,211 171347,298 171348,485 171349,7092 171350,30 171351,7092 171352,577 171353,44 171354,2168 171355,2828 171356,259 171356,467 171356,868 171357,2373 171358,3260 171359,298 171360,485 171361,195 171361,55849 171362,298 171363,485 171364,30 171366,8270 171369,332 171370,1274 171372,805 171373,171374 171375,252 171375,516 171376,2867 171376,2868 171377,289 171377,290 171377,94134 171378,298 171379,485 171380,30 171381,255 171382,72 171383,602 171384,1274 171385,5213 171386,707 171387,30 171388,211 171388,808 171389,366 171390,1782 171391,1274 171392,1284 171393,2557 171394,366 171395,30 171396,2979 171397,301 171398,1522 171399,86 171400,907 171401,167 171402,298 171403,485 171404,2083 171405,30 171406,577 171407,30 171408,602 171409,631 171410,30 171411,171412 171413,1001 171414,406 171415,444 171416,1274 171417,1425 171418,1381 171418,3258 171419,147 171419,158 171419,406 171419,779 171419,1019 171419,1247 171419,1515 171419,73570 171419,164572 171420,704 171421,30 171422,171423 171424,192 171424,973 171424,1414 171425,34 171425,35 171425,313 171425,13575 171426,171427 171428,30 171429,301 171430,302 171431,1773 171432,30 171433,30 171434,2923 171435,333 171438,1803 171439,2775 171440,447 171441,30 171442,278 171443,366 171444,2312 171446,255 171447,30 171448,1381 171449,113156 171450,273 171451,4222 171452,267 171453,30 171454,30 171455,5213 171456,30 171457,3623 171459,30 171460,30 171461,30 171462,134 171463,137 171464,628 171465,885 171465,13704 171466,1608 171467,167 171467,1241 171467,1837 171467,2083 171468,435 171469,72 171470,30 171471,30 171472,30 171473,30 171474,563 171475,86 171475,167 171475,301 171475,589 171475,605 171475,615 171475,907 171475,973 171475,1001 171475,1124 171475,1167 171475,1241 171475,1284 171475,1522 171475,1782 171475,1785 171475,1955 171475,2083 171475,2557 171475,2979 171475,3193 171476,30 171477,30 171478,563 171479,900 171480,30 171481,30 171482,30 171483,818 171484,1858 171485,1860 171486,146 171486,92476 171487,647 171488,344 171489,30 171489,1001 171490,30 171491,323 171492,1803 171493,269 171494,1181 171495,424 171496,323 171497,516 171498,30 171499,30 171500,861 171501,1749 171501,1785 171501,2334 171502,1556 171503,269 171504,1001 171504,2590 171505,30 171506,323 171507,1821 171508,83 171509,7 171509,211 171510,467 171511,171512 171514,171515 171516,8270 171517,72 171518,30 171519,779 171520,510 171521,323 171522,1844 171523,323 171524,393 171525,577 171526,323 171527,21408 171528,323 171529,1181 171530,323 171532,485 171533,298 171534,1707 171535,355 171536,1188 171537,366 171538,171539 171540,1247 171540,164572 171541,366 171542,366 171543,366 171546,779 171547,171548 171549,1284 171550,79 171553,3507 171554,1639 171555,862 171556,323 171559,1238 171560,32 171560,392 171562,30 171563,200 171564,1452 171565,30 171566,83 171568,294 171568,631 171569,893 171570,83 171574,83 171575,323 171576,323 171577,1860 171579,2837 171582,2989 171582,2991 171583,2083 171586,83 171588,1274 171590,30 171591,462 171594,5213 171595,38158 171596,406 171597,577 171598,145240 171599,104 171600,209 171601,202 171602,579 171603,415 171604,30 171605,30 171606,305 171607,1877 171608,726 171609,467 171610,920 171611,489 171612,38711 171613,1882 171614,516 171615,138686 171616,2334 171617,175 171618,1449 171619,298 171620,1212 171621,115474 171622,852 171622,1782 171623,640 171626,1293 171626,1300 171628,489 171629,760 171630,202 171631,58 171632,151 171633,136 171634,119 171635,30 171636,640 171637,146 171637,92476 171638,647 171639,344 171641,10 171641,425 171641,446 171641,783 171641,937 171641,972 171641,1010 171641,1085 171641,1122 171641,1284 171641,1849 171641,15277 171641,24924 171641,124668 171641,127158 171641,131828 171641,171641 171641,171642 171641,183448 171641,183737 171641,225708 171641,225719 171641,226471 171641,226498 171641,226512 171641,226513 171641,226516 171641,226519 171641,226936 171641,227005 171641,227006 171641,228237 171641,228319 171641,228322 171641,228369 171641,228414 171641,228430 171641,228449 171641,230937 171641,230950 171641,232745 171641,232771 171641,232812 171641,232822 171641,236626 171641,237320 171641,247887 171645,718 171646,489 171647,21442 171648,240 171648,269 171648,439 171648,1181 171648,1531 171648,2812 171649,392 171650,171 171651,1149 171652,718 171653,2574 171654,3413 171655,525 171656,1359 171657,256 171657,703 171657,874 171658,1983 171660,4611 171661,1544 171662,577 171664,4611 171665,1544 171666,4611 171667,1544 171668,4611 171669,1544 171670,4611 171671,872 171672,1544 171673,503 171674,111 171676,278 171677,158 171678,138686 171679,592 171680,175 171681,8822 171682,298 171683,2411 171684,1 171685,1282 171686,809 171687,222 171688,2775 171689,447 171690,13910 171691,626 171691,1571 171691,1634 171691,124668 171692,58 171692,118 171692,272 171692,422 171692,647 171692,4597 171693,707 171694,707 171696,1058 171700,171 171702,636 171705,3474 171706,4594 171707,590 171707,1419 171708,389 171709,500 171710,115474 171711,577 171712,328 171713,1659 171714,68 171716,1146 171717,298 171718,485 171719,145240 171720,1289 171721,2146 171722,134 171723,30 171724,83 171725,1983 171726,135 171726,2210 171726,4237 171726,182162 171728,298 171729,485 171731,647 171732,146 171732,92476 171733,344 171735,3474 171738,1085 171739,435 171739,1033 171740,8541 171741,171742 171743,1274 171744,657 171745,22 171746,631 171747,483 171748,118336 171748,141912 171749,158 171750,58 171751,171752 171754,202 171755,602 171756,4805 171757,195 171757,885 171757,13704 171758,430 171759,148412 171760,356 171760,138686 171761,149 171761,118336 171762,861 171763,30 171764,109503 171764,156379 171765,142426 171767,2979 171768,302 171769,991 171769,1188 171769,172012 171771,302 171773,302 171774,1452 171776,1769 171777,809 171778,30 171778,685 171778,1188 171778,13538 171779,6556 171781,171782 171783,861 171784,1135 171785,1608 171786,1135 171788,138686 171790,175 171792,298 171793,525 171795,149 171795,269 171795,406 171796,54 171797,602 171798,1773 171799,217 171799,1019 171799,1417 171800,32 171800,217 171800,222 171800,264 171800,349 171800,515 171800,697 171800,736 171800,779 171800,809 171800,872 171800,1019 171800,1143 171800,1363 171802,302 171803,602 171806,269 171807,647 171808,146 171808,92476 171809,344 171810,217 171810,240 171810,292 171810,861 171811,1298 171812,602 171815,30 171816,1608 171818,515 171819,269 171820,294 171821,801 171821,2436 171822,2443 171823,366 171824,602 171825,30 171826,30 171827,589 171828,1274 171829,272 171829,934 171829,1449 171830,861 171831,278 171832,2421 171833,2367 171834,859 171835,602 171836,433 171837,30 171838,366 171838,500 171839,2379 171840,3 171841,5906 171842,557 171843,278 171844,626 171845,137 171846,862 171847,298 171848,885 171848,13704 171849,861 171850,30 171851,1212 171852,366 171853,30 171854,366 171855,171856 171857,366 171858,72 171859,366 171860,366 171861,72 171862,392 171863,171864 171865,1544 171865,2083 171866,72 171867,315 171868,433 171869,323 171870,315 171871,932 171873,30 171874,233 171875,217 171875,240 171875,301 171875,372 171875,631 171875,1001 171875,1010 171875,1085 171875,1522 171875,1715 171876,72 171877,1298 171878,518 171880,30 171881,392 171881,467 171882,3623 171883,455 171885,184 171886,1368 171887,72 171888,10 171889,3623 171890,44 171891,72 171892,248 171893,1085 171894,30 171895,247 171895,2867 171895,2868 171896,171897 171898,72 171899,333 171900,171901 171902,171901 171903,467 171904,72 171905,113156 171906,30 171907,30 171908,483 171909,171910 171911,805 171912,30 171913,171914 171915,124668 171916,422 171917,278 171918,30 171919,1452 171919,1579 171919,2312 171920,893 171921,372 171921,1085 171922,72 171923,298 171924,485 171925,1639 171926,22 171927,3 171927,304 171928,920 171929,1983 171930,1058 171931,72 171932,1634 171933,536 171934,2116 171935,22 171935,760 171935,818 171936,918 171937,1 171938,406 171939,2620 171940,1474 171941,247 171942,366 171943,843 171944,366 171945,10 171946,1359 171948,30 171949,366 171950,171951 171952,893 171953,852 171954,366 171955,563 171956,330 171957,323 171959,83 171960,1 171961,30 171962,5405 171963,15748 171965,171966 171967,171968 171969,301 171969,968 171969,1293 171970,171971 171972,171973 171974,31977 171975,581 171976,240 171977,171978 171979,2379 171980,171981 171982,2590 171983,72 171984,302 171985,255 171986,323 171987,278 171988,95554 171989,72 171990,255 171991,83 171992,171993 171994,171993 171995,2590 171996,602 171997,323 171998,171999 172000,118 172001,217 172001,422 172001,760 172001,1019 172002,172003 172005,172006 172007,146 172007,424 172007,92476 172008,10 172009,2371 172010,355 172011,328 172011,1179 172011,1305 172011,2701 172011,7124 172012,784 172012,4218 172012,4220 172013,172014 172013,184262 172013,197324 172013,218587 172016,30 172017,46 172018,100450 172019,38711 172020,34 172020,35 172022,640 172023,358 172024,749 172025,172026 172027,337 172028,599 172030,1707 172031,298 172032,485 172033,393 172034,298 172035,485 172036,431 172036,949 172037,920 172038,388 172039,115659 172039,142870 172040,255 172041,107 172042,868 172043,811 172043,1603 172044,2367 172045,83 172046,72 172047,1122 172049,72 172050,577 172052,337 172053,337 172054,640 172055,808 172056,640 172057,337 172058,1326 172059,835 172060,1623 172062,313 172063,835 172064,406 172065,5310 172066,58 172067,994 172068,46 172069,338 172070,209 172072,138686 172073,175 172074,920 172075,626 172076,298 172077,192 172078,254 172079,4611 172080,1544 172081,467 172082,2979 172083,1612 172084,1151 172085,298 172086,485 172087,337 172088,2292 172089,252 172090,1515 172091,4678 172093,145240 172095,217 172096,811 172097,30 172098,2671 172099,30 172103,6506 172104,462 172105,7360 172107,1140 172107,2443 172107,3474 172107,3538 172109,2312 172110,1135 172112,1608 172113,56 172114,843 172116,172117 172118,1 172119,516 172120,209 172121,1836 172122,392 172123,146280 172123,159365 172123,186045 172124,136 172125,55849 172126,298 172127,485 172128,602 172129,302 172129,811 172130,760 172132,749 172133,1181 172134,298 172135,485 172136,1 172137,209 172139,835 172140,209 172141,240 172141,298 172142,261 172143,55849 172144,687 172145,56 172146,1274 172147,138686 172148,175 172149,172150 172151,333 172151,2979 172152,298 172153,55849 172154,5405 172155,55849 172156,81 172156,663 172156,4545 172156,139010 172157,240 172158,252 172159,1326 172160,707 172161,72 172162,5405 172163,647 172164,344 172166,146 172166,92476 172168,623 172169,3209 172170,1474 172171,252 172172,473 172173,1 172174,192 172175,147 172176,4611 172177,1544 172178,313 172179,4611 172180,1544 172181,150038 172182,79 172183,442 172186,309 172186,310 172187,172188 172187,226482 172187,227987 172189,1955 172190,1359 172191,1773 172193,6556 172194,1326 172195,433 172196,172197 172198,1181 172199,251 172200,50 172200,3695 172201,447 172202,2775 172203,6955 172204,240 172205,4594 172206,120 172207,919 172208,172012 172209,5405 172210,172211 172212,151 172212,192 172212,309 172212,310 172212,577 172212,1400 172213,302 172214,2775 172215,447 172216,158 172217,323 172218,104 172218,134 172218,135 172219,360 172219,1127 172219,1893 172219,21408 172220,15 172220,1653 172221,1891 172222,861 172224,457 172224,2460 172224,4190 172224,26450 172225,623 172226,1058 172227,919 172228,634 172229,1458 172230,972 172231,1274 172233,843 172234,5591 172235,30 172236,323 172237,1240 172238,500 172239,83 172240,623 172241,697 172241,1769 172242,852 172243,176782 172244,485 172245,298 172246,673 172247,861 172249,932 172250,163 172250,736 172251,510 172251,3182 172252,103860 172255,435 172256,868 172257,48505 172258,5405 172259,302 172259,861 172260,875 172261,861 172262,5591 172263,1298 172264,2574 172265,211 172265,59434 172265,75140 172265,84903 172265,234524 172266,843 172267,172268 172269,255 172270,172150 172273,366 172274,302 172275,146 172275,92476 172276,647 172277,344 172278,68 172278,563 172278,1385 172278,1837 172279,104 172279,868 172279,872 172279,1326 172279,1796 172279,3804 172280,493 172280,1265 172280,1266 172281,577 172282,305 172282,841 172282,3695 172282,7429 172283,83 172284,843 172285,290 172285,344 172285,94134 172286,172287 172286,217313 172288,2210 172288,4237 172289,1001 172290,72 172291,467 172292,172293 172294,907 172294,2191 172295,861 172296,217 172296,1417 172297,862 172298,1265 172298,1266 172299,718 172300,227 172301,130 172302,34 172302,35 172302,250 172302,1684 172303,72 172304,302 172305,83 172306,536 172307,217 172308,3 172310,885 172310,13704 172311,1282 172312,1007 172313,1749 172314,72 172315,1252 172315,1253 172316,30 172317,435 172318,515 172319,302 172320,875 172321,920 172322,68 172323,861 172324,843 172325,1085 172326,1608 172327,1132 172328,146 172328,92476 172329,72 172330,366 172331,392 172332,467 172333,146 172333,92476 172334,344 172335,647 172336,278 172336,356 172336,536 172336,577 172336,1429 172337,841 172338,30 172339,72 172340,980 172341,252 172342,1235 172342,1335 172343,44 172344,4594 172345,932 172346,30331 172347,323 172347,595 172347,736 172347,1509 172347,1551 172348,31977 172349,417 172350,3623 172351,309 172351,310 172351,579 172351,1010 172352,733 172353,358 172354,5101 172355,707 172356,707 172357,2373 172358,557 172359,862 172360,202 172361,2367 172363,1058 172365,172366 172367,14231 172368,577 172369,86 172370,996 172371,483 172372,872 172373,172374 172375,30 172376,1072 172377,861 172378,83 172379,32 172381,50 172381,79 172381,406 172381,493 172381,585 172381,586 172381,592 172381,1247 172381,1265 172381,1266 172381,1985 172381,2931 172381,19031 172381,164572 172382,10 172382,3297 172383,387 172383,22071 172385,172386 172387,920 172388,1608 172389,2797 172390,147 172391,298 172392,485 172393,1274 172394,83 172395,2735 172396,301 172396,372 172396,801 172396,907 172396,968 172396,1140 172396,1241 172396,1309 172396,1544 172396,1837 172396,1893 172396,1955 172397,172398 172399,392 172399,1151 172400,1298 172401,485 172402,298 172403,602 172404,389 172405,30 172406,424 172407,861 172408,289 172408,290 172408,94134 172409,1571 172410,2274 172411,577 172412,79 172413,72 172414,424 172415,172416 172417,172418 172419,72 172420,306 172420,307 172421,366 172422,8854 172423,72 172424,366 172425,424 172426,77 172427,2572 172428,172429 172430,269 172431,1274 172432,172433 172432,247600 172434,172433 172435,172433 172435,247600 172436,172433 172437,172438 172439,120 172440,640 172441,636 172442,172443 172444,1849 172445,932 172446,364 172447,1133 172448,58 172449,850 172450,2205 172450,33424 172451,994 172452,172453 172455,255 172456,21442 172457,72 172458,30 172459,172460 172461,323 172462,1284 172463,28072 172464,640 172465,1566 172466,640 172467,366 172468,30 172469,1133 172470,323 172473,536 172474,301 172474,589 172474,838 172474,972 172474,1284 172474,1715 172474,4286 172474,30373 172474,65897 172474,73570 172474,75912 172474,138136 172474,144121 172474,164915 172474,166453 172475,577 172476,355 172477,273 172478,4545 172478,139010 172479,30 172480,140 172481,515 172482,30 172483,30 172485,141912 172486,37088 172487,4771 172488,3467 172489,2319 172490,146 172490,92476 172491,647 172492,344 172494,795 172494,980 172494,1293 172494,2979 172494,3804 172495,71 172496,516 172497,1191 172498,733 172498,818 172499,1309 172500,83 172501,483 172501,6556 172503,172504 172506,310 172508,79 172509,640 172511,138686 172512,217 172512,1417 172513,673 172515,160 172515,457 172515,1381 172516,172517 172518,415 172518,16687 172519,1132 172520,1608 172521,41 172522,301 172522,1010 172522,75912 172522,127158 172524,3949 172525,586 172526,1238 172527,106 172529,195 172530,2671 172532,467 172533,920 172535,138686 172536,2737 172537,175 172538,254 172539,298 172540,172541 172542,30 172542,328 172543,25222 172544,1058 172545,392 172546,63 172546,6119 172547,835 172548,1452 172550,450 172551,1607 172553,147191 172554,340 172554,489 172554,28130 172555,336 172555,1973 172557,55849 172558,1247 172558,164572 172559,393 172561,2775 172562,447 172563,50 172563,158 172563,1776 172563,2931 172563,8822 172565,56 172566,1133 172567,172568 172569,1133 172570,171 172571,1135 172573,298 172574,485 172575,172576 172577,146 172577,92476 172578,346 172579,430 172580,1177 172581,94 172581,885 172581,2787 172581,13704 172582,1122 172583,968 172585,818 172586,314 172586,1345 172587,358 172588,142870 172589,2443 172589,2931 172591,481 172592,2944 172593,1608 172594,1132 172595,252 172596,275 172597,467 172598,301 172599,623 172600,843 172601,272 172602,1326 172603,151 172604,8598 172605,1127 172606,698 172606,50083 172606,85842 172606,172607 172606,176453 172606,179143 172606,179146 172606,181848 172606,184772 172606,184914 172606,189712 172606,189716 172606,191347 172606,191864 172606,195125 172606,201245 172608,439 172610,202 172611,2209 172612,2460 172613,30 172614,1345 172615,1122 172617,841 172619,450 172620,3 172620,20 172620,32 172620,34 172620,35 172620,37 172620,50 172620,63 172620,68 172620,72 172620,81 172620,83 172620,86 172620,104 172620,106 172620,111 172620,120 172620,136 172620,140 172620,158 172620,178 172620,192 172620,202 172620,207 172620,215 172620,217 172620,225 172620,227 172620,233 172620,240 172620,248 172620,278 172620,283 172620,301 172620,302 172620,312 172620,326 172620,328 172620,332 172620,333 172620,346 172620,349 172620,358 172620,383 172620,388 172620,390 172620,392 172620,406 172620,417 172620,422 172620,435 172620,439 172620,455 172620,493 172620,503 172620,509 172620,510 172620,515 172620,518 172620,525 172620,536 172620,538 172620,575 172620,577 172620,586 172620,589 172620,592 172620,605 172620,615 172620,622 172620,626 172620,671 172620,687 172620,697 172620,702 172620,704 172620,714 172620,717 172620,718 172620,720 172620,726 172620,752 172620,779 172620,801 172620,809 172620,850 172620,859 172620,873 172620,874 172620,875 172620,907 172620,919 172620,932 172620,934 172620,968 172620,973 172620,1001 172620,1010 172620,1016 172620,1052 172620,1072 172620,1102 172620,1133 172620,1140 172620,1151 172620,1167 172620,1175 172620,1177 172620,1181 172620,1201 172620,1210 172620,1231 172620,1240 172620,1241 172620,1265 172620,1266 172620,1274 172620,1282 172620,1287 172620,1289 172620,1294 172620,1298 172620,1309 172620,1332 172620,1359 172620,1368 172620,1370 172620,1374 172620,1381 172620,1429 172620,1452 172620,1465 172620,1466 172620,1467 172620,1479 172620,1515 172620,1522 172620,1531 172620,1544 172620,1551 172620,1564 172620,1572 172620,1579 172620,1590 172620,1634 172620,1639 172620,1644 172620,1715 172620,1722 172620,1745 172620,1756 172620,1782 172620,1789 172620,1821 172620,1836 172620,1837 172620,1849 172620,1858 172620,1877 172620,1882 172620,1893 172620,1927 172620,1939 172620,1955 172620,1985 172620,2006 172620,2045 172620,2083 172620,2191 172620,2205 172620,2266 172620,2274 172620,2421 172620,2434 172620,2443 172620,2557 172620,2620 172620,2646 172620,2701 172620,2784 172620,2931 172620,2979 172620,2989 172620,2991 172620,3135 172620,3138 172620,3193 172620,3194 172620,3207 172620,3218 172620,3260 172620,3367 172620,3422 172620,3474 172620,3507 172620,3538 172620,3585 172620,3612 172620,3695 172620,3999 172620,4172 172620,4453 172620,4549 172620,4594 172620,4637 172620,4771 172620,5326 172620,5440 172620,5662 172620,5718 172620,5911 172620,5987 172620,6068 172620,6955 172620,7270 172620,7572 172620,8373 172620,8798 172620,9001 172620,9015 172620,9029 172620,9098 172620,13745 172620,14126 172620,14797 172620,15609 172620,28107 172620,33424 172620,37088 172620,44743 172620,172621 172622,818 172625,81 172625,104 172625,254 172626,516 172627,424 172628,126 172629,1566 172630,809 172631,497 172632,107 172633,151 172634,115659 172635,1782 172637,138686 172638,175 172639,298 172640,60576 172641,433 172642,79 172643,1151 172644,172645 172647,217 172648,145240 172649,4571 172650,835 172651,1927 172652,809 172653,140 172655,811 172656,703 172657,536 172658,309 172658,310 172659,6556 172660,2646 172661,130 172662,433 172663,172664 172666,1052 172666,2626 172667,118 172667,422 172667,4597 172667,5405 172670,302 172671,479 172672,1749 172673,360 172674,760 172676,2105 172677,516 172678,2083 172679,1323 172680,408 172681,907 172682,102 172683,1326 172684,1010 172684,1143 172684,1240 172685,172686 172685,174418 172685,192186 172685,203660 172685,241936 172687,872 172688,3623 172689,202 172690,835 172691,843 172692,366 172693,366 172694,366 172695,366 172696,366 172697,366 172698,623 172699,366 172700,366 172701,107 172701,111 172701,4771 172702,240 172702,392 172703,134 172704,135 172705,1634 172706,631 172707,7698 172708,29380 172709,809 172709,1085 172710,1010 172711,217 172712,640 172714,779 172715,862 172716,3623 172717,515 172719,113156 172720,217 172720,1417 172721,137 172721,698 172722,140 172723,217 172723,392 172723,536 172723,1417 172725,2775 172726,602 172726,3218 172727,571 172728,397 172729,30 172730,30 172731,138686 172732,9457 172733,151 172734,3623 172735,760 172735,994 172735,1274 172735,1454 172736,818 172737,3623 172738,483 172739,302 172740,1265 172740,1266 172741,1390 172742,1454 172743,943 172743,1332 172743,5405 172744,172745 172744,172790 172746,1326 172747,1227 172747,86416 172748,861 172749,187 172750,160 172751,126 172751,649 172751,731 172752,340 172753,8854 172754,1220 172754,1222 172755,251 172756,252 172758,450 172759,712 172760,626 172761,875 172762,3623 172763,736 172763,1282 172764,736 172765,289 172765,290 172765,94134 172767,30 172768,885 172768,13704 172769,1252 172769,1253 172770,211 172771,581 172771,918 172772,489 172773,3623 172774,875 172775,3623 172776,435 172777,3623 172778,172779 172781,252 172782,1220 172782,1222 172783,516 172784,120 172785,843 172786,7652 172787,1773 172788,809 172789,113156 172791,467 172792,135 172792,1332 172793,138 172794,865 172795,557 172796,137 172797,118 172797,4597 172798,88820 172799,10 172799,113156 172800,450 172801,10 172801,113156 172802,3623 172803,44 172804,1274 172805,83 172806,172807 172808,172809 172810,129534 172811,1858 172812,1 172813,450 172814,1707 172815,1298 172816,4545 172816,56150 172816,139010 172818,332 172819,1453 172820,72 172821,4637 172822,588 172822,590 172823,450 172824,450 172825,8788 172826,450 172828,72 172829,3507 172830,255 172831,172832 172833,1253 172833,1511 172833,2931 172834,172835 172836,1 172837,149 172838,1556 172839,256 172841,72 172842,72 172843,24505 172844,4475 172845,6303 172846,172847 172848,34 172848,35 172848,202 172848,217 172848,455 172848,509 172848,536 172848,1274 172848,1467 172848,2266 172848,2784 172848,4594 172848,7092 172849,172850 172851,292 172852,14366 172853,172854 172855,2590 172856,72 172857,72 172858,439 172859,225 172860,366 172861,172862 172863,1983 172864,275 172865,1285 172866,366 172867,366 172868,83 172869,172870 172871,389 172872,8884 172873,104 172874,1085 172875,172876 172875,175266 172877,4545 172877,139010 172878,172879 172881,172882 172884,72 172886,355 172887,172888 172889,72 172889,312 172890,875 172891,875 172893,147191 172894,134 172894,135 172894,137 172894,138 172894,2105 172895,83 172896,172897 172896,175099 172898,172899 172900,172901 172902,172903 172906,714 172909,171 172910,172911 172912,30 172913,172911 172914,172915 172916,146 172916,92476 172917,344 172918,647 172919,1085 172920,657 172921,1323 172922,408 172923,102 172924,1326 172926,994 172927,1033 172928,493 172929,58 172930,994 172931,4455 172932,577 172933,366 172934,366 172935,366 172936,366 172937,366 172938,366 172939,172940 172941,172942 172943,1300 172944,743 172945,875 172946,450 172947,44 172948,172949 172948,186460 172950,34 172950,35 172950,313 172950,2784 172950,14126 172951,450 172952,3623 172953,932 172954,818 172955,72 172956,4252 172956,7092 172957,172958 172959,72 172960,172961 172962,920 172963,811 172964,172965 172966,195 172966,32475 172967,393 172968,172969 172970,72 172971,483 172972,850 172973,72 172974,2572 172975,72 172976,5540 172977,72 172978,1479 172979,390 172980,355 172981,422 172982,640 172983,1402 172984,3260 172987,640 172988,640 172989,72 172990,450 172991,850 172992,46 172993,994 172994,58 172995,172996 172995,223335 172995,223502 172997,206 172998,172999 173000,644 173001,366 173002,173003 173004,72 173006,72 173007,30 173007,328 173007,7124 173008,269 173009,173010 173012,850 173013,151 173014,173015 173016,1544 173017,323 173018,1001 173019,1001 173021,6068 173022,30 173023,173024 173025,1608 173027,355 173028,107 173029,2416 173029,2417 173030,292 173031,338 173032,298 173034,1133 173035,3538 173036,305 173037,83 173038,1359 173039,602 173041,6119 173042,173043 173044,485 173045,3467 173046,515 173047,173048 173050,173051 173052,302 173053,1118 173053,215276 173055,298 173056,485 173057,1240 173058,1240 173059,1175 173060,485 173061,298 173062,1240 173063,1149 173064,195 173065,1240 173066,1240 173067,1240 173068,760 173069,1240 173070,1240 173071,602 173072,1240 173073,173074 173073,204941 173075,385 173076,388 173077,1608 173078,1132 173080,310 173080,3039 173081,83 173082,34 173082,35 173083,602 173084,455 173085,366 173086,1363 173087,44 173088,932 173089,17309 173091,3999 173092,704 173093,1465 173094,2506 173095,1983 173096,298 173097,485 173098,872 173099,872 173100,872 173101,138686 173102,175 173103,298 173104,1181 173105,298 173106,485 173107,298 173108,485 173109,366 173110,366 173111,827 173112,138686 173113,175 173114,298 173115,136 173116,602 173117,687 173118,602 173119,602 173120,264 173120,994 173120,1659 173120,2979 173121,557 173122,557 173123,557 173124,1544 173125,240 173126,1796 173127,1241 173128,1522 173129,148742 173130,372 173131,1001 173132,173133 173134,483 173135,8788 173136,4611 173137,248 173138,1300 173139,30 173141,483 173142,298 173143,485 173144,3003 173146,156379 173147,1572 173149,483 173150,1707 173151,142473 173152,173153 173154,615 173155,994 173157,147 173158,602 173159,1265 173159,1266 173160,184 173161,602 173162,843 173163,3695 173165,35 173165,634 173166,323 173168,450 173169,450 173170,269 173171,140 173171,227 173171,1163 173171,1179 173171,1509 173171,1688 173171,2379 173173,292 173174,294 173175,296 173176,298 173177,298 173178,1807 173179,184 173180,1127 173181,285 173182,1072 173183,636 173184,56 173186,1012 173187,994 173188,1235 173188,1335 173190,59 173190,3794 173191,83 173192,113156 173193,355 173194,811 173194,868 173195,217 173196,433 173197,79 173198,298 173199,485 173200,142409 173200,159365 173201,79 173202,516 173202,920 173203,1707 173204,173205 173206,602 173207,103860 173208,30 173209,392 173209,808 173209,918 173209,997 173209,1240 173209,1465 173209,1663 173209,3258 173209,6059 173209,31414 173209,104537 173209,176812 173209,182609 173210,1238 173211,843 173212,10 173213,1452 173214,2105 173215,83 173216,3258 173217,994 173218,1014 173219,1983 173220,1983 173221,994 173222,240 173223,1011 173224,16153 173225,142426 173226,1011 173227,10 173228,1082 173230,388 173230,406 173230,141912 173231,146 173231,158 173231,192 173231,202 173231,285 173231,620 173231,1893 173231,92476 173233,447 173234,2775 173235,1014 173236,1 173237,392 173239,1 173240,1181 173241,83 173242,1133 173243,298 173244,485 173245,173246 173247,248 173247,1332 173248,640 173249,22 173250,640 173251,19413 173251,36819 173253,795 173254,240 173255,310 173255,3039 173256,668 173257,941 173259,30 173260,873 173261,6059 173262,173263 173266,1983 173267,707 173268,104 173268,663 173269,920 173270,467 173272,147 173273,63471 173274,55849 173275,671 173276,749 173277,726 173279,6059 173280,726 173281,4571 173282,4571 173282,88820 173283,2210 173283,4237 173284,81 173285,6059 173286,447 173287,2775 173288,760 173289,209 173290,704 173291,1001 173292,2867 173292,2868 173294,32 173294,87 173294,349 173294,392 173294,1836 173294,2699 173296,704 173296,1282 173297,106 173297,535 173298,5375 173300,623 173301,640 173302,1309 173303,3328 173304,1707 173305,1238 173306,3135 173307,1955 173308,991 173309,784 173309,7194 173310,138686 173311,175 173312,173313 173314,261 173314,852 173315,142426 173317,298 173318,184 173318,2244 173319,433 173319,1634 173320,1151 173321,255 173322,142430 173322,147191 173324,195 173325,136 173326,55849 173327,615 173327,657 173327,3182 173328,147 173328,158 173329,387 173330,167 173331,589 173331,808 173331,968 173331,1715 173332,115474 173334,360 173336,56 173337,515 173338,255 173339,15673 173340,718 173341,215 173341,328 173341,704 173341,1149 173341,1212 173341,1739 173341,2237 173341,2721 173341,7000 173341,74547 173341,173296 173342,1858 173343,1860 173344,586 173345,994 173346,1659 173348,1821 173349,173350 173351,1849 173353,173354 173353,177141 173353,231846 173353,242426 173355,1608 173356,1132 173357,358 173358,41 173359,372 173361,1019 173362,211 173364,83 173365,173366 173367,1147 173368,714 173370,3830 173371,247 173372,818 173373,1298 173374,1127 173375,138686 173376,175 173377,56 173378,1381 173379,298 173380,202 173381,102 173382,1326 173383,1323 173384,408 173385,312 173386,994 173389,273 173390,1072 173391,2775 173392,447 173393,173394 173395,192 173399,1127 173400,259 173401,605 173402,30 173403,1608 173404,1132 173405,272 173406,120 173406,217 173406,278 173406,283 173406,388 173406,389 173406,455 173406,536 173406,623 173406,949 173406,1201 173406,1240 173406,1274 173406,1590 173406,2266 173406,2421 173406,4637 173407,269 173408,23783 173409,843 173409,227669 173410,647 173411,415 173413,577 173414,173415 173416,918 173417,1858 173418,1860 173419,338 173421,356 173422,483 173423,287 173423,809 173424,994 173425,173426 173428,1608 173429,1132 173430,255 173431,1608 173432,1132 173433,1608 173434,1132 173435,972 173436,58 173436,71 173436,251 173436,255 173436,287 173436,298 173436,493 173436,563 173436,577 173436,626 173436,671 173436,698 173436,788 173436,795 173436,801 173436,811 173436,991 173436,1012 173436,1068 173436,1070 173436,1133 173436,1309 173436,1368 173436,1429 173436,1449 173436,1474 173436,1634 173436,1789 173436,2367 173436,2436 173436,5405 173436,5961 173436,6837 173436,16331 173436,185874 173436,193129 173437,175 173438,493 173438,1127 173439,151 173441,142405 173442,1243 173443,406 173443,1425 173444,252 173445,251 173446,1220 173446,1222 173447,302 173448,83 173449,252 173450,1220 173450,1222 173451,251 173452,13361 173453,83 173454,861 173455,682 173455,72439 173456,298 173457,485 173458,406 173459,760 173460,146280 173460,159365 173461,1181 173462,2315 173464,1181 173465,4611 173466,44 173467,338 173468,99 173469,457 173470,1210 173471,467 173472,406 173473,173474 173473,249556 173475,1474 173476,1634 173476,6323 173477,852 173478,3623 173479,505 173480,467 173481,467 173482,222 173483,1893 173484,30 173485,298 173486,485 173487,1893 173488,1402 173489,30 173490,72 173491,173492 173493,503 173494,1773 173496,2944 173497,173498 173499,30 173500,222 173501,30 173502,72 173503,640 173504,30 173505,173506 173507,83 173508,640 173509,72 173510,72 173511,173512 173513,83 173514,138686 173515,743 173516,175 173517,298 173518,72 173519,1175 173519,1893 173519,7155 173520,19443 173521,439 173522,30 173523,2116 173524,577 173525,1381 173526,202 173527,485 173528,298 173529,15573 173530,1247 173530,164572 173531,1370 173532,358 173533,779 173534,424 173534,1085 173535,536 173536,5908 173537,366 173538,30 173539,1167 173540,366 173541,366 173542,366 173543,811 173544,379 173544,1274 173544,2646 173545,136 173546,2210 173546,4237 173547,217 173547,536 173547,2784 173548,994 173549,247 173550,173551 173552,171 173553,104 173553,192 173553,217 173553,302 173553,333 173553,406 173553,455 173553,588 173553,590 173553,5265 173553,5343 173553,7270 173554,1127 173555,7416 173556,439 173557,173558 173559,450 173560,8854 173560,255750 173561,158 173561,192 173561,336 173561,586 173562,1359 173563,5718 173564,3367 173565,525 173566,81 173566,104 173566,254 173567,1309 173568,1285 173569,631 173570,1509 173571,2590 173572,294 173573,217 173575,173576 173579,885 173579,13704 173580,56 173581,450 173582,195 173583,173584 173585,30 173586,207 173587,392 173588,215 173589,932 173590,173590 173591,1070 173592,309 173592,310 173593,173593 173594,1511 173594,3846 173595,20813 173596,178 173597,1285 173598,269 173599,1467 173600,4 173600,5 173600,1133 173600,3582 173600,17590 173600,17593 173601,72 173602,872 173603,1429 173604,211 173605,72 173606,13 173606,137 173606,140 173606,1179 173607,301 173608,95554 173609,72 173610,1143 173612,668 173613,5265 173614,1579 173615,72 173616,2744 173617,3507 173618,1749 173619,7233 173620,81 173621,366 173622,366 173623,366 173624,366 173625,22 173625,920 173626,663 173627,72 173628,173629 173630,818 173631,1149 173632,7155 173633,525 173634,2210 173634,4237 173635,1608 173636,30 173637,173638 173639,1782 173640,372 173641,808 173642,355 173643,875 173644,2373 173645,861 173646,491 173647,50 173648,2979 173649,5976 173650,1175 173651,994 173652,2371 173653,1860 173654,1858 173655,1858 173656,1860 173657,151 173658,972 173663,356 173663,615 173663,968 173665,1858 173666,1860 173667,994 173668,2923 173668,4190 173670,298 173671,485 173673,500 173676,1749 173677,83 173678,1175 173680,602 173681,173682 173683,200 173685,949 173687,602 173688,1046 173689,298 173690,485 173691,209 173692,1458 173693,602 173694,302 173694,1147 173694,3999 173695,602 173696,602 173697,602 173699,602 173700,1474 173702,120 173704,149 173705,4223 173706,337 173707,811 173708,138686 173709,2671 173709,6506 173710,467 173711,356 173711,1740 173714,1860 173715,1858 173716,328 173717,1608 173718,1132 173719,417 173720,285 173720,779 173720,1515 173721,346 173722,1608 173723,1132 173724,58 173725,994 173726,46 173727,358 173728,5405 173729,849 173729,1267 173730,920 173731,467 173732,138686 173733,349 173733,392 173733,4252 173734,175 173735,907 173736,294 173737,298 173738,577 173739,184 173740,3623 173742,2353 173744,5130 173745,1132 173746,1608 173747,302 173748,6323 173749,1359 173750,5591 173751,1132 173752,1608 173753,1608 173754,1132 173755,707 173756,1608 173757,30 173758,1132 173759,173760 173762,718 173763,48 173764,30 173766,8501 173767,142405 173768,720 173769,259 173769,21442 173770,1058 173771,1707 173772,1707 173773,207 173775,872 173776,195 173777,795 173777,1289 173777,1715 173778,673 173779,346 173780,2411 173781,1313 173782,79 173783,596 173784,302 173785,1179 173786,557 173787,455 173788,292 173790,483 173792,750 173793,406 173794,3209 173795,3094 173796,136 173798,4260 173799,163 173799,467 173800,207 173801,4260 173802,1749 173803,83 173804,2626 173805,56 173806,698 173807,1210 173808,2646 173809,192 173810,283 173811,301 173813,2353 173814,852 173815,503 173815,1274 173816,264 173816,835 173816,1659 173818,136 173819,24763 173820,1968 173821,3695 173823,273 173823,2367 173824,269 173826,602 173827,134 173828,30 173828,200 173829,2371 173830,2367 173831,304 173832,668 173833,83 173835,2590 173836,356 173836,852 173836,5591 173837,1449 173838,1224 173839,900 173839,3507 173840,1175 173841,852 173841,1179 173842,919 173843,4220 173844,682 173844,72439 173845,3194 173846,5358 173846,14352 173847,336 173848,1007 173849,48 173850,1220 173850,1222 173851,251 173852,252 173853,422 173855,390 173856,615 173857,4260 173858,261 173859,1210 173860,2979 173860,173861 173862,48 173863,200 173864,173865 173867,1893 173868,248 173869,473 173870,72 173871,1359 173873,497 173874,346 173875,301 173876,1715 173877,861 173878,868 173879,859 173880,323 173881,493 173881,1659 173881,1927 173882,302 173883,1564 173884,1319 173885,315 173886,861 173887,1319 173888,173889 173888,234548 173890,392 173891,30 173892,861 173893,302 173894,877 173896,1844 173897,925 173899,2224 173900,827 173901,9021 173902,83 173903,843 173904,707 173905,1955 173906,1623 173907,240 173907,1564 173908,30 173908,1332 173909,283 173911,6682 173912,142473 173914,515 173915,18726 173916,83 173917,269 173919,677 173919,48291 173919,51505 173919,129695 173919,150741 173919,156352 173920,211 173921,6059 173922,6119 173923,447 173924,30 173925,602 173926,9457 173927,2083 173928,602 173929,10 173930,6387 173931,1432 173932,626 173933,6119 173934,184 173935,56 173936,563 173937,852 173937,5591 173938,602 173939,1309 173940,392 173941,72 173942,1983 173943,151 173944,497 173944,1400 173945,515 173946,30 173947,302 173948,349 173948,392 173949,1619 173950,1087 173951,1634 173952,644 173953,1127 173955,88820 173956,240 173956,1955 173957,634 173958,1381 173959,2923 173960,483 173961,355 173962,30 173963,417 173964,2620 173965,30 173966,366 173967,104 173967,557 173967,1368 173968,366 173969,366 173970,6303 173970,9025 173971,30 173972,1089 173973,252 173973,1385 173974,1072 173975,920 173976,4101 173977,17590 173978,392 173979,1623 173980,1590 173981,3194 173982,72 173983,14650 173984,390 173985,389 173986,147191 173987,483 173988,254 173989,467 173990,122406 173991,217 173992,83 173993,893 173994,65 173995,8854 173995,255750 173996,173997 173998,2620 173999,1220 173999,1222 174000,516 174001,252 174002,1801 174003,1220 174003,1222 174004,252 174005,516 174006,102 174007,1559 174008,510 174009,151 174010,493 174011,723 174012,1014 174013,832 174014,1796 174015,972 174016,2210 174016,4237 174017,174018 174019,634 174020,294 174021,718 174022,1298 174023,5326 174024,557 174025,1274 174026,48 174027,302 174028,309 174028,310 174029,647 174030,146 174030,92476 174031,344 174032,2105 174033,119 174034,861 174035,447 174036,138686 174037,885 174037,13704 174038,313 174039,861 174040,640 174041,8235 174042,174043 174042,185712 174044,5718 174045,811 174046,72 174047,1436 174048,861 174049,174050 174051,30 174052,5405 174053,306 174053,307 174054,72 174055,147 174056,255 174057,195 174058,503 174059,1149 174060,211 174061,160 174062,1983 174063,640 174064,1655 174065,841 174066,72 174067,113156 174068,312 174069,1608 174070,1132 174071,219 174072,278 174073,1274 174074,5250 174075,1085 174076,1707 174077,2797 174079,1474 174080,3089 174081,843 174082,117 174082,2712 174083,2373 174084,2867 174084,2868 174085,4411 174086,323 174087,500 174088,2775 174089,1962 174090,54 174091,1052 174092,1882 174093,261 174094,81 174095,2367 174096,13661 174097,206 174098,479 174099,859 174100,272 174101,272 174102,736 174103,736 174104,332 174105,1381 174106,72 174107,596 174108,30 174109,779 174110,379 174111,2574 174112,752 174113,994 174114,138686 174115,379 174116,175 174117,596 174118,596 174119,577 174120,298 174121,2315 174123,113156 174124,336 174124,406 174125,107 174126,56 174127,4594 174128,1332 174129,160951 174130,302 174131,13919 174132,994 174133,30 174134,3724 174135,3724 174136,3724 174137,30 174138,1466 174139,264 174140,264 174141,264 174142,577 174142,852 174143,602 174144,577 174145,861 174146,130 174147,130 174148,130 174149,72 174150,30 174151,298 174152,485 174153,30 174154,14366 174155,147 174156,1247 174156,164572 174157,972 174158,30 174159,72 174160,640 174161,1014 174162,174163 174162,258717 174162,264532 174164,292 174165,1014 174166,1014 174167,1 174168,1 174169,1821 174170,1014 174171,2116 174172,1078 174173,1078 174174,1078 174175,994 174176,994 174177,994 174178,233 174179,233 174180,219 174181,219 174182,72 174183,219 174184,811 174185,811 174186,811 174187,973 174188,217 174189,309 174189,310 174190,309 174190,310 174191,309 174191,310 174192,206 174192,2674 174192,3258 174193,1332 174194,1007 174195,130 174196,726 174197,726 174198,726 174199,160 174200,160 174201,160 174202,772 174203,147 174204,56 174205,2590 174206,749 174207,749 174208,302 174209,775 174210,41 174211,233 174212,424 174213,3623 174214,3623 174215,393 174216,137 174217,137 174218,1133 174219,1133 174220,1707 174221,1707 174222,174223 174224,2590 174225,932 174226,861 174227,104 174228,4691 174229,3148 174230,920 174231,206 174232,872 174233,663 174234,1821 174235,2411 174236,3161 174237,269 174238,138686 174239,175 174240,298 174241,207 174242,602 174243,657 174244,192 174245,30 174246,83 174246,217 174246,278 174246,536 174246,1467 174247,72 174248,338 174249,366 174250,1429 174251,366 174252,366 174253,366 174254,366 174255,366 174256,72 174257,2590 174258,44 174259,1143 174260,668 174261,72 174262,872 174263,72 174264,1860 174265,1858 174266,1572 174267,602 174268,602 174269,3769 174270,355 174271,298 174272,79 174274,1434 174275,3041 174276,2443 174278,2775 174279,444 174279,567 174279,1160 174279,1300 174280,1238 174281,685 174282,310 174282,805 174282,1235 174282,1335 174282,1749 174283,579 174284,1452 174285,1010 174285,1012 174285,1122 174285,1241 174285,1849 174286,1132 174287,1805 174288,3297 174289,422 174290,422 174291,422 174292,602 174293,671 174294,1 174295,422 174296,422 174297,422 174298,422 174299,422 174300,422 174301,422 174302,2334 174303,422 174305,387 174305,481 174305,663 174305,1677 174305,3999 174306,6837 174307,1400 174308,760 174309,174310 174311,79 174312,292 174313,2105 174314,1608 174315,1402 174316,1608 174317,1132 174318,28107 174319,1132 174320,1608 174321,56 174322,596 174323,200 174323,8180 174324,14434 174325,6059 174326,148885 174327,818 174327,127158 174328,145240 174331,682 174331,72439 174333,577 174334,30 174335,676 174336,1858 174337,1860 174338,138686 174339,83 174340,175 174341,372 174341,1082 174341,6068 174342,160 174342,694 174343,467 174343,868 174344,298 174345,113156 174346,467 174347,920 174348,1983 174349,56 174350,1 174351,682 174351,72439 174352,4039 174353,21442 174354,145240 174355,500 174356,994 174358,254 174360,333 174361,1579 174361,1659 174362,450 174363,1284 174365,79 174368,72 174369,192 174370,477 174371,1417 174373,1659 174374,1983 174375,2775 174376,72 174378,1240 174379,142473 174379,174380 174381,392 174382,156379 174383,83 174384,1983 174385,682 174385,72439 174387,422 174389,333 174389,586 174390,119 174390,192 174390,309 174390,310 174390,577 174390,1400 174392,3 174393,2105 174394,273 174394,313 174395,207 174396,652 174397,657 174399,99287 174400,592 174402,30 174403,1118 174403,1572 174404,149 174405,1608 174406,1132 174407,19010 174409,447 174410,2775 174412,718 174413,994 174414,577 174415,1608 174416,1132 174417,336 174419,22 174420,147 174420,184 174420,859 174420,1247 174420,164572 174422,1253 174422,6888 174422,164572 174423,23783 174424,877 174425,931 174426,302 174426,1556 174427,422 174429,515 174430,261 174432,3804 174433,31122 174434,3193 174435,518 174436,2737 174437,14797 174438,467 174439,455 174440,217 174441,1072 174442,1132 174443,1608 174444,34 174446,34 174447,72 174448,868 174448,1392 174448,156379 174449,147 174449,149 174449,252 174450,21442 174450,118336 174451,425 174452,2089 174452,2940 174452,3003 174454,292 174455,406 174456,602 174458,704 174459,1983 174459,2867 174459,2868 174460,217 174460,301 174460,631 174460,1001 174460,1010 174461,178 174461,439 174461,671 174461,1033 174461,1789 174462,6119 174463,323 174465,127158 174466,668 174467,660 174468,22 174469,356 174469,788 174470,1298 174472,390 174473,211 174474,647 174474,1175 174475,302 174476,55849 174477,843 174478,3623 174480,392 174480,697 174481,138686 174482,175 174483,63 174484,50 174485,158 174486,1983 174487,298 174489,4218 174490,1175 174492,120 174493,56 174493,287 174494,1949 174494,6059 174495,298 174496,485 174497,34 174497,35 174497,250 174497,1684 174498,301 174499,694 174499,15523 174500,333 174501,252 174502,215 174503,1007 174505,142870 174506,515 174507,861 174508,104 174509,8463 174511,328 174512,147 174512,1458 174513,142426 174515,217 174516,652 174517,120 174517,202 174517,217 174517,261 174517,349 174517,379 174517,509 174517,805 174517,859 174517,873 174517,874 174517,1119 174517,1454 174517,1564 174517,1635 174517,1722 174517,1801 174517,1927 174517,2931 174517,3135 174517,3538 174517,6638 174519,3367 174520,72 174521,72 174522,136 174523,83 174524,58 174525,515 174527,138686 174528,175 174529,4571 174530,298 174531,392 174533,3 174535,192 174535,779 174536,467 174537,248 174538,372 174539,56 174540,2244 174541,19 174542,1639 174543,1285 174544,2244 174545,408 174546,10 174546,113156 174547,1319 174548,120 174548,3115 174549,37 174549,717 174553,1132 174554,1608 174555,485 174556,298 174557,3 174559,489 174560,6424 174562,3135 174563,174564 174565,1556 174566,138686 174567,175 174568,298 174569,1326 174570,102 174571,408 174572,1323 174573,5906 174574,557 174575,626 174576,278 174577,137 174578,862 174579,622 174580,72 174581,340 174582,22293 174583,1983 174585,120 174587,406 174588,120 174589,7416 174590,72 174591,657 174592,406 174593,72 174594,255 174595,72 174597,2620 174598,885 174598,13704 174599,207 174600,1 174601,255 174602,174603 174604,68 174605,174606 174607,1117 174610,120 174611,120 174612,120 174613,1220 174613,1222 174614,252 174615,516 174616,1274 174617,107 174617,1556 174618,302 174619,278 174620,247 174620,2867 174620,2868 174621,1231 174622,298 174623,485 174624,255 174625,872 174626,1429 174627,920 174628,146 174628,92476 174630,485 174631,298 174632,269 174633,1220 174633,1222 174634,516 174635,252 174636,30 174637,1220 174637,1222 174638,516 174639,252 174640,366 174640,500 174641,516 174642,2590 174643,8854 174644,302 174645,577 174646,1298 174647,8822 174648,174649 174650,298 174651,485 174652,406 174653,1274 174654,1014 174655,217 174655,1417 174656,861 174657,1014 174658,1113 174659,602 174660,264 174660,843 174661,994 174662,1014 174663,309 174663,310 174663,6556 174665,1381 174666,292 174667,174668 174669,2083 174670,1871 174671,10 174672,2574 174673,333 174674,2867 174674,2868 174675,2737 174676,174677 174678,192 174679,406 174680,557 174681,1220 174681,1222 174682,10 174683,872 174684,222 174685,269 174686,447 174687,2775 174688,447 174689,2775 174690,602 174691,602 174692,1474 174693,358 174694,483 174695,1 174696,2006 174697,323 174698,83 174699,30 174700,973 174700,1284 174700,1419 174701,44 174702,392 174703,2116 174704,174705 174707,602 174709,577 174710,72 174712,255 174713,304 174714,1117 174714,1284 174715,99 174716,10 174718,1639 174719,146280 174719,159365 174720,668 174721,994 174722,1143 174723,174724 174723,219482 174723,248523 174723,248683 174725,355 174726,99 174728,30 174729,126 174730,99 174731,130 174732,3724 174734,206 174734,2146 174735,174735 174736,99 174737,406 174738,202 174740,33611 174741,516 174742,1267 174743,298 174744,485 174745,1612 174746,294 174746,313 174748,602 174749,516 174750,1220 174750,1222 174751,252 174753,217 174754,809 174754,22293 174756,422 174757,422 174758,422 174759,422 174760,422 174761,422 174762,422 174763,422 174764,422 174765,422 174766,422 174767,4637 174768,422 174769,390 174770,104 174770,1284 174771,557 174772,217 174774,422 174775,83 174778,516 174779,3630 174780,3524 174781,37 174782,83 174784,422 174785,18790 174788,516 174789,50 174789,158 174789,1776 174789,2931 174789,8822 174791,174792 174791,258666 174793,174794 174795,144962 174796,30 174797,336 174798,30 174799,852 174800,1985 174801,22 174802,302 174803,577 174804,932 174805,333 174806,312 174807,138686 174808,175 174809,174810 174812,22 174813,298 174814,332 174815,1 174816,248 174818,663 174819,640 174820,640 174821,640 174822,640 174823,1467 174825,130 174825,1007 174826,467 174827,920 174828,726 174829,994 174830,13661 174831,278 174832,2210 174832,4237 174833,83 174835,192 174836,835 174837,8463 174838,1300 174840,72 174842,818 174843,3 174845,515 174846,4453 174847,1132 174847,142430 174848,174849 174849,292 174849,609 174849,1653 174849,3830 174849,138102 174849,174849 174849,196147 174849,220899 174850,949 174851,577 174852,301 174852,932 174852,968 174852,1300 174852,1522 174853,72 174854,1400 174855,63 174855,106 174855,192 174855,202 174855,252 174855,337 174855,516 174855,586 174855,694 174855,861 174855,1220 174855,1222 174855,1243 174855,1635 174855,6119 174855,16201 174856,140 174857,818 174858,1370 174859,1113 174860,178 174861,113156 174862,623 174863,138686 174864,175 174865,298 174866,174867 174868,1769 174868,1893 174869,264 174869,736 174870,113156 174871,298 174872,485 174874,994 174875,22 174876,222 174876,590 174876,1419 174878,1359 174879,174880 174879,264843 174881,920 174883,72 174884,392 174885,1300 174886,5987 174887,171 174888,30 174889,760 174889,1149 174890,44725 174891,174892 174893,338 174893,1052 174894,338 174894,1052 174894,21408 174895,337 174896,859 174897,991 174898,138686 174899,1707 174900,175 174901,264 174902,298 174903,22 174904,1181 174905,704 174906,527 174908,450 174909,647 174910,104 174910,240 174910,264 174910,289 174910,290 174910,312 174910,372 174910,442 174910,636 174910,1082 174910,1466 174910,1608 174910,1807 174910,1893 174910,1955 174910,2620 174910,3115 174910,3695 174910,8276 174910,94134 174911,1118 174912,289 174912,290 174912,94134 174913,2073 174914,1531 174915,1893 174916,657 174917,72 174918,30 174919,752 174920,58 174920,442 174920,609 174920,24500 174921,113156 174922,35687 174923,2210 174923,4237 174924,775 174925,515 174926,623 174927,602 174928,1326 174929,408 174930,102 174931,111 174932,1323 174933,240 174934,252 174935,302 174937,283 174938,455 174939,72 174940,493 174941,577 174942,704 174945,120 174946,994 174947,3695 174948,392 174949,30 174950,240 174950,332 174950,372 174950,1285 174950,1955 174950,3331 174950,9026 174951,302 174953,1381 174954,247 174955,222 174955,278 174955,657 174955,1571 174955,5326 174956,292 174957,83 174958,392 174959,657 174960,72 174961,1359 174962,301 174964,1368 174965,30 174966,1 174966,4 174966,5 174966,65 174966,694 174966,784 174966,1082 174966,1807 174966,2926 174966,4411 174966,109503 174968,30 174969,588 174969,590 174970,72 174972,415 174973,1453 174974,99 174975,326 174976,4571 174977,178 174978,515 174979,1893 174980,467 174981,2210 174981,4237 174981,182162 174983,30 174984,392 174985,333 174986,861 174987,852 174987,1285 174987,1309 174988,862 174989,30 174990,1807 174991,215 174992,1326 174993,2979 174994,30 174995,103860 174996,932 174997,850 174998,850 174999,596 174999,1368 175001,483 175002,657 175003,30 175004,1014 175005,1608 175006,1132 175007,1014 175008,83 175008,278 175009,71 175009,1449 175009,1983 175009,2590 175009,5718 175010,146 175010,92476 175011,283 175012,113156 175013,255 175014,306 175014,307 175015,77 175016,30 175017,56 175018,422 175019,2506 175021,972 175022,392 175023,2436 175024,63 175024,106 175024,158 175024,192 175024,252 175024,285 175024,306 175024,307 175024,337 175024,346 175024,393 175024,406 175024,435 175024,447 175024,459 175024,483 175024,493 175024,516 175024,538 175024,586 175024,602 175024,620 175024,779 175024,1181 175024,1220 175024,1294 175024,1370 175024,1388 175024,1515 175024,1531 175024,2353 175024,6119 175025,435 175026,278 175027,292 175028,20 175030,145240 175031,640 175032,32751 175033,968 175033,973 175033,1160 175033,1293 175033,1300 175033,103860 175034,622 175035,217 175035,1417 175037,30 175038,557 175039,206 175040,72 175041,187 175042,843 175043,1983 175044,861 175045,72 175046,301 175047,333 175048,1220 175048,1222 175049,516 175050,252 175051,2735 175052,83 175053,5591 175055,1722 175056,439 175057,949 175058,171 175059,5375 175059,109503 175060,1474 175061,358 175063,346 175064,211 175065,2775 175066,447 175067,818 175069,141912 175070,557 175071,30 175072,862 175073,563 175074,330 175075,752 175075,968 175076,264 175077,920 175078,171 175079,392 175080,424 175081,1014 175083,10 175084,3695 175085,760 175086,33611 175087,4903 175088,433 175089,83 175090,72 175091,302 175092,885 175092,13704 175093,3367 175094,63 175095,304 175096,4594 175097,211 175098,366 175100,366 175101,366 175102,366 175103,366 175104,968 175105,30 175106,30 175107,1782 175108,862 175109,932 175110,44 175111,269 175112,151 175113,30 175114,30 175115,1007 175116,2116 175117,1298 175118,861 175119,200 175120,2367 175121,72 175122,1893 175123,784 175123,2424 175124,79 175124,435 175124,1181 175125,83 175126,151 175127,278 175128,250 175128,1684 175129,113156 175130,30 175131,1133 175132,30 175133,103860 175134,271 175135,175136 175137,577 175139,1436 175140,1326 175141,918 175142,113156 175146,142870 175147,563 175148,187 175149,312 175150,175151 175152,333 175153,366 175154,2590 175155,217 175155,536 175156,147 175156,158 175157,668 175158,207 175159,158 175160,640 175161,581 175163,207 175164,175165 175166,862 175166,1001 175166,1085 175166,2590 175166,8884 175167,175168 175169,328 175170,175171 175172,100365 175173,72 175174,30 175175,261 175176,390 175177,872 175178,1429 175179,175180 175181,8308 175182,8308 175183,248 175185,298 175186,30 175187,158 175187,406 175187,779 175187,1181 175187,1515 175187,1531 175188,510 175189,832 175190,1143 175192,178 175193,10 175194,602 175195,289 175195,290 175195,94134 175196,195 175196,1014 175196,55849 175197,515 175197,652 175197,1381 175197,1893 175198,1893 175199,1849 175200,1 175202,872 175203,355 175204,424 175205,647 175206,1252 175206,1253 175208,1608 175209,1132 175210,175211 175212,586 175214,818 175215,175216 175217,187 175218,222 175218,657 175218,2266 175218,2421 175218,8060 175218,8227 175218,175222 175218,218568 175218,224576 175218,245243 175218,245541 175219,138686 175220,1224 175221,107 175223,1836 175224,422 175225,1267 175226,422 175227,422 175228,422 175229,83 175230,422 175231,422 175232,56 175233,422 175234,422 175235,536 175236,422 175237,422 175238,422 175239,422 175240,2671 175241,32 175242,175243 175244,3585 175245,126 175247,422 175248,1566 175249,1332 175250,195 175251,422 175252,809 175253,1888 175255,151 175256,3422 175257,302 175258,209 175259,891 175260,175261 175262,30 175262,693 175262,1188 175263,346 175264,1238 175265,1707 175267,1881 175268,1298 175269,872 175270,467 175271,920 175272,1130 175273,209 175274,1559 175275,1284 175276,240 175278,1893 175279,1893 175280,5405 175281,868 175283,1220 175283,1222 175284,872 175285,994 175285,1235 175285,1335 175286,337 175287,30 175288,142473 175290,631 175291,1118 175292,58 175293,1452 175296,720 175297,11 175299,309 175299,310 175302,55849 175303,30 175307,356 175308,178 175308,20757 175309,626 175310,299 175310,720 175310,775 175310,907 175310,968 175310,1010 175310,1117 175310,2372 175310,3218 175310,3630 175310,5301 175310,73570 175311,1612 175311,138686 175313,264 175313,535 175314,138686 175316,175 175317,875 175318,3623 175319,298 175320,1363 175321,1033 175322,698 175322,85842 175322,172606 175322,189201 175322,205173 175322,205588 175322,251293 175322,255722 175322,255729 175322,256397 175322,259561 175322,261801 175322,262399 175323,3370 175324,406 175324,779 175324,1515 175325,301 175325,1293 175325,3422 175327,687 175328,192 175329,1140 175330,861 175332,54 175332,852 175334,516 175336,175337 175338,278 175339,3258 175340,1001 175342,356 175343,1033 175344,980 175344,994 175347,147123 175348,30 175348,32 175348,34 175348,35 175348,58 175348,72 175348,106 175348,111 175348,115 175348,118 175348,134 175348,146 175348,158 175348,167 175348,202 175348,206 175348,264 175348,272 175348,283 175348,289 175348,290 175348,333 175348,346 175348,356 175348,372 175348,417 175348,422 175348,433 175348,450 175348,452 175348,473 175348,479 175348,500 175348,516 175348,525 175348,536 175348,615 175348,626 175348,631 175348,640 175348,652 175348,714 175348,718 175348,795 175348,841 175348,859 175348,907 175348,949 175348,980 175348,1019 175348,1046 175348,1119 175348,1133 175348,1149 175348,1181 175348,1210 175348,1220 175348,1222 175348,1241 175348,1265 175348,1266 175348,1285 175348,1370 175348,1374 175348,1467 175348,1531 175348,1551 175348,1572 175348,1718 175348,1724 175348,1782 175348,1844 175348,1881 175348,1893 175348,1955 175348,2209 175348,2266 175348,2334 175348,2416 175348,2417 175348,2671 175348,2744 175348,2750 175348,2782 175348,3129 175348,3207 175348,3321 175348,3345 175348,3724 175348,3804 175348,4355 175348,4487 175348,4594 175348,4823 175348,5591 175348,5718 175348,6184 175348,6888 175348,7124 175348,7360 175348,8180 175348,8270 175348,8989 175348,8992 175348,8993 175348,9008 175348,9010 175348,14945 175348,21650 175348,21716 175348,25222 175348,29475 175348,34006 175348,49193 175348,92476 175348,94134 175348,164068 175348,164102 175348,175362 175348,175363 175348,175365 175349,148742 175350,2989 175350,2991 175351,516 175352,1220 175352,1222 175353,252 175354,104 175355,6789 175356,1326 175357,1070 175358,254 175359,217 175360,500 175361,1070 175364,251 175364,252 175364,516 175364,538 175364,925 175364,1220 175364,1222 175364,2567 175366,30331 175367,6955 175368,893 175368,1556 175369,1231 175370,58 175371,994 175372,46 175373,1087 175374,175375 175376,56 175377,3067 175377,15547 175377,175377 175377,175378 175377,177856 175377,178407 175377,179016 175377,179993 175377,181094 175377,183227 175377,183230 175377,183234 175377,183696 175377,186012 175377,186170 175377,187421 175377,188127 175377,188574 175379,56 175381,149 175382,1608 175383,1132 175384,254 175384,289 175384,290 175384,636 175384,784 175384,1001 175384,1119 175384,94134 175386,1 175387,1707 175388,1893 175389,2480 175390,120 175391,156379 175392,44 175393,5405 175394,640 175395,1014 175396,1220 175396,1222 175397,252 175398,516 175399,272 175400,217 175401,872 175402,1132 175404,167 175404,301 175404,312 175404,538 175404,622 175404,1287 175404,1531 175404,2443 175405,333 175406,7416 175407,142426 175408,6682 175411,30 175413,1033 175414,485 175415,298 175417,3 175418,1132 175419,1608 175420,255 175421,211 175422,1298 175423,1509 175424,1893 175425,240 175425,17309 175426,278 175426,356 175426,852 175427,1052 175428,2312 175429,2116 175430,304 175432,192 175434,1390 175435,261 175436,623 175437,1769 175438,563 175440,309 175440,310 175441,175442 175443,435 175444,30 175445,515 175446,200 175447,1096 175448,1 175449,217 175450,30 175451,1127 175452,452 175453,1247 175453,164572 175454,184 175455,14819 175456,843 175457,72 175458,151 175458,694 175459,2205 175459,4237 175459,33424 175459,182162 175460,175461 175460,235683 175462,1390 175463,298 175464,3 175465,137 175466,1309 175467,595 175467,6789 175467,6837 175468,1175 175469,120 175470,626 175471,885 175471,13704 175472,3367 175473,269 175474,663 175475,140 175475,1179 175476,2646 175477,581 175477,918 175478,56 175479,422 175480,489 175481,920 175482,1608 175483,586 175484,872 175485,7416 175486,1801 175487,1068 175488,240 175489,120 175490,1608 175491,138686 175492,957 175492,1623 175492,1815 175492,221327 175493,175494 175495,557 175496,138 175497,865 175498,557 175499,137 175500,88820 175501,83 175502,118 175502,4597 175503,1326 175504,408 175505,102 175506,1323 175508,4903 175509,7416 175510,809 175512,1 175513,1177 175514,872 175515,356 175516,332 175517,30 175518,1467 175519,175520 175521,298 175522,485 175523,138686 175524,175 175525,83 175526,424 175527,422 175528,56 175529,356 175529,6059 175530,516 175531,269 175532,104 175532,252 175532,1707 175532,21442 175533,175534 175535,175536 175537,202 175538,111 175538,4355 175538,4771 175539,195 175539,1284 175540,2929 175541,23701 175542,301 175543,483 175544,250 175544,1684 175545,175546 175545,217795 175547,151 175548,225 175549,602 175550,4475 175551,1467 175552,455 175553,872 175554,2424 175555,8884 175556,1871 175557,7124 175558,83 175559,2421 175560,13980 175561,175562 175563,1085 175564,151 175565,113156 175566,355 175567,919 175568,175569 175570,8788 175572,1370 175573,72 175574,72 175575,1882 175576,1531 175577,83 175578,2506 175579,72 175580,287 175581,72 175582,142473 175583,118 175583,422 175583,4597 175583,5405 175584,9025 175585,1133 175586,192 175586,1400 175587,1572 175588,1267 175589,83 175589,278 175589,1881 175589,7698 175590,83 175590,1010 175590,211889 175591,83 175592,83 175592,1010 175593,30 175594,44 175595,175596 175597,7360 175598,30 175599,809 175600,72 175601,843 175602,83 175603,30 175604,1509 175606,302 175607,2867 175607,2868 175608,10 175608,113156 175609,2779 175610,269 175611,252 175612,175613 175614,195 175615,175616 175617,392 175618,30 175620,2379 175621,483 175622,1776 175623,2379 175624,72 175625,9239 175626,2506 175627,2979 175628,175629 175630,240 175631,1127 175632,483 175633,1014 175634,1014 175635,1014 175636,1014 175637,1014 175638,994 175639,596 175640,175641 175642,620 175643,431 175644,602 175645,187 175646,175647 175648,3260 175649,206 175650,1010 175651,175652 175653,1479 175654,390 175655,602 175656,2506 175657,55849 175658,450 175659,340 175660,175661 175662,175663 175664,1359 175665,17588 175666,175667 175668,158 175669,1014 175670,142426 175671,2506 175672,145502 175673,175674 175675,602 175676,4611 175677,111 175678,2244 175679,2697 175680,366 175681,366 175682,366 175683,366 175684,366 175685,366 175686,366 175687,366 175688,455 175689,850 175690,6682 175691,850 175692,160 175693,4355 175694,175695 175696,30 175697,309 175697,310 175698,920 175699,366 175700,72 175701,355 175702,107 175703,2416 175703,2417 175704,292 175705,338 175706,298 175707,1133 175708,3538 175709,111924 175710,1177 175712,1001 175713,718 175714,292 175714,356 175714,1085 175714,1285 175714,171641 175715,175716 175717,215 175718,485 175719,298 175720,175721 175722,1212 175723,442 175724,1509 175725,248 175725,450 175725,943 175725,1572 175725,5423 175725,13207 175725,190276 175727,167 175727,202 175727,217 175727,392 175727,393 175727,588 175727,590 175727,657 175727,752 175727,919 175727,968 175727,1175 175727,1231 175727,1419 175727,2083 175727,2443 175727,4672 175728,1572 175729,175730 175731,2737 175732,142870 175733,187 175734,4192 175734,4193 175735,467 175736,850 175737,450 175738,313 175738,536 175738,818 175739,1707 175740,72 175741,217 175742,4571 175743,175744 175745,272 175746,326 175746,1240 175746,2699 175747,72 175748,1014 175749,1014 175750,968 175751,1639 175752,175753 175754,10 175755,2590 175756,106 175756,207 175756,275 175757,1014 175758,557 175759,30 175760,13661 175761,72 175762,344 175763,285 175764,872 175765,931 175766,358 175767,298 175768,485 175769,72 175770,264 175770,1968 175771,147 175772,392 175773,668 175773,6357 175774,450 175775,30 175776,697 175777,1210 175777,1801 175778,72 175779,147 175779,252 175779,1220 175781,736 175782,167 175782,1544 175783,146 175783,92476 175784,647 175785,344 175786,72 175787,72 175789,1392 175791,640 175792,2572 175793,557 175794,557 175795,310 175796,2506 175797,2506 175798,2506 175799,1220 175799,1222 175800,516 175801,252 175802,146 175802,285 175802,406 175802,1655 175802,92476 175804,30 175805,298 175806,485 175807,485 175808,298 175809,30 175810,72 175811,7768 175812,72 175813,175814 175815,30 175817,30 175818,142473 175819,994 175820,202 175821,30 175822,72 175823,175824 175825,30 175826,485 175827,298 175828,483 175829,1707 175830,175831 175832,72 175833,1014 175834,30 175835,209 175836,2506 175837,30 175838,292 175839,30 175840,294 175841,296 175842,298 175843,671 175844,147 175845,184 175846,1247 175846,164572 175847,83 175848,2867 175848,2868 175849,1707 175850,5034 175852,355 175853,22 175854,175855 175856,108347 175856,175857 175856,224110 175856,229038 175856,239300 175856,257377 175856,264054 175858,1634 175859,298 175860,485 175861,175862 175863,875 175864,175865 175866,175867 175868,647 175869,146 175869,92476 175870,344 175871,302 175872,72 175873,79 175873,106 175873,192 175873,202 175873,333 175873,586 175873,1181 175873,17772 175874,1238 175875,175876 175877,217 175878,1452 175879,6424 175880,4220 175881,994 175882,424 175883,60576 175884,83 175885,285 175886,175887 175888,296 175889,1105 175892,306 175892,307 175892,682 175892,72439 175893,202 175894,2083 175895,349 175896,1984 175897,83 175898,2572 175899,450 175900,2411 175901,158 175902,1298 175903,372 175903,390 175903,805 175903,873 175903,1082 175903,1122 175903,1807 175903,1955 175903,6068 175903,6837 175904,640 175905,1983 175906,640 175907,1298 175908,640 175909,130 175910,5212 175911,467 175911,571 175911,868 175912,1635 175913,392 175916,22 175918,6424 175919,222 175919,19443 175920,6119 175921,941 175922,31073 175923,1454 175924,5375 175926,467 175927,920 175928,920 175929,138686 175930,175 175931,5405 175932,949 175932,17263 175934,980 175935,264 175936,835 175937,702 175938,1332 175940,2083 175941,934 175942,1773 175943,1663 175950,885 175950,13704 175951,1224 175952,1370 175953,671 175954,2353 175955,1467 175956,1146 175956,1452 175957,356 175958,772 175958,15807 175959,10 175960,1608 175961,202 175962,79 175963,994 175964,1368 175965,138686 175966,175 175967,104 175968,389 175968,13361 175969,301 175970,538 175971,843 175972,415 175972,1143 175973,9457 175974,137 175976,622 175977,536 175978,3695 175979,1298 175980,22 175981,255 175983,1132 175984,3507 175985,23783 175986,1566 175988,631 175990,255 175991,356 175991,1085 175993,240 175993,818 175994,138686 175995,175 175996,313 175997,1465 175999,682 175999,72439 176001,275 176001,968 176002,137 176003,137 176004,1132 176005,1608 176006,994 176008,1298 176009,1359 176010,1033 176012,957 176012,1815 176012,205478 176014,138686 176015,175 176016,83 176017,145240 176018,313 176019,251 176019,252 176020,577 176021,360 176022,360 176022,1893 176023,1058 176024,518 176024,1326 176025,30 176026,72 176027,167 176028,19413 176029,485 176030,843 176030,44725 176031,305 176031,1844 176032,1415 176033,3507 176034,292 176034,1688 176034,4771 176035,176036 176037,640 176038,22 176038,861 176039,433 176040,481 176040,3830 176040,6424 176041,919 176041,1133 176041,1188 176042,1019 176043,497 176044,801 176045,2205 176045,33424 176046,634 176047,500 176047,189839 176048,209 176048,302 176049,151 176050,176051 176052,809 176054,211 176055,137 176056,805 176057,336 176058,1724 176059,752 176059,1210 176060,920 176061,5591 176062,22 176063,6424 176064,349 176064,392 176065,435 176066,515 176068,2373 176069,2923 176070,176071 176073,298 176074,406 176075,485 176076,994 176077,652 176078,142433 176079,843 176080,111142 176080,148875 176081,175 176083,138686 176084,2944 176085,422 176086,2353 176087,302 176088,602 176089,1282 176090,868 176090,1235 176090,1335 176091,406 176092,83 176093,1052 176093,1893 176095,195 176096,167 176096,73570 176097,636 176098,861 176099,392 176100,671 176101,1 176102,30 176103,862 176104,636 176105,885 176105,5405 176105,13704 176106,9457 176107,287 176108,83 176109,252 176110,516 176111,1220 176111,1222 176112,2073 176113,1579 176113,1659 176114,602 176115,50 176115,167 176115,779 176115,818 176115,861 176115,127158 176116,447 176117,1688 176118,1105 176119,1353 176120,1782 176121,30 176122,1432 176123,483 176124,390 176125,207 176126,6556 176127,493 176128,68 176129,22 176130,58 176131,83 176132,160 176133,83 176133,278 176135,994 176136,1177 176137,455 176138,151 176139,79 176139,217 176139,247 176139,1181 176140,83 176141,328 176142,302 176143,4571 176144,861 176145,178 176146,2590 176147,1429 176148,30 176149,30 176150,577 176151,1143 176152,176153 176154,355 176155,315 176156,113156 176157,315 176158,3623 176159,1509 176160,668 176162,516 176163,885 176163,13704 176164,30 176165,269 176166,23783 176167,217 176167,240 176167,301 176167,631 176167,1001 176167,1010 176167,1085 176167,1522 176167,1715 176168,176169 176170,1462 176170,8537 176171,33424 176172,310 176172,6556 176173,1052 176174,1467 176175,30 176176,875 176177,467 176177,779 176177,893 176178,30 176179,360 176180,55849 176181,872 176183,1132 176184,1608 176185,393 176186,2116 176187,1247 176187,164572 176188,305 176188,337 176190,1 176191,1274 176192,538 176192,934 176193,302 176193,406 176193,420 176193,1414 176193,1466 176194,8854 176195,1474 176196,58 176197,1252 176197,1253 176198,473 176199,72 176200,176201 176202,72 176203,68 176204,72 176205,516 176206,58 176207,113156 176208,1639 176209,302 176210,640 176211,304 176212,176213 176214,97 176215,1014 176216,861 176217,1014 176218,455 176220,8854 176221,30 176222,115659 176223,200 176224,406 176225,72 176226,30 176227,285 176228,285 176229,115659 176230,1 176230,94 176230,184 176230,206 176230,2787 176231,72 176232,602 176234,55849 176235,510 176235,1749 176236,1007 176237,452 176238,147 176238,306 176238,307 176238,406 176238,585 176238,779 176238,1181 176239,55849 176240,176241 176242,83 176243,147 176244,1 176245,272 176246,247 176247,1014 176248,784 176248,1462 176249,72 176250,2775 176251,447 176252,30 176253,176254 176255,30 176256,2266 176257,338 176258,56 176259,422 176260,240 176260,388 176260,389 176260,467 176260,509 176260,818 176260,2045 176260,7154 176260,15566 176260,36591 176260,100219 176260,176235 176261,137 176262,83 176263,30 176264,1858 176265,1860 176266,44 176267,1127 176268,843 176269,1014 176270,366 176271,30236 176272,77 176273,862 176274,72 176275,875 176276,145240 176277,447 176278,2775 176279,176280 176281,72 176282,602 176283,215 176284,135 176285,1467 176286,30 176287,406 176288,346 176289,333 176290,137 176291,388 176292,2424 176293,602 176294,602 176295,72 176296,602 176297,10 176298,83 176299,366 176300,146 176300,92476 176301,647 176302,344 176303,1893 176304,1893 176305,240 176305,372 176305,1085 176305,1580 176305,2812 176305,4222 176306,1257 176307,366 176308,366 176309,366 176310,366 176311,366 176312,1984 176313,424 176315,1447 176316,184 176317,137 176319,13980 176320,4453 176321,200 176322,586 176325,2646 176326,5265 176327,46 176328,784 176330,875 176331,602 176332,390 176333,261 176334,875 176337,30 176338,30 176339,3623 176341,1673 176342,344 176343,5662 176344,83 176345,1179 176346,206 176347,292 176347,1688 176348,192 176349,994 176350,184 176352,2116 176353,56 176354,422 176355,640 176356,640 176358,1179 176359,640 176361,313 176362,440 176362,794 176363,2979 176365,1019 176366,55849 176367,920 176368,1511 176368,3069 176369,5976 176370,1417 176371,147 176372,3623 176374,467 176375,788 176376,7155 176377,138686 176378,175 176379,3367 176380,1509 176381,3623 176383,346 176384,1132 176385,1608 176386,980 176387,252 176388,1359 176389,850 176390,217 176391,3623 176392,2671 176393,875 176394,2775 176395,447 176396,202 176396,406 176396,841 176396,3895 176396,6501 176396,6684 176396,8867 176396,14829 176396,18192 176396,30514 176396,36795 176396,43670 176396,44877 176396,96543 176396,106981 176396,118336 176396,176894 176396,189856 176396,192025 176396,193491 176396,193593 176396,193654 176396,194257 176396,194595 176396,211955 176396,230328 176396,232715 176396,232724 176396,233621 176396,235996 176396,236079 176396,245388 176396,249028 176396,249211 176396,249886 176396,250193 176396,251859 176396,254211 176396,254411 176396,254412 176396,255499 176396,256812 176396,256813 176396,256814 176396,256815 176396,256816 176396,257996 176396,258255 176396,259128 176396,261824 176396,263410 176396,264358 176397,79 176398,2116 176399,1305 176401,138686 176403,175 176405,1707 176406,581 176409,818 176410,2191 176411,1474 176412,147 176413,393 176414,994 176415,874 176416,406 176417,142430 176417,147191 176417,192485 176418,440 176418,1033 176419,2312 176420,65 176420,71 176420,272 176420,611 176421,147 176422,2210 176422,4237 176423,994 176424,176425 176424,265192 176426,872 176427,124668 176428,718 176429,626 176430,217 176431,355 176433,248 176435,30 176436,285 176437,146 176437,92476 176438,406 176438,1181 176439,30 176440,301 176441,931 176442,557 176444,192 176444,1089 176445,171 176446,217 176447,859 176448,557 176449,972 176450,1 176451,1326 176452,162599 176454,44725 176456,1033 176457,1033 176459,720 176461,918 176462,801 176463,1789 176466,298 176467,485 176468,346 176470,406 176471,1860 176472,602 176473,215 176475,83 176476,406 176476,1425 176477,151 176479,72 176480,344 176481,285 176483,644 176485,68 176486,34 176486,35 176487,30 176488,557 176489,30 176490,1858 176491,1860 176492,217 176493,483 176494,718 176495,30 176496,138686 176497,175 176498,1531 176498,4611 176499,2784 176500,2626 176501,563 176502,301 176503,671 176505,349 176506,3177 176507,30 176508,1871 176509,130664 176512,1544 176513,356 176514,615 176515,176516 176517,30 176519,323 176521,167 176522,30 176523,941 176525,744 176526,2210 176526,4237 176527,783 176528,515 176529,957 176529,1815 176530,784 176531,557 176532,557 176533,301 176534,430 176535,4411 176536,430 176537,1102 176538,424 176539,149 176539,251 176539,586 176539,920 176540,267 176541,127158 176544,1807 176546,5405 176547,142426 176548,599 176549,2620 176552,557 176553,332 176553,788 176553,9007 176554,252 176556,290 176556,714 176556,1511 176556,33424 176556,94134 176557,209 176559,392 176559,623 176559,1805 176559,1860 176559,2697 176560,861 176561,302 176562,176563 176564,79 176565,10 176566,631 176568,907 176569,1140 176570,56 176571,422 176572,557 176573,1220 176573,1222 176574,516 176575,252 176576,1432 176578,900 176579,217 176579,1019 176580,8463 176581,23783 176582,151 176583,301 176584,2923 176585,647 176586,1381 176587,366 176588,313 176589,2089 176589,2940 176591,264 176593,30 176594,30 176595,3804 176596,30 176597,83 176599,134 176600,424 176601,211 176602,72 176603,298 176604,485 176605,525 176606,1309 176607,278 176608,120 176608,248 176608,251 176608,557 176608,1309 176608,1749 176608,3695 176608,143287 176610,1285 176611,44 176612,631 176613,1326 176614,294 176615,6303 176616,72 176617,278 176618,620 176619,99 176620,557 176621,178 176621,302 176621,467 176622,176623 176622,184219 176622,204989 176624,115 176624,118 176625,1474 176626,424 176627,113156 176628,538 176629,176630 176631,176632 176633,10 176633,3111 176634,557 176635,240 176636,850 176637,302 176637,579 176637,687 176638,422 176639,56 176640,30 176641,99 176642,358 176644,1634 176645,167 176645,73570 176646,247 176647,2373 176648,313 176648,1282 176648,2224 176649,298 176650,485 176651,1 176652,30 176653,406 176653,1655 176653,92476 176654,206 176655,2411 176656,21442 176656,142426 176657,1014 176658,1014 176659,1014 176660,1014 176661,991 176661,5366 176662,433 176663,30 176664,158 176665,176666 176667,30 176668,450 176669,366 176670,592 176671,366 176672,2782 176672,8854 176673,323 176674,176675 176676,264 176677,366 176678,366 176679,366 176680,366 176681,366 176682,366 176683,176684 176685,485 176686,298 176687,298 176688,485 176689,217 176689,536 176690,115659 176691,302 176693,366 176693,1414 176694,861 176695,671 176696,30 176697,250 176697,1684 176698,285 176699,2116 176700,323 176701,577 176702,366 176703,949 176704,450 176705,273 176706,30 176707,483 176708,30 176709,872 176710,424 176711,30 176712,323 176713,176714 176715,99 176716,126 176717,932 176718,176719 176720,175 176721,328 176722,176723 176724,1821 176725,2205 176725,33424 176726,623 176726,1805 176727,83 176728,994 176730,447 176731,2775 176732,127158 176733,127158 176734,147 176735,932 176736,500 176737,2775 176738,1962 176739,54 176740,1052 176741,1882 176742,323 176743,2590 176744,355 176745,1893 176747,302 176749,626 176750,158 176752,1241 176754,305 176755,305 176756,330 176757,1566 176758,1955 176760,1707 176761,309 176761,310 176762,1238 176763,176764 176765,557 176766,1452 176767,207 176768,557 176769,1893 176770,868 176771,703 176772,779 176773,136 176775,323 176776,2083 176777,176778 176779,34 176779,35 176780,4218 176781,1732 176782,104 176782,215 176782,704 176782,1212 176782,1282 176782,1402 176782,1432 176782,4222 176782,15077 176782,16755 176782,46874 176782,59273 176782,111142 176782,118913 176782,121616 176782,141840 176782,148456 176782,148875 176782,152789 176782,172243 176782,176782 176782,190541 176782,194521 176782,197873 176782,200855 176782,245556 176782,255028 176783,138686 176784,83 176785,602 176786,259 176786,859 176787,171 176788,1167 176789,30 176790,602 176791,44725 176792,1522 176792,1927 176793,113156 176794,252 176796,99 176797,841 176798,30 176799,1858 176800,1860 176801,171 176802,1881 176803,596 176804,602 176805,209 176806,275 176807,353 176807,176808 176809,58 176810,994 176811,46 176812,1949 176813,30 176814,1151 176814,1453 176814,1722 176814,3258 176814,3538 176816,1294 176816,2480 176817,158 176818,23783 176819,838 176820,333 176821,1319 176822,1544 176824,392 176825,31073 176826,137 176827,467 176828,920 176829,1474 176831,1512 176831,5992 176832,328 176833,254 176834,1749 176835,192 176835,217 176835,305 176835,1188 176835,4101 176835,13538 176835,142426 176836,1319 176836,9542 176837,859 176838,356 176838,1326 176839,138686 176840,485 176841,298 176843,1052 176843,3345 176844,503 176846,406 176847,21442 176848,302 176849,872 176850,13661 176851,1429 176852,151 176853,1132 176854,1608 176856,920 176857,1220 176857,1222 176858,252 176859,251 176860,140 176861,58 176862,994 176863,46 176864,138686 176865,175 176867,392 176867,433 176869,1151 176870,2205 176870,33424 176870,245910 176871,314 176871,1085 176872,1419 176873,602 176874,861 176875,1769 176878,779 176879,626 176880,55849 176881,176882 176883,41 176883,1016 176883,1745 176884,473 176885,1531 176885,35486 176886,1616 176887,1769 176888,1143 176889,30 176890,176891 176892,809 176893,1769 176895,516 176895,1220 176895,1222 176896,1 176897,668 176898,1769 176899,697 176899,1769 176900,1769 176901,1769 176902,762 176902,994 176903,1769 176904,217 176905,81 176906,1359 176907,1805 176909,1309 176910,30 176911,2017 176912,312 176913,10 176914,1769 176915,726 176917,1390 176918,176919 176920,1085 176921,30 176922,3555 176923,292 176924,7572 176925,30 176926,120 176926,3115 176927,176928 176929,2944 176930,302 176931,406 176932,2379 176933,406 176934,176935 176936,30 176937,1858 176938,1860 176939,900 176940,256 176941,66297 176943,1893 176944,41 176944,104 176944,372 176944,431 176944,631 176944,784 176944,805 176944,1119 176944,1188 176944,1635 176944,1659 176944,13538 176945,30 176946,1353 176947,66297 176948,111 176948,290 176948,309 176948,310 176948,94134 176951,30 176952,1688 176953,30 176954,1132 176955,1608 176957,1149 176958,843 176959,217 176959,222 176960,996 176961,1776 176961,21442 176962,178 176963,304 176964,106 176965,1140 176966,1381 176967,1436 176968,176969 176970,581 176971,6068 176972,1210 176973,424 176974,328 176975,2424 176977,2590 176978,557 176979,202 176979,240 176979,599 176979,911 176979,1188 176979,1796 176979,2073 176980,2646 176980,3623 176981,1580 176982,557 176983,602 176984,2373 176985,4571 176986,473 176988,1052 176988,1659 176989,459 176990,56 176991,422 176992,862 176994,107 176995,4545 176995,56150 176996,1531 176997,422 176998,138686 176999,515 177000,175 177001,1556 177002,726 177003,310 177004,366 177005,83 177006,408 177007,278 177008,217 177009,192 177010,1265 177010,1266 177011,1151 177012,1590 177013,360 177013,1127 177013,1769 177014,1241 177014,1837 177014,1849 177016,2367 177017,1220 177017,1222 177018,252 177019,516 177020,30 177021,1511 177021,3069 177022,581 177023,726 177024,509 177024,510 177025,557 177027,304 177028,3135 177029,862 177030,991 177030,1298 177031,79 177033,392 177034,1319 177034,66297 177035,467 177035,156379 177036,65 177037,248 177038,195 177039,299 177039,1181 177039,2646 177040,2944 177041,30 177042,6837 177043,330 177044,1298 177045,113156 177046,68 177046,81 177047,483 177048,1769 177049,1 177050,142426 177051,211 177052,4903 177053,666 177053,744 177053,750 177053,1124 177054,158 177054,483 177055,392 177056,588 177056,590 177057,589 177057,3846 177058,1 177060,775 177061,932 177062,298 177063,485 177064,991 177065,302 177068,145240 177069,1939 177070,1381 177071,273 177072,704 177073,861 177074,2646 177075,55849 177076,366 177077,1274 177078,298 177079,485 177080,818 177081,1566 177082,142426 177082,145751 177083,177084 177085,366 177086,663 177087,991 177088,885 177088,13704 177089,1769 177090,298 177091,485 177092,72 177093,9029 177094,485 177095,298 177096,222 177096,818 177096,1796 177097,34 177097,35 177097,379 177097,3252 177098,177099 177100,794 177101,1707 177102,83 177103,140 177104,30 177105,5906 177106,557 177107,626 177108,278 177109,137 177110,862 177112,10 177113,285 177114,30 177115,596 177116,920 177117,330 177118,563 177119,30 177120,30 177121,1707 177122,920 177123,30 177124,4571 177125,142426 177126,30 177127,31977 177128,2620 177129,30 177130,406 177131,2779 177132,72 177133,289 177133,290 177133,94134 177135,1639 177136,259 177137,30 177138,83 177138,379 177139,333 177140,77 177142,647 177143,146 177143,92476 177144,344 177145,30 177146,2048 177147,861 177147,919 177148,349 177149,30 177150,30 177151,177152 177153,980 177154,72 177155,1058 177156,1 177157,5366 177158,72 177159,447 177160,2775 177161,422 177162,30 177163,422 177164,422 177165,422 177166,422 177167,422 177168,422 177169,422 177170,422 177171,602 177172,30 177173,30 177174,30 177175,8822 177176,72 177177,30 177178,30 177179,72 177180,340 177181,602 177182,1243 177183,602 177184,59 177184,94 177184,2787 177184,3794 177185,72 177186,155481 177187,275 177188,278 177189,285 177190,50 177191,83 177192,841 177193,602 177194,269 177195,177196 177195,203595 177197,920 177198,336 177198,599 177198,1623 177200,113156 177201,872 177202,2735 177203,177204 177203,204663 177205,740 177205,741 177206,843 177207,177208 177209,1453 177210,63 177211,72 177212,68 177213,63 177214,177215 177216,217 177216,446 177216,872 177216,1118 177216,1796 177216,3297 177216,19005 177217,99 177218,255 177219,177220 177221,1634 177222,177223 177224,211 177225,1677 177226,338 177226,1058 177226,4039 177227,56 177227,652 177228,247 177229,137 177230,355 177231,1070 177231,1677 177232,577 177233,104 177233,120 177233,202 177233,217 177233,379 177233,455 177233,577 177233,949 177233,1274 177233,1608 177233,2266 177233,2784 177233,7092 177233,13546 177234,1623 177235,1132 177236,1608 177238,459 177239,1769 177240,390 177241,571 177241,156379 177242,2701 177243,647 177244,146 177244,92476 177245,344 177246,467 177246,868 177247,811 177247,893 177248,392 177249,408 177251,337 177252,301 177253,72 177254,124668 177255,338 177256,2353 177257,336 177257,1623 177258,136 177259,640 177260,2787 177261,94 177262,422 177263,422 177264,640 177265,422 177266,422 177267,422 177268,143287 177269,422 177270,422 177271,640 177272,422 177273,422 177274,422 177275,640 177276,1247 177276,164572 177277,452 177278,184 177279,640 177280,252 177281,177282 177283,137 177283,1707 177284,289 177284,290 177284,94134 177285,1984 177286,1203 177287,994 177288,58 177289,46 177290,1359 177291,640 177292,209 177292,579 177293,666 177294,1871 177294,2266 177294,2421 177295,1707 177296,142426 177296,145751 177297,138686 177298,175 177299,356 177299,1119 177300,788 177301,83 177302,137 177303,1769 177304,485 177305,298 177306,60576 177307,162599 177308,425 177310,3258 177311,818 177312,120 177313,467 177314,920 177315,162599 177318,1608 177319,1132 177320,59 177320,3794 177321,251 177322,602 177323,602 177325,1860 177326,1858 177327,3252 177328,1033 177329,852 177330,56 177331,422 177332,83 177333,3209 177334,1132 177335,147 177336,852 177336,957 177336,1815 177337,726 177338,287 177338,843 177338,19010 177339,779 177340,1608 177341,872 177342,68216 177344,192 177346,138686 177347,4672 177348,175 177349,332 177349,5469 177349,6119 177350,310 177350,6556 177351,447 177352,2775 177353,240 177353,818 177355,6059 177356,21442 177357,4611 177358,1 177359,30 177360,2737 177361,252 177363,192 177364,805 177365,28107 177367,2784 177369,124668 177370,602 177371,397 177372,252 177373,393 177374,996 177376,338 177377,136 177378,1011 177379,809 177381,6059 177383,83 177384,620 177385,1014 177386,248 177388,493 177389,459 177390,222 177391,920 177392,920 177393,79 177395,346 177396,10 177397,252 177398,151 177399,620 177400,392 177400,1860 177400,15609 177401,5405 177402,406 177403,447 177404,30 177405,622 177406,779 177407,302 177407,579 177407,687 177407,1374 177408,1220 177408,1222 177409,251 177410,252 177411,1608 177412,1132 177413,1293 177414,23010 177415,918 177416,1117 177417,707 177418,1860 177419,1858 177420,30 177421,171 177422,292 177422,442 177422,4771 177422,185877 177423,83 177424,138686 177425,175 177426,338 177427,95338 177428,4455 177430,269 177432,83 177433,6059 177437,217 177437,314 177437,1085 177437,3623 177437,75912 177438,328 177439,3474 177440,794 177441,2434 177442,79 177443,1070 177444,406 177445,893 177446,875 177447,775 177448,435 177449,697 177450,48 177451,602 177452,1181 177453,602 177454,9457 177455,240 177456,602 177457,515 177458,177459 177460,843 177461,177462 177461,197212 177461,206278 177461,206650 177461,206850 177461,219411 177461,226970 177461,249527 177461,250085 177461,261317 177461,264128 177461,264731 177463,1010 177463,1298 177464,147 177464,217 177465,422 177465,577 177465,615 177465,762 177465,949 177465,1058 177465,1265 177465,1266 177465,1607 177465,1749 177465,5961 177465,9457 177465,90845 177465,131675 177466,177467 177468,43613 177469,920 177470,147 177470,158 177471,142405 177472,30 177473,247 177473,2867 177473,2868 177474,142426 177475,1203 177476,338 177477,1572 177478,34 177478,35 177479,48 177480,483 177481,602 177482,1509 177484,48 177485,30 177486,278 177486,455 177486,2266 177486,7768 177488,620 177489,2646 177490,55849 177491,2646 177492,83 177493,1274 177494,850 177495,158 177496,2367 177497,406 177498,704 177499,366 177501,424 177502,1323 177503,1326 177504,408 177505,102 177506,1465 177507,2995 177508,306 177508,307 177509,77 177510,302 177513,1133 177514,301 177514,1231 177514,3422 177515,779 177516,10 177518,442 177519,673 177520,225 177521,306 177521,307 177522,366 177523,1241 177523,1849 177523,19831 177523,177369 177523,187176 177523,218495 177523,260284 177523,260285 177524,1515 177525,779 177526,30 177527,30 177528,435 177529,1235 177529,1335 177530,30 177531,1 177531,149 177532,115659 177533,399 177535,1844 177536,634 177537,1 177538,56 177539,422 177540,44725 177541,10 177541,1773 177542,1274 177543,1014 177544,83 177545,1014 177546,1014 177548,885 177548,13704 177549,83 177550,843 177551,4594 177552,563 177553,143287 177556,177557 177558,493 177559,30 177560,366 177561,393 177561,1531 177562,557 177563,2620 177564,862 177565,538 177565,934 177566,622 177567,302 177569,55849 177570,302 177571,1474 177572,873 177572,1058 177572,1243 177573,861 177574,330 177575,919 177576,1785 177577,934 177578,302 177579,563 177580,861 177581,957 177581,1815 177583,302 177584,30 177585,255 177586,30 177587,240 177589,406 177590,118336 177591,177592 177593,30 177594,99 177595,2048 177596,30 177597,136 177598,287 177599,30 177600,302 177601,2737 177602,30 177603,278 177604,861 177605,3804 177606,1635 177606,1659 177607,861 177608,247 177609,83 177610,298 177611,485 177612,250 177612,1684 177613,285 177614,3623 177615,142405 177616,932 177617,30 177618,177619 177620,861 177621,177622 177623,35 177623,634 177623,805 177623,1011 177623,42121 177624,602 177626,177627 177628,151 177629,99 177630,278 177631,177632 177633,30 177634,30 177635,602 177636,620 177637,602 177638,30 177640,83 177641,10 177642,83 177643,406 177644,779 177645,10 177646,1 177647,30236 177648,306 177648,307 177649,1515 177650,779 177651,366 177652,1085 177653,1 177654,15609 177655,34 177655,35 177655,202 177655,217 177655,261 177655,536 177655,1001 177655,1274 177655,1927 177655,2266 177655,2671 177655,2784 177655,4594 177655,4637 177655,7092 177656,206 177657,44 177658,72 177659,1 177659,943 177660,366 177661,1608 177662,652 177663,652 177664,346 177665,1179 177666,2506 177667,30 177669,255 177670,2506 177671,349 177672,261 177672,1955 177673,75912 177674,58 177675,46 177676,994 177677,602 177678,177679 177678,199628 177678,218931 177678,254108 177678,262373 177680,557 177681,358 177683,285 177683,779 177684,3148 177685,355 177686,1235 177686,1335 177687,30 177688,647 177689,344 177690,146 177690,92476 177691,177692 177693,147 177693,158 177693,178 177693,337 177693,447 177693,516 177693,1181 177693,1388 177693,1531 177693,4455 177693,4545 177693,6119 177693,56150 177694,577 177695,366 177696,366 177697,366 177698,422 177699,366 177700,30 177701,302 177702,1085 177702,2083 177703,366 177704,366 177705,19010 177706,366 177707,1893 177708,516 177708,907 177708,1623 177709,1608 177710,1132 177711,30 177713,56 177713,43613 177714,1388 177715,450 177716,177717 177719,1462 177719,8907 177720,186 177721,312 177722,852 177723,83 177724,1893 177725,3422 177726,30 177729,2296 177730,1007 177731,422 177732,422 177733,422 177734,422 177735,422 177736,422 177737,422 177738,422 177739,422 177740,422 177741,422 177742,8598 177743,15179 177744,392 177745,673 177746,1893 177747,1707 177748,433 177751,1 177753,1238 177754,1385 177755,2367 177756,3003 177758,177759 177760,177761 177762,4611 177763,599 177764,920 177765,467 177766,83 177768,58 177769,875 177770,48 177771,872 177772,2353 177774,177775 177777,259 177777,676 177778,240 177778,372 177778,390 177778,968 177779,1359 177780,2671 177781,6506 177782,602 177783,142433 177784,1474 177785,358 177786,843 177787,177788 177789,1149 177790,142426 177791,130 177792,1452 177793,536 177793,4672 177794,843 177795,2116 177796,718 177797,447 177798,2775 177800,138686 177801,175 177802,1844 177803,289 177803,358 177803,1127 177803,1332 177803,1844 177803,6682 177803,94134 177804,1509 177805,536 177806,72 177807,186 177808,516 177809,1220 177809,1222 177810,252 177811,202 177813,422 177814,192 177814,779 177815,4 177815,5 177816,406 177818,162599 177819,162599 177820,1122 177821,1235 177821,1335 177822,2209 177823,1572 177824,1014 177824,2979 177827,1955 177828,336 177828,1623 177829,647 177830,146 177830,92476 177831,344 177832,28203 177833,34 177833,35 177833,217 177834,536 177837,151 177838,2353 177840,222 177841,1 177841,147 177841,149 177841,89035 177842,563 177842,818 177843,590 177843,1419 177844,626 177845,138686 177846,660 177846,666 177846,743 177847,175 177848,298 177849,485 177850,425 177851,1001 177852,72 177853,1551 177854,1132 177855,1608 177857,141912 177858,493 177859,285 177860,177861 177862,358 177863,477 177863,536 177864,392 177865,2209 177866,1132 177867,1608 177868,536 177869,1143 177870,106 177871,30 177872,309 177872,310 177873,252 177874,1220 177874,1222 177875,251 177876,247 177877,83 177878,83 177879,178 177880,5405 177881,177882 177884,557 177885,1175 177887,872 177887,1151 177888,602 177889,647 177890,344 177891,146 177891,92476 177892,459 177893,422 177894,56 177895,447 177896,2775 177897,934 177899,23783 177901,586 177902,5440 177904,516 177906,2205 177906,33424 177906,245910 177907,240 177908,2784 177909,431 177910,336 177910,1623 177911,23783 177912,23783 177913,907 177914,1359 177915,177916 177917,1531 177918,581 177922,389 177923,1522 177923,2979 177924,893 177925,302 177925,893 177927,1001 177928,2989 177928,2991 177929,1177 177931,298 177932,485 177933,3695 177935,217 177936,309 177936,310 177937,1085 177938,200 177939,389 177941,151 177942,140 177942,515 177942,1436 177944,72 177945,389 177945,660 177945,7092 177947,177948 177949,1274 177950,1127 177951,515 177952,356 177952,852 177952,1085 177953,55849 177954,605 177955,366 177956,366 177957,2116 177958,302 177959,861 177960,162599 177961,577 177962,1370 177963,30 177964,37 177965,2620 177966,3413 177967,1776 177968,55849 177969,55849 177970,55849 177971,314 177971,1010 177972,55849 177973,1085 177974,389 177974,1240 177974,1465 177974,2620 177975,99 177975,147 177975,158 177975,206 177976,571 177977,55849 177978,1179 177978,1353 177978,2146 177978,3297 177978,5326 177979,30 177980,30 177981,211 177982,1010 177983,30 177984,30 177985,30 177988,30 177990,287 177990,809 177990,19010 177991,298 177992,485 177993,30 177994,30 177996,30 177997,72 177998,392 177999,30 178000,1359 178001,55849 178002,1220 178002,1222 178003,22580 178004,83 178004,843 178005,406 178006,885 178006,13704 178007,332 178008,1984 178009,1623 178010,8373 178011,30 178012,167 178012,240 178012,301 178012,567 178012,615 178012,968 178012,1122 178012,1160 178012,1231 178012,1293 178012,1298 178012,1436 178012,1462 178012,1564 178012,1785 178012,1832 178012,2083 178012,2191 178012,2979 178012,3207 178012,3328 178012,5662 178012,5718 178012,8537 178012,189303 178012,221828 178012,231939 178013,843 178014,30 178015,2590 178016,178017 178018,809 178019,65 178020,1769 178021,102 178022,408 178023,1323 178024,1326 178025,72 178026,328 178027,255 178028,72 178029,34 178029,35 178029,83 178030,2373 178031,292 178031,1204 178031,1332 178031,1572 178031,5258 178031,7806 178031,180118 178031,187284 178031,208551 178031,210011 178031,211584 178032,278 178033,1707 178034,83 178036,1782 178037,557 178038,138 178039,865 178040,557 178041,137 178042,88820 178043,118 178043,4597 178045,30 178046,1014 178047,30 178048,1014 178049,28130 178050,2590 178051,30 178052,1014 178054,302 178055,30 178056,1 178057,1 178058,178059 178060,240 178060,588 178060,590 178060,2205 178060,33424 178061,861 178062,55849 178063,55849 178064,280 178064,17245 178065,35 178065,269 178065,439 178065,516 178065,2979 178066,1612 178068,178069 178070,406 178071,178072 178073,485 178074,298 178075,30 178076,489 178077,126 178077,206 178077,435 178078,626 178078,1309 178078,2779 178078,2784 178079,111 178079,2868 178080,1390 178081,298 178082,485 178083,207 178084,392 178086,358 178087,602 178089,366 178090,602 178091,872 178092,1429 178093,264 178094,1381 178095,346 178096,1007 178097,4771 178098,3193 178099,1143 178100,285 178101,668 178102,250 178102,1684 178103,7270 178104,77 178104,269 178105,250 178105,1684 178106,285 178107,3422 178108,46 178109,9010 178110,30 178111,44 178112,483 178113,30 178114,862 178115,225 178116,34 178116,35 178117,1181 178118,6556 178119,8884 178120,1001 178120,4060 178121,30 178122,30 178123,1085 178124,424 178125,1379 178126,366 178127,366 178128,366 178129,366 178130,366 178131,818 178132,536 178133,30 178134,355 178135,972 178136,83 178138,628 178139,872 178140,2646 178141,83 178142,50 178143,2224 178144,83 178145,4193 178149,8788 178151,2073 178153,298 178154,485 178155,30 178156,349 178157,1 178158,147 178158,1425 178159,1572 178160,1016 178161,30 178162,337 178163,106 178164,8822 178165,440 178166,479 178167,3846 178168,142870 178169,1285 178170,30 178171,516 178172,2209 178173,192 178174,50 178175,30 178176,30 178177,195 178179,779 178180,588 178180,590 178181,1718 178182,19 178183,818 178184,3370 178184,8992 178185,652 178185,1462 178186,30 178187,422 178188,422 178189,422 178190,422 178191,422 178192,422 178193,422 178194,422 178195,422 178196,422 178197,422 178198,422 178199,1425 178200,3623 178201,22 178202,1 178203,1 178204,178205 178206,493 178206,1531 178207,424 178208,222 178208,1639 178209,861 178210,602 178211,483 178212,30 178213,178214 178213,206594 178215,30 178216,30 178217,30 178218,178219 178220,310 178221,312 178223,4691 178224,178225 178226,178227 178228,222 178229,920 178230,83 178231,788 178231,1531 178232,178233 178234,602 178235,447 178236,13136 178237,483 178238,178239 178238,184534 178240,137 178240,1082 178240,1888 178241,631 178242,269 178243,275 178244,1 178245,602 178246,577 178246,647 178246,1544 178247,1132 178248,1608 178249,178250 178251,178250 178252,1284 178252,148742 178253,104 178253,200 178254,862 178255,178256 178257,500 178258,1962 178259,1052 178260,1882 178261,2775 178262,54 178263,178 178264,516 178265,602 178266,809 178267,602 178268,602 178269,602 178271,30 178272,3623 178273,1479 178274,117163 178275,390 178276,30 178277,314 178278,2048 178279,22 178280,178281 178282,178283 178284,875 178285,875 178286,146 178286,92476 178287,647 178288,344 178289,178290 178289,232903 178291,178292 178293,843 178294,207 178295,178296 178297,1014 178298,3111 178298,216890 178298,217767 178298,240334 178299,178300 178301,809 178302,301 178303,366 178304,366 178305,366 178306,366 178307,187 178308,140 178309,178310 178311,10 178312,3252 178313,178314 178315,3085 178316,1773 178317,178318 178319,850 178320,72 178321,202 178321,142870 178322,178323 178324,72 178326,652 178327,2697 178328,557 178329,7652 178330,184 178330,991 178330,1179 178330,1639 178330,5366 178331,137 178332,30 178333,178334 178335,355 178336,107 178337,2416 178337,2417 178338,292 178339,338 178340,298 178341,1133 178342,3538 178343,178344 178346,4192 178346,4193 178347,1707 178348,137 178349,137 178350,1359 178351,1796 178351,3804 178352,3447 178353,206 178355,337 178356,30 178357,3218 178358,1556 178359,178360 178362,72 178363,872 178364,872 178365,32 178368,178369 178370,178369 178371,779 178372,7360 178373,137 178374,422 178375,56 178376,1305 178377,1072 178378,30 178379,972 178380,10 178381,301 178382,178383 178384,178385 178386,31977 178386,178387 178388,2146 178389,7 178390,160 178391,1962 178392,7316 178393,3161 178394,304 178395,875 178396,247 178397,2296 178398,406 178399,2775 178400,447 178401,489 178402,269 178403,30 178404,4810 178405,355 178406,483 178408,485 178409,298 178410,6682 178411,79 178412,2506 178413,2646 178414,1151 178415,872 178416,872 178417,178418 178419,2989 178419,2991 178420,2367 178421,2367 178423,4252 178424,1 178425,178426 178427,30 178428,994 178429,202 178430,694 178431,72 178432,994 178433,1893 178433,117163 178434,557 178435,557 178436,628 178437,557 178438,22293 178439,178440 178441,15807 178442,647 178443,15807 178444,932 178445,200 178447,3804 178448,1 178449,972 178450,178451 178452,389 178453,206 178454,19 178456,2750 178457,312 178457,1052 178457,3695 178459,3769 178460,178461 178462,527 178463,1612 178464,178465 178466,4611 178467,30 178468,292 178469,500 178470,4101 178471,972 178472,366 178473,1467 178474,3246 178475,636 178476,1 178477,142473 178478,211 178479,602 178480,2260 178481,313 178482,599 178483,366 178484,323 178485,805 178486,30 178487,72 178488,1 178489,178490 178491,72 178492,54 178493,97 178494,779 178495,602 178496,104 178497,178498 178499,1769 178500,72 178501,7124 178502,30 178503,255 178504,1715 178505,178506 178507,602 178508,310 178509,835 178511,509 178512,5976 178513,366 178515,292 178516,294 178517,138 178518,296 178519,298 178520,72 178521,388 178522,30 178523,178524 178525,30 178526,3769 178527,72 178528,1224 178529,30 178530,136 178531,843 178532,269 178533,355 178534,192 178534,4192 178534,4193 178535,58 178536,994 178537,46 178538,119 178539,640 178540,147 178541,1479 178542,2205 178542,33424 178544,83 178545,2421 178547,1 178548,178549 178550,1238 178551,337 178552,1452 178553,337 178556,360 178556,697 178556,1769 178558,5375 178559,760 178560,178561 178562,1 178564,178565 178566,949 178567,994 178568,623 178569,3297 178570,178571 178573,167 178573,861 178573,1241 178573,76096 178573,127158 178574,3474 178575,640 178576,41 178576,272 178576,298 178576,417 178576,862 178576,911 178576,1179 178576,1474 178576,2204 178576,2237 178576,2296 178576,2572 178576,2923 178576,3623 178576,4190 178576,4222 178576,6068 178576,7194 178576,15277 178576,22389 178576,38822 178576,42810 178576,44725 178576,60381 178576,66297 178576,75912 178576,97423 178576,114908 178576,119957 178576,121109 178576,127158 178576,138898 178576,139994 178576,160971 178576,178576 178576,180583 178576,181891 178576,185300 178576,185460 178576,185874 178576,185877 178576,189174 178576,191174 178576,191467 178576,192322 178576,207528 178576,217502 178576,221101 178576,228585 178576,231072 178576,242177 178576,242227 178576,254990 178576,262420 178577,640 178578,640 178579,422 178580,422 178581,422 178582,422 178583,422 178585,422 178586,422 178587,422 178588,422 178589,422 178590,640 178591,994 178592,422 178593,422 178594,83 178595,41 178598,626 178599,1072 178600,233 178601,920 178602,589 178603,1566 178604,467 178605,269 178606,685 178606,1113 178606,1319 178606,24500 178607,184 178608,2146 178610,1566 178611,167 178611,2979 178611,73570 178612,83 178613,55849 178614,3623 178615,872 178616,671 178617,868 178619,875 178620,999 178621,999 178623,178623 178625,5591 178628,10 178629,146 178629,92476 178630,647 178631,344 178632,397 178633,146 178633,92476 178634,647 178635,344 178636,1608 178637,1132 178638,240 178639,1010 178640,602 178641,2421 178642,302 178643,1072 178644,2045 178645,455 178646,2266 178647,217 178648,4594 178649,4637 178650,1201 178651,1818 178653,269 178655,255 178656,571 178656,868 178658,1 178659,2083 178660,22 178661,781 178662,1132 178663,138686 178664,302 178665,175 178666,875 178667,171 178668,697 178669,4771 178671,178672 178673,146 178673,92476 178674,422 178676,1707 178677,87 178677,1240 178678,579 178679,302 178680,861 178681,217 178682,3804 178683,178684 178685,1983 178686,1274 178687,97 178687,158 178688,994 178689,240 178690,994 178691,994 178692,994 178693,994 178694,2416 178694,2417 178695,2083 178696,40566 178697,1132 178698,781 178699,178700 178701,126 178701,872 178701,1151 178704,781 178705,1132 178707,138686 178708,175 178709,433 178710,151 178711,60 178711,994 178711,9539 178711,16614 178711,21944 178712,516 178713,1 178714,272 178715,704 178716,358 178717,167 178718,217 178719,30331 178720,433 178721,158 178721,941 178723,663 178724,467 178725,30 178726,467 178726,868 178726,1345 178727,657 178728,994 178729,1220 178729,1222 178730,1276 178730,3698 178731,439 178732,1559 178733,19010 178735,994 178737,3218 178738,868 178739,2749 178739,2750 178739,27282 178739,39408 178739,55686 178739,68135 178739,87275 178739,109863 178739,163806 178739,164477 178739,178739 178739,179183 178739,179272 178739,179321 178739,179829 178739,179863 178739,181291 178739,181292 178739,181435 178739,181451 178739,182009 178739,182070 178739,182905 178739,183468 178739,188838 178739,189279 178739,189344 178739,189478 178739,192976 178739,212021 178739,214776 178739,215509 178739,215677 178739,217244 178739,217548 178739,226591 178739,229275 178740,1467 178741,1860 178742,1858 178744,996 178745,3555 178746,994 178747,872 178748,779 178749,346 178749,435 178749,447 178749,586 178749,1294 178750,1673 178751,1151 178752,22 178753,79 178754,151 178755,809 178756,1773 178757,292 178757,366 178757,500 178757,972 178757,4101 178758,1181 178759,30 178761,22 178763,292 178764,1893 178765,515 178766,1962 178767,500 178768,1052 178769,1882 178770,2775 178771,54 178772,50 178773,868 178774,30 178775,1623 178777,30 178778,779 178780,861 178781,893 178782,918 178783,485 178784,298 178785,138686 178786,175 178788,422 178789,56 178790,1370 178791,447 178792,2775 178793,447 178794,2775 178795,2775 178796,447 178797,162599 178798,485 178799,298 178800,178801 178802,1462 178802,8537 178802,84257 178803,422 178804,56 178805,120 178806,158 178809,151 178809,972 178809,1402 178810,1616 178810,2979 178812,852 178812,2168 178813,30 178814,424 178815,433 178816,622 178817,83 178818,30 178819,3422 178821,8463 178822,30 178823,483 178824,620 178825,1370 178826,483 178827,1722 178827,3538 178828,1579 178829,151 178830,1462 178830,8537 178831,146 178831,92476 178832,647 178833,344 178834,30 178835,302 178836,406 178837,178838 178839,344 178840,146 178840,92476 178841,647 178842,356 178843,14434 178844,56 178845,422 178847,30 178848,83 178849,102 178850,141912 178851,30 178852,30 178853,83 178855,306 178855,307 178857,1801 178858,1515 178859,779 178860,861 178861,83 178862,1467 178863,536 178864,217 178865,1140 178866,278 178867,1 178868,636 178869,136 178870,389 178872,640 178873,294 178873,1001 178874,1571 178875,34 178875,389 178875,536 178875,1072 178875,1539 178875,1881 178875,2424 178875,2944 178875,4594 178875,5976 178875,13137 178876,406 178876,1181 178876,1515 178877,178878 178879,557 178881,647 178882,366 178883,406 178884,1454 178885,2620 178886,2421 178887,718 178888,178889 178890,861 178890,2116 178891,83 178892,2373 178893,219 178894,602 178895,1370 178896,1821 178897,86 178897,167 178897,301 178897,907 178897,1522 178897,2083 178897,2191 178897,2557 178897,2979 178897,3138 178898,358 178899,485 178900,1010 178901,393 178902,525 178903,1309 178904,83 178905,595 178906,1285 178907,557 178908,485 178909,1033 178910,707 178911,3524 178913,631 178914,294 178915,1381 178916,1381 178917,1474 178918,178919 178920,247 178921,118336 178922,2116 178923,891 178924,79 178925,7416 178927,115659 178927,148600 178928,1014 178929,1014 178930,1014 178931,1612 178932,760 178933,178934 178935,1014 178936,298 178937,485 178938,485 178939,298 178940,298 178941,485 178942,577 178943,1616 178945,30 178946,516 178947,252 178948,1220 178948,1222 178949,30 178950,107 178950,536 178950,3138 178951,30 178952,34 178952,35 178953,72 178955,30 178956,30 178957,30 178958,30 178959,30 178960,30 178961,602 178962,86416 178963,1149 178964,1253 178965,2590 178966,30 178967,599 178968,30 178969,54 178970,247 178971,431 178972,63 178973,30 178974,422 178975,56 178976,30 178977,30 178978,30 178979,932 178980,138 178981,178982 178983,178984 178985,2979 178986,640 178987,704 178988,1298 178989,207 178991,178992 178993,872 178994,1429 178995,155481 178996,178997 178996,212497 178998,56 178999,422 179000,668 179001,50 179001,140 179001,147 179001,222 179002,54 179003,184 179004,54 179005,147 179005,422 179006,30 179007,968 179008,1143 179009,424 179010,7155 179011,366 179012,145240 179013,151 179014,4691 179015,1634 179017,30 179018,30 179019,1893 179020,1893 179021,30 179023,355 179024,48 179024,292 179024,397 179024,483 179025,30 179026,356 179026,611 179027,1769 179028,179029 179030,2083 179030,2557 179031,5591 179032,142210 179033,1417 179034,1479 179035,483 179035,999 179036,30 179037,1522 179038,83 179040,744 179041,73570 179042,640 179044,1132 179045,781 179047,1238 179048,1818 179048,4218 179048,4237 179048,182162 179049,852 179049,1309 179050,179051 179052,179053 179055,875 179056,838 179056,852 179056,1119 179056,1203 179056,1309 179056,1807 179056,1955 179056,44393 179056,45278 179056,47173 179056,66918 179056,173956 179056,174910 179056,176758 179058,171 179059,1287 179060,707 179061,1522 179062,447 179063,2775 179064,171 179065,200 179066,875 179068,171 179069,781 179070,1132 179073,2775 179074,447 179075,147 179076,422 179077,422 179078,422 179079,179080 179079,235190 179082,422 179083,422 179084,422 179085,1893 179086,422 179087,422 179088,422 179089,422 179090,850 179091,422 179092,422 179093,422 179094,1368 179095,422 179097,56 179098,422 179099,596 179100,1858 179101,1860 179102,171 179103,63 179104,467 179105,920 179106,149 179106,192 179106,406 179106,1425 179107,1132 179108,781 179109,3623 179110,875 179112,179113 179114,149 179115,1127 179116,2367 179118,779 179120,171 179121,505 179123,305 179124,138686 179125,175 179126,175 179126,31977 179127,287 179128,843 179129,120 179129,261 179130,209 179131,72 179132,104 179133,1210 179134,72 179135,809 179136,142426 179137,1019 179137,2266 179137,7092 179138,392 179139,206 179140,79 179141,1298 179141,1749 179141,6695 179142,3 179144,179145 179147,146 179147,92476 179152,2775 179153,447 179154,1010 179155,120 179155,261 179157,336 179157,1623 179158,120 179159,269 179160,435 179160,467 179160,579 179160,2116 179161,120 179162,120 179163,269 179164,252 179165,2205 179165,33424 179166,72 179168,1984 179170,179171 179170,179175 179170,179555 179170,186809 179170,242680 179172,179170 179173,22 179174,718 179177,557 179178,1127 179179,179180 179181,269 179182,920 179184,179185 179186,1860 179187,1858 179188,10 179189,2146 179190,136 179192,179193 179196,366 179196,500 179197,310 179198,292 179199,138686 179200,175 179201,273 179202,315 179203,390 179204,120 179207,1381 179209,9457 179210,120 179210,261 179211,120 179212,264 179213,120 179214,1276 179215,406 179216,278 179217,315 179219,55849 179220,287 179221,275 179221,4771 179222,1531 179223,336 179224,56 179225,422 179226,720 179227,2557 179228,179229 179230,1359 179231,79 179232,278 179233,179170 179234,1572 179235,406 179236,273 179240,596 179241,3 179242,179170 179243,264 179243,1147 179244,179170 179245,919 179246,179170 179248,179170 179249,179170 179250,557 179251,179170 179253,179170 179254,435 179255,592 179256,179170 179257,179170 179258,356 179259,720 179259,877 179259,907 179259,1284 179259,1732 179259,2191 179259,3422 179260,1257 179261,5591 179262,3 179263,1858 179264,1860 179265,273 179266,179170 179269,346 179270,54 179271,156379 179273,83 179274,179170 179275,720 179275,877 179275,907 179275,1284 179275,1732 179275,2191 179275,3422 179276,179277 179278,146 179278,149 179278,285 179278,620 179278,92476 179279,171 179280,13 179281,393 179281,980 179282,119 179282,151 179282,192 179282,577 179282,1400 179282,2073 179283,113156 179284,4220 179285,843 179286,192 179287,1927 179288,435 179289,671 179289,190492 179290,1939 179291,3538 179292,7270 179293,1722 179294,225 179295,9001 179296,227 179297,248 179298,4771 179299,9029 179300,111 179301,136 179302,1016 179303,215 179304,1882 179305,503 179306,1332 179307,850 179308,383 179309,1745 179310,179170 179311,179170 179312,5405 179313,104 179314,294 179315,602 179315,4805 179316,515 179317,918 179318,968 179319,179170 179320,623 179320,1805 179322,22 179322,120 179322,302 179322,861 179322,6303 179323,3 179324,1127 179325,602 179326,843 179327,647 179328,146 179328,92476 179329,344 179330,596 179331,179170 179332,146 179332,92476 179333,647 179334,344 179335,76096 179336,1284 179336,1285 179336,148742 179337,599 179337,1118 179338,200 179339,179170 179340,1298 179341,179170 179342,634 179345,1634 179346,142870 179347,138686 179348,71 179348,611 179349,175 179350,179170 179352,179170 179353,557 179354,151 179355,273 179356,1181 179357,217 179357,779 179357,920 179357,1033 179358,30 179359,147191 179360,1509 179361,1298 179362,120 179363,1 179364,1001 179366,1212 179367,120 179369,142870 179370,179170 179371,120 179373,718 179374,918 179376,1181 179377,2735 179379,179170 179380,179170 179381,1001 179382,2646 179383,1151 179384,30 179385,302 179386,179170 179388,179170 179389,147 179389,158 179389,184 179389,2868 179390,3623 179391,3 179393,390 179393,479 179393,586 179393,636 179393,28130 179395,1309 179396,1181 179397,422 179398,56 179399,1212 179400,179170 179401,179170 179402,2373 179403,697 179404,557 179405,147 179405,195 179405,843 179406,497 179407,179170 179408,1359 179410,1127 179411,146 179411,92476 179412,647 179413,344 179414,179170 179415,1014 179416,1014 179417,56 179418,422 179419,179170 179420,269 179421,179170 179422,179423 179424,1556 179425,328 179426,179170 179427,179170 179428,1381 179429,1 179430,179170 179431,781 179432,1132 179433,30 179434,30 179435,179170 179436,861 179437,179170 179438,179170 179439,30 179440,179170 179441,149 179441,1425 179442,30 179443,2266 179444,179170 179445,302 179446,179170 179447,3623 179448,6556 179449,269 179450,72 179451,83 179452,2797 179453,1227 179453,86416 179454,149 179455,179170 179456,358 179457,302 179458,861 179459,30 179460,171 179461,179170 179462,30 179463,77 179464,222 179465,717 179466,861 179467,571 179468,516 179469,252 179470,1220 179470,1222 179471,278 179472,269 179473,30 179474,143287 179475,30 179476,179170 179477,23010 179478,179170 179479,264 179480,743 179481,30 179482,310 179483,1332 179484,30 179485,285 179486,30 179487,932 179488,179489 179488,199003 179488,220087 179488,229501 179488,233874 179488,240003 179488,244802 179488,245444 179490,138686 179491,175 179492,389 179493,179170 179494,179170 179495,179170 179496,179170 179497,30 179498,195 179499,1085 179500,179170 179501,1893 179502,1707 179503,179170 179504,179170 179505,54 179506,30 179507,179170 179508,444 179509,563 179510,779 179511,54 179512,179170 179513,1010 179514,5366 179516,671 179517,222 179518,255 179519,340 179520,138686 179521,175 179522,179170 179523,30 179524,1096 179524,1118 179525,179170 179526,330 179527,30 179528,179170 179529,30 179530,712 179532,483 179533,179170 179534,179170 179535,179170 179536,516 179536,1220 179536,1222 179536,1821 179536,21736 179537,1 179538,179170 179539,179170 179540,179170 179541,179170 179542,179170 179543,850 179544,58 179545,46 179546,994 179547,179170 179548,602 179549,602 179550,88820 179551,602 179552,250 179552,1684 179553,285 179554,179170 179556,179170 179557,250 179557,1684 179558,285 179559,44 179560,179170 179561,68 179562,179170 179563,179170 179564,179170 179565,943 179566,740 179566,741 179567,2784 179568,1001 179568,1474 179569,65 179569,493 179569,586 179570,147 179571,179170 179572,2735 179573,841 179574,1821 179575,167 179575,73570 179576,1453 179577,179578 179579,1132 179580,30 179582,2574 179583,872 179585,704 179586,2506 179587,94 179587,1235 179587,1335 179587,2787 179588,2750 179589,900 179590,424 179591,179170 179592,179170 179593,179170 179594,333 179595,179596 179597,179170 179598,179170 179599,179170 179600,3161 179601,485 179602,298 179603,137 179604,179170 179605,393 179606,30 179607,602 179608,58 179609,994 179610,46 179611,1769 179612,779 179613,6068 179614,355 179616,58 179617,994 179618,46 179619,337 179619,360 179620,313 179621,313 179622,3769 179624,422 179625,56 179626,211 179627,79 179627,192 179629,2083 179630,312 179631,1238 179632,422 179633,56 179634,15748 179635,202 179636,392 179636,872 179636,1151 179636,1836 179637,602 179638,83 179639,818 179640,22 179641,68 179641,3328 179642,1452 179643,893 179644,340 179644,668 179645,422 179646,56 179647,1579 179648,179170 179649,2784 179650,726 179650,3507 179651,2048 179653,179170 179655,23011 179656,140 179657,1181 179658,179659 179660,269 179661,179170 179662,179170 179663,79 179664,2867 179664,2868 179665,652 179666,1381 179667,1284 179668,571 179669,179170 179670,30 179672,366 179673,211 179673,315 179673,788 179673,861 179674,843 179675,138686 179676,175 179677,179170 179678,222 179679,422 179680,991 179681,422 179682,422 179683,422 179684,422 179685,422 179686,422 179687,56 179688,422 179689,1608 179690,422 179691,1132 179692,422 179694,422 179695,422 179696,422 179697,422 179698,422 179699,6556 179700,991 179701,422 179702,1309 179703,920 179705,1608 179706,1132 179707,72 179707,1465 179707,221828 179708,406 179708,779 179708,102560 179709,1019 179710,467 179711,1147 179712,151 179713,337 179713,920 179713,1877 179714,493 179715,433 179716,278 179716,455 179716,536 179716,1019 179716,2424 179717,269 179718,79 179719,920 179720,4611 179722,120 179723,1949 179723,2699 179723,6059 179724,1345 179725,1113 179725,1313 179725,1381 179726,440 179727,215 179727,2210 179727,4237 179728,2737 179730,525 179731,215 179732,1096 179733,138686 179734,175 179735,1105 179736,1274 179737,422 179738,56 179739,1116 179739,1332 179739,1844 179740,3623 179741,422 179742,56 179745,640 179747,1449 179748,422 179749,56 179751,1172 179752,563 179753,1858 179754,1860 179755,2506 179756,179170 179757,4571 179758,875 179759,179170 179760,652 179761,179170 179762,366 179763,1837 179764,54 179765,240 179766,422 179767,56 179768,893 179769,841 179770,79 179771,422 179772,56 179773,1172 179775,192 179775,1089 179776,285 179777,134 179777,248 179778,272 179779,179170 179780,663 179781,1033 179782,179170 179783,1326 179784,55849 179785,337 179785,346 179785,393 179785,439 179785,447 179785,671 179785,726 179785,934 179785,980 179785,1033 179785,1175 179785,1181 179785,1294 179785,1531 179785,1590 179785,4455 179786,272 179787,1087 179788,179170 179790,422 179791,56 179792,13661 179793,167 179793,447 179793,671 179793,968 179793,1033 179793,1590 179793,2557 179793,2620 179793,2979 179794,1616 179795,652 179796,602 179798,1962 179799,500 179800,1882 179801,2775 179802,54 179803,1052 179804,240 179804,397 179804,631 179804,676 179804,818 179804,1663 179804,1853 179804,13637 179804,127158 179804,146001 179804,161534 179804,198668 179804,253226 179804,254471 179805,652 179806,138686 179807,623 179808,349 179809,175 179810,1033 179810,1175 179811,79 179812,349 179813,179814 179815,179814 179816,179814 179817,142430 179817,142473 179817,142879 179818,302 179819,3695 179820,83 179821,2784 179822,158 179823,439 179824,217 179825,30 179826,55849 179827,30 179828,179170 179830,22 179831,788 179832,302 179833,4611 179835,1284 179836,1893 179837,861 179840,83 179841,30 179842,83 179843,55849 179844,1769 179845,349 179846,2083 179847,30 179848,272 179849,8822 179852,1608 179853,30 179854,30 179855,146 179855,92476 179856,647 179856,30331 179857,704 179858,843 179859,138686 179861,175 179862,2244 179862,4637 179862,207424 179864,34 179864,35 179864,192 179864,779 179864,949 179864,1608 179866,1240 179867,106 179867,6119 179868,1893 179869,2205 179869,33424 179870,22 179871,1010 179873,536 179873,2083 179874,9028 179875,302 179876,417 179876,1635 179877,1631 179878,179170 179879,22 179880,861 179882,179170 179883,1454 179884,1010 179885,56 179886,422 179887,1688 179888,179170 179889,515 179890,968 179891,3623 179892,3623 179893,3623 179894,195 179895,435 179896,83 179897,652 179898,671 179899,4571 179900,1882 179902,2334 179903,310 179904,515 179906,179170 179907,843 179908,392 179909,137 179910,22 179911,151 179912,55849 179913,1326 179914,408 179915,102 179916,1323 179917,179170 179918,634 179919,179170 179920,302 179921,149 179921,158 179921,285 179921,406 179921,779 179921,1181 179921,1515 179922,179923 179924,179170 179925,1085 179926,179170 179927,663 179928,1511 179928,3069 179929,1955 179930,872 179931,875 179932,3623 179933,179170 179934,349 179934,452 179934,770 179934,784 179934,1363 179935,406 179936,1608 179938,60576 179939,1167 179941,1132 179942,781 179944,179170 179945,179170 179946,151 179947,217 179947,392 179948,818 179949,179950 179951,179170 179952,861 179953,1370 179954,1452 179955,1167 179956,3138 179957,86 179958,605 179959,3193 179960,1782 179961,1241 179962,2191 179963,1544 179964,968 179965,1381 179966,5718 179967,720 179968,2557 179969,3999 179970,5662 179971,2620 179972,1522 179973,1231 179974,3422 179975,2979 179976,1564 179977,1837 179978,2083 179979,3218 179980,1298 179981,1289 179982,301 179983,388 179984,1359 179985,907 179986,3194 179987,3207 179988,179170 179989,718 179990,1167 179991,179170 179992,179170 179994,1893 179995,704 179996,272 179997,4549 179998,1551 179999,622 180000,309 180000,310 180001,55849 180002,34 180002,35 180002,313 180002,634 180002,1313 180002,1718 180002,1955 180002,2224 180002,2646 180003,302 180003,687 180003,861 180003,2116 180004,179170 180005,272 180006,34 180006,35 180006,313 180006,2646 180006,5326 180007,1474 180008,483 180010,79 180010,1135 180011,704 180012,179170 180013,202 180014,302 180015,1801 180015,3182 180016,272 180017,180018 180017,254669 180019,138686 180020,5906 180021,557 180022,626 180023,278 180024,137 180025,862 180026,135 180027,83 180028,192 180029,140020 180030,577 180031,309 180031,310 180033,393 180034,536 180035,873 180036,536 180036,1881 180036,2944 180037,211 180038,1479 180039,217 180040,179170 180041,179170 180042,83 180043,1579 180044,179170 180045,222 180046,1127 180047,179170 180048,179170 180049,179170 180050,3422 180051,179170 180052,7429 180053,920 180054,872 180055,450 180056,179170 180057,179170 180058,779 180059,179170 180060,179170 180061,179170 180062,10 180063,30 180064,180065 180066,30 180067,422 180068,56 180069,83 180069,222 180070,1001 180071,30 180072,179170 180073,563 180074,179170 180075,516 180076,1285 180077,83 180078,30 180079,818 180080,1821 180081,55849 180082,861 180083,588 180083,590 180083,1419 180084,30 180085,2750 180086,310 180087,2373 180088,6303 180089,179170 180090,179170 180091,3 180092,247 180092,2867 180092,2868 180093,217 180094,179170 180095,120 180096,2620 180097,180098 180099,83 180100,784 180101,1659 180102,292 180102,1388 180103,55849 180105,704 180106,285 180107,250 180107,1684 180108,163 180109,920 180110,180111 180112,56 180113,422 180114,1556 180115,167 180116,30 180117,240 180119,179170 180120,179170 180121,225 180121,248 180122,179170 180123,1014 180124,1014 180125,1014 180126,1014 180127,22 180128,1014 180129,1634 180130,179170 180131,852 180132,179170 180133,285 180134,54 180135,250 180135,1684 180136,668 180137,1014 180138,179170 180139,2697 180140,5718 180141,671 180142,179170 180143,1132 180144,107 180145,1227 180145,86416 180146,179170 180147,179170 180148,2775 180149,447 180150,536 180151,640 180152,289 180152,290 180152,94134 180153,269 180154,179170 180155,179170 180156,634 180157,179170 180158,179170 180159,332 180159,356 180160,44 180161,179170 180162,179170 180163,179170 180164,217 180164,536 180164,577 180164,1429 180164,1608 180165,179170 180166,179170 180167,602 180168,179170 180169,179170 180170,269 180171,56 180172,422 180173,179170 180174,180175 180176,304 180177,65 180178,180179 180180,602 180181,179170 180182,179170 180183,862 180183,2590 180184,704 180185,34 180185,35 180185,111 180185,217 180185,261 180185,283 180185,323 180185,388 180185,392 180185,455 180185,536 180185,577 180185,623 180185,949 180185,1105 180185,1201 180185,1274 180185,1564 180185,1608 180185,1722 180185,2045 180185,2266 180185,2274 180185,2671 180185,2784 180185,4594 180185,4637 180185,7092 180185,13546 180185,14126 180186,31977 180187,147 180187,158 180187,175 180187,1181 180187,1515 180188,30 180189,602 180190,2367 180191,1474 180192,54 180193,392 180193,1893 180194,602 180195,932 180196,1414 180197,255 180198,304 180199,151 180200,1773 180201,1085 180202,10 180203,138686 180204,175 180205,366 180206,581 180207,366 180208,366 180209,180210 180211,366 180212,873 180213,247 180214,355 180215,671 180216,893 180217,346 180218,717 180218,1782 180219,1556 180220,872 180221,868 180222,442 180225,2590 180227,8714 180228,179170 180229,127158 180230,83 180231,893 180232,602 180234,179170 180235,147 180236,640 180237,2116 180238,247 180239,718 180240,775 180241,167 180241,240 180241,301 180241,592 180241,1564 180241,1818 180241,2083 180241,2620 180241,5718 180242,485 180243,298 180244,301 180244,1293 180244,127158 180245,1893 180246,3804 180247,292 180248,344 180249,647 180250,146 180250,92476 180251,2205 180251,33424 180252,5 180252,94 180252,114 180252,117 180252,1235 180252,1684 180252,2089 180252,2712 180252,2940 180252,3794 180252,13704 180252,154690 180253,3260 180254,424 180254,491 180254,90845 180255,485 180255,920 180256,267 180257,34 180257,35 180257,217 180257,283 180257,313 180257,379 180257,577 180257,623 180257,949 180257,1274 180257,1429 180257,1608 180257,2266 180257,2274 180257,2784 180257,2989 180257,2991 180257,3135 180257,3252 180257,7092 180257,13546 180257,14126 180258,30 180259,83 180260,673 180261,337 180262,718 180263,217 180264,142433 180266,58 180267,994 180268,46 180269,2915 180270,1962 180271,3 180272,503 180273,10 180274,2146 180275,1241 180276,957 180276,1815 180277,609 180277,2775 180277,3115 180277,3623 180278,6556 180279,179170 180280,1983 180282,287 180282,809 180283,485 180284,298 180285,138686 180287,3507 180288,175 180289,171 180290,485 180291,298 180292,200 180293,602 180294,671 180295,467 180296,920 180297,298 180298,485 180299,602 180300,1021 180301,72811 180302,1151 180303,1837 180304,1888 180306,1 180307,1858 180308,1860 180310,602 180311,602 180312,1858 180313,1860 180314,1414 180315,63 180316,420 180316,1653 180316,1722 180316,3538 180316,3830 180317,179170 180318,179170 180319,1616 180320,1363 180322,602 180323,392 180324,1326 180325,1858 180326,1860 180328,859 180329,338 180331,160 180332,240 180333,2735 180334,1326 180335,160 180336,1803 180336,21442 180337,1860 180338,1858 180339,518 180341,124668 180342,336 180342,406 180343,602 180343,4866 180344,611 180345,151 180346,120 180346,1860 180347,156379 180349,349 180349,392 180350,1749 180351,602 180352,2209 180353,3 180354,298 180355,485 180356,356 180358,673 180359,81 180360,893 180361,442 180362,455 180363,140 180364,55849 180365,1167 180366,1773 180367,1425 180368,179170 180369,994 180370,179170 180371,30 180372,10 180373,298 180374,485 180375,718 180376,146 180376,1515 180376,92476 180377,1 180377,1294 180379,58 180380,994 180381,46 180382,1381 180383,392 180384,217 180385,48 180386,1388 180387,893 180387,3769 180388,500 180389,843 180390,104 180391,868 180393,179170 180394,2923 180395,779 180396,2367 180397,1436 180397,30623 180397,181073 180397,186667 180397,192018 180397,192019 180398,557 180399,623 180400,344 180401,146 180401,92476 180402,647 180403,347 180404,652 180405,599 180406,298 180407,485 180408,2506 180409,83 180410,1191 180411,795 180412,3804 180413,104 180414,5405 180415,180416 180417,1140 180418,215 180419,227 180420,3695 180421,2701 180422,1016 180423,328 180424,1722 180425,1010 180426,1849 180427,801 180428,358 180429,111 180430,383 180431,1052 180432,2443 180433,1332 180434,72 180435,1939 180436,3538 180437,248 180438,525 180439,1001 180440,1564 180441,3193 180442,1882 180443,1955 180444,1177 180445,850 180446,9001 180447,1282 180448,714 180449,136 180450,9029 180451,312 180452,4771 180453,1572 180454,1745 180455,3474 180456,932 180457,2205 180457,33424 180458,7270 180459,503 180460,3612 180461,225 180463,602 180464,1881 180465,818 180466,30 180467,1359 180468,22 180469,180470 180471,83 180472,1688 180473,918 180474,315 180475,1608 180476,1132 180477,707 180478,179170 180479,264 180480,1849 180481,344 180482,647 180483,146 180483,92476 180484,179170 180485,918 180486,55849 180487,1 180487,99 180487,175 180487,333 180487,406 180487,620 180487,24835 180487,87799 180487,102560 180487,118336 180487,118904 180487,123797 180487,189839 180487,199529 180487,231813 180488,179170 180489,973 180490,1740 180491,1220 180491,1222 180492,516 180493,252 180494,515 180495,120 180496,283 180497,859 180498,592 180498,1572 180500,138686 180501,175 180502,1467 180503,406 180504,602 180505,179170 180506,636 180507,1238 180508,179170 180509,1837 180510,4594 180511,6955 180512,919 180513,602 180514,55849 180515,30 180516,1452 180517,9098 180518,7572 180519,160 180520,893 180521,1805 180522,55849 180523,30 180524,1240 180525,4594 180526,30 180527,3804 180529,144962 180529,218758 180530,179170 180531,73570 180532,30 180533,623 180534,9098 180535,602 180536,158 180537,447 180538,2775 180539,151 180540,30 180541,309 180541,310 180542,30 180543,2697 180544,1522 180545,269 180546,180547 180548,179170 180549,200 180549,1368 180550,30 180551,301 180551,444 180551,968 180552,202 180553,344 180554,146 180554,92476 180555,647 180556,571 180558,3623 180559,179170 180560,302 180561,875 180562,364 180563,179170 180564,179170 180565,479 180566,179170 180567,179170 180568,179170 180569,861 180570,3830 180571,875 180572,179170 180573,179170 180574,179170 180575,602 180576,602 180577,289 180577,290 180577,94134 180578,3467 180579,3623 180580,875 180581,179170 180582,179170 180583,178576 180584,602 180585,875 180586,179170 180587,179170 180588,151 180589,602 180590,179170 180591,3623 180592,875 180593,58 180594,994 180595,46 180596,2590 180597,328 180598,3623 180599,875 180600,1860 180601,1858 180602,298 180603,3623 180604,3623 180605,872 180606,2697 180607,393 180608,23783 180609,167 180609,2372 180609,2979 180610,111 180610,3538 180611,179170 180612,72 180613,1127 180614,179170 180615,313 180616,120 180617,932 180618,179170 180619,1359 180620,179170 180621,1241 180622,179170 180623,557 180625,179170 180626,1612 180627,3623 180628,875 180629,179170 180630,30 180631,949 180632,30 180633,1353 180634,179170 180635,435 180636,358 180637,179170 180638,577 180639,179170 180640,1390 180641,179170 180642,557 180643,83 180644,862 180645,843 180646,83 180647,30 180648,179170 180649,4594 180650,30 180651,179170 180652,179170 180653,48 180653,1298 180654,179170 180655,99 180656,179170 180657,3 180658,30 180659,366 180660,2373 180661,663 180662,668 180663,292 180664,14819 180665,994 180666,2697 180667,179170 180668,1014 180669,180670 180671,180672 180673,563 180674,255 180675,875 180676,1381 180677,179170 180678,1014 180679,180680 180681,2116 180682,1014 180683,1289 180684,467 180684,21442 180685,1014 180686,577 180687,180688 180689,1849 180690,1014 180691,1014 180692,1849 180693,179170 180694,34 180694,35 180695,107 180696,179170 180697,179170 180698,179170 180699,1571 180700,1474 180701,1188 180702,306 180702,307 180703,23783 180704,1305 180705,294 180706,483 180707,347 180708,285 180709,5265 180711,38634 180712,179170 180713,179170 180714,175 180715,1235 180715,1335 180716,1515 180717,841 180718,179170 180719,991 180720,304 180721,2697 180722,184 180723,1 180724,179170 180725,179170 180726,1511 180726,3069 180727,179170 180728,77 180729,180730 180731,151 180731,663 180732,8854 180733,180734 180735,872 180736,602 180737,602 180738,602 180739,602 180740,2590 180741,2697 180742,180743 180744,4237 180745,44 180747,30 180748,179170 180749,179170 180750,267 180751,179170 180752,151 180753,179170 180754,30 180755,2506 180756,2697 180757,179170 180758,805 180759,2697 180760,179170 180761,179170 180762,1773 180763,179170 180764,207 180765,180766 180767,1381 180768,30 180769,2697 180770,180771 180772,180771 180773,1001 180774,861 180775,312 180776,217 180777,217 180777,1429 180778,872 180779,779 180780,1417 180781,179170 180782,179170 180783,30 180784,2697 180785,179170 180786,2697 180787,179170 180788,179170 180789,900 180790,30 180791,872 180792,23011 180793,1429 180794,289 180794,290 180794,94134 180795,2697 180796,83 180797,668 180798,269 180799,2697 180800,255 180801,2697 180802,424 180803,304 180804,87 180804,392 180804,1722 180805,1143 180806,87 180806,392 180806,1722 180807,30 180808,392 180809,2697 180810,179170 180811,392 180812,2697 180813,37 180813,390 180813,35486 180814,366 180815,366 180816,366 180817,4691 180818,87 180818,392 180818,191860 180819,87 180819,392 180819,1722 180820,392 180821,1893 180822,2312 180823,145240 180824,179170 180825,179170 180826,180827 180828,87 180828,392 180828,1722 180829,87 180829,392 180829,1722 180830,20 180830,222 180830,1210 180830,1467 180830,1564 180830,142473 180831,1634 180832,87 180832,392 180832,1722 180833,87 180833,392 180833,1722 180834,2697 180835,872 180836,1238 180837,1522 180838,87 180838,392 180838,1722 180839,167 180840,2260 180841,2697 180842,83 180843,87 180843,392 180843,1722 180844,180845 180846,2775 180847,447 180849,209 180850,87 180850,392 180850,1722 180851,87 180851,392 180851,1722 180852,2697 180853,1571 180855,1452 180857,422 180858,422 180859,422 180860,422 180861,422 180862,422 180863,422 180864,422 180865,87 180865,392 180865,1722 180866,422 180867,422 180868,422 180869,422 180870,422 180871,3623 180872,422 180873,422 180874,647 180875,602 180876,422 180877,422 180878,422 180879,422 180880,179170 180881,422 180882,422 180883,30 180884,422 180885,422 180886,87 180886,392 180886,1722 180887,422 180888,422 180889,310 180889,579 180889,3039 180890,309 180890,310 180891,32 180891,392 180891,697 180892,712 180893,3623 180894,87 180894,392 180894,1722 180895,151 180896,1544 180897,179170 180898,87 180898,392 180898,595 180898,1722 180899,200 180901,87 180901,392 180902,302 180902,622 180902,861 180902,893 180903,298 180904,485 180905,30 180906,3623 180907,2697 180908,217 180909,298 180910,485 180911,872 180912,87 180912,392 180913,1132 180914,1608 180915,1274 180917,1359 180918,195 180919,338 180920,392 180920,2697 180921,179170 180922,442 180923,861 180923,2017 180924,23783 180925,1858 180926,1860 180927,652 180928,467 180929,920 180930,925 180931,328 180932,392 180933,485 180934,298 180935,1985 180936,6068 180936,75912 180937,2697 180938,346 180938,1294 180938,190492 180940,1143 180941,1718 180942,138686 180943,175 180945,640 180946,640 180947,2083 180948,2671 180949,640 180950,37 180951,1116 180952,180953 180954,41 180954,134 180954,431 180954,636 180954,784 180954,1001 180954,1016 180954,1462 180954,1608 180954,8537 180955,1181 180957,589 180957,972 180957,1326 180958,55849 180959,302 180960,2775 180962,392 180962,875 180962,1363 180962,1836 180962,3260 180963,1860 180964,1749 180966,652 180967,447 180968,2775 180970,868 180970,162599 180971,115659 180972,714 180973,179170 180974,2697 180975,2697 180976,192 180977,783 180979,333 180979,60576 180980,1252 180980,1253 180981,500 180982,2083 180983,690 180984,843 180985,240 180986,37 180986,56 180986,1116 180986,1566 180989,1522 180990,107 180991,167 180991,2083 180991,73570 180992,314 180992,516 180992,920 180992,1089 180992,127158 180993,571 180994,10 180995,2146 180996,459 180997,447 180998,2775 180999,1204 180999,1434 181001,1414 181002,1659 181003,1033 181004,442 181004,1058 181004,1140 181004,1688 181004,3367 181004,3804 181005,72 181006,344 181007,285 181008,2697 181009,775 181010,718 181011,305 181012,187 181013,360 181014,338 181015,647 181016,841 181017,145240 181018,1300 181020,818 181021,73570 181022,240 181023,2697 181024,668 181024,698 181024,2744 181025,360 181026,10 181027,694 181028,301 181028,937 181028,1580 181028,3422 181028,103860 181029,217 181030,240 181031,73570 181033,83 181033,536 181034,30 181035,298 181036,485 181037,1285 181038,179170 181040,868 181041,83 181041,1274 181042,918 181043,158 181043,862 181044,932 181045,50 181046,158 181047,2931 181048,1985 181049,1821 181050,406 181051,1289 181052,269 181053,30 181055,393 181056,104 181057,2697 181058,2367 181058,4146 181059,147 181059,158 181060,3623 181061,4146 181062,338 181063,536 181063,818 181063,2159 181063,2944 181063,3377 181063,7109 181063,7698 181063,7768 181063,13137 181063,23287 181063,28353 181063,113003 181063,115474 181063,182035 181063,188791 181063,191966 181063,195507 181063,199637 181063,207659 181063,212914 181063,220947 181065,1359 181066,179170 181067,3623 181068,918 181069,30 181070,179170 181071,92476 181072,92476 181074,151 181075,140 181075,515 181075,1052 181075,1127 181075,1579 181075,1639 181075,1893 181075,2312 181076,1267 181078,704 181080,179170 181081,1949 181081,3182 181082,147 181083,631 181083,862 181084,2697 181085,73570 181086,179170 181087,330 181088,809 181089,442 181091,2697 181092,2697 181093,442 181094,693 181097,30 181098,3474 181099,179170 181100,179170 181101,1722 181102,179170 181103,181104 181105,2697 181107,9457 181108,626 181108,647 181108,726 181108,827 181108,1058 181108,1309 181108,1313 181108,3474 181109,30 181110,73570 181111,3623 181112,179170 181113,779 181114,2697 181116,3623 181117,515 181118,247 181119,30 181120,73570 181121,907 181122,660 181123,179170 181124,181125 181126,179170 181127,72 181128,285 181129,344 181130,68 181130,2620 181130,4218 181130,4220 181130,66297 181131,2590 181132,179170 181133,171 181134,247 181135,772 181136,118 181136,652 181136,1266 181136,25348 181137,622 181138,23701 181139,1326 181140,102 181141,408 181142,1323 181143,151 181144,2779 181145,973 181145,1298 181145,1749 181145,2605 181146,179170 181147,179170 181148,179170 181149,355 181150,147 181151,3585 181152,30 181153,2697 181154,2697 181155,151 181156,2697 181157,179170 181158,2697 181159,312 181160,2697 181161,83 181162,158 181163,149 181163,406 181164,179170 181165,87 181166,2697 181167,2697 181168,1181 181169,181170 181171,30 181172,302 181173,179170 181174,151 181175,2697 181176,588 181176,590 181177,179170 181178,140 181179,179170 181180,179170 181181,179170 181182,2697 181184,3297 181184,55585 181185,30 181186,179170 181187,104 181187,75912 181188,2697 181189,179170 181190,3538 181191,485 181192,298 181193,720 181193,907 181193,1117 181193,1715 181194,1181 181195,179170 181196,3182 181197,304 181198,179170 181199,302 181200,179170 181201,179170 181202,151 181203,1167 181204,55849 181205,408 181206,861 181207,179170 181208,1776 181209,179170 181210,147 181211,1432 181212,179170 181213,138 181214,865 181215,557 181216,137 181217,118 181217,4597 181218,88820 181219,179170 181220,179170 181221,717 181222,4172 181223,1363 181224,8855 181225,86 181226,1749 181227,160 181228,302 181229,949 181230,809 181231,868 181233,861 181234,1359 181235,179170 181236,588 181236,590 181236,640 181236,1285 181236,1634 181236,2048 181236,7360 181237,30 181238,134 181239,179170 181240,1509 181241,557 181242,155481 181243,179170 181244,30 181245,179170 181246,179170 181247,1707 181249,557 181253,179170 181254,333 181254,1893 181255,557 181256,179170 181257,333 181258,179170 181259,30 181260,147 181260,158 181261,1313 181262,577 181263,55849 181264,179170 181265,30 181266,79 181267,179170 181268,515 181269,179170 181270,179170 181271,68 181271,2590 181272,932 181273,179170 181274,332 181275,1 181276,30 181277,222 181278,30 181279,73570 181280,179170 181281,269 181282,1014 181283,1014 181284,1014 181285,788 181286,483 181287,1014 181288,147 181288,158 181288,2244 181289,1014 181290,167 181292,72 181293,328 181294,138686 181296,175 181297,1474 181298,358 181299,4237 181299,182162 181300,179170 181301,1177 181302,179170 181303,79 181304,179170 181305,83 181306,30 181307,179170 181308,179170 181309,179170 181311,2697 181312,1179 181312,2923 181312,3695 181313,181314 181315,640 181316,83 181317,179170 181318,140269 181318,206059 181319,422 181320,422 181321,422 181322,195 181323,422 181324,422 181325,422 181326,422 181327,422 181328,422 181329,422 181330,406 181331,422 181332,181333 181334,422 181335,56 181336,44 181338,250 181338,1684 181339,285 181340,1385 181341,285 181342,113156 181343,250 181343,1684 181344,13 181345,83 181346,1722 181347,72 181348,72 181349,179170 181350,181351 181352,147 181353,30 181354,2116 181355,72 181356,30 181357,2697 181358,30 181359,225 181360,30 181361,920 181362,72 181364,862 181365,181366 181367,8884 181368,2697 181369,1085 181370,181371 181372,72 181373,72 181374,2697 181375,1551 181376,2506 181377,577 181378,30 181379,30 181380,355 181381,366 181382,366 181383,366 181384,366 181385,181386 181387,72 181388,424 181389,510 181391,83 181392,333 181393,2697 181394,1559 181395,346 181396,179170 181397,181398 181399,1370 181400,1220 181400,1222 181401,516 181402,252 181403,179170 181404,179170 181405,179170 181406,179170 181407,181408 181409,179170 181410,3623 181411,1132 181412,781 181413,13 181414,138686 181415,175 181416,192 181416,435 181417,264 181417,994 181417,1659 181417,2979 181418,2590 181420,72 181421,310 181422,181423 181424,147 181424,158 181425,72 181427,181428 181429,179170 181430,207 181431,167 181432,181433 181434,918 181436,2506 181437,181438 181440,158 181441,1305 181442,179170 181443,179170 181444,1149 181445,3 181446,3507 181447,30 181448,30 181449,2701 181450,483 181451,178739 181451,181451 181452,668 181453,628 181454,72 181455,718 181457,872 181459,181460 181461,8270 181462,118 181462,422 181462,4597 181462,5405 181463,138686 181464,175 181465,301 181466,72 181467,4571 181468,1429 181469,640 181470,3756 181471,1449 181472,217 181473,179170 181474,179170 181475,179170 181477,181478 181479,179170 181480,932 181481,1479 181482,390 181483,919 181484,68 181485,179170 181487,181488 181489,23783 181490,147191 181491,181492 181491,203777 181493,96284 181494,179170 181495,1179 181496,1143 181497,137 181498,195 181500,179170 181501,417 181503,175 181504,72 181506,181507 181508,179170 181509,181510 181511,704 181512,179170 181513,333 181514,1326 181515,72 181516,15068 181517,181518 181519,30 181520,17228 181520,23011 181521,181522 181523,181524 181525,179170 181526,1 181527,179170 181528,8270 181529,179170 181530,167 181530,299 181530,397 181530,2083 181531,355 181532,107 181533,2416 181533,2417 181534,292 181535,338 181536,298 181537,704 181538,704 181539,1133 181540,3538 181541,255 181542,207 181543,181544 181545,366 181546,366 181547,366 181548,366 181550,179170 181551,79 181552,10 181553,4545 181553,56150 181554,163 181555,779 181556,58 181558,586 181558,1985 181559,202 181560,333 181560,779 181561,602 181562,694 181563,240 181564,749 181564,788 181566,4192 181566,4193 181568,179170 181569,1927 181570,181571 181572,442 181573,784 181574,1149 181575,264 181576,4691 181577,4691 181578,181579 181580,1572 181581,240 181582,30 181583,30 181584,433 181585,440 181586,2334 181587,181588 181589,72 181591,1608 181592,3474 181593,333 181593,2782 181593,2931 181593,3872 181594,138686 181595,358 181596,175 181597,4571 181598,65 181599,439 181600,181601 181602,366 181603,509 181605,577 181606,83 181607,30 181608,440 181609,1452 181610,181611 181612,372 181613,30 181614,30 181615,309 181615,310 181616,440 181617,1564 181618,1 181619,1127 181620,557 181621,557 181622,557 181623,1014 181624,1014 181626,623 181627,602 181628,99 181629,298 181630,30 181633,760 181634,1927 181635,1014 181636,1769 181637,1434 181638,30 181639,146 181639,92476 181640,647 181641,344 181642,30 181644,181645 181644,195958 181644,206941 181644,223093 181644,255130 181646,1014 181647,1257 181648,1634 181649,1962 181650,179170 181651,932 181652,30 181653,142473 181654,107 181655,56 181655,63 181655,147 181655,149 181655,247 181656,56 181657,79 181658,158 181658,252 181659,72 181660,1220 181660,1222 181661,252 181662,516 181663,181664 181665,647 181666,146 181666,92476 181667,344 181668,2443 181669,30236 181670,56 181671,30 181672,30 181673,30 181674,30 181675,3 181675,510 181677,30 181678,179170 181679,179170 181680,30 181681,179170 181682,2506 181683,179170 181684,179170 181685,292 181686,294 181687,296 181688,393 181689,298 181690,179170 181691,1608 181692,179170 181693,147 181694,671 181695,184 181696,179170 181697,1149 181698,83 181699,620 181700,30 181701,346 181702,181703 181704,406 181705,179170 181706,179170 181707,861 181708,179170 181709,195 181709,215874 181710,306 181710,307 181711,179170 181712,355 181713,779 181714,1515 181715,366 181716,366 181717,366 181718,366 181719,366 181720,366 181721,309 181721,310 181722,1634 181723,595 181723,1572 181724,1058 181725,56 181726,422 181727,1381 181727,1551 181730,718 181732,107 181733,1238 181735,179170 181736,146 181736,92476 181737,647 181738,344 181739,1452 181740,527 181741,356 181742,83 181743,356 181744,422 181745,56 181746,356 181747,156379 181748,181749 181750,872 181750,1796 181751,433 181752,147 181752,149 181752,980 181753,146 181753,92476 181754,647 181755,344 181756,1240 181756,1465 181757,862 181758,87 181758,392 181758,1722 181759,192 181760,647 181761,146 181761,92476 181762,344 181763,718 181764,2646 181764,118336 181765,615 181766,718 181767,872 181768,127158 181769,181770 181772,1033 181773,119 181774,1785 181774,33424 181775,192 181775,663 181776,718 181777,5375 181778,136 181779,1531 181780,422 181781,422 181782,179170 181783,1858 181784,1860 181785,55849 181786,50 181786,79 181786,158 181787,527 181787,95152 181788,694 181789,518 181790,192 181790,1381 181790,189839 181791,422 181792,422 181793,422 181794,422 181795,422 181796,422 181797,422 181798,422 181799,422 181803,422 181804,527 181805,22 181806,50 181806,99 181807,181808 181809,2867 181809,2868 181810,920 181811,467 181812,298 181813,485 181814,5405 181816,138686 181818,175 181819,22 181820,779 181821,146 181821,92476 181822,647 181823,344 181824,920 181825,156379 181826,83 181828,81070 181829,222 181830,22 181831,21408 181832,425 181832,663 181833,81070 181834,433 181835,968 181835,2083 181835,73570 181837,1745 181838,440 181839,179170 181841,41 181841,631 181842,2775 181843,447 181844,338 181846,30 181847,1204 181849,302 181849,893 181850,179170 181852,167 181854,15748 181855,1014 181856,328 181857,2436 181859,302 181860,21442 181861,620 181862,1132 181863,30 181864,2421 181865,859 181866,217 181867,4637 181868,2266 181869,1201 181871,181872 181871,185786 181871,250305 181873,415 181873,1143 181873,1454 181874,694 181875,972 181875,1837 181876,406 181877,697 181878,30 181879,138686 181880,175 181881,694 181882,304 181883,104 181883,302 181883,861 181884,497 181885,1147 181886,30 181887,843 181888,4545 181888,56150 181889,1531 181890,862 181891,178576 181892,1749 181893,77 181894,222 181895,957 181895,1815 181896,21442 181898,1058 181899,949 181900,843 181901,73570 181902,30 181903,733 181904,149 181904,184 181906,167 181907,671 181909,485 181911,872 181912,306 181912,307 181913,240 181913,818 181914,179170 181915,3193 181916,1515 181917,779 181918,503 181919,415 181920,1453 181921,422 181923,1849 181924,217 181925,1458 181926,181927 181928,589 181929,298 181930,485 181931,919 181932,126 181933,179170 181934,81 181934,704 181934,2995 181936,298 181937,485 181938,843 181939,30 181940,2506 181941,179170 181943,181944 181945,240 181945,372 181945,127158 181946,1769 181947,206 181948,1284 181948,148742 181949,366 181950,167 181951,497 181951,1172 181951,2310 181951,3967 181952,390 181952,996 181952,1388 181953,1276 181953,2923 181954,179170 181955,392 181957,252 181958,1220 181958,1222 181959,516 181960,872 181961,301 181963,309 181963,310 181964,515 181965,302 181966,1058 181967,104 181967,136 181967,138 181967,557 181967,1368 181968,181969 181970,1983 181971,179170 181972,358 181973,1860 181974,1858 181975,483 181976,179170 181977,104 181978,1467 181979,907 181980,707 181981,137 181983,34 181983,79 181983,195 181983,393 181983,32475 181984,30 181984,248 181985,302 181985,893 181986,1033 181987,22 181988,179170 181989,536 181991,179170 181992,181993 181992,182040 181994,2620 181995,2620 181996,181992 181997,146 181997,92476 181998,344 181999,647 182000,968 182002,73570 182003,1052 182004,136 182004,577 182005,2083 182006,312 182007,179170 182008,1707 182010,32475 182011,1544 182012,4611 182013,2867 182013,2868 182014,743 182015,167 182016,179170 182017,179170 182018,79 182019,278 182020,83 182021,1 182024,179170 182025,179170 182026,30 182027,417 182029,4678 182030,1326 182031,102 182032,1323 182033,408 182034,918 182037,211 182038,861 182039,516 182041,1085 182041,2083 182042,181992 182043,516 182045,179170 182046,6556 182047,1220 182047,1222 182048,252 182049,516 182050,8798 182051,801 182054,269 182055,872 182056,302 182057,704 182059,179170 182060,179170 182061,179170 182062,182063 182064,433 182065,151 182066,179170 182067,179170 182068,179170 182069,516 182071,30 182072,179170 182073,179170 182074,509 182075,179170 182076,861 182077,73570 182078,179170 182079,179170 182080,142870 182081,179170 182082,179170 182083,179170 182084,355 182085,1188 182086,2083 182087,3623 182088,647 182089,146 182089,92476 182090,344 182091,1298 182092,147 182092,158 182093,179170 182094,1220 182094,1222 182095,252 182096,251 182097,118 182097,422 182097,1608 182097,4597 182097,5405 182098,179170 182099,179170 182100,707 182102,182103 182104,146 182104,92476 182105,647 182106,344 182107,994 182108,1722 182110,113140 182111,160 182112,19010 182113,3507 182114,71 182115,30 182115,200 182116,182117 182118,1118 182119,302 182120,360 182121,861 182122,1722 182123,255 182124,215 182124,1282 182125,83 182126,247 182127,179170 182128,557 182129,3623 182130,1298 182131,808 182132,179170 182133,140 182134,83 182134,278 182135,366 182136,406 182137,79 182138,575 182139,313 182140,41 182141,602 182142,433 182143,151 182144,358 182145,195 182145,206 182145,779 182146,417 182147,88820 182148,2797 182149,179170 182150,2006 182151,707 182152,1858 182153,1860 182154,333 182154,1033 182155,55849 182156,1 182156,1019 182156,1313 182157,179170 182158,1332 182159,30 182160,179170 182161,8463 182162,137 182162,215 182162,457 182162,704 182162,714 182162,1016 182162,1172 182162,1177 182162,1257 182162,1282 182162,1402 182162,1511 182162,1572 182162,1818 182162,1962 182162,2775 182162,3069 182162,4237 182162,6556 182162,19413 182162,182162 182162,232709 182163,179170 182164,179170 182166,30 182166,34 182166,35 182166,44 182166,50 182166,79 182166,104 182166,106 182166,116 182166,146 182166,147 182166,158 182166,192 182166,195 182166,200 182166,202 182166,215 182166,217 182166,233 182166,240 182166,248 182166,251 182166,272 182166,285 182166,289 182166,290 182166,315 182166,332 182166,333 182166,337 182166,346 182166,358 182166,372 182166,406 182166,422 182166,430 182166,435 182166,439 182166,442 182166,447 182166,493 182166,516 182166,525 182166,536 182166,585 182166,588 182166,590 182166,592 182166,602 182166,609 182166,615 182166,620 182166,622 182166,626 182166,640 182166,671 182166,682 182166,779 182166,862 182166,907 182166,934 182166,949 182166,968 182166,980 182166,994 182166,996 182166,1001 182166,1007 182166,1068 182166,1085 182166,1133 182166,1175 182166,1220 182166,1222 182166,1238 182166,1240 182166,1247 182166,1265 182166,1266 182166,1294 182166,1326 182166,1368 182166,1370 182166,1388 182166,1454 182166,1467 182166,1474 182166,1512 182166,1515 182166,1522 182166,1531 182166,1608 182166,1635 182166,1782 182166,1789 182166,1955 182166,1963 182166,1985 182166,2087 182166,2379 182166,2699 182166,2782 182166,2931 182166,3085 182166,3115 182166,3148 182166,3317 182166,3321 182166,3804 182166,4237 182166,4355 182166,4455 182166,4545 182166,5440 182166,5992 182166,7270 182166,9001 182166,9007 182166,15573 182166,56150 182166,60576 182166,72439 182166,92476 182166,94134 182166,182162 182167,179170 182168,179170 182169,179170 182170,179170 182171,30 182172,2506 182173,285 182174,483 182175,179170 182176,743 182177,932 182178,1133 182179,273 182180,1644 182181,179170 182182,179170 182183,30 182184,179170 182185,179170 182186,179170 182187,406 182188,2116 182189,2379 182190,406 182191,392 182192,79 182192,217 182193,3 182193,44 182193,63 182193,79 182193,81 182193,99 182193,104 182193,116 182193,134 182193,137 182193,215 182193,217 182193,233 182193,248 182193,251 182193,254 182193,298 182193,315 182193,323 182193,330 182193,332 182193,336 182193,346 182193,392 182193,422 182193,435 182193,442 182193,447 182193,493 182193,503 182193,509 182193,525 182193,536 182193,538 182193,585 182193,588 182193,590 182193,592 182193,609 182193,615 182193,622 182193,640 182193,694 182193,760 182193,779 182193,788 182193,805 182193,862 182193,953 182193,968 182193,994 182193,1007 182193,1010 182193,1012 182193,1016 182193,1119 182193,1235 182193,1240 182193,1247 182193,1309 182193,1326 182193,1335 182193,1368 182193,1370 182193,1392 182193,1425 182193,1454 182193,1465 182193,1467 182193,1512 182193,1551 182193,1732 182193,1782 182193,1789 182193,1939 182193,1955 182193,1985 182193,2087 182193,2205 182193,2244 182193,2274 182193,2296 182193,2567 182193,2620 182193,2701 182193,2793 182193,3003 182193,3115 182193,3804 182193,4237 182193,5726 182193,5992 182193,6119 182193,7270 182193,9007 182193,16019 182193,33424 182193,60576 182193,164572 182193,182162 182193,245910 182194,247 182195,563 182196,563 182197,577 182198,255 182198,2868 182200,1634 182201,809 182201,1085 182202,138686 182203,179170 182204,30 182205,2367 182206,179170 182207,7416 182208,1474 182209,3695 182210,996 182211,138686 182212,175 182213,1983 182214,179170 182215,179170 182216,179170 182217,104 182218,447 182219,2775 182220,179170 182221,182222 182223,1014 182224,1014 182225,30 182226,2620 182227,818 182228,3695 182229,779 182230,752 182231,602 182232,4192 182232,4193 182233,179170 182234,1740 182235,179170 182236,323 182237,81 182238,2590 182239,179170 182240,149 182241,440 182242,479 182243,179170 182244,179170 182245,179170 182246,149 182247,179170 182248,2373 182249,179170 182250,264 182251,179170 182252,179170 182253,179170 182254,179170 182255,179170 182256,179170 182257,179170 182258,179170 182259,179170 182260,179170 182261,179170 182263,179170 182264,179170 182265,392 182266,179170 182267,179170 182268,7652 182269,44 182270,657 182270,843 182270,1551 182270,182271 182270,192792 182272,179170 182273,920 182274,77 182275,179170 182276,207 182277,179170 182278,920 182279,285 182280,179170 182281,1467 182282,182283 182284,388 182285,862 182285,2590 182285,8884 182286,2424 182287,182288 182289,872 182290,1429 182291,1143 182292,668 182293,1007 182295,1414 182296,1370 182297,24505 182298,30 182299,366 182300,366 182301,13980 182302,179170 182303,72 182303,75912 182304,355 182305,182306 182307,187 182308,34 182308,35 182308,120 182308,192 182308,240 182308,264 182308,332 182308,392 182308,435 182308,493 182308,1531 182308,1796 182308,2205 182308,33424 182309,349 182309,392 182309,595 182309,697 182309,1240 182309,1453 182309,1454 182309,2699 182309,3367 182309,9098 182309,24763 182310,179170 182311,162599 182312,1179 182313,1252 182313,1253 182314,1381 182315,83 182316,1326 182317,3218 182318,206 182319,640 182321,3623 182322,4039 182323,809 182326,868 182327,73570 182328,693 182329,192 182330,493 182331,349 182332,657 182333,3695 182334,301 182334,1293 182334,189303 182335,2744 182336,182337 182338,389 182339,118336 182340,932 182340,991 182342,422 182343,422 182344,1119 182345,104 182345,134 182345,298 182345,332 182345,364 182345,417 182345,442 182345,636 182345,694 182345,749 182345,801 182345,805 182345,999 182345,1119 182345,1368 182345,2775 182345,3328 182345,3474 182345,27041 182346,422 182347,422 182348,422 182349,422 182350,422 182351,433 182352,422 182353,422 182354,422 182355,422 182356,1608 182357,1132 182358,21442 182359,422 182360,422 182361,1782 182362,1688 182362,2353 182363,138686 182364,920 182365,467 182366,175 182367,63 182367,147 182367,192 182367,571 182367,622 182367,1370 182368,1858 182369,1860 182370,1983 182371,1858 182372,1860 182373,485 182374,298 182376,1893 182377,1707 182378,1511 182378,3069 182380,206 182381,1453 182382,264 182382,1888 182383,1453 182384,338 182385,298 182386,485 182387,1955 182388,1132 182389,1608 182391,27041 182392,79 182393,298 182394,586 182395,200 182395,225 182396,1132 182397,1608 182398,2867 182398,2868 182399,636 182400,485 182401,298 182402,17309 182404,433 182405,2353 182406,217 182407,852 182408,2671 182409,32 182410,272 182411,184 182415,298 182416,485 182417,217 182418,579 182419,302 182420,1509 182420,1893 182421,1465 182423,138686 182425,175 182426,179170 182427,48505 182428,392 182429,2775 182431,440 182431,1033 182432,760 182434,302 182435,179170 182436,4260 182437,2048 182438,1132 182439,1608 182440,8463 182441,861 182442,21408 182443,859 182444,261 182445,1127 182446,1837 182446,73570 182447,1893 182447,49057 182448,592 182448,2315 182449,388 182450,1608 182451,1132 182452,994 182453,1927 182454,240 182455,4237 182455,182162 182456,81070 182457,720 182458,298 182459,485 182460,424 182461,23011 182462,1556 182463,145240 182464,1089 182465,911 182466,752 182466,1149 182467,222 182467,4223 182467,13137 182468,30 182469,83 182469,356 182469,379 182469,2784 182469,5591 182470,138686 182471,175 182472,731 182473,217 182475,818 182476,4220 182477,1544 182478,202 182479,577 182480,48 182480,649 182481,1467 182483,142870 182484,83 182486,557 182487,1434 182488,389 182490,872 182492,516 182493,1132 182494,1608 182495,302 182496,179170 182497,1284 182499,179170 182500,861 182501,1072 182502,1127 182503,563 182504,1983 182505,106 182505,1370 182505,6119 182506,818 182506,872 182506,127158 182508,73570 182509,304 182509,720 182509,775 182509,877 182509,907 182509,973 182509,1001 182509,1117 182509,1284 182509,1522 182509,1715 182509,1732 182509,1837 182509,2191 182509,9024 182510,182511 182512,182511 182513,1858 182514,1860 182515,4190 182515,162599 182515,187176 182516,1467 182517,918 182518,356 182519,1332 182521,73570 182522,48 182523,1436 182524,536 182525,30 182526,406 182527,179170 182528,360 182529,355 182531,4218 182532,515 182533,893 182534,9010 182535,1515 182536,4594 182537,1240 182538,313 182538,1019 182539,179170 182540,949 182541,30 182542,1983 182543,1247 182543,164572 182544,179170 182545,179170 182546,2512 182547,179170 182548,179170 182549,304 182550,996 182551,390 182552,328 182553,1370 182554,73570 182555,893 182556,302 182557,2205 182557,33424 182559,202 182559,3321 182559,68069 182560,1388 182561,179170 182562,360 182563,240 182564,1298 182565,179170 182566,392 182567,406 182568,151 182569,179170 182570,4218 182571,179170 182572,251 182573,1220 182573,1222 182574,252 182575,30 182575,248 182576,861 182577,30 182578,379 182579,34 182579,35 182580,217 182581,1983 182582,1240 182583,9025 182584,2989 182584,2991 182585,179170 182586,182587 182588,406 182590,156379 182591,30 182592,2923 182593,147123 182594,302 182595,1 182596,179170 182597,45960 182598,264 182598,590 182599,1102 182600,435 182601,298 182602,485 182603,1085 182603,156379 182604,843 182605,179170 182606,4 182606,5 182606,104 182606,138 182606,714 182606,885 182606,1212 182606,1458 182606,2008 182606,3561 182606,4748 182606,13704 182606,167349 182606,167350 182607,55849 182608,1436 182608,2979 182610,500 182611,1962 182612,1052 182613,1882 182614,2775 182615,54 182617,145240 182618,179170 182619,7360 182620,73570 182621,483 182622,330 182623,5405 182624,302 182625,1983 182626,179170 182627,202 182628,68 182628,1955 182629,179170 182630,179170 182631,240 182632,137 182633,2620 182634,179170 182635,278 182636,34 182636,35 182636,217 182636,261 182636,422 182636,760 182636,779 182636,949 182636,1019 182636,1467 182636,1515 182636,1590 182636,1644 182637,55849 182638,4691 182639,885 182639,13704 182640,861 182641,179170 182642,861 182643,485 182644,298 182646,136 182647,1467 182648,179170 182650,55849 182651,6556 182652,289 182652,290 182652,94134 182653,179170 182654,72 182655,72 182659,55849 182660,467 182660,920 182661,179170 182662,10 182663,182664 182665,1001 182666,4218 182667,10 182668,2779 182669,1 182670,182671 182672,15119 182673,932 182674,269 182675,4260 182675,142870 182675,148600 182676,179170 182677,136 182678,83 182679,111 182680,50 182680,192 182680,240 182680,809 182681,422 182682,56 182683,1058 182684,19010 182685,79 182686,107 182687,88820 182689,536 182690,83 182691,278 182692,142870 182693,417 182694,182695 182696,516 182697,30 182698,81 182700,182701 182702,1821 182703,1983 182704,285 182705,147 182706,250 182706,1684 182707,44 182708,424 182709,1220 182709,1222 182710,137 182711,134 182712,137 182713,187 182714,1425 182715,179170 182717,1635 182718,760 182719,4637 182720,23011 182721,50 182722,151 182723,30 182724,1085 182725,298 182726,485 182727,355 182729,1238 182730,1452 182731,779 182732,179170 182734,431 182734,6059 182735,215 182737,731 182738,171 182739,179170 182740,1149 182741,1146 182742,467 182745,106 182746,179170 182747,83 182748,1983 182749,179170 182750,79 182751,151 182752,179170 182753,4611 182754,1544 182755,179170 182756,2775 182757,447 182758,360 182759,907 182760,179170 182761,73570 182762,56 182763,1677 182764,269 182765,1983 182766,422 182767,5405 182768,422 182769,422 182770,422 182771,422 182772,422 182773,422 182774,422 182775,422 182776,422 182777,422 182778,422 182779,127158 182780,809 182782,147 182782,158 182784,182785 182786,1319 182786,1479 182786,1522 182786,3524 182787,1353 182788,1113 182789,309 182789,310 182790,26041 182790,124668 182791,10 182792,2146 182793,1860 182794,1858 182795,15807 182796,920 182797,467 182798,83 182800,21408 182801,1688 182804,138686 182805,859 182807,179170 182808,718 182809,372 182810,68 182811,536 182812,1707 182813,1608 182814,1132 182815,360 182816,83 182816,1417 182818,179170 182819,315 182819,518 182820,647 182821,146 182821,92476 182822,344 182823,179170 182824,1220 182824,1222 182825,1132 182826,1608 182827,179170 182828,179170 182829,179170 182830,30 182831,1240 182832,19010 182833,491 182834,252 182834,1220 182834,1222 182835,491 182836,41 182836,1462 182836,8537 182837,182838 182840,5405 182841,872 182842,175 182843,167 182843,3207 182844,346 182845,3538 182846,104 182846,1085 182848,577 182849,145240 182850,200 182851,1449 182851,1927 182853,179170 182854,349 182854,392 182855,147 182856,81 182857,717 182860,536 182862,447 182863,2775 182864,179170 182865,179170 182866,302 182867,179170 182868,138686 182869,175 182870,1882 182871,179170 182872,179170 182873,179170 182874,179170 182875,1287 182876,809 182877,76096 182879,344 182880,510 182881,1181 182882,79 182883,147 182883,158 182884,179170 182885,589 182885,4355 182886,1359 182887,179170 182888,1220 182888,1222 182889,516 182890,192 182891,179170 182892,422 182893,1707 182894,3634 182894,3692 182894,4427 182894,13320 182894,18262 182894,20069 182894,20483 182894,25731 182894,28218 182894,28484 182894,31185 182894,37103 182894,38322 182894,38737 182894,43404 182894,49010 182894,107208 182894,117811 182894,126008 182894,131380 182894,134528 182894,134548 182894,135908 182894,140329 182894,150086 182894,158654 182894,162275 182894,165786 182894,171031 182894,179373 182894,183407 182894,185462 182894,187214 182894,188927 182894,189355 182894,189870 182894,193481 182894,194205 182894,194493 182894,194608 182894,194804 182894,195425 182894,195542 182894,195647 182894,197897 182894,205179 182894,213153 182894,214065 182894,214119 182894,221916 182894,223175 182894,223895 182894,224122 182894,225355 182894,229119 182894,229287 182894,230985 182894,234791 182894,234971 182894,236991 182896,991 182896,992 182897,240 182898,252 182899,349 182899,697 182900,392 182900,1143 182901,3623 182902,467 182902,868 182902,1345 182903,106 182903,760 182903,8180 182904,4571 182906,868 182906,33611 182907,195 182910,455 182911,326 182912,301 182912,615 182912,968 182912,1293 182912,1782 182913,1309 182914,217 182915,1849 182916,113156 182918,366 182919,366 182920,406 182921,1745 182922,3623 182923,366 182925,302 182925,483 182928,973 182929,1381 182930,302 182931,158 182932,1117 182934,179170 182935,2590 182936,1 182937,818 182938,435 182939,861 182941,1265 182941,1266 182942,515 182943,586 182944,718 182945,1634 182946,5213 182947,3623 182950,1359 182951,179170 182952,41 182953,843 182954,3623 182955,602 182956,179170 182957,209 182958,1805 182959,275 182960,179170 182961,179170 182962,1474 182963,104 182964,179170 182965,179170 182966,179170 182967,1785 182967,2205 182967,33424 182968,202 182969,2775 182970,447 182971,859 182972,179170 182973,179170 182974,509 182975,752 182976,784 182976,1113 182977,138686 182978,175 182979,179170 182980,1274 182980,1608 182980,2266 182981,179170 182982,862 182983,179170 182984,3507 182985,626 182986,1231 182987,515 182988,2017 182989,918 182990,167 182991,1893 182992,217 182993,1381 182994,455 182995,32 182996,179170 182997,247 182998,252 182999,1220 182999,1222 183000,516 183001,15 183001,115 183001,118 183001,340 183001,489 183001,827 183001,1001 183001,1058 183001,1089 183001,1623 183001,1707 183001,3999 183001,17590 183001,24763 183001,122406 183001,142426 183002,158 183002,222 183002,640 183002,1572 183002,3161 183003,299 183003,663 183003,877 183003,907 183003,973 183003,1284 183003,62204 183003,124668 183003,161931 183003,182932 183004,682 183004,72439 183005,171 183006,861 183007,179170 183008,1240 183009,349 183009,5540 183010,360 183011,743 183012,389 183013,1608 183014,1132 183015,179170 183016,183017 183018,222 183019,10 183020,918 183021,577 183022,83 183023,151 183024,1749 183025,179170 183026,949 183027,1001 183028,483 183029,493 183030,179170 183031,1149 183032,644 183033,72 183034,183035 183036,6955 183037,309 183037,310 183038,8373 183039,360 183040,563 183041,30 183042,3804 183043,179170 183044,4 183044,5 183045,247 183045,2867 183045,2868 183046,102 183047,1326 183048,408 183049,1323 183050,1265 183050,1266 183051,515 183052,1653 183053,81 183054,1860 183055,1858 183056,577 183057,8820 183058,1707 183059,278 183060,56 183061,422 183062,631 183063,30 183064,1 183064,195 183064,640 183064,162372 183065,2699 183066,179170 183067,919 183068,392 183069,1 183070,217 183071,179170 183072,3 183073,644 183074,346 183075,111142 183076,333 183077,818 183079,252 183080,697 183080,1140 183081,592 183082,5440 183083,1877 183084,273 183085,337 183085,338 183085,393 183085,439 183085,649 183085,772 183085,1381 183085,2367 183086,3135 183087,283 183088,179170 183090,1775 183090,171294 183091,179170 183092,255 183093,3 183094,1089 183094,1623 183094,17590 183094,122406 183095,179170 183096,389 183098,1113 183099,1707 183100,179170 183101,422 183103,142405 183103,154408 183104,1860 183105,1858 183106,16019 183107,5906 183108,557 183109,626 183110,278 183111,137 183112,862 183113,2797 183114,23783 183115,179170 183116,72 183117,1370 183119,72 183120,222 183120,1019 183121,72 183122,72 183123,106 183123,8854 183123,255750 183124,55849 183125,10 183126,1085 183127,142405 183128,920 183129,179170 183130,179170 183131,179170 183132,298 183133,485 183134,179170 183135,292 183136,1014 183137,1014 183138,525 183139,1014 183140,1014 183141,179170 183142,1014 183143,1309 183144,48505 183145,179170 183146,179170 183147,179170 183148,435 183149,1285 183150,1370 183151,631 183152,397 183153,294 183154,142405 183155,202 183156,440 183157,843 183158,328 183158,192296 183158,194175 183159,30 183160,2506 183161,183162 183163,179170 183164,3695 183165,179170 183166,179170 183167,932 183168,581 183169,183170 183171,179170 183172,54 183173,1983 183174,30 183175,994 183177,142430 183178,97 183178,192 183178,333 183178,3623 183179,54 183180,179170 183181,1359 183182,250 183182,1684 183183,285 183184,994 183185,893 183186,222 183187,872 183188,285 183189,107 183189,326 183189,340 183189,459 183189,994 183190,264 183191,557 183192,179170 183193,1773 183194,179170 183195,269 183196,358 183197,1474 183198,779 183199,68 183200,2421 183201,338 183202,1983 183204,179170 183205,183206 183205,216883 183205,217333 183205,221589 183205,252916 183207,44 183208,640 183210,1143 183211,23011 183212,179170 183213,577 183214,862 183215,30 183216,2590 183217,2116 183218,577 183219,195 183220,1962 183221,500 183222,1052 183223,2775 183224,1882 183225,54 183226,1821 183228,2048 183229,2590 183231,179170 183232,536 183233,207 183235,355 183236,1001 183237,8270 183238,4545 183238,56150 183239,1238 183240,872 183241,1429 183242,269 183243,13538 183244,1452 183245,1235 183245,1335 183246,668 183247,893 183248,450 183248,1707 183249,577 183249,1400 183250,146 183250,92476 183251,647 183252,344 183253,491 183253,827 183254,255 183255,862 183256,333 183257,406 183258,1608 183259,83 183260,151 183261,1188 183263,1891 183265,312 183266,673 183267,4165 183272,222 183272,389 183273,16019 183274,22 183274,1118 183275,340 183276,422 183277,422 183278,422 183279,422 183280,422 183281,422 183282,422 183283,48505 183284,422 183285,422 183286,422 183287,422 183288,273 183289,422 183291,422 183292,422 183293,1220 183293,1222 183294,146 183294,92476 183295,647 183296,344 183297,422 183298,30 183299,135 183299,137 183299,138 183300,186 183301,171 183302,557 183303,620 183304,171 183305,444 183306,192 183306,406 183306,1181 183307,697 183308,415 183308,15523 183309,34 183309,35 183309,442 183309,609 183309,775 183309,1466 183309,2209 183309,2646 183310,615 183311,406 183313,920 183314,467 183315,135 183315,138 183317,1001 183318,1175 183318,1293 183320,693 183320,818 183320,1010 183320,1122 183320,1715 183320,1849 183320,127158 183320,183448 183320,183737 183320,185986 183320,189220 183320,189230 183320,191504 183320,191769 183321,22 183321,1210 183322,179170 183323,171641 183324,1453 183326,1238 183327,135 183327,138 183328,1983 183328,15119 183329,138686 183330,175 183332,862 183332,3467 183332,6068 183334,306 183334,307 183336,1515 183337,779 183338,302 183339,10 183340,192 183340,5102 183341,1858 183342,1860 183343,422 183344,142870 183345,3623 183346,809 183347,158 183348,5192 183349,179170 183350,195 183351,1274 183352,1837 183353,273 183354,3585 183355,1390 183356,1801 183356,3182 183356,6424 183357,1796 183358,138686 183359,175 183360,779 183361,1663 183363,697 183363,5301 183365,1132 183366,417 183366,609 183366,1188 183366,1359 183366,1659 183366,1888 183367,349 183368,2626 183369,1860 183370,1858 183371,217 183373,1858 183374,1860 183375,209 183375,302 183375,687 183375,861 183375,1556 183376,3 183377,158 183378,179170 183379,1893 183380,1247 183380,164572 183381,949 183382,422 183383,1274 183384,685 183385,491 183385,589 183385,752 183385,2105 183385,4355 183387,2590 183389,360 183391,1607 183392,134 183392,636 183392,1001 183392,1608 183393,358 183394,183394 183395,1116 183396,1571 183397,360 183398,868 183399,160 183400,179170 183402,1 183402,58 183402,79 183402,86 183402,106 183402,120 183402,130 183402,158 183402,160 183402,192 183402,217 183402,259 183402,299 183402,301 183402,326 183402,328 183402,336 183402,358 183402,387 183402,403 183402,415 183402,455 183402,483 183402,485 183402,567 183402,581 183402,586 183402,644 183402,657 183402,666 183402,707 183402,718 183402,726 183402,749 183402,784 183402,795 183402,809 183402,843 183402,852 183402,893 183402,918 183402,980 183402,1043 183402,1052 183402,1082 183402,1113 183402,1140 183402,1147 183402,1149 183402,1179 183402,1188 183402,1353 183402,1359 183402,1363 183402,1417 183402,1424 183402,1466 183402,1590 183402,1616 183402,1634 183402,1653 183402,1718 183402,1773 183402,1837 183402,1888 183402,1891 183402,1973 183402,2105 183402,2607 183402,2674 183402,2699 183402,2923 183402,3003 183402,3422 183402,3967 183402,3999 183402,4218 183402,4220 183402,4571 183402,6424 183402,6824 183402,18298 183402,19413 183402,21442 183402,25282 183402,26450 183402,27057 183402,30331 183402,81070 183402,131675 183403,360 183404,1143 183406,138686 183407,718 183408,175 183409,1749 183410,3623 183413,1893 183414,408 183415,1 183416,392 183417,447 183418,2775 183419,873 183419,874 183420,23011 183421,875 183422,1181 183423,356 183423,124668 183424,467 183425,273 183426,217 183427,72 183428,30 183429,302 183430,636 183431,20591 183432,1392 183433,360 183434,861 183435,29380 183436,248 183436,1955 183437,4771 183438,179170 183439,1893 183440,1293 183441,452 183442,1247 183442,164572 183443,184 183445,151 183446,179170 183447,179170 183448,171641 183448,221298 183449,118336 183450,346 183451,179170 183452,179170 183453,1740 183454,360 183455,179170 183456,634 183456,635 183456,2223 183456,2784 183456,2944 183456,18650 183456,19286 183456,28130 183456,191783 183456,261536 183457,920 183459,775 183460,1151 183461,433 183462,222 183462,455 183463,251 183464,278 183465,251 183467,179170 183469,918 183470,4611 183471,1285 183472,30 183473,287 183475,640 183476,338 183477,179170 183478,48 183478,130 183478,140 183478,827 183478,1007 183478,1052 183478,1078 183478,1132 183478,1381 183478,1452 183478,3695 183478,5440 183478,6824 183478,36819 183479,8854 183480,292 183481,106 183482,147 183483,934 183484,278 183485,83 183486,217 183487,273 183488,179170 183489,171 183490,19010 183490,22293 183491,179170 183492,920 183493,3695 183494,1634 183495,179170 183496,151 183497,3695 183499,179170 183500,302 183502,920 183503,19010 183504,179170 183505,30 183506,3695 183507,179170 183508,179170 183509,179170 183510,515 183511,192 183511,195 183511,222 183511,577 183511,626 183511,1454 183512,634 183513,1326 183514,102 183515,1323 183516,408 183517,179170 183518,179170 183519,179170 183520,179170 183521,179170 183522,850 183523,179170 183524,309 183524,310 183525,850 183527,1556 183528,147 183529,179170 183530,885 183530,13704 183531,1 183532,440 183533,720 183534,605 183535,328 183536,147 183536,151 183536,305 183537,875 183538,3623 183539,179170 183540,980 183541,2244 183542,349 183542,392 183543,30 183544,1274 183545,202 183546,3623 183547,272 183548,30 183549,179170 183551,4594 183552,179170 183553,973 183553,148742 183554,972 183555,222 183555,5343 183556,2646 183557,233 183557,298 183557,818 183558,240 183559,313 183560,918 183561,179170 183562,483 183563,79 183564,2244 183565,3623 183566,435 183567,2626 183568,124668 183569,3623 183570,875 183571,2590 183572,875 183574,749 183576,10 183577,240 183577,332 183577,372 183577,588 183577,590 183577,1001 183577,1285 183577,1419 183577,1955 183577,3331 183577,9026 183578,6955 183579,873 183580,192 183581,3623 183582,179170 183583,843 183584,259 183585,577 183586,30 183587,663 183588,30 183589,179170 183590,179170 183591,3623 183592,875 183593,330 183594,575 183595,3623 183596,151 183597,3623 183598,2292 183599,240 183599,247 183599,269 183600,30 183601,179170 183602,875 183603,718 183604,179170 183605,179170 183606,179170 183607,179170 183608,179170 183609,179170 183610,389 183611,179170 183612,179170 183613,557 183614,862 183615,704 183616,175 183617,2373 183618,142870 183619,179170 183620,302 183621,1285 183622,37 183622,1231 183623,1782 183623,5662 183624,3623 183625,10 183626,330 183627,875 183628,875 183629,3 183629,32 183629,50 183629,63 183629,81 183629,99 183629,137 183629,146 183629,147 183629,178 183629,192 183629,233 183629,248 183629,252 183629,254 183629,261 183629,289 183629,301 183629,323 183629,330 183629,332 183629,336 183629,358 183629,392 183629,393 183629,406 183629,430 183629,442 183629,447 183629,493 183629,503 183629,509 183629,516 183629,586 183629,615 183629,663 183629,682 183629,760 183629,788 183629,805 183629,925 183629,994 183629,996 183629,1001 183629,1010 183629,1016 183629,1033 183629,1119 183629,1133 183629,1175 183629,1181 183629,1231 183629,1235 183629,1240 183629,1265 183629,1266 183629,1282 183629,1294 183629,1326 183629,1335 183629,1370 183629,1388 183629,1425 183629,1454 183629,1465 183629,1515 183629,1531 183629,1551 183629,1635 183629,1722 183629,1939 183629,1955 183629,1963 183629,2205 183629,2244 183629,2274 183629,2334 183629,2379 183629,2620 183629,2699 183629,2701 183629,2782 183629,2931 183629,3003 183629,3085 183629,3148 183629,3317 183629,3321 183629,4237 183629,4355 183629,4455 183629,4545 183629,5726 183629,5874 183629,6119 183629,9001 183629,9007 183629,16019 183629,33424 183629,56150 183629,72439 183629,92476 183629,94134 183629,182162 183630,151 183631,1014 183632,1014 183633,1014 183634,1014 183635,1014 183636,179170 183637,8854 183638,179170 183639,183640 183641,179170 183642,932 183643,179170 183644,179170 183645,179170 183646,30 183647,285 183648,250 183648,1684 183649,179170 183650,861 183651,640 183652,516 183654,1235 183654,1335 183655,179170 183656,1007 183657,179170 183658,577 183659,1007 183660,1688 183661,68069 183662,179170 183663,536 183664,1467 183665,278 183666,83 183667,872 183668,217 183669,179170 183671,267 183672,44 183673,183674 183675,137 183676,179170 183677,862 183679,137 183680,48 183681,3538 183682,1058 183683,137 183684,1634 183685,138686 183686,175 183687,81 183688,72 183689,366 183690,366 183691,366 183692,366 183693,366 183694,366 183695,366 183697,366 183698,366 183699,366 183700,422 183701,1227 183701,86416 183702,900 183703,137 183703,138 183704,136 183704,137 183704,227 183705,920 183706,1860 183707,22 183707,83 183707,467 183707,861 183707,872 183708,6726 183709,179170 183710,137 183711,72 183713,298 183714,485 183715,142426 183715,145751 183716,30 183717,355 183718,30 183719,99 183721,1882 183723,1881 183724,1359 183726,206 183727,209 183728,83 183729,422 183730,1188 183731,1238 183732,50 183732,79 183732,147 183732,158 183734,707 183735,183736 183737,171641 183738,872 183739,749 183740,911 183741,264 183741,1033 183741,1381 183741,1452 183741,1551 183741,1639 183741,3041 183741,5440 183742,389 183744,2775 183745,447 183746,1844 183747,148742 183749,366 183750,875 183751,366 183752,366 183753,366 183754,447 183755,2775 183756,366 183757,366 183759,366 183761,980 183762,3623 183763,30331 183764,41 183764,760 183766,171 183767,872 183769,256 183770,818 183771,640 183772,149 183772,118336 183773,1452 183774,1639 183775,1474 183776,72 183777,30 183778,3252 183779,10 183780,183781 183782,48 183783,1417 183784,467 183785,920 183786,626 183787,240 183788,2775 183789,447 183790,255 183791,408 183792,147 183793,843 183794,211 183794,1096 183795,843 183796,392 183797,843 183798,138686 183799,175 183800,314 183801,996 183803,30331 183804,37 183806,868 183807,10 183808,5405 183809,3623 183811,79 183812,209 183812,302 183812,809 183816,2146 183817,240 183817,1085 183817,1715 183817,2620 183818,1140 183818,2443 183819,622 183820,3623 183821,918 183822,389 183822,185877 183823,431 183824,743 183825,623 183826,183827 183828,171 183829,269 183830,1551 183830,3999 183830,191860 183831,2671 183832,97 183833,21442 183834,215 183835,1151 183836,7360 183837,3474 183838,302 183839,104 183839,200 183840,809 183841,137 183842,455 183844,1179 183845,179170 183846,387 183847,4455 183849,2699 183851,1707 183852,406 183852,1181 183853,3 183853,510 183853,2045 183854,142426 183856,818 183857,217 183858,652 183860,120 183863,58 183864,994 183865,46 183866,685 183867,577 183867,1033 183867,7092 183868,309 183868,310 183868,161171 183869,158 183870,302 183872,56 183873,217 183873,222 183873,389 183873,657 183873,1466 183873,32751 183874,2590 183875,183876 183877,1688 183879,707 183881,611 183881,1718 183882,663 183883,298 183884,485 183885,158 183885,406 183885,779 183885,1181 183886,73570 183887,1436 183888,240 183889,809 183890,50 183891,389 183892,158 183893,195 183894,1285 183894,1955 183895,500 183896,1962 183897,1882 183898,1052 183899,2775 183900,54 183901,2168 183902,1939 183903,3 183904,1769 183905,2557 183906,8822 183907,183908 183911,147 183911,118336 183913,138686 183914,175 183915,55849 183916,360 183917,113156 183918,718 183919,344 183921,179170 183922,652 183923,76096 183925,1544 183926,72 183927,615 183928,206 183929,893 183930,1012 183931,439 183933,852 183934,183935 183934,184361 183934,187379 183934,187593 183936,179170 183937,516 183939,1803 183941,663 183945,1298 183953,72 183954,179170 183955,366 183956,994 183957,136 183958,1012 183959,1707 183960,179170 183961,179170 183962,162599 183963,1955 183964,2017 183965,332 183966,9030 183967,179170 183968,298 183969,179170 183970,183971 183972,179170 183973,4571 183974,3623 183975,48 183976,515 183977,3695 183977,142405 183978,515 183980,1105 183981,4895 183982,138686 183983,175 183984,99 183985,355 183987,30331 183988,3623 183989,3623 183990,1300 183991,72 183992,994 183993,309 183993,310 183994,557 183995,862 183996,4146 183997,151 183999,2590 184000,1417 184001,184002 184003,1326 184004,102 184005,1323 184006,408 184007,1019 184009,184010 184011,179170 184012,3623 184013,302 184014,81 184015,179170 184016,861 184017,366 184018,366 184019,366 184020,120 184021,671 184021,1177 184021,182162 184023,422 184024,422 184025,422 184026,422 184027,390 184027,1274 184027,1381 184027,1579 184027,2646 184028,422 184029,30 184030,72 184031,83 184032,422 184033,422 184034,422 184035,422 184036,704 184037,422 184038,179170 184039,704 184040,422 184042,179170 184043,1370 184044,704 184045,179170 184046,388 184047,58 184048,184049 184050,72 184051,3623 184052,15573 184053,30 184054,3623 184055,417 184057,972 184058,217 184059,809 184060,179170 184061,278 184062,1572 184063,2590 184065,704 184066,704 184067,875 184068,3623 184069,192 184070,179170 184071,184072 184073,1274 184074,83 184075,179170 184076,179170 184077,83 184078,179170 184079,885 184079,13704 184080,435 184081,184082 184083,179170 184084,113156 184085,179170 184086,3623 184087,179170 184088,179170 184089,585 184090,843 184091,1392 184092,179170 184093,179170 184094,179170 184095,179170 184096,179170 184097,366 184098,366 184099,366 184100,366 184101,30 184102,366 184103,179170 184104,184105 184106,138 184107,865 184108,557 184109,137 184110,118 184110,4597 184111,88820 184112,704 184113,557 184114,30 184115,179170 184116,663 184116,4545 184116,6119 184116,56150 184117,6027 184118,704 184119,30 184120,179170 184121,932 184122,179170 184123,30 184124,718 184124,931 184125,255 184126,30 184127,332 184128,179170 184129,179170 184130,1014 184131,1014 184132,179170 184133,1014 184134,1014 184135,1014 184136,1014 184137,1014 184138,179170 184139,1893 184140,179170 184141,179170 184142,292 184142,1479 184142,1858 184142,6068 184143,200 184144,179170 184145,2373 184146,179170 184147,366 184148,366 184149,289 184149,290 184149,94134 184150,366 184151,366 184152,366 184153,179170 184154,184155 184156,184157 184158,996 184159,179170 184160,179170 184161,439 184162,179170 184164,179170 184165,179170 184166,184167 184168,179170 184169,184170 184171,360 184172,1556 184174,30 184175,577 184176,179170 184177,83 184178,179170 184179,179170 184180,179170 184181,179170 184182,312 184183,184184 184183,216152 184183,218401 184186,267 184187,179170 184188,736 184190,184191 184192,843 184193,285 184194,192 184195,250 184195,1684 184196,285 184197,250 184197,1684 184198,2590 184199,225 184200,179170 184201,1149 184202,30 184203,900 184204,179170 184205,30 184206,843 184207,8884 184208,652 184209,697 184210,1474 184211,1085 184212,179170 184213,3260 184214,30 184214,97 184214,192 184214,333 184214,3623 184214,5310 184215,30 184216,184217 184218,1893 184220,994 184221,179170 184222,179170 184223,179170 184224,355 184225,366 184226,366 184227,602 184228,366 184229,366 184230,366 184231,393 184232,30 184233,184234 184235,184236 184237,22580 184238,22580 184239,22580 184240,179170 184241,83 184242,184243 184244,184245 184244,206658 184244,217366 184244,230443 184246,217 184247,83 184248,184248 184249,184250 184251,65 184252,588 184252,590 184253,450 184254,406 184255,1782 184256,30 184257,4192 184257,4193 184258,707 184259,99 184260,184261 184263,179170 184264,875 184265,1247 184265,164572 184266,184267 184268,97 184269,184270 184271,184271 184272,1235 184272,1335 184272,3247 184272,5375 184272,9156 184272,17151 184272,18158 184272,83691 184272,93839 184272,98083 184272,111095 184272,113123 184272,119402 184272,125499 184272,135769 184272,135770 184272,184272 184272,194639 184272,212644 184272,228578 184272,240626 184273,7652 184274,467 184277,184278 184279,184280 184281,1858 184282,1860 184283,179170 184285,302 184285,467 184285,2116 184286,1381 184287,179170 184288,151 184289,179170 184290,918 184291,179170 184292,349 184292,3260 184293,364 184294,1522 184295,41 184296,200 184297,179170 184298,647 184299,146 184299,92476 184300,344 184301,349 184301,392 184302,30 184303,179170 184304,147 184306,392 184307,2506 184308,10 184309,1252 184309,1253 184310,875 184311,3623 184312,447 184313,2775 184314,254 184316,1276 184316,85241 184317,850 184318,2574 184319,718 184320,273 184322,4 184322,5 184323,138686 184324,175 184325,10 184325,1572 184325,3297 184326,72 184327,344 184328,285 184329,493 184329,1132 184330,602 184331,599 184332,346 184333,184334 184335,179170 184336,184337 184338,179170 184339,1616 184340,184341 184342,366 184343,366 184344,366 184345,1085 184346,184347 184348,1368 184350,179170 184351,184352 184353,8868 184354,918 184355,147 184357,301 184358,72 184359,184360 184363,184364 184365,179170 184366,179170 184367,3623 184368,72 184369,184370 184371,1402 184372,30 184373,10 184373,2083 184373,3218 184374,1479 184375,390 184376,184377 184378,344 184379,72 184380,285 184381,184382 184383,179170 184384,179170 184385,932 184386,1235 184386,1335 184387,184388 184389,179170 184390,184391 184392,1167 184392,3392 184392,3524 184393,1252 184393,1253 184394,30 184395,192 184395,406 184395,8907 184396,366 184397,366 184398,366 184399,366 184400,366 184401,184402 184403,10 184403,113156 184404,179170 184405,179170 184406,179170 184407,30 184408,30 184409,179170 184410,184411 184412,184413 184412,216454 184414,179170 184415,184416 184417,861 184418,179170 184419,30 184420,179170 184421,392 184422,179170 184424,30 184424,328 184425,2048 184426,179170 184427,184428 184429,184430 184431,184432 184434,136 184436,184437 184438,50 184439,184440 184441,184442 184443,132418 184444,142870 184445,383 184446,41 184447,184448 184449,184450 184451,240 184452,184453 184454,184455 184456,3830 184457,1247 184457,164572 184458,179170 184459,355 184460,872 184461,107 184462,2416 184462,2417 184463,292 184464,338 184465,298 184466,1133 184467,3538 184468,184469 184470,2073 184471,30 184472,516 184473,252 184474,1220 184474,1222 184475,184476 184477,184478 184479,1893 184480,779 184481,99 184482,1102 184483,1118 184484,184485 184486,9007 184487,346 184488,30 184489,142405 184491,179170 184492,697 184492,1769 184493,68 184494,184495 184496,1284 184497,179170 184498,305 184499,1252 184499,1253 184500,1001 184501,184502 184503,145240 184504,872 184505,872 184506,184507 184508,392 184509,893 184510,485 184511,184512 184513,146 184513,92476 184514,30 184515,455 184516,30 184517,1102 184518,240 184519,10 184520,1235 184520,15573 184521,2334 184522,3 184523,30 184524,179170 184525,32 184526,184527 184528,473 184529,179170 184531,668 184532,184533 184535,179170 184536,184537 184538,269 184539,184540 184541,626 184542,366 184543,366 184544,366 184545,366 184546,178 184547,184548 184549,1623 184550,184551 184552,142405 184553,179170 184554,22 184555,72 184556,167 184556,240 184556,347 184556,372 184556,605 184556,615 184556,720 184556,907 184556,968 184556,1001 184556,1085 184556,1122 184556,1133 184556,1160 184556,1167 184556,1231 184556,1284 184556,1298 184556,1436 184556,1522 184556,1564 184556,1715 184556,1785 184556,1837 184556,2620 184556,3193 184556,3194 184556,3207 184556,3218 184556,3422 184556,5662 184556,5718 184557,138686 184558,175 184559,273 184559,30331 184560,30331 184561,4691 184562,179170 184563,875 184564,120 184564,261 184564,694 184564,1419 184565,2506 184566,30 184567,872 184568,872 184569,179170 184570,179170 184571,72 184572,179170 184574,179170 184575,179170 184576,179170 184577,179170 184578,179170 184579,557 184580,557 184581,493 184581,1127 184582,557 184583,83 184584,179170 184585,994 184586,179170 184587,184588 184589,1659 184590,179170 184591,994 184592,48 184593,1432 184594,94 184594,2787 184595,14434 184596,273 184597,18726 184598,179170 184599,179170 184600,118 184600,4597 184601,179170 184603,179170 184604,932 184607,31977 184608,151 184609,1181 184610,358 184611,222 184612,1359 184613,184614 184615,1359 184616,179170 184617,179170 184618,422 184619,184620 184621,155481 184622,1118 184623,252 184624,516 184625,1220 184625,1222 184626,422 184627,422 184628,422 184629,422 184630,422 184631,422 184632,422 184633,422 184634,422 184635,422 184636,422 184637,422 184638,422 184639,2775 184640,447 184641,222 184642,142473 184643,179170 184644,179170 184645,366 184646,1203 184647,10 184648,179170 184649,184650 184649,196589 184649,197477 184649,197755 184649,214846 184651,158 184652,184653 184654,749 184654,1146 184655,179170 184656,179170 184657,44 184658,179170 184659,602 184660,602 184661,10 184662,30 184663,184664 184666,184667 184668,179170 184669,179170 184670,179170 184671,275 184672,3623 184673,3623 184674,179170 184675,1877 184676,137 184677,179170 184678,184679 184678,202920 184678,217301 184678,221255 184678,257016 184678,264168 184680,30 184681,1849 184682,72 184683,184684 184685,184686 184687,179170 184688,366 184689,366 184690,366 184691,366 184692,366 184693,366 184694,292 184695,366 184696,294 184697,296 184698,1402 184699,298 184700,83 184701,138686 184702,175 184703,3260 184704,1572 184705,30 184706,2260 184707,440 184708,355 184709,273 184710,1238 184711,1452 184713,184714 184715,433 184716,868 184717,1289 184718,184719 184720,160 184721,2506 184722,493 184723,605 184724,2735 184725,893 184727,83 184728,111 184729,71 184730,3218 184731,640 184732,640 184733,640 184734,640 184735,640 184736,192 184737,994 184738,287 184743,287 184745,968 184746,184747 184748,5375 184749,179170 184750,206 184751,179170 184752,1132 184753,1085 184755,5326 184756,4611 184757,1479 184758,4611 184759,752 184760,433 184762,3623 184763,1132 184764,781 184765,3623 184767,875 184768,192 184768,1243 184769,20 184770,3623 184771,3623 184773,3623 184775,467 184776,920 184777,2782 184778,433 184779,3623 184782,3623 184783,3623 184784,485 184786,138686 184787,175 184788,259 184789,994 184791,3804 184792,184793 184794,184793 184797,217 184798,209 184799,671 184801,104 184802,34 184802,35 184803,720 184804,209 184804,302 184804,579 184804,893 184805,1370 184806,269 184807,1220 184807,1222 184808,252 184809,251 184810,3623 184811,72 184812,285 184813,344 184814,2083 184815,1220 184815,1222 184816,252 184817,251 184818,852 184819,184820 184819,184823 184821,77 184821,595 184821,647 184821,973 184821,1001 184821,1010 184821,1623 184821,1775 184821,2607 184821,171294 184822,3623 184824,424 184824,3148 184825,187 184826,779 184827,457 184828,1238 184829,178576 184830,360 184831,79 184832,107 184833,179170 184834,302 184835,2045 184836,302 184838,184839 184840,3623 184841,972 184841,6249 184842,3623 184843,2244 184846,925 184848,171 184849,1096 184850,72 184851,184852 184853,138686 184854,175 184855,202 184856,485 184856,805 184856,1659 184857,920 184858,79 184859,302 184859,467 184859,2116 184861,206 184862,1655 184863,676 184864,1359 184865,107 184867,3623 184868,171 184869,3623 184870,515 184871,620 184872,1052 184873,58 184874,994 184875,46 184876,1227 184876,86416 184877,251 184877,483 184877,505 184877,838 184877,1011 184877,1143 184877,1368 184877,1402 184877,2605 184877,111142 184877,207045 184877,215276 184877,227669 184878,34 184878,35 184879,3623 184880,1132 184881,1608 184883,72 184884,302 184885,103698 184887,1359 184888,422 184889,56 184890,171 184891,171 184892,179170 184894,240 184895,1608 184896,1132 184897,5591 184898,83 184900,1058 184901,1419 184902,298 184903,485 184904,72 184905,344 184906,285 184907,8149 184909,179170 184910,467 184911,3623 184912,392 184913,779 184913,1181 184913,23783 184913,68069 184913,240174 184915,1479 184916,4455 184917,179170 184918,179170 184919,209 184920,3623 184921,326 184922,179170 184923,2989 184923,2991 184924,184925 184926,4222 184927,3623 184928,179170 184929,124668 184930,1167 184931,344 184932,72 184933,285 184934,503 184935,269 184936,290 184936,862 184936,94134 184937,217 184938,3623 184940,3623 184941,435 184942,120 184943,3623 184944,1608 184945,1132 184946,3623 184947,2373 184948,73570 184949,1014 184950,1014 184952,1014 184953,252 184954,344 184955,72 184956,285 184957,1014 184959,3623 184960,217 184960,861 184961,1014 184962,875 184963,1014 184964,278 184965,83 184966,1858 184967,136 184968,843 184969,3623 184970,298 184971,485 184972,143287 184973,155473 184974,298 184975,485 184976,3623 184979,140 184979,1893 184980,3623 184981,99 184982,3623 184983,875 184984,1274 184985,3623 184986,171 184987,3623 184988,30 184989,1644 184990,3623 184991,2367 184992,346 184993,171 184994,30 184995,102 184996,408 184997,1326 184998,1323 184999,298 185000,485 185001,30 185003,422 185004,56 185005,3623 185006,3623 185007,447 185008,2775 185009,885 185009,13704 185010,1298 185011,151 185012,30 185013,30 185014,1265 185014,1266 185014,2931 185014,164572 185015,338 185016,151 185017,30 185018,171 185019,3623 185020,1436 185021,3623 185022,3623 185024,3623 185025,515 185026,171 185027,227 185028,3623 185029,1836 185031,292 185032,483 185034,179170 185035,3623 185036,171 185037,557 185037,954 185037,1939 185038,185039 185040,287 185041,113156 185042,3623 185043,3623 185044,179170 185045,3 185046,27654 185047,704 185048,1326 185049,185050 185051,179170 185052,422 185053,179170 185054,179170 185055,875 185056,179170 185057,158 185057,192 185057,2244 185058,171 185059,3623 185060,179170 185061,3623 185062,179170 185063,356 185064,4611 185065,24505 185066,875 185067,1285 185068,3623 185069,179170 185070,179170 185071,809 185072,994 185073,3623 185074,1467 185075,652 185076,179170 185077,3623 185078,83 185079,3623 185080,179170 185081,3623 185082,422 185083,56 185084,516 185084,1175 185085,3623 185086,3623 185087,328 185088,179170 185089,24505 185090,202 185091,56 185092,422 185093,1132 185094,147 185094,151 185094,305 185095,179170 185096,250 185096,1684 185097,285 185098,8 185099,2782 185100,24505 185101,160 185102,1001 185103,525 185103,843 185103,1849 185104,2989 185104,2991 185105,875 185106,1181 185106,1572 185107,779 185109,30 185110,1058 185111,179170 185112,211 185113,179170 185114,179170 185115,185116 185117,179170 185118,179170 185119,179170 185120,718 185121,2704 185122,435 185123,56 185124,422 185125,704 185126,56 185127,1888 185128,179170 185129,779 185130,179170 185131,843 185132,704 185133,589 185134,852 185135,298 185136,485 185137,185138 185139,185138 185140,932 185141,149 185142,1449 185143,158 185144,309 185144,310 185145,563 185146,779 185147,179170 185148,1849 185149,259 185150,179170 185151,240 185151,372 185151,1001 185151,1085 185152,138686 185153,175 185154,179170 185155,1359 185156,247 185157,8822 185158,30 185159,179170 185160,301 185160,392 185160,536 185160,760 185160,818 185160,919 185160,1010 185160,1033 185160,1274 185160,1801 185162,1631 185163,775 185164,142870 185165,278 185166,41 185166,294 185166,304 185166,631 185167,58 185168,179170 185170,185171 185172,179170 185173,179170 185174,179170 185175,185176 185177,179170 185178,192 185179,179170 185180,179170 185181,179170 185182,179170 185183,30 185184,179170 185185,179170 185186,805 185187,137 185188,55849 185189,179170 185190,185191 185192,298 185193,485 185194,185195 185196,209 185197,422 185198,44 185199,422 185200,422 185201,422 185202,422 185203,422 185204,422 185205,422 185206,422 185207,422 185208,422 185209,422 185210,422 185211,422 185212,185213 185214,179170 185215,3623 185216,142870 185217,211 185218,422 185219,179170 185220,179170 185221,179170 185222,175 185223,202 185224,393 185225,3623 185226,393 185227,581 185227,918 185228,137 185229,179170 185230,862 185231,179170 185232,211 185233,179170 185234,1285 185235,30 185236,1068 185237,589 185237,631 185237,1085 185237,2590 185237,44725 185238,431 185238,1001 185238,1474 185239,138 185240,30 185241,269 185242,30 185243,179170 185244,72 185245,72 185246,30 185247,171 185248,30 185250,264 185250,1298 185250,1749 185251,843 185252,355 185253,269 185254,179170 185255,366 185256,366 185257,366 185258,366 185259,68 185260,366 185261,366 185262,366 185263,366 185264,366 185265,536 185267,179170 185269,171 185270,28107 185272,415 185273,171 185274,1252 185274,1253 185276,843 185277,147 185279,447 185280,2775 185281,1191 185281,1192 185281,1345 185282,1179 185284,994 185285,185286 185288,671 185289,4611 185290,1740 185291,83 185292,1436 185293,3623 185294,640 185295,640 185296,640 185297,640 185300,4223 185300,178576 185302,366 185303,3623 185304,1466 185306,136 185306,138 185307,3623 185308,79 185310,1608 185311,1132 185312,852 185315,3623 185316,30 185317,1132 185318,781 185319,10 185321,2146 185322,422 185323,571 185324,30 185325,893 185326,206 185327,1522 185328,841 185329,217 185330,1882 185330,142870 185331,138686 185332,175 185333,1001 185334,781 185335,1132 185336,113156 185338,179170 185339,3623 185340,30 185341,852 185342,1127 185343,158 185344,3623 185345,75912 185346,217 185347,1133 185348,60576 185349,4771 185350,1085 185351,714 185353,957 185355,4611 185356,185357 185358,167 185359,1837 185360,5250 185361,151 185362,151 185362,192 185362,309 185362,310 185362,577 185362,1167 185362,1400 185363,485 185364,3623 185365,248 185370,1509 185371,841 185372,185373 185374,366 185375,79 185376,447 185377,2775 185378,186 185379,225 185380,1803 185381,185382 185383,850 185384,60576 185385,179170 185386,60576 185387,118336 185388,781 185389,1132 185390,1284 185391,907 185392,1769 185393,1012 185393,7757 185394,138686 185395,175 185396,41 185396,68 185396,240 185396,294 185396,390 185396,431 185396,631 185396,760 185396,805 185396,818 185396,1119 185396,1285 185396,1309 185396,1462 185396,1608 185396,1631 185396,1888 185396,2620 185396,2995 185396,3135 185396,3467 185396,4220 185396,7194 185396,8537 185396,9021 185396,66297 185397,179170 185399,1801 185399,3182 185399,3258 185399,6424 185399,13136 185399,80519 185399,189266 185400,79 185400,626 185402,309 185402,310 185405,875 185407,557 185408,60576 185410,1912 185412,433 185414,518 185414,1326 185415,406 185416,185417 185416,256487 185418,301 185419,818 185421,346 185423,885 185423,13704 185424,1220 185424,1222 185425,516 185426,252 185427,72 185428,151 185429,60576 185430,315 185431,10 185432,60576 185433,185434 185435,185434 185436,1417 185437,298 185438,485 185439,222 185439,657 185440,1293 185441,1860 185442,1858 185443,58 185444,720 185445,1132 185446,1608 185447,563 185447,911 185447,991 185447,1132 185447,1623 185448,298 185449,485 185450,264 185451,406 185452,1949 185453,1241 185454,1381 185454,1805 185455,185456 185457,3623 185458,3623 185459,595 185459,4039 185461,141912 185462,718 185462,3555 185463,58 185464,30 185466,142870 185467,1284 185468,3623 185469,3623 185470,1243 185471,861 185472,207 185472,299 185472,1417 185472,2083 185473,56 185474,422 185475,302 185476,192 185477,433 185478,602 185479,602 185480,450 185481,1 185483,515 185484,1146 185485,1454 185486,146 185486,973 185486,92476 185488,875 185489,485 185490,298 185492,1912 185493,185494 185495,918 185496,1313 185497,179170 185498,2923 185499,704 185500,179170 185501,1912 185502,30 185503,179170 185504,58 185505,2784 185506,179170 185507,861 185508,289 185508,290 185508,94134 185509,30 185510,171 185511,171 185512,179170 185513,875 185514,447 185515,2775 185516,450 185518,137 185519,309 185519,310 185519,809 185520,2620 185521,138686 185522,175 185523,107 185524,5540 185525,179170 185526,875 185527,179170 185528,179170 185529,302 185530,179170 185531,30 185532,703 185533,233 185533,301 185533,525 185533,1235 185534,179170 185535,1179 185536,48 185537,510 185537,1722 185537,3538 185538,435 185539,868 185540,1893 185541,450 185542,55849 185543,292 185544,151 185545,104 185546,179170 185547,179170 185548,179170 185549,104 185550,577 185551,104 185552,536 185553,843 185554,3623 185555,1231 185556,142870 185557,1515 185558,875 185559,1893 185560,455 185561,179170 185562,1231 185563,1381 185565,217 185566,1893 185567,861 185568,392 185568,189839 185569,366 185570,366 185571,366 185572,5101 185573,6955 185574,366 185575,179170 185576,366 185577,179170 185578,1381 185579,10 185579,907 185580,1849 185581,3623 185582,602 185583,2367 185584,2045 185585,3623 185586,179170 185587,179170 185588,179170 185589,179170 185590,3623 185591,179170 185592,392 185593,179170 185594,83 185594,222 185594,285 185595,179170 185597,5101 185599,81 185600,30 185601,779 185602,179170 185603,592 185604,104 185605,3623 185606,3623 185607,631 185608,30 185609,30 185610,292 185610,462 185611,179170 185612,973 185613,1877 185614,483 185615,211 185616,30 185617,30 185618,3623 185619,179170 185620,179170 185621,179170 185622,4 185622,5 185623,113156 185624,179170 185625,422 185626,56 185628,1707 185629,3623 185630,79 185631,3623 185632,30 185633,1370 185634,30 185635,3623 185636,179170 185637,1133 185638,640 185639,422 185640,56 185641,3623 185642,893 185643,83 185644,349 185645,636 185646,72 185647,179170 185648,557 185649,392 185649,697 185650,179170 185651,264 185652,179170 185653,120 185654,563 185655,473 185655,2367 185656,56 185657,422 185658,65 185659,138686 185660,1707 185661,175 185662,179170 185663,83 185664,3623 185665,179170 185666,104 185667,179170 185668,179170 185669,467 185670,920 185671,72 185672,179170 185673,1983 185674,179170 185675,179170 185676,179170 185677,147 185678,138 185678,304 185678,609 185678,805 185678,1212 185678,1888 185678,2105 185679,255 185680,1052 185681,3 185682,179170 185683,358 185684,1474 185685,673 185686,30 185687,596 185688,918 185689,179170 185690,332 185692,179170 185693,179170 185694,525 185695,4545 185695,56150 185696,1449 185697,1309 185698,179170 185699,1285 185700,179170 185701,788 185702,30 185703,185704 185705,631 185706,294 185707,192 185707,663 185708,292 185709,185710 185711,718 185713,179170 185714,147123 185715,3260 185716,697 185717,217 185718,179170 185719,95554 185720,179170 185721,473 185722,77 185723,30 185724,185725 185726,179170 185727,1058 185728,68 185729,138686 185730,175 185731,779 185732,527 185732,1608 185732,1860 185732,1893 185732,1984 185732,2168 185732,154408 185733,30 185734,450 185735,2116 185736,179170 185737,179170 185738,435 185739,179170 185740,577 185741,9098 185743,843 185744,179170 185745,536 185746,932 185747,422 185748,422 185749,422 185750,422 185751,72 185752,422 185753,422 185754,422 185755,422 185756,422 185757,422 185758,422 185759,861 185760,422 185761,1544 185762,278 185763,392 185764,366 185765,2775 185766,447 185767,366 185768,4260 185769,602 185770,267 185771,1821 185771,21736 185772,323 185773,278 185774,13980 185775,215 185777,1572 185778,424 185779,207 185780,2775 185781,447 185782,179170 185783,30 185784,30 185785,10 185785,1773 185785,1776 185787,2590 185788,30 185789,1773 185790,1836 185791,179170 185792,65 185792,586 185793,392 185794,83 185795,30 185796,179170 185797,450 185798,818 185799,872 185800,900 185801,1429 185802,30 185803,179170 185804,179170 185805,113156 185806,185807 185808,1782 185809,30 185810,668 185811,202 185812,185813 185814,44 185816,179170 185817,185818 185819,185820 185821,1143 185822,179170 185823,424 185824,138686 185825,175 185826,7124 185827,179170 185828,30 185829,30 185830,179170 185831,185832 185833,211 185834,355 185835,179170 185836,145240 185837,440 185838,493 185839,1634 185840,250 185840,1684 185841,298 185842,485 185843,285 185844,118 185844,4597 185847,1893 185848,298 185849,485 185850,4691 185851,202 185852,2116 185853,2048 185854,137 185855,1238 185857,179170 185858,2146 185860,390 185860,1479 185860,1801 185861,346 185862,1058 185863,71 185864,292 185864,1238 185865,1452 185867,5034 185868,433 185869,577 185870,215 185871,22 185872,422 185873,56 185874,298 185874,304 185874,589 185874,765 185874,783 185874,1085 185874,1544 185874,2572 185874,2995 185874,3094 185874,3623 185874,4222 185874,16955 185874,28832 185874,44725 185874,51972 185874,75912 185874,121863 185874,178576 185874,185877 185874,221068 185874,257104 185875,305 185876,179170 185877,41 185877,104 185877,298 185877,356 185877,589 185877,632 185877,685 185877,784 185877,862 185877,911 185877,1085 185877,1119 185877,2204 185877,2572 185877,3623 185877,3715 185877,4532 185877,5578 185877,13637 185877,25385 185877,32692 185877,58617 185877,75912 185877,81508 185877,82703 185877,93691 185877,99756 185877,126881 185877,173427 185877,178576 185877,183822 185877,185874 185877,185877 185877,186065 185877,186471 185877,186478 185877,186511 185877,186617 185877,186852 185877,187009 185877,187585 185877,189223 185877,191113 185877,191119 185877,194573 185877,205877 185877,206230 185877,211936 185877,213937 185877,217429 185877,221068 185877,230344 185877,231072 185877,247059 185877,258065 185877,258887 185879,83 185880,3630 185881,23783 185882,22 185882,233 185882,252 185882,602 185882,1070 185882,1893 185882,13361 185884,356 185884,1436 185885,34 185885,35 185886,433 185887,1572 185888,671 185889,179170 185890,788 185891,640 185892,179170 185893,179170 185896,179170 185897,179170 185898,1220 185898,1222 185900,252 185901,251 185903,1227 185903,86416 185905,6661 185906,151 185907,5908 185908,1860 185909,1858 185910,104 185910,135 185910,138 185911,1807 185912,186 185913,1462 185913,8537 185914,202 185915,1860 185916,1858 185917,79 185918,2244 185919,135 185920,356 185920,1243 185921,1359 185922,467 185923,920 185924,22 185925,138686 185926,1 185928,175 185929,30 185930,483 185931,30 185932,30 185934,259 185934,457 185934,2923 185934,4190 185935,171 185936,596 185937,301 185938,1860 185939,1858 185940,657 185941,1243 185942,209 185943,104 185944,97 185944,2209 185945,1274 185946,22 185947,272 185947,435 185947,1893 185948,2590 185949,179170 185950,3623 185951,302 185952,72 185953,171 185954,346 185955,22 185956,217 185957,360 185957,4571 185958,30 185959,2480 185960,72 185961,596 185963,536 185964,801 185965,30 185966,2334 185967,1284 185968,3623 185969,56 185970,1566 185971,1566 185972,87 185972,1151 185973,3623 185974,240 185975,171 185976,3623 185978,138686 185979,296 185980,240 185980,1177 185981,175 185982,134 185983,22 185984,3623 185985,3623 185988,1007 185989,195 185990,299 185990,972 185990,973 185990,175903 185991,356 185991,124668 185993,135 185993,4411 185994,30 185995,473 185996,252 185997,1220 185997,1222 185998,251 185999,1860 186000,1858 186001,1127 186002,2574 186003,30 186004,596 186005,22 186007,360 186008,22 186009,30 186010,344 186011,79 186013,149 186014,6059 186015,72 186016,146 186016,92476 186017,392 186018,422 186019,56 186020,68 186020,240 186020,3367 186020,9005 186021,192 186021,333 186022,30 186023,911 186024,392 186024,1143 186025,30 186026,1285 186027,450 186028,269 186029,10 186029,113156 186031,1949 186032,102 186033,862 186034,835 186035,30 186036,30 186037,1133 186038,192 186038,577 186038,1400 186039,781 186041,30 186042,149 186042,406 186043,1133 186044,752 186046,1449 186047,862 186048,55849 186049,55849 186050,55849 186051,138686 186052,138 186053,175 186054,1858 186055,1860 186057,811 186058,332 186058,636 186059,1010 186060,289 186060,290 186060,94134 186061,302 186061,6303 186062,30 186063,422 186064,56 186065,10 186065,41 186065,104 186065,431 186065,588 186065,590 186065,784 186065,1608 186065,4220 186065,4222 186065,44725 186065,66297 186065,185877 186065,192522 186066,1803 186067,179170 186068,30 186069,752 186069,1133 186070,30331 186071,179170 186072,1068 186073,406 186075,1805 186077,3623 186078,1118 186079,3367 186080,843 186080,1785 186081,788 186082,8822 186083,3623 186084,392 186085,868 186085,156379 186086,179170 186087,68 186088,10 186089,83 186090,3695 186091,843 186092,949 186092,2671 186093,3623 186094,1133 186095,3623 186096,1858 186097,1860 186098,435 186099,1149 186100,298 186101,142426 186102,179170 186103,179170 186104,422 186105,868 186106,3623 186107,1033 186108,907 186109,3 186110,179170 186111,83 186112,302 186113,1309 186114,843 186115,918 186116,8854 186117,360 186119,179170 186120,147 186121,217 186121,536 186122,3623 186123,968 186124,30 186125,301 186126,366 186128,366 186130,366 186131,515 186132,3623 186133,1635 186134,485 186135,298 186136,179170 186137,3695 186138,2191 186139,3623 186140,3623 186141,602 186142,3623 186143,30 186144,179170 186145,104 186145,225 186145,254 186145,503 186145,704 186145,4355 186146,302 186148,138686 186149,175 186150,4771 186152,918 186153,179170 186154,483 186155,186156 186155,196372 186155,220143 186155,247806 186155,251785 186155,257130 186157,1014 186158,563 186159,179170 186160,3623 186161,179170 186162,433 186163,1541 186165,179170 186167,1644 186168,147 186169,920 186171,179170 186172,83 186173,77 186174,192 186175,252 186176,1220 186176,1222 186177,251 186178,179170 186179,179170 186180,151 186182,30 186183,861 186184,301 186184,1782 186185,186186 186187,1370 186189,160 186190,30 186192,1014 186193,536 186194,146 186194,171 186194,92476 186195,1014 186196,515 186197,388 186198,30 186200,247 186201,309 186201,310 186202,2116 186203,179170 186204,30 186205,107 186206,30 186207,302 186208,3252 186209,151 186210,690 186211,6059 186212,55849 186213,7429 186214,312 186215,55849 186216,179170 186217,1345 186218,30 186219,83 186220,13980 186221,186222 186221,229955 186221,250352 186221,251474 186223,5101 186224,602 186225,360 186225,4571 186226,81 186226,215 186226,227 186226,372 186226,442 186226,503 186226,704 186226,1149 186226,1257 186226,1392 186226,1608 186226,2379 186226,3085 186226,3507 186226,9001 186227,269 186228,338 186230,175 186231,366 186232,366 186233,885 186233,13704 186234,366 186235,366 186236,366 186237,1707 186238,19227 186239,718 186240,186241 186242,55849 186243,577 186244,663 186245,20359 186246,30 186247,211 186248,59021 186249,622 186250,3367 186251,186252 186253,752 186255,30 186255,328 186256,3695 186257,9025 186258,1796 186259,615 186260,1 186260,149 186261,186262 186264,18298 186265,278 186266,6059 186267,3623 186268,186269 186270,30 186271,179170 186272,179170 186273,179170 186274,406 186275,304 186276,3260 186277,602 186278,179170 186279,1368 186280,5906 186281,557 186282,626 186283,278 186284,137 186285,83 186286,862 186287,30 186288,557 186289,920 186290,179170 186291,151 186292,179170 186293,310 186294,358 186295,433 186296,673 186297,247 186297,2867 186297,2868 186298,145240 186299,862 186300,179170 186301,527 186302,179170 186303,1466 186304,179170 186305,406 186305,620 186306,1782 186307,179170 186308,147 186309,179170 186310,72 186311,179170 186312,2367 186313,179170 186314,250 186314,1684 186315,179170 186316,179170 186317,285 186318,179170 186319,192 186319,222 186319,590 186319,1177 186319,8270 186319,182162 186320,18726 186321,328 186322,179170 186323,179170 186324,1474 186325,704 186326,179170 186327,1 186329,30 186330,900 186331,186332 186333,179170 186334,179170 186335,835 186336,2931 186337,179170 186338,179170 186339,561 186339,911 186340,850 186341,179170 186342,179170 186343,179170 186344,179170 186345,179170 186346,2620 186347,2797 186348,179170 186349,186350 186351,2315 186352,485 186353,298 186354,160 186355,30 186356,138686 186357,175 186358,179170 186359,3003 186360,179170 186361,179170 186362,30 186363,179170 186364,179170 186365,3623 186366,697 186367,13361 186368,392 186369,1149 186370,30 186371,483 186372,179170 186373,577 186374,932 186375,30 186376,338 186377,264 186378,390 186379,2083 186380,1544 186381,2045 186382,30 186383,1452 186384,1551 186385,3041 186386,1007 186387,30 186388,6726 186389,1033 186390,72 186391,30 186392,1381 186393,1639 186394,588 186394,590 186394,1419 186395,1452 186396,581 186397,1359 186398,200 186398,240 186399,2116 186400,1284 186401,872 186402,179170 186403,1345 186404,179170 186405,179170 186406,179170 186407,179170 186408,577 186409,5440 186410,179170 186411,179170 186412,179170 186413,289 186413,290 186413,94134 186414,179170 186415,179170 186416,1 186417,186418 186419,30 186420,217 186420,302 186420,2146 186420,42419 186421,137 186422,30 186423,862 186424,179170 186425,285 186426,250 186426,1684 186427,309 186427,310 186427,1052 186427,2312 186428,179170 186429,589 186429,862 186429,1001 186429,1474 186429,44725 186430,179170 186431,301 186431,861 186431,893 186431,2979 186432,186433 186434,179170 186435,202 186436,137 186437,602 186438,973 186438,1284 186438,1381 186438,1419 186439,186440 186439,220388 186441,1432 186442,2590 186443,179170 186444,17309 186445,179170 186446,179170 186448,30 186449,2590 186450,304 186451,179170 186453,2590 186454,179170 186455,94 186455,2787 186456,623 186457,30 186458,179170 186459,1707 186461,186462 186463,872 186464,255 186465,5440 186466,337 186466,1749 186467,179170 186468,179170 186469,179170 186470,6059 186471,185877 186472,179170 186473,577 186474,1238 186475,704 186476,1454 186477,1452 186478,185877 186479,467 186480,6059 186481,7155 186482,694 186483,366 186484,485 186485,298 186486,366 186487,366 186488,366 186489,366 186490,87 186491,366 186492,366 186493,366 186495,1860 186496,1858 186497,3630 186497,5301 186498,366 186499,366 186500,485 186501,366 186502,640 186503,5906 186504,305 186505,206 186506,2979 186507,1147 186509,872 186509,127158 186510,155473 186511,185877 186512,577 186513,278 186514,328 186515,138686 186517,175 186518,326 186519,433 186520,861 186521,1147 186522,693 186522,19010 186522,151398 186522,186522 186523,79 186524,596 186525,1179 186526,186527 186528,346 186529,155473 186530,1247 186530,164572 186531,142426 186533,440 186534,433 186535,1252 186535,1253 186536,179170 186537,433 186538,1425 186539,147 186541,302 186542,106 186543,30 186544,920 186545,467 186546,179170 186547,891 186548,83 186549,179170 186550,179170 186551,2784 186553,278 186554,179170 186555,868 186556,1429 186557,447 186558,2775 186559,1274 186560,920 186561,433 186562,536 186563,1707 186564,450 186566,671 186567,1238 186568,1220 186568,1222 186569,252 186570,287 186570,19010 186571,251 186572,209 186573,151 186574,1465 186574,76096 186575,207 186577,15807 186579,392 186580,389 186581,872 186582,1707 186583,422 186584,422 186585,599 186586,433 186587,186588 186590,861 186591,422 186592,422 186593,422 186594,422 186595,422 186596,422 186597,422 186598,422 186599,422 186600,422 186601,1085 186602,338 186604,2775 186605,447 186606,1147 186607,1085 186607,1179 186608,34 186608,35 186608,1313 186608,5326 186610,328 186611,30 186613,215 186615,779 186616,3367 186617,185877 186618,872 186619,602 186620,467 186623,2590 186624,336 186626,389 186628,3094 186629,668 186630,147 186630,406 186632,2411 186633,406 186634,1801 186635,142430 186636,6059 186637,779 186638,1252 186638,1253 186639,30 186640,1143 186641,1381 186642,202 186644,1118 186646,217 186648,1019 186649,20 186650,1179 186652,1010 186653,1858 186654,392 186657,937 186657,968 186657,2217 186657,103860 186657,173207 186657,186657 186657,232802 186657,235853 186657,235946 186657,263974 186658,9457 186659,179170 186660,195 186661,186662 186663,1179 186664,179170 186665,622 186665,1033 186665,1531 186666,424 186668,3623 186670,918 186671,328 186673,602 186674,30 186675,20 186675,336 186675,918 186675,972 186675,1147 186676,3695 186677,717 186677,2116 186678,3653 186678,230520 186679,147 186680,8854 186681,366 186681,893 186683,2784 186684,996 186685,186686 186687,1105 186688,292 186689,809 186690,1284 186691,2617 186692,1133 186693,1012 186694,2590 186695,163 186696,918 186697,30 186698,178 186699,179170 186700,435 186701,179170 186702,30 186703,146 186703,158 186703,192 186703,202 186703,285 186703,620 186703,1893 186703,92476 186704,179170 186705,179170 186707,2646 186708,515 186710,30 186711,30 186712,30 186713,179170 186714,192 186715,179170 186716,179170 186717,179170 186718,30 186719,843 186720,298 186720,2296 186721,389 186722,920 186723,186724 186725,34 186725,35 186726,5213 186727,186728 186729,192 186730,30 186731,302 186732,30 186733,56 186734,422 186736,717 186737,113156 186738,211 186739,1544 186740,4611 186741,186742 186743,406 186744,195 186745,30 186747,781 186748,1132 186749,179170 186750,30 186751,186752 186753,179170 186754,30 186755,179170 186756,631 186757,309 186757,310 186758,225 186759,1058 186760,200 186761,195 186762,186763 186765,151 186767,179170 186768,1132 186769,781 186770,179170 186771,980 186773,83 186774,932 186775,179170 186776,577 186777,1192 186778,536 186780,326 186781,1 186782,2045 186783,1240 186784,179170 186786,623 186788,22 186789,217 186789,240 186789,301 186789,372 186789,631 186789,1001 186789,1010 186789,1085 186789,1522 186789,1715 186790,1010 186791,30 186792,278 186793,179170 186794,1220 186794,1222 186795,516 186796,252 186797,200 186798,366 186799,200 186800,366 186801,366 186802,647 186803,146 186803,92476 186804,344 186805,179170 186806,366 186807,1522 186808,179170 186810,179170 186811,179170 186812,577 186813,809 186814,30 186815,179170 186816,1181 186817,1474 186818,515 186819,1572 186820,1805 186821,313 186822,389 186823,1122 186824,179170 186825,179170 186826,2443 186827,1359 186828,179170 186829,1388 186830,313 186830,389 186832,1785 186833,589 186834,1167 186835,605 186836,264 186837,1124 186838,1241 186839,1782 186840,2735 186841,973 186842,86 186843,30 186844,10 186845,179170 186846,186847 186848,179170 186849,179170 186850,192 186851,3623 186852,185877 186852,189788 186853,932 186854,179170 186855,179170 186856,1893 186857,179170 186858,422 186859,56 186860,852 186861,435 186862,240 186863,192 186863,2668 186864,697 186865,1474 186866,1085 186867,267 186868,179170 186869,10 186870,328 186871,483 186872,392 186873,179170 186874,843 186875,596 186876,141912 186877,179170 186878,149 186878,158 186879,55849 186880,179170 186881,577 186882,949 186883,1 186884,602 186885,4594 186886,55849 186887,179170 186888,527 186888,740 186888,741 186889,3623 186890,192 186891,3623 186892,3623 186893,3623 186894,3623 186895,179170 186896,179170 186897,206 186898,145240 186899,179170 186900,104 186900,2574 186900,124668 186902,577 186903,179170 186905,179170 186906,179170 186907,179170 186908,8822 186909,563 186910,435 186911,30 186912,41 186913,179170 186914,862 186915,3623 186916,5366 186917,15748 186918,843 186919,358 186920,30 186921,179170 186922,557 186923,179170 186924,1235 186924,1335 186925,1860 186926,1858 186927,86 186928,179170 186929,179170 186930,3695 186931,299 186932,30 186933,19356 186934,179170 186935,510 186936,3 186937,179170 186938,179170 186939,422 186940,422 186941,422 186942,422 186943,422 186944,422 186945,422 186946,422 186947,422 186948,422 186949,422 186950,422 186951,422 186952,179170 186953,179170 186954,179170 186955,179170 186956,186957 186958,179170 186959,83 186959,217 186959,536 186959,1893 186959,13575 186959,20359 186960,392 186961,1319 186962,175 186963,50 186964,3297 186965,179170 186966,179170 186967,269 186968,344 186969,2868 186969,7360 186970,179170 186971,217 186972,671 186973,1132 186974,83 186975,179170 186976,595 186977,1836 186978,6303 186979,30 186980,424 186981,179170 186982,179170 186983,179170 186984,30 186985,179170 186986,179170 186987,34 186987,35 186988,137 186991,649 186992,1414 186993,1849 186994,137 186995,179170 186996,83 186997,149 186998,140 186999,187000 187001,2750 187002,433 187003,302 187004,355 187005,390 187006,1653 187007,6303 187009,185877 187010,932 187011,2557 187012,175 187013,310 187013,875 187013,3039 187014,2205 187014,33424 187015,160 187016,1566 187017,980 187019,146 187019,92476 187020,344 187021,647 187022,179170 187023,1572 187024,3331 187025,147 187026,72 187027,1238 187028,397 187030,2048 187031,49057 187032,535 187033,1634 187034,2607 187035,455 187036,968 187037,392 187038,360 187039,697 187040,1149 187041,868 187042,206 187043,195 187044,22 187045,503 187046,433 187047,628 187048,750 187049,5366 187050,379 187051,599 187052,1782 187053,302 187054,1231 187055,77 187056,1163 187057,920 187058,397 187059,1085 187060,65 187061,1888 187062,3085 187063,435 187064,1849 187066,255 187067,422 187068,3830 187069,3695 187070,72764 187071,602 187072,240 187074,588 187074,590 187075,861 187076,622 187077,1149 187078,406 187079,366 187080,497 187081,491 187082,1058 187083,872 187084,79 187085,4 187085,5 187086,1973 187087,10 187088,269 187089,438 187090,2312 187091,1572 187093,252 187094,2674 187095,1531 187096,240 187097,143287 187098,1284 187099,259 187100,479 187101,1085 187102,301 187103,3182 187104,1132 187105,781 187107,1284 187108,668 187109,302 187110,1452 187111,160 187112,1631 187113,397 187114,256 187115,248 187116,1939 187117,273 187119,668 187120,146280 187121,273 187122,3135 187123,192 187124,1454 187125,60576 187126,1452 187127,1849 187128,158 187129,1345 187130,1663 187131,397 187131,671 187131,4771 187131,30331 187132,2253 187133,6824 187134,346 187135,120 187136,1388 187137,1033 187138,1192 187139,207 187140,1191 187141,179170 187142,1175 187143,1849 187144,707 187145,422 187146,52232 187147,673 187149,1192 187150,130 187151,1572 187152,2253 187153,397 187154,79 187155,187 187156,20757 187157,3297 187158,726 187159,1001 187160,287 187161,147 187162,287 187163,4823 187164,861 187165,707 187166,1300 187167,302 187168,467 187169,920 187170,252 187171,4571 187172,1191 187173,195 187174,29294 187175,187176 187176,167 187176,457 187176,937 187176,972 187176,973 187176,1117 187176,1284 187176,1298 187176,1616 187176,1853 187176,2557 187176,3804 187176,18880 187176,78882 187176,82746 187176,92017 187176,107616 187176,114682 187176,124668 187176,134111 187176,137059 187176,171641 187176,187176 187176,188645 187176,192991 187176,193646 187176,205011 187176,212556 187176,214113 187176,218884 187176,219767 187176,219796 187176,222355 187176,222558 187176,227341 187176,228935 187176,229585 187176,230427 187176,231132 187176,232057 187176,237320 187176,238068 187176,239791 187176,241057 187176,244105 187176,245254 187176,247245 187176,247248 187176,251845 187176,254826 187176,256245 187176,258803 187176,258806 187176,259646 187176,263268 187176,263727 187177,652 187178,66297 187179,1631 187180,68 187181,457 187182,328 187183,760 187184,3135 187185,240 187186,55849 187187,5906 187188,805 187189,1309 187190,577 187190,623 187191,1192 187192,68 187194,2253 187196,10 187197,32 187198,2671 187199,557 187200,310 187201,557 187202,5547 187203,483 187203,13538 187204,349 187205,450 187207,192 187208,457 187209,167 187209,301 187209,968 187209,1522 187209,2083 187209,2557 187209,3422 187210,1326 187211,843 187212,3297 187213,81070 187214,718 187215,217 187216,4223 187217,179170 187218,336 187219,690 187220,1844 187221,1572 187222,1634 187223,1319 187224,2017 187225,1085 187226,68 187227,222 187228,22 187229,1167 187230,81070 187231,811 187232,309 187232,310 187232,1294 187233,4637 187234,1821 187234,21736 187235,151 187236,1844 187237,255 187238,1043 187239,1147 187240,2083 187241,252 187242,5192 187243,1673 187244,3 187245,718 187246,1140 187247,516 187248,505 187249,1163 187250,63 187251,349 187252,240 187253,1836 187254,8149 187255,1572 187256,1390 187257,1425 187258,397 187259,1458 187260,2371 187261,217 187262,5101 187263,390 187264,1782 187265,2620 187266,301 187267,652 187268,489 187269,1016 187270,736 187271,211 187272,86 187273,1235 187273,1335 187274,992 187275,2017 187276,5192 187277,147 187278,527 187279,483 187280,752 187281,872 187282,179170 187283,516 187284,392 187284,1572 187286,647 187287,146 187287,92476 187288,344 187289,2784 187290,146 187290,92476 187291,647 187292,344 187293,149 187293,406 187293,1425 187294,146 187294,92476 187295,647 187296,344 187297,66297 187298,1179 187299,315 187300,314 187300,1749 187301,2931 187302,1572 187303,30 187303,1179 187303,1939 187304,130 187304,1007 187304,36819 187305,146 187305,92476 187306,344 187307,647 187308,179170 187309,6214 187310,261 187310,333 187311,179170 187312,1019 187313,647 187314,146 187314,92476 187315,344 187316,685 187317,1001 187318,6695 187319,287 187320,179170 187321,287 187322,41 187323,179170 187326,138686 187327,126 187328,175 187329,1844 187330,356 187331,80266 187332,287 187333,60576 187335,178 187336,788 187337,68069 187338,652 187339,2315 187340,1844 187341,146 187341,92476 187342,344 187343,647 187344,1014 187345,1014 187346,417 187347,1012 187348,60576 187349,146 187349,92476 187350,647 187351,344 187352,1014 187353,1014 187354,1014 187355,1014 187356,1014 187357,1014 187358,1014 187359,1014 187360,1014 187361,1014 187362,146 187362,92476 187363,647 187364,344 187365,1014 187366,1014 187367,344 187368,647 187369,146 187369,92476 187370,1572 187371,146 187371,92476 187372,344 187373,647 187374,179170 187375,516 187375,8788 187376,179170 187377,1769 187380,2867 187380,2868 187381,217 187382,146 187382,92476 187383,647 187384,344 187385,151 187387,344 187388,146 187388,92476 187389,647 187390,1769 187392,515 187393,3623 187394,146 187394,92476 187395,344 187396,647 187397,1058 187398,302 187399,179170 187400,192 187401,647 187402,344 187403,146 187403,92476 187404,994 187405,252 187406,918 187407,1012 187408,1801 187409,877 187410,248 187410,596 187411,852 187412,146 187412,92476 187413,647 187414,344 187415,1167 187417,146 187417,92476 187418,647 187419,344 187420,872 187420,127158 187423,3623 187424,1140 187426,1769 187427,859 187428,1458 187429,1769 187430,440 187432,285 187433,184 187434,146 187434,92476 187435,647 187436,344 187437,118 187437,4597 187438,314 187438,467 187438,1844 187439,158 187439,406 187440,30 187441,835 187442,2590 187443,146 187443,92476 187444,647 187445,344 187446,1118 187446,1417 187447,81 187447,805 187448,1821 187448,21736 187449,72 187450,187451 187452,113140 187453,344 187454,146 187454,92476 187455,647 187456,1740 187457,149 187457,406 187458,252 187459,920 187460,30 187461,647 187462,146 187462,92476 187463,344 187465,72 187466,30 187467,195 187467,1904 187468,187 187469,2146 187470,3623 187471,3507 187472,106 187473,179170 187474,179170 187475,435 187476,222 187476,2051 187477,422 187478,1634 187480,364 187481,422 187482,2315 187483,138686 187484,980 187485,138686 187486,175 187487,717 187488,843 187489,151 187490,647 187491,146 187491,92476 187492,344 187493,1749 187494,30 187495,72 187496,179170 187497,184 187499,1151 187500,647 187501,146 187501,92476 187502,344 187503,752 187504,340 187505,30 187506,269 187507,515 187508,146 187508,92476 187509,647 187510,344 187511,3623 187512,30 187513,30 187514,309 187514,310 187514,1294 187515,1402 187516,3422 187517,30 187518,30 187519,393 187520,1085 187521,72 187522,30 187524,179170 187525,1 187526,435 187529,179170 187530,1531 187531,63 187532,3623 187533,3623 187534,73570 187535,843 187536,30 187537,138686 187538,175 187539,179170 187540,3695 187541,285 187542,3623 187543,22 187543,2083 187543,50321 187544,72 187545,862 187546,81 187547,1453 187548,1287 187549,72 187550,1085 187551,250 187551,1684 187552,255 187553,1235 187553,2209 187553,8788 187553,21711 187553,29294 187554,179170 187555,809 187556,158 187557,206 187558,626 187559,1775 187559,171294 187560,179170 187561,1644 187562,366 187563,366 187564,366 187565,366 187566,366 187567,841 187568,55849 187569,55849 187570,1 187571,83 187572,302 187572,579 187572,811 187572,893 187573,285 187574,179170 187575,32 187575,1151 187576,179170 187577,146 187577,92476 187578,647 187579,344 187580,1381 187581,215 187582,211 187583,1860 187584,1858 187585,185877 187586,207 187587,1181 187588,2146 187589,328 187589,7124 187590,179170 187591,557 187592,862 187594,557 187595,138 187596,865 187597,557 187598,137 187599,118 187599,4597 187600,88820 187601,68 187602,104 187603,187604 187605,147 187606,179170 187607,146 187607,92476 187608,647 187609,344 187610,158 187611,1616 187612,146 187612,92476 187613,344 187614,647 187615,179170 187616,379 187616,760 187617,2620 187618,647 187619,146 187619,92476 187620,344 187621,179170 187622,179170 187623,179170 187624,2784 187625,179170 187626,37 187627,23783 187628,1983 187629,179170 187630,187631 187632,332 187633,179170 187634,250 187634,1684 187635,179170 187636,179170 187637,179170 187638,138686 187639,175 187640,28203 187641,179170 187642,1 187643,179170 187644,179170 187645,1 187646,179170 187647,179170 187648,485 187649,298 187650,44 187651,298 187652,485 187653,136 187653,1019 187653,2266 187654,1227 187654,86416 187655,179170 187656,211 187657,5366 187658,179170 187659,171 187660,171 187661,298 187662,485 187663,179170 187664,1238 187665,179170 187666,83 187667,179170 187668,187669 187670,1267 187671,250 187671,1684 187672,113156 187673,285 187674,3507 187675,10 187675,273 187676,2416 187676,2417 187677,422 187678,422 187679,422 187680,422 187681,422 187682,104 187683,422 187684,422 187685,422 187686,422 187687,422 187688,422 187689,422 187690,217 187691,179170 187692,179170 187693,1227 187693,86416 187694,184 187694,2443 187695,1 187696,4903 187697,83 187698,179170 187699,718 187700,390 187701,151 187701,663 187702,1773 187703,285 187704,72 187705,34580 187706,417 187707,250 187707,1684 187708,557 187709,187710 187711,137 187712,358 187713,1474 187714,250 187714,1684 187715,589 187715,1001 187716,285 187717,285 187718,2590 187719,346 187720,30 187721,250 187721,1684 187722,285 187723,225 187724,187725 187726,673 187727,592 187727,1285 187727,1572 187727,1773 187727,2266 187727,5265 187728,392 187729,30 187730,366 187731,366 187732,346 187733,8884 187734,3804 187735,1085 187736,4678 187737,142405 187738,346 187739,355 187740,302 187741,647 187742,344 187743,146 187743,92476 187744,2116 187745,187746 187747,2367 187747,4146 187748,187749 187750,83 187751,344 187752,647 187753,146 187753,92476 187754,483 187755,424 187756,932 187757,577 187758,15748 187759,206 187760,146 187760,92476 187761,647 187762,344 187764,647 187765,344 187766,843 187767,356 187768,141912 187769,146 187769,92476 187770,83 187771,146 187771,92476 187772,647 187773,344 187774,2315 187775,4571 187776,3623 187777,841 187778,202 187779,2048 187780,206 187780,7124 187781,872 187782,1429 187783,2590 187784,1143 187785,668 187786,179170 187787,187788 187789,6303 187790,9028 187791,1955 187794,3695 187795,72 187796,155481 187797,42574 187798,1014 187799,179170 187800,1014 187801,1014 187802,996 187803,1014 187804,1014 187805,127158 187806,1014 187807,1014 187808,1381 187809,187810 187811,1014 187812,1014 187813,1 187814,136 187815,72 187816,72 187817,179170 187819,298 187820,485 187821,743 187821,4823 187822,602 187823,179170 187824,179170 187825,179170 187826,19010 187827,179170 187828,483 187829,269 187831,1590 187832,30 187833,344 187834,647 187835,146 187835,92476 187836,602 187837,136 187838,179170 187839,4545 187839,56150 187840,647 187841,344 187842,146 187842,92476 187843,187844 187843,248419 187845,1608 187846,1132 187847,179170 187848,179170 187849,179170 187850,179170 187851,134 187852,298 187853,485 187854,179170 187855,1298 187856,298 187857,485 187858,187859 187860,30 187861,179170 187862,15807 187863,179170 187864,86832 187865,1707 187866,252 187866,516 187866,1220 187866,1222 187867,450 187868,1479 187869,30 187870,390 187871,2073 187872,2506 187873,366 187874,366 187875,366 187876,44 187877,366 187879,298 187880,485 187881,97 187882,67640 187883,52811 187884,187885 187886,298 187887,485 187888,602 187889,1773 187890,588 187890,590 187891,1773 187892,179170 187893,1014 187894,1014 187895,1014 187896,1014 187897,1014 187898,366 187900,254 187901,187902 187903,187904 187905,1133 187906,142430 187907,1058 187908,1181 187909,536 187910,285 187910,1515 187911,577 187913,179170 187914,179170 187916,179170 187917,346 187918,217 187919,179170 187920,932 187921,179170 187922,187923 187924,179170 187925,346 187926,346 187927,179170 187928,247 187929,1133 187929,8992 187930,355 187931,179170 187932,252 187933,516 187934,1220 187934,1222 187935,217 187936,8270 187937,20790 187938,187939 187940,107 187941,2416 187941,2417 187942,292 187943,338 187944,298 187945,1133 187946,3538 187947,142405 187948,187949 187950,127158 187951,269 187952,175 187953,2334 187954,1769 187955,714 187956,137 187957,179170 187958,557 187959,187960 187961,811 187962,781 187963,1132 187964,874 187965,485 187966,298 187967,30 187968,1220 187968,1222 187969,516 187970,252 187971,1983 187972,30 187973,393 187974,1151 187978,1927 187979,187980 187982,76096 187983,355 187984,7124 187987,179170 187988,179170 187989,179170 187990,179170 187991,179170 187992,179170 187993,179170 187994,179170 187995,179170 187996,179170 187997,179170 187998,179170 187999,179170 188000,179170 188001,179170 188002,179170 188003,179170 188004,179170 188005,179170 188006,179170 188007,179170 188008,179170 188009,179170 188010,179170 188011,179170 188012,179170 188013,179170 188014,179170 188015,179170 188016,179170 188017,179170 188018,179170 188019,179170 188020,179170 188021,179170 188022,179170 188023,179170 188024,179170 188025,179170 188026,179170 188027,179170 188028,179170 188029,179170 188030,179170 188031,179170 188032,179170 188033,179170 188034,179170 188035,179170 188036,30331 188037,179170 188038,179170 188039,179170 188040,344 188041,146 188041,92476 188042,647 188043,392 188043,1769 188044,30 188045,138686 188046,175 188047,44 188048,72 188049,852 188050,493 188051,179170 188052,54 188053,179170 188055,19010 188056,179170 188057,99 188058,99 188059,15807 188060,483 188061,1359 188062,188063 188064,577 188065,298 188066,485 188068,30 188069,406 188070,147123 188071,30 188072,1181 188073,360 188074,55849 188075,179170 188076,2421 188077,44725 188078,2367 188079,76096 188080,179170 188082,30 188083,872 188084,1707 188085,30 188086,1133 188088,493 188089,58 188090,30 188091,15807 188092,48 188093,179170 188094,99 188095,1551 188096,1769 188097,179170 188098,142473 188099,1458 188100,3695 188101,99 188102,602 188103,99 188104,179170 188105,179170 188106,179170 188107,179170 188108,179170 188109,179170 188110,99 188111,179170 188112,188113 188114,30 188115,179170 188116,179170 188117,179170 188118,179170 188119,137 188120,137 188121,179170 188122,3623 188123,577 188124,611 188125,333 188125,60576 188126,1467 188128,195 188129,3041 188130,30 188131,151 188132,30 188133,2590 188134,932 188135,809 188136,500 188137,972 188138,4101 188139,366 188140,292 188141,292 188142,294 188143,296 188144,298 188145,843 188146,30 188147,3695 188148,30 188149,3182 188150,2073 188151,3 188151,510 188152,920 188153,269 188154,119 188155,118 188155,4597 188156,640 188157,366 188158,366 188159,188160 188161,44 188162,298 188163,1807 188164,30 188165,355 188166,433 188167,184 188168,83 188169,3695 188170,285 188171,31977 188172,636 188173,179170 188174,3695 188175,433 188176,1276 188176,27041 188177,1238 188178,875 188179,1452 188180,875 188181,872 188182,872 188183,151 188184,1462 188184,2995 188185,179170 188186,872 188187,179170 188188,179170 188189,188190 188191,179170 188192,179170 188193,2646 188194,179170 188195,640 188196,640 188197,467 188197,872 188198,310 188198,483 188198,3039 188199,433 188200,671 188201,485 188202,302 188203,920 188204,663 188205,179170 188206,467 188207,344 188208,647 188209,146 188209,92476 188210,3474 188211,275 188212,181992 188213,447 188214,2775 188215,178 188216,309 188216,310 188217,13546 188218,179170 188219,3695 188220,1238 188221,179170 188222,41 188222,294 188222,631 188223,83 188224,217 188225,2105 188226,592 188228,188229 188230,158 188230,622 188231,99 188232,186 188232,1326 188232,1849 188233,142870 188234,503 188235,433 188236,433 188237,2315 188238,298 188239,485 188240,147 188240,158 188240,406 188240,1458 188240,80266 188240,89035 188241,32475 188242,138686 188243,175 188244,275 188246,3949 188247,682 188247,72439 188248,1181 188249,188250 188251,162599 188252,217 188253,1257 188253,1454 188254,346 188255,179170 188256,111 188256,1119 188257,278 188258,83 188259,217 188262,3623 188263,455 188263,657 188264,1014 188265,1014 188266,1014 188267,179170 188268,1014 188269,1014 188270,1014 188271,1014 188272,312 188273,647 188274,146 188274,92476 188275,344 188276,312 188276,2605 188277,302 188278,868 188278,156379 188279,179170 188280,433 188281,1821 188281,21736 188283,687 188284,2244 188285,2244 188286,515 188287,217 188288,179170 188289,179170 188290,202 188291,30 188292,6303 188293,30 188294,30 188295,3182 188296,142405 188297,588 188297,590 188297,1419 188298,217 188298,536 188298,577 188298,1429 188298,1608 188299,1454 188300,99 188301,663 188302,707 188303,862 188304,285 188305,151 188306,179170 188307,99 188309,557 188310,1085 188311,435 188312,1181 188314,1769 188315,366 188316,179170 188317,1132 188318,1608 188319,843 188320,3623 188321,179170 188323,536 188324,179170 188325,1616 188326,859 188327,1608 188328,1132 188329,1634 188330,30 188331,179170 188332,557 188333,179170 188334,500 188335,1962 188336,54 188337,1052 188338,1882 188339,2775 188340,30 188341,179170 188342,179170 188343,3623 188344,994 188345,179170 188346,179170 188347,994 188348,179170 188349,1247 188349,164572 188350,452 188351,35 188351,83 188352,184 188353,179170 188354,179170 188355,179170 188356,217 188357,628 188358,422 188359,422 188360,422 188361,422 188362,422 188363,179170 188364,422 188365,422 188366,422 188367,422 188368,422 188369,422 188370,422 188371,1 188372,179170 188373,433 188374,1882 188375,932 188376,217 188377,192 188378,179170 188379,1 188380,1332 188381,920 188382,179170 188383,1844 188384,30 188385,175 188386,179170 188387,179170 188388,158 188388,640 188388,1572 188389,179170 188390,1 188390,147 188390,149 188391,146 188391,92476 188392,647 188393,344 188394,188395 188396,179170 188398,179170 188399,994 188400,179170 188401,994 188402,7416 188403,179170 188404,1 188405,17309 188406,868 188406,162599 188407,493 188407,1927 188408,843 188409,483 188410,536 188411,30 188412,1769 188413,30 188414,179170 188415,2073 188416,1 188417,217 188418,179170 188419,179170 188420,179170 188421,1821 188421,21736 188422,179170 188423,179170 188424,179170 188425,3538 188426,179170 188427,179170 188428,577 188429,3623 188430,3623 188431,493 188432,179170 188433,137 188434,188435 188436,366 188437,366 188438,188439 188440,510 188440,3407 188440,3743 188440,5043 188440,34116 188440,35978 188440,71184 188440,232037 188441,23783 188442,179170 188443,312 188444,872 188445,949 188446,273 188447,56 188448,422 188449,77 188450,563 188451,462 188452,1467 188453,179170 188454,2105 188455,179170 188456,388 188457,118 188457,422 188457,4597 188457,5405 188458,195 188459,2424 188460,269 188461,217 188462,536 188463,178 188464,1368 188465,1381 188466,1566 188467,23783 188468,479 188469,1052 188470,179170 188471,63 188472,68 188472,431 188472,589 188472,631 188472,862 188472,994 188472,1001 188472,1085 188472,1474 188472,2590 188472,8884 188472,44725 188473,2244 188474,179170 188476,13980 188477,577 188478,3623 188479,500 188480,240 188482,102 188483,647 188484,344 188485,146 188485,92476 188486,3949 188487,355 188488,188489 188490,1769 188491,647 188492,344 188493,146 188493,92476 188494,647 188495,146 188495,92476 188496,344 188497,344 188498,647 188499,146 188499,92476 188500,171 188501,433 188502,433 188504,142426 188505,120 188506,188507 188510,23701 188511,2929 188512,1132 188513,1608 188514,455 188515,149 188516,156379 188517,447 188518,2775 188519,788 188520,4237 188520,182162 188522,312 188523,435 188523,538 188523,671 188523,188524 188525,1860 188526,1858 188528,583 188529,162599 188531,2867 188531,2868 188532,1282 188533,285 188534,1801 188535,285 188537,640 188538,640 188539,640 188540,1454 188541,206 188541,6119 188543,527 188543,972 188544,703 188545,4611 188546,1544 188547,1984 188547,3949 188548,287 188548,19010 188549,4611 188550,1544 188551,1247 188551,164572 188552,5375 188554,1247 188554,164572 188555,1119 188556,147 188557,1749 188559,346 188561,72 188562,344 188563,285 188564,596 188564,873 188564,1368 188564,16153 188565,30 188566,304 188567,1298 188568,247 188569,60576 188570,920 188571,188572 188573,104 188573,134 188576,652 188577,467 188578,188572 188579,1818 188579,69440 188579,188580 188579,190153 188579,193043 188581,48 188582,652 188583,515 188584,595 188584,1453 188585,515 188587,167 188588,118336 188589,309 188589,310 188590,206 188592,60576 188593,911 188594,586 188595,292 188597,422 188598,344 188599,60576 188600,328 188601,422 188602,211 188603,1858 188604,1860 188605,907 188607,179170 188608,2784 188609,450 188611,493 188612,140 188613,30 188613,63 188613,332 188613,516 188613,1085 188613,1127 188613,1381 188613,3467 188613,5213 188614,750 188615,145240 188616,379 188617,640 188618,217 188619,138686 188620,175 188621,179170 188622,1955 188622,142870 188623,2590 188624,179170 188625,179170 188626,2373 188627,557 188628,1860 188629,1858 188630,503 188631,3623 188632,779 188633,652 188634,920 188635,80266 188636,1556 188637,872 188637,1363 188638,346 188639,515 188640,140 188641,931 188642,179170 188643,1070 188644,907 188644,973 188644,1853 188644,38299 188644,114682 188644,187176 188644,188645 188644,192991 188644,193646 188645,187176 188646,422 188647,422 188648,422 188649,422 188650,422 188651,422 188652,422 188653,422 188654,422 188655,3695 188656,1860 188657,1858 188659,422 188660,90845 188663,147 188664,37 188664,968 188668,147 188670,586 188671,1010 188673,22 188675,147 188676,2784 188677,188678 188679,440 188681,1454 188682,30 188683,1893 188684,994 188685,83 188685,477 188685,536 188685,2784 188687,217 188687,872 188687,1118 188687,1796 188687,8811 188687,16196 188688,147 188689,457 188690,422 188691,56 188692,3695 188693,994 188694,2353 188695,179170 188696,136 188696,184 188696,1243 188696,1821 188696,2867 188696,2868 188696,21736 188696,255750 188697,140 188698,1012 188699,1181 188700,397 188701,3695 188702,433 188703,3695 188704,140 188705,179170 188706,387 188707,302 188708,179170 188709,140 188709,1010 188709,1298 188710,179170 188711,536 188712,30 188713,557 188714,179170 188716,30 188718,302 188719,536 188721,179170 188722,1332 188723,3623 188724,875 188725,4220 188728,861 188731,140 188733,217 188734,106 188735,431 188736,30 188737,30 188738,994 188739,1888 188740,167 188741,179170 188742,302 188743,1556 188744,138686 188745,175 188746,179170 188747,200 188747,557 188748,1257 188748,1294 188750,1769 188750,1893 188751,440 188751,872 188751,1085 188752,179170 188753,127158 188755,430 188756,79 188756,985 188757,392 188759,179170 188760,44725 188761,1 188762,179170 188763,30 188764,30 188765,30 188766,749 188766,1087 188766,1888 188767,6424 188768,503 188769,1133 188771,30 188772,1544 188773,356 188774,1 188775,24500 188776,615 188777,340 188778,720 188780,515 188781,22 188783,30 188784,179170 188785,1001 188786,1452 188787,447 188788,941 188789,744 188790,30 188791,240 188791,294 188791,338 188791,631 188791,635 188791,775 188791,1326 188791,2159 188791,2646 188791,2944 188791,5034 188791,5326 188791,5647 188791,6032 188791,15109 188791,19823 188791,45666 188791,66297 188791,72778 188791,115474 188791,116543 188791,118449 188791,188791 188791,195054 188791,216460 188791,221417 188791,227286 188791,228960 188791,229797 188791,238228 188791,249812 188791,249814 188791,261992 188792,783 188793,30 188794,973 188795,30 188796,433 188797,1224 188798,1634 188800,179170 188801,852 188802,435 188803,647 188804,146 188804,92476 188805,344 188807,422 188808,56 188809,973 188810,30 188811,313 188812,30 188813,247 188816,179170 188820,83 188821,775 188821,999 188822,843 188823,406 188825,113878 188825,148742 188826,30 188827,1359 188828,179170 188829,3 188831,30 188833,3695 188834,72 188835,852 188836,631 188837,292 188837,1688 188839,48 188841,1644 188842,179170 188843,459 188843,156379 188844,179170 188845,179170 188846,200 188847,852 188848,30 188849,30 188850,1102 188851,687 188852,151 188853,406 188854,217 188855,4637 188856,2266 188857,1201 188858,1072 188859,455 188860,34 188860,35 188861,2421 188862,273 188863,30 188864,179170 188865,136 188866,315 188867,592 188868,4260 188869,30 188870,179170 188871,467 188871,162599 188872,1551 188873,1432 188875,179170 188876,179170 188877,179170 188878,1893 188879,8992 188880,179170 188881,698 188882,179170 188883,631 188884,179170 188885,859 188886,179170 188887,240 188887,1285 188888,202 188889,179170 188890,1955 188892,749 188893,302 188894,1769 188895,697 188895,1240 188895,1454 188895,1465 188895,15523 188896,500 188897,179170 188898,344 188899,72 188900,285 188901,179170 188902,179170 188903,852 188904,1 188905,179170 188906,179170 188907,179170 188908,179170 188909,1235 188909,1335 188910,994 188911,1955 188912,179170 188913,179170 188914,1220 188914,1222 188915,516 188916,252 188917,179170 188918,483 188919,1078 188920,83 188921,179170 188922,920 188922,8854 188923,1370 188924,1821 188924,21736 188926,113156 188927,718 188928,1882 188929,1274 188930,2944 188932,188933 188934,30 188935,255 188935,843 188936,779 188937,30 188938,1294 188939,34 188939,35 188939,83 188939,217 188939,278 188939,536 188939,660 188939,852 188939,1466 188939,1467 188939,4637 188939,7092 188940,30 188941,83 188941,278 188942,278 188942,1467 188942,7572 188943,805 188943,932 188944,310 188945,994 188946,30 188947,3260 188948,175 188948,188949 188948,217558 188948,251164 188950,30 188951,1204 188952,28130 188953,30 188954,30 188955,179170 188956,3695 188957,30 188958,30 188959,30 188960,2083 188961,302 188962,447 188963,2775 188964,158 188965,861 188966,30 188967,149 188968,179170 188969,79 188969,192 188969,202 188969,333 188969,1181 188970,2506 188971,30 188972,30 188973,302 188973,406 188973,420 188973,1414 188973,1466 188974,8992 188975,278 188976,3623 188977,179170 188978,8855 188979,3623 188980,862 188981,3623 188982,631 188983,3623 188984,3623 188985,668 188986,3623 188987,192 188987,406 188987,493 188987,516 188987,620 188987,779 188987,1181 188987,1515 188988,30 188988,225 188988,1282 188988,1332 188989,30 188990,2105 188991,2173 188992,994 188993,179170 188994,30 188995,83 188996,843 188997,179170 188998,179170 189000,285 189001,30 189002,179170 189003,179170 189004,994 189005,1363 189006,949 189006,4637 189007,346 189008,179170 189009,31977 189010,255 189011,994 189012,893 189013,189014 189015,217 189016,273 189017,41 189018,30 189019,431 189020,30 189021,447 189022,292 189023,179170 189024,1821 189024,21736 189025,1707 189026,1289 189027,179170 189028,179170 189029,3507 189030,1454 189031,302 189032,138686 189033,175 189034,1289 189035,179170 189036,179170 189037,3623 189038,622 189038,1181 189039,422 189040,422 189041,3623 189042,422 189043,422 189044,422 189045,422 189046,422 189047,991 189048,422 189049,422 189050,422 189051,563 189052,563 189053,86 189053,167 189053,301 189053,589 189053,615 189053,907 189053,973 189053,1001 189053,1124 189053,1167 189053,1241 189053,1284 189053,1522 189053,1782 189053,1785 189053,1955 189053,2083 189053,2557 189053,2979 189053,3193 189054,3 189054,50 189054,58 189054,59 189054,63 189054,79 189054,81 189054,99 189054,116 189054,136 189054,147 189054,149 189054,192 189054,195 189054,206 189054,215 189054,217 189054,225 189054,233 189054,240 189054,248 189054,251 189054,298 189054,301 189054,323 189054,336 189054,372 189054,392 189054,406 189054,422 189054,442 189054,493 189054,503 189054,516 189054,518 189054,536 189054,588 189054,590 189054,602 189054,622 189054,636 189054,694 189054,704 189054,714 189054,760 189054,779 189054,801 189054,805 189054,932 189054,1001 189054,1016 189054,1140 189054,1179 189054,1231 189054,1235 189054,1282 189054,1284 189054,1309 189054,1326 189054,1332 189054,1335 189054,1368 189054,1370 189054,1392 189054,1425 189054,1452 189054,1512 189054,1515 189054,1522 189054,1639 189054,1722 189054,1732 189054,1789 189054,1805 189054,1807 189054,1939 189054,2008 189054,2083 189054,2087 189054,2205 189054,2244 189054,2286 189054,2296 189054,2443 189054,2528 189054,2812 189054,2979 189054,3115 189054,3193 189054,3474 189054,3538 189054,3794 189054,4237 189054,5726 189054,5992 189054,6068 189054,9537 189054,16019 189054,33424 189054,59021 189054,182162 189055,4 189055,5 189055,30 189055,32 189055,34 189055,35 189055,50 189055,58 189055,59 189055,81 189055,111 189055,116 189055,134 189055,136 189055,147 189055,149 189055,158 189055,192 189055,195 189055,206 189055,215 189055,225 189055,233 189055,248 189055,272 189055,333 189055,372 189055,388 189055,406 189055,417 189055,422 189055,430 189055,493 189055,503 189055,516 189055,518 189055,536 189055,585 189055,588 189055,589 189055,590 189055,592 189055,602 189055,620 189055,626 189055,636 189055,640 189055,671 189055,704 189055,714 189055,779 189055,795 189055,862 189055,907 189055,968 189055,973 189055,996 189055,1001 189055,1007 189055,1016 189055,1033 189055,1068 189055,1082 189055,1085 189055,1133 189055,1140 189055,1149 189055,1179 189055,1212 189055,1257 189055,1282 189055,1284 189055,1285 189055,1332 189055,1370 189055,1452 189055,1512 189055,1515 189055,1531 189055,1544 189055,1608 189055,1639 189055,1722 189055,1789 189055,1805 189055,1882 189055,1939 189055,1955 189055,2083 189055,2087 189055,2244 189055,2286 189055,2334 189055,2353 189055,2379 189055,2528 189055,2782 189055,2979 189055,2995 189055,3085 189055,3193 189055,3321 189055,3474 189055,3538 189055,3794 189055,4355 189055,4748 189055,5440 189055,5992 189055,6068 189055,7270 189055,8855 189055,9537 189055,59021 189056,83 189057,83 189058,30 189059,179170 189060,179170 189061,843 189062,137 189063,2421 189064,217 189065,83 189066,179170 189067,10 189068,872 189069,424 189070,217 189070,19986 189071,1467 189072,179170 189073,2244 189074,179170 189075,455 189076,2424 189077,179170 189078,189079 189080,323 189081,1871 189082,2421 189083,83 189084,13980 189085,1326 189086,102 189087,1323 189088,408 189089,179170 189090,30 189091,392 189092,2915 189093,171 189094,994 189095,115659 189096,179170 189097,1132 189098,1608 189099,393 189099,980 189100,30 189101,30 189102,355 189104,130 189106,843 189107,1544 189108,4611 189109,103860 189109,189303 189110,2411 189111,189112 189113,1359 189114,640 189115,1 189115,406 189116,1458 189117,818 189118,1238 189119,752 189119,1274 189120,63 189121,1718 189121,5034 189122,1452 189123,299 189124,536 189125,294 189126,179170 189127,189128 189128,20 189128,97 189128,315 189128,439 189128,447 189128,671 189128,1033 189128,1068 189128,1474 189128,1789 189128,2030 189128,13467 189128,14378 189128,29105 189128,50855 189128,62487 189128,111775 189128,189128 189128,190468 189128,190492 189128,191369 189128,195550 189128,201786 189128,202568 189128,207535 189128,225371 189128,228938 189128,234689 189128,249763 189128,250701 189128,252761 189129,328 189130,190492 189131,305 189132,179170 189133,185877 189133,189788 189133,189794 189133,223738 189134,2775 189135,447 189136,1381 189136,1551 189137,891 189138,337 189139,424 189140,843 189141,59021 189142,328 189143,1544 189144,835 189145,107 189147,1294 189148,649 189148,1007 189148,3999 189148,36819 189150,422 189151,657 189154,200 189155,171 189157,1132 189158,1608 189160,1888 189161,760 189162,2266 189163,83 189164,60576 189165,1608 189166,1132 189167,346 189168,3507 189169,1294 189171,97 189172,30 189174,178576 189175,60576 189177,60576 189178,184 189178,1773 189179,162599 189180,301 189181,1147 189182,920 189183,467 189184,60576 189186,137 189187,4548 189187,189188 189189,60576 189190,872 189191,516 189193,1882 189194,4611 189195,60576 189196,571 189196,868 189196,75912 189196,162599 189197,60576 189198,147 189198,158 189198,206 189199,158 189199,1458 189200,1769 189201,698 189202,1274 189203,30 189205,137 189206,60576 189207,3218 189208,852 189209,8270 189210,60576 189211,698 189212,623 189212,1805 189213,626 189214,485 189215,298 189216,994 189217,179170 189218,60576 189219,7757 189220,171641 189221,875 189222,1522 189223,185877 189224,179170 189225,179170 189226,994 189227,467 189227,571 189229,994 189231,781 189232,1132 189233,83 189234,30 189236,71 189237,106 189238,875 189239,217 189240,302 189241,179170 189242,673 189243,1749 189243,256067 189244,1313 189245,760 189246,671 189246,3462 189248,202 189249,251 189250,217 189251,178 189252,1345 189253,86 189253,1363 189254,1849 189255,852 189256,1749 189257,346 189258,1345 189259,60576 189260,60576 189261,83 189261,7698 189262,338 189263,1707 189264,72764 189265,179170 189266,1696 189266,2143 189266,14061 189266,80519 189266,189266 189266,245336 189267,83 189267,167 189267,217 189267,240 189267,310 189267,355 189267,389 189267,592 189267,623 189267,657 189267,818 189267,949 189267,1010 189267,1019 189267,1072 189267,1085 189267,1118 189267,1143 189267,1388 189267,1818 189267,1849 189267,2775 189267,9001 189267,25222 189267,142409 189268,179170 189269,875 189271,4223 189272,1837 189273,179170 189274,861 189275,809 189275,19010 189276,179170 189277,2253 189278,264 189280,179170 189281,2083 189283,30 189284,3804 189285,1241 189286,34 189286,35 189286,313 189286,389 189286,1417 189287,179170 189288,10 189289,207 189290,179170 189291,217 189291,313 189291,389 189292,3623 189293,972 189293,6249 189294,862 189295,195 189295,406 189296,30 189298,179170 189300,72 189301,344 189302,285 189303,46 189303,444 189303,968 189303,1293 189303,1580 189303,1782 189303,3422 189303,22145 189303,23604 189303,25036 189303,33735 189303,36988 189303,55683 189303,57125 189303,73162 189303,77473 189303,87399 189303,103860 189303,123785 189303,126914 189303,136301 189303,143982 189303,160923 189303,178012 189303,189109 189303,189303 189303,189349 189303,189833 189303,192879 189303,193134 189303,199734 189303,203202 189303,212474 189303,213969 189303,213995 189303,214310 189303,214391 189303,214578 189303,214642 189303,214912 189303,226343 189303,227376 189303,228440 189303,230412 189303,240351 189303,245408 189303,257017 189303,260934 189303,263992 189303,263998 189303,264052 189303,264366 189303,264393 189303,264397 189303,264399 189303,264757 189304,467 189304,868 189305,179170 189306,2923 189307,252 189308,1220 189308,1222 189309,516 189310,1019 189311,179170 189314,179170 189315,30 189316,994 189317,843 189318,138686 189319,175 189320,1773 189321,30 189322,1449 189322,1927 189323,269 189323,1052 189324,994 189325,179170 189326,811 189327,818 189327,1181 189330,158 189331,2775 189332,30 189333,179170 189334,1363 189337,109 189337,366 189337,500 189337,4871 189337,5652 189337,6614 189337,6987 189337,7731 189337,7908 189337,20035 189337,22296 189337,23771 189337,24678 189337,25179 189337,28851 189337,29179 189337,56080 189337,97413 189337,104129 189337,130976 189337,134182 189337,142185 189337,145312 189337,156526 189337,159117 189337,191391 189337,192466 189337,193270 189337,194254 189337,195057 189337,195334 189338,144556 189339,4611 189340,536 189341,4611 189342,144556 189343,155481 189345,30 189346,536 189347,179170 189348,30 189349,189303 189350,178 189350,40566 189352,1381 189353,1370 189354,4611 189355,718 189356,8854 189357,1130 189358,27041 189359,1544 189360,994 189361,3538 189362,483 189364,83 189365,3695 189366,179170 189367,189368 189369,30 189370,83 189371,2572 189372,779 189373,1515 189374,248 189375,30 189376,843 189377,515 189379,192 189379,333 189379,493 189379,586 189379,682 189379,1414 189379,1985 189379,2782 189379,2931 189379,3872 189379,6119 189379,72439 189380,620 189381,272 189382,6638 189383,760 189384,30 189385,2244 189386,30 189387,179170 189388,3218 189389,313 189389,1718 189390,292 189391,172012 189392,179170 189393,63 189394,640 189395,5366 189396,179170 189397,113156 189398,5662 189399,843 189400,1436 189401,3258 189402,1479 189403,682 189403,72439 189404,388 189405,1001 189407,620 189409,5718 189410,406 189411,326 189412,518 189413,697 189414,1707 189415,387 189416,1010 189417,247 189418,179170 189419,994 189420,179170 189421,151 189422,56 189423,1326 189424,6556 189425,83 189425,304 189425,467 189425,868 189425,162599 189426,536 189427,1241 189428,694 189429,1985 189430,968 189431,1359 189432,1151 189433,7572 189434,697 189435,2572 189436,968 189437,2979 189438,106 189438,841 189439,435 189440,994 189441,389 189442,8822 189443,222 189443,455 189444,455 189445,2083 189446,1623 189447,473 189447,1267 189447,1659 189447,2367 189448,306 189448,307 189449,1515 189450,779 189451,179170 189452,30 189453,843 189454,30 189455,179170 189456,1127 189457,1639 189458,48 189459,2373 189460,424 189461,862 189462,818 189463,387 189464,175 189466,1769 189467,120 189468,147 189469,310 189470,366 189471,366 189472,366 189473,366 189474,58 189475,142870 189476,1227 189476,86416 189479,3623 189480,247 189481,141912 189482,841 189483,273 189484,179170 189485,30 189486,563 189487,346 189488,83 189489,55849 189490,30 189491,30 189492,179170 189493,1132 189494,1608 189495,1419 189496,278 189497,588 189497,590 189498,2671 189499,536 189500,7572 189501,83 189502,217 189503,1132 189504,781 189505,5987 189506,119 189506,151 189506,1400 189506,2073 189507,217 189508,346 189509,179170 189510,5906 189511,557 189512,626 189513,278 189514,137 189515,862 189516,72 189517,147 189518,557 189519,671 189520,184 189521,2797 189522,516 189523,994 189524,994 189525,392 189526,179170 189527,30 189528,179170 189529,179170 189530,2626 189531,875 189532,179170 189533,920 189534,2073 189535,30 189536,179170 189537,30 189538,1608 189539,1132 189540,179170 189541,179170 189542,55849 189543,30 189544,1014 189545,30 189546,21442 189546,71303 189546,152568 189547,301 189548,1849 189549,30 189550,312 189551,138686 189552,175 189553,55849 189554,151 189555,179170 189556,179170 189557,179170 189558,346 189559,1474 189561,673 189562,346 189563,179170 189564,1381 189565,485 189566,298 189567,1133 189568,179170 189569,50 189570,189571 189572,875 189574,536 189575,179170 189577,1 189578,44 189579,2735 189580,752 189581,217 189582,1467 189583,278 189584,536 189585,179170 189586,581 189587,1 189588,179170 189589,179170 189590,1939 189591,1179 189592,179170 189593,179170 189594,179170 189595,65 189596,179170 189597,30 189598,147 189599,147 189600,9029 189601,68069 189602,752 189603,179170 189604,278 189605,179170 189606,179170 189607,292 189608,179170 189609,147 189610,79 189610,140 189610,147 189610,158 189610,252 189610,515 189610,585 189610,622 189610,818 189610,861 189610,1240 189610,1639 189610,1715 189613,147 189614,158 189614,355 189614,1160 189614,1353 189614,7698 189615,563 189616,179170 189617,1146 189618,503 189618,1257 189619,885 189619,13704 189620,366 189621,422 189622,422 189623,422 189624,422 189625,422 189626,422 189627,422 189628,422 189629,422 189630,422 189631,422 189632,422 189633,22 189634,179170 189635,179170 189636,358 189637,179170 189638,179170 189639,58 189640,994 189641,46 189642,179170 189643,872 189644,179170 189645,147 189646,2421 189647,718 189648,22 189649,179170 189650,1566 189651,158 189652,179170 189653,83 189654,111 189655,1773 189656,1 189657,389 189658,2116 189659,422 189660,56 189661,1 189662,147 189663,1326 189664,102 189665,1323 189666,408 189667,577 189668,179170 189669,179170 189670,189671 189672,113156 189673,179170 189674,1247 189674,164572 189675,10 189675,113156 189676,255 189677,620 189678,171 189679,968 189680,406 189681,1612 189682,306 189682,307 189683,1515 189684,779 189685,285 189686,1707 189687,355 189688,5366 189689,1132 189690,781 189691,298 189692,485 189693,1235 189693,1335 189694,3724 189697,48505 189698,142870 189700,83 189700,217 189700,278 189701,1238 189702,30331 189703,406 189704,872 189705,1452 189706,1294 189707,217 189708,151 189710,668 189713,1707 189715,1052 189717,827 189718,22 189719,179170 189720,1132 189721,1608 189722,189723 189726,874 189727,72 189728,22 189729,217 189729,254 189730,3804 189732,298 189733,485 189734,60576 189735,151 189736,2989 189736,2991 189737,60576 189738,9007 189739,2443 189740,1882 189742,207 189743,6027 189744,189745 189746,140 189746,1179 189747,620 189748,206 189749,1860 189750,1858 189751,179170 189752,3370 189752,14453 189753,149 189756,1707 189757,336 189757,422 189757,1803 189757,21442 189758,50 189758,79 189758,147 189758,158 189759,515 189760,1276 189761,60576 189763,467 189764,920 189765,1608 189766,1132 189767,60576 189769,1240 189771,10 189772,60576 189773,2353 189774,1608 189775,1132 189776,346 189777,631 189778,2312 189779,138686 189780,248 189780,142430 189781,175 189782,1085 189782,2083 189783,30 189784,16153 189785,167 189788,251 189788,275 189788,733 189788,911 189788,1220 189788,1222 189788,1243 189788,1702 189788,1973 189788,4448 189788,37474 189788,67693 189788,93311 189788,94169 189788,152502 189788,155028 189788,189788 189788,189794 189788,189839 189788,189842 189788,189906 189788,189932 189788,190255 189788,194585 189788,198852 189788,212381 189788,213249 189788,215276 189788,223738 189788,226460 189788,232845 189788,234694 189788,234695 189789,843 189791,1837 189793,685 189793,693 189794,251 189794,275 189794,676 189794,1220 189794,1222 189794,1512 189794,1702 189794,5992 189794,16014 189794,27954 189794,32924 189794,94169 189794,189133 189794,189788 189794,189794 189794,189839 189794,189842 189794,189843 189794,189929 189794,189932 189794,190426 189794,215276 189794,223738 189794,226460 189794,234694 189794,235822 189794,236761 189794,251264 189794,251307 189795,5213 189796,392 189796,697 189796,1769 189797,19010 189799,2244 189800,2048 189801,392 189802,1212 189803,994 189804,770 189804,1837 189805,3 189807,2646 189808,1151 189809,872 189810,179170 189811,179170 189812,178 189814,1294 189816,875 189817,72439 189817,189839 189818,1345 189819,682 189819,72439 189819,189839 189820,1955 189821,994 189822,58 189823,46 189824,467 189825,397 189826,1955 189827,107 189828,179170 189829,1220 189829,1222 189830,6059 189830,124668 189831,83 189832,403 189834,128704 189834,214131 189835,483 189836,179170 189838,536 189839,252 189839,493 189839,682 189839,733 189839,1181 189839,1243 189839,1464 189839,1568 189839,1825 189839,1973 189839,2033 189839,14507 189839,14511 189839,19651 189839,21528 189839,35672 189839,50123 189839,64570 189839,72439 189839,87799 189839,95823 189839,136042 189839,179315 189839,180487 189839,185568 189839,189788 189839,189794 189839,189839 189839,189842 189839,190523 189839,192005 189839,193764 189839,207885 189839,215276 189839,219991 189839,223738 189839,232043 189839,238925 189839,244660 189839,247757 189839,252577 189839,252716 189839,253192 189840,2045 189842,10 189842,63 189842,252 189842,516 189842,682 189842,733 189842,1220 189842,1222 189842,1566 189842,1973 189842,4388 189842,18001 189842,33354 189842,72439 189842,92289 189842,94169 189842,95823 189842,112643 189842,189788 189842,189794 189842,189839 189842,189842 189842,215276 189842,219996 189842,223738 189842,225068 189842,226460 189842,233474 189842,234713 189842,253158 189842,258107 189843,189794 189845,455 189846,485 189847,298 189848,485 189849,397 189851,485 189852,298 189853,30 189855,387 189856,620 189857,189858 189859,1882 189860,994 189861,994 189863,179170 189864,1359 189865,994 189866,19010 189867,30 189868,141912 189870,718 189871,207 189872,217 189873,83 189874,179170 189875,760 189875,1019 189878,30 189880,994 189881,589 189881,1001 189882,422 189883,56 189884,113156 189885,861 189886,707 189887,179170 189888,179170 189890,189842 189891,467 189891,156379 189892,994 189893,179170 189894,1001 189895,179170 189896,515 189899,259 189900,259 189901,259 189904,179170 189905,805 189907,1608 189908,1132 189909,259 189910,435 189912,189913 189916,179170 189917,1466 189918,179170 189919,179170 189920,450 189921,1033 189922,1608 189923,1132 189924,179170 189925,450 189927,50 189927,779 189927,141912 189928,179170 189931,809 189932,189788 189932,189794 189933,179170 189934,179170 189935,1133 189936,4220 189937,147 189937,158 189937,333 189938,118 189938,4597 189939,179170 189940,138686 189941,175 189943,918 189944,179170 189946,1707 189947,760 189948,1955 189949,2244 189950,2775 189950,242246 189951,104 189951,557 189951,953 189951,954 189951,1939 189951,7124 189952,179170 189953,3804 189954,390 189955,179170 189956,179170 189957,83 189958,918 189959,179170 189961,179170 189962,872 189963,179170 189964,2626 189965,1132 189966,1608 189967,179170 189968,30 189969,994 189970,366 189970,483 189970,509 189970,1118 189970,1345 189971,179170 189972,389 189973,1860 189974,1858 189975,179170 189976,179170 189977,877 189978,1359 189979,179170 189981,72 189982,107 189982,3538 189982,4771 189983,801 189984,179170 189985,1707 189986,179170 189987,151 189988,358 189988,509 189989,179170 189990,83 189991,179170 189992,247 189993,392 189994,30 189995,30 189996,179170 189997,179170 189998,179170 189999,30 190000,179170 190001,179170 190002,1556 190002,6303 190003,292 190004,30 190005,179170 190006,994 190007,247 190007,2867 190007,2868 190008,30 190009,30 190010,289 190010,290 190010,94134 190011,179170 190012,179170 190013,10 190014,179170 190015,4691 190016,718 190016,1888 190017,485 190018,298 190019,994 190020,668 190021,994 190022,179170 190023,251 190023,809 190023,893 190023,1033 190024,2646 190025,3695 190026,304 190026,2572 190027,56 190028,422 190029,179170 190030,179170 190031,289 190031,290 190031,94134 190032,179170 190033,179170 190034,65 190035,60576 190036,346 190037,190038 190039,200 190040,272 190041,68 190042,366 190044,179170 190045,1143 190046,179170 190047,179170 190048,1285 190049,875 190050,127158 190051,192 190052,179170 190053,30 190054,30 190055,390 190056,1235 190056,1335 190057,697 190058,1429 190059,179170 190060,179170 190061,467 190062,179170 190063,3115 190064,390 190065,485 190066,298 190067,179170 190068,179170 190069,56 190070,422 190071,4220 190072,1425 190073,994 190074,190075 190076,179170 190077,179170 190078,30 190079,30 190079,50 190079,79 190079,104 190079,111 190079,158 190079,178 190079,195 190079,202 190079,215 190079,217 190079,248 190079,251 190079,272 190079,285 190079,296 190079,333 190079,346 190079,393 190079,406 190079,422 190079,424 190079,430 190079,439 190079,447 190079,585 190079,586 190079,588 190079,590 190079,592 190079,620 190079,622 190079,640 190079,663 190079,718 190079,760 190079,779 190079,818 190079,994 190079,1001 190079,1007 190079,1133 190079,1175 190079,1231 190079,1235 190079,1247 190079,1265 190079,1266 190079,1335 190079,1370 190079,1515 190079,1551 190079,1608 190079,1715 190079,1939 190079,1963 190079,2045 190079,2205 190079,2416 190079,2417 190079,2620 190079,2701 190079,2931 190079,3085 190079,3331 190079,5874 190079,6119 190079,7270 190079,33424 190079,164572 190080,179170 190081,298 190082,485 190083,179170 190084,179170 190085,179170 190086,557 190087,862 190088,1287 190089,1707 190090,433 190090,156379 190091,179170 190092,1381 190092,131675 190093,179170 190094,179170 190095,179170 190096,2373 190097,83 190098,136 190099,516 190100,250 190100,1684 190101,285 190102,179170 190103,435 190104,1238 190105,278 190106,4594 190107,1707 190108,54 190108,283 190108,455 190108,660 190108,2421 190108,2424 190108,2646 190108,2775 190108,37088 190109,8270 190110,179170 190111,4691 190112,55849 190113,704 190114,2797 190115,4 190115,5 190116,330 190117,843 190118,278 190119,83 190120,179170 190121,217 190122,536 190123,1467 190124,485 190125,298 190126,55849 190127,179170 190128,483 190129,179170 190130,250 190130,1684 190131,217 190132,179170 190133,285 190134,805 190135,44 190135,63 190135,79 190135,106 190135,111 190135,137 190135,140 190135,146 190135,147 190135,178 190135,215 190135,217 190135,248 190135,261 190135,296 190135,330 190135,337 190135,424 190135,430 190135,493 190135,516 190135,538 190135,585 190135,592 190135,671 190135,818 190135,934 190135,980 190135,994 190135,1001 190135,1016 190135,1282 190135,1294 190135,1309 190135,1368 190135,1370 190135,1388 190135,1715 190135,1939 190135,1963 190135,2045 190135,2205 190135,2244 190135,2379 190135,2416 190135,2417 190135,2701 190135,2793 190135,3085 190135,3317 190135,3331 190135,4355 190135,4455 190135,4545 190135,5726 190135,5874 190135,15573 190135,16019 190135,33424 190135,92476 190135,245910 190136,179170 190137,657 190137,2421 190138,179170 190139,217 190139,536 190140,83 190141,56 190142,422 190143,179170 190144,240 190145,179170 190146,1001 190147,60576 190148,1551 190149,301 190150,301 190151,190152 190155,190156 190157,179170 190158,179170 190159,138686 190160,175 190161,179170 190162,1309 190163,179170 190164,179170 190165,222 190165,622 190165,932 190165,972 190165,973 190165,1849 190166,1133 190167,9029 190168,179170 190169,1326 190170,102 190171,1323 190172,408 190173,179170 190174,179170 190175,179170 190176,255 190177,190178 190179,994 190180,179170 190181,356 190182,1294 190183,602 190184,602 190185,602 190186,850 190187,328 190188,83 190189,422 190190,422 190191,422 190192,422 190193,422 190194,422 190195,422 190196,422 190197,422 190198,422 190199,422 190200,422 190201,422 190202,1467 190204,862 190205,289 190205,290 190205,94134 190206,602 190207,3623 190208,179170 190209,3623 190210,83 190211,4237 190211,182162 190212,536 190213,1608 190214,323 190215,30 190216,179170 190217,104 190218,179170 190219,1238 190220,10 190220,1773 190221,190222 190223,3321 190224,301 190225,1177 190225,182162 190226,818 190227,1058 190228,697 190229,752 190230,1284 190231,3 190232,1 190233,255 190235,346 190236,179170 190237,1634 190238,285 190240,355 190242,444 190242,589 190242,631 190242,968 190242,1010 190242,1085 190242,1294 190242,1522 190242,1715 190242,2083 190242,2557 190243,493 190244,424 190245,10 190246,4611 190247,1544 190248,422 190249,872 190251,314 190253,1955 190254,149 190254,868 190254,1326 190254,21442 190255,189788 190256,1544 190257,4611 190258,605 190260,366 190261,1252 190261,1253 190263,1544 190264,4611 190265,1837 190266,30 190267,292 190268,1267 190269,346 190270,611 190270,7757 190271,259 190272,6059 190274,4611 190275,1544 190276,104 190276,136 190276,137 190276,138 190276,200 190276,248 190276,364 190276,557 190276,636 190276,943 190276,953 190276,1011 190276,1332 190276,1368 190276,1844 190276,1939 190276,4276 190276,5405 190276,15807 190278,273 190280,1544 190281,4611 190282,932 190283,697 190284,60576 190286,440 190287,557 190289,852 190290,1544 190291,1238 190292,1132 190293,781 190294,1707 190295,60576 190296,861 190298,907 190300,1010 190302,1582 190302,190309 190303,13661 190304,1231 190305,1298 190305,1522 190305,2979 190307,206 190308,875 190309,602 190310,1544 190311,4611 190312,158 190313,850 190314,301 190316,442 190317,60576 190318,852 190319,1707 190320,313 190320,2421 190321,305 190322,1452 190323,811 190324,179170 190325,1860 190326,1858 190328,55849 190329,252 190330,179170 190331,151 190332,8270 190333,138686 190334,1247 190334,164572 190335,175 190336,781 190337,1132 190338,920 190339,467 190340,2671 190341,107 190342,440 190342,622 190343,272 190346,252 190346,1220 190346,1222 190347,1860 190348,1858 190349,1449 190350,424 190351,875 190352,83 190353,2312 190355,31073 190356,1608 190357,1132 190358,113156 190360,160 190361,48505 190363,379 190364,217 190365,1140 190366,48 190367,3623 190368,81 190369,200 190370,1453 190371,206 190373,673 190374,292 190374,509 190374,2620 190374,5718 190375,309 190375,310 190376,158 190377,83 190379,4691 190380,1608 190381,1132 190382,179170 190383,179170 190384,4672 190385,1608 190386,1132 190387,60576 190388,626 190388,1363 190390,1181 190391,875 190392,875 190393,1309 190394,120 190394,694 190395,1608 190396,1132 190397,217 190398,433 190399,264 190399,1132 190399,1147 190399,16687 190401,32 190401,392 190401,697 190401,809 190403,1 190404,71 190405,252 190406,190407 190408,1010 190408,1122 190408,1241 190409,1608 190410,1132 190411,918 190412,694 190414,252 190415,209 190416,918 190417,500 190418,179170 190419,179170 190420,344 190421,1882 190422,2590 190424,142426 190425,1220 190425,1222 190426,189788 190426,189794 190426,223738 190430,37414 190431,252 190431,1220 190431,1222 190432,179170 190433,147 190435,2045 190436,267 190437,309 190437,310 190438,1181 190439,2775 190440,447 190441,179170 190442,275 190442,1619 190443,1370 190443,21736 190445,1132 190446,1608 190447,298 190448,485 190450,217 190451,313 190451,1019 190451,1881 190452,707 190453,179170 190454,2979 190455,30 190458,1572 190458,2626 190459,83 190460,1220 190460,1222 190461,516 190462,252 190463,328 190464,179170 190465,179170 190466,1849 190467,30 190468,189128 190469,73570 190470,2590 190472,302 190474,5213 190475,2209 190476,138686 190477,175 190478,1220 190478,1222 190479,516 190480,252 190481,30 190482,30 190483,485 190484,298 190485,72 190486,344 190487,285 190488,34 190488,35 190488,313 190488,2784 190489,861 190490,515 190491,278 190492,106 190492,315 190492,346 190492,439 190492,447 190492,996 190492,1294 190492,1474 190492,3718 190492,4449 190492,4646 190492,5728 190492,8170 190492,14396 190492,15355 190492,24659 190492,87976 190492,96718 190492,113585 190492,139522 190492,158289 190492,180938 190492,189128 190492,189130 190492,189879 190492,190492 190492,190493 190492,193101 190492,194904 190492,212914 190492,213989 190492,214631 190492,218053 190492,218085 190492,221710 190492,222036 190492,224632 190492,226447 190492,227030 190492,229040 190492,235816 190492,238978 190492,248514 190492,251288 190492,252074 190492,253174 190492,258258 190492,259709 190492,264543 190494,622 190495,147 190495,158 190496,577 190497,622 190498,147 190498,158 190498,192 190498,206 190498,2244 190498,80266 190499,577 190500,872 190502,179170 190503,179170 190505,2605 190506,160 190507,893 190508,151 190509,676 190510,1983 190510,189794 190511,452 190512,1655 190513,671 190514,190515 190514,193299 190514,196559 190514,257910 190516,192 190516,333 190517,255 190519,217 190519,1417 190520,81 190522,55849 190524,225 190524,1332 190524,4039 190525,72764 190526,298 190527,167 190527,2083 190528,200 190530,179170 190531,179170 190532,179170 190533,875 190534,72 190535,623 190535,1590 190535,1644 190536,1882 190537,179170 190538,138 190539,865 190540,557 190541,1392 190541,176782 190542,137 190543,118 190543,4597 190544,88820 190545,147 190546,179170 190547,1132 190548,781 190549,179170 190550,142870 190551,1220 190551,1222 190552,1287 190553,694 190554,304 190554,932 190555,86 190556,179170 190557,2779 190558,459 190559,442 190559,749 190559,3474 190560,179170 190561,850 190562,8270 190563,919 190564,179170 190565,2797 190566,126 190566,872 190567,809 190568,179170 190569,435 190570,1359 190571,179170 190572,179170 190573,333 190574,179170 190575,843 190576,313 190576,2266 190577,44 190578,1133 190579,179170 190580,994 190581,557 190582,179170 190583,179170 190584,209 190585,30 190586,179170 190587,77 190588,1359 190589,179170 190590,1359 190591,179170 190592,875 190593,3623 190594,179170 190595,81 190596,179170 190597,332 190598,1718 190599,250 190599,1684 190600,285 190601,240 190602,179170 190603,179170 190604,179170 190605,179170 190606,179170 190607,179170 190608,179170 190609,640 190610,1359 190611,250 190611,1684 190612,285 190613,852 190614,301 190615,2620 190616,179170 190617,179170 190618,179170 190619,1326 190620,102 190621,1323 190622,408 190623,346 190623,435 190623,439 190623,447 190623,586 190623,1181 190623,1294 190623,6119 190624,968 190625,179170 190626,671 190627,2775 190628,30 190629,81 190630,179170 190631,200 190632,179170 190633,1707 190634,179170 190635,563 190636,30 190637,179170 190638,422 190639,422 190640,422 190641,422 190642,422 190643,422 190644,422 190645,422 190646,422 190647,422 190648,422 190649,422 190650,310 190652,285 190653,179170 190654,179170 190655,30 190657,30 190658,171 190659,30 190660,225 190661,30 190662,483 190663,4545 190663,56150 190664,8884 190665,179170 190666,1085 190668,179170 190670,1285 190671,294 190672,30 190673,30 190674,30 190675,355 190676,190677 190678,781 190679,1132 190680,843 190681,175 190682,366 190683,366 190684,2146 190685,190686 190687,190686 190688,932 190689,431 190690,200 190691,781 190692,1132 190693,190694 190695,852 190696,841 190697,83 190698,179170 190699,30 190700,30 190701,1132 190702,781 190703,269 190704,127158 190705,8270 190706,852 190707,781 190708,1132 190709,30 190710,113156 190711,190712 190713,2528 190714,30 190715,1132 190716,781 190717,30 190718,72 190718,312 190718,509 190718,1052 190718,1287 190718,2605 190718,3695 190719,99 190720,586 190721,349 190722,500 190723,366 190724,850 190726,2048 190727,1016 190728,30 190729,118 190729,4597 190730,190731 190730,203707 190730,226344 190732,3804 190733,707 190734,148742 190735,1132 190736,781 190737,127158 190738,918 190739,1882 190740,2315 190741,190742 190743,190744 190745,190746 190747,2315 190748,4355 190749,1773 190750,217 190751,516 190752,485 190753,298 190754,30 190755,312 190756,259 190756,577 190756,788 190756,127158 190757,190758 190759,273 190760,1571 190761,179170 190762,30 190763,136 190764,994 190765,179170 190766,285 190768,4691 190769,179170 190770,30 190771,179170 190772,179170 190773,179170 190774,1132 190775,781 190777,4355 190778,151 190779,483 190780,4066 190781,179170 190782,1 190783,743 190784,179170 190785,3623 190786,875 190787,1707 190788,44 190789,138686 190790,175 190791,179170 190792,190793 190794,240 190794,588 190794,590 190795,190796 190797,1531 190798,200 190799,596 190800,190801 190802,190803 190804,4611 190805,2979 190806,875 190807,875 190808,179170 190809,179170 190810,179170 190811,30 190812,310 190813,805 190814,10 190814,1773 190815,179170 190816,179170 190817,179170 190818,261 190818,333 190818,4545 190818,56150 190819,179170 190820,189128 190821,1014 190822,179170 190823,1014 190824,1014 190825,1014 190826,102 190827,1326 190828,1323 190829,179170 190830,408 190831,1014 190832,1014 190833,1014 190834,1014 190835,676 190835,698 190835,3260 190836,2506 190837,190838 190839,1776 190840,179170 190841,179170 190842,179170 190843,827 190844,179170 190845,827 190846,179170 190847,179170 190848,190849 190850,1151 190851,179170 190852,179170 190853,179170 190855,179170 190856,179170 190857,1014 190858,358 190859,1821 190859,21736 190860,179170 190861,31977 190862,171 190863,949 190864,190865 190864,264319 190866,179170 190867,179170 190868,179170 190869,179170 190870,179170 190871,247 190872,190873 190874,179170 190875,179170 190876,179170 190877,841 190878,247 190879,31977 190880,190881 190882,179170 190883,179170 190884,179170 190885,179170 190886,179170 190887,179170 190888,179170 190889,190890 190889,218797 190891,2292 190892,179170 190893,179170 190894,179170 190895,10 190896,179170 190897,179170 190898,147 190898,206 190899,179170 190900,179170 190901,301 190902,179170 190903,58 190904,179170 190905,179170 190906,179170 190907,179170 190908,366 190909,355 190910,107 190911,2416 190911,2417 190912,292 190913,338 190914,298 190915,1133 190916,3538 190917,7 190919,30 190920,285 190921,485 190922,298 190923,179170 190924,179170 190925,179170 190926,781 190927,1132 190928,389 190929,811 190930,68069 190931,30 190932,222 190933,190934 190935,30 190936,781 190937,1132 190938,179170 190939,4 190939,5 190939,15609 190940,2315 190941,781 190942,1132 190943,1132 190944,781 190945,447 190946,2775 190947,190948 190949,192 190950,2701 190951,1509 190952,1659 190953,1688 190954,1220 190954,1222 190955,516 190956,252 190957,1082 190958,190959 190960,483 190961,252 190962,1531 190964,190963 190965,1177 190966,190967 190968,2944 190968,6506 190968,32751 190969,144962 190970,179170 190971,55849 190972,2244 190973,1282 190975,2244 190976,269 190977,440 190978,5101 190979,563 190980,179170 190981,192 190982,190983 190984,138686 190985,175 190986,179170 190987,1983 190988,577 190989,312 190990,4220 190991,557 190992,328 190993,44 190994,175 190995,592 190996,55849 190997,179170 190998,1019 190999,179170 191000,179170 191001,707 191002,15 191003,2506 191004,557 191005,557 191006,269 191007,872 191008,872 191009,55849 191010,2367 191011,1837 191012,366 191013,3623 191014,6891 191015,179170 191016,1014 191017,179170 191018,191019 191020,149 191021,179170 191022,406 191023,1014 191024,1014 191025,1014 191026,1014 191027,1014 191028,1014 191029,1707 191030,1014 191031,1014 191032,1014 191033,179170 191034,3623 191035,3623 191036,1556 191037,3623 191038,3623 191039,3623 191040,179170 191041,3623 191042,142473 191043,191044 191045,179170 191048,179170 191049,406 191050,179170 191051,310 191052,805 191053,406 191053,1775 191053,55849 191053,171294 191054,323 191055,158 191056,3623 191057,179170 191058,179170 191059,3623 191060,240 191061,356 191062,1515 191063,4220 191064,200 191065,893 191066,818 191067,191068 191069,68 191070,179170 191071,1163 191072,137 191073,167 191073,2083 191074,179170 191075,102 191076,1326 191077,1323 191078,408 191079,179170 191080,1849 191081,179170 191082,3623 191083,179170 191084,34 191084,35 191085,191086 191087,292 191088,294 191089,296 191090,298 191091,179170 191092,3413 191093,843 191094,191095 191096,179170 191098,179170 191099,1571 191100,1821 191100,21736 191101,179170 191102,8270 191103,179170 191104,83 191105,390 191106,355 191107,483 191108,994 191109,1707 191110,1773 191111,191112 191113,185877 191114,1132 191115,781 191116,760 191117,1238 191118,1608 191119,185877 191120,1452 191121,1608 191122,1132 191123,340 191123,1127 191124,1715 191125,5375 191126,1359 191127,3238 191128,136 191129,158 191129,406 191129,1796 191130,673 191131,83 191132,5101 191133,24500 191134,809 191136,149 191136,206 191136,301 191136,868 191136,1326 191136,21442 191137,931 191139,2979 191141,868 191142,538 191143,151 191143,292 191144,179170 191145,868 191146,1707 191147,179170 191148,389 191149,191150 191151,5405 191152,72 191153,344 191154,285 191155,462 191156,640 191157,195 191158,920 191159,433 191160,932 191161,151 191162,261 191163,872 191164,1033 191166,83 191167,285 191168,1564 191169,781 191170,1132 191174,178576 191176,450 191177,781 191178,1132 191179,435 191180,30 191181,1132 191182,781 191183,781 191184,1132 191185,781 191186,1132 191187,142426 191188,859 191189,703 191189,808 191190,538 191190,1033 191191,781 191192,1132 191193,435 191194,435 191195,435 191196,1231 191196,1782 191197,200 191199,30 191200,852 191201,1033 191202,309 191202,310 191203,19010 191204,994 191205,781 191206,1132 191208,595 191209,301 191209,968 191209,1370 191211,920 191212,4823 191213,79 191214,994 191215,179170 191216,408 191216,1113 191217,920 191218,994 191219,19 191220,994 191221,142405 191222,138686 191223,781 191224,1132 191225,652 191226,175 191227,596 191228,467 191230,215 191231,1117 191232,994 191233,652 191234,19519 191235,1882 191236,158 191237,184 191238,140 191239,269 191240,19519 191241,134 191242,31073 191243,4260 191245,30 191246,17897 191247,1474 191248,309 191248,310 191249,147 191249,1515 191250,179170 191251,113156 191252,809 191253,19519 191254,422 191255,3260 191256,422 191257,422 191258,422 191259,422 191260,422 191261,422 191262,422 191263,422 191264,422 191265,3695 191267,852 191270,1359 191272,515 191273,19519 191275,6027 191276,171 191277,298 191278,1807 191279,779 191280,972 191281,19519 191282,171 191283,30 191284,19519 191285,1132 191286,781 191287,31073 191288,19519 191289,657 191290,2979 191291,752 191292,248 191293,640 191294,1882 191295,72 191296,285 191297,344 191298,726 191299,22 191300,195 191301,20 191303,269 191304,269 191305,179170 191306,344 191307,72 191308,285 191309,285 191310,72 191311,344 191312,292 191314,19519 191315,22 191316,344 191317,72 191318,285 191319,344 191320,285 191321,72 191324,211 191324,1844 191324,15454 191324,26860 191324,31706 191324,55105 191324,57222 191324,59833 191324,68006 191324,227979 191325,285 191326,344 191327,72 191328,138686 191329,455 191330,538 191332,1345 191334,72 191335,344 191336,285 191340,344 191341,72 191342,285 191343,5405 191344,104 191344,136 191344,248 191344,557 191344,1368 191344,5405 191345,1608 191346,1132 191349,179170 191350,1531 191351,467 191352,671 191353,191354 191355,106 191355,202 191355,505 191355,663 191355,1370 191355,13572 191355,16271 191355,16652 191355,19413 191355,22808 191355,28354 191355,53726 191355,144849 191355,192027 191355,193066 191355,200645 191355,227099 191355,233718 191355,251273 191355,252036 191355,253699 191356,200 191356,328 191357,22 191359,697 191359,1240 191361,479 191361,24505 191362,217 191363,30 191363,328 191364,340 191366,191367 191368,714 191368,74696 191369,189128 191370,9457 191371,1769 191372,843 191373,1769 191374,344 191375,179170 191376,34 191376,35 191376,694 191377,346 191378,222 191378,23783 191378,30428 191379,102 191379,408 191381,972 191382,868 191383,19519 191384,852 191386,22 191387,240 191388,8270 191390,918 191391,366 191392,259 191393,30 191394,4571 191396,158 191397,30 191399,3260 191400,179170 191401,2224 191402,73570 191403,2460 191404,2292 191406,1939 191407,142409 191407,146280 191408,259 191409,330 191410,6059 191411,309 191411,310 191412,3623 191413,240 191413,1309 191414,1985 191415,346 191416,179170 191417,1769 191418,918 191419,34 191419,35 191420,217 191421,949 191422,19519 191424,60576 191425,179170 191426,1465 191427,3260 191428,2979 191430,252 191431,1659 191432,1359 191433,596 191434,3 191434,240 191434,309 191434,310 191434,631 191434,818 191434,1085 191434,1749 191434,1785 191434,2334 191434,2620 191434,5718 191434,9010 191435,30 191436,30 191437,422 191438,56 191439,515 191440,191441 191443,1556 191444,30 191445,19519 191446,500 191447,1052 191448,2775 191449,1882 191450,1962 191451,54 191452,1773 191453,360 191453,2617 191454,56 191455,422 191457,516 191458,2353 191458,3695 191459,3182 191460,138686 191461,175 191462,850 191463,1888 191464,10 191466,55849 191467,178576 191468,1474 191469,179170 191470,3623 191471,30 191472,30 191472,3321 191473,1623 191474,862 191475,179170 191477,299 191477,510 191477,920 191477,1436 191477,1579 191478,1227 191478,86416 191479,79 191480,328 191482,2146 191484,179170 191485,179170 191486,657 191487,255 191488,217 191489,406 191490,278 191491,83 191492,179170 191493,252 191494,483 191495,3623 191496,179170 191497,179170 191498,717 191499,179170 191500,467 191501,30 191502,151 191505,179170 191506,179170 191507,1860 191508,1858 191509,22 191510,138686 191511,179170 191512,175 191513,179170 191514,392 191515,179170 191516,1556 191517,1078 191517,4223 191518,179170 191519,155473 191520,309 191520,310 191520,2266 191520,3039 191521,406 191522,467 191522,1235 191522,1335 191522,1368 191523,302 191524,5405 191525,467 191526,392 191527,663 191527,1381 191527,2889 191527,5440 191528,602 191529,179170 191530,1467 191531,147 191532,4237 191532,182162 191533,191534 191535,156709 191536,636 191537,179170 191538,30 191539,1181 191540,179170 191542,4223 191543,1893 191543,4294 191544,1893 191544,4294 191545,191546 191548,179170 191549,557 191550,1544 191551,30 191552,302 191553,3695 191554,19519 191555,1515 191556,179170 191557,137 191558,6638 191559,19519 191560,179170 191561,3218 191562,30 191563,63 191564,5662 191565,19519 191566,1436 191567,358 191568,1479 191569,1474 191570,682 191570,72439 191571,388 191572,86 191572,167 191572,301 191572,907 191572,1284 191572,1522 191572,2083 191572,2191 191572,2557 191572,2979 191572,3138 191573,1001 191574,620 191575,5718 191576,344 191577,72 191578,285 191579,673 191580,518 191581,781 191582,1132 191583,433 191584,56 191585,1326 191586,55849 191587,1241 191588,146 191588,92476 191589,647 191590,146 191590,92476 191591,647 191592,344 191593,344 191594,1985 191595,516 191596,631 191597,72 191598,344 191599,285 191600,83 191601,1359 191602,333 191602,779 191602,2931 191603,113156 191604,179170 191605,968 191606,2979 191607,1181 191608,312 191609,2083 191610,179170 191611,1368 191612,19519 191613,179170 191614,55849 191615,72 191616,344 191617,285 191618,55849 191619,119 191620,55849 191621,358 191622,862 191623,424 191623,1085 191624,72 191625,344 191626,285 191627,179170 191628,2784 191629,516 191630,1220 191630,1222 191631,252 191632,146 191632,92476 191633,344 191634,647 191635,467 191636,1882 191637,2775 191638,500 191639,1052 191640,54 191641,1962 191642,146 191642,92476 191643,647 191644,344 191645,647 191646,146 191646,92476 191647,344 191648,671 191649,30 191650,195 191651,602 191652,247 191653,179170 191654,147 191654,158 191655,142433 191656,516 191657,179170 191658,15179 191659,179170 191660,3623 191661,179170 191662,68 191663,647 191664,146 191664,92476 191665,344 191666,640 191666,1515 191667,525 191668,136 191669,179170 191670,3623 191671,795 191671,1113 191672,209 191672,861 191673,72 191674,1368 191675,602 191676,577 191677,273 191678,1309 191679,2116 191680,72 191681,1285 191682,179170 191683,435 191684,30 191685,30 191685,195 191685,430 191685,1235 191685,1335 191685,1368 191685,1452 191685,1639 191686,631 191687,179170 191688,30 191689,294 191690,179170 191691,179170 191692,422 191693,56 191694,138686 191695,843 191696,175 191697,179170 191698,19519 191699,1773 191700,217 191700,1417 191701,179170 191702,179170 191703,1323 191704,102 191705,1326 191706,408 191707,95554 191708,247 191709,171 191710,179170 191711,1188 191712,422 191713,346 191714,422 191715,422 191716,422 191717,422 191718,422 191719,422 191720,422 191721,422 191722,422 191723,422 191724,422 191725,805 191726,862 191727,30331 191728,843 191729,179170 191730,179170 191731,44 191732,647 191733,285 191734,179170 191735,8270 191736,179170 191737,10 191738,2590 191739,179170 191740,118 191740,4597 191741,3804 191742,269 191743,872 191744,179170 191745,86 191745,167 191745,589 191745,615 191745,907 191745,973 191745,1124 191745,1167 191745,1241 191745,1522 191745,1782 191745,1785 191745,1955 191745,3193 191746,179170 191747,30 191748,934 191749,872 191750,1429 191751,366 191752,179170 191753,179170 191754,207 191755,1469 191755,189757 191756,179170 191757,179170 191758,179170 191759,179170 191760,2367 191761,668 191762,83 191763,1634 191764,179170 191765,818 191766,208442 191767,1773 191768,1070 191769,1300 191769,171641 191770,171 191771,1143 191772,859 191773,355 191774,779 191775,171 191776,1007 191778,217 191779,179170 191781,636 191782,779 191786,179170 191787,433 191788,1400 191789,60576 191790,1132 191791,781 191792,191793 191792,212871 191792,214638 191792,249280 191792,249544 191794,60576 191795,433 191796,1012 191798,1133 191799,1133 191800,160 191801,366 191802,596 191802,1146 191803,60576 191804,60576 191805,117163 191806,333 191807,151 191808,4611 191809,712 191810,30 191811,54 191812,2775 191813,500 191814,1052 191815,1882 191816,1962 191817,2116 191818,273 191819,151 191820,264 191821,1782 191823,8270 191824,932 191825,1 191826,415 191827,60576 191828,859 191830,1319 191832,852 191833,788 191835,30 191836,447 191837,2775 191838,2775 191839,447 191840,1801 191841,138686 191842,175 191843,217 191844,1147 191845,1070 191847,3846 191848,1551 191849,6556 191849,154408 191850,3623 191851,872 191852,1882 191853,500 191854,1052 191855,54 191856,1962 191857,2775 191859,191860 191860,111 191860,1579 191860,191860 191861,647 191862,146 191862,92476 191863,344 191865,269 191866,1359 191867,3623 191868,500 191869,1882 191870,1052 191871,54 191872,2775 191873,1962 191874,1033 191875,949 191875,1618 191876,1417 191877,83 191881,259 191882,920 191883,1466 191884,30 191885,147 191886,8 191887,3623 191889,467 191890,313 191890,827 191891,3623 191892,147 191894,289 191894,290 191894,2205 191894,33424 191894,94134 191895,571 191896,1132 191897,781 191899,104 191900,843 191901,631 191904,179170 191905,206 191906,850 191907,1659 191908,447 191909,2775 191911,1381 191911,1544 191912,102560 191913,388 191914,1882 191915,1572 191916,599 191917,20 191917,1276 191917,5310 191918,811 191919,1882 191920,138686 191921,175 191922,602 191923,285 191924,3003 191925,83 191926,58 191927,994 191928,46 191929,1033 191930,1801 191931,1659 191931,1749 191932,875 191933,875 191934,467 191934,868 191935,171 191938,1204 191938,1844 191939,285 191939,779 191939,809 191939,141912 191940,222 191941,2605 191942,875 191943,477 191943,536 191943,781 191944,278 191945,30 191946,9015 191947,83 191948,72764 191949,875 191950,1033 191951,30 191953,360 191954,126 191954,872 191955,1432 191956,457 191957,149 191957,760 191957,1052 191958,151 191959,3623 191960,65 191960,71 191960,272 191960,611 191962,424 191964,118 191964,4597 191965,72 191966,181063 191967,332 191968,259 191970,1147 191971,115659 191972,467 191974,1773 191975,1955 191976,1001 191977,1882 191978,500 191979,1052 191980,54 191981,2775 191982,1962 191983,22 191984,251 191985,447 191988,30 191989,309 191989,310 191989,483 191990,663 191991,389 191992,302 191993,720 191994,634 191995,447 191996,500 191997,366 191998,1052 191999,1882 192000,54 192001,500 192002,2775 192003,1962 192005,189839 192006,28203 192007,536 192008,1385 192009,467 192010,149 192011,1151 192012,1001 192013,278 192014,5405 192015,1796 192016,158 192017,392 192020,326 192020,845 192020,955 192020,1158 192020,5937 192020,7300 192020,212406 192020,231614 192020,237547 192021,779 192021,1033 192022,1634 192023,707 192026,22 192026,71 192026,247 192026,14472 192027,191355 192028,15807 192030,918 192031,515 192033,843 192034,179170 192035,22 192036,1294 192037,3297 192038,8180 192039,179170 192042,19519 192043,682 192043,72439 192044,30 192045,805 192045,932 192046,852 192047,310 192048,2782 192049,179170 192050,192051 192052,179170 192053,435 192055,179170 192056,179170 192057,328 192058,179170 192059,30 192060,60576 192061,179170 192062,186 192063,1381 192064,1149 192065,179170 192066,179170 192067,1860 192068,1858 192069,2620 192070,138686 192071,843 192072,175 192073,333 192074,179170 192075,179170 192078,58 192079,994 192080,46 192081,179170 192083,309 192083,310 192084,994 192086,30 192087,48 192088,151 192090,179170 192091,30 192092,179170 192094,1298 192095,1769 192096,255 192097,302 192098,179170 192099,2617 192099,192105 192100,192101 192102,302 192103,1844 192104,1247 192104,164572 192106,30 192107,34 192107,35 192108,179170 192109,994 192110,79 192110,516 192111,179170 192112,179170 192113,179170 192114,2590 192115,20 192115,65 192115,171 192115,202 192115,366 192115,447 192115,818 192115,920 192115,1019 192115,1285 192115,1368 192115,1392 192115,2244 192115,31206 192115,141912 192118,184 192119,240 192119,372 192119,1085 192119,1715 192120,178 192121,30 192122,483 192123,158 192124,302 192125,30 192126,192127 192128,1572 192128,1796 192129,1285 192130,37 192131,312 192132,2421 192133,1381 192134,179170 192135,2626 192136,1522 192137,179170 192138,1289 192139,3999 192140,1509 192141,14366 192142,7 192143,2116 192143,2312 192143,2617 192143,3804 192144,457 192145,994 192146,179170 192147,312 192147,1882 192148,30 192149,918 192150,3 192151,861 192152,392 192153,179170 192154,59021 192155,192156 192157,179170 192158,179170 192159,1608 192160,1132 192161,2373 192162,1882 192163,179170 192164,65 192165,1132 192166,1608 192167,557 192168,328 192169,1608 192170,1132 192171,752 192172,1132 192173,781 192174,2674 192175,179170 192176,179170 192177,30 192178,179170 192179,179170 192180,250 192180,1684 192181,285 192182,1132 192183,1608 192184,1298 192185,1556 192187,179170 192188,179170 192189,217 192190,179170 192191,240 192191,299 192191,301 192191,968 192191,1293 192191,2557 192192,30 192193,179170 192194,30 192195,179170 192196,1454 192197,577 192198,192199 192200,1474 192201,179170 192202,30 192203,1033 192204,179170 192205,2209 192206,179170 192207,2590 192207,6068 192208,1117 192208,6068 192209,392 192210,861 192211,179170 192212,2224 192213,435 192214,536 192215,30 192216,30 192217,358 192218,30 192219,179170 192220,179170 192221,843 192222,673 192223,312 192224,392 192225,250 192225,1684 192226,19519 192227,843 192228,72 192229,344 192230,285 192231,179170 192232,151 192232,663 192233,994 192234,5405 192235,179170 192236,623 192237,285 192238,4222 192239,1749 192240,179170 192241,1882 192242,1210 192243,30 192244,2073 192245,179170 192246,179170 192247,1149 192248,19519 192249,313 192250,44 192251,179170 192252,872 192253,5591 192254,240 192255,179170 192256,278 192257,1149 192258,10 192259,179170 192260,179170 192261,179170 192262,179170 192263,2116 192264,179170 192265,102 192266,1326 192267,1323 192268,408 192269,83 192270,577 192271,30 192272,179170 192273,972 192273,973 192273,148742 192274,1132 192275,192276 192277,424 192278,338 192278,872 192278,4039 192279,179170 192280,1012 192281,171 192282,179170 192283,179170 192284,179170 192285,179170 192286,179170 192287,179170 192288,31977 192289,179170 192291,577 192292,563 192293,147 192294,179170 192295,1893 192295,2617 192297,30331 192298,179170 192299,8270 192300,1181 192301,171 192302,2590 192303,215 192304,3 192305,192306 192307,1860 192308,1858 192309,355 192310,2443 192311,79 192312,1860 192313,1858 192314,1001 192315,788 192316,217 192317,207 192318,1085 192320,326 192321,859 192322,6068 192323,788 192324,344 192325,2750 192326,872 192327,392 192328,48 192329,1429 192330,356 192330,385 192330,477 192330,781 192330,1201 192330,1571 192330,1881 192330,2224 192330,2553 192330,7698 192330,8463 192331,179170 192332,1058 192334,1888 192335,422 192336,346 192337,323 192338,3467 192339,3328 192340,1452 192341,269 192342,3538 192344,310 192345,15523 192346,2775 192347,447 192348,422 192349,422 192350,422 192351,422 192352,422 192353,422 192354,422 192355,422 192356,422 192357,422 192358,422 192359,151 192360,809 192361,422 192363,932 192364,142405 192365,4637 192366,179170 192369,843 192372,269 192373,1860 192374,1858 192375,1449 192376,920 192377,2146 192378,872 192378,127158 192379,718 192380,240 192380,372 192380,1082 192380,1285 192380,1309 192380,1796 192380,1807 192380,1888 192380,1955 192380,2775 192380,3135 192381,358 192382,668 192383,338 192383,1289 192385,622 192386,192387 192389,1238 192390,1345 192391,994 192392,1118 192393,366 192394,868 192395,2209 192396,1608 192397,1132 192398,1608 192399,425 192400,269 192401,1132 192402,1821 192402,21736 192403,911 192403,2923 192403,256311 192404,158 192405,972 192405,1010 192406,872 192407,83 192408,358 192409,794 192410,4611 192411,1096 192412,259 192413,920 192414,467 192415,1608 192416,1132 192417,285 192418,179170 192419,972 192419,4805 192419,5908 192420,1608 192421,1132 192422,1749 192423,184 192424,50 192424,79 192425,859 192426,1285 192426,4060 192427,83 192429,467 192431,563 192432,2699 192433,442 192433,919 192434,1551 192434,191860 192435,1551 192436,328 192437,994 192438,58 192439,46 192440,1220 192440,1222 192441,516 192442,252 192443,209 192444,920 192445,346 192447,346 192448,653 192448,2253 192448,142426 192449,147 192449,118336 192450,120 192451,1294 192452,1844 192453,158 192454,1984 192455,103860 192456,147 192456,118336 192457,994 192458,994 192460,392 192461,435 192462,994 192463,138686 192464,175 192467,3623 192468,79 192468,192 192468,202 192468,333 192468,1181 192469,3623 192470,1243 192471,44725 192472,811 192473,850 192474,58 192475,1983 192476,1220 192476,1222 192477,252 192478,251 192479,30 192481,3623 192483,440 192484,433 192486,1085 192487,596 192487,2006 192488,483 192489,217 192490,155473 192491,280 192491,393 192491,17245 192492,859 192493,663 192494,65 192494,71 192494,272 192494,611 192495,207 192495,3612 192495,3653 192496,5265 192497,994 192498,3507 192499,3623 192500,3623 192501,72764 192502,273 192502,644 192503,3623 192505,602 192506,1179 192507,179170 192508,2353 192509,1274 192510,457 192511,48 192513,240 192514,602 192515,259 192516,1474 192517,1893 192518,179170 192519,1551 192520,73570 192521,87 192522,788 192522,1070 192522,138686 192522,186065 192523,344 192524,2353 192525,1454 192526,4260 192527,46 192528,994 192529,58 192530,489 192530,577 192530,1844 192531,1707 192532,30 192534,1551 192535,30 192536,1882 192537,1052 192538,54 192539,2775 192540,1962 192541,1220 192541,1222 192542,1220 192542,1222 192543,252 192544,251 192545,1220 192545,1222 192546,2867 192546,2868 192547,5101 192547,15119 192548,4771 192549,5405 192550,2073 192551,493 192551,682 192551,72439 192552,493 192552,682 192552,72439 192553,1058 192554,269 192555,1458 192556,301 192557,994 192558,1326 192559,202 192560,13661 192561,195 192561,1052 192562,893 192563,187 192564,994 192565,8822 192566,1465 192567,687 192568,10 192569,1368 192570,980 192571,179170 192572,994 192573,179170 192574,346 192575,918 192576,515 192577,994 192578,192 192579,843 192580,422 192581,34 192581,35 192582,138686 192583,175 192584,192585 192586,144962 192587,1257 192588,298 192589,192590 192591,931 192593,1298 192594,1551 192595,1298 192596,30 192597,99 192598,73570 192599,485 192601,30331 192602,30 192604,68 192605,1522 192606,571 192608,1893 192608,117163 192609,818 192610,336 192611,366 192612,179170 192613,30 192615,1363 192616,1955 192617,852 192617,2944 192617,19443 192618,788 192618,2923 192618,4190 192619,30 192620,1882 192621,22 192622,893 192623,179170 192625,151 192626,3623 192627,1284 192627,148742 192628,1058 192629,1284 192630,179170 192631,3623 192632,255 192633,1860 192634,1858 192635,392 192635,852 192636,1220 192636,1222 192637,3623 192638,32 192638,392 192639,179170 192640,1085 192641,179170 192642,10 192643,107 192643,338 192643,462 192643,491 192643,872 192643,1572 192643,1659 192643,1722 192643,2367 192643,3538 192643,4039 192644,3623 192645,30 192646,30 192647,1052 192648,54 192649,1882 192650,2775 192651,1962 192652,222 192653,1556 192654,179170 192655,3623 192656,406 192657,5405 192658,19519 192659,422 192660,179170 192661,1425 192662,156379 192663,4771 192664,3623 192665,3623 192668,1284 192668,148742 192669,3623 192670,3623 192671,663 192671,1298 192672,30 192673,247 192673,2867 192673,2868 192674,1181 192675,355 192676,2334 192677,671 192679,107 192680,179170 192681,435 192682,994 192683,179170 192684,636 192684,205627 192685,192686 192687,3507 192688,5906 192689,557 192690,626 192691,278 192692,137 192693,862 192695,422 192696,56 192697,843 192698,115 192698,118 192699,192700 192701,1858 192702,1860 192703,138 192704,179170 192705,179170 192706,994 192707,179170 192708,179170 192709,247 192710,83 192711,994 192712,179170 192713,994 192714,994 192715,1 192716,55849 192717,483 192718,920 192719,55849 192720,179170 192721,994 192722,55849 192723,120 192724,479 192724,920 192725,994 192726,179170 192727,1858 192728,1860 192729,1882 192730,932 192731,2116 192731,2353 192732,1282 192733,261 192733,694 192733,760 192733,994 192734,104 192735,56 192736,422 192737,313 192738,179170 192739,424 192741,1769 192742,55849 192743,1860 192744,1858 192745,179170 192746,994 192748,3260 192749,179170 192750,2620 192751,1363 192752,179170 192753,920 192754,406 192755,142433 192756,56 192757,422 192758,179170 192759,179170 192760,1133 192761,72 192762,1849 192764,83 192765,1881 192766,179170 192767,167 192768,577 192769,577 192769,1368 192770,4611 192771,4611 192772,30 192773,3623 192774,273 192775,151 192776,433 192777,58 192777,206 192777,310 192777,1118 192777,3039 192777,9318 192778,3079 192780,1882 192781,811 192782,138686 192783,175 192784,87 192784,687 192784,872 192784,1151 192784,1454 192784,1556 192785,179170 192786,104 192786,557 192786,1368 192787,1381 192788,1881 192789,8270 192790,697 192790,2989 192790,2991 192791,72 192793,1782 192793,57182 192793,192793 192794,563 192795,179170 192796,447 192797,58 192798,994 192799,46 192801,1359 192802,14126 192803,83 192804,79 192805,1359 192806,278 192807,1210 192808,192809 192810,134 192811,179170 192812,83 192813,1467 192814,278 192815,217 192816,536 192817,56 192818,422 192819,269 192820,795 192821,862 192822,56 192823,422 192824,179170 192825,99 192826,46 192827,58 192828,994 192829,179170 192830,818 192831,285 192832,250 192832,1684 192833,862 192834,192 192834,485 192834,1509 192834,1659 192834,1688 192834,2701 192834,3370 192834,14453 192835,671 192836,1181 192837,1132 192838,1474 192839,6424 192840,2590 192841,356 192842,2646 192843,179170 192844,304 192845,179170 192846,1235 192846,1335 192847,179170 192848,56 192849,422 192850,1160 192851,255 192852,285 192853,195 192853,406 192853,779 192854,171 192855,72 192856,138686 192857,175 192858,273 192859,179170 192860,58 192862,1235 192862,1335 192863,56 192864,422 192865,56 192866,422 192867,30 192867,111 192867,433 192867,652 192867,1102 192867,5440 192868,932 192869,355 192870,1707 192871,671 192872,808 192874,2867 192874,2868 192875,1241 192876,872 192877,56 192878,422 192881,366 192882,366 192883,859 192885,4223 192886,1454 192887,147 192888,1238 192889,312 192891,217 192893,3085 192894,1332 192894,3555 192895,1801 192896,1132 192897,781 192898,1551 192899,167 192899,483 192899,1117 192899,73570 192900,37088 192901,278 192902,330 192903,240 192903,127158 192904,151 192905,1452 192907,349 192908,557 192910,1773 192911,186 192911,366 192911,718 192911,808 192911,1118 192911,1566 192912,415 192912,5591 192913,932 192914,1434 192916,567 192916,784 192916,1160 192916,1452 192917,1608 192918,1132 192919,1608 192920,1608 192921,1132 192922,104 192923,3260 192927,79 192928,406 192929,1381 192930,557 192931,467 192932,920 192933,2915 192934,1479 192935,142426 192938,344 192938,3507 192939,1132 192940,1608 192941,2923 192942,2779 192943,138 192944,431 192946,760 192947,333 192948,1381 192949,217 192950,1274 192951,1332 192952,73570 192953,1368 192955,83 192956,83 192957,6424 192958,422 192959,422 192960,422 192961,422 192962,422 192963,13538 192964,647 192965,422 192966,422 192967,422 192968,422 192969,422 192970,140 192971,138686 192972,5301 192973,175 192974,422 192975,422 192976,1677 192977,137 192977,138 192979,505 192980,4 192980,5 192980,355 192981,34 192981,35 192983,83 192983,1274 192984,349 192985,516 192987,192988 192990,1227 192990,86416 192991,187176 192992,687 192992,1556 192994,811 192995,781 192996,1132 192997,1381 192998,666 192999,1370 193000,925 193002,493 193003,390 193003,586 193003,636 193003,28130 193003,103860 193004,868 193005,30 193006,113156 193007,30 193008,60576 193009,406 193010,30 193011,30 193013,137 193014,179170 193015,1983 193016,1983 193017,7124 193018,372 193019,1466 193020,310 193020,3039 193021,140 193022,1298 193022,1436 193023,140 193024,1274 193025,5101 193026,289 193026,290 193026,94134 193027,2083 193028,827 193029,1860 193030,1858 193031,1983 193032,693 193033,406 193035,179170 193036,83 193037,1673 193038,4611 193040,1175 193040,17772 193041,3538 193044,1425 193045,596 193046,240 193047,596 193048,193049 193050,328 193050,636 193050,5405 193051,596 193052,596 193055,1052 193056,54 193057,1882 193058,2775 193059,1962 193060,1608 193061,19519 193062,515 193063,1718 193064,918 193065,8822 193067,142430 193069,200 193069,248 193070,146 193070,92476 193071,647 193072,344 193073,581 193074,193075 193076,79 193077,1243 193078,1801 193078,6068 193078,214131 193079,251 193080,179170 193081,1544 193082,179170 193083,596 193084,179170 193085,54 193086,1882 193087,1052 193088,2775 193089,1962 193090,408 193090,581 193090,589 193090,647 193090,1623 193090,1718 193091,83 193091,1274 193092,251 193094,72 193095,483 193096,1298 193096,142473 193097,247 193097,349 193097,392 193098,97 193099,602 193100,192 193101,1001 193101,181063 193101,188791 193101,190492 193101,212914 193102,79 193103,5591 193104,83 193105,406 193106,1368 193106,1715 193106,1749 193109,138686 193110,175 193111,255 193113,312 193114,2646 193115,775 193116,602 193117,1181 193119,278 193120,6027 193121,827 193122,5440 193123,126 193124,58 193125,3695 193126,3623 193127,179170 193128,30 193129,68 193129,590 193129,911 193129,1663 193129,4220 193129,5836 193129,7921 193129,26087 193129,47805 193129,65901 193129,65911 193129,84257 193129,117769 193129,122905 193129,193129 193129,214860 193129,215222 193129,263889 193130,1556 193131,1551 193132,622 193132,1181 193133,435 193135,179170 193136,30 193137,4192 193137,4193 193139,140 193140,179170 193141,41 193141,68 193141,240 193141,294 193141,631 193141,784 193141,805 193141,1119 193141,1285 193141,2995 193141,3135 193142,179170 193143,233 193144,179170 193145,1368 193146,3623 193147,301 193147,1298 193148,179170 193149,843 193150,32 193150,349 193150,392 193150,433 193150,644 193150,697 193150,720 193150,907 193150,1634 193150,2191 193150,2699 193150,3260 193150,15609 193151,1181 193152,179170 193153,179170 193154,577 193154,852 193157,1224 193158,146 193158,92476 193159,344 193160,647 193161,1782 193162,885 193162,13704 193163,2989 193163,2991 193164,179170 193165,179170 193166,1556 193167,48 193168,392 193169,179170 193170,158 193171,340 193172,120368 193173,179170 193174,1454 193175,50 193176,30 193177,994 193178,56 193179,422 193181,918 193182,30 193183,1252 193183,1253 193184,151 193185,30 193186,179170 193187,179170 193188,483 193189,179170 193190,577 193190,1429 193191,795 193192,207 193193,72 193194,2989 193194,2991 193196,338 193197,72 193198,406 193199,72 193200,289 193200,290 193200,94134 193201,6837 193202,142426 193203,4594 193205,111142 193206,30 193207,640 193208,2590 193209,72 193210,179170 193211,72 193212,1 193212,2750 193213,1363 193214,179170 193215,30 193216,622 193217,147 193218,406 193218,779 193219,30 193220,30 193221,30 193222,193223 193224,58 193225,30 193226,30 193227,72 193228,179170 193229,179170 193230,179170 193231,206 193232,179170 193233,389 193234,447 193235,907 193235,1010 193235,1837 193235,20359 193236,179170 193237,872 193238,1429 193239,240 193240,536 193241,3623 193242,6424 193243,1882 193244,1052 193245,1962 193246,54 193247,1882 193248,2775 193249,2699 193250,10 193251,435 193252,557 193253,862 193254,841 193255,252 193255,1385 193256,302 193257,2735 193258,56 193259,422 193260,179170 193261,285 193262,843 193263,1773 193264,557 193265,862 193266,346 193267,346 193268,179170 193269,23783 193270,366 193271,1132 193272,1608 193273,72 193274,192 193274,1509 193274,3370 193274,14453 193275,179170 193276,138686 193277,1326 193278,1 193279,3 193280,861 193281,994 193283,349 193284,3507 193285,3507 193286,13361 193287,30 193288,179170 193289,72 193290,179170 193291,72 193292,158 193293,301 193293,455 193294,602 193295,68 193295,4220 193296,179170 193297,179170 193298,818 193300,19010 193301,55849 193303,160 193304,209 193304,861 193305,424 193306,8270 193307,267 193308,841 193309,179170 193310,179170 193311,81 193312,138686 193313,175 193315,179170 193316,323 193317,83 193318,1188 193318,142870 193319,179170 193320,195 193320,1052 193321,1782 193322,104 193323,181398 193324,366 193325,179170 193326,179170 193327,179170 193328,179170 193329,179170 193330,179170 193331,240 193332,179170 193333,134 193333,372 193333,2209 193334,332 193334,1309 193335,949 193336,142870 193337,994 193338,2719 193339,68 193340,147 193340,158 193341,4 193341,5 193342,450 193342,611 193342,1927 193343,179170 193344,193345 193346,557 193347,147 193348,1326 193349,102 193350,1323 193351,408 193352,179170 193353,285 193354,83 193355,4504 193356,30 193357,326 193358,72 193359,193360 193361,179170 193362,72 193363,1474 193364,850 193365,673 193366,179170 193367,4 193367,5 193368,179170 193369,195 193370,179170 193371,179170 193372,818 193373,1715 193374,179170 193375,1001 193376,1149 193377,2931 193378,193379 193380,193379 193381,193379 193382,193379 193383,175 193384,137 193385,455 193385,1019 193386,366 193387,366 193388,255 193389,179170 193390,179170 193391,179170 193392,301 193392,631 193392,1010 193392,1133 193393,2116 193394,278 193395,991 193396,338 193396,1052 193396,1381 193396,3695 193397,217 193398,179170 193399,1551 193400,2224 193401,355 193402,577 193403,30331 193404,1860 193405,1858 193406,2367 193407,5366 193409,193410 193411,193412 193413,388 193413,3193 193414,479 193415,1238 193416,1381 193417,4039 193419,137 193420,113156 193421,2266 193422,1715 193423,360 193424,30 193426,1379 193428,585 193429,1452 193430,140 193432,636 193433,158 193435,668 193436,1143 193437,994 193438,58 193439,46 193440,2367 193440,8820 193441,698 193442,1707 193443,358 193444,333 193445,1127 193447,455 193448,167 193448,73570 193449,346 193450,1370 193451,360 193452,596 193453,779 193454,349 193454,875 193454,3260 193455,932 193456,872 193457,58 193458,46 193459,994 193460,2671 193461,252 193462,336 193463,30 193464,841 193465,275 193466,58 193467,994 193468,46 193469,818 193470,703 193472,1551 193473,346 193474,920 193475,467 193476,1707 193477,1319 193478,83 193479,1858 193480,1860 193481,718 193482,179170 193483,138686 193484,175 193487,179170 193489,1132 193490,13137 193492,356 193493,192 193493,1089 193494,485 193495,298 193496,563 193497,1212 193499,1147 193500,179170 193501,356 193501,1564 193502,217 193503,193504 193505,298 193506,485 193507,1313 193508,179170 193509,179170 193510,862 193511,179170 193512,193513 193514,875 193515,1052 193516,1882 193517,54 193518,2775 193519,1962 193520,192 193521,356 193522,1119 193523,298 193524,485 193525,302 193525,1722 193525,3258 193526,298 193527,485 193528,875 193529,179170 193531,179170 193532,1238 193533,86 193533,972 193533,1849 193536,843 193537,596 193538,298 193539,485 193540,994 193541,46 193542,58 193543,1052 193544,54 193545,1882 193546,2775 193547,1962 193548,5714 193548,72439 193549,615 193550,31073 193551,255 193552,56 193553,422 193554,58 193555,994 193556,46 193557,875 193560,16953 193561,1284 193562,1132 193563,781 193565,58 193566,994 193567,46 193568,1860 193569,1858 193570,63 193570,516 193570,1220 193570,1222 193572,818 193573,298 193573,704 193573,911 193574,636 193575,1551 193576,179170 193577,360 193578,259 193578,693 193578,1070 193578,4455 193578,139992 193578,193578 193578,237079 193578,256579 193579,483 193580,1962 193581,636 193582,509 193583,1 193583,79 193583,163 193583,192 193583,275 193583,340 193583,571 193583,620 193583,703 193583,788 193583,827 193583,1309 193583,1313 193583,4597 193584,422 193585,647 193586,422 193587,422 193588,422 193589,422 193590,422 193591,775 193592,422 193594,422 193595,30 193597,309 193597,310 193600,1381 193601,3999 193603,875 193604,602 193604,3218 193605,1247 193605,164572 193606,186 193606,217 193606,808 193606,1417 193607,137 193608,248 193609,30 193610,30331 193611,267 193612,136 193612,137 193613,19010 193613,22293 193614,344 193615,707 193616,1220 193616,1222 193619,516 193620,252 193621,200 193622,179170 193623,1414 193624,301 193625,22 193626,87 193627,167 193627,73570 193628,179170 193629,193630 193631,493 193633,992 193634,240 193634,631 193638,918 193639,1458 193640,788 193643,595 193644,485 193645,298 193646,187176 193647,72 193648,4810 193649,435 193650,1619 193651,179170 193652,433 193653,336 193655,104 193656,743 193657,138686 193658,175 193659,1612 193659,4455 193660,149 193662,801 193663,636 193665,79 193665,140 193665,158 193665,585 193665,818 193665,861 193665,1715 193665,3872 193665,5440 193665,6027 193666,557 193667,435 193668,1359 193669,1085 193670,179170 193671,252 193672,217 193673,1284 193674,949 193674,2620 193674,17263 193675,843 193675,1893 193675,2312 193676,636 193677,440 193678,515 193681,843 193682,140 193683,193684 193685,72 193686,415 193687,142426 193688,1983 193689,252 193689,1465 193690,20 193690,644 193690,783 193690,838 193690,1363 193690,1572 193690,2704 193690,17897 193691,406 193692,1127 193693,179170 193694,994 193695,48 193696,1432 193697,94 193697,2787 193698,289 193698,290 193698,94134 193699,14434 193700,1773 193701,2779 193701,2784 193702,2779 193702,2784 193703,273 193704,415 193705,2779 193705,2784 193706,2779 193706,2784 193707,392 193709,83 193710,918 193711,2775 193712,447 193713,193714 193715,1882 193716,151 193717,292 193718,264 193718,1127 193718,1381 193718,1893 193719,326 193719,809 193719,3260 193719,22293 193720,179170 193721,72 193722,344 193723,285 193724,179170 193725,23783 193726,179170 193727,179170 193728,932 193728,991 193728,9029 193729,1479 193730,30 193731,3623 193732,179170 193733,328 193734,179170 193735,179170 193736,911 193737,34 193737,35 193737,2224 193738,489 193739,1179 193741,309 193741,310 193742,179170 193743,2443 193744,195 193746,206 193747,88820 193748,138 193749,865 193750,557 193751,137 193752,118 193752,4597 193753,88820 193754,994 193755,193756 193757,827 193757,920 193758,179170 193759,994 193760,138686 193761,179170 193762,175 193764,189839 193765,148742 193767,605 193770,30 193771,338 193772,485 193773,298 193774,1858 193775,1860 193776,87 193776,392 193776,1722 193777,4691 193778,483 193779,346 193780,809 193781,55849 193782,2266 193783,1882 193784,422 193785,596 193786,56 193787,422 193788,422 193789,485 193790,298 193791,56 193792,422 193793,1181 193794,1474 193795,1572 193796,1805 193797,313 193798,193799 193800,30 193801,179170 193802,422 193803,56 193804,557 193805,467 193806,179170 193807,602 193808,72 193809,179170 193810,179170 193811,179170 193812,298 193813,485 193814,79 193814,97 193814,178 193814,192 193814,406 193814,493 193814,586 193814,779 193814,1181 193814,1370 193815,652 193816,56 193817,422 193818,1345 193819,138686 193820,179170 193821,179170 193822,56 193823,422 193824,179170 193825,179170 193826,422 193827,422 193828,422 193829,422 193830,422 193831,179170 193832,422 193833,422 193834,255 193835,422 193836,422 193837,422 193838,179170 193839,179170 193840,269 193842,179170 193843,104 193844,175 193845,179170 193846,332 193847,179170 193848,179170 193849,179170 193850,179170 193851,843 193852,193853 193854,179170 193855,30 193857,179170 193858,1381 193858,1452 193858,1639 193859,1893 193861,179170 193862,1326 193863,102 193864,1323 193865,408 193866,72 193867,2367 193868,193869 193870,179170 193871,68 193872,179170 193873,193873 193874,179170 193875,179170 193876,179170 193877,179170 193879,1181 193880,193881 193882,3623 193883,875 193884,83 193885,269 193886,83 193887,1132 193888,1608 193889,30 193890,193891 193892,30 193893,2923 193894,602 193895,285 193896,250 193896,1684 193897,179170 193898,431 193898,631 193898,2590 193899,83 193900,250 193900,1684 193901,179170 193902,3623 193903,285 193904,3623 193905,179170 193906,225 193907,2590 193908,179170 193909,875 193910,589 193910,1001 193910,1085 193911,1033 193912,179170 193913,9026 193915,8884 193916,193917 193918,193919 193920,193921 193922,1085 193923,171 193924,366 193925,366 193926,366 193927,422 193929,206 193929,2146 193929,7124 193930,3623 193931,72 193932,355 193934,392 193935,31977 193936,134 193937,193938 193939,179170 193941,1796 193943,1707 193944,146 193944,92476 193946,1241 193947,283 193948,2416 193948,2417 193949,127158 193950,932 193951,147 193951,467 193952,3135 193953,1414 193954,298 193955,485 193956,3830 193957,72 193958,872 193959,358 193960,2073 193961,56 193962,422 193963,58 193964,83 193965,332 193965,788 193965,9007 193966,872 193967,872 193968,273 193969,202 193970,485 193971,298 193972,872 193973,392 193974,179170 193975,179170 193976,972 193976,1293 193977,127158 193979,285 193983,1284 193984,1287 193985,1284 193986,3370 193986,14453 193987,2083 193988,1284 193989,56 193990,422 193991,1284 193994,1119 193994,1285 193996,1882 193997,193998 193999,19519 194000,2867 194000,2868 194001,298 194002,485 194003,422 194004,422 194007,5301 194008,194009 194010,1882 194011,55849 194012,1893 194013,1085 194014,360 194015,485 194016,298 194017,30 194018,1127 194019,6323 194020,1319 194021,30 194022,222 194023,158 194024,147 194025,287 194026,19519 194027,1085 194028,138686 194029,175 194030,1014 194031,1014 194032,1891 194033,1014 194034,1014 194035,1014 194036,1014 194037,1014 194038,1014 194039,1014 194040,1014 194041,1313 194042,269 194043,222 194044,30 194045,422 194046,56 194047,72 194048,179170 194049,1385 194050,72 194051,179170 194052,179170 194053,179170 194054,142870 194055,154408 194056,483 194057,179170 194058,861 194059,1882 194060,3623 194061,626 194062,30 194063,34 194063,35 194064,1479 194065,390 194066,32751 194067,158 194067,192 194067,592 194068,194069 194070,179170 194071,422 194072,56 194074,1326 194075,485 194076,298 194077,422 194078,56 194079,440 194080,175 194080,693 194080,1188 194081,1882 194082,346 194083,240 194084,179170 194085,179170 194086,1326 194087,1323 194088,408 194089,102 194090,179170 194091,179170 194092,1882 194093,779 194093,15523 194094,72 194094,6323 194095,206 194096,30 194097,187 194098,72 194099,1415 194101,346 194102,299 194103,640 194104,147 194105,179170 194106,1707 194107,179170 194108,850 194109,30 194110,179170 194111,179170 194112,179170 194113,179170 194114,179170 194115,179170 194117,30 194118,356 194119,872 194120,355 194121,2073 194121,68069 194122,179170 194123,107 194124,2416 194124,2417 194125,292 194126,338 194127,298 194128,1133 194129,3538 194130,358 194131,192 194131,663 194132,932 194133,932 194134,749 194135,179170 194136,30 194137,30 194138,2784 194138,115474 194139,1072 194140,1572 194141,135 194142,1707 194143,636 194144,269 194145,1707 194146,1805 194147,1284 194148,55849 194150,1284 194156,1284 194157,1284 194161,718 194162,346 194163,640 194164,994 194165,30 194166,1882 194167,72 194168,483 194170,194171 194172,440 194173,1707 194176,30 194177,71 194177,485 194178,707 194179,1773 194180,79 194181,179170 194182,994 194183,994 194184,30 194185,30 194186,994 194187,179170 194188,994 194189,615 194190,346 194191,179170 194192,467 194193,1146 194194,5908 194195,179170 194196,26041 194197,30 194199,994 194200,440 194201,5908 194202,1085 194203,346 194204,440 194205,718 194206,392 194207,194208 194207,203691 194207,235049 194209,30 194210,577 194211,179170 194212,30 194214,392 194215,179170 194216,147 194217,138686 194218,175 194219,194220 194221,313 194222,30 194223,346 194224,179170 194225,240 194226,714 194226,2008 194227,194228 194229,557 194230,557 194231,557 194232,1359 194233,30 194234,392 194235,30 194236,1368 194237,30 194238,1014 194239,1014 194240,1014 194241,1014 194242,1014 194243,1882 194244,1014 194245,2105 194247,1113 194248,194249 194250,248 194251,142473 194252,54362 194253,217 194254,366 194255,30 194256,83 194257,202 194258,843 194259,7155 194260,1580 194261,1458 194262,346 194263,285 194264,841 194265,179170 194266,179170 194267,312 194268,294 194269,611 194270,620 194271,30 194272,406 194273,30 194274,179170 194275,179170 194276,255 194277,306 194277,307 194278,30 194279,30 194280,779 194281,1515 194282,72 194283,366 194284,366 194285,68 194286,292 194287,294 194288,296 194289,298 194290,1773 194291,298 194292,485 194293,2353 194294,192 194295,3999 194296,355 194297,211 194297,779 194297,1368 194297,2797 194298,588 194298,590 194298,805 194299,1888 194300,1882 194301,248 194302,360 194302,4571 194303,68 194304,698 194305,1238 194306,22293 194307,994 194308,251 194309,1773 194310,1452 194313,620 194314,30 194315,115474 194316,1167 194317,104 194318,2775 194319,447 194320,162599 194321,994 194322,1707 194323,406 194324,1551 194326,1 194327,2353 194327,9457 194328,467 194328,571 194329,209 194329,302 194330,314 194330,392 194330,467 194330,595 194330,703 194330,818 194330,872 194330,918 194330,1151 194330,1363 194330,1453 194331,868 194334,1132 194335,1608 194336,140 194337,138 194339,1608 194340,1132 194342,932 194343,1608 194344,1132 194345,189794 194346,83 194347,306 194347,307 194348,516 194349,252 194350,1220 194350,1222 194351,55849 194352,1 194353,77 194354,1332 194355,647 194356,1608 194357,1132 194358,868 194359,518 194362,671 194363,515 194364,1515 194365,779 194366,9457 194367,875 194368,868 194370,4571 194370,88820 194376,138686 194377,760 194378,175 194379,422 194380,422 194381,422 194382,422 194383,422 194384,422 194385,30 194387,422 194389,422 194390,640 194391,30 194392,652 194393,422 194394,920 194395,467 194396,2775 194397,447 194399,1882 194400,920 194401,2168 194402,209 194402,302 194403,292 194403,422 194403,644 194403,877 194403,1012 194403,2353 194403,2699 194403,5469 194403,75912 194404,406 194405,1531 194406,163 194407,877 194407,1284 194407,148742 194408,440 194408,1033 194409,140 194410,194411 194412,1132 194413,1608 194415,852 194418,994 194419,104 194420,1715 194421,850 194422,59021 194423,147 194424,77 194425,269 194426,455 194426,631 194426,1612 194428,390 194429,1220 194429,1222 194430,516 194431,252 194432,1877 194433,162599 194434,138686 194435,175 194436,1882 194437,184 194438,485 194439,298 194440,192 194443,440 194444,1247 194444,164572 194446,179170 194447,142870 194448,1390 194450,1458 194451,390 194452,346 194456,346 194457,1294 194458,179170 194459,79 194459,1927 194460,852 194461,919 194462,1 194462,4 194462,5 194462,184 194463,750 194463,3115 194464,3585 194466,652 194467,192 194467,336 194467,1181 194467,1623 194468,3367 194469,149 194469,406 194469,1425 194470,973 194471,1608 194472,1132 194473,1882 194474,1285 194475,346 194478,179170 194480,1149 194481,120 194481,240 194481,264 194481,406 194481,467 194481,877 194481,1462 194481,33424 194481,245910 194482,360 194485,611 194486,433 194487,1556 194489,1146 194490,13361 194492,752 194492,9024 194493,718 194495,217 194496,22293 194497,346 194498,620 194499,422 194500,3623 194501,891 194503,827 194504,406 194505,215 194506,577 194507,1707 194509,163 194510,306 194510,307 194511,1515 194512,779 194514,73570 194515,406 194519,194520 194521,176782 194523,194524 194525,30 194526,784 194526,1052 194526,5101 194530,1881 194531,179170 194532,1284 194532,148742 194533,1284 194533,148742 194534,360 194536,179170 194538,707 194540,1284 194540,148742 194541,306 194541,307 194544,55849 194546,1284 194546,148742 194547,1284 194548,130 194549,360 194550,179170 194551,1544 194552,19010 194552,22293 194553,30 194554,107 194555,309 194555,310 194556,2266 194557,298 194557,911 194558,298 194559,485 194560,312 194560,1231 194561,843 194562,483 194563,1509 194564,577 194565,843 194566,5301 194567,179170 194568,843 194569,424 194570,3 194571,1707 194574,1551 194575,3507 194576,255 194579,302 194580,760 194581,63471 194582,252 194582,516 194584,179170 194585,189788 194586,120 194587,852 194589,5591 194590,852 194591,435 194592,179170 194593,179170 194594,875 194596,5301 194597,179170 194598,83 194599,159365 194601,2296 194602,356 194602,801 194603,73570 194604,843 194605,536 194606,1882 194607,333 194609,1849 194610,179170 194611,73570 194612,179170 194613,918 194614,387 194615,1287 194616,1293 194617,872 194618,515 194619,179170 194620,301 194621,1267 194622,920 194623,875 194624,273 194625,1085 194626,151 194627,194628 194629,1572 194630,360 194631,192 194632,30 194633,155481 194634,55849 194635,493 194635,1127 194636,147191 194637,1556 194638,217 194638,1417 194641,19010 194642,179170 194643,447 194644,2775 194645,1623 194645,194645 194645,261733 194646,255 194647,485 194648,298 194649,194650 194651,485 194652,298 194654,217 194655,179170 194656,622 194657,852 194658,360 194660,83 194660,278 194661,392 194661,415 194661,1240 194661,1454 194661,1465 194662,1181 194664,10 194665,188791 194666,2421 194667,147 194668,179170 194669,1 194670,1132 194671,1608 194672,158 194672,640 194673,179170 194674,779 194675,557 194676,313 194677,34 194677,35 194677,1313 194677,2646 194678,885 194678,13704 194679,194663 194680,346 194681,602 194682,1133 194683,273 194684,346 194685,194686 194687,298 194688,485 194690,4611 194691,202 194691,1332 194692,2373 194693,346 194694,3623 194695,875 194696,193878 194697,194698 194699,1882 194700,1323 194701,408 194702,102 194703,1326 194704,179170 194705,1474 194706,179170 194707,809 194708,843 194709,1544 194710,3695 194711,134 194712,179170 194713,1515 194714,326 194715,269 194716,83 194716,120 194716,217 194716,493 194716,852 194716,1133 194716,1466 194716,1608 194717,6638 194718,360 194719,3218 194720,63 194721,5662 194722,1436 194723,1479 194724,217 194725,389 194726,1849 194727,682 194727,72439 194728,388 194729,1001 194730,620 194731,1635 194732,557 194733,5718 194734,518 194735,30 194736,73570 194737,56 194738,1326 194739,673 194740,1241 194741,346 194742,749 194743,1985 194744,850 194745,7155 194746,1359 194747,447 194748,2775 194750,968 194751,2979 194752,2083 194753,269 194754,278 194755,247 194756,1381 194758,1684 194760,312 194761,194762 194763,142405 194764,55849 194765,211 194765,949 194765,1655 194765,1844 194765,2209 194765,8270 194766,179170 194767,179170 194769,55849 194770,994 194771,72 194772,557 194773,179170 194774,994 194775,1807 194776,179170 194777,304 194778,406 194779,640 194780,2116 194781,602 194782,390 194783,602 194785,179170 194786,179170 194787,179170 194788,285 194789,56 194790,577 194791,83 194792,1821 194792,21736 194793,2506 194794,179170 194795,179170 194796,346 194797,179170 194798,346 194799,138686 194800,175 194801,252 194802,179170 194803,563 194804,718 194805,3623 194806,346 194807,1608 194808,447 194809,2775 194810,2048 194811,215 194812,285 194813,179170 194814,72 194815,179170 194816,179170 194817,179170 194818,1769 194819,83 194820,175 194821,179170 194823,30331 194824,333 194825,346 194826,179170 194827,346 194828,179170 194829,179170 194830,179170 194831,2266 194832,104 194833,2590 194834,179170 194835,215 194836,179170 194837,179170 194838,994 194839,269 194840,900 194841,509 194842,872 194843,1429 194844,366 194845,1882 194846,366 194847,366 194848,59 194848,1313 194848,2646 194848,3794 194849,179170 194850,346 194851,68 194851,431 194851,589 194851,631 194851,994 194851,1001 194851,1474 194851,1789 194851,8884 194851,44725 194852,207 194853,668 194854,206 194855,77 194856,179170 194857,620 194858,179170 194859,179170 194860,1467 194861,406 194862,179170 194863,179170 194864,1955 194865,215 194866,1564 194867,227 194868,714 194868,2008 194869,589 194870,3804 194872,135 194873,388 194874,1515 194875,779 194876,2424 194877,500 194878,1143 194879,435 194880,355 194881,13137 194882,50 194882,195 194882,406 194882,620 194883,1085 194884,179170 194885,433 194886,269 194887,843 194888,2292 194889,58 194890,46 194891,994 194892,349 194893,3630 194894,179170 194895,422 194897,179170 194898,56 194899,422 194900,179170 194901,485 194902,298 194904,190492 194904,194905 194906,292 194906,852 194907,1707 194908,55849 194911,217 194911,657 194912,1332 194913,644 194913,3003 194914,30 194915,1860 194916,1858 194917,779 194917,19010 194918,467 194919,360 194920,134 194921,788 194922,1465 194924,2205 194924,33424 194925,167 194925,868 194927,13980 194928,868 194929,666 194931,1132 194932,1608 194933,1465 194934,433 194935,1608 194937,1132 194940,762 194941,1608 194942,1132 194943,138 194944,79 194945,118 194945,4597 194946,433 194947,179170 194948,30 194949,13980 194951,1531 194952,422 194953,422 194954,422 194955,422 194956,422 194957,422 194958,422 194959,422 194960,422 194961,422 194962,147 194963,217 194963,1796 194964,779 194965,179170 194967,301 194967,2083 194968,779 194968,1515 194970,920 194971,408 194971,1326 194972,160 194972,736 194972,3653 194973,179170 194974,147 194975,467 194976,1052 194977,1962 194978,54 194979,1882 194980,2775 194981,1608 194982,1132 194983,30 194985,1801 194987,1332 194988,106 194988,8537 194989,1070 194989,1133 194990,179170 194991,83 194993,48 194994,30 194995,30 194997,849 194998,1458 194998,149534 194999,138686 195000,175 195001,1224 195002,15 195003,30 195004,644 195005,3260 195006,30 195007,278 195008,142430 195008,142473 195008,142879 195009,389 195010,1257 195011,2590 195012,1058 195013,137 195014,4223 195016,217 195017,206 195021,818 195022,557 195025,872 195026,251 195027,289 195027,290 195027,94134 195028,148742 195029,2334 195030,217 195031,346 195032,1172 195033,23783 195034,55849 195035,315 195036,160 195037,346 195038,360 195039,167 195040,1860 195041,1858 195042,195043 195044,422 195045,56 195046,628 195047,222 195048,5718 195048,127158 195049,1432 195049,205627 195051,179170 195054,356 195054,2646 195054,188791 195055,3769 195057,366 195058,919 195059,1118 195060,968 195062,179170 195063,142430 195063,142879 195064,698 195065,1860 195066,1858 195068,179170 195069,104 195069,134 195069,248 195069,264 195069,289 195069,290 195069,298 195069,503 195069,557 195069,631 195069,636 195069,1016 195069,1119 195069,1282 195069,1631 195069,1745 195069,1955 195069,2209 195069,94134 195070,32 195070,138 195071,2674 195071,102560 195072,179170 195073,179170 195074,179170 195075,707 195076,999 195076,1801 195077,252 195078,83 195079,149 195080,333 195082,15573 195083,2116 195084,179170 195085,179170 195086,138 195087,364 195088,4611 195089,144556 195091,872 195092,422 195093,932 195094,155473 195095,155473 195096,663 195097,71 195097,272 195097,611 195099,1132 195100,1608 195101,720 195103,1837 195104,136 195105,1132 195106,200 195108,1608 195109,1241 195110,1860 195111,1858 195112,1294 195113,138 195114,390 195116,872 195116,1118 195116,1796 195118,83 195120,1707 195121,1143 195123,142430 195124,179170 195126,1858 195127,1860 195128,3367 195129,138686 195130,175 195132,422 195133,5405 195134,355 195135,1860 195136,1858 195137,179170 195138,195139 195140,104 195141,515 195142,83 195144,991 195145,124668 195146,179170 195148,973 195150,2146 195151,179170 195153,44 195154,536 195155,215 195156,1644 195157,179170 195159,1122 195160,389 195161,843 195162,1688 195163,2668 195164,1544 195165,467 195166,309 195166,310 195167,179170 195168,1284 195168,148742 195170,179170 195171,21442 195173,1284 195173,148742 195174,1293 195175,30 195176,1274 195177,179170 195178,142870 195179,1556 195180,1284 195180,148742 195181,195182 195183,179170 195185,1882 195186,151 195187,994 195188,1284 195189,179170 195190,118 195190,422 195190,4597 195190,5405 195191,8907 195192,920 195193,1564 195194,3695 195195,3161 195196,285 195197,1284 195198,255 195199,3538 195200,65 195201,146952 195202,483 195203,56 195204,422 195205,179170 195206,195207 195208,2421 195209,34 195209,35 195210,30 195211,186 195211,349 195212,179170 195213,179170 195214,192 195215,30 195216,179170 195217,179170 195218,83 195218,283 195218,949 195219,563 195220,30 195221,1085 195223,2205 195223,33424 195224,3094 195225,5591 195226,1001 195227,179170 195228,146 195228,92476 195229,1707 195230,179170 195231,7360 195232,1860 195233,1858 195234,179170 195235,1 195236,195237 195238,179170 195239,147 195240,406 195241,1722 195242,179170 195243,4611 195244,144556 195245,269 195246,30 195247,30 195249,192 195249,485 195249,1509 195249,1659 195249,1688 195249,2701 195249,3370 195249,14453 195250,1274 195251,151 195252,217 195253,346 195254,113156 195255,2979 195256,48 195257,1010 195258,346 195259,1467 195260,30 195261,1769 195262,48 195263,179170 195264,467 195265,103860 195266,891 195267,1019 195268,2371 195269,1749 195270,920 195271,217 195272,640 195273,1655 195274,2373 195275,3 195275,538 195276,202 195277,818 195278,179170 195279,7416 195280,682 195280,72439 195281,636 195282,1012 195283,179170 195284,1118 195286,431 195286,775 195286,188791 195288,525 195289,30 195290,34 195290,35 195290,278 195290,313 195290,634 195290,1313 195290,1467 195290,1718 195290,2224 195290,2646 195290,5326 195291,1309 195292,19010 195293,2244 195294,571 195295,1285 195296,2073 195297,72 195298,1805 195299,631 195300,179170 195301,41 195302,294 195303,994 195304,1326 195305,1323 195306,102 195307,408 195308,195 195309,1556 195310,289 195310,290 195310,94134 195311,346 195312,647 195313,146 195313,92476 195314,344 195315,142473 195316,30 195317,589 195318,1167 195319,1785 195320,605 195321,1241 195322,1124 195323,1782 195324,179170 195325,973 195326,86 195327,1033 195328,179170 195329,1749 195330,781 195331,1132 195332,179170 195333,809 195334,366 195335,179170 195336,79 195337,195338 195339,647 195340,146 195340,92476 195341,344 195342,1434 195342,1844 195343,7155 195344,3623 195345,179170 195346,818 195347,30 195348,10 195349,179170 195350,1715 195351,2646 195352,313 195353,179170 195354,602 195355,620 195356,83 195357,1085 195358,1860 195359,1858 195360,406 195361,278 195362,195363 195364,138686 195365,175 195366,622 195367,269 195368,267 195369,30 195370,30 195371,1 195372,1359 195373,932 195374,4748 195375,1515 195376,779 195377,195378 195379,602 195380,861 195381,1052 195382,195383 195384,433 195385,3695 195386,900 195387,3507 195388,3041 195389,424 195390,333 195391,179170 195392,179170 195393,862 195393,2590 195394,264 195395,1381 195396,1181 195397,1007 195399,1467 195400,455 195401,2424 195402,179170 195403,1871 195404,83 195405,2421 195406,13980 195407,119 195408,195409 195410,1058 195411,179170 195412,704 195414,195415 195414,206551 195416,1634 195417,8714 195418,355 195419,1070 195420,299 195421,72 195422,1608 195423,1132 195424,3695 195425,718 195426,1858 195427,1860 195428,781 195429,1132 195430,171 195431,3695 195432,195433 195434,179170 195435,1247 195435,164572 195436,1238 195437,3331 195439,1452 195440,1707 195441,195442 195443,58 195444,994 195445,46 195446,1247 195446,164572 195447,452 195448,184 195449,1860 195450,1858 195451,2274 195452,147 195453,1082 195454,50 195454,2931 195455,868 195456,195457 195458,640 195459,640 195460,338 195461,10 195462,422 195463,56 195464,58 195465,994 195466,46 195467,764 195469,147 195470,195471 195472,1631 195473,3695 195474,72 195475,647 195476,344 195477,146 195477,92476 195478,1749 195479,360 195480,1247 195480,164572 195481,1247 195481,164572 195483,422 195484,422 195486,137 195487,151 195489,217 195490,422 195491,113156 195492,422 195493,422 195494,422 195495,422 195496,422 195497,195498 195499,422 195500,179170 195501,134 195502,195503 195504,23783 195505,609 195508,1782 195509,344 195510,83 195511,146 195511,620 195511,92476 195514,907 195515,60576 195516,178 195517,818 195518,302 195519,138686 195520,175 195521,1033 195522,406 195523,968 195525,60576 195526,60576 195527,893 195528,217 195528,278 195528,389 195529,3182 195530,1556 195531,195 195532,1707 195534,60576 195536,1274 195537,518 195538,60576 195539,6824 195540,4 195540,5 195540,107 195540,483 195540,891 195540,932 195540,1116 195540,1212 195540,1359 195540,2089 195540,2105 195540,2224 195540,2315 195540,2572 195540,2940 195540,3623 195540,4220 195540,5405 195540,66297 195540,75912 195540,76096 195540,124668 195540,185877 195541,283 195542,718 195543,21442 195544,48 195546,818 195548,60576 195549,30331 195550,189128 195551,818 195552,994 195553,5301 195555,2083 195556,141912 195557,795 195558,515 195559,973 195560,907 195561,179170 195562,3695 195563,275 195565,620 195566,30 195567,6119 195568,588 195568,590 195568,693 195568,3872 195568,19227 195569,994 195570,72 195571,749 195573,179170 195574,406 195575,124668 195576,56 195577,217 195578,1718 195579,60576 195580,6059 195581,392 195581,644 195581,1240 195583,1718 195584,2367 195585,2191 195586,1298 195587,809 195588,30 195589,811 195590,145240 195591,58 195592,994 195593,46 195594,366 195595,30 195596,145240 195597,1436 195598,145240 195599,83 195600,3653 195601,189788 195602,1608 195603,1132 195604,663 195605,1072 195606,1132 195607,1608 195608,1608 195609,1132 195610,1983 195611,54 195611,415 195611,891 195611,1300 195612,1608 195613,1132 195614,336 195615,145240 195616,1132 195617,1608 195619,48 195620,1132 195621,1608 195622,6323 195623,1010 195624,1707 195625,1608 195626,1132 195627,1515 195628,779 195630,1132 195631,1608 195632,1608 195633,1132 195634,58 195635,994 195636,46 195637,994 195638,58 195639,46 195641,346 195642,179170 195643,1007 195644,179170 195645,907 195645,2191 195646,13661 195647,718 195649,877 195650,467 195650,1149 195651,30 195652,1105 195653,660 195653,1539 195654,3695 195655,309 195655,310 195656,1732 195657,1616 195658,493 195659,83 195660,356 195661,918 195662,107 195663,1858 195665,5265 195666,1564 195667,283 195667,356 195667,941 195667,1479 195667,2266 195667,5591 195668,1882 195669,2373 195670,615 195671,314 195671,599 195672,5101 195673,217 195674,818 195675,118 195675,4597 195676,1983 195677,63 195678,818 195679,408 195679,1130 195681,1882 195682,843 195684,138686 195685,175 195686,179170 195687,929 195688,1608 195689,1740 195690,162599 195691,3260 195692,862 195693,1132 195694,818 195695,809 195696,333 195698,1033 195699,622 195700,1252 195700,1253 195701,179170 195702,298 195703,485 195704,3695 195705,631 195706,467 195706,868 195706,156379 195706,162599 195707,3623 195708,77 195708,146 195708,1105 195708,92476 195709,179170 195710,4611 195711,178 195712,4 195712,5 195713,1 195713,58 195713,262271 195714,72 195715,435 195716,2646 195717,872 195718,48 195719,60576 195720,5591 195721,72 195722,5192 195723,843 195724,379 195724,2784 195725,907 195726,1740 195728,1551 195728,5440 195729,346 195729,467 195729,1085 195730,920 195731,1619 195732,1265 195732,1266 195733,1722 195734,622 195735,222 195735,213089 195736,151 195737,1623 195738,356 195738,4771 195739,818 195740,3623 195741,406 195742,1983 195743,179170 195744,195745 195746,3582 195748,557 195749,346 195750,1220 195750,1222 195751,809 195752,467 195752,156379 195753,1608 195754,1132 195756,392 195757,3623 195759,1608 195760,1132 195761,302 195764,72 195765,1608 195766,1132 195767,1058 195768,302 195769,217 195769,1466 195770,515 195771,1707 195772,422 195773,893 195774,30 195775,417 195776,247 195776,2867 195776,2868 195777,30 195778,273 195779,360 195780,302 195781,146 195781,92476 195782,647 195783,344 195784,72 195785,1452 195786,30 195787,3623 195788,179170 195789,563 195790,1220 195790,1222 195791,516 195792,252 195793,179170 195794,179170 195795,861 195796,1556 195797,113156 195798,467 195799,285 195800,151 195801,636 195802,68069 195802,141912 195803,918 195804,72 195805,195806 195807,72 195808,179170 195809,4771 195810,179170 195811,179170 195812,893 195813,72 195814,557 195815,920 195816,179170 195817,83 195818,72 195819,2784 195820,179170 195821,72 195822,703 195823,179170 195824,493 195825,179170 195826,179170 195827,272 195828,891 195829,179170 195830,55849 195831,72 195832,179170 195833,55849 195836,104 195837,72 195838,671 195839,875 195840,5906 195841,557 195842,626 195843,278 195844,137 195845,862 195846,1474 195847,1203 195848,55849 195849,44 195850,1085 195851,179170 195852,1140 195853,885 195853,13704 195854,1381 195855,72 195856,344 195857,285 195858,179170 195859,30 195860,72 195861,344 195862,285 195863,344 195864,72 195865,285 195866,72 195867,344 195868,285 195869,46 195870,1983 195871,247 195872,72 195873,344 195874,285 195875,1127 195876,920 195877,673 195878,72 195879,344 195880,285 195881,179170 195882,102 195883,72 195884,344 195885,285 195886,483 195887,30 195888,179170 195889,179170 195890,79 195891,145240 195892,30 195893,30 195894,1608 195895,1132 195896,190492 195897,179170 195898,88820 195899,406 195900,605 195900,968 195900,1085 195900,1210 195900,2045 195900,2944 195900,3182 195900,3507 195901,3623 195902,58 195903,179170 195904,179170 195905,10 195906,302 195907,424 195908,72 195908,83 195908,278 195908,536 195908,631 195908,852 195908,1274 195908,1881 195908,2244 195908,2779 195908,4903 195908,9015 195909,1858 195910,1623 195911,4611 195912,602 195913,668 195914,30 195915,30 195916,315 195916,671 195917,1058 195918,63 195919,179170 195920,4611 195921,581 195922,30 195923,147 195924,1326 195925,1323 195926,102 195927,408 195928,2116 195929,171 195930,30 195931,2421 195932,240 195933,577 195934,179170 195935,179170 195936,179170 195937,179170 195938,30 195939,34 195939,35 195939,72 195939,83 195939,158 195939,217 195939,278 195939,536 195939,631 195939,660 195939,852 195939,949 195939,1133 195939,1274 195939,1466 195939,1467 195939,1881 195939,2244 195939,2779 195939,4637 195939,4903 195939,7092 195939,9015 195940,179170 195941,2244 195942,900 195943,179170 195944,167 195945,179170 195946,179170 195947,179170 195948,217 195948,1417 195949,202 195950,1068 195951,195952 195953,195952 195954,302 195955,255 195956,919 195957,67343 195959,195960 195961,393 195962,2590 195963,195964 195965,1634 195965,6424 195966,1474 195966,1789 195967,195968 195969,30331 195970,285 195971,442 195972,3328 195973,195974 195976,602 195977,56 195978,422 195979,179170 195981,179170 195982,355 195983,63 195984,167 195984,73570 195985,366 195986,366 195987,366 195988,366 195989,1132 195990,1608 195991,366 195992,360 195993,366 195994,366 195995,366 195996,195997 195998,3582 195999,30 196000,137 196001,179170 196002,196003 196004,30 196005,58 196006,994 196007,46 196008,2105 196009,577 196010,196011 196012,577 196013,1238 196014,1619 196015,196016 196017,1179 196018,893 196019,422 196020,56 196021,1452 196022,1359 196023,207 196024,1359 196025,196026 196027,1619 196027,1623 196028,179170 196029,1837 196030,118 196030,422 196030,4597 196031,440 196032,1782 196033,467 196033,571 196034,124668 196035,136 196036,996 196037,795 196038,124668 196040,422 196041,422 196042,422 196043,422 196044,422 196045,422 196046,1707 196047,422 196048,422 196049,83 196050,1673 196052,4545 196052,56150 196053,422 196054,422 196055,1052 196055,1968 196056,920 196057,932 196058,179170 196059,3623 196060,137 196061,179170 196062,3260 196063,79 196064,138686 196065,179170 196066,175 196067,2105 196069,312 196070,1612 196071,516 196072,788 196072,818 196073,994 196074,994 196075,433 196076,1359 196077,25222 196078,2617 196079,872 196080,298 196081,485 196082,516 196083,1429 196084,217 196084,536 196084,1417 196085,640 196086,1608 196087,1132 196088,640 196089,3623 196090,390 196091,515 196092,113156 196093,179170 196094,1012 196095,2146 196096,1566 196097,2209 196097,4411 196097,21711 196098,58 196099,269 196100,360 196100,4571 196101,124668 196102,644 196103,360 196104,162599 196105,124668 196106,1001 196108,346 196109,1882 196110,668 196111,843 196112,179170 196113,1143 196114,5358 196114,14352 196115,332 196116,1844 196117,2017 196118,179170 196119,217 196120,360 196121,162599 196122,2073 196123,628 196124,2506 196125,346 196126,30 196127,346 196129,862 196130,1117 196131,424 196132,10 196133,206 196133,211 196134,467 196135,920 196136,467 196138,142426 196139,179170 196140,563 196141,196142 196143,994 196144,247 196145,142870 196147,3830 196147,174849 196148,2567 196149,422 196150,1149 196151,179170 196153,217 196154,1132 196155,1608 196156,146 196156,92476 196157,647 196158,344 196159,83 196160,918 196161,7360 196162,179170 196163,1631 196164,83 196165,422 196166,868 196167,162599 196168,298 196169,179170 196170,3804 196171,660 196171,1539 196172,302 196173,1177 196174,179170 196175,1608 196176,1132 196177,1849 196178,287 196179,178 196180,852 196181,272 196182,272 196184,577 196185,4545 196186,1001 196187,515 196188,138686 196189,1132 196190,1608 196191,175 196192,179170 196193,1298 196194,7 196195,390 196196,179170 196197,124668 196198,104 196199,5405 196200,179170 196201,179170 196202,1016 196203,215 196204,383 196205,1010 196206,850 196207,1745 196208,1231 196209,136 196210,248 196211,388 196212,1001 196213,312 196214,3612 196215,358 196216,1579 196217,1722 196218,9001 196219,72 196220,5662 196221,968 196222,9029 196223,7270 196224,1572 196225,111 196226,1052 196227,1332 196228,1882 196229,503 196230,2979 196231,3538 196232,1939 196233,227 196234,3422 196235,4771 196236,225 196237,179170 196238,1452 196239,775 196240,3695 196241,179170 196242,1927 196243,3724 196244,3804 196245,302 196246,1001 196247,328 196247,7124 196248,3538 196249,1140 196250,217 196251,3422 196252,111 196253,1274 196254,1052 196255,4594 196256,3193 196257,4771 196258,3135 196259,1151 196260,589 196261,1452 196262,302 196263,3695 196264,346 196265,1010 196266,5440 196267,932 196268,2443 196269,4637 196270,6955 196271,1955 196272,37 196273,4545 196274,422 196275,1465 196276,1231 196277,1849 196278,2266 196279,801 196280,1722 196281,1201 196282,120 196283,1927 196284,358 196285,72 196286,1564 196287,2421 196288,83 196289,1210 196290,1072 196291,332 196292,1133 196293,1102 196294,5662 196295,718 196296,968 196297,714 196298,3999 196299,1572 196300,3474 196301,240 196302,388 196303,873 196304,687 196305,1531 196306,2701 196307,1644 196308,1789 196309,328 196310,1001 196311,1177 196312,35 196313,2045 196314,1821 196314,21736 196315,1429 196316,312 196317,919 196318,3612 196319,2646 196320,227 196321,1579 196322,141912 196323,278 196324,179170 196325,417 196326,312 196326,3260 196327,83 196328,602 196329,602 196330,1010 196331,171641 196332,278 196333,372 196334,179170 196335,252 196336,179170 196337,843 196338,158 196338,21442 196338,242826 196339,392 196339,1240 196340,2944 196340,6506 196341,179170 196342,861 196343,202 196344,141912 196345,609 196346,1001 196346,3094 196347,602 196348,920 196349,1284 196350,142426 196351,104 196352,83 196353,19010 196354,83 196356,422 196356,762 196356,1807 196356,5961 196357,868 196358,151 196359,145240 196360,261 196360,333 196363,1881 196364,83 196365,179170 196366,272 196369,1007 196370,83 196371,309 196371,310 196371,439 196371,874 196371,1644 196371,3804 196373,302 196374,4146 196375,843 196376,483 196377,1370 196378,861 196379,10 196379,167 196379,217 196379,222 196379,283 196379,289 196379,290 196379,346 196379,435 196379,455 196379,586 196379,631 196379,657 196379,1019 196379,1210 196379,1282 196379,1294 196379,1467 196379,1531 196379,1871 196379,2266 196379,2421 196379,2979 196379,5976 196379,6119 196379,6424 196379,6789 196379,94134 196380,861 196381,859 196382,147 196382,158 196383,435 196384,588 196384,590 196385,795 196386,1132 196387,1608 196388,1556 196389,3695 196390,227 196390,433 196390,1635 196390,2421 196390,2750 196390,8855 196391,255 196392,2735 196393,141912 196394,179170 196395,805 196396,843 196397,818 196398,56 196399,422 196400,3623 196401,179170 196402,422 196403,56 196404,602 196405,1235 196405,1335 196406,30 196407,56 196408,422 196409,147 196410,6424 196411,1612 196412,3623 196413,516 196414,3623 196415,179170 196416,7416 196417,355 196418,355 196418,743 196419,56 196420,1132 196421,1608 196422,557 196423,827 196424,3538 196425,3182 196426,934 196427,1085 196428,2436 196429,54 196430,2775 196431,1052 196432,1882 196433,1962 196434,1133 196435,30 196436,2646 196437,278 196438,1274 196439,30 196440,1210 196441,278 196442,634 196443,30 196444,278 196445,435 196446,444 196447,861 196448,557 196449,862 196450,346 196451,1837 196452,349 196452,392 196452,595 196452,615 196452,697 196452,808 196452,1240 196452,1453 196452,1454 196452,1782 196452,2699 196452,3193 196452,3367 196452,9098 196452,24763 196453,30 196454,56 196455,422 196456,4594 196457,2797 196458,104 196459,843 196460,196461 196462,8854 196463,406 196464,1474 196465,138686 196466,175 196467,330 196468,673 196469,30 196470,1381 196471,113156 196472,30 196473,285 196474,302 196475,250 196475,1684 196476,196477 196478,1353 196479,5130 196480,30 196481,30 196482,30331 196483,240 196484,1235 196484,1335 196485,196486 196488,3623 196489,30 196490,179170 196491,196492 196493,861 196494,702 196495,107 196496,30 196497,30 196498,563 196499,330 196500,697 196501,2553 196502,195 196502,147191 196503,1474 196504,83 196504,217 196504,388 196505,179170 196506,30 196507,2411 196508,179170 196509,179170 196510,55849 196511,55849 196512,818 196513,179170 196514,1284 196515,406 196516,30 196517,179170 196518,1046 196519,2867 196519,2868 196521,1509 196522,102 196523,1326 196524,1323 196525,408 196526,2116 196527,252 196528,516 196529,1220 196529,1222 196530,179170 196531,289 196531,290 196531,94134 196532,872 196533,340 196534,179170 196535,196536 196537,1149 196538,3623 196539,2048 196540,179170 196541,179170 196542,179170 196543,366 196544,366 196545,366 196546,366 196547,366 196548,366 196549,366 196550,366 196551,179170 196552,138686 196553,179170 196554,852 196555,872 196556,337 196556,338 196556,393 196556,439 196556,626 196556,649 196556,772 196556,1381 196556,2367 196558,493 196560,557 196561,30 196562,179170 196563,8854 196564,30 196565,179170 196566,602 196567,1414 196568,2646 196569,222 196570,298 196571,850 196572,196573 196574,196575 196576,217 196576,222 196576,455 196576,1019 196576,5343 196577,196578 196579,1 196580,179170 196581,2923 196582,179170 196583,1 196584,1001 196585,366 196586,30331 196587,450 196588,323 196590,255 196591,577 196592,196593 196594,179170 196595,841 196596,333 196597,179170 196598,1608 196599,1132 196600,1381 196601,2590 196602,307 196602,406 196602,1515 196603,355 196604,196605 196606,196607 196608,83 196608,536 196608,7698 196609,179170 196610,5440 196611,620 196612,1715 196612,7363 196613,138686 196614,175 196615,202 196616,149 196616,1776 196617,196618 196619,1238 196620,196621 196622,602 196623,1359 196624,178 196625,113156 196626,285 196627,788 196627,1531 196627,4611 196628,196629 196630,196629 196631,1359 196632,1608 196633,1132 196634,1452 196635,68 196636,447 196637,2775 196638,302 196639,536 196640,79 196641,1247 196641,164572 196642,1359 196643,179170 196644,1132 196645,1608 196646,340 196646,1179 196647,1608 196648,1132 196649,433 196650,808 196650,872 196650,1010 196651,1860 196652,1858 196653,907 196654,640 196655,640 196656,640 196657,124668 196658,783 196659,3623 196660,179170 196661,872 196662,467 196663,3623 196664,3623 196665,30 196666,196667 196668,2646 196669,2735 196670,118 196670,4597 196671,137 196672,392 196672,467 196673,1893 196674,3623 196675,422 196676,261 196677,422 196678,422 196679,422 196680,422 196681,422 196682,422 196683,87 196684,137 196685,422 196686,422 196687,422 196688,422 196689,422 196690,668 196691,493 196692,518 196693,518 196693,1326 196694,79 196695,852 196696,273 196697,310 196697,3039 196698,602 196699,3252 196700,2867 196700,2868 196701,207 196702,932 196703,55849 196704,360 196705,196706 196707,338 196707,2617 196708,287 196708,433 196709,55849 196710,1007 196711,275 196711,1266 196712,493 196712,682 196712,72439 196713,338 196713,462 196714,1608 196715,1132 196716,450 196717,467 196718,920 196719,48 196720,6303 196721,707 196722,55849 196723,278 196724,179170 196725,83 196726,957 196727,3582 196728,433 196729,298 196730,485 196731,302 196731,344 196732,779 196733,1882 196734,718 196735,192 196736,527 196737,918 196738,312 196739,1801 196740,631 196741,592 196742,2812 196743,298 196744,485 196745,304 196745,356 196746,3218 196747,138686 196748,175 196749,200 196750,809 196751,1707 196752,5405 196753,35 196754,1556 196755,875 196756,1294 196757,31073 196758,19010 196759,48 196760,349 196761,35 196762,278 196763,83 196764,217 196765,991 196766,1085 196767,1052 196768,1274 196769,217 196770,4637 196771,372 196771,1082 196772,485 196773,298 196774,1072 196775,35 196776,2421 196777,1201 196778,1429 196779,431 196781,1453 196782,493 196783,1608 196784,1132 196785,1052 196785,1177 196786,485 196787,298 196788,1132 196789,1608 196790,1608 196791,1132 196792,2671 196793,1608 196794,1132 196795,493 196796,372 196797,596 196798,149 196798,406 196799,56 196800,422 196801,309 196801,310 196801,3039 196801,232766 196802,994 196803,22 196804,179170 196805,179170 196806,217 196807,875 196808,872 196809,1127 196811,704 196812,515 196813,783 196814,647 196815,1429 196816,196817 196818,127158 196819,200 196820,179170 196821,5310 196823,994 196824,647 196825,358 196826,994 196827,55849 196828,1132 196829,781 196830,196831 196832,1143 196833,3999 196833,141912 196834,994 196835,760 196836,1849 196836,36819 196837,195383 196838,73570 196839,393 196840,571 196840,872 196841,179170 196842,138686 196843,175 196844,2553 196845,179170 196846,1608 196847,1132 196848,356 196848,392 196848,1146 196848,21982 196849,179170 196850,113156 196851,1132 196852,1608 196853,406 196854,196855 196856,1454 196857,3474 196858,1220 196858,1222 196859,1544 196860,104 196861,873 196862,14126 196863,202 196864,1179 196865,714 196866,406 196867,509 196868,752 196869,1564 196870,2557 196871,358 196872,435 196873,3695 196874,328 196875,980 196876,1298 196877,862 196878,1231 196879,2701 196880,1133 196881,1515 196882,1893 196883,390 196884,455 196885,3538 196886,1837 196887,251 196888,215 196889,1749 196890,1381 196891,120 196892,3422 196893,149 196894,35 196895,586 196896,1715 196897,1849 196898,3507 196899,1522 196900,4637 196901,302 196902,1332 196903,6638 196904,3207 196905,2045 196906,493 196907,525 196908,72 196909,3182 196910,6955 196911,140 196912,280 196912,17245 196913,704 196914,3999 196915,1821 196915,21736 196916,3218 196917,1466 196918,1392 196919,2989 196920,3804 196921,63 196922,1240 196923,296 196924,3138 196925,3612 196926,81 196927,1509 196928,439 196929,5662 196930,422 196931,1085 196932,332 196933,8180 196934,1479 196935,1436 196936,1007 196937,682 196937,72439 196938,388 196939,1001 196940,631 196941,1143 196942,1012 196943,577 196944,5718 196945,1181 196946,518 196947,2699 196948,1939 196949,1274 196950,1175 196951,158 196952,6068 196953,1167 196954,907 196955,919 196956,1722 196957,2205 196957,33424 196958,392 196959,1326 196960,111 196961,14819 196962,1644 196963,1072 196964,192 196965,1149 196966,717 196967,32 196968,301 196969,1241 196970,3094 196971,736 196972,196973 196974,687 196975,5874 196976,595 196977,346 196978,349 196979,1210 196980,225 196981,1985 196982,333 196983,14797 196984,248 196985,779 196986,379 196987,795 196988,3194 196989,2620 196990,252 196991,874 196992,592 196993,5440 196994,1359 196995,217 196996,1877 196997,934 196998,2443 196999,1282 197000,3135 197001,1368 197002,283 197003,393 197004,968 197005,2979 197006,1010 197007,622 197008,1140 197009,3041 197010,326 197011,1467 197012,1590 197013,285 197014,1732 197015,383 197016,1052 197017,557 197018,2436 197019,1955 197020,1801 197021,9001 197022,1309 197023,178 197024,240 197025,2083 197026,372 197027,337 197028,5405 197029,720 197030,77 197031,1177 197032,444 197032,459 197033,1181 197034,809 197035,1181 197036,397 197037,200 197038,142433 197039,671 197040,179170 197041,1882 197042,167 197043,1718 197044,1181 197045,289 197045,290 197045,94134 197046,10 197046,217 197046,222 197046,455 197046,588 197046,590 197046,752 197046,968 197046,1419 197046,1773 197046,5343 197047,2266 197048,147 197049,151 197050,795 197051,1181 197052,2266 197053,489 197054,30 197055,515 197056,222 197057,1805 197058,1210 197059,107 197060,2620 197061,602 197062,35 197063,1571 197064,1893 197065,1769 197066,55849 197067,55849 197068,179170 197069,1274 197070,1089 197071,142870 197072,30 197073,184 197074,30 197075,1844 197075,2073 197077,79 197078,149 197079,2089 197079,2940 197080,841 197081,38634 197082,175 197083,309 197083,310 197083,197084 197085,991 197086,1287 197087,356 197088,1 197089,179170 197090,179170 197091,179170 197092,1511 197092,3069 197093,1188 197094,294 197095,179170 197096,1305 197097,285 197098,347 197099,179170 197100,81 197101,3623 197102,5265 197103,1515 197104,179170 197105,298 197106,304 197107,435 197108,179170 197109,197110 197111,315 197111,457 197111,221339 197112,179170 197113,179170 197114,250 197114,1684 197115,285 197116,346 197117,843 197118,285 197119,179170 197120,250 197120,1684 197121,346 197122,809 197123,557 197124,298 197125,358 197126,1274 197127,83 197128,972 197129,1474 197130,145751 197131,146 197131,92476 197132,273 197133,459 197134,332 197135,673 197136,30 197137,5405 197138,1252 197138,1253 197139,179170 197140,843 197141,179170 197142,179170 197143,644 197144,2083 197145,779 197146,30 197147,30 197148,310 197148,3039 197149,4060 197150,138 197151,865 197152,557 197153,137 197154,118 197154,4597 197155,88820 197156,557 197157,3695 197158,217 197159,44 197160,56 197161,422 197162,30 197163,197164 197165,440 197166,346 197167,602 197168,346 197169,1252 197169,1253 197170,30 197171,264 197171,1551 197172,602 197173,875 197174,3623 197175,2116 197176,56 197177,422 197178,1252 197178,1253 197179,272 197180,1019 197181,217 197182,536 197183,1467 197184,278 197185,83 197186,179170 197187,30 197188,346 197189,179170 197190,5911 197191,2244 197192,179170 197193,148586 197194,179170 197196,996 197197,577 197198,151 197198,663 197199,83 197200,1769 197201,510 197202,781 197203,1132 197204,346 197205,333 197206,179170 197207,227 197208,138686 197209,175 197210,197211 197213,843 197214,13919 197215,2590 197216,483 197217,422 197218,1001 197219,179170 197220,179170 197221,197222 197223,207 197224,1509 197225,179170 197226,179170 197227,225 197228,602 197229,179170 197230,7416 197231,872 197232,1429 197233,72 197234,179170 197235,179170 197236,124668 197237,668 197238,8884 197239,179170 197240,1085 197241,179170 197242,179170 197243,1634 197244,406 197244,704 197245,197246 197247,197248 197249,72 197250,1949 197251,30 197252,179170 197253,179170 197254,197255 197256,72 197257,179170 197258,179170 197259,197260 197261,1143 197262,1001 197263,355 197264,197265 197266,366 197267,366 197268,366 197269,366 197270,366 197271,366 197272,34 197272,35 197273,5440 197274,179170 197275,30 197276,994 197277,1882 197278,30 197279,255 197280,841 197281,406 197282,86 197283,932 197284,431 197285,433 197286,217 197287,1707 197288,6249 197289,55849 197290,197291 197292,994 197293,55849 197294,55849 197295,30 197296,197297 197298,83 197299,1181 197300,179170 197301,852 197301,1070 197301,1400 197301,3467 197302,72 197303,1608 197304,1132 197305,197306 197307,1181 197308,602 197309,602 197310,197311 197312,333 197313,30 197314,346 197315,30 197316,2617 197317,30 197318,485 197319,298 197320,485 197321,298 197322,30 197323,30 197325,30 197326,30 197327,72 197328,433 197329,676 197330,406 197331,346 197332,184 197333,483 197334,1181 197335,255 197336,459 197337,30 197338,503 197339,1181 197340,30 197341,2750 197342,1181 197343,54 197344,349 197345,179170 197346,179170 197347,1707 197348,179170 197349,79 197350,144962 197351,72 197352,83 197353,179170 197354,197355 197356,138686 197357,175 197358,1132 197359,781 197360,197361 197362,179170 197363,72 197364,2266 197364,7092 197365,781 197366,1132 197367,781 197368,1132 197369,285 197370,626 197371,135 197372,2373 197373,1479 197374,390 197375,805 197376,58 197377,485 197378,298 197379,179170 197380,30 197381,197382 197383,197382 197384,197382 197385,197382 197386,72 197387,994 197388,145751 197389,197390 197391,10 197392,179170 197393,179170 197394,44 197395,3 197396,197397 197398,179170 197399,8991 197400,3582 197401,179170 197402,749 197403,197404 197405,72 197406,54 197406,949 197407,310 197408,805 197410,366 197411,366 197412,366 197413,179170 197414,113156 197415,197416 197417,197418 197419,147 197419,1309 197420,285 197421,536 197421,1019 197422,1571 197423,197424 197425,197426 197427,81 197427,1962 197428,197429 197430,56 197431,422 197432,355 197433,107 197434,2416 197434,2417 197435,292 197436,338 197437,298 197438,1133 197439,3538 197440,187 197441,1181 197442,31977 197443,557 197444,197445 197444,198488 197446,197447 197448,30 197449,30 197450,2620 197451,932 197452,8270 197453,647 197454,146 197454,92476 197455,344 197456,1181 197457,1181 197458,79 197459,1181 197460,195 197461,269 197462,1181 197463,30 197464,30 197465,1509 197466,197467 197468,479 197469,154408 197470,485 197471,298 197472,440 197472,1033 197475,7117 197476,44 197478,1707 197479,483 197480,10 197481,197482 197484,1893 197485,355 197486,485 197487,298 197488,298 197489,485 197490,1284 197491,1274 197492,302 197492,595 197492,1722 197492,3258 197492,204093 197493,197494 197495,102560 197496,72 197497,138686 197498,175 197499,485 197500,298 197501,1188 197502,197503 197505,145751 197506,145751 197507,79 197508,202 197509,30 197510,485 197511,298 197512,1707 197512,2367 197513,344 197514,647 197515,146 197515,92476 197516,557 197517,99 197518,843 197519,7155 197520,41 197521,99 197522,104 197523,1132 197524,781 197525,2506 197526,119 197527,872 197528,197529 197530,994 197531,145751 197532,779 197533,994 197534,393 197534,980 197535,557 197536,1014 197537,1014 197538,1014 197539,1014 197540,197541 197542,1014 197543,142473 197544,197541 197545,602 197546,1014 197547,602 197548,197549 197550,850 197551,994 197552,278 197553,393 197554,35 197554,158 197554,275 197554,406 197554,663 197554,693 197554,1247 197554,1572 197554,3297 197554,9010 197554,17588 197554,20359 197554,164572 197555,704 197556,273 197556,1116 197557,872 197558,338 197559,1849 197560,30236 197561,636 197562,251 197563,240 197564,292 197565,294 197566,197567 197568,296 197569,298 197570,8854 197572,1227 197572,86416 197573,197574 197575,68 197576,137 197577,355 197578,893 197579,861 197580,336 197581,1718 197582,818 197583,602 197584,596 197585,1539 197586,1238 197587,41 197588,167 197589,1860 197590,1858 197591,1452 197592,72764 197593,500 197594,516 197595,252 197596,1220 197596,1222 197597,340 197598,818 197599,193129 197600,992 197601,1436 197602,406 197603,251 197604,302 197605,515 197606,167 197607,422 197608,56 197609,147 197609,149 197609,21442 197610,1265 197610,1266 197611,557 197612,83 197613,994 197614,1284 197614,148742 197615,992 197616,1240 197617,56 197618,422 197619,760 197620,1359 197621,79 197622,87 197622,1659 197623,972 197624,283 197625,577 197626,685 197626,900 197627,338 197628,422 197629,422 197630,422 197631,366 197632,422 197633,440 197634,366 197635,422 197636,422 197637,422 197638,422 197639,366 197640,422 197641,366 197642,422 197643,2784 197644,269 197645,1363 197646,784 197647,151 197648,83 197649,149 197649,195 197649,1181 197649,8798 197649,102560 197650,920 197651,179170 197652,500 197653,356 197654,106 197655,599 197656,179170 197657,356 197658,467 197659,2209 197660,344 197661,72 197662,285 197663,269 197664,609 197664,3474 197665,13661 197666,344 197666,2646 197667,640 197668,640 197669,640 197670,640 197671,200 197671,1955 197672,30 197673,1608 197674,1132 197675,83 197676,30 197677,972 197677,1718 197677,2750 197678,1151 197678,1220 197678,1222 197679,7768 197680,292 197680,509 197680,1368 197680,1688 197680,16614 197680,37414 197681,868 197682,259 197683,392 197684,302 197685,994 197686,1284 197687,818 197688,222 197689,687 197689,1556 197690,447 197691,2775 197692,2553 197693,302 197694,932 197695,83 197696,3467 197697,3328 197698,1070 197699,179170 197700,68 197701,1224 197702,1210 197703,41 197704,13 197704,1179 197705,8213 197706,1052 197707,932 197708,485 197709,145751 197710,920 197711,179170 197712,192 197713,1860 197714,1858 197715,994 197716,192 197717,1860 197718,1858 197719,72 197720,192 197721,493 197722,7 197723,41 197724,2416 197724,2417 197725,994 197726,137 197727,301 197728,366 197729,718 197730,1359 197730,60576 197731,192 197732,422 197733,1858 197734,1860 197735,473 197735,2367 197736,302 197737,209 197738,192 197739,994 197741,119 197741,192 197741,577 197741,1400 197742,158 197743,197744 197745,32751 197746,209 197747,151 197748,217 197749,403 197750,994 197751,197752 197753,1634 197754,852 197756,1113 197757,81 197758,843 197759,35 197759,973 197759,1133 197760,818 197761,567 197762,372 197762,588 197762,590 197763,1043 197764,602 197765,302 197766,1001 197766,19946 197767,1285 197768,1359 197769,3297 197770,2590 197771,861 197772,3258 197773,292 197774,392 197774,1769 197775,292 197776,151 197777,7 197777,3538 197777,3846 197777,14989 197778,602 197779,200 197780,160 197781,1181 197782,346 197782,1612 197783,673 197783,1149 197784,60576 197785,285 197786,2083 197787,1631 197788,360 197789,55849 197790,795 197792,192 197793,1858 197794,1860 197795,515 197796,333 197797,2416 197797,2417 197798,328 197799,1580 197799,1837 197800,1082 197802,225 197803,473 197804,1181 197805,22 197805,314 197805,1210 197806,179170 197808,10 197809,647 197810,344 197811,146 197811,92476 197812,596 197813,175 197814,179170 197815,13980 197816,179170 197817,15 197817,818 197817,1837 197817,4172 197818,138686 197819,10 197819,97 197819,1252 197819,1253 197820,175 197821,999 197821,2209 197822,1858 197823,197824 197825,972 197826,83 197826,536 197826,1837 197827,1181 197828,197829 197830,22 197831,179170 197832,3846 197833,1837 197834,197835 197836,1782 197836,5961 197837,1818 197838,1117 197839,516 197840,1220 197840,1222 197841,252 197842,197843 197844,240 197844,503 197844,557 197844,592 197844,818 197844,1370 197844,1564 197844,1608 197844,1818 197844,2205 197844,2296 197844,2334 197844,9025 197844,33424 197845,179170 197846,1 197847,179170 197848,1058 197848,1688 197849,151 197850,73570 197851,179170 197852,6303 197853,22 197854,192 197855,179170 197856,283 197857,179170 197858,156379 197858,162599 197859,195 197860,248 197861,192 197863,3 197864,358 197865,718 197866,179170 197867,179170 197868,179170 197869,704 197869,1052 197869,1140 197869,5547 197870,406 197871,1419 197872,1419 197874,192 197875,7155 197876,6119 197877,1181 197878,179170 197879,1370 197880,1082 197881,1821 197881,21736 197882,179170 197883,1860 197884,1858 197885,1072 197886,1801 197887,179170 197888,1243 197889,1893 197890,120 197891,2750 197892,760 197892,1877 197893,179170 197894,179170 197895,179170 197896,1227 197896,86416 197897,718 197898,2807 197899,992 197900,269 197901,192 197902,81 197903,54 197905,200 197906,209 197906,302 197907,994 197908,1821 197908,21736 197909,269 197910,179170 197911,179170 197912,179170 197913,557 197914,79 197915,875 197916,1241 197917,184 197918,1556 197919,1860 197920,1858 197921,179170 197922,179170 197923,179170 197924,435 197925,192 197925,406 197926,119 197927,1474 197928,673 197929,392 197930,1631 197931,1659 197932,843 197933,8854 197934,179170 197935,673 197936,483 197937,2626 197938,4 197938,5 197938,2506 197939,138686 197940,175 197941,1181 197942,2244 197943,1284 197944,592 197945,200 197946,2244 197947,197948 197949,30 197950,516 197951,302 197952,333 197953,1769 197953,1893 197954,217 197955,142430 197956,179170 197957,861 197958,5366 197959,563 197960,2116 197961,151 197962,1014 197963,344 197964,647 197965,146 197965,92476 197966,1014 197967,206 197968,1837 197969,206 197970,1014 197971,1014 197972,1511 197972,3069 197973,1014 197974,197975 197976,2083 197977,1014 197978,422 197979,7092 197980,72 197980,2416 197980,2417 197981,1014 197982,30331 197983,485 197984,298 197985,247 197986,577 197987,8270 197988,8822 197989,99 197990,2620 197991,115659 197992,99 197993,102 197994,408 197995,1326 197996,1323 197997,44 197998,2775 197999,447 198000,697 198000,1769 198001,10 198002,217 198003,818 198004,30331 198005,30 198006,167 198007,198008 198009,147 198010,1749 198011,602 198012,179170 198013,198014 198015,636 198016,179170 198017,2590 198018,2266 198019,1 198020,188791 198021,1127 198021,1769 198022,1016 198023,198024 198025,326 198026,1368 198027,1 198028,179170 198029,83 198030,1363 198031,179170 198032,195 198033,217 198034,285 198035,207 198036,455 198036,1019 198037,99 198039,861 198040,99 198041,179170 198042,788 198043,255 198044,861 198045,198046 198049,298 198050,1807 198051,358 198052,872 198053,1429 198054,179170 198055,192 198057,184 198057,202 198057,704 198058,779 198059,717 198060,198061 198062,23783 198063,113156 198064,179170 198065,179170 198066,310 198067,668 198068,355 198069,198070 198071,79 198072,179170 198073,4810 198074,8270 198075,7360 198076,4276 198077,6068 198077,164572 198078,94 198078,991 198078,1253 198079,2931 198079,4193 198080,992 198081,179170 198082,1815 198083,79 198084,515 198085,994 198086,58 198087,46 198088,198089 198090,179170 198091,1143 198092,602 198093,372 198094,602 198095,30 198096,1 198097,198098 198099,893 198100,30 198101,1243 198102,356 198103,198104 198105,919 198106,818 198107,5405 198108,147 198109,447 198110,2775 198111,1012 198112,4260 198113,640 198114,640 198115,366 198116,640 198117,640 198118,640 198119,640 198120,13661 198121,56 198122,422 198123,1370 198124,60576 198125,422 198126,422 198127,577 198128,366 198129,1001 198130,302 198130,2116 198131,422 198132,422 198133,422 198134,422 198135,422 198136,422 198137,422 198138,422 198139,422 198140,422 198141,79 198142,1188 198143,72 198144,344 198145,285 198146,1801 198147,1179 198148,192 198148,406 198149,717 198150,287 198151,193129 198152,344 198153,192 198153,406 198154,4355 198154,193129 198155,198156 198157,71 198158,388 198159,1796 198160,596 198161,142426 198162,254 198163,4066 198164,852 198165,577 198166,1653 198168,192 198169,631 198170,356 198170,852 198171,1634 198172,1453 198173,3623 198174,304 198174,714 198175,1381 198176,379 198176,477 198176,536 198176,891 198176,2168 198176,2646 198176,2944 198176,5326 198177,602 198178,932 198179,83 198180,3623 198181,1274 198182,3623 198183,3623 198184,818 198185,818 198186,393 198187,994 198188,302 198189,162599 198190,338 198191,142430 198192,1425 198193,818 198194,146 198194,92476 198195,818 198196,493 198197,138686 198198,175 198199,222 198199,5343 198200,640 198201,994 198202,749 198203,571 198204,60576 198205,200 198206,60576 198207,3623 198208,852 198209,60576 198210,292 198211,60576 198212,217 198213,1707 198214,779 198215,994 198216,3623 198217,2105 198218,302 198219,3474 198220,198221 198222,422 198223,264 198224,631 198225,2083 198226,994 198227,872 198228,994 198229,422 198230,56 198231,1740 198232,259 198233,994 198234,818 198235,424 198235,124668 198236,192 198237,4571 198238,1882 198239,198240 198241,809 198242,360 198243,818 198244,720 198244,877 198244,973 198244,1117 198244,1837 198244,2083 198244,9024 198245,179170 198246,657 198247,406 198248,1388 198249,920 198250,859 198251,72 198252,843 198253,120 198255,142430 198256,53763 198257,209 198258,406 198259,1381 198260,3094 198261,435 198262,626 198263,1882 198264,500 198265,818 198266,7 198267,720 198268,1619 198269,590 198269,1419 198270,141912 198271,843 198272,55849 198273,433 198274,72 198275,1566 198276,483 198277,1893 198278,3297 198279,142426 198280,302 198281,925 198282,336 198283,4237 198283,182162 198285,1332 198285,5423 198286,631 198286,156379 198287,55849 198288,5301 198289,861 198290,198291 198292,920 198293,467 198294,19010 198295,275 198296,1639 198297,72 198298,32 198299,198300 198301,298 198302,75912 198303,852 198303,2572 198303,178576 198304,99 198305,1220 198305,1222 198306,252 198307,251 198308,640 198309,1181 198310,450 198311,918 198312,1210 198313,1381 198314,99 198315,893 198316,841 198317,5405 198318,1181 198319,99 198320,2620 198321,392 198321,1284 198322,1160 198322,1274 198322,1294 198322,1298 198322,1644 198322,33298 198322,189303 198323,467 198324,179170 198325,893 198326,138686 198327,175 198328,525 198329,147 198330,179170 198331,269 198332,158 198332,406 198332,575 198333,1309 198334,450 198335,1285 198336,392 198337,179170 198338,682 198338,1353 198338,72439 198339,63 198339,106 198339,192 198339,202 198339,252 198339,337 198339,516 198339,586 198339,779 198339,1220 198339,1222 198339,1243 198339,1635 198339,6119 198339,16201 198340,179170 198341,30 198341,63 198341,81 198341,140 198341,147 198341,149 198341,158 198341,192 198341,200 198341,202 198341,215 198341,302 198341,312 198341,406 198341,422 198341,503 198341,588 198341,590 198341,620 198341,622 198341,779 198341,1392 198341,1453 198341,1515 198341,1522 198341,1807 198342,893 198343,631 198344,179170 198345,760 198346,3756 198347,294 198348,179170 198349,141912 198350,861 198351,2367 198352,264 198352,647 198353,859 198354,79 198354,6119 198355,3555 198356,893 198357,312 198358,918 198359,179170 198360,477 198361,1181 198362,251 198362,1512 198362,5992 198363,4594 198365,251 198366,99 198367,2620 198368,179170 198369,151 198370,1181 198371,563 198372,146 198372,92476 198373,1181 198374,1096 198375,179170 198376,292 198377,467 198378,991 198379,392 198380,301 198381,503 198382,392 198383,652 198384,179170 198385,1801 198385,3182 198386,302 198387,104 198387,657 198387,2266 198388,1052 198389,2775 198390,54 198391,1962 198392,1882 198393,818 198394,198395 198396,392 198397,7416 198398,515 198398,2626 198399,1858 198400,1860 198401,1181 198402,179170 198403,994 198404,48 198405,1432 198406,94 198406,2787 198407,198408 198409,14434 198410,55849 198411,273 198412,179170 198413,48 198414,358 198415,1858 198416,1860 198417,56 198418,422 198419,179170 198420,278 198421,83 198422,1860 198423,1858 198424,30 198425,2116 198426,1181 198427,179170 198428,1181 198429,1882 198430,356 198431,1769 198432,56 198432,240174 198433,81 198434,179170 198435,102560 198436,1860 198437,1858 198438,1556 198439,485 198440,298 198441,1927 198442,818 198443,1300 198444,536 198445,1707 198445,3507 198446,179170 198447,30 198448,179170 198449,301 198449,305 198449,509 198449,516 198449,1298 198449,1837 198449,2083 198450,198451 198452,179170 198453,217 198453,1417 198454,104 198454,557 198454,953 198454,954 198455,250 198455,1684 198456,10 198457,1019 198458,557 198459,302 198460,179170 198461,198462 198463,179170 198464,251 198465,83 198466,861 198466,2116 198467,1265 198467,1266 198468,269 198469,179170 198470,72 198471,6556 198472,1132 198473,781 198474,455 198475,3 198478,333 198479,83 198480,179170 198481,179170 198482,3 198483,15119 198484,179170 198485,179170 198486,179170 198487,1619 198489,72 198490,2379 198491,179170 198492,179170 198494,179170 198495,781 198496,1132 198497,9015 198497,142870 198498,485 198499,298 198500,949 198501,1474 198502,179170 198503,179170 198504,673 198505,577 198506,179170 198507,1149 198508,179170 198509,8270 198510,422 198511,179170 198512,2620 198513,198514 198515,19010 198516,267 198517,1085 198518,72 198519,179170 198520,749 198521,30 198522,179170 198523,18726 198524,179170 198525,179170 198526,179170 198527,2116 198528,1608 198529,1132 198530,1 198531,2146 198532,1058 198533,861 198534,30 198535,247 198536,278 198537,3623 198538,198538 198539,72 198540,179170 198541,138686 198542,175 198543,1085 198544,1132 198545,781 198546,994 198547,577 198548,23783 198549,577 198550,393 198551,30 198552,13 198552,874 198553,250 198553,1684 198554,5987 198555,72 198556,285 198557,179170 198558,179170 198559,198560 198561,179170 198562,30 198563,138686 198564,175 198565,634 198566,134 198567,72 198568,693 198569,198570 198571,72 198572,179170 198573,671 198575,900 198576,1607 198576,2089 198576,2940 198577,179170 198578,2590 198579,30 198580,198581 198582,424 198583,72 198584,258 198585,628 198586,207 198587,198588 198589,269 198590,30331 198592,30331 198593,179170 198595,206 198596,30 198597,862 198598,1326 198599,102 198600,1323 198601,408 198602,2073 198602,205602 198603,309 198603,310 198604,3804 198605,15748 198606,179170 198607,198608 198609,668 198610,19010 198611,304 198611,2334 198612,137 198613,1241 198614,179170 198615,1267 198616,872 198618,1429 198619,4548 198620,589 198621,843 198622,255 198623,861 198624,179170 198625,179170 198626,1414 198627,147 198628,217 198629,151 198630,1619 198631,805 198632,1782 198633,71 198634,179170 198635,355 198636,3830 198637,1132 198638,1608 198639,779 198639,2244 198640,450 198641,2135 198642,1143 198643,83 198644,862 198645,275 198646,5366 198647,585 198648,3846 198649,8992 198650,115 198650,118 198651,333 198652,2931 198653,36985 198654,5976 198655,79 198656,1332 198657,217 198658,44 198659,2668 198660,225 198661,1893 198662,8822 198663,16196 198664,1238 198665,30 198666,1860 198667,1858 198668,240 198668,179804 198669,301 198670,1452 198671,309 198671,310 198672,259 198672,1983 198672,3949 198673,525 198674,749 198675,30 198676,273 198677,147 198677,149 198677,269 198677,406 198678,602 198679,1019 198680,137 198681,366 198682,366 198683,366 198684,366 198685,366 198686,366 198687,366 198688,222 198688,422 198689,366 198690,56 198691,422 198692,179170 198693,1019 198694,179170 198695,636 198696,1608 198697,60576 198698,1132 198699,467 198699,868 198700,1284 198701,640 198702,640 198704,287 198705,1653 198706,60576 198707,1224 198708,179170 198709,585 198709,1776 198710,784 198711,360 198711,4571 198711,88820 198712,994 198713,422 198714,422 198715,422 198716,360 198717,422 198718,422 198719,422 198720,422 198721,422 198722,309 198722,310 198724,422 198725,422 198726,422 198727,994 198728,6068 198729,406 198730,994 198731,107 198732,360 198733,55849 198734,433 198735,442 198736,197382 198737,83 198738,994 198739,287 198740,994 198741,209 198742,217 198742,536 198743,198744 198745,994 198746,2867 198746,2868 198747,920 198748,467 198749,3623 198750,7572 198751,932 198752,2782 198753,1127 198754,360 198755,439 198756,671 198757,142426 198758,79 198758,1392 198759,134 198759,137 198760,994 198761,37414 198762,72 198763,1381 198764,1882 198765,285 198766,1608 198767,1132 198768,55849 198769,87 198771,146 198771,779 198771,1515 198771,92476 198772,1140 198773,2006 198774,440 198775,41 198777,179170 198778,301 198778,22580 198779,5440 198780,1415 198780,1849 198780,124668 198780,148742 198781,179170 198782,2605 198783,217 198784,217 198784,1417 198785,994 198786,994 198787,1983 198788,425 198788,1807 198789,433 198790,557 198791,422 198792,1860 198793,1858 198794,264 198794,1381 198795,994 198796,60576 198797,994 198798,198799 198800,994 198801,994 198802,1019 198804,1033 198805,934 198806,425 198806,1082 198806,1807 198807,264 198807,818 198807,1381 198807,2334 198808,1082 198809,994 198810,1181 198811,366 198812,3623 198813,1381 198814,602 198815,211 198816,137 198817,994 198818,999 198819,1096 198820,72 198821,211 198822,211 198823,1659 198824,1608 198825,1132 198826,259 198827,4190 198828,1082 198829,440 198830,193129 198831,435 198832,292 198833,994 198834,6627 198835,8180 198836,107 198836,111 198837,167 198838,250 198838,1684 198839,1082 198840,1381 198841,309 198841,310 198842,55849 198843,1082 198844,843 198845,32 198846,620 198847,663 198848,392 198848,623 198848,697 198848,1805 198848,214734 198849,1769 198850,309 198850,310 198851,1019 198852,189788 198853,1052 198854,2775 198855,54 198856,1962 198857,1882 198858,30 198858,102 198858,305 198858,489 198858,849 198859,4223 198860,178 198861,3260 198862,949 198863,809 198863,861 198863,893 198864,6789 198865,326 198866,406 198867,198868 198867,218267 198869,1769 198870,843 198871,1871 198873,835 198874,179170 198875,7416 198876,435 198877,58 198878,994 198879,261 198880,46 198881,198882 198883,920 198884,140 198885,179170 198886,762 198886,1043 198886,1113 198886,1801 198886,2460 198886,2590 198886,6059 198887,147 198887,149 198888,1014 198889,994 198890,1014 198891,433 198892,179170 198893,1014 198894,1014 198895,179170 198896,1014 198897,1014 198898,30 198899,179170 198900,843 198901,868 198902,202 198903,252 198904,1220 198904,1222 198905,251 198906,326 198907,1860 198908,1858 198909,994 198910,733 198911,2373 198912,356 198913,179170 198914,358 198915,119 198915,577 198915,1400 198915,2073 198916,1769 198917,179170 198918,50 198918,158 198918,178 198918,333 198918,779 198919,1082 198920,1608 198921,1132 198922,1707 198923,483 198924,2379 198925,358 198926,247 198926,2867 198926,2868 198927,179170 198928,1515 198929,779 198930,1844 198931,179170 198932,255 198932,818 198933,1082 198934,1893 198934,8855 198935,2353 198936,1556 198937,179170 198938,1572 198939,158 198940,151 198941,611 198942,9029 198943,289 198943,290 198943,94134 198944,179170 198945,994 198946,439 198947,179170 198948,72 198949,192 198950,113156 198951,60576 198952,1082 198953,30 198954,179170 198955,994 198956,179170 198957,994 198958,198959 198960,1807 198961,138686 198962,175 198963,2735 198964,2224 198965,72 198966,994 198967,1082 198968,151 198969,1082 198970,30 198971,1 198971,30428 198972,19010 198973,1082 198974,72 198975,697 198975,1769 198976,198977 198978,994 198979,994 198980,1836 198981,198982 198981,246509 198981,252296 198981,254464 198981,264173 198983,179170 198984,795 198985,278 198986,8501 198987,72 198988,1807 198989,1634 198990,333 198991,35687 198992,179170 198993,1807 198994,577 198995,19010 198996,640 198997,918 198998,278 198999,179170 199001,795 199002,79 199004,602 199005,247 199006,1858 199007,179170 199008,760 199008,1082 199009,862 199010,1014 199011,1082 199012,179170 199013,1467 199014,3623 199015,5906 199016,557 199017,626 199018,278 199019,137 199020,862 199021,30 199022,337 199023,1849 199024,30 199025,30 199026,267 199027,3623 199028,467 199029,671 199030,30 199031,30 199032,440 199032,1033 199033,30 199034,516 199035,994 199036,19010 199037,920 199038,285 199039,8270 199040,179170 199041,1177 199041,182162 199042,30 199043,55849 199044,602 199045,30 199046,211 199047,872 199048,30 199049,994 199050,30 199051,30 199052,422 199053,273 199054,30 199055,1983 199056,1014 199057,328 199058,1014 199059,602 199060,30 199061,8270 199062,2750 199063,1014 199064,1326 199065,102 199066,408 199067,1323 199068,577 199069,360 199069,4571 199070,179170 199071,30 199072,795 199073,30 199074,199075 199076,1 199077,406 199078,1149 199079,994 199080,289 199080,290 199080,94134 199081,1773 199082,264 199083,179170 199084,30 199085,199086 199087,30 199088,30 199089,1623 199090,900 199091,30 199092,30 199093,4903 199094,44 199095,30 199096,2775 199097,447 199098,442 199099,30 199100,179170 199101,30 199102,30 199103,30 199104,30 199105,285 199106,151 199107,30 199108,250 199108,1684 199109,30 199110,30 199111,285 199112,30 199113,250 199113,1684 199114,30 199115,30 199116,30 199117,7092 199118,671 199119,30 199120,1132 199121,178 199122,372 199122,1572 199122,103153 199123,30 199124,30 199125,30 199126,2205 199126,33424 199127,30 199128,994 199129,30 199130,32 199130,563 199130,13910 199131,30 199132,1608 199133,30 199134,2923 199135,30 199136,158 199136,516 199137,30 199138,1085 199139,30 199140,30 199141,406 199142,29380 199143,83 199144,1033 199145,179170 199146,199147 199148,2205 199148,33424 199150,30 199151,30 199152,199153 199154,581 199155,304 199156,1789 199157,179170 199158,179170 199159,30 199161,1085 199162,620 199164,73570 199165,30 199166,1181 199167,30 199168,30 199169,406 199170,179170 199171,199172 199173,179170 199174,199175 199176,30 199177,179170 199178,71 199178,104 199178,1127 199178,115659 199179,999 199180,1458 199181,30 199182,179170 199183,56 199184,422 199185,827 199186,56 199187,422 199188,861 199189,355 199190,72 199191,697 199191,1769 199192,994 199193,994 199194,199195 199196,1515 199197,779 199198,868 199200,1132 199201,1608 199202,718 199203,485 199204,298 199205,30 199206,328 199207,199208 199209,420 199209,567 199210,225 199210,248 199210,358 199210,379 199210,557 199210,932 199210,941 199211,179170 199212,3582 199213,86 199214,30 199215,30 199216,60576 199217,179170 199218,596 199219,673 199221,30 199222,640 199223,72 199224,640 199225,5101 199226,406 199227,1882 199228,30 199229,151 199229,192 199230,346 199231,135 199232,1381 199233,21442 199234,56 199235,422 199236,30 199237,6068 199238,1132 199239,1608 199240,3623 199241,1509 199242,30 199243,1785 199244,83 199245,175 199246,422 199247,192 199248,179170 199249,422 199250,207 199250,358 199250,366 199250,417 199250,1052 199250,1253 199250,1319 199250,1571 199250,1634 199250,2424 199250,2620 199250,2868 199251,1608 199252,1132 199254,422 199255,422 199256,422 199257,1608 199258,1132 199259,422 199260,422 199261,422 199262,422 199263,422 199264,422 199265,199266 199267,422 199268,1082 199269,137 199271,333 199272,949 199272,4252 199272,5976 199273,1284 199274,809 199275,179170 199276,615 199277,1293 199278,2590 199279,104 199280,147 199280,158 199280,1458 199281,626 199282,433 199283,1769 199284,30 199285,1608 199286,1891 199286,3507 199287,315 199288,795 199289,285 199290,868 199291,240 199292,1381 199293,22 199294,1390 199295,994 199296,22 199297,312 199298,222 199299,918 199300,314 199301,406 199301,1370 199301,55849 199302,932 199303,994 199305,1608 199306,1132 199307,302 199307,2116 199308,269 199309,994 199310,179170 199311,211 199312,30 199313,557 199314,56 199315,1769 199316,422 199317,199318 199319,217 199320,8270 199321,314 199323,158 199324,56 199325,422 199327,206 199328,1608 199329,1132 199330,202 199331,344 199332,30 199333,30 199334,309 199334,310 199334,809 199335,233 199336,88820 199337,199338 199339,344 199340,1707 199341,1381 199343,338 199344,233 199345,314 199346,1860 199347,1858 199348,687 199349,1287 199349,9030 199350,1566 199351,31977 199352,1058 199353,596 199354,115659 199355,41 199355,344 199355,455 199355,1012 199356,1087 199357,302 199358,2929 199359,30 199360,1082 199361,775 199362,1082 199363,422 199364,56 199365,149 199365,202 199365,406 199366,30 199367,1238 199367,1363 199367,1572 199368,2574 199369,19443 199370,1285 199371,142870 199372,3345 199372,5358 199372,14352 199373,1179 199374,1718 199375,30 199376,2168 199376,7698 199377,30 199379,949 199380,1634 199382,30 199383,65 199384,30 199385,932 199386,344 199387,285 199388,72 199389,30 199390,10 199392,30 199393,1381 199394,252 199395,30 199396,56 199397,422 199398,30 199399,30 199400,1118 199401,344 199402,1452 199403,433 199404,179170 199405,4355 199406,626 199407,422 199408,56 199409,30 199410,809 199411,309 199411,310 199412,1113 199413,433 199414,142426 199415,56 199416,422 199417,179170 199418,179170 199419,147 199419,1385 199420,138686 199421,175 199422,1722 199423,58 199424,968 199425,7652 199426,56 199427,422 199428,30 199429,387 199430,97 199431,366 199432,1608 199433,1132 199434,4545 199434,56150 199435,215 199436,366 199437,2367 199438,366 199439,151 199440,30 199441,2775 199442,467 199443,2083 199444,338 199445,179170 199446,918 199447,200 199448,515 199449,631 199450,596 199451,1179 199452,83 199453,30 199454,1566 199455,278 199456,1381 199457,217 199458,292 199459,199460 199461,1370 199462,222 199462,1284 199463,30 199464,30 199465,1688 199466,315 199467,30 199468,647 199469,483 199471,1181 199472,278 199473,1179 199474,1769 199475,199476 199477,328 199478,179170 199479,72 199481,195 199482,30 199483,151 199484,179170 199485,1274 199486,1402 199487,199488 199489,179170 199490,515 199491,30 199492,2590 199493,481 199494,516 199494,1220 199494,1222 199495,179170 199496,30 199497,199498 199499,179170 199500,179170 199501,179170 199502,30 199503,30 199504,146 199504,92476 199505,344 199506,647 199507,1087 199508,179170 199509,1133 199510,83 199511,372 199511,1284 199511,148742 199512,1001 199513,179170 199514,795 199515,3804 199516,1001 199517,3193 199518,525 199519,589 199519,615 199519,631 199519,1181 199519,1782 199520,994 199521,199522 199521,214549 199523,1140 199523,5547 199524,704 199525,647 199526,344 199527,146 199527,92476 199528,192 199529,180487 199530,267 199531,835 199532,991 199533,141912 199534,71 199534,450 199534,1400 199535,366 199536,1127 199538,389 199539,1082 199540,1359 199541,557 199542,862 199543,5366 199544,13661 199545,485 199546,298 199547,1807 199548,206 199548,2260 199549,199550 199551,640 199552,302 199553,55849 199554,333 199555,8308 199556,366 199557,366 199558,30 199559,366 199560,366 199561,1085 199562,366 199563,310 199563,3039 199564,366 199565,30 199566,9457 199567,406 199568,440 199569,366 199570,1149 199571,1326 199572,102 199573,1323 199574,408 199575,179170 199576,167 199577,199578 199579,1359 199580,2048 199581,72 199582,179170 199583,30 199584,30 199585,72 199586,30 199587,72 199588,30 199589,30 199590,30 199591,6303 199592,30 199593,199594 199595,1014 199596,1014 199597,1860 199598,1858 199599,285 199600,66973 199601,1227 199601,86416 199602,137 199603,192 199603,779 199604,1 199605,841 199606,795 199607,932 199608,30 199609,30 199610,30 199611,1181 199612,3538 199613,861 199614,118 199614,4597 199615,269 199616,850 199617,1453 199618,557 199619,30 199620,4548 199621,3872 199622,179170 199623,158 199624,179170 199625,179170 199627,3507 199629,1858 199630,1860 199631,179170 199632,30 199633,355 199634,310 199634,3039 199635,35 199635,2671 199636,872 199637,181063 199638,179170 199639,1631 199640,199641 199642,179170 199643,388 199644,76096 199645,694 199646,1707 199647,163 199647,302 199649,1238 199650,360 199650,4571 199651,72 199652,1452 199653,1608 199654,1132 199655,113156 199657,199658 199659,1882 199660,2775 199661,1962 199662,1052 199663,54 199664,3260 199665,302 199666,30 199667,3623 199669,577 199670,179170 199671,1769 199672,422 199673,422 199674,795 199675,422 199676,422 199677,422 199678,422 199679,422 199680,422 199681,422 199682,422 199683,422 199684,422 199685,440 199686,1579 199687,1381 199688,272 199689,287 199690,30 199691,4571 199692,2572 199693,1132 199694,1177 199694,2775 199695,1127 199696,640 199697,83 199698,5301 199699,447 199700,2775 199701,163 199702,932 199703,1860 199704,1858 199705,1132 199706,781 199707,138686 199708,175 199709,21442 199710,1860 199711,1858 199712,193129 199713,647 199714,146 199714,92476 199715,344 199716,805 199717,518 199718,209 199719,147 199719,406 199720,1644 199721,209 199722,1623 199723,209 199724,1381 199725,55849 199726,736 199727,2671 199728,805 199729,1172 199730,328 199731,3094 199732,712 199733,1127 199733,1769 199734,189303 199735,994 199736,103860 199737,392 199738,425 199739,55849 199740,1860 199741,1858 199742,3769 199743,1807 199744,30 199745,1707 199746,30 199747,1659 199748,994 199749,6068 199750,30 199751,30 199752,3 199753,97 199754,217 199755,1220 199755,1222 199756,251 199757,252 199758,1688 199759,994 199760,99 199761,994 199762,1381 199763,1284 199763,3207 199763,148742 199764,1882 199765,994 199766,3 199767,1608 199768,1132 199769,1844 199769,2460 199770,422 199771,56 199772,48 199773,1285 199774,302 199775,360 199775,2617 199776,994 199777,192 199778,3623 199779,994 199780,192 199781,868 199782,489 199783,2590 199784,1566 199785,103860 199786,199787 199788,3623 199789,136 199789,137 199789,1276 199789,1479 199790,199791 199792,1531 199793,1381 199794,994 199795,1608 199796,171641 199797,1132 199798,994 199799,509 199799,510 199800,1132 199801,1608 199802,809 199803,712 199804,991 199805,192 199806,3623 199807,784 199808,58 199809,994 199810,46 199811,3623 199812,58 199813,46 199814,994 199815,58 199816,994 199817,46 199818,58 199819,46 199820,994 199821,199822 199821,205646 199823,994 199824,704 199825,994 199826,24505 199827,5102 199828,1639 199829,442 199830,138686 199831,175 199832,1417 199833,3328 199834,994 199835,3467 199836,200 199837,1381 199838,893 199839,1132 199840,781 199841,663 199842,859 199843,3161 199844,3623 199845,805 199846,30 199847,920 199848,3623 199849,3623 199850,30 199851,272 199852,1436 199853,1087 199854,179170 199855,199856 199857,3623 199858,640 199859,179170 199860,30 199861,850 199862,2443 199863,861 199864,199865 199866,843 199867,199868 199869,199868 199870,994 199871,30 199872,37 199873,843 199874,483 199875,217 199876,1556 199877,1287 199878,240 199879,663 199880,58 199881,46 199882,994 199883,30 199884,1860 199886,515 199887,35486 199888,1240 199889,179170 199890,175 199891,199892 199893,179170 199894,30 199895,138686 199896,2073 199897,151 199898,179170 199899,179170 199900,179170 199901,30 199902,179170 199903,179170 199904,1881 199905,48 199905,222 199905,338 199905,1634 199905,7155 199906,19 199907,252 199907,516 199908,697 199908,1769 199909,179170 199910,179170 199911,179170 199912,406 199913,30 199914,179170 199915,622 199916,30 199917,192 199918,41 199918,1608 199919,179170 199920,138 199921,865 199922,557 199923,137 199924,88820 199925,118 199925,4597 199926,30 199927,42419 199928,1181 199929,1474 199930,1572 199931,1805 199932,313 199933,389 199934,1122 199935,30 199936,30 199937,994 199938,406 199939,994 199940,1881 199941,30 199942,489 199943,142870 199944,994 199945,663 199946,30 199947,994 199948,577 199949,3623 199951,240 199952,179170 199953,996 199954,55849 199955,55849 199956,55849 199957,818 199958,2590 199959,1132 199960,781 199961,199962 199963,199964 199965,72 199966,30 199967,199968 199969,875 199971,1227 199971,86416 199972,996 199973,179170 199974,179170 199975,71 199975,611 199975,2367 199976,142433 199977,557 199978,179170 199979,30 199980,349 199981,3623 199982,179170 199983,255 199984,179170 199986,994 199987,1509 199988,199989 199990,3161 199991,179170 199992,179170 199993,809 199994,16196 199995,16196 199996,2590 199997,994 199998,2048 199999,10 200000,358 200001,393 200002,151 200003,1016 200004,818 200005,994 200006,209 200007,192 200007,406 200008,3507 200009,1016 200010,30236 200011,187 200012,30 200013,536 200014,861 200015,422 200016,56 200017,10 200017,30 200017,67343 200018,640 200019,1220 200019,1222 200020,516 200021,252 200022,298 200023,485 200024,1773 200025,994 200026,1274 200027,447 200028,2775 200029,1773 200030,1608 200031,447 200032,2775 200033,332 200034,450 200035,636 200036,795 200037,406 200038,22 200038,247 200039,8990 200040,58 200041,994 200042,46 200043,332 200044,366 200045,366 200046,366 200047,366 200048,366 200049,366 200050,366 200051,447 200052,2775 200053,366 200054,366 200055,366 200056,366 200057,1267 200058,14366 200059,861 200060,225 200061,356 200062,743 200063,8884 200064,200065 200066,1085 200067,72 200068,827 200069,179170 200070,72 200071,179170 200072,72 200073,8270 200074,200075 200074,200817 200074,216831 200076,151 200077,355 200078,79 200079,184 200080,779 200081,1287 200081,9030 200082,850 200083,200084 200085,493 200086,10 200087,5908 200088,483 200089,1227 200089,86416 200090,932 200091,994 200092,994 200093,83 200094,200095 200096,1707 200097,1893 200098,841 200099,138686 200100,175 200101,493 200102,485 200103,298 200104,30 200105,200 200106,485 200107,298 200108,13910 200109,1181 200110,298 200111,485 200112,44 200113,1014 200114,1014 200115,1014 200116,366 200117,179170 200118,2574 200119,994 200120,179170 200121,179170 200122,10 200123,1707 200124,179170 200125,179170 200126,1014 200127,1019 200127,4672 200128,195 200129,261 200130,200 200131,1014 200132,333 200133,79 200134,954 200134,10318 200135,918 200136,79 200137,179170 200138,175 200139,358 200140,30 200141,171641 200142,179170 200143,440 200144,255 200144,843 200145,255 200146,179170 200147,7698 200148,30331 200149,30331 200150,996 200151,1381 200152,179170 200153,1415 200154,155481 200155,1227 200155,86416 200156,450 200157,56 200158,422 200159,56 200160,422 200161,485 200162,298 200163,1381 200164,269 200165,3623 200166,179170 200167,30 200168,1891 200169,1014 200170,1132 200171,781 200172,1014 200173,1381 200174,179170 200175,179170 200176,179170 200177,577 200177,859 200178,30 200179,30 200180,179170 200181,483 200182,179170 200183,298 200184,485 200185,1381 200186,1479 200187,390 200188,493 200189,298 200190,72 200191,743 200192,493 200193,493 200194,179170 200195,179170 200196,179170 200197,179170 200198,72 200199,72 200200,349 200201,493 200202,179170 200203,179170 200204,179170 200205,8270 200206,72 200207,72 200208,137 200209,8270 200210,179170 200211,30 200212,1882 200213,30 200214,200215 200216,179170 200217,72 200218,861 200219,179170 200220,3623 200221,30 200222,30 200223,1359 200224,179170 200225,118 200225,4597 200226,8270 200227,151 200228,179170 200229,269 200230,179170 200231,3623 200232,200233 200234,285 200235,626 200235,3804 200236,663 200237,2205 200237,33424 200238,179170 200239,805 200240,192 200241,72 200242,1556 200243,355 200244,107 200245,2416 200245,2417 200246,292 200247,338 200248,298 200249,1133 200250,3538 200251,366 200252,366 200253,366 200254,72 200255,438 200256,8270 200257,44 200258,1773 200259,30 200260,298 200261,485 200262,200263 200264,14453 200265,3623 200266,179170 200267,3623 200268,647 200269,179170 200270,179170 200271,30 200272,332 200273,65 200274,240 200275,30 200276,68 200277,1370 200278,35 200279,462 200279,850 200280,1844 200281,200282 200283,25348 200283,101688 200284,195 200285,200286 200287,179170 200288,1227 200288,86416 200289,3623 200290,581 200291,72 200292,918 200293,1572 200294,179170 200295,179170 200296,3474 200297,862 200298,907 200299,516 200300,1220 200300,1222 200301,252 200302,450 200303,6051 200305,179170 200306,1381 200307,171641 200308,647 200309,360 200309,1127 200309,1769 200310,1860 200311,1858 200312,1860 200313,1858 200314,31977 200315,697 200315,1127 200315,1769 200316,1400 200317,179170 200318,994 200319,994 200320,994 200321,485 200322,298 200323,269 200324,30 200325,179170 200326,179170 200327,485 200328,298 200329,179170 200330,994 200331,138686 200332,175 200333,179170 200334,1849 200335,179170 200336,179170 200337,259 200338,2944 200339,447 200340,2775 200341,805 200342,179170 200343,676 200344,671 200345,79 200346,450 200347,805 200348,310 200349,1983 200350,422 200351,56 200352,65 200352,389 200352,874 200353,809 200354,557 200355,557 200356,557 200357,200358 200359,55849 200360,179170 200361,485 200362,298 200364,483 200365,30 200366,269 200367,1707 200368,200369 200370,994 200371,1515 200372,145751 200373,30 200374,200375 200376,179170 200377,1370 200378,1370 200379,422 200379,862 200380,142473 200381,1608 200382,2944 200383,179170 200384,65 200385,179170 200386,861 200387,920 200388,68 200389,2572 200389,7194 200390,179170 200391,1072 200392,200393 200394,5301 200395,406 200396,179170 200397,4691 200398,179170 200399,30 200400,843 200401,30 200402,30 200403,493 200404,7155 200405,179170 200406,146 200406,285 200406,620 200406,60576 200406,92476 200407,227 200408,299 200409,1012 200410,179170 200411,874 200412,1381 200412,1419 200412,2292 200413,41 200414,72 200415,179170 200416,310 200417,83 200418,1181 200419,6424 200420,72 200421,8270 200422,338 200423,179170 200424,420 200424,2436 200425,7092 200426,422 200427,292 200428,184 200429,640 200430,179170 200431,3695 200432,298 200433,285 200434,294 200435,296 200436,298 200437,1807 200438,179170 200439,285 200440,250 200440,1684 200441,200442 200443,179170 200444,200445 200446,79 200447,1821 200447,21736 200448,179170 200449,355 200450,83 200451,200452 200453,1608 200454,1191 200454,2253 200455,298 200455,911 200456,440 200457,2553 200458,44 200459,278 200460,200461 200462,640 200463,697 200463,1769 200464,788 200465,1238 200466,19010 200467,422 200468,163 200469,422 200470,422 200471,422 200472,422 200473,422 200474,422 200475,1452 200476,422 200477,422 200478,422 200479,422 200480,422 200481,1984 200481,3949 200482,1122 200482,3207 200483,805 200484,1749 200485,30 200486,30 200487,1769 200488,1707 200489,22 200490,640 200491,640 200492,596 200493,209 200494,647 200495,146 200495,92476 200496,344 200497,636 200498,1118 200499,200500 200501,3258 200502,483 200503,3623 200504,209 200505,671 200506,602 200507,872 200508,1309 200509,493 200510,1860 200511,1858 200512,1769 200513,200 200514,283 200514,2168 200514,7698 200515,1359 200516,875 200517,920 200518,285 200519,3623 200520,30 200520,200 200520,248 200520,772 200521,467 200522,280 200522,1243 200522,2868 200522,17245 200522,21736 200523,225 200524,200525 200526,3623 200527,83 200528,171 200528,344 200528,957 200528,1815 200529,932 200530,3623 200531,1769 200532,968 200533,1289 200534,527 200534,1298 200535,200536 200537,179170 200538,225 200538,425 200540,179170 200541,1659 200542,980 200544,349 200544,1769 200545,1224 200546,1769 200547,3623 200548,10 200549,333 200550,138686 200551,175 200552,818 200553,147 200555,3623 200556,1132 200557,1608 200558,1287 200559,1608 200560,1132 200561,493 200562,184 200563,8537 200564,1132 200565,1608 200566,1132 200568,663 200569,1847 200570,1359 200571,5405 200572,602 200572,3218 200573,1392 200574,483 200575,1381 200576,3474 200577,1531 200578,1118 200579,51006 200580,862 200582,1769 200583,1769 200586,22 200587,5405 200588,4504 200589,1608 200590,1132 200591,731 200592,79 200593,733 200595,2105 200596,179170 200597,171641 200598,2620 200599,206 200600,151 200601,1147 200602,640 200604,179170 200607,417 200608,60576 200610,907 200611,4355 200612,79 200613,1326 200614,868 200615,60576 200616,86 200617,493 200618,222 200619,269 200620,310 200620,3039 200621,1276 200622,273 200623,1844 200624,1284 200625,356 200625,3507 200626,179170 200627,147 200627,158 200627,80266 200628,147 200628,89035 200629,179170 200631,195 200632,1769 200633,393 200634,30 200635,1837 200637,2266 200638,4771 200639,571 200639,868 200640,200641 200642,217 200643,151 200646,301 200647,3623 200648,22 200649,1608 200650,784 200651,344 200652,146 200652,92476 200653,647 200656,30 200657,326 200658,30331 200659,10 200659,1181 200661,146 200661,92476 200662,647 200663,344 200664,2979 200665,577 200666,200 200667,779 200668,200669 200670,200669 200671,200669 200672,200669 200673,146 200673,92476 200674,344 200675,647 200676,146 200676,92476 200677,647 200678,344 200681,240 200682,1147 200683,1973 200684,10 200685,60576 200686,302 200686,2116 200687,3182 200688,425 200689,115 200689,118 200690,1058 200691,425 200692,160 200693,160 200694,95554 200694,129534 200695,1345 200696,287 200697,1769 200698,1465 200699,188791 200700,225 200701,1769 200702,179170 200703,1579 200704,142426 200705,1014 200706,146 200706,92476 200707,344 200708,647 200709,1014 200710,671 200711,1579 200712,1014 200713,1014 200714,1122 200715,179170 200716,189266 200717,1769 200718,1052 200719,1882 200720,54 200721,2775 200722,1962 200723,4146 200724,142426 200725,503 200726,107 200727,83 200728,392 200729,1769 200730,1014 200731,1458 200732,269 200733,1014 200734,818 200735,2411 200736,1085 200736,1285 200736,2083 200737,515 200738,841 200739,406 200740,349 200741,2411 200742,1769 200743,389 200744,1849 200745,346 200746,202 200747,200748 200749,186 200750,1801 200751,843 200752,309 200752,310 200753,805 200754,918 200755,1345 200756,294 200757,13661 200758,200759 200760,200759 200761,200759 200762,200759 200763,200759 200764,657 200765,2784 200766,200767 200768,299 200769,467 200770,1402 200771,852 200771,188791 200772,718 200773,1309 200773,1807 200773,2775 200774,179170 200775,435 200776,1240 200776,1465 200777,309 200777,310 200778,5213 200779,483 200780,1707 200781,424 200782,493 200783,30 200784,760 200785,151 200786,179170 200787,843 200788,179170 200789,200790 200791,200790 200792,200790 200794,1149 200794,1631 200795,647 200796,485 200797,298 200798,647 200799,3507 200800,1544 200801,406 200802,179170 200803,1 200804,2590 200805,107 200806,306 200806,307 200807,179170 200808,2266 200809,697 200810,30 200811,493 200812,1332 200813,447 200814,2205 200814,33424 200815,1381 200816,138686 200818,175 200819,1289 200820,433 200821,3148 200822,663 200823,179170 200824,119 200825,503 200826,240 200826,818 200827,200828 200829,179170 200830,1860 200831,1858 200832,577 200833,1359 200834,1 200835,179170 200836,1381 200838,30 200839,179170 200840,15119 200841,70631 200842,344 200843,30 200844,179170 200845,200846 200847,1556 200848,1132 200849,781 200850,179170 200851,83 200852,557 200853,1241 200854,179170 200855,176782 200856,179170 200857,179170 200858,179170 200859,1326 200860,102 200861,408 200862,1323 200863,949 200864,179170 200865,179170 200866,252 200867,179170 200868,1096 200869,862 200870,1474 200871,673 200872,30 200873,195 200874,250 200874,1684 200875,1449 200876,323 200877,2292 200878,298 200879,179170 200880,179170 200881,179170 200882,179170 200883,8270 200884,179170 200885,179170 200886,2116 200887,179170 200888,179170 200889,179170 200890,278 200891,179170 200892,240 200893,1769 200894,841 200895,861 200896,179170 200897,30 200898,179170 200899,1010 200899,1122 200899,1241 200900,15523 200901,179170 200902,1659 200903,6323 200904,298 200905,485 200906,179170 200907,3297 200908,1058 200909,920 200910,207 200911,34 200911,35 200911,83 200911,158 200911,217 200911,278 200911,313 200911,536 200911,634 200911,660 200911,852 200911,1133 200911,1274 200911,1313 200911,1466 200911,1467 200911,1718 200911,2224 200911,2646 200911,2779 200911,4637 200911,5326 200911,7092 200911,9015 200913,673 200914,1313 200915,142430 200915,142473 200916,179170 200917,179170 200918,750 200919,3209 200920,1882 200921,135 200922,919 200923,682 200923,72439 200924,3194 200925,5358 200925,14352 200926,147 200927,493 200928,422 200929,138686 200930,175 200931,269 200932,179170 200933,24763 200934,626 200935,179170 200936,118 200936,4597 200937,1436 200938,577 200939,473 200940,602 200941,3804 200942,46 200943,304 200944,671 200945,668 200946,2367 200947,30331 200948,861 200949,2315 200950,77 200951,118 200951,4597 200952,269 200953,1449 200954,1983 200955,1319 200956,2266 200957,615 200958,1467 200959,707 200960,2590 200961,1623 200962,1001 200963,920 200964,30 200965,283 200966,417 200967,269 200968,388 200969,6682 200970,207 200971,2424 200972,346 200973,862 200974,18726 200975,9457 200976,200977 200978,2590 200979,88820 200980,861 200981,859 200982,3089 200983,301 200984,3413 200985,6387 200986,1564 200987,30 200988,1 200989,184 200990,32475 200991,668 200992,1227 200992,86416 200993,1769 200994,151 200995,872 200996,272 200997,827 200998,1429 200999,736 201000,4691 201001,151 201002,424 201003,145240 201004,15748 201005,115659 201006,1634 201007,83 201008,13980 201009,1769 201010,83 201011,1544 201012,4611 201013,640 201014,1262 201014,1285 201015,355 201017,179170 201018,2073 201019,269 201020,415 201021,1858 201022,1860 201023,3328 201024,563 201025,251 201026,1769 201027,142473 201028,251 201028,1220 201029,124668 201030,485 201031,298 201032,2620 201033,124668 201034,602 201035,392 201035,697 201036,124668 201037,138686 201038,1381 201039,2205 201039,33424 201040,1608 201041,1132 201042,1143 201043,1132 201044,1608 201045,48 201046,4549 201047,1016 201047,2205 201047,33424 201047,245910 201048,640 201049,640 201050,187 201051,302 201051,1143 201051,5301 201052,48 201053,1 201054,702 201055,254 201056,968 201058,3260 201059,972 201060,422 201061,422 201062,422 201063,422 201064,422 201065,422 201066,422 201067,422 201068,422 201069,422 201070,422 201071,422 201072,1860 201073,1858 201074,124668 201075,48 201076,120 201077,994 201078,1608 201079,1132 201080,485 201081,298 201082,147 201083,72 201084,1132 201085,1608 201086,1298 201087,48 201088,5301 201089,201090 201091,1769 201092,994 201093,1345 201094,1087 201095,1132 201096,1608 201097,920 201098,227 201099,1882 201100,467 201101,596 201102,516 201103,644 201104,3623 201105,302 201106,1082 201107,3623 201108,994 201109,1402 201110,1345 201111,142473 201112,1381 201113,2334 201114,1127 201115,920 201115,255750 201116,269 201117,1082 201119,697 201119,1127 201119,1769 201120,1983 201121,406 201122,179170 201123,1082 201124,48 201125,557 201126,1082 201127,1082 201128,4190 201130,83 201131,1231 201132,142426 201133,3623 201134,697 201135,206 201136,314 201137,415 201138,179170 201139,1082 201140,23783 201141,3623 201142,849 201143,1172 201144,877 201145,907 201146,179170 201147,355 201148,1058 201148,3724 201149,1688 201150,143 201150,17346 201151,264 201153,1707 201154,142426 201155,843 201156,1188 201157,285 201158,1117 201159,9030 201160,1769 201161,142473 201162,189788 201162,189794 201162,223738 201163,1659 201165,1769 201166,306 201166,307 201167,805 201168,631 201169,1458 201170,211 201170,718 201170,5718 201170,6051 201170,8541 201171,994 201172,3623 201173,388 201173,2045 201174,76096 201175,86416 201176,994 201177,1858 201178,1860 201179,79 201180,79 201181,994 201182,980 201183,4548 201184,3653 201185,392 201185,697 201186,663 201187,217 201188,516 201188,1220 201188,1222 201188,1821 201188,21736 201189,467 201190,1309 201191,1078 201192,994 201193,1130 201194,233 201195,994 201196,1860 201197,1858 201198,994 201199,147 201200,30 201201,1718 201202,219 201203,1769 201204,811 201205,309 201205,310 201206,326 201207,1769 201208,657 201209,577 201210,160 201211,994 201212,48 201213,179170 201214,147 201214,158 201215,994 201216,1769 201217,1769 201218,179170 201219,994 201220,994 201221,179170 201222,1402 201223,406 201224,1769 201225,1769 201226,22 201227,1659 201228,811 201228,1368 201228,48505 201229,2797 201230,5440 201231,557 201232,3623 201233,3623 201234,209 201235,393 201236,146 201236,92476 201237,647 201238,344 201239,720 201240,141912 201241,209 201242,781 201243,1132 201244,1769 201246,201247 201248,209 201249,3695 201250,994 201251,179170 201252,63 201252,1010 201252,1608 201252,1749 201252,13136 201253,919 201254,2460 201255,179170 201256,673 201257,918 201258,142426 201259,781 201260,1132 201261,2526 201262,1381 201263,209 201264,1359 201265,1388 201266,483 201267,30 201268,3623 201269,179170 201270,3623 201271,801 201272,360 201273,1181 201274,193578 201275,309 201275,310 201276,3623 201278,1888 201279,179170 201280,1070 201281,79 201282,994 201283,515 201284,360 201284,697 201284,1769 201285,252 201285,809 201286,1634 201287,7416 201288,994 201289,994 201290,994 201291,3623 201292,360 201293,3695 201294,994 201295,7416 201296,360 201297,435 201298,3 201298,654 201298,16499 201298,23306 201298,201298 201298,215158 201298,216745 201298,234149 201299,306 201299,307 201299,682 201299,72439 201300,206 201301,1769 201302,1089 201302,1623 201303,302 201304,4146 201305,3623 201306,138686 201307,175 201308,1769 201309,209 201310,615 201311,137 201312,1133 201313,137 201314,1707 201315,1860 201316,1858 201317,843 201318,852 201319,1381 201320,749 201321,83 201322,298 201323,994 201324,179170 201325,2244 201327,697 201327,1769 201328,1014 201329,1551 201330,3695 201331,1769 201332,991 201333,10 201334,994 201335,83 201336,32 201337,142426 201338,179170 201339,779 201339,1363 201339,1805 201340,251 201341,718 201342,1265 201342,1266 201343,302 201343,1082 201344,994 201345,143 201346,862 201347,3623 201348,151 201349,3695 201350,516 201351,1769 201352,694 201353,1052 201354,1718 201355,818 201356,68069 201357,1769 201358,491 201359,171641 201360,178 201361,1014 201362,309 201362,310 201363,3695 201364,536 201365,179170 201366,269 201367,178 201367,392 201367,467 201368,1381 201369,31073 201370,493 201371,302 201372,13546 201373,179170 201374,113156 201375,258 201376,179170 201378,752 201379,1608 201380,1132 201381,467 201381,1010 201382,3582 201383,1769 201384,287 201385,1191 201386,1082 201387,2620 201388,455 201389,34 201389,35 201389,222 201389,283 201389,332 201389,389 201389,406 201389,536 201389,657 201389,694 201389,720 201389,781 201389,788 201389,877 201389,907 201389,949 201389,1019 201389,1072 201389,1284 201389,1467 201389,1522 201389,1718 201389,1732 201389,1881 201389,1955 201389,2191 201389,2266 201389,2671 201389,2699 201389,2784 201389,3115 201389,3194 201389,3422 201389,4594 201389,5976 201389,6888 201389,9007 201389,29475 201389,42232 201390,467 201391,1425 201392,35 201393,83 201393,217 201393,278 201393,536 201393,660 201393,852 201393,1133 201393,1466 201393,1467 201393,4637 201393,7092 201394,30331 201395,142473 201396,77 201396,5440 201397,179170 201398,192 201399,1227 201399,86416 201400,1769 201401,2867 201401,2868 201402,201403 201404,35 201405,179170 201406,255 201407,3623 201408,179170 201409,1769 201410,861 201411,3623 201412,179170 201413,1319 201414,30 201415,3623 201416,179170 201417,217 201418,1769 201419,283 201420,360 201421,272 201422,6303 201423,10 201424,41 201425,72 201426,3507 201427,875 201428,3804 201429,994 201430,809 201431,994 201432,2373 201433,994 201434,994 201435,24505 201436,278 201437,994 201438,994 201439,3538 201440,225 201441,1016 201442,1332 201443,503 201444,1722 201445,328 201446,72 201447,312 201448,111 201449,136 201450,227 201451,358 201452,3612 201453,248 201454,9029 201455,4771 201456,3695 201457,1052 201458,1882 201459,1572 201460,850 201462,104 201463,994 201464,217 201464,389 201465,994 201466,179170 201467,1082 201468,2224 201469,179170 201470,179170 201471,1276 201472,192 201472,1089 201473,557 201474,1432 201475,920 201476,422 201477,68 201478,179170 201479,5987 201480,273 201481,201482 201483,44 201484,440 201485,907 201486,217 201487,79 201488,862 201489,83 201490,6303 201491,1474 201492,1127 201493,4455 201494,179170 201495,2073 201495,25222 201496,140 201497,301 201498,211 201499,457 201500,676 201501,179170 201502,179170 201503,179170 201504,179170 201505,994 201506,994 201507,7416 201508,6303 201509,697 201509,1769 201510,2244 201511,217 201512,697 201512,1769 201513,861 201514,818 201515,56 201516,422 201517,1289 201518,3138 201519,592 201520,1284 201521,673 201522,179170 201523,818 201524,179170 201525,55849 201526,1363 201526,1858 201527,179170 201528,287 201528,346 201528,393 201528,435 201528,439 201528,447 201528,516 201528,671 201528,980 201528,1294 201528,1590 201528,1612 201528,15573 201529,1 201530,179170 201531,2116 201532,596 201533,179170 201534,179170 201535,1769 201536,30 201537,259 201538,704 201538,920 201539,179170 201540,1608 201541,1132 201542,179170 201543,1465 201544,30 201545,179170 201546,663 201547,124668 201548,179170 201549,30 201550,1014 201551,852 201552,30 201553,366 201554,366 201555,1014 201556,2744 201557,602 201557,1417 201558,994 201559,330 201560,2006 201561,1014 201562,994 201563,994 201564,273 201564,191355 201565,994 201566,179170 201567,179170 201568,2048 201569,217 201570,1608 201571,179170 201572,422 201574,30 201575,287 201576,994 201577,994 201578,247 201579,179170 201580,179170 201581,994 201582,179170 201583,406 201584,994 201585,179170 201586,292 201587,994 201588,247 201589,577 201590,179170 201591,30331 201592,390 201593,1769 201594,447 201595,2775 201596,19 201596,360 201596,602 201597,2372 201598,1177 201598,182162 201599,179170 201600,202 201601,179170 201603,179170 201604,280 201604,17245 201605,1179 201605,2923 201605,3695 201606,1556 201607,179170 201608,201609 201610,310 201611,179170 201612,179170 201613,310 201614,439 201615,267 201616,285 201617,3623 201618,207 201619,151 201620,179170 201621,8270 201622,3623 201623,2590 201624,269 201625,690 201626,779 201627,862 201628,818 201629,424 201630,330 201630,2260 201631,113156 201632,179170 201633,1773 201634,872 201635,1001 201636,1429 201637,671 201638,563 201639,30 201640,346 201641,255 201642,2590 201643,850 201644,900 201645,137 201646,861 201647,668 201648,201649 201650,201651 201652,1227 201652,86416 201653,861 201654,760 201654,1119 201655,179170 201656,455 201657,1769 201658,752 201659,137 201660,1769 201661,179170 201662,355 201663,30 201664,30 201665,1143 201666,1252 201666,1253 201667,137 201668,483 201669,179170 201670,1707 201671,179170 201672,179170 201673,201674 201675,201676 201677,358 201678,201679 201680,1282 201681,201682 201683,1147 201684,3623 201685,38158 201686,264 201686,1551 201687,201688 201689,188791 201690,16153 201691,171 201692,151 201693,1860 201694,1858 201695,994 201696,163 201697,1085 201698,202 201699,1132 201700,781 201701,76096 201702,76096 201703,79 201704,932 201705,76096 201706,76096 201707,994 201708,1082 201709,2784 201710,138 201711,459 201712,179170 201713,201714 201715,233 201716,124668 201717,640 201718,134 201719,1769 201720,179170 201721,640 201722,640 201723,251 201724,852 201725,994 201726,22 201727,179170 201728,652 201729,191860 201730,875 201731,48 201731,340 201731,473 201731,649 201732,1381 201733,809 201734,217 201735,179170 201736,48 201737,571 201738,1631 201739,48 201740,1769 201741,275 201742,272 201743,1119 201744,1769 201745,1188 201746,201747 201748,932 201749,306 201749,307 201750,7760 201751,717 201752,306 201752,307 201753,287 201755,344 201756,179170 201759,48 201760,83 201761,138686 201762,175 201763,994 201764,58 201765,46 201766,179170 201767,592 201768,1572 201769,1010 201770,415 201771,179170 201772,1773 201773,83 201774,657 201775,1238 201776,22 201777,1449 201778,752 201779,874 201780,6068 201781,1274 201782,994 201783,360 201784,55849 201785,1452 201786,189128 201787,3094 201788,137 201789,1769 201790,280 201790,17245 201791,2923 201792,575 201793,1381 201794,142426 201795,35486 201796,151 201797,505 201797,602 201798,1769 201799,1368 201800,467 201801,920 201802,1132 201803,781 201804,850 201805,1240 201806,861 201807,83 201808,500 201809,1052 201810,1882 201811,2775 201812,54 201813,1962 201814,929 201815,994 201816,142473 201817,302 201818,13361 201819,3695 201820,83 201821,1191 201822,994 201823,2590 201824,2590 201826,138686 201827,54 201828,175 201829,217 201830,422 201831,278 201832,422 201833,422 201834,422 201835,422 201836,994 201837,422 201838,422 201840,422 201841,1298 201842,422 201843,10 201844,663 201845,392 201846,1118 201847,328 201848,55849 201849,1381 201850,850 201851,389 201851,874 201852,704 201853,2590 201854,818 201855,356 201856,1001 201857,304 201858,55849 201859,76096 201860,1276 201861,994 201862,201863 201864,932 201865,1769 201866,251 201867,346 201868,58 201869,994 201870,46 201871,994 201872,704 201873,58 201874,46 201875,994 201876,1769 201877,1179 201878,994 201879,1479 201880,1284 201881,1769 201882,1132 201883,1608 201884,1962 201885,76096 201887,1608 201888,1132 201889,76096 201890,201891 201892,392 201892,697 201893,200 201894,76096 201895,118 201895,422 201895,4597 201895,5405 201896,7092 201897,1882 201898,55849 201899,1551 201900,326 201901,158 201902,850 201903,58 201904,994 201905,46 201906,1381 201907,48 201907,340 201907,649 201908,179170 201909,850 201910,764 201911,30 201912,201913 201914,14434 201915,663 201916,15609 201917,392 201918,994 201919,46 201920,58 201921,366 201922,63 201922,252 201922,516 201923,850 201924,252 201925,673 201926,200 201927,850 201928,1769 201929,58 201930,46 201931,994 201932,302 201933,994 201934,1769 201935,217 201936,1983 201937,850 201938,1298 201939,390 201940,1983 201941,1983 201942,406 201943,850 201944,843 201945,557 201947,287 201948,615 201949,455 201950,415 201951,142426 201952,994 201953,58 201954,46 201955,1381 201956,1860 201957,1858 201958,515 201959,314 201960,1962 201961,3999 201962,83 201963,2421 201964,251 201965,58 201966,994 201967,46 201968,457 201969,58 201970,994 201971,46 201972,1769 201973,861 201974,179170 201975,1181 201976,805 201977,79 201978,179170 201979,422 201980,56 201981,2373 201982,179170 201983,1240 201984,4594 201985,1449 201986,581 201987,1181 201988,934 201988,1449 201989,1381 201990,346 201991,179170 201992,779 201993,1769 201994,435 201995,179170 201996,179170 201997,1769 201998,328 201999,68 202000,151 202001,147 202002,56 202003,422 202004,179170 202005,366 202006,113156 202007,366 202008,366 202009,366 202010,366 202011,366 202012,34 202012,35 202012,83 202013,83 202014,366 202015,366 202016,298 202017,485 202018,1837 202019,843 202020,4611 202022,1836 202023,2572 202024,918 202025,1363 202026,20 202027,2296 202028,8537 202029,1769 202030,179170 202031,596 202032,30 202033,592 202034,179170 202035,179170 202037,179170 202038,141912 202039,994 202040,55849 202041,1707 202042,179170 202043,779 202044,217 202044,536 202044,1618 202045,179170 202046,366 202047,278 202048,179170 202049,179170 202050,113156 202052,333 202052,417 202052,3041 202052,15573 202052,200767 202053,202054 202055,994 202056,3538 202057,326 202058,145240 202059,1769 202060,1882 202061,309 202061,310 202062,16196 202063,30 202064,8854 202065,55849 202066,192 202067,1370 202068,6119 202069,3474 202070,452 202071,184 202072,1247 202072,164572 202073,106 202074,179170 202075,1769 202076,285 202077,149534 202078,250 202078,1684 202079,3999 202080,3474 202081,1058 202082,1177 202083,179170 202084,1769 202085,1769 202086,251 202087,179170 202088,30 202089,167 202090,142405 202091,1955 202091,3135 202093,784 202094,30 202095,179170 202096,151 202097,179170 202098,1860 202099,179170 202101,1556 202102,202103 202102,249488 202104,306 202104,307 202105,5906 202106,557 202107,278 202108,626 202109,137 202110,862 202111,179170 202112,1419 202113,536 202114,83 202115,588 202115,590 202116,217 202117,2671 202118,179170 202119,3999 202120,179170 202121,422 202122,56 202123,30 202124,302 202124,406 202124,420 202124,1414 202124,1466 202125,179170 202126,8270 202127,179170 202128,1858 202129,1860 202130,861 202131,3 202132,1860 202133,1858 202134,179170 202135,2590 202136,179170 202137,3623 202138,805 202139,920 202140,146 202140,92476 202141,179170 202142,179170 202143,1127 202144,179170 202145,1414 202146,179170 202147,2105 202148,1531 202149,1132 202150,151 202151,179170 202152,179170 202153,356 202154,179170 202155,861 202156,251 202157,302 202158,779 202159,289 202159,290 202159,94134 202160,1257 202161,8822 202162,247 202163,179170 202164,673 202165,179170 202166,269 202167,640 202168,118 202168,4597 202169,872 202170,30 202171,663 202172,79 202173,179170 202174,179170 202175,313 202176,179170 202177,330 202178,422 202179,56 202180,179170 202181,179170 202182,134 202183,2048 202184,292 202185,179170 202186,179170 202187,151 202188,920 202189,663 202190,202 202191,179170 202192,179170 202193,2775 202194,447 202195,179170 202196,179170 202197,784 202198,873 202198,1243 202199,973 202199,1149 202199,187960 202200,179170 202201,147 202201,158 202201,240174 202202,179170 202203,120 202204,809 202205,35 202206,323 202207,6638 202208,285 202209,179170 202210,640 202211,1085 202212,595 202213,30 202214,83 202214,278 202215,56 202215,577 202216,179170 202217,1010 202218,179170 202219,151 202220,120 202221,333 202221,1893 202222,179170 202223,179170 202224,420 202225,179170 202226,1893 202227,1001 202228,1467 202229,455 202230,2424 202231,479 202232,1871 202233,1773 202234,1849 202235,179170 202236,640 202237,2421 202238,83 202239,13980 202240,1294 202241,202242 202243,1821 202243,21736 202244,907 202245,861 202246,58 202247,994 202248,46 202249,58 202250,994 202251,46 202252,1769 202254,202255 202256,968 202257,202258 202259,323 202260,355 202261,202262 202263,179170 202265,366 202266,366 202267,366 202268,366 202269,366 202270,366 202271,202272 202273,151 202274,2590 202275,1294 202276,83 202277,302 202278,994 202279,58 202280,46 202281,202282 202283,202282 202284,298 202285,485 202286,138686 202287,175 202288,497 202289,1860 202290,1858 202291,1381 202292,1858 202293,1619 202294,783 202294,968 202294,1160 202295,179170 202296,631 202297,874 202298,151 202299,422 202300,422 202301,422 202302,640 202303,422 202304,422 202305,422 202306,422 202307,422 202308,422 202309,805 202310,179170 202311,422 202312,536 202313,1515 202314,75912 202315,1247 202315,164572 202316,298 202317,485 202318,79 202319,1544 202319,9457 202320,8270 202321,58 202322,360 202323,160 202324,663 202325,3003 202326,202327 202328,3623 202329,579 202330,1893 202331,118 202331,4597 202332,500 202333,1052 202334,54 202335,1882 202336,2775 202337,1962 202338,1359 202339,310 202340,1381 202341,87 202342,83 202343,217 202344,298 202345,485 202346,1559 202347,1773 202348,120 202349,693 202350,611 202351,640 202352,1132 202353,1608 202354,58 202355,46 202356,994 202357,485 202358,298 202359,179170 202360,292 202361,99 202362,179170 202363,240 202364,30 202365,875 202366,44 202367,60576 202368,1113 202369,1707 202370,58 202371,994 202372,46 202373,202374 202375,485 202376,298 202377,467 202378,920 202379,694 202380,920 202381,392 202382,510 202383,202384 202385,60576 202386,1147 202386,1381 202387,447 202388,2775 202389,516 202390,1220 202390,1222 202391,252 202392,2266 202393,609 202394,3653 202395,1381 202396,2775 202397,447 202398,60576 202399,35750 202399,35751 202400,872 202401,467 202402,255 202403,22293 202404,694 202405,433 202406,60576 202407,137 202408,195 202409,247 202409,2867 202409,2868 202410,1381 202411,1381 202412,178 202413,1467 202414,30 202415,1891 202416,30 202417,30331 202418,3623 202419,1238 202420,206 202421,138686 202422,175 202423,15609 202424,142473 202425,1452 202426,30 202427,202428 202429,1860 202430,1858 202431,1381 202432,58 202433,994 202434,46 202435,1860 202436,1858 202437,3623 202438,1052 202439,500 202440,1962 202441,54 202442,1882 202443,2775 202444,752 202445,500 202446,2775 202447,1052 202448,1962 202449,54 202450,1882 202451,433 202452,287 202453,60576 202454,58 202455,994 202456,46 202457,1381 202458,697 202458,1769 202459,46 202460,58 202461,994 202462,120 202463,433 202464,83 202465,577 202466,299 202467,149 202468,387 202469,366 202470,366 202471,3328 202472,3467 202473,452 202474,1247 202474,164572 202475,184 202476,1590 202477,99 202478,269 202479,30 202480,718 202481,160 202483,5718 202484,151 202484,602 202484,6556 202484,144556 202484,164572 202485,1147 202486,3623 202487,6303 202488,467 202489,202490 202491,58 202492,46 202493,994 202494,79 202495,919 202496,301 202496,406 202497,516 202498,360 202499,46 202500,3623 202501,3623 202502,1381 202503,2334 202504,588 202504,590 202505,55849 202506,875 202507,338 202507,1058 202507,4039 202508,13980 202509,442 202510,189128 202511,775 202512,179170 202513,3623 202514,2590 202515,302 202516,269 202517,2443 202518,918 202519,275 202520,58 202521,179170 202522,861 202523,179170 202524,2443 202525,3623 202526,179170 202527,151 202528,79 202529,302 202530,861 202531,58 202532,994 202533,46 202534,3623 202535,58 202536,46 202537,994 202538,179170 202539,2443 202540,1769 202540,1893 202541,473 202541,2353 202542,63 202542,2116 202543,8270 202544,142409 202544,146280 202544,159365 202545,79 202546,79 202546,1544 202547,663 202548,2443 202549,697 202550,79 202551,1773 202552,1133 202553,994 202554,46 202555,58 202556,1181 202557,1381 202558,784 202559,1 202560,3623 202561,760 202561,1631 202562,358 202563,179170 202564,1181 202565,3623 202566,3623 202567,1181 202568,189128 202569,389 202570,392 202571,273 202572,852 202573,30 202575,72 202576,217 202576,1118 202576,1204 202577,1181 202578,2443 202579,30 202580,1181 202581,179170 202582,5987 202583,179170 202584,179170 202585,179170 202586,1860 202587,1858 202588,142426 202589,433 202590,302 202591,179170 202592,1556 202593,217 202594,406 202594,872 202594,1033 202594,1118 202594,8811 202595,356 202596,202 202597,1010 202597,1572 202598,83 202599,843 202600,138 202601,60576 202602,673 202603,30 202604,60576 202605,179170 202606,179170 202607,155481 202608,217 202609,1467 202610,86 202611,179170 202612,179170 202613,240 202614,151 202615,366 202616,314 202616,392 202617,663 202618,1058 202619,179170 202620,19010 202621,1807 202622,179170 202623,217 202623,2421 202623,2979 202623,6789 202624,179170 202625,515 202626,179170 202627,893 202628,179170 202629,850 202630,179170 202631,7416 202632,1860 202633,1858 202634,179170 202636,30 202637,4453 202638,1551 202639,4549 202640,515 202641,192 202642,417 202643,7572 202644,586 202645,973 202646,1590 202647,8798 202648,861 202649,626 202650,622 202651,255 202652,1188 202653,83 202654,1381 202655,179170 202656,302 202657,113156 202658,875 202659,247 202660,1707 202661,240 202661,8541 202662,202663 202664,808 202665,1556 202666,179170 202667,178 202668,202669 202670,1227 202670,86416 202671,4594 202672,483 202673,179170 202674,147 202675,1590 202676,3623 202677,994 202678,63 202679,179170 202680,1881 202681,875 202682,852 202683,435 202684,1509 202685,875 202686,202687 202688,389 202689,138686 202690,142473 202691,179170 202692,30 202693,1235 202693,1335 202694,83 202695,843 202696,433 202697,1274 202698,264 202699,994 202700,994 202701,179170 202702,151 202703,179170 202704,994 202705,406 202705,779 202706,261 202707,179170 202708,3623 202709,328 202710,3804 202711,278 202712,111 202712,1181 202713,273 202714,179170 202715,179170 202716,330 202717,179170 202718,1631 202719,179170 202720,202721 202722,202723 202724,79 202725,179170 202726,179170 202727,86 202727,301 202727,615 202727,907 202727,973 202727,1001 202727,1241 202727,1284 202727,1522 202727,1782 202727,1955 202727,2083 202727,2557 202727,2979 202728,179170 202729,563 202730,179170 202731,179170 202732,1983 202733,179170 202734,179170 202735,179170 202736,30 202737,189788 202738,179170 202739,795 202740,179170 202741,1 202742,861 202743,179170 202744,179170 202745,1257 202746,626 202747,30 202748,557 202749,435 202750,862 202751,1707 202752,179170 202753,179170 202754,1072 202755,179170 202756,179170 202757,143128 202758,809 202759,179170 202760,79 202761,1882 202762,1082 202763,147 202764,760 202765,142430 202766,346 202767,1240 202767,1465 202768,179170 202769,72 202770,1298 202770,1893 202771,843 202772,500 202773,1052 202774,1882 202775,54 202776,2775 202777,1962 202778,179170 202779,179170 202780,179170 202781,30331 202782,179170 202783,2735 202784,422 202785,56 202786,873 202786,1058 202786,1243 202787,179170 202788,859 202789,1381 202790,493 202791,202792 202793,179170 202794,56 202795,422 202796,146280 202796,159365 202797,250 202797,1684 202798,285 202799,179170 202800,179170 202801,4604 202802,179170 202803,500 202804,54 202805,1052 202806,1882 202807,2775 202808,1962 202809,2923 202810,56 202811,422 202812,360 202813,406 202814,179170 202815,179170 202816,179170 202817,179170 202818,8270 202819,994 202820,179170 202821,179170 202822,179170 202823,179170 202824,1860 202825,1858 202826,360 202827,179170 202828,179170 202829,179170 202830,3623 202831,179170 202832,1379 202833,994 202834,1381 202835,179170 202836,3623 202838,83 202839,298 202840,179170 202841,3209 202842,72 202843,179170 202844,2373 202845,273 202846,179170 202847,516 202848,179170 202849,10 202850,179170 202851,179170 202852,179170 202853,202854 202855,65 202856,663 202857,563 202858,557 202859,269 202860,406 202861,50 202861,99 202862,83 202863,527 202864,179170 202865,285 202866,30 202867,179170 202868,30 202869,179170 202870,179170 202871,6424 202872,56 202873,422 202874,4548 202875,56 202876,422 202877,79 202878,779 202879,179170 202880,1326 202881,102 202882,1323 202883,408 202884,267 202885,83 202886,202887 202888,1010 202889,58 202890,994 202891,46 202892,171 202893,285 202894,2620 202895,202896 202897,179170 202898,179170 202899,30 202900,1235 202900,1335 202901,179170 202902,202903 202904,113156 202905,862 202905,1001 202905,1474 202906,179170 202907,179170 202908,424 202909,118 202909,4597 202910,663 202911,179170 202912,179170 202913,900 202914,3367 202915,167 202915,299 202915,73570 202916,485 202917,298 202918,151 202919,222 202919,18831 202921,179170 202922,179170 202923,818 202924,179170 202925,1551 202926,697 202927,179170 202928,356 202929,158 202930,179170 202931,2073 202932,56 202933,422 202934,1181 202934,1381 202935,366 202936,366 202937,1579 202937,4604 202938,366 202939,366 202940,366 202941,273 202942,3003 202943,333 202943,337 202944,179170 202945,340 202946,861 202947,3623 202948,1247 202948,164572 202950,433 202951,179170 202952,200 202952,225 202954,953 202955,179170 202956,872 202957,1659 202958,640 202959,3623 202961,1707 202962,2812 202963,1326 202964,360 202964,697 202964,1769 202965,179170 202966,1773 202967,1411 202968,44 202969,179170 202970,687 202971,30 202972,422 202973,422 202974,422 202975,3623 202976,422 202977,422 202978,30 202979,179170 202980,422 202981,124668 202982,422 202983,56 202984,422 202985,422 202986,422 202987,422 202988,422 202989,422 202990,422 202991,422 202992,527 202993,907 202994,818 202995,118 202995,4597 202996,252 202996,215276 202997,657 202998,7757 202999,640 203000,56 203001,422 203002,422 203003,3623 203004,269 203005,255 203006,1556 203007,203008 203009,1113 203010,312 203010,509 203010,510 203011,1381 203012,158 203012,663 203013,447 203014,179170 203015,30 203015,1179 203016,2775 203017,447 203018,179170 203019,1227 203019,86416 203020,1289 203021,459 203021,571 203021,5405 203022,326 203023,3623 203024,179170 203025,211 203026,83 203027,167 203027,217 203027,289 203027,290 203027,346 203027,435 203027,455 203027,586 203027,631 203027,657 203027,1019 203027,1210 203027,1294 203027,1467 203027,1531 203027,1871 203027,2266 203027,5976 203027,6119 203027,6424 203027,94134 203028,81 203029,1012 203030,1381 203031,1033 203032,1118 203033,30 203034,455 203035,3094 203036,1274 203037,48 203038,425 203038,1544 203039,8180 203040,3623 203041,704 203042,200 203043,328 203044,1238 203045,3623 203046,264 203047,3623 203048,3623 203049,628 203050,3623 203051,97 203051,269 203052,425 203053,425 203054,1452 203055,1220 203055,1222 203056,50 203057,1860 203058,1858 203059,9343 203060,138686 203061,175 203062,2671 203063,925 203064,56 203065,422 203066,360 203067,3623 203068,1132 203069,781 203070,273 203071,1381 203072,163 203073,142426 203074,217 203075,79 203076,134 203077,50 203078,425 203079,795 203080,781 203081,1132 203082,1707 203083,259 203084,1220 203084,1222 203085,134 203086,3003 203087,994 203089,6556 203090,360 203091,79 203092,79 203093,360 203094,41 203095,217 203095,301 203095,631 203095,1010 203095,1085 203096,781 203097,1132 203098,1608 203099,1132 203100,1381 203101,167 203101,73570 203102,3653 203103,781 203104,1132 203105,1 203106,83 203107,3207 203108,4611 203109,60576 203110,422 203111,56 203112,473 203113,809 203114,510 203114,1436 203114,1579 203115,843 203116,1912 203117,972 203117,1559 203118,891 203119,850 203120,3297 203121,179170 203122,187 203123,1132 203124,1608 203125,852 203126,919 203127,60576 203128,104 203129,406 203130,703 203131,81070 203132,557 203133,206 203134,85241 203135,1240 203136,1117 203137,805 203138,581 203139,805 203140,149 203141,3623 203142,346 203143,302 203144,372 203146,79 203147,500 203148,1052 203149,1882 203150,54 203151,2775 203152,1962 203153,30 203154,1118 203155,515 203156,1858 203157,1860 203158,805 203159,142433 203160,179170 203161,500 203162,54 203163,1052 203164,1882 203165,2775 203166,1962 203167,1579 203168,1298 203168,1749 203168,6556 203168,232766 203169,1118 203169,1566 203169,6837 203170,179170 203171,781 203172,1132 203173,1113 203174,68 203174,356 203174,1119 203175,79 203176,179170 203177,72 203178,934 203179,3623 203180,1381 203181,1381 203182,500 203183,1882 203184,1052 203185,2775 203186,1962 203187,54 203188,179170 203189,135 203190,250 203190,1684 203191,356 203192,142426 203194,479 203194,1893 203195,79 203197,918 203201,179170 203202,189303 203203,79 203204,360 203205,179170 203206,83 203207,452 203208,676 203209,1655 203210,255 203211,151 203212,457 203213,366 203215,1370 203216,1052 203217,1962 203218,1882 203219,54 203220,2775 203221,500 203222,179170 203223,179170 203224,72 203225,3623 203226,497 203227,179170 203228,163 203229,5358 203229,14352 203230,1262 203231,3623 203232,3623 203233,179170 203234,920 203235,467 203236,1544 203237,4611 203238,83 203239,14483 203240,179170 203241,1353 203242,252 203243,179170 203244,83 203245,179170 203246,83 203246,1881 203247,536 203248,179170 203249,1085 203250,179170 203251,72 203252,179170 203253,1955 203254,202 203255,714 203256,179170 203257,1381 203258,424 203259,366 203260,366 203261,55849 203262,1882 203263,500 203264,1052 203265,2775 203266,54 203267,1962 203268,2617 203269,425 203270,203271 203272,875 203273,138686 203274,9457 203277,179170 203278,55849 203279,973 203280,811 203281,118 203281,4597 203283,17245 203284,6487 203285,330 203285,406 203285,1001 203285,1235 203285,1335 203285,1381 203285,1392 203286,7416 203287,269 203288,1227 203288,86416 203289,781 203290,1132 203291,949 203292,5101 203293,203294 203296,151 203297,1556 203298,1227 203298,86416 203299,79 203300,179170 203301,81 203302,179170 203303,2373 203304,3182 203305,137 203306,118 203306,4597 203307,138 203308,865 203309,557 203310,137 203311,118 203311,4597 203312,301 203313,88820 203314,557 203315,179170 203316,843 203317,779 203318,417 203319,515 203320,8798 203321,285 203322,250 203322,1684 203323,332 203324,1087 203325,1419 203326,2620 203327,285 203328,250 203328,1684 203329,424 203330,285 203331,250 203331,1684 203332,500 203333,1052 203334,54 203335,1882 203336,2775 203337,1962 203338,1467 203339,278 203340,83 203341,151 203342,1019 203343,217 203344,536 203345,13 203346,455 203346,779 203346,872 203346,1019 203346,2671 203347,179170 203348,1608 203349,1132 203350,8270 203351,138686 203352,175 203353,994 203354,994 203355,1078 203356,179170 203357,10 203357,994 203358,151 203359,843 203360,83 203361,179170 203363,1381 203364,32 203365,203366 203367,179170 203368,485 203369,298 203370,1323 203371,408 203372,1326 203373,102 203374,137 203375,179170 203376,30 203377,2367 203378,2367 203379,2367 203380,179170 203381,30 203382,179170 203383,179170 203384,489 203385,1007 203386,1007 203387,130 203388,179170 203389,827 203390,30 203391,795 203392,611 203393,179170 203394,406 203395,179170 203396,179170 203397,269 203398,779 203399,2312 203400,704 203401,247 203402,483 203403,179170 203404,179170 203405,283 203407,1033 203408,203409 203410,179170 203411,179170 203412,225 203413,203414 203415,151 203416,8270 203417,1639 203418,968 203419,644 203420,3724 203421,167 203422,602 203423,1019 203424,65809 203425,647 203426,1016 203427,1001 203428,2088 203428,154690 203429,697 203430,202 203431,872 203432,467 203433,302 203434,1127 203435,312 203436,9010 203437,3161 203438,203439 203440,440 203441,1590 203442,1955 203443,8884 203444,652 203445,275 203446,2528 203447,355 203448,203449 203450,203449 203451,1807 203452,862 203453,1715 203454,203455 203456,973 203457,1796 203458,1085 203459,87 203460,203461 203462,72 203463,1140 203464,1522 203465,4 203465,5 203466,1019 203467,2557 203468,740 203468,741 203469,203470 203471,1227 203471,86416 203472,861 203473,704 203474,1644 203475,1282 203476,83 203477,2421 203478,835 203479,326 203480,408 203481,3 203483,58 203484,203485 203484,257504 203486,1454 203487,192 203488,1509 203489,980 203490,1132 203491,30 203492,1836 203493,355 203494,366 203495,37088 203496,2073 203497,2567 203498,447 203499,535 203500,422 203501,56 203502,83 203503,5540 203504,435 203505,3 203506,1659 203507,1623 203508,393 203509,179170 203510,366 203511,366 203512,366 203513,366 203514,1722 203515,781 203516,1132 203517,8991 203518,24505 203519,8270 203520,872 203521,120 203522,2244 203523,571 203524,1132 203525,781 203526,83 203527,1007 203528,1052 203529,54 203530,1962 203531,2775 203532,1882 203533,500 203534,1274 203535,1345 203536,1132 203537,781 203538,932 203539,13745 203540,175 203541,781 203542,1132 203543,203544 203545,179170 203546,203547 203548,1132 203549,781 203550,1381 203551,781 203552,1132 203553,918 203554,179170 203555,360 203556,527 203556,743 203556,8714 203557,652 203558,704 203559,360 203560,1381 203561,516 203562,252 203563,1220 203563,1222 203564,158 203565,104 203566,1284 203567,141912 203568,203569 203570,1769 203571,366 203572,179170 203573,179170 203574,179170 203575,4260 203576,872 203577,192 203578,718 203579,203580 203581,118 203581,4597 203582,1085 203583,179170 203584,285 203585,16153 203586,536 203587,30 203588,500 203589,1052 203590,54 203591,1882 203592,2775 203593,1962 203594,4571 203596,55077 203597,483 203598,1332 203599,4355 203600,1479 203601,390 203602,779 203603,30 203604,1132 203605,781 203606,2048 203607,1235 203607,1335 203608,1677 203609,433 203610,500 203611,54 203612,1052 203613,1882 203614,2775 203615,1962 203616,1359 203617,500 203618,1052 203619,1962 203620,54 203621,1882 203622,2775 203623,30 203624,861 203625,179170 203626,137 203627,179170 203628,179170 203629,203630 203631,203632 203633,179170 203634,240 203635,366 203636,366 203637,366 203638,366 203639,366 203640,366 203641,366 203642,203643 203644,861 203645,433 203646,203647 203648,175 203648,16196 203649,10 203650,10 203651,119 203652,3623 203653,850 203655,779 203656,143 203657,422 203658,1284 203659,147 203661,2244 203662,726 203663,328 203664,1773 203665,355 203666,285 203667,107 203668,2416 203668,2417 203669,292 203670,338 203671,298 203672,1133 203673,3538 203674,203675 203676,203675 203677,203678 203679,1132 203680,781 203681,203682 203683,203684 203685,124668 203686,44 203687,1087 203688,622 203689,21442 203690,4810 203692,203693 203694,35 203695,968 203696,932 203697,203698 203699,666 203699,142430 203700,142473 203701,516 203702,252 203703,1220 203703,1222 203704,209 203704,811 203704,861 203705,779 203706,30 203708,203709 203710,203711 203712,142433 203713,310 203714,422 203715,56 203716,72 203717,179170 203718,447 203719,2775 203720,301 203721,14434 203722,179170 203723,179170 203724,2367 203725,994 203726,994 203727,179170 203728,2266 203729,145751 203730,269 203731,779 203732,622 203733,203734 203735,175 203736,203737 203738,179170 203740,179170 203741,179170 203742,179170 203743,202 203744,55849 203745,483 203746,1454 203747,151 203748,714 203749,485 203750,298 203751,3 203752,310 203753,781 203754,1132 203755,252 203756,516 203757,1220 203757,1222 203758,142473 203759,657 203760,273 203761,179170 203762,818 203763,179170 203766,146 203766,92476 203767,344 203768,647 203769,203770 203771,138686 203772,175 203773,30 203774,106 203775,30 203776,1085 203778,119 203779,809 203780,203781 203782,1087 203783,557 203784,557 203785,557 203786,48 203787,2506 203788,872 203789,872 203790,919 203791,30 203792,30 203793,83 203793,259 203794,1227 203794,86416 203795,30 203796,1359 203797,30 203798,1607 203799,200 203800,126 203801,298 203802,1860 203803,1858 203804,596 203805,1359 203806,145240 203807,422 203808,56 203809,104 203810,577 203811,302 203812,283 203813,433 203814,485 203815,298 203816,16153 203817,422 203818,56 203819,538 203820,485 203821,298 203822,87 203822,1465 203822,2812 203822,5366 203822,9098 203823,3623 203824,4039 203825,1603 203826,142473 203827,579 203828,1773 203829,16153 203830,1370 203831,30 203832,5265 203833,179170 203834,779 203835,179170 203836,9030 203837,102 203838,1326 203839,1323 203840,408 203842,30 203843,3297 203844,179170 203845,10 203846,3804 203847,302 203847,2116 203848,285 203849,179170 203850,2590 203851,179170 203852,179170 203853,340 203854,1 203855,203856 203857,179170 203858,240 203859,4222 203860,841 203861,10 203861,54284 203862,30 203863,1773 203864,1453 203865,292 203866,247 203867,294 203868,296 203869,298 203870,203871 203872,203873 203874,179170 203875,861 203876,455 203877,885 203877,13704 203878,68 203879,355 203880,179170 203881,1836 203882,179170 203884,389 203884,874 203885,289 203885,290 203885,94134 203886,99 203887,138686 203888,175 203889,731 203890,217 203890,1417 203891,278 203892,151 203893,302 203895,980 203896,55849 203897,79 203898,330 203899,76096 203900,1072 203901,192 203902,203903 203904,179170 203905,83 203906,222 203906,13661 203907,48 203908,1639 203909,467 203910,79 203911,805 203912,119 203913,422 203914,422 203915,422 203916,422 203917,422 203918,422 203919,422 203920,393 203921,422 203922,422 203923,422 203924,422 203925,422 203926,389 203927,439 203928,640 203929,647 203930,146 203930,92476 203931,344 203932,640 203933,640 203934,640 203935,142426 203935,145751 203936,1224 203937,2286 203938,2989 203938,2991 203939,299 203940,3830 203941,179170 203942,447 203943,2775 203944,1 203945,433 203946,1381 203947,704 203949,273 203950,44 203951,187 203952,868 203952,15573 203953,805 203954,272 203954,439 203954,563 203954,980 203954,2367 203954,15573 203955,920 203956,406 203957,467 203958,736 203959,1238 203960,1551 203961,83 203962,1140 203963,1452 203964,151 203965,50 203966,203967 203968,1436 203969,179170 203970,179170 203971,56 203972,179170 203973,622 203974,1118 203975,56 203976,422 203977,671 203978,30 203978,622 203979,1240 203980,240 203980,631 203980,714 203980,760 203980,2416 203980,2417 203981,457 203983,202 203985,202 203986,1284 203987,1955 203988,447 203989,2775 203990,1749 203991,137 203992,200 203993,500 203994,2775 203995,1052 203996,54 203997,1962 203998,1882 203999,1381 204000,292 204001,179170 204002,1243 204003,1927 204004,1882 204005,179170 204006,349 204007,2436 204008,2775 204009,1052 204010,1962 204011,54 204012,1882 204013,500 204014,104 204015,920 204016,2334 204017,1858 204018,1860 204019,301 204019,2557 204020,179170 204021,1127 204021,49057 204022,120 204023,2620 204024,602 204024,652 204025,1132 204026,781 204027,179170 204028,447 204029,2775 204030,1363 204031,424 204032,805 204033,1294 204034,3623 204035,3623 204036,3623 204037,3623 204038,1007 204039,206 204040,1381 204041,120 204041,148742 204042,179170 204043,58 204044,994 204045,46 204046,333 204047,1007 204049,192 204050,477 204051,179170 204053,179170 204054,510 204055,781 204056,1132 204057,1722 204058,280 204058,17245 204059,602 204060,1132 204061,781 204062,217 204063,30 204064,1167 204065,30 204066,328 204067,50 204068,493 204068,1266 204069,577 204070,4260 204071,493 204072,1087 204073,918 204074,589 204075,307 204075,6068 204077,424 204078,3177 204080,1118 204081,4611 204082,1544 204083,868 204084,1118 204085,179170 204086,10 204087,264 204088,192 204089,1707 204090,1603 204091,3474 204092,204093 204093,397 204093,911 204093,1191 204093,1204 204093,21592 204093,65854 204093,204092 204093,204510 204093,204573 204093,205230 204093,205262 204093,207264 204093,213029 204093,213053 204093,214091 204093,214096 204093,214164 204093,215238 204093,215741 204093,216725 204093,216729 204093,216775 204093,239879 204093,244077 204093,244248 204093,244604 204093,263939 204094,204095 204096,1531 204097,483 204098,167 204098,73570 204099,1085 204100,204101 204102,179170 204103,149 204103,302 204103,21442 204104,83 204105,1007 204106,179170 204107,611 204108,179170 204109,7092 204110,994 204111,138686 204112,175 204113,843 204114,179170 204115,602 204116,1381 204117,30 204118,731 204119,302 204119,447 204119,1294 204119,2116 204120,577 204122,83 204123,269 204124,56 204124,146 204124,175 204124,192 204124,195 204124,333 204124,422 204124,841 204124,1089 204124,1619 204124,1623 204124,2217 204124,5265 204124,18997 204124,22616 204124,23783 204124,60576 204124,92476 204124,141912 204124,215231 204124,215270 204124,237564 204124,257042 204124,262509 204125,1707 204126,145240 204127,485 204128,298 204129,272 204130,968 204131,179170 204132,515 204133,1118 204134,843 204135,360 204136,127158 204137,775 204138,179170 204139,179170 204140,718 204141,192 204142,515 204143,808 204144,179170 204145,2045 204145,29253 204146,179170 204147,175 204148,1370 204149,179170 204150,850 204151,1544 204152,4611 204153,1370 204154,65 204155,179170 204156,179170 204157,1608 204158,1132 204160,195 204161,1631 204162,4611 204163,1544 204164,55849 204165,657 204166,893 204167,179170 204168,179170 204169,718 204171,1608 204172,1012 204173,3623 204174,179170 204175,704 204176,356 204176,5591 204177,179170 204178,1556 204179,151 204180,179170 204181,1127 204182,1227 204182,86416 204183,563 204184,422 204185,56 204186,215 204187,179170 204188,920 204189,179170 204190,179170 204191,179170 204192,179170 204193,179170 204194,500 204195,54 204196,1052 204197,1882 204198,2775 204199,1962 204200,179170 204201,596 204202,636 204203,140 204204,217 204205,179170 204206,179170 204207,682 204207,72439 204208,323 204209,1359 204210,10 204211,717 204212,179170 204213,204214 204215,147 204215,80266 204216,48 204217,2750 204218,875 204219,875 204220,158 204220,192 204221,179170 204222,349 204223,179170 204224,1132 204225,781 204226,1608 204227,147 204227,118336 204228,344 204229,2373 204230,30 204231,179170 204232,179170 204233,1458 204234,215 204235,141912 204236,1012 204237,309 204237,310 204238,10 204238,113156 204239,611 204239,801 204239,1070 204239,1782 204240,3623 204241,2867 204241,2868 204242,200 204243,99 204244,1844 204245,500 204246,54 204247,1052 204248,1882 204249,2775 204250,1962 204251,3623 204252,493 204252,622 204253,68 204254,3260 204255,72 204257,30 204258,247 204259,34 204259,35 204259,657 204259,13137 204259,13661 204260,83 204261,781 204262,1132 204263,750 204264,994 204265,1881 204266,255 204267,72 204268,149 204269,1151 204269,1572 204270,422 204271,179170 204272,269 204273,247 204274,179170 204275,1220 204275,1222 204276,516 204277,252 204278,1608 204279,1132 204280,34 204280,35 204280,37 204280,44 204280,50 204280,58 204280,59 204280,79 204280,104 204280,106 204280,111 204280,116 204280,135 204280,147 204280,178 204280,195 204280,202 204280,217 204280,264 204280,278 204280,289 204280,290 204280,301 204280,333 204280,337 204280,372 204280,393 204280,406 204280,479 204280,493 204280,516 204280,577 204280,585 204280,588 204280,590 204280,592 204280,620 204280,622 204280,628 204280,631 204280,640 204280,720 204280,779 204280,872 204280,877 204280,907 204280,949 204280,994 204280,1007 204280,1010 204280,1033 204280,1078 204280,1085 204280,1132 204280,1151 204280,1210 204280,1212 204280,1247 204280,1265 204280,1266 204280,1284 204280,1370 204280,1381 204280,1453 204280,1454 204280,1509 204280,1515 204280,1522 204280,1531 204280,1634 204280,1659 204280,1732 204280,1776 204280,1893 204280,2051 204280,2073 204280,2087 204280,2191 204280,2371 204280,2782 204280,2931 204280,3194 204280,3422 204280,3695 204280,3794 204280,4079 204280,4192 204280,4193 204280,5265 204280,5310 204280,5440 204280,5708 204280,8180 204280,8270 204280,8308 204280,8598 204280,8788 204280,8811 204280,8822 204280,8907 204280,9542 204280,31237 204280,44244 204280,94134 204280,164572 204281,1522 204282,1381 204283,1608 204284,179170 204285,30 204286,30 204287,1773 204288,1132 204289,1608 204290,433 204291,68069 204292,204293 204294,366 204295,1858 204296,1860 204297,4237 204297,182162 204298,102 204299,1323 204300,1326 204301,408 204302,1465 204303,330 204303,1571 204304,138686 204305,175 204306,20790 204307,366 204308,247 204309,1298 204310,30 204311,994 204312,83 204312,217 204312,222 204312,1274 204312,2646 204313,8270 204314,1 204315,8854 204316,189128 204317,167 204318,389 204318,874 204319,292 204320,8822 204321,862 204322,179170 204323,2735 204324,56 204325,422 204326,250 204326,1684 204327,1511 204327,3069 204328,203470 204329,330 204330,192 204330,195 204331,862 204332,1474 204333,2775 204334,447 204335,861 204336,1255 204336,50943 204337,217 204338,577 204339,1849 204340,3218 204341,179170 204342,179170 204343,1353 204344,640 204345,3297 204346,269 204347,7155 204348,843 204349,1458 204350,346 204351,493 204352,389 204353,1572 204354,7 204354,861 204355,202 204356,3297 204357,657 204358,2411 204359,83 204360,9026 204361,294 204362,217 204362,1417 204363,299 204364,536 204365,1801 204366,1179 204366,1305 204366,2701 204367,179170 204368,424 204369,920 204370,179170 204371,309 204371,310 204372,179170 204373,179170 204374,32475 204374,264888 204375,2266 204376,1118 204377,179170 204378,179170 204379,7416 204380,301 204381,431 204381,589 204381,631 204381,1001 204381,2590 204382,179170 204384,2353 204385,179170 204386,30 204387,179170 204388,192 204389,179170 204390,179170 204391,179170 204392,1634 204393,179170 204394,179170 204395,179170 204396,861 204397,179170 204398,4545 204399,179170 204400,280 204400,17245 204401,953 204402,285 204403,328 204404,1298 204405,179170 204406,179170 204407,10 204408,2266 204409,4571 204410,366 204411,366 204412,30331 204413,107 204414,760 204415,333 204416,3507 204417,204418 204419,1544 204420,309 204420,310 204421,577 204422,328 204423,240 204424,3695 204425,843 204426,1807 204427,640 204428,455 204429,1773 204430,179170 204431,1381 204432,1188 204432,1882 204433,346 204434,204435 204436,346 204437,30 204438,179170 204439,7155 204440,30 204441,179170 204442,269 204443,50 204444,146 204444,92476 204445,1102 204445,2868 204446,2995 204447,1659 204448,355 204449,736 204450,285 204451,184 204452,636 204453,56 204454,422 204455,97 204456,179170 204457,736 204458,10 204459,585 204460,7363 204460,8788 204461,8822 204462,179170 204463,179170 204464,326 204465,852 204466,251 204467,179170 204468,179170 204469,1132 204470,1608 204471,204472 204473,1140 204474,440 204477,147 204477,149 204477,1385 204478,179170 204479,179170 204480,200 204481,2173 204482,422 204483,422 204484,422 204485,422 204486,422 204487,422 204488,292 204489,422 204490,422 204491,422 204492,422 204493,422 204494,1132 204495,1608 204496,980 204497,204498 204499,424 204500,1181 204501,1836 204502,10 204503,179170 204504,146 204504,92476 204505,647 204506,344 204507,1551 204508,1860 204509,1858 204510,204093 204511,726 204512,179170 204513,1381 204514,179170 204515,147 204516,358 204517,55849 204518,280 204518,17245 204519,204520 204521,1821 204521,21736 204522,55849 204523,171 204524,516 204526,158 204526,195 204526,1033 204526,3297 204526,3872 204527,30 204528,44 204529,1282 204530,160 204531,920 204532,1608 204533,1132 204534,467 204535,1608 204536,1132 204537,2315 204538,422 204539,1707 204540,1132 204541,1608 204542,252 204543,422 204544,56 204545,137 204546,142473 204547,83 204548,333 204549,2979 204550,248 204551,577 204552,1284 204553,206 204554,56 204555,422 204556,1122 204557,1782 204558,138686 204559,586 204559,784 204559,1262 204559,1332 204559,1572 204559,1888 204559,2701 204559,30331 204559,215276 204560,175 204561,142473 204562,158 204562,5874 204563,602 204564,1122 204565,1608 204566,206 204567,292 204567,338 204567,509 204567,1119 204567,1688 204568,1511 204568,1711 204568,3069 204569,204570 204571,204570 204572,65 204572,206 204572,264 204572,1531 204572,1572 204572,1659 204572,2979 204573,204093 204574,932 204575,1467 204576,206 204577,571 204578,1860 204579,1858 204580,994 204581,287 204581,162599 204582,20 204583,1531 204584,179170 204585,2620 204586,372 204587,718 204588,251 204589,179170 204590,2915 204591,736 204592,217 204593,179170 204594,179170 204595,179170 204596,179170 204598,141912 204599,179170 204600,179170 204601,120 204602,2557 204603,994 204604,269 204605,1608 204606,1132 204607,1012 204608,442 204609,2421 204610,149 204611,302 204613,704 204614,736 204615,179170 204616,875 204617,349 204618,516 204619,30 204620,19010 204621,843 204622,185877 204623,15807 204624,1893 204625,422 204626,209 204627,204628 204629,3367 204630,1052 204630,3695 204631,623 204632,1860 204633,1858 204634,158 204635,8907 204636,15 204637,138686 204638,525 204639,127158 204640,41 204640,120 204640,261 204640,332 204640,694 204640,1119 204640,1353 204640,1608 204640,3115 204640,6068 204640,32751 204641,1309 204643,1285 204644,720 204646,1659 204647,631 204648,2775 204649,447 204650,784 204651,500 204652,1052 204653,1882 204654,54 204655,2775 204656,1962 204657,142870 204658,294 204659,1118 204660,192 204661,483 204662,10 204664,493 204665,422 204666,1227 204666,86416 204667,35 204668,1132 204669,781 204670,222 204671,408 204672,2191 204673,850 204674,1147 204675,850 204676,744 204677,259 204677,859 204678,179170 204679,1381 204680,1749 204681,179170 204682,433 204683,60576 204685,918 204686,179170 204687,957 204688,60576 204689,1132 204690,781 204691,1571 204692,775 204693,269 204694,640 204695,349 204695,452 204695,770 204695,784 204696,179170 204697,30 204698,195 204699,195 204700,179170 204701,862 204702,1287 204703,356 204704,269 204705,557 204706,1293 204707,2315 204708,209 204709,298 204710,485 204711,1160 204712,298 204713,485 204714,920 204715,137 204716,994 204717,467 204718,179170 204719,83 204720,2828 204721,5301 204722,1274 204723,5591 204724,179170 204725,1860 204726,1858 204727,406 204728,113156 204729,2590 204730,171 204731,179170 204732,1274 204733,19010 204734,393 204734,999 204734,1388 204735,204736 204737,179170 204738,1715 204739,138686 204740,843 204741,175 204742,1274 204743,1179 204744,994 204745,179170 204746,179170 204747,994 204748,217 204748,301 204749,142405 204750,3094 204751,1983 204752,1860 204753,1858 204754,372 204754,2812 204755,136 204756,2073 204757,154408 204758,640 204759,292 204760,48 204761,151 204762,1983 204764,195 204766,264 204767,251 204768,920 204769,652 204770,7416 204771,19010 204772,142473 204773,30 204774,20257 204775,5405 204776,563 204777,204778 204779,4545 204779,13136 204779,56150 204780,356 204782,179170 204783,1659 204784,30 204785,179170 204786,3094 204788,200 204789,1983 204790,179170 204791,299 204791,459 204791,932 204791,972 204791,973 204791,1010 204791,1117 204791,1298 204791,1849 204791,3207 204791,124668 204791,187176 204791,221322 204791,221329 204792,1556 204793,299 204794,195 204794,102560 204795,328 204796,2315 204797,149534 204798,3623 204799,120 204800,179170 204801,124668 204802,179170 204803,35 204804,1572 204805,752 204806,1133 204807,195 204808,269 204809,217 204810,4192 204810,4193 204811,622 204812,120 204813,222 204814,179170 204815,179170 204816,2923 204817,1133 204818,577 204818,1105 204819,1858 204820,1860 204821,346 204822,134 204823,4691 204824,356 204824,417 204824,4220 204825,485 204826,298 204827,151 204828,269 204829,536 204830,37 204830,3999 204831,15119 204832,1118 204833,298 204834,485 204835,417 204836,994 204837,2373 204838,204839 204840,783 204841,483 204842,516 204843,2979 204844,298 204845,485 204846,366 204847,179170 204848,192 204849,447 204850,1118 204851,852 204852,4672 204853,1132 204854,781 204855,217 204856,994 204857,179170 204858,415 204859,485 204860,298 204861,1860 204862,1858 204863,56 204863,147 204864,147 204865,179170 204866,278 204867,179170 204868,179170 204869,1452 204870,868 204871,1707 204872,1118 204873,406 204874,841 204875,3623 204876,1400 204877,19010 204878,83 204879,435 204880,142405 204881,1001 204882,346 204883,843 204884,146 204884,92476 204885,647 204886,344 204887,389 204888,30 204889,179170 204890,2315 204891,346 204892,861 204893,346 204894,30 204895,16196 204896,79 204897,2048 204898,1452 204899,536 204900,1363 204901,333 204901,346 204901,1247 204901,164572 204902,1888 204903,1132 204904,781 204905,577 204906,631 204907,720 204907,745 204907,762 204907,2590 204907,3258 204907,5469 204907,6789 204907,249937 204908,158 204909,2719 204911,179170 204913,179170 204914,877 204915,211 204916,1655 204917,179170 204918,1425 204919,217 204920,10 204921,179170 204922,179170 204923,255 204924,1132 204925,781 204926,781 204927,1132 204928,1118 204929,56 204930,422 204931,31977 204931,214530 204932,179170 204934,861 204935,264 204936,30 204937,142870 204938,346 204939,72 204940,346 204942,32 204943,1608 204944,563 204945,366 204946,366 204947,289 204947,290 204947,94134 204948,179170 204949,72 204950,344 204951,285 204952,179170 204953,179170 204954,137 204955,346 204956,424 204957,179170 204958,137 204959,1773 204960,204961 204962,2146 204963,151 204964,289 204964,290 204964,94134 204965,861 204966,631 204967,1363 204969,893 204970,752 204971,179170 204972,818 204973,589 204974,861 204975,581 204975,918 204976,137 204977,455 204978,137 204979,137 204980,179170 204981,8373 204982,1267 204983,406 204983,779 204983,1392 204983,3148 204983,6323 204983,148742 204984,2315 204985,204986 204987,56 204988,422 204990,204991 204990,216424 204990,228639 204992,137 204993,1 204994,58 204995,994 204996,46 204997,137 204998,14483 204999,671 205000,1132 205001,536 205002,389 205003,205004 205005,355 205006,158 205007,450 205008,1177 205008,182162 205009,1241 205010,1659 205011,187176 205012,675 205013,142430 205014,779 205015,79 205015,1238 205016,1085 205017,364 205018,1160 205019,698 205020,1773 205021,134 205022,3623 205023,160 205024,151 205025,640 205026,640 205027,485 205028,298 205029,479 205030,192 205031,1210 205032,205033 205034,285 205035,346 205036,142426 205037,189839 205038,1359 205039,5310 205040,248 205040,557 205041,200 205042,577 205042,1105 205042,1429 205043,252 205044,1381 205045,113156 205046,30331 205047,872 205048,360 205049,991 205050,2443 205051,138 205052,485 205053,298 205054,360 205055,1132 205056,1608 205057,919 205058,205059 205060,209 205061,278 205062,666 205063,671 205063,5908 205064,467 205065,920 205066,272 205066,301 205066,631 205066,1001 205066,1326 205066,1715 205066,2209 205066,3804 205066,8541 205066,9018 205067,1882 205068,366 205069,467 205070,138 205071,73570 205072,805 205073,485 205074,298 205075,192 205076,1188 205077,694 205078,13661 205079,920 205080,83 205081,516 205082,515 205083,3 205084,809 205085,1274 205086,663 205087,1888 205087,8675 205088,422 205089,422 205090,422 205091,663 205092,422 205093,422 205094,479 205095,1146 205096,422 205097,147 205098,422 205099,422 205100,3094 205101,422 205102,422 205103,422 205104,673 205105,932 205106,422 205107,718 205108,44 205109,2989 205110,1127 205111,83 205112,278 205113,217 205114,328 205115,795 205116,2411 205117,1238 205118,269 205119,911 205120,160 205121,1007 205123,7614 205124,920 205125,911 205126,920 205127,1452 205128,920 205129,920 205130,58 205131,994 205132,46 205133,447 205134,2775 205135,920 205136,163 205137,1058 205139,1132 205140,781 205141,138686 205142,175 205143,206 205144,217 205145,298 205146,485 205147,875 205148,424 205149,134 205150,179170 205151,158 205151,406 205153,7572 205154,6955 205155,406 205156,1465 205156,9457 205157,1849 205158,1132 205159,781 205160,781 205161,1132 205162,920 205163,68 205164,781 205165,1132 205166,209 205167,1860 205168,1858 205169,433 205170,781 205171,1132 205172,1707 205174,346 205175,1363 205176,920 205177,1858 205178,1860 205179,718 205180,609 205181,1608 205182,1132 205183,1132 205184,1608 205185,264 205186,920 205187,1381 205188,818 205189,697 205189,1769 205190,205191 205192,557 205193,781 205194,1132 205195,920 205196,473 205197,818 205198,346 205199,1837 205200,60576 205201,3999 205202,294 205202,1085 205202,4222 205203,500 205204,54 205205,1882 205206,2775 205207,1962 205208,1052 205209,83 205210,151 205211,149534 205212,918 205213,781 205214,1132 205215,63 205216,775 205217,433 205218,179170 205219,1381 205220,1133 205220,164572 205221,309 205221,310 205221,760 205222,68 205222,1235 205222,1335 205223,30 205224,292 205224,1058 205224,19443 205225,137 205227,781 205228,1132 205229,6059 205230,204093 205231,1235 205231,1335 205231,2045 205231,2209 205231,3474 205231,8788 205231,21711 205231,29253 205231,29294 205232,179170 205233,302 205234,55849 205235,178 205236,781 205237,1132 205238,861 205239,240 205240,843 205241,205242 205243,1132 205244,781 205245,349 205246,717 205247,302 205248,358 205249,364 205249,596 205250,581 205251,145240 205252,567 205253,2699 205254,911 205255,269 205256,37 205257,762 205258,663 205260,145240 205261,1381 205262,204093 205263,79 205263,8180 205264,179170 205265,138686 205266,175 205267,206 205268,179170 205269,358 205270,79 205271,1240 205272,179170 205273,186 205273,1118 205273,1417 205273,1796 205274,289 205274,290 205274,94134 205275,312 205276,515 205277,145240 205278,179170 205279,515 205280,273 205281,314 205281,433 205281,1172 205282,71 205283,179170 205284,1556 205285,179170 205286,455 205287,861 205288,278 205289,179170 205290,422 205291,179170 205292,278 205293,500 205294,1882 205295,2775 205296,1052 205297,1962 205298,54 205299,10 205300,3999 205301,179170 205302,179170 205303,217 205304,179170 205305,302 205306,473 205307,251 205308,179170 205309,579 205310,1556 205311,718 205312,10 205313,485 205314,298 205315,255 205316,195 205317,179170 205318,179170 205319,503 205320,179170 205321,179170 205322,8270 205323,366 205324,179170 205325,346 205326,179170 205327,179170 205328,563 205329,179170 205330,179170 205331,179170 205332,179170 205333,179170 205334,151 205335,483 205336,275 205337,179170 205338,179170 205339,30 205340,179170 205341,179170 205342,273 205343,54 205344,500 205345,1052 205346,1882 205347,2775 205348,1962 205349,137 205350,1238 205351,1 205352,179170 205353,9029 205354,622 205355,179170 205356,44 205357,179170 205358,79 205359,1294 205360,179170 205361,179170 205362,4597 205363,113156 205364,179170 205365,179170 205366,30 205367,179170 205368,137 205369,1436 205370,179170 205371,142473 205372,179170 205373,994 205374,459 205374,862 205374,907 205374,1010 205374,1837 205374,20359 205374,188791 205375,247 205375,2867 205375,2868 205376,179170 205377,179170 205378,179170 205379,179170 205380,389 205380,874 205381,2315 205382,2224 205384,30 205385,801 205386,222 205386,1773 205387,151 205388,278 205389,217 205390,83 205391,536 205392,2373 205393,1467 205394,485 205395,298 205396,179170 205397,500 205398,1052 205399,54 205400,1882 205401,2775 205402,1962 205403,8270 205404,733 205405,83 205407,1058 205408,557 205409,8854 205410,5906 205411,557 205412,626 205413,278 205414,137 205415,862 205416,818 205417,3623 205418,1707 205419,1773 205420,360 205421,720 205421,877 205421,973 205421,1001 205421,1117 205421,1284 205421,1522 205421,1715 205421,1837 205421,2191 205421,9024 205422,149 205422,21442 205423,861 205424,179170 205425,479 205425,1289 205425,1381 205425,1551 205426,179170 205427,1474 205428,2620 205429,247 205430,179170 205431,673 205432,920 205433,875 205434,323 205435,179170 205436,1085 205437,179170 205438,563 205439,3653 205440,1608 205441,1132 205442,2979 205443,255 205444,481 205445,1012 205446,179170 205447,1262 205448,2146 205449,2620 205450,193129 205451,278 205453,255 205454,179170 205455,179170 205456,179170 205457,1149 205458,389 205459,2315 205460,634 205461,1012 205462,841 205463,3830 205464,805 205465,2315 205466,2315 205467,2315 205468,142870 205469,3507 205470,4903 205471,179170 205472,179170 205473,23783 205474,485 205475,298 205476,142473 205477,179170 205479,179170 205480,179170 205481,179170 205482,179170 205483,2116 205484,179170 205485,179170 205486,179170 205487,205488 205488,22 205489,179170 205490,205491 205492,278 205493,179170 205494,205495 205496,577 205497,142473 205498,205478 205499,1326 205500,102 205501,1323 205502,408 205503,1773 205504,577 205504,1105 205504,1429 205505,179170 205506,406 205507,179170 205508,23783 205509,1140 205509,1782 205510,1773 205511,1181 205512,179170 205513,344 205513,55849 205514,1033 205515,179170 205516,30 205517,179170 205518,179170 205519,179170 205520,30331 205521,1227 205521,86416 205522,205523 205522,235273 205524,1227 205524,86416 205525,179170 205526,581 205527,179170 205528,2590 205529,620 205530,179170 205531,1821 205531,21736 205532,179170 205533,406 205534,200 205535,179170 205536,10 205537,872 205538,1429 205539,179170 205540,179170 205541,346 205542,179170 205543,1515 205544,779 205545,258 205546,1572 205547,1363 205548,207 205549,285 205550,137 205551,740 205551,741 205552,304 205553,1769 205554,366 205555,333 205556,668 205557,406 205558,1033 205559,323 205560,2292 205561,179170 205562,205563 205564,179170 205565,179170 205566,179170 205567,179170 205568,179170 205569,179170 205570,671 205571,298 205572,485 205573,83 205574,620 205575,406 205576,138686 205577,175 205578,179170 205579,994 205580,1143 205581,1240 205582,179170 205583,355 205584,1515 205585,779 205586,1572 205587,275 205590,779 205591,136 205592,2590 205593,179170 205594,2590 205595,360 205596,2421 205597,333 205598,147 205599,440 205600,366 205601,54 205603,1551 205604,422 205605,175 205606,422 205607,422 205608,422 205609,422 205610,1559 205611,422 205612,422 205613,422 205614,422 205615,422 205616,422 205617,779 205618,422 205619,179170 205620,179170 205621,179170 205622,240 205622,372 205623,1381 205624,179170 205625,640 205626,179170 205627,104 205627,134 205627,137 205627,138 205627,636 205627,911 205627,967 205627,1432 205627,4114 205627,15742 205627,65864 205627,73288 205627,84411 205627,140773 205627,170751 205627,205627 205627,227188 205627,243263 205627,243265 205627,243266 205627,243270 205627,243273 205628,328 205629,795 205630,81 205631,285 205632,58 205633,46 205634,994 205635,1033 205636,252 205636,516 205638,900 205639,726 205640,841 205641,1425 205642,179170 205643,302 205644,340 205645,314 205645,141912 205647,217 205648,79 205649,1007 205650,264 205650,1749 205650,14550 205651,338 205651,827 205651,1381 205652,809 205653,663 205654,1363 205654,1858 205655,340 205656,83 205657,137 205659,1052 205660,28203 205660,162599 205661,340 205662,1007 205663,726 205664,1033 205665,163 205665,1556 205666,3094 205667,1276 205668,1274 205669,920 205670,467 205671,304 205671,2590 205672,406 205673,46 205673,299 205673,663 205673,762 205673,877 205673,972 205673,1117 205673,1192 205673,1284 205673,1973 205673,124668 205673,148742 205674,2915 205676,2979 205677,809 205678,336 205679,44 205680,179170 205681,2744 205682,280 205682,17245 205683,269 205684,124668 205685,1860 205686,1858 205687,193129 205688,433 205689,620 205690,1381 205691,356 205691,852 205691,32751 205692,932 205693,1238 205694,171 205695,273 205696,107 205697,660 205698,406 205699,893 205700,261 205700,283 205700,2319 205700,2646 205701,167 205701,73570 205702,205703 205704,1452 205705,2590 205706,1515 205707,779 205708,192 205709,1 205710,1465 205711,5213 205712,200 205713,358 205713,611 205714,1058 205715,1402 205716,1837 205717,1345 205718,333 205719,455 205720,1019 205721,1033 205722,1860 205723,1858 205724,447 205725,2775 205726,10 205727,622 205728,455 205729,217 205730,106 205730,1082 205731,620 205732,1368 205733,5034 205734,920 205735,406 205736,83 205737,481 205738,447 205739,2775 205740,1515 205741,779 205742,447 205743,2775 205744,481 205745,1718 205746,151 205746,358 205746,1058 205746,144556 205746,255911 205748,273 205748,313 205749,934 205749,1033 205750,3582 205751,217 205753,312 205754,200 205755,333 205756,515 205757,1860 205758,1858 205759,179170 205760,3623 205761,179170 205762,1033 205764,794 205765,2797 205766,48 205767,167 205767,314 205768,620 205769,581 205770,315 205770,671 205771,567 205772,406 205773,779 205774,58 205775,994 205776,46 205777,179170 205778,179170 205779,393 205780,333 205781,50 205781,14366 205782,1515 205783,269 205784,179170 205785,192 205786,1220 205786,1222 205787,252 205788,251 205789,269 205790,309 205790,310 205791,1127 205792,1058 205793,1118 205794,106 205794,149 205794,406 205795,483 205796,1572 205797,83 205798,801 205799,1118 205800,278 205801,640 205802,515 205803,697 205804,269 205805,2315 205806,138686 205807,269 205808,697 205809,175 205810,852 205811,5718 205812,205813 205814,918 205815,201886 205816,137 205816,206 205816,420 205816,586 205816,628 205816,2574 205816,4039 205816,5375 205816,16207 205816,22727 205816,99287 205817,1388 205818,1359 205819,13661 205820,48 205821,1860 205822,1858 205823,805 205824,2735 205825,392 205825,1572 205825,3769 205826,2750 205827,192 205828,872 205828,1220 205828,1222 205829,4548 205830,30 205832,2607 205833,179170 205835,1133 205836,6059 205837,13661 205838,83 205839,83 205839,2590 205839,6068 205840,151 205841,83 205842,536 205842,784 205842,2553 205843,1556 205844,640 205845,202 205846,179170 205847,1881 205848,455 205849,179170 205850,299 205851,1220 205851,1222 205852,252 205853,251 205854,697 205854,1417 205855,4594 205856,63 205856,106 205856,192 205856,202 205856,252 205856,337 205856,516 205856,586 205856,1220 205856,1222 205856,1243 205856,1635 205856,6119 205856,16201 205857,179170 205858,4039 205859,13661 205860,287 205861,3252 205862,10 205862,1188 205863,167 205864,1363 205865,35 205866,233 205867,79 205867,217 205867,247 205867,252 205867,467 205867,1181 205868,623 205868,1805 205869,873 205870,366 205871,65 205872,205873 205874,30 205875,264 205876,1381 205877,185877 205878,30 205879,66297 205880,136 205880,1332 205882,640 205883,1531 205884,1773 205885,179170 205886,366 205887,217 205888,298 205889,34 205889,35 205890,644 205891,179170 205892,435 205893,35 205893,389 205893,536 205893,852 205893,949 205893,2646 205894,483 205895,179170 205896,885 205896,13704 205897,538 205898,1556 205899,10 205900,760 205901,30 205902,83 205903,120 205904,158 205904,289 205904,406 205904,94134 205905,563 205906,843 205907,694 205907,1907 205908,1417 205909,485 205910,298 205911,50 205911,192 205912,473 205913,671 205914,485 205915,298 205916,6424 205917,577 205918,30 205919,1188 205920,4411 205921,1955 205922,302 205923,861 205924,188791 205925,179170 205926,1220 205926,1222 205927,516 205928,252 205929,557 205930,862 205931,302 205932,623 205933,83 205934,167 205935,8270 205936,424 205937,217 205938,536 205939,77 205940,900 205941,557 205942,4571 205943,682 205943,72439 205944,2620 205945,285 205946,3804 205947,2923 205948,861 205949,205950 205951,205950 205952,485 205953,298 205954,346 205955,673 205956,1014 205957,2607 205958,179170 205959,4192 205959,4193 205960,2073 205961,1014 205962,205963 205964,205963 205965,205963 205966,205963 205967,205963 205968,205963 205969,205963 205970,205963 205971,205963 205972,4637 205973,1014 205974,179170 205975,1014 205976,841 205977,1014 205978,179170 205979,3252 205980,2735 205981,179170 205982,179170 205983,1860 205984,1858 205985,10 205986,1860 205987,1858 205988,192 205989,1474 205990,1181 205991,1235 205991,1335 205992,4260 205993,302 205993,579 205994,104 205994,4355 205995,30 205996,285 205997,250 205997,1684 205998,1058 205999,861 206000,795 206001,30 206002,72 206003,206004 206005,158 206006,179170 206007,1849 206008,30 206009,30 206010,1515 206011,30 206012,1453 206013,30 206014,1323 206015,102 206016,408 206017,1326 206018,2116 206019,206020 206019,227848 206019,241512 206021,422 206022,356 206022,1309 206023,577 206024,179170 206025,30 206026,563 206027,1102 206028,15573 206029,269 206030,516 206031,252 206032,1220 206032,1222 206033,338 206034,795 206035,278 206036,1849 206037,206038 206039,338 206040,206041 206042,206041 206043,1 206043,147 206043,149 206044,79 206045,1085 206047,179170 206049,30 206051,875 206052,8180 206053,431 206053,631 206053,862 206053,994 206053,1474 206053,44725 206054,179170 206055,23783 206056,850 206057,2590 206058,147 206060,30331 206061,65 206062,1429 206063,640 206064,142430 206065,192 206066,206067 206068,179170 206069,10 206070,72 206071,207 206072,668 206073,179170 206074,872 206075,424 206076,206077 206078,179170 206080,422 206081,56 206082,313 206083,222 206083,455 206084,5265 206085,1424 206086,206087 206088,485 206089,298 206090,1143 206091,2083 206092,3 206093,137 206094,1707 206095,137 206097,862 206098,392 206098,676 206098,849 206098,3003 206099,298 206100,485 206101,1803 206102,346 206103,1381 206104,66297 206105,192 206106,872 206107,907 206108,640 206109,1127 206110,784 206111,8537 206112,2671 206114,980 206115,424 206116,1655 206117,1531 206118,43203 206119,485 206120,298 206121,35 206121,104 206122,422 206123,422 206124,19010 206125,422 206126,422 206127,422 206128,422 206129,422 206130,676 206131,422 206132,422 206133,447 206134,2775 206135,422 206136,422 206137,179170 206138,422 206139,55849 206140,422 206141,1381 206142,442 206143,21442 206144,671 206144,2867 206144,2868 206145,142426 206146,1400 206147,104 206148,485 206149,298 206150,202 206151,289 206151,290 206151,94134 206152,255 206153,852 206154,1893 206155,192 206156,2775 206157,447 206158,50 206158,79 206158,147 206158,158 206159,1769 206160,259 206161,41 206162,206163 206164,30 206165,19010 206166,30 206167,34 206167,35 206168,21442 206169,467 206170,920 206171,83 206172,272 206173,697 206174,66297 206175,1860 206176,1858 206177,206178 206179,158 206180,668 206181,217 206182,2989 206183,141912 206184,138686 206185,175 206186,1983 206187,1968 206188,1381 206189,4760 206190,843 206191,187176 206192,571 206193,1659 206194,280 206194,17245 206195,493 206196,192 206196,242826 206197,485 206198,298 206199,206 206200,868 206201,920 206202,23287 206203,356 206204,206205 206206,206207 206206,219354 206208,330 206209,1238 206210,1285 206211,1402 206211,2367 206212,171 206213,1282 206214,536 206215,3003 206216,1452 206217,781 206218,1132 206219,1402 206220,138686 206221,31073 206222,175 206223,483 206224,932 206225,44 206226,2574 206227,1119 206228,1033 206229,355 206230,41 206230,431 206230,784 206230,1119 206230,1285 206230,7194 206230,185877 206231,1381 206232,141912 206233,3 206234,3555 206235,285 206237,1860 206238,1858 206239,1007 206240,195 206242,13 206243,3555 206244,175 206245,60576 206246,7768 206247,60576 206248,493 206249,60576 206250,60576 206252,346 206253,1220 206253,1222 206254,516 206255,252 206256,10 206257,60576 206258,179170 206259,13361 206260,736 206261,163 206262,278 206263,99 206264,500 206265,1052 206266,1882 206267,2775 206268,54 206269,1962 206270,77 206271,77 206272,1257 206273,1220 206273,1222 206274,252 206275,251 206277,50 206279,1381 206280,2620 206281,595 206282,596 206283,3507 206284,406 206285,151 206285,206 206285,690 206286,918 206287,358 206288,690 206289,1860 206290,1858 206291,63 206292,187176 206293,346 206294,142426 206295,444 206296,3209 206298,2421 206299,346 206300,292 206301,500 206302,1882 206303,1052 206304,2775 206305,54 206306,1962 206307,2646 206308,179170 206309,178 206310,222 206311,179170 206312,179170 206313,485 206314,298 206315,179170 206316,1381 206317,805 206318,30 206319,718 206320,1284 206321,252 206321,1220 206321,1222 206321,1512 206322,222 206323,3623 206324,179170 206325,515 206326,285 206327,179170 206328,805 206329,620 206330,1240 206331,30 206332,179170 206333,3367 206334,206335 206336,1181 206337,918 206338,694 206339,179170 206340,206341 206343,179170 206344,54 206345,2784 206346,422 206347,422 206348,179170 206349,179170 206350,985 206351,784 206352,30 206353,640 206354,516 206355,1019 206356,149 206357,179170 206358,1707 206359,273 206360,217 206361,179170 206362,179170 206363,1644 206364,1381 206365,1551 206365,3999 206366,179170 206367,299 206368,309 206368,310 206368,3039 206368,221292 206369,406 206370,1 206371,163 206372,179170 206373,3623 206374,179170 206375,142426 206376,179170 206377,805 206378,1284 206379,206380 206381,206380 206382,179170 206383,640 206384,640 206385,3623 206386,142426 206387,58 206387,104 206387,111 206387,292 206387,338 206387,441 206387,1140 206387,1238 206387,8276 206388,2379 206389,1368 206390,1085 206391,932 206392,1 206393,179170 206394,54 206395,179170 206396,179170 206397,138 206398,865 206399,557 206400,137 206401,179170 206402,4597 206403,88820 206404,179170 206405,577 206406,179170 206407,179170 206408,4193 206408,19227 206409,138686 206410,179170 206411,179170 206412,2379 206413,640 206414,875 206415,179170 206416,640 206417,1452 206417,1639 206417,2312 206417,3507 206418,392 206419,3413 206420,14453 206421,808 206422,273 206423,697 206424,205627 206425,1052 206426,151 206427,298 206428,485 206429,175 206430,1860 206431,1858 206432,179170 206433,918 206434,272 206435,206436 206437,35 206438,392 206438,697 206438,3260 206439,671 206440,30 206441,3623 206442,179170 206443,801 206443,1140 206444,83 206445,1007 206446,1210 206446,5366 206446,5440 206446,28072 206447,55849 206448,222 206449,1425 206450,141912 206451,179170 206452,1284 206453,104 206453,261 206453,596 206453,784 206453,805 206453,1285 206453,1368 206453,1888 206454,30 206455,447 206456,2775 206457,120 206457,1419 206458,34 206458,35 206458,634 206458,973 206458,5662 206459,1785 206460,1167 206461,589 206462,605 206463,1241 206464,1782 206465,1124 206466,973 206467,86 206468,2373 206469,95554 206470,206471 206472,179170 206473,30 206474,30 206475,809 206476,1556 206477,179170 206478,179170 206479,179170 206480,179170 206481,179170 206482,1252 206482,1253 206483,920 206484,179170 206485,179170 206486,179170 206487,179170 206488,179170 206489,1132 206490,1608 206491,346 206492,30 206493,179170 206494,30 206495,980 206496,179170 206497,179170 206498,217 206499,179170 206500,1227 206500,86416 206501,640 206502,179170 206503,179170 206504,3623 206505,179170 206506,179170 206507,518 206508,179170 206509,1285 206510,179170 206511,949 206512,1381 206513,557 206514,55849 206515,206516 206517,3623 206518,179170 206519,900 206519,1559 206520,355 206521,2620 206522,2590 206523,30 206524,179170 206525,1402 206526,206527 206528,179170 206529,179170 206530,278 206531,289 206531,290 206531,94134 206532,179170 206533,179170 206534,160 206535,160 206536,179170 206537,19010 206538,338 206539,302 206540,217 206541,179170 206543,269 206544,72 206545,2292 206546,433 206547,72 206548,332 206549,623 206549,1805 206550,34 206550,35 206550,72 206550,158 206550,217 206550,278 206550,313 206550,536 206550,631 206550,634 206550,660 206550,852 206550,949 206550,1133 206550,1274 206550,1313 206550,1466 206550,1467 206550,1718 206550,1881 206550,2224 206550,2244 206550,2646 206550,2779 206550,4637 206550,4903 206550,5326 206550,7092 206550,9015 206552,56 206552,192 206554,250 206554,1684 206555,346 206556,179170 206557,179170 206558,285 206559,250 206559,1684 206560,179170 206561,285 206562,424 206563,285 206564,83 206565,138686 206566,175 206567,805 206568,79 206569,1381 206570,147 206570,158 206570,195 206570,779 206570,1179 206570,5405 206570,19005 206571,1326 206572,1323 206573,408 206574,102 206575,179170 206576,30 206577,743 206578,355 206579,4691 206580,1007 206581,179170 206582,250 206582,1684 206583,389 206584,338 206585,1227 206585,86416 206586,489 206587,483 206588,179170 206589,142870 206590,145240 206591,206592 206591,239295 206593,313 206593,392 206593,406 206593,2045 206595,179170 206596,10 206597,83 206598,1821 206598,21736 206599,72 206600,366 206601,179170 206602,424 206603,30 206604,302 206605,179170 206606,206607 206608,862 206608,1001 206609,640 206610,128661 206611,841 206612,225 206613,302 206614,795 206615,179170 206616,30 206617,1381 206618,8884 206619,2590 206620,179170 206621,30 206622,302 206623,1085 206624,285 206625,626 206626,302 206627,4192 206627,4193 206628,217 206629,615 206630,1740 206631,323 206632,81 206633,479 206634,179170 206635,355 206636,206637 206638,30 206639,2146 206640,1359 206641,872 206642,179170 206643,179170 206644,1559 206645,179170 206646,206647 206648,3 206651,206652 206653,79 206654,83 206655,72 206656,344 206657,285 206659,206 206659,358 206659,611 206660,1220 206660,1222 206661,516 206662,252 206663,72 206664,44 206665,932 206666,422 206666,4597 206666,5405 206667,10 206668,179170 206669,805 206670,406 206671,179170 206672,302 206673,302 206674,781 206675,1132 206676,315 206676,671 206677,1707 206678,179170 206679,179170 206680,167 206680,1231 206680,2083 206681,149 206682,179170 206683,5 206683,827 206684,589 206685,302 206686,302 206687,302 206688,302 206689,422 206690,850 206691,843 206692,302 206693,179170 206694,179170 206695,302 206696,179170 206697,13 206698,179170 206699,158 206700,179170 206701,918 206702,179170 206703,302 206704,850 206705,850 206706,1181 206707,1474 206708,1572 206709,1805 206710,313 206711,389 206712,1122 206713,1381 206714,483 206715,179170 206716,1227 206716,86416 206717,850 206718,2146 206719,179170 206720,179170 206721,35 206722,1707 206723,366 206725,1220 206725,1222 206726,516 206727,252 206728,179170 206729,179170 206730,1220 206730,1222 206731,516 206732,252 206733,149 206734,60576 206735,1179 206736,113156 206737,360 206738,805 206739,302 206740,1119 206741,1479 206742,390 206743,302 206744,302 206745,10 206746,406 206747,206748 206747,223185 206747,231818 206747,264962 206749,425 206750,179170 206751,179170 206752,302 206753,8270 206754,473 206755,206756 206755,207985 206755,216718 206755,223235 206755,226967 206755,229353 206755,233052 206755,235460 206755,237372 206755,247621 206757,2779 206758,10 206759,179170 206760,58 206761,222 206763,179170 206764,142405 206765,206766 206767,179170 206768,206769 206768,219745 206768,226247 206768,229761 206770,1284 206771,206772 206773,1265 206773,1266 206774,179170 206775,302 206776,2411 206777,206778 206779,932 206780,179170 206781,285 206782,1012 206783,7155 206784,338 206785,206786 206787,63 206788,1368 206789,302 206790,805 206791,275 206792,179170 206793,269 206794,302 206796,206797 206798,179170 206799,41 206800,657 206801,294 206802,302 206803,206804 206805,1544 206806,1544 206807,843 206808,206809 206810,424 206811,355 206812,127158 206813,206814 206815,107 206816,2416 206816,2417 206817,292 206818,338 206819,298 206820,137 206820,5101 206821,1133 206822,3538 206823,83 206824,872 206825,366 206826,366 206828,32 206828,392 206829,179170 206830,406 206831,932 206832,206833 206834,1181 206835,158 206836,147 206837,285 206838,127158 206839,779 206840,206841 206842,79 206843,179170 206844,179170 206845,2045 206846,206847 206848,137 206849,503 206851,302 206852,149534 206853,138686 206854,175 206855,55849 206856,302 206857,302 206858,1096 206859,137 206860,192 206861,422 206862,4597 206863,137 206864,1531 206865,850 206866,302 206867,44 206868,5101 206868,55077 206869,2944 206870,1298 206871,302 206872,302 206873,994 206874,1773 206875,289 206875,290 206875,94134 206876,206772 206876,219203 206877,1608 206878,302 206879,1359 206880,760 206880,1631 206881,55849 206882,538 206883,302 206884,1821 206884,21736 206885,1571 206886,179170 206887,1608 206888,206889 206890,179170 206891,146952 206892,1749 206893,577 206894,252 206895,1220 206895,1222 206896,516 206897,19010 206898,788 206899,389 206900,389 206901,611 206902,483 206903,389 206904,136 206905,32 206905,392 206905,697 206905,1363 206906,302 206907,37088 206908,151 206909,557 206910,557 206911,795 206912,557 206913,2574 206914,30 206915,130 206916,302 206917,1707 206918,586 206919,1773 206920,932 206921,1287 206922,179170 206923,280 206923,17245 206924,775 206924,23437 206925,206926 206927,179170 206928,87 206929,79 206930,179170 206932,1149 206933,994 206934,142473 206935,179170 206936,447 206937,2775 206938,2017 206939,179170 206940,366 206942,302 206943,1220 206943,1222 206944,516 206945,252 206946,1220 206946,1222 206947,516 206948,252 206949,179170 206950,1634 206951,179170 206952,137 206953,206954 206956,192 206956,333 206956,406 206956,1634 206956,2931 206956,8811 206957,211 206958,779 206959,179170 206960,841 206961,292 206962,294 206963,296 206964,298 206965,179170 206966,4237 206966,182162 206967,179170 206968,285 206969,179170 206970,179170 206971,179170 206973,68 206974,206975 206976,1544 206977,195 206978,206979 206980,206981 206982,179170 206983,1381 206984,130 206985,83 206986,355 206987,525 206987,636 206987,1749 206988,287 206989,202 206989,1220 206989,1222 206989,1512 206989,72439 206990,206991 206992,206993 206994,206995 206996,1773 206997,81070 206998,392 206999,189128 207000,58 207000,389 207000,801 207000,1653 207001,1014 207002,179170 207003,1222 207003,1266 207003,1512 207003,72439 207003,78984 207004,611 207005,779 207006,581 207007,120 207008,2617 207009,1707 207010,590 207010,1419 207011,994 207012,718 207013,1749 207014,850 207016,1381 207017,862 207018,422 207019,422 207020,422 207021,422 207022,422 207023,422 207024,422 207025,422 207026,422 207027,422 207028,422 207029,55849 207030,81070 207031,3 207032,207033 207034,314 207035,571 207035,868 207036,3507 207037,920 207039,1381 207040,676 207041,467 207042,994 207043,349 207044,1707 207045,167 207045,299 207045,459 207045,1973 207045,2083 207045,3630 207045,9702 207045,15277 207045,22808 207045,72764 207045,76704 207045,147883 207045,160870 207045,171641 207045,176876 207045,227286 207045,229082 207045,250681 207046,1118 207047,784 207049,852 207050,328 207051,41 207051,104 207051,134 207051,784 207051,805 207051,1016 207051,1119 207051,1146 207052,433 207053,2557 207054,3623 207055,147 207056,1238 207057,217 207058,1224 207059,1452 207060,392 207061,657 207062,302 207063,1078 207064,252 207064,516 207064,925 207064,1220 207065,83 207066,392 207067,1 207068,83 207069,5101 207070,3258 207071,827 207072,323 207073,422 207074,2557 207075,8270 207076,1010 207077,147 207077,158 207078,2701 207079,609 207079,2205 207079,20813 207079,33424 207080,179170 207081,179170 207082,302 207083,596 207084,392 207084,433 207085,138686 207086,175 207088,2620 207090,1181 207091,4571 207092,5718 207093,493 207094,179170 207095,602 207096,1860 207097,1858 207098,2572 207099,1019 207100,433 207102,30 207103,781 207104,1132 207105,60576 207106,1381 207107,2411 207108,2782 207109,147 207110,142426 207111,19010 207112,447 207113,2775 207114,309 207114,310 207115,636 207116,30 207116,328 207117,71 207118,346 207119,179170 207120,333 207120,393 207120,980 207120,1388 207120,1531 207120,4455 207120,15573 207121,179170 207122,620 207122,779 207123,289 207123,290 207123,94134 207124,852 207125,671 207126,41 207126,120 207126,1353 207126,1608 207127,272 207128,8270 207129,577 207131,289 207131,290 207131,94134 207132,346 207133,623 207134,3695 207135,313 207136,30 207137,1572 207138,179170 207139,1096 207140,184 207141,920 207142,596 207142,784 207142,1052 207142,2416 207142,2417 207143,1432 207143,2674 207143,4571 207143,5826 207144,2784 207145,179170 207146,30 207147,106 207147,1370 207148,58 207148,534 207149,115659 207150,515 207151,30 207152,994 207152,1415 207153,991 207154,611 207155,918 207156,694 207157,406 207158,179170 207159,781 207160,805 207161,1132 207162,141912 207163,994 207164,1881 207166,211 207167,138686 207168,175 207169,30 207170,289 207170,290 207170,94134 207171,1188 207171,5310 207172,30 207173,179170 207174,179170 207175,356 207175,1284 207176,1556 207177,56 207178,422 207179,1179 207180,781 207181,1132 207183,536 207184,252 207185,252 207186,179170 207187,179170 207188,516 207189,1052 207190,1572 207191,2146 207192,269 207193,30 207195,146 207195,92476 207196,647 207197,344 207198,207199 207200,2620 207201,636 207202,179170 207203,781 207204,1132 207205,493 207206,179170 207207,179170 207208,1012 207209,1458 207210,179170 207211,35 207212,483 207213,179170 207214,592 207215,255 207216,179170 207217,179170 207218,500 207219,1052 207220,54 207221,1882 207222,2775 207223,1962 207224,179170 207225,202 207225,130897 207226,1479 207227,179170 207228,179170 207229,207230 207231,207230 207232,179170 207233,80266 207234,671 207235,30 207236,179170 207237,179170 207238,3623 207239,875 207241,536 207242,179170 207243,179170 207244,622 207245,536 207246,56 207247,422 207248,852 207249,272 207250,7 207250,3846 207251,179170 207252,179170 207253,192 207253,640 207254,992 207255,151 207256,179170 207257,179170 207258,63 207259,179170 207260,113156 207261,2105 207262,467 207262,868 207263,240 207263,4504 207264,204093 207265,1220 207265,1222 207266,516 207267,252 207268,207269 207270,207271 207272,2105 207273,179170 207274,147 207275,211 207276,207277 207278,179170 207279,2590 207280,264 207281,184 207282,278 207283,30 207284,179170 207285,83 207286,179170 207287,55849 207288,54 207289,179170 207290,30 207291,364 207292,179170 207293,1400 207293,2073 207294,179170 207295,107 207296,102 207297,1323 207298,408 207299,1326 207300,179170 207301,1465 207302,994 207303,179170 207304,179170 207305,179170 207306,179170 207307,406 207308,1718 207309,179170 207310,7416 207311,273 207312,179170 207313,179170 207314,1181 207315,179170 207316,179170 207318,179170 207319,207320 207321,406 207322,120 207323,250 207323,1684 207324,179170 207325,3630 207326,1707 207327,179170 207328,179170 207329,179170 207330,179170 207331,72 207332,179170 207333,3623 207334,179170 207335,247 207336,994 207337,389 207338,207339 207340,72 207341,179170 207342,79 207343,1449 207344,207345 207346,285 207347,250 207347,1684 207348,179170 207349,5440 207350,333 207351,264 207352,1381 207353,30 207354,3041 207355,1452 207356,1551 207357,1007 207358,4192 207358,4193 207359,1033 207360,50 207361,1381 207362,6303 207363,1639 207364,179170 207365,6027 207366,34 207366,35 207366,313 207366,2784 207366,14126 207367,577 207368,179170 207369,2373 207370,4355 207371,269 207372,3209 207373,179170 207374,179170 207375,179170 207376,143 207377,179170 207378,179170 207379,179170 207380,4597 207381,1556 207382,285 207383,2506 207383,8463 207383,142870 207384,179170 207385,179170 207386,2266 207387,179170 207388,179170 207389,3135 207390,137 207391,56 207392,422 207393,142870 207394,862 207395,119 207395,151 207395,13910 207396,483 207397,389 207398,83 207399,8463 207400,215 207401,72 207402,406 207403,200 207404,179170 207405,207406 207407,346 207408,424 207409,1544 207410,3623 207411,179170 207412,137 207413,1544 207414,4611 207415,4039 207416,1085 207417,588 207417,590 207418,779 207419,207420 207421,355 207422,1267 207423,179170 207425,1608 207426,1132 207427,1294 207428,179170 207429,79 207430,55849 207431,310 207431,3039 207432,179170 207433,779 207433,141912 207434,920 207435,1238 207436,310 207437,1803 207438,435 207438,516 207438,707 207438,162599 207440,422 207441,179170 207442,3623 207443,1962 207444,145751 207445,500 207446,1052 207447,1962 207448,54 207449,1882 207450,2775 207451,83 207452,1881 207453,179170 207454,134 207454,137 207455,185877 207455,189788 207456,581 207457,142426 207458,6487 207459,422 207460,422 207461,422 207462,422 207463,422 207464,422 207465,422 207466,422 207467,1544 207468,4611 207469,422 207470,422 207471,138686 207472,422 207473,175 207474,422 207475,433 207476,207477 207478,124668 207479,21442 207480,1181 207481,1893 207482,179170 207483,195 207485,217 207486,536 207486,1881 207486,2944 207487,147 207488,1544 207489,4611 207490,657 207491,2017 207492,30 207493,920 207494,467 207495,1849 207496,207497 207498,1425 207499,1479 207499,3585 207500,3148 207501,192 207501,3260 207502,346 207503,1007 207504,2572 207505,1425 207506,179170 207507,360 207508,1238 207509,972 207510,779 207511,206 207512,6556 207513,118336 207514,1452 207515,179170 207516,1326 207517,346 207518,179170 207519,620 207520,932 207521,346 207522,251 207524,83 207525,1912 207526,30 207527,467 207528,1631 207528,178576 207529,1265 207529,1266 207530,588 207530,590 207531,179170 207532,20359 207533,663 207534,1078 207534,4223 207535,189128 207536,596 207537,83 207538,19227 207539,207540 207541,207542 207543,346 207544,332 207545,346 207546,447 207547,2775 207548,189788 207550,192 207551,406 207552,622 207553,285 207554,1181 207555,1515 207556,393 207557,149 207558,1181 207559,44 207560,346 207561,455 207562,30 207563,141912 207564,258 207565,251 207566,577 207567,3623 207568,1284 207569,805 207570,141912 207571,163 207572,328 207573,994 207574,278 207575,1033 207576,1381 207577,309 207577,310 207578,301 207578,932 207578,1298 207578,1436 207579,360 207580,980 207581,179170 207582,8270 207583,1631 207584,346 207585,862 207586,155481 207587,264 207587,1509 207588,7360 207590,155481 207591,58 207592,55849 207593,620 207594,138686 207595,175 207596,192 207596,622 207596,1298 207596,2372 207597,557 207598,406 207599,1085 207600,189794 207601,142426 207602,272 207603,1619 207604,1001 207605,272 207606,4548 207607,779 207607,141912 207608,2411 207609,3 207610,217 207611,781 207612,1132 207613,1381 207614,1515 207615,779 207616,217 207617,72 207618,104 207618,136 207618,225 207618,557 207618,953 207618,1368 207618,1939 207618,5405 207618,7270 207619,1117 207620,346 207621,994 207622,784 207624,1474 207625,346 207626,30 207627,673 207628,781 207629,1132 207630,346 207631,346 207632,717 207633,918 207634,333 207635,349 207636,1449 207637,6027 207638,3003 207639,4611 207640,346 207641,179170 207642,649 207643,1181 207644,720 207645,588 207645,590 207646,781 207647,1132 207648,1474 207649,1572 207650,1805 207651,313 207652,346 207653,389 207654,1122 207655,346 207656,134 207657,8270 207658,1276 207659,207 207659,252 207659,292 207659,336 207659,849 207659,1293 207659,1992 207659,99732 207659,115474 207659,139929 207659,181063 207660,30 207661,3960 207662,30 207663,88820 207664,30 207665,1132 207666,21442 207667,781 207668,1132 207669,211 207669,269 207669,1014 207669,15609 207670,147 207671,1619 207672,175 207673,1181 207674,1381 207675,1132 207676,781 207677,779 207678,649 207679,1467 207680,138686 207681,175 207682,48 207682,1572 207682,2626 207683,360 207684,55849 207685,852 207686,515 207687,179170 207688,360 207689,83 207690,996 207691,141912 207692,302 207693,79 207694,1479 207695,149534 207696,159365 207697,1181 207698,195 207699,179170 207700,151 207701,515 207702,217 207702,1118 207703,781 207704,1132 207705,2116 207706,918 207707,264 207707,1381 207707,1893 207707,2312 207708,207709 207710,589 207711,557 207712,192 207713,179170 207714,1556 207715,179170 207716,30 207717,217 207718,1181 207719,994 207720,151 207721,346 207722,79 207723,37414 207724,179170 207725,356 207726,294 207727,336 207728,255 207729,30 207730,356 207731,107 207732,994 207733,1381 207734,83 207735,640 207736,179170 207737,58 207738,994 207739,46 207740,179170 207741,346 207742,278 207743,1284 207744,577 207745,2557 207746,7416 207747,2590 207748,147 207749,179170 207751,179170 207752,179170 207753,393 207754,850 207755,207756 207757,301 207757,3422 207758,179170 207759,4220 207760,2421 207761,72 207762,179170 207763,46 207764,58 207765,994 207766,23287 207767,72 207768,784 207769,1274 207769,2646 207770,1983 207771,483 207772,1078 207773,179170 207774,663 207774,1381 207774,1414 207774,2073 207774,3193 207774,141912 207775,1983 207776,179170 207777,179170 207778,30 207779,147 207780,179170 207781,217 207781,660 207781,852 207781,1133 207781,1466 207781,4637 207781,7092 207782,577 207783,1227 207783,86416 207784,179170 207785,179170 207786,784 207787,30 207788,467 207789,875 207790,875 207791,179170 207792,30 207793,179170 207794,30 207795,179170 207796,179170 207797,179170 207798,179170 207799,179170 207800,666 207801,30 207802,309 207802,310 207802,1400 207803,179170 207804,406 207805,8822 207806,179170 207807,179170 207808,179170 207809,720 207809,877 207809,907 207809,973 207809,1001 207809,1117 207809,1284 207809,1522 207809,1715 207809,1732 207809,1837 207809,2083 207809,2191 207809,9024 207810,330 207811,50 207812,179170 207813,390 207814,179170 207815,247 207815,2867 207815,2868 207816,994 207817,46 207818,58 207819,179170 207820,248 207821,30 207822,179170 207823,250 207823,1684 207824,285 207825,179170 207826,179170 207827,10 207828,72 207829,1212 207829,1282 207830,179170 207831,2373 207832,3538 207833,30331 207834,162599 207835,151 207836,278 207837,167 207837,392 207837,623 207837,1143 207837,1502 207837,1805 207837,2470 207837,6059 207837,19299 207837,46271 207837,90144 207837,160870 207837,161636 207837,199647 207837,207837 207837,219743 207837,231314 207837,234521 207837,243026 207837,243094 207837,258550 207837,259020 207837,259535 207838,259 207839,1332 207840,868 207841,3260 207842,1639 207843,179170 207844,285 207845,2048 207846,222 207847,179170 207848,207 207849,30 207850,493 207851,269 207852,179170 207853,2923 207854,179170 207855,30 207856,58 207857,994 207858,46 207859,79 207860,58 207861,46 207862,994 207863,179170 207864,179170 207865,312 207866,179170 207867,1326 207868,1323 207869,102 207870,408 207871,2424 207872,155481 207873,107 207874,179170 207875,179170 207876,179170 207877,179170 207878,179170 207879,72 207880,179170 207881,179170 207882,179170 207883,179170 207884,1363 207885,1181 207886,309 207886,310 207887,48 207888,1132 207889,179170 207890,872 207891,179170 207892,162599 207893,1429 207894,207895 207896,2779 207897,179170 207898,179170 207899,1983 207900,138686 207901,175 207902,1983 207903,1370 207904,2590 207905,1773 207906,302 207907,346 207908,2367 207909,406 207909,596 207910,4548 207911,19227 207912,179170 207913,843 207914,668 207916,1983 207917,179170 207918,207919 207920,2315 207921,390 207922,346 207923,269 207924,184 207925,99 207926,179170 207927,179170 207928,179170 207932,2506 207933,58 207934,994 207935,46 207936,179170 207937,222 207938,179170 207939,991 207940,752 207941,991 207942,652 207944,1143 207945,1305 207946,30 207947,179170 207948,968 207949,2105 207950,207951 207952,4571 207953,147 207954,424 207955,285 207956,179170 207957,179170 207958,30 207959,179170 207960,285 207961,4594 207962,250 207962,1684 207963,151 207963,663 207964,179170 207965,179170 207966,313 207967,313 207968,1133 207969,1467 207970,30 207971,13980 207972,390 207973,1010 207974,240 207975,406 207975,1181 207976,346 207977,179170 207978,179170 207979,48 207980,631 207981,1715 207982,179170 207983,1085 207984,77 207986,179170 207987,1467 207988,631 207989,179170 207990,1452 207991,13919 207992,312 207993,1544 207994,388 207995,146 207995,92476 207996,2424 207997,99 207998,30 207999,79 208000,301 208001,208002 208003,18790 208004,58 208005,994 208006,46 208007,355 208009,8270 208010,841 208011,1326 208012,2315 208013,2116 208014,1888 208014,7194 208015,1619 208016,1983 208017,1634 208018,273 208019,561 208020,1707 208021,217 208022,649 208023,784 208024,1001 208025,175 208026,433 208027,142870 208028,13980 208029,135 208029,23783 208030,292 208030,1688 208031,447 208032,2775 208033,179170 208034,179170 208035,171 208036,120 208037,1821 208037,21736 208038,179170 208039,2443 208040,485 208041,158 208041,89035 208042,208043 208042,209031 208042,210015 208044,208045 208044,208067 208044,208903 208046,208047 208048,208049 208048,210356 208050,104 208050,136 208050,225 208050,953 208050,1368 208050,1939 208050,5405 208050,7270 208051,208052 208053,208054 208053,211534 208055,208056 208055,210412 208057,422 208058,208059 208058,209425 208060,208061 208060,213141 208062,208063 208062,210273 208064,422 208065,208066 208065,211521 208068,208069 208068,210161 208070,422 208071,208072 208071,211188 208073,208074 208073,210193 208075,1572 208076,208077 208076,211594 208078,208079 208078,208785 208080,208081 208080,208511 208080,210928 208082,422 208083,208084 208085,208086 208085,210944 208087,208088 208087,211741 208089,422 208090,422 208091,208092 208091,211398 208093,208094 208095,208096 208097,208098 208099,208100 208101,422 208102,208103 208104,422 208105,208106 208105,208978 208107,208108 208109,208110 208111,208112 208111,210332 208113,208114 208113,209220 208115,208116 208117,208118 208117,210579 208119,208120 208119,208606 208119,210095 208121,208122 208123,208124 208123,208500 208125,208126 208125,209519 208127,208128 208129,208130 208131,208132 208131,208532 208133,208134 208133,209341 208135,208136 208135,208601 208135,209018 208135,209659 208137,422 208138,208139 208138,209522 208138,210826 208140,208141 208140,211556 208142,208143 208144,208145 208144,209390 208144,209465 208146,208147 208146,208740 208146,209217 208148,208149 208148,211423 208150,208151 208152,208153 208152,209566 208152,211349 208154,422 208155,422 208156,208157 208158,208159 208158,209975 208158,210512 208160,208161 208162,208163 208164,208165 208164,208318 208164,209319 208166,208167 208166,209447 208168,208169 208168,208867 208170,1368 208171,208172 208173,208174 208173,209767 208175,208176 208175,210169 208177,208178 208179,208180 208181,208182 208181,208776 208181,211137 208183,208184 208185,208186 208187,208188 208189,208190 208191,208192 208191,210590 208191,211229 208193,208194 208193,208325 208195,208196 208195,208206 208195,208803 208197,208198 208199,208200 208199,211601 208201,208202 208201,208884 208203,422 208204,208205 208204,209378 208204,211338 208204,211604 208207,208208 208207,208433 208207,209168 208209,208210 208209,210827 208209,211252 208211,208212 208213,208214 208215,208216 208215,210829 208217,208218 208217,208775 208219,208220 208219,211198 208221,208222 208223,208224 208223,209976 208225,208226 208227,208228 208227,208398 208227,211600 208229,208230 208231,179170 208232,208233 208234,208235 208236,208237 208236,208649 208236,209468 208236,210629 208238,208239 208238,208656 208240,208241 208240,210038 208242,208243 208242,210448 208244,208245 208246,208247 208248,208249 208250,208251 208252,208253 208254,208255 208256,208257 208256,208952 208256,210122 208258,208259 208260,208261 208262,208263 208262,208270 208264,208265 208266,208267 208268,208269 208271,208272 208273,208274 208275,208276 208277,208278 208277,208455 208277,210055 208277,211228 208279,208280 208281,208282 208283,208284 208283,210852 208285,208286 208285,209685 208285,209792 208287,1773 208288,208289 208290,208291 208290,208330 208290,208747 208292,208293 208292,208615 208292,209579 208292,211080 208294,208295 208296,208297 208296,209336 208298,208299 208298,209239 208300,208301 208302,208303 208302,211187 208304,208305 208306,208307 208308,208309 208310,208311 208310,210010 208312,208313 208314,208315 208316,208317 208316,210798 208319,208320 208321,208322 208323,208324 208326,208327 208326,209983 208328,208329 208328,210465 208328,211491 208328,211728 208331,208332 208333,208334 208333,211358 208335,208336 208335,209295 208337,208338 208337,209504 208339,208340 208341,422 208342,208343 208342,208709 208344,208345 208346,208347 208348,208349 208348,211193 208350,208351 208352,208353 208352,210146 208352,211055 208354,208355 208356,208357 208356,210927 208358,208359 208360,208361 208362,208363 208364,208365 208364,210406 208366,208367 208366,208860 208368,208369 208370,208371 208370,208560 208372,208373 208374,208375 208374,211765 208376,208377 208378,208379 208380,208381 208380,209795 208382,208383 208384,208385 208384,211439 208386,208387 208388,208389 208390,208391 208390,210660 208392,208393 208394,208395 208396,208397 208399,208400 208399,211341 208401,208402 208401,210257 208401,211047 208401,211429 208403,208404 208405,208406 208407,208408 208409,208410 208409,211382 208411,208412 208413,208414 208415,208416 208417,208418 208419,208420 208419,210353 208421,208422 208421,208887 208421,210296 208423,208424 208423,209087 208425,208426 208425,209379 208427,208428 208429,208430 208431,208432 208434,208435 208436,208437 208436,208460 208438,208439 208440,208441 208443,208444 208443,210407 208445,208446 208447,208448 208447,210934 208449,208450 208451,208452 208451,211764 208453,208454 208453,209274 208453,211197 208456,208457 208456,211142 208458,208459 208458,209092 208458,209943 208458,210773 208461,208462 208461,211722 208463,208464 208465,208466 208465,211385 208467,208468 208467,211618 208469,208470 208471,208472 208473,208474 208475,208476 208477,208478 208477,211450 208479,208480 208481,208482 208481,213134 208483,208484 208483,210035 208483,211567 208483,211800 208485,1007 208486,208487 208486,210761 208488,208489 208490,208491 208490,209085 208492,208493 208492,209919 208494,208495 208496,208497 208498,208499 208498,208680 208498,209088 208501,208502 208501,211570 208503,208504 208503,211591 208505,208506 208507,208508 208509,208510 208512,208513 208514,208515 208516,208517 208518,208519 208518,210976 208520,208521 208522,208523 208522,211642 208524,208525 208526,208527 208528,208529 208530,208531 208533,208534 208535,208536 208535,209086 208537,208538 208537,210341 208539,208540 208539,209838 208541,208542 208543,208544 208545,208546 208545,208796 208545,209015 208547,208548 208549,208550 208549,209787 208552,208553 208554,208555 208554,209698 208556,208557 208558,208559 208558,209089 208561,208562 208561,209486 208561,210996 208563,208564 208563,210935 208563,211479 208565,208566 208567,208568 208567,211447 208569,208570 208569,211533 208571,208572 208571,209572 208573,208574 208573,211157 208575,208576 208577,208578 208577,209893 208579,208580 208581,208582 208583,208584 208583,208999 208583,209542 208585,208586 208587,208588 208587,210979 208589,208590 208589,208918 208591,208592 208593,208594 208593,211693 208595,208596 208597,208598 208599,208600 208602,208603 208604,208605 208604,209496 208604,210140 208607,208608 208609,208610 208611,208612 208613,208614 208616,208617 208616,210131 208618,208619 208618,211059 208620,208621 208620,210955 208622,208623 208622,210376 208622,211557 208624,202 208625,208626 208627,208628 208627,211104 208629,208630 208631,208632 208631,210664 208633,208634 208633,208850 208635,208636 208635,210436 208637,208638 208637,210284 208639,208640 208641,208642 208641,208841 208643,208644 208643,211015 208645,208646 208647,208648 208647,208967 208650,208651 208650,209695 208650,211696 208652,208653 208654,208655 208654,208766 208654,210630 208657,208658 208659,208660 208661,208662 208661,210342 208663,208664 208663,208828 208663,209864 208665,208666 208667,208668 208670,208671 208670,210758 208670,211202 208672,208673 208674,208675 208674,210119 208674,210172 208674,211515 208676,208677 208678,208679 208681,208682 208683,208684 208685,208686 208687,208688 208689,208690 208691,208692 208693,208694 208693,210750 208695,208696 208697,208698 208699,208700 208699,208855 208699,210499 208701,208702 208701,209251 208701,209610 208703,208704 208703,209053 208703,209060 208705,208706 208707,208708 208710,208711 208710,211607 208712,208713 208714,208715 208714,209384 208716,208717 208718,208719 208720,208721 208720,209704 208720,211641 208722,208723 208724,208725 208726,208727 208728,208729 208730,208731 208730,208840 208732,208733 208732,209171 208734,208735 208734,210068 208734,210755 208734,211282 208736,208737 208736,209875 208738,208739 208741,208742 208743,208744 208745,208746 208745,210183 208748,208749 208750,208751 208752,208753 208752,208890 208752,210748 208754,208755 208754,209036 208756,208757 208756,209870 208758,208759 208758,208953 208760,208761 208762,208763 208762,209898 208764,208765 208764,209703 208767,208768 208769,208770 208769,211790 208771,208772 208771,209395 208771,210667 208773,208774 208777,208778 208777,209636 208777,211321 208779,208780 208779,208960 208781,208782 208781,209054 208781,211309 208783,208784 208783,208833 208783,210270 208783,210883 208783,211357 208783,211560 208786,208787 208788,208789 208790,208791 208790,209991 208792,208793 208794,208795 208797,208798 208799,208800 208799,208939 208801,208802 208801,211458 208804,208805 208806,208807 208806,210442 208808,208809 208810,208811 208812,208813 208814,208815 208816,208817 208816,211727 208818,208819 208820,208821 208820,210564 208822,208823 208824,208825 208826,208827 208829,208830 208831,208832 208831,210408 208831,211730 208831,211760 208834,208835 208834,211523 208836,208837 208836,210236 208838,208839 208838,210043 208838,210897 208842,208843 208842,209055 208842,209950 208844,208845 208846,208847 208846,211670 208848,208849 208848,210409 208851,208852 208851,210846 208853,208854 208856,208857 208858,208859 208861,208862 208863,208864 208863,209884 208865,208866 208868,208869 208870,208871 208870,209764 208872,208873 208872,209299 208874,208875 208874,211799 208876,208877 208876,211088 208878,208879 208880,208881 208882,208883 208885,208886 208888,208889 208888,209292 208891,208892 208893,208894 208895,208896 208895,209692 208895,210511 208897,208898 208899,208900 208899,211328 208901,208902 208904,208905 208904,209824 208906,208907 208906,211134 208908,208909 208910,208911 208910,209571 208912,208913 208912,209298 208914,208915 208914,211561 208916,208917 208916,210200 208919,208920 208921,208922 208923,208924 208925,208926 208925,210287 208927,208928 208929,208930 208931,208932 208933,208934 208935,208936 208935,209008 208937,208938 208937,209328 208940,208941 208942,208943 208944,208945 208944,209934 208946,208947 208948,208949 208950,208951 208954,208955 208956,208957 208958,208959 208958,209335 208958,211732 208961,208962 208961,209389 208963,208964 208963,209487 208965,208966 208968,208969 208970,208971 208970,210464 208972,208973 208974,208975 208974,209938 208976,208977 208979,208980 208979,211342 208981,208982 208983,208984 208983,209821 208985,208986 208985,210710 208987,208988 208987,209454 208987,211036 208989,208990 208989,209545 208991,208992 208991,210879 208993,208994 208993,211271 208993,211505 208995,208996 208997,208998 209000,209001 209002,209003 209004,209005 209006,209007 209009,209010 209011,209012 209011,209858 209013,209014 209016,209017 209019,209020 209021,209022 209023,209024 209023,210739 209025,209026 209025,209987 209025,210385 209027,209028 209029,209030 209032,209033 209034,209035 209037,209038 209037,209755 209039,209040 209041,209042 209043,209044 209045,209046 209045,209625 209047,209048 209049,209050 209049,211135 209049,211474 209051,209052 209051,211196 209056,209057 209056,211778 209058,209059 209061,209062 209063,209064 209065,209066 209067,209068 209069,209070 209071,209072 209073,209074 209075,209076 209075,209105 209075,209830 209077,209078 209077,209439 209077,210247 209079,209080 209079,209800 209081,209082 209083,209084 209090,209091 209090,210705 209093,209094 209093,209137 209095,209096 209097,209098 209097,211280 209097,211283 209097,211352 209099,209100 209101,209102 209103,209104 209106,209107 209106,209230 209106,211281 209108,58 209108,1140 209108,2443 209109,209110 209111,209112 209111,209135 209113,209114 209113,211573 209115,209116 209117,209118 209119,209120 209121,209122 209121,210252 209121,210329 209123,209124 209123,211150 209125,209126 209127,209128 209129,209130 209131,209132 209133,209134 209136,893 209138,209139 209138,209142 209140,209141 209140,211364 209143,209144 209143,210747 209145,209146 209147,209148 209147,209300 209147,211453 209149,179170 209150,209151 209152,209153 209152,209570 209154,209155 209154,209569 209154,209624 209156,209157 209158,209159 209160,209161 209162,209163 209164,209165 209166,209167 209166,210292 209169,209170 209172,209173 209174,209175 209176,209177 209178,209179 209180,209181 209182,209183 209184,209185 209184,209444 209186,209187 209186,210956 209188,209189 209190,209191 209190,209227 209192,209193 209194,209195 209196,209197 209196,209248 209196,211660 209198,209199 209200,209201 209202,1381 209203,209204 209205,209206 209207,209208 209209,209210 209209,209289 209211,209212 209211,210190 209213,209214 209215,209216 209215,209499 209218,209219 209221,209222 209223,209224 209223,211165 209225,209226 209228,209229 209231,209232 209233,209234 209233,211044 209235,209236 209235,209613 209237,209238 209237,209820 209240,209241 209242,209243 209242,211056 209244,209245 209244,211209 209244,211661 209246,209247 209249,209250 209249,210156 209249,211166 209252,209253 209252,211681 209254,209255 209256,209257 209258,209259 209260,209261 209262,209263 209264,209265 209264,209398 209266,209267 209268,209269 209270,209271 209272,209273 209275,209276 209277,209278 209279,209280 209279,210048 209281,209282 209283,209284 209283,209510 209283,210825 209283,211093 209283,211731 209285,209286 209287,209288 209287,210638 209290,209291 209290,210788 209293,209294 209293,211659 209293,211677 209296,209297 209301,209302 209301,209408 209303,209304 209305,209306 209305,210619 209307,209308 209307,210795 209309,209310 209309,210506 209311,209312 209313,209314 209313,210164 209313,210828 209315,209316 209315,209942 209317,209318 209317,210386 209320,209321 209322,209323 209324,209325 209326,209327 209329,209330 209329,209825 209331,209332 209331,210109 209331,211583 209333,209334 209333,211687 209337,209338 209337,209899 209337,213118 209339,209340 209342,209343 209342,211522 209344,209345 209346,209347 209348,209349 209350,209351 209352,209353 209354,209355 209354,209922 209356,209357 209358,209359 209360,209361 209362,209363 209362,210075 209362,210808 209364,209365 209366,209367 209368,209369 209368,209889 209370,209371 209370,210116 209372,209373 209374,209375 209376,209377 209376,210854 209380,209381 209380,209438 209382,209383 209385,209386 209387,209388 209391,209392 209393,209394 209396,209397 209399,209400 209399,209817 209401,217 209402,209403 209402,211258 209404,209405 209404,210632 209404,211306 209406,209407 209409,209410 209411,209412 209413,209414 209415,209416 209417,209418 209417,209890 209419,209420 209419,210377 209421,209422 209423,209424 209423,209843 209426,209427 209428,209429 209430,209431 209432,209433 209434,209435 209436,209437 209436,211752 209440,209441 209440,210187 209442,209443 209442,211136 209445,209446 209448,209449 209450,209451 209452,209453 209452,211199 209455,209456 209455,211101 209457,209458 209459,209460 209459,211768 209461,209462 209461,211543 209463,209464 209463,210980 209466,209467 209466,209509 209466,210912 209469,209470 209471,179170 209472,209473 209474,209475 209476,209477 209478,209479 209478,210147 209480,209481 209482,209483 209482,210768 209484,209485 209484,209782 209488,209489 209490,209491 209490,210737 209490,211052 209492,209493 209492,210652 209494,209495 209497,209498 209500,209501 209502,209503 209505,209506 209507,209508 209511,209512 209511,209678 209513,209514 209515,209516 209517,209518 209520,209521 209523,209524 209523,209935 209523,211434 209525,209526 209527,209528 209529,301 209530,209531 209530,210398 209532,209533 209534,209535 209536,209537 209536,210995 209538,209539 209538,209939 209538,211114 209540,209541 209543,209544 209546,209547 209546,210920 209546,210929 209548,209549 209548,209990 209550,209551 209550,210494 209550,211037 209552,209553 209554,209555 209554,210853 209556,209557 209556,210137 209556,213142 209558,209559 209558,210096 209560,209561 209560,210060 209562,209563 209564,209565 209564,210909 209567,209568 209573,209574 209575,209576 209575,211041 209577,209578 209580,209581 209582,209583 209584,209585 209584,210445 209586,209587 209586,211490 209588,209589 209588,209731 209590,209591 209590,210557 209592,209593 209594,209595 209594,211257 209596,209597 209598,209599 209598,210295 209600,209601 209602,209603 209602,209912 209602,210639 209602,210647 209602,210774 209602,211340 209604,209605 209606,209607 209608,209609 209608,210476 209611,209612 209614,209615 209614,210764 209616,209617 209618,209619 209620,209621 209622,209623 209622,211004 209622,211433 209626,209627 209626,210536 209628,209629 209628,210997 209630,209631 209630,210646 209632,209633 209632,210578 209634,209635 209634,211343 209637,209638 209639,209640 209641,209642 209641,211240 209643,209644 209643,210274 209645,209646 209647,209648 209649,209650 209651,209652 209653,209654 209655,209656 209657,209658 209657,210824 209660,209661 209660,211303 209662,209663 209664,209665 209666,209667 209666,211426 209668,209669 209670,209671 209670,210938 209670,211028 209672,209673 209674,209675 209674,211478 209676,209677 209679,209680 209679,211021 209681,209682 209683,209684 209683,210321 209683,210822 209686,209687 209686,211237 209688,209689 209690,209691 209690,209869 209690,211701 209693,209694 209696,209697 209699,209700 209701,209702 209701,211376 209701,211435 209705,209706 209707,209708 209709,209710 209711,209712 209713,209714 209713,209863 209715,209716 209715,210926 209717,209718 209717,209777 209719,209720 209721,209722 209723,209724 209723,210243 209725,209726 209725,211553 209725,211647 209727,209728 209729,209730 209732,209733 209734,1276 209734,3698 209735,209736 209735,211363 209737,209738 209737,210900 209739,209740 209739,210369 209739,211391 209741,209742 209743,209744 209743,211171 209745,209746 209747,209748 209749,209750 209751,209752 209751,210380 209753,209754 209756,209757 209756,209923 209756,210227 209758,209759 209758,210088 209758,213125 209760,209761 209760,209984 209760,211409 209762,209763 209762,210657 209765,209766 209765,210061 209765,210674 209768,209769 209770,163 209771,209772 209771,210434 209773,209774 209775,209776 209778,209779 209780,209781 209780,210435 209783,209784 209783,210324 209785,209786 209788,209789 209790,209791 209793,209794 209796,209797 209798,209799 209801,209802 209801,210389 209803,209804 209803,210009 209805,209806 209805,211525 209807,209808 209807,211083 209809,209810 209809,210921 209809,211022 209811,209812 209813,209814 209815,209816 209815,210184 209818,209819 209818,210663 209822,209823 209826,209827 209826,213096 209828,209829 209831,209832 209833,209834 209835,302 209836,209837 209839,209840 209839,210614 209841,209842 209844,209845 209846,209847 209848,209849 209850,209851 209852,209853 209854,209855 209856,209857 209859,209860 209861,209862 209865,209866 209867,209868 209867,211359 209867,211393 209871,209872 209873,209874 209873,210575 209876,209877 209876,210855 209876,210983 209878,209879 209878,210136 209880,209881 209880,210237 209882,209883 209885,209886 209885,210807 209887,209888 209891,209892 209891,211301 209894,209895 209894,210880 209896,209897 209900,209901 209902,209903 209904,209905 209904,210423 209906,209907 209906,211566 209908,209909 209910,209911 209913,209914 209915,209916 209917,209918 209920,209921 209924,209925 209926,209927 209926,211700 209928,209929 209928,210489 209930,209931 209930,211598 209932,209933 209936,209937 209940,209941 209944,209945 209944,211322 209946,209947 209948,209949 209951,209952 209953,209954 209953,211544 209953,213113 209955,209956 209957,209958 209959,209960 209961,209962 209963,209964 209965,209966 209967,209968 209967,210012 209969,209970 209971,209972 209971,210868 209973,209974 209973,210405 209977,209978 209977,211302 209979,209980 209979,210544 209979,210712 209981,209982 209981,211365 209985,209986 209988,209989 209992,209993 209994,209995 209996,179170 209997,209998 209999,210000 210001,210002 210003,210004 210005,210006 210007,210008 210013,210014 210013,210626 210016,210017 210018,210019 210018,211587 210020,210021 210022,210023 210024,210025 210026,210027 210026,211623 210029,210030 210029,210915 210031,210032 210031,211532 210033,210034 210036,210037 210036,211471 210039,210040 210041,210042 210044,210045 210046,210047 210046,211621 210049,210050 210051,210052 210053,210054 210056,210057 210058,210059 210058,210587 210062,210063 210062,211038 210064,210065 210064,211308 210064,213103 210066,210067 210069,210070 210071,210072 210071,211167 210073,210074 210076,210077 210078,210079 210078,210931 210080,210081 210082,210083 210084,210085 210086,210087 210086,210246 210089,210090 210089,210441 210091,210092 210093,210094 210093,211464 210097,210098 210099,210100 210101,210102 210103,210104 210105,210106 210105,210143 210107,210108 210107,210783 210110,210111 210110,211417 210112,210113 210114,210115 210117,210118 210117,210277 210120,210121 210123,210124 210125,210126 210127,210128 210129,210130 210132,210133 210134,210135 210134,211501 210138,210139 210141,210142 210141,211158 210144,210145 210148,210149 210148,211272 210150,210151 210152,210153 210152,211339 210154,210155 210157,210158 210159,210160 210159,211168 210162,210163 210162,210568 210162,211489 210165,210166 210167,210168 210170,210171 210173,210174 210175,210176 210175,210240 210177,210178 210179,210180 210181,210182 210185,210186 210185,210714 210185,211649 210188,210189 210191,210192 210191,211298 210194,210195 210194,211562 210196,210197 210196,211337 210198,210199 210201,210202 210203,210204 210205,210206 210207,210208 210209,210210 210209,211671 210211,210212 210213,210214 210213,210345 210215,210216 210217,210218 210219,210220 210221,210222 210221,210466 210223,210224 210225,210226 210228,210229 210228,210316 210230,210231 210230,210611 210230,211697 210232,210233 210234,210235 210238,210239 210241,210242 210241,210370 210244,210245 210248,210249 210250,210251 210253,210254 210253,211190 210255,210256 210258,210259 210260,210261 210262,210263 210264,210265 210266,210267 210268,210269 210271,210272 210275,210276 210278,210279 210278,210746 210280,210281 210280,210309 210282,210283 210282,211589 210285,210286 210288,210289 210290,210291 210293,210294 210297,210298 210299,210300 210301,210302 210301,211230 210303,210304 210305,210306 210307,210308 210310,210311 210312,210313 210314,210315 210314,211795 210317,210318 210319,210320 210322,210323 210325,210326 210327,210328 210327,210350 210330,210331 210330,211565 210333,210334 210335,210336 210337,210338 210337,210504 210339,210340 210339,210582 210339,211375 210343,210344 210343,210738 210343,211494 210346,210347 210348,210349 210351,210352 210354,210355 210357,210358 210359,210360 210361,210362 210363,210364 210365,210366 210367,210368 210367,211346 210371,210372 210373,210374 210373,211098 210375,179170 210378,210379 210378,210467 210381,210382 210383,210384 210387,210388 210390,210391 210390,211634 210392,210393 210394,210395 210396,210397 210396,211465 210399,210400 210399,210749 210399,210858 210399,211686 210401,210402 210403,210404 210410,210411 210413,210414 210415,210416 210417,210418 210419,210420 210419,210635 210421,210422 210424,210425 210426,210427 210428,210429 210430,210431 210432,210433 210432,210947 210432,211470 210437,210438 210437,210813 210439,210440 210443,210444 210446,210447 210449,210450 210449,211096 210451,210452 210453,210454 210455,210456 210457,1085 210458,210459 210460,210461 210462,210463 210468,210469 210470,210471 210472,210473 210474,210475 210477,210478 210477,211388 210479,210480 210481,210482 210481,210543 210483,210484 210483,210986 210485,210486 210485,211672 210487,210488 210487,210966 210490,210491 210492,210493 210495,210496 210495,211516 210497,210498 210500,210501 210502,210503 210505,272 210507,210508 210509,210510 210513,210514 210515,210516 210515,211366 210517,210518 210519,210520 210521,210522 210523,210524 210525,360 210525,2617 210526,210527 210526,210565 210528,210529 210530,210531 210530,211290 210532,210533 210532,210930 210534,210535 210534,211231 210537,210538 210539,210540 210541,210542 210545,210546 210547,210548 210549,210550 210549,210851 210551,210552 210553,210554 210555,210556 210558,210559 210560,210561 210562,210563 210566,210567 210566,211273 210569,210570 210571,210572 210571,211097 210573,210574 210576,210577 210580,210581 210583,210584 210585,210586 210588,210589 210588,211241 210591,210592 210593,210594 210595,210596 210597,210598 210599,210600 210601,210602 210603,210604 210603,210631 210603,210711 210605,210606 210607,210608 210609,210610 210612,210613 210615,210616 210617,210618 210620,210621 210622,210623 210622,211035 210624,210625 210627,210628 210633,210634 210636,210637 210640,210641 210642,210643 210644,210645 210648,210649 210650,210651 210650,210952 210653,210654 210655,210656 210658,210659 210658,211310 210661,210662 210665,210666 210668,210669 210670,210671 210672,210673 210675,210676 210677,210678 210679,210680 210679,211418 210681,210682 210683,210684 210685,210686 210687,210688 210689,210690 210691,210692 210691,211761 210693,210694 210695,210696 210697,210698 210699,210700 210701,210702 210703,210704 210703,211016 210706,210707 210706,211147 210708,210709 210713,179170 210715,210716 210715,211060 210717,210718 210717,210823 210719,210720 210721,210722 210723,210724 210725,210726 210727,210728 210729,210730 210731,210732 210733,210734 210733,211678 210735,210736 210740,210741 210740,211420 210742,210743 210744,210745 210751,210752 210751,210867 210751,211484 210751,211547 210753,210754 210756,210757 210759,210760 210762,210763 210765,210766 210767,1381 210769,210770 210771,210772 210775,210776 210777,210778 210779,210780 210781,210782 210784,210785 210786,210787 210789,210790 210791,210792 210791,211113 210793,210794 210796,210797 210799,210800 210801,210802 210801,211588 210803,210804 210805,210806 210805,211419 210809,210810 210811,210812 210814,210815 210816,210817 210818,210819 210818,211377 210820,210821 210820,211119 210830,210831 210832,210833 210834,210835 210836,210837 210838,210839 210838,211172 210840,210841 210842,210843 210842,210939 210844,210845 210847,210848 210849,210850 210856,210857 210859,210860 210859,211749 210861,210862 210863,210864 210865,210866 210865,211073 210869,210870 210871,210872 210871,211438 210873,210874 210875,210876 210877,210878 210881,210882 210884,210885 210886,210887 210886,211246 210888,210889 210890,210891 210892,138686 210893,210894 210895,210896 210898,210899 210901,210902 210903,210904 210903,211577 210905,210906 210907,210908 210910,210911 210910,211685 210913,210914 210916,210917 210918,210919 210918,211336 210922,210923 210924,210925 210932,210933 210936,210937 210940,210941 210942,210943 210942,211729 210945,210946 210948,210949 210950,210951 210953,210954 210957,210958 210957,211263 210959,99 210960,210961 210960,211572 210962,210963 210964,210965 210967,210968 210969,210970 210971,210972 210973,344 210974,210975 210977,210978 210981,210982 210984,210985 210987,210988 210989,210990 210991,210992 210993,210994 210998,210999 211000,211001 211002,211003 211005,211006 211007,211008 211009,211010 211011,211012 211013,211014 211017,211018 211019,211020 211023,211024 211025,330 211026,211027 211029,211030 211031,211032 211033,211034 211039,211040 211039,211291 211042,211043 211045,211046 211045,211307 211048,211049 211050,211051 211053,211054 211053,211682 211057,211058 211061,211062 211061,211475 211063,211064 211063,211232 211063,211249 211065,211066 211067,211068 211069,211070 211071,211072 211074,211075 211076,211077 211078,211079 211081,211082 211084,211085 211086,211087 211089,211090 211091,211092 211094,211095 211099,211100 211102,211103 211105,211106 211107,211108 211109,211110 211111,211112 211115,211116 211115,211690 211117,211118 211120,211121 211122,211123 211124,211125 211126,211127 211128,211129 211130,211131 211132,211133 211138,211139 211140,211141 211140,211412 211143,211144 211145,211146 211148,211149 211148,213091 211151,211152 211153,211154 211155,211156 211159,211160 211161,211162 211161,211775 211163,211164 211169,211170 211173,211174 211175,211176 211177,211178 211179,211180 211179,211614 211181,211182 211183,211184 211185,211186 211185,211654 211189,932 211191,211192 211194,211195 211200,211201 211203,211204 211205,211206 211207,211208 211210,211211 211212,211213 211212,211595 211214,211215 211216,211217 211218,211219 211220,211221 211222,211223 211224,211225 211226,211227 211233,211234 211235,211236 211238,211239 211242,211243 211244,211245 211247,211248 211250,211251 211253,211254 211255,211256 211255,211432 211259,211260 211261,211262 211264,211265 211266,211267 211268,211269 211270,366 211274,211275 211276,211277 211278,211279 211284,211285 211286,211287 211288,211289 211292,211293 211292,211571 211294,211295 211296,211297 211299,211300 211304,211305 211311,211312 211313,211314 211315,211316 211317,211318 211319,211320 211323,211324 211325,211326 211327,1467 211329,360 211330,211331 211332,211333 211334,211335 211334,211548 211344,211345 211347,211348 211347,211721 211350,211351 211353,211354 211355,211356 211360,285 211361,211362 211367,211368 211369,211370 211371,211372 211373,211374 211378,211379 211380,211381 211383,211384 211386,211387 211389,211390 211389,211599 211392,875 211394,211395 211394,211617 211396,211397 211396,211622 211399,211400 211399,213108 211401,211402 211403,211404 211405,211406 211407,211408 211410,211411 211413,211414 211415,211416 211421,211422 211424,211425 211427,211428 211430,211431 211436,211437 211440,211441 211442,179170 211443,211444 211445,211446 211448,211449 211451,211452 211454,211455 211456,211457 211459,211460 211461,433 211462,211463 211466,211467 211468,211469 211472,211473 211476,211477 211480,211481 211482,211483 211485,211486 211487,211488 211492,211493 211495,211496 211497,211498 211497,211590 211499,211500 211502,211503 211504,994 211506,996 211507,211508 211507,211648 211509,211510 211511,211512 211513,211514 211517,211518 211519,211520 211524,994 211526,211527 211528,211529 211530,211531 211535,211536 211537,211538 211539,211540 211541,211542 211545,211546 211549,211550 211551,211552 211554,211555 211558,211559 211563,211564 211568,211569 211574,1274 211575,211576 211578,211579 211580,55849 211581,211582 211585,211586 211592,211593 211596,211597 211602,211603 211605,211606 211608,211609 211610,211611 211612,211613 211615,211616 211619,211620 211624,211625 211626,211627 211628,211629 211630,211631 211630,211763 211632,211633 211635,211636 211637,211638 211639,211640 211643,211644 211645,211646 211650,211651 211652,211653 211655,211656 211657,211658 211662,211663 211664,211665 211666,211667 211668,211669 211673,211674 211675,211676 211679,211680 211683,211684 211688,211689 211691,211692 211694,211695 211698,211699 211702,211703 211704,422 211705,994 211706,206 211708,200 211709,56 211710,994 211712,875 211713,588 211713,590 211714,442 211715,179170 211716,44 211717,171 211718,346 211719,1860 211720,1858 211723,211724 211725,211726 211733,211734 211735,2867 211735,2868 211736,211737 211738,1452 211739,211740 211742,83 211743,211744 211746,141912 211747,211748 211750,211751 211753,211754 211755,211756 211757,302 211758,211759 211762,1085 211766,211767 211769,211770 211771,211772 211773,211774 211776,211777 211779,211780 211781,360 211782,211783 211784,211785 211786,211787 211788,211789 211791,211792 211793,211794 211797,366 211798,347 211801,211802 211803,211804 211805,211806 211807,211808 211809,211810 211811,175 211812,30 211813,1983 211814,55849 211815,75912 211817,1019 211817,1274 211818,204093 211819,875 211820,124668 211821,346 211822,406 211823,3094 211824,875 211825,911 211826,252 211827,160 211828,1238 211829,805 211830,666 211831,360 211832,217 211833,285 211834,72 211835,58 211836,46 211837,283 211838,1718 211839,179170 211840,312 211841,30 211842,1551 211843,1465 211844,37088 211845,179170 211846,2626 211847,1368 211848,179170 211849,206 211851,994 211852,294 211853,1983 211854,163 211857,55849 211858,55849 211859,55849 211860,55849 211861,217 211862,925 211863,104 211864,233 211865,1881 211866,233 211867,233 211868,516 211869,433 211870,179170 211871,1368 211873,406 211875,1122 211876,179170 211877,406 211878,660 211878,1775 211878,171294 211879,151 211880,433 211881,76096 211882,1293 211884,1860 211885,1858 211886,1522 211887,372 211888,101473 211889,19 211889,313 211889,1571 211889,1618 211889,2266 211889,68173 211889,211889 211889,213089 211889,220928 211889,221011 211890,333 211891,48 211892,30331 211893,781 211894,1132 211895,1033 211897,273 211898,4 211898,5 211898,1984 211899,124668 211900,781 211901,1132 211902,875 211903,3623 211905,55849 211906,714 211907,2205 211908,2367 211909,4260 211910,30 211911,162599 211912,620 211913,179170 211914,151 211915,162599 211916,3623 211917,406 211919,852 211920,3623 211921,349 211921,452 211921,770 211921,784 211923,19010 211924,1220 211924,1222 211925,252 211926,516 211927,505 211927,809 211928,215 211929,875 211930,707 211931,868 211932,1235 211932,1335 211932,2045 211932,2209 211932,3474 211932,8788 211932,21711 211932,29253 211932,29294 211933,1127 211935,28107 211935,31106 211935,175486 211935,196739 211935,244096 211937,107 211938,779 211939,1515 211940,433 211941,1882 211942,875 211943,142870 211944,1294 211945,3115 211946,852 211947,211 211948,13661 211949,179170 211950,2979 211951,71 211952,30 211953,333 211954,2379 211955,202 211956,247 211957,269 211958,1033 211959,2373 211960,918 211961,56 211962,422 211963,515 211964,81 211965,138686 211966,175 211967,120 211968,640 211969,211970 211971,663 211972,1019 211973,1462 211973,8537 211974,233 211975,920 211976,149 211978,1235 211978,1335 211978,2045 211978,2209 211978,3474 211978,8788 211978,21711 211978,29253 211978,29294 211979,255 211980,784 211981,356 211982,620 211983,1556 211984,467 211985,1608 211986,1132 211987,1608 211988,1132 211990,1612 211991,861 211992,1983 211993,130 211994,406 211995,211996 211997,1140 211998,302 211999,151 212000,843 212001,920 212002,6303 212003,779 212004,1515 212005,841 212006,179170 212007,179170 212008,179170 212009,179170 212010,1782 212011,644 212012,332 212013,151 212014,179170 212015,693 212015,48955 212016,179170 212017,179170 212018,3474 212019,1235 212019,2045 212019,2209 212019,3474 212019,8788 212019,21711 212019,29253 212019,29294 212020,179170 212023,911 212025,248 212026,333 212027,19005 212028,179170 212029,179170 212031,1556 212032,30 212033,163 212033,302 212033,811 212034,179170 212035,346 212036,344 212037,781 212038,1132 212039,859 212040,212041 212042,179170 212043,1608 212044,102 212045,1323 212046,408 212047,1326 212049,4571 212050,1133 212051,843 212052,852 212052,215874 212053,179170 212054,179170 212055,1452 212056,1458 212057,1983 212058,179170 212059,781 212060,1132 212061,1227 212061,86416 212062,151 212063,285 212064,250 212064,1684 212065,261 212065,212805 212066,179170 212067,349 212068,557 212069,302 212071,179170 212072,358 212073,72 212074,83 212075,179170 212076,707 212077,66297 212078,55849 212079,212080 212081,50 212081,192 212082,4571 212084,179170 212085,861 212087,179170 212088,779 212089,1294 212090,563 212091,346 212093,72 212094,160 212095,1474 212096,212097 212096,240818 212098,673 212099,162599 212100,668 212101,30 212102,72 212103,344 212104,285 212105,54 212106,663 212107,596 212108,873 212109,179170 212110,5906 212111,557 212112,626 212113,278 212114,137 212115,1298 212116,309 212116,310 212117,862 212119,54 212120,509 212121,3695 212122,179170 212123,30 212124,1707 212125,1773 212126,50 212126,63 212126,192 212126,195 212126,285 212126,306 212126,307 212126,406 212126,620 212126,779 212126,1181 212126,1515 212126,5874 212126,6119 212127,120 212128,30 212129,1001 212130,58 212131,994 212132,46 212133,34 212133,35 212134,328 212135,920 212136,179170 212137,7092 212138,255 212139,58 212140,994 212141,46 212142,994 212143,58 212144,46 212145,179170 212146,104 212146,557 212146,885 212146,1368 212146,1939 212146,5405 212146,13704 212147,83 212148,920 212149,1849 212150,875 212151,179170 212152,179170 212153,30 212154,77 212154,83 212154,254 212154,278 212154,283 212154,657 212154,660 212154,1313 212154,1363 212154,1756 212154,2224 212154,2421 212154,2553 212154,3252 212154,4039 212154,6506 212154,7092 212155,388 212156,2116 212157,179170 212158,346 212159,1072 212160,1707 212161,179170 212162,179170 212163,179170 212164,379 212165,289 212165,290 212165,94134 212166,3623 212167,2045 212168,83 212169,179170 212171,1010 212172,483 212173,1844 212174,577 212175,1467 212176,590 212176,1419 212180,30 212181,302 212182,577 212183,2373 212184,179170 212185,273 212186,1181 212187,151 212188,424 212189,346 212190,346 212191,72 212192,875 212193,1033 212194,179170 212195,366 212196,875 212197,2744 212198,483 212199,15807 212201,142405 212202,620 212203,1096 212204,406 212206,72 212207,206059 212208,779 212209,1515 212210,390 212210,745 212210,1425 212210,2590 212211,30331 212212,1235 212212,1335 212212,2045 212212,2209 212212,3474 212212,8788 212212,21711 212212,29253 212212,29294 212213,179170 212214,30 212215,333 212216,72 212217,247 212218,179170 212219,269 212220,1010 212221,212222 212223,333 212224,885 212224,13704 212225,287 212226,581 212227,179170 212228,2590 212229,179170 212230,179170 212231,44 212232,301 212232,861 212232,893 212232,2979 212233,207 212235,113156 212236,240 212237,30 212238,240 212239,83391 212240,3507 212241,668 212242,54 212243,240 212244,2620 212245,240 212246,340 212247,340 212248,1 212249,1 212250,1227 212250,86416 212251,1227 212251,86416 212253,142870 212254,8180 212255,179170 212256,212257 212258,872 212259,179170 212260,1564 212261,841 212262,447 212263,536 212264,1544 212265,366 212266,309 212266,310 212267,1453 212268,138686 212269,175 212270,1429 212271,212272 212273,212274 212275,212276 212277,240 212278,714 212279,179170 212280,1385 212281,333 212281,15573 212282,355 212283,7358 212283,7363 212284,818 212285,1776 212286,1133 212287,433 212292,1105 212293,1127 212294,30 212294,200 212295,247 212296,79 212296,195 212296,1904 212297,1363 212298,212299 212300,764 212301,980 212302,714 212302,1962 212303,1118 212305,1858 212306,1860 212307,4611 212308,1608 212309,1132 212310,779 212313,663 212314,4597 212316,212317 212318,212319 212320,147 212321,1284 212322,83 212323,54 212325,337 212326,1983 212327,694 212328,1556 212329,1282 212330,19010 212331,1531 212332,392 212333,206 212333,1631 212334,596 212335,422 212336,422 212337,422 212338,422 212339,422 212340,422 212341,422 212342,422 212343,422 212344,422 212345,422 212346,1143 212347,422 212348,557 212349,146952 212350,179170 212351,301 212351,968 212352,907 212353,1089 212353,1566 212353,16128 212353,18330 212353,26976 212353,29076 212353,179194 212353,212353 212353,212897 212353,212920 212353,215416 212353,226183 212353,242246 212354,1359 212355,212356 212358,1033 212359,65 212361,19010 212362,841 212363,4548 212364,202 212365,275 212366,749 212366,1888 212367,292 212367,1177 212367,1677 212368,852 212369,1707 212370,251 212371,500 212372,2775 212373,1962 212374,1052 212375,54 212376,1882 212377,406 212378,41 212379,911 212382,920 212383,346 212384,4 212384,5 212384,107 212384,1252 212384,1253 212384,1381 212385,178 212386,2253 212387,1012 212389,765 212389,795 212389,1001 212389,16428 212389,71770 212389,122692 212389,178576 212389,229818 212389,230289 212389,232841 212390,1319 212391,1132 212393,312 212394,781 212395,1132 212396,932 212397,781 212398,1132 212399,163 212400,179170 212401,283 212402,743 212403,781 212404,1132 212405,1238 212406,326 212407,259 212408,130 212409,179170 212410,2480 212411,251 212412,1363 212412,1590 212413,44 212414,3094 212415,179170 212416,1274 212417,1452 212418,179170 212419,30 212420,312 212421,323 212422,138686 212423,2421 212424,175 212425,292 212426,120 212427,1132 212428,885 212428,13704 212430,259 212431,1033 212432,1417 212433,30 212434,447 212435,2775 212436,179170 212438,694 212439,147 212439,149 212440,1608 212441,1132 212442,30 212443,602 212444,387 212445,251 212446,1381 212447,206 212448,259 212448,1070 212449,557 212450,626 212452,536 212453,358 212454,179170 212455,849 212457,30 212458,509 212458,723 212459,83 212460,1402 212461,217 212463,712 212464,142426 212466,18618 212466,20232 212466,39378 212466,76038 212466,145462 212466,258886 212467,212468 212469,304 212470,304 212470,1212 212471,304 212471,1212 212472,76096 212473,200 212474,301 212474,968 212474,189303 212476,355 212477,179170 212478,179170 212479,1179 212480,19010 212481,79 212482,1132 212483,1425 212484,302 212485,447 212486,2775 212489,875 212490,83 212491,217 212492,657 212493,326 212494,147 212494,158 212495,1782 212496,179170 212498,1590 212498,1805 212499,740 212499,741 212499,232040 212500,252 212501,500 212502,406 212502,1181 212504,1381 212506,503 212508,483 212509,500 212510,2775 212511,1962 212512,1052 212513,54 212514,1882 212516,217 212517,163 212518,1127 212518,4190 212519,811 212520,649 212521,760 212522,179170 212523,1608 212524,1132 212525,104 212526,179170 212527,13538 212528,99 212528,752 212529,2867 212529,2868 212530,2620 212531,918 212532,267 212534,160 212535,179170 212536,1381 212538,212539 212543,50 212544,212545 212546,3507 212547,50 212547,58 212547,86 212547,104 212547,106 212547,135 212547,136 212547,146 212547,167 212547,217 212547,227 212547,247 212547,252 212547,254 212547,269 212547,302 212547,332 212547,364 212547,392 212547,393 212547,420 212547,515 212547,516 212547,538 212547,596 212547,636 212547,644 212547,720 212547,779 212547,907 212547,968 212547,1007 212547,1085 212547,1179 212547,1363 212547,1381 212547,1453 212547,1467 212547,1522 212547,1544 212547,1608 212547,1715 212547,1818 212547,1837 212547,2083 212547,2105 212547,2191 212547,2620 212547,2931 212547,3003 212547,3367 212547,4355 212547,5405 212547,5718 212547,6119 212547,55849 212547,92476 212547,141912 212548,79 212549,358 212550,408 212551,596 212552,179170 212553,119 212553,326 212553,415 212553,483 212553,577 212553,760 212553,784 212553,996 212553,2116 212554,1983 212555,30 212556,187176 212557,72 212558,79 212559,179170 212560,1235 212560,1335 212561,3209 212563,179170 212564,392 212565,694 212566,626 212567,264 212568,63 212570,467 212571,918 212572,907 212574,302 212576,392 212577,1983 212578,72 212579,30 212580,138686 212581,175 212582,1400 212583,422 212583,4597 212583,5405 212584,212585 212586,212585 212587,212585 212588,77 212589,252 212590,158 212591,1220 212591,1222 212592,516 212593,510 212594,58 212595,1363 212596,392 212597,1368 212598,1983 212599,485 212599,918 212599,4678 212599,227669 212600,158 212601,663 212601,3094 212602,3115 212603,1309 212604,248 212605,179170 212607,1749 212608,2528 212609,179170 212610,212611 212612,222 212613,285 212614,179170 212615,805 212616,179170 212617,217 212618,48 212619,179170 212620,275 212620,760 212620,1175 212620,1265 212620,1266 212620,1631 212620,1927 212620,215276 212621,918 212622,99 212623,920 212624,179170 212625,179170 212626,233 212627,640 212628,179170 212629,697 212630,973 212631,1181 212632,919 212633,179170 212634,1572 212635,1805 212636,313 212637,389 212638,1122 212639,1474 212640,151 212641,516 212642,1769 212643,1556 212645,30 212646,1033 212647,4594 212648,2116 212649,179170 212650,211 212651,247 212652,1556 212653,1368 212654,30 212655,83 212657,2572 212658,179170 212659,179170 212660,392 212661,1220 212661,1222 212662,516 212663,252 212664,620 212665,872 212665,1001 212666,515 212667,50 212668,179170 212669,406 212670,991 212671,1 212672,179170 212673,346 212674,4545 212674,56150 212675,72 212676,389 212677,875 212678,255 212679,202 212680,1515 212681,779 212682,252 212683,1326 212684,102 212685,1323 212686,408 212687,973 212688,179170 212689,3370 212690,179170 212691,7358 212691,7363 212692,1085 212692,58503 212692,75912 212692,175903 212692,212692 212692,238233 212692,241707 212692,261821 212693,333 212695,302 212696,30 212697,3507 212699,217 212700,179170 212701,179170 212702,818 212702,72439 212703,1149 212705,225 212706,483 212707,861 212708,212709 212710,68069 212712,994 212713,179170 212714,6424 212715,142870 212716,43203 212717,649 212718,179170 212719,1085 212720,179170 212721,179170 212722,158 212723,577 212724,302 212725,97 212726,8270 212727,151 212728,301 212729,1985 212730,861 212731,1531 212732,366 212733,1298 212734,1616 212735,557 212736,34 212736,1776 212737,862 212738,2373 212739,179170 212740,1001 212741,34 212741,35 212742,1608 212743,1132 212744,330 212745,137 212746,247 212747,330 212748,949 212749,83 212750,107 212751,1284 212753,406 212754,536 212755,34 212755,35 212756,333 212757,179170 212758,200 212759,1033 212760,179170 212761,184 212762,151 212763,563 212764,1298 212765,841 212766,38634 212767,54 212768,991 212769,175 212770,179170 212771,1188 212772,179170 212773,1305 212774,294 212775,1511 212775,3069 212776,347 212777,5265 212778,285 212779,30 212780,179170 212781,3 212782,212783 212784,1515 212785,158 212786,189839 212787,179170 212788,179170 212789,179170 212790,179170 212791,304 212792,516 212793,72 212794,179170 212795,994 212796,920 212797,1 212798,1608 212799,1132 212800,134 212801,179170 212802,7416 212803,435 212804,83 212806,179170 212807,30331 212808,346 212809,30 212810,192 212811,366 212812,83 212813,179170 212814,29380 212815,932 212816,287 212817,107 212818,843 212819,1285 212820,254 212821,1220 212821,1222 212822,516 212823,252 212824,2735 212825,269 212826,1319 212827,22 212828,212829 212830,3623 212831,212832 212833,2750 212834,138686 212835,175 212836,179170 212837,179170 212838,1235 212838,1335 212839,179170 212840,3370 212840,14453 212841,179170 212842,140 212843,392 212844,19010 212845,54 212845,278 212845,1019 212845,2424 212846,623 212846,1805 212847,874 212848,1243 212849,663 212850,1631 212851,83 212852,1133 212853,346 212854,83 212855,212856 212857,2744 212858,142405 212859,872 212860,1634 212861,72 212862,1181 212863,862 212864,631 212865,285 212866,250 212866,1684 212867,50 212868,72 212869,147 212869,184 212869,602 212869,1821 212869,2528 212869,4455 212869,21736 212870,212871 212872,1467 212873,455 212874,2424 212875,72 212876,1871 212877,83 212878,13980 212879,2421 212880,179170 212881,649 212882,269 212883,2590 212884,5366 212885,2590 212886,1544 212887,1544 212889,1465 212890,5212 212891,589 212891,1001 212891,1474 212891,44725 212892,355 212893,518 212894,934 212895,202 212896,4190 212898,50 212899,1285 212899,1309 212900,145240 212901,4190 212903,76096 212904,163 212905,481 212906,240 212907,1707 212908,760 212908,1149 212908,1631 212909,50 212910,1238 212911,147 212911,158 212914,34 212914,83 212914,389 212914,818 212914,1069 212914,3810 212914,6012 212914,22808 212914,32994 212914,113585 212914,181063 212914,188791 212914,190492 212914,193101 212914,215825 212914,222389 212914,225294 212914,225295 212914,235558 212914,236788 212914,245280 212914,245524 212914,250730 212914,258029 212914,261306 212915,30 212917,298 212918,146 212918,92476 212919,1566 212922,422 212923,422 212924,422 212925,422 212926,422 212927,387 212928,422 212929,422 212930,422 212932,422 212933,422 212934,422 212935,422 212936,2421 212937,392 212938,283 212939,2416 212939,2417 212940,2671 212941,1381 212942,1544 212943,4611 212944,1118 212945,872 212946,179170 212947,63 212947,1175 212947,3218 212948,1544 212949,4611 212950,1544 212951,4611 212952,1132 212953,781 212954,920 212956,1544 212957,4611 212958,1949 212959,19443 212960,2367 212961,77 212962,868 212963,2735 212964,1544 212965,4611 212966,310 212966,3039 212967,346 212968,111142 212970,1151 212971,1133 212972,1860 212973,1858 212974,425 212976,283 212977,58 212978,994 212979,46 212980,55849 212981,179170 212982,179170 212984,151 212985,55849 212986,450 212987,346 212988,55849 212989,179170 212990,859 212992,1400 212993,179170 212994,3967 212996,273 212996,1116 212998,179170 212999,68 213000,920 213001,58 213002,994 213003,46 213004,179170 213005,179170 213007,1509 213008,4611 213009,2191 213011,179170 213012,302 213013,781 213014,1132 213015,179170 213016,2867 213016,2868 213017,1019 213018,1381 213019,285 213020,179170 213021,83 213022,14434 213023,44 213024,4355 213025,179170 213026,3367 213027,3623 213028,179170 213029,204093 213031,138686 213032,175 213033,72 213034,179170 213035,818 213036,71 213037,179170 213038,3623 213039,6556 213040,252 213041,994 213042,1544 213043,4611 213044,179170 213046,2367 213047,179170 213048,104 213048,1749 213049,596 213051,120 213052,304 213053,204093 213054,255 213055,693 213056,1984 213057,596 213057,1368 213058,3623 213059,1096 213060,302 213061,344 213062,346 213063,489 213064,1381 213065,302 213065,1127 213066,189303 213067,179170 213068,55849 213069,1284 213070,151 213071,179170 213072,179170 213073,179170 213074,179170 213075,1181 213076,151 213077,575 213078,781 213079,1132 213080,694 213081,818 213082,505 213082,1262 213082,111142 213085,179170 213087,1252 213087,1253 213088,213089 213089,19 213089,278 213089,313 213089,455 213089,657 213089,2159 213089,2424 213089,7768 213089,16406 213089,21435 213089,28511 213089,101735 213089,125242 213089,131216 213089,145407 213089,195735 213089,211889 213089,213088 213089,216344 213089,217650 213089,217655 213089,218484 213089,220290 213089,220713 213089,221440 213089,230075 213089,235057 213089,241776 213089,242260 213089,242754 213089,243990 213089,244001 213089,247981 213090,179170 213092,213093 213094,213095 213097,213098 213099,213100 213101,213102 213104,213105 213106,213107 213109,213110 213111,213112 213114,213115 213116,213117 213119,213120 213121,213122 213123,213124 213126,213127 213128,213129 213130,213131 213132,213133 213135,213136 213137,213138 213139,213140 213143,213144 213145,1769 213146,1544 213147,4611 213148,1019 213149,179170 213150,179170 213152,389 213153,718 213155,1149 213156,104 213157,1116 213158,79 213159,1085 213160,1381 213161,217 213162,1544 213163,4611 213164,213165 213166,1749 213167,149 213168,179170 213169,217 213169,222 213169,1419 213170,4190 213172,4190 213173,1210 213174,179170 213176,179170 213177,158 213178,1132 213179,1608 213180,622 213181,5212 213182,388 213182,510 213183,179170 213184,179170 213185,1531 213186,179170 213187,2436 213188,299 213189,424 213190,424 213191,932 213192,387 213193,1801 213194,447 213195,2775 213196,1368 213197,356 213198,158 213199,1252 213199,1253 213200,217 213201,1359 213202,925 213203,392 213204,1801 213205,1381 213206,1688 213207,179170 213208,4060 213209,115 213210,302 213210,861 213210,893 213210,1374 213211,41 213212,346 213213,1181 213213,1392 213214,736 213215,1085 213216,1531 213217,83 213218,179170 213219,918 213220,360 213222,605 213223,843 213224,918 213225,346 213225,424 213226,1181 213227,179170 213228,779 213229,138686 213230,175 213231,73570 213232,1181 213233,349 213234,179170 213235,179170 213236,179170 213237,86 213237,167 213237,301 213237,783 213237,968 213237,973 213237,1293 213237,1837 213237,2083 213237,3207 213237,5301 213239,515 213240,179170 213241,140 213242,179170 213243,30 213244,1381 213245,178 213246,1359 213247,251 213248,140 213250,195 213251,179170 213252,1467 213253,140 213255,467 213256,83 213256,278 213257,1359 213258,151 213259,328 213260,136 213261,30 213262,1359 213263,264 213263,1381 213264,83 213265,3623 213267,760 213268,392 213269,2083 213270,1390 213271,818 213272,142870 213274,179170 213275,349 213276,1326 213277,408 213278,102 213279,1323 213280,179170 213281,994 213282,151 213283,179170 213284,918 213285,3 213285,44 213285,233 213286,142433 213287,808 213288,269 213289,875 213290,50 213291,72 213292,1132 213293,781 213294,3 213295,30 213296,158 213297,44 213298,949 213299,2373 213300,356 213301,1309 213302,252 213302,333 213302,406 213302,602 213303,809 213304,79 213305,980 213306,332 213307,179170 213308,328 213309,2646 213310,179170 213311,278 213312,179170 213313,179170 213314,302 213315,179170 213316,79 213317,158 213318,1572 213319,2083 213320,861 213321,32475 213322,1688 213323,1238 213324,424 213325,516 213326,731 213327,1452 213328,1085 213329,213330 213331,213330 213332,179170 213333,179170 213334,330 213335,406 213336,138 213337,865 213338,557 213339,137 213340,4597 213341,179170 213342,88820 213343,309 213343,310 213344,55849 213345,10 213346,213347 213346,219108 213346,241756 213348,781 213349,1132 213350,2620 213351,179170 213352,179170 213353,179170 213354,83 213355,1773 213356,663 213357,179170 213358,179170 213359,707 213360,179170 213361,516 213362,255 213364,179170 213365,1113 213366,213367 213369,179170 213370,843 213371,179170 213372,2782 213373,179170 213374,626 213375,328 213376,179170 213377,493 213378,179170 213379,2191 213379,3194 213380,557 213381,179170 213382,1282 213383,179170 213384,179170 213385,179170 213386,142430 213387,179170 213388,5034 213389,179170 213390,1860 213391,1858 213392,179170 213393,179170 213394,179170 213395,179170 213396,346 213397,841 213399,211 213400,179170 213401,138686 213402,175 213403,2590 213404,1718 213405,179170 213406,179170 213408,213409 213410,850 213411,155481 213412,424 213413,213414 213415,346 213416,9025 213417,285 213418,387 213419,225 213420,1474 213421,673 213422,483 213423,3623 213424,137 213425,8884 213426,1085 213427,213428 213429,805 213430,1544 213431,8270 213432,58 213433,213434 213435,179170 213436,151 213437,355 213438,2073 213439,682 213439,72439 213440,179170 213442,1773 213443,1773 213446,1414 213447,420 213448,213449 213450,1860 213451,1858 213454,83 213456,211 213457,1860 213458,1858 213459,872 213460,213461 213462,302 213463,1531 213464,179170 213465,179170 213466,179170 213467,213468 213469,355 213470,83 213471,44 213472,83 213473,193486 213475,3612 213477,195 213478,213479 213480,707 213481,179170 213482,1381 213483,213484 213485,213484 213486,213484 213487,1773 213488,781 213489,1132 213490,640 213491,772 213492,34 213492,20813 213493,1133 213494,259 213495,337 213496,1014 213497,1014 213498,1014 213499,1014 213500,30 213501,1381 213502,389 213503,83 213504,358 213505,106 213505,175 213505,620 213505,21442 213505,25531 213505,27008 213505,99787 213505,225147 213506,1287 213507,1381 213508,34 213508,35 213509,2373 213510,142409 213510,146280 213511,30 213512,439 213513,360 213514,346 213515,818 213516,872 213517,151 213518,483 213519,337 213520,179170 213521,97 213521,15119 213522,841 213523,179170 213525,3321 213526,1253 213526,5440 213527,424 213528,932 213529,640 213530,2572 213532,1 213533,1453 213534,1359 213535,687 213537,179170 213538,179170 213539,1058 213540,151 213542,155481 213543,179170 213544,79 213545,138686 213546,175 213547,247 213548,718 213549,1220 213549,1222 213550,252 213551,251 213552,179170 213553,1634 213554,994 213555,516 213556,2116 213557,1052 213558,179170 213559,273 213560,240 213561,4678 213562,10 213563,1167 213564,179170 213565,1479 213566,179170 213567,390 213568,179170 213569,2048 213570,179170 213571,1381 213572,179170 213573,179170 213574,179170 213575,179170 213576,179170 213577,179170 213578,179170 213579,179170 213580,179170 213581,213582 213583,179170 213584,179170 213585,179170 213586,577 213587,179170 213588,179170 213589,213590 213591,179170 213592,1381 213593,213594 213595,179170 213596,255 213598,113156 213599,179170 213600,179170 213601,213602 213603,179170 213604,179170 213605,117 213605,2712 213606,179170 213607,1294 213608,54 213610,187 213611,346 213612,1313 213613,2017 213614,179170 213615,179170 213616,179170 213617,179170 213618,179170 213619,213620 213621,179170 213622,179170 213623,972 213624,213625 213627,7155 213628,104 213629,179170 213630,1012 213631,213632 213633,213634 213635,22 213636,179170 213637,179170 213638,147 213639,1773 213641,213642 213643,366 213644,366 213645,366 213646,179170 213647,213648 213649,213650 213649,233665 213651,1 213652,213653 213654,213654 213655,285 213656,179170 213657,151 213658,1544 213659,4571 213660,30 213661,107 213662,2416 213662,2417 213663,292 213664,338 213665,298 213666,1133 213667,3538 213669,1119 213670,22 213670,417 213670,577 213670,1635 213670,37759 213671,285 213672,3846 213673,275 213674,2048 213675,213676 213677,250 213677,1684 213678,213679 213681,2784 213682,83 213683,30331 213685,213686 213687,485 213688,213689 213690,179170 213691,406 213692,703 213693,179170 213694,179170 213695,151 213696,1531 213697,179170 213698,1238 213699,149534 213700,179170 213701,1452 213702,213703 213705,41 213706,179170 213708,213709 213710,179170 213712,179170 213713,179170 213714,79 213715,336 213716,2590 213717,275 213718,1368 213721,2620 213723,1282 213724,83 213725,120 213725,1466 213726,743 213727,652 213729,516 213730,83 213731,187 213732,261 213732,2868 213733,1133 213734,19227 213737,83 213738,213739 213740,1227 213740,86416 213743,85275 213744,22 213745,647 213746,34 213746,35 213746,313 213747,83 213749,1985 213750,167 213751,1181 213752,167 213753,179170 213754,4597 213755,167 213757,83 213758,1010 213759,4691 213759,18726 213760,581 213762,1564 213763,1429 213764,269 213765,801 213766,1117 213767,142870 213768,2367 213769,346 213770,707 213771,179170 213772,148412 213773,179170 213774,138686 213775,175 213776,72 213777,312 213778,4355 213779,23783 213780,2867 213780,2868 213781,272 213783,30 213784,79 213785,2979 213786,273 213787,634 213788,8855 213789,107 213790,503 213791,147 213791,158 213792,200 213793,179170 213794,179170 213795,179170 213796,167 213796,3218 213797,54 213798,1227 213798,86416 213799,302 213801,668 213802,30 213803,557 213804,557 213805,1722 213806,557 213807,309 213807,310 213808,483 213809,207 213810,515 213811,79 213812,1227 213812,86416 213813,493 213814,202 213815,158 213817,843 213818,875 213819,83 213820,140 213820,515 213821,707 213822,932 213822,972 213823,298 213824,485 213825,707 213826,707 213827,32 213827,392 213827,509 213827,644 213827,697 213827,809 213827,1143 213827,1240 213827,1363 213827,1454 213827,1465 213827,1858 213827,1955 213827,2274 213827,2697 213827,2699 213827,4903 213827,24763 213827,76096 213828,4637 213829,485 213830,298 213831,179170 213832,1983 213833,2506 213834,143287 213835,179170 213836,143287 213837,179170 213838,872 213839,872 213840,143287 213841,577 213842,273 213843,1033 213844,13 213845,142473 213846,312 213847,179170 213848,55849 213849,620 213850,406 213851,6027 213852,358 213854,366 213855,366 213856,779 213857,1515 213858,333 213859,346 213860,1511 213860,3069 213861,1033 213862,312 213863,72 213864,213865 213866,1821 213866,21736 213867,631 213868,620 213869,406 213870,779 213871,1515 213872,1140 213873,23701 213874,179170 213875,2868 213875,19227 213876,211 213876,290 213876,1235 213876,94134 213877,1001 213878,34 213878,1776 213879,8330 213880,1133 213881,918 213881,1634 213882,333 213883,179170 213884,213885 213886,2045 213887,54 213888,333 213889,30 213890,1294 213891,213892 213893,1 213894,83 213895,179170 213897,439 213897,671 213898,872 213899,292 213900,213901 213902,294 213903,296 213904,298 213905,184 213906,1634 213907,146 213907,779 213907,92476 213908,213909 213910,213911 213910,235199 213912,1544 213913,21442 213914,108073 213915,301 213916,213917 213918,424 213919,4691 213920,1432 213921,213922 213923,283 213923,455 213923,536 213923,1419 213923,1466 213923,1467 213924,145240 213925,213926 213927,1634 213928,83 213929,360 213930,2931 213931,28107 213932,647 213933,213934 213935,213936 213938,1474 213940,72 213943,309 213943,310 213944,213945 213946,1801 213947,251 213947,356 213948,83 213949,337 213950,83 213950,1068 213951,485 213952,298 213953,167 213953,877 213953,1045 213953,213954 213953,214197 213953,216627 213954,805 213954,1631 213956,859 213957,213958 213959,337 213959,1085 213961,213962 213963,1143 213964,707 213967,2944 213968,2572 213969,189303 213970,707 213971,1238 213972,273 213973,19010 213974,697 213974,3260 213975,30 213976,726 213977,22 213978,3 213979,186 213980,360 213980,4571 213981,209 213982,707 213984,1544 213986,4611 213987,213988 213989,190492 213990,717 213991,213992 213993,22 213994,707 213995,189303 213996,707 213997,140 213998,63 213998,107 213998,137 213998,415 213998,473 213998,483 213998,649 213998,932 213998,1212 213998,1359 213998,1509 213998,2089 213998,2224 213998,2315 213998,2940 213998,4220 213998,5405 213998,44725 213998,60576 213998,66297 213998,75912 213998,124668 213998,185877 214000,13538 214001,760 214001,14080 214001,20301 214001,32530 214001,118020 214001,247781 214002,868 214003,179170 214004,48505 214005,949 214007,73570 214008,1127 214009,275 214010,694 214011,214012 214013,1043 214013,42220 214015,167 214016,557 214017,254 214019,298 214020,485 214021,209 214023,673 214024,55849 214025,360 214026,920 214027,214028 214029,83 214030,192 214030,240 214032,214033 214034,2784 214035,202 214036,809 214037,485 214038,298 214039,103860 214040,1860 214041,1858 214042,1294 214044,861 214045,1381 214046,158 214047,415 214048,1769 214049,392 214049,467 214050,44 214051,707 214053,1983 214054,1058 214055,1132 214056,972 214057,1082 214058,1983 214059,6119 214060,214060 214061,3804 214062,1238 214063,355 214064,167 214065,718 214066,1452 214067,83 214068,217 214069,167 214070,1773 214071,6556 214072,467 214073,1210 214074,4223 214075,707 214076,13661 214077,868 214078,209 214079,189303 214080,994 214081,1836 214083,54 214084,1608 214085,1191 214085,1192 214085,1844 214086,809 214087,972 214088,338 214089,1191 214090,1224 214091,204093 214093,934 214095,698 214096,204093 214097,1707 214098,1181 214099,1132 214100,1608 214101,3193 214102,422 214104,818 214106,1033 214108,707 214109,206 214110,14434 214111,4771 214112,907 214113,4190 214113,187176 214115,818 214116,207045 214117,843 214118,818 214119,718 214120,2353 214121,19010 214123,907 214124,1860 214125,1858 214126,83 214127,707 214128,252 214129,781 214130,1132 214131,623 214131,685 214131,1805 214131,102695 214131,128704 214131,189834 214131,206189 214131,215965 214131,217519 214131,217846 214131,218534 214132,7416 214133,843 214136,55849 214137,620 214139,920 214140,10 214141,406 214143,3555 214144,1381 214145,146 214145,92476 214146,647 214147,344 214148,647 214149,344 214150,146 214150,92476 214151,877 214152,106 214153,1309 214155,779 214156,1515 214157,1749 214158,179170 214159,467 214161,877 214163,83 214164,204093 214165,138686 214166,1659 214167,392 214168,175 214169,54 214170,406 214170,620 214171,214172 214173,179170 214174,516 214176,485 214177,298 214178,83 214179,5405 214180,2105 214181,1769 214182,179170 214183,1551 214185,302 214185,893 214186,1612 214187,34 214187,35 214187,347 214187,372 214187,2812 214187,5718 214187,9024 214188,818 214188,191860 214189,160 214191,146 214191,92476 214192,647 214193,344 214194,55849 214196,577 214197,127158 214197,207045 214197,213953 214198,333 214199,467 214199,1151 214200,485 214201,843 214202,252 214202,1220 214202,1222 214203,302 214204,179170 214205,273 214206,214207 214208,707 214209,707 214210,1240 214211,146 214211,92476 214212,647 214213,344 214214,273 214215,707 214216,596 214217,269 214218,818 214219,179170 214220,707 214221,1224 214222,1082 214223,167 214224,167 214225,1860 214226,1858 214227,83 214228,994 214229,861 214230,1220 214230,1222 214231,252 214232,251 214234,515 214235,2421 214236,179170 214237,392 214237,24763 214238,422 214239,56 214240,6754 214240,115440 214241,83 214242,179170 214243,30 214244,422 214245,56 214246,1284 214247,30 214248,918 214249,30 214251,240 214251,261 214252,272 214253,19010 214254,3447 214255,422 214256,422 214257,68 214258,422 214259,269 214260,6303 214261,1556 214262,592 214263,1220 214263,1222 214264,252 214265,516 214266,50 214266,158 214266,192 214266,406 214266,779 214266,1515 214268,389 214269,192 214270,1551 214271,179170 214272,406 214272,620 214273,967 214273,1849 214273,4114 214273,4411 214273,7530 214273,18490 214273,18970 214273,38299 214273,214277 214273,216063 214273,224076 214273,233463 214273,234875 214273,244105 214274,68 214275,151 214276,179170 214278,179170 214279,861 214280,493 214281,852 214282,4611 214283,1544 214284,392 214285,422 214286,422 214287,202 214288,422 214289,422 214290,422 214291,179170 214292,422 214293,422 214294,1326 214295,1323 214296,102 214297,408 214298,919 214299,422 214300,179170 214301,422 214302,113156 214303,179170 214304,8270 214305,179170 214306,1181 214307,852 214308,273 214309,3258 214310,189303 214311,23783 214312,148412 214313,179170 214314,312 214315,1220 214315,1222 214316,179170 214317,2436 214318,248 214319,179170 214320,2105 214321,179170 214322,356 214322,852 214323,3623 214324,1707 214325,179170 214326,811 214326,980 214326,1782 214326,3218 214327,3623 214328,179170 214329,285 214330,1309 214331,843 214332,779 214333,862 214334,179170 214335,240 214336,592 214337,179170 214339,6303 214340,179170 214341,1127 214342,406 214343,179170 214344,392 214345,247 214346,252 214347,251 214348,1220 214348,1222 214349,179170 214350,200 214351,179170 214352,179170 214353,30 214354,994 214355,1544 214356,4611 214357,694 214357,1240 214358,779 214359,30 214360,179170 214361,179170 214362,8798 214363,167 214365,158 214366,255 214367,273 214368,179170 214369,366 214370,167 214371,179170 214372,167 214373,167 214374,147 214374,1458 214374,80266 214375,179170 214376,707 214377,189794 214378,433 214379,1983 214380,214381 214382,179170 214383,147 214384,167 214385,179170 214386,5405 214387,179170 214388,87 214389,214390 214391,189303 214392,781 214393,1132 214395,30 214397,1544 214398,671 214399,588 214399,590 214400,167 214401,392 214401,1240 214402,30 214403,852 214404,167 214405,3260 214407,326 214408,2373 214409,30 214410,483 214411,581 214412,167 214413,167 214414,167 214415,957 214415,1815 214416,247 214417,1381 214418,151 214419,179170 214420,1749 214421,240 214422,179170 214423,358 214424,843 214425,72 214426,167 214428,1289 214429,63 214429,1634 214430,1571 214431,1888 214432,30331 214433,707 214434,859 214435,179170 214436,179170 214437,179170 214438,179170 214439,179170 214440,179170 214441,179170 214442,1769 214443,406 214445,179170 214446,707 214447,596 214448,596 214449,596 214450,179170 214451,179170 214452,994 214453,250 214453,1684 214454,179170 214455,179170 214456,994 214457,298 214458,994 214459,179170 214460,2506 214463,707 214464,818 214465,707 214466,158 214466,1893 214466,5547 214467,179170 214468,1238 214469,1509 214470,179170 214471,214472 214473,179170 214474,179170 214475,192 214475,272 214476,779 214477,4611 214478,422 214479,179170 214480,179170 214481,138686 214482,175 214483,179170 214484,275 214485,302 214485,344 214486,310 214486,3039 214487,516 214488,179170 214489,38634 214490,179170 214491,167 214492,167 214493,167 214494,167 214495,356 214496,179170 214497,1227 214497,86416 214498,30 214499,1282 214500,292 214500,442 214500,609 214501,349 214502,30236 214503,397 214504,1556 214504,142430 214505,1241 214506,214507 214508,269 214509,137 214510,167 214511,179170 214512,179170 214513,179170 214514,2266 214515,179170 214516,137 214517,1531 214518,179170 214519,179170 214520,179170 214521,843 214522,179170 214523,337 214523,338 214523,393 214523,439 214523,626 214523,649 214523,772 214523,1381 214523,2367 214524,920 214525,155481 214526,779 214527,2073 214528,192 214529,862 214529,2590 214531,752 214531,17263 214532,340 214533,1 214534,1305 214534,2701 214535,179170 214536,285 214537,491 214538,179170 214539,588 214539,590 214540,1453 214541,1544 214542,1590 214543,30 214544,113156 214545,214546 214545,219566 214547,636 214548,83 214550,1177 214551,872 214553,874 214554,344 214555,567 214556,179170 214557,392 214558,3830 214559,13919 214560,1454 214561,214562 214561,226956 214563,278 214565,346 214566,818 214567,366 214568,424 214569,366 214570,818 214571,2590 214572,356 214574,779 214575,10 214576,46 214576,744 214577,1130 214579,781 214580,1132 214581,192522 214582,138686 214583,175 214584,818 214585,179170 214586,818 214587,818 214588,302 214588,893 214589,781 214590,1132 214591,634 214592,781 214593,1132 214594,179170 214595,333 214597,818 214598,179170 214599,179170 214600,781 214601,1132 214602,158 214603,366 214604,1381 214605,189303 214606,3623 214607,56 214608,422 214609,818 214610,214611 214612,1608 214613,1132 214614,491 214615,1769 214616,3623 214617,1556 214618,30 214620,392 214621,141912 214622,254 214623,392 214624,2944 214626,1019 214627,433 214628,179170 214629,147 214631,538 214631,190492 214632,214633 214635,581 214636,1210 214637,634 214637,88820 214639,178 214640,779 214640,141912 214641,447 214641,671 214642,189303 214644,1608 214645,1132 214646,1715 214647,1556 214648,1298 214649,179170 214651,1381 214654,179170 214655,34 214655,35 214655,455 214655,2266 214656,920 214657,1749 214657,2605 214657,6695 214658,818 214659,68 214659,387 214659,596 214659,88820 214661,1132 214662,781 214663,3524 214663,48505 214664,657 214665,932 214667,206 214668,83 214669,23783 214670,1119 214670,1462 214671,214672 214673,592 214674,60576 214675,1132 214676,781 214677,60576 214678,781 214679,1132 214681,151 214682,1722 214683,1893 214683,117163 214684,60576 214685,760 214686,50 214687,2411 214688,60576 214689,349 214690,309 214690,310 214691,209 214692,3623 214693,818 214694,44 214695,390 214695,1284 214696,818 214697,83 214699,818 214700,3623 214701,1381 214702,30 214705,818 214706,2367 214707,720 214708,1 214709,1402 214710,818 214711,189303 214712,818 214713,1072 214714,179170 214715,1238 214716,1749 214717,3623 214719,8270 214720,83 214721,179170 214722,781 214723,1132 214724,3623 214725,875 214726,1452 214727,138686 214728,30 214729,1001 214730,175 214731,1220 214731,1222 214732,5034 214733,911 214733,1119 214733,1368 214733,1807 214734,126 214737,1370 214737,6119 214737,21736 214738,366 214739,211889 214740,500 214741,1882 214742,1052 214743,2775 214744,54 214745,1962 214746,389 214746,588 214746,590 214746,1531 214747,390 214747,6068 214748,1860 214749,1858 214750,2436 214751,30 214752,631 214753,788 214754,179170 214755,818 214756,158 214757,217 214758,142870 214759,1381 214760,1860 214761,1858 214762,273 214762,1116 214763,83 214764,26450 214765,835 214766,433 214767,516 214768,179170 214769,195 214771,31122 214772,14797 214773,3193 214774,518 214775,2737 214777,3804 214778,1639 214779,852 214780,149 214781,1749 214782,1454 214783,58 214784,46 214785,60576 214786,994 214787,3695 214788,422 214789,422 214790,1274 214791,422 214792,422 214793,422 214794,422 214795,422 214796,422 214797,422 214798,422 214799,422 214800,422 214801,5405 214802,138 214803,392 214803,3003 214804,392 214805,1132 214806,1608 214807,1241 214808,118336 214809,736 214810,694 214811,1608 214812,1132 214813,3695 214815,1556 214816,142870 214818,868 214819,818 214820,631 214820,156379 214821,1381 214822,493 214823,994 214824,893 214825,406 214826,278 214827,217 214828,179170 214830,1151 214831,283 214832,301 214832,310 214833,392 214834,214835 214837,467 214838,649 214839,302 214840,809 214841,994 214842,360 214842,1769 214843,1749 214844,1220 214844,1222 214845,252 214847,251 214848,326 214850,1769 214851,516 214853,994 214854,647 214855,717 214856,55849 214857,360 214858,392 214858,644 214859,406 214861,1381 214862,1284 214864,326 214866,557 214867,214868 214869,3297 214870,493 214871,34 214871,35 214873,5212 214874,1381 214875,356 214879,615 214879,968 214880,515 214881,214734 214882,58 214882,872 214883,179170 214884,483 214885,1556 214886,1635 214887,2312 214888,179170 214889,1515 214890,467 214891,918 214892,1243 214893,179170 214894,1381 214896,1740 214897,314 214898,179170 214899,1058 214901,30 214902,302 214903,4637 214903,204093 214904,151 214905,87 214906,41 214907,179170 214908,918 214909,273 214911,1262 214912,189303 214913,298 214914,485 214915,3804 214916,485 214917,298 214919,41 214920,48 214921,151 214922,1769 214924,818 214925,41 214926,406 214927,861 214928,179170 214929,408 214930,102 214931,1326 214932,1323 214933,2373 214934,1326 214934,3804 214935,302 214936,264 214937,6695 214938,781 214939,1132 214941,360 214942,222 214943,202 214944,179170 214945,72 214946,663 214946,4545 214946,56150 214947,179170 214948,577 214949,1284 214950,68 214951,247 214951,2867 214951,2868 214952,781 214953,1132 214954,781 214955,1132 214956,781 214957,1132 214958,1715 214959,179170 214960,1284 214961,72 214962,3623 214963,179170 214964,179170 214965,179170 214966,1544 214967,2744 214968,179170 214969,142405 214971,1849 214972,179170 214973,214974 214975,179170 214976,179170 214977,34 214977,35 214978,2735 214979,104 214980,273 214980,305 214980,435 214980,717 214980,835 214980,2209 214981,2083 214981,5301 214982,3695 214984,179170 214985,149 214985,968 214986,179170 214987,8 214987,19 214987,54 214987,187 214987,222 214987,313 214987,379 214987,385 214987,399 214987,455 214987,477 214987,536 214987,634 214987,660 214987,781 214987,891 214987,1019 214987,1201 214987,1313 214987,1467 214987,1539 214987,1571 214987,1618 214987,1718 214987,1724 214987,1756 214987,1871 214987,2168 214987,2224 214987,2421 214987,2424 214987,2553 214987,2646 214987,2779 214987,2944 214987,4223 214987,5034 214987,5326 214987,5906 214987,6298 214987,6506 214987,6789 214987,6888 214987,7698 214987,7768 214987,8463 214987,9743 214987,13137 214987,13546 214987,13980 214987,17346 214987,19443 214987,23287 214987,28130 214987,55171 214987,57354 214987,115474 214987,181063 214987,183456 214987,188791 214987,211889 214987,212914 214987,213089 214987,214240 214988,3370 214989,179170 214990,1227 214990,86416 214991,615 214992,120 214993,557 214994,285 214995,214996 214997,37 214997,301 214998,179170 214999,596 215000,55849 215001,623 215001,1805 215002,179170 215003,55849 215004,1133 215005,248 215005,301 215005,1955 215005,2979 215005,3804 215006,179170 215007,179170 215008,406 215009,179170 215010,4220 215011,158 215011,5405 215012,179170 215013,30 215014,2620 215015,179170 215016,179170 215017,136 215017,252 215017,272 215017,301 215017,333 215017,435 215017,516 215017,596 215017,1033 215017,1370 215017,1893 215017,2006 215017,240174 215018,273 215019,58 215020,46 215021,994 215022,179170 215024,58 215025,994 215026,46 215028,278 215029,179170 215030,875 215031,179170 215033,179170 215034,179170 215035,1608 215036,1132 215037,83 215038,255 215039,7416 215040,179170 215041,1058 215042,179170 215044,179170 215045,77 215046,179170 215047,1359 215048,563 215049,179170 215050,2146 215051,707 215052,19356 215053,525 215054,1309 215055,83 215056,179170 215057,1285 215059,1116 215059,1332 215059,1844 215061,631 215062,1149 215063,294 215064,1707 215065,215066 215067,10 215068,1608 215069,1132 215070,1608 215071,1132 215072,179170 215073,1033 215074,1579 215075,179170 215076,138686 215077,175 215078,7768 215079,179170 215080,179170 215081,179170 215082,179170 215083,251 215084,179170 215085,779 215086,1363 215087,2590 215088,217 215089,250 215089,1684 215090,285 215091,217 215092,872 215093,1511 215093,3069 215093,240174 215094,1531 215095,179170 215096,179170 215097,1227 215097,86416 215098,179170 215099,179170 215100,179170 215101,596 215102,10 215103,179170 215104,994 215105,424 215106,30 215107,491 215108,179170 215109,179170 215110,1019 215110,1417 215111,179170 215112,652 215113,155481 215114,179170 215115,1294 215116,179170 215117,179170 215118,818 215119,996 215120,406 215121,1368 215122,2146 215123,23783 215124,215125 215124,218144 215126,240 215127,179170 215128,422 215129,56 215130,56 215131,422 215132,151 215133,312 215133,652 215134,41 215134,784 215134,1119 215134,1462 215134,1515 215134,8537 215135,215136 215137,179170 215138,179170 215139,137 215140,179170 215141,179170 215142,179170 215143,179170 215144,179170 215145,142870 215146,1544 215147,1179 215148,68 215148,256549 215149,358 215150,392 215151,215152 215153,23287 215154,58 215155,10 215157,147 215159,1544 215160,14556 215161,1707 215162,1238 215163,781 215164,1132 215165,30 215166,726 215167,79 215168,22 215168,1805 215169,366 215170,366 215171,179170 215172,1415 215173,356 215174,455 215175,783 215175,850 215176,356 215177,94409 215178,54 215179,707 215180,388 215181,58 215182,994 215183,46 215184,1381 215185,22 215186,1309 215188,332 215189,58 215190,46 215191,994 215192,179170 215193,179170 215194,690 215195,302 215196,215197 215198,920 215199,1749 215200,179170 215201,10 215202,596 215203,60576 215204,707 215205,485 215206,298 215207,14556 215208,158 215209,215209 215210,425 215211,3 215212,392 215213,102 215214,1132 215215,254 215216,671 215217,1458 215218,55849 215220,179170 215221,1949 215222,193129 215223,97 215225,2436 215227,781 215228,1132 215229,142430 215229,142879 215230,313 215230,634 215230,808 215230,1556 215232,155473 215233,392 215234,1252 215234,1253 215235,2460 215236,1345 215237,142426 215238,204093 215239,599 215240,2334 215241,301 215242,65 215243,301 215244,215245 215246,843 215247,779 215248,907 215249,1381 215250,136752 215251,2353 215252,151 215252,663 215252,1058 215252,1096 215253,483 215254,920 215255,861 215256,1434 215256,2073 215256,2668 215257,932 215258,285 215259,215260 215261,1631 215262,1294 215263,356 215265,726 215265,859 215266,2812 215267,273 215268,179170 215269,536 215270,204124 215271,387 215272,179170 215273,668 215274,1837 215275,1556 215276,63 215276,202 215276,251 215276,252 215276,259 215276,275 215276,314 215276,336 215276,397 215276,493 215276,516 215276,682 215276,685 215276,733 215276,808 215276,838 215276,843 215276,852 215276,1011 215276,1014 215276,1089 215276,1130 215276,1175 215276,1191 215276,1220 215276,1222 215276,1243 215276,1265 215276,1266 215276,1512 215276,1663 215276,1927 215276,1973 215276,3835 215276,5992 215276,6904 215276,14511 215276,16014 215276,19413 215276,20071 215276,20419 215276,25282 215276,47707 215276,49179 215276,72439 215276,76704 215276,118336 215276,166685 215276,170771 215276,173053 215276,182465 215276,189788 215276,189794 215276,189839 215276,189842 215276,202996 215276,207659 215276,212381 215276,212620 215276,215276 215276,215277 215276,215310 215276,215328 215276,215807 215276,215842 215276,215874 215276,215980 215276,216548 215276,216669 215276,216676 215276,216678 215276,216680 215276,216720 215276,218887 215276,222357 215276,223738 215276,223786 215276,225303 215276,226180 215276,228172 215276,237373 215276,245284 215276,247366 215276,248708 215276,249055 215276,249746 215276,251413 215276,251480 215276,253135 215276,253138 215276,253149 215276,262351 215277,215276 215278,1274 215279,44 215280,1509 215280,1551 215281,273 215282,3094 215283,217 215284,187176 215285,73570 215286,818 215288,435 215289,862 215290,781 215291,1132 215292,422 215293,422 215294,422 215295,422 215296,422 215297,422 215298,422 215299,422 215300,6556 215301,422 215302,422 215303,372 215303,1082 215304,422 215305,251 215306,1566 215307,422 215308,1132 215309,781 215310,215276 215311,1860 215312,1858 215314,217 215315,636 215316,83 215317,1326 215319,60576 215320,215321 215322,5301 215323,1381 215324,83 215325,330 215326,30 215327,60576 215328,215276 215329,1052 215330,1962 215331,500 215332,2775 215333,1882 215334,54 215335,179170 215336,147 215336,158 215336,184 215336,697 215337,215338 215340,698 215340,5440 215341,1608 215342,1132 215344,1188 215345,346 215346,2671 215347,991 215349,647 215350,146 215350,92476 215351,344 215353,713 215354,79 215355,1238 215356,1608 215357,1132 215359,1860 215360,1858 215361,450 215362,3161 215363,994 215364,58 215365,46 215366,647 215367,344 215368,146 215368,92476 215369,3474 215370,60576 215371,264 215373,360 215374,179170 215375,1452 215376,467 215377,1860 215378,1858 215379,255 215380,707 215381,179170 215382,389 215384,192 215385,138686 215387,175 215388,179170 215389,179170 215391,2168 215392,1381 215393,346 215394,1282 215394,1392 215394,1882 215395,467 215395,872 215395,1381 215397,309 215397,310 215398,14556 215399,149 215400,1955 215401,668 215402,178 215403,868 215404,8270 215405,248 215406,1541 215407,1749 215409,907 215410,1608 215411,1132 215412,760 215413,1119 215414,137 215414,328 215414,784 215414,1016 215414,1177 215414,1282 215414,1511 215414,3069 215414,182162 215415,273 215417,264 215418,2944 215419,811 215421,406 215422,1345 215423,346 215424,1836 215425,225 215425,292 215426,1381 215427,1608 215428,1132 215430,87 215430,312 215430,420 215430,438 215430,704 215431,1836 215433,592 215434,151 215435,76096 215437,873 215438,433 215439,1544 215440,4611 215441,292 215442,264 215443,707 215444,217 215446,577 215447,301 215447,1564 215448,843 215450,1085 215451,1220 215451,1222 215452,1227 215452,86416 215453,360 215454,3623 215455,2286 215456,1881 215457,215458 215457,230378 215459,1836 215460,30 215461,179170 215462,392 215462,1240 215463,301 215465,557 215466,79 215467,557 215468,179170 215469,312 215469,652 215470,1172 215471,1132 215472,781 215473,781 215474,1132 215475,1381 215476,179170 215477,178 215478,1010 215479,1962 215480,179170 215481,202 215482,179170 215483,422 215484,1849 215485,850 215486,147 215487,79 215488,707 215489,179170 215490,406 215491,1608 215492,1132 215493,1659 215494,392 215494,577 215494,57143 215494,127158 215494,138686 215494,144231 215494,160320 215494,187483 215494,216168 215494,223834 215494,225291 215495,1381 215496,515 215497,309 215497,310 215498,83 215499,179170 215500,209 215501,30 215502,534 215502,1837 215503,4771 215504,435 215505,1556 215506,392 215507,256 215508,15119 215510,156379 215512,1326 215513,843 215514,918 215515,1844 215516,3804 215517,179170 215519,1860 215520,1858 215521,6387 215521,154408 215523,151 215524,195 215524,306 215524,307 215524,406 215524,779 215524,1181 215524,1515 215525,158 215526,442 215527,663 215529,1639 215530,79 215531,1983 215533,379 215534,3 215534,1085 215535,87 215535,392 215535,687 215535,872 215535,918 215535,1454 215536,1151 215537,145240 215538,312 215538,356 215539,346 215540,752 215541,1326 215542,408 215543,102 215544,1323 215545,483 215546,1860 215547,1858 215548,387 215549,179170 215550,491 215551,179170 215552,179170 215553,1181 215554,579 215555,994 215556,83 215556,278 215557,1293 215558,3367 215559,179170 215560,994 215561,1860 215562,1858 215563,640 215564,179170 215565,1012 215566,563 215567,179170 215568,179170 215569,1860 215570,1858 215571,179170 215572,1452 215573,1722 215574,83 215575,30 215576,920 215577,697 215578,1474 215579,179170 215580,195 215581,4810 215582,388 215583,467 215584,30 215585,424 215586,605 215587,346 215588,8822 215589,640 215591,103860 215592,179170 215593,138686 215594,175 215595,273 215596,251 215596,1370 215597,3370 215597,14453 215598,994 215599,30 215600,2744 215601,772 215602,346 215603,1284 215604,272 215605,697 215605,1769 215606,841 215607,34 215607,35 215608,209 215609,647 215610,2590 215611,179170 215612,30 215613,1 215614,200 215615,875 215616,994 215617,827 215618,3999 215619,1289 215620,7 215621,14366 215622,1509 215623,1381 215624,592 215625,37 215626,179170 215627,304 215628,1608 215629,1132 215630,269 215631,393 215631,17245 215632,179170 215633,1210 215634,1151 215635,217 215635,1417 215636,346 215637,30 215638,779 215639,5906 215640,137 215641,557 215642,278 215643,626 215644,862 215645,215646 215647,592 215648,30 215649,147 215650,346 215651,433 215652,707 215653,145240 215654,1718 215654,2646 215655,195 215656,1058 215657,86 215657,167 215657,301 215657,589 215657,605 215657,615 215657,907 215657,973 215657,1001 215657,1124 215657,1167 215657,1241 215657,1284 215657,1522 215657,1782 215657,1785 215657,1955 215657,2083 215657,2557 215657,2979 215657,3193 215658,215659 215660,178 215661,192 215661,306 215661,307 215661,406 215661,422 215661,493 215661,586 215661,620 215661,779 215661,1515 215661,1531 215661,3148 215661,4192 215661,4193 215662,872 215663,2367 215664,1531 215665,1231 215665,1782 215666,1608 215667,1132 215668,808 215669,920 215670,1858 215671,1860 215672,179170 215673,179170 215674,1462 215674,8537 215675,1058 215676,433 215678,968 215679,994 215680,1688 215681,433 215682,151 215683,1566 215684,707 215686,563 215687,801 215688,1370 215689,273 215690,957 215691,215692 215693,86 215694,818 215695,1370 215696,1265 215696,1266 215697,493 215698,138686 215699,175 215700,586 215701,330 215702,563 215703,563 215704,874 215705,1014 215706,1014 215707,1014 215708,10 215709,179170 215710,1014 215711,1014 215712,1326 215713,805 215714,215715 215716,1014 215717,215718 215719,994 215720,215721 215722,1019 215723,875 215724,247 215725,563 215726,346 215727,298 215728,138686 215729,175 215730,278 215731,13980 215732,83 215734,536 215736,346 215737,1381 215738,215739 215740,862 215741,204093 215742,215743 215742,228767 215744,179170 215745,795 215746,179170 215747,2923 215748,1381 215749,113156 215750,1188 215750,142870 215751,392 215752,179170 215753,261 215753,493 215754,1531 215755,346 215756,1012 215757,217 215759,34 215759,35 215760,202 215761,179170 215763,19010 215764,304 215765,41 215766,1012 215768,261 215768,493 215769,289 215769,290 215769,94134 215770,272 215770,435 215770,1893 215771,179170 215772,671 215773,179170 215774,179170 215775,1544 215776,3 215777,1462 215777,15573 215778,652 215778,1235 215779,292 215779,1511 215780,1151 215781,3041 215782,179170 215783,1773 215784,233 215785,366 215786,1860 215787,1858 215788,1715 215789,455 215790,1177 215790,182162 215791,707 215792,56 215793,422 215795,491 215796,215797 215798,1688 215799,762 215799,1243 215802,968 215804,272 215804,538 215804,4611 215805,1085 215806,707 215807,215276 215808,1566 215809,388 215810,980 215811,215812 215813,1381 215814,301 215816,355 215816,204093 215817,450 215818,1381 215819,1773 215820,784 215820,204093 215821,104 215821,406 215822,269 215822,784 215822,1556 215822,1882 215822,2646 215822,2775 215822,13980 215823,355 215824,477 215825,212914 215826,206 215827,491 215828,1893 215829,33611 215830,60576 215831,346 215831,571 215832,328 215833,596 215834,1381 215835,22 215836,781 215837,1132 215838,1860 215839,1858 215841,781 215842,215276 215843,1132 215844,1425 215845,115474 215846,694 215847,1381 215849,269 215850,81 215850,588 215850,590 215851,649 215852,340 215852,644 215852,668 215853,1858 215854,1860 215855,5405 215856,707 215857,781 215858,254 215859,1132 215860,356 215863,647 215864,215865 215866,50 215867,1068 215868,1381 215869,3695 215870,808 215871,457 215871,525 215871,577 215871,1392 215871,1531 215872,579 215873,346 215874,11 215874,20 215874,22 215874,167 215874,186 215874,195 215874,207 215874,209 215874,240 215874,264 215874,301 215874,302 215874,314 215874,420 215874,441 215874,479 215874,505 215874,510 215874,536 215874,697 215874,712 215874,843 215874,852 215874,872 215874,911 215874,918 215874,968 215874,972 215874,980 215874,1010 215874,1085 215874,1089 215874,1267 215874,1293 215874,1326 215874,1345 215874,1370 215874,1381 215874,1402 215874,1531 215874,1566 215874,1655 215874,1837 215874,1844 215874,1893 215874,1992 215874,2334 215874,2400 215874,2512 215874,3392 215874,3507 215874,3804 215874,4276 215874,5213 215874,6837 215874,8276 215874,21442 215874,75912 215874,115474 215874,118336 215874,164100 215874,215276 215874,215874 215874,230271 215874,242246 215874,255670 215874,256217 215874,256945 215874,258709 215874,260126 215874,262531 215874,263959 215875,63471 215876,3999 215876,191860 215877,332 215878,192 215878,1381 215879,577 215879,3367 215879,138686 215880,3999 215882,346 215883,176935 215884,3695 215885,14556 215886,1381 215887,1082 215888,346 215889,1551 215889,3999 215890,1740 215891,309 215891,310 215892,65 215893,3695 215894,801 215895,142426 215896,162599 215897,920 215898,431 215899,1773 215900,275 215901,3999 215902,36819 215903,142426 215904,292 215904,338 215904,609 215904,626 215904,673 215904,1688 215904,4039 215904,37414 215905,760 215905,1149 215905,1631 215906,215 215906,1511 215906,3069 215907,179170 215908,491 215909,1452 215910,60576 215911,22 215912,3555 215913,179170 215915,75912 215916,818 215917,450 215918,252 215918,1220 215918,1222 215919,707 215920,433 215921,65 215921,467 215921,868 215922,663 215923,202 215924,647 215925,344 215926,146 215926,92476 215927,850 215928,48505 215930,30331 215931,389 215932,3094 215933,217 215933,1417 215934,431 215934,455 215935,358 215936,55849 215938,991 215939,1241 215941,422 215942,809 215943,195 215943,493 215944,422 215945,422 215946,142879 215947,422 215948,32475 215949,422 215950,422 215951,422 215952,422 215953,422 215954,142473 215956,1467 215957,422 215958,422 215959,4039 215960,79 215962,50 215963,3999 215963,191860 215964,818 215965,214131 215966,163 215967,163 215968,3 215969,818 215970,1132 215971,1740 215972,37 215972,1370 215973,72 215974,158 215975,2421 215976,217 215977,2266 215978,4637 215979,1201 215980,215276 215980,230518 215981,2779 215982,6695 215983,37414 215984,3003 215985,1381 215985,1608 215986,44 215988,32475 215989,636 215990,163 215991,163 215992,491 215993,868 215994,563 215995,13661 215996,3 215997,14556 215998,163 215998,811 215998,893 215999,302 216000,178 216001,83 216003,1707 216004,818 216005,2253 216005,142426 216006,48 216007,4548 216008,56 216009,422 216010,158 216011,285 216012,290 216012,714 216012,1511 216012,33424 216012,94134 216013,1287 216014,1381 216015,720 216016,41 216016,760 216017,850 216018,3695 216020,1467 216021,1010 216022,615 216023,1544 216024,781 216025,1132 216026,50 216027,13137 216028,6955 216029,1707 216030,2701 216031,2620 216032,356 216033,1962 216034,1359 216035,252 216036,392 216037,1381 216038,406 216038,628 216039,647 216040,146 216040,92476 216041,344 216042,2334 216043,171 216045,195 216046,483 216046,1298 216047,752 216048,30 216048,72 216048,592 216049,3507 216051,758 216052,37 216053,1860 216054,1858 216055,3804 216056,217 216057,360 216058,255 216059,163 216060,179170 216061,1 216062,77 216064,240 216065,1715 216066,631 216067,217 216068,178 216069,178 216070,216071 216072,609 216073,1220 216073,1222 216074,516 216075,252 216076,106 216077,596 216078,503 216079,1298 216080,272 216081,805 216082,1849 216083,75912 216085,301 216085,972 216085,1118 216085,3524 216086,433 216087,200 216088,515 216089,467 216090,16196 216091,1860 216092,1858 216093,422 216094,3209 216095,301 216095,615 216096,781 216097,1132 216098,2744 216099,707 216100,467 216101,1769 216102,178 216104,1462 216104,8537 216105,130 216107,252 216108,1326 216109,390 216110,1085 216111,1010 216112,1381 216114,27057 216115,685 216116,30 216117,171 216119,784 216120,222 216121,1132 216122,781 216123,3804 216124,1019 216125,3260 216127,1454 216128,3585 216129,23783 216131,500 216132,2775 216133,1052 216134,1962 216135,54 216136,1882 216139,1417 216140,1417 216141,1227 216141,86416 216142,56 216143,422 216144,10 216144,50 216144,79 216144,119 216144,147 216144,158 216144,192 216144,195 216144,211 216144,222 216144,298 216144,309 216144,310 216144,406 216144,567 216144,577 216144,615 216144,622 216144,640 216144,652 216144,671 216144,693 216144,859 216144,1118 216144,1188 216144,1265 216144,1266 216144,1572 216144,1659 216144,1796 216144,2073 216144,2574 216144,2750 216144,3161 216144,3321 216144,3623 216144,4865 216144,4866 216144,5101 216144,5987 216144,8270 216144,25348 216144,32914 216144,101688 216145,79 216146,1140 216146,2443 216147,255 216148,1284 216149,4903 216150,75912 216151,1927 216153,178 216154,272 216155,1284 216156,163 216157,216157 216158,805 216160,779 216161,72 216162,344 216163,285 216165,202 216166,1238 216170,452 216170,1445 216171,515 216173,1452 216174,1474 216176,204124 216177,485 216178,1381 216179,682 216179,72439 216180,1619 216182,932 216183,818 216184,222 216186,13538 216187,310 216188,179170 216189,179170 216190,1436 216192,77 216193,179170 216194,271 216195,254 216196,360 216196,1474 216196,1544 216196,9457 216197,2590 216198,97 216199,6424 216201,14556 216202,1381 216203,1007 216204,120 216204,1353 216206,467 216207,1888 216208,467 216209,859 216210,1722 216211,579 216212,3804 216213,980 216214,420 216215,406 216217,3079 216218,918 216219,872 216220,422 216221,31122 216222,3193 216223,518 216224,2737 216225,640 216226,14797 216227,216228 216229,872 216230,697 216231,392 216232,299 216232,1319 216233,516 216238,1151 216239,1 216240,1001 216242,184 216243,179170 216244,483 216245,1860 216246,1858 216247,1556 216248,23287 216249,171 216250,1453 216251,160 216252,387 216253,240 216254,953 216255,94 216255,1511 216255,8180 216256,37414 216257,1639 216258,1590 216259,18726 216260,422 216261,2572 216262,467 216263,32 216263,392 216264,745 216264,3999 216264,5469 216264,6789 216265,3804 216266,31122 216267,3193 216268,518 216269,2737 216270,14797 216271,2797 216272,690 216274,996 216276,4594 216277,503 216278,179170 216279,151 216280,1381 216281,1858 216282,1860 216283,415 216283,1454 216284,372 216285,2735 216286,179170 216288,467 216289,968 216290,349 216291,929 216292,433 216293,14556 216294,264 216295,994 216296,779 216298,1722 216299,1151 216300,1070 216301,991 216302,8992 216303,1085 216304,138686 216305,175 216306,818 216307,818 216308,704 216309,1220 216309,1222 216310,252 216311,516 216312,171 216313,1509 216313,1551 216314,1326 216315,102 216316,1323 216317,408 216318,179170 216319,179170 216320,3538 216321,202 216322,171 216323,216324 216325,216324 216326,19413 216327,30 216328,392 216329,406 216330,1033 216331,216332 216333,34 216333,35 216333,973 216333,1133 216334,195 216335,216336 216337,294 216338,2574 216339,30 216341,1572 216343,718 216344,55849 216344,213089 216345,1227 216345,86416 216346,149 216347,155473 216348,30 216349,620 216350,267 216351,1181 216352,145240 216353,141912 216354,155473 216355,1181 216356,302 216357,406 216358,301 216359,818 216360,30 216361,422 216362,1515 216363,779 216364,50 216365,536 216365,657 216365,1118 216366,158 216367,1133 216368,332 216369,23437 216370,920 216371,588 216371,590 216371,1419 216372,1419 216373,885 216373,13704 216374,872 216376,1294 216377,390 216378,179170 216379,577 216380,31976 216381,333 216382,225 216383,192 216384,21442 216385,22 216386,273 216387,179170 216388,4672 216389,1359 216390,536 216391,843 216392,1522 216393,599 216393,1118 216394,179170 216395,34 216395,35 216396,536 216397,1769 216398,2411 216399,356 216399,1012 216400,1 216400,147 216401,179170 216402,162599 216403,1515 216404,30 216405,788 216406,8884 216407,862 216408,1345 216409,30 216410,1085 216411,178 216412,6424 216413,216414 216415,779 216416,209 216417,72 216418,107 216419,3367 216420,289 216420,290 216420,94134 216421,2867 216421,2868 216422,138686 216423,175 216425,34 216425,35 216426,130 216427,577 216428,155473 216430,34 216430,35 216431,72 216432,455 216433,872 216434,14126 216436,379 216437,217 216438,167 216438,2083 216438,73570 216439,609 216440,609 216441,211 216442,179170 216443,1801 216444,346 216445,113156 216447,285 216448,358 216449,216450 216451,285 216452,83 216453,250 216453,1684 216455,1359 216456,179170 216458,390 216459,179170 216460,188791 216461,312 216462,30 216464,179170 216465,216466 216467,179170 216468,1085 216469,30 216470,179170 216471,179170 216472,216473 216474,179170 216475,179170 216476,209 216477,179170 216478,874 216478,1210 216479,179170 216481,707 216482,485 216483,298 216484,179170 216485,850 216486,1821 216486,21736 216488,1773 216489,30 216490,5213 216491,323 216492,216493 216494,216495 216496,1544 216497,1860 216498,1858 216499,151 216500,1359 216501,179170 216502,179170 216503,30 216504,34580 216505,5 216505,1379 216506,589 216507,435 216507,439 216508,72 216509,30 216510,30 216511,302 216511,811 216511,893 216512,809 216513,30 216514,315 216516,79 216516,1722 216516,3182 216517,30 216518,106 216520,620 216521,509 216523,2674 216523,3003 216523,124668 216524,158 216525,240 216527,151 216528,1381 216529,3555 216530,252 216531,1240 216532,7757 216534,179170 216535,2116 216536,30 216537,2979 216539,50 216540,567 216540,750 216540,968 216540,1293 216541,1722 216542,31976 216543,302 216544,1509 216546,336 216547,199199 216548,215276 216549,7768 216550,1782 216552,1782 216555,1789 216557,204093 216561,252 216563,366 216564,31073 216565,302 216565,893 216566,1385 216567,704 216568,510 216569,337 216571,652 216573,808 216573,2266 216574,10 216574,178 216574,195 216574,222 216574,1572 216574,3297 216575,46 216576,392 216577,216578 216579,467 216581,536 216583,302 216584,663 216586,34 216586,536 216586,127158 216587,119 216588,431 216591,505 216592,994 216592,188791 216593,809 216594,31206 216595,907 216596,142870 216598,216599 216600,1801 216601,1238 216602,980 216603,5440 216604,1175 216605,312 216606,636 216607,392 216607,1151 216608,602 216609,1257 216610,1452 216611,1821 216611,21736 216612,1133 216613,163 216614,3218 216617,36819 216618,136 216618,137 216618,744 216618,750 216618,783 216619,134 216620,784 216620,3258 216620,28107 216623,50 216624,50 216625,140 216626,46 216628,1860 216629,718 216629,3830 216630,217 216632,349 216635,1284 216637,366 216641,577 216642,698 216642,85842 216642,205173 216642,222508 216642,236513 216642,237234 216643,111142 216644,5908 216645,104 216645,503 216645,1353 216645,3085 216646,216647 216648,893 216648,14556 216649,273 216650,493 216651,202 216652,1326 216653,217 216654,5662 216655,209 216656,1368 216658,1238 216659,1298 216660,673 216661,605 216662,838 216664,366 216665,862 216667,1359 216668,783 216669,2812 216669,215276 216670,3135 216671,422 216672,6888 216673,491 216675,818 216676,215276 216677,215276 216678,215276 216679,83 216680,215276 216681,65 216682,1454 216683,424 216684,217 216684,222 216685,1 216686,707 216687,491 216688,240 216689,273 216690,3367 216690,5911 216691,835 216693,142430 216694,1858 216695,1860 216696,216697 216696,254167 216698,79 216700,1298 216701,302 216704,233 216705,75912 216706,1837 216707,264 216709,1381 216710,403 216712,155473 216713,162599 216714,1105 216715,302 216715,344 216717,46631 216720,215276 216721,707 216723,1417 216725,204093 216726,302 216727,79 216728,1983 216729,204093 216730,4545 216730,56150 216731,433 216731,467 216732,216733 216734,1893 216734,7155 216736,450 216738,392 216740,46 216741,422 216742,204093 216743,50 216745,201298 216746,141912 216747,22293 216748,489 216749,536 216749,4672 216750,1220 216750,1222 216751,251 216752,252 216753,850 216756,784 216759,422 216760,216761 216762,140 216763,233 216764,209 216765,179170 216766,259 216766,264 216766,676 216767,138686 216768,422 216769,175 216770,1033 216771,179170 216772,422 216773,6059 216774,301 216775,204093 216776,515 216777,1465 216779,145240 216780,2334 216781,1949 216783,1257 216784,783 216784,1160 216784,103860 216785,269 216786,467 216786,868 216787,216788 216790,65 216791,557 216792,151 216793,30 216794,1241 216795,22 216796,1773 216797,390 216798,171 216800,1983 216801,14556 216802,30 216803,148742 216804,1707 216806,1849 216807,1474 216808,673 216809,1860 216810,1858 216811,301 216815,292 216816,5440 216817,216818 216819,1007 216820,2944 216821,30 216822,216599 216823,1379 216824,146 216824,92476 216825,647 216826,344 216827,332 216828,30 216829,30 216830,647 216832,179170 216833,1262 216835,1634 216836,30 216837,151 216838,1572 216839,707 216840,697 216841,1282 216842,1113 216843,5440 216844,97 216845,422 216847,2995 216848,8854 216849,704 216850,216851 216852,222 216852,1019 216854,1608 216855,707 216856,36819 216857,138686 216858,175 216859,171 216860,805 216860,818 216860,1955 216861,9029 216862,818 216863,781 216864,1132 216865,422 216866,491 216867,994 216868,240 216869,137 216870,2116 216871,422 216872,217 216872,1417 216873,1551 216874,422 216876,577 216877,994 216878,718 216879,809 216880,577 216881,1151 216882,40497 216884,447 216885,2775 216886,422 216887,216888 216889,145240 216891,2146 216892,1235 216892,1335 216893,179170 216894,491 216895,252 216896,491 216897,392 216898,1860 216899,4760 216900,6059 216901,312 216901,397 216901,4810 216902,5658 216903,4252 216904,623 216905,697 216906,6955 216907,3612 216908,595 216909,2274 216910,187 216912,147 216913,216914 216915,1803 216916,273 216917,491 216918,491 216920,2590 216921,1608 216922,1655 216923,1132 216924,433 216925,275 216926,5 216926,2048 216927,1133 216927,72439 216928,872 216929,83 216930,1429 216931,4571 216932,1227 216932,86416 216933,1313 216934,795 216935,207 216936,668 216937,781 216938,1132 216939,1 216939,252 216939,302 216939,333 216939,489 216939,749 216939,1012 216939,1332 216939,1590 216939,1634 216939,1927 216941,1849 216942,275 216943,30331 216944,994 216945,292 216946,707 216947,30 216948,216949 216950,447 216951,2775 216952,1634 216953,309 216953,310 216954,447 216955,2775 216956,707 216957,1659 216958,479 216959,717 216960,2048 216961,285 216963,1143 216964,179170 216965,1888 216966,269 216967,302 216968,1509 216969,932 216970,500 216971,366 216972,72 216973,179170 216974,285 216975,250 216975,1684 216976,1544 216977,30 216978,72 216979,309 216979,310 216980,44 216981,30 216982,216983 216984,30 216985,216986 216987,4597 216988,30 216989,127158 216990,707 216991,298 216992,1556 216992,2779 216992,118336 216993,216994 216995,779 216996,366 216997,392 216998,366 216999,1776 217000,14556 217001,707 217002,707 217003,1381 217004,217005 217006,1326 217007,102 217008,1323 217009,408 217010,1618 217010,213089 217011,707 217012,615 217013,163 217014,563 217015,83 217016,483 217018,30 217019,3602 217020,34 217020,5440 217021,23010 217022,980 217023,743 217024,19010 217025,315 217026,875 217027,1345 217028,32 217028,392 217028,644 217028,2699 217028,3003 217029,2315 217030,994 217031,179170 217032,179170 217033,273 217034,5101 217035,30 217036,447 217037,2775 217038,273 217039,481 217040,818 217041,217042 217043,30 217044,779 217045,4571 217046,707 217047,1359 217048,217049 217051,994 217052,697 217052,1769 217052,1893 217053,30 217054,30 217056,509 217056,510 217059,217060 217059,219178 217059,223236 217059,234841 217059,235708 217059,250297 217061,30 217064,217065 217066,217067 217068,493 217068,1265 217068,1266 217069,50 217070,217071 217072,493 217073,579 217073,872 217074,1381 217075,30 217076,250 217076,872 217076,1684 217077,217078 217079,433 217080,179170 217081,4218 217082,72 217083,996 217084,996 217085,996 217086,996 217087,120 217088,217089 217090,192 217090,493 217090,2205 217090,33424 217091,1070 217092,707 217093,72 217094,1227 217094,86416 217095,55849 217096,72 217097,142870 217098,206 217099,142433 217100,1177 217101,557 217102,217103 217104,557 217105,30 217106,707 217108,30 217109,1359 217110,843 217111,707 217112,30 217113,1803 217114,217115 217114,252891 217116,72 217117,217118 217119,433 217120,8270 217121,330 217122,179170 217123,179170 217124,4545 217124,56150 217125,179170 217126,119 217127,179170 217128,3623 217129,3623 217130,72 217131,3623 217133,179170 217134,179170 217135,72 217136,217137 217138,72 217139,273 217140,483 217141,843 217142,310 217143,1858 217144,3623 217145,1773 217146,1332 217147,1556 217148,636 217149,269 217150,1807 217151,298 217152,3695 217153,30 217154,119 217155,72 217156,184 217157,285 217158,640 217159,1012 217161,104 217163,72 217164,7155 217165,72 217166,41 217167,72 217168,217169 217170,72 217171,996 217172,72 217173,72 217174,72 217175,72 217176,1544 217177,72 217178,818 217179,1608 217180,72 217181,217182 217183,217184 217185,1227 217185,86416 217186,72 217187,3623 217188,424 217189,143 217190,217191 217192,107 217193,2416 217193,2417 217194,292 217195,179170 217196,179170 217197,338 217198,298 217199,72 217200,72 217201,788 217202,422 217203,1133 217204,3538 217205,19010 217206,72 217207,3 217208,1572 217209,366 217210,1417 217211,467 217212,2867 217212,2868 217213,392 217214,483 217215,366 217217,1749 217218,72 217219,217220 217222,422 217222,5405 217223,707 217224,217225 217226,1984 217227,599 217228,707 217229,707 217230,707 217231,5 217231,23701 217231,72439 217232,479 217234,1707 217235,707 217236,422 217237,422 217238,422 217239,422 217240,422 217241,422 217243,6556 217245,932 217246,107 217247,285 217248,217249 217251,44 217252,422 217253,3538 217254,2620 217255,312 217256,355 217257,652 217258,1381 217259,3804 217261,337 217262,968 217264,4771 217265,1522 217266,179170 217267,1983 217269,1544 217271,1544 217272,154408 217273,1544 217274,72 217275,217276 217277,217278 217279,3 217280,200 217282,30 217283,4237 217283,182162 217284,2646 217285,5101 217286,859 217287,1227 217287,86416 217288,179170 217289,996 217290,179170 217291,171 217292,1381 217293,50 217294,1058 217295,217296 217297,179170 217298,179170 217299,217300 217302,107 217302,2646 217303,217304 217305,72 217306,225 217307,72 217308,111142 217309,222 217310,72 217311,2979 217312,483 217314,60576 217315,3297 217316,240 217317,1 217318,50 217320,818 217321,994 217322,179170 217323,447 217324,2775 217325,1247 217325,164572 217326,3804 217327,72 217328,72 217329,1220 217329,1222 217330,996 217331,217332 217334,72 217335,167 217336,557 217337,557 217338,1359 217339,72 217341,1116 217342,996 217343,72 217344,72 217345,439 217346,1608 217347,2285 217347,2989 217347,2991 217347,14133 217347,127158 217347,217348 217349,1635 217350,707 217351,72 217352,72 217353,217354 217355,72 217356,2607 217359,72 217360,142473 217361,72 217362,1227 217362,86416 217363,72 217364,72 217365,72 217367,72 217368,477 217369,72 217370,72 217371,217 217372,72 217373,72 217375,269 217376,107 217377,58 217378,72 217380,285 217381,15573 217382,43203 217384,34 217384,35 217385,4597 217386,3804 217387,217388 217390,4672 217391,72 217392,72 217393,918 217394,217395 217396,72 217398,292 217399,83 217400,1544 217401,72 217402,294 217403,296 217404,298 217405,217406 217407,217408 217409,217410 217411,1151 217412,217413 217414,1379 217415,79 217416,360 217416,1769 217418,72 217419,171 217420,1068 217423,179170 217424,1467 217425,736 217426,217427 217428,1531 217430,493 217431,1707 217432,72 217433,875 217435,217436 217437,72 217438,1181 217439,104 217439,134 217439,135 217439,136 217439,137 217439,138 217439,557 217439,1368 217439,2105 217440,261 217440,493 217441,6298 217445,818 217446,1462 217446,8537 217448,1210 217451,3555 217452,146 217452,92476 217453,647 217454,344 217456,467 217457,406 217458,151 217459,1616 217459,44725 217462,2244 217463,4 217463,5 217464,589 217464,968 217464,1149 217464,1715 217466,3623 217467,217468 217467,218737 217467,219601 217467,220221 217467,223769 217467,226779 217467,227842 217467,227882 217467,231629 217467,234312 217467,238614 217467,238718 217467,240383 217467,251098 217467,251195 217467,252971 217467,253633 217467,254025 217467,254260 217467,255226 217467,257704 217467,257745 217467,259091 217467,261077 217467,261448 217467,264760 217470,217471 217470,249960 217472,2260 217473,736 217474,4672 217475,7360 217476,1238 217477,707 217478,278 217478,666 217478,718 217478,1151 217479,1572 217481,72 217482,1452 217483,314 217483,483 217483,852 217483,1001 217483,1011 217484,217436 217486,781 217487,1132 217488,142430 217489,72 217490,422 217491,1860 217492,438 217493,422 217494,422 217495,422 217496,422 217497,422 217498,422 217499,422 217500,743 217500,1983 217500,95152 217501,1132 217504,72 217505,44 217506,6888 217507,227 217507,609 217507,772 217507,1359 217507,1882 217507,1888 217508,2567 217509,283 217510,1133 217511,1293 217512,217513 217514,34 217514,4594 217515,10 217516,179170 217518,2744 217520,60576 217521,1544 217523,1544 217525,206 217527,1544 217528,493 217529,462 217531,13137 217532,222 217532,760 217533,10 217535,422 217536,81 217538,79 217539,124668 217540,179170 217541,406 217542,577 217543,3623 217544,83 217545,151 217546,217547 217549,2674 217549,3258 217550,3507 217553,1400 217554,1544 217555,397 217556,835 217559,431 217559,631 217560,358 217561,1707 217562,1531 217563,1001 217564,5906 217565,640 217566,209 217567,671 217568,217569 217571,1544 217573,269 217574,134 217574,200 217574,227 217574,292 217574,704 217574,1149 217574,1238 217574,1509 217574,1566 217574,2205 217574,4571 217574,33424 217575,120 217575,590 217576,447 217576,671 217578,227 217580,707 217582,707 217583,657 217583,2699 217584,1177 217585,171 217586,415 217587,5192 217588,178 217588,647 217588,1644 217589,516 217590,5250 217593,195 217594,315 217595,2744 217596,1381 217597,72 217599,1860 217600,1858 217601,1608 217602,2744 217604,134 217605,134 217606,349 217607,1359 217608,868 217609,72 217610,485 217611,217612 217613,1133 217614,171 217615,179170 217618,536 217619,264 217620,358 217621,83 217622,72 217623,41 217625,41 217627,809 217628,41 217630,142426 217632,852 217633,195 217634,58 217635,994 217636,46 217637,30 217638,536 217639,79 217641,868 217645,838 217647,557 217651,72 217652,920 217653,217654 217655,213089 217657,328 217658,30 217660,298 217661,179170 217662,781 217663,1132 217664,1572 217665,151 217666,435 217668,801 217669,1556 217670,516 217671,58 217672,994 217673,46 217674,58 217675,994 217676,46 217677,843 217678,217679 217681,360 217681,142409 217681,146280 217682,707 217683,252 217684,80266 217685,72 217686,72 217687,920 217688,167 217690,483 217691,34 217691,35 217692,72 217693,516 217696,72 217697,671 217698,72 217699,1381 217700,973 217701,175 217703,1608 217704,72 217705,217706 217707,72 217708,55849 217709,72 217710,217711 217712,72 217713,1511 217713,3069 217714,1644 217715,602 217716,1566 217717,3623 217718,72 217719,217720 217719,222913 217719,248447 217719,249619 217721,209 217722,72 217723,58 217724,994 217725,46 217726,1511 217726,3069 217727,58 217728,994 217729,46 217730,147 217731,217732 217733,779 217733,2931 217734,72 217735,72 217736,179170 217737,184 217738,328 217740,707 217741,718 217742,1782 217744,72 217745,72 217746,298 217747,485 217749,72 217750,72 217751,2867 217751,2868 217752,72 217753,160 217754,536 217755,250 217755,1684 217756,285 217757,179170 217758,30 217759,72 217760,261 217761,1151 217762,20359 217763,5591 217764,818 217765,315 217766,707 217768,217769 217770,3623 217771,72 217772,406 217773,79 217774,217775 217776,138686 217777,175 217778,217779 217780,707 217781,72 217782,707 217783,113156 217784,1359 217785,72 217786,707 217787,72 217788,707 217789,217790 217791,86416 217792,217793 217794,149 217796,179170 217797,4597 217798,72 217799,707 217800,217801 217802,217803 217804,272 217805,72 217806,1644 217807,179170 217808,328 217808,772 217808,1175 217809,577 217810,113156 217811,1379 217812,179170 217813,179170 217814,72 217815,285 217816,3623 217817,2744 217818,179170 217819,179170 217820,217821 217822,217823 217824,217825 217826,577 217826,1284 217827,1544 217828,2266 217829,406 217830,424 217831,56 217832,422 217833,779 217834,72 217835,72 217837,3804 217838,217839 217840,72 217841,497 217842,217843 217845,2312 217847,289 217847,290 217847,94134 217849,415 217850,4691 217851,72 217852,481 217855,217856 217857,809 217858,60576 217859,743 217860,707 217861,707 217862,13538 217863,1616 217864,366 217865,366 217866,72 217867,479 217867,1579 217867,1659 217869,107 217871,72 217872,1 217873,50 217874,647 217875,146 217875,92476 217876,344 217878,254 217879,151 217879,1402 217881,4545 217881,56150 217882,949 217883,704 217884,28107 217886,149534 217887,2421 217889,379 217892,1531 217895,859 217896,932 217897,516 217898,694 217901,217902 217903,707 217904,81 217905,217 217905,247 217905,251 217906,145751 217907,406 217908,422 217909,422 217911,707 217912,422 217913,422 217914,9015 217915,46 217916,58 217917,994 217919,1623 217920,10 217920,217 217920,267 217920,127158 217921,163 217922,142426 217923,217924 217925,707 217926,4276 217926,16687 217927,217928 217929,202 217930,179170 217931,707 217932,707 217933,30 217935,1608 217936,1132 217937,72 217938,3003 217939,1608 217940,1132 217941,536 217942,79 217943,707 217944,1132 217946,707 217947,841 217949,707 217950,1201 217952,83 217953,536 217954,707 217955,707 217956,707 217958,140 217959,60576 217960,309 217960,310 217961,1769 217962,536 217963,178 217964,1579 217965,422 217966,422 217967,422 217968,2421 217969,107 217970,818 217971,707 217972,422 217973,707 217975,718 217976,1058 217977,422 217978,422 217980,217 217980,1417 217983,251 217983,252 217983,516 217983,538 217983,925 217983,1220 217983,1222 217983,2567 217984,118336 217985,149 217986,439 217987,50 217988,302 217989,142473 217990,843 217991,707 217992,167 217992,73570 217993,3317 217994,2626 217995,142430 217997,247 217997,2867 217997,2868 217998,2083 217999,107 218001,6119 218002,707 218004,32475 218005,3582 218007,104 218007,557 218007,885 218007,1368 218007,1939 218007,5405 218007,13704 218010,1608 218011,179170 218012,179170 218013,120 218014,292 218014,408 218014,1844 218015,301 218016,192 218017,707 218018,718 218019,422 218020,1010 218020,142473 218021,707 218022,920 218023,218024 218025,918 218026,707 218027,422 218028,707 218029,217 218029,493 218030,707 218031,76096 218032,3 218032,192 218032,333 218033,622 218033,1033 218033,1388 218033,1531 218033,1590 218033,4455 218034,447 218035,2775 218036,1509 218037,34 218037,35 218038,179170 218039,389 218039,1072 218040,2701 218041,14483 218042,179170 218043,179170 218044,179170 218045,179170 218046,44 218048,3695 218050,46 218050,167 218050,326 218050,390 218050,783 218050,2572 218050,4222 218051,1707 218052,2443 218055,179170 218057,179170 218058,179170 218059,2620 218060,1556 218061,72 218062,994 218063,779 218065,406 218066,179170 218067,179170 218068,707 218069,1359 218070,707 218072,83 218073,179170 218074,22 218075,479 218076,5366 218077,179170 218078,195 218079,447 218080,2775 218082,179170 218083,2923 218084,4903 218085,190492 218087,557 218088,536 218089,2006 218091,20 218096,151 218098,3260 218099,83 218100,83 218102,1323 218103,102 218104,1326 218105,408 218106,536 218106,4672 218107,536 218108,3623 218109,491 218110,41 218112,1294 218113,7416 218114,818 218115,218116 218117,2209 218118,323 218119,1052 218119,9030 218120,179170 218121,146 218121,92476 218122,97 218123,1769 218124,107 218125,179170 218126,179170 218127,81 218128,2373 218129,1118 218130,2782 218131,35486 218132,743 218133,707 218134,72 218135,41 218136,477 218136,2553 218137,72 218138,30 218139,272 218140,179170 218141,707 218142,179170 218143,1019 218145,179170 218146,30 218147,885 218147,13704 218148,189303 218149,72 218150,30 218151,994 218152,30 218153,330 218154,72 218155,30 218156,707 218157,30 218158,30 218159,72 218160,72 218161,72 218162,218163 218164,1882 218165,72 218166,278 218167,179170 218168,72 218169,72 218170,366 218171,4455 218172,72 218173,72 218174,147 218175,72 218176,707 218177,707 218178,485 218179,298 218180,406 218181,3623 218182,206 218183,435 218184,4146 218185,7 218186,390 218187,843 218188,1227 218188,86416 218189,55849 218190,72 218191,72 218192,72 218194,30 218195,949 218196,138686 218197,175 218198,1151 218199,2867 218199,2868 218200,1363 218201,30 218202,707 218203,6298 218204,179170 218205,184 218206,250 218206,1684 218207,2735 218208,285 218209,30 218210,72 218211,707 218212,2209 218213,72 218214,72 218215,30 218216,30 218217,3138 218218,1860 218219,1858 218221,1860 218222,1858 218223,72 218224,1860 218225,1858 218226,72 218227,179170 218228,72 218229,179170 218230,1085 218231,72 218232,30 218233,10 218233,113156 218234,10 218234,113156 218235,10 218235,113156 218236,10 218237,422 218238,72 218239,422 218240,422 218241,422 218242,218243 218244,422 218245,422 218246,72 218247,10 218248,10 218249,422 218250,781 218251,1132 218252,72 218253,72 218254,218255 218256,3623 218257,346 218258,218259 218260,72 218261,10 218262,10 218263,10 218264,10 218265,10 218266,10 218268,72 218269,10 218270,10 218271,10 218272,10 218273,10 218274,10 218275,483 218276,10 218277,10 218278,10 218279,10 218280,10 218281,10 218282,5405 218283,10 218284,179170 218285,2867 218285,2868 218286,72 218287,72 218288,1769 218289,72 218290,72 218291,10 218292,1414 218293,422 218294,422 218295,1769 218296,1085 218297,72 218298,72 218299,72 218300,809 218301,72 218302,218303 218304,142405 218305,179170 218306,920 218307,72 218308,992 218309,392 218310,366 218311,366 218312,366 218313,72 218314,179170 218315,179170 218316,179170 218317,72 218318,187 218319,72 218320,1509 218321,218322 218323,1462 218323,8537 218324,269 218325,192 218325,663 218326,179170 218327,179170 218328,9457 218329,707 218330,72 218331,1220 218331,1222 218332,252 218333,251 218334,72 218335,707 218336,2590 218340,1844 218341,595 218341,703 218342,366 218344,1769 218345,72 218346,707 218347,4611 218349,72 218350,3177 218351,707 218353,1544 218355,794 218358,1544 218359,1544 218360,1363 218363,390 218365,1544 218368,83 218369,9457 218371,4672 218373,628 218374,707 218375,209 218376,340 218378,218379 218380,649 218381,707 218382,1860 218383,1858 218384,932 218385,1381 218386,510 218387,843 218388,255 218389,920 218391,1 218391,149 218391,89035 218391,118336 218392,1238 218393,16196 218394,932 218395,2944 218396,218397 218398,985 218399,1452 218400,485 218402,13661 218403,218404 218405,920 218406,120 218407,589 218408,1274 218409,218410 218411,3094 218412,1160 218415,433 218416,1160 218417,693 218418,671 218419,10 218420,179170 218421,389 218422,1160 218423,55849 218424,809 218425,346 218426,33298 218427,3370 218427,14453 218428,179170 218429,1465 218430,1608 218431,877 218432,83 218433,622 218434,779 218435,1181 218436,852 218437,431 218439,87 218439,392 218440,1220 218440,1222 218441,58 218442,994 218443,46 218444,2315 218445,104 218445,557 218445,953 218445,954 218446,518 218446,1436 218447,1707 218448,151 218449,179170 218450,179170 218451,58 218452,994 218453,46 218454,818 218455,127158 218457,58 218458,994 218459,46 218460,346 218462,138686 218463,175 218464,217 218465,707 218466,147 218467,54 218468,120 218470,30 218471,422 218472,218473 218474,33298 218476,272 218477,843 218478,218479 218480,671 218481,104 218482,336 218483,202 218485,44 218486,3582 218487,1326 218488,218489 218488,219539 218490,843 218491,3623 218492,272 218493,707 218494,1381 218496,994 218498,818 218499,202 218500,1803 218501,843 218502,302 218503,58 218504,994 218505,46 218506,996 218507,861 218508,41 218509,2512 218510,218511 218513,843 218514,422 218514,5405 218515,302 218516,213089 218517,118336 218518,41 218519,333 218520,994 218521,360 218522,55849 218523,707 218524,403 218525,861 218526,1132 218527,179170 218528,3507 218529,269 218530,179170 218531,179170 218532,218533 218532,250343 218532,260000 218532,261444 218535,217 218536,192 218537,843 218538,843 218539,218540 218541,192 218542,4220 218543,702 218544,1556 218545,358 218545,509 218546,54 218547,1608 218548,1132 218549,657 218550,435 218551,3653 218552,151 218553,218554 218555,707 218556,843 218557,142426 218558,179170 218559,218560 218561,707 218562,278 218563,592 218564,179170 218565,515 218566,485 218567,106 218567,1033 218569,1014 218570,1014 218571,1014 218572,1014 218573,4237 218573,182162 218574,289 218574,290 218575,72 218576,41 218576,1462 218576,8537 218577,179170 218578,179170 218579,1014 218580,179170 218581,179170 218582,179170 218583,994 218584,211 218585,994 218585,1571 218586,1087 218588,1160 218589,240 218590,3582 218591,1983 218592,151 218593,285 218594,1227 218594,86416 218595,179170 218596,340 218597,333 218598,179170 218599,1220 218599,1222 218600,218601 218600,224816 218600,242890 218600,252251 218602,179170 218603,1566 218604,83 218605,218606 218607,1058 218608,218609 218610,415 218611,179170 218612,149 218613,179170 218615,179170 218616,5906 218617,626 218618,557 218619,278 218620,137 218621,1 218622,862 218623,1522 218623,3422 218624,124668 218627,406 218628,30 218629,30 218630,483 218631,72 218632,1118 218633,250 218633,1684 218634,285 218635,218636 218637,949 218638,151 218639,179170 218640,251 218641,1370 218641,21736 218642,1014 218643,1860 218644,1858 218645,218646 218647,707 218648,72 218649,707 218650,31977 218650,214530 218650,221340 218652,1181 218653,22 218654,3260 218655,360 218656,72 218657,1014 218658,72 218659,356 218660,72 218661,147 218662,1181 218663,34 218664,588 218664,590 218665,2750 218666,516 218667,1417 218668,1860 218669,1858 218670,634 218671,1298 218672,379 218673,138686 218674,175 218675,937 218675,221828 218675,224610 218675,227376 218676,72 218677,72 218679,3999 218680,1801 218681,30 218682,285 218683,707 218684,58 218685,994 218686,46 218688,30 218689,422 218690,422 218691,422 218692,422 218693,422 218694,843 218695,422 218696,422 218697,422 218698,422 218699,422 218700,818 218701,356 218702,267 218703,841 218704,202 218705,83 218706,72 218708,218709 218710,179170 218711,872 218712,72 218713,72 218714,86832 218715,72 218716,72 218717,422 218718,422 218719,217 218720,54 218721,218722 218723,218724 218726,206 218727,72 218728,996 218729,843 218730,179170 218732,491 218733,72 218734,2244 218735,179170 218736,72 218738,179170 218739,179170 218741,148885 218741,200543 218742,707 218743,285 218744,58 218745,994 218746,46 218747,3 218748,179170 218749,1544 218750,4611 218751,1544 218752,4611 218753,50 218754,1167 218754,2979 218755,1572 218756,663 218757,1 218757,218758 218759,577 218759,1070 218760,218761 218760,220692 218762,1172 218764,218765 218766,179170 218767,72 218767,805 218768,179170 218769,1381 218773,72 218774,292 218776,3524 218777,254 218778,1955 218780,1551 218781,218782 218783,2083 218784,346 218786,707 218787,218788 218789,83 218791,704 218793,968 218794,333 218795,577 218798,872 218799,1238 218801,920 218802,2315 218803,1452 218804,932 218805,577 218806,5034 218807,346 218808,1381 218809,1220 218809,1222 218810,252 218811,516 218812,218813 218814,218813 218815,218813 218816,14231 218817,1769 218818,392 218819,2668 218820,717 218820,1556 218821,4597 218822,218823 218824,1544 218825,3507 218826,179170 218829,179170 218830,149 218831,5908 218839,1556 218840,673 218841,1267 218842,44 218843,163 218844,83 218845,2421 218845,37414 218846,151 218847,218848 218849,2224 218850,1087 218851,138686 218852,175 218853,217 218855,366 218855,640 218856,83 218857,34 218857,35 218857,313 218857,634 218857,852 218857,1313 218857,1718 218857,2224 218857,2646 218857,5326 218859,179170 218861,1243 218862,252 218863,54 218864,55849 218865,535 218866,118336 218867,1284 218871,31073 218872,10 218874,83 218876,30 218877,217 218878,14368 218879,462 218880,218881 218882,30 218884,167 218884,240 218884,247 218884,301 218884,390 218884,657 218884,818 218884,968 218884,1160 218884,1300 218884,187176 218886,1160 218887,215276 218888,493 218889,687 218890,346 218891,72 218892,609 218893,346 218894,218895 218896,1210 218897,346 218898,1414 218899,54 218900,155473 218901,20535 218902,179170 218903,142426 218905,577 218907,218908 218909,179170 218910,179170 218911,1072 218912,1175 218913,918 218914,2421 218915,179170 218916,179170 218917,483 218918,127158 218919,1531 218920,731 218921,649 218922,4594 218923,202 218923,516 218924,113156 218925,1175 218925,1805 218926,264 218927,179170 218928,843 218929,138686 218930,175 218932,1608 218933,2923 218934,259 218935,1556 218936,1133 218937,213089 218938,179170 218939,697 218939,1769 218940,211 218941,142870 218942,1556 218943,1381 218944,515 218945,171 218946,417 218946,2296 218947,151 218948,179170 218949,1 218950,312 218951,218952 218953,2373 218954,1608 218955,1132 218956,2073 218957,41 218958,118336 218959,72 218960,885 218960,13704 218961,71 218962,179170 218963,1132 218964,179170 218965,509 218966,527 218967,1016 218967,2379 218968,467 218969,4 218969,5 218970,72 218971,54 218972,15179 218973,581 218974,72 218975,7360 218976,515 218976,3258 218977,346 218979,491 218980,138 218981,865 218982,557 218983,137 218984,88820 218985,138 218986,865 218987,557 218988,137 218989,88820 218990,1220 218990,1222 218991,516 218992,252 218993,1381 218994,346 218995,72 218996,707 218997,138686 218998,175 218999,392 218999,918 219000,179170 219001,72 219002,1556 219004,510 219005,2168 219006,1220 219006,1222 219007,516 219008,252 219009,192 219009,1623 219010,557 219011,1659 219012,135 219013,135 219014,72 219016,406 219017,72 219018,346 219019,72 219020,1381 219021,704 219022,138 219023,865 219024,557 219025,137 219026,88820 219027,1238 219029,1227 219029,86416 219030,118 219030,4597 219031,81070 219032,151 219033,72 219034,240 219035,818 219036,349 219037,1769 219038,252 219039,138686 219040,175 219041,707 219042,247 219043,30331 219044,1544 219045,4611 219046,6424 219047,72 219048,179170 219049,147 219050,1220 219050,1222 219051,516 219052,252 219053,147 219053,158 219053,240174 219055,1014 219056,72 219057,500 219058,1962 219059,1052 219060,54 219061,1882 219062,2775 219063,631 219064,72 219065,72 219066,872 219067,54 219068,332 219068,1119 219068,1745 219068,127158 219069,15748 219070,422 219071,422 219072,422 219073,422 219074,422 219075,422 219076,422 219077,285 219078,72 219079,3370 219079,14453 219080,179170 219081,54 219083,1769 219084,72 219085,179170 219086,918 219088,72 219089,72 219090,179170 219091,219092 219093,285 219094,250 219094,1684 219095,422 219096,72 219097,72 219098,72 219099,422 219100,422 219101,422 219102,179170 219103,219104 219105,179170 219106,219107 219109,179170 219110,219111 219112,179170 219115,422 219116,72 219117,72 219118,72 219119,72 219120,202 219120,336 219120,622 219121,72 219122,843 219123,1227 219123,86416 219124,56 219125,422 219126,72 219127,918 219128,366 219129,72 219130,219131 219132,72 219133,344 219134,151 219135,832 219136,516 219137,1893 219137,7155 219138,72 219139,852 219140,392 219141,134 219142,219143 219144,56 219145,422 219146,1220 219146,1222 219147,516 219148,252 219149,2750 219150,200 219152,269 219153,1220 219153,1222 219154,516 219155,252 219156,219157 219158,1773 219159,255 219161,252 219161,1220 219161,1222 219162,805 219163,599 219165,920 219166,932 219167,219168 219169,1623 219170,1160 219171,932 219173,72 219174,994 219175,809 219176,72 219177,911 219179,219180 219181,252 219182,516 219183,1220 219183,1222 219184,647 219184,7155 219185,186 219185,3804 219186,874 219187,305 219188,1769 219189,217 219190,44 219191,272 219192,219193 219195,179170 219196,991 219197,736 219198,58 219199,994 219200,46 219201,5366 219202,4039 219204,273 219205,155473 219206,178 219207,640 219208,83 219209,1544 219209,1572 219210,72 219211,83 219212,2528 219213,58 219214,994 219215,46 219216,8270 219217,794 219218,634 219219,72 219220,107 219221,151 219222,1559 219223,55849 219224,1181 219225,596 219226,30 219227,1381 219228,10 219229,217 219229,240 219230,302 219232,72 219233,72 219234,155473 219235,875 219236,3623 219237,171 219238,781 219239,1132 219240,1572 219241,179170 219242,179170 219243,535 219243,2944 219244,219245 219246,794 219247,4903 219248,179170 219249,13136 219250,58 219251,994 219252,46 219253,54 219254,72 219255,1014 219256,1014 219257,843 219258,1014 219259,1014 219260,1014 219261,1014 219262,1014 219263,1014 219264,1014 219265,949 219266,195 219266,240 219266,332 219266,372 219266,431 219266,1285 219266,1309 219266,2512 219266,3328 219266,9015 219266,27041 219267,138686 219268,175 219269,1240 219269,1465 219270,55849 219271,151 219272,1715 219273,3209 219274,1655 219275,72 219276,994 219277,219278 219279,1381 219280,1113 219283,219284 219285,30 219286,8373 219287,72 219289,392 219289,697 219290,273 219292,83 219292,255 219293,304 219295,72 219296,179170 219297,141912 219298,805 219299,3003 219300,349 219301,707 219302,179170 219303,179170 219304,1227 219304,86416 219305,72 219306,72 219307,781 219308,1132 219309,72 219310,707 219311,1381 219312,809 219313,179170 219314,179170 219315,1085 219316,179170 219317,219318 219319,72 219320,179170 219321,179170 219322,1014 219323,179170 219324,79 219325,536 219326,1381 219327,525 219328,55849 219329,72 219330,7416 219331,2979 219332,219333 219334,219333 219335,1014 219336,292 219337,179170 219338,219339 219338,243969 219338,261213 219340,72 219341,179170 219342,406 219343,72 219344,4597 219345,186 219346,1381 219347,72 219349,72 219350,179170 219351,2646 219352,219353 219355,72 219356,147 219357,179170 219358,360 219359,179170 219360,1072 219362,58 219363,1381 219364,3623 219365,179170 219366,179170 219367,72 219368,72 219369,179170 219370,219371 219372,1616 219373,1235 219373,1335 219374,302 219375,179170 219376,179170 219377,1381 219378,142433 219379,50 219380,72 219381,1801 219382,1188 219383,158 219384,219385 219386,1381 219387,5405 219388,483 219389,3413 219390,3148 219391,219392 219393,918 219394,366 219395,366 219396,366 219397,634 219398,1381 219399,72 219400,302 219401,1388 219402,1773 219403,269 219405,2048 219406,859 219407,779 219408,918 219409,366 219410,179170 219413,48 219413,94 219413,273 219413,994 219413,1432 219413,2787 219413,14434 219414,366 219416,219415 219417,219415 219418,219415 219419,406 219420,219415 219421,219415 219422,219415 219423,219415 219424,219415 219425,219415 219426,219415 219427,1181 219428,2750 219429,1181 219430,1241 219431,333 219431,1102 219431,1257 219432,663 219433,227 219433,2379 219434,366 219435,148742 219436,843 219437,676 219438,219439 219441,3804 219442,72 219443,1551 219443,3041 219444,1227 219444,86416 219445,72 219446,872 219447,784 219448,1289 219449,219450 219451,179170 219452,1677 219453,455 219455,219456 219457,1160 219458,417 219459,137 219460,932 219461,195 219462,312 219463,151 219464,83 219465,87 219465,515 219465,2646 219465,2779 219465,16687 219465,136072 219470,219471 219472,422 219473,422 219474,422 219475,422 219476,422 219477,219478 219477,236230 219477,246643 219477,253678 219479,462 219480,219481 219483,219484 219486,422 219487,344 219488,422 219489,422 219490,422 219491,918 219492,349 219493,422 219495,422 219496,1635 219497,219498 219499,7572 219500,3 219501,843 219502,207837 219503,179170 219504,219505 219507,179170 219508,179170 219509,4571 219510,137 219511,657 219512,278 219513,406 219514,219515 219516,219517 219518,893 219519,647 219520,344 219521,219522 219526,483 219528,30 219529,179170 219530,154408 219531,158 219532,1893 219533,452 219534,1247 219534,164572 219535,184 219536,146 219536,92476 219537,1773 219538,240 219538,269 219540,179170 219541,80266 219542,219543 219544,72 219545,219546 219547,273 219548,9029 219549,73218 219550,219551 219552,179170 219553,862 219554,240 219555,179170 219556,58 219557,179170 219558,209 219559,10 219560,179170 219561,179170 219562,424 219563,179170 219564,872 219565,179170 219567,285 219568,250 219568,1684 219569,918 219571,30 219572,104 219573,179170 219575,918 219576,72 219577,72 219578,585 219580,72 219581,219582 219583,179170 219584,219585 219586,179170 219587,72 219588,392 219589,72 219590,843 219591,179170 219592,219593 219594,107 219595,2416 219595,2417 219596,292 219597,338 219598,298 219599,1133 219600,3538 219602,219603 219604,179170 219605,219606 219607,273 219608,647 219609,714 219610,1235 219610,20813 219610,92476 219611,5 219611,5366 219612,973 219612,1284 219613,219614 219615,366 219616,50 219617,72 219618,483 219618,1415 219619,200 219620,841 219621,30 219622,30 219623,1160 219624,10 219625,217 219626,631 219627,7 219628,30 219629,30 219630,219631 219632,151 219633,406 219634,141912 219635,44 219636,219637 219638,149 219640,406 219641,1544 219642,310 219642,3039 219644,483 219645,13546 219646,187 219647,9457 219648,137 219649,1580 219650,393 219651,2979 219652,72 219653,652 219654,195 219655,697 219656,72 219657,527 219658,2146 219659,1313 219660,843 219661,2048 219662,8270 219662,72439 219663,344 219664,1151 219665,79 219666,292 219667,479 219667,2991 219668,219669 219670,1467 219671,1467 219672,195 219673,302 219674,142433 219675,6661 219676,918 219677,219678 219679,302 219680,485 219681,6661 219682,184 219683,2434 219684,179170 219685,736 219686,72 219687,9024 219688,972 219689,366 219690,10 219691,179170 219692,918 219693,219694 219695,219696 219697,72 219698,918 219699,179170 219700,179170 219701,140 219701,1179 219702,179170 219703,195 219704,72 219705,72 219706,195 219707,219708 219709,72 219711,179170 219712,328 219713,647 219715,346 219716,447 219717,2775 219718,557 219719,6387 219720,3319 219721,2315 219722,346 219723,346 219724,1515 219725,994 219726,2506 219727,707 219728,872 219729,872 219730,485 219732,179170 219733,142433 219734,298 219735,1849 219736,1849 219737,219738 219739,1359 219740,179170 219741,179170 219742,264 219742,349 219742,652 219742,2312 219744,872 219746,818 219747,1425 219748,240 219749,8270 219749,72439 219750,179170 219751,347 219752,147 219753,292 219754,142473 219755,294 219756,296 219757,298 219758,219759 219760,843 219761,219762 219763,392 219765,516 219766,50 219767,187176 219769,1087 219771,72 219772,285 219773,202 219774,1241 219775,1224 219776,171 219777,1033 219778,7358 219778,7363 219779,146952 219780,58 219781,994 219782,46 219783,48 219784,292 219785,1893 219785,7155 219786,1381 219787,160 219789,615 219790,79 219791,4611 219792,1544 219793,30 219793,1179 219794,120 219795,1359 219796,187176 219797,206 219797,358 219797,611 219798,392 219800,219801 219802,171 219804,211 219805,1359 219806,171 219809,310 219809,3039 219811,6661 219812,481 219813,660 219814,843 219816,219817 219818,736 219820,1102 219821,595 219822,1309 219823,595 219824,809 219825,1707 219826,1400 219827,83 219828,1238 219829,1012 219830,6861 219831,217 219832,920 219833,1452 219835,1893 219836,171 219838,222 219839,1715 219840,932 219841,392 219842,483 219843,657 219843,2421 219844,1274 219845,14556 219846,156379 219848,79 219850,1531 219851,219851 219852,302 219853,179170 219854,2083 219857,1127 219859,328 219860,261 219860,333 219861,1849 219861,148742 219862,707 219863,801 219864,557 219865,192 219865,406 219865,602 219866,557 219867,171 219868,1085 219869,146 219869,92476 219871,781 219872,1132 219873,818 219875,868 219876,217 219877,83 219878,2168 219879,222 219880,536 219881,207 219882,406 219883,2620 219884,1282 219885,149 219886,1179 219887,217 219887,1417 219888,1381 219889,1715 219890,784 219891,949 219891,1274 219891,7698 219893,30 219894,516 219895,195 219895,393 219896,3582 219897,592 219898,671 219899,184925 219900,3769 219902,1769 219903,120 219904,911 219904,1285 219904,1663 219904,44725 219905,97 219907,835 219908,694 219912,1188 219913,1127 219915,707 219917,141912 219918,35486 219919,2367 219921,707 219922,264 219922,1551 219922,5440 219923,1860 219924,392 219925,4760 219926,623 219927,697 219928,6955 219929,3612 219930,48 219931,5658 219932,595 219933,2274 219934,4252 219935,6059 219937,2674 219938,302 219939,3695 219940,874 219941,779 219942,147 219942,158 219942,333 219942,406 219942,586 219942,663 219942,779 219942,841 219942,980 219942,1247 219942,2931 219942,4192 219942,4193 219942,8270 219942,8822 219942,31237 219942,164572 219943,1381 219944,1707 219945,994 219946,707 219948,1402 219949,6068 219951,994 219952,44 219953,707 219954,219955 219956,2017 219957,1860 219958,1858 219959,315 219959,346 219961,173366 219962,149 219963,83 219964,872 219965,173366 219966,2315 219969,264 219969,1033 219969,5440 219970,1220 219970,1222 219971,7416 219972,179170 219975,1381 219976,195 219977,1238 219978,179170 219979,79 219980,22 219981,1955 219981,3260 219982,994 219983,173366 219983,215874 219984,693 219984,6695 219985,1715 219986,1381 219987,292 219988,1130 219989,79 219990,818 219991,189839 219992,171 219993,534 219994,1274 219995,1238 219997,1127 219997,1893 219997,5547 219997,49057 219998,1983 219999,179170 220000,1001 220001,3999 220002,192 220002,333 220002,1149 220003,835 220004,173366 220005,220006 220007,953 220008,209 220008,893 220008,3769 220009,875 220010,192 220011,10 220011,326 220012,173366 220013,171 220014,827 220015,994 220016,1860 220017,1858 220018,179170 220019,1274 220020,3695 220021,422 220023,422 220024,422 220025,422 220026,209 220026,302 220027,422 220028,422 220030,301 220031,179170 220032,918 220033,179170 220034,707 220035,151 220036,483 220037,179170 220038,27041 220039,379 220040,8270 220041,1844 220043,1363 220044,994 220048,146 220048,92476 220049,344 220050,647 220051,220052 220053,6824 220053,223410 220054,647 220055,344 220056,146 220056,92476 220057,563 220058,151 220058,1634 220059,994 220060,179170 220061,1634 220062,179170 220064,875 220066,563 220067,104 220068,68 220068,631 220069,1769 220070,27041 220071,220072 220074,56 220075,179170 220076,23287 220077,20257 220078,151 220079,406 220080,743 220081,801 220082,1151 220084,179170 220085,344 220086,179170 220088,818 220089,332 220090,16683 220091,994 220092,179170 220093,1326 220094,788 220095,135 220096,563 220097,1085 220098,1265 220098,1266 220099,707 220100,179170 220101,158 220102,422 220103,10 220104,1368 220105,994 220106,1707 220107,220108 220109,79 220110,79 220111,179170 220112,179170 220113,313 220113,588 220113,590 220114,1181 220114,1515 220115,2373 220116,707 220117,518 220118,179170 220119,160 220119,818 220119,127158 220120,994 220121,83 220122,707 220123,179170 220124,707 220125,179170 220126,9166 220127,301 220128,179170 220129,179170 220130,302 220130,406 220130,420 220130,1414 220130,1466 220131,707 220132,179170 220133,179170 220134,179170 220135,1572 220136,250 220136,1684 220137,179170 220138,285 220139,422 220140,707 220141,843 220142,158 220144,1635 220145,4 220145,5 220145,10 220145,50 220145,56 220145,79 220145,147 220145,158 220145,171 220145,192 220145,195 220145,206 220145,272 220145,323 220145,406 220145,602 220145,622 220145,628 220145,640 220145,693 220145,779 220145,841 220145,920 220145,957 220145,1149 220145,1235 220145,1247 220145,1335 220145,1515 220145,2244 220145,2719 220145,2867 220145,2868 220145,3370 220145,3876 220145,4865 220145,4866 220145,5359 220145,7270 220145,8180 220145,8270 220145,14352 220145,14453 220145,24505 220145,54064 220145,88018 220145,125569 220145,136574 220145,164572 220146,179170 220147,707 220148,1388 220148,1531 220148,4455 220149,7155 220150,113156 220151,158 220152,264 220152,652 220152,2312 220153,581 220154,119 220155,41 220156,918 220157,179170 220158,179170 220159,422 220160,179170 220161,179170 220162,179170 220163,805 220164,179170 220165,179170 220166,179170 220167,147 220168,707 220169,179170 220170,138686 220171,175 220172,179170 220173,4597 220174,179170 220175,10 220177,994 220178,1639 220179,72 220179,323 220179,479 220179,991 220179,1052 220179,1102 220179,1267 220179,1287 220179,1579 220179,1707 220179,2605 220179,2744 220179,4771 220180,389 220181,994 220182,875 220183,247 220183,252 220183,925 220183,1119 220183,1175 220183,1179 220183,1220 220183,3218 220183,255750 220184,707 220185,179170 220186,3769 220187,1191 220188,801 220189,467 220190,179170 220191,15573 220192,452 220193,30 220193,1462 220194,7270 220195,1414 220195,4193 220196,447 220197,2775 220198,179170 220199,179170 220200,179170 220201,2944 220202,1509 220203,72 220204,179170 220205,918 220206,179170 220207,707 220208,179170 220209,269 220210,171 220211,179170 220212,333 220213,862 220214,83 220215,179170 220216,83 220217,994 220218,1133 220219,285 220220,250 220220,1684 220222,202 220223,240 220224,269 220225,366 220226,431 220226,589 220226,631 220226,862 220226,994 220226,1001 220226,2590 220227,2244 220228,366 220229,704 220230,179170 220231,30 220232,4101 220233,179170 220234,113156 220235,849 220236,685 220237,911 220238,809 220238,861 220239,1849 220240,1085 220241,179170 220242,220243 220244,149 220245,991 220246,1644 220246,4193 220247,34 220247,4039 220248,1265 220248,1266 220249,2701 220250,179170 220251,138686 220252,175 220253,4597 220254,179170 220255,493 220255,1266 220256,179170 220257,72 220258,843 220259,1012 220260,273 220261,30 220262,30 220263,626 220264,1531 220265,1085 220265,2296 220266,366 220267,1160 220268,1085 220269,72 220271,1773 220273,1454 220274,179170 220275,516 220276,72 220277,10 220278,1707 220279,346 220280,202 220281,1801 220281,3182 220282,142433 220283,2590 220285,589 220285,1085 220285,1663 220285,75912 220285,127158 220287,2590 220287,5101 220288,1801 220290,213089 220291,994 220294,344 220295,577 220295,138686 220296,222 220296,5343 220297,147 220298,6068 220299,72 220300,310 220301,185877 220302,868 220303,206 220304,1564 220305,269 220306,1608 220307,1132 220308,994 220309,209 220310,1014 220311,920 220312,1014 220313,1634 220314,142426 220315,666 220315,783 220316,151 220317,1801 220317,4760 220317,5591 220317,6068 220318,1014 220319,1151 220320,1608 220321,1132 220322,1608 220323,1132 220324,752 220325,158 220325,2931 220325,8822 220327,3769 220328,179170 220329,30 220330,435 220331,179170 220332,1860 220333,1858 220334,818 220335,366 220336,1860 220338,994 220339,1608 220340,1132 220342,366 220343,1564 220344,994 220345,138686 220346,175 220347,167 220347,73570 220348,932 220349,1146 220351,1085 220352,1033 220353,1663 220354,1014 220355,707 220356,3 220357,1381 220358,1127 220360,312 220361,1247 220361,164572 220362,1274 220363,852 220364,752 220365,214734 220366,360 220368,310 220368,3039 220369,222 220370,360 220372,779 220373,83 220374,1274 220375,1551 220376,217 220377,406 220378,217 220379,1415 220380,1014 220381,1608 220382,356 220382,852 220384,640 220385,330 220386,211 220387,707 220390,86 220390,167 220390,301 220390,783 220390,968 220390,1837 220391,160 220392,422 220393,1381 220394,994 220395,596 220396,162599 220397,81070 220398,1837 220399,147 220401,158 220402,707 220403,503 220404,422 220405,22 220406,205627 220407,162599 220407,221299 220408,186522 220409,818 220410,151 220411,209 220412,707 220413,994 220416,994 220417,81 220418,994 220420,81 220421,3653 220423,44 220425,328 220426,387 220427,493 220427,191860 220428,707 220429,1151 220432,1284 220433,273 220434,8180 220435,422 220436,676 220437,422 220438,422 220439,422 220440,422 220443,875 220444,349 220445,10 220447,22 220448,79 220449,1179 220450,720 220451,3846 220452,107 220453,406 220454,634 220456,209 220457,30 220458,217 220458,2580 220458,5213 220459,795 220460,1001 220461,406 220461,1181 220462,220463 220462,238713 220464,30 220465,30 220466,328 220467,179170 220468,2244 220469,328 220471,422 220473,809 220474,2372 220475,752 220476,491 220477,30 220478,211 220479,697 220480,1479 220481,1132 220482,160 220483,30 220484,1962 220485,862 220486,809 220486,19010 220487,179170 220488,422 220489,1608 220491,355 220493,1132 220494,252 220495,179170 220496,875 220497,1663 220498,1381 220499,1014 220500,1147 220500,1559 220501,435 220502,1 220502,147 220502,149 220502,158 220502,406 220502,622 220502,1515 220502,15439 220502,21442 220502,55849 220502,220502 220503,392 220503,220502 220504,707 220505,918 220506,2411 220507,179170 220508,2944 220509,302 220510,72 220511,1860 220512,1858 220513,220502 220514,302 220515,422 220516,422 220517,30 220518,211 220520,179170 220522,1860 220523,1858 220524,30 220526,707 220527,1014 220528,707 220529,422 220530,179170 220531,3695 220532,843 220533,142426 220534,707 220536,48 220536,130 220536,312 220536,991 220536,1707 220536,2605 220536,3695 220536,155473 220538,918 220539,920 220540,760 220541,215 220542,72 220543,220544 220545,850 220546,79 220547,179170 220548,149 220549,30 220550,1014 220551,120 220552,301 220553,179170 220554,179170 220555,515 220556,707 220557,1052 220558,1962 220559,54 220560,500 220561,2775 220562,1882 220563,1608 220564,1132 220565,1608 220566,1132 220567,392 220567,3258 220568,707 220569,30 220570,1 220571,301 220571,1160 220572,30 220573,179170 220574,269 220575,567 220575,666 220575,2372 220576,1132 220577,30 220578,7360 220579,994 220580,146 220580,994 220580,4094 220580,92476 220581,151 220582,48 220584,973 220585,289 220585,290 220585,94134 220586,140 220586,1984 220587,30 220588,10 220589,179170 220590,179170 220591,264 220592,1556 220593,192 220594,809 220595,30 220596,301 220598,107 220599,179170 220600,3623 220601,752 220602,1247 220602,164572 220603,452 220604,184 220605,179170 220606,179170 220607,862 220608,2379 220609,179170 220610,563 220611,1789 220612,1014 220613,179170 220614,835 220615,1415 220617,147 220617,158 220617,314 220618,875 220619,1160 220620,994 220621,1085 220622,1715 220623,240 220624,631 220625,2244 220626,30 220627,707 220629,272 220630,160 220631,179170 220632,885 220632,13704 220633,8270 220634,179170 220635,1001 220636,779 220637,2244 220638,835 220639,2373 220640,707 220642,2421 220643,179170 220644,3623 220645,557 220646,4611 220647,179170 220649,179170 220650,179170 220651,389 220651,1849 220652,994 220654,34580 220655,2421 220656,115 220657,2353 220658,83 220659,179170 220660,264 220660,36819 220661,503 220661,4355 220662,360 220663,179170 220664,147 220664,1309 220665,146 220665,92476 220666,647 220667,344 220668,159365 220669,179170 220670,179170 220671,875 220672,673 220673,932 220674,1474 220675,1010 220676,390 220678,278 220679,2646 220680,83 220681,179170 220682,994 220683,2923 220684,179170 220685,1133 220686,179170 220687,142405 220688,996 220689,994 220690,994 220691,285 220693,1326 220694,217 220695,30 220695,32 220695,50 220695,58 220695,106 220695,111 220695,134 220695,146 220695,158 220695,178 220695,192 220695,200 220695,202 220695,206 220695,215 220695,225 220695,233 220695,252 220695,261 220695,272 220695,285 220695,333 220695,337 220695,346 220695,393 220695,406 220695,422 220695,439 220695,516 220695,525 220695,536 220695,538 220695,585 220695,586 220695,589 220695,592 220695,602 220695,609 220695,620 220695,626 220695,640 220695,671 220695,714 220695,760 220695,779 220695,862 220695,907 220695,925 220695,934 220695,968 220695,973 220695,980 220695,996 220695,1007 220695,1010 220695,1033 220695,1068 220695,1082 220695,1133 220695,1220 220695,1222 220695,1231 220695,1247 220695,1326 220695,1370 220695,1425 220695,1452 220695,1515 220695,1522 220695,1531 220695,1544 220695,1551 220695,1608 220695,1782 220695,1882 220695,1963 220695,2205 220695,2244 220695,2353 220695,2567 220695,2782 220695,2931 220695,2995 220695,3085 220695,3148 220695,3193 220695,3804 220695,4237 220695,4355 220695,4545 220695,5440 220695,5874 220695,6119 220695,7270 220695,8855 220695,9007 220695,15573 220695,33424 220695,56150 220695,59021 220695,92476 220695,164572 220695,182162 220696,707 220697,707 220698,147191 220699,818 220700,973 220701,994 220702,994 220703,302 220704,994 220705,146 220705,92476 220706,647 220707,344 220708,779 220709,179170 220710,346 220711,707 220712,72 220714,179170 220716,330 220717,1058 220718,278 220719,2244 220720,10 220721,346 220722,147 220723,2244 220724,516 220725,179170 220726,875 220727,179170 220730,179170 220731,1014 220734,292 220735,994 220736,1381 220737,920 220738,994 220739,138686 220740,707 220741,175 220742,72 220743,220502 220744,994 220745,179170 220746,81 220746,215 220746,1016 220746,1282 220746,9001 220747,795 220748,179170 220749,1298 220750,79 220751,1363 220752,179170 220753,994 220754,15573 220755,5961 220756,2116 220757,1014 220758,4571 220759,3623 220760,147 220761,818 220762,179170 220763,932 220764,179170 220765,994 220766,760 220766,1631 220767,577 220768,483 220769,707 220770,255 220771,302 220772,158 220772,192 220772,206 220772,285 220772,406 220772,422 220772,424 220772,493 220772,779 220772,2244 220772,5101 220772,142433 220773,179170 220774,72 220775,994 220776,861 220777,217 220778,3367 220779,783 220780,1467 220781,1019 220782,83 220783,278 220784,536 220785,179170 220786,516 220787,8270 220788,179170 220789,179170 220790,220791 220793,298 220794,485 220795,918 220796,333 220796,23783 220797,72 220799,1623 220800,1309 220801,72 220802,220803 220804,483 220805,811 220806,3623 220807,220808 220809,424 220810,30331 220811,41 220812,83 220813,590 220813,1419 220814,6955 220814,17263 220815,220816 220816,220817 220818,1227 220818,86416 220819,289 220819,290 220819,94134 220820,968 220821,142870 220822,171 220823,72 220824,1551 220825,220826 220827,220828 220829,195 220830,81 220831,323 220832,479 220833,217 220834,615 220835,1740 220836,872 220837,179170 220838,1429 220839,2590 220840,292 220841,247 220842,589 220842,862 220842,1001 220842,1474 220842,44725 220843,138686 220844,175 220845,247 220847,4192 220847,4193 220848,220849 220850,207 220851,97 220852,72 220853,1001 220854,843 220855,72 220856,563 220857,1467 220858,250 220858,1684 220859,285 220860,455 220861,220862 220863,779 220864,273 220865,2424 220866,862 220866,2590 220867,1871 220868,2421 220869,83 220870,13980 220871,72 220872,285 220873,31934 220874,31934 220875,31934 220876,159365 220877,850 220878,240 220878,5310 220879,72 220880,467 220881,115659 220882,1143 220883,220884 220885,72 220885,195 220886,1821 220886,21736 220887,668 220888,660 220889,259 220891,259 220892,991 220893,4475 220894,1608 220895,1132 220897,160 220898,136072 220899,3830 220900,120 220900,2797 220900,2807 220900,2812 220901,1359 220903,220904 220905,1370 220906,1400 220907,366 220908,366 220909,366 220911,366 220912,309 220912,310 220914,1368 220915,1118 220916,557 220917,1368 220919,6059 220920,285 220920,118336 220921,1425 220922,707 220924,1983 220925,949 220925,127158 220925,194645 220927,1722 220929,72 220930,393 220931,919 220932,151 220933,1 220935,118336 220936,536 220936,1417 220937,207 220938,3367 220939,217 220939,248 220939,714 220939,1016 220939,1119 220939,1282 220939,1417 220939,2205 220939,6556 220939,33424 220939,245910 220940,333 220941,818 220942,1132 220943,1608 220944,4237 220944,182162 220945,220502 220948,392 220949,516 220950,252 220951,1220 220951,1222 220952,1220 220952,1222 220953,251 220955,850 220956,920 220957,366 220958,366 220959,220960 220962,158 220963,1010 220964,111 220964,290 220964,309 220964,310 220964,94134 220965,41 220966,602 220969,5976 220971,932 220972,366 220973,50 220974,30 220975,5213 220976,422 220978,195 220980,217 220981,3094 220982,805 220983,1359 220984,485 220985,298 220986,366 220987,862 220987,1253 220988,83 220989,4611 220990,301 220990,657 220991,220992 220993,30 220996,306 220996,307 220996,406 220996,779 220996,1181 220996,4193 220997,1608 220998,1132 220999,422 221000,422 221001,217 221002,491 221003,422 221004,980 221005,422 221006,676 221007,652 221008,422 221009,422 221010,171 221011,211889 221012,1707 221013,422 221014,422 221015,147 221015,406 221016,422 221017,717 221018,707 221019,360 221020,1087 221021,1388 221022,30 221023,489 221024,1085 221025,179170 221026,221027 221028,516 221029,818 221030,585 221031,1149 221032,640 221033,736 221034,60576 221035,356 221036,657 221036,2266 221037,920 221038,2334 221039,536 221040,779 221041,875 221042,217 221043,503 221044,58 221045,1238 221046,392 221047,1836 221048,292 221049,1016 221050,1452 221051,805 221052,392 221052,644 221053,1639 221054,1773 221057,1033 221059,1052 221062,107 221063,1293 221064,1417 221065,518 221066,220502 221068,397 221068,1085 221068,2572 221068,2913 221068,4222 221068,18221 221068,99756 221068,185874 221068,185877 221069,442 221070,707 221071,21442 221072,994 221073,144556 221074,4611 221075,2244 221076,30 221077,1419 221080,473 221081,141912 221082,994 221083,5405 221084,397 221085,392 221086,68069 221088,115 221091,1860 221092,1858 221093,1359 221094,1294 221095,344 221096,3623 221097,30 221098,2421 221100,7124 221101,178576 221102,30 221103,422 221104,1955 221106,8270 221107,220502 221108,422 221109,2244 221110,30 221111,30 221112,30 221113,779 221114,72 221115,151 221116,313 221117,657 221118,1014 221119,138686 221120,175 221121,209 221122,273 221123,179170 221124,30 221125,450 221126,130 221127,221128 221129,302 221131,861 221132,179170 221133,843 221134,309 221134,310 221134,221292 221135,179170 221136,83 221137,1608 221138,1132 221139,1132 221140,1608 221141,1132 221142,179170 221144,19010 221145,422 221146,56 221147,422 221148,2421 221149,408 221149,581 221149,589 221149,647 221149,1623 221149,1718 221151,2750 221152,1052 221153,1962 221154,30 221155,54 221155,221301 221156,500 221157,1882 221158,2775 221159,30 221160,515 221161,179170 221162,302 221163,167 221163,73570 221165,120 221166,179170 221167,302 221169,267 221170,1007 221171,79 221171,779 221172,179170 221173,221174 221175,179170 221176,167 221176,338 221176,907 221176,1085 221176,1119 221176,1210 221176,1284 221176,2083 221176,2372 221176,3218 221177,220502 221178,589 221179,861 221179,6556 221180,147191 221181,220502 221182,179170 221183,58 221184,994 221185,46 221186,1001 221187,994 221188,1608 221189,493 221190,422 221191,56 221192,1782 221193,918 221194,4237 221194,182162 221195,406 221196,309 221196,310 221196,221292 221197,1556 221198,179170 221199,56 221200,422 221201,81 221201,592 221202,6119 221203,875 221204,13661 221205,179170 221206,179170 221207,652 221208,179170 221209,349 221210,483 221211,1132 221212,1608 221213,179170 221214,126 221215,179170 221217,328 221218,10 221219,95554 221220,179170 221221,6068 221222,225 221223,34 221223,6303 221224,1133 221225,4039 221226,4475 221227,5440 221228,1052 221230,577 221232,179170 221233,151 221235,179170 221236,179170 221237,1132 221238,1608 221239,179170 221241,179170 221243,179170 221244,188791 221245,81 221246,1147 221248,179170 221249,220816 221250,141912 221251,220816 221253,179170 221254,634 221256,994 221257,518 221259,269 221260,2244 221262,292 221263,179170 221264,50 221265,220816 221266,58 221267,994 221268,46 221269,1608 221270,1 221271,195 221272,179170 221273,1133 221274,563 221275,179170 221276,30 221277,179170 221282,1326 221282,221286 221283,408 221283,221287 221285,102 221285,221288 221289,1323 221289,221325 221290,179170 221290,221330 221295,58 221296,46 221296,221284 221297,994 221308,309 221308,310 221308,221292 221312,1769 221316,83 221316,221317 221318,217 221318,221319 221320,220816 221320,221321 221335,862 221335,221310 221337,703 221337,949 221337,2646 221337,3182 221337,3258 221337,221338 221342,999 221343,302 221344,360 221345,179170 221346,178 221347,137 221348,1769 221349,3623 221350,30 221351,30 221352,30 221353,433 221354,861 221355,9010 221356,30 221357,779 221358,957 221358,1815 221359,179170 221360,3830 221361,83 221362,56 221363,422 221364,179170 221366,220816 221367,179170 221368,4571 221369,179170 221370,179170 221371,220816 221372,422 221373,994 221374,918 221375,179170 221376,179170 221377,220816 221378,179170 221379,1220 221379,1222 221380,516 221381,252 221382,179170 221383,328 221383,1801 221384,60576 221385,220816 221387,994 221388,557 221389,179170 221390,278 221391,509 221392,250 221392,1684 221393,285 221394,179170 221395,255 221396,220816 221397,220816 221398,104 221398,1179 221398,5405 221399,142870 221401,220816 221403,1 221404,290 221404,479 221404,94134 221405,6068 221406,1151 221407,127158 221408,255 221410,220816 221411,179170 221412,220816 221413,158 221414,179170 221415,149 221416,220816 221418,5101 221418,15119 221419,151 221420,388 221421,46129 221421,213931 221422,1474 221423,673 221424,795 221425,220816 221426,30 221427,1608 221428,179170 221429,301 221430,30 221431,179170 221432,179170 221433,220816 221434,557 221435,278 221436,626 221437,137 221438,5906 221439,862 221441,994 221442,326 221443,220816 221444,220816 221445,142870 221447,179170 221448,1363 221449,779 221450,220816 221451,179170 221452,179170 221453,138686 221454,175 221455,179170 221456,586 221457,179170 221458,179170 221459,389 221460,104 221460,557 221460,885 221460,1368 221460,1939 221460,5405 221460,13704 221461,707 221462,179170 221463,220816 221464,406 221467,179170 221468,406 221469,79 221471,30 221472,919 221473,1151 221474,179170 221476,920 221477,422 221478,873 221478,874 221478,1210 221479,179170 221480,8854 221481,179170 221482,179170 221483,179170 221484,30 221485,48 221486,805 221488,344 221489,3331 221490,1238 221491,179170 221492,255 221493,137 221494,179170 221495,2867 221495,2868 221496,220816 221497,147 221498,994 221499,535 221500,220816 221501,72 221502,147 221502,149 221502,158 221503,220816 221504,452 221504,590 221505,707 221506,179170 221507,220816 221508,2244 221509,221510 221511,138686 221512,175 221513,247 221513,2867 221513,2868 221514,220816 221515,1379 221516,779 221517,54 221518,4237 221518,182162 221519,179170 221520,994 221521,220816 221522,994 221523,479 221523,9030 221525,179170 221526,179170 221527,220816 221528,272 221529,83 221530,666 221531,155481 221532,292 221534,221535 221536,3148 221537,179170 221538,179170 221539,994 221540,179170 221541,171 221542,142405 221543,179170 221544,79 221545,206 221546,1052 221547,19 221547,222 221547,536 221547,781 221547,1274 221547,2553 221547,14556 221547,115474 221548,577 221549,158 221550,994 221551,30 221552,1368 221553,221554 221553,250056 221555,179170 221556,1313 221557,818 221558,2116 221559,285 221560,323 221561,179170 221562,37 221562,264 221562,1289 221562,16687 221563,17772 221564,1227 221564,86416 221565,171 221566,83 221567,30 221568,247 221570,30 221571,137 221572,3182 221573,467 221575,309 221575,310 221575,6556 221576,30 221577,918 221578,491 221579,585 221580,267 221581,1163 221582,200 221583,137 221584,149 221585,707 221587,141912 221588,337 221590,9195 221591,205 221592,652 221593,510 221593,1453 221594,2416 221594,2417 221595,581 221596,178 221597,1227 221597,86416 221598,2416 221598,2417 221599,30331 221600,42220 221601,151 221602,304 221603,2416 221603,2417 221605,42220 221606,151 221607,1381 221608,862 221609,2590 221610,30 221611,1368 221612,96187 221613,4597 221614,2048 221615,2416 221615,2417 221616,5343 221617,1572 221618,179170 221619,1274 221620,5726 221621,8180 221622,221623 221624,56 221625,422 221626,872 221627,179170 221628,179170 221629,79 221630,310 221631,1102 221632,179170 221634,323 221635,1332 221636,211 221637,615 221638,178 221639,221640 221641,1429 221642,220502 221644,4597 221645,2744 221646,668 221647,500 221648,138686 221649,175 221650,697 221650,1769 221651,3297 221652,985 221653,1132 221654,3182 221656,671 221657,1298 221658,726 221659,726 221660,147 221660,158 221664,222 221665,220502 221666,1285 221666,44725 221667,707 221668,779 221669,221670 221673,387 221674,991 221675,60576 221676,135 221677,3367 221678,136 221679,222 221680,1644 221681,1345 221682,206 221683,104 221683,557 221683,885 221683,1368 221683,1939 221683,5405 221683,13704 221684,272 221685,207 221686,4165 221689,4594 221690,1608 221691,221692 221693,397 221694,1240 221695,872 221697,211 221698,221699 221698,227902 221700,1293 221703,83 221703,217 221703,949 221703,1467 221704,592 221705,56 221706,422 221707,3367 221708,1607 221710,190492 221711,599 221713,178 221714,1639 221716,1160 221717,599 221718,640 221719,640 221720,640 221721,1608 221722,233 221722,973 221722,4146 221723,179170 221724,167 221725,7757 221726,138686 221727,175 221728,179170 221729,30 221730,567 221730,1300 221730,1580 221730,103860 221730,186657 221731,30 221732,79 221733,30 221734,760 221734,1436 221735,818 221736,221737 221739,818 221740,1007 221741,221742 221745,1381 221746,920 221747,149 221747,21442 221748,2979 221749,366 221750,366 221751,366 221752,366 221753,1467 221754,179170 221756,707 221757,1836 221758,1298 221759,4672 221760,1359 221761,707 221762,221763 221764,221765 221766,707 221767,30 221768,1274 221769,509 221770,1634 221771,30 221772,138686 221773,175 221774,707 221775,3094 221776,273 221777,83 221778,707 221779,1608 221780,1132 221781,707 221782,1634 221783,515 221784,273 221785,8235 221786,271 221787,5976 221788,217 221789,875 221791,8270 221792,991 221793,220502 221794,3582 221795,1776 221796,450 221797,7270 221798,1238 221799,1634 221800,158 221801,1132 221802,707 221803,707 221804,1556 221804,4453 221805,217 221806,479 221807,479 221808,1452 221809,653 221809,48505 221811,142870 221814,1381 221817,2205 221817,33424 221818,145240 221819,640 221820,2979 221821,6323 221822,60576 221823,704 221824,6119 221825,337 221826,595 221827,221828 221828,301 221828,446 221828,615 221828,685 221828,937 221828,1293 221828,3422 221828,5662 221828,134681 221828,158592 221828,170729 221828,218675 221828,221828 221828,221920 221828,221921 221828,223770 221828,224790 221828,227376 221828,228848 221829,5547 221830,220502 221832,72764 221833,154408 221835,292 221836,1143 221837,158 221838,221839 221841,269 221842,2205 221842,33424 221844,50 221845,1181 221846,179170 221848,652 221849,2205 221849,33424 221850,1381 221851,1849 221852,835 221853,142870 221854,1458 221855,1467 221856,868 221857,2353 221858,406 221859,50 221861,1132 221862,1608 221863,217 221864,7757 221865,44 221866,149 221867,366 221868,932 221869,515 221870,1381 221871,145524 221871,221872 221873,333 221874,83 221875,500 221876,1052 221877,1882 221878,54 221879,2775 221880,1962 221881,1984 221882,392 221883,5658 221884,4252 221885,1860 221886,623 221887,4760 221888,697 221889,6059 221890,6955 221891,3612 221892,595 221893,2274 221894,149 221895,1465 221896,1284 221896,148742 221897,30 221901,760 221903,273 221904,1479 221907,221908 221909,422 221910,1436 221911,422 221912,1782 221913,422 221914,994 221915,1608 221916,718 221917,636 221917,6880 221918,422 221919,302 221920,301 221920,1293 221920,1782 221920,4270 221920,6398 221920,6474 221920,7222 221920,13454 221920,14598 221920,20550 221920,21435 221920,26287 221920,28317 221920,34162 221920,36563 221920,68131 221920,77104 221920,78740 221920,82739 221920,83493 221920,85983 221920,87287 221920,87399 221920,101485 221920,134681 221920,137752 221920,142806 221920,177568 221920,189303 221920,195508 221920,212351 221920,218675 221920,220326 221920,221828 221920,221920 221920,228848 221920,235950 221920,243207 221920,251370 221920,253100 221920,255059 221920,256194 221920,257987 221920,260117 221920,262478 221920,263964 221920,264505 221922,179170 221923,1608 221924,1132 221925,83 221926,861 221927,843 221928,30 221929,30 221930,1118 221931,1238 221933,406 221935,835 221937,171 221938,349 221939,211 221940,179170 221941,818 221942,818 221943,179170 221944,1608 221945,1132 221947,83 221949,3999 221950,332 221952,149 221953,392 221954,5658 221955,4252 221956,623 221957,697 221958,1860 221959,6955 221960,4760 221961,6059 221962,3612 221963,595 221964,2274 221965,433 221966,1132 221967,994 221968,1608 221969,875 221970,312 221971,179170 221972,843 221973,577 221973,1429 221974,1287 221975,1612 221976,256 221977,1007 221978,1860 221979,1858 221980,2460 221982,179170 221983,1608 221984,83 221985,1462 221985,8537 221986,256 221986,483 221986,827 221986,3089 221986,3524 221987,4260 221988,406 221989,323 221990,779 221991,138686 221992,175 221993,220502 221994,30 221994,330 221995,179170 221996,3623 221997,994 221998,422 221999,3623 222000,179170 222001,302 222002,206 222003,302 222004,1860 222005,1858 222006,1465 222007,349 222008,171 222009,142409 222010,315 222010,15179 222011,563 222012,30 222013,918 222014,389 222015,1151 222016,179170 222017,875 222018,179170 222019,50 222020,10 222021,179170 222022,30 222023,1132 222024,1608 222025,338 222026,994 222027,220816 222028,179170 222029,48 222030,179170 222031,652 222033,54 222033,278 222033,1019 222033,2424 222034,452 222035,179170 222037,1227 222037,86416 222038,179170 222039,422 222040,179170 222041,179170 222042,1231 222042,1782 222043,83 222044,918 222047,516 222048,422 222049,1556 222051,255 222052,30 222053,97 222054,151 222056,483 222057,278 222058,652 222059,1368 222060,171 222061,135 222062,179170 222063,1151 222065,920 222066,1860 222067,1858 222068,372 222069,179170 222070,525 222071,179170 222072,1590 222073,8373 222074,179170 222075,1133 222076,1309 222077,406 222078,179170 222079,1285 222080,179170 222081,285 222082,1639 222083,1210 222084,422 222085,72 222086,79 222087,179170 222088,304 222089,631 222090,30 222091,285 222091,336 222091,118336 222092,622 222093,795 222094,873 222096,862 222097,294 222098,340 222099,50 222100,657 222100,2421 222101,3218 222102,1085 222103,179170 222104,333 222104,1266 222106,151 222107,516 222108,5366 222109,179170 222110,2367 222111,264 222111,736 222112,874 222113,515 222114,326 222115,1 222116,240 222117,422 222118,808 222119,220816 222120,179170 222121,141912 222122,155481 222123,1522 222124,179170 222125,30 222126,1160 222128,1241 222129,467 222130,1571 222131,220816 222132,516 222133,328 222134,86 222134,167 222134,301 222134,907 222134,1284 222134,1522 222134,2083 222134,2191 222134,2557 222134,2979 222134,3138 222135,220816 222136,1515 222137,515 222138,179170 222139,918 222140,179170 222141,220816 222142,250 222142,1684 222143,420 222144,83 222145,104 222146,83 222147,422 222147,5405 222148,107 222149,220816 222150,99287 222151,872 222152,251 222152,252 222152,1220 222152,1222 222153,3148 222154,1368 222155,83 222156,1359 222157,179170 222158,179170 222159,406 222160,1858 222161,179170 222162,179170 222163,7416 222164,179170 222165,4594 222166,149 222167,220816 222168,2373 222169,220816 222170,435 222171,220816 222172,191860 222173,1359 222174,220816 222175,6424 222176,56 222177,422 222178,841 222179,30 222180,1127 222181,1160 222182,843 222183,79 222184,179170 222185,220816 222186,4545 222186,56150 222187,81070 222188,1 222189,557 222190,179170 222191,862 222192,6059 222193,1388 222194,179170 222195,179170 222197,328 222198,200 222199,179170 222200,1465 222201,874 222202,179170 222203,179170 222204,179170 222205,3138 222206,850 222207,151 222208,179170 222209,536 222210,30 222211,596 222212,3297 222213,333 222214,3413 222215,217 222216,30 222217,1332 222218,30 222219,330 222220,195 222221,805 222222,30 222224,79 222225,83 222226,850 222227,179170 222228,179170 222229,273 222230,5405 222231,272 222232,220816 222233,220816 222234,479 222235,2266 222236,220816 222237,330 222238,563 222240,233 222241,15119 222242,309 222242,310 222243,220816 222244,220816 222245,2735 222246,167 222246,2979 222247,994 222248,994 222249,994 222250,220816 222251,21442 222252,344 222253,220816 222254,138686 222255,175 222256,4597 222257,222258 222257,223384 222259,795 222260,30 222261,338 222262,220816 222263,536 222264,2735 222265,1252 222265,1253 222266,220816 222267,920 222268,272 222269,86416 222270,220816 222271,147 222272,752 222273,63 222274,222275 222276,171 222277,179170 222278,285 222279,50 222280,1235 222280,1335 222281,957 222281,1815 222282,179170 222283,179170 222284,1163 222285,893 222285,6303 222286,179170 222287,179170 222288,3161 222289,179170 222290,313 222291,179170 222292,179170 222293,179170 222294,269 222295,222296 222297,72 222298,179170 222299,1177 222299,182162 222300,2048 222301,2048 222302,1160 222303,222304 222305,2411 222306,994 222307,137 222308,171 222309,1453 222310,206059 222311,586 222311,1243 222312,285 222313,179170 222314,275 222315,56 222316,422 222317,72 222318,179170 222319,240 222320,1227 222320,86416 222321,179170 222322,240 222323,338 222324,1175 222325,2146 222326,200 222327,179170 222328,222 222328,1381 222328,2292 222329,179170 222330,151 222331,918 222332,179170 222333,2048 222334,3 222335,179170 222336,387 222337,174564 222338,136 222339,3370 222339,14453 222341,151 222341,663 222342,222343 222344,2775 222344,6837 222345,818 222346,364 222347,1160 222349,7124 222350,422 222351,56 222352,1181 222353,579 222354,264 222354,538 222354,1345 222355,187176 222357,215276 222358,79 222359,3297 222360,557 222361,356 222362,6506 222363,1181 222364,1722 222368,30 222369,493 222369,682 222369,2244 222369,72439 222370,79 222371,649 222372,640 222373,640 222375,640 222376,640 222377,640 222378,41 222379,900 222380,179170 222382,631 222383,5101 222385,872 222386,1147 222387,50 222389,212914 222392,301 222393,115 222395,4771 222396,151 222398,258 222399,72 222400,996 222401,72 222403,1436 222405,9195 222406,726 222407,31934 222408,346 222409,422 222410,56 222411,3999 222412,1127 222414,179170 222416,920 222418,1860 222419,1858 222420,254 222421,167 222422,255 222423,1531 222424,2168 222425,697 222425,1769 222426,67995 222429,251 222429,516 222430,179170 222431,142870 222432,146 222432,92476 222433,1359 222434,1359 222435,106 222436,72 222438,1454 222439,8270 222440,1240 222440,1465 222440,221828 222441,16153 222442,1821 222442,21736 222443,72 222444,932 222445,179170 222447,1188 222447,2017 222447,46391 222448,15179 222449,1235 222449,1335 222450,422 222451,422 222452,1284 222453,422 222454,422 222455,72 222456,1220 222456,1222 222457,252 222458,516 222459,356 222460,455 222461,179170 222462,151 222465,422 222466,422 222467,422 222468,217 222468,433 222469,422 222470,422 222471,1860 222472,422 222473,2671 222474,179170 222475,3260 222476,3260 222477,1238 222478,4066 222479,640 222480,217 222480,1417 222481,83 222482,1436 222484,4597 222485,222486 222487,1452 222488,179170 222489,48 222490,179170 222491,160 222492,179170 222493,90845 222494,671 222496,160 222497,1220 222497,1222 222498,252 222499,516 222500,2626 222502,179170 222503,79 222504,859 222505,211 222506,422 222507,158 222509,179170 222510,73570 222511,179170 222512,171 222513,8270 222514,3582 222515,178 222516,30 222517,1837 222518,479 222518,590 222519,179170 222520,491 222520,1801 222522,1068 222523,1052 222523,1801 222524,162599 222526,493 222527,779 222528,4823 222529,843 222530,217 222531,843 222532,422 222533,2310 222534,579 222535,160 222536,5718 222537,179170 222538,179170 222540,1467 222541,2775 222542,447 222543,79 222545,83 222546,222547 222548,2944 222550,273 222551,1955 222552,698 222553,30 222554,843 222555,30 222556,44 222557,30 222559,577 222559,1429 222561,179170 222564,595 222566,1566 222568,389 222569,30 222570,389 222571,269 222572,30 222573,63 222573,211 222574,83 222576,202 222577,344 222579,211 222579,4078 222579,7124 222580,222581 222584,332 222585,2334 222586,307 222586,2668 222587,30 222589,2590 222591,1276 222592,137 222593,151 222594,179170 222595,310 222596,151 222596,72439 222597,392 222598,30 222599,389 222600,179170 222601,9010 222602,4190 222603,760 222604,875 222605,779 222606,7124 222607,17588 222608,872 222609,179170 222610,634 222611,30 222612,795 222614,557 222615,843 222616,68069 222617,440 222618,843 222619,1881 222620,83 222622,278 222623,138686 222624,175 222625,408 222626,83 222627,22293 222628,179170 222629,503 222629,1257 222630,483 222631,302 222632,968 222633,302 222634,1220 222634,1222 222635,252 222636,516 222637,1007 222638,7416 222639,179170 222640,30 222641,852 222642,30 222643,1888 222644,179170 222645,179170 222646,179170 222647,179170 222648,671 222649,5192 222650,557 222651,835 222652,167 222652,301 222652,973 222652,1160 222652,1293 222652,1300 222652,1818 222652,73570 222652,103860 222653,843 222654,30 222656,72 222657,515 222658,7358 222658,7363 222659,835 222660,918 222661,302 222662,1608 222663,1132 222664,252 222665,360 222666,30 222667,202 222668,918 222669,333 222670,72 222671,805 222673,151 222675,2979 222676,83 222677,72 222678,333 222679,3367 222680,489 222681,435 222682,72 222683,1227 222683,86416 222684,30 222685,179170 222686,72 222687,875 222689,72 222690,72 222691,34580 222693,30 222694,1257 222695,179170 222696,943 222696,6556 222697,843 222698,137 222699,179170 222700,72 222701,179170 222702,30 222703,179170 222704,179170 222705,7416 222706,302 222707,179170 222708,1388 222708,1531 222708,4455 222709,30 222710,179170 222711,72 222712,179170 222713,179170 222714,861 222715,872 222716,136 222717,3 222718,3331 222719,30 222720,83 222722,4220 222725,7416 222726,179170 222727,179170 222728,171 222729,1572 222730,179170 222731,4 222731,5 222732,83 222733,1882 222734,72 222735,835 222736,1010 222737,102 222738,1326 222739,1323 222740,408 222741,179170 222742,30 222743,54284 222744,72 222745,138 222746,865 222747,557 222748,137 222749,179170 222750,88820 222751,179170 222752,222753 222752,224491 222752,236340 222752,249046 222752,253847 222754,2782 222755,65 222755,222 222755,417 222755,1284 222755,1572 222755,3148 222755,3295 222755,4237 222755,182162 222756,72 222757,35486 222758,179170 222759,179170 222760,222761 222762,56 222763,422 222764,609 222765,1220 222765,1222 222766,516 222767,252 222768,30 222769,2671 222770,1715 222771,968 222772,30 222773,450 222774,179170 222775,220816 222776,220816 222777,631 222777,657 222777,1001 222777,1019 222777,1287 222777,2266 222777,2626 222778,30 222779,752 222780,147 222780,920 222781,809 222782,72 222783,1210 222784,179170 222785,918 222786,1776 222787,5440 222788,1133 222789,3 222790,41 222791,1133 222792,72 222793,179170 222794,179170 222795,179170 222796,835 222797,179170 222798,485 222799,298 222800,2867 222800,2868 222801,179170 222802,485 222803,298 222804,3582 222805,220816 222806,79 222807,491 222808,148742 222809,7092 222810,72 222811,2373 222812,220816 222813,2244 222814,72 222815,3538 222816,2979 222817,1001 222818,72 222819,557 222820,179170 222821,2244 222822,179170 222823,1639 222824,220816 222825,2995 222826,72 222827,72 222828,72 222829,72 222830,220816 222831,146 222831,92476 222832,83 222833,72 222834,1298 222835,310 222836,278 222837,195 222838,3960 222839,2617 222840,631 222841,179170 222842,118336 222843,79 222844,332 222845,79 222845,704 222846,1832 222847,179170 222848,298 222849,485 222850,1287 222851,479 222852,1572 222853,55849 222854,4678 222855,1363 222856,55849 222857,3297 222858,240 222859,285 222860,1572 222861,1474 222862,1805 222863,2590 222864,179170 222865,250 222865,1684 222866,1381 222867,1623 222868,179170 222869,301 222870,179170 222871,250 222871,1684 222872,285 222873,179170 222874,138686 222875,175 222876,179170 222877,5 222877,1087 222878,179170 222879,179170 222880,147 222881,179170 222882,312 222883,932 222884,179170 222885,179170 222886,920 222887,65 222888,179170 222889,3 222890,389 222891,304 222892,1122 222893,795 222894,8270 222895,83 222896,1179 222897,220816 222898,179170 222899,1326 222900,217 222901,222902 222903,179170 222904,2244 222905,1368 222906,72 222907,72 222908,222909 222910,1177 222911,1010 222912,240 222914,83 222915,779 222916,1181 222917,1368 222918,255 222919,179170 222920,5366 222921,4597 222922,220816 222923,192 222923,195 222923,289 222923,2296 222923,94134 222924,179170 222925,55849 222926,240 222927,862 222928,994 222929,779 222930,222931 222930,231455 222930,239720 222930,245179 222932,179170 222933,220816 222934,631 222935,1085 222936,1860 222937,151 222938,151 222939,726 222940,179170 222941,1715 222942,390 222943,250 222943,1684 222944,285 222945,179170 222946,4260 222947,206 222948,250 222948,1684 222949,285 222950,1522 222951,179170 222952,179170 222953,3447 222954,2048 222955,313 222956,585 222957,8270 222958,179170 222959,275 222960,142870 222961,179170 222962,30 222963,1773 222964,225 222965,328 222967,30 222968,142870 222969,81 222970,8884 222971,72 222972,72 222973,50 222973,140 222973,147 222973,222 222974,818 222975,1085 222976,1571 222977,2750 222978,149 222979,740 222979,741 222980,346 222981,1266 222981,5714 222982,312 222983,273 222984,3804 222985,179170 222986,151 222987,179170 222988,1227 222988,86416 222989,222990 222991,30 222992,151 222993,137 222994,72 222995,1285 222996,79 222997,2048 222998,3370 222999,151 223000,996 223001,634 223002,223003 223004,30 223005,4597 223006,42220 223007,4597 223008,312 223009,7360 223010,2416 223010,2417 223011,72 223012,223013 223014,779 223016,179170 223017,2353 223018,3447 223019,273 223020,149 223021,2416 223021,2417 223022,179170 223023,1432 223024,590 223024,2073 223024,33424 223024,125569 223025,671 223025,1253 223026,1181 223027,179170 223028,167 223028,73570 223029,8270 223030,366 223031,223032 223033,932 223034,620 223035,217 223035,1796 223036,55849 223037,2782 223038,30 223039,72 223040,1227 223040,86416 223041,1220 223041,1222 223042,72 223043,344 223044,285 223045,223046 223047,3148 223048,44 223048,602 223049,1247 223049,164572 223050,72 223051,5405 223052,77 223053,195 223054,83 223055,743 223056,3804 223057,151 223058,1227 223058,86416 223059,1181 223060,151 223061,932 223062,187960 223063,72 223064,72 223065,312 223066,149 223067,72 223068,1087 223069,44 223070,2244 223071,4597 223073,1849 223074,195 223075,781 223076,1132 223077,406 223078,874 223079,151 223080,918 223081,159516 223081,223082 223081,236820 223083,743 223085,875 223086,30 223087,195 223088,30 223089,389 223090,795 223091,2244 223092,206 223094,483 223095,192 223096,479 223097,991 223097,1274 223098,179170 223099,972 223100,56 223101,422 223102,72 223103,1572 223104,72 223104,206 223104,34580 223105,355 223106,1124 223107,795 223108,588 223108,590 223108,920 223108,1419 223109,8270 223110,72 223111,5405 223112,649 223112,666 223113,862 223114,1227 223114,86416 223115,223116 223117,1707 223118,34 223118,19227 223119,179170 223120,8270 223121,30 223121,137 223121,225 223122,184 223123,219 223124,158 223125,4810 223126,2775 223127,2424 223128,6506 223129,2646 223130,387 223132,1571 223133,1181 223134,1860 223135,1858 223136,1227 223136,86416 223137,4504 223138,485 223139,298 223140,1326 223141,102 223142,1323 223143,408 223144,223145 223146,6387 223146,6621 223146,17140 223147,179170 223148,1368 223149,1227 223149,86416 223150,994 223151,302 223152,302 223153,120 223154,147123 223155,835 223156,660 223157,784 223158,135 223159,147123 223160,1479 223161,390 223162,2421 223163,37088 223164,1085 223165,79 223166,217 223166,493 223167,72 223168,3161 223169,15119 223170,30 223171,30 223172,179170 223173,30 223174,147 223176,179170 223177,179170 223178,7358 223178,7363 223180,272 223181,223182 223183,1181 223184,1849 223186,179170 223187,3413 223188,9026 223189,918 223190,179170 223191,179170 223192,269 223193,485 223194,298 223195,30 223196,6682 223197,158 223198,179170 223199,346 223200,30 223201,179170 223202,179170 223203,1572 223204,179170 223205,141912 223206,309 223206,310 223207,301 223207,22580 223208,7360 223209,285 223210,994 223211,179170 223212,223213 223214,1659 223217,206 223218,179170 223219,179170 223220,1368 223221,3872 223222,714 223223,179170 223224,179170 223225,557 223226,5440 223227,433 223228,30 223229,364 223230,111 223231,671 223232,1102 223232,1776 223233,8270 223234,50 223237,151 223238,491 223239,72 223240,346 223241,179170 223242,805 223243,491 223244,272 223247,589 223248,255 223249,1163 223250,10 223251,223252 223253,1085 223254,3209 223255,2048 223256,918 223257,8270 223258,1462 223258,8537 223259,223260 223261,406 223262,1163 223263,151 223264,151 223265,805 223266,151 223267,273 223268,179170 223269,292 223270,818 223271,298 223272,223273 223274,805 223275,5375 223276,223277 223278,72 223279,107 223280,2416 223280,2417 223281,292 223282,338 223283,227 223283,2379 223284,298 223285,1133 223286,3538 223287,2244 223288,8788 223289,862 223290,827 223290,2868 223290,92476 223291,30 223292,223293 223294,223293 223295,223293 223296,223293 223297,223293 223298,223293 223299,17772 223301,72 223302,31934 223303,31934 223304,31934 223305,31934 223306,31934 223307,31934 223308,31934 223309,31934 223310,31934 223311,31934 223312,31934 223313,31934 223314,31934 223315,31934 223316,31934 223317,31934 223318,127158 223319,485 223320,298 223321,192 223322,140 223323,223324 223325,77 223326,79 223327,3148 223328,4597 223330,86416 223331,932 223332,50 223332,406 223333,72 223334,160 223336,222 223337,4237 223337,182162 223338,779 223340,160 223341,160 223342,652 223343,160 223344,2797 223345,994 223346,1836 223347,72 223348,179170 223349,23010 223350,795 223351,485 223352,298 223353,485 223354,298 223355,1294 223355,1326 223356,275 223357,160 223358,79 223359,875 223360,72 223361,72 223362,3413 223363,1332 223364,450 223366,179170 223367,160 223368,179170 223369,1368 223370,4101 223371,15748 223373,50 223374,55849 223375,360 223376,310 223377,8270 223378,50 223379,149 223380,44 223381,206 223382,1019 223383,1572 223385,86416 223386,835 223387,72 223388,1102 223389,1634 223390,1776 223391,127158 223392,485 223393,298 223394,223395 223394,250770 223396,111 223397,184 223398,187 223399,726 223401,485 223402,298 223403,872 223404,1860 223405,1858 223406,795 223407,622 223408,805 223409,1127 223410,1718 223411,72 223412,3209 223413,54 223414,652 223415,433 223416,302 223417,151 223418,1085 223419,302 223420,805 223421,298 223422,485 223423,2048 223424,10 223425,1007 223426,179170 223427,779 223428,485 223429,298 223430,1773 223431,3960 223432,872 223433,72 223434,491 223435,179170 223436,206 223437,1201 223438,1298 223439,200 223440,223441 223440,227495 223442,45960 223443,72 223444,298 223445,485 223446,333 223447,138686 223448,175 223449,4 223449,5 223450,1227 223450,86416 223451,2744 223452,1016 223453,6027 223454,1227 223454,86416 223455,788 223456,5343 223457,1955 223458,107 223459,1135 223460,3623 223461,1085 223462,1707 223463,1014 223464,223465 223466,149 223467,142870 223468,1014 223469,346 223470,223471 223472,1983 223473,50 223474,151 223475,223476 223477,154408 223478,72 223479,50 223480,272 223481,918 223482,58 223483,223484 223485,795 223486,179170 223487,79 223488,346 223489,301 223489,3804 223490,72 223491,805 223492,149 223493,285 223494,20 223495,1085 223496,9457 223497,346 223498,557 223499,557 223500,557 223501,2617 223503,137 223504,3135 223505,58 223506,994 223507,46 223508,346 223509,179170 223510,179170 223511,1149 223512,46 223513,994 223514,58 223515,1572 223516,195 223517,179170 223518,994 223519,918 223520,1572 223521,328 223522,586 223523,805 223524,72 223525,72 223526,479 223527,875 223528,240 223529,893 223530,358 223531,72 223532,346 223533,8270 223534,179170 223535,346 223536,8270 223537,272 223538,795 223539,346 223540,527 223541,874 223542,140 223543,72 223544,119 223545,272 223546,346 223547,1462 223548,1058 223549,1058 223550,141912 223551,211 223552,3370 223553,346 223554,202 223555,346 223556,195 223557,1227 223557,86416 223558,256 223559,72 223560,4597 223561,918 223562,483 223563,223564 223565,151 223566,79 223566,104 223566,111 223566,134 223566,192 223566,200 223566,215 223566,227 223566,240 223566,248 223566,264 223566,289 223566,290 223566,298 223566,309 223566,310 223566,392 223566,503 223566,516 223566,588 223566,590 223566,631 223566,636 223566,714 223566,805 223566,1016 223566,1119 223566,1149 223566,1282 223566,1462 223566,1631 223566,1659 223566,1745 223566,1818 223566,1849 223566,1955 223566,1962 223566,2205 223566,2286 223566,2443 223566,4355 223566,6955 223566,8180 223566,8537 223566,9005 223566,9010 223566,33424 223566,54004 223566,94134 223567,223568 223569,1151 223569,1363 223570,45437 223571,179170 223572,491 223573,94 223573,2787 223574,2296 223575,640 223576,4597 223577,346 223578,346 223579,149 223580,285 223581,179170 223582,2205 223582,33424 223583,2048 223584,41 223585,726 223586,142870 223587,862 223588,3161 223589,179170 223590,42220 223591,17772 223592,1313 223593,42220 223594,323 223595,184 223596,859 223597,179170 223598,142473 223599,292 223600,301 223601,42220 223602,223603 223604,42220 223605,294 223606,296 223607,298 223608,42220 223609,93 223609,94 223610,223611 223612,72 223613,2416 223613,2417 223614,223615 223616,50 223617,42220 223620,42220 223621,42220 223622,1345 223623,430 223624,42220 223625,485 223626,298 223627,42220 223628,267 223629,120 223629,1235 223630,147 223631,1462 223631,1939 223632,5405 223633,223634 223633,250062 223635,192 223636,2416 223636,2417 223637,42220 223638,850 223639,491 223640,2416 223640,2417 223641,83 223642,72 223643,42220 223644,485 223645,298 223646,1634 223647,1860 223648,1858 223649,223650 223651,79 223652,3297 223654,79 223655,79 223656,34 223656,35 223656,167 223656,222 223656,631 223656,657 223656,783 223656,827 223656,1467 223656,1571 223656,2266 223656,94134 223657,221737 223658,736 223660,79 223661,58 223662,994 223663,46 223664,577 223665,485 223666,298 223667,483 223668,602 223669,83 223670,127158 223671,2416 223671,2417 223672,248 223672,954 223672,1462 223672,2991 223672,2995 223672,31497 223672,185877 223673,116 223673,290 223673,590 223673,1235 223673,1511 223673,2417 223673,33424 223673,94134 223673,182162 223673,245910 223675,784 223676,932 223678,298 223679,485 223680,50 223681,805 223682,104 223682,588 223682,590 223682,1179 223682,1659 223683,30 223684,2421 223685,489 223687,431 223688,2646 223690,120 223691,485 223692,298 223693,299 223693,972 223694,187 223695,2775 223696,447 223697,223698 223699,640 223700,640 223701,640 223702,1127 223703,640 223704,223705 223706,442 223709,77 223710,1265 223710,1266 223711,6068 223712,1644 223713,278 223713,491 223714,1466 223715,189794 223716,1188 223717,3695 223718,4237 223718,182162 223720,136072 223721,346 223723,79 223724,4771 223725,19413 223728,994 223729,58 223730,46 223731,314 223732,994 223733,58 223734,46 223735,868 223736,850 223738,189794 223738,189842 223738,223738 223739,273 223742,149 223743,392 223744,640 223745,640 223746,3003 223747,1181 223748,779 223749,7124 223750,1181 223751,1181 223752,1149 223753,42220 223754,1181 223755,1368 223756,1381 223757,179170 223759,850 223761,779 223762,1368 223763,491 223764,920 223765,301 223766,1749 223767,167 223767,2083 223767,2191 223768,7 223771,932 223772,1132 223773,781 223774,435 223775,875 223776,302 223777,195 223778,1058 223780,97 223780,1118 223780,1844 223780,13136 223782,1132 223783,781 223785,211 223786,215276 223787,671 223788,223789 223788,227851 223788,246640 223788,250692 223790,1402 223792,42220 223793,2367 223795,781 223796,1132 223797,30 223797,328 223797,1179 223799,1368 223800,994 223801,42220 223802,50 223802,1572 223802,3260 223803,179170 223804,42220 223805,781 223806,1132 223807,663 223807,1119 223807,1179 223807,1243 223808,509 223809,298 223810,485 223811,138686 223812,175 223813,1891 223813,204093 223814,151 223815,37088 223816,781 223817,1132 223818,167 223819,781 223820,1132 223823,893 223825,179170 223826,217 223826,1572 223829,557 223830,223831 223832,9457 223833,179170 223835,685 223835,2590 223836,179170 223837,223838 223839,795 223839,3804 223840,392 223841,179170 223842,1210 223845,874 223846,2991 223846,15573 223846,182162 223847,5 223847,6323 223849,435 223850,83 223851,7363 223851,42220 223852,217 223853,34 223853,292 223855,389 223856,5440 223857,217 223858,1238 223861,442 223862,389 223863,215276 223864,640 223865,953 223866,571 223867,652 223868,2620 223869,179170 223870,1452 223871,1058 223872,1860 223873,1858 223874,83 223875,41 223876,634 223876,671 223877,1181 223878,50 223879,1007 223879,1551 223880,1381 223881,1818 223882,447 223883,994 223884,2775 223885,726 223886,146280 223887,1858 223888,1860 223889,72 223889,312 223889,991 223889,1309 223889,1893 223889,2312 223889,2605 223889,3695 223889,238071 223891,841 223891,7124 223892,41 223893,994 223894,4691 223895,718 223896,1220 223896,1222 223897,2989 223897,2991 223898,1860 223899,1858 223900,1220 223900,1222 223901,252 223902,516 223903,994 223904,422 223905,56 223906,1220 223906,1222 223907,252 223908,516 223909,72 223910,17772 223911,179170 223912,278 223913,149 223914,217 223915,779 223916,140 223916,1858 223916,148742 223917,2073 223918,781 223919,1132 223920,217 223922,435 223923,571 223924,994 223925,893 223926,489 223926,685 223927,994 223928,994 223929,72 223930,184 223931,3582 223932,849 223933,34 223933,35 223934,994 223935,3209 223936,818 223937,72 223938,285 223939,312 223940,640 223941,44 223942,783 223943,72 223944,30 223946,7416 223948,1860 223949,1858 223951,1368 223952,72 223953,273 223954,389 223955,83 223956,868 223957,340 223959,874 223961,72 223962,356 223963,15748 223964,994 223965,41 223966,1118 223967,1132 223968,171 223971,117163 223972,41 223973,148742 223974,1052 223975,2775 223976,1962 223977,1882 223978,500 223979,54 223980,8270 223981,994 223982,151 223983,16153 223984,3413 223985,994 223986,179170 223987,41 223988,752 223989,179170 223990,1796 223992,3872 223993,179170 223995,50 223996,302 223997,179170 223999,1087 224000,1882 224001,1220 224001,1222 224002,252 224003,516 224004,1608 224005,1132 224006,861 224007,195 224008,1860 224009,1858 224010,733 224011,58 224012,1132 224013,1608 224014,1608 224015,1132 224017,1882 224018,1345 224019,14126 224022,79 224023,500 224024,1882 224025,2775 224026,54 224027,1052 224028,1962 224029,73570 224031,589 224032,500 224033,1962 224034,1052 224035,54 224036,1882 224037,2775 224038,56 224039,422 224041,752 224043,1608 224044,1132 224045,136 224046,283 224047,147 224048,406 224049,83 224049,1118 224049,1188 224049,1722 224050,138686 224051,175 224052,3695 224053,1608 224054,1132 224055,171 224056,1608 224057,3695 224058,55849 224059,682 224059,72439 224060,55849 224061,843 224062,55849 224063,104 224063,2209 224064,171 224065,346 224066,1973 224066,3507 224067,54 224068,10 224069,467 224071,102 224071,489 224073,596 224074,760 224074,1631 224075,809 224077,302 224078,861 224079,1274 224080,72 224081,596 224082,79 224084,167 224085,424 224086,48 224086,1769 224087,136 224088,2750 224089,83 224090,41 224091,1332 224092,515 224093,973 224093,1160 224093,1300 224093,103860 224094,16153 224095,5718 224096,760 224097,1844 224098,283 224099,663 224101,875 224103,450 224104,586 224104,1253 224105,1014 224106,175 224106,192 224106,35357 224106,39539 224106,84749 224106,122532 224106,202417 224106,205046 224107,2373 224109,1634 224112,55849 224113,1571 224114,483 224115,151 224116,346 224117,918 224118,50 224118,147 224118,158 224118,192 224118,406 224118,2574 224118,2931 224118,3260 224118,4193 224118,8598 224118,103153 224119,663 224120,805 224121,200 224123,3474 224124,346 224125,200 224126,479 224127,179170 224128,179170 224129,581 224130,1707 224131,1227 224131,86416 224132,137 224133,346 224134,2421 224135,151 224136,179170 224137,1149 224137,3370 224138,7652 224138,33424 224139,862 224140,83 224141,179170 224142,160 224144,557 224145,994 224146,781 224147,1132 224148,142426 224149,2146 224150,138686 224151,1298 224152,175 224153,220816 224154,704 224155,392 224156,6059 224157,1860 224158,5658 224159,596 224160,4760 224161,4252 224162,623 224163,697 224164,6955 224165,3612 224166,595 224167,2274 224168,596 224168,1368 224169,179170 224170,220816 224172,1132 224173,1608 224174,179170 224175,179170 224176,220816 224177,22 224178,3872 224179,953 224180,4810 224181,155481 224182,30 224184,1644 224185,30 224186,48 224187,217 224188,30 224189,30 224190,179170 224191,179170 224192,179170 224193,179170 224194,220816 224196,72 224197,179170 224198,72 224199,994 224201,795 224202,994 224203,54 224204,72 224205,682 224205,72439 224206,1220 224207,252 224208,516 224209,994 224210,586 224210,2073 224210,3297 224210,4039 224210,8270 224211,30 224212,179170 224213,30 224215,10 224216,220816 224217,192 224218,8270 224219,588 224219,590 224219,1419 224219,25344 224220,994 224221,301 224222,8270 224223,224224 224225,8270 224226,179170 224227,158 224228,220816 224229,56 224230,422 224231,30 224232,346 224233,30 224234,250 224234,1684 224235,179170 224236,179170 224237,79 224238,220816 224239,72 224240,309 224240,310 224240,571 224241,179170 224242,1773 224243,1608 224244,1132 224245,1462 224245,9010 224245,164572 224246,255 224247,7092 224248,179170 224249,2048 224250,202 224251,994 224252,994 224253,994 224254,224255 224256,1849 224257,994 224258,2048 224259,72 224260,1858 224261,1860 224262,2367 224263,138686 224264,784 224265,224266 224267,224268 224269,72 224270,211 224271,179170 224272,918 224273,233 224274,875 224275,224276 224277,142870 224278,179170 224279,179170 224280,54 224282,278 224283,8854 224284,1287 224285,907 224285,164572 224286,163 224287,953 224287,2991 224288,72 224289,261 224290,310 224291,135 224292,1707 224293,72 224294,8788 224295,1252 224295,1253 224296,285 224297,1227 224297,86416 224298,2244 224299,30 224299,200 224300,202 224301,179170 224302,179170 224303,179170 224305,306 224305,307 224306,179170 224307,3447 224308,1359 224309,72 224310,2553 224311,5933 224312,179170 224313,346 224314,2048 224315,346 224316,147 224317,1058 224318,1058 224319,8992 224320,88820 224321,58 224322,666 224323,179170 224324,146 224324,92476 224325,647 224326,344 224327,3 224327,34 224327,35 224327,44 224327,50 224327,63 224327,79 224327,99 224327,104 224327,106 224327,137 224327,147 224327,149 224327,192 224327,195 224327,217 224327,233 224327,248 224327,251 224327,252 224327,254 224327,289 224327,298 224327,301 224327,323 224327,330 224327,332 224327,393 224327,406 224327,430 224327,435 224327,442 224327,447 224327,493 224327,518 224327,538 224327,588 224327,590 224327,615 224327,622 224327,636 224327,663 224327,694 224327,779 224327,788 224327,801 224327,805 224327,932 224327,934 224327,994 224327,1001 224327,1016 224327,1085 224327,1175 224327,1179 224327,1231 224327,1235 224327,1282 224327,1284 224327,1294 224327,1309 224327,1332 224327,1335 224327,1368 224327,1388 224327,1392 224327,1417 224327,1512 224327,1515 224327,1531 224327,1639 224327,1722 224327,1732 224327,1789 224327,1939 224327,1955 224327,2296 224327,2334 224327,2379 224327,2443 224327,2528 224327,2557 224327,2567 224327,2620 224327,2701 224327,2793 224327,2812 224327,2979 224327,3115 224327,3321 224327,3474 224327,3538 224327,4455 224327,5726 224327,5992 224327,6119 224327,9537 224327,16019 224327,94134 224328,83 224329,138686 224330,175 224331,852 224332,1608 224333,278 224334,224335 224336,83 224337,1019 224338,217 224339,536 224340,1467 224341,72 224342,563 224343,211 224344,224345 224346,20813 224346,164572 224347,72 224348,130 224349,48 224350,1796 224351,72 224352,179170 224353,30 224353,200 224355,137 224357,72 224358,309 224358,310 224359,179170 224360,918 224361,72 224362,4192 224362,4193 224363,2146 224364,224365 224366,72 224367,224365 224368,596 224369,4597 224370,179170 224372,68069 224373,179170 224374,3138 224375,72 224376,3 224377,151 224378,278 224379,31977 224380,364 224381,179170 224382,77 224383,179170 224384,247 224385,2266 224386,179170 224387,179170 224388,346 224389,515 224390,1467 224391,862 224392,1227 224392,86416 224393,285 224394,142870 224395,588 224395,590 224395,779 224395,1419 224396,247 224397,10 224398,1227 224398,86416 224399,151 224400,388 224401,1181 224402,900 224403,2424 224404,1474 224404,2590 224405,30 224406,72 224407,1326 224408,2048 224410,2048 224411,2048 224412,2048 224413,8270 224414,285 224415,224416 224417,78232 224418,1181 224419,72 224420,1227 224420,86416 224421,2048 224422,652 224423,151 224424,4597 224425,151 224426,1381 224427,179170 224428,179170 224429,2048 224430,1400 224431,3182 224432,179170 224433,1368 224434,179170 224435,83 224437,30 224438,13980 224439,142473 224439,142879 224440,209 224441,1968 224443,145240 224444,30 224445,138686 224446,175 224447,1796 224449,86416 224450,3297 224451,968 224452,3582 224453,1414 224454,4597 224455,557 224456,647 224460,192 224461,278 224462,287 224463,158 224463,1235 224463,1335 224464,1203 224466,13538 224467,1858 224468,1860 224469,527 224469,95152 224470,301 224470,615 224470,2083 224471,141912 224473,72 224474,360 224475,55849 224476,2073 224477,1785 224478,30 224479,366 224480,6323 224481,1285 224482,72 224482,1253 224482,182162 224483,1102 224483,7363 224484,94 224484,1511 224484,2787 224485,660 224486,13661 224487,310 224487,224488 224489,156379 224490,640 224492,1118 224493,1284 224494,1608 224497,1293 224498,874 224498,3182 224499,30 224499,328 224499,622 224499,1033 224503,640 224504,640 224505,801 224506,640 224507,640 224508,784 224509,640 224510,640 224511,250 224511,1684 224513,775 224516,151 224517,332 224518,72 224519,20757 224520,1359 224521,147 224523,136 224524,346 224525,31977 224526,58 224527,994 224528,46 224529,775 224530,200 224530,1332 224531,852 224531,1715 224532,795 224533,1309 224534,328 224535,920 224536,179170 224537,31934 224538,489 224539,58 224540,994 224541,46 224542,31934 224543,179170 224544,200 224545,994 224546,31934 224548,346 224549,668 224549,1132 224549,6556 224549,28130 224549,259187 224550,366 224550,500 224551,200 224552,994 224553,510 224554,1858 224555,1860 224556,224557 224558,206 224559,980 224560,30 224561,41 224562,79 224562,439 224563,83 224564,932 224565,200 224567,120 224568,118336 224570,795 224572,1227 224572,86416 224573,3094 224574,206 224575,666 224576,187 224578,191860 224579,1052 224580,224581 224582,1381 224582,191860 224583,503 224584,1227 224584,86416 224585,191860 224586,3999 224586,191860 224587,191860 224588,1082 224589,179170 224590,493 224591,191860 224592,191860 224593,307 224593,1177 224594,191860 224595,1085 224595,25348 224596,31934 224597,596 224598,1392 224599,1224 224600,589 224601,1238 224602,447 224603,2775 224604,2775 224605,447 224606,596 224608,1968 224609,1452 224611,1240 224611,4637 224612,1608 224613,1132 224614,1127 224615,861 224616,313 224617,1298 224618,4220 224619,41 224620,1608 224621,1132 224622,200 224623,2379 224625,3582 224626,3999 224627,8270 224628,1058 224629,240 224630,346 224632,1474 224633,2073 224634,160 224635,1132 224636,1608 224637,3769 224638,1014 224639,994 224640,79 224641,2750 224642,48 224642,1007 224644,298 224644,32751 224645,861 224646,392 224647,647 224648,79 224649,557 224650,366 224650,141912 224651,302 224652,1181 224654,151 224655,1462 224655,8537 224657,640 224658,273 224661,3804 224662,874 224664,217 224668,224669 224670,141912 224671,2244 224672,302 224673,1014 224674,4220 224675,79 224676,30 224677,2646 224678,272 224679,861 224680,147 224681,872 224681,1140 224681,1151 224681,2744 224681,141912 224682,2719 224683,1782 224685,1132 224686,1608 224687,760 224688,8180 224689,1133 224690,1436 224691,1001 224692,158 224696,760 224698,217 224699,907 224705,178 224706,179170 224707,4237 224707,182162 224709,406 224712,720 224714,56 224715,422 224717,56 224718,422 224719,2296 224720,779 224724,994 224726,302 224727,752 224728,694 224730,861 224731,83 224734,596 224735,1653 224736,138686 224737,175 224739,248 224739,1515 224740,818 224742,1634 224743,44 224744,224745 224746,500 224747,1052 224748,54 224749,2775 224750,1962 224751,240 224753,147 224753,158 224756,309 224756,310 224759,2775 224760,447 224761,2367 224762,72 224765,666 224766,1381 224768,278 224769,1052 224770,500 224771,2775 224772,1962 224773,54 224775,1590 224776,72 224777,657 224777,2421 224778,852 224778,5591 224780,1359 224781,346 224782,1127 224783,34 224783,35 224784,5301 224785,1858 224786,179170 224787,3695 224789,873 224791,143 224792,1467 224793,338 224794,392 224795,302 224797,994 224798,58 224799,46 224800,179170 224801,1363 224802,302 224803,5976 224804,179170 224805,179170 224806,515 224807,222 224808,179170 224809,918 224810,3695 224811,191860 224812,1058 224813,191860 224814,30 224815,657 224817,994 224818,179170 224819,1474 224820,179170 224821,673 224822,10 224823,22 224824,175 224825,252 224826,142430 224827,694 224828,3695 224829,58 224830,994 224831,46 224832,6695 224833,191860 224834,111 224834,1266 224835,72 224836,55849 224837,808 224838,273 224839,179170 224840,179170 224841,918 224843,4597 224844,200 224846,1210 224847,30 224850,483 224851,2590 224852,179170 224853,811 224854,640 224855,151 224856,167 224859,1556 224860,179170 224861,1151 224862,30 224862,200 224863,1844 224864,4545 224864,56150 224865,179170 224866,34 224866,35 224867,6424 224868,843 224869,200 224870,202 224871,949 224872,5591 224873,200 224875,72 224876,6068 224877,760 224878,346 224879,179170 224880,1801 224881,874 224882,1858 224883,390 224884,179170 224885,75912 224886,247 224887,631 224888,996 224889,2590 224890,1220 224891,516 224892,252 224893,179170 224894,83 224895,1085 224896,30 224897,704 224898,1511 224898,3069 224899,247 224899,2867 224899,2868 224900,240 224901,179170 224903,30 224904,72 224905,179170 224906,30 224908,805 224909,56 224910,422 224911,179170 224912,1773 224913,179170 224914,850 224915,781 224916,1132 224917,389 224919,217 224920,83 224921,861 224922,994 224923,264 224923,301 224924,272 224925,83 224926,102 224927,1323 224928,1326 224929,408 224930,994 224931,1414 224932,417 224933,151 224934,179170 224935,179170 224936,2782 224936,3876 224937,278 224938,200 224939,192 224939,1181 224940,1332 224941,1332 224942,4545 224942,56150 224943,4545 224943,56150 224944,24505 224945,652 224946,422 224947,28072 224948,272 224949,3695 224950,220816 224951,83 224952,94 224952,2787 224953,142870 224954,302 224955,220816 224956,220816 224957,994 224958,76096 224959,17334 224960,179170 224961,220816 224962,179170 224963,13 224964,171 224965,220816 224966,301 224967,994 224968,3582 224969,994 224970,875 224971,220816 224972,220816 224973,1058 224974,779 224974,1294 224975,220816 224976,442 224977,34 224977,35 224978,220816 224979,81 224980,693 224981,179170 224982,220816 224983,72 224984,146 224984,92476 224985,7092 224986,344 224987,647 224988,72 224989,285 224990,220816 224991,104 224992,1132 224993,781 224994,220816 224995,220816 224996,1132 224997,781 224998,200 224999,781 225000,1132 225001,46 225002,58 225003,994 225004,58 225005,46 225006,994 225007,58 225008,994 225009,46 225010,272 225011,220816 225012,46 225013,58 225014,994 225015,3370 225015,14453 225016,485 225017,1509 225018,1659 225019,1688 225020,220816 225021,1132 225022,850 225023,781 225024,104 225025,255 225026,220816 225027,220816 225028,191860 225029,781 225030,1132 225031,1707 225032,149 225033,225034 225035,1893 225036,220816 225037,843 225038,1181 225039,179170 225040,220816 225041,818 225042,220816 225043,360 225044,179170 225045,179170 225046,220816 225047,179170 225048,536 225049,220816 225051,278 225052,2373 225053,104 225054,5405 225055,760 225056,220816 225057,422 225058,422 225059,5366 225060,422 225061,3804 225062,779 225063,422 225064,422 225065,422 225066,422 225067,422 225068,189842 225069,422 225070,422 225071,422 225072,805 225073,179170 225074,151 225075,225076 225077,406 225078,220816 225079,179170 225081,450 225082,1571 225083,138686 225084,175 225085,3 225086,179170 225087,1227 225087,86416 225088,72 225089,50 225090,2979 225091,221737 225092,217 225093,255 225094,795 225095,179170 225096,1368 225097,1010 225098,515 225099,2334 225100,577 225101,1363 225102,220816 225103,2674 225104,220816 225105,179170 225106,147 225106,158 225107,179170 225108,422 225109,56 225110,72 225111,323 225112,179170 225113,220816 225114,21442 225115,147 225116,4597 225117,4355 225118,220816 225119,179170 225120,1285 225121,6682 225122,534 225123,406 225124,220816 225125,8270 225126,2719 225127,13538 225128,220816 225129,1132 225130,1149 225131,473 225132,4597 225133,220816 225134,72 225135,72 225136,72 225137,220816 225138,220816 225139,72 225140,21487 225141,45960 225142,179170 225143,563 225144,30 225145,220816 225146,220816 225148,220816 225149,179170 225150,220816 225151,220816 225152,479 225153,220816 225154,56 225155,422 225156,805 225157,220816 225158,72 225159,72 225160,220816 225161,111 225162,200 225163,344 225164,264 225165,6323 225166,491 225167,563 225168,10 225169,179170 225170,313 225171,269 225172,206 225173,220816 225174,179170 225175,179170 225176,693 225176,3370 225177,285 225178,158 225179,179170 225180,220816 225181,179170 225182,179170 225183,278 225183,292 225183,390 225183,467 225183,4220 225183,6059 225183,6068 225184,424 225185,119 225186,1085 225187,179170 225188,220816 225189,8463 225189,142870 225190,422 225191,56 225192,220816 225193,7360 225194,7360 225195,390 225196,179170 225197,179170 225198,179170 225199,24505 225200,217 225201,4597 225201,8235 225202,874 225204,1332 225205,8270 225206,220816 225207,4475 225208,5265 225209,179170 225210,6387 225211,179170 225212,538 225213,285 225214,220816 225215,72 225216,8820 225217,179170 225218,1140 225219,151 225220,285 225221,171 225222,8868 225223,1007 225224,19 225224,48 225224,949 225224,142870 225224,226509 225225,422 225226,4597 225227,178 225228,8180 225229,179170 225230,516 225231,2379 225232,4237 225232,182162 225233,81 225234,2116 225235,1531 225236,225237 225238,179170 225239,179170 225240,6119 225241,219 225242,42220 225243,25344 225244,1181 225246,1821 225246,21736 225247,4597 225248,4453 225249,2416 225249,2417 225250,151 225251,918 225252,15179 225253,5469 225254,1188 225255,615 225256,1465 225257,5469 225258,9025 225259,1796 225260,11147 225261,261 225262,6214 225263,577 225264,225265 225264,229048 225264,252434 225264,260361 225264,264495 225266,42220 225267,58 225268,994 225269,46 225270,7316 225271,2244 225272,179170 225273,42220 225274,8270 225275,850 225276,918 225277,179170 225278,588 225278,590 225278,1419 225279,1300 225280,666 225281,455 225281,1019 225282,779 225283,422 225284,56 225285,72 225286,1400 225287,349 225287,3846 225288,5366 225289,509 225289,1453 225289,1454 225294,212914 225296,805 225297,179170 225298,1082 225299,179170 225300,179170 225301,225301 225302,1082 225303,215276 225304,781 225305,1132 225306,146 225306,92476 225307,647 225308,344 225309,615 225309,685 225309,1240 225309,1531 225310,366 225311,366 225312,366 225313,272 225314,1132 225315,781 225317,875 225318,941 225320,31934 225321,31934 225322,8270 225323,1590 225324,8270 225325,516 225326,1220 225327,252 225328,75912 225330,255 225331,31934 225332,31934 225333,31934 225334,3367 225335,31934 225336,818 225336,1149 225336,127158 225337,346 225338,1634 225339,1096 225339,28294 225340,1782 225341,994 225342,15609 225343,2416 225343,2417 225345,994 225346,994 225347,1608 225348,1132 225349,272 225350,200 225351,1608 225352,1132 225353,1608 225354,1132 225355,718 225356,58 225357,46 225358,994 225359,225360 225361,1181 225362,79 225363,640 225364,640 225366,3297 225368,640 225369,640 225370,1332 225372,994 225373,781 225374,1132 225375,72 225376,2480 225377,392 225378,516 225379,3367 225380,171 225381,4220 225382,31073 225383,781 225384,1132 225385,795 225386,859 225387,994 225388,301 225388,302 225388,305 225388,579 225388,690 225388,818 225388,868 225388,1659 225388,1776 225388,2292 225388,2617 225388,2626 225388,3089 225388,68069 225389,301 225390,920 225391,1381 225392,1381 225393,1634 225394,134 225395,1010 225396,1607 225396,2116 225397,252 225398,158 225399,1132 225400,781 225401,179170 225402,493 225402,682 225402,72439 225403,440 225404,256 225405,2646 225406,673 225406,2373 225407,5102 225409,1608 225410,1132 225411,309 225411,310 225413,932 225414,516 225416,1860 225417,1858 225420,980 225421,2480 225423,714 225424,37414 225425,694 225426,344 225427,647 225428,146 225428,92476 225429,225430 225431,694 225432,1274 225433,200 225434,160 225435,3094 225436,1718 225438,694 225439,3260 225440,138686 225441,175 225442,1220 225443,516 225444,252 225445,160 225446,8270 225448,160 225450,160 225451,4192 225451,4193 225452,160 225453,160 225454,994 225455,140 225455,160 225456,8270 225457,160 225458,694 225459,160 225460,949 225461,781 225462,1132 225463,356 225463,968 225463,1231 225463,1801 225464,340 225465,467 225465,156379 225466,167 225467,192 225468,83 225469,1238 225471,994 225472,868 225473,1509 225474,90845 225475,1452 225476,1132 225477,72 225478,160 225479,994 225480,124668 225481,72 225482,1623 225483,225484 225485,647 225486,344 225486,1253 225487,749 225488,171 225489,30 225490,577 225491,137 225493,4192 225493,4193 225494,447 225495,2775 225496,55849 225497,179170 225498,596 225499,1220 225500,516 225501,252 225502,1181 225503,875 225504,141912 225506,1436 225508,872 225509,491 225510,1837 225511,44 225512,1220 225513,516 225514,252 225515,1220 225516,252 225517,516 225519,1294 225520,1220 225521,252 225522,516 225523,167 225523,1231 225523,2083 225524,225525 225527,775 225527,3804 225528,634 225529,151 225530,252 225530,215276 225531,1220 225532,516 225533,252 225534,1608 225535,1132 225536,206 225536,2073 225536,16207 225536,22727 225537,649 225538,1220 225539,252 225540,516 225543,389 225544,179170 225545,178 225546,10 225546,137 225546,151 225546,206 225546,628 225546,1572 225546,1722 225546,1844 225546,2073 225546,2274 225546,2574 225546,3295 225546,4039 225546,5375 225546,22727 225546,99287 225547,23783 225548,83 225549,2105 225550,63 225551,58 225552,994 225553,46 225554,225555 225556,71 225556,1619 225557,5310 225558,1858 225559,1227 225559,86416 225560,149 225561,252 225561,1220 225562,76096 225563,44725 225564,2421 225567,1052 225568,179170 225569,149 225570,278 225571,885 225571,13704 225574,200 225575,1087 225577,994 225579,994 225580,467 225581,179170 225582,144556 225583,4611 225585,179170 225586,179170 225587,994 225588,5405 225589,189128 225593,406 225594,994 225595,193578 225596,30418 225598,179170 225600,1955 225601,1220 225602,252 225603,516 225604,1220 225605,516 225606,252 225607,30 225608,217 225609,875 225610,818 225611,875 225612,44 225614,179170 225615,179170 225616,390 225616,1274 225616,1381 225616,1579 225616,2646 225617,179170 225618,875 225619,2073 225620,781 225621,179170 225622,1132 225623,179170 225624,87 225624,323 225624,843 225624,1453 225624,2697 225625,224488 225626,660 225627,760 225628,493 225628,682 225628,72439 225629,225630 225631,516 225631,663 225631,4545 225631,56150 225632,1893 225633,302 225634,861 225635,1326 225636,4597 225637,1359 225638,781 225639,1132 225640,179170 225642,142473 225643,179170 225644,1132 225645,1608 225646,781 225647,179170 225648,1132 225649,32 225649,392 225649,1363 225649,2274 225649,2699 225650,874 225651,843 225652,994 225653,179170 225656,104 225657,403 225658,5265 225659,7757 225660,48 225661,1151 225662,8907 225663,179170 225664,79 225665,202 225666,202 225667,30 225668,1147 225669,875 225670,179170 225671,4223 225672,1776 225673,8598 225674,275 225675,2784 225675,27041 225676,179170 225677,30 225679,435 225680,1849 225681,694 225682,994 225683,1785 225685,30331 225686,72 225687,179170 225688,515 225689,640 225691,647 225692,179170 225693,72 225694,1284 225695,22293 225696,843 225697,179170 225698,255 225699,179170 225700,30 225701,515 225702,760 225703,179170 225704,1151 225705,1368 225706,1556 225707,392 225709,179170 225710,1782 225711,919 225712,1143 225713,1572 225714,875 225715,372 225716,1238 225717,72 225718,179170 225720,30 225721,179170 225722,2923 225723,179170 225724,179170 225725,179170 225726,3999 225727,4597 225728,179170 225729,435 225730,2373 225731,818 225732,4455 225733,179170 225735,875 225736,1181 225737,179170 225739,3623 225740,179170 225742,2590 225743,779 225744,151 225745,1381 225746,30 225748,79 225748,392 225749,191355 225750,3297 225751,3623 225752,389 225753,3297 225754,30 225755,179170 225757,72 225758,577 225759,220816 225760,392 225761,179170 225762,518 225762,1010 225762,1326 225763,557 225764,333 225764,393 225764,859 225764,980 225764,1388 225764,1531 225764,4455 225764,15573 225765,23783 225766,48 225767,72 225768,137 225769,220816 225770,272 225771,72 225772,671 225774,57354 225775,818 225776,652 225777,1052 225778,652 225779,515 225780,42220 225781,1151 225783,179170 225784,225785 225786,58 225787,827 225788,72 225789,56 225790,422 225791,1381 225792,72 225793,15807 225795,1 225795,118336 225796,179170 225797,1782 225798,1085 225798,1511 225798,2205 225798,3069 225798,33424 225798,245910 225799,1882 225800,493 225801,30 225802,781 225803,1332 225804,1058 225805,994 225806,640 225807,3623 225808,8822 225809,611 225810,1381 225811,356 225812,994 225813,7155 225814,72 225815,292 225816,285 225817,2073 225818,179170 225819,994 225820,2116 225821,102 225822,1323 225823,1326 225824,408 225825,179170 225826,1181 225827,44 225828,155481 225829,8854 225830,225831 225832,1220 225833,516 225834,252 225835,285 225836,483 225837,250 225837,1684 225838,147 225840,795 225841,285 225842,247 225843,422 225844,56 225848,628 225849,179170 225850,3209 225851,5265 225852,1285 225853,41 225854,1227 225854,86416 225855,211 225855,588 225855,590 225856,2089 225856,9536 225857,626 225858,184 225859,83 225860,269 225861,2224 225862,179170 225863,151 225864,94134 225865,2750 225867,1238 225868,1238 225869,1238 225870,900 225871,302 225872,2379 225873,1163 225874,1130 225875,83 225876,1860 225877,4597 225878,808 225879,1983 225880,158 225881,5906 225882,557 225883,626 225884,278 225885,137 225886,862 225887,137 225888,187 225889,1983 225890,247 225891,424 225893,2617 225894,220816 225895,8373 225896,220816 225897,41 225898,179170 225899,7092 225900,220816 225901,83 225903,994 225904,179170 225905,259 225906,4597 225907,179170 225908,179170 225909,994 225910,3804 225911,1566 225912,72 225913,875 225914,273 225915,148885 225916,301 225916,392 225917,875 225918,179170 225920,179170 225921,596 225922,179170 225923,920 225925,994 225926,179170 225927,151 225928,483 225929,179170 225930,179170 225931,147 225932,225933 225934,1635 225935,179170 225936,1130 225937,862 225938,34 225938,35 225939,30 225940,1 225941,278 225943,72 225944,30 225945,225946 225947,536 225948,255 225950,1132 225951,781 225952,179170 225953,79 225954,72 225955,779 225956,795 225957,30 225958,628 225959,743 225960,220816 225961,151 225962,220816 225963,6506 225964,179170 225965,660 225966,147 225967,596 225968,179170 225969,2750 225970,5326 225970,6068 225971,8270 225972,30 225973,72 225974,602 225975,994 225976,72 225977,422 225978,72 225979,907 225980,30 225981,220816 225982,994 225983,563 225984,994 225985,138686 225986,175 225987,179170 225988,72 225989,72 225990,217 225991,179170 225992,1181 225993,220816 225994,137 225995,72 225996,179170 225997,72 225998,179170 225999,4597 226000,83 226001,179170 226002,179170 226003,3297 226004,179170 226005,994 226006,72 226008,142870 226009,72 226010,72 226011,422 226012,422 226013,422 226014,179170 226015,72 226016,179170 226017,72 226018,779 226019,179170 226020,4597 226021,226022 226023,200 226024,781 226025,1132 226026,130 226027,72 226028,72 226029,240 226030,72 226031,17588 226032,422 226033,422 226034,422 226035,422 226036,422 226037,422 226038,422 226039,422 226040,422 226041,137 226042,918 226043,827 226044,179170 226045,269 226046,72 226047,1181 226048,285 226049,179170 226050,1227 226050,86416 226051,872 226052,577 226053,346 226054,179170 226055,285 226056,206 226057,328 226058,179170 226059,389 226060,30 226061,28072 226062,30 226063,657 226064,72 226065,841 226066,81 226066,3370 226067,94 226067,1252 226067,1253 226068,1033 226070,1458 226071,72 226072,30 226073,42220 226074,179170 226075,2146 226076,254 226077,72 226078,1332 226079,2416 226079,2417 226080,581 226081,42220 226082,171 226083,3507 226084,179170 226085,1235 226085,1335 226086,137 226087,72 226088,1381 226089,68 226090,42220 226091,5366 226092,1309 226093,383 226094,4597 226095,862 226095,2590 226096,42220 226097,515 226098,2416 226098,2417 226099,30 226100,179170 226101,30 226102,433 226103,652 226104,269 226105,72 226106,918 226107,72 226108,1345 226109,1227 226109,86416 226110,226111 226112,179170 226113,2416 226113,2417 226114,510 226114,972 226114,6424 226115,179170 226116,1118 226117,42220 226118,1188 226118,142870 226119,22 226120,72 226121,72 226122,72 226123,72 226124,1133 226125,1776 226126,1247 226126,164572 226127,72 226128,20359 226129,2416 226129,2417 226130,42220 226131,226132 226133,226134 226135,2416 226135,2417 226136,226137 226138,179170 226139,72 226140,671 226141,5366 226142,10 226143,50 226143,147 226144,9026 226145,6726 226146,485 226147,1572 226149,3260 226150,2775 226151,447 226153,20757 226154,142870 226155,366 226156,366 226157,366 226158,366 226159,366 226160,366 226161,366 226162,366 226163,366 226164,140 226164,147 226164,222 226165,1607 226167,1227 226167,86416 226168,340 226169,1769 226170,781 226171,1132 226172,226173 226174,30 226175,72 226175,330 226176,750 226176,3115 226176,199199 226176,227061 226177,447 226178,2775 226181,781 226182,1132 226184,868 226185,16153 226186,781 226187,1132 226188,781 226189,1132 226190,179170 226191,781 226192,1132 226194,2372 226195,211 226195,4078 226196,640 226197,640 226198,4237 226198,182162 226199,147 226200,240 226201,30 226202,447 226203,8541 226204,92476 226205,781 226206,1132 226207,1718 226208,5265 226209,1860 226210,1858 226211,994 226212,4611 226213,918 226214,179170 226215,179170 226216,129534 226217,1688 226218,206 226219,179170 226220,179170 226221,1284 226222,226223 226225,781 226226,1132 226227,3623 226229,736 226230,1058 226232,138686 226233,994 226234,1132 226235,1363 226236,781 226237,1132 226238,1363 226239,994 226240,83 226241,30 226242,491 226243,83 226244,226245 226246,516 226248,179170 226250,252 226250,1370 226250,1877 226251,179170 226253,240 226253,2590 226255,875 226256,179170 226257,994 226259,875 226260,23010 226261,23010 226262,920 226263,209 226264,1860 226265,1858 226266,467 226267,301 226267,2443 226268,781 226269,1132 226270,615 226270,968 226270,1782 226271,179170 226272,636 226273,9560 226274,179170 226276,313 226277,72 226278,72 226279,932 226280,1132 226281,781 226282,72 226283,226284 226285,3804 226286,872 226287,1274 226289,31073 226290,179170 226291,2411 226293,179170 226294,138686 226295,175 226296,875 226298,191860 226299,3370 226299,4039 226300,8330 226301,1363 226302,392 226302,4760 226303,994 226304,222 226305,994 226306,58 226307,2915 226308,310 226308,3039 226309,795 226309,4355 226311,1572 226312,192 226313,179170 226314,251 226315,299 226316,7652 226317,179170 226318,994 226319,179170 226320,631 226321,46 226322,58 226323,994 226324,2979 226325,2083 226326,77 226327,1238 226328,83 226329,206 226330,77 226331,392 226332,4760 226333,1860 226334,6059 226335,697 226336,6955 226337,3612 226338,5658 226339,2274 226340,4252 226341,623 226342,301 226343,189303 226345,1452 226346,392 226347,4760 226348,6059 226349,1860 226350,5658 226351,4252 226352,623 226353,697 226354,6955 226355,3612 226356,595 226357,2274 226358,187960 226359,187176 226360,310 226361,874 226362,1 226363,4177 226364,636 226365,8270 226366,50 226366,209 226366,261 226366,312 226366,1096 226366,1118 226366,1531 226366,2750 226366,3079 226367,1132 226368,781 226369,278 226371,1801 226371,3182 226371,6424 226372,10 226374,179170 226375,4548 226376,1673 226377,79 226378,360 226378,1769 226378,1893 226379,994 226380,422 226380,5405 226381,1 226382,8270 226383,907 226384,589 226384,72439 226385,2979 226386,736 226387,30 226388,22 226389,999 226390,1849 226391,179170 226392,179170 226393,1294 226394,41767 226395,5301 226396,72 226399,1212 226400,720 226401,752 226402,994 226403,179170 226404,30 226405,1400 226406,179170 226407,151 226408,179170 226409,328 226410,1309 226410,1955 226411,920 226412,605 226412,1119 226412,1167 226412,2995 226412,103860 226414,4597 226415,179170 226417,309 226417,310 226418,309 226418,310 226419,309 226419,310 226422,918 226423,1509 226424,827 226425,309 226425,310 226425,1243 226426,875 226427,473 226428,192 226428,333 226429,602 226430,5987 226431,859 226432,809 226433,602 226434,83 226435,713 226436,973 226437,1132 226438,516 226439,417 226439,1635 226441,731 226442,1181 226443,151 226448,515 226449,302 226451,72 226452,861 226453,1132 226455,217 226456,1082 226457,179170 226458,140 226459,83 226460,189788 226460,189794 226460,189842 226461,666 226463,467 226465,1467 226466,142870 226467,330 226468,72 226469,850 226472,581 226472,663 226472,811 226472,918 226472,1058 226472,1556 226472,13980 226473,140 226474,283 226475,50 226476,483 226477,2116 226478,1663 226479,72 226480,435 226481,366 226484,179170 226485,592 226486,259 226486,676 226487,2671 226487,3252 226488,779 226489,4597 226491,843 226492,147 226493,1368 226494,1167 226495,72 226496,563 226497,23783 226500,515 226501,714 226502,943 226502,1332 226503,179170 226504,1688 226505,145240 226506,1370 226507,226508 226511,111 226515,158 226515,192 226516,171641 226517,5911 226518,622 226520,818 226521,151 226522,4597 226523,1556 226524,200 226525,94 226525,2787 226526,918 226527,861 226528,1860 226529,72 226530,6303 226532,30 226533,433 226534,704 226535,30 226536,179170 226537,479 226538,115 226539,500 226540,1052 226541,2775 226542,1962 226543,54 226544,875 226545,138686 226546,175 226547,4597 226548,151 226549,179170 226550,179170 226551,349 226551,509 226552,622 226553,310 226554,179170 226555,1359 226556,56 226557,422 226559,269 226560,145240 226561,422 226562,56 226563,406 226564,22 226564,30 226564,366 226564,805 226564,1177 226564,4237 226564,6556 226564,182162 226565,151 226566,2867 226566,2868 226567,179170 226568,56 226569,2146 226570,422 226571,134 226572,422 226573,56 226574,422 226575,56 226576,4237 226576,182162 226577,1177 226578,6556 226579,292 226580,408 226581,417 226582,2292 226583,56 226584,422 226585,179170 226586,264 226587,1227 226587,86416 226588,302 226589,179170 226590,1381 226592,56 226593,422 226594,344 226595,874 226596,1132 226597,781 226598,56 226599,422 226600,781 226601,1132 226602,885 226602,13704 226603,269 226605,1132 226606,781 226607,192 226608,718 226609,586 226610,259 226611,781 226612,1132 226613,30 226614,113156 226615,72 226616,226617 226618,1 226619,622 226620,1132 226621,781 226622,220816 226623,30 226624,1132 226625,781 226626,179170 226627,220816 226628,349 226629,1132 226630,781 226631,179170 226632,30 226633,145240 226634,220816 226635,2168 226636,1801 226637,220816 226638,1181 226639,1132 226640,4594 226641,261 226642,2989 226642,2991 226643,179170 226644,8270 226645,422 226646,220816 226647,622 226648,83 226648,278 226648,577 226649,221737 226650,3370 226650,14453 226651,179170 226653,269 226654,220816 226655,417 226655,1085 226655,1474 226655,1789 226655,2205 226655,33424 226655,245910 226656,220816 226657,30 226658,622 226659,30 226660,146 226660,92476 226661,408 226662,102 226663,1323 226664,577 226665,1235 226665,1335 226666,226667 226668,2735 226669,72 226670,781 226671,1132 226672,201298 226673,65 226674,435 226676,875 226677,226678 226679,220816 226680,220816 226681,875 226682,1132 226683,781 226684,1564 226685,179170 226686,4691 226687,107 226688,872 226689,2048 226690,1014 226691,781 226692,1132 226693,1014 226694,220816 226695,760 226696,1453 226697,953 226698,1014 226699,1014 226700,1893 226700,5547 226701,226702 226704,779 226705,8788 226706,220816 226707,278 226708,1014 226709,1707 226710,843 226711,1046 226712,673 226713,2915 226714,9025 226715,220816 226716,1429 226717,2671 226718,1118 226718,1663 226719,9026 226720,557 226721,217 226721,301 226722,862 226723,1474 226724,220816 226725,7092 226726,994 226727,949 226728,220816 226729,1608 226730,179170 226731,30 226732,83 226733,30331 226734,34 226734,35 226734,83 226735,6424 226736,220816 226737,1474 226737,1789 226739,151 226740,920 226741,1359 226742,233 226743,255 226744,2048 226745,1238 226746,220502 226747,200 226748,1381 226749,2048 226750,841 226751,28072 226752,72 226753,17309 226754,83 226755,994 226756,4597 226757,220816 226758,2373 226759,226760 226761,136 226762,77 226763,134 226764,4475 226765,200 226766,3999 226767,134 226768,179170 226769,4475 226770,4548 226771,220816 226772,1227 226772,86416 226773,1462 226774,278 226775,179170 226776,622 226777,202 226778,269 226780,220816 226781,179170 226782,226783 226784,226785 226786,366 226787,366 226788,4771 226789,65 226789,200 226789,252 226790,3623 226791,30 226792,56 226793,422 226794,2048 226795,30 226796,222 226796,628 226797,30 226798,30 226799,30 226800,30 226801,278 226802,3582 226803,273 226803,2367 226804,8270 226805,422 226806,56 226807,220816 226809,366 226810,818 226811,220816 226812,5440 226813,333 226814,226815 226814,227241 226814,227455 226814,237244 226814,245884 226814,247963 226814,248382 226814,249561 226814,257378 226814,259772 226814,262247 226814,264752 226816,220816 226817,115 226817,2868 226818,344 226818,1253 226819,1773 226820,1143 226821,30 226822,220816 226823,1368 226824,226825 226826,1235 226826,1335 226827,147 226828,682 226828,72439 226829,138686 226830,79 226831,435 226832,1359 226833,56 226834,422 226835,1949 226836,151 226837,4597 226838,843 226839,175 226840,30331 226841,179170 226842,1014 226843,30 226844,1235 226844,1335 226845,1466 226846,142870 226847,151 226848,72 226849,422 226850,422 226851,422 226852,422 226853,422 226854,422 226855,422 226856,422 226857,422 226858,422 226859,422 226860,422 226861,563 226863,557 226864,1247 226864,164572 226865,30 226866,145240 226867,3804 226868,285 226869,1267 226870,30 226871,56 226872,422 226873,8822 226874,5469 226875,2929 226876,5714 226877,226878 226879,56 226880,422 226881,779 226882,179170 226883,1474 226885,1284 226886,673 226887,179170 226888,302 226889,30 226890,4980 226891,671 226892,1452 226893,30 226895,900 226896,179170 226897,640 226898,206 226898,628 226898,16207 226898,22727 226899,918 226900,1368 226901,269 226903,226904 226903,261410 226905,972 226906,56 226907,422 226908,30 226909,146 226909,92476 226910,285 226911,862 226912,267 226913,850 226914,179170 226915,2116 226916,171 226917,30 226918,779 226919,5440 226920,211 226921,179170 226922,179170 226923,10 226924,493 226925,226926 226927,4597 226928,58 226929,491 226931,1085 226932,142405 226934,3447 226935,4597 226936,171641 226937,4597 226938,4597 226939,2671 226940,151 226941,8270 226942,195 226943,8822 226944,1844 226945,557 226945,164572 226946,918 226947,1462 226948,30331 226949,1955 226950,261 226951,1368 226952,577 226953,107228 226954,24505 226955,932 226957,250 226957,1684 226958,248 226959,206 226960,862 226961,1227 226961,86416 226962,801 226963,151 226964,2590 226965,226966 226968,346 226969,5405 226971,2995 226972,4597 226974,868 226975,907 226977,794 226978,1082 226979,35486 226980,56 226981,422 226982,818 226983,1509 226984,1359 226987,852 226987,1782 226988,1368 226989,30 226990,31934 226991,31934 226992,31934 226993,422 226994,56 226995,31934 226996,30 226997,31934 226998,557 226999,31934 227000,31934 227001,31934 227003,31934 227004,31934 227006,171641 227007,20813 227008,1608 227009,1132 227010,179170 227011,422 227012,56 227013,868 227014,179170 227015,31934 227016,872 227017,640 227018,647 227019,146 227019,92476 227020,344 227021,640 227022,1429 227023,138686 227024,640 227025,175 227026,640 227027,406 227027,779 227028,872 227029,985 227030,190492 227032,3260 227033,1359 227034,957 227034,1815 227034,164572 227035,273 227036,179170 227037,1132 227038,781 227039,211 227040,668 227041,577 227042,313 227043,422 227044,56 227045,7358 227045,7363 227046,56 227047,422 227048,56 227049,422 227050,146 227050,92476 227051,647 227052,344 227053,227054 227055,1132 227056,31934 227057,146 227057,92476 227058,647 227059,344 227060,200 227061,10 227061,425 227061,693 227061,1436 227061,1616 227061,3392 227061,6026 227061,6027 227061,21207 227061,26420 227061,38140 227061,226176 227061,227061 227061,227101 227061,227359 227061,228317 227061,231068 227061,234212 227061,236717 227061,246178 227061,252502 227061,252504 227061,263858 227062,255 227063,31934 227064,1227 227064,86416 227065,1132 227066,781 227068,698 227069,191860 227070,3207 227071,1240 227072,781 227073,1132 227075,269 227076,622 227077,447 227078,2775 227079,179170 227080,179170 227081,920 227082,79 227083,8270 227084,663 227084,875 227084,4722 227084,5800 227084,7987 227084,36720 227084,47021 227084,63097 227084,76704 227084,88544 227084,106121 227084,141853 227084,148601 227084,162619 227084,165787 227084,201253 227084,232736 227084,239805 227084,245283 227084,247116 227084,247131 227084,247298 227084,247693 227084,252237 227085,179170 227086,2296 227087,647 227088,146 227088,92476 227089,344 227090,781 227091,1132 227092,160 227093,179170 227094,647 227095,146 227095,92476 227096,344 227097,622 227098,179170 227099,191355 227100,801 227101,227061 227102,160 227103,1769 227104,781 227105,1132 227106,1769 227107,932 227108,160 227109,160 227110,160 227111,160 227112,160 227113,160 227114,781 227115,1132 227116,1985 227117,3209 227118,2205 227118,33424 227119,622 227120,16196 227121,3148 227122,1639 227123,120 227124,13 227125,2292 227126,217 227127,2668 227128,1014 227129,3 227130,247 227131,4604 227132,333 227133,8235 227134,918 227135,383 227136,622 227137,349 227138,3246 227139,2506 227140,588 227140,590 227141,250 227141,1684 227142,389 227143,211 227144,138686 227145,68 227146,175 227147,8868 227148,589 227149,67995 227150,179170 227151,433 227152,397 227153,360 227154,328 227155,79 227156,179170 227157,344 227158,647 227159,146 227159,92476 227160,2590 227161,227162 227163,622 227164,657 227165,2205 227165,33424 227165,245910 227166,1181 227168,77 227169,207 227170,1238 227171,622 227172,1294 227173,781 227174,1132 227175,50 227176,147 227177,557 227178,33424 227178,34580 227179,1370 227180,83 227181,1132 227182,781 227183,781 227184,1132 227185,682 227185,72439 227186,8270 227187,775 227189,205627 227190,330 227191,1452 227192,589 227193,1132 227194,1608 227195,200 227196,781 227197,1132 227198,599 227199,240 227200,149 227200,406 227201,146 227201,92476 227202,1143 227203,1247 227203,164572 227204,175 227205,179170 227206,30 227207,148742 227210,118336 227211,217 227212,179170 227213,1608 227214,1132 227215,622 227216,1058 227217,1132 227218,781 227219,56 227220,422 227221,217 227222,138686 227223,175 227225,3804 227226,622 227228,745 227228,1012 227228,1425 227228,2528 227228,249937 227230,389 227231,1132 227232,1608 227233,73570 227234,1882 227235,146 227235,92476 227236,647 227237,344 227238,3623 227239,14366 227240,227241 227242,179170 227244,6387 227245,227246 227247,179170 227248,211 227249,1776 227250,8991 227251,5440 227252,417 227253,6068 227254,907 227255,8330 227256,2116 227257,868 227258,35486 227259,83 227260,56 227261,422 227262,447 227263,2775 227265,34 227265,35 227266,1133 227267,178 227268,1082 227269,1608 227270,1132 227271,422 227272,227273 227274,3467 227275,2146 227276,35486 227277,439 227277,164572 227278,142405 227279,151 227280,30 227281,1608 227282,1132 227283,118336 227284,227285 227287,1368 227288,862 227289,372 227289,1082 227289,1285 227289,1796 227289,1888 227289,1955 227290,422 227291,227292 227293,77 227294,611 227294,1619 227295,35486 227296,227297 227298,134 227299,3999 227300,2048 227301,4475 227302,1454 227303,1285 227304,1132 227305,1608 227306,227307 227308,179170 227309,1058 227310,872 227311,207 227311,852 227312,30 227313,1132 227314,192 227314,333 227315,388 227316,452 227317,389 227318,44 227319,56 227320,422 227321,653 227321,2045 227322,167 227323,994 227324,2590 227326,586 227328,515 227329,200 227330,301 227331,30 227332,1608 227334,41 227335,1608 227336,918 227337,389 227338,1858 227339,1860 227340,1132 227342,179170 227343,179170 227344,333 227345,1132 227346,107 227346,1052 227346,1579 227347,309 227347,310 227348,752 227349,2480 227350,3582 227351,3623 227352,211 227353,1893 227354,227355 227356,1893 227358,5102 227360,65 227361,34 227361,35 227362,389 227363,301 227364,312 227365,406 227366,968 227367,389 227367,949 227368,151 227369,994 227370,1118 227371,932 227372,118336 227373,118336 227374,918 227375,302 227376,37 227376,301 227376,446 227376,615 227376,685 227376,911 227376,937 227376,968 227376,1231 227376,1293 227376,1623 227376,1782 227376,5356 227376,5662 227376,7222 227376,13523 227376,103860 227376,142806 227376,189303 227376,227376 227376,248553 227376,263299 227378,35486 227379,151 227380,179170 227381,1235 227381,1335 227382,5405 227383,83 227383,536 227384,2421 227385,1370 227386,3193 227387,179170 227388,250 227388,1684 227389,1001 227390,252 227391,77 227392,118336 227393,158 227393,118336 227394,146 227394,92476 227395,647 227396,344 227397,30 227398,147 227398,1181 227399,179170 227400,118336 227401,179170 227402,179170 227403,179170 227404,1010 227405,5405 227406,697 227407,1634 227408,326 227408,455 227408,873 227408,1300 227408,1479 227409,220816 227410,179170 227411,424 227412,179170 227413,72 227414,805 227415,220816 227416,179170 227417,302 227418,1390 227419,227420 227421,220816 227422,220816 227423,118336 227424,118336 227425,15068 227426,151 227427,861 227428,220816 227429,138 227430,227431 227432,865 227433,557 227434,137 227435,588 227435,590 227435,1419 227436,88820 227437,220816 227438,179170 227439,35486 227440,752 227441,535 227442,220816 227443,6682 227444,179170 227445,200 227446,1326 227447,102 227448,1323 227449,408 227450,72 227451,179170 227452,200 227453,220816 227454,55849 227456,200 227457,809 227458,118336 227459,1231 227459,1782 227460,972 227461,142870 227462,134 227462,1265 227462,1266 227463,179170 227464,179170 227465,220816 227466,118336 227467,1238 227468,332 227469,3623 227470,179170 227471,35486 227472,7092 227473,1132 227474,3623 227476,1132 227477,1608 227478,1132 227479,3623 227480,622 227481,220816 227482,1001 227483,140 227484,220816 227485,622 227486,827 227487,968 227488,622 227488,779 227489,489 227491,874 227492,227493 227492,240814 227492,251716 227494,811 227497,72 227498,72 227499,220816 227500,220816 227501,666 227502,278 227503,138686 227504,175 227505,10 227507,596 227508,149534 227509,220816 227510,179170 227511,918 227512,146 227512,92476 227513,647 227514,344 227515,179170 227516,1085 227517,2048 227518,227519 227520,72 227522,874 227523,366 227524,217 227525,467 227526,346 227527,3447 227528,1326 227529,631 227530,240 227531,1715 227532,390 227533,1010 227534,38299 227534,228921 227534,229718 227534,232383 227534,232387 227534,234157 227534,234168 227534,235930 227534,236447 227534,241220 227535,5405 227536,918 227537,227538 227539,147 227540,179170 227541,1227 227541,86416 227542,301 227543,142870 227544,179170 227545,843 227546,138686 227547,175 227548,298 227550,1133 227551,227552 227553,142870 227554,1368 227555,179170 227556,227557 227558,179170 227559,1556 227560,301 227561,932 227562,200 227563,191860 227564,179170 227565,134 227566,118336 227567,240 227568,422 227569,422 227570,422 227571,422 227572,118336 227573,422 227574,1844 227575,422 227576,779 227577,422 227578,422 227579,422 227580,2424 227581,179170 227582,179170 227583,422 227584,1368 227585,179170 227586,192 227586,200 227586,217 227586,222 227586,240 227586,269 227586,455 227586,779 227586,1019 227586,5265 227586,142870 227587,179170 227588,113156 227589,697 227590,1133 227591,10 227592,179170 227593,179170 227594,285 227595,179170 227596,250 227596,1684 227597,491 227598,285 227599,135 227600,179170 227601,269 227602,843 227603,258 227604,179170 227605,5343 227606,801 227607,30 227609,72 227610,30 227611,225 227612,179170 227613,862 227613,1001 227613,1474 227613,1789 227614,179170 227615,5405 227616,525 227617,30331 227618,1309 227619,1285 227620,422 227621,56 227622,631 227623,1085 227624,137 227625,294 227626,179170 227627,8884 227628,179170 227629,179170 227630,179170 227631,1085 227632,248 227632,1639 227633,483 227634,111 227634,1453 227634,1722 227634,3538 227635,227636 227637,1419 227637,8822 227638,30 227640,422 227641,56 227642,227643 227645,56 227646,422 227647,227648 227649,366 227650,366 227651,366 227652,366 227653,491 227654,779 227656,222 227657,146 227657,92476 227658,179170 227660,151 227661,35486 227662,142870 227663,283 227664,2416 227664,2417 227665,227666 227667,227666 227668,227669 227669,1284 227669,38299 227669,76704 227669,228921 227669,234157 227669,235009 227669,235930 227669,236447 227669,239776 227669,241639 227669,246309 227669,246841 227669,248244 227669,250395 227669,253342 227669,253508 227669,253985 227669,254371 227670,149 227671,5250 227672,1782 227673,56 227674,422 227675,314 227677,622 227678,932 227679,227680 227679,248395 227681,272 227682,227683 227684,874 227684,3182 227685,850 227686,1132 227687,310 227687,841 227688,151 227689,1983 227690,227691 227692,3447 227693,58 227694,1769 227695,227696 227697,3582 227698,50 227699,22 227700,1175 227701,4 227701,5 227702,83 227704,142870 227705,422 227706,56 227707,227708 227709,417 227709,1085 227711,44 227712,137 227714,1359 227715,483 227716,1381 227717,179170 227718,179170 227719,302 227720,141912 227721,1858 227722,1860 227723,151 227724,200 227726,179170 227727,666 227728,48505 227729,516 227730,455 227731,179170 227732,200 227733,179170 227734,240 227735,179170 227736,151 227740,602 227742,227743 227745,209 227747,1368 227748,1070 227749,15748 227750,622 227751,220816 227752,220816 227753,298 227754,485 227755,518 227756,220816 227757,147 227757,158 227758,220816 227759,179170 227760,1381 227761,179170 227762,56 227763,422 227764,5405 227765,493 227766,48505 227767,138686 227768,175 227769,805 227770,1227 227770,86416 227771,220816 227772,179170 227773,269 227774,346 227775,344 227776,918 227777,285 227778,227779 227780,1479 227781,390 227782,340 227783,346 227784,179170 227785,252 227786,227787 227788,179170 227789,2373 227790,1118 227792,15119 227793,220816 227794,15119 227795,220816 227796,179170 227797,179170 227798,289 227798,94134 227799,58 227800,3804 227801,179170 227802,145240 227803,1220 227804,252 227805,516 227806,818 227807,893 227808,1882 227809,918 227810,158 227811,1181 227812,227813 227814,220816 227817,227818 227819,41 227820,222 227821,41 227822,227823 227825,805 227826,1368 227827,781 227828,1132 227829,88820 227830,267 227831,72 227832,481 227833,72 227834,72 227835,389 227836,41 227837,30 227838,30 227839,366 227840,227841 227843,41 227844,17772 227845,269 227846,227847 227849,2292 227850,178 227853,30331 227854,1227 227854,86416 227855,1181 227857,872 227858,227859 227860,872 227861,285 227862,1368 227863,227864 227865,179170 227866,227867 227868,994 227869,227870 227871,30 227872,107 227873,2416 227873,2417 227874,292 227875,338 227876,298 227877,1133 227878,3538 227879,56 227880,422 227881,818 227883,227884 227885,1175 227888,491 227889,72 227890,1522 227891,35486 227892,455 227894,111 227894,4193 227895,932 227896,999 227897,72 227898,8270 227899,795 227900,994 227901,107 227903,1462 227903,2697 227903,164572 227905,151 227906,195 227907,1132 227908,22 227909,2244 227910,34 227910,35 227910,313 227910,634 227910,1313 227910,1718 227910,2224 227910,2646 227910,4223 227910,5326 227910,188791 227911,1590 227912,994 227913,2244 227914,2244 227915,2244 227917,1381 227918,2244 227919,1858 227921,227922 227923,56 227924,422 227925,179170 227926,30 227927,227928 227929,2750 227930,310 227932,44 227933,485 227934,298 227935,389 227936,4220 227937,83 227939,83 227940,217 227941,485 227942,298 227943,843 227943,2260 227945,179170 227946,179170 227948,192 227949,1132 227950,781 227951,1882 227952,1191 227953,483 227954,106 227955,389 227956,4597 227957,30 227959,179170 227960,1132 227961,781 227962,30 227963,4597 227964,138686 227965,175 227966,2379 227967,868 227968,859 227970,491 227971,1326 227972,102 227973,1323 227974,408 227975,999 227976,1381 227977,4597 227978,649 227980,1132 227981,781 227983,994 227984,491 227985,491 227986,227669 227988,30 227989,491 227990,72 227991,994 227992,994 227993,1132 227994,781 227995,1844 227996,1707 227997,30 227998,557 227999,557 228000,557 228001,693 228001,3370 228002,192 228003,1509 228004,179170 228005,1132 228006,781 228007,994 228008,179170 228009,784 228010,1132 228011,781 228012,760 228013,151 228014,1132 228015,781 228016,211 228017,358 228018,1220 228019,1127 228020,228021 228022,994 228023,1608 228024,8463 228024,142870 228025,13661 228026,1860 228027,1858 228028,1132 228029,781 228030,994 228031,1860 228032,1858 228033,13538 228034,994 228037,228038 228039,4611 228040,1181 228041,228042 228043,999 228044,2191 228045,1326 228046,2506 228047,119 228048,872 228049,872 228050,875 228051,72 228053,422 228054,422 228055,422 228056,422 228057,422 228058,422 228059,422 228060,422 228061,422 228062,72 228063,4597 228064,422 228065,346 228066,72 228067,138686 228068,175 228069,97 228070,240 228071,500 228072,2775 228073,1052 228074,1962 228075,54 228076,228077 228078,1181 228079,50 228081,240 228081,1285 228082,99 228083,1769 228084,99 228085,285 228086,1227 228086,86416 228087,179170 228088,179170 228089,366 228090,142870 228091,228092 228093,212234 228094,779 228095,178 228096,99 228097,1381 228098,99 228099,99 228100,142473 228101,292 228102,99 228103,294 228104,296 228105,298 228106,99 228107,179170 228109,779 228110,179170 228111,179170 228112,179170 228113,200 228114,228115 228116,179170 228117,1381 228119,83 228120,30 228122,8868 228123,1400 228124,99 228125,1132 228126,1608 228128,2371 228129,364 228130,1058 228131,141912 228132,228133 228134,694 228134,3695 228135,179170 228136,158 228137,4597 228138,228139 228140,586 228141,104 228142,4611 228143,228144 228145,7155 228146,358 228147,874 228148,1012 228150,1359 228151,640 228152,1608 228153,640 228154,142430 228154,147191 228155,640 228156,2979 228157,408 228158,148742 228159,240 228159,818 228160,228161 228162,30 228165,228166 228167,9457 228169,1201 228170,636 228172,215276 228177,35486 228183,1010 228184,79 228186,717 228191,666 228191,8714 228193,217 228197,631 228199,326 228201,251 228209,332 228210,344 228210,694 228210,1419 228213,671 228215,15 228216,1238 228218,1858 228219,1860 228226,408 228227,228228 228230,1452 228231,900 228232,1132 228233,781 228234,1893 228234,2312 228235,228236 228239,1359 228240,1309 228240,1807 228240,1955 228240,2775 228241,1860 228242,1858 228243,179170 228244,932 228245,422 228246,56 228247,781 228248,1132 228249,228250 228251,140 228252,781 228253,1132 228254,171 228255,228256 228257,760 228267,1010 228268,171 228269,1284 228270,72 228271,344 228272,285 228276,657 228277,222 228277,657 228279,1224 228280,3623 228281,685 228282,779 228283,3260 228284,1769 228285,835 228286,146 228286,92476 228287,220816 228288,1300 228289,366 228290,500 228291,349 228292,718 228293,1010 228294,252 228299,1821 228299,21736 228300,536 228301,65 228301,120 228301,285 228301,438 228301,599 228301,660 228301,795 228301,818 228301,1122 228301,1454 228301,1849 228301,2646 228301,2699 228302,5961 228304,195 228306,9457 228307,138686 228308,1227 228308,86416 228309,175 228310,1294 228311,301 228312,340 228313,146 228313,92476 228314,14989 228315,24505 228317,227061 228318,200 228320,171641 228321,81 228323,7429 228324,289 228324,94134 228325,3695 228326,615 228328,1860 228329,1858 228330,415 228331,30 228333,13980 228335,83 228337,3695 228339,3695 228340,1220 228341,516 228342,252 228344,4597 228347,462 228348,818 228348,127158 228349,227669 228352,1359 228354,657 228356,1240 228357,344 228358,2421 228359,934 228360,13661 228361,919 228362,1284 228364,1801 228365,1860 228366,1858 228367,264 228368,2572 228369,171641 228370,1749 228371,2421 228372,1132 228373,772 228373,1722 228374,467 228375,2105 228377,1096 228378,151 228379,138686 228380,175 228381,1522 228382,209 228383,859 228384,30 228386,1359 228387,999 228388,1608 228389,228390 228391,3623 228392,140 228393,1132 228394,781 228395,1132 228396,972 228396,4504 228399,2979 228402,30 228403,192 228403,406 228403,4192 228403,4193 228404,1858 228405,1860 228406,1220 228407,252 228408,516 228409,217 228411,1452 228416,228417 228418,358 228419,14434 228420,433 228425,200 228426,2073 228431,1782 228432,73570 228433,44 228436,349 228436,392 228437,1132 228438,781 228439,1284 228439,148742 228440,189303 228441,179170 228442,179170 228443,299 228443,73570 228444,1608 228445,3207 228446,491 228447,200 228451,3612 228455,13661 228457,275 228458,83 228458,455 228458,657 228458,949 228458,1454 228459,179170 228460,740 228460,741 228462,79 228466,1220 228467,302 228468,1089 228469,302 228470,147 228473,302 228474,491 228475,1293 228476,397 228477,200 228480,55849 228482,10 228482,175 228483,55849 228484,536 228485,228486 228487,389 228488,30 228489,424 228490,228491 228492,192 228492,818 228493,435 228494,48505 228495,142473 228496,138686 228497,120 228498,175 228499,191860 228500,179170 228501,1227 228501,86416 228502,72 228503,15119 228504,200 228505,515 228506,228507 228508,178 228508,315 228508,346 228508,393 228508,435 228508,439 228508,538 228508,671 228508,934 228508,996 228508,1068 228508,1294 228508,1590 228508,1612 228508,1644 228508,1877 228508,2353 228508,6661 228509,7416 228510,2373 228511,206 228512,179170 228513,118336 228514,918 228515,30 228516,149 228516,406 228517,918 228518,211 228519,135 228520,179170 228521,60576 228522,19010 228523,340 228525,483 228526,179170 228527,83 228528,712 228529,8308 228530,179170 228531,406 228532,1860 228533,1858 228534,779 228535,30 228536,435 228537,179170 228538,1 228539,1132 228540,30 228540,200 228541,1849 228543,56 228544,422 228545,151 228546,200 228547,83 228548,356 228548,611 228549,1566 228550,179170 228551,843 228552,1118 228553,408 228554,30 228555,577 228556,179170 228557,2421 228558,30 228559,113156 228560,634 228561,228562 228563,56 228564,179170 228565,422 228566,2735 228567,56 228568,422 228569,115659 228570,179170 228571,228572 228573,467 228574,228575 228576,56 228577,422 228579,2421 228580,179170 228581,1749 228582,1181 228583,149 228583,406 228584,852 228587,220816 228588,1177 228589,83 228590,179170 228591,360 228592,502 228592,704 228592,760 228592,1459 228592,5679 228592,13166 228592,13207 228592,22299 228592,143262 228592,158817 228592,199078 228592,200794 228593,557 228594,220816 228595,4597 228596,841 228597,1949 228598,1188 228599,220816 228600,72 228601,79 228602,228603 228604,222 228604,455 228605,366 228605,718 228605,2606 228606,220816 228607,220816 228608,228609 228611,179170 228612,994 228613,1240 228613,1949 228614,1087 228615,1326 228616,1323 228617,102 228618,408 228619,220816 228620,314 228620,852 228621,422 228622,56 228623,885 228623,13704 228624,220816 228625,188791 228627,1749 228628,179170 228629,68 228629,66297 228630,682 228630,72439 228631,2244 228632,1556 228633,50 228633,247 228633,1181 228634,736 228635,179170 228636,179170 228637,252 228640,179170 228641,2367 228642,30 228643,179170 228644,179170 228645,1644 228646,278 228647,450 228649,87 228650,30 228650,248 228651,1531 228653,298 228654,557 228655,264 228656,366 228657,1474 228658,366 228659,4 228659,5 228660,673 228661,577 228662,264 228663,704 228664,1449 228666,179170 228667,8270 228668,2590 228669,179170 228670,1531 228671,843 228672,3695 228673,891 228674,8855 228675,467 228676,48 228676,87 228676,104 228676,130 228676,136 228676,140 228676,225 228676,240 228676,248 228676,264 228676,296 228676,302 228676,323 228676,372 228676,462 228676,515 228676,518 228676,579 228676,589 228676,647 228676,652 228676,736 228676,835 228676,862 228676,943 228676,953 228676,1001 228676,1007 228676,1052 228676,1082 228676,1085 228676,1102 228676,1127 228676,1179 228676,1289 228676,1326 228676,1332 228676,1368 228676,1452 228676,1509 228676,1579 228676,1639 228676,1893 228676,2296 228676,2312 228676,3041 228676,3585 228676,3999 228676,5405 228676,5440 228676,9030 228676,14945 228677,179170 228678,640 228679,1572 228680,417 228680,1368 228681,72 228682,920 228683,1608 228684,1359 228685,179170 228686,179170 228687,171 228688,192 228689,298 228690,636 228691,119 228692,285 228693,184 228694,179170 228695,2116 228696,220816 228697,788 228698,422 228699,657 228700,4597 228701,220816 228702,3623 228703,406 228704,1220 228705,220816 228706,179170 228707,220816 228708,179170 228709,107 228709,2209 228710,7092 228711,147 228712,217 228713,220816 228714,491 228715,491 228716,1860 228717,1858 228718,50 228719,158 228721,56 228722,422 228723,918 228724,137 228725,704 228726,577 228727,452 228728,138686 228729,175 228730,1359 228731,900 228732,1608 228733,1132 228734,1381 228735,435 228736,179170 228737,179170 228738,1265 228738,1266 228740,994 228741,1417 228742,30 228742,200 228743,843 228744,179170 228745,149 228746,1227 228746,86416 228747,1132 228748,781 228749,217 228749,222 228749,349 228749,455 228749,760 228749,5343 228750,179170 228751,278 228752,3623 228753,585 228754,72 228755,346 228756,35486 228758,8270 228759,228760 228761,269 228762,179170 228763,58 228764,2266 228765,113156 228766,1571 228768,171641 228769,179170 228770,2590 228771,179170 228772,2590 228773,179170 228774,333 228774,1388 228774,1531 228774,1608 228774,4455 228774,15573 228775,179170 228776,1429 228778,872 228779,207 228780,366 228781,366 228782,1707 228783,668 228784,1119 228785,137 228786,323 228787,973 228788,81 228789,479 228790,179170 228791,228792 228793,25344 228794,634 228795,72 228796,278 228797,1467 228798,1773 228799,455 228800,2424 228801,158 228801,779 228802,1871 228803,663 228804,228805 228806,83 228807,2421 228808,13980 228809,179170 228810,179170 228811,1143 228812,228813 228814,422 228815,56 228816,228817 228818,160 228818,4571 228818,88820 228819,422 228820,56 228821,179170 228823,346 228824,228825 228826,179170 228827,179170 228828,1452 228829,72 228830,1175 228831,2105 228832,726 228833,149 228835,5469 228836,206 228838,4220 228839,1359 228841,1085 228841,75912 228842,1359 228843,2371 228844,240 228845,72 228847,179170 228848,221828 228849,596 228850,577 228851,491 228851,1782 228851,48505 228852,2373 228853,179170 228854,240 228854,592 228854,1818 228854,2620 228855,192 228855,1631 228856,1188 228857,179170 228858,192 228858,1623 228859,1160 228860,261 228862,640 228863,424 228864,1644 228865,149 228865,406 228866,640 228870,640 228873,1359 228879,140 228881,179170 228882,273 228884,41 228885,147 228886,1309 228888,1033 228889,636 228890,35486 228891,657 228891,2266 228893,72 228895,179170 228896,200 228898,1235 228898,1335 228899,1983 228899,111142 228900,228901 228902,2979 228903,309 228903,310 228904,206 228905,179170 228906,3804 228907,250 228907,1684 228908,147 228908,118336 228909,179170 228910,206 228910,911 228911,1608 228912,1132 228913,1132 228914,1608 228915,994 228916,907 228917,358 228918,292 228920,1132 228921,227669 228922,920 228923,179170 228924,146 228924,92476 228925,647 228926,344 228927,24500 228928,167 228928,1149 228929,6303 228930,206 228931,178 228932,272 228933,994 228935,187176 228936,1117 228937,861 228939,4237 228939,182162 228940,72 228941,138686 228942,175 228944,994 228945,775 228945,1326 228946,312 228947,1132 228948,868 228949,1844 228950,868 228951,422 228952,2224 228952,2646 228952,5326 228953,422 228954,422 228955,2750 228956,179170 228957,4218 228958,83 228959,1359 228961,200 228962,422 228963,422 228964,422 228965,422 228966,422 228967,56 228968,422 228969,422 228970,366 228971,422 228972,422 228973,422 228974,994 228975,3 228975,34 228975,35 228975,87 228975,104 228975,134 228975,135 228975,137 228975,167 228975,209 228975,217 228975,251 228975,252 228975,254 228975,264 228975,289 228975,333 228975,364 228975,392 228975,497 228975,516 228975,589 228975,644 228975,779 228975,850 228975,877 228975,907 228975,1001 228975,1010 228975,1241 228975,1265 228975,1266 228975,1522 228975,1715 228975,1818 228975,1939 228975,1955 228975,2083 228975,2105 228975,2191 228975,2620 228975,2931 228975,3328 228975,3367 228975,94134 228976,217 228977,3585 228978,575 228979,571 228979,868 228980,2224 228981,79 228982,147 228983,605 228984,56 228985,422 228986,8788 228987,1052 228988,500 228989,1962 228990,54 228991,2775 228992,117163 228993,200 228994,397 228995,269 228997,720 228998,994 228999,2480 229000,2048 229001,843 229003,264 229003,1381 229003,1893 229007,229008 229009,994 229010,272 229011,83 229012,151 229013,302 229014,3260 229015,994 229016,1359 229017,781 229018,1132 229019,1769 229019,1893 229020,994 229021,1860 229022,1858 229023,285 229024,994 229025,302 229025,893 229027,146 229027,92476 229028,1247 229028,164572 229029,1860 229030,1858 229031,179170 229032,1860 229033,1858 229034,920 229034,142870 229035,15748 229036,4237 229036,182162 229037,160 229039,134 229041,994 229042,83 229043,1858 229044,1860 229045,1010 229046,312 229049,56 229050,422 229051,179170 229052,622 229053,1436 229054,1 229055,30 229056,302 229057,179170 229058,1644 229059,1332 229060,862 229061,2506 229062,4237 229062,182162 229064,1181 229065,1181 229066,1227 229066,86416 229067,4571 229068,162599 229069,55849 229071,795 229071,1133 229071,1449 229072,1130 229073,2083 229074,422 229075,56 229076,366 229077,356 229078,178 229078,406 229079,406 229080,893 229081,571 229082,167 229082,1522 229082,207045 229083,79 229084,145240 229085,55849 229087,205627 229088,749 229089,66297 229091,1893 229092,225 229093,106 229093,149 229094,309 229094,310 229095,34 229095,35 229097,859 229098,211 229101,167 229102,200 229103,994 229104,422 229106,56 229107,577 229108,1556 229109,66297 229110,663 229111,3161 229112,349 229112,392 229113,994 229114,179170 229115,44 229116,406 229117,1359 229118,1326 229119,718 229120,229121 229122,30 229123,8270 229124,202 229124,925 229125,1132 229126,1181 229127,4193 229129,775 229129,1619 229129,2812 229129,193129 229131,179170 229132,435 229133,1417 229134,2083 229134,118336 229135,360 229136,55849 229137,312 229138,217 229139,225 229140,980 229140,1429 229141,994 229142,179170 229143,843 229144,8192 229145,994 229146,918 229147,994 229148,515 229149,455 229150,1285 229150,1287 229151,1612 229152,179170 229153,138686 229154,175 229155,3413 229156,30 229156,217 229157,48 229158,349 229159,1955 229160,309 229160,310 229161,200 229162,302 229162,6303 229163,1556 229164,4597 229165,389 229166,83 229166,217 229166,536 229166,13575 229167,4760 229168,6068 229169,694 229170,994 229171,30 229172,155473 229173,179170 229174,392 229175,79 229176,483 229178,406 229179,657 229180,994 229181,994 229182,141912 229183,179170 229184,994 229185,1096 229186,72 229187,994 229188,779 229189,179170 229190,1551 229191,200 229192,56 229193,422 229195,162599 229196,2590 229197,620 229197,4611 229198,151 229199,1287 229200,179170 229201,179170 229202,1132 229204,83 229205,1419 229206,588 229206,590 229207,220816 229208,22 229209,435 229211,1220 229212,1732 229213,179170 229214,1167 229215,467 229216,3246 229217,7416 229219,220816 229220,485 229221,1132 229222,781 229223,202 229224,30 229226,179170 229227,861 229228,1635 229229,818 229229,1631 229230,167 229230,1284 229230,1544 229231,179170 229232,843 229233,30 229233,200 229235,83 229236,4220 229237,996 229238,1220 229239,516 229240,252 229241,179170 229242,273 229243,779 229244,179170 229245,229246 229247,220816 229248,72 229249,1220 229250,516 229251,252 229252,1531 229253,83 229254,72 229255,179170 229256,30 229257,536 229258,72 229259,35486 229260,4611 229261,179170 229262,1707 229263,229264 229263,236272 229265,179170 229266,3258 229267,920 229268,1220 229269,252 229270,251 229271,81 229272,72 229273,1644 229274,30 229276,151 229277,23783 229278,217 229279,406 229281,980 229282,1326 229283,102 229284,1323 229285,408 229286,795 229288,81 229289,10 229289,113156 229290,346 229291,30 229292,1515 229293,200 229294,220816 229295,30 229296,83 229296,2590 229296,6068 229297,179170 229298,10 229298,32 229298,79 229298,97 229298,136 229298,137 229298,192 229298,202 229298,219 229298,222 229298,247 229298,267 229298,280 229298,333 229298,344 229298,358 229298,393 229298,557 229298,577 229298,586 229298,657 229298,788 229298,920 229298,972 229298,1058 229298,1188 229298,1436 229298,1509 229298,1531 229298,1566 229298,1653 229298,2209 229298,2574 229298,3695 229298,3846 229298,4192 229298,4545 229298,6323 229298,14352 229298,25348 229298,56150 229298,101688 229299,1381 229300,1132 229301,781 229303,30 229305,30 229306,779 229307,1860 229308,1858 229309,491 229310,1082 229311,1181 229312,56 229313,422 229314,557 229315,178 229315,346 229315,435 229315,439 229315,1033 229315,1294 229315,5212 229316,640 229317,713 229318,1474 229319,272 229320,72 229321,673 229322,179170 229323,7092 229324,151 229325,179170 229326,151 229327,302 229328,1332 229330,77 229331,861 229332,23783 229334,72 229335,1181 229336,72 229337,1132 229338,147 229339,72 229340,83 229341,217 229342,1419 229343,536 229344,2671 229345,1955 229346,588 229346,590 229347,272 229348,65 229349,72 229350,1014 229351,1014 229352,1014 229354,1 229355,72 229356,1014 229357,5366 229358,45022 229359,1014 229360,229361 229363,360 229364,516 229365,72 229366,272 229368,2744 229369,278 229370,5718 229371,229372 229373,79 229374,220816 229375,4597 229376,220816 229377,346 229378,795 229378,1118 229378,1181 229378,3804 229378,4193 229378,17245 229378,125569 229379,278 229380,220816 229381,330 229382,450 229383,536 229384,1253 229384,20813 229385,364 229385,1511 229386,285 229387,626 229387,25348 229388,589 229389,44 229390,2646 229391,220816 229392,2353 229393,202 229394,5101 229395,220816 229396,2620 229397,503 229397,704 229398,147 229399,2116 229400,5265 229401,220816 229402,450 229403,5101 229404,220816 229405,179170 229406,1531 229407,1014 229408,202 229409,217 229410,389 229411,1860 229412,1858 229413,220816 229414,220816 229415,158 229416,346 229417,179170 229418,72 229419,68509 229420,4101 229421,220816 229422,1238 229423,179170 229425,1188 229425,1267 229425,1551 229425,2367 229425,2605 229426,147 229427,2421 229428,949 229429,1452 229430,179170 229431,779 229431,1127 229431,1893 229432,1179 229434,72 229435,17590 229436,14650 229437,422 229438,72 229439,2590 229440,72 229441,2266 229442,577 229443,1 229443,10 229443,222 229443,333 229443,336 229443,622 229443,991 229443,1118 229443,1572 229443,1623 229443,1844 229443,2073 229443,5101 229443,5265 229443,5310 229443,9030 229443,142405 229444,149 229445,8270 229446,8270 229447,179170 229448,220816 229449,220816 229450,220816 229451,1363 229452,450 229453,179170 229454,138686 229455,175 229456,179170 229457,179170 229458,72 229459,72 229460,179170 229461,220816 229462,179170 229463,171641 229464,781 229465,1132 229466,657 229467,4597 229468,179170 229469,72 229470,72 229471,850 229472,72 229473,68 229473,294 229473,431 229473,818 229473,1462 229473,1631 229473,2620 229473,2995 229473,3135 229473,8537 229473,9015 229473,9021 229474,72 229475,179170 229476,72 229477,149 229478,1353 229479,158 229480,1773 229481,366 229482,167 229483,422 229484,422 229485,422 229486,422 229487,422 229488,422 229489,422 229490,422 229491,1715 229492,818 229493,422 229494,422 229495,1007 229496,422 229497,422 229498,30 229499,1227 229499,86416 229500,8270 229502,577 229503,309 229503,310 229503,1052 229503,2312 229504,2590 229505,1227 229505,86416 229506,179170 229507,424 229508,179170 229509,5101 229510,179170 229511,179170 229512,72 229513,56 229514,422 229515,179170 229516,1429 229517,8270 229518,179170 229519,2590 229520,4597 229521,179170 229522,1 229523,493 229523,704 229524,72 229525,72 229526,207 229527,179170 229528,818 229529,668 229530,41 229531,179170 229532,179170 229533,1181 229534,179170 229535,137 229536,4455 229537,179170 229538,2367 229539,179170 229540,179170 229541,269 229542,1 229543,920 229544,179170 229545,179170 229546,919 229547,72 229548,151 229549,179170 229550,179170 229551,8270 229552,151 229553,247 229554,179170 229555,179170 229556,872 229557,3297 229558,179170 229559,1085 229560,868 229561,33424 229561,99287 229562,2931 229563,179170 229564,1414 229565,366 229566,179170 229568,229569 229570,229569 229571,229569 229572,229569 229573,30 229574,1414 229575,697 229576,221737 229577,1143 229578,4597 229579,1821 229579,21736 229581,302 229582,862 229584,1332 229585,187176 229587,124668 229588,184 229588,874 229590,1326 229591,192 229592,760 229593,167 229594,1287 229595,1287 229597,872 229598,200 229599,1635 229600,4411 229601,17590 229602,151 229603,1132 229604,781 229605,872 229606,1773 229607,1345 229608,872 229609,3695 229610,192 229611,872 229612,1556 229613,827 229614,640 229615,640 229616,179170 229617,1556 229618,79 229619,72 229622,35486 229623,1531 229624,3804 229626,473 229627,5101 229628,56 229629,422 229631,301 229631,968 229631,1293 229631,3809 229631,80009 229631,221828 229631,226270 229631,229747 229631,231070 229633,1677 229635,1515 229636,252 229637,1132 229638,781 229639,83 229640,36819 229641,83 229642,200 229643,1844 229644,160373 229645,6682 229646,200 229647,138686 229648,175 229649,83 229650,179170 229651,360 229652,328 229653,663 229654,920 229655,1608 229656,1132 229658,1634 229659,431 229659,631 229660,73570 229661,10 229661,994 229662,179170 229663,1087 229664,1181 229665,615 229666,179170 229668,179170 229669,151 229670,200 229671,217 229672,920 229673,781 229674,1132 229675,63 229675,97 229675,516 229676,41 229677,3094 229678,932 229679,5034 229681,31977 229681,229682 229681,254561 229683,652 229684,240 229685,652 229686,515 229687,1893 229688,1052 229689,1052 229691,229692 229693,200 229694,3623 229695,3804 229696,1132 229697,781 229698,328 229699,994 229700,79 229701,994 229702,668 229703,1132 229704,781 229705,644 229707,200 229708,1127 229709,2105 229710,1392 229712,1634 229713,1381 229714,222 229715,781 229716,1132 229717,148742 229719,3507 229720,200 229721,1858 229722,1860 229723,781 229724,1132 229725,41 229726,781 229727,1132 229728,1860 229729,1858 229730,1132 229731,781 229732,56 229733,422 229734,2244 229735,2244 229736,217 229737,1287 229738,781 229739,1132 229740,202 229741,781 229742,1132 229743,1238 229744,2244 229745,1590 229746,911 229749,781 229750,1132 229751,83 229752,992 229753,1452 229754,222 229754,590 229754,1419 229754,5343 229755,4611 229756,4611 229757,781 229758,1132 229759,1227 229759,86416 229760,6955 229762,1858 229763,1860 229764,2775 229765,447 229766,2460 229767,422 229768,56 229769,1644 229770,366 229771,481 229773,34 229773,35 229774,1132 229775,229776 229777,1132 229778,781 229779,1087 229780,192 229780,1089 229781,179170 229782,682 229782,72439 229784,657 229785,1132 229786,195 229787,349 229788,422 229789,56 229790,781 229791,1132 229792,138686 229793,302 229793,893 229794,1566 229796,697 229798,1608 229800,872 229801,1132 229802,781 229804,83 229805,3695 229806,151 229808,779 229809,211 229810,222 229811,932 229813,393 229814,60576 229815,1564 229816,83 229817,151 229819,1181 229820,30 229821,1220 229822,491 229823,261 229825,1181 229826,302 229827,811 229828,358 229829,1556 229830,861 229831,3695 229832,5034 229833,147 229833,240174 229834,1858 229835,1860 229837,285 229838,83 229839,162599 229841,2775 229842,447 229843,862 229844,3135 229845,179170 229846,1052 229847,33611 229848,179170 229849,918 229850,44 229851,994 229852,229853 229854,310 229854,3039 229855,994 229856,467 229856,162599 229857,179170 229858,162599 229859,726 229860,1465 229861,536 229861,2784 229863,138686 229864,175 229865,240 229865,457 229865,1459 229865,1572 229865,3385 229865,63005 229865,77808 229865,84373 229865,98227 229865,164632 229865,182162 229865,234870 229865,259601 229866,843 229867,875 229868,35486 229870,483 229871,2244 229872,156379 229873,994 229874,1 229875,32 229876,1014 229877,142870 229878,179170 229879,994 229880,142433 229881,360 229882,918 229883,179170 229884,83 229885,179170 229886,179170 229887,30 229888,1127 229889,516 229890,406 229891,151 229892,179170 229894,13661 229895,30236 229896,162599 229897,6068 229898,127158 229899,781 229900,1132 229901,179170 229902,1782 229903,515 229904,179170 229905,1220 229906,200 229907,1860 229908,1858 229909,872 229910,622 229911,862 229912,179170 229913,1 229914,200 229915,372 229915,1511 229915,3069 229916,302 229917,1860 229918,1858 229919,1556 229920,179170 229921,8714 229922,1773 229923,861 229924,1858 229925,1860 229926,151 229927,538 229928,3623 229929,302 229930,1016 229931,34 229931,222 229931,1718 229931,4594 229932,3538 229933,640 229935,875 229936,640 229937,56 229938,422 229939,5 229939,2991 229939,42220 229940,1181 229941,30 229942,1181 229943,818 229944,1087 229944,25348 229945,1052 229946,162599 229947,707 229948,56 229949,422 229951,1769 229952,346 229956,406 229957,4 229957,5 229957,22 229957,34 229957,35 229957,48 229957,65 229957,68 229957,79 229957,94 229957,97 229957,102 229957,111 229957,119 229957,130 229957,135 229957,140 229957,151 229957,163 229957,167 229957,178 229957,184 229957,187 229957,195 229957,217 229957,227 229957,248 229957,264 229957,283 229957,302 229957,309 229957,310 229957,315 229957,340 229957,344 229957,346 229957,392 229957,393 229957,406 229957,408 229957,420 229957,431 229957,439 229957,440 229957,442 229957,444 229957,446 229957,452 229957,455 229957,457 229957,473 229957,485 229957,489 229957,491 229957,510 229957,515 229957,518 229957,538 229957,571 229957,577 229957,579 229957,589 229957,595 229957,602 229957,622 229957,628 229957,640 229957,652 229957,657 229957,671 229957,687 229957,693 229957,704 229957,718 229957,795 229957,809 229957,811 229957,818 229957,827 229957,841 229957,859 229957,872 229957,893 229957,918 229957,932 229957,934 229957,968 229957,994 229957,996 229957,1001 229957,1019 229957,1033 229957,1052 229957,1058 229957,1102 229957,1113 229957,1118 229957,1122 229957,1140 229957,1177 229957,1181 229957,1188 229957,1267 229957,1282 229957,1289 229957,1294 229957,1305 229957,1323 229957,1370 229957,1381 229957,1392 229957,1400 229957,1417 229957,1434 229957,1462 229957,1509 229957,1531 229957,1556 229957,1579 229957,1590 229957,1612 229957,1635 229957,1639 229957,1644 229957,1659 229957,1677 229957,1707 229957,1715 229957,1776 229957,1796 229957,1807 229957,1818 229957,1871 229957,1877 229957,1893 229957,1962 229957,1968 229957,2017 229957,2146 229957,2209 229957,2244 229957,2260 229957,2266 229957,2334 229957,2353 229957,2367 229957,2443 229957,2574 229957,2626 229957,2775 229957,2787 229957,2979 229957,3039 229957,3041 229957,3148 229957,3193 229957,3295 229957,3345 229957,3585 229957,3695 229957,3804 229957,3999 229957,4039 229957,4066 229957,4355 229957,4411 229957,4453 229957,4678 229957,4823 229957,5213 229957,5911 229957,6119 229957,6303 229957,6789 229957,6955 229957,7117 229957,7270 229957,7768 229957,8235 229957,8270 229957,8537 229957,8541 229957,8820 229957,9018 229957,9024 229957,9028 229957,9029 229957,13345 229957,13538 229957,13910 229957,14483 229957,14945 229957,16196 229957,19005 229957,20359 229957,31122 229957,31896 229957,32475 229957,36985 229957,49057 229957,54264 229957,54272 229957,54284 229957,54362 229957,67343 229957,72764 229957,87638 229957,95642 229957,127158 229957,204214 229958,99 229959,1467 229960,861 229961,30 229962,2373 229963,240 229963,289 229963,301 229963,714 229963,1511 229963,2205 229963,2286 229963,2620 229963,3069 229963,20359 229963,33424 229963,94134 229964,113156 229965,781 229966,1132 229967,88820 229968,338 229969,1722 229970,88820 229971,338 229972,88820 229973,179170 229974,372 229975,179170 229976,1893 229977,1052 229978,1962 229979,500 229980,54 229981,2775 229982,1285 229983,142870 229984,1132 229985,781 229986,1688 229988,30 229989,200 229990,781 229991,1132 229992,179170 229993,450 229995,222 229996,179170 229997,805 229998,1220 229999,516 230000,252 230001,1265 230001,1266 230002,160 230003,179170 230004,179170 230005,743 230006,2750 230007,1181 230008,1082 230009,1326 230010,408 230011,102 230012,1323 230013,179170 230014,179170 230015,893 230016,818 230017,1571 230018,179170 230019,30 230020,68 230021,336 230023,640 230024,294 230025,500 230026,1052 230027,2775 230028,1962 230029,54 230030,567 230030,1345 230030,3756 230031,220816 230032,704 230032,15748 230032,22482 230033,220816 230034,346 230035,220816 230036,2646 230037,278 230038,83 230039,346 230040,179170 230041,50 230041,406 230041,1837 230041,5662 230042,2923 230043,220816 230044,1014 230045,7092 230046,346 230047,247 230048,220816 230049,5906 230050,557 230051,626 230052,278 230053,137 230054,255 230055,862 230056,220816 230057,106 230058,179170 230059,179170 230060,179170 230061,179170 230062,1265 230062,1266 230063,179170 230064,859 230065,179170 230066,220816 230067,220816 230068,2590 230069,83 230070,1551 230071,6387 230072,338 230073,35486 230074,338 230075,657 230075,213089 230076,920 230077,264 230078,30 230079,6387 230080,6387 230081,71 230082,278 230083,255 230084,1089 230084,1623 230084,17590 230084,122406 230085,171 230086,111 230086,4771 230087,1370 230088,3115 230089,230090 230091,2590 230092,1266 230092,2931 230093,220816 230094,200 230095,779 230096,752 230097,19010 230098,360 230099,230100 230101,220816 230103,21442 230104,657 230105,640 230106,333 230106,973 230106,124668 230106,171641 230107,8854 230108,332 230109,2797 230110,3331 230111,3319 230112,3328 230113,147 230114,652 230114,1639 230115,230116 230117,489 230118,83 230119,30 230121,1181 230122,187 230123,2334 230124,450 230125,775 230125,3804 230125,9017 230126,726 230127,805 230128,2699 230129,2048 230130,138686 230131,230132 230133,175 230134,843 230135,179170 230136,72 230137,406 230138,25344 230139,455 230140,450 230141,130 230142,56 230143,422 230144,285 230145,220816 230146,220816 230147,14797 230148,171 230149,30 230150,58 230151,994 230152,46 230153,220816 230154,338 230155,250 230155,1684 230156,273 230157,577 230158,1181 230160,516 230161,779 230162,424 230163,151 230163,717 230163,2048 230164,1227 230164,86416 230165,3447 230166,285 230167,179170 230168,422 230169,422 230170,422 230171,422 230172,422 230173,422 230174,422 230175,422 230176,422 230177,422 230178,422 230179,422 230180,124668 230181,72 230182,30 230184,285 230185,240 230186,179170 230187,250 230187,1684 230188,285 230189,1010 230190,58 230190,222 230190,588 230190,590 230190,1140 230190,1177 230190,1419 230190,142870 230191,137 230192,3297 230193,30 230194,179170 230195,264 230196,137 230197,179170 230198,30 230199,179170 230200,179170 230201,151 230202,431 230202,631 230202,862 230202,994 230202,1474 230202,1789 230202,44725 230203,149 230204,697 230205,392 230206,1265 230206,1266 230207,179170 230208,179170 230209,389 230210,179170 230211,83 230212,179170 230213,179170 230214,151 230215,1414 230216,304 230217,581 230218,1381 230219,640 230220,99 230221,918 230222,151 230223,34 230223,35 230223,217 230223,222 230223,657 230223,1181 230223,1210 230223,2266 230223,2421 230223,6424 230224,99 230225,302 230226,179170 230227,278 230227,455 230227,1539 230230,557 230231,3769 230232,366 230233,2168 230234,671 230235,491 230236,1087 230236,25348 230237,907 230237,3370 230238,1132 230239,366 230240,366 230242,366 230244,366 230245,1 230246,872 230247,872 230248,214734 230249,1181 230250,615 230251,58 230252,994 230253,46 230254,1893 230254,75912 230255,162599 230256,647 230257,146 230257,92476 230258,344 230259,3999 230260,179170 230261,60576 230262,35486 230263,179170 230264,14366 230265,663 230267,312 230269,60576 230270,8373 230271,215874 230272,273 230273,640 230274,640 230275,640 230276,60576 230277,640 230278,640 230279,147 230280,640 230281,179170 230282,79 230284,60576 230285,117 230285,994 230285,1116 230285,2712 230286,179170 230288,179170 230290,179170 230291,60576 230292,557 230293,1368 230294,79 230296,972 230297,422 230298,56 230299,106 230300,420 230301,35486 230302,366 230302,3804 230303,187 230304,11 230305,148742 230307,192 230308,538 230308,934 230309,200 230310,1425 230311,179170 230312,179170 230313,230314 230315,171 230316,852 230317,1803 230318,179170 230319,179170 230320,240 230321,1359 230322,137 230323,179170 230324,179170 230325,127158 230326,179170 230327,309 230327,310 230327,818 230328,195 230329,68 230330,676 230331,1707 230332,3804 230334,68 230335,1359 230336,146 230336,92476 230337,647 230338,994 230339,344 230340,452 230341,151 230342,1655 230343,200 230345,179170 230346,406 230347,1326 230348,920 230349,333 230350,497 230351,162599 230352,141912 230353,652 230354,1265 230354,1266 230355,1052 230356,500 230357,1962 230358,54 230359,2775 230360,41 230361,31073 230362,875 230363,447 230364,2775 230365,144962 230366,66297 230367,516 230368,1274 230369,56 230370,422 230371,287 230372,932 230373,179170 230374,3094 230375,79 230376,9015 230377,79 230379,1119 230379,6695 230380,102560 230381,640 230382,3582 230383,1556 230385,72 230386,240 230388,1238 230390,1132 230391,781 230392,1452 230393,1644 230395,217 230397,781 230398,1132 230399,1805 230399,2699 230399,32475 230400,143287 230401,1 230402,79 230403,1400 230404,56 230405,422 230406,489 230407,138686 230408,175 230409,417 230409,24926 230410,647 230411,1220 230412,189303 230413,83 230414,372 230415,30 230415,200 230418,179170 230419,9457 230420,3623 230423,577 230423,647 230424,188791 230429,179170 230430,179170 230431,422 230432,56 230433,1220 230434,302 230435,668 230436,120 230437,230438 230439,10 230440,462 230441,50 230442,81 230444,462 230445,462 230446,462 230447,462 230448,462 230449,1400 230450,30 230451,35486 230452,2353 230453,16687 230454,178 230454,439 230456,111 230456,289 230456,1368 230456,2286 230456,94134 230457,2750 230459,3218 230460,2620 230461,536 230463,1052 230464,1962 230465,500 230466,54 230467,2775 230468,83 230469,775 230470,83 230472,328 230473,312 230474,622 230475,685 230476,179170 230478,852 230479,852 230481,3623 230482,447 230483,2775 230484,41 230485,1608 230486,1132 230487,138686 230488,694 230489,217 230489,4637 230490,302 230491,852 230492,3623 230493,875 230494,861 230497,1070 230498,1282 230499,179170 230500,1282 230501,862 230502,338 230503,252 230504,586 230505,467 230505,872 230506,809 230507,2168 230508,668 230511,230509 230511,230517 230521,56 230522,147 230523,1167 230523,1436 230523,2083 230524,338 230525,7360 230526,973 230526,1284 230526,1381 230526,1419 230527,206 230528,50 230529,1511 230529,3069 230530,671 230531,240 230532,644 230533,264 230534,1860 230535,1858 230536,44 230538,861 230539,179170 230540,222 230542,515 230543,230544 230545,2379 230546,3999 230547,805 230548,1033 230549,289 230549,94134 230550,1509 230550,1551 230551,1220 230552,805 230553,1860 230554,1858 230555,1623 230556,349 230557,79 230558,563 230559,2979 230560,19010 230561,571 230562,1425 230562,102560 230563,138686 230564,202 230565,175 230566,179170 230567,202 230568,483 230569,79 230570,106 230570,149 230570,585 230571,99 230573,4260 230574,179170 230575,50 230576,516 230577,179170 230578,179170 230579,25348 230579,101688 230580,179170 230581,1556 230582,406 230583,338 230584,200 230586,264 230588,20 230588,1179 230589,147 230589,163 230589,305 230589,671 230589,911 230589,1132 230589,1201 230589,1623 230591,1238 230591,182162 230592,775 230592,852 230592,3804 230593,994 230594,179170 230595,151 230596,269 230597,1132 230598,781 230599,44725 230600,151 230601,1858 230602,1860 230603,179170 230605,1860 230606,1858 230607,389 230608,179170 230609,179170 230610,107 230611,151 230612,406 230613,251 230614,200 230615,264 230615,491 230615,515 230616,9010 230617,1235 230617,1335 230618,269 230619,1132 230620,781 230621,563 230622,302 230624,206 230624,1167 230624,1400 230624,2073 230624,2146 230624,3295 230624,22727 230624,99287 230625,861 230626,3367 230627,141912 230628,1434 230629,485 230631,220816 230632,3 230633,1132 230634,781 230636,269 230638,302 230639,344 230640,179170 230641,56 230642,200 230643,1132 230644,781 230645,4594 230646,255 230647,179170 230648,302 230649,179170 230650,781 230651,1132 230652,179170 230653,1132 230654,781 230655,450 230656,781 230657,1132 230658,240 230658,289 230658,301 230658,714 230658,1511 230658,2205 230658,2286 230658,2620 230658,3069 230658,20359 230658,33424 230658,94134 230659,72 230660,1326 230661,408 230662,102 230663,1323 230664,8788 230665,68069 230666,220816 230667,536 230668,13 230669,7194 230670,557 230671,2867 230671,2868 230672,563 230673,934 230674,1381 230675,250 230675,1684 230677,323 230678,179170 230680,885 230680,13704 230682,179170 230683,41 230685,179170 230687,640 230688,230689 230690,657 230690,968 230691,230692 230693,795 230694,233 230695,151 230698,1220 230699,516 230700,252 230701,2373 230702,179170 230703,1474 230704,435 230705,220816 230706,99 230707,7092 230708,673 230709,220816 230710,179170 230711,1220 230712,252 230713,516 230714,30 230715,179170 230716,220816 230717,4771 230718,230719 230720,3623 230721,77 230722,557 230723,338 230724,264 230725,330 230726,843 230727,338 230728,862 230729,7416 230730,192 230730,1623 230731,500 230732,179170 230733,1612 230734,2205 230734,33424 230735,3804 230736,694 230737,141912 230738,1085 230739,220816 230740,278 230741,1188 230741,142870 230742,220816 230743,2116 230744,79 230745,406 230746,107 230747,2671 230748,13 230748,140 230748,1179 230749,55849 230750,230751 230750,253044 230752,1 230753,179170 230754,3297 230755,55849 230756,230757 230758,479 230758,1016 230759,99 230760,1359 230761,247 230762,1149 230763,134 230763,1235 230764,285 230765,435 230766,230767 230766,244933 230768,346 230769,841 230770,6424 230771,130 230771,835 230771,1007 230771,1381 230771,1452 230771,1509 230771,1551 230771,1639 230771,3041 230771,5440 230772,640 230773,179170 230774,220816 230775,843 230776,147 230777,1785 230778,1167 230779,605 230780,589 230781,1782 230782,1124 230783,973 230784,86 230785,949 230786,261 230787,138686 230788,175 230789,805 230790,510 230791,30 230792,107 230793,220816 230794,83 230795,34 230795,35 230796,640 230797,184 230798,220816 230799,841 230800,38634 230801,175 230802,991 230803,1368 230804,1188 230805,338 230806,294 230807,285 230808,1305 230809,1515 230810,577 230811,347 230812,304 230813,1722 230814,5265 230815,267 230816,247 230817,1 230818,435 230819,1511 230819,3069 230820,972 230821,220816 230822,843 230823,273 230823,422 230824,138 230825,220816 230826,58 230827,220816 230828,2590 230829,220816 230830,1220 230831,516 230832,252 230833,220816 230834,267 230835,195 230836,220816 230837,240 230838,7117 230839,220816 230840,269 230841,220816 230842,200 230843,137 230844,850 230845,795 230846,5101 230847,220816 230848,72 230849,3447 230850,422 230851,422 230852,422 230853,422 230854,422 230855,422 230856,422 230857,422 230858,422 230859,422 230860,422 230861,422 230862,220816 230863,2620 230864,195 230865,72 230866,366 230867,207 230868,366 230869,366 230870,366 230871,220816 230872,179170 230873,366 230874,72 230875,918 230876,72 230877,72 230877,206 230877,34580 230878,389 230879,2421 230880,72 230881,6323 230882,1 230883,179170 230884,338 230885,72 230886,179170 230887,72 230888,72 230889,72 230890,1 230891,72 230892,872 230893,1429 230894,137 230895,489 230896,1381 230897,2931 230898,455 230899,137 230900,668 230901,1033 230902,68 230902,7155 230903,996 230904,309 230904,310 230905,179170 230906,22 230907,497 230908,2224 230909,72 230910,179170 230911,2646 230913,1143 230914,206 230915,3447 230917,1087 230918,497 230920,230921 230922,195 230923,1247 230923,164572 230924,536 230924,1608 230924,2931 230926,1612 230927,781 230928,1132 230929,397 230930,781 230931,1132 230932,79 230933,55849 230935,149 230936,557 230937,171641 230938,781 230939,1132 230940,79 230941,179170 230942,6303 230943,115659 230944,179170 230945,3999 230946,18726 230947,179170 230949,3115 230951,781 230952,1132 230953,30 230954,1181 230955,200 230956,366 230957,83 230958,35486 230959,179170 230960,2668 230961,200 230962,577 230963,138686 230964,175 230965,255 230967,195 230968,671 230969,781 230970,1132 230971,781 230972,1132 230973,230974 230975,4823 230976,1559 230977,269 230978,1849 230979,179170 230980,1181 230981,781 230982,1132 230983,920 230984,346 230986,1 230987,230988 230989,179170 230990,179170 230991,435 230992,179170 230993,179170 230994,2224 230995,19010 230996,3623 230997,536 230999,1132 231000,781 231001,1294 231002,147191 231003,50 231003,63 231003,147 231003,158 231003,178 231003,192 231003,195 231003,269 231003,272 231003,393 231003,406 231003,435 231003,516 231003,586 231003,620 231003,779 231003,980 231003,1175 231003,1247 231003,1294 231003,1388 231003,1531 231003,1541 231003,1821 231003,3989 231003,4192 231003,4193 231003,4455 231003,4545 231003,6119 231003,8907 231003,21736 231003,56150 231003,164572 231004,3135 231006,292 231007,442 231009,4193 231010,179170 231011,292 231012,179170 231013,3094 231014,178 231014,186 231014,192 231014,366 231014,500 231014,510 231014,1118 231014,1181 231014,2480 231014,3370 231015,58 231016,1274 231017,932 231018,3623 231020,312 231021,200 231022,138686 231023,175 231024,577 231024,693 231024,726 231024,859 231024,1070 231024,1105 231025,1132 231026,254 231026,503 231026,704 231027,292 231028,649 231028,1132 231029,862 231031,1238 231032,949 231033,225 231033,1368 231033,5591 231033,6059 231034,200 231034,248 231035,72 231036,3447 231038,647 231039,344 231040,146 231040,92476 231041,1452 231042,2671 231043,743 231044,666 231044,58135 231044,219372 231045,264 231046,447 231047,2775 231048,920 231049,77 231050,1118 231051,217 231052,79 231052,337 231054,563 231055,179170 231056,447 231057,2775 231059,111 231060,2105 231061,3182 231062,217 231063,577 231063,788 231064,151 231065,179170 231066,138686 231067,175 231068,227061 231069,996 231070,615 231070,1300 231070,1454 231070,3207 231072,1119 231072,1775 231072,4222 231072,178576 231072,185877 231074,809 231075,30 231076,473 231077,333 231078,781 231079,1132 231080,7117 231081,447 231082,2775 231083,79 231084,2979 231085,592 231086,179170 231087,1849 231088,1132 231089,1608 231090,120 231091,473 231092,3695 231093,3695 231094,809 231094,19010 231095,272 231096,491 231097,333 231097,1181 231098,160 231099,30 231099,99807 231099,198024 231100,292 231101,292 231102,1893 231103,3769 231106,1893 231107,202 231108,1707 231109,179170 231110,179170 231112,19010 231113,589 231114,2209 231115,258 231116,19010 231117,179170 231118,491 231119,1893 231120,7698 231121,1266 231121,5714 231122,179170 231123,54 231124,301 231124,968 231124,1782 231126,8270 231127,1707 231129,592 231130,209 231130,302 231132,4455 231132,187176 231133,1181 231134,55849 231135,592 231136,592 231137,55849 231138,1274 231138,7698 231139,775 231140,592 231141,592 231142,312 231143,292 231144,366 231146,932 231147,3623 231148,592 231149,261 231149,694 231149,697 231149,1419 231149,1769 231150,179170 231151,56 231152,422 231153,473 231154,179170 231155,3804 231156,918 231157,119 231157,364 231157,372 231157,417 231157,455 231157,626 231157,805 231157,972 231157,1019 231157,1465 231157,1801 231157,2266 231157,2434 231157,2590 231157,4172 231158,179170 231159,433 231160,44 231161,138686 231162,515 231163,175 231164,264 231165,622 231166,179170 231167,455 231168,206 231169,2421 231170,179170 231171,760 231172,32751 231173,255 231174,179170 231175,1085 231175,3623 231176,557 231177,30 231178,1085 231180,30 231181,592 231182,1608 231183,1132 231184,447 231185,140 231186,2775 231187,179170 231188,179170 231189,6119 231190,162599 231191,1749 231192,30 231192,328 231192,1179 231193,179170 231194,264 231195,1119 231197,422 231198,1160 231199,231200 231201,231200 231202,231200 231203,918 231204,179170 231205,179170 231206,151 231207,151 231208,422 231209,56 231210,2173 231212,1274 231213,34 231214,2083 231215,179170 231216,217 231217,179170 231218,1749 231220,179170 231221,3724 231222,932 231223,179170 231224,3623 231225,366 231226,743 231227,179170 231228,231213 231229,188791 231230,55849 231231,1452 231232,7652 231233,192 231233,269 231234,30 231235,1860 231236,1858 231237,1298 231238,1927 231239,264 231239,2083 231239,5440 231240,3148 231241,1 231242,1805 231243,4571 231244,30 231245,138 231246,865 231247,557 231248,137 231249,88820 231250,50 231250,79 231250,147 231250,158 231250,333 231250,336 231250,406 231250,620 231250,779 231250,1163 231250,1181 231250,1425 231250,1515 231250,4193 231250,5726 231250,8055 231250,240174 231251,179170 231252,920 231253,179170 231254,231255 231256,818 231257,179170 231259,304 231260,83 231261,1474 231262,1122 231263,2590 231264,389 231265,1181 231266,1220 231267,516 231268,252 231269,34 231269,35 231270,1572 231271,3999 231272,313 231273,1551 231274,918 231275,231276 231277,231276 231278,1644 231279,200 231280,184 231281,83 231282,179170 231283,179170 231284,1181 231285,179170 231286,557 231287,1893 231288,83 231289,1274 231290,1132 231291,1608 231292,920 231293,1326 231294,102 231295,408 231296,1323 231297,111 231297,4771 231298,1 231299,1465 231300,7092 231301,8270 231302,151 231303,4192 231303,4193 231304,8270 231305,2373 231306,389 231307,1181 231308,2244 231309,120 231310,332 231311,30 231312,220816 231313,586 231313,1243 231315,220816 231316,179170 231317,596 231318,596 231319,87 231320,994 231321,994 231322,4597 231323,994 231324,278 231325,809 231326,231327 231328,146 231328,92476 231329,9026 231330,250 231330,1684 231331,285 231332,285 231333,250 231333,1684 231334,255 231335,179170 231336,1359 231337,30 231338,30 231339,1298 231340,86832 231341,2735 231342,106 231342,337 231343,179170 231344,220816 231345,640 231346,872 231347,1243 231348,949 231349,2048 231350,179170 231351,79 231352,179170 231353,147 231354,30 231355,255 231356,220816 231357,8270 231358,22 231359,202 231360,2590 231361,366 231362,217 231363,240 231364,34 231364,35 231364,222 231364,283 231364,389 231364,536 231364,657 231364,781 231364,1019 231364,1072 231364,1274 231364,1467 231364,1539 231364,1718 231364,1871 231364,1881 231364,2266 231364,2784 231364,4594 231364,5976 231364,6789 231364,6888 231364,13575 231364,29475 231365,34 231365,35 231365,455 231365,536 231365,1072 231366,422 231367,422 231368,422 231369,422 231370,422 231371,422 231372,422 231373,422 231374,422 231375,72 231376,77 231376,269 231377,151 231378,231379 231378,264983 231380,220816 231381,4691 231382,536 231382,1893 231382,20359 231383,220816 231384,1227 231384,86416 231385,231386 231387,483 231389,557 231390,592 231391,179170 231392,918 231393,225 231394,151 231395,726 231396,231397 231398,1085 231399,1368 231400,1544 231401,179170 231402,862 231403,72 231404,8884 231405,1634 231406,220816 231407,1085 231408,149 231409,8270 231410,179170 231411,1241 231412,302 231412,1836 231413,953 231414,640 231415,72 231416,366 231417,72 231418,366 231419,366 231420,366 231421,366 231422,366 231423,366 231424,366 231425,366 231426,366 231427,366 231428,859 231429,179170 231430,640 231431,179170 231432,1313 231433,663 231434,231435 231436,586 231436,1370 231436,2782 231436,127158 231437,491 231438,4597 231439,104 231441,179170 231442,35486 231443,491 231444,1010 231445,406 231446,450 231448,473 231449,640 231450,417 231450,592 231450,3260 231451,994 231452,1955 231452,3135 231452,3328 231453,72 231454,7572 231456,8788 231457,72 231458,8991 231459,485 231460,298 231461,2574 231462,1381 231463,83 231464,72 231465,1381 231466,151 231467,13136 231468,179170 231469,240 231469,298 231469,372 231469,694 231469,862 231469,932 231469,1001 231469,1010 231469,1085 231469,1309 231469,1326 231469,1462 231469,1522 231469,1564 231469,1635 231469,1837 231469,1955 231469,2296 231469,2512 231469,2620 231469,8537 231470,30 231472,79 231473,918 231474,349 231475,1402 231476,535 231477,179170 231478,15573 231479,2371 231480,1282 231482,231483 231484,285 231485,179170 231486,795 231487,4192 231487,4193 231489,225 231490,4611 231491,30 231492,1201 231493,932 231494,422 231495,56 231496,2506 231497,231498 231499,3193 231500,54 231501,500 231502,1052 231503,2775 231504,1962 231505,500 231506,2775 231507,1052 231508,54 231509,1962 231510,779 231511,1220 231512,516 231513,252 231514,805 231515,211 231515,4193 231516,255 231517,56 231518,422 231519,17309 231520,875 231521,9029 231522,254 231523,934 231524,1 231525,918 231526,269 231527,269 231528,3345 231529,875 231530,485 231531,298 231532,179170 231533,1359 231534,4597 231535,56 231536,422 231537,949 231538,21442 231539,179170 231540,4597 231541,920 231542,86 231543,485 231544,298 231545,1707 231546,781 231547,1132 231549,931 231550,994 231551,179170 231552,83 231553,994 231554,1479 231556,1132 231557,1608 231558,390 231559,179170 231560,179170 231561,86416 231562,994 231563,179170 231564,220816 231565,179170 231566,994 231567,220816 231568,179170 231569,179170 231570,220816 231572,220816 231573,994 231574,220816 231575,220816 231576,220816 231577,994 231578,179170 231579,220816 231580,179170 231581,220816 231582,485 231583,298 231584,220816 231585,220816 231586,220816 231587,220816 231588,220816 231589,1381 231590,3804 231591,179170 231592,220816 231593,220816 231594,231595 231596,220816 231597,273 231598,220816 231599,220816 231600,56 231601,422 231602,220816 231603,1849 231604,220816 231605,179170 231606,231607 231608,220816 231609,220816 231610,8270 231611,195 231612,1773 231613,535 231614,326 231615,179170 231616,483 231617,179170 231618,366 231619,366 231620,366 231621,366 231622,366 231623,366 231624,231625 231626,1181 231627,179170 231628,275 231631,30 231632,179170 231633,1241 231634,113156 231635,115659 231636,83 231637,7416 231638,1227 231638,86416 231639,179170 231640,179170 231641,781 231642,179170 231643,179170 231644,179170 231645,1227 231645,86416 231646,2995 231647,179170 231648,1010 231649,107 231650,2416 231650,2417 231651,292 231652,338 231653,298 231654,1133 231655,3538 231656,206 231657,10 231658,505 231660,491 231661,179170 231663,147 231664,35486 231665,567 231665,1345 231665,3756 231666,231667 231668,298 231669,485 231671,310 231672,200 231673,328 231674,231675 231676,779 231677,1181 231678,146280 231678,159365 231679,592 231680,491 231681,1227 231681,86416 231682,231683 231684,1608 231685,23437 231686,355 231687,151 231688,1227 231688,86416 231689,1531 231690,994 231691,111 231692,4597 231693,332 231694,231695 231696,55849 231698,136072 231699,483 231700,1381 231701,1531 231701,3246 231702,516 231703,17772 231704,1381 231705,179170 231706,447 231707,491 231708,179170 231709,485 231710,1634 231711,328 231712,589 231713,932 231714,298 231714,534 231714,694 231714,2296 231714,3623 231714,3695 231714,7194 231715,167 231715,602 231715,1284 231715,1544 231715,2083 231715,2372 231715,5301 231715,6798 231715,7744 231715,13252 231715,124847 231715,146368 231715,184373 231715,221176 231715,248496 231715,251289 231715,258146 231715,258381 231715,258388 231715,264043 231716,179170 231717,994 231718,179170 231720,2296 231721,663 231722,231723 231724,255 231725,447 231726,2775 231727,420 231728,1955 231729,1707 231730,994 231731,918 231732,179170 231733,360 231734,55849 231736,179170 231737,179170 231738,3370 231738,14453 231739,1655 231740,1085 231740,2089 231740,2940 231740,178576 231741,2156 231741,4571 231742,994 231743,497 231746,79 231747,676 231748,151 231749,452 231750,179170 231751,875 231752,179170 231753,151 231755,138686 231756,175 231757,994 231758,4192 231758,4193 231759,479 231760,1181 231761,994 231762,1368 231763,162599 231764,21944 231765,4 231765,5 231765,59 231765,60 231765,114 231765,115 231765,116 231765,117 231765,250 231765,430 231765,885 231765,994 231765,1235 231765,1252 231765,1253 231765,1335 231765,1684 231765,2087 231765,2089 231765,2940 231765,3561 231765,3794 231765,9537 231765,9539 231765,13704 231765,54870 231766,179170 231767,30 231768,179170 231769,179170 231770,994 231771,179170 231772,179170 231773,1238 231774,15748 231775,179170 231776,3079 231778,22293 231779,30 231780,631 231781,179170 231782,3538 231783,179170 231784,179170 231785,647 231786,179170 231787,179170 231788,479 231788,682 231788,72439 231789,179170 231790,111 231790,323 231790,388 231790,623 231790,779 231790,949 231790,1072 231790,1240 231790,1465 231790,1927 231790,2045 231790,3135 231790,4549 231790,14126 231791,30 231792,30 231793,557 231794,557 231795,557 231796,30 231797,269 231798,30 231799,731 231800,99 231801,30 231802,349 231802,509 231803,1220 231804,211 231805,30 231806,30 231807,994 231808,2699 231809,30 231810,30 231811,1773 231812,30 231813,202 231813,180487 231815,1181 231816,30 231820,231821 231822,252 231823,285 231824,30 231825,3623 231826,179170 231827,862 231828,818 231830,231831 231830,233525 231832,934 231834,1773 231838,441 231838,1432 231839,179170 231840,289 231840,372 231840,417 231840,1085 231840,2812 231840,94134 231840,101935 231841,179170 231842,231843 231844,1882 231845,596 231847,4597 231848,99 231849,779 231850,138686 231851,175 231852,231853 231854,273 231855,918 231856,2617 231857,859 231858,1796 231859,422 231860,56 231861,65 231862,4220 231863,269 231864,577 231865,255 231866,179170 231867,30 231868,179170 231869,200 231870,589 231871,493 231872,557 231873,142870 231874,231875 231876,20813 231877,366 231878,366 231879,366 231880,366 231881,366 231882,366 231883,366 231884,366 231885,179170 231886,366 231887,366 231888,366 231889,366 231890,1294 231891,433 231892,255 231893,406 231893,779 231893,1247 231893,1515 231893,164572 231894,179170 231895,231896 231897,142473 231898,292 231899,8270 231900,1655 231901,294 231902,452 231903,296 231904,298 231905,676 231906,497 231908,1659 231909,644 231910,30 231911,240 231912,3447 231913,1227 231913,86416 231914,179170 231915,179170 231916,179170 231918,151 231919,907 231920,301 231921,179170 231922,3413 231923,1564 231924,137 231925,1414 231925,72439 231926,94 231926,536 231926,92476 231927,907 231927,1462 231928,364 231929,200 231930,1844 231931,433 231932,179170 231933,167 231934,79 231935,7358 231935,7363 231937,2460 231938,872 231940,206 231941,88820 231942,4805 231943,440 231944,640 231945,302 231946,640 231947,640 231948,640 231949,269 231950,135 231951,640 231952,640 231953,184 231954,332 231955,893 231956,885 231956,13704 231957,1860 231959,151 231960,422 231962,422 231963,422 231964,422 231965,422 231966,30 231967,422 231968,422 231969,422 231970,422 231971,422 231972,22 231973,422 231974,35486 231975,422 231976,1287 231977,63 231978,56 231978,106 231978,149 231978,192 231978,406 231978,422 231978,1181 231978,1425 231978,1515 231979,56 231980,422 231981,137 231982,83 231983,333 231984,1359 231985,4672 231986,920 231987,115659 231988,4672 231989,171641 231990,920 231991,200 231992,3999 231993,275 231994,818 231995,2205 231995,33424 231996,2205 231996,33424 231997,136 231998,115 232000,264 232001,187176 232002,5405 232003,994 232004,1379 232005,1860 232006,1238 232007,1511 232007,3069 232008,500 232009,1962 232010,1052 232011,54 232012,2775 232013,1452 232014,366 232015,1511 232015,3069 232017,292 232018,932 232019,179170 232020,117163 232021,668 232022,179170 232023,408 232024,818 232025,1151 232027,232028 232029,1 232030,671 232031,1282 232032,148742 232033,1860 232034,1858 232035,5405 232038,491 232039,217 232041,1203 232042,292 232044,392 232044,1019 232045,1860 232046,1858 232047,1381 232048,994 232049,30 232050,285 232050,516 232050,843 232050,1151 232050,3507 232051,838 232052,1359 232053,784 232053,1052 232054,215874 232055,818 232056,120 232057,187176 232058,83 232059,467 232060,640 232062,1082 232064,2620 232068,1082 232069,535 232070,1082 232074,41 232076,1082 232077,1085 232077,1871 232077,8788 232077,29253 232077,211889 232078,994 232079,1436 232080,843 232081,304 232082,1151 232083,392 232084,6638 232085,328 232086,179170 232087,211 232088,1860 232089,1858 232090,1274 232091,1858 232092,1860 232093,3258 232094,1181 232095,264 232095,149534 232096,447 232097,2775 232098,442 232098,1140 232099,1860 232100,1858 232101,232102 232103,1179 232105,328 232106,818 232107,1860 232108,1858 232109,255 232110,232111 232113,179170 232115,1849 232116,151 232117,994 232119,481 232120,500 232121,54 232122,1052 232123,2775 232124,1962 232125,211 232127,1381 232128,1893 232129,1860 232130,1858 232131,516 232132,328 232133,994 232134,1858 232135,1860 232136,392 232137,7416 232139,1282 232139,1882 232140,302 232141,30 232142,200 232143,301 232144,577 232145,15573 232146,1224 232147,1458 232149,195 232150,7698 232151,1608 232153,3161 232154,179170 232156,784 232156,1085 232156,28832 232156,75912 232156,103860 232156,232872 232157,267 232158,1381 232160,338 232161,835 232162,1370 232163,2590 232165,1849 232166,10 232167,379 232168,2286 232169,424 232170,151 232171,147 232172,1789 232173,207 232173,358 232173,366 232173,1052 232173,1252 232173,1253 232173,1319 232173,1571 232173,1634 232173,2424 232173,2620 232173,2868 232174,179170 232175,968 232176,184 232178,2421 232179,4260 232179,143287 232180,220816 232181,79 232182,422 232183,200 232184,1509 232185,366 232186,2421 232187,44 232188,326 232189,220816 232190,247 232191,5265 232192,147 232192,149 232192,158 232192,406 232192,1425 232192,102560 232193,272 232194,220816 232195,2373 232196,4192 232196,4193 232197,671 232198,918 232199,24505 232200,220816 232201,1082 232202,207 232202,264 232202,1381 232203,433 232204,240 232205,479 232206,1860 232207,1858 232208,433 232209,217 232209,1417 232210,406 232211,1608 232212,1132 232213,557 232214,605 232215,217 232215,1417 232216,7698 232217,346 232217,538 232217,1298 232221,875 232222,518 232222,1326 232223,28130 232224,138686 232225,175 232227,875 232228,4237 232228,182162 232231,232232 232233,515 232235,1284 232239,151 232239,192 232239,309 232239,310 232239,577 232239,1167 232239,1400 232240,30 232241,392 232242,1014 232243,1014 232244,1014 232245,2421 232246,232247 232248,918 232249,19010 232250,1949 232251,4597 232252,1118 232253,30 232254,918 232255,4223 232256,435 232257,56 232257,149 232257,406 232258,79 232259,1127 232260,252 232261,577 232262,1151 232263,2421 232264,83 232265,255 232266,733 232267,1010 232268,83 232268,119 232268,347 232268,364 232268,372 232268,389 232268,417 232268,455 232268,525 232268,626 232268,795 232268,805 232268,907 232268,972 232268,1019 232268,1085 232268,1274 232268,1363 232268,1465 232268,1467 232268,1718 232268,1801 232268,1881 232268,2266 232268,2286 232268,2434 232268,2553 232268,2590 232268,2646 232268,4172 232268,13575 232269,151 232270,4192 232270,4193 232271,433 232272,30 232273,187 232275,255 232276,1522 232277,1014 232278,220816 232279,1014 232280,30 232281,9010 232282,30 232283,261 232283,6506 232284,707 232285,301 232285,459 232285,862 232285,907 232285,968 232285,1010 232285,1544 232285,1837 232285,1955 232285,20359 232285,188791 232286,289 232286,94134 232288,439 232289,640 232290,10 232291,1227 232291,86416 232292,4597 232293,918 232294,55849 232295,30 232296,68 232297,557 232298,1769 232299,30 232300,134 232301,1860 232302,1858 232303,4192 232303,4193 232304,179170 232305,192 232305,217 232305,516 232305,1181 232306,3474 232307,1844 232308,557 232309,417 232310,1860 232311,1858 232312,30 232313,586 232314,278 232315,1085 232316,1556 232317,179170 232318,392 232319,179170 232320,30 232321,179170 232322,527 232322,743 232323,179170 232324,232325 232326,30 232327,179170 232328,30 232329,179170 232330,516 232331,158 232332,483 232333,179170 232334,35486 232335,250 232335,1684 232336,1132 232337,781 232338,8854 232339,113156 232340,14231 232341,3 232342,179170 232343,179170 232344,932 232345,6955 232346,358 232347,309 232347,310 232348,366 232349,30 232350,358 232351,151 232353,668 232354,358 232355,4504 232356,877 232357,179170 232358,1796 232359,273 232360,1860 232361,1858 232362,30 232363,30 232364,1893 232364,2626 232365,19010 232366,179170 232367,151 232368,7092 232369,1860 232370,4594 232371,1608 232372,1465 232373,1240 232374,151 232375,1220 232376,6323 232377,671 232378,24763 232379,994 232380,179170 232381,20359 232382,392 232384,1181 232385,5101 232386,994 232388,30 232389,179170 232390,60576 232391,179170 232392,278 232393,994 232394,994 232395,179170 232396,994 232397,99 232398,63 232399,179170 232400,1368 232401,113156 232402,278 232403,232404 232405,536 232406,83 232407,1860 232408,1858 232409,99 232410,179170 232411,602 232412,217 232413,120 232414,30 232415,107 232416,147 232417,138686 232418,175 232419,5310 232420,779 232421,779 232422,179170 232423,15 232424,525 232425,217 232426,1309 232427,179170 232428,4260 232429,1285 232430,151 232432,179170 232433,631 232434,158 232434,192 232435,779 232436,294 232437,1381 232438,179170 232440,1962 232441,220816 232442,179170 232443,179170 232444,137 232445,179170 232446,920 232447,179170 232448,179170 232449,232450 232451,450 232452,1390 232453,424 232454,179170 232455,179170 232456,809 232457,30 232458,179170 232459,30 232460,226420 232462,333 232463,220816 232464,179170 232465,920 232466,30 232467,1858 232468,1860 232469,179170 232470,220816 232471,217 232472,179170 232473,4192 232473,4193 232475,337 232475,439 232475,626 232475,1381 232475,2367 232476,1085 232477,30 232477,200 232477,772 232477,28203 232477,99807 232478,202 232479,1515 232480,1458 232481,1740 232482,220816 232483,1085 232484,323 232485,81 232486,479 232487,1227 232487,86416 232488,602 232489,247 232490,68 232491,240 232492,2266 232493,220816 232494,843 232495,179170 232496,179170 232497,179170 232498,220816 232499,2590 232500,393 232501,585 232502,179170 232503,240 232504,179170 232505,918 232506,1467 232507,206 232508,1001 232509,220816 232510,30 232511,491 232512,179170 232513,1655 232514,676 232515,452 232516,4355 232517,1458 232518,497 232519,179170 232520,1368 232521,179170 232522,450 232523,3999 232524,54 232525,171 232526,843 232527,158 232527,779 232527,4192 232527,4193 232528,3804 232529,220816 232530,862 232531,1571 232532,83 232532,217 232532,278 232532,536 232532,1467 232533,273 232534,179170 232535,220816 232536,138686 232537,175 232538,151 232539,302 232540,1227 232540,86416 232541,1551 232541,3999 232541,5440 232542,310 232543,36819 232544,179170 232545,491 232546,2424 232547,358 232548,491 232550,146 232550,92476 232551,289 232551,94134 232552,202 232553,301 232553,717 232553,1231 232553,1740 232554,50 232554,140 232554,147 232554,202 232554,622 232555,743 232556,15 232557,2750 232558,1968 232559,99 232560,232561 232562,3999 232563,8373 232564,1188 232566,483 232567,366 232568,366 232569,366 232570,366 232571,366 232573,366 232574,137 232575,366 232576,232577 232578,346 232580,694 232581,366 232582,366 232583,366 232584,366 232586,2353 232591,2353 232592,366 232593,232594 232595,999 232596,366 232597,366 232598,366 232599,366 232600,1634 232601,366 232602,366 232603,366 232604,366 232606,366 232610,422 232611,422 232612,422 232613,422 232614,422 232615,422 232616,422 232617,868 232618,422 232619,422 232620,422 232621,422 232623,55849 232624,640 232625,146 232625,92476 232626,3623 232627,7270 232628,30 232631,644 232632,83 232633,3193 232634,30 232635,232636 232637,30 232638,1608 232639,1132 232640,424 232642,232642 232643,124668 232644,1 232645,3 232646,15748 232647,1132 232648,1608 232649,163 232650,283 232650,1019 232651,35486 232653,147 232656,925 232656,1381 232657,439 232658,2416 232658,2417 232659,2421 232660,126 232661,1119 232662,206 232663,222 232663,779 232663,29380 232664,2353 232665,269 232666,301 232667,55849 232668,843 232669,142430 232669,142879 232670,920 232671,3207 232672,2048 232673,55849 232674,2353 232675,1564 232676,232677 232676,242093 232678,1531 232680,138686 232681,175 232682,171 232683,1192 232684,192 232685,743 232686,4597 232687,301 232687,518 232687,525 232687,589 232687,775 232687,795 232687,973 232687,1235 232687,1326 232687,1715 232687,4146 232688,1284 232689,1782 232690,171 232691,2668 232693,1274 232694,275 232695,805 232696,60576 232697,536 232699,838 232700,179170 232701,83 232701,292 232701,795 232701,3612 232701,3804 232701,255911 232702,994 232703,46 232704,58 232705,994 232706,994 232707,227061 232708,1707 232710,994 232711,30 232712,717 232713,779 232714,571 232716,217 232719,179170 232720,1381 232721,1955 232722,30 232723,489 232725,149 232726,58 232727,46 232728,994 232729,1368 232730,3585 232732,189794 232733,179170 232734,97 232735,1634 232736,76096 232737,4223 232737,13137 232738,392 232739,147 232739,158 232739,422 232739,1181 232740,217 232740,247 232740,1181 232741,202 232742,1359 232744,1332 232745,171641 232746,968 232747,1359 232748,200 232749,859 232750,640 232751,457 232752,3507 232753,299 232754,1436 232757,6661 232758,171 232759,30 232761,1707 232762,171 232763,1882 232764,346 232765,142426 232766,310 232767,720 232768,704 232768,1140 232769,55849 232770,171 232771,762 232771,877 232771,972 232771,124668 232771,171641 232771,187176 232771,227669 232773,302 232774,360 232775,640 232776,640 232777,640 232778,640 232779,640 232780,1070 232782,994 232783,1163 232784,179170 232785,134 232786,232787 232788,535 232789,640 232790,30 232791,81 232792,602 232793,30 232794,2353 232796,199199 232797,640 232798,994 232799,179170 232800,994 232801,179170 232802,3422 232803,248 232804,200 232805,58 232806,994 232807,46 232808,179170 232809,104 232810,328 232812,171641 232813,142870 232814,232815 232817,852 232818,1132 232819,58 232820,994 232821,46 232822,171641 232823,918 232824,200 232825,640 232826,192 232827,79 232828,187 232829,302 232830,535 232831,3148 232832,179170 232833,285 232834,146 232834,92476 232835,179170 232836,148885 232837,4597 232838,200 232839,1571 232840,1381 232843,994 232844,1571 232845,189788 232846,994 232847,1151 232848,994 232849,232850 232851,1805 232852,2421 232853,55849 232854,360 232855,60576 232856,1127 232857,192 232858,179170 232859,179170 232860,515 232861,232862 232863,749 232864,868 232865,79 232866,138686 232867,175 232868,1132 232869,1 232870,1188 232871,406 232873,55849 232874,360 232875,30 232875,200 232876,137 232877,179170 232878,3623 232879,3623 232880,195 232881,79 232882,1803 232883,694 232884,3623 232885,493 232886,269 232886,1179 232886,1313 232886,2372 232887,240 232888,232889 232890,232891 232892,1058 232893,240 232894,336 232895,2620 232896,592 232897,179170 232898,611 232899,1556 232901,1132 232904,3623 232905,2775 232906,447 232907,48 232908,3623 232909,1127 232911,220816 232912,192 232913,875 232914,1224 232915,179170 232916,56 232917,422 232918,220816 232920,179170 232922,220816 232923,248 232924,255 232925,994 232926,232927 232928,102560 232929,536 232930,189842 232931,140 232932,1608 232933,994 232934,151 232935,483 232936,220816 232937,56 232938,422 232939,818 232940,994 232941,202 232942,994 232943,179170 232944,232945 232946,220816 232947,179170 232949,932 232950,1332 232952,220816 232953,179170 232954,5405 232955,5591 232956,99 232957,872 232958,179170 232960,217 232961,784 232962,859 232963,1515 232964,111 232965,875 232966,809 232967,356 232968,220816 232969,301 232969,1782 232970,1181 232971,1001 232972,179170 232973,160 232974,918 232975,272 232976,220816 232977,994 232978,37414 232979,220816 232980,179170 232981,171 232982,179170 232983,1564 232984,3695 232985,389 232986,1298 232987,1359 232988,220816 232989,1001 232990,859 232991,3148 232992,220816 232993,220816 232994,30 232995,149 232996,222 232996,455 232997,179170 232998,220816 232999,135 232999,137 233000,54 233001,233002 233003,200 233004,179170 233005,1319 233006,179170 233007,5440 233008,179170 233009,247 233009,2867 233009,2868 233010,510 233011,1085 233011,3623 233012,220816 233013,994 233014,30 233015,1359 233016,1608 233017,143287 233018,202 233019,1140 233020,15119 233021,179170 233022,79 233023,1235 233023,1335 233024,264 233025,1113 233026,202 233027,19443 233028,1118 233029,994 233030,298 233030,346 233030,563 233030,615 233030,1243 233030,2367 233030,7429 233031,1773 233032,1893 233033,760 233034,994 233035,56 233036,422 233037,83 233038,179170 233039,861 233040,179170 233041,557 233042,27041 233043,1590 233044,994 233045,202 233046,994 233047,233048 233049,994 233050,302 233051,179170 233053,852 233054,861 233055,179170 233056,10 233057,179170 233058,994 233059,220816 233060,233061 233060,233478 233060,239659 233060,242081 233060,242983 233060,243018 233060,253197 233060,253469 233060,258808 233062,83 233063,83 233064,2373 233065,30 233066,673 233067,233068 233069,179170 233070,873 233071,1133 233072,536 233074,10 233075,8270 233076,8270 233077,136 233078,215 233079,874 233080,1001 233081,179170 233082,3623 233083,875 233084,220816 233085,179170 233086,994 233087,179170 233088,179170 233089,7092 233090,702 233091,843 233092,4597 233093,278 233094,920 233096,151 233097,3582 233098,79 233099,1474 233100,83 233101,217 233101,1417 233102,994 233103,2923 233104,994 233105,5961 233106,179170 233107,179170 233108,259 233109,179170 233110,154408 233111,179170 233112,179170 233113,179170 233114,179170 233115,179170 233116,56 233117,422 233118,56 233119,422 233120,179170 233121,179170 233122,2048 233123,752 233124,220816 233125,179170 233126,805 233127,278 233128,4453 233129,503 233130,179170 233131,1132 233132,1608 233133,697 233133,1769 233134,663 233135,79 233136,489 233137,994 233138,179170 233139,994 233140,707 233141,2116 233142,1858 233143,536 233144,1238 233145,1181 233146,366 233147,1452 233148,622 233149,1096 233150,217 233151,516 233152,366 233153,3623 233154,192 233154,663 233155,805 233156,147 233157,1432 233157,14434 233158,640 233159,1370 233159,2782 233160,1608 233161,1132 233162,154408 233163,30 233164,56 233165,1363 233166,179170 233167,640 233168,233169 233170,171 233171,179170 233172,207837 233173,1860 233174,1858 233175,50 233176,30 233177,2244 233178,577 233179,666 233180,220816 233181,3447 233182,220816 233183,48 233184,298 233184,2411 233185,267 233186,850 233187,138686 233188,175 233189,390 233190,99 233191,248 233192,248 233194,138686 233195,175 233196,424 233197,1531 233198,99 233199,1167 233200,1785 233201,589 233202,605 233203,1782 233204,1124 233205,973 233206,86 233208,77 233209,233210 233211,233212 233211,240645 233211,253820 233213,233214 233215,640 233216,154408 233217,77 233219,676 233220,1655 233221,452 233222,497 233223,269 233224,2590 233225,1326 233226,3161 233227,179170 233228,388 233229,54 233230,779 233231,640 233232,2424 233233,179170 233234,158 233235,779 233236,447 233237,2775 233238,207 233239,179170 233240,3161 233241,1634 233242,772 233242,1332 233244,640 233245,516 233246,872 233247,640 233248,1429 233249,233250 233251,2574 233252,356 233253,54 233254,850 233256,4101 233257,668 233258,328 233259,151 233260,13980 233261,10 233262,861 233263,99 233264,1 233265,269 233266,1181 233267,233268 233269,289 233269,94134 233270,179170 233271,1326 233271,14797 233272,179170 233273,30 233273,233 233273,255750 233274,179170 233275,255 233276,366 233277,366 233278,366 233279,366 233280,366 233281,366 233282,366 233283,366 233284,366 233285,366 233286,366 233287,366 233288,179170 233289,366 233290,358 233291,366 233292,366 233293,255 233294,77 233295,2421 233296,2421 233297,233298 233299,233300 233301,7124 233302,859 233303,1143 233304,406 233305,200 233306,179170 233308,818 233309,30 233310,360 233310,1127 233312,261 233313,171 233314,1860 233315,1858 233316,79 233317,875 233318,1860 233319,1858 233320,179170 233321,1860 233322,1858 233323,784 233324,589 233325,918 233326,918 233327,1551 233329,877 233329,145502 233330,56 233331,422 233332,424 233333,4691 233334,151 233334,1298 233337,1531 233338,1085 233339,694 233340,233341 233342,151 233344,2244 233345,2367 233346,622 233348,422 233349,422 233350,422 233351,422 233352,422 233353,422 233354,422 233355,422 233356,422 233357,1860 233358,1858 233359,422 233360,422 233361,422 233362,422 233363,422 233364,640 233365,640 233366,640 233367,640 233368,248 233369,640 233370,640 233371,3555 233372,35486 233373,1860 233374,1858 233375,79 233376,254 233379,158 233381,310 233381,6556 233382,301 233383,3623 233384,83 233385,301 233387,1238 233388,393 233389,920 233390,1452 233391,346 233392,439 233393,138686 233394,175 233395,179170 233396,137 233397,217 233397,406 233397,599 233399,10 233400,868 233401,179170 233402,467 233403,179170 233404,1479 233404,2205 233404,2296 233404,33424 233405,151 233406,46 233407,58 233408,994 233409,200 233410,63 233411,261 233412,6303 233413,932 233414,200 233415,179170 233416,217 233417,1274 233418,805 233419,127158 233420,179170 233421,934 233422,1715 233423,1345 233424,4771 233425,835 233426,3094 233427,3003 233428,707 233429,118336 233431,1572 233433,200 233434,500 233435,1962 233436,1052 233437,54 233438,2775 233439,138686 233440,175 233441,360 233441,2617 233442,388 233443,258 233444,2868 233444,3111 233445,4637 233446,118336 233447,115 233448,3297 233449,30 233450,83 233451,4771 233453,148742 233454,58 233455,994 233456,46 233459,1287 233460,483 233464,636 233465,1192 233466,422 233467,285 233468,717 233468,1782 233469,1388 233471,1085 233472,1284 233472,148742 233473,1368 233474,189842 233475,408 233476,158 233477,1210 233479,1284 233481,1231 233482,920 233484,138 233485,192 233485,406 233485,4192 233486,4193 233487,83 233488,1860 233489,1858 233490,6789 233492,202 233494,360 233495,1359 233496,1220 233497,390 233498,32751 233499,535 233500,805 233501,31073 233502,207 233503,83 233503,611 233504,192 233505,2146 233506,467 233508,5718 233509,58 233510,994 233511,1882 233512,46 233513,2590 233514,217 233515,10 233516,843 233517,907 233518,1326 233519,233520 233521,489 233522,302 233523,269 233524,657 233526,1860 233527,1858 233528,861 233529,10 233530,843 233531,28203 233533,843 233534,1465 233535,1132 233536,781 233537,99 233538,3467 233539,985 233540,581 233541,843 233542,79 233543,868 233544,10 233544,50 233544,192 233544,406 233544,779 233544,1181 233544,1572 233545,147 233546,783 233547,272 233548,2674 233549,1132 233550,179170 233551,1968 233552,500 233553,1052 233554,54 233555,2775 233556,1962 233557,1132 233558,392 233559,14989 233560,3623 233561,980 233561,4545 233561,56150 233563,827 233563,2353 233564,6303 233565,1082 233566,422 233567,56 233568,918 233569,179170 233570,158 233570,192 233571,500 233572,2775 233573,1962 233574,1052 233575,54 233576,992 233577,640 233578,875 233579,1012 233580,272 233580,285 233581,138686 233582,175 233583,148742 233584,1181 233585,58 233586,994 233587,46 233588,515 233589,233590 233592,292 233593,918 233594,360 233595,55849 233596,861 233597,4 233597,5 233598,30331 233599,5961 233600,179170 233601,1556 233602,301 233604,79 233605,1414 233606,841 233607,707 233608,393 233610,179170 233611,805 233612,255 233613,1467 233614,1298 233615,557 233616,189839 233617,255 233619,843 233620,151 233622,509 233623,868 233624,202 233625,31977 233626,97 233626,163 233626,406 233626,435 233626,516 233626,622 233627,406 233628,623 233629,5310 233631,536 233632,240 233633,142473 233634,557 233635,292 233636,179170 233637,171069 233638,3555 233639,1368 233640,302 233641,918 233642,861 233643,83 233644,156379 233645,118336 233646,1707 233647,4237 233647,182162 233648,233649 233651,118336 233652,179170 233653,3209 233654,818 233655,179170 233656,3209 233657,179170 233658,179170 233659,1452 233660,707 233661,1749 233662,179170 233663,779 233664,1133 233666,707 233667,179170 233668,707 233669,179170 233670,301 233671,179170 233672,179170 233673,1531 233674,264 233675,35486 233676,179170 233677,4101 233678,179170 233679,640 233680,516 233681,931 233682,536 233683,30 233684,1363 233685,310 233685,6556 233686,179170 233687,707 233688,5405 233689,328 233690,697 233692,2191 233693,179170 233694,15807 233695,1893 233695,117163 233696,304 233697,179170 233698,707 233699,6303 233700,120 233702,142870 233703,1368 233704,557 233705,179170 233706,8270 233707,795 233708,179170 233710,179170 233711,179170 233712,41 233712,68 233712,240 233712,294 233712,631 233712,784 233712,805 233712,1119 233712,1285 233712,2995 233712,3135 233713,151 233714,615 233715,9025 233716,1796 233717,7124 233718,13136 233718,191355 233719,707 233720,102 233721,1326 233722,1323 233723,408 233724,233725 233727,179170 233728,707 233729,79 233730,99 233731,707 233732,493 233733,2205 233733,33424 233734,72 233735,151 233736,187 233737,707 233738,9195 233739,83 233741,179170 233742,1181 233743,1309 233744,626 233745,7092 233746,920 233747,200 233748,483 233749,336 233750,147 233751,366 233752,79 233753,192 233753,1623 233754,366 233755,874 233756,220816 233757,1474 233758,179170 233759,818 233760,673 233761,509 233762,707 233763,1309 233764,1359 233765,200 233766,406 233767,255 233768,5906 233769,557 233770,626 233771,278 233772,137 233773,862 233774,388 233775,220816 233776,220816 233777,179170 233778,233779 233780,179170 233781,200 233782,255 233783,151 233784,220816 233785,247 233786,920 233787,278 233788,151 233789,220816 233790,1983 233791,707 233792,1402 233792,232709 233793,99 233794,99 233795,220816 233796,158 233797,2421 233798,595 233799,707 233801,1707 233802,220816 233803,179170 233804,1962 233805,417 233806,72 233807,34580 233808,104 233809,557 233811,179170 233812,30 233813,289 233813,94134 233814,980 233815,233816 233817,179170 233818,179170 233819,447 233820,2775 233821,179170 233823,179170 233824,147 233825,273 233826,1363 233827,179170 233828,179170 233829,55849 233830,581 233831,577 233832,2116 233833,179170 233834,626 233835,298 233835,534 233835,694 233835,3623 233835,3695 233835,7194 233836,1449 233838,179170 233839,328 233840,233841 233842,10 233843,179170 233844,287 233844,1607 233845,83 233846,30 233847,1085 233847,178576 233848,1285 233849,30 233850,179170 233851,233852 233853,179170 233854,30 233855,779 233857,179170 233858,138686 233859,175 233860,994 233861,220816 233863,220816 233864,149 233865,220816 233866,138686 233867,175 233868,2156 233869,1284 233870,179170 233871,179170 233872,220816 233873,142870 233875,220816 233877,920 233878,4 233878,5 233878,59 233878,60 233878,114 233878,115 233878,116 233878,117 233878,250 233878,430 233878,885 233878,1235 233878,1252 233878,1253 233878,1335 233878,1684 233878,2087 233878,2089 233878,2940 233878,3794 233878,9537 233878,9539 233878,13704 233878,54870 233879,1745 233880,795 233881,146 233881,92476 233882,179170 233883,220816 233884,179170 233885,220816 233886,179170 233888,179170 233889,220816 233890,179170 233891,220816 233892,179170 233893,1133 233894,818 233895,589 233896,433 233897,918 233897,7363 233898,333 233899,372 233900,7124 233901,220816 233902,179170 233903,179170 233904,179170 233905,179170 233906,920 233907,200 233908,220816 233909,179170 233910,2590 233911,220816 233912,179170 233913,220816 233914,179170 233915,179170 233916,200 233917,577 233918,1634 233919,220816 233920,272 233921,2617 233922,220816 233923,233924 233925,220816 233926,17772 233927,207 233928,220816 233929,200 233930,179170 233931,872 233932,1429 233933,586 233934,41 233935,207 233936,1179 233937,3370 233937,14453 233938,1313 233939,657 233940,179170 233941,99 233942,1181 233943,99 233944,54 233945,44 233946,68 233947,149 233948,10 233949,668 233950,179170 233951,5265 233952,32 233952,63 233952,158 233952,251 233952,439 233952,447 233952,493 233952,925 233952,934 233952,1068 233952,1220 233952,1294 233952,1512 233952,1531 233952,1877 233952,1985 233952,3148 233952,5212 233952,5992 233953,15748 233954,779 233955,179170 233956,73570 233957,175 233958,104 233959,972 233960,252 233961,255 233962,644 233963,10 233965,175 233966,99 233967,30 233968,233969 233970,4101 233971,1677 233972,3653 233973,1143 233974,179170 233975,707 233976,707 233977,493 233978,1962 233979,117163 233982,1962 233983,1474 233984,1368 233985,1116 233986,491 233987,1052 233988,500 233989,54 233990,2775 233991,138686 233992,1962 233993,175 233995,309 233995,310 233995,1326 233996,5213 233997,1639 234000,994 234002,1368 234003,15807 234004,596 234005,2045 234006,10 234006,8270 234007,805 234008,234009 234010,1417 234011,6424 234012,422 234013,422 234014,422 234015,422 234016,422 234017,422 234018,422 234019,234020 234021,287 234022,2674 234022,3258 234023,234024 234025,422 234026,10 234026,222 234026,420 234026,577 234026,628 234026,2574 234027,234028 234029,422 234031,422 234032,422 234033,850 234034,273 234035,422 234036,1962 234037,1962 234038,234039 234040,3804 234041,872 234042,707 234043,640 234045,3085 234046,118336 234047,640 234048,640 234049,640 234050,640 234051,1860 234052,1858 234053,1707 234054,117163 234055,148742 234056,640 234057,35486 234058,179170 234059,234060 234061,1133 234061,164572 234062,1381 234063,1235 234063,2048 234064,162599 234065,115659 234066,6059 234067,1368 234068,467 234069,15573 234070,7652 234070,72439 234071,805 234072,240 234076,491 234078,13661 234079,682 234079,72439 234080,861 234081,868 234083,920 234086,326 234088,148742 234089,179170 234090,269 234091,4549 234092,1238 234093,693 234094,179170 234095,994 234096,1452 234097,251 234098,809 234100,663 234101,994 234103,920 234104,65 234105,9010 234107,920 234108,809 234109,240 234109,1285 234110,272 234110,1531 234111,179170 234112,932 234113,1837 234114,1359 234115,79 234116,838 234117,994 234118,234119 234120,179170 234121,7124 234122,8907 234123,142870 234124,234125 234126,994 234127,862 234128,994 234129,138686 234130,491 234131,175 234132,694 234133,868 234134,83 234135,1096 234136,269 234137,459 234138,147 234139,644 234139,973 234140,148742 234142,30 234143,720 234144,1858 234145,1860 234147,1241 234149,682 234149,2045 234149,72439 234150,119 234150,192 234150,309 234150,310 234150,577 234151,30 234152,9457 234153,138686 234154,175 234155,30 234156,30 234157,227669 234158,393 234159,19010 234160,287 234161,366 234162,366 234163,106 234163,1370 234163,6119 234164,366 234165,102560 234166,41 234167,140 234169,483 234170,278 234171,148742 234172,2315 234173,2315 234174,1113 234175,657 234176,493 234177,467 234177,1118 234178,1149 234179,1235 234179,6682 234180,3872 234181,589 234181,25348 234185,356 234189,217 234190,252 234192,941 234196,234197 234198,124668 234199,30 234202,4611 234204,1544 234205,179170 234206,2626 234207,1368 234208,743 234209,920 234210,179170 234211,179170 234212,227061 234213,535 234214,240 234215,234216 234217,20790 234218,200 234219,240 234219,631 234219,714 234219,760 234219,1818 234219,2416 234219,2417 234220,234221 234223,779 234224,192 234225,134 234226,217 234227,148742 234228,209 234229,264 234230,3623 234231,28107 234232,30 234233,285 234234,3623 234235,2292 234236,5326 234237,779 234238,22 234239,640 234240,2744 234241,795 234242,1531 234243,264 234243,1659 234244,1417 234245,1796 234246,9029 234247,1860 234248,1858 234249,7768 234250,234251 234252,1001 234253,234254 234255,107 234256,852 234258,179170 234259,1688 234259,1722 234260,702 234261,479 234262,3135 234263,918 234265,515 234267,148742 234268,918 234269,189794 234270,217 234271,220816 234272,30 234273,220816 234274,861 234275,252 234275,1385 234276,220816 234277,179170 234278,3585 234279,171641 234280,435 234281,137 234282,179170 234283,83 234284,278 234285,1556 234286,252 234287,788 234288,220816 234289,2923 234290,292 234291,1417 234292,220816 234293,179170 234294,843 234295,83 234296,209 234297,179170 234298,4101 234299,726 234300,704 234301,179170 234302,1102 234303,5250 234304,158 234305,158 234305,192 234306,932 234307,179170 234308,2168 234309,151 234310,179170 234311,179170 234313,360 234314,55849 234315,862 234316,4597 234317,1544 234318,179170 234319,179170 234320,302 234320,2116 234321,2353 234322,83 234323,255 234324,994 234325,179170 234326,483 234327,184 234328,179170 234329,79 234330,500 234331,1052 234332,2775 234333,1962 234334,54 234335,8270 234336,179170 234337,918 234338,2512 234339,30 234340,179170 234341,71 234341,1821 234341,21736 234342,179170 234343,148742 234344,179170 234345,179170 234346,818 234347,255 234348,1860 234349,1858 234350,30 234351,149 234352,234353 234354,54 234354,2424 234355,1912 234356,30 234358,920 234359,1235 234359,1335 234360,179170 234361,536 234362,1132 234363,781 234364,179170 234365,30 234366,158 234366,493 234366,586 234366,779 234366,8907 234367,189788 234368,302 234369,406 234370,1782 234371,781 234372,1132 234373,147 234373,671 234374,920 234375,312 234376,1782 234377,192 234377,485 234377,1509 234377,1659 234377,1688 234377,2701 234377,3370 234377,14453 234378,1326 234379,1323 234380,102 234381,408 234382,118336 234383,3724 234384,557 234385,220816 234386,267 234387,1882 234388,2296 234389,71 234390,179170 234391,234392 234393,920 234394,77 234395,220816 234396,247 234397,406 234398,142870 234399,135 234400,141912 234401,124668 234402,2626 234403,220816 234404,4594 234405,861 234406,302 234407,200 234408,417 234409,206 234410,2557 234411,72 234412,58 234413,805 234414,304 234415,5265 234416,949 234417,1474 234418,673 234419,217 234420,179170 234421,7360 234422,779 234423,179170 234424,179170 234425,2367 234426,1531 234427,264 234428,50 234428,406 234429,1509 234430,8270 234431,447 234432,227669 234433,79 234434,179170 234435,179170 234436,491 234437,557 234438,862 234439,1634 234440,918 234441,138686 234442,175 234443,435 234444,179170 234446,278 234447,179170 234448,220816 234449,179170 234450,179170 234451,179170 234452,179170 234453,2590 234454,2373 234455,234456 234457,220816 234458,179170 234459,312 234460,179170 234461,589 234462,220816 234463,843 234464,859 234465,366 234466,217 234467,179170 234468,179170 234469,1160 234470,255 234471,195 234471,918 234471,33424 234471,164572 234472,7652 234473,589 234474,1414 234475,23783 234476,349 234477,1776 234478,179170 234479,179170 234480,62561 234481,535 234482,55849 234483,217 234484,2735 234485,872 234486,1181 234487,179170 234488,493 234489,312 234490,557 234491,179170 234492,994 234493,657 234494,179170 234495,171 234496,980 234497,179170 234498,6424 234499,147 234500,2116 234501,1235 234501,1335 234503,234504 234505,179170 234506,179170 234507,220816 234508,859 234509,200 234510,577 234511,99 234512,99 234513,255 234514,83 234515,467 234516,781 234517,1132 234518,422 234519,56 234520,220816 234521,207837 234522,35486 234523,142405 234525,207 234526,200 234527,167 234528,4597 234529,3367 234530,134 234531,1227 234531,86416 234532,30 234533,1014 234534,1014 234535,1014 234536,1014 234538,151 234538,663 234539,493 234539,1266 234540,179170 234541,805 234542,79 234543,1220 234544,516 234545,252 234546,1363 234547,4597 234549,516 234550,1220 234551,252 234552,4672 234553,255 234554,338 234555,1467 234556,217 234557,2590 234558,83 234559,1019 234560,4237 234560,182162 234561,536 234562,278 234563,250 234563,1684 234564,234565 234566,285 234567,240 234568,13 234568,79 234568,406 234568,588 234568,590 234568,779 234568,2244 234568,4355 234569,859 234570,179170 234571,234572 234573,179170 234574,406 234575,179170 234576,872 234577,1429 234578,269 234579,179170 234580,179170 234581,23701 234582,479 234583,179170 234584,1 234586,179170 234587,115659 234588,3161 234589,2590 234590,918 234591,149 234592,1052 234593,994 234594,207 234595,668 234596,3370 234596,182162 234597,1 234598,644 234599,171 234600,588 234600,590 234600,1419 234601,1821 234601,21736 234602,779 234603,179170 234604,267 234605,1363 234606,772 234607,179170 234608,151 234609,491 234610,146 234610,92476 234611,273 234612,179170 234613,491 234614,356 234615,179170 234616,693 234618,179170 234619,704 234620,3413 234621,366 234622,366 234623,366 234624,179170 234625,366 234626,366 234627,366 234628,366 234629,366 234630,366 234631,366 234632,30 234633,179170 234634,179170 234635,358 234636,852 234637,234638 234639,79 234640,2979 234641,1143 234642,1544 234643,2073 234644,267 234645,366 234646,626 234647,179170 234648,516 234649,366 234650,366 234651,366 234652,15748 234654,285 234656,422 234657,56 234658,3 234659,247 234660,2605 234661,234662 234663,138686 234664,175 234665,234666 234667,392 234668,234669 234670,447 234671,2775 234672,15573 234674,516 234675,668 234675,911 234676,4597 234677,75912 234678,1509 234679,872 234680,151 234681,1227 234681,86416 234682,79 234684,3 234684,44 234684,233 234685,360 234685,1893 234686,1167 234686,3207 234686,73570 234687,2812 234688,251 234689,189128 234690,949 234691,527 234692,4252 234693,118336 234693,240174 234694,189794 234694,223738 234696,640 234697,640 234698,640 234699,640 234700,220502 234701,640 234702,2671 234703,640 234704,640 234706,56 234707,422 234708,360 234709,55849 234710,5 234710,6621 234711,35486 234712,1227 234712,86416 234713,189842 234714,455 234715,422 234716,422 234717,422 234718,422 234719,422 234720,3623 234721,1119 234722,422 234723,422 234724,422 234725,422 234726,422 234727,483 234728,76096 234729,55849 234730,360 234731,4101 234732,149 234733,269 234734,1204 234735,178 234737,784 234738,2312 234739,920 234740,577 234740,852 234741,872 234742,861 234743,31073 234744,1133 234745,1285 234746,1707 234747,885 234747,13704 234749,312 234750,30 234751,148885 234752,577 234752,788 234753,138686 234755,175 234756,30 234757,158 234757,640 234757,861 234757,8811 234757,8822 234758,179170 234760,73570 234761,178 234762,932 234763,3555 234764,1359 234765,805 234766,1010 234767,422 234768,2867 234768,2868 234769,30 234770,467 234771,83 234772,77 234773,255 234774,1238 234775,811 234776,1590 234777,1572 234778,2931 234780,1181 234782,493 234783,1452 234784,79 234785,273 234786,81070 234787,217 234788,142870 234789,875 234791,718 234792,707 234793,707 234794,117163 234795,234796 234797,50 234798,4237 234798,182162 234799,79 234800,34 234800,35 234800,949 234800,13980 234801,392 234802,707 234803,148742 234804,148742 234805,255 234806,718 234807,148742 234808,255 234809,313 234811,358 234812,1749 234813,577 234814,179170 234816,195 234817,707 234818,1858 234818,148742 234819,483 234820,408 234821,875 234822,7092 234823,592 234824,704 234826,15573 234827,996 234828,258 234829,3999 234830,16687 234830,76096 234831,920 234833,682 234833,72439 234834,707 234835,215276 234836,707 234837,278 234838,455 234838,2424 234838,4252 234838,15609 234839,200 234840,818 234842,1745 234843,4691 234844,261 234844,694 234845,192 234845,336 234845,1623 234846,875 234847,843 234848,68 234849,1522 234850,535 234851,726 234852,1113 234853,1511 234853,3069 234854,422 234854,5405 234855,996 234856,22 234857,422 234858,56 234859,148742 234860,77 234861,743 234863,8270 234864,285 234865,344 234867,805 234868,636 234869,861 234870,41 234870,1016 234870,1212 234870,1572 234870,2775 234871,875 234872,273 234873,1634 234874,104 234874,195 234876,1359 234877,827 234878,1551 234879,55849 234880,707 234881,707 234882,1860 234883,1858 234885,79 234888,1644 234889,515 234890,649 234891,795 234892,2296 234893,30 234894,179170 234895,81 234895,809 234896,289 234896,94134 234897,338 234898,1608 234899,1132 234900,1566 234901,179170 234902,2979 234903,918 234904,1644 234905,30 234906,8180 234907,34 234907,35 234908,366 234909,1163 234911,485 234912,811 234913,389 234914,1274 234915,1 234916,503 234917,1782 234918,312 234919,217 234919,302 234920,1551 234921,179170 234922,192 234923,795 234924,798 234925,707 234926,920 234927,788 234928,577 234929,30 234930,2116 234931,1220 234932,255 234934,179170 234935,87 234935,1151 234936,344 234937,285 234938,932 234940,273 234942,217 234943,30 234944,918 234945,37 234945,1231 234945,1531 234946,151 234947,752 234948,577 234950,31073 234951,4810 234952,949 234953,1363 234954,2671 234955,1881 234956,4594 234957,7768 234958,220816 234959,178 234960,1294 234961,220816 234962,192 234962,333 234963,138686 234964,175 234965,217 234966,1001 234967,142433 234968,220816 234969,859 234970,220816 234971,718 234972,408 234974,1 234975,1381 234976,148742 234977,220816 234978,15573 234979,489 234980,99 234981,159365 234982,179170 234983,3209 234984,1235 234984,1335 234985,1118 234986,4101 234987,179170 234988,1247 234988,164572 234989,234990 234991,1572 234992,99 234993,1012 234994,302 234995,267 234996,148742 234997,179170 234998,356 234999,2048 235001,179170 235002,510 235002,1267 235003,1227 235003,86416 235004,179170 235005,217 235005,222 235005,455 235005,5343 235006,809 235007,7092 235008,1227 235008,86416 235009,227669 235010,760 235011,3295 235012,994 235013,590 235013,1419 235014,563 235015,179170 235016,179170 235017,557 235018,30 235019,278 235020,255 235022,1326 235023,102 235024,1323 235025,408 235026,179170 235027,138 235028,865 235029,557 235030,137 235031,88820 235032,220816 235033,557 235034,289 235034,94134 235035,235036 235037,875 235038,217 235038,222 235038,455 235038,5343 235039,99 235040,220816 235041,1634 235042,179170 235043,235044 235043,252884 235045,1143 235046,179170 235047,50 235048,30 235050,179170 235051,30418 235052,332 235053,1474 235054,673 235055,1511 235055,3069 235056,697 235058,5908 235059,142870 235060,2867 235060,2868 235061,235062 235063,235064 235065,179170 235066,1858 235067,220816 235068,179170 235069,1132 235070,781 235071,328 235072,20359 235073,220816 235074,4545 235074,56150 235075,697 235076,83 235076,536 235076,634 235076,2266 235077,147 235078,179170 235079,179170 235080,200 235081,1363 235082,179170 235083,179170 235084,2590 235085,99 235086,171 235087,117163 235088,138686 235089,175 235090,99 235091,179170 235092,3804 235093,285 235094,250 235094,1684 235095,285 235096,250 235096,1684 235097,309 235097,310 235098,58 235099,46 235100,994 235101,309 235101,310 235101,3161 235102,261 235102,6506 235103,220816 235104,1007 235105,113156 235106,1181 235107,1181 235108,3135 235109,2373 235110,704 235111,179170 235112,298 235113,273 235114,1 235114,22 235115,1821 235115,21736 235116,235117 235118,1309 235119,235120 235121,1465 235122,56 235123,422 235124,179170 235125,235126 235127,235128 235129,217 235129,536 235130,179170 235131,1181 235132,179170 235133,779 235134,483 235135,2146 235136,179170 235138,479 235139,577 235140,358 235141,2353 235142,35486 235143,225 235144,657 235145,2116 235146,235147 235146,262487 235148,235147 235148,262487 235148,264223 235149,447 235150,779 235151,15748 235152,994 235153,8884 235154,127158 235155,818 235156,447 235157,28072 235158,104 235159,8501 235160,795 235161,1085 235162,182162 235163,179170 235164,1181 235165,1181 235166,273 235167,1227 235167,86416 235168,3447 235169,1368 235170,235171 235172,235173 235174,179170 235175,1634 235176,149 235177,366 235178,366 235179,366 235180,366 235181,589 235182,366 235183,3 235184,4597 235185,366 235186,2017 235187,179170 235188,164572 235189,179170 235191,859 235192,222 235193,2590 235194,30 235195,255 235196,15573 235197,151 235198,1181 235200,704 235201,589 235202,65 235203,422 235204,56 235205,644 235207,17772 235208,56 235209,422 235210,20813 235211,207 235212,302 235213,137 235214,151 235215,35486 235216,235217 235218,805 235219,577 235220,1860 235221,392 235222,6955 235223,697 235224,3612 235225,595 235226,2274 235227,4760 235228,6059 235229,5658 235230,4252 235231,623 235232,235233 235234,3804 235235,1 235236,346 235237,994 235238,872 235239,1429 235240,149 235241,932 235242,5326 235243,1014 235244,1014 235245,1014 235246,1458 235247,1181 235249,1181 235250,235251 235252,973 235253,309 235253,310 235254,5714 235255,58 235256,18726 235257,72 235258,278 235259,200 235260,142870 235261,4101 235262,225 235263,148742 235264,83 235265,668 235266,15573 235267,422 235268,422 235269,422 235270,422 235271,422 235272,422 235274,73570 235275,714 235275,1119 235277,795 235278,2146 235279,137 235280,30 235281,235282 235283,235284 235285,589 235286,8270 235287,535 235288,1572 235289,1381 235290,1151 235291,1634 235293,1181 235295,72 235296,707 235297,918 235298,422 235299,56 235300,707 235301,1181 235302,1181 235303,346 235304,861 235306,8270 235307,285 235308,179170 235309,1564 235310,900 235311,44 235312,200 235313,235314 235315,235316 235317,779 235318,516 235319,1220 235320,252 235321,424 235322,1181 235323,333 235324,422 235325,56 235326,2292 235327,3804 235328,805 235329,1160 235330,83 235332,235333 235334,483 235335,255 235336,151 235337,235338 235339,1143 235340,63 235340,147 235340,251 235340,252 235340,493 235340,516 235340,1243 235340,1265 235340,1266 235340,1927 235340,17772 235341,138686 235342,175 235343,1634 235344,45022 235345,918 235346,15573 235347,179170 235348,1983 235349,179170 235350,726 235351,179170 235352,179170 235353,30 235355,235356 235357,4597 235358,111954 235358,235359 235358,248680 235358,250098 235358,250099 235358,250159 235358,256640 235358,261864 235358,262576 235358,262577 235358,262578 235361,1227 235361,86416 235362,2750 235363,222 235363,694 235363,1201 235363,1240 235364,393 235365,313 235367,2867 235367,2868 235368,2674 235369,240 235369,1085 235369,1580 235369,2812 235369,4222 235370,1677 235371,1227 235371,86416 235372,202 235373,158 235374,626 235376,220816 235377,179170 235378,973 235378,4504 235378,148742 235379,179170 235380,220816 235381,220816 235382,1479 235383,179170 235384,390 235385,179170 235386,220816 235387,179170 235388,142870 235389,1531 235390,1531 235391,2373 235392,1181 235393,184 235394,360 235395,795 235396,235397 235398,8270 235399,220816 235401,2146 235401,3297 235401,5375 235402,1893 235402,117163 235403,704 235404,147123 235405,147123 235406,68069 235407,235408 235409,220816 235410,355 235412,151 235413,1227 235413,86416 235414,8270 235415,485 235416,235417 235418,179170 235419,392 235419,697 235420,23783 235421,663 235422,346 235423,8270 235424,65 235425,269 235426,8270 235427,1634 235428,235429 235430,1511 235430,3069 235431,83 235432,1363 235433,859 235434,235435 235436,235437 235438,366 235439,267 235440,366 235441,269 235442,366 235443,366 235444,366 235445,275 235446,4597 235447,3447 235448,8270 235449,346 235450,589 235451,184 235452,179170 235453,310 235453,224488 235454,1181 235455,1181 235456,1181 235457,235458 235461,1181 235462,25344 235463,179170 235464,179170 235465,179170 235466,72 235467,850 235468,151 235469,1118 235470,17772 235471,479 235472,589 235473,235474 235475,137 235476,3804 235477,235478 235479,235480 235481,1188 235482,795 235483,585 235484,4597 235485,179170 235486,118336 235487,235488 235489,3413 235490,1454 235491,192 235492,1163 235493,8270 235495,235496 235495,262217 235497,235498 235499,269 235500,107 235501,2416 235501,2417 235502,292 235503,338 235504,179170 235505,298 235506,235507 235508,1133 235509,3538 235510,1368 235511,8270 235512,200 235513,273 235514,30 235515,1167 235516,1167 235518,1167 235519,206 235520,859 235521,85 235522,15573 235523,35486 235524,235525 235526,3260 235527,704 235528,1181 235529,235530 235531,142433 235532,622 235533,932 235534,994 235535,117163 235536,1043 235538,1983 235539,4223 235540,4237 235540,182162 235541,8270 235542,2048 235543,2931 235544,292 235544,535 235545,55849 235546,422 235547,56 235548,336 235549,1181 235550,346 235551,285 235552,1707 235553,56 235554,422 235555,1313 235556,273 235557,346 235559,1082 235560,217 235561,535 235562,56 235563,422 235564,346 235565,1163 235566,184 235567,422 235568,818 235569,818 235570,4101 235571,58 235572,1033 235573,1474 235574,1227 235574,86416 235575,1769 235576,160 235577,273 235578,346 235579,142405 235580,1370 235581,255 235582,179170 235583,137 235584,1707 235586,1177 235587,206 235588,56 235589,422 235590,8270 235591,56 235592,422 235593,151 235594,972 235595,44 235596,366 235597,932 235598,179170 235599,310 235599,224488 235600,235601 235602,918 235603,5265 235604,7652 235605,1688 235606,779 235607,179170 235608,3447 235609,10 235610,138686 235611,175 235612,227669 235613,577 235614,467 235615,56 235616,422 235617,862 235618,1149 235619,111 235620,707 235621,50 235621,1419 235622,3447 235624,292 235625,389 235626,3804 235627,483 235628,200 235629,6556 235630,179170 235631,3209 235632,179170 235633,3413 235634,142405 235635,151 235636,8270 235637,795 235638,557 235639,255 235640,859 235641,8270 235642,30 235643,592 235645,4597 235646,697 235647,30 235648,557 235649,557 235650,328 235651,557 235652,1509 235653,34 235653,35 235654,994 235655,1858 235656,1860 235657,106 235658,1634 235659,557 235660,225 235661,1132 235662,1381 235663,491 235664,142409 235665,179170 235666,142473 235667,235668 235669,273 235670,217 235671,843 235672,235673 235674,179170 235675,743 235676,179170 235677,179170 235678,1118 235678,1188 235679,112994 235679,120510 235679,138194 235679,174995 235679,181028 235680,138 235681,179170 235682,255 235682,298 235682,332 235682,589 235682,631 235682,714 235682,862 235682,968 235682,1085 235682,1122 235682,1522 235682,1715 235682,1962 235682,2296 235682,2995 235682,3623 235682,6068 235682,6424 235684,143287 235685,179170 235686,179170 235687,32 235688,1181 235689,179170 235690,1227 235690,86416 235691,588 235691,590 235691,1419 235692,147 235693,55849 235694,707 235695,2506 235696,406 235697,872 235698,872 235699,235700 235701,255 235707,86416 235709,179170 235710,8270 235711,151 235712,795 235713,179170 235714,1590 235715,179170 235716,510 235717,179170 235718,179170 235719,3804 235720,255 235721,251 235722,240 235723,779 235724,142870 235725,179170 235726,22 235726,240 235726,372 235726,390 235726,392 235726,510 235726,562 235726,567 235726,571 235726,602 235726,657 235726,784 235726,809 235726,868 235726,1052 235726,1385 235726,1893 235726,1904 235726,1908 235726,3538 235726,6119 235726,6556 235726,8332 235726,81070 235726,127158 235727,3447 235728,1927 235729,1033 235730,269 235731,202 235732,27356 235733,45310 235734,179170 235735,151 235736,3695 235737,235738 235739,843 235740,717 235741,1773 235742,652 235743,697 235744,636 235745,184 235746,119 235747,7155 235748,795 235749,179170 235750,640 235751,1012 235752,285 235753,298 235754,1608 235755,151 235756,1181 235757,184 235758,179170 235759,142473 235760,366 235761,292 235762,179170 235763,294 235764,366 235765,296 235766,366 235767,298 235768,285 235769,151 235770,424 235771,1551 235772,3297 235773,298 235774,235775 235776,1572 235777,1644 235778,1644 235779,788 235780,41 235782,372 235782,932 235782,1082 235782,1241 235782,1479 235782,1849 235783,217 235784,795 235785,1181 235786,148742 235787,422 235788,589 235789,1634 235791,179170 235792,795 235793,235794 235795,104 235796,4597 235797,1749 235798,1285 235798,2266 235799,818 235800,431 235800,1252 235800,1253 235800,2224 235801,588 235801,590 235802,467 235803,907 235803,2191 235804,143 235804,415 235804,6487 235805,55849 235807,534 235808,2784 235810,113878 235811,235812 235813,8270 235815,509 235817,136 235818,843 235819,406 235820,1544 235821,1544 235822,189794 235822,223738 235823,749 235825,235826 235828,422 235830,422 235833,1544 235834,1544 235835,422 235836,422 235837,1544 235838,422 235841,422 235842,422 235843,422 235844,422 235845,422 235846,422 235847,56 235848,422 235849,1252 235849,1253 235850,809 235851,48 235854,640 235855,640 235856,640 235857,1332 235858,640 235859,640 235860,19010 235861,640 235863,171641 235865,843 235866,35486 235867,671 235868,148742 235870,1566 235871,235872 235873,1220 235874,117163 235875,467 235875,162599 235876,694 235876,1151 235878,148742 235879,79 235879,192 235879,202 235879,333 235879,1181 235880,1113 235882,179170 235883,920 235884,235885 235886,2979 235888,83 235890,151 235891,272 235892,872 235893,179170 235894,195 235896,6303 235899,850 235900,6068 235901,79 235902,1544 235903,1417 235905,1564 235906,1238 235907,179170 235908,167 235909,1722 235910,1452 235911,406 235911,622 235912,818 235913,1860 235914,1858 235915,932 235916,1556 235918,671 235919,1858 235920,1860 235921,1132 235922,781 235923,1860 235924,1858 235926,862 235927,211 235928,148742 235929,590 235929,714 235929,4193 235930,227669 235931,1359 235932,113878 235934,269 235935,136 235936,79 235937,980 235939,179170 235940,227669 235941,56 235942,422 235943,392 235944,167 235945,1058 235947,179170 235948,179170 235949,1181 235954,179170 235956,120 235957,390 235957,2995 235958,162599 235960,1572 235961,2135 235962,138686 235963,175 235964,510 235965,994 235966,56 235967,422 235968,56 235969,422 235970,30 235972,2620 235973,83 235974,217 235976,15179 235977,192 235978,1849 235979,1010 235980,1564 235981,932 235982,1955 235983,2205 235983,33424 235984,714 235985,7698 235986,346 235987,179170 235988,485 235988,717 235988,861 235989,148742 235990,1181 235991,2989 235991,2991 235992,1087 235993,58 235994,227669 235995,1326 235997,140 235997,178 235997,333 235998,148742 235999,202 236001,872 236002,56 236003,422 236004,7698 236005,3507 236006,44725 236007,1238 236008,493 236009,148742 236010,4597 236011,236012 236013,406 236014,148742 236015,1618 236017,346 236018,200 236018,28203 236019,2266 236020,760 236021,535 236022,79 236023,3260 236024,240 236024,289 236024,301 236024,714 236024,1511 236024,2205 236024,2286 236024,2620 236024,3069 236024,20359 236024,33424 236024,94134 236025,346 236026,19010 236027,195 236028,577 236029,827 236030,346 236032,148742 236033,596 236036,252 236037,83 236038,1010 236039,1010 236040,275 236041,631 236042,7698 236044,309 236044,310 236045,148742 236046,24505 236047,97 236048,2590 236050,275 236051,536 236052,622 236053,433 236054,1085 236055,467 236056,516 236058,278 236058,248556 236059,75912 236061,178 236063,596 236064,1326 236066,1368 236067,148742 236068,309 236068,310 236069,179170 236070,148742 236071,179170 236072,355 236073,7416 236074,209 236076,875 236077,269 236078,1238 236080,1363 236080,1454 236081,346 236082,473 236083,2590 236084,148742 236085,211 236086,269 236087,849 236088,843 236089,179170 236090,843 236091,843 236092,843 236093,843 236094,843 236095,179170 236096,79 236097,179170 236098,179170 236099,44 236100,167 236100,73570 236101,138686 236102,175 236103,515 236104,236105 236106,592 236107,4611 236108,349 236108,2372 236109,236110 236112,1181 236113,1181 236114,148742 236115,994 236116,4597 236117,30 236118,179170 236119,99 236121,875 236122,19 236123,309 236123,310 236124,142430 236125,148742 236128,1085 236129,577 236131,918 236132,932 236134,694 236135,111 236136,179170 236137,56 236138,422 236139,83 236140,147 236141,389 236141,949 236141,1381 236141,3260 236143,179170 236144,1181 236145,179170 236146,148742 236147,179170 236148,151 236149,209 236150,1284 236152,148742 236153,1449 236153,1927 236154,211 236155,179170 236156,269 236156,271 236156,1179 236156,1313 236156,2372 236157,195 236158,422 236159,56 236160,1019 236161,179170 236162,142426 236163,663 236164,148742 236165,179170 236166,278 236167,217 236168,83 236169,148742 236170,179170 236171,255 236172,640 236174,6556 236175,2373 236176,360 236177,707 236178,536 236179,41 236180,1210 236180,55552 236180,143959 236180,155240 236180,236180 236180,239833 236180,239920 236180,240005 236180,240739 236180,250761 236180,252668 236180,261483 236181,179170 236182,843 236183,158 236184,148742 236185,179170 236186,179170 236187,60576 236188,179170 236189,179170 236190,179170 236191,694 236193,435 236194,1522 236195,179170 236197,179170 236198,2782 236199,72 236200,35486 236201,994 236202,236203 236202,251270 236204,1381 236205,1749 236206,56 236207,422 236208,236209 236210,179170 236211,1983 236212,843 236213,179170 236214,179170 236216,179170 236217,217 236218,179170 236219,483 236220,15807 236221,220816 236222,179170 236223,302 236223,2116 236224,179170 236225,179170 236226,907 236227,406 236228,220816 236229,809 236231,994 236232,179170 236233,1122 236234,301 236234,5718 236235,220816 236236,994 236237,179170 236238,179170 236239,220816 236240,784 236241,179170 236242,2205 236242,33424 236243,1326 236244,102 236245,408 236246,1323 236247,142870 236248,220816 236249,2797 236250,179170 236251,258 236252,861 236252,1241 236252,127158 236253,220816 236254,179170 236255,6119 236256,6880 236257,590 236257,714 236258,8373 236259,211 236260,34 236260,602 236261,333 236262,862 236262,4193 236263,252 236264,167 236265,433 236266,2989 236266,2991 236267,220816 236268,994 236270,994 236273,145751 236274,55849 236275,994 236276,220816 236277,179170 236278,4545 236278,56150 236279,366 236280,330 236281,994 236282,134 236283,10 236284,8270 236284,72439 236285,220816 236286,2421 236287,13980 236288,2421 236289,200 236290,220816 236292,7092 236293,835 236294,805 236295,328 236296,2590 236297,220816 236298,346 236299,128313 236300,30 236301,192 236302,346 236303,1454 236304,220816 236305,220816 236306,236307 236309,79 236309,704 236310,81 236311,149 236312,30 236313,220816 236314,179170 236315,236316 236317,179170 236318,220816 236319,1801 236320,148742 236321,148742 236322,278 236323,127158 236324,220816 236325,273 236326,217 236327,994 236328,178 236329,220816 236330,278 236331,298 236332,485 236333,433 236334,30 236335,1085 236336,79 236337,589 236338,647 236339,406 236341,148742 236342,117163 236343,179170 236344,1181 236345,147 236346,179170 236347,148742 236348,222 236348,313 236349,491 236350,1326 236351,3846 236352,236353 236354,220816 236355,55849 236356,138686 236357,175 236358,5405 236359,179170 236360,184 236361,179170 236362,313 236363,179170 236364,298 236365,1 236366,54 236367,1368 236368,117163 236369,83 236370,179170 236371,179170 236372,179170 236373,200 236374,220816 236375,179170 236376,652 236377,7358 236377,7363 236378,278 236379,417 236380,577 236381,220816 236382,285 236383,920 236384,236385 236386,1179 236386,1305 236386,2146 236386,2701 236387,2744 236388,1893 236388,117163 236389,7194 236390,697 236391,2048 236392,4597 236394,1227 236394,86416 236395,920 236396,162599 236397,818 236398,236399 236400,240 236401,202 236402,115659 236403,872 236404,2266 236405,309 236405,310 236406,236407 236408,3999 236409,34 236409,35 236409,313 236409,2784 236409,14126 236410,111 236411,850 236412,28755 236413,255 236414,3 236415,236416 236417,179170 236418,179170 236419,2867 236419,2868 236420,2931 236421,233 236422,179170 236423,236424 236423,238633 236425,932 236426,142870 236427,247 236428,273 236429,596 236430,269 236431,4355 236432,366 236433,366 236434,366 236435,366 236436,862 236437,1294 236438,346 236439,328 236440,192 236441,179170 236442,179170 236443,346 236444,493 236444,1266 236445,563 236446,1181 236447,227669 236448,1284 236448,148742 236449,3999 236450,8270 236451,195 236452,148742 236453,346 236454,236455 236456,195 236457,1133 236458,346 236460,8854 236461,179170 236462,1381 236463,236464 236463,257473 236465,233 236466,30 236467,30 236469,158 236469,21442 236469,240174 236470,15 236471,1572 236472,259 236473,48 236474,3260 236475,56 236476,422 236477,491 236478,1860 236479,1858 236480,298 236481,151 236481,663 236483,58 236484,994 236485,46 236486,30 236488,707 236489,505 236490,397 236491,222 236493,805 236495,972 236496,236497 236498,236497 236499,236497 236500,693 236501,35486 236502,1220 236503,252 236504,346 236505,251 236506,115659 236507,115659 236508,1363 236509,491 236510,644 236511,424 236512,1454 236514,483 236515,1707 236516,200 236517,557 236518,1368 236519,707 236521,875 236522,1454 236523,634 236524,422 236525,422 236526,83 236527,422 236528,422 236529,422 236530,422 236531,422 236532,422 236533,422 236534,422 236535,422 236536,422 236537,640 236538,640 236539,422 236540,640 236541,640 236542,148742 236543,640 236544,147 236545,726 236546,1805 236547,292 236547,462 236548,302 236549,148742 236551,240 236552,142426 236553,3260 236554,346 236555,298 236557,35486 236558,179170 236559,4545 236559,56150 236560,920 236561,206 236562,104 236562,136 236562,225 236562,953 236562,1368 236562,1939 236562,5405 236562,7270 236563,994 236564,1274 236565,994 236566,872 236567,2411 236568,1634 236569,652 236570,138686 236571,148742 236572,175 236574,994 236575,179170 236576,1294 236577,1893 236577,117163 236578,58 236579,994 236580,46 236581,302 236582,79 236583,272 236584,1274 236585,302 236586,217 236587,406 236588,6682 236589,58 236590,994 236591,46 236592,406 236593,1033 236594,44725 236595,178 236596,622 236597,640 236598,1132 236599,1608 236600,1644 236601,1608 236602,1132 236603,1151 236604,328 236605,687 236606,147 236607,302 236608,355 236609,491 236610,491 236611,1085 236612,148742 236613,236614 236615,7698 236616,1001 236617,408 236618,932 236620,1544 236621,104 236621,136 236621,225 236621,953 236621,1368 236621,1939 236621,5405 236621,7270 236622,920 236622,255750 236622,256703 236622,258791 236623,868 236624,328 236625,83 236627,302 236628,1962 236629,1274 236630,2266 236631,1201 236632,217 236633,2421 236634,4637 236635,8270 236636,264 236637,893 236638,1782 236639,136072 236640,195 236641,2775 236642,447 236643,309 236643,310 236644,148742 236645,2135 236646,83 236648,818 236649,483 236650,372 236651,346 236652,148742 236653,179170 236654,406 236655,225 236656,151 236657,236658 236659,663 236660,217 236661,236662 236663,184 236664,22 236665,516 236666,346 236667,302 236668,202 236669,707 236671,360 236671,2617 236672,500 236673,1962 236674,1052 236675,54 236676,2775 236677,707 236679,8270 236680,832 236681,217 236681,247 236681,652 236681,1893 236683,360 236684,1 236685,32 236686,389 236686,1019 236686,1467 236687,535 236688,1181 236689,994 236691,994 236692,994 236693,577 236693,1400 236694,535 236695,668 236696,657 236697,3260 236698,1436 236699,1370 236701,2931 236702,3804 236703,372 236704,872 236705,1224 236706,875 236707,872 236708,54 236709,2421 236710,56 236711,422 236712,852 236713,346 236715,557 236716,5405 236717,227061 236718,261 236718,3115 236719,10 236720,58 236721,46 236722,994 236723,56 236725,422 236726,111142 236727,195 236727,6323 236728,874 236729,179170 236730,1188 236731,994 236732,862 236733,9457 236734,302 236734,893 236735,264 236736,346 236737,273 236738,1608 236739,1132 236740,175 236740,313 236740,693 236740,1313 236740,2421 236740,2646 236740,13980 236740,115474 236741,687 236742,994 236743,994 236744,536 236745,9018 236746,7358 236746,7363 236747,585 236748,8788 236749,1266 236749,7124 236750,2868 236750,4355 236751,994 236752,406 236753,211 236755,179170 236756,500 236757,54 236758,2775 236759,1962 236760,1052 236761,16014 236761,236761 236762,145240 236763,994 236764,489 236765,433 236766,1462 236766,8537 236767,1 236767,1243 236768,720 236769,179170 236770,994 236771,994 236772,1837 236773,994 236774,433 236775,148742 236776,1181 236777,301 236778,1241 236779,907 236780,179170 236781,200 236782,68069 236783,349 236784,743 236786,192 236787,406 236787,220502 236788,212914 236790,389 236790,2421 236791,222 236792,515 236793,707 236794,5213 236796,1860 236797,1858 236798,994 236799,179170 236800,147 236801,220816 236802,179170 236803,994 236804,1659 236805,435 236806,1955 236807,151 236808,1818 236809,843 236810,179170 236811,179170 236812,304 236813,179170 236815,2421 236816,220816 236817,509 236817,852 236818,687 236819,1849 236821,44725 236822,179170 236823,843 236825,34 236825,35 236826,179170 236827,1927 236828,179170 236829,4597 236830,138686 236831,175 236832,1955 236833,179170 236834,843 236835,1556 236837,55849 236839,349 236839,697 236839,3260 236840,389 236841,179170 236842,255 236843,1368 236844,149 236845,949 236846,10 236847,148742 236848,994 236849,818 236849,1151 236850,6303 236851,3 236852,393 236853,4101 236854,278 236855,707 236856,83 236856,278 236856,577 236857,1052 236858,65 236860,83 236861,151 236862,179170 236863,2699 236865,455 236867,422 236868,1181 236869,392 236870,752 236871,2083 236872,1298 236873,1210 236874,390 236875,1370 236876,518 236877,302 236878,1849 236879,1231 236880,6068 236881,1001 236882,3193 236883,63 236884,1715 236885,589 236886,714 236887,79 236888,1634 236889,179170 236890,622 236891,406 236892,56 236893,179170 236894,148742 236895,9098 236896,7572 236897,217 236898,148742 236899,118336 236901,179170 236902,685 236903,55849 236904,515 236905,1551 236906,8798 236907,417 236908,1590 236909,83 236910,349 236911,973 236912,4453 236913,302 236915,694 236916,392 236917,179170 236919,406 236920,236921 236922,162599 236923,1579 236924,1849 236925,1381 236926,3193 236927,1289 236928,140 236929,1955 236930,3999 236931,586 236932,1479 236933,1010 236934,932 236935,1102 236936,687 236937,1241 236938,1821 236938,21736 236939,1370 236940,2620 236941,148742 236942,515 236943,1551 236944,4453 236945,1265 236945,1266 236946,586 236947,1531 236948,483 236949,162599 236951,217 236952,278 236953,179170 236954,1467 236955,536 236956,83 236957,1227 236957,86416 236958,626 236959,872 236959,1659 236960,195 236962,236961 236963,141912 236964,346 236965,56 236966,422 236967,467 236969,932 236970,148742 236971,158 236972,5 236972,8330 236972,72439 236973,818 236974,309 236974,310 236975,179170 236976,50 236976,146 236976,92476 236976,141912 236977,148742 236978,79 236979,233 236980,151 236980,192 236980,309 236980,310 236980,577 236980,1167 236980,1400 236981,493 236983,704 236984,30 236985,346 236987,272 236988,1893 236989,406 236990,179170 236991,718 236992,615 236993,179170 236994,44 236995,1058 236996,346 236997,252 236998,1033 236999,151 237000,1052 237001,2775 237002,54 237003,1962 237004,500 237005,885 237005,13704 237006,525 237007,994 237008,1309 237009,56 237010,422 237011,179170 237012,1285 237013,1515 237014,247 237014,2867 237014,2868 237015,192 237016,1474 237016,1789 237017,631 237018,7092 237019,220816 237020,294 237021,1893 237022,805 237023,179170 237024,783 237025,179170 237026,115474 237027,2244 237028,1001 237028,72439 237029,2334 237030,1 237031,536 237032,278 237033,179170 237034,143287 237035,72 237035,312 237035,323 237035,991 237035,1188 237035,1309 237035,1893 237035,2312 237035,2605 237035,3695 237036,302 237036,406 237036,420 237036,1414 237036,1466 237037,473 237037,1082 237037,1983 237037,2353 237037,2923 237037,3999 237038,19010 237039,1085 237040,167 237040,605 237040,1544 237040,2083 237040,5301 237041,220816 237042,179170 237043,500 237044,2775 237045,1052 237046,54 237047,1962 237048,7416 237049,255 237050,500 237051,1962 237052,1052 237053,54 237054,2775 237055,707 237056,237057 237059,179170 237060,179170 237061,264 237062,273 237063,2373 237064,500 237065,1052 237066,2775 237067,1962 237068,54 237069,1181 237070,179170 237071,1181 237072,1132 237073,1608 237074,795 237075,179170 237076,179170 237077,179170 237078,217 237079,4455 237079,193578 237080,58 237081,83 237082,1181 237083,237084 237085,1238 237086,422 237087,56 237088,220816 237090,1452 237091,167 237091,1133 237091,2557 237092,3949 237093,2617 237094,72764 237095,862 237096,452 237097,1247 237097,164572 237098,184 237099,406 237100,179170 237101,1323 237101,1512 237102,862 237103,179170 237104,34 237104,602 237105,1326 237106,102 237107,1323 237108,408 237109,179170 237112,640 237113,1058 237115,179170 237116,179170 237117,179170 237119,435 237119,893 237122,237123 237124,179170 237125,30 237126,179170 237127,237128 237129,237130 237131,179170 237132,697 237133,663 237134,3138 237135,147 237136,577 237136,788 237137,4597 237139,1227 237139,86416 237140,136 237141,138686 237142,175 237143,433 237144,220816 237145,859 237146,1564 237147,81 237148,323 237149,1227 237149,86416 237150,220816 237151,264 237152,83 237153,479 237154,83 237155,292 237156,307 237158,272 237159,1363 237160,7698 237161,1163 237162,237163 237164,44 237165,147 237166,850 237167,1515 237168,7117 237169,278 237169,313 237169,1010 237169,1241 237169,1368 237169,1415 237170,237171 237172,5265 237173,23783 237174,14366 237175,179170 237176,237177 237178,147 237179,50 237180,1181 237181,83 237181,211 237181,269 237181,622 237181,1014 237182,179170 237183,1381 237184,179170 237185,179170 237186,179170 237187,179170 237188,2674 237189,179170 237190,179170 237191,179170 237192,147 237193,577 237193,745 237194,424 237195,392 237195,433 237196,285 237197,307 237197,2334 237198,45960 237199,237200 237201,7358 237201,7363 237202,289 237202,94134 237203,859 237203,182162 237204,237205 237206,872 237207,147 237208,179170 237209,179170 237210,179170 237211,179170 237212,28755 237213,714 237213,4193 237213,8992 237214,2244 237215,179170 237216,493 237216,704 237217,1368 237218,179170 237219,179170 237220,252 237221,151 237222,818 237223,138686 237224,175 237225,179170 237227,1363 237228,267 237229,179170 237230,179170 237231,269 237232,8270 237233,920 237235,7358 237235,7363 237236,640 237237,237238 237239,179170 237240,240 237241,237242 237243,433 237245,360 237245,1893 237246,489 237247,1140 237248,2073 237249,388 237250,143287 237251,491 237252,1773 237253,615 237253,968 237254,1566 237255,30 237256,1773 237257,237258 237259,1179 237260,198024 237261,3161 237262,237263 237264,1052 237265,1962 237266,2775 237267,54 237268,592 237269,3769 237270,577 237271,397 237272,8991 237272,33424 237273,726 237273,1235 237275,1707 237277,79 237277,222 237277,590 237277,1419 237277,2719 237277,23701 237278,23783 237279,207 237279,358 237279,366 237279,417 237279,1052 237279,1253 237279,1319 237279,1571 237279,1634 237279,2424 237279,2620 237279,2867 237279,2868 237280,106 237281,408 237282,994 237283,58 237284,46 237285,171 237287,1146 237288,6027 237288,227061 237289,292 237290,366 237292,366 237293,366 237294,366 237295,366 237296,366 237297,195 237297,893 237297,1247 237297,3769 237297,164572 237298,389 237299,422 237300,56 237301,671 237303,1266 237303,5714 237304,1893 237305,1893 237306,1893 237307,1893 237308,1893 237309,1363 237310,1955 237311,195 237312,1363 237314,211 237315,1370 237316,333 237317,34 237317,590 237317,602 237318,2995 237321,422 237323,422 237324,200 237325,422 237326,2480 237327,422 237328,1860 237329,1858 237330,422 237331,422 237332,422 237333,422 237334,422 237335,422 237336,422 237337,422 237338,422 237339,640 237340,640 237341,640 237342,640 237343,209 237344,1893 237345,1127 237346,640 237347,1858 237348,1860 237349,577 237350,346 237351,195 237352,640 237353,35486 237354,1058 237355,120 237355,3252 237355,13980 237356,433 237357,162599 237358,1181 237359,1877 237359,40497 237360,1181 237361,31073 237362,481 237363,195 237364,698 237365,151 237366,56 237367,422 237368,3630 237369,743 237370,142426 237371,195 237374,1893 237376,818 237377,5 237377,1414 237377,1462 237378,195 237379,920 237380,644 237381,859 237382,779 237383,808 237384,314 237385,422 237386,56 237387,179170 237388,360 237388,1127 237388,21408 237389,195 237390,179170 237392,994 237393,3003 237394,408 237394,818 237395,779 237396,192 237397,336 237398,1127 237399,994 237400,222 237401,8270 237403,301 237404,795 237405,925 237406,7117 237407,1253 237407,1707 237407,3370 237407,182162 237408,151 237409,195 237410,1274 237411,1893 237412,48 237413,859 237414,1893 237415,772 237416,1363 237417,3094 237418,1011 237419,1644 237420,1659 237421,3474 237422,994 237423,408 237424,996 237425,408 237427,932 237428,1151 237428,2436 237429,3999 237430,980 237431,657 237432,2979 237433,360 237433,81070 237434,237435 237436,5192 237437,79 237438,422 237439,491 237440,151 237441,1151 237442,1282 237443,211 237444,1177 237445,134 237445,431 237446,202 237447,1001 237449,289 237449,94134 237450,83 237451,1227 237451,86416 237452,30 237453,1238 237454,1033 237455,83 237456,444 237457,5213 237458,1452 237459,718 237460,1210 237461,1419 237461,20535 237463,707 237472,1688 237473,1769 237475,7 237476,83 237477,406 237477,467 237478,602 237479,8270 237480,237481 237482,447 237483,346 237485,171641 237486,843 237487,707 237488,1769 237489,1462 237489,8537 237490,406 237491,160 237492,779 237493,994 237494,585 237495,30 237496,1564 237497,222 237497,455 237498,1058 237499,447 237500,2775 237501,240 237501,1082 237501,1285 237503,167 237504,393 237505,510 237507,151 237508,72 237509,1127 237510,83 237511,8270 237512,151 237513,1181 237514,3328 237515,179170 237517,237518 237519,602 237520,3177 237521,1564 237523,994 237524,35486 237525,2073 237527,1058 237528,1414 237536,3999 237537,2590 237538,1893 237539,994 237540,179170 237541,843 237542,1113 237543,323 237544,649 237545,577 237546,1181 237548,1001 237549,779 237549,1181 237550,37 237551,269 237551,872 237551,1796 237553,115659 237554,1449 237555,775 237556,217 237557,37 237558,151 237559,1284 237560,301 237562,13661 237563,1893 237564,204124 237565,1284 237565,148742 237567,113156 237568,179170 237569,1127 237571,1515 237572,147 237573,1566 237573,242246 237575,175 237576,55849 237577,1749 237578,392 237579,141912 237580,141912 237581,406 237582,805 237583,200 237584,1353 237585,333 237586,1551 237587,138686 237588,175 237589,1238 237590,58 237590,71 237590,217 237590,1449 237590,1612 237590,2590 237590,5718 237591,640 237592,536 237593,781 237594,1132 237595,994 237596,179170 237597,1238 237598,779 237599,1238 237600,179170 237601,862 237602,179170 237603,1058 237604,1740 237605,202 237606,1132 237607,781 237608,179170 237609,83 237610,8788 237611,1556 237612,7358 237612,7363 237613,1160 237614,137 237615,7092 237617,30 237617,328 237617,4355 237618,447 237619,2775 237620,179170 237621,1298 237622,2424 237623,50 237623,146 237623,285 237623,779 237623,809 237623,1181 237623,1515 237623,92476 237623,141912 237626,850 237627,392 237628,1118 237629,338 237630,900 237631,795 237633,151 237634,4237 237634,182162 237635,8270 237636,392 237637,1893 237638,179170 237639,676 237640,1849 237641,4611 237642,151 237643,538 237644,3623 237645,144556 237648,200 237649,44 237650,269 237651,179170 237652,301 237653,1274 237654,135 237655,302 237656,515 237657,179170 237658,142870 237659,289 237659,94134 237660,162599 237661,158 237663,994 237664,162599 237665,292 237666,251 237667,179170 237668,577 237669,302 237670,56 237671,422 237672,179170 237673,1007 237674,19986 237675,34 237675,35 237676,179170 237677,861 237678,1282 237679,240 237680,932 237681,179170 237682,1860 237683,1858 237684,15573 237685,364 237686,45960 237688,179170 237689,220816 237690,30 237691,2750 237692,179170 237693,9239 237694,3182 237695,779 237696,918 237697,237698 237699,237700 237701,237700 237702,220816 237703,237700 237704,2646 237705,1572 237706,289 237706,94134 237707,1240 237708,247 237709,805 237710,220816 237711,3297 237712,333 237713,994 237714,3209 237715,35486 237716,626 237721,220816 237722,17772 237723,483 237724,220816 237725,481 237726,1556 237727,220816 237728,206 237729,1240 237730,167 237731,200 237732,333 237733,220816 237734,9018 237735,1119 237736,77 237737,233 237738,9024 237739,237740 237741,220816 237742,148742 237743,972 237743,973 237744,7092 237745,1181 237746,788 237747,1033 237748,535 237749,56 237750,422 237751,435 237752,50 237752,4504 237753,220816 237754,142870 237755,8373 237756,220816 237757,4193 237758,182162 237759,278 237760,1893 237761,516 237762,5405 237763,1326 237764,1323 237765,408 237766,102 237767,4597 237768,843 237769,220816 237770,644 237771,255 237772,220816 237773,3507 237774,346 237775,220816 237776,143287 237777,179170 237778,5906 237779,557 237780,1707 237781,626 237782,278 237783,220816 237784,137 237785,179170 237786,862 237787,215276 237788,447 237791,220816 237792,1181 237793,1181 237794,179170 237795,538 237796,1001 237796,72439 237797,220816 237798,850 237799,179170 237800,220816 237801,220816 237802,795 237803,220816 237804,920 237805,1452 237806,179170 237807,220816 237808,255 237809,406 237810,151 237811,237812 237813,707 237814,220816 237815,115659 237816,515 237817,179170 237818,2105 237819,278 237820,179170 237821,220816 237822,179170 237823,1608 237824,179170 237825,30 237826,211 237826,366 237827,30 237828,73570 237829,179170 237830,220816 237831,2995 237832,179170 237833,179170 237834,179170 237835,1414 237836,34 237836,602 237837,586 237838,8822 237839,1773 237840,80266 237841,663 237842,179170 237843,220816 237844,795 237845,8270 237846,179170 237847,8854 237848,158 237849,1745 237850,220816 237851,9457 237852,1033 237853,10 237854,237855 237856,264 237857,1927 237858,447 237859,2775 237860,179170 237862,302 237862,893 237863,220816 237864,237865 237866,138686 237867,175 237868,48 237868,217 237868,302 237868,333 237868,872 237868,1419 237868,1893 237868,2668 237868,4355 237868,142870 237869,1860 237870,1858 237871,179170 237872,179170 237873,333 237874,220816 237875,179170 237876,1566 237877,179170 237878,179170 237879,220816 237880,220816 237881,292 237882,779 237883,104 237884,1181 237885,1007 237886,220816 237887,1634 237888,781 237889,1132 237890,2775 237891,447 237892,220816 237893,237894 237895,237894 237896,120 237897,147 237898,220816 237900,1893 237901,192 237902,346 237903,142870 237904,9018 237905,620 237905,1181 237906,1227 237906,86416 237907,1181 237908,1467 237909,455 237910,2424 237911,217 237912,1274 237913,1871 237914,83 237915,2421 237916,13980 237917,1284 237918,611 237919,65 237920,179170 237921,581 237922,179170 237923,179170 237924,179170 237925,907 237925,1419 237926,19 237927,179170 237928,5101 237930,557 237931,285 237932,920 237933,220816 237934,309 237934,310 237935,30 237936,779 237937,179170 237938,1474 237939,673 237940,179170 237941,211 237942,30 237943,5440 237944,1274 237945,111 237946,1400 237947,179170 237948,179170 237949,8270 237950,151 237951,795 237952,179170 237953,920 237954,179170 237955,1181 237956,1181 237957,179170 237958,247 237959,179170 237960,310 237960,224488 237961,179170 237962,779 237963,1 237964,179170 237965,3804 237966,779 237967,1181 237968,1181 237969,304 237971,269 237972,2116 237973,179170 237974,237975 237976,179170 237977,34 237977,2995 237978,714 237978,4193 237979,1132 237980,671 237981,1326 237981,5301 237982,1284 237983,577 237984,179170 237985,237986 237987,366 237988,1181 237989,1238 237990,8270 237991,8270 237992,151 237993,795 237994,151 237995,8270 237996,1474 237997,1085 237998,577 237999,238000 238001,3507 238003,707 238004,779 238006,1181 238007,4276 238008,1359 238009,581 238009,918 238010,130 238011,209 238012,238013 238014,387 238015,366 238016,671 238017,366 238018,366 238019,366 238020,1052 238021,1962 238022,54 238023,2775 238024,366 238025,79 238026,200 238027,79 238028,366 238029,305 238031,1860 238032,1858 238033,366 238034,20 238034,32 238034,102 238034,106 238034,262 238034,283 238034,649 238034,663 238034,861 238034,893 238034,1052 238034,1345 238034,1368 238034,1381 238034,1509 238034,1673 238034,1847 238034,2244 238034,4903 238034,9457 238034,13136 238035,179170 238036,179170 238037,211 238038,467 238039,875 238040,784 238041,330 238042,1858 238043,344 238044,422 238045,795 238046,2116 238047,422 238048,422 238049,422 238050,422 238051,422 238052,422 238053,264 238054,142870 238056,422 238057,1860 238058,1858 238059,179170 238060,2460 238061,269 238062,1359 238063,30 238064,238065 238066,179170 238067,1359 238068,187176 238069,1359 238070,1359 238072,35486 238073,1619 238075,264 238076,1623 238077,1467 238078,13538 238080,79 238081,994 238082,58 238083,46 238084,1085 238085,301 238086,1359 238087,640 238088,2590 238090,1238 238091,71 238091,1449 238091,1612 238091,2590 238091,5718 238092,1238 238093,1782 238094,949 238095,920 238096,60576 238097,76096 238098,162599 238099,1359 238100,200 238101,302 238102,1415 238103,151 238104,8270 238105,795 238106,200 238108,275 238109,8270 238110,707 238111,707 238112,138686 238113,217 238114,175 238115,2674 238116,3094 238117,1644 238118,179170 238119,1274 238120,207 238121,240 238122,1284 238123,83 238125,636 238126,179170 238127,278 238129,707 238130,217 238131,872 238132,932 238133,1238 238134,313 238135,1566 238136,406 238137,1893 238138,1452 238139,149 238139,406 238140,269 238141,7 238142,167 238143,640 238144,640 238145,640 238146,640 238147,640 238148,779 238149,640 238150,1773 238152,872 238153,8270 238154,703 238155,1429 238156,1052 238157,1962 238158,54 238159,2775 238161,83 238162,1531 238163,1531 238164,1368 238165,120 238166,146 238166,92476 238168,668 238169,1240 238170,422 238172,134 238173,536 238178,79 238181,6068 238182,14366 238184,115474 238185,1392 238186,875 238187,366 238188,762 238189,788 238190,195 238192,269 238194,1238 238195,1983 238196,158 238196,192 238197,1608 238198,1132 238199,179170 238200,1276 238201,1181 238202,1033 238203,179170 238204,58 238205,994 238206,46 238207,19010 238208,58 238209,994 238210,46 238211,56 238212,422 238213,1707 238214,779 238215,56 238216,422 238217,22 238218,358 238219,6556 238220,134 238220,372 238221,148742 238222,577 238222,788 238223,1284 238224,852 238225,72 238226,44725 238228,188791 238229,1707 238230,195 238231,491 238232,83 238234,422 238235,56 238237,1400 238238,1882 238239,1068 238240,179170 238242,202 238243,179170 238244,6059 238245,1274 238245,1454 238248,148742 238249,1566 238251,510 238253,852 238254,179170 238255,1058 238256,483 238256,232766 238257,179170 238258,289 238258,94134 238259,1381 238260,596 238261,179170 238262,1368 238263,920 238264,919 238265,805 238266,1143 238267,1707 238268,179170 238269,8270 238270,179170 238271,918 238271,1160 238272,358 238273,179170 238274,1467 238275,179170 238277,148742 238278,1052 238279,54 238280,2775 238281,1962 238282,2744 238283,462 238283,595 238283,3695 238284,994 238289,1644 238294,406 238297,1238 238298,179170 238299,315 238300,515 238301,714 238301,1511 238301,33424 238301,94134 238302,179170 238303,309 238303,310 238304,292 238305,179170 238306,83 238307,779 238308,79 238308,192 238308,305 238308,435 238308,516 238308,585 238308,1400 238309,657 238310,56 238311,422 238312,238313 238314,179170 238315,435 238316,1238 238317,149 238318,179170 238319,206 238322,140 238323,4237 238323,182162 238324,179170 238325,1085 238326,843 238327,450 238329,179170 238330,68069 238330,141912 238331,1556 238332,462 238334,918 238334,1160 238335,30 238336,192 238337,907 238338,60576 238339,312 238340,1370 238340,21442 238341,8270 238342,2590 238344,130 238345,707 238346,44 238348,1927 238349,493 238350,138686 238351,215 238352,175 238353,162599 238355,1284 238356,3585 238357,151 238358,120 238358,261 238359,406 238360,483 238361,3695 238362,130 238363,136 238364,200 238365,1274 238366,714 238366,1962 238366,2965 238366,111142 238367,392 238368,991 238370,72 238371,1773 238372,146 238372,92476 238373,151 238374,309 238374,310 238374,1400 238375,875 238377,1151 238378,1844 238379,994 238380,255 238381,1 238382,859 238383,179170 238384,178 238384,346 238384,435 238384,439 238384,1033 238384,1789 238385,1181 238386,631 238387,994 238388,389 238389,179170 238390,760 238391,179170 238392,200 238393,2168 238394,3949 238395,238396 238397,179170 238398,467 238399,994 238400,344 238401,285 238402,893 238403,255 238404,1381 238405,138686 238406,175 238407,4594 238408,179170 238409,179170 238410,586 238410,3876 238411,8270 238412,151 238413,200 238414,51006 238415,636 238416,1531 238417,1151 238418,918 238419,238420 238422,1210 238423,2671 238424,30 238425,920 238426,34 238426,602 238427,4192 238427,4193 238428,333 238429,491 238430,278 238431,192 238431,217 238431,305 238431,1188 238431,4101 238431,13538 238432,435 238433,147 238433,406 238434,179170 238435,86416 238436,179170 238437,30 238438,55849 238439,536 238440,7092 238441,1531 238442,238443 238444,58 238445,994 238446,46 238447,147 238447,158 238448,1220 238449,302 238450,238451 238452,1773 238453,485 238454,179170 238455,843 238456,238457 238458,179170 238459,179170 238460,81 238461,919 238462,557 238463,2260 238464,3260 238465,393 238466,278 238467,227 238468,1509 238469,907 238472,2735 238473,1151 238474,557 238475,862 238476,1235 238476,1335 238477,79 238478,1298 238479,1579 238480,285 238481,1181 238482,1181 238483,217 238484,1133 238485,577 238486,238487 238488,1888 238489,250 238489,1684 238490,1381 238491,1474 238492,1326 238493,102 238494,408 238495,1323 238496,298 238497,238498 238497,240487 238499,673 238500,330 238501,931 238502,1359 238503,220816 238504,1644 238505,1033 238505,1612 238506,225 238507,179170 238508,1882 238509,417 238510,220816 238511,179170 238513,278 238514,1052 238515,54 238516,2775 238517,1962 238518,220816 238520,220816 238521,35486 238522,142433 238523,220816 238524,248 238525,179170 238526,142870 238527,779 238528,1449 238529,973 238529,1284 238530,220816 238531,179170 238532,240 238532,1564 238532,1818 238533,220816 238534,255 238535,238536 238537,220816 238538,1132 238539,285 238540,1359 238541,949 238542,250 238542,1684 238543,220816 238544,147 238545,483 238546,206 238547,8180 238548,220816 238549,1227 238549,86416 238550,8270 238551,1359 238552,8270 238553,795 238554,278 238555,2646 238556,83 238557,1381 238558,138686 238559,175 238560,6424 238561,167 238562,238563 238564,179170 238565,68 238566,1181 238567,392 238568,179170 238569,2116 238570,366 238571,56 238572,1181 238572,220502 238573,366 238574,893 238575,366 238576,366 238577,366 238578,366 238579,366 238580,366 238581,366 238582,366 238583,220816 238584,366 238585,179170 238586,2373 238587,1 238588,1149 238589,179170 238590,220816 238591,238592 238593,7416 238594,577 238595,1149 238596,179170 238597,2923 238598,20257 238599,179170 238600,179170 238601,238602 238603,577 238604,179170 238605,285 238606,1983 238607,147 238608,179170 238609,333 238610,238611 238612,240 238613,2590 238615,179170 238616,8884 238617,23701 238618,333 238619,179170 238620,87 238620,392 238620,1453 238620,1572 238620,1836 238620,2697 238620,14458 238621,2995 238622,1807 238623,872 238624,920 238625,10 238626,1429 238627,179170 238628,2205 238628,33424 238629,18831 238630,207 238631,3370 238631,45960 238632,668 238635,179170 238636,3392 238637,238638 238639,1860 238640,267 238641,147 238642,142870 238643,238644 238645,1858 238646,1860 238647,875 238648,8788 238649,151 238651,1858 238652,1860 238653,872 238654,1143 238655,323 238656,238657 238658,238657 238659,6556 238661,238662 238663,301 238663,968 238663,1293 238663,1300 238663,5662 238663,84719 238663,221730 238663,231070 238663,262493 238664,6556 238665,1359 238666,444 238667,1019 238668,4611 238669,302 238670,1858 238671,1860 238672,1167 238673,76096 238674,640 238675,640 238676,640 238677,640 238679,640 238680,592 238681,360 238682,238683 238684,1688 238686,861 238687,10 238687,175 238687,5725 238688,238689 238690,1434 238691,73570 238692,444 238692,932 238692,968 238692,1010 238692,1122 238692,1241 238692,1522 238693,1566 238694,195 238695,422 238696,422 238697,422 238698,422 238699,422 238700,422 238701,422 238702,422 238703,422 238704,35486 238705,422 238706,255 238707,422 238708,1052 238709,1962 238710,2775 238711,54 238712,1151 238714,6303 238715,852 238716,138686 238717,175 238720,1860 238721,1858 238722,980 238723,392 238724,809 238724,17852 238724,22293 238724,142868 238724,260905 238725,2671 238727,1891 238728,4611 238729,3769 238730,1132 238731,781 238732,179170 238733,980 238734,54 238735,1052 238736,2775 238737,1962 238738,238739 238741,907 238742,422 238742,602 238743,140 238744,932 238745,707 238746,611 238747,60576 238748,79 238749,1179 238750,179170 238751,130 238752,83 238753,333 238754,179170 238755,1419 238756,1238 238757,217 238760,1607 238761,794 238763,1452 238764,60576 238765,278 238766,358 238767,663 238769,1566 238770,2617 238771,8270 238771,72439 238773,106 238774,657 238775,179170 238776,22 238777,577 238778,73570 238779,2379 238780,1363 238781,2989 238781,2991 238783,5192 238784,372 238785,79 238786,4611 238787,1805 238789,3193 238790,577 238790,1070 238791,238792 238793,795 238794,3804 238795,209 238796,8270 238797,30 238798,671 238799,179170 238801,874 238801,2697 238802,447 238803,2775 238804,447 238805,2775 238806,640 238807,13980 238808,1007 238809,1722 238810,4594 238811,5440 238812,37 238813,873 238814,42628 238815,1010 238816,1985 238817,6888 238818,248 238819,875 238820,4637 238821,9001 238822,1465 238823,2191 238824,1231 238825,5662 238826,1782 238827,2266 238828,2779 238829,850 238830,1282 238831,3194 238832,1877 238833,3238 238834,589 238835,17346 238836,13575 238837,2979 238838,1522 238839,536 238840,264 238841,312 238842,717 238843,1151 238844,1927 238845,252 238846,4172 238847,207 238848,1579 238849,1745 238850,538 238851,388 238852,1509 238853,215 238854,3422 238855,1955 238856,1016 238857,328 238858,5405 238859,3193 238860,202 238861,332 238862,525 238863,2421 238864,3207 238865,225 238866,1882 238867,240 238868,1805 238869,9015 238870,1149 238871,1818 238872,7233 238873,302 238874,3999 238875,949 238876,702 238877,227 238878,7270 238879,859 238880,9029 238881,6955 238882,577 238883,9018 238884,2209 238885,1564 238886,2443 238887,1052 238888,1177 238889,34 238889,35 238890,1436 238891,2224 238892,720 238893,1429 238894,1274 238895,1201 238896,919 238897,3474 238898,623 238899,1019 238900,1756 238901,278 238902,44743 238903,726 238904,68 238905,172621 238906,615 238907,1102 238908,3695 238909,1939 238910,1294 238911,1452 238912,1849 238913,2424 238914,1381 238915,1608 238916,1132 238917,622 238918,104 238919,5405 238921,694 238922,238923 238925,189839 238927,179170 238929,31073 238930,292 238931,493 238932,439 238932,1559 238933,56 238934,422 238935,1572 238936,779 238937,149 238939,794 238940,312 238941,302 238942,1385 238943,333 238944,1212 238945,1860 238946,1858 238947,130 238948,83 238949,467 238950,1860 238951,1858 238952,557 238953,1298 238954,435 238955,151 238956,4060 238957,379 238958,278 238958,1151 238960,1181 238961,87 238961,217 238961,312 238961,509 238961,510 238961,595 238961,697 238961,1151 238961,1368 238961,1453 238961,3538 238962,1858 238963,1860 238964,200 238965,179170 238966,1014 238967,1014 238968,179170 238969,1014 238970,515 238971,1014 238972,1014 238973,328 238974,340 238975,255 238976,843 238977,2812 238979,179170 238980,138686 238981,1010 238982,175 238983,1801 238984,296 238985,179170 238986,1655 238986,92476 238989,179170 238990,179170 238991,179170 238992,843 238993,179170 238994,179170 238996,261 238996,332 238996,622 238996,1240 238999,255 239000,893 239001,215 239002,671 239003,151 239004,240 239005,920 239006,4611 239007,299 239008,491 239009,44 239010,10 239011,918 239012,918 239012,1160 239013,179170 239014,179170 239015,1253 239015,2995 239016,772 239017,1 239018,179170 239019,994 239020,207 239021,179170 239025,179170 239028,493 239028,1266 239031,1014 239032,138686 239033,175 239035,557 239038,252 239038,1220 239039,154408 239041,55849 239042,55849 239043,55849 239044,1882 239047,631 239048,2620 239049,2266 239050,217 239051,4637 239052,2421 239053,30 239054,3695 239055,3538 239057,179170 239058,239059 239060,35486 239061,22 239062,179170 239063,56 239064,422 239065,781 239066,1132 239067,809 239068,7092 239069,30 239070,1381 239071,932 239072,179170 239073,179170 239075,862 239077,278 239078,1181 239079,1220 239080,1220 239081,252 239082,251 239083,2373 239084,30 239085,30236 239086,1370 239087,179170 239088,557 239089,138 239090,865 239091,557 239092,137 239093,1326 239094,408 239095,102 239096,1323 239097,88820 239098,843 239099,346 239100,104 239100,225 239101,167 239102,3695 239103,179170 239104,239105 239107,994 239108,1133 239109,239110 239109,242793 239111,872 239112,239113 239114,239115 239116,1285 239117,1566 239118,332 239119,179170 239120,1566 239121,1515 239122,302 239123,111 239124,239125 239126,239125 239127,239128 239129,239130 239131,861 239132,392 239132,1363 239133,179170 239134,525 239135,3507 239136,1309 239137,3623 239138,179170 239139,1888 239140,1285 239141,1298 239142,179170 239143,1858 239144,1860 239145,1294 239145,1590 239146,137 239147,30 239148,455 239149,631 239150,215 239151,179170 239152,1010 239152,1522 239154,294 239155,179170 239156,239157 239158,239159 239160,138686 239161,175 239162,179170 239163,346 239164,147123 239165,147123 239166,1414 239167,10 239168,467 239168,868 239168,148742 239169,577 239170,171 239171,3582 239172,220816 239173,239174 239175,220816 239176,138686 239177,175 239178,220816 239179,179170 239180,15573 239181,7652 239182,179170 239183,4355 239184,179170 239185,250 239185,1684 239186,285 239187,285 239188,250 239188,1684 239189,239190 239191,1181 239192,220816 239193,784 239194,272 239195,239196 239197,1608 239198,220816 239199,239200 239201,207 239202,439 239202,563 239202,2367 239203,220816 239204,2379 239205,56 239206,422 239207,48 239208,3467 239209,720 239209,877 239209,907 239209,1732 239209,1882 239209,1955 239209,2191 239209,3422 239209,142870 239210,862 239210,1001 239211,8270 239212,1531 239213,1515 239214,220816 239215,483 239217,272 239217,980 239217,15573 239218,267 239219,225 239220,220816 239221,557 239222,4597 239223,240 239224,7358 239224,7363 239225,491 239226,8884 239228,239229 239230,2244 239231,1085 239232,179170 239233,2590 239234,1849 239235,137 239236,328 239237,431 239237,1252 239237,1253 239237,2224 239238,151 239239,8270 239240,30 239241,717 239241,784 239242,151 239243,1634 239244,714 239245,1238 239246,285 239247,83 239248,366 239249,366 239250,366 239251,366 239252,269 239253,366 239254,366 239255,366 239256,134 239257,589 239258,366 239259,6682 239260,239261 239262,30 239263,30 239264,151 239265,479 239266,3999 239267,333 239268,179170 239269,333 239270,239271 239274,178 239275,8270 239275,72439 239276,8180 239277,151 239278,269 239279,179170 239280,151 239281,795 239283,1298 239284,5343 239285,874 239286,336 239287,697 239287,1769 239288,874 239289,179170 239290,1019 239291,30 239292,211 239292,366 239292,500 239292,718 239292,1566 239292,2668 239293,35486 239294,179170 239296,1102 239297,30 239298,179170 239299,349 239301,2244 239302,292 239303,292 239305,58 239306,779 239307,4192 239307,4193 239310,349 239311,1837 239312,309 239312,310 239313,30 239314,3 239315,349 239316,515 239317,30 239318,58 239319,239320 239321,455 239322,422 239323,422 239324,422 239325,422 239326,422 239327,422 239328,422 239329,422 239330,1983 239331,83 239333,779 239334,994 239335,179170 239336,8180 239337,200 239338,239339 239340,1634 239342,30 239343,142870 239344,1983 239345,393 239346,240 239346,264 239346,1805 239346,17309 239347,424 239348,1634 239349,1515 239350,55849 239351,83 239352,1381 239353,918 239353,1160 239354,178 239355,83 239356,83 239357,1181 239359,4237 239359,182162 239360,1284 239360,148742 239361,200 239362,779 239363,55849 239364,179170 239365,805 239366,1454 239367,515 239368,592 239369,179170 239370,430 239371,302 239372,430 239373,44 239374,4597 239375,239376 239378,179170 239379,149 239380,255 239381,424 239382,179170 239383,30 239385,918 239386,1359 239387,4597 239388,179170 239389,595 239389,1572 239390,179170 239391,811 239392,1359 239393,795 239394,430 239395,158 239395,301 239395,615 239395,779 239395,8907 239396,932 239397,1359 239398,1151 239399,179170 239400,510 239401,1181 239402,151 239403,30 239404,483 239405,179170 239406,1381 239408,192 239409,179170 239410,56 239411,422 239412,1359 239413,2607 239414,1983 239415,1238 239416,1608 239417,1326 239418,102 239419,1323 239420,408 239421,422 239422,56 239423,1149 239424,1181 239425,220816 239426,275 239427,6068 239428,714 239428,4193 239429,272 239429,590 239430,862 239431,23701 239432,211 239433,333 239434,220816 239435,220816 239436,227669 239438,220816 239439,994 239440,872 239441,220816 239442,1479 239443,2460 239444,390 239445,2995 239446,220816 239447,1983 239448,220816 239449,179170 239450,220816 239451,179170 239452,220816 239453,8180 239454,994 239455,2048 239456,30 239457,1227 239457,86416 239458,707 239461,275 239462,37088 239463,179170 239464,179170 239465,158 239467,1068 239468,239469 239470,1707 239471,179170 239472,179170 239473,285 239474,344 239475,107 239476,1298 239477,994 239478,994 239479,309 239479,310 239481,151 239482,1181 239483,1181 239484,366 239485,366 239486,366 239487,366 239488,366 239489,366 239490,151 239492,1983 239494,178 239495,1381 239496,1796 239498,285 239499,406 239500,795 239501,83 239502,1 239503,8270 239504,2146 239505,1531 239507,273 239508,151 239509,1773 239510,1927 239511,994 239512,107 239513,2416 239513,2417 239514,292 239515,239516 239517,338 239518,298 239519,1133 239520,3538 239521,34 239521,35 239521,200 239521,215 239521,392 239521,1033 239521,1715 239521,1805 239521,1882 239521,4192 239521,4193 239521,5547 239521,8822 239522,366 239523,994 239525,20359 239525,72439 239526,255 239527,8992 239528,239529 239530,35486 239531,179170 239532,590 239532,2266 239533,714 239534,34 239534,671 239535,1010 239536,83 239537,1983 239538,1773 239539,81070 239540,344 239541,285 239542,994 239543,34 239543,35 239544,994 239545,143287 239546,1102 239547,707 239548,60576 239549,1381 239550,994 239551,1891 239551,20535 239552,137 239553,1515 239554,346 239556,795 239557,406 239558,994 239559,233 239560,875 239561,30 239562,151 239563,171 239564,1298 239565,30 239566,34 239566,35 239566,104 239566,1368 239567,1132 239568,781 239569,200 239570,349 239571,104 239572,366 239573,32 239574,795 239575,8270 239577,707 239578,30 239579,4078 239580,1634 239581,1634 239582,239583 239584,56 239585,422 239586,1119 239587,657 239588,2719 239589,346 239590,44 239591,1160 239592,34 239592,35 239593,1181 239594,239595 239596,239597 239598,1181 239599,349 239600,346 239601,149 239602,255 239603,30 239604,30 239605,483 239606,918 239607,841 239608,19 239609,159365 239610,30 239611,779 239612,30 239613,1033 239614,138686 239615,175 239616,1590 239617,1102 239618,1102 239619,10 239620,994 239621,58 239622,46 239623,58 239624,46 239625,994 239626,1102 239627,2017 239627,4193 239627,94134 239628,859 239628,182162 239629,18726 239630,1276 239631,68 239632,1773 239633,336 239634,1983 239635,138686 239636,175 239637,3623 239638,3623 239639,366 239640,62686 239641,30 239642,366 239643,433 239644,30 239645,2116 239646,707 239647,179170 239648,30 239649,179170 239650,1531 239651,30 239652,30 239653,557 239654,557 239655,557 239656,1983 239657,818 239658,30 239660,1837 239661,707 239662,491 239663,1849 239664,56 239665,422 239666,179170 239668,779 239670,56 239671,422 239672,30 239673,433 239674,861 239675,994 239676,5405 239677,255 239678,239679 239680,795 239681,1016 239682,1773 239683,389 239684,30 239685,392 239686,65 239687,56 239688,422 239689,179170 239690,994 239691,138686 239693,175 239694,17309 239695,2292 239696,151 239697,779 239698,30 239699,285 239700,1608 239701,1773 239702,184 239703,195 239704,179170 239705,714 239706,179170 239707,239708 239709,589 239710,239711 239712,28755 239712,72439 239713,536 239714,1102 239715,239716 239717,179170 239718,366 239719,1227 239719,86416 239721,142473 239722,292 239723,239724 239725,294 239726,841 239727,296 239728,298 239729,179170 239730,8991 239731,179170 239732,4475 239733,3804 239734,119 239735,179170 239736,179170 239737,707 239738,30 239739,1368 239740,30 239741,5405 239742,200 239743,179170 239744,1634 239745,390 239746,239747 239748,1181 239749,31977 239750,239751 239752,1707 239753,920 239754,994 239754,1432 239754,2088 239754,2674 239754,4571 239754,154690 239755,1127 239755,1893 239756,179170 239757,111 239757,289 239757,94134 239758,1247 239758,164572 239759,1247 239759,164572 239760,1247 239760,164572 239761,1309 239762,83 239763,1531 239764,30 239765,366 239766,433 239767,5343 239768,577 239770,60576 239771,97 239772,30 239774,120 239775,1151 239775,4193 239776,762 239776,124668 239776,171641 239776,187176 239776,227669 239777,34 239777,671 239778,8373 239779,491 239780,640 239781,640 239782,640 239783,640 239784,779 239785,640 239786,640 239787,827 239788,302 239788,2116 239789,779 239790,179170 239791,187176 239792,55849 239793,346 239794,171 239795,2620 239796,35486 239797,239798 239799,158 239799,1181 239800,346 239801,671 239802,3 239803,247 239803,516 239804,920 239805,875 239806,104 239807,14126 239808,875 239809,827 239811,794 239812,422 239813,422 239814,422 239815,422 239816,422 239817,422 239818,422 239819,422 239820,422 239821,718 239822,179170 239823,422 239824,138686 239825,422 239826,175 239827,58 239828,994 239829,46 239830,408 239831,3623 239832,717 239833,236180 239834,1849 239835,179170 239836,980 239838,996 239839,239840 239841,1882 239842,781 239843,1132 239844,1359 239845,392 239846,1634 239847,1368 239848,383 239849,30 239851,301 239851,417 239851,1010 239851,1635 239852,1238 239853,252 239854,1220 239855,251 239856,179170 239857,179170 239858,1452 239859,1359 239860,2750 239861,781 239862,1132 239863,148742 239864,781 239865,1132 239867,875 239868,392 239869,772 239870,1326 239871,392 239872,278 239873,781 239874,1132 239875,349 239876,9457 239877,179170 239878,818 239879,204093 239880,1634 239881,1238 239882,83 239884,1359 239885,841 239886,2620 239887,875 239888,366 239889,631 239890,8270 239891,1007 239892,1345 239893,269 239894,1983 239895,1 239896,577 239897,146 239897,92476 239899,1882 239900,422 239901,56 239902,2244 239903,15179 239904,1634 239906,467 239907,843 239908,138686 239912,843 239913,535 239913,663 239915,167 239915,301 239915,1284 239916,1707 239917,30 239918,626 239919,1359 239920,236180 239921,779 239922,149 239923,302 239924,6059 239925,671 239926,30 239927,239928 239929,272 239930,8308 239931,202 239932,7416 239933,2244 239934,1284 239934,148742 239935,388 239937,79 239939,217 239940,179170 239941,3695 239942,1893 239943,146 239943,285 239943,406 239943,1655 239943,92476 239944,44 239945,147 239946,179170 239949,779 239949,2931 239949,8270 239950,302 239951,73570 239952,5265 239953,1085 239954,1227 239954,86416 239955,439 239956,1007 239957,184 239958,239959 239960,592 239961,30 239962,217 239963,79 239964,179170 239966,805 239967,146 239967,158 239967,92476 239968,148742 239969,193661 239970,19443 239972,392 239973,697 239974,4760 239975,1860 239976,6955 239977,3612 239978,6059 239979,595 239980,5658 239981,2274 239982,4252 239983,623 239984,577 239984,859 239985,1359 239986,760 239986,1631 239987,485 239988,298 239989,30 239990,138686 239991,175 239992,103860 239993,302 239994,439 239995,3296 239996,875 239997,861 239998,515 239999,563 240000,1181 240001,1087 240002,1359 240004,994 240005,236180 240006,14483 240007,435 240008,994 240009,200 240010,117163 240011,1417 240012,1132 240013,781 240014,302 240015,843 240016,149 240017,1274 240019,240020 240021,3585 240022,83 240023,592 240024,44 240025,23783 240026,2373 240027,138686 240028,175 240029,30 240030,68 240031,852 240032,273 240033,1019 240034,636 240035,779 240036,360 240037,55849 240038,259 240038,272 240038,4611 240039,202 240040,255 240042,304 240043,1274 240043,2646 240044,148742 240045,452 240045,1266 240046,8180 240047,873 240049,918 240050,2205 240050,33424 240050,245910 240051,918 240051,1160 240052,1 240052,147 240053,30 240054,104 240055,149534 240056,143287 240058,996 240058,1388 240059,142426 240060,1837 240061,179170 240062,309 240062,310 240064,79 240065,220816 240066,1181 240068,83 240069,302 240070,994 240071,179170 240072,179170 240073,393 240073,590 240074,54 240075,994 240076,994 240077,994 240078,179170 240079,994 240080,491 240081,775 240082,333 240082,980 240082,15573 240083,179170 240085,640 240086,30 240087,30 240088,483 240089,1458 240090,146 240090,92476 240091,55849 240092,220816 240093,202 240094,697 240095,1132 240096,781 240097,3260 240098,841 240099,389 240100,7155 240101,179170 240102,781 240103,1132 240104,2411 240105,30 240106,220816 240107,491 240108,1033 240110,30 240111,994 240112,932 240113,151 240114,95554 240115,220816 240116,35486 240117,781 240118,1132 240119,795 240120,220816 240121,1007 240122,459 240123,7092 240124,1608 240125,1893 240126,1801 240127,220816 240128,1001 240129,631 240130,2782 240131,72 240132,35486 240133,366 240134,8855 240135,1188 240136,366 240137,8854 240138,55849 240139,1326 240140,102 240141,1323 240142,408 240143,536 240144,3582 240145,707 240146,220816 240147,30 240148,636 240149,278 240150,1962 240151,424 240152,220816 240153,247 240154,2205 240154,33424 240155,30 240156,220816 240157,1192 240157,4165 240158,2266 240159,179170 240160,309 240160,310 240161,142870 240162,220816 240163,179170 240164,485 240165,298 240166,4810 240167,220816 240168,4192 240168,4193 240169,240170 240171,3507 240172,220816 240173,1058 240173,1796 240174,99 240174,158 240174,3895 240174,244874 240175,179170 240176,220816 240177,2620 240178,2244 240179,179170 240180,179170 240181,148742 240182,220816 240183,422 240184,932 240185,704 240186,1282 240187,3 240188,283 240189,179170 240190,6955 240191,217 240192,220816 240193,30 240194,220816 240195,2296 240196,179170 240197,326 240198,30 240199,356 240200,179170 240201,220816 240202,1801 240203,1955 240204,1227 240204,86416 240205,30 240206,1544 240207,760 240208,30 240209,994 240210,220816 240211,247 240212,372 240213,63 240214,1368 240215,30 240216,2744 240217,151 240218,1227 240218,86416 240219,1132 240220,781 240221,220816 240222,30 240224,781 240225,1132 240226,1844 240227,220816 240228,330 240229,255 240230,217 240230,1133 240230,1522 240231,994 240232,138686 240233,175 240234,178 240234,333 240235,424 240236,707 240237,220816 240238,779 240239,179170 240240,179170 240241,668 240242,285 240243,344 240244,179170 240245,7416 240246,516 240247,920 240248,704 240249,179170 240250,3804 240251,217 240252,779 240253,366 240254,200 240255,30 240256,247 240257,636 240258,195 240258,27217 240259,179170 240260,179170 240261,179170 240262,179170 240263,134 240264,195 240265,2626 240266,220816 240267,255 240268,269 240269,900 240270,147 240271,220816 240272,179170 240273,795 240274,240275 240276,151 240277,138686 240278,175 240279,56 240280,422 240281,63 240282,117163 240283,192 240284,581 240285,240286 240287,1102 240288,20359 240289,346 240290,563 240291,920 240292,220816 240293,366 240294,417 240295,285 240296,298 240297,8501 240298,920 240299,220816 240301,872 240302,795 240303,107 240304,220816 240305,2266 240306,77 240307,1368 240308,1181 240309,1085 240310,1381 240311,285 240312,328 240313,388 240314,30 240316,167 240317,2424 240318,220816 240319,222 240320,697 240320,1769 240321,1572 240322,7155 240323,240324 240323,240857 240325,4192 240325,4193 240326,301 240327,240328 240329,240330 240331,1821 240331,21736 240332,596 240333,333 240335,13980 240336,626 240337,932 240338,255 240339,10 240340,179170 240341,179170 240342,240343 240345,2274 240346,1151 240347,1210 240348,6068 240349,307 240349,7124 240352,178 240352,15179 240353,1 240354,1247 240354,164572 240355,15179 240356,179170 240357,818 240358,1860 240359,1858 240360,240361 240362,1210 240363,6303 240364,1118 240365,491 240366,640 240367,640 240368,640 240369,240 240370,640 240371,640 240372,640 240373,273 240373,422 240373,136072 240374,644 240375,346 240376,2995 240377,2266 240378,346 240379,1014 240380,349 240381,344 240382,285 240384,2590 240385,1962 240386,346 240387,41 240388,2315 240389,809 240390,360 240390,1893 240391,147 240392,30 240393,35486 240395,439 240396,120 240397,289 240397,94134 240398,1949 240399,34 240399,35 240400,20257 240401,852 240402,920 240403,818 240404,252 240405,1220 240406,251 240407,1571 240408,55849 240409,346 240410,1132 240411,781 240412,835 240413,10 240413,113156 240414,379 240415,30 240416,509 240417,206 240418,1257 240419,34 240419,35 240420,781 240421,1132 240422,1231 240423,189839 240424,954 240424,10318 240425,217 240426,1 240427,124668 240428,1782 240429,932 240430,366 240431,433 240432,73570 240433,5366 240434,1608 240435,55849 240436,500 240437,366 240438,843 240439,151 240440,83 240441,781 240442,1132 240443,779 240444,1927 240445,138 240446,872 240447,994 240448,50 240448,147 240448,406 240448,779 240449,1001 240450,179170 240451,252 240452,1220 240453,251 240454,433 240455,81 240456,192 240457,124668 240458,179170 240459,1132 240460,1454 240461,138686 240462,175 240463,285 240464,344 240465,994 240466,302 240467,301 240468,422 240469,56 240470,158 240471,779 240472,631 240473,83 240474,136 240474,137 240475,1085 240476,704 240476,852 240477,2312 240478,333 240479,994 240480,3623 240481,5718 240482,1400 240483,3623 240484,175 240485,149 240486,442 240488,179170 240489,87 240490,3623 240491,240492 240493,1181 240494,640 240495,932 240495,968 240495,1010 240496,3623 240497,227669 240498,142870 240499,3623 240501,10 240502,179170 240503,302 240504,1014 240505,1014 240506,1014 240508,1014 240509,179170 240510,1014 240511,467 240512,636 240513,3623 240514,720 240515,509 240516,442 240517,7092 240518,3623 240519,200 240520,248 240521,200 240522,179170 240523,179170 240524,515 240525,179170 240526,714 240526,2205 240526,33424 240527,179170 240528,344 240529,285 240530,3623 240531,6556 240532,818 240533,120 240534,8270 240535,30 240537,30 240538,206 240539,1832 240540,48 240541,30 240542,30 240543,30 240544,56 240545,422 240546,200 240547,138686 240548,272 240549,175 240550,3623 240551,273 240552,193129 240553,801 240554,3623 240555,781 240556,1132 240557,147 240558,23783 240559,811 240560,79 240561,179170 240562,3507 240563,1893 240564,875 240565,142405 240566,1749 240567,255 240568,55849 240569,1282 240570,151 240571,179170 240572,83 240573,1608 240574,206 240575,179170 240576,994 240577,918 240578,151 240579,30 240580,447 240581,2775 240582,44 240583,3623 240584,1127 240585,932 240586,179170 240587,557 240588,392 240589,30 240591,83 240592,337 240592,15573 240593,179170 240594,30 240595,1860 240596,1858 240597,30 240598,278 240599,220816 240600,483 240601,30 240602,2923 240603,220816 240604,30 240605,30 240607,222 240608,179170 240609,9030 240610,1287 240611,818 240612,179170 240613,83 240614,1773 240614,142870 240615,697 240616,13919 240617,850 240618,179170 240619,149 240620,48 240621,55849 240622,55849 240623,392 240625,200 240627,861 240628,1102 240629,34 240629,671 240630,590 240630,2995 240631,4193 240631,8373 240632,71 240633,850 240634,406 240635,4 240635,5 240635,104 240635,805 240635,861 240635,1212 240635,2105 240636,200 240637,58 240638,994 240639,46 240640,179170 240641,179170 240642,179170 240643,264 240644,7092 240646,179170 240647,309 240647,310 240648,142870 240649,83 240650,179170 240651,1243 240652,179170 240653,179170 240654,30 240655,35486 240656,179170 240657,278 240658,289 240658,94134 240659,83 240660,278 240661,2646 240662,5101 240664,86416 240665,1014 240666,1844 240667,1385 240668,192 240669,179170 240670,515 240672,83 240673,30 240674,179170 240675,179170 240676,435 240677,30 240678,179170 240679,179170 240680,697 240681,264 240682,179170 240683,1707 240684,406 240685,4545 240685,56150 240686,179170 240687,30 240688,179170 240689,1238 240690,179170 240691,707 240692,843 240693,72764 240694,1452 240695,252 240695,1385 240696,154408 240697,154408 240698,217 240699,433 240700,1252 240701,1085 240702,707 240703,179170 240704,1796 240705,615 240706,9025 240707,179170 240708,417 240709,2367 240710,240711 240712,30 240713,623 240713,1805 240714,1877 240715,179170 240716,1243 240717,30 240718,30 240719,424 240720,3623 240721,707 240722,179170 240723,390 240724,4597 240725,285 240726,250 240726,1684 240727,99 240728,994 240729,707 240730,151 240731,1132 240732,2367 240733,179170 240734,1556 240735,147 240736,240737 240738,179170 240739,236180 240740,1235 240740,1335 240741,179170 240742,577 240743,1253 240743,2617 240744,424 240745,2779 240746,137 240747,3413 240748,83 240749,707 240750,264 240751,592 240752,1363 240753,63 240754,2373 240755,1181 240756,272 240757,211 240758,333 240759,195 240760,3623 240761,240762 240763,179170 240764,179170 240765,179170 240766,99 240767,313 240768,313 240769,1522 240769,2083 240769,5301 240770,1821 240770,21736 240771,663 240772,179170 240773,179170 240774,220816 240775,220816 240776,298 240777,220816 240778,220816 240779,179170 240780,240 240781,31977 240782,179170 240783,220816 240784,179170 240785,247 240785,2867 240785,2868 240786,222 240787,149 240788,220816 240789,179170 240790,772 240790,2146 240790,3297 240791,818 240792,285 240793,588 240793,590 240793,1419 240794,2750 240795,1227 240795,86416 240796,220816 240797,151 240798,220816 240799,240 240800,433 240800,809 240801,220816 240802,137 240803,30 240804,220816 240805,795 240806,220816 240807,220816 240808,818 240809,4 240809,5 240809,355 240809,704 240810,1 240811,818 240812,202 240813,14366 240815,1634 240816,272 240817,171 240819,267 240820,795 240821,240822 240821,242970 240821,256127 240821,261387 240821,264086 240823,137 240824,366 240825,179170 240826,366 240827,179170 240828,366 240829,8270 240830,310 240830,224488 240831,220816 240832,44 240833,240834 240835,220816 240836,5265 240837,615 240838,63 240838,202 240838,247 240838,516 240839,714 240840,34 240840,1151 240841,4193 240841,8373 240842,160 240843,240844 240845,179170 240846,179170 240847,179170 240848,269 240849,220816 240850,240851 240852,138686 240853,175 240854,240855 240858,8270 240859,1607 240861,220816 240862,1096 240863,805 240864,233 240865,1326 240866,875 240868,4611 240871,781 240872,1132 240873,220816 240874,6424 240875,745 240877,147 240878,406 240879,30 240880,994 240881,1224 240882,179170 240883,179170 240884,1085 240885,340 240886,1359 240887,640 240888,640 240889,795 240889,193129 240890,640 240891,640 240892,1181 240893,104 240894,640 240895,657 240896,8270 240897,220816 240898,179170 240900,356 240900,2590 240901,707 240903,422 240904,56 240905,422 240906,422 240907,422 240908,422 240910,422 240911,422 240912,422 240913,493 240914,1132 240915,1608 240916,422 240917,422 240918,422 240919,422 240920,1608 240921,1132 240922,30 240923,138686 240924,175 240925,3258 240927,35486 240928,1608 240929,1132 240930,579 240931,264 240932,422 240933,707 240934,30 240935,1241 240937,1132 240938,1608 240939,920 240941,217 240942,577 240943,3756 240944,3623 240945,1019 240946,301 240946,615 240946,968 240946,1293 240946,1300 240946,1782 240946,2217 240946,2595 240946,3422 240946,3756 240946,42598 240946,83493 240946,84160 240946,227376 240947,1132 240948,1608 240950,147 240951,179170 240952,1132 240953,1608 240954,707 240955,356 240956,360 240957,1132 240958,1608 240959,360 240960,707 240961,1608 240962,1132 240963,1860 240964,1858 240965,1608 240966,1132 240967,707 240968,1274 240969,1608 240970,1132 240971,1238 240972,71 240973,73570 240974,2553 240975,1132 240976,1608 240977,7358 240977,7363 240978,179170 240979,179170 240980,1608 240981,1132 240982,1132 240983,1608 240984,3094 240985,179170 240986,2701 240987,1608 240988,1132 240989,240990 240991,1452 240992,60576 240993,932 240994,707 240995,379 240995,536 240995,694 240996,389 240997,1167 240998,179170 240999,1858 241000,1860 241001,500 241002,366 241003,491 241004,106 241004,586 241004,17772 241006,707 241008,2590 241009,8270 241010,1359 241011,179170 241012,158 241013,1160 241014,252 241015,1220 241016,707 241018,179170 241019,1644 241020,360 241021,1805 241021,8177 241022,240 241023,217 241024,83 241025,1363 241026,217 241027,55849 241028,217 241029,707 241031,60576 241032,707 241033,302 241034,703 241035,83 241036,760 241037,179170 241038,1188 241039,233 241040,22 241040,211 241041,707 241042,269 241044,2620 241044,124668 241045,2590 241046,875 241047,56 241048,422 241049,1707 241050,202 241051,992 241052,241053 241054,360 241055,30 241056,83 241057,187176 241058,1012 241059,1140 241061,999 241062,1983 241063,3623 241064,500 241064,663 241065,671 241066,1127 241067,1888 241068,875 241069,79 241070,704 241071,3769 241072,707 241073,647 241074,1392 241075,994 241076,704 241078,3623 241079,315 241080,447 241081,2775 241082,994 241083,252 241083,1385 241084,136 241085,843 241087,206 241088,22580 241089,875 241090,388 241092,179170 241093,479 241094,3623 241095,875 241096,22580 241097,215276 241098,49057 241100,714 241101,590 241101,2266 241102,8373 241104,179170 241105,302 241106,1707 241107,462 241108,102 241109,779 241109,141912 241110,137 241111,707 241112,634 241112,852 241113,1353 241114,261 241114,805 241115,1608 241116,1132 241117,1181 241118,200 241119,264 241120,179170 241121,264 241122,1608 241123,1132 241124,491 241125,58 241126,994 241127,46 241128,3623 241129,171 241130,7572 241131,1962 241132,179170 241133,138686 241134,175 241135,179170 241136,333 241137,179170 241138,809 241139,179170 241140,893 241142,2045 241143,694 241144,179170 241145,1927 241147,146 241147,92476 241148,179170 241149,222 241149,536 241149,657 241150,3623 241151,875 241152,104 241152,557 241152,953 241152,954 241152,5405 241153,179170 241154,179170 241156,1085 241157,179170 241158,3695 241159,827 241160,406 241162,1231 241164,79 241165,406 241166,179170 241167,818 241168,146 241168,92476 241169,647 241170,146 241170,92476 241171,344 241172,344 241173,647 241174,1085 241175,83 241176,4455 241177,422 241178,56 241179,1353 241180,102 241181,852 241182,493 241183,99 241184,392 241185,850 241186,252 241187,1220 241188,251 241189,149 241190,1659 241191,211 241192,255 241194,142426 241195,179170 241196,252 241197,1220 241198,251 241199,467 241199,1033 241199,127158 241200,2436 241201,241202 241204,83 241205,179170 241206,312 241207,779 241208,934 241208,1449 241209,255 241210,805 241211,1452 241212,1893 241213,1789 241214,1983 241215,48 241216,56 241217,422 241218,146 241218,92476 241219,1882 241221,2083 241222,1001 241223,1782 241224,893 241225,179170 241226,179170 241227,406 241228,104 241229,1116 241230,8541 241231,707 241232,1132 241233,3623 241234,44 241235,1860 241236,1858 241237,160 241238,200 241239,179170 241240,179170 241241,179170 241242,220816 241243,223568 241244,2168 241245,179170 241246,515 241247,596 241248,406 241249,302 241250,179170 241251,483 241252,179170 241253,22 241254,2373 241255,1556 241256,2620 241257,146 241257,92476 241258,1381 241259,179170 241260,220816 241261,818 241262,309 241262,310 241263,389 241264,151 241265,179170 241266,447 241266,538 241266,1294 241267,349 241268,3 241269,3 241270,1332 241271,8854 241272,302 241272,63471 241273,3804 241275,920 241276,7092 241277,202 241278,179170 241279,179170 241280,58 241281,994 241282,46 241283,392 241284,7124 241285,220816 241286,932 241287,248 241288,366 241289,184 241289,1556 241290,302 241291,455 241292,34 241292,35 241293,364 241294,278 241295,557 241296,14126 241297,30 241298,252 241299,795 241300,77 241301,379 241302,217 241303,5906 241304,557 241305,626 241306,278 241307,137 241308,862 241309,1608 241310,1556 241311,151 241312,1181 241313,1326 241314,1323 241315,102 241316,408 241317,120 241317,704 241317,868 241317,1140 241317,73570 241317,148742 241318,406 241319,283 241320,875 241321,179170 241322,179170 241323,179170 241324,366 241325,179170 241326,605 241327,760 241328,241328 241329,1509 241330,310 241330,224488 241331,861 241332,9029 241333,875 241334,1381 241335,1332 241335,1955 241337,920 241338,1474 241339,875 241340,673 241341,875 241342,241343 241344,217 241344,779 241344,872 241344,1370 241345,55849 241346,55849 241347,55849 241348,491 241349,55849 241350,151 241351,30 241352,994 241354,349 241354,3260 241355,55849 241356,1634 241357,113156 241358,779 241359,227 241360,179170 241361,83 241362,241363 241364,30 241365,636 241366,179170 241367,2646 241368,450 241369,255 241370,179170 241371,1968 241372,563 241373,563 241374,220816 241375,1509 241376,179170 241377,1844 241378,392 241379,142405 241379,142870 241380,147 241381,220816 241382,138686 241383,175 241384,179170 241385,220816 241386,206 241387,179170 241388,179170 241389,138686 241390,1359 241391,206 241393,1849 241394,241395 241397,994 241398,1623 241399,241400 241401,151 241402,994 241403,54 241404,1007 241405,179170 241406,220816 241407,220816 241408,516 241409,563 241410,535 241411,1381 241412,241413 241414,151 241415,8270 241416,305 241417,323 241418,220816 241419,875 241420,3623 241422,220816 241423,220816 241424,10 241425,220816 241426,285 241427,250 241427,1684 241428,779 241429,179170 241430,30 241431,1181 241432,86 241433,179170 241434,920 241435,918 241436,241437 241438,1 241439,1849 241440,577 241441,406 241442,241443 241444,179170 241445,920 241446,1127 241447,994 241448,3138 241450,179170 241451,5662 241452,3138 241453,179170 241454,179170 241455,220816 241456,422 241457,179170 241458,649 241460,718 241461,1368 241462,179170 241463,2116 241464,515 241465,195 241465,74719 241466,366 241467,366 241468,366 241469,285 241470,366 241471,671 241472,220816 241473,220816 241474,241475 241476,220816 241477,138686 241478,175 241479,861 241480,147 241481,179170 241482,37 241483,5265 241484,241485 241486,2590 241487,408 241488,431 241488,589 241488,631 241488,1001 241488,1474 241488,2590 241488,8884 241488,44725 241489,220816 241490,34 241490,35 241491,392 241494,784 241496,1805 241497,1033 241498,179170 241499,302 241501,1381 241502,140 241503,30 241505,784 241507,217 241507,222 241508,35486 241509,392 241510,179170 241511,1293 241514,2526 241515,872 241516,6661 241518,1429 241519,911 241520,805 241520,1353 241522,179170 241523,1556 241524,366 241525,220816 241526,19010 241527,387 241528,4190 241529,220816 241530,640 241531,640 241532,301 241533,1235 241533,1335 241536,178 241536,442 241537,241538 241539,1707 241540,628 241541,422 241542,422 241543,422 241544,422 241545,422 241546,422 241547,422 241548,302 241549,422 241550,422 241551,333 241552,422 241555,35486 241556,30 241557,147 241557,149 241559,1252 241559,1253 241561,1402 241562,328 241563,781 241564,1132 241565,149 241566,781 241567,1132 241568,422 241569,1238 241570,302 241571,220816 241572,179170 241574,1452 241575,63471 241576,1707 241577,220816 241578,994 241579,1893 241580,1181 241581,668 241582,301 241583,344 241584,285 241586,843 241587,1608 241588,1132 241589,1326 241590,207 241591,493 241592,994 241593,843 241594,167 241594,289 241594,309 241594,310 241594,577 241594,590 241594,1181 241594,1462 241594,1509 241594,2209 241594,2991 241594,3804 241594,56150 241594,94134 241595,994 241596,1882 241597,3094 241598,309 241598,310 241599,285 241600,344 241601,852 241602,852 241603,301 241603,3804 241604,17309 241605,707 241606,143 241607,312 241608,994 241610,781 241611,1132 241612,389 241613,1707 241614,338 241614,1707 241615,241616 241617,1132 241618,1608 241619,220816 241620,192 241621,875 241622,3623 241623,875 241624,577 241625,83 241626,4 241626,5 241627,179170 241628,30 241629,994 241630,151 241630,202 241631,259 241632,781 241633,1132 241634,422 241634,5405 241636,875 241638,862 241639,227669 241640,694 241641,264 241641,5440 241642,781 241643,1132 241644,200 241645,30 241646,592 241647,1326 241648,366 241649,781 241650,1132 241651,179170 241652,241653 241654,657 241656,994 241657,1313 241659,994 241661,1849 241662,141912 241663,1860 241664,1858 241665,515 241666,1052 241667,1893 241668,515 241669,1860 241670,1858 241671,1052 241672,872 241673,515 241674,652 241676,1860 241677,994 241679,720 241681,447 241682,151 241683,1132 241684,781 241685,516 241686,781 241687,1132 241688,83 241689,2045 241691,313 241692,1893 241693,217 241695,2353 241696,79 241699,1001 241700,1818 241701,4237 241701,182162 241702,994 241703,220816 241704,1220 241705,252 241706,251 241707,212692 241708,596 241709,1132 241710,781 241711,1132 241712,299 241714,328 241715,302 241716,179170 241717,861 241718,8270 241719,118336 241720,336 241722,602 241722,3218 241724,1860 241725,1858 241726,1133 241727,752 241728,707 241729,779 241730,200 241731,217 241732,127158 241733,137 241734,868 241735,118336 241736,34 241736,35 241737,140 241738,179170 241739,83 241741,2135 241743,1368 241744,179170 241745,192 241746,44725 241747,68 241748,179170 241750,179170 241751,179170 241752,2048 241753,179170 241754,215276 241755,491 241757,83 241758,138686 241759,175 241760,1143 241761,1359 241762,184 241763,285 241764,1425 241765,2244 241766,422 241767,89035 241768,779 241769,149 241770,192 241771,1458 241772,1010 241773,178 241774,557 241775,158 241775,206 241775,1001 241775,1801 241776,213089 241777,1323 241778,493 241779,1167 241780,30 241781,1860 241782,1858 241783,515 241784,2266 241786,1132 241787,30 241788,356 241789,142870 241790,30 241791,1359 241792,179170 241793,241794 241795,406 241796,241797 241798,1132 241799,781 241800,775 241801,1381 241802,30 241803,255 241804,1014 241805,147 241805,158 241806,994 241807,179170 241808,30 241809,292 241810,255 241811,179170 241812,1014 241813,220816 241814,1466 241815,1014 241816,179170 241817,1014 241818,151 241820,1181 241821,178 241822,220816 241823,30 241824,634 241825,148742 241826,1644 241827,118336 241828,918 241828,1160 241829,241830 241831,220816 241832,932 241833,179170 241834,861 241835,1 241836,30 241837,179170 241838,340 241839,220816 241840,220816 241841,301 241842,392 241843,918 241844,442 241845,120 241846,30 241847,179170 241849,220816 241850,179170 241851,483 241852,220816 241853,6968 241854,178 241854,1235 241855,1368 241856,4594 241857,220816 241858,30 241859,2367 241860,5366 241861,467 241861,868 241862,861 241863,179170 241864,171641 241865,56 241866,422 241867,30 241868,1332 241869,30 241870,220816 241871,875 241872,30 241873,217 241874,222 241875,220816 241876,30 241877,2784 241878,73570 241879,30 241880,1181 241881,241882 241881,261894 241883,220816 241884,220816 241885,2146 241886,289 241886,94134 241887,1235 241887,1335 241888,3623 241889,2867 241889,2868 241890,30 241891,220816 241892,1294 241893,372 241893,592 241894,433 241895,217 241896,868 241897,179170 241898,30 241899,2671 241900,536 241901,1419 241902,588 241902,590 241903,220816 241904,30 241905,2590 241906,30 241907,3623 241908,30 241909,220816 241910,30 241911,79 241912,406 241913,241914 241915,795 241916,301 241917,433 241918,435 241919,220816 241920,1363 241921,220816 241922,491 241923,34 241923,35 241924,557 241925,220816 241926,7092 241927,179170 241928,179170 241929,179170 241930,30 241931,1326 241932,102 241933,1323 241934,408 241935,4237 241935,182162 241937,843 241938,1893 241939,949 241942,10 241942,588 241942,590 241942,1419 241943,3623 241944,1284 241945,278 241946,72 241947,6303 241948,241949 241950,87 241951,577 241952,149 241953,1474 241954,2915 241955,640 241956,673 241957,811 241958,622 241958,1033 241959,336 241960,30 241961,278 241962,220816 241963,1033 241965,252 241966,1608 241967,179170 241968,179170 241969,1313 241970,103860 241971,200 241972,247 241973,247 241974,557 241975,862 241976,200 241977,6424 241978,925 241979,875 241980,781 241981,1132 241982,1634 241983,1381 241984,220816 241985,30 241986,30 241987,179170 241988,30 241989,1132 241990,781 241991,220816 241992,1184 241993,30 241994,30 241995,220816 241996,179170 241997,30 241998,743 241999,30 242000,1556 242001,30 242002,30 242003,179170 242004,30 242005,179170 242006,1801 242007,885 242007,13704 242008,1715 242009,30 242010,313 242010,623 242010,1590 242010,1644 242010,2274 242011,1181 242011,4192 242011,4193 242012,15748 242013,707 242014,220816 242015,920 242016,179170 242017,3507 242018,220816 242019,179170 242020,137 242021,424 242022,179170 242023,242024 242025,137 242026,240 242027,179170 242028,179170 242029,160 242030,242031 242032,158 242033,146 242033,92476 242034,147 242035,34 242035,35 242035,1590 242035,1644 242036,1858 242037,1860 242038,640 242039,179170 242040,640 242041,179170 242042,2373 242043,179170 242044,1411 242044,2006 242045,2116 242046,1179 242047,392 242048,179170 242049,179170 242050,155481 242051,2775 242052,447 242053,1449 242054,179170 242055,58 242056,994 242057,46 242058,84257 242059,179170 242060,179170 242061,485 242062,171 242063,179170 242064,577 242065,668 242066,179170 242067,516 242068,671 242069,1858 242070,1860 242071,138686 242072,175 242073,805 242074,1235 242074,1335 242075,1858 242076,1860 242077,516 242077,1893 242078,155481 242079,23783 242080,285 242082,1188 242084,447 242085,242086 242087,875 242088,1265 242088,1266 242089,2775 242090,447 242091,58 242091,1140 242091,1177 242092,1370 242094,294 242094,2620 242095,207 242096,1773 242097,577 242099,561 242100,2590 242101,298 242102,269 242103,215 242104,1287 242105,147385 242106,267 242107,220816 242108,1368 242109,1052 242110,872 242112,1429 242113,862 242113,2590 242114,83 242115,220816 242116,242117 242118,2674 242118,16153 242119,668 242120,850 242121,10 242122,424 242123,220816 242124,63 242125,862 242126,23782 242127,220816 242128,58 242129,994 242130,46 242131,312 242132,259 242133,417 242134,255 242135,30 242136,30 242137,30 242138,1608 242139,1132 242140,1143 242141,1608 242142,1132 242143,387 242144,875 242145,1707 242146,781 242147,1132 242148,875 242149,875 242150,1707 242151,5469 242152,179170 242153,220816 242154,179170 242155,872 242156,1252 242156,1253 242157,336 242158,220816 242159,1860 242160,1858 242161,56 242162,422 242163,872 242164,1590 242165,835 242166,707 242167,707 242168,1058 242169,1860 242170,1858 242171,148742 242172,1801 242173,1860 242174,1858 242175,302 242176,704 242178,644 242179,146 242179,92476 242180,707 242181,179170 242182,179170 242184,1858 242185,1860 242186,626 242187,73570 242188,644 242190,2671 242191,452 242192,283 242193,2416 242193,2417 242194,874 242195,10 242197,447 242198,2775 242200,220816 242201,63 242203,366 242204,422 242205,422 242206,422 242207,422 242208,422 242209,431 242210,422 242211,422 242212,242213 242214,422 242215,366 242218,366 242219,366 242220,422 242221,422 242222,35486 242223,422 242224,433 242225,640 242226,79 242228,640 242229,13980 242230,255 242231,30 242232,30 242233,192 242234,1363 242235,3623 242236,433 242237,557 242238,920 242239,30 242240,3623 242241,994 242242,5906 242243,220816 242244,875 242245,994 242246,186 242246,1566 242246,163728 242246,189950 242246,215874 242246,237573 242246,243380 242246,253191 242246,261515 242246,261808 242247,302 242247,893 242248,996 242249,493 242251,875 242252,310 242252,3039 242253,285 242255,269 242255,1265 242255,1266 242256,1860 242257,1858 242258,302 242259,932 242260,213089 242261,3623 242263,55849 242264,192 242264,422 242265,435 242265,538 242267,1749 242268,2775 242269,447 242270,991 242271,4252 242272,875 242273,301 242275,493 242276,187 242277,2266 242278,30 242279,875 242280,138686 242281,175 242282,1238 242283,217 242284,868 242286,1452 242287,1882 242288,211 242288,1001 242288,18738 242289,2784 242291,227 242292,220816 242294,518 242295,2674 242296,179170 242297,179170 242298,1359 242299,179170 242300,1659 242301,179170 242302,1467 242303,588 242303,590 242304,179170 242306,1285 242307,1749 242307,1882 242308,994 242309,240 242310,994 242311,1381 242312,875 242313,779 242314,202 242315,264 242316,1888 242317,1151 242319,994 242320,179170 242321,151 242322,179170 242323,994 242324,518 242325,1085 242326,1289 242328,179170 242329,1132 242330,1608 242331,179170 242332,1608 242333,1132 242334,875 242335,649 242336,875 242337,1313 242338,14366 242339,179170 242340,387 242341,313 242343,179170 242344,2979 242345,118336 242346,3585 242347,179170 242348,611 242348,794 242350,34 242350,35 242351,240 242352,242353 242354,872 242355,707 242356,3623 242358,242359 242360,30 242361,346 242362,30 242363,22 242364,179170 242365,1860 242366,1858 242367,3507 242368,30 242369,875 242370,875 242371,56 242372,422 242373,875 242374,1749 242375,994 242377,30 242378,1984 242380,30 242381,557 242382,120 242383,147 242385,493 242386,1844 242387,302 242387,2116 242388,358 242389,138686 242390,175 242391,179170 242392,379 242393,30 242394,30 242395,83 242396,515 242397,113156 242401,457 242402,3623 242403,783 242404,1359 242405,273 242406,179170 242407,147 242408,3999 242409,83 242410,83 242411,83 242412,167 242412,73570 242413,30 242415,2296 242416,179170 242417,179170 242418,1359 242419,22 242420,118336 242421,358 242422,6303 242423,31206 242424,206 242425,483 242427,179170 242428,255 242429,217 242430,366 242431,55849 242432,1007 242433,1298 242435,1881 242436,83 242437,115 242438,220816 242439,2979 242440,2006 242441,435 242442,179170 242443,220816 242444,918 242445,809 242446,1019 242447,1467 242448,192 242449,536 242450,83 242451,843 242452,217 242453,278 242454,536 242455,622 242456,179170 242457,148742 242458,140 242459,151 242460,179170 242461,179170 242462,200 242463,179170 242464,179170 242465,1882 242466,220816 242467,707 242468,893 242469,178 242470,220816 242471,891 242472,302 242473,2617 242475,220816 242476,1509 242477,220816 242478,657 242479,417 242480,7572 242481,8798 242484,106 242484,227 242484,364 242484,589 242484,596 242484,795 242484,1241 242484,1368 242484,1564 242484,2083 242485,3623 242486,489 242487,875 242488,875 242489,220816 242490,30 242491,242492 242493,158 242494,217 242495,1 242496,220816 242497,179170 242498,3623 242500,1590 242501,875 242502,1983 242503,328 242504,220816 242505,179170 242506,220816 242507,7092 242508,252 242509,179170 242510,3623 242511,220816 242512,179170 242513,167 242514,138686 242515,932 242516,1241 242517,1231 242518,720 242519,6068 242520,1955 242521,1522 242522,3 242523,5662 242524,2620 242525,1544 242526,605 242527,3193 242528,1052 242529,1715 242530,2443 242531,2205 242531,33424 242532,3422 242533,1167 242534,968 242535,10 242535,113156 242536,2191 242537,589 242538,714 242539,3207 242540,1140 242541,1893 242542,233 242543,37 242544,301 242545,5718 242546,752 242547,1001 242548,1564 242549,2083 242550,1837 242551,390 242552,72 242553,2979 242554,3194 242555,907 242556,2557 242557,220816 242558,278 242559,56 242560,422 242561,192 242562,179170 242563,220816 242564,115659 242565,179170 242566,83 242567,30 242568,406 242569,2646 242570,2209 242571,138 242572,865 242573,557 242574,137 242575,88820 242576,557 242577,242578 242577,264724 242579,1326 242580,1323 242581,102 242582,408 242583,332 242584,1608 242585,179170 242586,220816 242587,179170 242588,1132 242589,2735 242590,220816 242591,1353 242592,35486 242593,640 242594,1294 242595,242596 242597,220816 242598,34 242598,35 242599,220816 242600,149 242601,179170 242602,179170 242603,179170 242604,366 242605,179170 242606,220816 242607,3367 242608,179170 242609,220816 242610,179170 242611,179170 242612,1181 242613,50 242613,147 242613,195 242614,179170 242615,220816 242616,220816 242617,707 242618,22 242619,31977 242620,1147 242622,179170 242623,220816 242624,220816 242625,250 242625,1684 242626,707 242627,285 242628,220816 242629,557 242630,147 242631,250 242631,1684 242632,285 242633,30 242634,285 242635,179170 242636,30 242637,138686 242638,175 242639,1132 242640,250 242640,1684 242641,30 242642,30 242643,671 242644,220816 242645,30 242646,220816 242647,525 242648,717 242649,1309 242650,1285 242651,333 242652,704 242653,79 242654,631 242655,138686 242656,175 242657,294 242658,1634 242659,206 242660,22 242662,147 242663,433 242664,142870 242665,3474 242666,801 242667,1782 242668,3138 242669,1359 242670,3218 242672,179170 242674,179170 242675,1181 242676,148742 242677,1359 242678,242679 242681,250 242681,1684 242682,285 242683,366 242684,179170 242685,862 242686,179170 242687,250 242687,1684 242688,285 242689,1132 242690,1132 242691,225 242692,240 242693,2373 242694,220816 242695,1181 242696,1474 242696,2590 242697,30 242698,220816 242699,8884 242700,242701 242702,242703 242704,1085 242705,310 242705,805 242706,5547 242707,192 242708,242709 242710,242711 242712,491 242713,142870 242714,406 242715,242716 242717,242718 242719,422 242720,56 242721,515 242722,242723 242724,151 242725,1707 242726,8270 242727,1949 242728,242729 242730,366 242731,366 242732,366 242733,1181 242734,275 242735,1227 242735,86416 242736,104 242737,9098 242738,134 242739,1465 242740,217 242740,222 242740,406 242740,417 242740,455 242740,1085 242740,2296 242740,5343 242740,73938 242741,2750 242742,242743 242744,1458 242744,149534 242745,479 242746,35486 242748,200 242749,242750 242751,994 242752,1177 242752,2367 242753,1715 242754,213089 242755,242756 242757,366 242758,73570 242759,932 242760,3148 242761,2626 242762,3003 242763,3623 242764,127158 242765,557 242766,22 242767,83 242769,994 242770,408 242771,2931 242772,272 242772,563 242773,242774 242775,346 242776,272 242776,193129 242777,242778 242779,145751 242780,1058 242781,875 242782,875 242783,1240 242784,1014 242785,1014 242786,1014 242787,953 242788,142870 242789,1014 242790,1014 242791,3218 242792,994 242794,154408 242795,2931 242796,1096 242797,439 242799,918 242800,30 242801,25348 242801,101688 242802,242803 242804,4 242804,5 242805,1132 242806,781 242807,217 242808,113156 242809,147 242810,151 242811,242812 242813,1188 242814,30 242815,179170 242816,44 242817,242818 242819,433 242820,1294 242821,422 242822,56 242823,179170 242824,1014 242825,255 242826,1 242826,1515 242826,21442 242826,245282 242826,250192 242826,250648 242826,258302 242827,1014 242828,1014 242829,2931 242830,1014 242831,918 242832,145161 242833,200 242834,130 242835,192 242836,2989 242836,2991 242838,179170 242839,79 242840,932 242841,242842 242843,1449 242844,30 242845,1007 242845,1289 242846,3260 242847,138686 242848,175 242849,1623 242850,122853 242851,652 242852,602 242853,56 242854,422 242857,302 242858,1132 242859,1623 242860,55849 242861,861 242862,994 242863,28130 242864,483 242865,2116 242866,30 242867,217 242867,302 242868,406 242869,140 242870,6323 242871,11 242872,1117 242873,1313 242874,422 242875,56 242876,433 242877,366 242878,366 242880,355 242881,1078 242883,179170 242884,220816 242885,1181 242886,301 242887,83 242888,305 242889,220816 242891,1479 242892,390 242893,390 242894,220816 242895,30 242896,242897 242896,248236 242898,2931 242899,22 242900,56 242901,422 242902,220816 242903,220816 242904,30 242905,220816 242906,433 242907,151 242908,1149 242909,1419 242909,142870 242911,571 242912,1014 242913,693 242914,155481 242915,220816 242916,179170 242917,179170 242918,220816 242919,220816 242920,179170 242921,220816 242922,179170 242923,192 242923,240 242923,406 242923,620 242924,1014 242925,346 242926,22 242927,22 242928,859 242929,22 242930,805 242931,179170 242932,242933 242932,247722 242934,1010 242935,242936 242938,179170 242939,179170 242940,269 242941,13919 242942,994 242943,994 242945,242946 242948,179170 242949,1085 242949,75912 242951,242952 242953,107 242954,2416 242954,2417 242955,292 242957,338 242958,298 242959,640 242960,1133 242961,3538 242962,175 242962,1773 242963,366 242964,366 242965,366 242966,366 242967,366 242968,366 242972,143 242973,809 242974,779 242976,1623 242977,242977 242978,1010 242979,269 242980,35486 242981,4597 242984,344 242985,1359 242986,1474 242987,932 242988,1118 242989,809 242990,242991 242990,243903 242992,4193 242993,30 242994,843 242995,242996 242997,1805 242998,994 242998,103860 242999,147 242999,158 243000,30 243001,3999 243002,3623 243003,243004 243005,97 243006,14989 243007,243008 243009,1821 243009,21736 243010,285 243012,657 243012,2266 243013,346 243014,63 243015,243016 243019,1313 243020,483 243021,179170 243022,1181 243024,843 243025,1544 243027,4 243027,5 243029,1132 243030,28203 243031,779 243032,138686 243033,175 243034,243035 243042,1511 243042,3069 243045,932 243046,243047 243048,994 243049,243050 243051,136 243052,781 243053,1132 243055,994 243056,243057 243058,346 243059,994 243060,30 243061,994 243062,781 243063,1132 243064,99 243065,243066 243067,99 243068,312 243069,2266 243070,389 243071,557 243072,557 243073,557 243074,1821 243074,21736 243075,68 243076,1300 243077,536 243078,273 243078,2367 243079,104 243080,50 243081,1415 243082,195 243083,602 243085,195 243085,74719 243086,202 243087,151 243088,243089 243090,1014 243091,1014 243092,243093 243095,1014 243096,4823 243097,1014 243099,450 243100,113156 243101,243102 243103,1769 243104,243105 243106,179170 243107,697 243107,1769 243108,33 243108,40 243108,1432 243108,2674 243108,2701 243108,4571 243108,9343 243108,9540 243108,9541 243109,4611 243110,179170 243111,243112 243111,262916 243114,2506 243115,589 243116,872 243117,872 243118,783 243119,273 243120,272 243121,243122 243123,192 243123,1509 243123,1688 243123,2701 243123,3370 243123,14453 243124,142870 243125,192 243126,83 243126,217 243126,379 243126,399 243126,1467 243126,2168 243126,2784 243126,7698 243127,83 243128,285 243129,192 243130,1644 243131,179170 243132,2668 243134,240 243135,179170 243136,104 243137,7155 243138,1012 243139,43203 243140,65 243141,58 243142,243143 243144,178 243144,392 243146,994 243147,994 243148,81 243149,243150 243149,250378 243151,1634 243152,292 243153,294 243154,142473 243155,296 243156,298 243157,2867 243157,2868 243158,862 243159,1544 243160,1414 243161,19010 243162,422 243163,949 243163,142870 243164,1140 243165,1033 243166,20 243166,447 243167,788 243168,1749 243169,202 243171,2867 243171,2868 243172,209 243172,1010 243172,1556 243172,1837 243172,131675 243173,1707 243174,875 243175,179170 243176,147 243177,433 243179,243180 243181,179170 243182,50 243183,179170 243186,1572 243187,1058 243188,30 243189,298 243190,119 243191,240174 243192,3695 243193,248 243195,30 243196,83 243197,285 243198,636 243199,22 243200,3422 243201,704 243203,640 243204,640 243205,640 243206,192 243208,640 243210,433 243211,707 243212,50 243213,22 243214,30 243215,707 243216,171 243217,255 243218,422 243219,422 243220,422 243221,422 243222,422 243223,422 243224,422 243225,422 243226,422 243227,422 243228,422 243229,422 243230,209 243231,493 243232,640 243233,79 243234,697 243235,592 243236,585 243237,1293 243238,586 243239,393 243240,50 243241,406 243242,6661 243243,749 243244,55849 243245,22 243246,79 243247,6661 243248,6661 243250,1608 243251,179170 243252,35486 243253,2460 243254,63 243255,217 243256,652 243258,1132 243259,775 243260,2224 243261,999 243262,1860 243264,920 243267,243268 243271,1370 243276,3003 243277,557 243278,707 243280,220884 243281,356 243282,422 243284,1132 243285,497 243287,657 243288,50 243289,217 243290,298 243292,862 243293,56 243294,422 243298,179170 243299,192 243300,1238 243301,202 243303,4411 243304,30 243305,217 243306,1452 243307,652 243308,312 243308,1267 243309,2989 243309,2991 243310,81 243311,1010 243313,1132 243314,781 243315,6682 243316,200 243318,5908 243319,392 243320,148742 243321,647 243322,146 243322,92476 243323,344 243324,179170 243325,104 243326,1773 243327,2421 243329,1181 243330,875 243331,148742 243332,2620 243334,1983 243335,1052 243336,54 243337,2775 243338,1962 243339,304 243342,433 243343,859 243345,2424 243347,192 243347,422 243350,589 243350,1718 243354,147 243355,200 243356,571 243357,147 243358,1983 243359,907 243360,485 243361,1515 243362,200 243363,483 243364,1707 243366,447 243367,6556 243368,147 243368,118336 243370,83 243371,452 243372,809 243373,518 243374,240 243375,875 243376,240 243377,749 243378,217 243379,292 243380,242246 243381,179170 243382,30 243383,243384 243385,2205 243385,33424 243386,1149 243387,179170 243388,179170 243390,267 243392,6556 243393,179170 243394,760 243395,1572 243396,48955 243397,111 243398,949 243399,439 243400,124668 243401,1167 243402,1805 243403,714 243404,1474 243405,973 243406,1033 243407,1707 243408,5405 243409,313 243410,577 243411,2224 243412,207 243413,3769 243414,415 243415,779 243416,3538 243417,779 243420,222 243420,302 243420,1572 243420,1836 243420,4039 243421,406 243422,83 243423,1132 243425,372 243425,7194 243426,907 243427,1860 243428,1858 243429,1118 243430,7757 243431,301 243432,2373 243434,868 243435,2373 243436,827 243438,30 243440,138686 243441,175 243442,243443 243445,179170 243446,189303 243447,3115 243448,179170 243449,34 243449,35 243451,3999 243452,2460 243453,4039 243454,179170 243455,179170 243456,875 243457,1707 243458,2296 243459,179170 243461,483 243462,179170 243463,5908 243464,179170 243465,1160 243466,179170 243468,2319 243468,5326 243468,19443 243470,980 243472,179170 243473,1801 243474,1294 243475,1132 243476,7416 243477,379 243478,148742 243481,179170 243483,1085 243484,1860 243486,1858 243487,83 243488,631 243489,48505 243491,134 243492,1983 243493,1566 243494,1001 243496,99 243497,1058 243498,3623 243499,875 243500,201298 243501,292 243502,712 243503,179170 243504,536 243506,283 243506,385 243506,2266 243506,2421 243506,2424 243506,37088 243507,179170 243508,243509 243510,483 243511,179170 243512,30 243513,891 243514,344 243515,285 243516,179170 243517,179170 243518,179170 243519,1332 243519,1844 243522,934 243523,191860 243524,2373 243525,179170 243526,509 243526,3258 243527,179170 243528,515 243529,595 243530,179170 243531,843 243532,1858 243533,1860 243534,1390 243535,179170 243536,1224 243537,179170 243538,22 243539,346 243540,148742 243541,255 243542,657 243543,372 243544,841 243545,818 243546,366 243547,536 243548,2411 243549,44 243550,366 243551,366 243552,366 243553,366 243554,1983 243555,149 243557,602 243558,366 243559,918 243560,202 243561,240174 243562,179170 243563,140 243564,592 243565,273 243567,1 243568,151 243569,1749 243570,557 243571,779 243572,1801 243573,379 243574,3507 243575,148742 243576,240174 243577,252 243579,3623 243580,875 243581,73570 243582,1983 243583,30 243584,631 243585,58 243586,46 243587,994 243588,309 243588,310 243589,2590 243590,179170 243591,2266 243592,19010 243593,77 243594,220816 243595,273 243595,313 243596,167 243597,8822 243598,179170 243599,34 243599,35 243600,1566 243600,189950 243600,237573 243600,243380 243600,256662 243600,261515 243601,3507 243602,220816 243603,220816 243604,1119 243605,148742 243606,868 243607,243608 243610,697 243611,668 243612,3623 243613,5192 243614,5405 243615,195 243616,220816 243617,1368 243618,2073 243618,2626 243618,142426 243619,447 243620,2775 243621,932 243623,220816 243624,220816 243625,243626 243627,120 243627,1419 243628,788 243628,859 243629,1949 243630,1858 243631,1860 243632,179170 243633,1294 243633,1644 243634,220816 243635,493 243636,179170 243637,349 243637,586 243637,3260 243638,220816 243639,73570 243640,1849 243641,536 243642,202 243643,875 243644,973 243645,1801 243645,3182 243646,220816 243647,220816 243648,772 243649,577 243650,1722 243651,250 243651,1684 243652,220816 243653,179170 243654,1749 243655,30 243657,278 243658,389 243659,179170 243660,217 243661,179170 243662,30 243663,220816 243664,1722 243665,1326 243666,102 243667,1323 243668,408 243670,994 243671,179170 243672,30 243673,30 243674,179170 243675,7092 243676,220816 243677,30 243678,1298 243679,149 243680,30 243681,220816 243682,1143 243683,179170 243684,278 243685,1832 243686,2045 243687,313 243688,50 243689,424 243690,179170 243691,455 243693,330 243694,30 243695,30 243696,107 243697,179170 243698,269 243699,1858 243700,1860 243701,179170 243702,107 243703,7363 243703,7652 243704,8270 243705,55849 243706,862 243706,1235 243707,1789 243708,60576 243709,301 243709,372 243709,631 243709,1001 243709,1085 243710,1374 243711,595 243712,595 243713,1860 243714,1858 243715,151 243716,1058 243717,292 243718,657 243718,694 243718,2266 243719,760 243720,179170 243721,138 243722,1522 243723,4223 243724,1522 243725,595 243726,302 243727,1707 243728,1603 243729,313 243731,272 243733,1860 243734,1151 243735,1267 243736,1 243736,94 243736,184 243736,2787 243737,97 243738,285 243739,1556 243740,247 243741,379 243742,30 243743,255 243744,7117 243745,30 243746,217 243747,2744 243748,243749 243750,179170 243751,626 243752,179170 243753,147 243754,1085 243755,1773 243756,704 243757,79 243758,179170 243759,30 243760,138686 243761,175 243762,563 243763,220816 243764,83 243765,1096 243766,179170 243767,220816 243768,557 243769,22 243770,179170 243771,220816 243772,269 243773,220816 243774,95554 243775,30 243776,220816 243777,323 243778,875 243779,1227 243779,86416 243780,310 243781,493 243782,1267 243783,198977 243784,243785 243786,760 243787,809 243788,1252 243788,1253 243789,875 243790,2048 243791,323 243792,1160 243793,65 243794,366 243795,366 243796,720 243796,775 243796,877 243796,907 243796,973 243796,1001 243796,1117 243796,1284 243796,1522 243796,1715 243796,1732 243796,1837 243796,2191 243796,9024 243797,640 243798,269 243799,243800 243801,41 243802,149 243803,424 243804,920 243805,932 243806,179170 243807,1458 243808,805 243809,2266 243810,1474 243811,146 243811,92476 243812,920 243813,243814 243815,79 243815,5265 243816,1381 243817,104 243819,843 243820,202 243821,491 243822,673 243823,35687 243824,269 243825,843 243826,298 243827,243828 243829,179170 243830,1571 243831,893 243832,149 243833,137 243834,179170 243835,366 243836,2744 243837,137 243838,269 243839,243840 243841,312 243842,243843 243844,2116 243845,1544 243846,217 243847,179170 243848,3138 243848,4355 243850,1085 243851,5662 243852,302 243853,141912 243854,179170 243855,299 243856,515 243857,179170 243858,3623 243859,83 243860,561 243861,179170 243862,240174 243863,243864 243865,592 243866,862 243867,862 243868,41 243869,1151 243870,179170 243871,179170 243872,269 243873,117192 243874,433 243875,269 243876,50 243876,79 243876,104 243876,158 243876,178 243876,195 243876,202 243876,366 243876,586 243876,592 243876,818 243876,972 243876,973 243876,1419 243876,2244 243876,4192 243876,4193 243876,148742 243876,240174 243877,2373 243878,875 243879,243880 243881,243882 243884,97 243885,557 243886,22 243888,137 243889,422 243890,56 243891,240174 243892,577 243893,30 243893,515 243894,704 243895,79 243896,179170 243897,644 243899,243900 243901,1608 243902,304 243904,240174 243905,459 243906,6661 243907,147 243908,422 243909,422 243910,422 243911,422 243912,422 243913,422 243914,422 243915,422 243916,179170 243917,422 243918,1132 243919,422 243920,422 243922,493 243923,640 243924,640 243925,640 243926,640 243927,788 243928,640 243929,171 243930,781 243931,148742 243932,1132 243933,640 243936,1417 243937,240 243938,781 243939,1132 243940,1033 243941,206 243942,875 243943,1132 243944,35486 243945,2590 243946,920 243947,657 243948,1082 243949,206 243950,744 243951,48505 243952,877 243953,1113 243954,3756 243955,388 243956,762 243957,202 243958,243959 243960,392 243961,1639 243962,1749 243963,393 243964,252 243965,179170 243966,602 243967,1707 243970,205627 243971,1298 243973,179170 243974,179170 243975,2995 243976,1359 243978,1801 243979,985 243980,781 243981,1132 243982,1224 243983,217 243984,1860 243985,1858 243986,19010 243987,148742 243988,312 243989,861 243991,179170 243992,3623 243993,1893 243994,73570 243995,333 243996,811 243998,1102 243998,7363 243999,1414 244000,179170 244002,932 244003,1749 244003,1882 244004,171 244005,1284 244006,50 244006,505 244006,141912 244008,4771 244009,3555 244010,1313 244011,285 244012,1707 244013,163 244014,611 244015,179170 244016,72764 244017,388 244018,850 244019,302 244020,784 244022,364 244023,200 244024,195 244025,493 244026,171 244027,83 244028,720 244029,195 244030,493 244031,179170 244032,63 244033,925 244034,244035 244036,1381 244036,1452 244036,1551 244037,1231 244038,1544 244039,56 244040,422 244041,37 244042,63 244043,557 244044,422 244045,56 244046,1634 244047,192 244049,891 244050,240 244051,493 244051,682 244051,72439 244052,1058 244053,20 244053,4548 244055,1634 244056,4548 244057,592 244058,126 244059,244060 244061,5 244061,1102 244062,2868 244062,17588 244063,252 244064,827 244065,622 244067,1844 244068,862 244070,120 244071,493 244071,586 244071,1265 244071,1266 244071,1370 244072,3623 244073,2719 244074,200 244075,2590 244076,392 244076,918 244076,1454 244078,338 244081,406 244082,392 244084,79 244085,302 244086,313 244087,406 244088,515 244090,1860 244091,1858 244092,72 244092,358 244093,861 244094,179170 244095,4355 244096,852 244096,1801 244097,202 244098,1240 244098,5469 244099,636 244100,302 244101,1659 244101,1836 244103,406 244105,124668 244105,187176 244106,312 244107,875 244108,240174 244109,217 244110,83 244111,1132 244112,781 244113,462 244114,179170 244115,4039 244116,148742 244117,7092 244118,178 244119,192 244120,663 244120,1531 244121,1927 244122,244123 244124,1381 244125,30 244125,328 244125,1179 244125,7124 244126,994 244127,217 244130,403 244132,115474 244133,2590 244134,147 244134,149 244134,158 244134,171 244134,206 244136,1119 244137,48 244138,1033 244139,244140 244141,809 244142,749 244142,1235 244142,2209 244142,8180 244142,21711 244143,148742 244144,83 244145,620 244146,104 244146,136 244146,557 244146,1368 244147,148742 244148,83 244149,406 244150,83 244151,141912 244153,79 244154,994 244155,302 244156,252 244157,1167 244158,1785 244159,589 244160,605 244161,1124 244162,1782 244163,973 244164,86 244165,179170 244166,1 244167,338 244168,595 244169,626 244170,779 244171,1515 244172,148742 244173,392 244174,200 244175,302 244175,893 244176,244177 244178,148742 244179,179170 244180,1010 244181,333 244181,4192 244182,184 244185,1860 244186,1858 244187,893 244188,333 244189,1294 244190,83 244191,1298 244191,1749 244191,6695 244192,179170 244193,34 244193,35 244194,647 244196,179170 244197,167 244198,447 244199,994 244200,2775 244201,861 244202,781 244203,1132 244204,151 244205,1631 244206,406 244207,156379 244207,162599 244208,640 244209,636 244211,244212 244213,148742 244214,483 244215,255 244216,994 244217,1359 244218,179170 244219,179170 244220,83 244221,805 244222,994 244223,4823 244224,179170 244225,640 244226,244227 244228,179170 244230,435 244231,107 244232,932 244233,44 244234,175 244235,179170 244236,34 244236,35 244237,148742 244238,841 244239,843 244240,244241 244242,991 244243,179170 244244,179170 244245,184 244246,1983 244247,179170 244248,204093 244249,138686 244250,175 244251,972 244252,278 244253,200 244254,1531 244255,240174 244256,1179 244257,301 244258,13361 244259,244260 244261,1688 244262,640 244263,118336 244264,220816 244265,148742 244266,1452 244267,1821 244267,21736 244268,980 244269,179170 244270,605 244271,7092 244272,55849 244273,179170 244274,1370 244275,179170 244276,44 244277,179170 244278,179170 244279,179170 244280,467 244281,272 244282,298 244282,346 244282,563 244282,615 244282,1243 244282,2367 244282,7429 244283,147 244284,38634 244285,5265 244286,586 244287,640 244288,179170 244289,1359 244290,179170 244291,278 244292,244293 244294,220816 244295,1556 244296,2646 244297,278 244298,83 244299,433 244300,640 244301,220816 244302,179170 244303,244304 244305,3623 244306,1033 244308,433 244309,577 244310,3623 244311,220816 244312,3623 244313,393 244314,640 244315,220816 244316,563 244317,244318 244319,503 244320,620 244321,220816 244322,433 244323,244324 244325,220816 244326,406 244327,179170 244328,55849 244329,220816 244330,207 244331,179170 244333,1326 244334,102 244335,1323 244336,408 244337,220816 244338,1515 244339,779 244340,142426 244341,83 244341,278 244341,577 244342,220816 244343,2373 244344,68509 244345,285 244346,217 244347,1238 244348,250 244348,1684 244349,187 244350,179170 244351,1452 244352,255 244353,668 244354,220816 244355,179170 244356,220816 244357,220816 244358,179170 244359,417 244360,752 244361,312 244362,3585 244363,220816 244364,278 244365,4597 244366,179170 244367,220816 244368,333 244369,179170 244370,875 244371,179170 244372,138686 244373,175 244374,5265 244375,1188 244376,1515 244377,1511 244377,3069 244378,294 244379,347 244380,1305 244381,179170 244382,179170 244383,1 244384,304 244385,179170 244386,38634 244387,275 244388,652 244389,285 244390,5366 244391,147 244392,179170 244393,35486 244394,179170 244395,4823 244396,2421 244397,949 244398,34 244398,35 244398,158 244398,217 244398,536 244398,660 244398,1133 244398,1466 244398,4637 244398,7092 244399,2671 244400,200 244401,1432 244402,179170 244403,220816 244404,30 244405,220816 244406,872 244407,179170 244408,220816 244409,220816 244410,1014 244411,179170 244412,640 244413,179170 244414,220816 244415,1014 244416,1014 244417,1014 244418,1014 244419,244420 244421,220816 244422,220816 244423,2923 244424,1014 244425,393 244426,1014 244427,704 244428,493 244429,240174 244430,179170 244431,850 244432,640 244433,83 244434,220816 244435,220816 244436,640 244437,220816 244438,346 244439,640 244440,179170 244441,220816 244442,179170 244443,2744 244445,1429 244446,220816 244447,126 244448,338 244449,30 244450,1983 244451,1058 244452,424 244453,149 244454,46 244454,720 244454,745 244454,1425 244454,2528 244454,2590 244454,3258 244454,249937 244455,640 244456,179170 244457,640 244458,192 244459,244460 244461,244462 244463,968 244464,244465 244466,424 244467,640 244468,1363 244469,220816 244470,244471 244473,1821 244473,21736 244474,244475 244476,30 244477,13546 244478,220816 244479,272 244479,439 244479,563 244479,980 244479,2367 244479,15573 244480,220816 244481,640 244482,258 244483,366 244484,862 244484,2590 244485,147 244486,30 244487,179170 244488,30 244489,640 244490,557 244491,220816 244492,920 244493,247 244494,1608 244495,240174 244496,1782 244497,71 244498,1467 244499,885 244499,13704 244500,455 244501,2424 244502,179170 244503,1871 244504,364 244505,83 244506,2421 244507,13980 244508,7416 244509,46 244509,577 244509,1012 244509,2528 244509,2590 244510,220816 244511,687 244512,1381 244512,2292 244513,240174 244514,220816 244515,220816 244516,1368 244518,346 244519,104 244520,179170 244521,2073 244522,179170 244523,850 244525,473 244526,1544 244527,220816 244528,1085 244529,1368 244530,179170 244531,217 244532,536 244533,179170 244534,137 244535,1782 244536,994 244537,30 244538,392 244539,138686 244540,175 244541,289 244541,94134 244542,309 244542,310 244543,309 244543,310 244544,433 244545,285 244546,244547 244548,244549 244550,775 244551,1631 244552,577 244553,107 244553,1146 244553,1579 244554,366 244555,2436 244556,1326 244557,179170 244558,252 244559,595 244560,269 244561,1531 244562,302 244563,179170 244564,920 244565,433 244567,640 244568,640 244569,640 244570,668 244571,422 244573,1132 244574,781 244575,422 244576,422 244577,422 244578,422 244579,422 244580,422 244581,422 244582,431 244583,422 244584,422 244585,422 244586,422 244587,1968 244587,16196 244588,326 244590,126 244590,918 244590,1160 244593,694 244596,577 244597,392 244598,247 244598,2867 244598,2868 244599,313 244600,147 244600,149 244601,241732 244601,244601 244602,35486 244603,3623 244605,1860 244606,1858 244607,328 244608,920 244609,31073 244610,1544 244611,1955 244612,73570 244614,2989 244614,2991 244615,1238 244616,240174 244617,1452 244618,344 244619,10 244620,920 244622,179170 244623,1566 244624,9457 244625,1479 244626,697 244628,192 244631,217 244632,137 244633,6059 244634,54 244635,1274 244636,1052 244637,1962 244638,54 244639,2775 244640,1052 244641,151 244642,222 244642,657 244643,244644 244643,250529 244645,3094 244646,911 244646,1844 244646,5213 244647,422 244648,56 244649,493 244649,640 244649,2626 244651,50 244652,1087 244653,179170 244654,244655 244656,244657 244658,581 244659,1385 244660,189839 244661,273 244662,83 244663,4190 244664,50 244665,107 244665,4771 244666,2274 244668,83 244669,1511 244669,3069 244670,5987 244671,83 244673,447 244674,2775 244675,79 244677,135 244678,809 244679,118336 244680,22 244680,2017 244681,149 244682,4611 244683,1566 244685,500 244686,83 244687,83 244689,586 244690,781 244691,1132 244692,459 244693,2209 244694,707 244695,83 244696,83 244697,450 244698,83 244700,244701 244702,2373 244704,843 244705,162599 244706,124668 244707,9098 244708,7572 244709,8798 244710,925 244711,244712 244714,1631 244715,56 244716,422 244718,4771 244719,126 244721,1465 244722,388 244723,4594 244724,1634 244725,1160 244726,244727 244728,1860 244729,1858 244730,2319 244731,1274 244732,222 244733,73570 244734,491 244735,4571 244736,872 244736,1151 244737,3367 244738,149 244738,21442 244739,3297 244740,55849 244741,1294 244742,240174 244743,5405 244744,119 244745,1860 244746,1858 244748,393 244749,489 244751,1983 244752,192 244752,586 244752,920 244753,1860 244754,1858 244755,652 244757,1860 244758,1858 244759,1070 244759,4455 244760,406 244761,244762 244764,1782 244765,2646 244767,13980 244768,1860 244769,1858 244770,328 244771,968 244774,592 244777,118336 244778,1082 244779,1860 244780,1858 244781,934 244782,1860 244783,1858 244784,179170 244785,3623 244786,138686 244787,175 244788,1326 244790,287 244790,809 244791,690 244792,179170 244795,972 244796,968 244796,1782 244797,302 244798,179170 244799,79 244800,124668 244801,861 244803,55849 244804,55849 244805,1566 244806,313 244807,682 244807,72439 244808,179170 244809,868 244810,179170 244811,452 244811,457 244811,497 244811,535 244811,794 244811,918 244811,1147 244811,1417 244811,1673 244812,179170 244813,55849 244815,272 244816,714 244817,50 244818,515 244819,58 244820,22 244821,217 244822,178 244823,1220 244824,2073 244825,244826 244827,179170 244828,356 244829,875 244830,483 244831,1392 244832,9457 244833,179170 244834,192 244835,1381 244836,557 244837,1556 244839,179170 244840,2979 244841,3582 244842,1531 244843,56 244844,422 244845,151 244846,366 244847,2205 244847,33424 244848,1860 244849,1858 244851,179170 244852,215 244853,1688 244854,79 244855,707 244856,994 244857,58 244858,46 244859,22 244860,9457 244861,3317 244861,142870 244862,1381 244863,179170 244864,240174 244865,4192 244865,4193 244866,56 244867,422 244868,179170 244869,1010 244870,356 244870,852 244871,179170 244872,781 244873,1132 244874,240174 244876,209 244877,781 244878,1132 244879,151 244880,13661 244881,996 244882,200 244883,244884 244885,200 244886,34 244886,35 244887,148742 244888,244889 244890,1 244891,563 244892,852 244893,1556 244894,1467 244895,809 244896,1860 244897,1858 244898,15748 244900,516 244901,142433 244902,467 244903,1773 244904,113156 244905,1151 244906,1860 244907,1858 244908,406 244909,44 244910,195 244911,2735 244912,77 244913,932 244914,28130 244915,781 244916,1132 244917,30 244918,671 244919,158 244920,417 244921,179170 244922,138686 244923,175 244925,30 244926,126 244927,366 244929,107 244930,3804 244931,5405 244932,563 244934,35486 244935,191860 244936,328 244937,301 244937,861 244937,893 244937,2979 244938,107 244939,179170 244940,1707 244941,1160 244942,149 244943,179170 244944,255 244945,4571 244946,179170 244947,244948 244949,220816 244950,516 244951,7092 244952,151 244953,30 244954,220816 244955,240174 244956,151 244957,30 244958,30 244959,22 244960,1623 244961,220816 244962,278 244963,557 244964,179170 244965,2421 244966,4355 244967,179170 244968,1309 244969,406 244970,220816 244971,179170 244972,30 244973,179170 244974,595 244975,206 244976,220816 244978,148742 244979,749 244980,179170 244981,220816 244982,220816 244983,220816 244984,1511 244984,1631 244984,3069 244986,147 244986,149 244986,21442 244987,220816 244988,673 244989,179170 244990,217 244991,138686 244992,175 244993,220816 244994,875 244995,875 244996,536 244997,717 244998,920 244999,220816 245000,179170 245001,220816 245002,245003 245005,3623 245006,255 245007,220816 245008,1544 245009,245010 245011,622 245011,862 245012,179170 245013,2421 245014,795 245015,973 245015,1298 245016,55849 245017,536 245018,919 245019,707 245020,220816 245021,120 245022,1474 245023,220816 245024,179170 245025,1068 245026,424 245027,1590 245028,220816 245029,217 245030,179170 245031,285 245032,179170 245033,56 245034,220816 245035,179170 245036,200 245037,356 245037,611 245038,220816 245039,704 245040,79 245041,179170 245043,179170 245044,179170 245045,220816 245046,862 245047,536 245048,179170 245049,179170 245050,278 245051,818 245052,48 245053,2116 245054,1224 245055,1181 245056,179170 245057,179170 245058,138686 245059,175 245060,217 245061,220816 245062,179170 245063,245064 245065,179170 245066,220816 245067,147 245069,372 245069,873 245069,1210 245070,2421 245071,179170 245072,220816 245073,1860 245074,1858 245075,994 245076,1052 245077,54 245078,179170 245079,2775 245080,1962 245081,220816 245082,3623 245083,245084 245085,179170 245086,707 245087,179170 245088,1688 245089,220816 245090,179170 245091,596 245092,285 245093,179170 245094,250 245094,1684 245095,179170 245096,220816 245097,10 245097,147 245097,158 245097,795 245097,1572 245097,3804 245097,4039 245098,220816 245099,1556 245100,179170 245101,179170 245102,30 245103,220816 245104,435 245105,179170 245106,220816 245107,179170 245108,30 245109,220816 245110,56 245111,422 245112,843 245113,491 245114,220816 245115,220816 245116,245117 245118,220816 245119,220816 245120,138686 245121,175 245122,220816 245123,6303 245124,220816 245125,251 245125,1531 245125,2567 245126,1381 245127,245128 245129,34 245129,35 245129,217 245129,283 245129,313 245129,379 245129,577 245129,623 245129,1274 245129,1429 245129,1467 245129,1608 245129,2266 245129,2274 245129,2784 245129,2989 245129,2991 245129,3135 245129,3252 245129,7092 245129,13546 245129,14126 245130,932 245131,30 245132,704 245133,179170 245134,493 245135,179170 245136,220816 245137,179170 245138,577 245139,392 245139,697 245140,220816 245141,704 245142,220816 245143,493 245144,6556 245145,179170 245146,171 245147,179170 245148,250 245148,1684 245149,285 245150,285 245151,250 245151,1684 245152,179170 245154,4411 245155,1309 245156,179170 245157,366 245158,366 245159,366 245160,179170 245161,920 245162,138 245163,1531 245164,220816 245165,245166 245167,422 245168,56 245169,245170 245171,920 245172,99 245173,422 245174,56 245175,220816 245176,179170 245177,577 245178,2590 245180,179170 245181,245182 245183,304 245184,220816 245185,207 245186,240174 245187,220816 245188,2590 245189,16153 245190,151 245191,179170 245192,1544 245193,4237 245193,182162 245194,872 245195,1429 245196,179170 245197,202 245198,30 245199,192 245200,919 245202,671 245203,1132 245204,668 245205,1 245206,217 245207,1511 245207,3069 245208,179170 245209,349 245210,779 245211,1010 245212,6556 245213,245214 245215,327 245215,434 245215,435 245215,621 245215,622 245215,1045 245215,1294 245215,2710 245215,3924 245215,4426 245215,5678 245215,18416 245215,28354 245215,84634 245215,92959 245215,114220 245215,149028 245215,149137 245215,187106 245217,718 245218,994 245219,2168 245220,360 245222,1052 245223,54 245224,2775 245225,1962 245226,299 245227,220816 245228,220816 245229,366 245230,1241 245231,264 245231,649 245232,366 245233,366 245234,179170 245235,1359 245236,179170 245237,640 245238,595 245239,126 245239,918 245240,338 245241,2146 245242,220816 245243,187 245244,245245 245246,1326 245247,1893 245248,245249 245250,222 245251,485 245252,298 245253,1 245253,58 245253,130 245253,304 245253,649 245253,660 245253,743 245253,1078 245253,1309 245253,1326 245254,187176 245255,5469 245256,4218 245257,994 245258,1359 245259,349 245259,485 245259,685 245260,302 245261,1707 245262,222 245263,179170 245265,344 245266,422 245267,422 245268,994 245269,422 245270,422 245271,422 245272,422 245273,422 245274,422 245275,422 245276,422 245277,179170 245278,422 245279,422 245280,212914 245281,240 245282,1776 245282,242826 245285,1631 245286,1359 245287,1300 245288,595 245289,1143 245291,35486 245292,1368 245295,151 245296,1212 245296,16153 245297,920 245299,16019 245300,272 245302,760 245304,141912 245305,245306 245309,285 245310,138686 245311,175 245312,379 245313,195 245315,56 245316,422 245317,387 245319,1927 245320,1359 245321,3 245323,4545 245323,56150 245324,1238 245325,179170 245326,14797 245327,697 245328,1001 245329,1452 245330,932 245331,2775 245332,245333 245334,245333 245335,433 245337,245338 245339,58 245339,726 245339,1432 245340,1243 245341,83 245342,406 245343,20757 245344,56 245345,422 245346,312 245347,852 245348,1052 245349,54 245350,2775 245351,1962 245352,1085 245353,781 245354,1132 245355,602 245356,489 245357,1052 245358,54 245359,2775 245360,1962 245361,189266 245362,333 245362,1033 245363,872 245364,217 245364,1417 245367,120 245368,19356 245369,1603 245370,991 245371,1001 245372,1052 245373,54 245374,2775 245375,1962 245376,178 245378,3769 245379,217 245381,151 245381,663 245382,1509 245383,2411 245384,242246 245385,192 245386,657 245386,694 245387,19 245387,808 245389,309 245389,310 245390,1284 245391,1860 245392,1858 245393,980 245394,83 245395,925 245396,1634 245397,135 245398,518 245399,1479 245401,1860 245402,1858 245403,179170 245404,48 245404,583 245405,245406 245407,1113 245408,189303 245409,179170 245411,217 245412,364 245412,1227 245412,86416 245413,1284 245414,389 245415,704 245416,5213 245417,1860 245418,1858 245419,6556 245421,372 245422,147 245423,79 245423,1019 245423,1370 245424,217 245425,1133 245426,1132 245427,781 245428,245429 245432,1 245432,147 245432,285 245432,304 245432,626 245432,1425 245432,1888 245432,2411 245432,2424 245432,6027 245433,1782 245434,206 245435,1132 245436,781 245437,557 245438,245439 245440,141912 245441,1888 245442,1370 245446,515 245447,43203 245448,79 245449,68 245450,1631 245451,1133 245453,1773 245454,781 245455,1132 245456,1151 245457,872 245458,360 245458,1132 245460,477 245461,30 245464,1052 245465,179170 245466,60576 245467,5405 245468,720 245469,1363 245470,477 245471,417 245472,138686 245473,175 245474,1181 245475,707 245476,179170 245477,868 245478,5405 245479,749 245481,6387 245483,179170 245484,179170 245485,707 245486,433 245489,1769 245490,179170 245491,467 245492,179170 245493,1688 245494,16153 245495,349 245496,222 245497,707 245499,192 245500,126 245500,918 245501,1 245502,255 245503,1688 245504,1556 245505,179170 245506,4594 245507,179170 245508,430 245509,996 245511,179170 245512,179170 245513,1 245514,151 245515,245516 245518,179170 245519,179170 245520,179170 245522,1368 245523,1556 245524,212914 245525,142870 245526,557 245527,86 245528,3999 245528,5440 245529,179170 245530,245531 245532,859 245533,333 245534,920 245535,302 245536,179170 245537,406 245538,483 245539,179170 245540,4355 245541,187 245542,707 245543,994 245544,251 245545,5906 245546,557 245547,626 245548,278 245549,137 245550,862 245551,179170 245552,179170 245553,536 245554,55849 245555,44 245556,215 245557,862 245558,97 245560,515 245561,1893 245562,1052 245563,433 245564,994 245565,147 245566,1132 245567,781 245568,781 245569,1132 245570,994 245571,179170 245572,179170 245573,83 245574,841 245575,1068 245577,557 245578,179170 245583,302 245585,3623 245586,781 245587,1132 245589,99 245590,435 245591,179170 245592,6323 245593,179170 245594,5961 245596,7092 245597,217 245598,179170 245599,202 245600,179170 245602,991 245603,179170 245604,1284 245605,179170 245606,179170 245607,264 245608,179170 245609,278 245610,843 245611,179170 245612,179170 245613,406 245616,809 245618,178 245619,83 245620,102 245621,1326 245622,1323 245623,408 245624,30 245625,1294 245626,781 245627,1132 245628,301 245629,392 245630,83 245630,1608 245633,781 245634,1132 245635,149 245636,1858 245637,1860 245638,1220 245639,516 245640,252 245641,245642 245643,5265 245644,781 245645,1132 245646,83 245647,893 245648,1522 245649,245650 245651,83 245652,557 245653,862 245654,240174 245655,215276 245656,1893 245656,2617 245656,2626 245657,179170 245658,920 245659,6424 245660,179170 245661,3999 245662,179170 245663,179170 245664,179170 245665,30 245666,179170 245667,358 245668,179170 245669,179170 245670,245671 245672,179170 245673,330 245675,179170 245676,994 245677,147 245678,861 245679,191860 245680,179170 245681,245682 245683,179170 245684,6789 245685,1087 245686,1453 245687,179170 245688,704 245689,79 245690,220816 245691,179170 245692,1608 245693,83 245694,220816 245695,220816 245696,245697 245698,1612 245700,220816 245701,179170 245702,2373 245703,179170 245704,220816 245705,179170 245706,68 245706,22071 245707,707 245708,245709 245710,179170 245711,220816 245712,2421 245713,5213 245714,220816 245715,138686 245716,175 245717,220816 245718,179170 245720,220816 245721,406 245721,1181 245722,220816 245723,220816 245724,220816 245725,146 245725,92476 245726,647 245727,344 245728,167 245729,220816 245730,220816 245731,179170 245732,1449 245733,220816 245734,220816 245735,35486 245736,406 245737,245738 245739,220816 245740,302 245741,220816 245742,707 245743,220816 245744,1252 245744,1253 245745,872 245746,240 245747,220816 245748,220816 245749,220816 245750,220816 245751,220816 245752,116 245752,1432 245752,2087 245752,5871 245752,13704 245753,220816 245754,220816 245755,220816 245756,220816 245757,220816 245758,220816 245759,1773 245760,10 245761,220816 245762,220816 245763,2750 245764,220816 245765,1807 245766,147 245767,220816 245768,220816 245769,220816 245770,220816 245771,126 245771,918 245772,220816 245773,179170 245774,220816 245775,1402 245776,220816 245778,220816 245780,179170 245781,818 245782,1465 245782,6726 245783,220816 245784,220816 245785,179170 245786,220816 245787,240 245788,220816 245789,179170 245790,433 245791,220816 245792,579 245793,179170 245794,264 245795,220816 245796,707 245797,23783 245798,220816 245799,994 245800,179170 245801,158 245802,179170 245803,179170 245804,179170 245805,251 245806,1353 245807,3295 245808,245809 245810,245809 245811,195 245812,147 245813,1544 245814,236180 245815,179170 245816,245817 245818,245819 245820,704 245821,493 245822,179170 245823,491 245824,179170 245825,1235 245825,1335 245827,211 245828,30 245828,1133 245828,2045 245829,781 245830,1132 245831,1644 245832,179170 245833,1572 245836,366 245838,366 245839,366 245840,333 245842,1326 245843,245844 245846,245847 245848,1231 245848,1782 245848,2083 245851,209 245852,994 245853,760 245854,994 245855,245856 245857,23783 245858,424 245859,872 245860,640 245861,640 245862,640 245863,640 245864,145240 245865,852 245866,179170 245867,179170 245868,346 245869,1287 245871,2671 245872,1634 245873,240 245874,79 245876,118336 245879,868 245880,245881 245882,3003 245883,1151 245885,1860 245886,1858 245887,245888 245890,2460 245891,163 245892,255 245893,1860 245894,1858 245895,447 245897,138686 245898,175 245899,245900 245901,663 245901,2205 245901,33424 245901,245910 245903,35486 245904,1893 245905,217 245906,743 245907,179170 245908,179170 245909,1572 245910,289 245910,298 245910,397 245910,704 245910,714 245910,1016 245910,1192 245910,1282 245910,1462 245910,1818 245910,2205 245910,2286 245910,4218 245910,8537 245910,33424 245910,94134 245910,245910 245911,1882 245912,682 245912,72439 245913,1400 245914,326 245915,146 245915,92476 245916,647 245917,344 245918,1188 245919,179170 245920,868 245921,33 245921,40 245921,60 245921,115 245921,118 245921,1253 245921,1432 245921,2674 245921,154690 245921,171294 245922,920 245923,743 245925,179170 245926,200 245927,707 245929,179170 245930,1132 245931,3094 245932,1274 245933,3252 245934,2646 245935,192 245936,217 245937,200 245938,422 245939,563 245939,911 245939,991 245939,1132 245939,1623 245941,83 245942,1381 245943,1082 245944,158 245945,422 245946,422 245947,422 245948,2775 245949,447 245951,422 245954,422 245955,852 245956,87 245956,1151 245957,1181 245958,932 245959,422 245960,179170 245961,422 245962,422 245963,994 245964,1238 245965,406 245967,852 245967,1688 245968,1618 245969,1452 245970,424 245971,424 245972,994 245973,1432 245974,118336 245976,309 245976,310 245977,779 245978,179170 245980,925 245981,1132 245983,50 245984,304 245985,179170 245986,4611 245987,1544 245988,23783 245989,312 245990,118336 245991,138686 245992,175 245993,536 245994,563 245995,202 245996,179170 245997,179170 245998,994 245999,2605 246000,1707 246002,875 246003,843 246004,592 246005,843 246006,843 246007,315 246008,843 246009,1789 246010,302 246010,861 246011,246012 246013,114 246014,3585 246015,3582 246016,406 246017,994 246018,8270 246019,3585 246020,2620 246021,346 246022,30 246023,30 246024,743 246025,209 246026,5405 246027,222 246028,11 246029,1370 246030,861 246031,179170 246032,179170 246033,73570 246034,859 246035,1858 246036,1860 246037,246038 246039,73570 246040,285 246041,136 246041,563 246042,1983 246043,142430 246044,30 246045,248 246045,1332 246046,217 246047,3999 246048,4611 246049,1544 246050,1274 246051,246052 246053,30 246054,1052 246055,54 246056,2775 246057,1962 246058,302 246059,1893 246060,289 246060,94134 246061,149 246062,83 246063,209 246064,450 246065,7360 246066,30 246067,151 246068,30 246069,328 246069,141912 246070,781 246071,1132 246072,781 246073,1132 246074,179170 246075,118336 246076,148742 246078,30 246079,1544 246080,4611 246081,387 246082,8270 246083,491 246084,1749 246084,1882 246085,872 246086,114 246086,116 246086,2087 246086,13704 246087,493 246088,1160 246089,4060 246090,2073 246091,19010 246092,3392 246093,158 246094,1722 246095,1818 246096,1167 246097,1785 246098,589 246099,605 246100,1124 246101,1782 246102,973 246103,86 246104,660 246105,994 246106,240174 246107,918 246107,1160 246108,563 246109,2979 246110,515 246111,30 246112,2266 246113,775 246114,222 246115,30 246116,19010 246117,2105 246118,19010 246119,126 246120,1119 246121,875 246122,875 246123,179170 246124,106 246124,195 246124,586 246126,30 246127,1240 246128,1285 246129,862 246129,1085 246129,2812 246130,1381 246130,1612 246131,30 246132,255 246133,1 246134,30 246135,1888 246136,3260 246137,79 246138,30 246139,918 246140,30 246141,179170 246142,246143 246144,151 246145,1285 246146,179170 246147,138686 246148,175 246149,179170 246150,2017 246151,1220 246152,252 246153,251 246154,179170 246155,1 246156,389 246156,1072 246157,179170 246158,516 246159,19010 246161,30 246162,493 246163,240 246164,1882 246165,179170 246166,20 246167,393 246168,1132 246169,246170 246171,557 246172,135 246173,179170 246174,83 246175,30 246176,149 246177,30 246178,227061 246179,278 246180,151 246181,252 246182,179170 246183,1181 246184,694 246184,1240 246185,30 246186,272 246186,333 246186,1531 246187,34 246187,35 246187,37 246187,44 246187,50 246187,58 246187,59 246187,79 246187,104 246187,106 246187,111 246187,116 246187,135 246187,147 246187,178 246187,195 246187,202 246187,264 246187,278 246187,289 246187,333 246187,337 246187,372 246187,393 246187,479 246187,516 246187,577 246187,585 246187,588 246187,590 246187,592 246187,620 246187,622 246187,640 246187,720 246187,779 246187,877 246187,907 246187,949 246187,1007 246187,1033 246187,1085 246187,1151 246187,1210 246187,1212 246187,1247 246187,1265 246187,1266 246187,1284 246187,1370 246187,1381 246187,1453 246187,1454 246187,1509 246187,1515 246187,1522 246187,1531 246187,1634 246187,1659 246187,1732 246187,1776 246187,1893 246187,2051 246187,2073 246187,2087 246187,2191 246187,2371 246187,2782 246187,2931 246187,3194 246187,3422 246187,3695 246187,3794 246187,4079 246187,4192 246187,4193 246187,5265 246187,5310 246187,5440 246187,8180 246187,8270 246187,8308 246187,8598 246187,8788 246187,8811 246187,8822 246187,8907 246187,9542 246187,31237 246187,44244 246187,94134 246187,164572 246187,240174 246188,217 246190,14366 246191,32 246192,634 246193,179170 246194,694 246194,3115 246195,30 246196,406 246197,406 246198,179170 246199,246200 246201,707 246202,602 246203,595 246204,179170 246205,179170 246206,10 246207,602 246207,3370 246208,34 246208,35 246209,1368 246210,535 246211,3148 246212,83 246213,1177 246214,292 246215,8270 246216,146314 246217,333 246218,622 246219,781 246220,1132 246221,994 246222,7092 246223,15119 246224,994 246226,406 246227,994 246228,932 246229,704 246230,79 246231,83378 246232,278 246233,332 246234,179170 246235,1860 246236,1858 246237,179170 246238,179170 246239,663 246239,4545 246239,6119 246239,56150 246240,1274 246241,179170 246242,83 246243,246244 246245,179170 246246,179170 246248,179170 246249,1773 246250,525 246250,1893 246250,3804 246251,1151 246252,557 246253,138 246254,865 246255,557 246256,137 246257,88820 246258,10 246259,179170 246260,179170 246261,179170 246262,179170 246263,179170 246264,179170 246265,179170 246266,179170 246267,137 246268,179170 246269,179170 246270,179170 246271,179170 246272,182162 246273,1608 246274,313 246274,1590 246274,1644 246274,2274 246275,179170 246276,333 246277,179170 246278,195 246279,179170 246281,30 246282,1718 246283,179170 246284,179170 246285,207 246286,179170 246287,217 246288,366 246289,179170 246290,179170 246291,246292 246293,179170 246294,707 246295,328 246296,356 246297,179170 246298,240 246298,251 246298,278 246298,372 246298,435 246298,447 246298,516 246298,518 246298,589 246298,775 246298,973 246298,1001 246298,1010 246298,1082 246298,1085 246298,1326 246298,2812 246298,5961 246299,240 246300,450 246301,138686 246302,175 246303,215 246304,246305 246306,246307 246308,179170 246310,147 246311,220816 246312,50 246313,707 246314,220816 246315,220816 246316,220816 246317,406 246318,220816 246319,220816 246320,220816 246321,220816 246322,2373 246323,179170 246324,1224 246325,24505 246326,1467 246327,493 246328,246329 246330,250 246330,1684 246331,285 246332,366 246333,366 246334,1326 246335,1323 246336,102 246337,408 246338,179170 246339,250 246339,1684 246340,1085 246341,294 246342,4222 246343,1010 246344,671 246346,406 246347,138686 246348,175 246349,1326 246350,220816 246352,1087 246353,106 246354,246355 246356,220816 246357,269 246358,220816 246359,920 246360,1227 246360,86416 246361,220816 246362,246363 246364,779 246365,220816 246366,346 246367,220816 246368,220816 246369,225 246370,483 246371,10 246372,220816 246373,10 246374,220816 246375,220816 246376,30 246377,862 246378,1368 246379,30 246380,1274 246381,246382 246383,30 246384,8884 246385,220816 246386,1085 246387,1551 246388,1769 246388,2205 246388,33424 246388,245910 246389,220816 246390,220816 246391,246392 246393,86416 246394,3804 246395,220816 246396,179170 246397,30 246398,795 246399,1181 246400,240 246401,82603 246402,82603 246403,1 246404,563 246405,30 246406,179170 246407,179170 246408,220816 246409,179170 246410,179170 246411,179170 246412,671 246413,220816 246414,179170 246415,30 246416,30 246417,15748 246418,972 246419,179170 246420,707 246421,302 246422,285 246423,250 246423,1684 246424,366 246425,285 246426,366 246427,250 246427,1684 246428,220816 246429,148742 246430,707 246431,809 246432,366 246433,707 246434,58 246435,220816 246436,366 246437,5440 246438,535 246439,1634 246440,707 246441,220816 246442,220816 246443,167 246444,2205 246444,33424 246444,245910 246445,220816 246446,68 246447,179170 246448,30 246449,220816 246450,1140 246451,35486 246452,179170 246453,267 246454,149 246455,1458 246456,1858 246457,1860 246458,2744 246459,1014 246460,1014 246461,1014 246462,179170 246463,1014 246464,179170 246465,246466 246467,1014 246468,1014 246469,1014 246470,200 246471,34 246471,35 246472,1014 246473,932 246474,1818 246475,1294 246476,994 246477,994 246478,285 246480,192 246481,346 246482,891 246483,83 246485,1014 246486,18726 246487,136 246487,137 246488,1132 246489,781 246490,104 246491,211 246494,246495 246496,1466 246497,13546 246498,455 246499,2266 246500,2443 246501,2443 246502,283 246503,217 246504,269 246505,781 246506,1132 246507,246508 246510,346 246511,30 246512,1888 246513,707 246514,9318 246515,707 246516,707 246517,346 246519,483 246520,760 246521,30 246522,875 246523,1381 246524,1381 246525,149 246527,973 246528,312 246529,682 246529,72439 246530,30 246531,1381 246532,949 246532,4637 246533,2244 246534,1893 246535,30 246536,30 246537,246538 246539,79 246540,30 246541,179170 246542,179170 246543,30 246544,932 246545,707 246546,72 246547,30 246548,2083 246549,1151 246549,1287 246551,640 246551,1181 246551,4192 246551,4193 246552,697 246553,346 246554,1844 246554,4237 246554,9024 246554,182162 246555,30 246556,1858 246557,1860 246558,246559 246560,30 246561,707 246562,707 246563,707 246564,707 246565,818 246566,707 246567,503 246568,707 246569,707 246570,155481 246571,138686 246572,175 246573,473 246574,2296 246575,346 246576,146 246576,92476 246577,647 246578,344 246579,220816 246580,113156 246581,60576 246582,707 246583,179170 246584,220816 246585,3623 246586,3623 246587,30 246588,2373 246589,30 246590,220816 246591,707 246592,707 246593,346 246594,1479 246595,390 246596,707 246598,30 246599,346 246600,246601 246602,30 246603,30 246604,30 246606,346 246607,30 246608,113156 246609,393 246610,346 246611,267 246612,255 246613,346 246614,707 246615,1132 246616,781 246617,346 246618,433 246619,346 246620,19010 246621,179170 246622,346 246624,346 246625,179170 246627,707 246628,233 246629,875 246630,81 246630,1745 246631,1052 246632,54 246633,2775 246634,1962 246636,151 246636,663 246637,65 246638,246639 246641,246642 246644,220816 246645,220816 246646,179170 246647,220816 246648,392 246649,220816 246650,220816 246651,220816 246652,220816 246653,220816 246654,220816 246655,220816 246656,220816 246657,13704 246657,23010 246658,94 246658,22663 246659,42220 246660,54064 246661,6068 246662,1785 246663,4193 246663,15573 246663,182162 246664,968 246665,907 246666,1191 246666,7363 246667,1087 246667,92476 246668,1203 246669,953 246670,115 246671,1177 246671,3794 246671,94134 246672,220816 246673,220816 246674,273 246675,220816 246676,179170 246677,220816 246679,220816 246680,195 246680,27217 246682,220816 246683,220816 246684,220816 246685,246686 246687,220816 246688,30 246689,220816 246690,222 246691,220816 246692,1849 246693,220816 246694,1773 246695,220816 246696,220816 246697,179170 246698,220816 246699,220816 246701,805 246702,179170 246703,246704 246703,252982 246705,220816 246706,107 246707,2416 246707,2417 246708,292 246709,338 246710,4237 246710,182162 246711,298 246712,1133 246713,3538 246714,805 246715,220816 246716,220816 246717,953 246718,392 246719,949 246720,63 246721,220816 246722,1634 246724,707 246725,83 246726,220816 246727,35486 246728,220816 246729,240 246730,83 246731,158 246733,83 246734,154408 246735,994 246737,83 246738,179170 246739,83 246740,503 246740,592 246740,1688 246740,1860 246740,1962 246740,4237 246740,182162 246741,932 246742,83 246743,1962 246744,596 246745,5265 246745,164572 246746,1266 246746,1414 246746,72439 246747,261 246748,1082 246748,1253 246749,298 246750,1087 246750,92476 246751,117 246751,1203 246752,15573 246752,182162 246753,211 246753,7363 246754,83 246755,1191 246756,115 246757,3794 246757,27550 246758,8991 246759,116 246759,29475 246760,1192 246761,2266 246762,589 246763,818 246763,2868 246764,23010 246765,160 246768,344 246769,83 246770,707 246772,83 246775,1860 246776,1858 246777,179170 246778,387 246779,149 246780,143 246781,433 246783,994 246784,147 246785,179170 246787,298 246788,485 246789,179170 246790,581 246791,1381 246792,1381 246793,435 246793,29015 246793,32929 246793,248818 246794,1983 246795,138686 246796,175 246798,179170 246799,206 246800,2266 246800,6424 246802,1132 246803,781 246805,406 246806,805 246808,1181 246809,1181 246810,179170 246811,72 246812,246813 246814,246815 246816,179170 246817,5213 246820,163 246821,179170 246822,179170 246823,805 246824,346 246825,179170 246826,2995 246827,30 246829,1962 246830,1773 246831,1181 246832,346 246833,6068 246833,25348 246833,94134 246833,164572 246834,1266 246834,20813 246835,932 246836,255 246837,7652 246837,92476 246838,5 246838,307 246839,302 246840,346 246842,483 246844,206 246845,224488 246846,157091 246846,199972 246846,211506 246846,217083 246846,217086 246847,246848 246849,1891 246850,289 246850,94134 246851,1010 246852,206 246853,707 246854,392 246855,1132 246856,781 246857,246858 246859,557 246860,240174 246861,907 246861,25348 246862,60 246862,114 246862,741 246863,30 246864,557 246865,994 246866,138686 246867,175 246868,1893 246869,994 246870,707 246871,1509 246872,538 246872,9379 246873,142870 246874,8308 246875,56 246876,422 246878,179170 246880,137 246881,240174 246882,707 246883,707 246884,346 246885,30 246886,206 246888,994 246889,346 246890,1087 246891,346 246893,346 246894,30 246896,994 246897,246898 246899,809 246899,1085 246900,366 246901,188791 246902,1181 246903,818 246903,2991 246904,2868 246904,182162 246905,2073 246906,1177 246907,4193 246907,8373 246908,452 246909,1087 246909,1684 246910,246911 246912,302 246913,179170 246914,32 246915,346 246916,34 246916,35 246917,422 246918,3623 246919,135 246920,30 246921,406 246921,622 246922,30 246923,246924 246925,30 246926,346 246927,246928 246929,2480 246930,6068 246931,255 246932,3623 246933,364 246934,5 246934,195 246934,191860 246935,1266 246935,2371 246935,72439 246936,1785 246937,1684 246937,8373 246938,8788 246939,8991 246939,25348 246940,8270 246941,307 246941,452 246942,7652 246943,3872 246944,907 246945,805 246946,516 246947,179170 246948,138686 246949,175 246950,1893 246951,187 246952,246953 246954,246953 246955,55849 246956,360 246957,422 246958,56 246959,1227 246960,2244 246961,1181 246962,1181 246963,1181 246964,246965 246966,657 246967,119 246968,640 246969,246970 246971,104 246972,2073 246973,10 246974,292 246975,114 246976,246977 246978,294 246979,142473 246980,296 246981,298 246982,15068 246983,3623 246984,704 246985,592 246986,406 246987,493 246988,585 246989,586 246990,393 246991,79 246992,50 246993,312 246994,246995 246996,246997 246998,30 247000,247001 247002,247001 247003,247004 247005,4611 247006,1544 247007,328 247007,25348 247008,827 247008,92476 247008,164572 247009,818 247010,1089 247011,1381 247012,136 247013,247014 247015,83 247016,907 247017,2244 247018,1983 247019,247020 247021,8854 247022,1882 247023,179170 247024,1927 247025,615 247026,447 247027,2775 247028,1132 247029,781 247030,994 247031,707 247032,5301 247033,1860 247034,1858 247036,346 247037,56 247038,422 247039,211 247040,1927 247041,162599 247042,240 247042,2334 247042,3331 247043,1043 247044,640 247045,640 247046,640 247047,138686 247048,175 247049,104 247050,83 247051,1572 247052,1634 247053,247054 247055,433 247056,106 247056,586 247059,389 247059,185877 247061,141912 247062,346 247063,422 247064,862 247065,671 247067,4193 247067,6068 247068,1087 247068,1684 247069,34 247069,272 247070,195 247070,7652 247071,422 247072,422 247073,422 247075,240 247075,1309 247075,2512 247075,4190 247075,9015 247075,204698 247075,219266 247075,261748 247076,422 247077,422 247078,422 247079,422 247080,422 247081,285 247082,422 247083,422 247085,1381 247087,1425 247088,707 247089,6424 247090,1707 247091,346 247092,1238 247095,920 247096,3538 247097,406 247099,1452 247101,35486 247102,309 247102,310 247103,1130 247104,4193 247105,415 247106,1556 247107,1294 247108,209 247108,861 247109,269 247110,1707 247111,137 247112,269 247113,8541 247114,827 247115,226825 247116,875 247117,1001 247118,415 247119,920 247120,179170 247121,3623 247122,138686 247123,175 247124,1052 247125,54 247126,2775 247127,1962 247128,264 247129,179170 247130,1012 247132,2244 247133,309 247133,310 247134,301 247135,1509 247137,1634 247138,1655 247139,809 247140,1756 247141,5906 247142,37088 247143,1019 247144,2944 247145,2553 247147,868 247149,192 247150,30 247151,932 247152,6424 247152,127158 247153,7768 247155,493 247156,406 247157,247158 247159,247160 247161,1359 247162,422 247163,2931 247163,92476 247163,164572 247164,843 247165,184 247167,1220 247168,516 247169,252 247170,302 247171,1240 247172,83 247173,44 247174,272 247175,147 247176,247177 247178,167 247178,2083 247178,73570 247179,1458 247180,841 247181,5265 247182,875 247183,859 247184,1531 247185,671 247186,779 247186,68069 247187,694 247189,3623 247190,596 247191,140 247192,2620 247193,3623 247194,577 247195,2590 247196,1844 247197,6119 247198,56 247199,422 247200,640 247202,31073 247203,146 247203,92476 247204,647 247205,344 247206,2260 247207,1454 247208,145751 247209,15 247210,406 247210,21442 247211,1085 247212,875 247215,1571 247216,3177 247217,118336 247218,10 247218,3111 247219,312 247220,240174 247222,893 247223,73570 247224,439 247224,1068 247225,2646 247226,459 247228,346 247229,1773 247230,818 247231,875 247232,442 247232,1332 247233,459 247234,346 247235,179170 247236,179170 247238,22 247239,2421 247240,63 247241,805 247243,346 247246,192 247247,13704 247248,187176 247249,2421 247250,868 247251,217 247252,408 247253,483 247254,179170 247255,3623 247256,179170 247259,693 247261,179170 247262,1257 247263,147 247264,179170 247265,358 247266,1181 247267,1181 247268,459 247270,191860 247271,5440 247272,1544 247272,3370 247273,1266 247273,1785 247273,72439 247274,2073 247275,22663 247276,4193 247276,15573 247276,182162 247277,1087 247277,92476 247279,34 247279,94 247279,42220 247280,8991 247281,1715 247282,54064 247283,117 247283,1203 247284,372 247284,25348 247285,809 247286,907 247287,953 247288,5714 247289,115 247289,3794 247290,1177 247290,94134 247291,818 247291,2868 247292,1253 247292,5265 247292,164572 247293,5 247293,364 247294,179170 247295,1612 247295,1927 247296,994 247297,179170 247298,875 247299,179170 247300,7416 247301,30 247302,1590 247304,707 247305,147 247306,536 247307,5405 247308,251 247309,328 247310,179170 247311,1860 247312,1858 247313,8180 247314,247 247315,332 247316,30 247317,309 247317,310 247318,5405 247319,515 247320,179170 247322,875 247323,1326 247324,346 247326,489 247327,571 247329,289 247329,1149 247329,1282 247329,75912 247329,94134 247330,1070 247331,5405 247332,3 247333,346 247334,3623 247335,557 247336,1368 247337,585 247337,92476 247338,818 247339,392 247339,2699 247340,138686 247341,175 247342,346 247343,3321 247344,5343 247345,179170 247346,50 247346,1544 247347,247348 247349,3209 247350,179170 247351,2266 247352,2421 247353,217 247354,4637 247356,1201 247357,1467 247359,315 247360,7363 247360,20813 247362,179170 247363,179170 247364,875 247365,179170 247367,875 247368,875 247369,247370 247371,179170 247372,200 247373,251 247373,516 247374,1224 247375,1893 247376,151 247377,44 247378,97 247379,2931 247380,1379 247380,92476 247381,7652 247382,1231 247383,1282 247384,195 247384,1118 247385,3209 247386,143287 247387,994 247388,3623 247389,707 247390,151 247392,4611 247393,146 247393,92476 247394,1151 247395,4672 247396,433 247397,179170 247398,1436 247399,406 247399,602 247400,240174 247401,195 247402,255 247403,5 247403,94 247403,7652 247404,372 247405,307 247405,4355 247406,827 247406,92476 247406,164572 247407,1181 247408,42220 247409,34 247409,115 247411,328 247411,25348 247412,2995 247413,1133 247414,7124 247414,94134 247415,1414 247416,8992 247417,179170 247418,1381 247419,179170 247420,137 247421,30 247422,179170 247423,433 247424,1882 247425,932 247426,563 247427,179170 247428,980 247429,247 247430,707 247431,3260 247432,1368 247433,247 247434,1096 247435,285 247436,557 247437,557 247438,192 247439,3623 247440,113156 247441,2373 247442,83 247444,920 247445,220816 247446,2646 247447,663 247448,147 247448,158 247448,178 247448,202 247448,406 247448,622 247449,781 247450,1132 247451,220816 247452,1590 247453,220816 247454,1467 247455,149534 247456,179170 247457,220816 247459,220816 247460,220816 247461,285 247462,346 247463,10 247464,2421 247465,220816 247466,30 247467,289 247467,94134 247468,7092 247469,220816 247470,137 247471,179170 247472,178 247473,247474 247475,179170 247476,994 247477,79 247478,220816 247479,179170 247480,220816 247481,247482 247483,209 247484,2421 247485,1707 247486,10 247487,220816 247488,247489 247490,278 247491,346 247492,220816 247493,217 247494,220816 247495,346 247496,247497 247498,1556 247499,124668 247500,220816 247501,1888 247502,5906 247503,557 247504,626 247505,278 247506,137 247507,862 247508,220816 247509,781 247510,1132 247511,1068 247512,247513 247514,1608 247516,220816 247517,134 247518,220816 247519,215 247520,875 247521,1368 247522,220816 247523,1220 247524,252 247525,516 247526,220816 247527,10 247528,220816 247529,179170 247530,13980 247531,2421 247532,220816 247533,447 247534,2775 247535,220816 247536,861 247537,220816 247538,385 247539,220816 247540,26041 247541,30 247542,283 247543,104 247543,136 247543,254 247543,557 247543,953 247543,1368 247543,1939 247543,7270 247544,220816 247545,220816 247546,220816 247547,220816 247548,3148 247549,994 247550,1085 247551,536 247552,56 247553,422 247554,30 247555,346 247556,596 247557,994 247558,346 247559,147 247560,179170 247561,1294 247562,994 247563,179170 247564,875 247565,220816 247566,220816 247567,220816 247568,13980 247569,278 247570,875 247571,220816 247572,240174 247573,346 247574,2116 247575,220816 247576,37 247576,1740 247577,220816 247578,273 247580,994 247581,346 247582,994 247583,155481 247585,19 247586,220816 247587,1181 247588,217 247589,30 247590,247591 247592,247 247593,309 247593,310 247594,205488 247595,1849 247596,30 247597,30 247598,3507 247599,269 247601,41 247602,294 247603,2266 247604,247605 247606,138686 247607,175 247608,58 247609,994 247610,46 247611,634 247612,1807 247612,2775 247613,589 247613,1001 247614,10 247615,195 247615,344 247615,1684 247616,103153 247617,77 247618,1467 247619,640 247620,1544 247622,875 247623,1773 247624,788 247625,388 247626,155481 247627,247628 247629,2424 247630,179170 247631,781 247632,1132 247633,875 247634,932 247635,704 247636,79 247637,179170 247638,875 247639,536 247640,35486 247641,1052 247644,247645 247646,267 247647,1539 247648,54 247649,660 247650,2421 247651,399 247652,9030 247653,312 247655,994 247656,58 247657,46 247658,2146 247659,1087 247660,222 247661,781 247662,1132 247665,209 247666,366 247667,217 247668,167 247669,707 247670,366 247671,2373 247672,366 247673,366 247674,707 247675,366 247676,781 247677,1132 247678,875 247679,13980 247680,247681 247683,302 247684,1882 247685,538 247685,23161 247685,26785 247685,106083 247685,251408 247685,252670 247685,253099 247687,1860 247688,1858 247689,179170 247690,1860 247691,1858 247692,72 247692,192 247692,222 247692,267 247692,305 247692,306 247692,307 247692,383 247692,489 247692,605 247692,704 247692,1388 247692,1509 247692,1579 247692,1619 247692,1634 247692,1707 247692,2915 247692,3297 247692,3999 247692,8308 247694,178 247695,467 247695,127158 247696,640 247697,640 247698,640 247699,1212 247700,247701 247702,640 247703,640 247704,1204 247706,827 247707,75912 247708,422 247709,422 247710,422 247711,422 247712,422 247713,422 247714,422 247715,422 247716,422 247717,439 247718,422 247719,422 247720,422 247723,1556 247724,1124 247725,390 247726,589 247727,1414 247728,671 247728,7363 247729,1087 247731,577 247732,707 247733,149 247733,406 247735,247736 247737,179170 247738,97 247739,1014 247740,146 247740,92476 247741,392 247743,44725 247744,868 247745,920 247746,73570 247747,4252 247748,200 247749,1368 247750,358 247751,179170 247752,1860 247753,1858 247754,920 247755,609 247756,120 247757,189839 247758,83 247758,3507 247759,247760 247761,4678 247762,579 247763,179170 247764,40360 247766,980 247767,596 247767,1616 247769,35486 247771,215 247771,278 247771,328 247771,694 247771,1033 247771,1962 247772,261 247773,1240 247774,4611 247775,247776 247777,247778 247779,192 247780,1531 247781,760 247782,1983 247782,48505 247783,272 247784,240 247785,1715 247787,104 247789,2931 247790,2979 247791,1241 247792,1326 247793,3 247794,5130 247795,1715 247796,795 247797,518 247798,3094 247799,775 247800,233 247801,3804 247802,4146 247803,649 247804,301 247805,252 247807,1326 247808,217 247809,631 247810,240 247812,179170 247813,138686 247814,175 247815,868 247816,2421 247817,1001 247818,493 247819,861 247820,973 247820,1010 247820,1298 247820,1849 247821,1227 247821,86416 247822,707 247823,4611 247824,1544 247825,71 247826,301 247827,269 247828,217 247829,148742 247830,1381 247831,968 247833,1893 247834,1644 247835,1544 247836,4611 247839,1844 247840,1370 247840,6119 247840,21736 247841,247842 247850,4611 247855,743 247857,106 247858,179170 247861,83 247862,577 247865,1677 247867,252 247868,332 247868,2797 247875,19010 247877,872 247878,843 247879,707 247880,346 247881,1130 247882,107 247883,1014 247884,1014 247885,247886 247887,171641 247889,1014 247890,1014 247891,707 247892,209 247893,22 247894,875 247896,707 247897,252 247898,79 247899,4545 247899,56150 247900,142409 247901,707 247902,615 247902,968 247902,1293 247902,1782 247905,7652 247908,107 247911,192 247912,1133 247913,1882 247915,1284 247916,518 247919,1284 247922,1284 247924,1818 247927,1284 247931,60576 247932,932 247933,107 247934,1608 247935,269 247937,23783 247939,83 247940,147 247941,247942 247943,179170 247944,179170 247945,703 247946,1085 247947,1010 247948,861 247949,1116 247951,22 247952,577 247954,483 247955,720 247956,247957 247958,4218 247959,278 247960,179170 247961,178 247962,148742 247964,179170 247965,179170 247966,557 247967,707 247968,1014 247970,4237 247970,182162 247971,13538 247972,861 247973,707 247975,9457 247976,179170 247977,73570 247978,500 247979,657 247980,41 247982,309 247982,310 247983,73570 247984,1927 247985,1718 247986,707 247987,1363 247987,1836 247987,40360 247988,149 247989,422 247989,5405 247990,302 247991,251 247992,932 247993,118336 247994,626 247995,138686 247996,179170 247997,175 247999,179170 248000,1266 248000,45960 248001,5440 248002,671 248002,15573 248003,779 248004,1590 248005,760 248006,2048 248008,920 248010,30 248012,1773 248015,19010 248016,31073 248017,515 248019,158 248021,714 248021,2868 248021,2991 248021,182162 248022,818 248023,42220 248024,1177 248024,1253 248025,592 248026,179170 248027,4193 248027,8373 248028,1684 248028,1955 248030,479 248031,7416 248032,1773 248033,247 248034,868 248035,97 248036,1402 248037,663 248038,406 248039,2156 248040,1381 248041,920 248042,179170 248043,179170 248044,147 248044,158 248044,422 248045,589 248046,120 248046,438 248046,795 248046,818 248046,1122 248046,2699 248047,179170 248049,949 248050,179170 248051,179170 248053,1882 248054,1634 248055,536 248056,142426 248057,1983 248058,23783 248059,149 248060,179170 248061,179170 248063,7760 248065,818 248066,1133 248067,636 248068,179170 248069,179170 248070,859 248071,200 248072,275 248073,179170 248074,179170 248075,30 248076,151 248076,1309 248077,726 248078,179170 248079,179170 248080,19010 248081,151 248082,302 248083,3252 248084,2779 248085,536 248086,151 248087,222 248088,2944 248089,1363 248090,2424 248091,455 248092,313 248093,4172 248094,6298 248095,949 248096,147 248097,589 248098,179170 248099,179170 248100,577 248101,406 248102,83 248103,83 248104,179170 248105,366 248106,1556 248107,222 248108,30 248109,200 248110,179170 248111,34 248111,35 248111,83 248112,179170 248113,179170 248114,179170 248115,779 248116,563 248117,179170 248118,72 248118,278 248118,631 248118,660 248118,852 248118,949 248118,1133 248118,1274 248118,1467 248118,1881 248118,2244 248118,2779 248118,4637 248118,4903 248118,7092 248118,9015 248119,752 248120,2244 248121,273 248122,207 248123,56 248124,422 248125,1210 248126,2620 248127,516 248128,2775 248129,1858 248130,1860 248131,406 248132,5034 248133,406 248134,3846 248135,31073 248136,179170 248137,752 248138,56 248139,422 248140,247 248141,1572 248142,1319 248142,2083 248143,2083 248144,1240 248145,30 248146,19010 248147,179170 248148,1551 248149,247 248150,206 248151,83 248152,818 248153,2923 248154,113156 248155,220816 248156,1479 248157,360 248158,346 248159,56 248160,422 248161,7092 248162,1579 248163,30 248164,220816 248165,1644 248166,220816 248167,248168 248169,920 248170,220816 248171,278 248172,301 248173,247 248174,30 248175,875 248176,217 248177,861 248178,220816 248179,248180 248181,1782 248182,179170 248183,707 248184,179170 248185,179170 248186,179170 248187,179170 248188,30 248189,167 248189,631 248189,1010 248190,179170 248191,104 248192,179170 248193,1551 248194,30 248195,179170 248196,19010 248197,272 248198,179170 248199,932 248200,781 248201,1132 248202,1127 248203,4548 248204,179170 248205,3804 248206,7572 248207,8798 248208,417 248209,346 248210,346 248211,179170 248212,248213 248214,3422 248215,2006 248216,968 248217,14797 248218,5662 248219,233 248220,518 248221,1955 248222,1001 248223,1231 248224,63 248225,390 248226,1715 248227,302 248228,1564 248229,3 248230,179170 248231,707 248232,2590 248233,875 248234,179170 248235,19443 248237,435 248238,220816 248239,10 248240,179170 248241,220816 248242,248243 248244,227669 248245,220816 248246,843 248247,919 248248,56 248249,267 248250,220816 248251,255 248252,220816 248253,518 248254,138686 248255,175 248256,707 248257,220816 248258,9457 248259,1467 248260,581 248261,220816 248262,1359 248263,220816 248264,220816 248265,83 248267,3623 248268,63 248268,527 248269,220816 248270,1590 248271,1181 248272,220816 248273,248274 248273,251924 248275,30 248276,136 248276,137 248276,657 248276,2266 248277,248278 248277,263522 248279,278 248280,525 248281,248282 248283,3623 248284,1309 248285,248286 248285,252500 248287,285 248288,1285 248289,636 248290,3623 248291,179170 248292,949 248292,968 248293,631 248294,2424 248295,294 248296,8854 248297,366 248298,179170 248299,366 248300,366 248301,366 248302,366 248303,248304 248305,366 248306,151 248307,366 248308,366 248309,147 248310,366 248312,179170 248313,3260 248314,248315 248316,179170 248317,179170 248319,3623 248320,994 248321,1363 248322,491 248323,1001 248324,151 248325,247 248326,248327 248328,850 248329,30 248330,44 248331,272 248332,5265 248333,3623 248334,3623 248335,248336 248337,2812 248338,1634 248339,346 248340,206 248341,179170 248342,491 248343,248344 248345,83 248346,50 248346,779 248347,30 248348,278 248349,247 248350,10 248351,1849 248352,30 248353,920 248354,389 248355,33611 248356,30 248357,1893 248358,30 248359,248360 248361,179170 248362,392 248362,852 248363,192 248364,248365 248366,424 248367,137 248368,68 248368,2590 248369,171 248371,30 248372,30 248373,248374 248375,1326 248376,102 248377,1323 248378,408 248379,267 248380,390 248381,850 248383,1551 248384,179170 248385,1 248385,147 248385,149 248386,1381 248387,862 248387,2590 248388,1 248389,920 248390,248391 248392,248393 248394,15119 248396,240 248397,248398 248400,596 248401,972 248402,179170 248403,15609 248404,179170 248405,171 248406,179170 248407,1132 248408,781 248409,179170 248410,179170 248411,179170 248412,248413 248414,626 248415,248416 248417,30 248418,30 248420,1353 248421,179170 248422,179170 248423,179170 248424,707 248425,707 248426,56 248427,422 248428,211 248429,5366 248430,1266 248430,7270 248433,626 248434,248435 248434,253772 248436,707 248437,366 248438,781 248439,1132 248440,980 248441,162599 248442,2045 248442,201298 248443,852 248445,272 248446,450 248448,1531 248450,30 248451,1368 248452,994 248453,30 248454,640 248455,640 248456,1118 248457,30 248458,422 248459,422 248460,422 248461,1370 248462,422 248463,422 248464,422 248465,422 248466,422 248467,422 248468,422 248469,422 248470,422 248471,1294 248472,640 248473,227 248476,269 248477,207 248478,179170 248479,179170 248480,1821 248480,21736 248481,9195 248482,137 248483,1033 248484,510 248485,30 248486,794 248487,37 248488,200 248490,79 248491,15068 248492,35486 248493,222 248493,248556 248494,19010 248495,272 248495,1531 248498,1294 248499,346 248500,859 248501,202 248502,346 248503,991 248503,1749 248504,97 248505,30 248506,3623 248507,1326 248508,346 248509,920 248510,192 248511,1849 248512,3623 248513,775 248513,3804 248515,1132 248516,868 248518,408 248519,158 248519,252 248520,994 248521,217 248522,179170 248524,1132 248525,1052 248526,54 248527,2775 248528,217 248529,1132 248530,346 248532,1309 248533,179170 248534,2617 248535,687 248537,3115 248538,596 248539,1274 248540,3094 248541,1294 248542,1132 248543,704 248544,179170 248545,1294 248546,592 248547,21442 248548,3115 248549,83 248550,30 248551,200 248552,115474 248555,289 248555,657 248555,94134 248556,278 248556,2207 248556,7075 248556,29055 248556,248493 248556,260367 248557,415 248558,2312 248559,151 248559,663 248560,56 248561,422 248562,158 248563,644 248564,87 248565,346 248566,346 248567,2315 248569,200 248571,1707 248572,932 248573,192 248575,3602 248576,240 248577,1010 248578,21442 248579,422 248580,56 248581,1238 248582,1313 248583,493 248584,843 248586,56 248587,422 248588,685 248589,8373 248590,83 248591,2260 248592,252 248592,1385 248593,694 248594,21442 248595,1452 248596,142426 248597,1132 248598,781 248599,1132 248600,422 248601,56 248602,1544 248603,4611 248604,285 248605,21442 248606,1983 248607,3246 248608,200 248609,259 248610,278 248611,83 248612,809 248613,83 248614,137 248615,2460 248616,1181 248617,760 248618,843 248619,211 248619,4078 248620,1132 248621,781 248622,818 248623,1118 248624,994 248625,252 248627,248628 248629,485 248630,406 248631,41 248632,743 248633,994 248634,21442 248635,1983 248636,346 248637,994 248639,240 248641,707 248642,226825 248644,1247 248644,164572 248645,22293 248646,1677 248647,749 248648,278 248649,83 248651,30 248652,707 248653,333 248654,302 248655,146 248655,92476 248655,141912 248656,406 248657,71 248658,406 248659,518 248660,192 248661,146 248661,92476 248662,809 248663,1019 248664,248665 248666,666 248667,192 248667,1619 248668,3602 248669,248670 248669,250142 248669,251176 248669,251597 248672,248673 248675,179170 248676,994 248677,589 248678,344 248679,2867 248679,2868 248681,422 248682,56 248684,356 248684,6068 248685,707 248686,310 248686,224488 248687,179170 248688,178 248689,1860 248690,1858 248691,217 248691,536 248692,920 248693,309 248693,310 248693,483 248694,3089 248695,7416 248697,994 248698,220502 248699,707 248700,1 248701,781 248702,1132 248703,994 248704,2646 248706,707 248707,994 248709,138686 248710,175 248711,179170 248712,283 248713,515 248716,179170 248717,346 248718,1132 248719,781 248720,179170 248721,107 248722,781 248723,1132 248724,996 248725,83 248726,349 248727,179170 248728,142870 248730,179170 248731,736 248732,179170 248733,240 248734,248735 248736,179170 248737,3260 248738,3003 248739,13661 248740,87 248740,1151 248741,302 248743,142870 248744,862 248745,861 248746,160 248747,333 248748,179170 248749,184 248750,179170 248751,179170 248752,179170 248754,147 248755,267 248756,1132 248757,781 248758,248759 248760,1782 248761,1058 248762,179170 248763,393 248763,435 248763,439 248764,179170 248765,255 248766,483 248767,1644 248768,179170 248769,346 248770,589 248771,346 248772,151 248773,1515 248774,3623 248775,875 248776,83 248777,248778 248779,809 248780,195 248781,179170 248782,1556 248783,1807 248784,220816 248785,393 248786,1132 248787,781 248788,179170 248789,77 248790,781 248791,1132 248792,220816 248793,30 248794,179170 248795,179170 248796,1616 248796,44725 248797,30 248798,2116 248799,220816 248800,663 248801,2373 248802,704 248803,179170 248804,704 248805,79 248806,79 248807,586 248808,50 248809,393 248810,406 248811,220816 248812,179170 248813,493 248814,585 248815,592 248816,248817 248818,435 248819,220816 248820,1893 248821,247 248822,158 248822,206 248822,217 248822,240 248822,301 248822,631 248822,968 248822,1001 248822,1801 248822,3623 248823,346 248824,557 248825,220816 248826,220816 248827,536 248828,151 248829,1415 248830,422 248831,56 248832,346 248833,35486 248834,179170 248836,220816 248837,179170 248838,240 248840,56 248841,422 248842,781 248843,1132 248844,220816 248845,138686 248846,175 248847,346 248848,920 248849,1623 248850,220816 248851,1623 248852,1085 248853,885 248853,13704 248854,932 248855,240 248855,631 248855,818 248855,1749 248855,1785 248855,2334 248855,2620 248855,5718 248855,9010 248857,433 248858,2620 248859,1590 248860,346 248861,707 248862,34 248862,35 248862,261 248862,392 248862,949 248862,1274 248862,1454 248862,1608 248862,2274 248863,217 248864,346 248865,7092 248866,346 248867,1370 248868,9457 248869,1821 248869,21736 248870,640 248871,149 248872,704 248873,79 248874,1052 248875,2775 248876,54 248877,56 248878,422 248879,302 248880,179170 248881,2750 248882,1631 248883,278 248884,179170 248885,255 248886,1326 248887,102 248888,1323 248889,408 248890,251 248891,247 248892,707 248893,34 248893,35 248894,994 248895,707 248896,83 248897,6556 248898,137 248899,151 248900,179170 248901,406 248902,179170 248903,179170 248904,220816 248905,563 248906,1132 248907,781 248908,220816 248909,179170 248910,17309 248911,179170 248913,220816 248914,179170 248915,179170 248916,516 248917,179170 248918,972 248919,278 248920,137 248921,5906 248922,557 248923,626 248924,220816 248925,862 248926,179170 248928,920 248929,346 248931,187176 248932,346 248933,1474 248934,179170 248937,255 248938,285 248939,920 248940,589 248941,248942 248943,30 248944,154408 248945,875 248946,130 248947,875 248948,875 248949,3003 248950,135 248951,179170 248952,30 248953,843 248954,179170 248955,179170 248956,179170 248957,536 248958,392 248958,433 248958,1805 248959,30 248960,605 248960,1414 248961,1452 248962,1893 248963,138686 248964,175 248965,392 248966,861 248967,147 248968,477 248969,875 248970,30 248971,3623 248972,220816 248973,3623 248974,1715 248975,179170 248976,179170 248977,179170 248978,211 248979,171 248980,875 248981,1983 248983,179170 248984,179170 248985,2697 248986,30 248987,179170 248988,179170 248989,1309 248990,932 248991,113156 248992,179170 248994,179170 248995,22 248996,346 248997,179170 248998,485 248999,30 249000,249001 249002,179170 249003,179170 249004,179170 249005,179170 249006,920 249007,285 249008,179170 249009,200 249010,7698 249011,30331 249012,1133 249013,249014 249015,920 249016,56 249017,422 249020,119 249021,493 249022,30 249023,392 249023,697 249023,1769 249024,249025 249026,30 249027,30 249029,525 249030,22293 249032,781 249033,1132 249034,138686 249035,175 249036,83 249037,640 249038,328 249039,1782 249040,179170 249041,1011 249041,1172 249042,179170 249043,249044 249043,253013 249043,260704 249045,1058 249047,179170 249048,120 249049,65 249049,195 249049,868 249051,252 249052,179170 249053,1043 249054,158 249056,408 249057,275 249058,1309 249059,868 249061,1016 249061,1119 249062,1309 249065,422 249066,422 249067,217 249068,640 249069,422 249070,422 249071,422 249072,422 249073,422 249074,422 249075,422 249076,422 249077,130 249078,1359 249079,422 249080,640 249081,640 249082,640 249083,422 249084,640 249085,640 249086,14366 249087,2048 249088,809 249089,278 249090,366 249091,366 249092,1368 249093,3585 249094,4 249094,5 249094,355 249094,527 249094,588 249094,590 249094,743 249094,2674 249094,4810 249094,6695 249095,1359 249096,366 249097,13361 249098,252 249099,447 249100,2775 249101,240 249101,372 249101,1082 249101,1085 249101,1580 249101,1807 249101,2812 249101,4222 249101,6068 249101,212692 249102,1849 249103,2168 249104,920 249105,1181 249106,752 249107,249108 249111,35486 249112,2671 249113,1132 249114,781 249115,312 249116,433 249118,852 249119,779 249120,536 249121,30 249122,30331 249123,179170 249125,1175 249126,406 249127,875 249129,1052 249130,83 249131,179170 249132,994 249133,312 249134,81070 249135,1556 249135,6303 249136,1132 249137,781 249140,2083 249141,111 249142,994 249143,6424 249144,60576 249145,141912 249146,356 249146,420 249147,932 249148,372 249149,179170 249150,893 249151,217 249152,781 249153,1132 249154,248 249155,875 249156,875 249157,657 249158,422 249159,200 249160,252 249160,1220 249161,1 249162,1220 249163,217 249164,994 249165,2989 249165,2991 249165,182162 249166,422 249167,252 249167,1220 249168,5 249168,1379 249169,307 249169,15573 249170,1177 249170,1253 249171,60576 249172,1381 249173,994 249174,140 249175,1287 249176,379 249177,346 249178,60576 249180,1381 249182,1284 249183,875 249184,875 249185,994 249186,83 249187,138686 249188,175 249189,1132 249190,781 249191,875 249192,872 249193,1415 249195,289 249195,94134 249196,2244 249197,1241 249198,252 249198,1220 249199,875 249200,994 249201,60576 249202,56 249203,2626 249205,872 249205,2528 249207,720 249208,79 249209,1466 249209,1608 249213,240174 249214,459 249215,104 249216,1749 249217,1300 249218,972 249219,349 249220,1882 249221,2205 249221,33424 249221,245910 249222,415 249223,611 249224,433 249225,138686 249226,30 249227,175 249228,433 249229,596 249230,875 249231,875 249232,875 249233,875 249234,255 249235,459 249236,666 249237,30 249238,435 249240,207 249241,76096 249242,875 249243,149 249244,2083 249245,1220 249246,252 249247,251 249248,240 249248,1085 249248,2812 249248,4222 249249,406 249250,875 249251,439 249252,843 249253,30 249254,1151 249255,390 249256,1309 249257,406 249258,313 249259,30 249260,949 249261,666 249262,872 249263,920 249264,392 249265,2286 249266,1085 249267,2296 249268,289 249268,94134 249269,417 249271,1181 249272,248 249272,1284 249274,175 249274,313 249275,1860 249276,1858 249277,1509 249278,515 249279,1515 249281,657 249282,83 249283,433 249284,147 249284,406 249284,779 249284,1458 249284,1515 249285,1415 249286,2646 249287,422 249288,302 249289,1085 249289,2205 249289,2296 249289,33424 249289,245910 249290,868 249291,994 249292,222 249292,949 249292,1881 249292,3115 249293,79 249294,249295 249294,250715 249294,252860 249297,247 249298,7360 249299,697 249299,1240 249299,1465 249300,622 249302,346 249304,483 249305,1 249307,1531 249308,596 249310,292 249311,885 249311,13704 249312,48 249313,278 249314,83 249315,1415 249316,406 249317,3623 249319,289 249319,94134 249320,1052 249321,54 249322,2775 249323,1052 249324,54 249325,2775 249326,179170 249327,1001 249328,3623 249329,557 249330,249331 249332,155481 249333,1415 249334,5961 249335,151 249336,275 249337,393 249338,4594 249339,1608 249340,4237 249340,182162 249341,435 249342,249343 249344,1465 249345,1556 249346,586 249347,3623 249348,467 249348,2931 249349,4549 249350,1240 249351,179170 249352,1454 249353,179170 249354,179170 249355,83 249356,3623 249357,2083 249358,811 249359,563 249360,34 249360,35 249360,2646 249361,302 249362,179170 249363,4594 249365,220816 249366,1132 249367,58 249368,46 249369,994 249370,278 249371,30 249372,255 249373,220816 249374,2646 249375,3623 249376,932 249377,1235 249377,1335 249378,1167 249379,35486 249380,861 249381,1181 249382,220816 249383,247 249384,247 249385,220816 249386,861 249387,137 249388,179170 249389,1359 249390,6424 249391,649 249392,249393 249394,220816 249395,32 249396,10 249396,147 249396,158 249396,795 249396,1572 249396,3804 249396,4039 249397,220816 249398,301 249398,663 249398,932 249399,179170 249400,392 249401,417 249402,200 249403,30 249404,247 249405,2286 249406,1085 249407,417 249408,289 249408,94134 249409,2296 249410,179170 249411,138686 249412,175 249413,200 249414,179170 249415,557 249416,344 249417,7092 249418,302 249418,344 249419,467 249420,388 249420,6638 249422,704 249423,79 249424,13980 249425,278 249426,3148 249427,577 249428,1782 249429,220816 249430,1474 249431,330 249432,179170 249433,673 249434,179170 249435,220816 249436,843 249437,1818 249438,34 249438,35 249439,179170 249440,1415 249441,220816 249442,179170 249443,1415 249444,1893 249445,119 249445,192 249445,309 249445,310 249445,577 249445,991 249445,2480 249445,3039 249445,249450 249445,249475 249446,30 249448,83 249452,505 249453,7 249454,267 249455,1415 249456,83 249456,2590 249456,6068 249457,179170 249458,1326 249459,102 249460,1323 249461,408 249462,557 249463,862 249464,8855 249465,589 249466,138686 249467,175 249468,850 249469,141912 249470,1087 249470,1684 249471,34 249471,35 249472,663 249473,220816 249474,1001 249476,233 249478,220816 249479,250 249479,1684 249480,1085 249481,285 249482,707 249483,220816 249484,220816 249485,2590 249486,1381 249487,30 249489,240 249489,332 249489,1082 249489,1309 249489,1807 249489,1888 249489,1955 249489,2775 249490,852 249491,179170 249492,167 249493,149 249494,249495 249496,1773 249497,389 249498,1579 249499,179170 249500,2116 249501,875 249502,1285 249502,1309 249502,9015 249503,179170 249504,340 249505,151 249506,1415 249507,179170 249508,220816 249509,875 249510,577 249511,179170 249512,147 249513,1359 249514,557 249515,220816 249516,249517 249518,179170 249519,202 249520,179170 249521,179170 249522,202 249523,1467 249524,455 249525,875 249526,2424 249528,217 249529,366 249530,1871 249531,850 249532,2421 249533,13980 249534,83 249535,1452 249536,68 249537,249538 249539,79 249540,130 249541,1 249542,841 249543,30 249545,3367 249546,179170 249547,179170 249548,249549 249550,841 249551,1235 249551,1335 249552,220816 249553,179170 249554,1414 249555,83 249557,249558 249559,249560 249562,200 249563,2590 249564,179170 249565,179170 249566,415 249567,179170 249568,249569 249570,179170 249571,179170 249572,220816 249573,2735 249574,872 249575,1429 249576,104 249576,136 249577,179170 249578,249579 249580,175 249581,1294 249582,4691 249583,1085 249584,179170 249585,179170 249586,30 249587,207 249588,1085 249589,240 249590,179170 249591,179170 249592,179170 249593,1453 249594,249595 249596,217 249597,366 249598,668 249599,178 249600,83 249601,366 249602,366 249603,366 249604,366 249605,2867 249605,2868 249606,704 249607,493 249608,283 249609,1143 249610,179170 249611,323 249612,1400 249613,872 249614,179170 249615,1860 249616,1858 249617,433 249618,2574 249620,1566 249621,1220 249622,252 249623,251 249624,58 249625,994 249626,46 249627,707 249628,360 249628,1127 249630,872 249631,586 249632,1858 249633,1860 249634,249635 249636,1579 249637,640 249638,640 249639,640 249640,640 249641,5034 249642,138686 249643,175 249644,663 249645,1821 249645,21736 249646,433 249647,1224 249648,3507 249649,60576 249650,2646 249651,1467 249653,3582 249654,202 249655,2574 249656,278 249657,60576 249658,920 249659,818 249660,663 249662,179170 249663,752 249664,35486 249665,142870 249666,1238 249668,934 249668,939 249668,150001 249668,171607 249668,261687 249668,261689 249669,179170 249670,4597 249671,994 249672,1452 249674,1984 249676,602 249676,1582 249676,3218 249676,99215 249676,176331 249676,249676 249676,249853 249676,249859 249676,252053 249677,991 249678,60576 249681,179170 249682,366 249683,79 249684,1252 249684,1253 249685,861 249686,50 249688,1274 249689,6695 249690,209 249691,1707 249693,315 249694,255 249696,994 249697,1220 249698,252 249699,251 249700,315 249701,148742 249702,1415 249703,252 249704,251 249705,1220 249706,422 249707,200 249708,2421 249709,422 249710,422 249711,422 249712,422 249713,1415 249714,179170 249715,932 249716,875 249717,567 249717,750 249717,1293 249718,315 249719,179170 249720,1985 249721,315 249722,1282 249723,422 249724,422 249725,30 249726,422 249727,433 249728,1773 249729,422 249730,315 249733,315 249734,1415 249735,818 249735,1014 249736,4597 249737,309 249737,310 249738,83 249739,447 249740,2775 249741,30 249742,217 249743,142870 249744,1415 249745,310 249745,3039 249747,3804 249748,1509 249750,1082 249751,657 249752,5310 249754,179170 249755,179170 249756,1644 249757,21442 249759,211 249760,130 249761,162599 249762,3 249764,1132 249766,1566 249768,1556 249769,714 249770,21442 249772,146 249772,92476 249773,5405 249774,1515 249775,994 249776,1070 249777,1531 249779,249780 249781,406 249782,45960 249784,1776 249785,344 249786,994 249788,141912 249789,338 249790,1087 249791,805 249792,1274 249793,249794 249795,875 249796,138686 249797,175 249799,835 249799,1572 249801,4823 249802,135 249803,388 249804,179170 249805,875 249806,2784 249807,3474 249808,491 249809,58 249810,994 249811,46 249813,179170 249814,188791 249815,422 249816,106 249816,586 249817,58 249818,994 249819,46 249821,1556 249822,503 249823,515 249825,171 249826,179170 249828,22 249829,1415 249830,73570 249831,1860 249832,1858 249833,779 249833,1515 249834,179170 249835,22 249836,179170 249837,179170 249838,222 249839,557 249840,1052 249841,54 249842,2775 249843,148742 249844,83 249845,687 249846,21442 249847,251 249848,1220 249849,252 249850,111 249851,875 249852,809 249854,301 249855,433 249856,162599 249857,920 249858,433 249860,240 249860,1818 249861,1359 249862,875 249863,442 249864,179170 249865,1149 249867,250 249867,1684 249868,2367 249868,252883 249869,179170 249870,949 249871,1400 249872,179170 249873,557 249874,663 249876,151 249877,563 249878,1749 249879,8373 249880,704 249881,255 249882,509 249883,422 249884,596 249885,73570 249887,179170 249888,346 249889,9457 249890,4571 249891,35486 249892,861 249893,83 249894,83 249895,557 249896,862 249897,138 249898,865 249899,557 249900,137 249901,88820 249902,135 249903,249904 249906,1010 249907,1773 249908,422 249909,56 249910,647 249911,146 249911,92476 249912,344 249913,179170 249914,220816 249915,179170 249916,302 249917,337 249917,338 249917,393 249917,439 249917,626 249917,649 249917,772 249917,1381 249917,1634 249917,2367 249918,81 249918,251 249918,332 249918,333 249918,420 249918,682 249918,843 249918,980 249918,1133 249918,2083 249918,2995 249918,3258 249918,4039 249918,9015 249918,72439 249918,189303 249919,435 249920,220816 249921,392 249922,179170 249923,932 249924,2867 249924,2868 249925,220816 249926,179170 249927,392 249928,217 249928,240 249928,1417 249929,220816 249930,843 249931,220816 249932,707 249933,704 249934,1556 249935,79 249936,44 249938,220816 249939,433 249940,818 249941,818 249942,657 249943,220816 249944,586 249944,1243 249945,179170 249946,220816 249947,3585 249949,435 249950,220816 249951,433 249952,7092 249953,179170 249954,2867 249954,2868 249955,920 249956,220816 249957,179170 249958,179170 249961,179170 249962,278 249963,179170 249964,577 249964,720 249964,1425 249965,272 249965,467 249966,179170 249967,220816 249968,179170 249969,809 249970,179170 249971,252 249971,516 249972,220816 249973,179170 249974,247 249975,179170 249976,179170 249977,220816 249978,179170 249979,220816 249980,422 249981,56 249982,179170 249983,267 249984,557 249985,1033 249986,626 249987,620 249988,1323 249989,102 249990,1326 249991,408 249992,406 249993,805 249994,1749 249995,779 249996,1515 249997,2735 249998,1284 249999,30 250000,3623 250001,207 250002,818 250004,333 250005,2373 250006,179170 250007,332 250009,250010 250011,220816 250012,422 250013,56 250014,147 250015,2367 250016,707 250017,285 250018,250 250018,1684 250019,138686 250020,175 250021,250 250021,1684 250022,285 250023,697 250024,3260 250025,285 250026,250 250026,1684 250027,48 250028,707 250029,333 250030,179170 250031,875 250032,2367 250033,171 250034,30 250034,184 250034,202 250034,233 250034,1381 250035,3999 250036,1007 250037,179170 250038,179170 250039,179170 250040,179170 250041,179170 250042,779 250043,392 250044,179170 250045,179170 250046,2048 250047,179170 250048,483 250049,250050 250051,179170 250052,142405 250052,154408 250053,1033 250054,179170 250055,179170 250057,366 250058,366 250059,366 250060,366 250061,99 250063,620 250064,1181 250065,179170 250066,73570 250067,225 250068,406 250069,250070 250071,862 250071,2590 250072,267 250073,779 250074,1515 250075,179170 250076,779 250077,179170 250078,333 250079,8884 250080,151 250080,577 250080,1400 250081,1085 250082,179170 250084,179170 250086,1381 250087,1893 250088,1402 250089,3623 250090,296 250091,250092 250093,250092 250094,875 250095,875 250096,240174 250097,179170 250100,240174 250101,250102 250103,1033 250104,35486 250105,3367 250106,406 250107,620 250108,2266 250109,406 250110,206 250111,366 250112,588 250112,590 250112,4771 250113,250114 250115,779 250116,1515 250117,56 250118,422 250119,145751 250120,932 250121,312 250123,333 250124,1033 250125,592 250126,620 250127,663 250128,663 250129,406 250130,250131 250132,83 250133,149 250134,250135 250136,779 250137,1515 250138,240174 250139,1836 250140,250141 250143,298 250144,931 250145,1014 250146,333 250147,1033 250148,620 250149,135 250150,1749 250151,406 250152,250153 250154,30 250155,1515 250156,779 250157,2266 250158,1381 250160,818 250161,1767 250162,808 250163,333 250164,2574 250165,34 250165,35 250166,433 250167,2017 250167,17309 250168,503 250169,1033 250170,1014 250171,1014 250172,1014 250173,483 250174,1014 250175,1014 250176,1014 250177,1014 250178,1014 250179,220816 250180,3079 250181,138686 250182,175 250183,932 250184,79 250184,333 250184,406 250185,2266 250186,220816 250187,620 250188,220816 250189,406 250190,220816 250191,220816 250192,1 250192,242826 250194,220816 250195,1014 250196,220816 250197,2379 250198,1515 250199,779 250200,1096 250201,220816 250202,647 250203,344 250204,146 250204,92476 250206,1096 250208,146 250208,92476 250209,647 250210,344 250211,333 250212,953 250212,1266 250213,663 250214,94 250214,6068 250215,307 250215,818 250215,72439 250216,5440 250217,15573 250217,164572 250218,285 250219,205627 250220,147 250221,1007 250223,589 250224,1247 250224,164572 250225,1181 250226,1479 250227,390 250228,171 250229,56 250230,422 250231,220816 250232,250233 250234,250235 250236,220816 250237,393 250238,707 250239,707 250240,213953 250241,707 250242,366 250243,366 250244,366 250245,179170 250246,1566 250247,179170 250248,330 250249,179170 250250,179170 250251,596 250252,250253 250252,250390 250254,179170 250255,718 250256,447 250257,149 250258,200 250258,772 250259,130 250260,2367 250261,285 250264,250265 250266,850 250267,179170 250268,366 250269,366 250270,175 250271,250272 250273,250274 250275,250276 250277,54 250278,333 250279,17309 250280,250281 250282,147 250282,1572 250283,107 250284,2416 250284,2417 250285,292 250286,338 250287,298 250288,1133 250289,3538 250290,83 250290,660 250290,1274 250290,6506 250291,179170 250292,2995 250293,1087 250293,4193 250294,6068 250294,7363 250295,602 250296,3623 250298,1132 250299,781 250300,433 250301,35486 250302,250303 250304,192 250304,372 250307,779 250308,932 250309,22 250310,6789 250311,3623 250312,250313 250314,3623 250315,557 250316,707 250317,9121 250318,58 250319,1181 250320,250321 250322,1359 250323,179170 250324,6661 250325,15 250325,1179 250326,127158 250327,255 250328,138686 250329,175 250330,56 250331,422 250332,32 250333,440 250333,794 250334,250335 250336,1132 250337,781 250338,1227 250339,714 250341,250342 250344,647 250345,994 250346,287 250347,2292 250347,2574 250347,15748 250348,994 250350,211 250351,1070 250354,875 250355,875 250356,943 250357,179170 250358,179170 250359,994 250360,1381 250361,1436 250362,30 250363,1773 250364,213089 250365,22 250366,179170 250367,1181 250368,3623 250369,192 250370,493 250371,932 250373,179170 250374,138686 250375,175 250376,818 250377,217 250379,8149 250380,250381 250382,1309 250383,781 250384,1132 250385,250386 250387,483 250389,557 250391,433 250392,138686 250393,1181 250394,313 250395,227669 250396,433 250397,30 250398,557 250399,557 250400,3623 250401,2424 250402,1688 250404,3623 250405,1033 250406,60576 250407,620 250409,393 250410,406 250411,30 250413,779 250414,1515 250415,4411 250416,250417 250418,333 250419,298 250420,485 250421,179170 250422,250423 250424,250425 250426,179170 250427,179170 250428,179170 250429,206 250429,1796 250429,3804 250429,141912 250431,2506 250432,179170 250433,872 250434,872 250435,179170 250436,366 250437,366 250438,366 250439,366 250440,179170 250441,366 250442,493 250443,1305 250444,179170 250445,640 250446,298 250447,184 250448,250449 250450,671 250451,250452 250453,119 250454,269 250455,843 250456,1012 250457,7155 250458,4192 250458,4193 250459,179170 250460,285 250461,636 250463,158 250463,202 250463,8907 250464,255 250465,240 250466,250467 250468,167 250469,179170 250470,285 250471,104 250472,30 250473,179170 250474,179170 250475,285 250476,137 250478,179170 250479,179170 250480,179170 250481,424 250482,179170 250483,292 250484,294 250485,296 250486,298 250487,250488 250489,1381 250490,422 250491,142473 250492,309 250492,310 250493,788 250494,467 250495,1749 250496,704 250497,493 250498,592 250499,585 250500,586 250501,50 250502,393 250503,79 250504,406 250505,1043 250506,179170 250507,1572 250510,137 250512,83 250513,179170 250514,179170 250515,179170 250516,4192 250516,4193 250517,19010 250518,1220 250522,994 250523,1058 250524,240 250526,138686 250527,264 250528,994 250530,447 250531,171 250532,179170 250533,103860 250537,1559 250538,1631 250539,250539 250540,9457 250541,1210 250542,877 250545,314 250546,849 250547,138686 250548,175 250549,415 250550,1033 250551,83 250552,1033 250553,620 250554,406 250555,250556 250557,179170 250558,1515 250559,779 250560,640 250561,640 250562,640 250563,640 250564,315 250565,640 250566,56 250567,422 250568,2867 250568,2868 250569,640 250570,1132 250571,781 250572,30 250574,221872 250576,117163 250577,779 250579,1580 250580,818 250581,408 250582,333 250583,422 250584,120 250585,192 250587,781 250588,1132 250589,63 250590,652 250591,217 250592,1858 250593,1860 250594,138686 250595,175 250596,1033 250597,83 250598,7760 250599,447 250600,2775 250601,1580 250602,206 250603,147 250603,158 250603,406 250604,179170 250606,1381 250607,142433 250608,179170 250609,252 250609,1220 250610,35486 250611,3623 250612,620 250613,392 250614,697 250615,6955 250616,1860 250617,3612 250618,595 250619,4760 250620,2274 250621,6059 250622,5658 250623,4252 250624,623 250625,1912 250627,1860 250628,1858 250629,15 250629,941 250630,406 250631,83 250632,1749 250633,525 250634,252 250635,1551 250636,1927 250637,779 250638,30 250639,192 250640,1132 250641,1132 250642,1132 250643,1858 250644,1860 250645,256 250646,1132 250647,781 250649,73570 250650,1132 250651,1608 250652,171 250653,1238 250654,1231 250655,346 250655,255911 250656,252 250657,1860 250658,1858 250660,1010 250661,1452 250662,48505 250664,1515 250665,779 250666,4672 250667,250668 250669,1019 250670,707 250671,178 250671,392 250672,149 250673,932 250674,707 250675,536 250677,422 250678,56 250679,442 250680,213089 250682,333 250683,151 250684,509 250685,694 250686,1247 250686,164572 250687,577 250688,1033 250689,1033 250690,149 250691,707 250693,22 250694,252 250695,2620 250696,422 250697,422 250698,422 250699,422 250700,422 250701,189128 250702,422 250703,422 250704,422 250705,1274 250706,406 250706,60576 250707,422 250708,422 250709,1012 250710,154408 250711,1247 250711,164572 250712,83 250713,240 250713,298 250714,779 250716,63 250717,996 250718,467 250718,818 250719,179170 250720,30 250721,779 250722,6119 250723,1882 250724,30 250725,620 250726,31073 250727,250728 250729,671 250730,212914 250731,707 250732,1707 250733,192 250734,406 250735,217 250736,36819 250737,859 250738,310 250739,707 250740,171 250741,389 250742,1849 250744,3585 250745,704 250746,392 250747,707 250748,21982 250749,707 250750,179170 250751,907 250752,1515 250753,779 250755,252 250756,171 250757,179170 250759,179170 250760,148742 250761,236180 250762,143 250763,1132 250764,1132 250765,252 250767,749 250768,269 250769,179170 250771,973 250772,333 250773,269 250774,1096 250775,439 250777,1 250778,179170 250779,179170 250780,3582 250781,907 250782,142870 250783,536 250784,1849 250786,406 250787,179170 250789,1454 250790,215 250791,79 250792,179170 250793,1096 250794,179170 250795,56 250796,422 250797,301 250798,7416 250799,3769 250800,332 250801,1151 250802,179170 250803,167 250804,247 250805,893 250806,17346 250807,595 250808,179170 250809,422 250810,557 250811,1381 250812,344 250813,657 250815,2424 250816,313 250817,250818 250820,264 250821,760 250821,1149 250821,1631 250822,4455 250824,1858 250825,1860 250826,1033 250828,179170 250829,138686 250830,175 250831,48505 250832,107 250833,54 250834,515 250836,179170 250837,179170 250839,54 250840,442 250841,577 250842,2750 250843,45310 250844,54 250845,1224 250846,54 250847,206 250849,707 250850,83 250851,247 250852,179170 250853,83 250854,155473 250855,620 250856,179170 250857,179170 250858,2373 250859,30 250860,344 250861,21982 250862,707 250863,1381 250864,920 250865,179170 250866,1858 250867,1860 250868,179170 250869,147 250869,158 250871,179170 250872,179170 250873,103860 250873,189303 250874,406 250875,1962 250876,457 250877,30 250878,250879 250880,179170 250881,209 250882,179170 250883,1282 250884,179170 250885,5405 250888,1326 250889,179170 250890,1132 250891,577 250892,4597 250893,34 250893,35 250894,1274 250895,179170 250896,179170 250897,68069 250898,179170 250899,862 250900,805 250901,255 250902,179170 250903,179170 250905,779 250906,1515 250907,220816 250908,9457 250909,151 250910,220816 250911,832 250912,483 250913,179170 250914,147 250915,220816 250916,179170 250917,406 250918,406 250919,220816 250920,920 250921,875 250922,179170 250923,220816 250924,818 250925,106 250926,73570 250928,179170 250929,220816 250930,179170 250931,179170 250932,179170 250933,1132 250934,781 250935,272 250936,333 250937,220816 250938,179170 250939,179170 250940,179170 250941,179170 250942,932 250943,315 250944,1132 250945,781 250946,56 250947,422 250948,247 250949,179170 250950,4355 250951,179170 250952,179170 250953,83 250953,304 250953,467 250953,868 250953,162599 250954,663 250955,920 250956,467 250957,704 250958,79 250959,467 250960,11 250961,179170 250962,247 250963,1544 250964,2557 250965,2083 250966,179170 250967,179170 250968,278 250969,707 250970,920 250971,707 250972,147 250972,158 250973,491 250974,4453 250975,707 250976,30 250977,9015 250978,302 250979,516 250980,175 250981,7092 250982,113156 250983,433 250985,217 250986,602 250987,220816 250988,148742 250989,1132 250990,781 250991,1069 250991,2784 250991,188676 250992,278 250993,252 250994,2266 250995,30 250996,1181 250996,9015 250997,1181 250997,1745 250998,179170 250999,179170 251000,1181 251001,422 251002,56 251003,2867 251003,2868 251004,30 251005,138686 251006,175 251007,1370 251008,1715 251009,104 251010,444 251011,35486 251012,1 251013,30331 251014,58 251015,994 251016,46 251017,459 251017,862 251017,907 251017,1010 251017,1837 251017,20359 251017,188791 251018,310 251018,224488 251019,1119 251020,113156 251021,707 251022,3447 251023,179170 251024,875 251025,179170 251026,1181 251027,516 251028,179170 251029,1359 251030,2367 251031,392 251032,697 251033,2105 251034,102 251035,1323 251036,1326 251037,408 251038,19010 251039,417 251040,179170 251041,577 251042,707 251043,30 251044,752 251045,1276 251046,68 251047,135 251048,536 251049,2671 251050,1210 251051,138686 251052,175 251053,56 251054,422 251055,30 251056,631 251057,217 251058,1085 251059,1117 251060,1659 251061,220816 251062,3 251063,220816 251064,1014 251065,485 251066,298 251067,220816 251068,390 251069,1326 251070,240 251071,1715 251072,1010 251073,220816 251074,435 251075,1033 251076,707 251077,356 251078,1014 251079,240174 251080,179170 251081,217 251082,54 251083,707 251084,54 251085,179170 251086,179170 251087,251088 251089,1014 251090,620 251091,147 251092,843 251093,1014 251094,58 251095,994 251096,46 251097,1001 251099,1014 251100,406 251102,83 251102,217 251102,536 251102,1133 251103,900 251104,30 251105,2797 251106,41 251107,2646 251108,623 251108,1805 251109,220816 251110,79 251111,563 251112,120 251113,850 251114,652 251115,220816 251116,1522 251117,113156 251118,346 251119,54 251120,2807 251121,516 251122,252 251123,1220 251124,220816 251126,779 251127,1515 251128,1085 251129,209 251130,333 251131,968 251132,285 251133,920 251134,1181 251135,171 251136,920 251137,285 251138,269 251139,215 251140,301 251141,179170 251142,843 251143,41 251144,240174 251145,2266 251146,30 251147,1133 251148,2073 251149,179170 251150,247 251151,920 251152,2083 251153,4192 251153,4193 251154,640 251155,251156 251157,736 251157,1891 251157,142405 251157,154408 251158,1623 251159,1522 251160,355 251161,1140 251162,56 251163,422 251165,346 251166,1118 251167,179170 251168,179170 251169,406 251169,779 251170,5310 251171,968 251172,179170 251173,1 251173,4 251173,5 251173,184 251174,356 251175,843 251177,893 251178,1571 251179,83 251180,179170 251181,179170 251182,179170 251183,1238 251184,179170 251185,179170 251186,137 251187,861 251188,1590 251189,364 251189,431 251189,1227 251189,1252 251189,1253 251189,2089 251189,2940 251189,4823 251189,86416 251190,10 251191,536 251192,179170 251193,704 251194,79 251196,179170 251197,83 251198,8854 251199,589 251200,3623 251202,415 251203,269 251204,671 251205,481 251206,949 251207,251208 251210,138686 251211,175 251212,714 251213,202 251213,372 251213,720 251213,877 251213,907 251213,1001 251213,1732 251213,3422 251214,83 251214,1984 251215,346 251216,251217 251218,781 251219,1132 251220,433 251221,189303 251222,83 251223,30 251224,179170 251225,707 251226,2205 251226,33424 251226,245910 251227,781 251228,1132 251229,58 251230,994 251231,46 251232,1509 251233,442 251235,781 251236,1132 251237,179170 251240,147 251240,171 251242,493 251243,179170 251245,137 251246,179170 251248,640 251249,206 251250,640 251251,640 251252,640 251253,640 251254,83 251256,644 251257,447 251258,2775 251259,30 251260,707 251261,58 251262,994 251263,46 251265,58 251266,994 251267,46 251268,1363 251269,22 251271,3623 251274,346 251275,248 251276,485 251277,893 251279,137 251281,147 251283,657 251284,366 251285,366 251286,366 251287,366 251288,41 251288,106 251291,640 251292,179170 251294,2646 251295,179170 251296,859 251297,609 251297,1688 251298,206 251299,147191 251300,393 251301,58 251302,994 251303,46 251304,920 251305,712 251306,179170 251308,424 251309,1821 251309,21736 251310,3138 251311,81 251312,433 251313,462 251314,1001 251315,589 251316,557 251317,743 251318,148742 251319,30 251320,592 251321,313 251322,479 251323,346 251324,22 251325,83 251326,58 251327,994 251328,46 251329,707 251330,868 251331,1368 251332,58 251333,994 251334,46 251335,422 251336,151 251337,422 251338,422 251339,422 251340,422 251341,422 251342,68069 251343,2424 251344,1474 251345,422 251346,422 251347,422 251348,893 251349,561 251350,422 251351,3094 251352,536 251353,422 251354,344 251355,35486 251356,422 251357,1274 251358,22 251359,20 251360,30 251362,2750 251363,83 251364,58 251365,994 251366,46 251367,58 251368,994 251369,46 251371,1631 251372,30 251373,1608 251374,1132 251375,138686 251376,433 251377,1608 251378,1132 251379,433 251380,240 251380,818 251381,1033 251382,422 251383,56 251384,996 251386,893 251387,79 251387,818 251389,1579 251390,1132 251391,83 251392,278 251393,1132 251394,2421 251395,1608 251396,1132 251397,2797 251398,147 251400,1707 251401,2590 251403,217 251404,1132 251405,1608 251406,248 251407,1544 251409,31206 251410,720 251411,433 251412,217 251414,1132 251415,106 251416,1860 251417,1858 251418,58 251419,994 251420,46 251421,310 251421,3039 251422,77 251423,1132 251424,1544 251425,1132 251426,1132 251427,1849 251428,1849 251429,818 251430,1132 251431,1132 251432,30 251433,1132 251434,30 251434,1179 251435,1132 251436,1132 251437,1132 251438,60576 251439,2626 251440,179170 251441,20 251443,893 251444,1132 251445,818 251446,60576 251447,3999 251449,60576 251450,4548 251451,657 251452,1132 251453,515 251454,83 251455,1579 251456,1860 251457,1858 251458,1749 251460,58 251461,46 251462,994 251463,289 251463,1085 251463,33424 251463,94134 251463,245910 251465,211 251466,30 251467,536 251467,590 251467,2991 251468,21408 251469,577 251471,179170 251472,4611 251473,968 251473,103860 251475,346 251476,2006 251477,1454 251479,301 251479,3804 251481,240 251481,332 251482,251483 251484,920 251485,406 251486,1160 251487,251488 251489,217 251490,516 251490,1220 251491,5469 251492,202 251493,1551 251494,269 251495,2460 251496,1515 251497,99 251498,73570 251499,4672 251500,138686 251501,175 251502,209 251503,1381 251504,54 251505,147 251505,158 251506,809 251508,2590 251509,1818 251510,50 251510,192 251510,195 251510,222 251510,240 251510,809 251510,1019 251510,1085 251511,167 251511,973 251511,1001 251512,247 251513,687 251516,1132 251517,781 251518,179170 251519,2626 251520,2205 251520,33424 251520,245910 251521,433 251522,467 251523,4355 251524,3182 251525,1722 251526,433 251527,422 251528,56 251529,433 251530,147 251530,158 251533,1381 251534,932 251535,516 251536,147 251536,158 251536,333 251537,577 251538,1284 251538,148742 251539,483 251540,875 251541,142879 251542,151 251543,179170 251544,31122 251545,3804 251546,3193 251547,2737 251548,14797 251549,518 251550,392 251551,2989 251551,2991 251552,442 251552,3474 251553,483 251554,220816 251555,72 251555,87 251555,206 251555,209 251555,240 251555,323 251555,358 251555,516 251555,586 251555,736 251555,1007 251555,1085 251555,1210 251555,1359 251555,1551 251555,1785 251555,2312 251555,17309 251555,54243 251556,225 251557,255 251558,220816 251559,179170 251560,179170 251561,1556 251562,577 251563,179170 251564,179170 251565,220816 251566,30 251567,10 251568,2205 251568,33424 251568,245910 251569,536 251570,3582 251571,179170 251572,30 251573,30 251574,179170 251575,433 251576,220816 251577,861 251578,6303 251579,2296 251580,30 251581,217 251582,577 251583,179170 251584,775 251585,60576 251586,220816 251587,207 251588,187 251589,2048 251590,247 251591,217 251592,207 251592,1684 251593,179170 251594,30 251595,97 251596,310 251596,693 251598,220816 251599,433 251601,200 251602,220816 251603,3695 251604,179170 251605,406 251606,433 251611,1732 251612,433 251613,1014 251614,1012 251616,346 251617,1014 251618,1014 251619,30 251620,671 251621,2735 251622,155481 251623,920 251624,1014 251625,30 251626,179170 251627,2135 251628,285 251630,7092 251632,1390 251633,760 251634,220816 251635,30 251637,220816 251638,302 251639,250 251639,1684 251640,179170 251641,305 251642,278 251643,1235 251643,1335 251643,2209 251643,8788 251643,21711 251643,29253 251643,29294 251644,310 251645,44 251646,861 251647,1127 251648,422 251649,272 251650,147 251651,220816 251652,30 251653,5265 251654,707 251655,220816 251656,302 251657,251658 251659,30 251660,285 251661,30 251662,3903 251663,330 251664,247 251665,455 251666,283 251667,932 251668,220816 251669,158 251670,941 251671,330 251672,220816 251673,7572 251674,9098 251675,302 251676,23783 251677,220816 251678,4594 251679,30 251680,861 251681,220816 251682,333 251683,138686 251684,175 251685,313 251686,220816 251688,220816 251689,392 251690,1238 251691,278 251692,1858 251693,179170 251694,1608 251695,1 251696,220816 251697,1452 251699,251700 251701,30 251702,3623 251703,269 251704,220816 251705,2373 251706,220816 251707,202 251709,704 251710,389 251711,493 251712,220816 251713,104 251714,179170 251715,220816 251717,1085 251717,2205 251717,33424 251717,245910 251718,589 251719,704 251720,220816 251721,83 251722,251723 251724,563 251725,83 251726,220816 251727,557 251728,1644 251729,1179 251729,2923 251729,3695 251731,142433 251732,99 251733,217 251734,452 251735,1247 251735,164572 251736,184 251737,485 251738,2646 251739,2646 251740,2620 251741,147 251742,323 251743,138686 251744,175 251745,220816 251747,784 251748,6837 251749,220816 251750,220816 251751,8270 251752,220816 251753,885 251753,13704 251754,220816 251755,251756 251757,292 251758,272 251759,5440 251760,220816 251761,1326 251762,102 251763,1323 251764,408 251765,22 251766,264 251767,3999 251768,220816 251769,220816 251770,1381 251771,179170 251772,220816 251773,251774 251775,220816 251776,220816 251777,1425 251778,220816 251779,285 251780,220816 251781,147 251781,158 251781,779 251781,1181 251781,1515 251782,220816 251783,779 251784,707 251786,1133 251787,272 251787,439 251787,563 251787,980 251787,2367 251787,15573 251788,179170 251789,3041 251790,1551 251791,1363 251792,1007 251793,130 251794,155481 251795,1033 251796,99 251797,179170 251798,1381 251799,83 251800,179170 251801,179170 251802,104 251803,1639 251804,1509 251806,179170 251807,34 251807,35 251808,5440 251809,48 251810,247 251811,151 251812,1474 251812,1789 251812,2590 251813,179170 251814,366 251815,366 251816,285 251817,366 251818,366 251819,366 251820,872 251821,179170 251822,491 251823,251824 251825,35486 251826,8822 251827,1803 251829,424 251830,179170 251831,171 251832,179170 251833,843 251834,179170 251835,313 251836,852 251837,875 251838,179170 251839,509 251840,1644 251841,215276 251842,103860 251843,3582 251844,179170 251846,179170 251848,106 251850,1644 251851,83 251852,178 251854,1381 251856,872 251857,1370 251858,136 251861,481 251862,19 251862,3252 251863,83 251864,640 251865,640 251866,640 251867,83 251868,640 251869,779 251870,1132 251871,1608 251873,2209 251874,251875 251876,309 251876,310 251879,56 251880,422 251881,189303 251882,1132 251883,48505 251884,1132 251885,657 251887,252 251888,1220 251889,516 251890,1522 251891,309 251891,310 251892,328 251892,704 251892,1282 251892,1402 251892,1882 251892,2205 251892,33424 251892,245910 251893,1390 251894,1085 251895,1132 251897,1132 251899,393 251900,393 251901,393 251902,10 251903,158 251904,240 251905,1132 251906,1132 251907,6556 251908,1132 251909,920 251910,1132 251911,1132 251912,781 251913,1631 251914,1579 251915,932 251916,24505 251917,1132 251918,818 251919,781 251920,818 251921,30 251922,313 251923,167 251925,393 251926,1033 251927,406 251928,2116 251929,195 251930,171 251931,620 251932,30 251933,138686 251934,175 251935,35486 251936,714 251937,179170 251938,707 251939,1132 251940,251941 251942,1274 251943,406 251944,1052 251945,184 251946,1181 251947,3094 251949,200 251951,1151 251951,1572 251952,179170 251954,4611 251955,1231 251956,2607 251957,994 251959,849 251959,1634 251959,2460 251960,301 251960,305 251960,479 251960,611 251960,647 251960,920 251960,1326 251960,2205 251960,2867 251960,2868 251960,3089 251960,5440 251960,6661 251960,8180 251960,14556 251960,19356 251960,33424 251960,245910 251961,17309 251962,301 251963,1551 251964,217 251964,467 251965,1515 251966,779 251967,179170 251968,932 251969,1644 251970,60576 251971,1089 251972,893 251973,1085 251974,60576 251975,752 251976,328 251977,83 251978,56 251979,422 251980,1220 251981,252 251982,251 251983,305 251983,1844 251984,56 251985,422 251987,142870 251988,179170 251989,140 251990,179170 251992,251993 251994,251993 251995,179170 251996,707 251997,393 251997,435 251997,980 251997,1033 251997,1776 251998,107 251999,1353 252000,843 252001,289 252001,94134 252002,19010 252003,3260 252004,707 252005,510 252007,179170 252008,422 252009,252010 252011,422 252012,422 252013,422 252014,422 252015,1579 252016,422 252017,422 252018,422 252019,586 252020,422 252021,422 252022,435 252023,252024 252025,252026 252027,3538 252028,515 252029,251 252030,4611 252031,1381 252032,1616 252033,1572 252034,14819 252035,79 252036,191355 252037,389 252038,72 252038,392 252038,406 252039,811 252040,4223 252041,602 252042,1359 252043,252044 252045,2334 252046,779 252047,267 252048,302 252049,1927 252050,516 252051,179170 252052,861 252054,302 252055,179170 252056,387 252057,2995 252058,1087 252058,3370 252058,4193 252059,907 252059,33424 252059,245910 252060,6068 252060,7363 252060,25348 252060,94134 252060,164572 252061,30 252062,273 252063,302 252064,1564 252065,333 252066,240174 252068,918 252069,30 252070,861 252071,1 252072,179170 252073,6184 252076,1012 252077,83 252078,120 252079,1160 252080,349 252081,167 252082,138686 252083,175 252084,217 252085,4594 252086,1274 252087,5591 252088,1417 252089,1359 252090,30 252091,515 252092,130 252095,60576 252096,30 252098,142879 252100,1359 252101,99 252102,60576 252103,1564 252104,1454 252105,1634 252106,41 252106,217 252106,314 252106,417 252107,1359 252108,15119 252109,344 252109,772 252110,1955 252111,406 252111,620 252112,509 252113,179170 252114,6556 252115,2073 252116,1893 252117,99 252118,247 252119,1381 252120,83 252121,179170 252122,1033 252123,3260 252124,179170 252125,6955 252126,179170 252127,179170 252128,1068 252129,920 252130,1240 252131,435 252132,1151 252133,620 252134,4771 252135,179170 252136,388 252137,483 252138,1143 252139,1359 252140,509 252140,852 252141,3804 252142,2699 252143,2006 252144,1359 252145,518 252146,406 252147,1939 252148,1085 252149,919 252150,252151 252152,1544 252153,1722 252154,843 252155,392 252156,247 252157,149 252158,151 252159,1298 252160,83 252161,156379 252162,248 252163,252164 252165,1515 252166,779 252167,32 252168,179170 252169,2083 252170,383 252171,1732 252172,179170 252173,179170 252174,5405 252175,179170 252176,781 252177,1132 252178,1313 252179,1096 252180,2373 252181,179170 252182,99 252183,671 252184,36819 252185,147191 252186,1860 252187,1858 252188,1618 252189,252190 252191,2931 252192,781 252193,1132 252194,994 252195,885 252195,13704 252196,1227 252196,86416 252197,861 252198,1579 252199,272 252200,179170 252201,247 252202,920 252203,179170 252204,994 252205,652 252206,252207 252208,2424 252209,424 252210,994 252211,99 252212,333 252213,151 252213,663 252214,5906 252215,557 252216,626 252217,278 252218,137 252219,862 252220,577 252221,1033 252222,3260 252223,557 252225,30 252226,358 252227,261 252228,1860 252229,1858 252230,1522 252231,111 252232,30 252234,994 252235,589 252236,620 252238,30 252239,4 252239,5 252240,704 252241,79 252242,179170 252243,22 252243,299 252243,557 252243,760 252243,1177 252243,1309 252243,1359 252243,1368 252243,2416 252243,2417 252243,2701 252243,2775 252243,3129 252243,3209 252243,4237 252243,182162 252244,158 252244,252 252245,2929 252245,23701 252246,8854 252247,611 252248,252249 252250,422 252252,862 252253,516 252254,406 252255,2923 252256,179170 252257,56 252258,1058 252259,433 252260,338 252262,718 252263,179170 252264,779 252265,1515 252266,179170 252267,179170 252269,255 252270,932 252271,179170 252272,179170 252273,346 252274,220816 252275,179170 252277,10 252278,1801 252279,220816 252281,179170 252282,220816 252283,397 252284,179170 252285,179170 252286,536 252287,1285 252288,220816 252289,179170 252290,179170 252291,179170 252292,179170 252293,220816 252294,147 252295,1058 252297,83 252298,333 252299,252300 252301,392 252302,220816 252303,278 252304,179170 252305,83 252306,222 252307,220816 252308,179170 252309,255 252310,138686 252311,175 252312,179170 252313,247 252313,2867 252313,2868 252314,151 252315,220816 252316,278 252317,563 252318,1 252319,30 252320,106 252321,7092 252322,220816 252323,994 252324,179170 252325,179170 252326,994 252327,278 252328,220816 252329,179170 252330,1453 252331,278 252332,179170 252333,220816 252334,433 252335,1181 252336,179170 252337,2590 252338,179170 252339,252340 252341,7768 252341,13137 252342,147 252342,296 252342,631 252342,801 252342,1068 252342,1181 252342,1385 252342,1452 252342,1466 252342,1749 252342,2116 252342,2617 252342,13136 252342,14352 252342,54202 252342,125569 252343,179170 252344,920 252345,99 252346,179170 252347,220816 252348,255 252349,99 252350,220816 252351,3623 252352,707 252353,805 252354,1326 252355,102 252356,1323 252357,408 252358,220816 252359,220816 252360,433 252361,1556 252362,179170 252363,30 252364,179170 252365,179170 252366,30 252367,179170 252368,220816 252369,147 252370,247 252371,179170 252372,30 252373,707 252374,149 252375,220816 252376,634 252377,252378 252379,179170 252380,1113 252381,220816 252382,5366 252383,217 252384,30 252385,30 252386,179170 252387,285 252388,179170 252389,250 252389,1684 252390,30 252391,536 252392,1773 252393,179170 252394,30 252395,292 252396,252397 252398,220816 252399,704 252400,493 252401,285 252402,220816 252403,250 252403,1684 252404,4545 252404,56150 252405,697 252406,581 252407,179170 252408,406 252409,58 252409,1177 252409,1893 252409,3474 252410,285 252411,422 252412,422 252413,422 252414,422 252415,422 252416,422 252417,422 252418,422 252419,422 252420,422 252422,179170 252423,179170 252424,779 252425,920 252426,631 252426,862 252427,179170 252428,252429 252430,671 252431,1132 252432,252433 252435,920 252436,179170 252437,252438 252439,1001 252440,1467 252441,455 252442,2424 252443,200 252444,1871 252445,83 252446,13980 252447,795 252448,304 252449,35486 252450,1556 252451,217 252452,536 252453,8991 252453,72439 252454,252455 252456,179170 252457,137 252458,151 252459,178 252460,30 252461,142870 252462,252463 252464,192 252465,192 252466,1544 252467,1544 252468,179170 252469,1544 252470,349 252471,779 252472,79 252473,1544 252474,1544 252476,1544 252477,138686 252478,175 252479,346 252480,217 252481,1147 252483,366 252484,366 252485,366 252486,179170 252487,366 252488,366 252489,366 252490,366 252491,366 252492,366 252493,366 252494,2775 252495,447 252496,1544 252497,392 252498,145240 252499,1326 252501,760 252503,1414 252503,72439 252505,393 252507,104 252508,252509 252510,1135 252511,392 252512,1860 252513,1858 252514,217 252515,875 252516,707 252517,3623 252518,781 252519,1132 252520,589 252521,1707 252522,640 252523,640 252524,781 252525,1132 252527,1 252528,1132 252529,781 252530,433 252531,30 252532,781 252533,1132 252534,781 252535,1132 252536,2923 252537,30 252538,3623 252539,30 252540,2266 252541,1033 252543,1284 252544,516 252545,217 252546,179170 252547,79 252547,192 252547,202 252547,333 252547,1181 252548,726 252548,859 252549,920 252550,1644 252551,1345 252552,222 252553,620 252554,162599 252555,179170 252558,1058 252559,252560 252562,818 252563,406 252564,1220 252566,1326 252567,79 252569,3602 252570,832 252571,2116 252573,1544 252574,779 252575,1515 252576,35486 252578,1509 252579,217 252579,2116 252579,2617 252579,2626 252580,1544 252581,1544 252582,1544 252583,1544 252586,1544 252587,205488 252588,1544 252589,1544 252591,1544 252593,179170 252595,252596 252601,1544 252603,1544 252609,450 252610,1544 252611,1544 252612,1544 252613,1544 252615,687 252616,1544 252618,1544 252621,1544 252622,1544 252624,1544 252625,1544 252626,1544 252627,1544 252629,1544 252630,1544 252631,1544 252633,626 252634,1544 252635,1544 252636,1544 252637,1544 252638,1544 252639,1544 252640,1238 252641,304 252642,1452 252643,192 252644,68 252645,1644 252646,1544 252647,932 252648,120 252649,217 252650,301 252650,1293 252651,118336 252652,333 252653,818 252654,3804 252655,795 252656,2979 252657,99 252658,2006 252659,14797 252660,233 252661,1001 252662,63 252663,1715 252664,3 252665,525 252666,3193 252667,518 252668,236180 252669,269 252671,1608 252672,1132 252673,1544 252674,911 252675,1135 252677,1785 252678,137 252679,589 252680,83 252681,151 252682,328 252683,7768 252684,269 252685,4 252685,5 252686,30 252687,1544 252688,663 252690,192 252691,431 252691,611 252692,5405 252693,106 252694,58 252695,994 252696,46 252697,781 252698,1132 252699,920 252700,1544 252701,557 252702,1467 252703,120 252704,994 252705,192 252706,718 252707,1265 252707,1266 252708,1544 252709,491 252710,30 252711,718 252712,192 252713,60576 252715,801 252716,189839 252717,217 252718,1151 252719,2646 252720,1132 252721,781 252722,217 252723,1130 252724,2048 252725,1858 252726,1860 252727,1860 252728,1858 252729,302 252730,781 252731,1132 252732,179170 252733,843 252735,146 252735,92476 252736,252737 252738,1544 252739,137 252740,861 252741,1127 252742,4691 252743,156379 252744,2168 252746,30 252747,217 252748,338 252749,720 252749,1117 252750,222 252750,283 252751,200 252753,1419 252753,2931 252754,781 252755,1132 252756,588 252756,590 252757,146 252757,92476 252758,151 252759,3623 252760,232766 252761,189128 252762,1860 252763,1858 252764,10 252765,832 252766,184 252767,178 252768,83 252769,1235 252769,1335 252770,1132 252771,781 252772,467 252773,310 252773,3039 252774,134 252775,919 252776,48505 252777,647 252778,515 252779,1188 252780,179170 252781,261 252781,333 252782,179170 252783,422 252783,5405 252784,1381 252785,83 252786,389 252787,1 252789,252790 252791,252792 252793,406 252794,1454 252795,179170 252796,801 252796,3474 252797,86 252798,1151 252799,1381 252800,920 252801,631 252801,2620 252802,179170 252803,433 252804,252805 252806,56 252807,422 252808,1181 252809,179170 252810,158 252811,179170 252812,179170 252813,1 252814,1 252815,872 252817,179170 252818,932 252819,422 252820,56 252821,1544 252822,151 252823,2572 252824,56 252825,422 252826,87 252827,151 252828,252829 252830,192 252830,333 252830,422 252831,179170 252832,147 252833,1425 252834,179170 252835,179170 252836,138686 252837,179170 252838,175 252839,179170 252840,179170 252841,179170 252842,406 252843,406 252844,424 252845,179170 252846,179170 252847,433 252848,1085 252849,179170 252850,6506 252851,179170 252852,900 252853,775 252854,4594 252855,422 252856,1544 252857,217 252858,83 252859,86 252861,3148 252862,2353 252863,240 252863,968 252864,179170 252865,83 252866,179170 252867,6424 252868,179170 252869,704 252870,179170 252871,861 252872,79 252873,707 252874,247 252875,590 252875,1419 252876,3297 252877,252878 252879,1556 252880,563 252881,179170 252882,2334 252885,1381 252886,1058 252887,179170 252888,247 252889,704 252890,932 252892,433 252893,217 252893,467 252894,390 252895,120 252896,302 252896,720 252897,220816 252898,330 252899,200 252900,439 252901,872 252902,433 252903,220816 252904,56 252905,422 252906,252907 252908,220816 252909,312 252910,1882 252911,179170 252912,247 252913,217 252913,536 252914,7092 252915,1544 252917,113156 252918,220816 252919,483 252920,1556 252921,179170 252922,220816 252923,8308 252924,278 252925,200 252926,673 252927,179170 252928,200 252929,179170 252930,557 252931,557 252932,330 252933,1860 252934,1858 252935,19010 252936,435 252937,1052 252938,54 252939,2775 252940,179170 252941,252942 252943,142473 252944,455 252945,220816 252946,657 252947,56 252948,422 252949,179170 252950,83 252951,809 252952,1882 252953,220816 252954,843 252955,255 252956,8270 252957,179170 252959,202 252960,158 252961,557 252962,862 252963,1474 252964,146 252964,92476 252965,179170 252966,1235 252967,220816 252968,179170 252969,1381 252970,392 252972,179170 252973,94134 252974,202 252975,1300 252976,220816 252977,1294 252978,2116 252979,994 252980,220816 252983,994 252984,433 252985,2373 252986,2048 252987,179170 252988,179170 252989,252990 252991,220816 252992,179170 252993,147 252994,138686 252995,175 252996,83 252997,179170 252998,577 252999,30 253000,30 253001,1556 253002,3623 253003,3623 253004,220816 253005,83 253006,220816 253007,859 253008,220816 253009,179170 253010,1019 253011,13661 253012,1353 253014,3623 253015,220816 253016,179170 253018,220816 253019,2590 253021,253022 253023,253024 253025,167 253027,726 253028,179170 253030,289 253030,94134 253031,1 253032,179170 253033,779 253034,253035 253036,253037 253036,261721 253038,200 253039,112699 253039,146134 253040,88820 253041,207 253042,1368 253043,493 253045,65 253045,264 253045,1659 253045,2979 253046,179170 253047,192 253048,5961 253049,491 253050,872 253051,1429 253052,1531 253053,4545 253053,56150 253054,30 253055,2017 253055,2775 253055,17309 253056,155481 253057,4545 253057,56150 253058,35486 253059,668 253060,2590 253061,54 253062,54 253063,240 253064,862 253065,253066 253067,30 253068,253069 253070,111 253071,3623 253072,253073 253074,30 253075,557 253076,179170 253077,704 253078,493 253079,1143 253080,1773 253081,779 253082,167273 253083,1773 253084,1227 253084,86416 253085,435 253086,83 253087,141077 253087,255925 253088,56 253089,422 253090,827 253091,872 253092,1010 253092,1298 253094,19 253098,2574 253099,538 253099,671 253099,1590 253099,2353 253099,6966 253101,48 253102,972 253103,285 253105,893 253106,124668 253107,1417 253108,252 253108,516 253108,1220 253110,3115 253111,88820 253112,88820 253113,1893 253114,366 253115,366 253116,366 253117,192 253117,422 253118,366 253119,366 253120,366 253121,366 253122,872 253123,6424 253124,366 253125,366 253126,743 253127,433 253128,433 253129,390 253130,640 253131,433 253132,536 253133,433 253134,136 253135,215276 253136,536 253139,557 253140,4237 253140,182162 253141,3209 253142,2312 253143,1177 253144,1359 253145,253146 253147,256187 253147,256834 253147,257244 253147,261750 253148,433 253149,215276 253150,167 253151,673 253152,253153 253154,2073 253155,178576 253156,253157 253158,189842 253159,13661 253160,1130 253161,167 253162,663 253163,79 253164,996 253165,779 253166,818 253167,2671 253168,253169 253170,920 253171,179170 253172,240 253172,332 253172,818 253172,1014 253172,2235 253172,2620 253172,3879 253172,4179 253172,6856 253172,7344 253172,26362 253172,37407 253172,46316 253172,51252 253172,54551 253172,130357 253172,144231 253172,248733 253172,250524 253172,250713 253173,1033 253175,163 253175,302 253176,30 253177,5034 253178,5591 253179,620 253180,1531 253181,920 253182,694 253183,694 253184,602 253185,13661 253186,148742 253187,1133 253188,752 253190,406 253191,242246 253192,189839 253193,22 253194,83 253196,179170 253198,779 253199,1515 253201,135 253202,1425 253204,1425 253205,4223 253206,253207 253208,647 253209,158 253210,859 253211,158 253212,302 253213,1579 253214,2209 253215,1425 253216,310 253216,805 253217,333 253218,442 253220,255 253221,2607 253222,433 253223,31073 253224,408 253227,251 253228,1238 253229,217 253230,1181 253231,83 253232,1452 253233,3209 253234,149 253234,178 253234,333 253234,406 253235,1773 253236,140 253237,422 253238,422 253239,422 253240,932 253241,1860 253242,1858 253243,422 253244,1860 253245,422 253246,1858 253247,1033 253248,422 253249,422 253250,809 253251,215 253252,805 253253,3623 253254,22293 253255,1608 253256,253257 253258,1132 253259,1014 253260,120 253261,1417 253262,1014 253263,422 253264,447 253265,2775 253266,1014 253267,620 253268,10 253269,422 253270,808 253271,1014 253272,779 253273,406 253274,1801 253274,3182 253275,422 253276,253277 253278,6506 253279,202 253280,781 253281,1132 253282,35486 253283,13661 253284,119 253285,442 253286,1515 253287,779 253288,240 253289,2626 253290,1052 253291,54 253292,2775 253293,215276 253294,2424 253295,302 253296,253297 253298,106 253300,179170 253301,422 253302,1983 253303,1282 253304,1181 253305,1167 253306,589 253307,1785 253308,1124 253309,1782 253310,973 253311,86 253312,148742 253313,1381 253314,1014 253315,269 253316,151 253316,178 253317,106 253318,1276 253320,106 253321,1579 253322,333 253324,200 253325,1363 253326,142405 253326,154408 253327,195 253328,106 253329,1619 253330,162599 253332,184 253333,233 253334,58 253335,346 253336,809 253337,130 253338,253339 253340,577 253341,29380 253342,227669 253343,1608 253344,850 253344,3370 253345,372 253347,509 253347,1043 253348,422 253349,4545 253349,56150 253350,1326 253351,1132 253352,313 253354,1801 253355,358 253356,515 253357,140 253358,622 253358,1033 253358,1590 253359,2421 253360,2421 253361,491 253362,189834 253363,447 253364,2775 253365,1893 253366,920 253367,1188 253368,179170 253369,209 253370,485 253371,1769 253372,3623 253373,30331 253374,843 253375,253376 253377,663 253378,179170 253379,179170 253381,1368 253382,3623 253383,138686 253384,175 253385,4192 253385,4193 253386,179170 253387,253388 253389,136 253390,200 253391,179170 253392,392 253393,30 253394,996 253394,1644 253395,73570 253396,510 253396,3182 253397,73570 253398,50 253398,79 253398,99 253399,3623 253400,615 253401,225 253402,440 253403,707 253404,557 253405,151 253406,455 253407,255 253408,433 253413,647 253415,525 253417,220816 253418,1309 253419,179170 253420,106 253421,3960 253422,1285 253423,1363 253424,220816 253425,586 253425,1243 253426,138686 253427,175 253428,179170 253429,631 253430,294 253431,35486 253432,1454 253433,253434 253435,1544 253436,79 253437,83 253438,843 253439,179170 253440,79 253442,83 253443,179170 253444,179170 253445,106 253446,192 253447,994 253448,302 253449,179170 253450,253451 253452,179170 253453,77 253454,83 253454,278 253454,577 253455,253456 253457,179170 253458,536 253459,269 253460,862 253461,179170 253462,704 253463,79 253464,2620 253465,809 253466,220816 253467,885 253467,13704 253468,179170 253470,253471 253472,7092 253473,10 253474,220816 253475,7416 253476,83 253477,207 253478,536 253479,217 253480,516 253481,779 253482,694 253483,278 253484,155481 253485,217 253486,147 253487,83 253488,220816 253489,1274 253490,10 253491,220816 253492,1363 253493,220816 253494,220816 253495,220816 253496,138 253497,865 253498,557 253499,137 253500,1893 253501,88820 253502,138686 253503,175 253504,557 253505,220816 253506,932 253507,179170 253509,220816 253510,949 253511,8855 253512,4172 253513,1749 253514,1363 253515,86 253516,222 253517,77 253518,818 253519,179170 253520,818 253521,433 253522,179170 253523,179170 253524,202 253525,1132 253526,44 253527,83 253528,55849 253529,179170 253530,253531 253532,206 253533,332 253534,30 253535,179170 253536,104 253537,1860 253538,179170 253539,1 253540,220816 253541,663 253542,663 253543,420 253544,775 253545,663 253546,220816 253547,220816 253548,1644 253549,147 253550,179170 253551,577 253552,30 253553,179170 253554,179170 253555,253556 253557,138686 253558,175 253559,1368 253560,54 253561,179170 253562,253563 253564,253565 253567,179170 253568,287 253569,818 253570,179170 253571,1368 253572,422 253573,422 253574,422 253575,253576 253577,1832 253578,422 253579,422 253580,422 253581,2373 253582,1860 253583,1858 253584,179170 253585,222 253586,179170 253587,179170 253588,1782 253589,253590 253591,1773 253592,1634 253593,54 253594,1181 253595,179170 253596,253597 253598,285 253599,179170 253600,30 253601,30 253602,179170 253603,30 253604,179170 253605,179170 253606,179170 253607,179170 253608,179170 253609,179170 253610,179170 253611,179170 253612,30 253613,1181 253615,483 253616,285 253617,250 253617,1684 253618,285 253619,250 253619,1684 253620,225 253621,253622 253623,171 253624,220816 253625,220816 253627,220816 253628,8884 253629,179170 253630,1381 253631,784 253632,1085 253634,179170 253635,179170 253636,253637 253638,289 253638,94134 253639,422 253640,56 253641,493 253642,1160 253643,1707 253644,253645 253646,240174 253647,179170 253648,285 253649,147 253650,422 253651,134 253652,151 253653,3804 253654,1319 253655,240 253656,207 253657,255 253658,433 253659,205627 253660,3507 253660,3698 253661,366 253662,366 253663,366 253664,366 253665,366 253666,366 253667,366 253668,366 253669,366 253670,179170 253671,366 253672,56 253673,422 253674,2528 253674,2590 253674,5469 253675,205488 253676,179170 253677,390 253679,2421 253680,30 253681,1544 253682,253683 253684,30 253685,35486 253686,273 253687,647 253688,179170 253689,1566 253690,1644 253691,179170 253692,142870 253693,1644 253694,704 253695,1181 253697,1634 253698,179170 253699,191355 253700,932 253701,3623 253702,30 253703,968 253704,253705 253704,261254 253706,422 253707,56 253709,179170 253710,1181 253711,179170 253713,179170 253714,83 253715,302 253716,918 253716,1160 253717,1400 253718,30 253719,333 253720,333 253721,968 253721,2083 253721,3207 253721,5301 253722,1807 253723,1298 253724,1544 253726,253727 253728,784 253729,1623 253730,30 253731,8270 253733,647 253734,44480 253734,116178 253734,254662 253736,179170 253737,138686 253738,175 253739,1381 253740,1707 253741,1160 253742,179170 253743,179170 253744,1644 253745,1 253746,663 253747,179170 253748,835 253749,2073 253750,313 253751,7124 253752,179170 253753,433 253754,1181 253755,1858 253756,1860 253757,932 253758,147 253759,24505 253760,447 253761,220816 253762,220816 253763,44 253765,220816 253766,179170 253767,15179 253768,220816 253769,220816 253770,5961 253771,220816 253773,8270 253774,261 253775,253776 253777,1888 253778,179170 253779,179170 253780,179170 253781,179170 253782,151 253783,253784 253785,3260 253786,179170 253787,312 253788,285 253789,344 253790,179170 253791,1235 253791,1335 253792,220816 253793,1479 253794,390 253795,179170 253796,179170 253797,179170 253798,220816 253799,179170 253800,227669 253801,167 253802,30 253803,56 253804,433 253805,253806 253807,30 253808,433 253809,179170 253810,179170 253811,269 253812,179170 253813,433 253814,179170 253815,4355 253816,179170 253817,179170 253818,422 253819,56 253821,406 253822,179170 253823,333 253824,253825 253826,179170 253827,179170 253828,3 253829,147 253830,179170 253831,1181 253832,179170 253833,179170 253834,1085 253834,1140 253834,4504 253835,253836 253837,422 253838,56 253839,30 253840,179170 253842,1769 253843,30 253844,483 253845,253846 253848,179170 253849,179170 253850,1634 253852,179170 253853,253854 253855,253856 253857,253858 253859,3447 253860,253861 253862,222 253862,588 253862,590 253863,349 253864,179170 253865,179170 253866,179170 253867,253868 253869,50 253870,179170 253871,253872 253873,58 253874,30 253875,366 253876,366 253877,366 253878,366 253879,179170 253880,433 253881,107 253882,2416 253882,2417 253883,292 253884,338 253885,179170 253886,298 253887,179170 253888,1133 253889,3538 253890,253891 253892,1220 253893,253894 253895,179170 253896,179170 253897,179170 253898,1313 253899,179170 253900,179170 253901,179170 253902,433 253903,179170 253904,179170 253905,1227 253905,86416 253906,1058 253907,30 253909,1531 253910,5405 253911,253912 253911,256445 253913,433 253914,634 253915,55849 253916,302 253917,439 253918,35486 253919,1707 253920,179170 253921,285 253922,217 253923,1247 253923,164572 253924,355 253925,1052 253926,1052 253927,55849 253928,55849 253929,97 253930,491 253931,355 253932,55849 253933,217 253933,222 253933,390 253933,589 253933,631 253933,932 253933,1001 253933,1085 253933,1122 253933,1522 253934,392 253935,217 253936,4218 253937,145240 253938,389 253939,1181 253939,3876 253940,179170 253941,1203 253942,30 253942,4355 253943,422 253944,56 253945,5265 253946,179170 253947,30 253947,275 253948,253949 253950,1776 253950,2617 253951,4611 253952,1803 253953,289 253953,94134 253954,346 253955,253956 253957,1572 253958,30 253959,247 253960,1381 253961,56 253962,422 253963,253964 253965,1381 253966,932 253967,30 253968,16019 253969,138686 253970,175 253971,151 253972,491 253973,179170 253974,483 253975,240174 253976,2989 253976,2991 253977,269 253978,3804 253979,536 253980,302 253981,240174 253982,2146 253983,346 253984,779 253985,227669 253986,406 253987,147 253988,32 253989,1417 253990,518 253991,1983 253992,179170 253993,1707 253994,179170 253995,7 253996,994 253997,934 253998,406 253998,1801 253998,3474 253999,179170 254000,994 254001,179170 254002,1515 254003,254004 254006,179170 254007,179170 254008,6506 254011,920 254012,1962 254013,179170 254014,179170 254015,8788 254016,493 254017,179170 254018,179170 254019,557 254020,328 254021,1345 254022,141912 254024,5265 254026,442 254027,302 254028,179170 254029,292 254030,179170 254031,179170 254032,254033 254034,28130 254035,158 254036,1707 254037,1860 254038,1858 254039,144962 254040,4611 254041,1274 254042,54 254043,247 254044,536 254045,1608 254046,1359 254047,1082 254048,972 254049,179170 254050,3846 254051,54 254052,406 254053,1224 254054,1298 254055,179170 254056,115659 254056,142870 254057,179170 254058,254059 254060,179170 254061,875 254062,254063 254064,422 254065,422 254066,422 254067,422 254068,422 254069,422 254070,422 254071,422 254072,422 254073,422 254074,994 254075,422 254076,3623 254077,875 254078,3623 254079,197260 254080,3623 254081,179170 254082,255 254083,192 254084,179170 254085,138686 254086,175 254087,424 254088,269 254089,843 254090,41 254091,147 254091,192 254091,406 254091,439 254091,779 254091,1181 254091,2931 254092,200 254093,30 254093,5310 254094,1274 254095,393 254096,332 254097,179170 254098,179170 254099,179170 254100,179170 254101,179170 254102,3447 254103,1522 254104,179170 254105,50 254106,1 254107,1181 254109,422 254110,179170 254111,366 254112,254113 254114,366 254115,292 254116,294 254117,296 254118,403 254118,668 254118,2168 254118,4691 254119,366 254120,298 254121,142473 254122,179170 254124,187 254125,589 254126,8991 254126,72439 254127,6119 254128,1119 254130,179170 254131,636 254132,636 254133,4597 254134,179170 254135,704 254136,493 254137,79 254138,592 254139,585 254140,586 254141,406 254142,393 254143,50 254144,30 254145,179170 254146,30 254147,30 254148,135 254148,355 254148,227669 254149,30 254150,1544 254151,1243 254152,477 254153,217 254154,259 254155,179170 254156,666 254157,30 254158,254159 254160,1419 254161,179170 254162,217 254162,536 254163,1188 254164,140 254165,254166 254168,55849 254169,30 254170,1634 254171,2460 254173,433 254174,148742 254175,30 254176,1167 254177,6837 254179,285 254181,1058 254182,115659 254183,1707 254184,2775 254187,179170 254188,907 254189,872 254190,5405 254191,1070 254192,179170 254193,838 254194,254195 254197,1984 254198,106 254199,30 254201,278 254202,10 254203,35486 254204,179170 254205,30 254206,1893 254207,783 254207,1102 254207,2646 254208,1860 254209,1858 254210,433 254213,392 254213,685 254214,707 254216,586 254217,433 254218,1096 254219,707 254220,179170 254222,972 254223,671 254224,147 254224,158 254225,273 254226,269 254227,516 254228,1151 254229,179170 254230,179170 254231,980 254232,179170 254233,179170 254234,1425 254235,3392 254236,30 254238,179170 254239,254240 254241,3623 254242,83 254243,248 254244,1608 254245,1132 254246,920 254247,920 254248,184 254249,103860 254250,179170 254251,1509 254253,209 254254,48 254255,1551 254255,191860 254257,151 254258,1089 254259,8 254261,5405 254262,287 254263,1370 254265,4597 254267,31073 254268,1087 254269,35486 254270,179170 254271,179170 254272,5405 254273,206 254274,179170 254275,422 254276,4193 254277,1119 254277,72439 254278,307 254278,332 254278,1684 254278,182162 254279,406 254280,18726 254281,1238 254282,994 254284,5405 254285,994 254286,254287 254288,217 254289,254290 254291,1608 254292,1132 254293,1452 254294,1212 254295,302 254296,493 254297,1608 254298,1132 254299,389 254300,22 254301,117163 254303,1102 254306,657 254306,2266 254307,140 254308,1243 254309,1102 254310,209 254311,1102 254312,356 254313,287 254314,663 254315,1849 254316,1102 254317,467 254318,811 254319,138 254320,1453 254321,254322 254323,932 254324,312 254325,214131 254326,4549 254327,7572 254328,9098 254330,138686 254331,175 254332,592 254333,302 254334,640 254335,1181 254336,861 254337,640 254338,346 254339,994 254340,3876 254341,1522 254342,1544 254343,179170 254344,2620 254345,1381 254346,392 254348,5662 254349,1381 254350,5405 254351,406 254353,868 254354,142426 254355,1465 254356,388 254357,1010 254358,222 254359,179170 254360,3695 254361,83 254362,292 254363,179170 254364,862 254365,179170 254366,1368 254367,200 254368,27356 254369,136 254371,227669 254372,872 254373,671 254374,3623 254375,1007 254376,179170 254377,1132 254378,1608 254379,2379 254380,272 254382,577 254383,1096 254385,589 254386,346 254387,81 254388,527 254389,390 254389,752 254390,557 254394,1769 254395,113156 254396,44 254397,1722 254399,147 254400,147 254402,5265 254403,179170 254404,647 254405,344 254406,146 254406,92476 254407,1740 254408,184 254409,392 254409,1465 254410,694 254413,779 254414,179170 254415,278 254416,996 254417,647 254418,30 254419,1116 254420,622 254421,83 254422,111142 254423,1087 254424,615 254424,1732 254425,30 254426,5405 254427,1220 254428,516 254429,252 254430,1983 254431,58 254432,994 254433,46 254435,1564 254436,5405 254437,54 254438,138686 254439,2146 254440,175 254441,1955 254442,1556 254443,1949 254444,167 254446,30 254447,346 254448,54 254452,483 254453,247 254454,30 254455,1052 254456,54 254457,2775 254458,1381 254459,6387 254460,9001 254461,30 254462,707 254463,1058 254465,336 254466,843 254467,515 254468,444 254469,406 254470,406 254472,309 254472,310 254474,192 254475,1608 254476,1132 254478,58 254479,2797 254480,3331 254481,332 254482,3319 254483,3328 254484,179170 254485,360 254486,55849 254487,1860 254488,1858 254489,406 254489,779 254491,493 254492,254493 254494,5405 254495,217 254496,7416 254497,217 254498,55849 254499,3367 254500,30 254501,283 254502,1078 254503,694 254504,1860 254505,1858 254506,3623 254507,278 254508,30 254509,107 254510,2779 254512,247 254513,179170 254514,1172 254515,668 254517,134 254518,60576 254519,5405 254520,192 254521,333 254522,179170 254523,179170 254524,175 254525,1608 254526,1132 254527,138686 254528,175 254529,1722 254530,4597 254531,192 254532,918 254533,179170 254534,628 254534,1204 254535,920 254536,255 254537,2146 254538,1749 254539,2979 254540,151 254541,859 254542,1 254543,932 254544,779 254545,179170 254546,1849 254547,1319 254548,83 254549,389 254550,119 254551,55849 254552,577 254553,516 254553,189788 254553,215310 254553,253135 254554,254555 254556,215 254557,563 254558,563 254559,192 254560,2775 254562,179170 254563,3 254564,2373 254565,73570 254566,1860 254567,179170 254569,179170 254570,2421 254572,30 254573,179170 254574,10 254576,592 254578,1298 254579,204093 254580,1212 254581,240 254582,1089 254583,154408 254584,106 254585,252 254586,3623 254587,158 254588,346 254589,220816 254590,433 254591,5405 254592,403 254592,693 254593,217 254593,1417 254594,179170 254595,3804 254596,252 254597,220816 254598,19010 254599,247 254600,663 254601,65 254601,264 254601,1659 254601,2979 254602,13361 254603,220816 254604,1085 254605,220816 254606,302 254606,406 254606,420 254606,1414 254606,1466 254607,254608 254609,220816 254610,1220 254611,252 254612,516 254613,179170 254614,2048 254615,536 254616,149 254617,220816 254618,503 254619,50 254620,1319 254622,220816 254623,220816 254624,254625 254626,247 254627,920 254628,220816 254629,275 254630,516 254631,227376 254631,264499 254631,264502 254632,485 254633,298 254634,220816 254635,273 254636,301 254637,1001 254637,2443 254638,1707 254639,179170 254640,1 254641,138686 254642,175 254643,440 254644,220816 254645,217 254646,704 254647,79 254648,220816 254649,179170 254650,1326 254651,102 254652,1323 254653,408 254654,220816 254655,733 254656,673 254657,142870 254658,179170 254659,35486 254660,1474 254661,220816 254663,179170 254664,3 254665,254666 254667,220816 254668,518 254670,220816 254671,54 254672,536 254672,1240 254673,264 254674,220816 254675,1579 254676,1572 254677,179170 254678,809 254679,220816 254680,220816 254681,54 254682,2889 254683,1359 254684,220816 254685,115659 254686,907 254686,1955 254687,220816 254688,1425 254689,220816 254690,707 254691,968 254691,1837 254691,1893 254691,2083 254692,340 254693,220816 254694,220816 254695,179170 254696,158 254697,366 254698,220816 254699,55849 254700,220816 254701,1001 254702,18726 254703,406 254704,1313 254705,891 254705,131675 254706,134 254707,707 254708,1300 254709,3623 254710,179170 254711,30 254712,147 254713,87 254713,687 254713,872 254713,1454 254714,179170 254715,14797 254716,1566 254717,138686 254718,175 254719,54 254720,179170 254721,346 254722,467 254723,220816 254724,875 254725,247 254726,577 254727,2590 254728,3260 254729,2116 254730,141912 254731,900 254732,179170 254733,704 254734,493 254735,1085 254736,250 254736,1684 254737,285 254738,1 254739,577 254740,179170 254741,920 254742,217 254743,1551 254743,3041 254744,4597 254745,996 254746,254747 254748,13980 254749,10 254749,1313 254749,28203 254750,158 254751,920 254752,217 254752,536 254752,949 254752,13575 254753,144556 254754,207 254755,79 254756,179170 254757,285 254758,179170 254759,2266 254760,4672 254761,2590 254762,1313 254763,54 254764,994 254765,179170 254766,179170 254767,179170 254768,179170 254769,179170 254770,240 254771,179170 254772,30 254773,179170 254774,872 254775,1429 254776,1773 254777,200 254778,668 254779,30 254780,491 254781,179170 254782,220816 254783,269 254784,220816 254785,179170 254786,220816 254787,83 254788,179170 254789,220816 254790,151 254791,220816 254792,707 254793,220816 254794,704 254795,79 254796,346 254797,220816 254798,220816 254799,179170 254800,179170 254801,2073 254802,220816 254803,207 254804,1381 254806,220816 254807,818 254808,1571 254809,220816 254811,1143 254812,220816 254813,366 254814,366 254815,366 254816,366 254817,366 254818,366 254819,220816 254820,6556 254821,994 254823,346 254824,179170 254825,220816 254826,187176 254827,179170 254828,220816 254829,1860 254830,179170 254831,220816 254832,852 254833,30 254834,937 254835,220816 254837,1132 254838,1608 254839,192 254840,220816 254841,220816 254843,35486 254844,30 254845,179170 254846,289 254846,94134 254847,5405 254848,46 254852,302 254853,1722 254854,1130 254857,252 254858,304 254859,304 254860,644 254861,1722 254863,1556 254864,3623 254865,344 254866,285 254867,862 254868,1515 254869,2260 254870,240174 254872,179170 254873,58 254874,994 254875,46 254876,10 254877,58 254878,994 254879,46 254880,697 254880,1893 254881,179170 254882,433 254883,422 254884,56 254885,577 254886,146 254886,92476 254887,647 254888,344 254889,1566 254890,424 254891,104 254892,222 254894,240 254895,1807 254895,191355 254896,301 254896,444 254896,567 254896,615 254896,968 254896,1124 254896,1231 254896,1949 254896,3422 254896,3630 254896,5662 254897,162599 254898,920 254899,595 254900,163 254901,30 254902,1019 254903,1359 254904,179170 254905,151 254907,179170 254908,657 254909,447 254910,2775 254911,302 254912,179170 254913,179170 254914,1082 254915,146 254915,92476 254916,344 254917,328 254918,171 254919,3769 254920,1551 254921,147 254921,158 254921,2244 254921,259829 254922,72 254923,252 254923,1220 254924,330 254925,893 254926,994 254927,58 254928,46 254931,222 254932,104 254934,328 254935,1608 254936,1132 254937,171 254938,146 254938,92476 254939,3094 254940,1608 254941,1132 254942,309 254942,310 254943,35486 254945,1608 254946,1132 254947,3321 254948,1663 254949,809 254950,1608 254951,1132 254952,1359 254953,1707 254954,1132 254955,1608 254956,312 254957,1227 254957,86416 254958,366 254959,1608 254960,1132 254961,366 254964,4823 254965,1659 254966,4597 254967,1284 254968,422 254969,1608 254970,1132 254971,422 254972,1608 254973,1132 254974,1001 254975,2224 254976,1860 254977,1858 254978,1052 254979,422 254980,422 254981,302 254982,422 254983,422 254984,422 254985,422 254986,422 254987,217 254988,422 254989,784 254991,356 254992,720 254995,1608 254996,1132 254997,56 254998,422 254999,1224 255000,200 255001,749 255002,138686 255003,175 255004,255005 255007,1608 255008,1132 255009,1227 255009,86416 255010,932 255011,1860 255012,1858 255013,693 255014,1631 255015,255016 255017,1608 255018,1132 255019,1132 255020,1608 255021,37 255021,1370 255022,8798 255023,136072 255024,657 255025,1860 255026,1858 255027,3804 255028,215 255028,176782 255029,83 255030,10 255031,527 255032,360 255033,1467 255034,640 255035,86 255037,1132 255038,1608 255039,1132 255040,1608 255041,179170 255042,356 255043,1707 255044,3115 255046,406 255046,620 255046,102560 255047,2334 255048,302 255049,1132 255050,1608 255051,516 255052,1151 255053,4597 255054,1608 255055,1132 255056,356 255057,30 255058,3447 255060,30 255061,3161 255062,1220 255063,79 255068,784 255069,1400 255070,2750 255071,994 255072,19010 255073,1707 255074,151 255075,30 255076,1132 255077,1608 255078,179170 255080,972 255081,968 255082,79 255083,2944 255084,302 255086,5961 255087,179170 255088,491 255089,1181 255090,602 255091,1860 255092,310 255093,1858 255094,1167 255095,1132 255096,30 255097,21442 255098,1722 255099,215 255101,6556 255102,2590 255103,107 255104,30 255106,515 255107,536 255108,255109 255110,255111 255112,1571 255114,30 255115,30 255116,269 255117,2784 255118,58 255119,1881 255120,1052 255121,2775 255122,54 255123,5405 255124,179170 255125,1181 255126,911 255127,30 255128,2073 255131,3623 255132,179170 255133,1579 255134,179170 255136,103860 255137,73570 255138,138686 255139,175 255140,179170 255141,179170 255142,422 255143,779 255144,2006 255145,3623 255146,117163 255147,795 255148,3804 255149,14797 255150,63 255151,2006 255152,3193 255153,525 255154,518 255155,1001 255156,1220 255157,252 255158,251 255159,1707 255160,247 255161,515 255162,1590 255163,752 255164,557 255165,3507 255166,841 255167,115659 255168,309 255168,310 255169,209 255170,225 255171,893 255172,2266 255173,932 255174,7092 255175,589 255176,1160 255177,1644 255178,3602 255179,220816 255180,1564 255181,1212 255182,30 255183,1544 255184,147 255185,2146 255186,1983 255188,147 255189,302 255190,1181 255191,217 255192,302 255193,1220 255194,1844 255195,151 255196,861 255197,483 255198,536 255199,130 255200,622 255201,118336 255202,3623 255203,932 255204,179170 255205,563 255206,3623 255207,422 255208,1556 255209,217 255210,467 255211,192 255212,1265 255212,1266 255213,227 255214,718 255215,255216 255217,3367 255218,861 255219,718 255220,192 255221,179170 255222,179170 255223,479 255224,30 255225,179170 255227,8270 255228,179170 255229,179170 255230,207 255231,222 255231,455 255232,433 255233,344 255234,1566 255235,1522 255236,179170 255237,1058 255238,142433 255240,66297 255241,179170 255244,206 255245,179170 255246,179170 255247,431 255247,631 255248,179170 255250,83 255250,217 255250,278 255250,536 255250,1467 255251,1113 255252,247 255253,247 255254,140 255255,1939 255256,1313 255257,146 255257,92476 255258,344 255259,647 255260,35486 255261,7092 255262,2923 255263,137 255264,30 255264,1179 255265,240174 255266,2373 255267,220816 255268,2674 255268,5871 255269,615 255270,278 255271,4220 255272,1181 255273,503 255274,220816 255275,278 255276,920 255277,220816 255278,6424 255279,467 255280,220816 255281,358 255282,179170 255283,179170 255284,220816 255285,312 255286,589 255287,1132 255288,1608 255289,2744 255290,179170 255291,435 255292,255293 255294,302 255295,179170 255296,393 255297,220816 255298,179170 255300,220816 255301,35687 255302,220816 255303,1326 255304,102 255305,1323 255306,408 255307,2828 255308,56 255309,422 255310,1564 255311,843 255312,309 255312,310 255313,179170 255314,30 255315,220816 255316,2209 255317,949 255318,338 255319,1298 255320,1298 255321,179170 255322,179170 255323,179170 255324,179170 255325,34 255325,35 255325,313 255325,2784 255325,14126 255326,1289 255327,220816 255328,1238 255329,220816 255331,141912 255332,220816 255333,2944 255334,1608 255335,1132 255336,30 255336,1181 255337,918 255338,301 255338,372 255338,801 255338,968 255338,1140 255338,1241 255338,1309 255338,1837 255338,1893 255338,1955 255338,2083 255339,1452 255340,302 255341,220816 255342,179170 255343,220816 255344,30 255345,417 255346,220816 255347,893 255348,22580 255349,220816 255350,736 255351,220816 255352,2116 255353,1634 255354,220816 255355,252 255356,3367 255356,44725 255357,220816 255358,390 255359,2416 255359,2417 255360,138686 255361,175 255362,893 255363,850 255364,220816 255365,893 255366,30 255367,220816 255368,3422 255369,3295 255370,220816 255371,3296 255372,8854 255373,147 255374,255 255375,30 255376,2590 255377,220816 255378,34 255378,35 255378,536 255378,949 255378,1240 255378,1274 255378,1635 255378,2266 255378,7092 255379,626 255379,1419 255379,3474 255380,220816 255381,220816 255382,83 255383,30 255384,220816 255385,158 255386,563 255387,313 255388,158 255388,240 255389,1363 255390,220816 255391,146 255391,92476 255392,647 255393,344 255394,220816 255395,1 255396,167 255397,30 255398,217 255398,1417 255399,3623 255400,68069 255401,1773 255402,8270 255403,1773 255404,30 255405,285 255406,179170 255407,1220 255408,422 255409,56 255410,179170 255411,1821 255411,21736 255412,179170 255413,1773 255414,3 255415,48 255415,649 255416,4597 255417,424 255418,30 255419,1844 255420,142870 255421,292 255421,525 255422,366 255423,54 255424,366 255425,3804 255426,366 255427,77 255428,30 255429,4597 255430,264 255431,1227 255431,86416 255432,179170 255433,1467 255434,1241 255436,589 255437,3138 255438,179170 255439,388 255440,7572 255441,2424 255442,1 255443,1181 255444,1893 255445,179170 255446,424 255447,255448 255450,9029 255451,50 255451,147 255451,202 255451,622 255453,1127 255453,1893 255453,5192 255454,770 255455,850 255456,148742 255457,779 255458,366 255459,200 255460,781 255461,1132 255462,13980 255463,255464 255465,366 255466,138686 255467,175 255468,527 255470,1616 255472,1773 255473,163 255474,179170 255475,75912 255476,827 255477,636 255478,1608 255479,1132 255480,714 255481,255 255482,893 255484,779 255484,141912 255485,2006 255486,433 255487,1415 255488,4218 255489,134 255490,640 255491,779 255491,1515 255492,640 255493,433 255494,467 255494,1345 255495,493 255495,1266 255496,104 255496,3555 255496,127158 255498,10 255498,589 255500,46 255503,328 255504,30 255505,1033 255506,1860 255507,1858 255509,1267 255510,467 255511,77 255512,571 255514,592 255516,1326 255517,518 255518,3 255519,233 255520,4146 255521,3804 255522,1715 255523,795 255524,775 255525,3094 255526,179170 255527,393 255528,1544 255529,1707 255530,349 255531,1294 255532,141912 255533,17346 255535,852 255536,589 255537,920 255541,589 255544,934 255545,707 255546,35486 255547,1983 255548,1188 255550,5310 255551,179170 255552,1608 255553,1132 255554,171 255555,818 255556,859 255557,1860 255558,1858 255559,4611 255560,179170 255561,1860 255562,1858 255563,30 255566,56 255567,1368 255568,422 255569,138686 255570,175 255571,151 255572,567 255573,22 255574,19010 255575,577 255576,202 255577,289 255577,94134 255578,217 255579,392 255580,147 255580,192 255580,195 255580,307 255580,406 255580,779 255581,1274 255582,8714 255583,71 255584,3623 255585,356 255586,3623 255587,3094 255588,1227 255588,86416 255589,179170 255590,35486 255591,3422 255592,644 255593,2784 255594,3623 255595,1707 255596,1860 255597,1858 255599,56 255600,422 255601,264 255602,1238 255603,178 255603,346 255603,435 255603,439 255603,1033 255603,1789 255604,781 255605,1132 255606,22293 255607,1 255608,1082 255609,422 255610,1452 255612,73570 255614,1631 255615,422 255616,422 255617,422 255618,422 255619,422 255620,422 255621,422 255622,422 255623,455 255624,422 255625,422 255626,422 255627,657 255628,932 255630,920 255631,615 255632,56 255633,422 255634,255635 255636,4597 255637,240174 255638,27356 255639,142870 255640,1659 255640,4039 255641,217 255642,15119 255643,3623 255644,83 255645,392 255647,772 255648,3623 255649,162599 255650,83 255651,301 255652,358 255653,1133 255654,1133 255655,5405 255656,158 255656,2244 255657,459 255658,485 255659,314 255659,1001 255660,5405 255661,240 255662,20 255663,841 255664,586 255665,1265 255665,1266 255667,255668 255669,1368 255671,1368 255673,31073 255674,1132 255675,781 255677,95554 255678,117163 255679,2006 255680,518 255681,1955 255682,2083 255683,417 255684,1564 255685,8798 255686,6068 255687,7572 255688,589 255689,714 255691,3260 255692,2168 255693,272 255694,403 255694,634 255695,1238 255696,920 255697,37 255698,13 255699,255700 255701,920 255702,6303 255703,1014 255704,5034 255705,356 255706,146 255706,92476 255707,344 255708,647 255709,920 255710,118336 255712,1749 255713,22 255714,779 255715,255716 255717,493 255718,389 255719,6119 255720,179170 255721,779 255723,779 255723,1515 255724,179170 255725,805 255726,158 255726,1181 255727,920 255732,1805 255733,227 255734,55849 255735,1368 255736,503 255737,142870 255738,55849 255739,83 255740,2274 255741,2979 255742,2006 255743,4771 255744,255745 255746,289 255746,94134 255747,1522 255747,2557 255748,1127 255749,255750 255750,255750 255751,302 255752,5405 255753,515 255754,195 255755,1240 255756,557 255757,142870 255759,48505 255762,217 255762,19443 255764,215276 255765,255 255767,32 255768,251 255769,60576 255770,483 255771,2626 255772,247 255773,4903 255774,818 255775,34 255775,35 255775,313 255775,442 255775,518 255775,749 255775,775 255775,2209 255775,2646 255775,3804 255776,577 255777,7358 255777,7363 255778,1368 255779,1132 255780,1608 255781,302 255782,1085 255783,60576 255784,2224 255785,30 255786,240174 255787,272 255788,30 255789,179170 255790,652 255791,893 255792,83 255793,179170 255795,3260 255796,1608 255797,4597 255798,852 255799,2373 255800,310 255800,224488 255801,392 255802,1608 255803,1132 255804,652 255805,968 255806,392 255806,433 255807,255808 255809,68069 255810,1893 255811,1368 255812,704 255813,179170 255814,60576 255815,252 255816,1220 255817,251 255818,1132 255819,1608 255820,1 255821,60576 255822,138686 255823,175 255824,151 255825,1608 255826,1132 255827,179170 255828,140 255829,1052 255830,1608 255831,1132 255832,1220 255833,252 255834,251 255835,1298 255836,255837 255838,192 255839,179170 255840,1858 255841,1860 255842,179170 255843,1860 255844,1858 255845,1877 255846,900 255847,462 255848,179170 255849,179170 255850,433 255851,1212 255852,663 255853,2367 255854,252 255855,1452 255856,467 255857,179170 255858,1298 255859,255860 255861,557 255862,1370 255863,1432 255864,179170 255865,843 255867,577 255868,179170 255869,1715 255870,1010 255871,631 255872,217 255873,333 255874,179170 255875,255876 255877,220816 255878,563 255879,158 255880,647 255881,146 255881,92476 255882,344 255883,1118 255884,1019 255885,1858 255886,1860 255887,1465 255888,167 255888,73570 255889,220816 255890,179170 255891,850 255892,220816 255893,48 255894,30 255895,301 255896,251 255896,1512 255896,5992 255897,247 255898,861 255900,920 255901,1639 255902,1381 255903,2367 255904,1227 255904,86416 255905,784 255907,920 255908,179170 255909,704 255910,79 255912,557 255913,5906 255914,626 255915,278 255916,137 255917,30 255918,862 255919,589 255920,65 255920,752 255920,162599 255921,1085 255922,397 255923,781 255924,1132 255926,179170 255927,1175 255928,302 255929,605 255930,211 255931,255750 255932,8854 255933,589 255934,932 255935,1085 255936,1326 255937,240 255938,390 255940,220816 255941,155481 255942,179170 255943,63 255944,861 255945,781 255946,1132 255947,1608 255948,7092 255949,250 255949,1684 255950,285 255951,142473 255952,652 255953,179170 255954,179170 255955,179170 255956,1052 255957,54 255959,2775 255960,3623 255961,179170 255962,2334 255964,278 255965,1293 255966,273 255967,479 255968,142451 255968,255969 255970,147 255970,158 255971,151 255972,179170 255973,255750 255974,179170 255975,784 255976,158 255976,209 255976,252 255976,622 255976,1844 255977,142430 255978,1127 255979,255980 255981,255982 255983,149 255984,179170 255985,1014 255986,30 255987,255750 255988,1014 255989,1014 255990,1014 255991,1014 255992,1014 255993,179170 255994,19010 255995,1257 255996,269 255997,240174 255998,55849 255999,1014 256000,255 256001,55849 256002,30 256003,179170 256004,255613 256005,255750 256006,302 256007,1381 256008,1001 256009,30 256009,5265 256010,1326 256011,102 256012,1323 256013,408 256014,647 256015,146 256015,92476 256016,344 256017,885 256017,13704 256018,2416 256018,2417 256019,19010 256020,1556 256021,179170 256022,179170 256023,827 256023,92476 256023,164572 256024,15573 256025,818 256026,34 256026,115 256027,41 256027,1465 256028,920 256029,179170 256030,179170 256031,79 256032,83 256033,779 256034,255750 256035,3804 256036,220816 256037,8854 256038,179170 256039,366 256040,256041 256042,366 256043,1860 256044,1858 256045,1133 256046,366 256047,179170 256048,147 256049,179170 256050,179170 256051,920 256052,3367 256053,1860 256054,1858 256055,30 256056,35486 256057,315 256058,1267 256059,255613 256060,1860 256061,1858 256062,179170 256063,1118 256063,1796 256064,406 256065,179170 256066,30 256068,72 256069,138686 256070,175 256071,1858 256072,1860 256073,220816 256074,30 256075,179170 256076,3538 256076,7698 256077,811 256078,920 256079,30 256080,1181 256081,422 256082,179170 256083,1257 256084,179170 256085,256085 256086,1014 256087,852 256088,179170 256089,285 256090,805 256090,932 256091,704 256092,79 256093,704 256094,493 256095,79 256096,592 256097,585 256098,50 256099,586 256100,393 256101,179170 256102,4192 256102,4193 256103,179170 256104,217 256105,615 256106,589 256106,6068 256107,1740 256108,323 256109,81 256110,479 256111,640 256112,285 256113,250 256113,1684 256114,179170 256115,1634 256116,752 256117,272 256118,366 256119,179170 256120,179170 256121,179170 256122,179170 256123,179170 256124,920 256125,589 256126,137 256128,30 256129,179170 256130,779 256131,151 256132,179170 256133,179170 256134,256135 256136,256137 256138,255969 256139,4597 256140,256141 256142,44 256143,179170 256144,200 256145,255980 256145,256146 256147,5265 256148,22 256149,179170 256150,111 256150,217 256151,393 256152,671 256153,255982 256154,3872 256155,1707 256156,256157 256159,147 256162,5265 256164,1052 256165,586 256166,60576 256167,48 256168,536 256170,801 256171,32 256172,3079 256174,4218 256176,1631 256178,75912 256179,1425 256180,877 256181,79 256182,893 256184,256185 256186,256187 256190,714 256191,1860 256192,1858 256195,179170 256196,158 256197,707 256198,1201 256199,118336 256200,1082 256201,640 256202,640 256203,640 256204,640 256205,256206 256207,3623 256208,255980 256209,861 256210,179170 256211,30 256212,200 256213,1 256214,202 256214,818 256215,255969 256215,255980 256216,2088 256216,6621 256216,154690 256218,2617 256219,256220 256223,1608 256224,5961 256225,179170 256226,4691 256227,563 256227,911 256227,991 256227,1132 256227,1623 256228,2915 256229,79 256230,920 256232,647 256233,146 256233,92476 256234,344 256235,3623 256236,875 256237,2048 256238,344 256239,146 256239,92476 256240,647 256241,60576 256242,179170 256243,48505 256244,2274 256245,187176 256246,179170 256247,5301 256248,3623 256249,1240 256250,911 256251,146 256251,92476 256252,647 256253,344 256254,146 256254,92476 256255,994 256255,1235 256255,1335 256256,647 256257,344 256258,3 256259,1231 256260,388 256261,390 256262,1465 256263,1167 256264,302 256265,4594 256266,2045 256267,6955 256268,919 256269,2989 256269,2991 256270,510 256271,37 256272,120 256273,9457 256274,240 256275,1634 256276,2620 256277,30428 256278,849 256279,3623 256280,217 256281,256282 256283,35486 256284,3094 256285,179170 256286,9098 256287,515 256288,1590 256289,1274 256290,7572 256291,8798 256292,256293 256294,1749 256295,13361 256296,73570 256297,1893 256298,893 256298,1659 256299,30 256300,83 256301,415 256303,1801 256304,138686 256305,175 256306,179170 256307,256308 256309,30 256310,179170 256312,127158 256313,83 256314,179170 256315,313 256316,422 256317,422 256318,422 256319,422 256320,422 256321,422 256322,1132 256323,781 256324,422 256325,422 256326,422 256327,217 256328,422 256329,422 256330,1238 256331,1955 256332,256187 256332,256600 256333,1796 256334,256293 256336,1452 256338,30 256339,83 256340,255969 256341,302 256342,7768 256343,932 256344,312 256345,811 256346,1590 256347,77 256348,2590 256349,388 256350,634 256351,13661 256352,972 256352,1718 256352,2750 256353,83 256354,13980 256355,217 256356,1858 256357,1860 256358,209 256359,256360 256361,22 256362,4597 256363,3135 256364,332 256365,1132 256366,781 256368,2607 256369,592 256370,142870 256372,920 256373,179170 256374,615 256375,22 256376,240174 256377,577 256378,2991 256379,1449 256379,256380 256381,255750 256382,483 256383,949 256385,994 256386,58 256387,46 256388,65 256389,240 256390,707 256391,433 256393,22 256394,22 256398,707 256399,392 256400,687 256402,592 256403,247 256403,2867 256403,2868 256404,179170 256405,147 256405,149 256406,302 256407,422 256409,1973 256411,192 256413,79 256414,179170 256415,861 256416,142870 256417,179170 256418,302 256419,392 256420,707 256421,60576 256422,707 256424,1368 256425,1224 256428,1509 256430,56 256431,422 256432,256433 256434,302 256435,222 256437,2168 256438,22 256439,393 256440,179170 256441,4611 256443,144556 256444,515 256446,256447 256448,861 256449,149 256450,707 256451,179170 256452,704 256453,1220 256454,251 256455,252 256456,1381 256457,19986 256458,22 256459,15748 256459,255716 256460,861 256462,30 256463,179170 256464,146 256464,92476 256465,647 256466,344 256467,809 256468,30 256469,302 256471,289 256471,94134 256472,330 256472,994 256472,3161 256472,4597 256473,30 256474,875 256475,107 256477,179170 256478,1227 256478,86416 256479,4810 256480,292 256481,3260 256482,247 256483,179170 256484,79 256485,179170 256488,1860 256489,1858 256490,1227 256490,86416 256491,255911 256492,256493 256494,805 256495,1167 256496,256497 256498,179170 256499,5405 256500,179170 256501,1227 256502,3960 256503,147 256503,158 256504,104 256505,179170 256506,255 256507,875 256508,483 256509,30 256510,200 256511,1220 256512,2646 256513,918 256514,151 256515,202 256516,179170 256517,22 256518,30 256519,56 256520,422 256521,1849 256522,1556 256523,4594 256524,68 256525,23783 256526,30 256528,179170 256529,255 256530,179170 256531,563 256532,138686 256533,175 256534,1644 256535,1515 256536,1181 256537,873 256538,920 256539,256540 256541,1175 256542,389 256543,455 256544,932 256545,34 256545,35 256546,3999 256547,256548 256550,406 256551,258 256552,406 256553,30 256555,217 256556,220816 256557,222 256558,1001 256559,1335 256560,4545 256560,56150 256561,1429 256562,467 256563,2372 256564,392 256565,220816 256566,2923 256567,389 256568,179170 256569,217 256570,283 256571,22 256572,760 256573,1608 256574,1132 256575,179170 256576,220816 256577,35486 256578,30 256580,247 256581,862 256582,571 256583,717 256584,3623 256585,647 256586,1619 256587,179170 256588,240 256588,289 256588,372 256588,406 256588,431 256588,784 256588,809 256588,1085 256588,1119 256588,1285 256588,1467 256588,1871 256588,2205 256588,2421 256588,2620 256588,2671 256588,3135 256588,5906 256588,8788 256588,15609 256588,33424 256588,94134 256588,245910 256589,30 256590,148742 256591,247 256592,179170 256593,256594 256595,179170 256596,247 256597,102 256598,179170 256599,256600 256600,255969 256600,256187 256601,818 256602,6424 256603,192 256604,255969 256605,861 256606,179170 256607,7092 256608,2750 256609,179170 256610,1927 256611,107 256612,83 256613,179170 256614,1390 256615,179170 256616,885 256617,179170 256618,255969 256619,577 256619,605 256620,707 256621,718 256622,278 256623,255969 256624,30 256626,192 256627,30 256628,1927 256629,56 256630,422 256631,1644 256632,588 256632,590 256633,56 256634,422 256635,179170 256636,256206 256637,1 256638,22 256639,366 256641,30 256643,2750 256644,77 256646,557 256647,862 256648,256649 256650,83 256651,256652 256653,417 256654,435 256655,240 256655,17309 256656,255613 256657,1298 256658,861 256659,4 256660,118336 256661,4101 256663,30 256664,2931 256665,1326 256666,102 256667,1323 256668,408 256669,2373 256670,179170 256671,843 256672,589 256673,179170 256674,1 256675,707 256676,422 256677,255750 256677,256600 256678,1392 256679,628 256680,256681 256682,1556 256683,2367 256684,1359 256685,843 256686,34 256686,35 256687,4455 256688,220816 256690,256691 256692,2590 256693,579 256693,687 256693,6303 256694,2416 256694,2417 256695,1877 256696,1608 256697,1132 256698,54284 256699,147 256700,138686 256701,175 256702,256703 256704,1773 256705,256706 256708,10 256709,142451 256709,255969 256710,17588 256711,2735 256712,2929 256713,220816 256714,920 256715,255969 256716,346 256717,220816 256718,872 256719,220816 256720,875 256721,79 256722,220816 256723,22 256724,220816 256725,949 256726,256681 256727,220816 256728,1345 256729,256681 256730,3582 256731,256732 256733,1 256734,256735 256736,247 256737,22 256738,256681 256739,1860 256740,255969 256741,56 256742,422 256743,256681 256744,240174 256745,256681 256746,256703 256747,256748 256749,1531 256750,256681 256751,179170 256752,1335 256753,179170 256754,256681 256755,179170 256756,256757 256758,256681 256759,256681 256760,256681 256761,179170 256762,256763 256762,256765 256764,256681 256766,256765 256767,256681 256768,247 256769,393 256770,179170 256771,1122 256772,179170 256773,256703 256774,2915 256775,1188 256776,1140 256777,5908 256778,422 256779,56 256780,30 256781,30 256782,13345 256782,21084 256782,122842 256783,113156 256785,52270 256786,704 256787,493 256788,1707 256789,253147 256789,256187 256790,163 256791,256681 256792,256681 256793,171 256794,330 256796,256681 256797,1619 256798,285 256800,1860 256801,1858 256802,1016 256802,1285 256803,256681 256804,422 256805,1052 256806,1572 256807,491 256808,366 256809,10 256810,256681 256811,360 256817,171 256818,1858 256819,1860 256820,1133 256821,1133 256824,256825 256826,55849 256828,809 256829,55849 256830,1019 256832,2116 256833,209 256835,707 256836,256600 256837,736 256838,358 256839,120 256839,261 256839,1466 256839,3115 256840,315 256840,439 256840,538 256840,671 256840,934 256840,1033 256840,1590 256840,2353 256841,55849 256842,1644 256843,117163 256844,872 256845,55849 256846,158 256847,809 256848,209 256849,55849 256850,640 256851,640 256853,640 256855,640 256856,310 256856,3039 256857,256858 256859,35486 256860,640 256861,356 256862,344 256863,285 256864,626 256864,2995 256865,2944 256866,636 256867,1893 256869,809 256870,809 256871,1644 256872,707 256873,13538 256874,344 256875,920 256876,3999 256877,4571 256878,2105 256879,83 256880,581 256881,256882 256883,911 256884,809 256885,209 256886,358 256887,5310 256888,707 256889,707 256890,302 256891,30 256892,106 256892,1370 256893,30 256894,1659 256895,138686 256896,175 256897,1858 256898,1860 256899,1531 256900,809 256901,356 256902,1579 256903,1860 256904,1858 256905,781 256906,1132 256907,167 256908,1132 256910,83 256911,35486 256913,179170 256914,1132 256915,83 256916,615 256917,255 256918,34 256918,35 256919,1837 256920,344 256921,256922 256923,1058 256924,2480 256925,557 256926,422 256927,422 256928,622 256929,422 256930,422 256931,422 256932,422 256933,422 256934,255 256935,422 256936,189839 256938,30 256939,147 256939,149 256940,422 256941,2671 256942,1238 256943,422 256944,422 256945,215874 256946,142426 256947,332 256948,256949 256950,422 256951,56 256952,1452 256953,714 256954,843 256955,145240 256956,435 256957,261 256958,843 256962,843 256965,682 256965,1353 256965,72439 256966,843 256967,253147 256967,256600 256968,843 256969,843 256970,217 256971,1132 256972,467 256973,191860 256974,191860 256975,191860 256976,191860 256978,2135 256979,191860 256980,179170 256983,191860 256984,191860 256985,191860 256987,209 256988,79 256989,2260 256990,3999 256991,191860 256992,191860 256993,264 256994,5405 256995,663 256996,743 256997,934 256998,151 256999,151 257000,257001 257002,652 257003,344 257004,146 257004,92476 257005,647 257006,489 257007,248 257008,6068 257010,37414 257011,1707 257012,1132 257013,1608 257014,1238 257015,5405 257018,875 257019,795 257020,843 257021,996 257022,1132 257023,1608 257024,1860 257025,5405 257026,167 257026,73570 257027,1298 257028,240174 257029,1238 257030,1149 257031,83 257032,1238 257033,1608 257034,5405 257035,30 257037,440 257038,1132 257039,1608 257040,393 257041,991 257041,2626 257041,3260 257042,204124 257043,4237 257043,182162 257044,158 257045,30 257046,450 257047,30 257048,30 257049,707 257050,5405 257053,1220 257054,516 257055,252 257057,158 257058,5301 257059,275 257060,3695 257061,2434 257062,7572 257063,6068 257064,2989 257064,2991 257065,4678 257066,255 257066,164572 257068,151 257069,5405 257070,179170 257071,30 257072,30 257073,30 257074,23010 257075,30 257076,4611 257079,1860 257080,1858 257081,875 257082,3999 257083,8270 257085,1509 257086,1749 257086,2605 257087,163 257088,179170 257089,179170 257090,179170 257091,2460 257092,251 257094,781 257095,1132 257096,1132 257097,781 257098,255750 257099,179170 257100,179170 257101,1151 257102,392 257103,775 257106,707 257107,647 257108,179170 257109,179170 257110,515 257111,269 257112,30 257113,66297 257114,1220 257115,516 257116,252 257117,138686 257118,175 257119,111 257119,595 257119,1151 257119,1572 257119,3538 257120,312 257121,4597 257122,1220 257123,252 257124,516 257125,6068 257127,158 257128,179170 257129,714 257131,302 257132,516 257133,252 257134,1220 257135,752 257136,1133 257138,256681 257140,30 257141,252 257142,1220 257143,516 257144,1644 257145,15573 257146,907 257147,1749 257148,996 257149,671 257150,433 257151,450 257152,309 257152,310 257153,158 257154,515 257155,360 257156,473 257157,452 257158,1247 257158,164572 257159,184 257160,255 257161,97 257163,707 257164,60576 257165,257166 257167,257168 257169,360 257170,6323 257170,25348 257171,10 257172,179170 257173,179170 257174,4101 257175,516 257176,1220 257177,707 257178,179170 257179,252 257180,1466 257181,1860 257182,1858 257183,149 257184,151 257185,1220 257186,516 257187,252 257188,932 257189,918 257190,179170 257191,704 257191,1140 257192,907 257193,19010 257194,1058 257195,704 257196,79 257197,314 257197,1844 257198,315 257199,5405 257201,97 257202,447 257203,2775 257205,103860 257206,872 257207,200 257208,4597 257209,142870 257210,56 257211,422 257212,285 257213,179170 257214,184 257215,1181 257216,35486 257217,220816 257218,704 257219,138 257220,865 257221,557 257222,79 257223,137 257224,29380 257225,220816 257226,525 257227,417 257228,145240 257229,920 257230,30 257231,422 257232,4101 257233,184 257234,220816 257235,491 257236,920 257237,179170 257238,136 257238,251 257238,252 257238,275 257238,388 257238,489 257238,516 257238,704 257238,733 257238,893 257238,1220 257238,1243 257238,3474 257238,48505 257238,189788 257238,189794 257238,215276 257238,223738 257239,220816 257240,179170 257241,30 257242,179170 257243,257244 257244,253147 257244,256187 257245,179170 257246,1707 257247,3079 257248,30 257249,200 257250,192 257251,1313 257252,179170 257253,356 257254,809 257255,179170 257256,120 257257,795 257258,7092 257259,302 257260,1220 257262,861 257263,179170 257264,179170 257265,1715 257265,2620 257265,66297 257266,72 257267,255750 257268,179170 257269,1644 257270,626 257271,179170 257272,278 257274,179170 257276,1773 257277,257278 257279,2735 257280,285 257281,179170 257282,6119 257283,1326 257284,102 257285,1323 257286,408 257288,179170 257290,557 257291,29380 257292,859 257293,707 257294,3804 257296,557 257297,809 257298,202 257299,83 257300,1019 257301,217 257302,220816 257304,1227 257305,252 257306,256187 257307,278 257308,2073 257309,191860 257310,5908 257311,179170 257312,256681 257313,147 257314,1167 257315,63 257315,202 257315,247 257315,349 257315,366 257315,516 257315,697 257315,1467 257315,3804 257316,1860 257317,1858 257318,1796 257319,179170 257320,217 257321,366 257322,179170 257323,577 257324,557 257325,256681 257326,707 257327,595 257328,179170 257329,179170 257330,1860 257331,1858 257332,257333 257334,285 257335,344 257336,86 257336,167 257336,301 257336,907 257336,1284 257336,1522 257336,2083 257336,2557 257336,2979 257337,285 257338,779 257339,332 257340,220816 257341,255613 257342,366 257343,179170 257344,255 257345,257346 257347,1267 257348,2373 257350,147 257351,138686 257352,175 257353,344 257354,285 257355,154408 257356,707 257357,30 257358,1608 257359,704 257360,1227 257361,707 257362,30 257363,920 257364,1293 257365,1262 257366,104 257367,491 257368,151 257369,1515 257370,1531 257371,818 257372,256681 257373,953 257374,256600 257375,256681 257376,269 257379,344 257380,146 257380,92476 257381,647 257382,366 257383,483 257384,422 257385,422 257386,422 257387,422 257388,422 257389,422 257390,422 257391,422 257392,1 257393,257394 257395,255750 257396,56 257397,422 257398,179170 257399,589 257399,862 257399,2590 257400,179170 257401,285 257402,30 257403,1284 257403,148742 257404,225 257405,255750 257406,30 257407,9560 257408,30 257409,784 257410,1001 257411,8884 257412,269 257413,257414 257415,1085 257416,1160 257417,56 257418,422 257419,298 257420,81 257421,10 257422,30 257423,179170 257424,179170 257425,179170 257426,151 257427,1571 257428,707 257429,257430 257431,179170 257432,257433 257434,257433 257435,491 257436,875 257437,875 257438,346 257439,406 257440,509 257441,15119 257442,393 257443,289 257443,417 257443,94134 257444,301 257445,1085 257446,309 257446,310 257447,179170 257449,179170 257450,707 257452,707 257453,707 257454,707 257455,707 257456,1014 257457,1014 257458,1014 257459,1014 257460,707 257461,1014 257462,1014 257463,30 257464,1014 257465,2590 257466,30 257467,1803 257468,2411 257469,3297 257470,35486 257472,1359 257475,273 257476,467 257477,932 257478,1332 257479,707 257480,2750 257481,1014 257482,805 257483,252 257484,83 257485,1359 257487,707 257488,30 257489,1858 257490,1860 257491,707 257492,707 257493,918 257494,257495 257496,1511 257496,3069 257497,202 257498,2989 257498,2991 257499,707 257500,707 257501,226825 257502,1531 257503,586 257505,54 257506,652 257507,1227 257508,57802 257509,1381 257510,56 257511,422 257512,932 257513,72764 257514,422 257515,56 257516,54 257517,179170 257518,1381 257519,647 257520,142451 257520,255969 257523,366 257524,932 257525,21442 257526,818 257527,818 257528,818 257529,55849 257530,30 257531,202 257532,255750 257533,179170 257534,483 257536,2312 257537,2048 257538,44 257539,55849 257541,56 257542,422 257543,142870 257544,697 257545,3960 257546,179170 257547,818 257548,138686 257549,175 257550,184925 257551,115659 257552,55849 257553,360 257554,1326 257555,102 257556,1323 257557,408 257558,1359 257559,1479 257560,390 257561,743 257562,5908 257563,220816 257564,220816 257565,257566 257568,220816 257569,220816 257570,220816 257571,220816 257572,707 257573,220816 257574,179170 257575,220816 257576,220816 257577,1769 257578,220816 257579,195 257580,151 257580,206 257581,220816 257582,220816 257583,707 257584,220816 257585,179170 257586,220816 257587,220816 257588,256187 257589,1724 257590,220816 257591,220816 257592,220816 257593,220816 257594,220816 257595,220816 257596,220816 257597,707 257598,5405 257600,1860 257601,255750 257602,1181 257603,1181 257604,220816 257605,179170 257606,179170 257607,818 257607,2443 257607,2931 257608,285 257609,285 257610,4260 257611,20 257612,589 257613,257614 257615,592 257616,850 257617,704 257618,257619 257620,3148 257620,6323 257621,255911 257622,179170 257623,179170 257624,872 257625,366 257626,366 257627,1227 257628,179170 257629,179170 257630,2372 257631,1001 257631,1085 257631,6068 257632,179170 257633,179170 257634,179170 257635,179170 257636,104 257637,179170 257638,1181 257639,179170 257640,107 257641,2416 257641,2417 257642,292 257643,338 257644,298 257645,1133 257646,3538 257647,167 257647,1231 257648,707 257649,202 257650,707 257651,5908 257652,257653 257654,707 257655,4597 257656,707 257657,707 257658,255716 257660,179170 257661,9457 257662,120 257663,422 257664,56 257665,179170 257666,392 257667,491 257668,7652 257669,452 257669,4193 257669,25348 257670,1414 257671,707 257672,2496 257673,403 257674,707 257675,707 257676,35486 257677,707 257678,179170 257679,707 257680,3258 257681,467 257682,932 257683,707 257684,707 257685,707 257686,2944 257687,707 257688,1326 257689,179170 257691,257692 257694,257695 257696,1891 257696,4810 257697,257698 257699,257700 257702,34 257702,35 257703,179170 257705,30 257706,7124 257707,179170 257708,179170 257709,179170 257710,309 257710,310 257712,1132 257713,697 257714,275 257715,115 257716,602 257717,7363 257718,364 257718,72439 257719,3872 257720,179170 257722,99 257723,226825 257724,2617 257725,179170 257726,663 257727,8854 257729,1 257730,54 257731,179170 257732,581 257733,54 257734,179170 257735,179170 257736,3804 257737,707 257738,24505 257739,707 257740,179170 257741,707 257742,932 257743,707 257744,5101 257746,195 257747,179170 257748,257749 257750,167 257751,200 257752,433 257753,81 257754,179170 257755,257756 257757,138686 257758,175 257759,2607 257760,779 257761,55849 257762,158 257762,779 257762,8907 257763,1544 257764,714 257765,171 257766,483 257767,81 257767,215 257767,1016 257767,1212 257767,1257 257767,1282 257767,9001 257768,1298 257769,1707 257770,137 257771,257771 257772,48505 257773,156379 257774,433 257775,179170 257776,55849 257777,2373 257779,257780 257781,596 257783,256187 257786,1773 257788,707 257789,557 257790,557 257791,707 257792,338 257793,707 257794,178 257795,23783 257796,5440 257797,63 257797,489 257797,1623 257798,200 257799,192 257799,602 257800,179170 257801,760 257802,1133 257804,707 257805,179170 257806,179170 257807,106 257807,615 257807,1082 257807,1240 257808,269 257809,1773 257810,42220 257811,255750 257812,179170 257814,142870 257815,707 257816,707 257817,255750 257818,179170 257820,422 257821,422 257822,310 257823,257824 257823,264695 257825,707 257826,422 257827,422 257828,422 257829,422 257830,422 257831,422 257832,422 257833,422 257834,422 257835,707 257836,422 257837,56 257838,147 257839,1860 257840,79 257841,422 257842,56 257843,5405 257845,285 257846,2506 257847,213089 257848,872 257849,872 257850,179170 257851,179170 257853,269 257855,1462 257855,3209 257856,219 257857,7117 257858,850 257859,179170 257860,45960 257861,104 257862,240 257863,255982 257864,7155 257865,257866 257867,178 257868,179170 257869,179170 257870,179170 257871,137 257872,41 257873,179170 257874,1019 257874,1467 257874,2421 257875,179170 257876,58 257877,65 257878,707 257879,179170 257880,292 257881,294 257882,179170 257883,1181 257884,296 257885,298 257886,142473 257888,1773 257889,202 257890,784 257891,323 257892,707 257893,2146 257894,4691 257895,147 257896,179170 257897,179170 257898,424 257899,704 257900,493 257901,585 257902,586 257903,79 257904,393 257905,50 257906,406 257907,592 257908,30 257909,30 257911,34 257911,35 257912,422 257914,392 257915,19010 257916,137 257917,589 257918,760 257919,6068 257920,4771 257921,104 257922,518 257923,850 257924,1001 257925,1882 257926,328 257927,1722 257928,14797 257929,1939 257930,1893 257931,111 257932,1140 257933,1745 257934,2701 257935,215 257936,9001 257937,592 257938,72 257939,1052 257940,81 257941,248 257942,225 257943,233 257944,3474 257945,557 257946,503 257947,3507 257948,7270 257949,3 257950,1715 257951,801 257952,1282 257953,63 257954,136 257955,9029 257956,2443 257957,227 257958,1332 257959,3804 257960,5405 257961,104 257962,417 257963,7572 257964,8798 257965,257966 257968,1749 257970,788 257971,3297 257972,206 257973,179170 257974,273 257975,1677 257976,707 257978,707 257979,1043 257980,179170 257981,577 257982,1572 257983,151 257984,179170 257985,179170 257986,493 257988,366 257989,760 257990,652 257991,178 257992,344 257993,179170 257994,536 257994,1240 257994,23287 257994,102560 257994,127158 257994,207045 257995,171 257997,1381 257998,179170 257999,119 258000,433 258002,171 258003,298 258004,1452 258005,652 258006,285 258007,1381 258008,1359 258009,366 258010,779 258011,302 258012,366 258013,1452 258014,366 258015,366 258016,467 258017,505 258017,1837 258018,366 258019,366 258020,211 258021,1821 258021,21736 258022,184 258023,79 258025,636 258026,1381 258027,35486 258028,302 258031,640 258032,640 258033,167 258034,640 258035,640 258036,1860 258037,1858 258038,136072 258039,255750 258040,444 258040,972 258040,3392 258043,2617 258044,493 258045,240 258045,818 258046,818 258047,920 258048,83 258049,163 258049,467 258049,1566 258051,1860 258052,1858 258053,222 258053,1019 258056,1116 258057,707 258058,1858 258059,1860 258060,258061 258062,652 258063,63 258064,217 258066,707 258067,15119 258068,217 258069,1033 258070,147 258070,158 258071,3260 258072,920 258073,102 258074,1238 258075,1860 258076,1858 258077,104 258078,171 258079,1452 258080,255 258081,1522 258082,652 258083,151 258084,32 258085,433 258086,422 258087,1858 258088,1860 258090,760 258092,385 258093,968 258094,433 258095,299 258096,818 258098,1400 258099,217 258100,50 258100,1181 258101,647 258102,457 258103,516 258104,1130 258105,1381 258106,35486 258109,516 258110,707 258111,516 258112,222 258113,850 258114,255750 258114,255911 258114,256146 258114,256157 258115,147 258115,149 258115,21442 258116,292 258118,2191 258119,872 258120,149 258121,932 258122,2191 258123,1927 258124,3538 258125,383 258126,1016 258127,2006 258128,707 258129,918 258129,1151 258130,462 258131,255980 258132,292 258134,83 258136,30 258138,1544 258139,5405 258140,179170 258141,4039 258142,868 258143,707 258144,6303 258145,58 258145,2045 258146,3218 258147,202 258148,215 258149,2620 258150,781 258151,1132 258152,1132 258153,781 258154,872 258155,17772 258156,907 258157,1188 258158,1634 258159,781 258160,1132 258161,6880 258162,1118 258163,1392 258164,1579 258166,83 258167,671 258168,200 258169,171 258170,467 258171,148742 258172,2775 258173,447 258175,222 258176,459 258177,805 258178,1452 258180,287 258181,147 258182,577 258183,184 258184,2775 258185,333 258188,718 258189,781 258190,1132 258191,1381 258192,3630 258193,179170 258194,1893 258194,2617 258195,649 258196,356 258197,30 258198,179170 258199,920 258200,138686 258201,175 258202,217 258203,30 258204,13 258204,1381 258205,302 258206,21442 258208,7416 258209,1619 258210,328 258211,1240 258212,2205 258212,33424 258212,245910 258213,493 258214,390 258216,6119 258217,273 258218,83 258219,1192 258220,1274 258221,663 258222,32751 258223,1818 258224,142405 258225,30 258226,360 258227,55849 258228,30 258230,4865 258230,4866 258231,868 258232,179170 258233,483 258234,2989 258234,2991 258235,13538 258236,283 258237,784 258238,346 258239,2779 258240,779 258241,346 258242,269 258242,1033 258243,4810 258244,258245 258246,431 258247,459 258248,1167 258249,406 258250,147 258250,467 258250,1776 258251,179170 258252,328 258253,2017 258253,17309 258254,5405 258256,83 258257,256681 258259,247 258260,55849 258261,360 258262,406 258263,232766 258265,628 258266,1167 258267,611 258268,258269 258270,1559 258272,85 258273,515 258274,868 258275,3367 258276,315 258277,406 258278,346 258279,163 258279,302 258282,868 258283,302 258285,1132 258286,781 258287,2797 258288,141912 258289,2646 258290,918 258291,149 258292,1068 258293,861 258294,149 258295,1313 258296,406 258297,258298 258299,258300 258302,242826 258303,1381 258305,56 258306,422 258307,1224 258308,179170 258310,333 258311,1849 258312,749 258313,467 258314,805 258316,752 258317,147 258317,158 258318,273 258320,48 258321,346 258322,389 258324,356 258326,58 258327,439 258328,557 258329,302 258330,1955 258331,563 258332,781 258333,1132 258334,1844 258334,2073 258335,30 258336,13546 258337,1572 258338,58 258339,994 258340,46 258341,167 258343,58 258344,46 258345,994 258346,392 258347,1415 258348,247 258349,179170 258350,138686 258351,868 258352,175 258353,1556 258354,968 258355,571 258356,30 258359,179170 258360,1181 258362,255613 258363,918 258364,932 258365,151 258366,366 258367,248 258368,301 258369,2373 258370,179170 258371,1181 258372,657 258373,73570 258374,83 258376,1381 258377,536 258378,1479 258379,1707 258380,2048 258381,3218 258384,435 258386,435 258387,179170 258389,949 258390,1881 258391,1052 258391,1659 258392,30 258393,1181 258394,422 258394,5405 258395,256681 258396,179170 258397,179170 258398,2646 258399,140171 258400,1118 258401,179170 258402,179170 258403,22 258404,240 258405,536 258406,258407 258409,179170 258410,179170 258411,192 258411,602 258412,920 258413,258414 258415,179170 258416,859 258417,179170 258418,34 258418,35 258418,2646 258419,1227 258420,31977 258421,439 258422,972 258423,256187 258424,267 258425,179170 258426,1860 258427,1515 258428,1572 258429,179170 258430,2646 258431,784 258432,247 258433,179170 258434,1133 258435,302 258436,875 258437,269 258438,861 258439,220816 258441,247 258442,256681 258443,271 258444,278 258445,142870 258446,220816 258447,1893 258448,179170 258449,217 258450,220816 258451,875 258452,704 258453,779 258454,79 258455,179170 258456,1016 258457,536 258458,220816 258460,179170 258461,220816 258462,1983 258463,972 258464,467 258465,179170 258466,920 258467,220816 258468,7092 258470,1188 258471,20 258471,68 258471,134 258471,163 258471,326 258471,397 258471,581 258471,663 258471,673 258471,697 258471,713 258471,841 258471,852 258471,1096 258471,1474 258471,1531 258471,1603 258471,1634 258471,1796 258471,1891 258471,3582 258471,3999 258471,4276 258471,4455 258471,20535 258471,255911 258472,220816 258473,30 258474,142433 258475,220816 258476,256681 258477,707 258478,278 258479,1133 258480,68 258481,138686 258482,949 258483,179170 258484,707 258485,408 258486,102 258487,1323 258488,707 258489,2590 258489,3999 258489,5469 258490,417 258491,2480 258491,2557 258492,179170 258493,220816 258494,563 258495,83 258496,179170 258497,179170 258498,192 258499,217 258500,220816 258501,258502 258503,30 258504,220816 258505,220816 258506,179170 258507,179170 258508,3623 258509,179170 258510,220816 258511,1238 258512,1326 258513,179170 258514,179170 258515,30 258516,217 258517,850 258518,179170 258520,255750 258521,1370 258522,220816 258523,220816 258524,586 258525,255 258526,220816 258528,707 258529,355 258530,596 258531,1001 258532,179170 258533,220816 258534,5961 258535,220816 258536,1113 258537,138686 258538,175 258539,707 258540,55849 258541,8992 258542,1579 258543,179170 258544,4237 258544,182162 258545,220816 258546,707 258547,707 258548,179170 258549,2416 258549,2417 258551,220816 258552,707 258553,422 258554,179170 258555,240174 258556,7 258557,220816 258558,220816 258559,83 258560,1 258561,217 258562,30 258563,147 258564,222 258565,850 258566,5366 258568,220816 258569,179170 258570,179170 258571,3623 258572,220816 258573,1010 258574,795 258575,269 258576,563 258577,258578 258579,220816 258580,220816 258581,1359 258582,920 258583,179170 258584,220816 258585,220816 258586,571 258586,31896 258587,907 258588,255911 258589,20257 258590,1955 258591,920 258592,151 258593,9457 258594,3623 258595,3623 258596,663 258597,1274 258598,422 258599,422 258600,422 258601,422 258602,422 258603,422 258604,422 258605,422 258606,422 258607,422 258608,422 258609,422 258611,717 258612,285 258613,35486 258614,68069 258615,8907 258616,258617 258618,1769 258619,1893 258620,5405 258621,195 258622,4672 258623,843 258624,920 258625,577 258625,859 258626,269 258628,60576 258629,779 258630,2266 258632,30 258633,1531 258634,1531 258635,8993 258636,258637 258638,255980 258638,258906 258639,248 258640,872 258640,1118 258640,1796 258640,3111 258641,240 258642,1462 258642,8537 258643,503 258644,1001 258645,4355 258646,111 258647,1085 258648,137 258649,589 258650,2205 258650,33424 258650,245910 258651,843 258652,240 258653,1227 258653,86416 258654,1818 258656,589 258657,1132 258658,179170 258659,256681 258660,179170 258661,256681 258662,536 258663,872 258664,179170 258665,219 258667,4223 258668,2617 258669,256681 258670,179170 258671,932 258672,704 258673,255750 258674,256681 258675,79 258676,467 258677,805 258678,256681 258679,275 258679,516 258680,261 258681,179170 258682,1707 258683,6059 258684,256681 258685,390 258685,1801 258686,366 258687,366 258688,366 258689,366 258690,366 258691,750 258692,255613 258693,160 258694,179170 258695,6119 258696,137 258697,589 258698,1511 258698,3069 258699,258631 258699,258700 258701,707 258702,2979 258703,179170 258704,56 258705,422 258706,707 258708,179170 258711,1313 258712,179170 258713,179170 258714,179170 258715,707 258716,634 258718,258719 258721,707 258722,5405 258724,217 258724,571 258725,179170 258726,179170 258727,5405 258728,392 258729,707 258730,3582 258731,1860 258732,1858 258733,30 258734,1149 258735,1313 258736,781 258737,1132 258739,1192 258740,640 258741,875 258742,1085 258744,996 258747,1132 258748,781 258749,1955 258751,631 258753,707 258754,179170 258755,147 258756,252 258757,346 258758,872 258759,255982 258760,1707 258761,356 258762,1551 258763,1425 258764,3695 258765,467 258766,4771 258767,1240 258767,4594 258768,2779 258769,179170 258770,142409 258771,22 258772,861 258773,258774 258775,920 258776,1644 258777,149 258779,1119 258780,257244 258781,37414 258782,702 258783,106 258784,206 258785,50 258786,79 258787,707 258788,195 258789,424 258790,424 258792,178 258793,104 258794,2784 258795,707 258796,149 258797,147 258799,424 258800,60576 258802,1707 258803,187176 258804,3094 258805,356 258806,187176 258809,147 258810,200 258811,3623 258812,875 258813,491 258814,149 258814,21442 258815,83 258816,7092 258817,707 258818,3623 258819,781 258820,1132 258821,138686 258822,175 258823,83 258824,158 258825,589 258826,37414 258827,83 258828,202 258829,1368 258830,3623 258831,35486 258832,258833 258834,7360 258835,611 258835,1718 258836,875 258837,707 258838,4597 258839,467 258839,156379 258840,118336 258841,257244 258842,256703 258843,1227 258844,818 258845,640 258846,772 258847,1458 258848,255980 258849,217 258850,634 258851,31122 258852,2775 258853,1052 258854,54 258855,294 258856,707 258857,2411 258858,1284 258860,30 258861,346 258863,83 258864,932 258865,657 258866,328 258867,1052 258868,54 258869,2775 258870,179170 258871,202 258872,299 258873,1285 258873,2590 258874,1801 258875,442 258876,1085 258879,214734 258881,424 258882,1608 258883,1132 258884,1132 258885,1608 258887,41 258887,431 258887,677 258887,784 258887,849 258887,2620 258887,6800 258887,185877 258887,259036 258887,259078 258887,259097 258887,259115 258887,259460 258887,259681 258887,260110 258887,260152 258887,260810 258887,261308 258887,261675 258887,261842 258887,261924 258887,262440 258887,262637 258887,264821 258888,2266 258889,390 258889,459 258889,1326 258889,3756 258890,1345 258891,1801 258892,861 258893,22 258895,1551 258896,309 258896,310 258897,577 258898,1955 258899,1201 258900,3507 258901,97 258902,118336 258903,1007 258904,2083 258905,21442 258907,195 258908,406 258909,1052 258910,54 258911,2775 258912,644 258913,366 258914,107 258915,202 258916,346 258917,73570 258919,6955 258920,1227 258921,1368 258922,668 258924,2744 258925,760 258926,258927 258928,1132 258929,781 258930,1241 258931,255750 258932,872 258933,1132 258934,781 258935,1608 258936,1132 258937,577 258938,1619 258939,240 258939,332 258940,2083 258941,1379 258943,932 258944,160 258945,2116 258946,149 258947,406 258948,1313 258949,107 258950,34 258950,605 258950,33424 258950,245910 258951,302 258952,1284 258952,1298 258953,6506 258954,179170 258955,1860 258956,1858 258957,781 258958,1132 258959,1612 258960,1419 258961,818 258963,2209 258964,2646 258965,818 258966,1608 258967,1132 258968,7124 258969,258970 258971,2989 258971,2991 258972,861 258974,536 258975,256681 258976,663 258977,312 258978,1458 258979,3258 258980,3623 258981,1143 258982,1608 258983,1132 258984,707 258985,136 258986,179170 258987,200 258988,503 258989,184 258990,256681 258991,1801 258992,1707 258993,1381 258994,1133 258995,920 258996,861 258997,22 258998,1749 258999,302 259000,1882 259001,278 259002,893 259003,752 259004,3623 259006,1858 259007,1860 259008,589 259009,515 259010,256681 259011,1888 259012,509 259013,1132 259014,781 259015,1616 259016,256681 259017,707 259018,1381 259019,141263 259021,256681 259023,781 259024,1132 259025,483 259026,256681 259027,1313 259028,577 259029,5405 259030,255750 259031,1127 259032,333 259033,707 259034,179170 259035,1087 259037,200 259038,563 259039,217 259040,179170 259041,8788 259042,305 259043,179170 259044,2073 259045,1707 259046,273 259047,138686 259048,175 259049,1452 259050,1052 259051,83 259051,577 259051,1085 259052,346 259053,2750 259054,422 259055,220816 259056,1381 259058,151 259059,634 259060,155481 259061,918 259063,406 259064,107 259065,220816 259066,302 259067,406 259068,649 259069,1007 259070,292 259071,220816 259072,259073 259074,247 259074,2867 259074,2868 259075,179170 259077,5405 259079,1033 259080,179170 259081,179170 259082,3846 259083,1001 259084,1274 259085,1132 259086,1608 259087,4691 259088,179170 259089,192 259090,13661 259092,1381 259093,179170 259095,393 259096,3623 259097,258887 259098,2224 259099,1285 259100,255613 259101,179170 259102,920 259103,707 259104,247 259105,252 259106,179170 259107,707 259108,83 259109,932 259110,222 259111,1313 259112,256681 259113,255911 259114,278 259115,258887 259116,1010 259117,3623 259118,256703 259119,3623 259120,1715 259121,256681 259122,151 259123,4545 259123,56150 259124,302 259125,106 259126,278 259127,220816 259129,247 259130,4545 259130,56150 259131,220816 259132,255750 259133,287 259134,256681 259135,7092 259136,1644 259137,861 259138,22 259139,563 259140,256681 259141,220816 259142,628 259143,179170 259144,83 259144,278 259144,949 259144,1274 259144,2779 259145,220816 259146,485 259147,220816 259148,207 259149,23783 259150,1556 259151,278 259152,220816 259153,920 259154,220816 259155,1572 259156,142870 259157,356 259158,346 259159,811 259160,3507 259161,278 259162,220816 259163,179170 259164,83 259165,83 259166,841 259167,991 259168,220816 259169,1515 259170,294 259171,79 259173,3623 259174,220816 259175,175 259176,1305 259177,179170 259178,285 259179,220816 259180,272 259181,68509 259182,179170 259183,302 259184,184 259185,2620 259186,259187 259188,1707 259189,1452 259190,1803 259191,107 259192,875 259193,255750 259194,256681 259195,6682 259196,179170 259197,347 259198,256681 259199,304 259200,5265 259201,179170 259202,875 259203,220816 259204,1608 259205,1132 259206,1 259207,256681 259208,1188 259209,220816 259210,861 259211,34 259211,35 259212,932 259213,38634 259214,259215 259217,259218 259219,220816 259220,326 259221,256681 259222,1511 259222,3069 259223,179170 259224,179170 259225,1688 259226,1014 259227,56 259228,422 259229,707 259230,1014 259231,220816 259232,179170 259233,1014 259234,1014 259235,885 259236,1014 259237,875 259238,220816 259239,179170 259240,192 259240,920 259240,1118 259241,30 259242,179170 259243,44 259244,1082 259245,220816 259246,102 259247,1326 259248,1323 259249,408 259250,467 259251,104 259252,55849 259253,1181 259254,147 259255,349 259255,536 259255,2424 259256,220816 259257,5265 259259,259260 259261,179170 259262,187176 259263,220816 259264,35486 259265,179170 259266,707 259267,1238 259268,179170 259269,179170 259270,202 259271,179170 259272,255 259273,15609 259274,220816 259275,179170 259276,54 259277,1634 259278,1452 259279,41 259280,138 259281,25453 259281,258298 259282,2671 259283,3135 259284,138686 259285,175 259286,577 259287,875 259288,19010 259289,259290 259291,255876 259292,256681 259293,124668 259294,83 259295,2373 259297,256681 259298,1749 259299,220816 259300,256681 259301,54 259302,21442 259303,259304 259306,256681 259307,147 259308,433 259309,980 259310,179170 259311,2421 259312,949 259313,23783 259314,8373 259315,671 259315,4193 259316,2371 259316,2991 259317,1515 259318,1776 259319,2266 259319,2991 259320,2371 259321,1893 259321,191860 259322,312 259323,2923 259324,1 259325,179170 259326,220816 259327,920 259328,179170 259329,256681 259330,330 259331,256681 259332,1608 259333,179170 259334,589 259335,493 259336,179170 259337,704 259338,1363 259339,259340 259341,179170 259342,179170 259343,1335 259344,256681 259345,2620 259346,3538 259347,54 259348,151 259349,256681 259350,179170 259351,256681 259352,250 259352,1684 259353,202 259354,285 259355,256681 259356,256681 259357,83 259358,167 259359,285 259360,250 259361,602 259362,29475 259363,424 259364,818 259365,841 259366,900 259367,179170 259368,843 259369,256681 259370,779 259371,269 259372,179170 259373,310 259373,224488 259375,179170 259376,256681 259377,179170 259378,171 259379,179170 259380,179170 259381,1531 259382,1871 259383,259384 259385,259386 259387,285 259388,862 259388,2590 259389,179170 259390,179170 259391,779 259392,259393 259394,2750 259395,2867 259395,2868 259396,54 259397,88820 259398,557 259399,50 259399,79 259400,179170 259401,7698 259402,56 259403,422 259404,433 259405,259406 259405,265181 259407,1631 259408,179170 259409,179170 259410,875 259411,2205 259411,33424 259411,245910 259412,179170 259413,393 259414,1707 259416,188791 259417,258887 259418,366 259419,1 259420,366 259421,1773 259422,1132 259423,781 259424,259425 259427,516 259428,179170 259429,151 259430,256681 259431,104 259434,875 259435,483 259436,1052 259437,54 259438,2775 259439,151 259439,206 259441,179170 259442,1821 259442,21736 259443,2775 259444,1052 259445,54 259446,595 259447,781 259448,1132 259449,1551 259450,781 259451,1052 259452,1132 259453,54 259454,2775 259455,240174 259456,136 259459,149 259461,1452 259462,577 259463,992 259464,5405 259465,22 259466,861 259467,18298 259468,247 259469,996 259470,278 259474,5405 259476,1274 259477,259187 259479,211 259479,304 259479,1181 259479,1844 259479,41396 259479,48119 259479,71770 259479,241749 259479,259479 259479,260286 259480,259481 259482,1188 259483,5405 259484,1014 259485,256681 259486,289 259486,94134 259487,1014 259488,1014 259489,843 259490,1014 259491,22 259492,861 259493,256681 259494,151 259495,1014 259497,55849 259498,1608 259499,1132 259500,256681 259502,920 259504,195 259506,1012 259508,30 259511,2105 259512,1130 259513,505 259515,328 259516,328 259517,55849 259518,76096 259519,2048 259520,179170 259521,134 259521,1639 259522,138686 259523,175 259524,1837 259525,2646 259526,248 259527,179170 259528,227669 259528,258973 259529,309 259529,310 259531,55849 259532,264 259533,179170 259534,1782 259535,207837 259536,146 259536,92476 259537,1147 259538,647 259539,344 259540,1132 259542,1274 259543,1132 259544,5405 259545,186 259545,294 259545,431 259545,634 259545,784 259546,447 259547,2775 259548,3252 259549,3094 259550,251 259550,252 259550,1220 259551,1238 259552,195 259555,634 259556,1608 259557,1132 259558,1452 259559,35486 259562,5405 259563,588 259563,590 259565,3585 259566,2797 259567,179170 259568,142870 259569,31073 259570,195 259571,259572 259573,1821 259573,21736 259574,1188 259575,256681 259576,636 259577,30 259578,1888 259579,873 259580,536 259581,843 259582,30 259583,76096 259584,83 259585,422 259586,422 259587,422 259588,422 259589,422 259590,217 259591,422 259592,269 259593,422 259594,422 259595,422 259596,422 259597,1293 259598,422 259599,422 259600,932 259601,2775 259602,21442 259603,30 259604,195 259605,179170 259606,310 259606,224488 259608,111142 259609,872 259610,278 259611,515 259612,5987 259613,1265 259613,1266 259614,149 259615,179170 259616,302 259617,920 259619,843 259620,779 259622,309 259622,310 259623,1511 259623,3069 259624,1240 259625,179170 259626,1707 259627,5440 259628,589 259628,3370 259629,364 259629,25348 259629,72439 259630,707 259631,1368 259632,30 259633,83 259634,1149 259635,30 259636,6068 259637,1181 259639,34 259639,35 259639,217 259639,536 259641,30 259643,2557 259644,30 259645,1983 259647,302 259648,1454 259649,179170 259651,179170 259652,30 259653,86 259654,283 259655,73570 259656,1688 259657,1390 259658,3297 259659,142409 259661,406 259662,861 259663,222 259663,283 259663,356 259663,455 259663,536 259663,852 259663,1467 259663,1881 259663,2266 259664,179170 259665,1608 259666,1132 259667,4597 259668,179170 259669,707 259670,1370 259670,21736 259671,189788 259672,179170 259673,462 259675,30 259676,240174 259677,75912 259678,1220 259679,252 259680,251 259681,258887 259682,144556 259683,4611 259684,1452 259685,1836 259686,118336 259687,30 259688,1849 259689,5540 259690,179170 259691,30 259692,1724 259693,1132 259694,310 259694,3039 259695,707 259696,179170 259698,515 259699,259700 259701,179170 259702,30 259703,379 259704,30 259705,872 259706,83 259707,256681 259708,557 259710,707 259711,875 259712,256681 259713,179170 259714,195 259715,309 259717,195 259718,707 259721,55849 259723,1010 259724,256600 259725,30 259726,1789 259727,1359 259728,256681 259729,2646 259730,3623 259731,875 259733,7124 259734,283 259735,872 259736,138686 259737,97 259738,175 259739,247 259740,563 259741,30 259742,247 259743,1010 259744,1 259744,147 259744,202 259744,285 259744,622 259744,1559 259744,118336 259745,180470 259746,217 259747,707 259748,1452 259749,1619 259750,256600 259751,1467 259752,455 259753,2424 259754,1556 259755,1871 259756,256600 259757,2421 259758,13980 259759,83 259760,1707 259761,1085 259762,563 259763,389 259764,255 259765,77 259766,151 259767,4260 259768,247 259768,141912 259769,83 259770,1881 259771,92133 259773,1644 259775,23783 259776,2572 259777,885 259778,885 259779,1143 259780,259781 259782,179170 259783,932 259784,2620 259785,704 259786,79 259787,256681 259788,97 259789,55849 259790,256681 259791,217 259793,2646 259794,491 259795,68 259796,2373 259797,257700 259798,259799 259800,4066 259801,563 259802,247 259803,179170 259804,4810 259805,202 259806,83 259807,439 259808,22 259809,861 259811,920 259812,433 259813,5213 259814,8788 259815,192 259816,220816 259817,179170 259818,44 259819,920 259820,2646 259821,1881 259822,1860 259823,1858 259824,220816 259825,4260 259826,602 259827,433 259828,220816 259829,147 259829,175 259829,9394 259829,240174 259829,261886 259830,220816 259831,4545 259831,56150 259832,220816 259833,1572 259834,220816 259835,113156 259836,2646 259837,220816 259838,220816 259839,256681 259840,220816 259841,634 259841,4237 259841,182162 259842,269 259843,32751 259844,179170 259845,113156 259846,690 259847,2590 259848,893 259849,147 259850,220816 259851,483 259852,113156 259853,256681 259854,179170 259855,151 259856,900 259857,259858 259859,220816 259860,256681 259861,138686 259862,175 259863,220816 259864,107 259865,179170 259866,179170 259867,5906 259868,557 259869,626 259870,278 259871,137 259872,30 259873,862 259874,179170 259875,220816 259876,433 259877,15 259878,111142 259879,220816 259880,2617 259881,1 259882,83 259883,1531 259884,79 259885,56 259886,422 259887,220816 259888,256681 259889,248 259890,220816 259891,220816 259892,220816 259893,1556 259894,285 259895,227669 259896,256681 259898,200 259899,3623 259900,2646 259901,220816 259902,250 259905,81 259905,1392 259907,257244 259908,35486 259911,30 259912,1467 259913,3695 259913,9021 259913,35750 259914,1849 259915,919 259916,220816 259917,179170 259918,843 259919,137 259920,1274 259922,7092 259923,2735 259924,2590 259925,179170 259927,220816 259928,644 259929,644 259930,179170 259931,56 259932,422 259933,214734 259934,406 259935,920 259936,56 259937,422 259938,56 259939,422 259940,220816 259941,1531 259942,56 259943,422 259945,1132 259946,781 259947,179170 259948,775 259949,258298 259950,179170 259951,1368 259952,187 259953,1368 259954,19356 259955,907 259956,1227 259957,1227 259958,179170 259959,278 259960,259961 259962,920 259963,875 259964,179170 259965,1849 259966,259967 259968,147 259969,843 259971,1188 259972,843 259973,30 259974,1749 259975,220816 259976,589 259976,3370 259977,372 259977,25348 259978,3872 259979,179170 259980,179170 259981,255 259982,1167 259983,1785 259984,589 259985,1782 259986,1124 259987,973 259988,86 259989,138686 259990,175 259991,843 259992,179170 259993,3161 259995,278 259996,920 259997,1449 259998,557 259999,1359 260001,467 260002,179170 260003,252 260003,925 260003,1220 260003,25453 260003,255750 260004,179170 260005,493 260006,206 260007,179170 260008,704 260009,1452 260010,493 260011,346 260012,220816 260013,4611 260014,220816 260015,1769 260016,73570 260017,222 260018,147 260019,589 260020,843 260021,422 260022,422 260023,422 260024,422 260025,422 260026,1 260027,422 260028,422 260029,422 260030,422 260031,256681 260031,260032 260031,260039 260033,422 260034,422 260035,422 260036,256703 260037,285 260038,60576 260040,2931 260041,30 260042,6119 260044,149 260045,346 260046,179170 260047,920 260048,179170 260049,179170 260050,30 260051,179170 260052,206 260053,285 260054,850 260055,920 260056,179170 260057,671 260058,187 260059,206 260060,304 260061,862 260062,2797 260063,255716 260064,393 260065,179170 260066,1132 260067,138686 260068,175 260069,292 260070,1893 260070,191860 260071,1267 260072,1522 260073,256681 260074,1860 260075,1858 260076,256681 260077,260078 260079,256681 260080,179170 260081,179170 260082,256600 260083,179170 260084,179170 260085,256681 260086,1556 260087,260088 260089,433 260091,366 260092,366 260093,179170 260094,1882 260095,366 260096,60576 260097,1274 260098,256681 260099,433 260100,589 260101,137 260103,179170 260104,1210 260105,2646 260106,260107 260108,256681 260109,779 260110,258887 260111,430 260111,1414 260112,581 260113,459 260114,557 260115,256681 260116,187176 260119,171 260122,875 260123,20 260124,256681 260125,1893 260126,215874 260127,287 260129,256681 260130,640 260131,151 260132,171 260133,1132 260134,1608 260135,283 260135,657 260135,2266 260136,56 260137,422 260138,2590 260139,179170 260140,433 260141,256681 260142,1849 260146,309 260146,310 260147,2506 260149,1118 260150,968 260154,920 260156,726 260157,104 260158,148742 260159,138686 260160,175 260161,1132 260162,781 260163,611 260164,2105 260165,179170 260166,113156 260167,781 260168,1132 260169,312 260170,657 260171,2989 260171,2991 260172,994 260173,58 260174,46 260175,2296 260176,1803 260177,671 260178,366 260179,779 260180,875 260181,60576 260182,1436 260184,258414 260185,19413 260186,30 260187,6424 260188,104 260189,2646 260190,1274 260191,258887 260192,59021 260193,893 260194,1132 260195,179170 260196,595 260197,1860 260198,1858 260199,2590 260200,255613 260201,142405 260201,154408 260202,1210 260203,256681 260204,1309 260205,1238 260206,366 260207,3623 260208,2646 260209,595 260210,1287 260211,7652 260212,10 260212,255980 260213,118336 260214,1452 260215,707 260216,1359 260217,35486 260218,779 260219,37414 260221,37414 260222,1983 260223,83 260224,1033 260225,1149 260226,1983 260227,760 260228,1860 260229,577 260230,147 260230,149 260231,179170 260232,932 260233,779 260235,142433 260236,102 260237,252 260238,620 260239,248556 260240,58 260241,994 260242,46 260243,1452 260244,447 260245,707 260247,195 260248,406 260249,260250 260252,269 260253,4 260253,644 260253,731 260253,743 260253,885 260253,994 260253,1116 260253,1172 260253,1432 260253,1775 260253,3079 260253,4691 260253,4810 260253,4903 260255,107 260256,2775 260257,934 260258,83 260259,217 260260,779 260261,1515 260262,227669 260263,809 260265,707 260266,356 260267,536 260268,192 260269,1151 260270,256187 260271,333 260272,140 260273,200 260274,30 260275,1353 260276,1212 260277,30 260278,179170 260279,227669 260280,1983 260287,3653 260288,1052 260289,2292 260290,6506 260292,515 260293,179170 260294,1368 260295,195 260296,577 260297,714 260298,1564 260299,1511 260299,3069 260300,2205 260300,33424 260300,245910 260301,1522 260302,1849 260303,1010 260304,1241 260305,1479 260306,932 260307,1927 260308,1122 260309,1715 260310,1955 260311,2424 260312,256681 260313,1983 260314,1132 260315,781 260316,179170 260317,1052 260318,54 260319,868 260320,227669 260321,2784 260322,179170 260323,1432 260324,30 260326,217 260327,1618 260328,179170 260329,30 260331,2168 260332,30 260333,79 260334,289 260334,94134 260335,389 260338,31122 260339,1087 260340,2782 260341,849 260342,631 260343,760 260344,162599 260345,1452 260346,1326 260347,1452 260348,388 260349,422 260350,56 260351,485 260352,217 260353,736 260354,179170 260355,138686 260356,175 260357,332 260358,707 260359,2646 260360,3623 260362,83 260364,1805 260365,202 260366,657 260367,278 260367,248556 260371,135844 260372,34 260372,35 260372,37 260372,44 260372,50 260372,58 260372,59 260372,79 260372,104 260372,106 260372,111 260372,135 260372,147 260372,178 260372,195 260372,202 260372,264 260372,278 260372,289 260372,333 260372,337 260372,372 260372,393 260372,479 260372,516 260372,577 260372,585 260372,588 260372,590 260372,592 260372,620 260372,622 260372,640 260372,720 260372,779 260372,877 260372,907 260372,949 260372,1007 260372,1033 260372,1085 260372,1151 260372,1210 260372,1212 260372,1247 260372,1265 260372,1266 260372,1284 260372,1370 260372,1381 260372,1453 260372,1454 260372,1509 260372,1515 260372,1522 260372,1531 260372,1634 260372,1659 260372,1732 260372,1776 260372,1893 260372,2051 260372,2073 260372,2087 260372,2191 260372,2371 260372,2782 260372,2931 260372,3194 260372,3422 260372,3695 260372,4079 260372,4192 260372,4193 260372,5265 260372,5310 260372,5440 260372,8180 260372,8270 260372,8308 260372,8598 260372,8788 260372,8811 260372,8822 260372,8907 260372,9542 260372,31237 260372,94134 260372,164572 260372,240174 260373,346 260373,1644 260374,920 260375,192 260376,920 260377,302 260378,87 260379,252 260380,256187 260381,255 260382,179170 260383,1001 260384,571 260386,491 260387,83 260388,589 260389,1133 260390,179170 260391,3135 260392,83 260394,3538 260395,1381 260396,1479 260397,358 260398,255613 260399,151 260400,1556 260401,259187 260402,1849 260403,83 260404,1010 260405,1085 260406,390 260407,2424 260408,360 260409,577 260410,2991 260411,1572 260411,256187 260412,843 260413,202 260414,862 260415,440 260416,483 260417,920 260418,1454 260419,932 260421,1085 260422,1707 260423,1888 260424,3182 260425,430 260426,392 260427,3246 260429,704 260430,79 260431,467 260432,302 260433,1294 260434,247 260435,104 260435,1332 260436,135 260437,220816 260438,875 260439,1133 260440,3769 260441,4594 260442,220816 260443,260444 260445,260444 260446,195 260447,536 260448,2735 260449,1453 260450,256765 260451,30 260452,143287 260453,968 260454,247 260455,142870 260457,1551 260458,4597 260459,179170 260460,6424 260461,861 260462,240 260463,217 260464,1715 260465,346 260466,301 260467,1769 260468,707 260469,163 260469,932 260470,707 260471,195 260471,306 260471,307 260471,406 260471,779 260471,1181 260471,1515 260471,4193 260473,403 260474,435 260475,278 260476,3467 260477,1796 260478,1849 260479,7092 260480,217 260481,220816 260482,260483 260484,779 260485,1619 260486,1608 260487,179170 260488,843 260489,220816 260490,302 260491,1414 260492,918 260493,113156 260494,843 260495,1326 260496,631 260497,2244 260498,278 260499,220816 260500,1608 260501,1132 260502,179170 260503,3003 260504,1298 260504,1749 260505,885 260506,31977 260507,220816 260508,1033 260509,258973 260510,247 260511,477 260512,220816 260513,1556 260514,256681 260515,30 260516,256681 260517,2646 260518,2373 260519,220816 260520,10 260521,83 260522,861 260523,330 260524,256681 260525,752 260526,155481 260527,220816 260528,2646 260529,65 260530,256681 260531,671 260532,179170 260533,220816 260534,2646 260535,179170 260536,1319 260537,1149 260538,220816 260539,841 260540,275 260541,557 260542,862 260543,256681 260544,220816 260545,179170 260546,1821 260546,21736 260547,141912 260548,179170 260549,179170 260551,220816 260552,714 260554,220816 260555,179170 260556,628 260556,3260 260557,200 260559,707 260560,7416 260561,557 260562,4411 260563,697 260564,138686 260565,175 260566,179170 260567,406 260568,256681 260569,107 260570,779 260571,2379 260572,255 260573,707 260574,1227 260575,258298 260576,256681 260577,255750 260578,1415 260579,256681 260580,255750 260581,779 260582,707 260583,1359 260584,2646 260585,179170 260586,83 260586,278 260586,577 260587,30 260588,154408 260589,536 260590,260591 260592,179170 260593,147 260594,2646 260597,2646 260598,1871 260599,260600 260601,179170 260602,872 260603,278 260604,483 260605,2646 260606,577 260607,138686 260608,175 260609,179170 260610,592 260611,6556 260612,179170 260613,1544 260614,2572 260615,640 260616,252 260617,302 260618,2646 260619,1871 260620,217 260621,147 260621,158 260621,1515 260621,2244 260622,179170 260623,179170 260624,30 260625,179170 260626,1871 260627,179170 260628,920 260629,179170 260630,1181 260631,2750 260632,179170 260633,256681 260634,240 260635,285 260636,2006 260637,54 260638,260639 260640,99367 260641,422 260642,422 260643,256681 260644,113156 260645,422 260646,422 260647,179170 260648,179170 260649,422 260650,422 260651,422 260652,422 260653,422 260654,260655 260656,592 260657,795 260658,179170 260659,179170 260660,171 260661,250 260662,953 260663,285 260664,577 260665,179170 260666,255911 260667,56 260668,422 260669,267 260670,285 260671,2116 260672,134 260673,310 260673,224488 260674,14366 260675,171 260676,256681 260677,179170 260678,424 260679,2105 260680,179170 260681,179170 260682,932 260683,179170 260685,179170 260686,516 260687,256681 260688,99 260689,260690 260691,256681 260692,256681 260693,862 260695,256681 260696,23011 260697,256681 260698,260699 260700,99 260701,422 260702,256681 260703,255 260705,2244 260706,179170 260707,640 260708,30 260709,2590 260710,248 260711,1474 260711,2590 260712,704 260714,179170 260715,493 260716,30 260717,457 260718,15573 260719,5375 260720,7363 260721,30 260722,179170 260723,697 260723,1893 260724,972 260726,252 260728,1167 260729,433 260730,1849 260731,707 260732,693 260733,15 260734,366 260735,366 260736,366 260737,366 260738,366 260739,366 260740,707 260742,9457 260743,179170 260744,668 260745,1151 260746,55849 260747,707 260748,872 260749,136 260751,1247 260751,164572 260752,1425 260753,1247 260753,164572 260754,743 260755,55849 260756,4672 260757,337 260758,130 260759,640 260760,640 260761,996 260762,693 260763,104 260763,136 260763,420 260763,442 260763,1179 260764,58 260765,994 260766,46 260767,1116 260768,247 260769,5591 260770,415 260771,1715 260773,467 260775,260591 260776,179170 260777,1659 260778,707 260779,693 260780,179170 260781,2671 260782,292 260784,56 260785,422 260787,932 260789,346 260790,1227 260791,179170 260792,179170 260793,55849 260794,920 260795,179170 260796,1927 260797,493 260798,422 260799,56 260800,3367 260801,195 260803,30 260804,77 260804,5440 260805,707 260806,162599 260807,21442 260808,138686 260809,175 260811,162599 260812,171 260813,872 260814,256681 260815,1782 260816,1429 260817,2646 260818,3623 260819,333 260820,30 260821,1983 260822,707 260823,1608 260824,3623 260825,2646 260826,1238 260827,1400 260828,1452 260830,73570 260831,256681 260832,79 260834,1085 260835,35486 260836,433 260837,3474 260838,158 260839,1893 260839,191860 260840,256681 260841,2646 260842,50 260842,79 260842,147 260842,158 260843,1043 260843,1424 260843,3367 260844,179170 260845,827 260846,83 260847,83 260848,179170 260849,1143 260850,687 260852,467 260853,163 260854,1663 260858,217 260859,2646 260860,163 260861,2421 260862,163 260863,2646 260864,255750 260865,1381 260866,240174 260867,861 260868,22 260869,932 260870,4597 260871,3538 260872,256681 260874,1293 260875,344 260876,285 260877,7092 260878,862 260879,302 260879,2979 260879,3422 260880,589 260881,179170 260882,596 260883,179170 260885,256681 260887,163 260888,1644 260889,736 260891,151 260892,259 260894,693 260894,932 260894,1089 260895,217 260895,872 260895,1118 260895,1796 260896,151 260897,1132 260898,1608 260899,707 260901,596 260902,1515 260903,130 260904,518 260905,2116 260906,104 260907,204093 260909,1634 260910,256681 260911,843 260912,227669 260913,2646 260914,2646 260915,3623 260916,852 260917,200 260918,259393 260919,258973 260920,209 260921,920 260922,920 260923,920 260924,179170 260926,301 260927,119 260928,151 260929,73570 260930,515 260931,179170 260932,252 260933,251 260934,968 260935,1220 260936,516 260937,252 260938,73570 260939,192 260940,149 260941,179170 260942,1167 260943,6695 260944,179170 260945,189788 260946,179170 260947,467 260948,255750 260949,73570 260950,5405 260951,158 260951,779 260951,2244 260953,707 260954,191860 260955,179170 260956,215 260957,868 260958,138686 260959,175 260960,2646 260961,3623 260962,4545 260962,56150 260963,1882 260964,217 260964,1019 260965,287 260965,809 260965,19010 260966,4355 260967,779 260968,390 260969,179170 260970,195 260971,179170 260972,58 260973,46 260974,994 260975,179170 260976,2244 260977,406 260977,118336 260978,179170 260979,302 260980,1210 260981,1749 260982,255750 260984,1782 260985,202 260986,163 260987,338 260988,158 260990,99 260991,557 260992,179170 260993,1012 260994,34 260994,35 260994,313 260994,1590 260994,1644 260994,2274 260995,590 260995,1419 260996,5405 260997,83 260998,179170 260999,34 260999,35 260999,536 260999,623 260999,1467 260999,1590 260999,1608 260999,1644 260999,4637 261000,338 261001,447 261002,3422 261003,852 261004,113156 261005,861 261006,736 261007,1608 261008,1132 261009,2105 261010,1644 261011,104 261012,179170 261013,206 261014,79 261015,202 261016,220816 261017,258578 261018,261019 261020,220816 261021,179170 261022,151 261023,179170 261024,652 261025,220816 261026,258973 261027,220816 261028,50 261029,155473 261030,9015 261031,138686 261032,175 261033,248 261034,163 261035,240174 261036,220816 261037,920 261038,338 261039,179170 261040,240174 261041,179170 261042,1511 261042,3069 261043,1033 261044,264 261045,179170 261046,220816 261047,1531 261048,77 261049,704 261050,220816 261051,79 261052,179170 261053,179170 261054,1474 261055,179170 261056,220816 261057,388 261058,255750 261059,179170 261060,707 261061,179170 261062,220816 261063,14366 261063,14989 261064,255 261065,41 261065,1462 261066,255613 261067,1860 261068,1858 261069,872 261070,220816 261071,255 261072,179170 261073,920 261074,147 261074,158 261075,13980 261076,83 261078,301 261080,256681 261081,1085 261082,307 261082,620 261082,1181 261083,261084 261085,256681 261086,338 261087,2006 261088,885 261088,13704 261089,809 261090,254 261091,7092 261092,83 261093,179170 261094,136 261095,217 261096,366 261097,1085 261098,30 261098,333 261098,1181 261100,256681 261101,220816 261102,2646 261103,3623 261104,330 261105,179170 261106,179170 261107,206 261108,278 261109,220816 261110,1707 261111,179170 261112,2373 261113,256681 261114,8373 261115,207 261116,220816 261117,258298 261118,179170 261119,220816 261120,179170 261121,261122 261123,220816 261124,358 261125,179170 261126,333 261126,1893 261127,491 261128,366 261129,422 261129,5405 261130,5405 261131,707 261132,1289 261133,843 261134,261135 261136,179170 261137,707 261138,366 261139,366 261140,366 261141,1773 261142,138 261143,865 261144,557 261145,137 261146,1564 261147,557 261148,220816 261149,179170 261150,179170 261151,433 261151,697 261151,1363 261151,2699 261151,3003 261152,332 261153,130 261154,179170 261155,491 261156,151 261157,179170 261158,179170 261159,55849 261160,1 261161,35486 261164,179170 261165,104 261165,136 261165,557 261165,1368 261166,179170 261167,525 261168,2646 261169,3623 261170,1309 261171,136 261172,1285 261173,631 261174,285 261175,107 261175,4771 261176,294 261177,147 261178,138686 261179,175 261180,483 261181,577 261182,32 261182,77 261182,202 261182,261 261182,313 261182,323 261182,358 261182,392 261182,406 261182,455 261182,509 261182,536 261182,623 261182,859 261182,862 261182,873 261182,874 261182,919 261182,949 261182,1001 261182,1201 261182,1240 261182,1465 261182,1467 261182,1572 261182,1635 261182,1644 261182,1722 261182,2045 261182,2671 261182,2931 261182,2989 261182,2991 261182,3135 261182,3252 261182,4549 261182,4594 261182,6955 261182,7092 261182,8180 261182,13546 261182,14126 261183,179170 261184,707 261185,707 261186,179170 261187,220816 261188,827 261189,30 261190,220816 261191,60576 261192,60576 261193,60576 261194,2989 261194,2991 261195,179170 261196,5908 261197,179170 261198,920 261199,220816 261200,267 261201,4597 261202,1379 261203,179170 261204,2620 261205,179170 261206,179170 261207,563 261208,1359 261209,261210 261211,142405 261212,285 261214,104 261215,30 261216,285 261217,250 261218,195 261219,261220 261221,269 261222,366 261223,366 261224,366 261225,225 261226,137 261227,3724 261228,1151 261229,4079 261230,862 261231,8884 261232,1085 261233,151 261234,121967 261235,1227 261236,261237 261238,179170 261239,179170 261240,256681 261241,9386 261242,346 261243,577 261244,179170 261245,179170 261246,179170 261247,250 261248,1181 261249,256681 261250,179170 261251,261252 261253,160 261255,179170 261256,179170 261257,1796 261258,179170 261259,1522 261260,1882 261261,56 261262,422 261263,313 261264,596 261265,4355 261266,256681 261267,195 261268,323 261269,1515 261270,261271 261272,260591 261273,261274 261275,261274 261276,261274 261277,261274 261278,261274 261279,261274 261280,261274 261281,422 261282,422 261283,422 261284,422 261285,422 261286,422 261287,261274 261288,261274 261289,261274 261290,261274 261291,346 261292,35486 261293,4597 261294,9343 261296,8373 261297,932 261298,697 261299,1014 261300,5708 261301,1014 261302,1014 261303,1014 261304,269 261305,255716 261306,212914 261307,211 261308,258887 261309,83 261310,333 261311,179170 261312,1014 261313,179170 261314,538 261315,1014 261316,1014 261318,179170 261319,179170 261320,151 261321,211 261322,491 261323,261324 261325,255716 261326,1132 261327,781 261328,447 261329,1033 261330,483 261331,1 261332,707 261333,596 261334,81 261334,704 261335,620 261336,850 261337,406 261338,179170 261339,707 261340,1515 261341,779 261342,1381 261343,1381 261344,333 261345,932 261346,1522 261347,179170 261348,129085 261349,261350 261351,1151 261353,1893 261354,2048 261355,949 261356,1608 261357,827 261359,1707 261360,30 261361,220816 261362,4545 261362,56150 261363,220816 261364,220816 261365,2646 261366,3623 261367,220816 261368,220816 261369,179170 261370,138686 261371,175 261372,2646 261373,3623 261374,156379 261375,179170 261376,743 261377,179170 261378,179170 261379,179170 261380,192 261381,179170 261382,1479 261383,179170 261384,390 261389,142870 261391,55849 261392,261393 261395,19413 261396,1882 261397,302 261398,240174 261399,124668 261400,779 261401,3623 261402,1458 261403,136 261403,1265 261403,1266 261403,1381 261403,1635 261403,1659 261403,2867 261403,2868 261403,4545 261403,56150 261404,72 261405,179170 261406,179170 261407,179170 261408,179170 261409,179170 261411,875 261412,56 261413,422 261416,179170 261417,179170 261418,592 261419,255750 261420,994 261421,1181 261423,179170 261424,58 261425,179170 261426,307 261426,602 261426,94134 261427,7652 261428,6888 261429,1087 261430,818 261431,255750 261432,493 261433,107 261434,2416 261434,2417 261435,292 261436,338 261437,298 261438,1133 261439,3538 261440,179170 261441,10 261442,392 261443,135 261445,151 261446,366 261447,366 261449,1058 261450,261451 261452,179170 261453,1454 261454,189788 261455,577 261456,175 261457,1181 261458,56 261459,422 261460,261461 261462,3623 261463,30 261464,35486 261465,30 261466,1623 261467,63 261468,261469 261470,30 261471,151 261472,5405 261473,932 261474,55849 261475,6661 261476,147 261476,195 261477,119 261478,138686 261479,175 261480,227669 261481,273 261483,236180 261485,1707 261487,79 261488,1 261489,154408 261491,264 261492,2668 261493,255750 261494,261495 261496,1019 261497,932 261498,278 261498,213089 261499,44 261500,1293 261501,3148 261502,154408 261503,1326 261504,56 261505,422 261506,191860 261507,893 261508,138686 261509,175 261510,56 261511,422 261512,15748 261513,344 261514,285 261515,242246 261516,972 261518,102 261519,1326 261520,1323 261521,408 261523,179170 261524,163 261525,124668 261526,261527 261528,179170 261529,1247 261529,164572 261530,179170 261531,179170 261533,179170 261535,179170 261536,183456 261537,179170 261538,179170 261539,124668 261540,1181 261541,1096 261542,261543 261544,285 261545,344 261546,344 261547,285 261548,178 261549,30 261550,2590 261551,422 261552,422 261553,422 261554,422 261555,2646 261556,3623 261557,422 261558,179170 261559,8270 261560,15119 261561,718 261562,422 261563,422 261564,422 261565,422 261566,422 261567,718 261568,557 261569,557 261570,179170 261571,557 261573,261574 261575,179170 261576,227669 261577,261578 261579,261580 261581,206 261582,255750 261584,255 261585,261586 261587,2379 261588,1007 261589,213089 261590,158 261591,338 261592,422 261593,56 261594,222 261594,760 261595,30 261596,2646 261597,3623 261598,261599 261600,358 261601,640 261602,261603 261604,4691 261605,179170 261606,179170 261607,483 261608,1033 261609,620 261610,406 261611,113156 261612,356 261613,2889 261614,843 261615,30 261616,779 261617,1515 261618,1381 261619,509 261620,2379 261621,333 261622,142870 261623,557 261624,179170 261625,240174 261626,285 261627,179170 261628,99 261629,240174 261630,179170 261631,179170 261632,119 261633,7155 261634,179170 261635,179170 261636,3999 261637,7358 261637,7363 261638,151 261639,292 261640,788 261641,1181 261642,294 261643,296 261644,298 261645,142473 261646,1749 261647,640 261648,41 261649,1551 261650,99 261651,147 261652,147 261653,147 261654,663 261655,704 261656,493 261657,79 261658,592 261659,585 261660,592 261661,50 261662,393 261663,406 261664,586 261665,1381 261666,151 261667,200543 261668,1544 261669,3585 261670,179170 261671,6068 261672,261673 261674,1631 261675,258887 261676,256703 261677,473 261679,278 261680,30 261681,83 261682,784 261683,1522 261685,406 261686,258887 261688,1381 261690,1509 261691,129534 261692,346 261695,693 261696,577 261697,215 261698,35486 261699,179170 261700,138686 261701,175 261702,118336 261703,30 261704,4548 261705,178 261705,346 261706,3623 261707,2646 261709,313 261710,79 261711,1001 261712,255980 261713,1836 261714,191860 261715,261716 261717,50 261718,120 261719,202 261720,515 261722,278 261722,805 261723,1381 261725,2646 261726,3623 261727,671 261728,602 261729,32 261729,76096 261730,1381 261732,255750 261733,1204 261733,194645 261735,30 261736,56 261737,422 261739,258061 261740,392 261741,406 261742,9457 261743,920 261744,682 261744,72439 261746,2646 261747,3623 261749,21442 261751,422 261752,1368 261755,1400 261757,1326 261758,640 261759,640 261760,640 261762,192 261763,1151 261764,278 261764,5326 261765,171 261766,179170 261767,503 261768,336 261769,1238 261770,83 261771,30 261772,818 261773,640 261774,205627 261775,156379 261776,640 261777,1326 261778,1452 261779,79 261780,433 261781,2646 261782,3623 261783,160 261783,712 261784,682 261784,72439 261785,2699 261785,3653 261786,5908 261787,217 261788,1085 261789,2646 261790,2480 261791,406 261791,1425 261792,3422 261793,1556 261794,35486 261796,1181 261797,994 261798,261799 261802,179170 261804,200 261805,179170 261806,1949 261807,3260 261808,242246 261809,171 261810,79 261811,932 261812,920 261813,779 261814,79 261815,269 261816,852 261817,83 261818,389 261820,1564 261821,212692 261823,179170 261825,120 261826,1033 261827,843 261828,179170 261829,179170 261831,120 261832,283 261834,1429 261835,211 261836,187 261836,536 261836,1618 261836,2224 261836,6298 261836,13137 261836,19443 261837,256681 261838,4276 261840,1715 261841,620 261843,1631 261844,852 261845,406 261846,256681 261847,366 261847,483 261847,509 261847,1118 261847,1345 261848,179170 261850,32 261852,489 261853,795 261855,3623 261856,2646 261857,151 261858,2424 261859,48 261860,272 261862,1515 261863,779 261865,278 261865,248556 261866,333 261867,671 261868,431 261869,433 261870,259 261870,676 261871,2373 261873,147 261874,44 261875,433 261876,333 261877,1707 261878,406 261879,5265 261880,184 261881,795 261882,55849 261884,99 261885,2434 261887,920 261888,5405 261890,6695 261892,907 261893,4146 261895,634 261898,338 261899,893 261901,5405 261902,138 261903,136 261904,73570 261906,868 261907,144962 261908,2617 261909,3 261911,5405 261912,7416 261913,1293 261914,55849 261915,811 261916,577 261917,328 261918,247 261919,10 261920,6661 261921,622 261923,106 261924,258887 261925,808 261925,1732 261925,2699 261926,179170 261927,1 261928,5405 261929,483 261930,138686 261931,175 261932,1579 261933,264 261934,338 261935,1893 261936,1326 261937,1860 261938,1858 261939,647 261940,146 261940,92476 261941,344 261942,592 261943,1707 261944,1860 261945,1858 261946,179170 261947,83 261948,206 261949,179170 261950,179170 261951,30 261952,433 261953,1243 261954,861 261955,515 261956,179170 261957,1016 261959,657 261960,227669 261961,41 261963,875 261964,10 261965,56 261967,3258 261968,56 261969,422 261970,149 261971,261972 261973,1466 261974,158 261977,932 261978,577 261979,179170 261980,179170 261981,285 261982,179170 261983,251 261984,5405 261985,5405 261986,30 261988,588 261988,590 261989,1 261990,222 261991,179170 261992,188791 261993,1224 261994,151 261996,1 261997,179170 261998,179170 262000,179170 262001,875 262002,602 262003,255980 262004,640 262005,5405 262006,220816 262007,862 262008,3623 262009,2646 262011,220816 262012,704 262013,79 262014,278 262015,264 262016,220816 262017,1515 262018,220816 262020,1160 262021,179170 262022,220816 262023,2373 262024,1556 262025,220816 262026,2590 262027,220816 262028,781 262029,1132 262030,220816 262031,536 262032,30 262033,220816 262034,179170 262035,179170 262036,220816 262037,247 262038,179170 262039,1220 262040,455 262041,30 262042,592 262043,818 262044,220816 262045,2646 262046,3623 262047,217 262048,875 262049,118336 262051,187960 262052,220816 262053,2083 262054,1858 262055,1860 262056,450 262057,56 262058,422 262059,179170 262060,1677 262061,179170 262062,220816 262063,179170 262064,179170 262065,179170 262066,1556 262067,29380 262068,255750 262069,859 262070,179170 262071,179170 262072,220816 262073,220816 262074,920 262075,262076 262077,179170 262078,1177 262079,7092 262080,994 262081,920 262082,247 262083,717 262084,3695 262085,220816 262086,179170 262087,179170 262088,994 262090,818 262091,278 262092,179170 262093,220816 262094,980 262095,467 262096,71 262097,179170 262098,187 262099,220816 262100,1326 262101,1323 262102,102 262103,408 262104,262105 262106,83 262107,1274 262108,220816 262109,179170 262110,149 262111,240174 262112,257244 262113,21442 262114,179170 262115,704 262116,179170 262117,179170 262118,493 262119,704 262120,875 262121,862 262122,433 262123,493 262124,79 262125,585 262126,592 262127,393 262128,50 262129,586 262130,406 262131,1014 262132,1014 262133,1014 262134,1849 262136,179170 262137,3582 262138,179170 262139,1449 262140,30 262141,220816 262142,516 262143,179170 262144,220816 262145,994 262146,422 262147,1400 262147,4805 262148,220816 262149,1305 262150,179170 262151,875 262152,30 262153,422 262154,56 262155,18726 262156,707 262157,1608 262158,1132 262159,5405 262160,220816 262161,30 262162,30 262164,255 262165,30 262166,262167 262168,707 262169,1181 262170,83 262172,1849 262173,217 262174,1836 262175,147 262176,211 262177,220816 262178,15068 262179,220816 262180,1531 262181,781 262182,1132 262183,30 262184,5405 262185,30 262186,72 262187,220816 262190,2620 262191,220816 262192,920 262193,220816 262194,147 262195,30 262196,1052 262197,278 262198,1773 262199,60576 262200,113156 262201,6059 262202,467 262204,56 262205,422 262206,138686 262207,175 262208,390 262209,1893 262211,250 262212,285 262213,179170 262214,255911 262214,256540 262215,179170 262216,179170 262218,843 262220,71 262221,56 262222,422 262223,1140 262224,3474 262225,49057 262226,2051 262227,1579 262228,292 262229,1849 262230,95554 262231,340 262232,516 262233,55849 262234,360 262235,920 262236,3804 262237,920 262238,1556 262239,406 262240,4220 262241,262242 262243,2266 262244,841 262245,668 262246,2367 262248,30 262249,106 262250,200 262251,68 262251,2590 262252,179170 262253,493 262254,262255 262256,4101 262257,424 262258,147 262259,991 262260,1 262261,455 262262,1181 262263,30 262264,151 262265,179170 262266,261750 262268,392 262269,179170 262270,262271 262272,285 262273,262274 262275,179170 262276,346 262277,35486 262278,262279 262278,262962 262280,841 262281,167 262281,299 262281,1319 262281,1544 262281,6712 262281,14615 262281,170984 262281,229230 262282,2073 262283,4192 262284,4193 262285,179170 262286,2735 262287,179170 262288,704 262289,79 262290,179170 262291,179170 262292,1294 262293,255980 262294,179170 262295,179170 262296,422 262297,179170 262298,2436 262299,818 262300,138686 262301,175 262302,257244 262303,192 262303,333 262304,256681 262306,1453 262308,640 262309,256681 262310,358 262311,79 262313,73570 262314,433 262315,256681 262316,366 262317,366 262318,366 262319,433 262320,433 262321,118336 262323,397 262326,1252 262327,433 262329,1381 262330,393 262331,2292 262332,3003 262333,1544 262334,225 262335,79 262336,262337 262340,1801 262341,20 262343,256681 262344,2116 262347,1085 262348,1130 262350,1143 262352,2073 262353,5405 262354,256681 262355,356 262357,202 262358,640 262359,640 262360,2671 262361,640 262362,147 262363,640 262364,640 262365,135 262366,431 262370,1707 262372,3 262374,920 262376,843 262377,206 262378,571 262379,1551 262380,79 262381,1949 262382,206 262383,1659 262385,1400 262386,206 262387,356 262388,3623 262389,2646 262390,138686 262391,175 262392,1531 262394,422 262395,422 262396,422 262397,493 262398,1149 262400,422 262401,422 262402,784 262403,422 262404,422 262405,422 262406,1849 262407,422 262408,356 262409,422 262410,253147 262410,256187 262411,422 262413,227669 262414,149 262415,634 262416,158 262417,850 262418,206 262419,6661 262421,5405 262422,1188 262423,179170 262424,920 262425,717 262426,287 262427,344 262428,252 262429,1220 262430,516 262431,1181 262432,356 262433,1033 262434,704 262435,843 262436,5405 262437,455 262439,162599 262441,1132 262442,1608 262443,3653 262444,1608 262445,1132 262446,4039 262447,106 262448,1635 262449,2646 262450,1 262450,1888 262452,589 262453,893 262454,893 262456,1326 262458,1927 262459,1220 262460,252 262461,516 262462,217 262463,1274 262464,1644 262465,171 262466,1130 262467,55849 262468,272 262469,35486 262470,1659 262471,972 262472,200 262473,30 262474,309 262474,310 262475,149 262476,5405 262477,34 262477,35 262479,3260 262480,2646 262481,73570 262482,417 262483,255750 262484,346 262486,217 262488,1298 262489,60576 262490,256681 262491,202 262492,592 262493,1300 262494,592 262495,467 262496,1130 262497,1181 262498,862 262499,505 262500,83 262501,433 262502,1133 262504,657 262505,21442 262506,433 262508,920 262509,204124 262510,217 262511,147 262511,3895 262511,9166 262512,932 262514,256681 262515,1566 262516,179170 262517,1231 262518,1181 262519,179170 262520,55849 262522,1381 262523,257700 262524,83 262525,861 262526,22 262527,142451 262528,302 262529,147 262530,179170 262532,179170 262533,358 262534,1619 262535,262536 262537,1345 262538,1858 262539,1860 262540,720 262541,262542 262543,262544 262545,949 262546,179170 262547,240174 262548,4172 262549,179170 262550,179170 262552,779 262553,775 262554,137 262555,589 262556,30 262558,493 262559,56 262560,422 262562,1368 262563,32751 262564,1801 262565,272 262566,422 262567,422 262568,56 262569,34 262569,35 262570,1119 262571,1033 262572,518 262573,349 262575,267 262579,79 262579,192 262579,1181 262581,1326 262582,179170 262583,503 262584,1467 262585,262586 262587,647 262588,81070 262589,515 262590,262591 262592,424 262593,509 262594,809 262595,525 262596,1127 262597,718 262598,1265 262598,1266 262599,996 262600,179170 262601,718 262602,138686 262603,175 262604,622 262605,818 262606,179170 262607,424 262608,5405 262609,333 262611,1559 262613,1515 262614,134 262615,3999 262616,115 262617,1238 262618,7155 262619,2266 262620,7270 262621,7124 262622,344 262623,626 262624,9010 262625,1844 262626,1644 262627,515 262628,146 262628,92476 262629,647 262630,344 262631,272 262632,179170 262633,1381 262634,644 262636,135 262637,258887 262638,586 262640,1381 262641,406 262642,1415 262643,5405 262644,1381 262646,1240 262647,256681 262648,148742 262649,30 262650,187 262651,207 262652,195 262652,5874 262652,6119 262652,16767 262653,92476 262654,344 262655,647 262656,179170 262658,980 262659,158 262660,1452 262661,3623 262662,2646 262663,179170 262664,225 262664,248 262664,1179 262664,1332 262664,5405 262665,577 262666,1556 262667,247 262668,2931 262670,83 262671,775 262672,875 262673,151 262674,1085 262675,1085 262676,818 262677,5405 262678,1381 262679,155481 262680,1070 262681,818 262682,330 262683,179170 262684,179170 262685,2048 262687,179170 262688,255 262689,55849 262690,1836 262691,1210 262691,1231 262692,179170 262693,179170 262694,56 262695,422 262696,1644 262697,920 262698,179170 262699,1033 262700,179170 262701,257244 262702,795 262703,179170 262704,111 262705,302 262706,156379 262707,1085 262709,220816 262710,563 262711,269 262712,5405 262713,932 262714,406 262715,406 262716,704 262717,1265 262717,1266 262718,718 262719,718 262720,1265 262720,1266 262721,7652 262722,195 262722,452 262723,1231 262724,179170 262725,220816 262726,592 262727,1181 262728,158 262729,356 262730,220816 262731,179170 262732,179170 262733,83 262734,220816 262735,200 262736,1612 262737,167 262738,220816 262739,179170 262740,179170 262741,8373 262742,1118 262743,30 262744,179170 262745,179170 262746,220816 262747,111 262748,1821 262748,21736 262750,247 262751,1449 262752,262753 262754,247 262755,2646 262756,3623 262757,1001 262758,179170 262759,220816 262760,220816 262761,269 262762,18790 262763,30 262764,146 262764,92476 262765,647 262766,344 262767,626 262768,1453 262768,3258 262769,444 262770,146 262770,92476 262771,344 262772,647 262773,220816 262774,226825 262775,30 262776,861 262777,220816 262778,220816 262779,920 262780,1058 262781,220816 262782,87 262782,536 262782,1274 262782,1454 262783,34 262783,35 262784,256206 262785,2923 262786,278 262787,875 262788,306 262788,307 262789,1707 262790,83 262791,920 262792,1877 262794,2775 262795,447 262796,7092 262797,5405 262798,220816 262799,920 262800,142870 262801,2146 262802,302 262803,30 262804,875 262805,1179 262806,278 262807,220816 262808,262809 262810,818 262811,285 262812,1238 262813,179170 262814,220816 262815,333 262816,503 262817,179170 262818,493 262819,179170 262820,1452 262821,30 262822,330 262824,795 262825,2620 262826,500 262827,875 262828,179170 262829,7652 262830,875 262831,179170 262832,4101 262833,179170 262834,151 262835,179170 262836,1052 262837,2590 262838,589 262839,179170 262840,179170 262841,1010 262842,406 262843,179170 262844,3960 262845,220816 262846,907 262847,2995 262848,1414 262849,589 262850,6068 262851,220816 262852,861 262853,200 262854,2373 262855,220816 262856,255980 262856,256146 262857,9121 262858,5405 262859,220816 262860,119 262860,19519 262861,179170 262862,179170 262863,138686 262864,175 262865,179170 262866,179170 262867,30 262868,179170 262869,707 262870,179170 262871,211 262872,5440 262873,30 262874,557 262875,1102 262876,269 262877,147 262878,179170 262879,390 262880,179170 262881,179170 262882,147 262883,1893 262884,1556 262885,920 262886,179170 262887,3872 262888,179170 262889,707 262890,179170 262891,294 262891,631 262892,179170 262893,8270 262894,179170 262895,71 262896,589 262897,179170 262898,220816 262899,8854 262899,255750 262900,920 262901,220816 262902,1227 262903,1363 262904,179170 262905,220816 262906,41 262907,255 262908,5212 262909,15609 262910,179170 262911,262912 262913,179170 262914,220816 262915,493 262917,491 262918,1227 262919,179170 262920,179170 262921,83 262922,179170 262923,179170 262924,142870 262925,256681 262926,179170 262927,179170 262928,179170 262929,179170 262930,179170 262931,179170 262932,179170 262933,179170 262934,179170 262935,179170 262936,206 262937,1511 262937,6214 262938,120 262939,179170 262940,1381 262941,179170 262942,179170 262943,79 262943,493 262944,179170 262945,6068 262946,137 262947,179170 262948,48 262949,84666 262950,991 262951,6068 262952,292 262953,31896 262953,33424 262953,245910 262954,25348 262954,33424 262954,101688 262954,245910 262955,56 262956,422 262957,256681 262958,8884 262959,477 262959,23287 262960,1769 262961,247 262963,142870 262964,77 262965,493 262966,996 262967,179170 262968,285 262969,30 262970,179170 262971,1467 262972,932 262973,15573 262974,1087 262974,3370 262975,179170 262976,7358 262976,7363 262977,388 262978,2424 262979,35486 262980,953 262980,33424 262980,245910 262981,805 262982,2931 262983,179170 262984,48 262985,179170 262986,333 262987,275 262988,585 262989,8992 262990,1149 262991,5366 262992,991 262993,1379 262994,247 262995,256681 262996,536 262997,4475 262998,200 262999,134 263000,2048 263001,1285 263002,7360 263003,3148 263004,1359 263005,567 263006,158 263007,2590 263008,1010 263009,179170 263010,146 263010,92476 263011,344 263012,647 263013,138686 263014,175 263015,142870 263016,1860 263017,1858 263018,13980 263019,135 263020,104 263021,1332 263023,273 263024,71 263025,79 263026,581 263027,189788 263028,491 263029,491 263030,209 263031,707 263032,126 263033,438 263034,83 263035,217 263036,743 263037,2671 263038,1623 263039,980 263040,263041 263042,202 263043,567 263043,750 263043,1293 263044,1860 263045,1858 263046,707 263047,179170 263048,104 263049,875 263050,818 263051,63471 263052,1579 263053,516 263054,1436 263055,179170 263056,3804 263057,859 263058,640 263059,707 263060,640 263061,605 263062,179170 263064,263065 263067,97 263068,156379 263069,586 263070,2434 263074,192 263074,406 263074,4192 263074,4193 263075,81070 263077,278 263078,835 263080,707 263081,1707 263082,46 263083,158 263084,134 263085,255980 263086,920 263087,516 263088,818 263089,146 263089,92476 263090,647 263091,344 263092,179170 263093,179170 263094,99 263095,1608 263096,1132 263097,356 263098,1707 263099,138686 263100,175 263101,1776 263102,1238 263103,875 263104,37 263105,1274 263106,56 263107,920 263108,1452 263112,149 263113,344 263114,146 263115,647 263116,422 263117,56 263118,1345 263119,843 263120,30 263121,56 263122,422 263123,1313 263124,263125 263128,1274 263129,167 263130,422 263131,784 263132,1132 263133,1608 263134,1860 263135,1858 263136,3094 263137,261972 263138,1400 263139,175 263140,256681 263141,171 263142,422 263143,304 263144,422 263145,138686 263146,707 263147,209 263148,422 263149,422 263150,97 263151,422 263152,422 263153,256681 263154,55849 263155,422 263156,422 263157,422 263158,151 263159,422 263160,35486 263161,2266 263162,422 263164,422 263165,240 263165,372 263165,1955 263165,9015 263166,142870 263167,1133 263168,1634 263169,287 263170,215 263171,209 263172,15179 263173,491 263174,209 263175,875 263176,2646 263177,5405 263179,577 263180,779 263181,2646 263182,3623 263184,2274 263185,850 263186,4548 263187,932 263188,217 263189,2191 263191,56 263192,422 263193,34 263193,167 263193,760 263193,1149 263193,2416 263193,2417 263193,94134 263194,5405 263195,263196 263198,875 263199,209 263200,346 263201,79 263202,209 263203,155473 263204,406 263205,431 263206,5405 263208,2646 263209,3623 263210,493 263211,83 263212,149 263213,68 263213,192 263213,420 263213,435 263213,953 263213,1085 263213,1210 263213,1531 263213,3872 263213,7124 263213,8868 263214,640 263215,640 263216,1465 263217,7360 263218,209 263219,1860 263220,1858 263221,5405 263222,1860 263223,1858 263224,269 263225,518 263226,640 263227,8270 263228,7270 263229,2646 263230,3623 263231,5405 263232,142870 263233,58 263234,46 263235,994 263237,7124 263238,1181 263239,179170 263240,5405 263241,13661 263242,179170 263243,151 263244,1370 263244,2782 263245,9010 263246,1247 263246,164572 263247,818 263248,2224 263249,56 263250,422 263251,256681 263252,5405 263253,17588 263254,1326 263255,1715 263257,30 263258,366 263259,209 263260,366 263261,590 263262,366 263263,390 263264,146 263264,92476 263265,1151 263266,2646 263267,209 263268,187176 263269,366 263270,366 263271,366 263272,1010 263273,1146 263274,1390 263275,5405 263276,366 263277,760 263278,366 263279,209 263280,872 263281,2073 263283,5405 263284,302 263285,1715 263286,344 263287,162599 263288,217 263289,2646 263290,3623 263291,287 263292,1001 263293,302 263294,850 263295,1130 263296,861 263297,179170 263298,30 263300,372 263301,256681 263302,30 263303,258887 263306,263307 263308,1085 263309,138686 263310,175 263311,5405 263312,255750 263313,179170 263314,861 263315,5405 263317,1749 263318,5405 263319,563 263320,1715 263321,1085 263322,515 263323,2105 263324,5405 263325,5405 263326,557 263327,258631 263328,179170 263330,263331 263332,17588 263334,158 263335,5405 263336,2775 263337,263338 263339,332 263340,1058 263341,179170 263343,5405 263344,585 263345,467 263346,991 263347,1133 263348,77 263348,269 263349,557 263350,151 263351,269 263353,302 263354,647 263355,146 263355,92476 263356,344 263357,875 263358,493 263359,442 263360,483 263361,301 263362,233 263363,2244 263364,2319 263365,417 263366,1001 263367,255 263368,1556 263369,417 263370,142473 263371,536 263372,2979 263373,704 263374,158 263375,707 263376,7360 263377,7757 263378,247 263378,2867 263378,2868 263379,263380 263381,151 263382,256681 263383,200 263384,83 263384,536 263384,1571 263385,392 263385,1893 263386,5405 263387,34 263388,263389 263390,330 263391,5405 263392,920 263393,73570 263394,1 263395,749 263396,704 263397,79 263398,626 263399,30 263400,256206 263401,932 263402,136 263402,151 263402,167 263402,171 263402,202 263402,225 263402,252 263402,422 263402,626 263402,779 263402,1001 263402,1265 263402,1266 263402,1335 263402,1381 263402,1467 263402,1837 263402,2557 263402,33082 263402,255911 263402,256540 263403,749 263404,2590 263405,1608 263406,518 263407,718 263408,323 263409,81 263411,439 263412,479 263413,328 263414,1 263415,843 263416,240 263417,217 263418,631 263419,81 263420,1773 263421,1 263422,1623 263423,179170 263424,214734 263425,179170 263426,920 263427,179170 263428,994 263429,179170 263430,626 263431,590 263431,1368 263432,1298 263434,179170 263435,247 263436,134 263437,179170 263438,220816 263440,263441 263442,179170 263443,220816 263444,179170 263445,240174 263446,179170 263447,220816 263448,179170 263449,179170 263450,220816 263451,10 263452,302 263453,14366 263454,289 263454,94134 263455,1087 263456,536 263457,615 263458,1740 263459,220816 263460,217 263461,652 263462,4192 263462,4193 263463,220816 263464,1326 263465,179170 263466,1773 263467,1707 263468,220816 263469,1379 263469,1769 263469,28755 263470,220816 263471,179170 263472,257244 263472,263783 263473,920 263474,179170 263475,220816 263476,397 263477,179170 263478,263479 263480,220816 263481,885 263482,179170 263483,2867 263483,2868 263484,301 263485,557 263486,392 263486,1010 263487,439 263487,1033 263488,206 263489,220816 263490,9015 263491,30 263492,1860 263493,1858 263494,1151 263495,340 263496,1715 263497,220816 263498,2266 263499,861 263500,220816 263501,1309 263502,102 263503,1326 263504,408 263505,1323 263506,255750 263507,718 263508,220816 263509,151 263510,809 263511,220816 263512,209 263513,673 263514,217 263515,1474 263516,875 263517,7092 263518,142870 263519,968 263520,1773 263521,220816 263523,3260 263524,1274 263525,263526 263527,209 263528,1298 263529,809 263530,5906 263531,557 263532,626 263533,278 263534,137 263535,862 263536,278 263538,4865 263538,4866 263539,752 263540,2411 263541,179170 263542,151 263543,179170 263544,87 263545,1085 263546,493 263547,179170 263548,435 263549,220816 263550,106 263551,220816 263552,42220 263553,307 263554,220816 263555,1014 263556,179170 263557,843 263558,1014 263559,179170 263560,151 263561,920 263562,179170 263563,707 263564,717 263565,920 263566,30 263567,263568 263570,590 263570,32475 263571,875 263572,138686 263573,175 263574,147 263575,1 263576,5366 263577,192 263578,424 263579,1801 263580,30 263581,179170 263582,920 263583,220816 263584,179170 263585,861 263586,22 263587,385 263588,179170 263589,138 263590,3695 263591,2116 263592,179170 263593,220816 263594,179170 263595,179170 263596,220816 263597,179170 263599,589 263600,179170 263601,263601 263602,1659 263603,577 263605,920 263607,1033 263608,2775 263609,704 263610,79 263611,704 263612,493 263613,79 263614,592 263615,585 263616,586 263617,393 263618,50 263619,406 263620,841 263621,1227 263622,1590 263623,620 263624,151 263625,255 263626,1904 263627,2367 263628,406 263629,779 263630,1515 263631,263632 263633,263634 263635,151 263636,240174 263637,333 263638,255613 263639,285 263640,337 263640,338 263640,393 263640,439 263640,626 263640,649 263640,772 263640,1381 263640,1634 263640,2367 263640,255750 263641,269 263642,255876 263643,195 263644,171 263645,920 263646,2590 263647,250 263648,285 263649,179170 263650,269 263652,973 263653,2735 263654,263655 263656,872 263657,1429 263658,920 263659,3148 263660,5405 263661,179170 263662,255750 263663,1294 263664,167 263664,1544 263665,179170 263666,843 263667,35486 263669,207 263670,668 263671,179170 263672,2048 263673,1453 263674,179170 263675,83 263676,179170 263677,263678 263679,389 263680,65 263680,406 263681,179170 263682,862 263683,707 263684,30 263684,248 263685,7358 263685,7363 263686,179170 263687,1210 263688,3585 263689,7270 263690,9010 263690,164572 263691,20359 263692,34 263692,1707 263693,8822 263694,8598 263695,225 263696,332 263697,252 263697,749 263698,1 263699,179170 263700,4192 263700,4193 263701,843 263702,263703 263704,1085 263705,34 263705,1707 263706,1019 263707,256681 263709,1143 263710,1544 263711,4597 263712,136 263713,1133 263714,15573 263715,179170 263716,179170 263717,179170 263718,142870 263719,179170 263720,138686 263721,175 263722,179170 263723,302 263724,366 263725,366 263726,366 263728,30 263729,263730 263732,3 263733,609 263734,262271 263735,707 263737,179170 263738,195 263739,344 263741,263742 263743,1707 263744,151 263745,179170 263746,2671 263747,5405 263748,217 263749,779 263750,5343 263751,640 263752,467 263753,217 263754,1515 263755,1118 263756,491 263757,45310 263758,1860 263759,1858 263760,536 263761,422 263762,422 263763,4060 263764,422 263765,422 263766,422 263767,5405 263768,60576 263769,202 263769,1776 263770,263771 263772,422 263774,422 263775,589 263776,422 263777,312 263778,422 263779,422 263780,422 263781,422 263782,1001 263785,919 263787,1181 263788,1465 263789,3260 263790,3413 263792,1284 263793,9015 263795,9015 263796,5405 263797,720 263798,160 263799,875 263800,5405 263801,1454 263802,644 263803,920 263804,949 263805,1623 263807,50 263808,433 263809,156379 263812,167 263813,258887 263814,272 263814,934 263815,1860 263816,1858 263817,868 263819,1070 263820,156379 263821,1454 263822,5405 263823,171 263824,30 263825,1531 263826,138686 263827,175 263828,217 263830,452 263831,1634 263832,1238 263833,272 263835,1707 263836,605 263837,179170 263838,41 263839,1052 263840,1452 263841,192 263842,142870 263843,1241 263844,1132 263845,83 263846,5405 263847,287 263849,1860 263850,1858 263851,215 263852,256681 263853,145240 263854,907 263855,193129 263856,5405 263857,1368 263859,2617 263860,5405 263861,35486 263862,704 263863,515 263863,590 263864,263865 263866,87 263867,557 263868,338 263869,240 263870,1860 263871,1858 263872,115 263873,83 263874,1359 263876,932 263877,44 263878,227 263879,106 263879,1370 263879,2782 263880,1467 263882,2646 263883,3623 263884,467 263885,3872 263886,5265 263887,263888 263889,193129 263890,516 263891,2775 263892,447 263893,431 263894,685 263895,259 263895,726 263896,1052 263897,920 263898,3623 263899,2646 263900,5405 263901,2646 263902,3623 263903,9457 263904,743 263905,875 263906,875 263907,1749 263908,1888 263909,3094 263910,2205 263910,33424 263910,245910 263911,248 263912,1608 263913,1132 263914,248 263915,54 263916,37414 263917,79 263918,1452 263919,2646 263920,3623 263921,3623 263922,30 263923,841 263924,485 263925,310 263926,3 263927,875 263928,2989 263928,2991 263929,179170 263930,151 263932,113156 263933,23783 263934,256681 263935,389 263937,349 263938,46 263938,58 263940,1849 263941,1425 263942,1590 263944,261 263945,34 263945,35 263946,185877 263947,5405 263948,258973 263950,138686 263951,175 263960,7 263960,97 263961,389 263962,31934 263963,868 263965,5405 263966,106 263966,3370 263966,6119 263966,14453 263967,5405 263968,1769 263971,859 263972,1313 263973,3258 263975,5405 263976,292 263980,3 263981,515 263983,2205 263983,33424 263983,245910 263984,34 263985,1127 263986,1052 263987,315 263988,255 263989,240174 263990,30 263993,1012 263994,388 263995,2991 263996,1058 263997,34 263999,247 264000,264001 264002,2434 264003,920 264004,5405 264005,2205 264005,33424 264005,245910 264006,571 264007,1359 264008,83 264009,872 264010,138686 264011,175 264012,124668 264013,6303 264014,1556 264015,5192 264016,5405 264018,56 264019,422 264020,192 264021,179170 264022,5405 264023,515 264024,4549 264025,272 264027,1368 264028,258973 264029,595 264030,22 264031,6424 264032,151 264033,99 264034,483 264035,2979 264036,1001 264037,388 264038,328 264040,968 264041,151 264042,302 264043,3218 264044,189303 264045,179170 264046,704 264047,34 264047,158 264048,79 264049,450 264049,4193 264050,3370 264050,6027 264051,932 264053,179170 264055,1 264056,7358 264056,7363 264057,179170 264058,861 264059,56 264060,422 264061,7698 264062,406 264063,99 264064,220816 264065,557 264066,1220 264067,252 264068,251 264069,1462 264069,8537 264071,30 264072,302 264073,424 264074,2436 264075,220816 264076,3115 264077,179170 264078,2646 264079,3623 264080,536 264081,220816 264082,220816 264083,147 264083,1181 264083,1370 264084,272 264085,2209 264087,893 264088,2646 264089,3623 264090,179170 264091,220816 264093,179170 264094,247 264095,2646 264096,3623 264097,596 264098,1522 264099,220816 264100,1284 264101,704 264102,3623 264103,2646 264104,79 264105,557 264106,264107 264108,4594 264109,179170 264110,779 264111,44 264112,389 264113,179170 264114,920 264115,179170 264116,2116 264117,4597 264118,439 264119,147 264120,2784 264121,5405 264122,2646 264123,264 264124,217 264125,55849 264126,211 264127,5405 264129,2379 264130,30 264131,875 264132,1335 264133,83 264134,217 264135,278 264136,536 264137,83 264138,366 264139,256681 264140,247 264141,220816 264142,179170 264143,56 264144,422 264145,247 264146,355 264147,435 264148,30 264149,179170 264150,333 264151,25453 264151,256540 264152,206 264153,179170 264154,1467 264155,875 264157,861 264158,154408 264159,151 264160,843 264161,949 264162,652 264163,1359 264164,1326 264165,102 264166,408 264167,1323 264169,7092 264171,557 264172,862 264174,811 264175,247 264176,682 264176,72439 264177,827 264178,30 264179,264180 264181,264180 264182,278 264183,779 264184,1888 264185,264186 264187,439 264187,516 264187,818 264188,1449 264189,83 264190,264191 264192,1359 264193,861 264194,83 264195,138686 264196,175 264197,256380 264198,1132 264199,285 264200,1381 264201,264202 264203,136 264204,843 264205,19010 264206,99 264207,8811 264208,264209 264210,217 264211,5265 264212,885 264213,2735 264214,518 264215,147 264216,2048 264217,99 264218,147 264218,240174 264219,3367 264220,264221 264222,346 264224,220816 264225,275 264226,158 264227,1284 264228,264229 264230,179170 264231,1465 264232,4594 264233,264234 264235,1608 264236,1240 264237,264238 264239,8822 264240,255750 264241,225 264242,332 264243,1608 264244,920 264245,220816 264246,2590 264247,4192 264247,4193 264248,151 264249,1782 264250,45960 264251,2334 264252,255750 264253,179170 264254,1163 264255,10 264256,289 264256,94134 264257,13546 264258,563 264259,6027 264260,220816 264261,227669 264262,459 264263,220816 264264,2367 264265,220816 264266,577 264267,264268 264269,137 264270,179170 264271,179170 264272,220816 264273,6661 264274,2373 264275,220816 264276,142451 264276,255969 264277,4192 264277,4193 264278,206 264279,264280 264281,285 264282,220816 264283,302 264284,220816 264285,206 264286,256187 264287,179170 264288,258298 264289,145240 264290,179170 264291,818 264292,264293 264295,60576 264296,264297 264298,1769 264299,60576 264301,269 264302,179170 264303,1572 264304,256681 264305,862 264306,138686 264307,175 264308,1659 264309,256681 264310,264311 264312,264313 264314,264315 264316,1400 264317,264318 264320,256681 264321,843 264322,479 264323,704 264324,493 264325,35486 264326,609 264327,55849 264329,58 264330,994 264331,46 264332,58 264333,46 264334,994 264335,875 264336,5405 264337,2088 264338,292 264339,366 264340,366 264341,366 264342,366 264343,366 264344,366 264345,366 264346,366 264347,258973 264348,55849 264349,267 264350,259 264352,1132 264353,1608 264354,668 264356,872 264357,875 264359,2646 264360,3623 264361,192 264362,784 264363,644 264364,1335 264365,7757 264367,256681 264368,278 264370,1323 264371,136 264372,422 264373,30 264373,248 264374,285 264375,5405 264376,213089 264377,264378 264380,138686 264381,175 264382,187 264384,264385 264387,264388 264390,919 264391,1247 264391,164572 264394,586 264395,920 264396,1860 264398,256600 264399,189303 264400,344 264401,697 264402,491 264403,372 264404,2605 264406,3 264408,3623 264409,2646 264411,338 264412,145240 264414,209 264414,1749 264415,875 264416,760 264417,1220 264418,251 264419,252 264420,1551 264421,58 264422,994 264423,46 264424,2416 264424,2417 264425,58 264426,994 264427,46 264428,273 264431,217 264432,31073 264433,467 264435,264 264436,682 264436,72439 264436,215276 264438,104 264439,83 264440,707 264441,264442 264443,35486 264444,145240 264445,3209 264446,90845 264447,3695 264448,48 264450,247 264452,79 264453,1294 264455,422 264456,422 264457,422 264458,422 264459,422 264460,422 264461,422 264462,422 264463,422 264464,422 264465,422 264466,422 264467,3003 264468,255 264469,697 264469,1240 264469,1465 264470,1983 264471,302 264472,256206 264473,932 264474,5440 264475,1238 264478,193578 264479,356 264480,1452 264481,849 264482,179170 264484,90845 264485,1400 264486,1707 264487,850 264492,302 264494,2105 264496,13136 264497,875 264498,142426 264500,920 264501,73570 264506,1132 264507,1608 264508,256681 264511,5405 264512,1893 264512,4294 264513,1309 264514,1368 264515,602 264517,31073 264520,433 264521,447 264522,868 264523,60576 264524,9029 264526,634 264527,657 264528,360 264529,55849 264530,346 264531,694 264533,447 264534,2775 264535,217914 264535,247075 264536,3999 264537,138686 264538,175 264540,489 264544,843 264544,849 264546,1240 264547,818 264548,5405 264549,1323 264550,292 264551,285 264552,1119 264553,7757 264554,805 264555,392 264556,264557 264558,920 264560,788 264561,310 264561,6556 264562,10 264563,200543 264564,1133 264566,3507 264567,149 264568,252 264569,1058 264570,189303 264571,493 264572,932 264573,146 264573,92476 264574,647 264575,344 264576,151 264577,3135 264578,1181 264579,704 264580,79 264581,390 264583,264584 264585,285 264586,220816 264587,83 264588,563 264589,55849 264590,220816 264591,220816 264593,435 264594,138 264595,865 264596,557 264597,1566 264598,137 264599,392 264600,220816 264601,406 264602,707 264603,220816 264604,2045 264605,843 264606,996 264607,220816 264608,83 264609,220816 264611,862 264611,3370 264612,220816 264613,220816 264614,220816 264615,920 264616,1262 264617,483 264618,220816 264619,220816 264620,220816 264621,44 264622,220816 264623,3003 264624,809 264625,155481 264626,518 264627,220816 264628,809 264629,220816 264630,220816 264631,192 264632,220816 264633,220816 264634,220816 264635,2620 264636,557 264637,256703 264638,217 264639,366 264640,280 264640,17245 264641,200 264642,312 264643,220816 264644,200 264645,7092 264647,202 264648,491 264649,278 264650,332 264651,2105 264652,207 264653,525 264654,255750 264655,1309 264656,9015 264657,1285 264658,2373 264659,264660 264661,2979 264662,631 264663,1033 264664,1014 264665,294 264666,269 264667,2244 264669,707 264670,147 264671,2105 264672,1282 264673,138686 264674,175 264675,1 264676,113156 264677,240174 264678,920 264679,1 264680,388 264681,179170 264682,516 264683,285 264684,250 264685,285 264686,171 264687,179170 264688,179170 264689,30 264690,4771 264691,264692 264693,250 264694,285 264696,3260 264697,255716 264697,259187 264698,818 264699,140 264699,323 264699,932 264699,1453 264699,1572 264699,2697 264699,14458 264700,225 264701,4237 264701,182162 264703,264704 264705,4810 264706,269 264707,8884 264710,862 264711,1085 264712,119 264713,264714 264715,1893 264716,491 264717,8 264718,264719 264720,264721 264722,264723 264725,1467 264727,1707 264728,1707 264729,1707 264730,1 264730,2750 264732,252 264733,516 264734,1220 264737,264738 264739,1014 264740,1014 264741,1014 264742,83 264743,83 264744,35486 264747,875 264748,264749 264750,932 264753,220816 264754,83 264755,264756 264758,189303 264759,2017 264761,5405 264762,83 264763,450 264764,30 264765,6119 264766,273 264768,264769 264771,592 264772,366 264774,698 264775,850 264776,264777 264778,264779 264780,227669 264781,920 264782,1381 264783,16196 264784,3321 264786,5192 264787,932 264788,256681 264789,3 264790,1796 264791,5405 264792,5405 264793,5405 264794,1132 264795,781 264796,251 264797,2048 264798,589 264799,2373 264800,1033 264801,2105 264802,264803 264804,1132 264805,781 264806,781 264807,1132 264808,620 264809,138686 264810,175 264811,44 264812,222 264813,406 264814,264815 264816,779 264817,1515 264818,264819 264821,258887 264822,1014 264823,333 264824,217 264825,743 264827,483 264828,195 264829,220816 264830,220816 264831,220816 264832,264833 264834,220816 264835,1836 264836,220816 264837,220816 264838,156379 264839,104 264840,220816 264841,30 264842,220816 264844,220816 264845,264846 264847,220816 264848,1479 264849,220816 264850,390 264851,254 264852,258700 264853,264854 264855,1007 264856,44725 264857,4810 264858,264859 264860,2105 264861,264862 264863,256681 264864,1462 264864,5440 264865,447 264866,2775 264867,7358 264867,7363 264868,393 264869,433 264870,220816 264871,179170 264872,179170 264873,818 264874,179170 264876,149534 264877,179170 264878,707 264879,298 264880,485 264881,144962 264882,571 264883,151 264884,264885 264886,54 264889,2424 264890,264891 264892,264893 264894,1227 264895,1414 264896,2697 264897,15573 264898,1285 264899,256187 264900,1240 264901,5265 264902,1608 264903,6682 264904,850 264905,255750 264906,255750 264907,206 264908,259187 264909,30 264910,187 264911,264912 264913,138686 264914,175 264915,1082 264916,491 264917,107 264918,2416 264918,2417 264919,292 264920,338 264921,298 264922,179170 264923,1133 264924,3538 264925,417 264926,179170 264927,179170 264928,264929 264930,707 264931,9537 264932,1227 264933,588 264933,590 264933,1419 264934,264935 264936,366 264937,366 264938,366 264939,366 264940,366 264941,366 264942,366 264943,366 264945,589 264946,2266 264948,875 264949,171 264950,151 264951,255750 264952,159902 264953,179170 264954,779 264955,35486 264956,760 264957,647 264958,264959 264960,2775 264961,2073 264963,875 264964,304 264965,304 264966,1603 264968,640 264969,30 264970,255980 264971,264972 264973,1087 264974,149 264976,483 264977,267 264978,294 264978,2868 264979,1201 264979,33424 264979,245910 264980,2424 264981,749 264984,264985 264986,264987 264988,264989 264990,589 264991,589 264992,137 264993,285 264994,240174 264995,264996 264997,4545 264997,56150 264998,932 264999,818 265000,1631 265002,138686 265003,175 265004,784 265005,179170 265006,7092 265007,779 265008,179170 265009,2668 265010,422 265011,422 265012,1715 265013,1085 265014,422 265015,422 265016,422 265017,422 265018,422 265019,422 265020,422 265021,422 265022,422 265023,422 265024,422 265025,44 265027,1566 265028,5405 265029,1860 265030,1858 265031,5405 265032,349 265032,455 265032,5343 265033,493 265034,366 265035,366 265036,366 265038,255613 265039,252 265040,1220 265041,251 265042,707 265043,58 265044,46 265045,994 265046,5405 265047,5405 265048,134 265048,349 265048,431 265049,1608 265050,968 265051,273 265052,60576 265053,1807 265054,1014 265055,206 265055,2105 265056,5405 265057,707 265058,450 265059,873 265060,1014 265061,265062 265063,973 265064,1014 265065,536 265066,265067 265068,265069 265070,265071 265072,2506 265073,872 265074,872 265075,10 265076,265077 265078,589 265079,137 265080,265081 265082,589 265083,137 265084,265085 265086,195 265087,265088 265089,240 265090,265091 265092,652 265093,10 265094,265095 265096,932 265097,2105 265098,3331 265099,292 265100,294 265101,491 265102,296 265103,240 265104,298 265105,265106 265107,142473 265108,3258 265109,2083 265110,265111 265112,1001 265113,30 265114,285 265115,704 265116,493 265117,79 265118,592 265119,585 265120,586 265121,393 265122,50 265123,406 265124,6068 265125,256681 265126,256681 265128,2073 265129,366 265130,366 265131,256681 265132,265133 265134,265135 265136,265137 265138,256681 265139,158 265140,256681 265141,265142 265143,83 265144,151 265145,137 265146,589 265147,265148 265149,647 265150,103860 265151,4597 265152,256681 265153,256681 265154,147 265155,256681 265156,6387 265157,255969 265158,206 265160,586 265161,1531 265162,256681 265163,41 265164,2617 265165,707 265166,920 265167,240174 265168,171 265169,137 265169,200 265170,491 265171,707 265172,30 265173,256681 265174,707 265175,83 265176,256681 265177,442 265178,265179 265180,256681 265182,1274 265183,35486 265184,256681 265185,1181 265186,671 265187,932 265188,255 265189,302 265190,136 265191,2116 265193,68 265194,2296 265195,4597 265196,422 265197,422 265198,422 265199,422 265200,422 265201,83 265202,6387 265203,422 265204,422 265205,422 265206,422 265207,422 265208,422 265209,422 265210,422 265211,192 265212,875 265213,255750 ================================================ FILE: examples/dataset/small_data_edge.csv ================================================ Source,Target 1,2048 ================================================ FILE: examples/dataset/small_data_edge_raw.csv ================================================ Source,Target 0,451 0,395 0,386 1,3637 1,3587 1,3586 1,3553 2,3583 3,4930 4,88 5,120 5,13 6,8 7,8 8,7 8,6 8,9 9,8 9,208 9,205 9,75 9,61 9,10 10,9 10,50 11,125 11,94 12,13 13,12 13,5 13,83 13,15 13,14 14,13 14,147 14,29 14,17 14,16 15,13 16,14 17,14 18,190 18,19 19,18 19,130 19,20 20,19 20,199 21,176 21,51 22,4445 23,4446 24,4461 24,53 25,136 25,58 26,203 26,139 26,131 26,94 27,166 27,161 28,98 29,14 29,160 29,130 30,140 30,123 31,104 31,62 32,174 32,155 33,34 34,33 34,97 34,35 35,34 35,142 35,141 35,69 35,36 36,35 36,157 36,47 36,39 36,38 36,37 37,36 38,36 39,36 40,202 40,97 41,232 41,218 41,167 41,58 41,42 42,41 42,181 42,98 43,163 43,94 44,47 45,47 46,184 46,47 47,46 47,45 47,44 47,36 47,171 48,106 48,101 48,75 49,4448 50,10 50,205 50,139 51,21 51,194 51,120 52,172 52,119 52,111 53,24 53,231 54,147 54,109 55,107 55,88 56,198 56,175 56,152 56,149 56,119 57,2562 57,98 58,41 58,25 58,167 58,59 59,58 59,60 60,59 60,154 61,9 61,209 61,188 62,31 62,154 63,68 64,68 65,68 66,69 67,70 68,65 68,64 68,63 68,4893 68,979 68,69 69,68 69,66 69,35 69,2344 69,1052 69,1030 69,70 70,69 70,67 70,108 71,224 71,86 72,215 72,112 72,73 73,72 73,231 73,91 74,98 75,48 75,9 76,185 76,110 76,86 76,77 77,76 77,191 77,170 78,109 78,79 79,78 79,80 80,79 80,989 80,199 80,184 81,2562 81,82 82,81 82,98 83,13 83,221 83,218 84,4461 84,4446 85,4448 85,151 86,76 86,71 86,110 87,89 87,88 88,87 88,55 88,4 88,198 88,195 88,178 88,172 88,90 89,87 90,88 91,73 91,4446 91,496 92,174 92,123 92,94 93,94 94,93 94,92 94,43 94,26 94,11 94,131 94,95 95,94 95,171 95,129 96,148 96,144 97,40 97,34 98,82 98,74 98,57 98,42 98,28 98,205 98,135 98,125 98,100 99,4459 99,100 100,99 100,98 101,48 101,210 101,123 102,140 103,190 103,153 103,145 104,31 104,222 104,174 105,1055 105,1030 105,184 106,48 106,186 107,55 107,178 108,70 108,4120 108,207 108,116 109,78 109,54 110,86 110,76 111,52 111,204 111,192 111,148 112,72 112,215 112,113 113,112 113,3770 113,129 114,115 115,114 115,205 116,108 116,522 116,207 116,118 116,117 117,116 118,116 119,56 119,52 119,175 119,148 120,51 120,5 121,122 122,121 122,123 123,122 123,101 123,92 123,30 123,140 124,232 124,194 124,173 124,153 125,98 125,11 125,208 126,129 127,129 128,129 129,128 129,127 129,126 129,113 129,95 129,4112 129,235 129,207 130,29 130,19 131,94 131,26 131,139 132,4461 133,2562 134,236 134,222 135,98 135,236 136,25 136,146 137,229 137,224 137,223 138,4882 138,205 138,150 138,143 138,140 138,139 139,138 139,131 139,50 139,26 139,140 140,139 140,138 140,123 140,102 140,30 140,186 140,141 141,140 141,35 141,142 142,141 142,35 143,138 143,234 143,202 143,151 144,96 144,192 145,103 145,196 145,194 146,136 146,153 147,54 147,14 148,119 148,111 148,96 149,56 149,198 150,138 150,191 150,181 151,143 151,85 152,56 152,198 153,146 153,124 153,103 153,158 153,157 153,156 153,154 154,153 154,62 154,60 154,173 154,159 154,157 154,155 155,154 155,32 156,153 156,189 157,154 157,153 157,36 157,193 158,153 159,154 160,29 161,27 161,196 162,165 162,163 163,162 163,43 163,191 163,164 164,163 165,162 166,27 166,176 167,58 167,41 168,229 168,170 169,227 169,187 169,170 170,169 170,168 170,77 170,171 171,170 171,95 171,47 172,88 172,52 173,154 173,124 174,104 174,92 174,32 174,189 175,119 175,56 176,166 176,21 177,180 177,179 177,178 178,177 178,107 178,88 179,177 179,206 179,199 180,177 181,150 181,42 182,184 183,184 184,183 184,182 184,105 184,80 184,46 184,997 184,200 185,76 185,187 186,140 186,106 187,185 187,169 187,230 187,228 188,61 188,205 189,174 189,156 190,103 190,18 191,163 191,150 191,77 192,144 192,111 192,193 193,192 193,157 194,145 194,124 194,51 195,88 195,204 196,161 196,145 197,201 198,152 198,149 198,88 198,56 198,201 198,200 199,179 199,80 199,20 199,201 200,198 200,184 201,199 201,198 201,197 202,143 202,40 203,26 204,195 204,111 205,188 205,138 205,115 205,98 205,50 205,9 205,207 206,179 206,207 207,206 207,205 207,129 207,116 207,108 208,125 208,9 209,61 210,101 210,213 210,212 210,211 211,210 212,210 213,210 214,499 214,215 215,214 215,112 215,72 216,228 216,225 217,218 218,217 218,83 218,41 219,224 220,221 221,220 221,83 221,225 222,134 222,104 223,137 223,227 224,219 224,137 224,71 225,221 225,216 226,230 226,229 227,223 227,169 228,216 228,187 229,226 229,168 229,137 230,226 230,187 231,73 231,53 232,124 232,41 233,234 234,233 234,143 235,129 236,135 236,134 236,237 237,236 238,4423 238,318 238,252 239,354 239,333 239,240 240,239 240,337 240,327 240,316 241,351 241,242 242,241 242,366 242,365 242,364 242,363 242,284 243,355 243,342 244,361 244,335 245,247 246,378 246,371 246,298 246,257 246,247 247,246 247,245 247,330 248,250 249,360 249,313 249,312 249,305 249,280 249,250 250,249 250,248 251,370 251,367 251,319 251,289 251,252 252,251 252,238 252,376 252,322 252,289 252,253 253,252 253,4362 253,337 254,329 254,284 254,255 255,254 255,299 255,285 256,259 257,246 257,381 257,368 257,360 257,310 257,259 258,311 258,306 258,299 259,257 259,256 260,382 260,369 260,350 260,287 260,261 261,260 261,334 261,267 261,262 262,261 262,345 262,344 263,4415 263,321 264,334 264,281 265,308 266,350 266,267 267,266 267,261 268,269 269,268 269,362 269,346 270,274 271,274 272,372 272,274 273,274 274,273 274,272 274,271 274,270 274,362 274,325 274,275 275,274 276,351 276,286 277,342 277,314 278,378 278,335 278,298 279,313 279,302 279,295 279,282 279,280 280,279 280,249 280,360 280,313 280,312 280,305 281,264 281,334 282,279 282,313 282,302 282,295 282,284 283,284 284,283 284,282 284,254 284,242 284,366 284,305 284,296 284,285 285,284 285,255 285,1178 285,316 285,306 286,276 287,260 287,351 288,290 289,252 289,251 290,288 290,4435 290,336 291,292 292,291 292,362 292,325 293,298 294,300 295,282 295,279 295,313 295,302 295,296 296,295 296,284 296,365 297,340 297,308 297,300 298,293 298,278 298,246 298,343 298,335 298,299 299,298 299,258 299,255 299,362 299,316 300,297 300,294 301,302 302,301 302,295 302,282 302,279 302,313 303,316 303,307 304,305 305,304 305,284 305,280 305,249 305,313 305,306 306,305 306,285 306,258 306,316 307,303 308,297 308,265 308,340 308,323 309,4431 309,358 309,353 310,257 310,368 310,311 311,310 311,258 311,345 311,344 312,280 312,249 312,313 313,312 313,305 313,302 313,295 313,282 313,280 313,279 313,249 314,277 314,326 314,315 315,314 315,356 315,316 316,315 316,306 316,303 316,299 316,285 316,240 316,337 317,1119 317,318 318,317 318,238 318,336 319,251 319,370 319,322 319,320 320,319 320,321 321,320 321,263 321,4341 322,319 322,252 323,308 324,325 325,324 325,292 325,274 326,314 326,4428 327,240 327,379 327,328 328,327 329,254 329,330 330,329 330,247 330,357 331,380 331,340 332,355 332,353 332,333 333,332 333,239 334,281 334,264 334,261 334,352 335,298 335,278 335,244 335,373 336,318 336,290 336,338 336,337 337,336 337,316 337,253 337,240 338,336 338,339 339,338 340,331 340,308 340,297 340,341 341,340 341,346 342,277 342,243 342,355 342,343 343,342 343,298 344,311 344,262 345,311 345,262 346,341 346,269 347,352 348,352 349,350 350,349 350,266 350,260 350,369 351,287 351,276 351,241 351,352 352,351 352,348 352,347 352,334 353,332 353,309 353,4425 353,374 353,355 353,354 354,353 354,239 354,4426 355,353 355,342 355,332 355,243 355,356 356,355 356,315 357,330 357,377 358,309 359,361 360,280 360,257 360,249 360,381 361,359 361,244 361,362 362,361 362,299 362,292 362,274 362,269 363,242 364,242 365,296 365,242 366,284 366,242 367,251 367,370 368,310 368,257 369,350 369,260 370,367 370,319 370,251 371,246 371,378 372,272 373,335 374,353 375,378 376,252 377,357 378,375 378,371 378,278 378,246 379,327 380,331 381,360 381,257 382,260 383,462 383,455 383,454 383,445 383,429 383,384 384,383 384,447 384,426 384,393 385,386 386,385 386,0 386,2307 386,446 386,445 386,387 387,386 388,430 389,2282 389,437 390,391 391,390 391,423 391,409 391,394 391,392 392,391 392,436 392,425 392,406 392,402 393,384 393,2223 393,447 393,396 393,395 394,391 394,457 394,442 395,393 395,0 395,2393 395,2213 395,419 396,393 396,2283 396,2231 396,420 396,400 396,399 396,398 396,397 397,396 398,396 399,396 400,396 401,402 402,401 402,392 402,439 402,436 402,435 402,411 402,403 403,402 404,405 405,404 405,460 405,457 405,431 405,406 406,405 406,392 407,408 408,407 408,456 408,451 408,437 409,391 409,431 410,411 411,410 411,402 411,1216 412,1248 412,473 413,468 413,464 413,462 413,459 413,452 413,415 413,414 414,413 414,425 415,413 416,469 416,450 416,444 416,430 416,417 417,416 418,421 419,395 419,456 419,421 420,396 420,2283 420,426 420,421 421,420 421,419 421,418 422,1784 422,1424 422,439 423,391 423,430 424,444 424,443 424,425 425,424 425,414 425,392 425,426 426,425 426,420 426,384 426,3987 426,447 426,427 427,426 427,1125 428,459 428,452 429,383 429,470 429,446 430,423 430,416 430,388 430,469 430,441 431,409 431,405 431,472 431,433 431,432 432,431 432,436 433,431 434,435 435,434 435,402 435,1297 435,461 436,432 436,402 436,392 437,408 437,389 438,473 438,472 438,439 439,438 439,422 439,402 440,441 441,440 441,430 441,442 442,441 442,394 442,466 443,424 443,468 443,464 444,424 444,416 445,386 445,383 446,429 446,386 447,426 447,393 447,384 448,449 449,448 449,467 449,465 450,416 450,468 451,408 451,0 451,453 452,428 452,413 453,451 453,463 454,383 454,470 454,455 455,454 455,383 455,459 456,419 456,408 456,465 457,405 457,394 457,460 458,461 459,455 459,428 459,413 460,457 460,405 461,458 461,435 462,413 462,383 463,453 463,467 464,443 464,413 464,469 465,456 465,449 466,442 467,463 467,449 468,450 468,443 468,413 469,464 469,430 469,416 470,454 470,429 471,472 472,471 472,438 472,431 473,438 473,412 474,4173 474,481 475,4446 475,4113 476,477 477,476 477,484 477,480 478,498 478,492 478,479 479,478 479,481 479,480 480,479 480,477 480,493 481,479 481,474 481,4111 481,491 482,495 482,494 482,489 482,485 483,3769 483,484 484,483 484,477 484,496 484,493 484,485 485,484 485,482 485,498 485,497 485,489 485,486 486,485 486,494 487,491 488,1201 488,1183 489,485 489,482 490,2949 490,2836 490,2835 490,2834 490,2832 490,2799 490,2680 490,2548 490,2543 490,2542 490,2426 491,487 491,481 492,478 492,497 492,493 493,492 493,484 493,480 493,4446 494,486 494,482 495,482 495,496 496,495 496,484 496,91 496,499 497,492 497,485 498,485 498,478 499,496 499,214 500,501 501,500 501,573 501,570 501,549 502,504 503,504 504,503 504,502 504,564 504,556 504,523 505,551 505,548 506,565 506,546 506,539 507,566 507,546 507,539 508,566 508,565 509,572 509,571 509,545 510,561 511,551 511,550 511,538 511,534 511,513 511,512 512,511 513,511 514,4458 515,519 516,520 517,520 518,3982 518,520 519,515 519,520 520,519 520,518 520,517 520,516 520,2312 521,4458 521,4448 521,832 521,828 521,522 522,521 522,116 522,4120 522,570 523,504 523,532 523,525 523,524 524,523 524,528 525,523 525,530 526,4145 526,532 526,527 527,526 528,524 528,530 528,529 529,528 530,528 530,525 530,531 531,530 532,526 532,523 532,573 532,568 532,564 532,556 532,548 532,533 533,532 533,570 534,511 534,550 534,538 535,574 535,559 535,536 536,535 536,557 536,537 537,536 538,534 538,511 538,551 539,507 539,506 539,544 539,543 539,542 539,541 539,540 540,539 540,569 541,539 541,569 542,539 542,550 543,539 543,565 543,561 543,545 544,539 544,566 544,561 544,545 545,544 545,543 545,509 546,507 546,506 546,559 546,558 546,554 546,553 547,555 547,548 548,547 548,532 548,505 548,568 548,552 548,551 548,549 549,548 549,501 550,542 550,534 550,511 550,551 551,550 551,548 551,538 551,511 551,505 552,548 552,555 553,546 553,555 554,546 554,555 555,554 555,553 555,552 555,547 556,532 556,504 556,563 557,536 557,563 557,558 558,557 558,546 558,562 559,546 559,535 560,561 561,560 561,544 561,543 561,510 562,558 562,563 563,562 563,557 563,556 564,532 564,504 564,4211 564,1482 564,1481 565,543 565,508 565,506 566,544 566,508 566,507 567,568 568,567 568,548 568,532 569,541 569,540 569,4458 569,570 570,569 570,533 570,522 570,501 570,4164 571,509 572,509 573,532 573,501 574,535 575,730 575,660 575,659 575,657 576,640 576,625 576,582 577,578 578,577 578,610 578,594 579,702 579,664 580,725 580,720 581,626 581,585 582,576 582,645 582,612 582,584 582,583 583,582 584,582 584,680 584,672 584,667 584,652 584,585 585,584 585,581 585,614 586,587 587,586 587,703 587,679 587,669 587,624 587,618 588,597 589,692 589,594 589,591 589,590 590,589 591,589 592,630 592,597 592,593 593,592 594,589 594,578 594,705 594,628 594,596 594,595 595,594 596,594 597,592 597,588 597,657 597,620 597,602 597,601 597,600 597,599 597,598 598,597 599,597 600,597 601,597 602,597 603,604 604,603 604,691 604,657 604,606 604,605 605,604 605,666 605,658 606,604 607,610 608,609 609,608 609,662 609,657 609,611 609,610 610,609 610,607 610,578 610,722 611,609 612,582 612,700 612,640 612,613 613,612 613,614 614,613 614,585 614,676 614,636 614,619 615,616 616,615 616,725 616,639 617,618 618,617 618,587 618,668 619,614 619,626 620,597 621,622 622,621 622,736 622,653 623,624 624,623 624,587 624,708 624,668 624,655 625,576 626,619 626,581 627,628 628,627 628,594 628,658 629,630 630,629 630,592 630,696 631,632 632,631 632,718 632,689 632,668 632,639 632,634 633,634 634,633 634,632 634,725 635,636 636,635 636,614 636,648 637,728 637,713 637,709 637,671 638,639 639,638 639,632 639,616 639,725 639,685 639,681 639,653 640,612 640,576 640,641 641,640 642,658 643,644 644,643 644,687 644,648 645,582 645,704 645,646 646,645 647,648 648,647 648,644 648,636 649,650 650,649 650,725 651,653 652,584 652,726 652,680 652,653 653,652 653,651 653,639 653,622 653,725 653,685 654,655 655,654 655,624 655,689 655,669 656,658 657,609 657,604 657,597 657,575 657,696 657,658 658,657 658,656 658,642 658,628 658,605 658,738 658,712 659,575 660,575 661,662 662,661 662,609 662,691 663,664 664,663 664,579 665,666 666,665 666,605 666,692 667,584 667,726 667,680 667,668 668,667 668,632 668,624 668,618 668,718 669,655 669,587 670,704 671,637 671,713 671,672 672,671 672,584 672,674 672,673 673,672 674,672 675,702 675,676 676,675 676,614 677,725 677,720 678,679 679,678 679,587 679,681 680,667 680,652 680,584 680,726 680,693 680,683 680,682 680,681 681,680 681,679 681,639 681,708 681,702 681,687 681,685 682,680 683,680 684,685 685,684 685,681 685,653 685,639 686,687 687,686 687,681 687,644 688,689 689,688 689,655 689,632 689,732 690,691 691,690 691,662 691,604 692,666 692,589 692,3769 692,738 692,726 692,694 693,680 694,692 694,726 694,695 695,694 696,657 696,630 696,697 697,696 698,728 698,699 699,698 700,612 700,702 701,702 702,701 702,700 702,681 702,675 702,579 702,734 703,587 704,670 704,645 704,713 705,594 706,709 706,707 707,706 708,681 708,624 709,706 709,637 709,710 710,709 711,712 712,711 712,658 712,722 713,704 713,671 713,637 713,714 714,713 715,716 716,715 716,720 717,718 718,717 718,668 718,632 719,720 720,719 720,716 720,677 720,580 720,727 720,725 721,722 722,721 722,712 722,610 722,723 723,722 724,725 725,724 725,720 725,677 725,653 725,650 725,639 725,634 725,616 725,580 725,726 726,725 726,694 726,692 726,680 726,667 726,652 726,3781 727,720 728,698 728,637 728,729 729,728 730,575 731,732 732,731 732,689 733,734 734,733 734,702 734,736 735,736 736,735 736,734 736,622 737,738 738,737 738,692 738,658 739,763 739,749 739,740 740,739 740,815 740,757 740,750 740,748 741,744 742,779 742,762 742,759 742,743 743,742 743,804 743,777 743,760 743,745 743,744 744,743 744,741 744,1230 744,815 744,802 744,746 745,743 746,744 747,780 748,740 748,805 748,775 748,751 748,750 749,739 749,805 749,752 750,748 750,740 750,776 750,757 750,753 751,748 752,749 752,2413 753,750 753,2414 754,803 754,783 754,764 755,757 756,787 756,757 757,756 757,755 757,750 757,740 757,791 757,758 758,757 758,824 758,823 758,813 758,812 759,742 759,778 759,762 759,760 760,759 760,743 760,814 761,762 762,761 762,759 762,742 762,789 762,780 762,778 763,739 763,815 763,814 763,777 764,754 764,820 764,774 765,766 766,765 766,803 767,771 768,772 769,772 770,797 770,785 770,771 771,770 771,767 771,786 771,773 771,772 772,771 772,769 772,768 772,824 772,823 773,771 774,764 774,817 774,781 775,748 776,750 776,4928 776,786 777,763 777,743 777,2417 778,762 778,759 778,814 779,742 779,795 779,789 780,762 780,747 780,803 780,799 780,789 780,784 780,783 780,781 781,780 781,774 782,4934 782,803 783,780 783,754 783,800 783,791 784,780 785,770 785,786 786,785 786,776 786,771 787,756 787,803 787,791 788,789 789,788 789,780 789,779 789,762 790,2417 790,2304 791,787 791,783 791,757 791,803 792,793 793,792 793,1214 793,811 793,794 794,793 794,804 795,779 795,808 795,804 795,796 796,795 797,770 798,799 799,798 799,780 800,783 800,1257 800,1230 800,801 801,800 802,744 802,2207 803,791 803,787 803,782 803,780 803,766 803,754 803,821 803,807 804,795 804,794 804,743 804,1402 805,749 805,748 806,807 807,806 807,803 808,795 808,809 809,808 809,822 810,811 811,810 811,793 811,1124 811,822 812,758 812,1227 813,758 813,1228 814,778 814,763 814,760 815,763 815,744 815,740 815,816 816,815 817,774 817,818 818,817 818,819 819,818 819,4940 819,820 820,819 820,764 821,803 822,811 822,809 822,1124 823,772 823,758 824,772 824,758 825,844 825,826 826,825 826,4462 826,829 827,877 827,858 827,845 827,828 828,827 828,521 828,837 829,826 829,4458 829,836 829,834 830,4444 831,932 831,920 831,919 831,910 831,906 831,905 831,904 831,903 831,895 831,869 831,868 831,867 831,855 831,832 832,831 832,521 833,891 833,874 833,866 833,862 833,854 833,834 834,833 834,829 835,896 835,892 835,836 836,835 836,829 837,828 837,4458 837,872 837,871 837,853 838,853 838,839 839,838 839,840 840,839 840,2351 841,842 842,841 842,4179 843,4457 843,863 843,862 843,861 844,825 844,865 844,846 845,827 845,903 845,877 846,844 846,912 846,900 846,894 846,884 846,880 846,870 846,860 846,847 847,846 847,911 847,848 848,847 848,889 848,888 848,887 848,886 848,879 849,909 849,908 849,907 849,855 850,898 850,854 851,854 852,902 852,900 852,873 852,865 852,853 853,852 853,838 853,837 854,851 854,850 854,833 854,891 854,864 854,863 854,861 854,859 854,855 855,854 855,849 855,831 855,860 855,856 856,855 856,4458 857,902 857,893 857,882 858,827 858,885 859,854 859,883 859,881 859,864 859,860 860,859 860,855 860,846 861,854 861,843 862,843 862,833 863,854 863,843 864,859 864,854 864,921 864,883 865,852 865,844 866,833 867,831 868,831 869,831 869,899 869,895 870,846 871,837 871,928 871,885 872,837 872,929 873,852 873,930 874,833 874,901 874,897 874,885 875,893 875,881 875,878 875,876 876,875 876,895 876,894 877,845 877,827 878,875 878,930 878,929 878,928 878,892 879,848 880,846 880,900 881,875 881,859 881,891 882,857 882,931 882,883 883,882 883,864 883,859 883,884 884,883 884,846 885,874 885,871 885,858 885,928 886,848 887,848 888,848 889,848 890,929 890,902 891,881 891,854 891,833 892,878 892,835 892,896 893,875 893,857 893,894 894,893 894,876 894,846 895,876 895,869 895,831 895,897 895,896 896,895 896,892 896,835 897,895 897,874 898,850 899,869 899,930 900,880 900,852 900,846 901,874 901,928 902,890 902,857 902,852 902,931 902,929 902,928 903,845 903,831 904,831 905,831 906,831 907,849 908,849 909,849 910,831 911,847 912,846 912,918 912,917 913,917 914,917 915,918 916,918 917,914 917,913 917,912 918,916 918,915 918,912 919,831 920,831 921,864 921,927 921,926 922,926 923,926 924,927 925,927 926,923 926,922 926,921 927,925 927,924 927,921 928,902 928,901 928,885 928,878 928,871 928,929 929,928 929,902 929,890 929,878 929,872 930,899 930,878 930,873 931,902 931,882 932,831 933,1053 933,1014 934,969 934,936 934,935 935,934 935,969 936,934 936,941 937,1050 937,1010 937,954 937,938 938,937 939,984 939,961 939,956 939,940 940,939 940,1051 940,1036 940,1016 941,936 941,1014 941,994 941,942 942,941 942,959 942,946 943,1028 943,1005 943,1003 943,944 944,943 944,1028 944,995 944,945 945,944 945,1058 945,1006 946,942 946,947 947,946 948,1048 948,1047 948,964 948,950 948,949 949,948 949,1043 949,962 949,951 950,948 950,1034 950,970 950,951 951,950 951,949 951,1000 951,978 951,971 952,1056 952,1024 952,1023 952,975 952,953 953,952 953,1052 953,1030 953,1011 953,983 954,937 954,1050 954,973 955,983 956,939 956,1050 956,1015 956,957 957,956 958,1049 958,993 958,959 959,958 959,942 959,1006 960,987 960,965 961,939 961,1055 962,949 962,993 963,1030 963,1013 963,991 964,948 964,1025 965,960 965,1021 965,973 965,966 966,965 966,997 967,1026 967,968 968,967 968,1057 968,1006 969,935 969,934 969,1021 969,995 970,950 970,996 970,971 971,970 971,951 971,1037 971,1026 972,973 973,972 973,965 973,954 973,1021 974,1031 974,1024 974,1023 975,952 975,1054 975,1010 976,1048 976,1034 977,1047 977,992 978,951 978,1005 979,68 979,1036 979,980 980,979 980,4855 981,1055 981,1015 981,982 982,981 983,955 983,953 984,939 984,1050 984,985 985,984 986,1044 986,1012 986,1010 987,960 987,989 987,988 988,987 989,987 989,80 989,997 990,994 991,963 991,1054 991,1011 992,977 992,1047 992,998 992,993 993,992 993,962 993,958 993,1049 994,990 994,941 994,999 995,969 995,944 995,1028 996,970 996,1001 997,989 997,966 997,184 997,1057 997,1006 998,992 998,1034 999,994 1000,951 1000,1026 1001,996 1001,1002 1002,1001 1002,1005 1003,943 1003,1045 1004,1028 1004,1021 1005,1002 1005,978 1005,943 1005,1049 1005,1037 1005,1026 1005,1014 1005,1009 1005,1008 1005,1007 1005,1006 1006,1005 1006,997 1006,968 1006,959 1006,945 1006,1057 1007,1005 1008,1005 1009,1005 1010,986 1010,975 1010,937 1010,1056 1010,1011 1011,1010 1011,991 1011,953 1012,986 1012,1044 1012,1013 1013,1012 1013,963 1014,1005 1014,941 1014,933 1015,981 1015,956 1015,1016 1016,1015 1016,940 1016,1017 1017,1016 1018,1022 1018,1019 1019,1018 1019,1050 1019,1046 1019,1031 1020,1021 1021,1020 1021,1004 1021,973 1021,969 1021,965 1022,1018 1022,1059 1022,1050 1022,1046 1023,974 1023,952 1023,1059 1023,1050 1024,974 1024,952 1024,1059 1024,1050 1025,964 1025,1026 1026,1025 1026,1005 1026,1000 1026,971 1026,967 1026,1045 1026,1043 1026,1027 1027,1026 1028,1004 1028,995 1028,944 1028,943 1029,1030 1030,1029 1030,963 1030,953 1030,105 1030,69 1030,4894 1030,1040 1030,1039 1030,1038 1030,1033 1031,1019 1031,974 1031,1046 1031,1032 1032,1031 1032,1052 1033,1030 1033,4902 1034,998 1034,976 1034,950 1034,1035 1035,1034 1035,1049 1036,979 1036,940 1037,1005 1037,971 1038,1030 1039,1030 1040,1030 1041,1056 1041,1044 1041,1042 1042,1041 1043,1026 1043,949 1044,1041 1044,1012 1044,986 1045,1026 1045,1003 1046,1031 1046,1022 1046,1019 1046,1059 1047,992 1047,977 1047,948 1048,976 1048,948 1049,1035 1049,1005 1049,993 1049,958 1050,1024 1050,1023 1050,1022 1050,1019 1050,984 1050,956 1050,954 1050,937 1050,1052 1050,1051 1051,1050 1051,940 1052,1050 1052,1032 1052,953 1052,69 1052,1058 1053,933 1054,991 1054,975 1055,981 1055,961 1055,105 1056,1041 1056,1010 1056,952 1057,1006 1057,997 1057,968 1058,1052 1058,945 1059,1046 1059,1024 1059,1023 1059,1022 1060,2035 1060,2002 1060,1542 1060,1062 1060,1061 1061,1060 1061,1444 1062,1060 1062,1444 1063,1809 1063,1625 1063,1331 1063,1160 1063,1065 1064,1176 1065,1063 1065,1119 1065,1091 1066,2069 1066,1901 1066,1852 1067,1969 1067,1418 1067,1068 1068,1067 1068,1419 1069,1566 1069,1498 1069,1497 1069,1300 1069,1197 1069,1196 1069,1070 1070,1069 1070,1371 1070,1269 1071,2028 1071,1615 1071,1553 1072,1554 1072,1469 1072,1314 1072,1280 1072,1208 1072,1191 1072,1073 1073,1072 1073,1313 1073,1192 1074,1506 1074,1159 1074,1076 1075,1905 1075,1217 1075,1076 1076,1075 1076,1074 1077,1224 1078,1459 1078,1313 1078,1306 1078,1244 1078,1079 1079,1078 1080,1559 1080,1334 1081,1942 1081,1560 1081,1154 1082,1750 1082,1728 1082,1510 1082,1224 1083,1503 1083,1446 1083,1295 1084,1224 1084,1098 1085,1478 1085,1420 1085,1367 1085,1351 1085,1087 1085,1086 1086,1085 1086,1097 1086,1091 1086,1088 1087,1085 1087,1624 1087,1223 1087,1220 1087,1090 1087,1088 1088,1087 1088,1086 1088,1401 1088,1091 1089,1556 1089,1446 1089,1311 1090,1087 1090,2017 1090,1959 1090,1630 1090,1496 1090,1165 1090,1108 1090,1091 1091,1090 1091,1088 1091,1086 1091,1065 1091,1525 1091,1504 1091,1429 1091,1353 1091,1166 1091,1092 1092,1091 1092,1488 1093,2135 1093,2096 1093,1095 1093,1094 1094,1093 1094,1447 1094,1177 1095,1093 1095,2159 1095,2091 1095,2071 1095,1446 1095,1386 1096,2109 1096,1285 1096,1097 1097,1096 1097,1086 1097,1379 1097,1343 1098,1084 1098,1914 1098,1731 1098,1713 1098,1677 1098,1490 1098,1193 1098,1099 1099,1098 1099,1334 1100,2179 1100,2176 1100,2062 1100,1530 1100,1276 1100,1101 1101,1100 1101,2139 1101,1277 1102,1573 1102,1422 1102,1338 1102,1226 1102,1103 1103,1102 1103,1442 1103,1143 1104,2121 1104,2061 1104,1753 1104,1717 1104,1556 1104,1460 1105,1948 1105,1666 1105,1179 1105,1145 1105,1106 1106,1105 1106,1877 1106,1810 1106,1323 1106,1317 1106,1249 1106,1180 1106,1143 1106,1136 1106,1107 1107,1106 1107,1365 1107,1267 1107,1137 1108,1090 1108,1496 1108,1240 1109,1495 1109,1471 1109,1210 1110,1111 1111,1110 1111,1459 1112,1581 1112,1579 1113,1116 1114,1932 1114,1837 1115,1969 1115,1603 1115,1543 1116,1113 1116,1552 1116,1499 1116,1454 1116,1453 1117,2195 1117,1584 1117,1463 1117,1461 1117,1436 1117,1189 1118,1825 1118,1119 1119,1118 1119,1065 1119,317 1119,4437 1119,1429 1119,1176 1120,1956 1120,1825 1121,1122 1122,1121 1122,1275 1122,1163 1123,1459 1123,1313 1123,1243 1124,822 1124,811 1124,2021 1124,1576 1125,427 1125,1476 1126,1128 1126,1127 1127,1126 1127,1863 1128,1126 1128,1401 1128,1353 1129,1226 1129,1187 1130,1942 1130,1830 1131,2557 1131,1330 1131,1308 1131,1243 1132,1605 1132,1493 1132,1135 1133,1609 1133,1323 1133,1242 1134,1610 1134,1531 1134,1416 1135,1132 1135,1534 1135,1451 1136,1106 1136,1139 1136,1138 1136,1137 1137,1136 1137,1107 1138,1136 1139,1136 1140,1620 1140,1619 1140,1486 1140,1458 1140,1361 1140,1345 1140,1332 1140,1301 1141,1142 1142,1141 1142,1874 1142,1474 1143,1106 1143,1103 1143,1622 1143,1434 1144,1222 1145,1105 1145,1955 1145,1491 1146,1148 1147,2064 1147,2063 1147,1207 1147,1166 1147,1148 1148,1147 1148,1146 1148,1452 1148,1340 1148,1167 1149,1696 1149,1150 1150,1149 1150,1283 1150,1275 1151,1530 1151,1489 1151,1473 1151,1356 1151,1335 1152,1484 1152,1357 1152,1170 1153,1730 1153,1405 1154,1081 1154,1197 1155,1971 1155,1774 1155,1156 1156,1155 1156,1260 1156,1221 1156,1161 1157,1749 1157,1736 1157,1326 1158,1905 1158,1770 1158,1684 1158,1505 1158,1159 1159,1158 1159,1074 1159,1506 1159,1416 1159,1322 1159,1170 1159,1166 1160,1063 1160,2092 1160,1956 1161,1156 1161,1501 1161,1260 1162,1641 1162,1517 1162,1241 1162,1163 1163,1162 1163,1122 1163,1299 1164,2189 1164,2184 1164,1865 1164,1435 1165,1090 1165,2015 1165,1853 1165,1777 1165,1166 1166,1165 1166,1159 1166,1147 1166,1091 1166,1646 1166,1525 1166,1438 1166,1413 1166,1168 1166,1167 1167,1166 1167,1148 1167,1541 1167,1244 1168,1166 1169,1403 1169,1170 1170,1169 1170,1159 1170,1152 1170,1531 1170,1486 1170,1484 1170,1309 1170,1201 1170,1175 1170,1171 1171,1170 1171,1403 1172,2180 1173,1649 1173,1531 1173,1487 1173,1486 1173,1484 1173,1468 1174,1518 1174,1184 1175,1170 1175,1467 1175,1201 1176,1119 1176,1064 1176,1504 1177,1094 1177,1387 1177,1265 1177,1178 1178,1177 1178,285 1178,1340 1179,1105 1180,1106 1181,2164 1181,1735 1182,1398 1182,1190 1183,488 1183,1467 1184,1174 1184,2447 1185,1442 1186,2075 1186,2050 1186,1949 1187,1129 1187,1469 1188,1189 1189,1188 1189,1117 1189,1234 1190,1182 1190,1845 1190,1191 1191,1190 1191,1072 1191,1407 1191,1246 1191,1192 1192,1191 1192,1073 1192,1330 1193,1098 1193,1528 1194,1678 1194,1195 1195,1194 1195,1521 1195,1452 1195,1416 1196,1069 1196,1197 1197,1196 1197,1154 1197,1069 1198,1512 1198,1349 1199,1891 1199,1348 1199,1200 1200,1199 1200,1892 1201,1175 1201,1170 1201,488 1201,1309 1202,1204 1202,1203 1203,1202 1203,1364 1204,1202 1204,1488 1204,1253 1205,2086 1205,1449 1205,1290 1206,2037 1206,1989 1206,1866 1206,1705 1206,1359 1206,1207 1207,1206 1207,1147 1208,1072 1208,1794 1208,1441 1209,1679 1209,1467 1209,1309 1210,1109 1210,2076 1210,1536 1210,1211 1211,1210 1212,1770 1212,1213 1213,1212 1213,1346 1214,793 1214,1774 1215,1216 1216,1215 1216,411 1216,1512 1217,1075 1217,1425 1218,1687 1218,1450 1218,1385 1218,1247 1219,1912 1219,1767 1219,1689 1219,1417 1219,1407 1220,1087 1220,1251 1221,1156 1221,1292 1222,1144 1222,1254 1223,1087 1223,1524 1224,1084 1224,1082 1224,1077 1224,2194 1224,1799 1224,1746 1224,1727 1224,1647 1224,1594 1224,1432 1224,1262 1224,1225 1225,1224 1225,1326 1226,1129 1226,1102 1226,1709 1227,812 1227,1231 1228,813 1228,1231 1229,1524 1229,1478 1229,1254 1230,800 1230,744 1230,1402 1230,1231 1231,1230 1231,1228 1231,1227 1231,1488 1232,1246 1232,1239 1233,1234 1234,1233 1234,1189 1234,1461 1235,1902 1235,1723 1235,1577 1235,1236 1236,1235 1236,1237 1237,1236 1237,1810 1237,1334 1238,1532 1238,1239 1239,1238 1239,1232 1239,1483 1239,1329 1240,1108 1241,1162 1241,1355 1242,1133 1242,1995 1242,1726 1242,1725 1242,1291 1243,1131 1243,1123 1243,1423 1243,1383 1243,1308 1243,1267 1244,1167 1244,1078 1244,1507 1244,1365 1244,1306 1244,1267 1245,1678 1245,1505 1246,1232 1246,1191 1247,1218 1247,1384 1248,412 1248,1913 1249,1106 1249,1256 1250,1501 1250,1289 1251,1220 1251,1420 1251,1389 1252,1349 1252,1343 1252,1297 1252,1253 1253,1252 1253,1204 1253,1304 1254,1229 1254,1222 1255,1798 1255,1762 1255,1570 1256,1249 1256,1763 1256,1326 1257,800 1257,1992 1257,1402 1257,1353 1257,1292 1257,1258 1258,1257 1258,1488 1259,1260 1260,1259 1260,1161 1260,1156 1261,1263 1262,1224 1263,1261 1263,1432 1264,1799 1265,1177 1266,1267 1267,1266 1267,1244 1267,1243 1267,1107 1267,1459 1267,1313 1268,2182 1268,1776 1268,1472 1268,1410 1268,1269 1269,1268 1269,1070 1269,1373 1270,1271 1271,1270 1271,1634 1272,1928 1272,1626 1272,1586 1272,1569 1272,1274 1272,1273 1273,1272 1273,1361 1274,1272 1274,1450 1275,1150 1275,1122 1275,1307 1276,1100 1276,1489 1276,1466 1276,1352 1276,1278 1276,1277 1277,1276 1277,1101 1277,2203 1278,1276 1278,2120 1278,1489 1278,1435 1278,1279 1279,1278 1279,1463 1279,1309 1280,1072 1280,1786 1280,1523 1280,1281 1281,1280 1281,1313 1282,1701 1282,1283 1283,1282 1283,1150 1283,1377 1284,1835 1284,1684 1284,1526 1284,1474 1285,1096 1285,2141 1286,1800 1286,1535 1286,1300 1287,1289 1288,1801 1288,1289 1289,1288 1289,1287 1289,1250 1289,1934 1289,1353 1290,1205 1290,1409 1291,1242 1291,1994 1291,1803 1292,1257 1292,1221 1293,1294 1294,1293 1294,1306 1294,1304 1295,1083 1296,1629 1296,1426 1296,1350 1296,1297 1297,1296 1297,1252 1297,435 1298,2158 1298,1805 1298,1562 1298,1532 1298,1302 1298,1299 1299,1298 1299,1163 1299,1805 1299,1329 1300,1286 1300,1069 1300,1807 1300,1301 1301,1300 1301,1140 1302,1298 1302,1398 1303,1304 1304,1303 1304,1294 1304,1253 1305,1306 1306,1305 1306,1294 1306,1244 1306,1078 1306,1433 1307,1275 1307,2060 1307,1812 1307,1308 1308,1307 1308,1243 1308,1131 1308,2594 1308,1476 1309,1279 1309,1209 1309,1201 1309,1170 1309,2185 1309,2139 1309,2138 1309,1814 1309,1436 1309,1316 1309,1310 1310,1309 1310,1540 1311,1089 1311,2192 1311,2191 1311,2036 1311,1446 1311,1312 1312,1311 1312,1447 1313,1281 1313,1267 1313,1123 1313,1078 1313,1073 1313,1443 1313,1373 1314,1072 1314,1912 1314,1315 1315,1314 1315,1816 1316,1309 1316,1817 1316,1467 1317,1106 1317,1819 1317,1406 1318,1319 1319,1318 1319,1458 1319,1332 1320,1527 1320,1440 1321,2156 1321,1522 1321,1505 1321,1412 1322,1159 1322,1416 1323,1133 1323,1106 1323,2098 1323,2097 1323,1374 1323,1338 1323,1324 1324,1323 1324,1365 1325,1881 1325,1822 1325,1326 1326,1325 1326,1256 1326,1225 1326,1157 1326,1821 1326,1580 1326,1579 1326,1424 1326,1328 1326,1327 1327,1326 1327,1459 1327,1433 1328,1326 1329,1299 1329,1239 1329,1483 1329,1330 1330,1329 1330,1192 1330,1131 1331,1063 1331,1634 1332,1319 1332,1140 1332,1345 1333,2016 1333,1677 1333,1631 1333,1346 1333,1334 1334,1333 1334,1237 1334,1099 1334,1080 1334,1515 1334,1506 1334,1502 1334,1438 1334,1396 1334,1391 1334,1369 1335,1151 1335,1558 1335,1356 1336,1337 1337,1336 1337,1997 1337,1663 1338,1323 1338,1102 1338,1831 1339,1462 1339,1341 1339,1340 1340,1339 1340,1178 1340,1148 1340,1540 1341,1339 1341,1448 1342,1860 1342,1508 1342,1427 1342,1364 1342,1343 1343,1342 1343,1252 1343,1097 1344,1345 1345,1344 1345,1332 1345,1140 1345,2180 1346,1333 1346,1213 1346,1761 1347,1842 1347,1461 1347,1447 1348,1199 1348,1629 1348,1449 1348,1426 1348,1349 1349,1348 1349,1252 1349,1198 1350,1296 1350,1364 1351,1085 1351,2017 1352,1276 1352,2189 1352,1466 1352,1435 1353,1289 1353,1257 1353,1128 1353,1091 1353,1859 1353,1379 1353,1354 1354,1353 1355,1241 1355,1562 1356,1335 1356,1151 1356,2120 1356,2007 1356,1558 1356,1530 1356,1489 1356,1357 1357,1356 1357,1152 1357,2139 1358,1765 1358,1735 1359,1206 1359,2044 1359,1867 1359,1719 1360,1950 1360,1929 1360,1775 1360,1363 1360,1361 1361,1360 1361,1273 1361,1140 1361,1864 1361,1487 1361,1450 1361,1444 1361,1362 1362,1361 1362,1371 1363,1360 1363,1919 1363,1471 1364,1350 1364,1342 1364,1203 1365,1324 1365,1244 1365,1107 1365,1500 1365,1373 1366,1516 1366,1490 1367,1085 1367,1624 1367,1400 1367,1388 1368,1975 1368,1903 1368,1369 1369,1368 1369,1334 1369,1552 1370,1495 1370,1371 1371,1370 1371,1362 1371,1070 1371,1539 1371,1538 1371,1445 1371,1403 1372,1451 1372,1374 1372,1373 1373,1372 1373,1365 1373,1313 1373,1269 1374,1372 1374,1323 1374,1451 1375,1376 1376,1375 1376,1422 1377,1283 1377,1406 1377,1382 1378,2104 1378,2021 1378,1593 1378,1400 1378,1379 1379,1378 1379,1353 1379,1097 1380,1893 1380,1506 1380,1502 1381,1397 1381,1382 1382,1381 1382,1377 1382,1383 1383,1382 1383,1243 1383,1476 1384,1247 1384,1895 1385,1218 1385,1895 1386,1095 1386,2159 1386,2096 1386,1387 1387,1386 1387,1177 1388,1367 1388,1399 1389,1251 1389,1632 1389,1478 1390,1439 1390,1425 1390,1391 1391,1390 1391,1334 1391,1413 1392,1426 1393,1404 1393,1397 1394,1515 1395,1396 1396,1395 1396,1334 1397,1393 1397,1381 1398,1302 1398,1182 1399,1388 1399,1400 1400,1399 1400,1378 1400,1367 1400,1852 1400,1401 1401,1400 1401,1128 1401,1088 1402,1257 1402,1230 1402,804 1403,1371 1403,1171 1403,1169 1403,1541 1403,1540 1403,1485 1404,1393 1405,1153 1405,1406 1406,1405 1406,1377 1406,1317 1406,1422 1407,1219 1407,1191 1408,1983 1408,1980 1408,1798 1409,1290 1409,1470 1410,1268 1410,2113 1410,1498 1410,1419 1411,1412 1412,1411 1412,1321 1412,1505 1413,1391 1413,1166 1413,2193 1414,1416 1415,1874 1415,1844 1415,1522 1415,1416 1416,1415 1416,1414 1416,1322 1416,1195 1416,1159 1416,1134 1416,1920 1417,1219 1417,1921 1418,1067 1418,1828 1418,1455 1418,1419 1419,1418 1419,1410 1419,1068 1419,1963 1419,1923 1419,1535 1419,1454 1419,1453 1420,1251 1420,1085 1421,1422 1422,1421 1422,1406 1422,1376 1422,1102 1422,1423 1423,1422 1423,1243 1424,1326 1424,422 1424,1924 1425,1390 1425,1217 1425,2016 1426,1392 1426,1348 1426,1296 1427,1342 1427,1449 1428,2069 1428,1429 1429,1428 1429,1119 1429,1091 1430,1974 1430,1432 1430,1431 1431,1430 1431,1433 1432,1430 1432,1263 1432,1224 1433,1431 1433,1327 1433,1306 1434,1143 1434,1930 1435,1352 1435,1278 1435,1164 1435,2184 1435,1436 1436,1435 1436,1309 1436,1117 1436,1462 1437,1935 1437,1783 1438,1334 1438,1166 1438,1811 1439,1390 1439,1884 1439,1526 1439,1516 1439,1440 1440,1439 1440,1320 1440,1811 1441,1208 1441,1794 1441,1442 1442,1441 1442,1185 1442,1103 1442,1987 1442,1548 1442,1537 1442,1443 1443,1442 1443,1313 1444,1361 1444,1062 1444,1061 1444,1445 1445,1444 1445,1371 1446,1311 1446,1095 1446,1089 1446,1083 1446,2077 1446,1447 1447,1446 1447,1347 1447,1312 1447,1094 1447,2195 1448,1341 1448,1461 1449,1427 1449,1348 1449,1205 1450,1361 1450,1274 1450,1218 1451,1374 1451,1372 1451,1135 1451,2119 1451,2118 1451,1472 1452,1195 1452,1148 1452,1541 1453,1419 1453,1116 1453,1456 1454,1419 1454,1116 1454,1457 1455,1418 1455,1598 1455,1457 1455,1456 1456,1455 1456,1453 1457,1455 1457,1454 1458,1319 1458,1140 1458,1952 1459,1327 1459,1267 1459,1123 1459,1111 1459,1078 1460,1104 1460,2144 1460,2123 1460,2108 1460,2105 1460,2095 1460,2081 1460,2074 1460,2072 1460,1461 1461,1460 1461,1448 1461,1347 1461,1234 1461,1117 1461,2125 1461,2124 1462,1436 1462,1339 1462,1463 1463,1462 1463,1279 1463,1117 1463,1953 1464,1466 1465,1466 1466,1465 1466,1464 1466,1352 1466,1276 1466,1908 1467,1316 1467,1209 1467,1183 1467,1175 1467,2138 1468,1173 1468,2188 1468,1954 1468,1748 1468,1484 1469,1187 1469,1072 1470,1409 1470,2112 1471,1363 1471,1109 1471,2188 1471,2173 1472,1451 1472,1268 1472,2129 1472,2128 1472,1497 1473,1151 1473,2131 1473,1530 1474,1284 1474,1142 1474,2042 1474,1475 1475,1474 1476,1383 1476,1308 1476,1125 1477,1478 1478,1477 1478,1389 1478,1229 1478,1085 1478,2086 1478,2050 1479,1480 1480,1479 1480,1535 1481,564 1482,564 1483,1329 1483,1239 1484,1468 1484,1173 1484,1170 1484,1152 1484,2157 1484,1485 1485,1484 1485,1403 1486,1173 1486,1170 1486,1140 1487,1361 1487,1173 1487,1531 1488,1258 1488,1231 1488,1204 1488,1092 1489,1356 1489,1278 1489,1276 1489,1151 1489,2179 1489,2139 1489,2138 1489,2120 1490,1366 1490,1098 1491,1145 1491,1984 1491,1760 1491,1621 1492,1986 1492,1710 1492,1565 1492,1493 1493,1492 1493,1132 1494,1988 1494,1537 1494,1523 1495,1370 1495,1109 1495,1919 1496,1108 1496,1090 1496,2010 1497,1472 1497,1069 1498,1410 1498,1069 1499,1116 1499,1995 1499,1994 1499,1877 1499,1500 1500,1499 1500,1365 1501,1250 1501,1161 1502,1380 1502,1334 1502,1999 1503,1083 1504,1176 1504,1091 1505,1412 1505,1321 1505,1245 1505,1158 1506,1380 1506,1334 1506,1159 1506,1074 1506,2202 1506,1818 1506,1514 1506,1512 1506,1507 1507,1506 1507,1244 1507,1541 1508,1342 1508,1876 1509,1510 1510,1509 1510,1082 1510,1980 1511,2019 1511,1891 1511,1594 1512,1506 1512,1216 1512,1198 1512,2020 1512,1513 1513,1512 1513,2022 1513,1736 1514,1506 1515,1394 1515,1334 1515,1818 1516,1439 1516,1366 1516,2027 1516,1925 1517,1162 1517,1518 1518,1517 1518,1174 1519,1521 1520,1588 1520,1521 1521,1520 1521,1519 1521,1195 1522,1415 1522,1321 1522,1844 1523,1494 1523,1280 1523,2031 1523,1979 1524,1229 1524,1223 1524,1949 1524,1632 1524,1525 1525,1524 1525,1166 1525,1091 1526,1439 1526,1284 1526,1926 1527,1320 1527,2193 1528,1193 1528,2126 1528,1762 1528,1695 1528,1694 1528,1529 1529,1528 1529,1559 1530,1473 1530,1356 1530,1151 1530,1100 1530,2173 1530,2076 1530,1536 1530,1533 1530,1531 1531,1530 1531,1487 1531,1173 1531,1170 1531,1134 1532,1298 1532,1238 1532,2158 1533,1530 1534,1135 1535,1480 1535,1419 1535,1286 1536,1530 1536,1210 1536,2176 1537,1494 1537,1442 1538,1371 1539,1371 1540,1403 1540,1340 1540,1310 1541,1507 1541,1452 1541,1403 1541,1167 1542,1060 1542,1938 1542,1644 1543,1115 1543,1611 1544,1832 1544,1547 1545,2040 1545,1575 1546,1888 1546,1553 1547,1544 1547,1744 1547,1733 1547,1708 1547,1638 1547,1595 1547,1548 1548,1547 1548,1442 1549,2110 1549,1782 1550,1931 1550,1622 1551,1993 1551,1779 1552,1369 1552,1116 1553,1546 1553,1071 1554,1072 1554,2142 1554,1957 1554,1890 1554,1839 1554,1740 1554,1720 1554,1670 1554,1653 1555,1841 1555,1561 1556,1104 1556,1089 1557,1846 1557,1712 1558,1356 1558,1335 1559,1529 1559,1080 1560,1081 1560,1781 1561,1555 1561,1819 1562,1355 1562,1298 1562,2158 1563,1857 1563,1787 1563,1689 1564,1950 1564,1569 1565,1492 1565,1745 1566,1069 1566,1568 1566,1567 1567,1566 1568,1566 1569,1564 1569,1272 1570,1255 1570,1618 1571,1881 1571,1728 1572,1740 1572,1685 1573,1102 1573,2053 1573,1574 1574,1573 1574,2115 1574,2099 1575,1545 1575,1946 1575,1685 1576,1124 1576,1593 1577,1235 1577,1631 1578,1985 1578,1645 1579,1326 1579,1112 1579,1657 1580,1326 1580,1987 1581,1112 1581,1582 1582,1581 1582,1764 1583,2087 1583,1918 1583,1691 1584,1117 1584,2012 1584,2000 1584,1951 1584,1856 1584,1855 1584,1599 1585,1745 1585,1721 1586,1272 1586,1928 1586,1702 1587,1867 1587,1588 1588,1587 1588,1520 1589,2150 1589,2000 1589,1679 1589,1599 1590,1854 1590,1716 1591,1930 1591,1622 1592,2048 1592,1701 1593,1576 1593,1378 1594,1511 1594,1224 1595,1547 1596,2038 1596,1960 1597,1598 1598,1597 1598,1455 1598,1686 1599,1589 1599,1584 1599,2012 1600,2098 1600,2097 1600,1922 1600,1601 1601,1600 1601,1972 1601,1838 1602,2151 1602,2130 1602,2001 1603,1115 1603,1686 1604,1823 1604,1773 1604,1648 1605,1132 1605,2043 1605,1820 1605,1699 1606,1645 1607,1773 1607,1674 1608,1998 1608,1970 1609,1133 1609,2148 1609,2065 1609,1725 1610,1134 1611,1543 1611,1760 1612,1781 1612,1627 1612,1613 1613,1612 1613,1847 1614,2157 1614,1954 1614,1654 1615,1071 1615,1659 1616,2002 1616,1834 1617,1700 1617,1620 1618,1570 1618,1902 1619,1140 1619,1882 1620,1617 1620,1140 1620,1700 1621,1491 1621,1948 1622,1591 1622,1550 1622,1143 1622,1692 1622,1623 1623,1622 1623,2115 1623,2099 1623,2014 1623,1662 1624,1367 1624,1087 1625,1063 1625,2004 1626,1272 1626,2003 1627,1612 1627,1664 1628,1809 1628,1663 1629,1348 1629,1296 1630,1090 1630,1729 1631,1577 1631,1333 1632,1524 1632,1389 1633,1964 1633,1848 1633,1813 1634,1331 1634,1271 1635,1703 1635,1667 1636,1824 1636,1738 1637,1738 1638,1547 1638,1930 1639,2092 1639,1911 1640,1804 1640,1766 1641,1162 1642,1804 1642,1689 1643,2067 1643,1699 1644,1542 1644,2035 1644,1909 1644,1751 1645,1606 1645,1578 1646,1166 1646,1864 1647,1224 1647,1916 1648,1604 1648,1807 1649,1173 1649,2068 1649,1954 1649,1752 1650,2015 1650,1788 1651,1797 1651,1795 1652,1879 1652,1759 1653,1554 1653,2039 1653,2038 1653,1790 1653,1742 1654,1614 1654,1883 1654,1752 1655,1897 1656,1897 1657,1579 1658,1786 1658,1771 1659,1615 1659,1826 1660,1892 1660,1827 1661,1850 1661,1820 1661,1662 1662,1661 1662,1623 1662,2067 1662,1722 1663,1628 1663,1337 1664,1627 1664,2163 1665,1915 1665,1862 1666,1105 1666,1667 1667,1666 1667,1635 1668,1890 1668,1808 1669,1754 1669,1670 1670,1669 1670,1554 1670,1685 1671,2013 1671,1789 1672,1816 1673,1897 1673,1687 1674,1607 1674,1800 1675,1706 1676,1906 1676,1677 1677,1676 1677,1333 1677,1098 1678,1245 1678,1194 1679,1589 1679,1209 1680,1803 1680,1734 1681,2037 1681,1875 1682,1929 1682,1834 1683,1778 1684,1284 1684,1158 1685,1670 1685,1575 1685,1572 1685,1915 1685,1878 1685,1786 1686,1603 1686,1598 1687,1673 1687,1218 1687,2167 1687,1897 1687,1688 1688,1687 1689,1642 1689,1563 1689,1219 1689,1857 1689,1714 1690,2097 1690,1861 1690,1691 1691,1690 1691,1583 1691,1918 1692,1622 1692,1869 1693,1907 1693,1858 1694,1528 1694,1731 1695,1528 1695,1967 1696,1149 1696,1826 1697,2031 1698,1982 1698,1776 1699,1643 1699,1605 1699,1776 1700,1620 1700,1617 1701,1592 1701,1282 1702,1586 1702,2167 1702,2003 1703,1635 1703,1841 1703,1780 1704,1976 1704,1724 1705,1206 1705,1853 1706,1675 1706,2007 1707,2019 1707,1829 1708,1547 1708,1795 1709,1226 1709,2100 1709,1870 1709,1797 1710,1492 1710,1830 1711,1921 1711,1896 1712,1557 1712,1904 1713,1098 1713,2194 1713,1843 1714,1689 1714,1739 1715,2111 1715,1961 1716,1590 1716,1921 1716,1889 1717,1104 1717,2136 1718,1955 1719,1359 1719,1849 1720,1554 1721,1585 1721,1930 1721,1722 1722,1721 1722,1662 1723,1235 1723,1975 1724,1704 1724,1795 1725,1609 1725,1242 1725,2080 1725,1945 1726,1242 1726,1977 1726,1755 1727,1224 1727,1778 1728,1571 1728,1082 1729,1630 1729,1997 1730,1153 1730,1913 1731,1694 1731,1098 1732,2130 1732,2117 1732,2113 1733,1547 1733,2052 1734,1680 1734,2051 1734,1802 1734,1758 1735,1358 1735,1181 1736,1513 1736,1157 1737,1738 1738,1737 1738,1637 1738,1636 1739,1714 1739,1785 1740,1572 1740,1554 1741,2025 1741,1793 1741,1743 1742,1653 1742,2162 1742,1743 1743,1742 1743,1741 1744,1547 1744,1870 1745,1585 1745,1565 1746,1224 1747,2183 1747,2008 1747,1904 1747,1748 1748,1747 1748,1468 1749,1157 1749,1885 1749,1822 1750,1082 1751,1644 1752,1654 1752,1649 1752,2157 1753,1104 1753,1865 1754,1669 1754,1833 1754,1790 1755,1726 1755,2080 1755,1756 1756,1755 1756,2087 1757,1909 1757,1882 1757,1847 1758,1734 1758,1782 1759,1652 1759,1782 1760,1611 1760,1491 1760,2088 1760,1898 1761,1346 1761,1999 1762,1528 1762,1255 1763,1256 1763,1880 1764,1582 1765,1358 1765,2042 1766,1640 1766,1767 1767,1766 1767,1219 1768,1840 1769,2032 1769,1833 1770,1212 1770,1158 1771,1658 1771,1899 1772,2052 1772,1878 1773,1607 1773,1604 1774,1214 1774,1155 1775,1360 1775,1950 1776,1699 1776,1698 1776,1268 1776,1962 1776,1886 1776,1869 1777,1165 1777,1849 1778,1727 1778,1683 1779,1551 1779,1848 1780,1703 1780,1947 1781,1612 1781,1560 1782,1759 1782,1758 1782,1549 1782,2011 1783,1437 1783,1900 1784,422 1785,1739 1785,1910 1786,1685 1786,1658 1786,1280 1786,2041 1786,1907 1787,1563 1787,1896 1788,1650 1788,1959 1789,1671 1789,1816 1790,1754 1790,1653 1791,1793 1792,1793 1793,1792 1793,1791 1793,1741 1793,2025 1794,1441 1794,1208 1794,1796 1795,1724 1795,1708 1795,1651 1795,1976 1795,1796 1796,1795 1796,1794 1797,1709 1797,1651 1798,1408 1798,1255 1799,1264 1799,1224 1800,1674 1800,1286 1800,1807 1801,1288 1801,1996 1802,1734 1802,2001 1803,1680 1803,1291 1804,1642 1804,1640 1805,1299 1805,1298 1806,1847 1807,1800 1807,1648 1807,1300 1807,2163 1808,1668 1808,1839 1809,1628 1809,1063 1810,1237 1810,1106 1811,1440 1811,1438 1812,1307 1812,1851 1813,1633 1813,2011 1814,1309 1814,1920 1815,2031 1815,2023 1816,1789 1816,1672 1816,1315 1817,1316 1817,2150 1817,2149 1818,1515 1818,1506 1819,1561 1819,1317 1820,1661 1820,1605 1820,2043 1821,1326 1821,1923 1822,1749 1822,1325 1823,1604 1823,1964 1824,1636 1824,1914 1825,1120 1825,1118 1826,1696 1826,1659 1827,1660 1827,2046 1827,2020 1828,1418 1828,2006 1829,1707 1829,2034 1830,1710 1830,1130 1831,1338 1831,2155 1831,1838 1832,1544 1832,1930 1833,1769 1833,1754 1834,1682 1834,1616 1835,1284 1836,1952 1837,1114 1837,2049 1838,1831 1838,1601 1838,2099 1839,1808 1839,1554 1839,1840 1840,1839 1840,1768 1841,1703 1841,1555 1842,1347 1842,2122 1842,2079 1842,2070 1843,1713 1843,1981 1844,1522 1844,1415 1844,2156 1845,1190 1846,1557 1846,1883 1847,1806 1847,1757 1847,1613 1848,1779 1848,1633 1849,1777 1849,1719 1850,1661 1850,2119 1850,2118 1851,1812 1852,1400 1852,1066 1853,1705 1853,1165 1854,1590 1854,1889 1855,1584 1855,2000 1855,1951 1856,1584 1856,1951 1857,1689 1857,1563 1858,1693 1858,2023 1859,1353 1859,1992 1860,1342 1861,1690 1861,2098 1862,1665 1862,2039 1863,1127 1863,1933 1864,1646 1864,1361 1865,1753 1865,1164 1866,1206 1867,1587 1867,1359 1868,1999 1868,1917 1869,1776 1869,1692 1869,2106 1870,1744 1870,1709 1871,2067 1871,1873 1871,1872 1872,1871 1872,2129 1873,1871 1873,2128 1874,1415 1874,1142 1875,1681 1876,1508 1876,2141 1877,1499 1877,1106 1878,1772 1878,1685 1879,1652 1879,1993 1880,1763 1881,1571 1881,1325 1882,1757 1882,1619 1883,1846 1883,1654 1883,1954 1884,1439 1885,1749 1885,2047 1885,1924 1886,1776 1887,2157 1887,2145 1888,1546 1889,1854 1889,1716 1890,1668 1890,1554 1891,1511 1891,1199 1892,1660 1892,1200 1893,1380 1893,2030 1893,1917 1894,1936 1894,1895 1895,1894 1895,1385 1895,1384 1896,1787 1896,1711 1897,1687 1897,1673 1897,1656 1897,1655 1897,1950 1898,1760 1898,2088 1899,1771 1899,1960 1899,1958 1900,1783 1900,1901 1901,1900 1901,1066 1902,1618 1902,1235 1903,1368 1903,1990 1904,1747 1904,1712 1905,1158 1905,1075 1906,1676 1906,1941 1907,1786 1907,1693 1908,1466 1908,2062 1909,1757 1909,1644 1910,1785 1910,1978 1911,1639 1912,1314 1912,1219 1913,1730 1913,1248 1914,1824 1914,1098 1915,1685 1915,1665 1916,1647 1917,1893 1917,1868 1917,1999 1918,1691 1918,1583 1919,1495 1919,1363 1920,1814 1920,1416 1921,1716 1921,1711 1921,1417 1922,1600 1922,2151 1922,2119 1923,1821 1923,1419 1924,1885 1924,1424 1925,1516 1926,1526 1926,1940 1927,2080 1927,1977 1928,1586 1928,1272 1928,2177 1928,2003 1929,1682 1929,1360 1929,1938 1930,1832 1930,1721 1930,1638 1930,1591 1930,1434 1930,2196 1931,1550 1932,1114 1932,1944 1933,1863 1933,2116 1933,1944 1933,1935 1933,1934 1934,1933 1934,1289 1935,1933 1935,1437 1936,1894 1936,1937 1937,1936 1938,1929 1938,1542 1939,1940 1940,1939 1940,1926 1940,2027 1941,1906 1942,1130 1942,1081 1943,2030 1943,1999 1944,1933 1944,1932 1945,1725 1945,2148 1945,2114 1945,2098 1945,2089 1946,1575 1946,2033 1947,1780 1948,1621 1948,1105 1949,1524 1949,1186 1950,1897 1950,1775 1950,1564 1950,1360 1951,1856 1951,1855 1951,1584 1951,2012 1952,1836 1952,1458 1953,1463 1953,2187 1953,2186 1953,2143 1953,2140 1953,2137 1953,2056 1954,1883 1954,1649 1954,1614 1954,1468 1955,1718 1955,1145 1956,1160 1956,1120 1957,1554 1958,1899 1958,2038 1959,1788 1959,1090 1960,1899 1960,1596 1961,1715 1961,2117 1961,2029 1962,1776 1962,2029 1962,1964 1962,1963 1963,1962 1963,1419 1964,1962 1964,1823 1964,1633 1965,2034 1965,2019 1965,1966 1966,1965 1967,1695 1968,2126 1968,1983 1969,1115 1969,1067 1969,1970 1970,1969 1970,1608 1971,1155 1971,1991 1972,1601 1972,2133 1973,2010 1973,2009 1974,1430 1975,1723 1975,1368 1976,1795 1976,1704 1977,1927 1977,1726 1977,2051 1978,1910 1978,2175 1978,1979 1979,1978 1979,1523 1980,1510 1980,1408 1981,1843 1982,1698 1982,1986 1983,1968 1983,1408 1984,1491 1985,1578 1985,2161 1985,2078 1986,1982 1986,1492 1987,1580 1987,1442 1988,1494 1989,1206 1990,1903 1990,2026 1991,1971 1992,1859 1992,1257 1993,1879 1993,1551 1993,1995 1993,1994 1994,1993 1994,1499 1994,1291 1995,1993 1995,1499 1995,1242 1996,1801 1996,2049 1997,1729 1997,1337 1998,1608 1999,1943 1999,1917 1999,1868 1999,1761 1999,1502 1999,2026 2000,1855 2000,1589 2000,1584 2001,1802 2001,1602 2001,2114 2002,1616 2002,1060 2003,1928 2003,1702 2003,1626 2004,1625 2004,2075 2005,2010 2006,1828 2007,1706 2007,1356 2008,1747 2009,1973 2010,2005 2010,1973 2010,1496 2011,1813 2011,1782 2012,1951 2012,1599 2012,1584 2013,1671 2014,1623 2014,2127 2015,1650 2015,1165 2016,1425 2016,1333 2017,1351 2017,1090 2017,2018 2018,2017 2019,1965 2019,1707 2019,1511 2019,2020 2020,2019 2020,1827 2020,1512 2020,2047 2020,2046 2021,1378 2021,1124 2022,1513 2023,1858 2023,1815 2024,2025 2025,2024 2025,1793 2025,1741 2026,1999 2026,1990 2027,1940 2027,1516 2028,1071 2028,2060 2029,1962 2029,1961 2030,1943 2030,1893 2031,1815 2031,1697 2031,1523 2031,2175 2032,1769 2032,2041 2032,2033 2033,2032 2033,1946 2034,1965 2034,1829 2035,1644 2035,1060 2036,1311 2037,1681 2037,1206 2038,1958 2038,1653 2038,1596 2038,2078 2039,1862 2039,1653 2039,2040 2040,2039 2040,1545 2041,2032 2041,1786 2042,1765 2042,1474 2043,1820 2043,1605 2044,1359 2044,2045 2045,2044 2046,2020 2046,1827 2046,2047 2047,2046 2047,2020 2047,1885 2048,1592 2049,1996 2049,1837 2050,1478 2050,1186 2051,1977 2051,1734 2052,1772 2052,1733 2053,1573 2053,2196 2054,2151 2054,2119 2054,2089 2055,2107 2055,2081 2056,1953 2056,2084 2057,2060 2057,2059 2058,2106 2059,2057 2060,2057 2060,2028 2060,1307 2061,1104 2061,2107 2062,1908 2062,1100 2063,1147 2063,2124 2064,1147 2064,2125 2065,1609 2065,2097 2066,2187 2066,2186 2066,2140 2067,1871 2067,1662 2067,1643 2068,1649 2069,1428 2069,1066 2070,1842 2070,2101 2071,1095 2071,2166 2071,2165 2072,1460 2072,2073 2073,2072 2073,2108 2073,2101 2074,1460 2074,2101 2075,2004 2075,1186 2076,1530 2076,1210 2077,1446 2077,2191 2078,2038 2078,1985 2079,1842 2079,2095 2080,1927 2080,1755 2080,1725 2081,2055 2081,1460 2082,2137 2082,2085 2082,2083 2083,2082 2083,2094 2083,2084 2084,2083 2084,2056 2084,2085 2085,2084 2085,2082 2085,2143 2086,1478 2086,1205 2087,1756 2087,1583 2088,1898 2088,1760 2089,2054 2089,1945 2089,2129 2090,2144 2090,2134 2091,1095 2091,2190 2092,1639 2092,1160 2093,2142 2094,2083 2094,2107 2095,2079 2095,1460 2096,1386 2096,1093 2096,2190 2096,2135 2097,2065 2097,1690 2097,1600 2097,1323 2098,1945 2098,1861 2098,1600 2098,1323 2099,1838 2099,1623 2099,1574 2100,1709 2101,2074 2101,2073 2101,2070 2101,2122 2102,2155 2102,2146 2102,2127 2103,2157 2103,2145 2104,1378 2104,2109 2105,1460 2105,2107 2106,2058 2106,1869 2106,2154 2107,2105 2107,2094 2107,2061 2107,2055 2108,2073 2108,1460 2109,2104 2109,1096 2110,1549 2110,2113 2111,1715 2111,2163 2112,1470 2112,2164 2113,2110 2113,1732 2113,1410 2114,2001 2114,1945 2114,2151 2115,1623 2115,1574 2116,1933 2117,1961 2117,1732 2118,1850 2118,1451 2118,2151 2119,2054 2119,1922 2119,1850 2119,1451 2120,1489 2120,1356 2120,1278 2121,1104 2121,2137 2122,2101 2122,1842 2123,1460 2123,2134 2124,2063 2124,1461 2125,2064 2125,1461 2126,1968 2126,1528 2127,2102 2127,2014 2128,1873 2128,1472 2128,2153 2129,2089 2129,1872 2129,1472 2130,1732 2130,1602 2130,2153 2131,1473 2131,2145 2132,2145 2133,1972 2133,2154 2133,2146 2134,2123 2134,2090 2135,2096 2135,1093 2136,1717 2136,2156 2137,2121 2137,2082 2137,1953 2137,2140 2138,1489 2138,1467 2138,1309 2139,1489 2139,1357 2139,1309 2139,1101 2140,2137 2140,2066 2140,1953 2141,1876 2141,1285 2142,2093 2142,1554 2143,2085 2143,1953 2144,2090 2144,1460 2145,2132 2145,2131 2145,2103 2145,1887 2146,2133 2146,2102 2146,2147 2147,2146 2148,1945 2148,1609 2149,1817 2149,2150 2150,2149 2150,1817 2150,1589 2151,2118 2151,2114 2151,2054 2151,1922 2151,1602 2152,2162 2153,2130 2153,2128 2154,2133 2154,2106 2155,2102 2155,1831 2156,2136 2156,1844 2156,1321 2157,2103 2157,1887 2157,1752 2157,1614 2157,1484 2158,1562 2158,1532 2158,1298 2159,1386 2159,1095 2159,2170 2159,2169 2160,2162 2160,2161 2161,2160 2161,1985 2162,2160 2162,2152 2162,1742 2163,2111 2163,1807 2163,1664 2164,2112 2164,1181 2165,2071 2166,2071 2167,1702 2167,1687 2168,2190 2169,2159 2170,2159 2171,2192 2172,2192 2173,1530 2173,1471 2174,2175 2175,2174 2175,2031 2175,1978 2176,1536 2176,1100 2177,1928 2177,2178 2178,2177 2178,2183 2179,1489 2179,1100 2180,1345 2180,1172 2180,2181 2181,2180 2182,1268 2182,2197 2183,2178 2183,1747 2184,1435 2184,1164 2185,1309 2185,2198 2186,2066 2186,1953 2187,2066 2187,1953 2188,1471 2188,1468 2189,1352 2189,1164 2190,2168 2190,2096 2190,2091 2191,2077 2191,1311 2191,2192 2192,2191 2192,2172 2192,2171 2192,1311 2193,1527 2193,1413 2194,1713 2194,1224 2195,1447 2195,1117 2196,2053 2196,1930 2197,2182 2198,2185 2199,2204 2199,2200 2200,2199 2200,2201 2201,2200 2201,2203 2202,1506 2202,2204 2203,2201 2203,1277 2204,2202 2204,2199 2205,2211 2205,2210 2206,2382 2207,802 2207,2213 2208,2390 2208,2244 2209,4743 2209,2412 2210,2205 2210,2212 2211,2205 2211,2212 2212,2211 2212,2210 2212,2282 2212,2213 2213,2212 2213,2207 2213,395 2214,4897 2214,2396 2215,2411 2215,2357 2216,2387 2216,2370 2217,2345 2217,2288 2218,2347 2218,2346 2219,2397 2219,2373 2219,2332 2219,2244 2220,2229 2221,2405 2221,2403 2221,2402 2221,2376 2221,2295 2221,2261 2221,2232 2221,2223 2221,2222 2222,2221 2222,2418 2222,2321 2222,2229 2222,2224 2222,2223 2223,2222 2223,2221 2223,393 2223,2383 2223,2235 2223,2229 2224,2222 2224,2350 2224,2321 2225,2404 2225,2314 2226,2228 2227,2359 2227,2230 2228,2226 2228,2234 2229,2223 2229,2222 2229,2220 2230,2227 2230,2263 2231,396 2231,2357 2231,2347 2231,2317 2232,2221 2232,2405 2233,2409 2233,2361 2233,2305 2234,2228 2234,2360 2235,2223 2235,2383 2235,2369 2235,2328 2235,2312 2235,2309 2235,2298 2235,2262 2236,2238 2237,2238 2238,2237 2238,2236 2238,2396 2238,2368 2238,2291 2239,2313 2239,2285 2240,2366 2240,2325 2241,4631 2241,4507 2241,2242 2242,2241 2242,2355 2242,2310 2242,2249 2243,2335 2243,2325 2244,2219 2244,2208 2244,2332 2245,2421 2245,2315 2246,2420 2246,2388 2246,2308 2247,2386 2247,2256 2248,4536 2248,4535 2248,2250 2248,2249 2249,2248 2249,2242 2249,4652 2249,4573 2249,2412 2249,2370 2249,2253 2249,2252 2249,2251 2250,2248 2251,2249 2252,2249 2253,2249 2253,2311 2254,2379 2254,2281 2255,2327 2255,2292 2256,2247 2256,2303 2257,2407 2257,2282 2258,2262 2259,2262 2260,2262 2261,2221 2262,2260 2262,2259 2262,2258 2262,2235 2262,2364 2262,2298 2263,2230 2263,2357 2263,2306 2264,2286 2264,2282 2265,4854 2265,2306 2266,2414 2266,2272 2267,2381 2267,2333 2267,2270 2267,2269 2267,2268 2268,2267 2268,2416 2268,2382 2268,2271 2269,2267 2270,2267 2271,2268 2272,2266 2272,2334 2273,2275 2274,2407 2274,2372 2274,2275 2275,2274 2275,2273 2276,2389 2276,2290 2276,2277 2277,2276 2278,2371 2278,2320 2279,2414 2279,2361 2280,2284 2281,2254 2281,2336 2281,2282 2282,2281 2282,2264 2282,2257 2282,2212 2282,389 2282,2375 2282,2372 2282,2304 2282,2302 2282,2284 2282,2283 2283,2282 2283,420 2283,396 2283,2284 2284,2283 2284,2282 2284,2280 2285,2239 2285,2392 2285,2331 2285,2286 2286,2285 2286,2264 2287,2387 2287,2334 2288,2217 2288,2316 2289,2382 2289,2341 2290,2276 2290,2377 2290,2368 2290,2292 2291,2238 2291,2315 2292,2290 2292,2255 2293,2367 2293,2348 2294,2382 2294,2332 2295,2221 2295,2405 2296,2298 2297,2298 2298,2297 2298,2296 2298,2262 2298,2235 2298,2369 2298,2343 2299,2407 2299,2300 2300,2299 2300,2407 2301,2372 2302,2282 2302,2354 2303,2256 2303,2408 2303,2348 2304,2282 2304,790 2304,2354 2305,2233 2305,2310 2306,2265 2306,2263 2307,386 2307,2330 2308,2246 2308,2415 2308,2388 2309,2235 2309,2388 2309,2383 2310,2305 2310,2242 2311,2253 2311,2346 2312,2235 2312,520 2312,4837 2312,2364 2313,2239 2314,2225 2314,2359 2314,2321 2315,2291 2315,2245 2316,2288 2316,2317 2317,2316 2317,2231 2317,2370 2318,2332 2318,2327 2319,2366 2319,2321 2320,2278 2320,2321 2321,2320 2321,2319 2321,2314 2321,2224 2321,2222 2321,2393 2321,2324 2321,2323 2321,2322 2322,2321 2323,2321 2324,2321 2325,2243 2325,2240 2325,2406 2325,2358 2326,2329 2327,2318 2327,2255 2327,2420 2327,2380 2327,2352 2327,2329 2327,2328 2328,2327 2328,2235 2328,2383 2328,2329 2329,2328 2329,2327 2329,2326 2330,2307 2330,2405 2331,2285 2331,2392 2332,2318 2332,2294 2332,2244 2332,2219 2332,2389 2332,2373 2333,2267 2333,2381 2334,2287 2334,2272 2335,2243 2335,2371 2335,2349 2336,2281 2336,2374 2336,2367 2336,2338 2337,2404 2337,2357 2338,2336 2339,2419 2339,2388 2340,2401 2340,2363 2341,2289 2341,2382 2342,4035 2342,2363 2343,2298 2343,2344 2344,2343 2344,69 2345,2217 2345,2346 2346,2345 2346,2311 2346,2218 2347,2231 2347,2218 2348,2303 2348,2293 2349,2335 2349,2406 2349,2350 2350,2349 2350,2224 2351,840 2351,2364 2352,2327 2352,2388 2353,2388 2353,2382 2354,2304 2354,2302 2354,2372 2355,2242 2355,4634 2355,2411 2355,2387 2356,2402 2356,2376 2357,2337 2357,2263 2357,2231 2357,2215 2358,2325 2358,2371 2359,2314 2359,2227 2360,2234 2360,2362 2361,2279 2361,2233 2362,2360 2362,2363 2363,2362 2363,2342 2363,2340 2363,2365 2363,2364 2364,2363 2364,2351 2364,2312 2364,2262 2365,2363 2365,4859 2366,2319 2366,2240 2367,2336 2367,2293 2368,2290 2368,2238 2368,2389 2368,2377 2368,2369 2369,2368 2369,2298 2369,2235 2370,2317 2370,2249 2370,2216 2371,2358 2371,2335 2371,2278 2372,2354 2372,2301 2372,2282 2372,2274 2373,2332 2373,2219 2373,2397 2374,2336 2374,2378 2374,2375 2375,2374 2375,2282 2376,2356 2376,2221 2376,2403 2377,2368 2377,2290 2378,2374 2378,2386 2378,2379 2379,2378 2379,2254 2380,2327 2380,2388 2381,2333 2381,2267 2381,2382 2382,2381 2382,2353 2382,2341 2382,2294 2382,2289 2382,2268 2382,2206 2382,2419 2382,2398 2382,2395 2382,2385 2382,2384 2382,2383 2383,2382 2383,2328 2383,2309 2383,2235 2383,2223 2384,2382 2384,2418 2385,2382 2385,2418 2386,2378 2386,2247 2386,2408 2387,2355 2387,2287 2387,2216 2387,4660 2388,2380 2388,2353 2388,2352 2388,2339 2388,2309 2388,2308 2388,2246 2389,2368 2389,2332 2389,2276 2390,2208 2390,2395 2391,2394 2392,2331 2392,2285 2392,2405 2392,2394 2392,2393 2393,2392 2393,2321 2393,395 2393,2394 2394,2393 2394,2392 2394,2391 2395,2390 2395,2382 2396,2238 2396,2214 2396,4849 2397,2373 2397,2219 2397,2400 2397,2399 2397,2398 2398,2397 2398,2382 2399,2397 2400,2397 2401,2340 2402,2356 2402,2221 2403,2376 2403,2221 2404,2337 2404,2225 2405,2392 2405,2330 2405,2295 2405,2232 2405,2221 2406,2349 2406,2325 2407,2300 2407,2299 2407,2274 2407,2257 2408,2386 2408,2303 2409,2233 2409,4753 2409,4749 2409,4649 2409,4632 2409,4552 2409,2410 2410,2409 2411,2355 2411,2215 2412,2249 2412,2209 2413,752 2413,2414 2414,2413 2414,2279 2414,2266 2414,753 2414,4695 2415,2308 2415,2416 2416,2415 2416,2268 2417,790 2417,777 2418,2385 2418,2384 2418,2222 2419,2382 2419,2339 2420,2327 2420,2246 2421,2245 2421,2422 2422,2421 2423,4563 2423,4491 2424,2425 2425,2424 2425,2519 2425,2459 2426,490 2426,2655 2426,2485 2427,2730 2427,2729 2428,2656 2428,2586 2428,2489 2429,2617 2429,2545 2430,2595 2431,2816 2431,2432 2432,2431 2432,2590 2433,2661 2433,2578 2434,2702 2434,2701 2434,2698 2434,2668 2434,2662 2434,2624 2434,2623 2434,2619 2434,2588 2434,2524 2434,2471 2434,2436 2435,2670 2435,2638 2435,2490 2436,2434 2436,2672 2436,2586 2437,2439 2438,2439 2439,2438 2439,2437 2439,2991 2439,2885 2439,2683 2439,2682 2439,2639 2439,2633 2439,2631 2439,2596 2439,2529 2439,2449 2440,4458 2440,4148 2440,4129 2441,2443 2442,2443 2443,2442 2443,2441 2443,2627 2443,2616 2443,2521 2444,3094 2444,2956 2444,2707 2444,2685 2444,2681 2445,2708 2445,2685 2445,2604 2446,3206 2446,2559 2446,2502 2447,1184 2447,2967 2447,2814 2447,2793 2447,2457 2448,2597 2448,2545 2449,2439 2449,3189 2449,2687 2450,3043 2450,2719 2450,2717 2450,2576 2450,2451 2451,2450 2452,2694 2452,2561 2452,2551 2453,2454 2454,2453 2454,2697 2454,2586 2454,2560 2455,3228 2455,3105 2455,2838 2455,2709 2456,2709 2456,2617 2456,2458 2457,2447 2457,3011 2457,3004 2457,2930 2457,2793 2457,2458 2458,2457 2458,2456 2458,2703 2458,2677 2458,2617 2458,2593 2458,2525 2458,2487 2458,2459 2459,2458 2459,2425 2459,2599 2459,2593 2459,2591 2459,2558 2460,2461 2461,2460 2461,2590 2461,2586 2462,2463 2463,2462 2463,2991 2463,2654 2464,2713 2464,2712 2464,2543 2464,2486 2465,3279 2465,3244 2465,2939 2465,2717 2465,2716 2466,2717 2467,2717 2468,2718 2468,2561 2468,2527 2469,2723 2469,2639 2469,2596 2470,2471 2471,2470 2471,2434 2471,2966 2472,3216 2472,2588 2472,2493 2473,2645 2473,2477 2473,2476 2474,2642 2474,2559 2474,2552 2474,2483 2474,2477 2474,2476 2474,2475 2475,2474 2475,2591 2475,2558 2475,2519 2475,2503 2476,2474 2476,2473 2476,3217 2477,2474 2477,2473 2477,3218 2478,2864 2478,2810 2479,2555 2479,2481 2479,2480 2480,2479 2480,2591 2480,2482 2481,2479 2482,2480 2483,2474 2483,3219 2483,2559 2484,3091 2484,3090 2484,2736 2484,2505 2485,2426 2485,2958 2485,2764 2485,2743 2485,2741 2485,2561 2485,2548 2485,2496 2486,2464 2486,2743 2486,2543 2486,2528 2487,2458 2487,2632 2487,2617 2488,3252 2488,3214 2488,2989 2488,2576 2488,2489 2489,2488 2489,2428 2489,3115 2489,3060 2489,2586 2489,2583 2489,2521 2490,2435 2490,3017 2490,2948 2490,2730 2490,2498 2490,2495 2491,2759 2492,2646 2492,2643 2492,2493 2493,2492 2493,2472 2493,3225 2493,3224 2493,3016 2493,3014 2493,2627 2493,2588 2494,3017 2494,2760 2494,2561 2495,2490 2495,2763 2495,2762 2495,2761 2496,2485 2496,3017 2496,2766 2497,3172 2497,2769 2497,2767 2497,2595 2498,2490 2498,2769 2498,2729 2498,2513 2499,3078 2499,2544 2499,2538 2500,3271 2500,3113 2500,2776 2500,2775 2500,2579 2500,2530 2501,2645 2501,2643 2501,2502 2502,2501 2502,2446 2502,3227 2502,3226 2502,3016 2502,2552 2502,2503 2503,2502 2503,2475 2503,2611 2504,2782 2504,2609 2504,2604 2505,2484 2505,3049 2505,2785 2505,2783 2505,2522 2506,2802 2506,2777 2506,2622 2507,2508 2508,2507 2508,2613 2508,2519 2509,2627 2509,2616 2509,2511 2509,2510 2510,2509 2511,2509 2512,3229 2513,2498 2513,3017 2513,2795 2514,2595 2514,2515 2515,2514 2515,3231 2515,3036 2515,2810 2515,2595 2516,2519 2516,2518 2516,2517 2517,2516 2518,2516 2519,2516 2519,2508 2519,2475 2519,2425 2519,2602 2519,2599 2519,2558 2520,3005 2520,2595 2520,2533 2521,2489 2521,2443 2521,3233 2521,2641 2521,2559 2522,2505 2522,3047 2522,3045 2522,2807 2522,2806 2522,2617 2522,2614 2522,2601 2523,2611 2524,2434 2524,2813 2524,2586 2525,2458 2525,2617 2526,3234 2527,2468 2527,2815 2527,2804 2527,2789 2527,2600 2527,2561 2528,2486 2528,2804 2528,2612 2528,2606 2528,2549 2528,2543 2529,2439 2529,3186 2529,2917 2529,2874 2529,2554 2530,2500 2530,3181 2530,3113 2530,2918 2530,2916 2530,2792 2530,2579 2530,2531 2531,2530 2531,2726 2531,2725 2531,2636 2532,2612 2532,2557 2533,2520 2533,3179 2533,3112 2533,3005 2533,2823 2533,2821 2533,2765 2533,2595 2533,2542 2533,2534 2534,2533 2534,3017 2534,2823 2534,2821 2534,2659 2534,2564 2535,2536 2536,2535 2536,2701 2536,2629 2537,3055 2537,2841 2537,2548 2538,2499 2538,3124 2538,3123 2538,2920 2538,2554 2538,2551 2538,2550 2538,2544 2538,2539 2539,2538 2539,2606 2539,2549 2540,2828 2541,2828 2541,2583 2542,2533 2542,490 2542,3207 2542,3174 2542,3112 2542,3068 2542,2997 2542,2952 2542,2836 2542,2835 2542,2834 2542,2765 2542,2728 2543,2528 2543,2486 2543,2464 2543,490 2543,4219 2543,2832 2544,2538 2544,2499 2544,2923 2544,2920 2544,2844 2544,2843 2544,2791 2545,2448 2545,2429 2545,3154 2545,2862 2545,2860 2545,2858 2545,2637 2545,2592 2545,2554 2546,2548 2547,2548 2548,2547 2548,2546 2548,2537 2548,2485 2548,490 2548,3055 2548,2958 2548,2848 2548,2847 2549,2539 2549,2528 2549,2856 2549,2855 2549,2551 2550,2538 2550,2854 2550,2853 2550,2850 2550,2849 2550,2561 2550,2551 2551,2550 2551,2549 2551,2538 2551,2452 2551,2852 2552,2502 2552,2474 2552,3292 2553,3284 2553,3149 2553,3141 2553,3128 2553,3096 2553,2999 2553,2995 2553,2971 2553,2922 2553,2908 2553,2874 2553,2872 2553,2871 2553,2870 2553,2845 2553,2843 2553,2809 2553,2801 2553,2721 2554,2545 2554,2538 2554,2529 2554,3187 2554,2872 2554,2871 2554,2870 2554,2608 2554,2596 2554,2575 2555,2479 2556,4317 2556,4099 2556,2621 2557,2532 2557,1131 2557,2558 2558,2557 2558,2519 2558,2475 2558,2459 2559,2521 2559,2483 2559,2474 2559,2446 2559,3243 2559,3242 2559,2627 2560,2454 2560,2882 2560,2604 2561,2550 2561,2527 2561,2494 2561,2485 2561,2468 2561,2452 2561,2900 2561,2883 2561,2826 2562,133 2562,81 2562,57 2562,4461 2562,4448 2562,4445 2562,4129 2563,3147 2563,3146 2563,2790 2563,2620 2564,2534 2564,2892 2564,2658 2565,2941 2565,2894 2565,2817 2565,2677 2566,2567 2567,2566 2567,2941 2567,2593 2568,2895 2569,2895 2569,2666 2569,2593 2570,2896 2571,2898 2572,2899 2572,2898 2572,2593 2573,2899 2574,3281 2574,3097 2574,2972 2574,2936 2574,2906 2574,2812 2574,2692 2574,2575 2575,2574 2575,2554 2575,3154 2575,2964 2575,2907 2575,2905 2575,2904 2575,2794 2575,2733 2575,2601 2575,2597 2575,2592 2575,2581 2576,2488 2576,2450 2576,3277 2576,3205 2576,3043 2576,2989 2577,3248 2577,3247 2577,3014 2577,2641 2577,2588 2578,2433 2578,2902 2578,2586 2579,2530 2579,2500 2579,3113 2579,2580 2580,2579 2581,2575 2582,2583 2583,2582 2583,2541 2583,2489 2584,2908 2584,2608 2584,2596 2585,3215 2585,3199 2585,3158 2585,3095 2585,2911 2585,2889 2585,2880 2585,2722 2585,2720 2585,2717 2585,2710 2585,2674 2585,2586 2586,2585 2586,2578 2586,2524 2586,2489 2586,2461 2586,2454 2586,2436 2586,2428 2586,2911 2586,2604 2587,2588 2588,2587 2588,2577 2588,2493 2588,2472 2588,2434 2589,3251 2590,2461 2590,2432 2590,2912 2591,2480 2591,2475 2591,2459 2592,2575 2592,2545 2593,2572 2593,2569 2593,2567 2593,2459 2593,2458 2593,2909 2593,2704 2594,1308 2594,2909 2594,2605 2595,2533 2595,2520 2595,2515 2595,2514 2595,2497 2595,2430 2595,3179 2595,3157 2595,3005 2596,2584 2596,2554 2596,2469 2596,2439 2596,2934 2596,2928 2596,2927 2596,2918 2597,2575 2597,2448 2597,2917 2598,2599 2599,2598 2599,2519 2599,2459 2600,2527 2600,2933 2601,2575 2601,2522 2601,3049 2601,2964 2601,2936 2602,2519 2603,3115 2603,2943 2603,2608 2604,2586 2604,2560 2604,2504 2604,2445 2604,2956 2604,2955 2604,2953 2604,2609 2605,2594 2605,2953 2605,2618 2605,2606 2606,2605 2606,2539 2606,2528 2606,2960 2606,2618 2606,2612 2606,2607 2607,2606 2607,3188 2607,2959 2607,2794 2607,2733 2607,2654 2607,2611 2607,2608 2608,2607 2608,2603 2608,2584 2608,2554 2608,3060 2608,2960 2608,2790 2608,2651 2608,2624 2608,2623 2609,2604 2609,2504 2609,2963 2610,2640 2611,2607 2611,2523 2611,2503 2611,3289 2611,3288 2611,2612 2612,2611 2612,2606 2612,2532 2612,2528 2613,2508 2614,2522 2614,2970 2614,2617 2615,2616 2616,2615 2616,2509 2616,2443 2616,3266 2617,2614 2617,2525 2617,2522 2617,2487 2617,2458 2617,2456 2617,2429 2617,2974 2617,2973 2617,2886 2617,2885 2617,2637 2618,2606 2618,2605 2618,2974 2619,2434 2619,2976 2619,2966 2620,2563 2620,2978 2620,2789 2621,2556 2621,4317 2621,4265 2621,4172 2622,2506 2622,2993 2622,2702 2622,2638 2623,2608 2623,2434 2623,2979 2624,2608 2624,2434 2624,2980 2625,2627 2626,2627 2627,2626 2627,2625 2627,2559 2627,2509 2627,2493 2627,2443 2628,2990 2628,2982 2629,2536 2629,2987 2629,2986 2629,2948 2630,3272 2631,2439 2631,3283 2631,2634 2632,2487 2632,3204 2633,2439 2633,3187 2634,2631 2635,2638 2636,2531 2636,2934 2637,2617 2637,2545 2638,2635 2638,2622 2638,2435 2639,2469 2639,2439 2640,2610 2640,2966 2640,2965 2641,2577 2641,2521 2641,3208 2642,2474 2643,2501 2643,2492 2643,3212 2643,2644 2644,2643 2644,3237 2644,3236 2644,2648 2645,2501 2645,2473 2645,3240 2645,3239 2645,2648 2645,2647 2646,2492 2646,3254 2646,2648 2647,2645 2647,3260 2647,3259 2647,3258 2647,3257 2647,3256 2647,3255 2647,2649 2648,2646 2648,2645 2648,2644 2648,3261 2648,2649 2649,2648 2649,2647 2649,3274 2649,3273 2650,3289 2650,3288 2651,2608 2651,3114 2652,2795 2652,2760 2653,3188 2653,3040 2654,2607 2654,2463 2654,3019 2655,2426 2655,3178 2655,3176 2655,2825 2655,2766 2655,2740 2656,2428 2656,3155 2656,2669 2657,3077 2657,2918 2657,2916 2657,2908 2657,2693 2658,2564 2658,2667 2659,2534 2659,2759 2660,3201 2660,3024 2661,2433 2662,2434 2662,3200 2662,3104 2662,2969 2662,2959 2662,2944 2662,2837 2662,2819 2662,2813 2662,2705 2662,2684 2662,2668 2663,2668 2664,2799 2665,2799 2666,2569 2666,2788 2667,2658 2668,2663 2668,2662 2668,2434 2669,2656 2670,2435 2670,3221 2670,3008 2670,3005 2670,2795 2671,3143 2671,3026 2671,3004 2671,3001 2671,2796 2671,2780 2672,2436 2672,2674 2672,2673 2673,2672 2674,2672 2674,2585 2674,3215 2674,2890 2674,2710 2675,2914 2676,2677 2677,2676 2677,2565 2677,2458 2678,2942 2678,2714 2679,2680 2680,2679 2680,490 2680,2984 2681,2444 2682,2439 2683,2439 2684,2662 2684,2813 2685,2445 2685,2444 2685,2686 2686,2685 2686,3003 2686,2778 2687,2449 2687,3099 2687,3098 2687,3050 2687,2936 2687,2846 2687,2758 2688,3090 2689,3091 2690,2691 2691,2690 2691,2942 2691,2891 2691,2837 2692,2574 2692,3262 2692,3180 2692,3145 2692,2972 2692,2936 2693,2657 2693,3286 2693,3171 2693,3077 2693,2908 2694,2452 2694,3029 2694,3022 2694,3021 2694,2921 2695,2979 2696,2787 2696,2703 2697,2454 2697,3270 2697,3190 2697,3134 2697,3133 2697,3093 2697,2881 2698,2434 2698,2699 2699,2698 2700,3268 2700,2709 2701,2536 2701,2434 2702,2622 2702,2434 2702,3067 2703,2696 2703,2458 2703,3012 2703,2787 2703,2745 2704,2593 2704,3103 2704,2896 2705,2662 2706,2840 2706,2810 2707,2444 2708,2445 2709,2700 2709,2456 2709,2455 2710,2674 2710,2585 2710,3215 2710,3199 2711,3263 2711,3220 2711,3210 2711,2957 2712,2464 2713,2464 2714,2678 2714,2942 2715,3057 2715,2978 2715,2971 2715,2811 2716,2465 2716,3279 2716,3244 2717,2585 2717,2467 2717,2466 2717,2465 2717,2450 2717,4023 2717,4022 2717,3158 2717,2720 2717,2719 2718,2468 2719,2717 2719,2450 2720,2717 2720,2585 2721,2553 2721,2723 2722,2585 2722,2973 2722,2889 2722,2880 2722,2757 2723,2721 2723,2469 2723,2846 2724,3105 2724,2857 2724,2839 2724,2838 2724,2779 2724,2756 2724,2755 2725,2531 2725,3061 2725,2726 2726,2725 2726,2531 2726,3061 2727,3287 2727,3009 2727,2781 2728,2542 2728,3265 2728,3207 2728,3062 2728,2952 2729,2498 2729,2427 2729,2731 2730,2490 2730,2427 2730,2732 2731,2729 2732,2730 2733,2607 2733,2575 2733,3064 2734,2738 2735,2827 2736,2484 2736,3010 2736,2806 2736,2738 2736,2737 2737,2736 2737,3193 2737,2779 2737,2738 2738,2737 2738,2736 2738,2734 2739,2741 2739,2740 2740,2739 2740,2655 2740,3042 2740,3041 2740,2932 2740,2883 2740,2766 2740,2760 2741,2739 2741,2485 2741,2742 2742,2741 2743,2486 2743,2485 2743,2744 2744,2743 2745,2703 2745,3012 2746,3081 2747,3082 2748,3083 2749,3084 2750,3085 2751,3086 2752,3087 2753,3088 2754,3089 2755,2724 2756,2724 2756,2857 2757,2722 2757,2889 2758,2687 2758,3099 2759,2659 2759,2491 2760,2740 2760,2652 2760,2494 2760,3041 2760,2883 2760,2878 2760,2840 2760,2795 2761,2495 2762,2495 2763,2495 2764,2485 2764,3017 2764,2765 2765,2764 2765,2542 2765,2533 2765,3112 2766,2740 2766,2655 2766,2496 2766,3100 2767,2497 2767,2768 2768,2767 2769,2498 2769,2497 2769,2770 2770,2769 2771,2781 2771,2780 2771,2772 2772,2771 2773,3002 2774,3003 2774,2981 2775,2500 2776,2500 2777,2506 2778,2686 2778,2842 2779,2737 2779,2724 2779,2857 2779,2839 2779,2838 2780,2771 2780,2671 2780,3011 2780,3004 2780,2781 2781,2780 2781,2771 2781,2727 2781,3009 2781,3001 2781,2968 2781,2967 2782,2504 2783,2505 2783,3076 2783,2785 2783,2784 2784,2783 2784,2785 2785,2784 2785,2783 2785,2505 2786,2787 2787,2786 2787,2703 2787,2696 2787,3267 2787,2977 2788,2666 2789,2620 2789,2527 2790,2608 2790,2563 2791,2544 2791,2923 2791,2792 2792,2791 2792,2530 2792,3286 2792,2916 2793,2457 2793,2447 2793,3012 2794,2607 2794,2575 2794,3108 2795,2760 2795,2670 2795,2652 2795,2513 2796,2671 2796,3152 2796,3110 2796,3026 2796,2839 2797,3175 2797,2800 2797,2798 2798,2797 2798,3253 2798,3222 2798,3211 2798,3150 2798,2997 2798,2820 2798,2800 2799,2665 2799,2664 2799,490 2799,2947 2799,2946 2799,2800 2800,2799 2800,2798 2800,2797 2800,3253 2800,3222 2800,3211 2800,3151 2800,3150 2800,2997 2800,2820 2801,2553 2801,3284 2801,2995 2801,2922 2802,2506 2803,2982 2804,2528 2804,2527 2804,2805 2805,2804 2806,2736 2806,2522 2806,3238 2806,3010 2807,2522 2807,3168 2808,2842 2809,2553 2809,2843 2810,2706 2810,2515 2810,2478 2810,3036 2810,2986 2810,2864 2810,2840 2811,2715 2811,2971 2812,2574 2813,2684 2813,2662 2813,2524 2813,3116 2813,3079 2813,2976 2813,2903 2814,2447 2814,3012 2814,2983 2814,2977 2814,2967 2815,2527 2815,3198 2815,3142 2815,3106 2815,2878 2816,2431 2817,2565 2817,2818 2818,2817 2819,2662 2819,3200 2819,3131 2819,2959 2819,2944 2819,2866 2819,2837 2820,2800 2820,2798 2820,2952 2820,2865 2820,2825 2821,2534 2821,2533 2821,2822 2822,2821 2823,2534 2823,2533 2823,2824 2824,2823 2825,2820 2825,2655 2825,3178 2825,3177 2825,2952 2825,2865 2826,2561 2826,3017 2827,2735 2827,2828 2828,2827 2828,2541 2828,2540 2829,2834 2830,2835 2831,2836 2832,2543 2832,490 2832,2833 2833,2832 2834,2829 2834,2542 2834,490 2835,2830 2835,2542 2835,490 2836,2831 2836,2542 2836,490 2837,2819 2837,2691 2837,2662 2837,3131 2837,3104 2837,2969 2837,2944 2838,2779 2838,2724 2838,2455 2838,3228 2838,2857 2838,2839 2839,2838 2839,2796 2839,2779 2839,2724 2839,3250 2839,3152 2840,2810 2840,2760 2840,2706 2840,3025 2840,2883 2840,2878 2841,2537 2841,2935 2841,2932 2842,2808 2842,2778 2842,3195 2842,2981 2842,2940 2843,2809 2843,2553 2843,2544 2843,3096 2843,2908 2844,2544 2845,2553 2845,2971 2846,2723 2846,2687 2846,3213 2846,3173 2846,3018 2846,2936 2846,2862 2846,2860 2846,2858 2847,2548 2847,2932 2848,2548 2849,2550 2849,2851 2850,2550 2850,2851 2851,2850 2851,2849 2851,3276 2851,3156 2851,3130 2851,3126 2851,3038 2851,2937 2851,2914 2851,2852 2852,2851 2852,2551 2852,3278 2852,3276 2852,3275 2852,3156 2852,3130 2852,3126 2853,2550 2854,2550 2855,2549 2856,2549 2857,2838 2857,2779 2857,2756 2857,2724 2857,3080 2858,2846 2858,2545 2858,2859 2859,2858 2860,2846 2860,2545 2860,2861 2861,2860 2862,2846 2862,2545 2862,2863 2863,2862 2864,2810 2864,2478 2864,3122 2864,3120 2864,3028 2865,2825 2865,2820 2865,2952 2866,2819 2866,2959 2867,2976 2868,3135 2869,3136 2870,2554 2870,2553 2870,2876 2871,2554 2871,2553 2871,2877 2872,2554 2872,2553 2872,2873 2873,2872 2874,2553 2874,2529 2874,3186 2874,2917 2874,2875 2875,2874 2876,2870 2877,2871 2878,2840 2878,2815 2878,2760 2878,3198 2878,3153 2878,2986 2878,2883 2879,3117 2879,3111 2879,2881 2880,2722 2880,2585 2880,3230 2880,3197 2880,3095 2880,2998 2880,2889 2880,2882 2881,2879 2881,2697 2881,3190 2881,3117 2881,3111 2881,2882 2882,2881 2882,2880 2882,2560 2883,2878 2883,2840 2883,2760 2883,2740 2883,2561 2883,3153 2883,3041 2883,2986 2883,2900 2884,3147 2884,3146 2884,3058 2885,2617 2885,2439 2885,2887 2886,2617 2886,3189 2886,2888 2887,2885 2888,2886 2889,2880 2889,2757 2889,2722 2889,2585 2890,2674 2891,2691 2891,2942 2892,2564 2893,3245 2893,3000 2893,2996 2893,2894 2894,2893 2894,2565 2895,2569 2895,2568 2896,2704 2896,2570 2896,2897 2897,2896 2897,3023 2898,2572 2898,2571 2899,2573 2899,2572 2900,2883 2900,2561 2900,2901 2901,2900 2902,2578 2903,2813 2903,2976 2904,2575 2905,2575 2906,2574 2907,2575 2908,2843 2908,2693 2908,2657 2908,2584 2908,2553 2908,3096 2908,2918 2909,2594 2909,2593 2909,2910 2910,2909 2911,2586 2911,2585 2912,2590 2913,2923 2914,2851 2914,2675 2914,3280 2914,3276 2914,3156 2914,3038 2915,3138 2915,2965 2916,2792 2916,2657 2916,2530 2916,2926 2916,2918 2917,2874 2917,2597 2917,2529 2917,3186 2918,2916 2918,2908 2918,2657 2918,2596 2918,2530 2918,3181 2918,2928 2918,2927 2918,2926 2919,3167 2920,2544 2920,2538 2921,2694 2922,2801 2922,2553 2922,3051 2923,2913 2923,2791 2923,2544 2924,2938 2924,2937 2924,2925 2925,2924 2926,2918 2926,2916 2926,2929 2927,2918 2927,2596 2927,3163 2928,2918 2928,2596 2928,3164 2929,2926 2930,2457 2931,3047 2932,2847 2932,2841 2932,2740 2932,3174 2932,3042 2932,3041 2932,3020 2932,2935 2933,2600 2934,2636 2934,2596 2935,2932 2935,2841 2936,2846 2936,2692 2936,2687 2936,2601 2936,2574 2936,3241 2936,3173 2936,3034 2936,3033 2936,2972 2937,2924 2937,2851 2937,3156 2937,2938 2938,2937 2938,2924 2938,3140 2938,2994 2939,2465 2939,4024 2939,3223 2939,3169 2940,2842 2941,2567 2941,2565 2941,3170 2942,2891 2942,2714 2942,2691 2942,2678 2943,2603 2943,2980 2944,2837 2944,2819 2944,2662 2944,3200 2944,3131 2944,2945 2945,2944 2946,2799 2947,2799 2948,2629 2948,2490 2949,490 2949,2950 2950,2949 2951,2997 2952,2865 2952,2825 2952,2820 2952,2728 2952,2542 2952,3265 2952,3035 2953,2605 2953,2604 2953,2954 2954,2953 2955,2604 2955,2957 2955,2956 2956,2955 2956,2604 2956,2444 2956,3094 2957,2955 2957,2711 2957,3263 2958,2548 2958,2485 2959,2866 2959,2819 2959,2662 2959,2607 2959,3161 2959,3148 2959,3121 2959,3109 2959,3063 2960,2608 2960,2606 2960,2961 2961,2960 2962,2963 2963,2962 2963,2609 2964,2601 2964,2575 2964,3066 2965,2915 2965,2640 2966,2640 2966,2619 2966,2471 2967,2814 2967,2781 2967,2447 2967,3011 2967,2968 2968,2967 2968,2781 2969,2837 2969,2662 2969,3104 2970,2614 2970,3132 2971,2845 2971,2811 2971,2715 2971,2553 2971,2978 2972,2936 2972,2692 2972,2574 2973,2722 2973,2617 2973,3052 2974,2618 2974,2617 2974,2975 2975,2974 2976,2903 2976,2867 2976,2813 2976,2619 2977,2814 2977,2787 2977,3267 2977,3203 2977,2983 2978,2971 2978,2715 2978,2620 2978,3192 2978,3191 2979,2695 2979,2623 2979,3054 2980,2943 2980,2624 2981,2842 2981,2774 2981,3003 2982,2803 2982,2628 2983,2977 2983,2814 2983,3235 2983,3232 2984,2680 2984,2990 2984,2985 2985,2984 2986,2883 2986,2878 2986,2810 2986,2629 2986,3153 2986,3107 2987,2629 2987,3122 2988,2990 2989,2576 2989,2488 2990,2988 2990,2984 2990,2628 2991,2463 2991,2439 2991,3196 2992,3197 2993,2622 2993,3119 2993,3118 2994,2938 2995,2801 2995,2553 2996,2893 2996,3245 2997,2951 2997,2800 2997,2798 2997,2542 2997,3211 2998,2880 2998,3230 2998,3197 2999,2553 3000,2893 3001,2781 3001,2671 3001,3143 3001,3002 3002,3001 3002,2773 3003,2981 3003,2774 3003,2686 3004,2780 3004,2671 3004,2457 3004,3125 3005,2670 3005,2595 3005,2533 3005,2520 3005,3221 3005,3157 3005,3056 3005,3008 3006,3007 3007,3006 3007,3247 3008,3005 3008,2670 3008,3269 3008,3221 3008,3209 3009,2781 3009,2727 3009,3264 3009,3165 3010,2806 3010,2736 3010,3238 3011,2967 3011,2780 3011,2457 3012,2814 3012,2793 3012,2745 3012,2703 3013,3014 3014,3013 3014,2577 3014,2493 3015,3016 3016,3015 3016,2502 3016,2493 3017,2826 3017,2764 3017,2534 3017,2513 3017,2496 3017,2494 3017,2490 3018,2846 3018,3213 3018,3173 3019,2654 3020,2932 3020,3174 3021,2694 3022,2694 3023,2897 3024,2660 3024,3071 3025,2840 3026,2796 3026,2671 3027,3049 3027,3048 3028,2864 3028,3122 3029,2694 3030,3284 3030,3129 3030,3128 3031,3101 3032,3102 3033,2936 3033,3034 3034,3033 3034,2936 3035,2952 3036,2810 3036,2515 3037,3041 3038,2914 3038,2851 3038,3276 3039,3105 3040,2653 3041,3037 3041,2932 3041,2883 3041,2760 3041,2740 3041,3042 3042,3041 3042,2932 3042,2740 3043,2576 3043,2450 3044,3137 3044,3075 3044,3045 3045,3044 3045,2522 3046,3135 3046,3073 3046,3047 3047,3046 3047,2931 3047,2522 3048,3027 3049,3027 3049,2601 3049,2505 3050,2687 3050,3098 3051,2922 3052,2973 3053,3197 3054,2979 3055,2548 3055,2537 3056,3005 3057,2715 3058,2884 3059,3129 3059,3128 3060,2608 3060,2489 3061,2726 3061,2725 3062,2728 3063,2959 3063,3148 3063,3109 3064,2733 3065,3202 3065,3186 3065,3159 3066,2964 3067,2702 3068,2542 3069,3167 3069,3084 3069,3070 3070,3069 3070,3089 3070,3073 3071,3024 3071,3201 3071,3137 3071,3086 3072,3166 3072,3081 3072,3073 3073,3072 3073,3070 3073,3046 3074,3085 3074,3083 3074,3075 3075,3074 3075,3044 3075,3088 3076,2783 3077,2693 3077,2657 3078,2499 3079,2813 3079,3116 3080,2857 3081,3072 3081,2746 3082,2747 3082,3101 3083,3074 3083,2748 3084,3069 3084,2749 3085,3074 3085,2750 3086,3071 3086,2751 3087,2752 3087,3102 3088,3075 3088,2753 3089,3070 3089,2754 3090,2688 3090,2484 3090,3101 3091,2689 3091,2484 3091,3102 3092,3128 3092,3127 3093,2697 3094,2956 3094,2444 3095,2880 3095,2585 3096,2908 3096,2843 3096,2553 3097,2574 3097,3281 3098,3050 3098,2687 3099,2758 3099,2687 3100,2766 3101,3090 3101,3082 3101,3031 3102,3091 3102,3087 3102,3032 3103,2704 3104,2969 3104,2837 3104,2662 3105,3039 3105,2724 3105,2455 3106,2815 3107,2986 3108,2794 3109,3063 3109,2959 3109,3148 3110,2796 3111,2881 3111,2879 3111,3117 3112,2765 3112,2542 3112,2533 3113,2579 3113,2530 3113,2500 3114,2651 3115,2603 3115,2489 3116,3079 3116,2813 3117,3111 3117,2881 3117,2879 3117,3246 3117,3144 3118,2993 3118,3119 3119,3118 3119,2993 3120,2864 3121,2959 3121,3161 3122,3028 3122,2987 3122,2864 3122,3249 3123,2538 3123,3128 3124,2538 3124,3128 3125,3004 3126,2852 3126,2851 3126,3130 3127,3092 3127,3129 3127,3128 3128,3127 3128,3124 3128,3123 3128,3092 3128,3059 3128,3030 3128,2553 3128,3284 3128,3149 3128,3129 3129,3128 3129,3127 3129,3059 3129,3030 3129,3284 3130,3126 3130,2852 3130,2851 3131,2944 3131,2837 3131,2819 3132,2970 3133,2697 3133,3270 3133,3134 3134,3133 3134,2697 3134,3270 3135,3046 3135,2868 3136,2869 3136,3137 3137,3136 3137,3071 3137,3044 3138,2915 3139,3156 3140,2938 3141,2553 3141,3284 3142,2815 3143,3001 3143,2671 3144,3117 3144,3246 3145,2692 3145,3180 3146,2884 3146,2563 3147,2884 3147,2563 3148,3109 3148,3063 3148,2959 3149,3128 3149,2553 3150,2800 3150,2798 3151,2800 3152,2839 3152,2796 3152,3250 3153,2986 3153,2883 3153,2878 3154,2575 3154,2545 3155,2656 3156,3139 3156,2937 3156,2914 3156,2852 3156,2851 3157,3005 3157,2595 3158,2717 3158,2585 3159,3065 3159,3202 3159,3186 3160,3174 3161,3121 3161,2959 3162,3197 3163,2927 3164,2928 3165,3009 3166,3072 3167,3069 3167,2919 3168,2807 3169,2939 3170,2941 3171,2693 3171,3286 3172,2497 3173,3018 3173,2936 3173,2846 3173,3213 3174,3160 3174,3020 3174,2932 3174,2542 3174,3194 3175,2797 3176,2655 3177,2825 3178,2825 3178,2655 3179,2595 3179,2533 3180,3145 3180,2692 3181,2918 3181,2530 3182,3189 3183,3188 3184,3187 3185,3186 3186,3185 3186,3159 3186,3065 3186,2917 3186,2874 3186,2529 3186,3202 3187,3184 3187,2633 3187,2554 3188,3183 3188,2653 3188,2607 3188,3283 3189,3182 3189,2886 3189,2449 3190,2881 3190,2697 3191,2978 3192,2978 3193,2737 3194,3174 3195,2842 3196,2991 3197,3162 3197,3053 3197,2998 3197,2992 3197,2880 3197,3230 3198,2878 3198,2815 3199,2710 3199,2585 3200,2944 3200,2819 3200,2662 3201,3071 3201,2660 3202,3186 3202,3159 3202,3065 3203,2977 3204,2632 3205,2576 3205,3277 3206,2446 3207,2728 3207,2542 3208,2641 3209,3008 3209,3269 3210,2711 3211,2997 3211,2800 3211,2798 3212,2643 3213,3173 3213,3018 3213,2846 3214,2488 3214,3252 3215,2710 3215,2674 3215,2585 3216,2472 3217,2476 3217,3218 3218,3217 3218,2477 3219,2483 3219,3272 3220,2711 3221,3008 3221,3005 3221,2670 3222,2800 3222,2798 3223,2939 3224,2493 3225,2493 3226,2502 3227,2502 3228,2838 3228,2455 3229,2512 3229,3266 3230,3197 3230,2998 3230,2880 3231,2515 3232,2983 3232,3235 3233,2521 3234,2526 3234,3266 3234,3251 3235,3232 3235,2983 3236,2644 3237,2644 3238,3010 3238,2806 3239,2645 3240,2645 3241,2936 3242,2559 3243,2559 3244,2716 3244,2465 3244,3279 3245,2996 3245,2893 3246,3144 3246,3117 3247,3007 3247,2577 3248,2577 3249,3122 3250,3152 3250,2839 3251,3234 3251,2589 3251,3266 3252,3214 3252,2488 3253,2800 3253,2798 3254,2646 3255,2647 3256,2647 3257,2647 3258,2647 3259,2647 3260,2647 3261,2648 3262,2692 3263,2957 3263,2711 3264,3009 3265,2952 3265,2728 3266,3251 3266,3234 3266,3229 3266,2616 3267,2977 3267,2787 3268,2700 3269,3209 3269,3008 3270,3134 3270,3133 3270,2697 3271,2500 3272,3219 3272,2630 3273,2649 3274,2649 3275,2852 3275,3276 3276,3275 3276,3038 3276,2914 3276,2852 3276,2851 3277,3205 3277,2576 3278,2852 3279,3244 3279,2716 3279,2465 3280,2914 3281,3097 3281,2574 3281,3282 3282,3281 3283,3188 3283,2631 3284,3141 3284,3129 3284,3128 3284,3030 3284,2801 3284,2553 3285,3286 3286,3285 3286,3171 3286,2792 3286,2693 3287,2727 3288,2650 3288,2611 3288,3290 3289,2650 3289,2611 3289,3291 3290,3288 3291,3289 3292,2552 3293,3593 3293,3488 3293,3411 3294,3552 3294,3388 3294,3334 3294,3295 3295,3294 3295,4861 3295,3314 3296,3568 3296,3506 3296,3433 3296,3325 3296,3297 3297,3296 3297,3333 3297,3326 3297,3310 3298,3538 3298,3299 3299,3298 3299,3558 3299,3441 3299,3440 3299,3329 3299,3314 3300,3446 3301,3708 3301,3622 3301,3446 3302,3672 3302,3631 3302,3450 3303,3468 3304,3468 3305,3468 3306,3467 3307,3652 3307,3627 3307,3540 3307,3470 3307,3469 3307,3420 3307,3344 3308,3692 3308,3654 3308,3596 3308,3580 3308,3474 3309,3645 3309,3465 3309,3464 3309,3310 3310,3309 3310,3297 3310,3484 3310,3478 3310,3477 3310,3460 3310,3357 3310,3333 3311,3455 3311,3312 3312,3311 3312,3697 3312,3632 3312,3593 3312,3484 3312,3359 3312,3351 3312,3336 3312,3333 3312,3321 3313,3693 3313,3314 3314,3313 3314,3299 3314,3295 3314,3435 3315,3656 3315,3625 3315,3610 3315,3355 3316,3620 3316,3557 3316,3536 3316,3483 3316,3366 3316,3317 3317,3316 3317,3724 3317,3421 3317,3393 3317,3392 3317,3352 3317,3336 3318,4864 3318,3473 3319,3677 3319,3574 3319,3573 3319,3497 3319,3418 3320,3607 3320,3547 3320,3546 3320,3542 3320,3360 3321,3312 3321,3698 3321,3632 3321,3471 3321,3328 3322,4830 3322,3668 3322,3454 3322,3323 3323,3322 3323,3345 3323,3331 3324,3564 3324,3342 3325,3296 3325,3572 3326,3297 3326,3576 3327,3740 3327,3713 3327,3328 3328,3327 3328,3321 3328,3742 3328,3561 3329,3299 3329,3587 3329,3586 3329,3582 3329,3558 3329,3498 3329,3472 3329,3466 3329,3365 3330,3705 3330,3581 3330,3580 3330,3331 3331,3330 3331,3323 3331,4831 3331,4603 3331,3697 3331,3435 3332,3722 3332,3616 3332,3333 3333,3332 3333,3312 3333,3310 3333,3297 3333,4876 3334,3294 3334,4759 3334,3629 3335,3336 3336,3335 3336,3317 3336,3312 3336,4655 3336,3351 3337,4865 3337,3672 3337,3628 3337,3429 3337,3349 3338,3634 3339,3643 3340,3342 3341,4875 3341,3529 3341,3342 3342,3341 3342,3340 3342,3324 3342,4876 3342,3413 3343,3659 3343,3648 3343,3647 3343,3639 3343,3638 3343,3583 3343,3574 3343,3573 3344,3307 3344,3648 3344,3647 3344,3472 3345,3323 3345,4888 3345,3622 3345,3403 3346,3709 3346,3360 3347,3729 3347,3678 3347,3661 3347,3402 3347,3349 3347,3348 3348,3347 3348,4883 3349,3347 3349,3337 3349,3663 3350,3701 3350,3700 3350,3688 3350,3674 3350,3673 3351,3336 3351,3312 3351,3702 3351,3689 3351,3674 3351,3673 3351,3671 3351,3598 3351,3561 3352,3317 3352,4582 3352,3652 3352,3612 3352,3365 3352,3362 3352,3361 3353,3655 3353,3563 3353,3486 3353,3423 3354,3355 3355,3354 3355,3315 3355,3716 3355,3715 3355,3714 3355,3638 3355,3601 3355,3569 3355,3437 3355,3432 3356,3723 3356,3722 3356,3683 3356,3590 3356,3357 3357,3356 3357,3310 3358,3727 3358,3726 3358,3725 3358,3395 3358,3359 3359,3358 3359,3312 3359,3725 3359,3466 3360,3346 3360,3320 3360,4677 3360,3730 3360,3361 3361,3360 3361,3352 3361,4678 3362,3352 3362,4476 3363,4509 3363,3475 3364,4570 3364,3579 3365,3352 3365,3329 3365,3716 3366,3316 3367,3368 3368,3367 3368,3370 3368,3369 3369,3368 3369,4875 3370,3368 3370,3523 3371,3621 3371,3608 3371,3567 3371,3516 3372,4878 3373,3431 3374,3431 3375,3431 3376,3432 3377,3480 3378,4478 3378,3380 3378,3379 3379,3378 3380,3378 3381,4850 3382,3740 3383,3562 3384,3591 3385,4850 3386,3445 3387,4878 3388,3294 3389,3580 3390,3690 3391,3694 3392,3317 3393,3317 3394,3709 3395,3358 3396,3656 3397,3656 3398,3625 3399,3675 3399,3565 3400,3609 3400,3534 3400,3401 3401,3400 3401,3686 3401,3554 3401,3402 3402,3401 3402,3347 3403,3345 3403,3748 3403,3747 3404,3682 3404,3456 3405,3658 3406,3410 3407,3410 3408,3411 3409,3411 3410,3407 3410,3406 3410,3712 3410,3677 3410,3666 3410,3411 3411,3410 3411,3409 3411,3408 3411,3293 3411,3676 3411,3519 3411,3517 3412,3626 3412,3468 3413,3342 3413,3684 3414,3551 3414,3502 3415,3659 3415,3468 3416,3431 3416,3430 3416,3417 3417,3416 3417,3431 3418,3319 3418,3676 3418,3565 3419,3627 3420,3307 3420,3532 3421,3317 3421,3671 3422,3553 3422,3528 3423,3353 3423,3426 3423,3425 3424,3426 3425,3423 3426,3424 3426,3423 3426,3733 3426,3600 3427,3623 3427,3608 3428,3429 3429,3428 3429,3337 3429,3619 3430,3416 3431,3417 3431,3416 3431,3375 3431,3374 3431,3373 3431,3695 3431,3610 3432,3376 3432,3355 3432,3695 3433,3296 3433,3657 3434,3564 3434,3529 3435,3331 3435,3314 3436,3567 3436,3485 3437,3355 3437,3665 3438,3588 3438,3527 3439,3590 3440,3299 3441,3299 3442,3614 3442,3444 3443,3740 3444,3442 3445,3386 3445,3737 3445,3448 3445,3447 3446,3301 3446,3300 3446,3737 3447,3445 3448,3445 3449,3710 3449,3545 3450,3302 3451,3615 3452,3497 3453,3646 3453,3454 3454,3453 3454,3322 3454,4845 3455,3311 3455,3621 3456,3404 3456,3663 3456,3458 3456,3457 3457,3456 3458,3456 3459,3465 3460,3310 3461,3462 3462,3461 3462,3465 3462,3463 3463,3462 3463,3464 3464,3463 3464,3309 3465,3462 3465,3459 3465,3309 3466,3359 3466,3329 3467,3306 3467,3620 3467,3527 3467,3503 3467,3502 3467,3468 3468,3467 3468,3415 3468,3412 3468,3305 3468,3304 3468,3303 3468,3614 3468,3613 3468,3592 3468,3591 3468,3526 3468,3479 3468,3470 3468,3469 3469,3468 3469,3307 3470,3468 3470,3307 3471,3321 3471,3598 3472,3344 3472,3329 3473,3318 3473,3544 3474,3308 3475,3363 3476,3710 3477,3310 3478,3310 3479,3468 3480,3377 3480,3699 3480,3481 3481,3480 3482,3536 3483,3316 3483,3739 3484,3312 3484,3310 3484,3684 3484,3485 3485,3484 3485,3436 3485,3567 3485,3486 3486,3485 3486,3353 3486,3733 3486,3560 3486,3487 3487,3486 3487,3679 3488,3293 3488,3498 3489,3737 3489,3545 3490,3491 3491,3490 3491,3727 3491,3675 3492,3650 3493,3500 3493,3499 3493,3496 3494,3734 3494,3501 3494,3499 3495,3735 3495,3501 3495,3500 3496,3493 3497,3452 3497,3319 3497,3626 3497,3525 3497,3501 3497,3500 3497,3499 3498,3488 3498,3329 3498,3627 3498,3515 3499,3497 3499,3494 3499,3493 3500,3497 3500,3495 3500,3493 3501,3497 3501,3495 3501,3494 3502,3467 3502,3414 3503,3467 3503,3550 3504,3732 3504,3696 3505,3506 3506,3505 3506,3296 3506,3616 3507,3510 3508,3513 3509,3511 3510,3507 3510,3512 3511,3509 3511,3738 3511,3563 3511,3513 3511,3512 3512,3511 3512,3510 3512,3564 3512,3560 3513,3511 3513,3508 3514,3701 3514,3700 3514,3551 3514,3550 3515,3498 3515,3742 3516,3371 3517,3411 3517,3584 3517,3520 3518,3666 3519,3411 3520,3517 3521,3557 3522,3739 3522,3571 3523,3370 3523,3623 3524,3525 3525,3524 3525,3497 3525,3637 3526,3468 3526,3665 3527,3467 3527,3438 3528,3422 3529,3434 3529,3341 3530,3703 3530,3531 3531,3530 3532,3420 3532,3670 3533,3706 3534,3400 3535,3717 3536,3482 3536,3316 3536,3703 3537,3746 3537,3538 3538,3537 3538,3298 3538,3741 3539,3654 3540,3307 3540,3724 3541,3667 3541,3653 3541,3604 3542,3320 3542,3717 3542,3562 3543,4862 3544,3473 3544,3556 3545,3489 3545,3449 3545,3618 3545,3617 3546,3320 3547,3320 3548,3612 3549,3706 3550,3514 3550,3503 3551,3514 3551,3414 3552,3294 3552,3692 3553,3422 3553,1 3553,3675 3554,3401 3554,3651 3555,3609 3555,3605 3556,3544 3556,3708 3557,3521 3557,3316 3558,3329 3558,3299 3559,3579 3560,3512 3560,3486 3561,3351 3561,3328 3562,3542 3562,3383 3562,3744 3563,3511 3563,3353 3563,3564 3564,3563 3564,3512 3564,3434 3564,3324 3564,3655 3565,3418 3565,3399 3565,3675 3566,3719 3567,3485 3567,3436 3567,3371 3568,3296 3568,3731 3568,3577 3569,3355 3569,3588 3570,3601 3571,3522 3571,3601 3572,3325 3572,3657 3572,3589 3573,3343 3573,3319 3574,3343 3574,3319 3575,3589 3576,3326 3576,3731 3576,3718 3576,3578 3576,3577 3577,3576 3577,3568 3578,3576 3579,3559 3579,3364 3580,3389 3580,3330 3580,3308 3581,3330 3581,3654 3582,3329 3582,3612 3583,3343 3583,2 3583,3625 3584,3517 3584,3585 3585,3584 3585,3726 3586,3329 3586,1 3587,3329 3587,1 3588,3569 3588,3438 3589,3575 3589,3572 3590,3439 3590,3356 3590,3624 3591,3468 3591,3384 3591,3615 3592,3468 3592,3662 3593,3312 3593,3293 3594,3726 3595,3727 3596,3308 3596,3597 3597,3596 3597,3693 3598,3471 3598,3351 3599,3719 3599,3628 3600,3426 3600,3738 3601,3571 3601,3570 3601,3355 3602,3719 3603,3660 3603,3605 3604,3541 3604,3611 3605,3603 3605,3555 3605,3606 3606,3605 3607,3320 3607,3736 3607,3709 3608,3427 3608,3371 3609,3555 3609,3400 3609,3661 3610,3431 3610,3315 3611,3604 3611,3669 3612,3582 3612,3548 3612,3352 3613,3468 3613,3662 3614,3468 3614,3442 3615,3591 3615,3451 3616,3506 3616,3332 3617,3545 3618,3545 3618,3649 3619,3429 3619,3705 3620,3467 3620,3316 3621,3455 3621,3371 3621,3732 3622,3345 3622,3301 3623,3523 3623,3427 3624,3590 3625,3583 3625,3398 3625,3315 3626,3497 3626,3412 3627,3498 3627,3419 3627,3307 3628,3599 3628,3337 3629,3334 3629,3741 3630,3631 3631,3630 3631,3302 3631,3722 3632,3321 3632,3312 3633,3722 3633,3683 3634,3338 3634,3635 3635,3634 3635,3721 3636,3637 3637,3636 3637,3525 3637,1 3638,3355 3638,3343 3639,3343 3639,3656 3640,3641 3641,3640 3641,3678 3642,4885 3643,3339 3643,4628 3644,3645 3645,3644 3645,3309 3645,3722 3646,3453 3647,3344 3647,3343 3648,3344 3648,3343 3649,3618 3649,4885 3649,3669 3650,3492 3650,3651 3651,3650 3651,3554 3651,3663 3652,3352 3652,3307 3653,3541 3654,3581 3654,3539 3654,3308 3655,3564 3655,3353 3656,3639 3656,3397 3656,3396 3656,3315 3657,3572 3657,3433 3658,3405 3658,3686 3659,3415 3659,3343 3660,3603 3661,3609 3661,3347 3661,3743 3661,3682 3662,3613 3662,3592 3663,3651 3663,3456 3663,3349 3664,3726 3665,3526 3665,3437 3666,3518 3666,3410 3667,3541 3667,3745 3668,3322 3668,3745 3669,3649 3669,3611 3670,3532 3670,3702 3671,3421 3671,3351 3672,3337 3672,3302 3673,3351 3673,3350 3674,3351 3674,3350 3675,3565 3675,3553 3675,3491 3675,3399 3675,3699 3676,3418 3676,3411 3677,3410 3677,3319 3678,3641 3678,3347 3679,3487 3679,3681 3679,3680 3680,3679 3681,3679 3682,3661 3682,3404 3683,3633 3683,3356 3683,3722 3683,3685 3684,3484 3684,3413 3685,3683 3685,3723 3686,3658 3686,3401 3687,3728 3688,3350 3689,3351 3689,3698 3690,3390 3690,3691 3691,3690 3691,3692 3692,3691 3692,3552 3692,3308 3693,3597 3693,3313 3694,3391 3694,3695 3695,3694 3695,3432 3695,3431 3696,3504 3696,3697 3697,3696 3697,3331 3697,3312 3698,3689 3698,3321 3699,3675 3699,3480 3700,3514 3700,3350 3701,3514 3701,3350 3702,3670 3702,3351 3703,3536 3703,3530 3704,3705 3705,3704 3705,3619 3705,3330 3706,3549 3706,3533 3706,3707 3707,3706 3707,3708 3708,3707 3708,3556 3708,3301 3709,3607 3709,3394 3709,3346 3710,3476 3710,3449 3711,3713 3711,3712 3712,3711 3712,3410 3713,3711 3713,3327 3714,3355 3715,3355 3716,3365 3716,3355 3717,3542 3717,3535 3718,3576 3719,3602 3719,3599 3719,3566 3720,3737 3721,3635 3721,3722 3722,3721 3722,3683 3722,3645 3722,3633 3722,3631 3722,3356 3722,3332 3723,3685 3723,3356 3724,3540 3724,3317 3725,3359 3725,3358 3726,3664 3726,3594 3726,3585 3726,3358 3727,3595 3727,3491 3727,3358 3728,3687 3728,3729 3729,3728 3729,3347 3730,3360 3731,3576 3731,3568 3732,3621 3732,3504 3733,3486 3733,3426 3734,3494 3735,3495 3736,3607 3737,3720 3737,3489 3737,3446 3737,3445 3738,3600 3738,3511 3739,3522 3739,3483 3740,3443 3740,3382 3740,3327 3741,3629 3741,3538 3742,3515 3742,3328 3743,3661 3744,3562 3745,3668 3745,3667 3746,3537 3747,3403 3747,3748 3748,3747 3748,3403 3749,3932 3749,3778 3750,3793 3750,3767 3750,3762 3751,3793 3751,3762 3752,3936 3752,3804 3752,3773 3753,3774 3753,3755 3753,3754 3754,3753 3754,3784 3755,3753 3755,3778 3756,3757 3757,3756 3757,3931 3757,3930 3757,3792 3758,3883 3758,3792 3758,3759 3759,3758 3760,3761 3761,3760 3761,3788 3761,3784 3762,3751 3762,3750 3762,3935 3762,3932 3762,3926 3762,3788 3762,3764 3763,4199 3763,3946 3763,3789 3763,3766 3763,3765 3764,3762 3765,3763 3766,3763 3766,3938 3766,3838 3766,3801 3767,3750 3767,3838 3768,3943 3768,3838 3769,692 3769,483 3769,3770 3770,3769 3770,113 3770,3782 3771,3847 3771,3825 3771,3783 3771,3772 3772,3771 3773,3752 3773,3795 3774,3753 3774,3863 3774,3797 3775,3922 3775,3921 3775,3809 3775,3792 3775,3777 3775,3776 3776,3775 3776,3797 3777,3775 3777,3797 3778,3755 3778,3749 3778,3943 3779,3893 3779,3871 3779,3855 3779,3851 3779,3816 3779,3781 3780,3790 3780,3781 3781,3780 3781,3779 3781,726 3781,3870 3781,3801 3781,3798 3781,3785 3782,3770 3782,3870 3783,3771 3783,3879 3783,3868 3783,3842 3783,3841 3783,3836 3783,3785 3783,3784 3784,3783 3784,3761 3784,3754 3784,3797 3784,3785 3785,3784 3785,3783 3785,3781 3785,4199 3785,3905 3785,3798 3785,3787 3786,3896 3786,3891 3786,3886 3786,3857 3786,3787 3787,3786 3787,3785 3787,3789 3788,3762 3788,3761 3788,3935 3788,3895 3789,3787 3789,3763 3789,3895 3790,3780 3790,3937 3791,3792 3792,3791 3792,3775 3792,3758 3792,3757 3792,3922 3792,3822 3793,3751 3793,3750 3793,3904 3793,3794 3794,3793 3794,3795 3795,3794 3795,3773 3795,3802 3796,3934 3796,3916 3796,3887 3796,3877 3796,3876 3796,3854 3796,3799 3796,3797 3797,3796 3797,3784 3797,3777 3797,3776 3797,3774 3797,3937 3797,3800 3798,3785 3798,3781 3798,3941 3798,3940 3798,3939 3799,3796 3800,3797 3801,3781 3801,3766 3801,3918 3802,3795 3802,3944 3802,3936 3802,3928 3802,3804 3802,3803 3803,3802 3803,4199 3803,3938 3804,3802 3804,3752 3804,3928 3805,3864 3805,3863 3806,3838 3806,3807 3807,3806 3807,3901 3807,3844 3808,3894 3808,3875 3809,3775 3809,3945 3809,3930 3809,3921 3809,3857 3810,3821 3810,3811 3811,3810 3811,3864 3811,3831 3812,3898 3812,3843 3812,3813 3813,3812 3813,3838 3814,3908 3814,3831 3815,3849 3815,3821 3815,3819 3816,3779 3816,3817 3817,3816 3817,3890 3817,3889 3818,3880 3819,3815 3820,3896 3821,3815 3821,3810 3822,3792 3822,3881 3822,3823 3823,3822 3823,3913 3823,3912 3823,3893 3824,3842 3824,3825 3825,3824 3825,3771 3825,3903 3826,3918 3826,3908 3826,3863 3827,3944 3827,3856 3827,3828 3828,3827 3829,3900 3829,3895 3829,3837 3829,3830 3830,3829 3830,3895 3830,3832 3831,3814 3831,3811 3831,3849 3832,3830 3832,3833 3833,3832 3833,3919 3834,3879 3834,3863 3834,3855 3834,3850 3834,3835 3835,3834 3836,3783 3836,3918 3836,3907 3837,3829 3837,3895 3838,3813 3838,3806 3838,3768 3838,3767 3838,3766 3838,3906 3838,3862 3838,3844 3838,3840 3838,3839 3839,3838 3839,3923 3840,3838 3840,3843 3841,3783 3842,3824 3842,3783 3843,3840 3843,3812 3843,3844 3844,3843 3844,3838 3844,3807 3845,3873 3845,3872 3846,3847 3847,3846 3847,3771 3847,3859 3848,3927 3848,3920 3848,3895 3849,3831 3849,3815 3850,3834 3850,3851 3851,3850 3851,3779 3851,3863 3852,3853 3853,3852 3853,3861 3853,3856 3854,3796 3854,3888 3855,3834 3855,3779 3855,3912 3856,3853 3856,3827 3857,3809 3857,3786 3858,3859 3859,3858 3859,3847 3859,3868 3860,3903 3860,3902 3861,3853 3861,3914 3862,3838 3862,3901 3863,3851 3863,3834 3863,3826 3863,3805 3863,3774 3863,3907 3863,3864 3864,3863 3864,3811 3864,3805 3865,3904 3865,3866 3866,3865 3866,3906 3866,3904 3867,3895 3867,3872 3868,3859 3868,3783 3869,3870 3870,3869 3870,3782 3870,3781 3871,3779 3871,3916 3871,3915 3872,3867 3872,3845 3872,3911 3872,3895 3873,3845 3873,3929 3873,3874 3874,3873 3874,3903 3874,3895 3875,3808 3875,3892 3875,3878 3876,3796 3876,3877 3877,3876 3877,3796 3877,3916 3878,3875 3878,3904 3879,3834 3879,3783 3880,3818 3880,3925 3881,3822 3881,3916 3881,3882 3882,3881 3882,3917 3883,3758 3883,3910 3884,3904 3884,3885 3885,3884 3885,3914 3885,3904 3886,3786 3887,3796 3887,3890 3887,3888 3888,3887 3888,3854 3888,3909 3889,3817 3890,3887 3890,3817 3890,3909 3891,3786 3891,3902 3892,3875 3892,3938 3893,3823 3893,3779 3893,3915 3894,3808 3894,3904 3895,3874 3895,3872 3895,3867 3895,3848 3895,3837 3895,3830 3895,3829 3895,3789 3895,3788 3895,3927 3895,3920 3895,3919 3895,3900 3896,3820 3896,3786 3897,3933 3897,3923 3897,3898 3898,3897 3898,3812 3898,3918 3899,3900 3900,3899 3900,3895 3900,3829 3901,3862 3901,3807 3901,3925 3902,3891 3902,3860 3902,3903 3903,3902 3903,3874 3903,3860 3903,3825 3903,3927 3904,3894 3904,3885 3904,3884 3904,3878 3904,3866 3904,3865 3904,3793 3904,3905 3905,3904 3905,3785 3905,4199 3906,3866 3906,3838 3907,3863 3907,3836 3908,3826 3908,3814 3908,3925 3909,3890 3909,3888 3910,3883 3910,3917 3911,3872 3911,3918 3912,3855 3912,3823 3913,3823 3913,3922 3914,3885 3914,3861 3915,3893 3915,3871 3916,3881 3916,3877 3916,3871 3916,3796 3916,3917 3917,3916 3917,3910 3917,3882 3918,3911 3918,3898 3918,3836 3918,3826 3918,3801 3918,3933 3919,3895 3919,3833 3920,3895 3920,3848 3921,3809 3921,3775 3922,3913 3922,3792 3922,3775 3923,3897 3923,3839 3923,3924 3924,3923 3925,3908 3925,3901 3925,3880 3926,3762 3927,3903 3927,3895 3927,3848 3928,3804 3928,3802 3929,3873 3930,3809 3930,3757 3930,3931 3931,3930 3931,3757 3932,3762 3932,3749 3933,3918 3933,3897 3934,3796 3935,3788 3935,3762 3936,3802 3936,3752 3937,3797 3937,3790 3938,3892 3938,3803 3938,3766 3939,3798 3940,3798 3941,3798 3942,3943 3943,3942 3943,3778 3943,3768 3944,3827 3944,3802 3945,3809 3946,3763 3947,3973 3948,4012 3948,3978 3948,3956 3949,3998 3949,3950 3950,3949 3950,3975 3951,3980 3951,3975 3952,4040 3953,4000 3953,3983 3954,4064 3954,4062 3954,3995 3954,3966 3955,4056 3955,4055 3955,3969 3956,3948 3956,3963 3956,3957 3957,3956 3957,4031 3957,4008 3957,3989 3957,3979 3957,3965 3958,4016 3958,3999 3958,3959 3959,3958 3959,4011 3959,4008 3959,3997 3959,3979 3960,4034 3960,4023 3960,3962 3961,4045 3961,3962 3962,3961 3962,3960 3962,4047 3962,4004 3963,3956 3963,3999 3964,3965 3965,3964 3965,3957 3965,4002 3966,3954 3966,4064 3966,4063 3966,4041 3966,3985 3967,3969 3968,3969 3969,3968 3969,3967 3969,3955 3969,3971 3970,3972 3970,3971 3971,3970 3971,3969 3971,4072 3971,4029 3972,3970 3972,4005 3972,3992 3973,3947 3973,3995 3973,3984 3974,4078 3975,3951 3975,3950 3975,3994 3976,3979 3977,3979 3978,3948 3978,3979 3979,3978 3979,3977 3979,3976 3979,3959 3979,3957 3979,4027 3979,4020 3979,3980 3980,3979 3980,3951 3981,4038 3981,3983 3982,518 3982,4067 3982,4035 3983,3981 3983,3953 3983,4000 3984,3973 3984,3985 3985,3984 3985,3966 3985,3987 3985,3986 3986,3985 3986,4078 3987,3985 3987,426 3988,4048 3988,4006 3989,3957 3990,4025 3990,3991 3991,3990 3991,4003 3992,3972 3992,4021 3992,4013 3992,4012 3993,4033 3994,3975 3994,4068 3995,3973 3995,3954 3995,4065 3996,4016 3996,3997 3997,3996 3997,3959 3998,3949 3998,4050 3999,3963 3999,3958 4000,3983 4000,3953 4000,4029 4000,4020 4000,4001 4001,4000 4001,4030 4002,3965 4002,4047 4002,4020 4003,3991 4003,4034 4004,3962 4004,4036 4005,3972 4005,4028 4006,3988 4006,4007 4007,4006 4007,4056 4007,4049 4008,3959 4008,3957 4009,4079 4009,4046 4009,4037 4009,4018 4010,4047 4010,4036 4011,3959 4011,4017 4012,3992 4012,3948 4012,4028 4013,3992 4014,4038 4014,4029 4015,4058 4015,4033 4015,4025 4016,3996 4016,3958 4017,4011 4018,4009 4018,4037 4019,4020 4020,4019 4020,4002 4020,4000 4020,3979 4021,3992 4022,2717 4022,4034 4023,3960 4023,2717 4024,2939 4024,4026 4025,4015 4025,3990 4026,4024 4026,4033 4027,3979 4028,4012 4028,4005 4028,4029 4029,4028 4029,4014 4029,4000 4029,3971 4029,4080 4029,4032 4029,4031 4030,4001 4030,4041 4030,4039 4030,4031 4031,4030 4031,4029 4031,3957 4032,4029 4033,4026 4033,4015 4033,3993 4033,4034 4034,4033 4034,4022 4034,4003 4034,3960 4034,4057 4035,3982 4035,2342 4036,4010 4036,4004 4036,4080 4036,4039 4036,4038 4037,4018 4037,4009 4037,4038 4038,4037 4038,4036 4038,4014 4038,3981 4038,4080 4039,4036 4039,4030 4040,3952 4040,4049 4040,4041 4041,4040 4041,4030 4041,3966 4041,4066 4041,4043 4041,4042 4042,4041 4043,4041 4044,4045 4045,4044 4045,3961 4045,4046 4046,4045 4046,4009 4047,4010 4047,4002 4047,3962 4047,4080 4048,3988 4048,4049 4049,4048 4049,4040 4049,4007 4050,3998 4050,4053 4051,4053 4051,4052 4052,4051 4052,4070 4052,4069 4053,4051 4053,4050 4054,4055 4055,4054 4055,3955 4056,4007 4056,3955 4057,4034 4057,4058 4058,4057 4058,4015 4059,4061 4059,4060 4060,4059 4060,4071 4060,4065 4060,4063 4061,4059 4061,4062 4062,4061 4062,3954 4063,4060 4063,3966 4064,3966 4064,3954 4065,4060 4065,3995 4065,4066 4066,4065 4066,4041 4067,3982 4067,4068 4068,4067 4068,3994 4069,4052 4069,4105 4070,4052 4070,4105 4071,4060 4072,3971 4072,4073 4073,4072 4073,4076 4073,4075 4073,4074 4074,4073 4075,4073 4076,4073 4077,4078 4078,4077 4078,3986 4078,3974 4079,4009 4079,4080 4080,4079 4080,4047 4080,4038 4080,4036 4080,4029 4081,4086 4082,4084 4083,4084 4084,4083 4084,4082 4084,4099 4084,4090 4084,4086 4085,4086 4086,4085 4086,4084 4086,4081 4086,4162 4086,4090 4087,4267 4087,4218 4087,4172 4087,4166 4088,4299 4088,4089 4089,4088 4089,4188 4089,4187 4090,4086 4090,4084 4090,4217 4090,4160 4090,4121 4091,4092 4092,4091 4092,4208 4092,4189 4092,4116 4093,4285 4093,4102 4094,4279 4094,4152 4095,4105 4096,4106 4097,4246 4097,4245 4097,4222 4097,4200 4097,4136 4098,4283 4098,4282 4098,4281 4098,4147 4099,4084 4099,2556 4099,4172 4099,4110 4100,4260 4100,4244 4100,4241 4100,4101 4101,4100 4101,4317 4101,4227 4101,4206 4102,4093 4102,4306 4102,4305 4102,4151 4103,4225 4103,4152 4103,4104 4104,4103 4105,4095 4105,4070 4105,4069 4105,4106 4106,4105 4106,4096 4106,4147 4106,4144 4106,4109 4106,4107 4107,4106 4107,4184 4108,4109 4109,4108 4109,4106 4110,4099 4110,4243 4110,4156 4110,4138 4110,4121 4111,481 4111,4268 4111,4221 4111,4201 4111,4173 4111,4112 4112,4111 4112,129 4112,4213 4113,475 4113,4114 4114,4113 4114,4320 4114,4149 4114,4148 4115,4211 4115,4187 4115,4172 4116,4092 4117,4240 4117,4239 4117,4118 4118,4117 4118,4159 4118,4154 4118,4124 4119,4458 4119,4285 4119,4163 4119,4120 4120,4119 4120,522 4120,108 4120,4179 4120,4164 4121,4110 4121,4090 4121,4202 4121,4150 4121,4143 4122,4124 4123,4124 4124,4123 4124,4122 4124,4118 4125,4128 4126,4128 4127,4252 4127,4128 4128,4127 4128,4126 4128,4125 4128,4317 4128,4221 4128,4201 4128,4186 4129,2562 4129,2440 4129,4324 4129,4323 4130,4131 4131,4130 4131,4196 4132,4156 4132,4133 4133,4132 4133,4211 4134,4158 4134,4138 4134,4135 4135,4134 4136,4097 4136,4222 4137,4259 4137,4238 4137,4157 4137,4138 4138,4137 4138,4134 4138,4110 4138,4224 4138,4162 4138,4154 4139,4175 4139,4151 4140,4143 4141,4143 4142,4143 4143,4142 4143,4141 4143,4140 4143,4121 4144,4106 4144,4146 4145,526 4145,4146 4146,4145 4146,4144 4147,4106 4147,4098 4147,4204 4147,4171 4147,4151 4148,4114 4148,2440 4148,4325 4149,4114 4149,4326 4149,4173 4150,4121 4150,4202 4151,4147 4151,4139 4151,4102 4151,4215 4151,4212 4151,4209 4151,4152 4152,4151 4152,4103 4152,4094 4152,4165 4152,4163 4153,4253 4153,4154 4154,4153 4154,4138 4154,4118 4154,4193 4154,4159 4154,4156 4155,4258 4155,4249 4155,4242 4155,4156 4156,4155 4156,4154 4156,4132 4156,4110 4156,4194 4157,4137 4157,4233 4157,4229 4157,4228 4157,4223 4158,4134 4158,4232 4158,4231 4158,4230 4158,4162 4159,4154 4159,4118 4160,4090 4160,4269 4160,4217 4160,4206 4161,4251 4161,4162 4162,4161 4162,4158 4162,4138 4162,4086 4162,4193 4162,4172 4163,4152 4163,4119 4163,4216 4163,4164 4164,4163 4164,4120 4164,570 4164,4219 4164,4207 4164,4179 4164,4174 4165,4152 4165,4289 4165,4288 4166,4087 4166,4214 4166,4208 4166,4188 4166,4181 4167,4196 4167,4169 4167,4168 4168,4167 4169,4167 4170,4171 4171,4170 4171,4147 4171,4204 4172,4162 4172,4115 4172,4099 4172,4087 4172,2621 4172,4218 4172,4194 4172,4193 4173,4149 4173,4111 4173,474 4174,4164 4174,4317 4174,4207 4175,4139 4175,4280 4175,4176 4176,4175 4177,4179 4178,4179 4179,4178 4179,4177 4179,4164 4179,4120 4179,842 4180,4290 4180,4196 4180,4187 4180,4182 4181,4166 4181,4298 4181,4297 4181,4296 4181,4295 4181,4210 4182,4180 4182,4226 4182,4183 4183,4182 4184,4107 4184,4185 4185,4184 4186,4128 4186,4317 4186,4300 4187,4180 4187,4115 4187,4089 4187,4218 4187,4211 4187,4203 4187,4196 4187,4188 4188,4187 4188,4166 4188,4089 4188,4284 4189,4092 4189,4214 4190,4193 4191,4193 4192,4193 4193,4192 4193,4191 4193,4190 4193,4172 4193,4162 4193,4154 4193,4234 4194,4172 4194,4156 4194,4218 4195,4266 4195,4257 4195,4254 4195,4196 4196,4195 4196,4187 4196,4180 4196,4167 4196,4131 4197,4199 4198,4199 4199,4198 4199,4197 4199,3905 4199,3803 4199,3785 4199,3763 4199,4227 4199,4206 4199,4202 4200,4097 4201,4128 4201,4111 4201,4221 4202,4199 4202,4150 4202,4121 4202,4304 4203,4187 4203,4262 4203,4261 4203,4256 4203,4236 4203,4235 4204,4171 4204,4147 4204,4287 4204,4286 4205,4218 4206,4199 4206,4160 4206,4101 4206,4217 4206,4207 4207,4206 4207,4174 4207,4164 4207,4213 4208,4166 4208,4092 4209,4151 4209,4312 4209,4311 4209,4310 4209,4309 4209,4308 4210,4181 4210,4316 4210,4315 4210,4314 4210,4313 4211,4187 4211,4133 4211,4115 4211,564 4212,4151 4212,4305 4213,4207 4213,4112 4214,4189 4214,4166 4214,4264 4215,4151 4215,4216 4216,4215 4216,4163 4217,4206 4217,4160 4217,4090 4218,4205 4218,4194 4218,4187 4218,4172 4218,4087 4218,4301 4218,4219 4219,4218 4219,4164 4219,2543 4220,4221 4221,4220 4221,4201 4221,4128 4221,4111 4221,4317 4221,4222 4222,4221 4222,4136 4222,4097 4223,4157 4224,4138 4224,4275 4224,4274 4224,4273 4224,4272 4224,4271 4224,4270 4225,4103 4226,4182 4227,4199 4227,4101 4228,4157 4229,4157 4230,4158 4231,4158 4232,4158 4233,4157 4234,4193 4235,4203 4236,4203 4237,4243 4238,4137 4239,4117 4240,4117 4241,4100 4242,4155 4243,4237 4243,4110 4244,4100 4245,4097 4246,4097 4246,4248 4246,4247 4247,4246 4248,4246 4249,4155 4250,4265 4251,4161 4252,4127 4253,4153 4254,4195 4255,4264 4256,4203 4257,4195 4258,4155 4259,4137 4260,4100 4261,4203 4262,4203 4263,4264 4264,4263 4264,4255 4264,4214 4265,4250 4265,2621 4266,4195 4267,4087 4268,4111 4269,4160 4270,4224 4271,4224 4272,4224 4273,4224 4274,4224 4275,4224 4276,4279 4277,4279 4278,4279 4279,4278 4279,4277 4279,4276 4279,4094 4279,4291 4280,4175 4281,4098 4282,4098 4283,4098 4284,4188 4284,4322 4284,4321 4285,4119 4285,4093 4286,4204 4287,4204 4288,4165 4289,4165 4290,4180 4291,4279 4291,4294 4291,4293 4291,4292 4292,4291 4293,4291 4294,4291 4295,4181 4296,4181 4297,4181 4298,4181 4299,4088 4299,4319 4299,4318 4300,4186 4301,4218 4301,4303 4301,4302 4302,4301 4303,4301 4304,4202 4305,4212 4305,4102 4305,4307 4306,4102 4307,4305 4308,4209 4309,4209 4310,4209 4311,4209 4312,4209 4313,4210 4314,4210 4315,4210 4316,4210 4317,4221 4317,4186 4317,4174 4317,4128 4317,4101 4317,2621 4317,2556 4318,4299 4319,4299 4320,4114 4321,4284 4322,4284 4323,4129 4324,4129 4325,4148 4326,4149 4327,4410 4327,4392 4327,4387 4327,4375 4327,4342 4328,4346 4328,4331 4329,4377 4329,4331 4330,4401 4331,4329 4331,4328 4331,4407 4332,4413 4332,4402 4332,4400 4332,4398 4332,4391 4332,4385 4332,4381 4332,4347 4332,4340 4332,4336 4332,4335 4333,4395 4333,4391 4333,4383 4333,4359 4333,4357 4333,4355 4333,4340 4334,4335 4335,4334 4335,4332 4335,4402 4335,4398 4335,4381 4335,4347 4336,4332 4336,4395 4336,4381 4336,4373 4336,4361 4336,4347 4336,4346 4336,4345 4336,4342 4337,4402 4337,4386 4338,4342 4339,4340 4340,4339 4340,4333 4340,4332 4340,4400 4340,4395 4340,4357 4341,321 4341,4376 4341,4374 4342,4338 4342,4336 4342,4327 4342,4411 4342,4404 4342,4375 4342,4368 4342,4365 4342,4345 4343,4399 4343,4373 4343,4361 4343,4345 4344,4413 4344,4408 4344,4401 4344,4385 4344,4384 4344,4352 4345,4343 4345,4342 4345,4336 4345,4419 4345,4409 4345,4406 4345,4395 4345,4381 4345,4373 4345,4368 4345,4365 4345,4361 4345,4347 4345,4346 4346,4345 4346,4336 4346,4328 4346,4418 4346,4417 4346,4407 4346,4381 4346,4377 4346,4360 4346,4357 4347,4345 4347,4336 4347,4335 4347,4332 4347,4402 4347,4398 4347,4381 4348,4417 4349,4402 4350,4351 4351,4350 4351,4416 4351,4359 4352,4344 4352,4413 4352,4408 4352,4401 4352,4398 4352,4392 4352,4384 4352,4381 4352,4376 4352,4374 4352,4363 4353,4412 4353,4396 4353,4377 4354,4410 4354,4404 4355,4333 4355,4403 4355,4391 4356,4357 4357,4356 4357,4346 4357,4340 4357,4333 4357,4417 4357,4407 4357,4377 4358,4416 4358,4364 4358,4359 4359,4358 4359,4351 4359,4333 4359,4416 4359,4388 4359,4383 4359,4380 4359,4372 4359,4371 4359,4364 4360,4346 4360,4409 4361,4345 4361,4343 4361,4336 4361,4419 4361,4418 4361,4406 4361,4405 4361,4395 4361,4373 4361,4372 4362,253 4362,4363 4363,4362 4363,4352 4363,4370 4363,4369 4364,4359 4364,4358 4364,4383 4364,4373 4364,4372 4364,4371 4365,4345 4365,4342 4365,4399 4365,4373 4365,4372 4365,4368 4366,4367 4367,4366 4367,4404 4367,4392 4367,4376 4367,4374 4367,4368 4368,4367 4368,4365 4368,4345 4368,4342 4368,4411 4368,4404 4368,4375 4369,4363 4369,4392 4369,4374 4370,4363 4370,4392 4370,4374 4371,4364 4371,4359 4371,4416 4371,4397 4371,4380 4371,4372 4372,4371 4372,4365 4372,4364 4372,4361 4372,4359 4372,4395 4372,4391 4372,4373 4373,4372 4373,4365 4373,4364 4373,4361 4373,4345 4373,4343 4373,4336 4373,4412 4373,4405 4373,4396 4373,4395 4374,4370 4374,4369 4374,4367 4374,4352 4374,4341 4374,4392 4374,4384 4374,4376 4375,4368 4375,4342 4375,4327 4375,4381 4376,4374 4376,4367 4376,4352 4376,4341 4376,4392 4376,4384 4377,4357 4377,4353 4377,4346 4377,4329 4378,4415 4379,4380 4380,4379 4380,4371 4380,4359 4380,4416 4381,4375 4381,4352 4381,4347 4381,4346 4381,4345 4381,4336 4381,4335 4381,4332 4381,4408 4381,4402 4381,4398 4382,4399 4382,4397 4383,4364 4383,4359 4383,4333 4383,4403 4383,4395 4383,4391 4384,4376 4384,4374 4384,4352 4384,4344 4384,4413 4384,4408 4384,4402 4384,4401 4384,4392 4384,4386 4384,4385 4385,4384 4385,4344 4385,4332 4385,4413 4386,4384 4386,4337 4386,4415 4386,4402 4387,4327 4388,4359 4389,4391 4390,4391 4391,4390 4391,4389 4391,4383 4391,4372 4391,4355 4391,4333 4391,4332 4391,4396 4391,4395 4392,4384 4392,4376 4392,4374 4392,4370 4392,4369 4392,4367 4392,4352 4392,4327 4392,4410 4392,4401 4393,4395 4394,4396 4395,4393 4395,4391 4395,4383 4395,4373 4395,4372 4395,4361 4395,4345 4395,4340 4395,4336 4395,4333 4395,4396 4396,4395 4396,4394 4396,4391 4396,4373 4396,4353 4397,4382 4397,4371 4398,4381 4398,4352 4398,4347 4398,4335 4398,4332 4398,4402 4399,4382 4399,4365 4399,4343 4400,4340 4400,4332 4401,4392 4401,4384 4401,4352 4401,4344 4401,4330 4401,4413 4401,4408 4401,4402 4402,4401 4402,4398 4402,4386 4402,4384 4402,4381 4402,4349 4402,4347 4402,4337 4402,4335 4402,4332 4403,4383 4403,4355 4404,4368 4404,4367 4404,4354 4404,4342 4404,4414 4404,4410 4405,4373 4405,4361 4406,4361 4406,4345 4407,4357 4407,4346 4407,4331 4408,4401 4408,4384 4408,4381 4408,4352 4408,4344 4408,4413 4409,4360 4409,4345 4410,4404 4410,4392 4410,4354 4410,4327 4411,4368 4411,4342 4412,4373 4412,4353 4413,4408 4413,4401 4413,4385 4413,4384 4413,4352 4413,4344 4413,4332 4414,4404 4415,4386 4415,4378 4415,263 4416,4380 4416,4371 4416,4359 4416,4358 4416,4351 4417,4357 4417,4348 4417,4346 4418,4361 4418,4346 4419,4361 4419,4345 4420,4421 4421,4420 4421,4442 4421,4436 4421,4435 4422,4432 4422,4424 4423,238 4424,4422 4425,353 4426,354 4426,4430 4427,4443 4427,4429 4428,326 4429,4427 4430,4426 4431,309 4431,4433 4432,4422 4432,4435 4433,4431 4434,4435 4435,4434 4435,4432 4435,4421 4435,290 4435,4436 4436,4435 4436,4421 4436,4442 4436,4439 4437,1119 4437,4441 4437,4439 4438,4439 4439,4438 4439,4437 4439,4436 4439,4441 4440,4441 4441,4440 4441,4439 4441,4437 4441,4442 4442,4441 4442,4436 4442,4421 4442,4443 4443,4442 4443,4427 4444,830 4444,4462 4444,4458 4445,2562 4445,22 4445,4448 4446,493 4446,475 4446,91 4446,84 4446,23 4446,4461 4447,4448 4448,4447 4448,4445 4448,2562 4448,521 4448,85 4448,49 4448,4458 4449,4462 4450,4462 4451,4454 4452,4454 4453,4455 4454,4452 4454,4451 4454,4458 4455,4453 4455,4458 4455,4456 4456,4455 4457,843 4457,4458 4458,4457 4458,4455 4458,4454 4458,4448 4458,4444 4458,4119 4458,2440 4458,856 4458,837 4458,829 4458,569 4458,521 4458,514 4458,4466 4458,4465 4458,4464 4458,4463 4458,4459 4459,4458 4459,99 4460,4461 4461,4460 4461,4446 4461,2562 4461,132 4461,84 4461,24 4462,4450 4462,4449 4462,4444 4462,826 4463,4458 4464,4458 4465,4458 4466,4458 4467,4553 4467,4485 4468,4613 4468,4485 4469,4796 4469,4626 4469,4602 4469,4526 4469,4507 4470,4766 4470,4676 4470,4639 4471,4590 4471,4475 4472,4671 4473,4646 4473,4617 4473,4605 4473,4508 4473,4474 4474,4473 4474,4867 4474,4652 4474,4476 4475,4471 4475,4559 4476,4474 4476,3362 4476,4678 4476,4662 4476,4628 4476,4477 4477,4476 4477,4832 4477,4574 4478,3378 4478,4485 4478,4479 4479,4478 4479,4655 4480,4485 4480,4481 4481,4480 4481,4655 4482,4772 4482,4590 4482,4483 4483,4482 4483,4876 4483,4501 4484,4688 4484,4540 4485,4480 4485,4478 4485,4468 4485,4467 4485,4601 4485,4530 4485,4496 4486,4550 4486,4533 4486,4487 4487,4486 4487,4703 4487,4588 4488,4562 4488,4529 4489,4610 4489,4509 4490,4648 4490,4500 4491,2423 4491,4669 4491,4584 4491,4580 4491,4492 4492,4491 4492,4582 4492,4543 4493,4797 4493,4660 4493,4616 4493,4510 4494,4702 4494,4596 4495,4659 4495,4553 4496,4485 4496,4767 4497,4798 4497,4606 4497,4547 4498,4500 4498,4499 4499,4498 4499,4674 4500,4498 4500,4490 4500,4765 4500,4764 4500,4501 4501,4500 4501,4483 4502,4503 4503,4502 4503,4617 4503,4561 4504,4589 4504,4522 4505,4600 4505,4506 4506,4505 4506,4660 4506,4546 4507,4469 4507,2241 4507,4535 4508,4473 4508,4636 4508,4575 4508,4542 4509,4489 4509,3363 4509,4664 4510,4493 4510,4626 4511,4702 4511,4643 4512,4696 4512,4613 4512,4607 4512,4518 4513,4598 4513,4581 4513,4514 4514,4513 4515,4669 4515,4585 4516,4614 4516,4554 4516,4517 4517,4516 4517,4661 4518,4512 4518,4782 4518,4778 4518,4691 4519,4597 4519,4520 4520,4519 4520,4802 4520,4801 4520,4800 4520,4699 4520,4620 4520,4592 4520,4521 4521,4520 4522,4504 4522,4768 4522,4620 4522,4554 4523,4654 4523,4545 4524,4659 4524,4579 4525,4759 4525,4686 4526,4469 4526,4804 4526,4803 4527,4528 4528,4527 4528,4676 4528,4545 4529,4488 4529,4767 4530,4485 4530,4687 4531,4650 4531,4611 4531,4542 4532,4826 4532,4651 4532,4596 4533,4486 4533,4547 4534,4722 4534,4673 4534,4618 4534,4541 4534,4535 4535,4534 4535,4507 4535,2248 4536,2248 4536,4631 4537,4866 4537,4861 4537,4686 4537,4567 4538,4807 4538,4806 4538,4805 4538,4771 4538,4597 4539,4809 4539,4808 4539,4763 4540,4484 4540,4789 4540,4588 4541,4534 4541,4816 4541,4651 4542,4531 4542,4508 4542,4799 4542,4675 4543,4492 4543,4662 4544,4579 4545,4528 4545,4523 4546,4506 4546,4700 4547,4533 4547,4497 4547,4606 4548,4638 4548,4549 4549,4548 4549,4648 4549,4576 4550,4486 4550,4624 4551,4586 4551,4584 4552,2409 4552,4719 4552,4652 4552,4627 4553,4495 4553,4467 4553,4568 4554,4522 4554,4516 4554,4701 4554,4666 4555,4592 4555,4579 4556,4670 4556,4648 4557,4643 4557,4561 4558,4700 4559,4475 4560,4677 4560,4622 4561,4557 4561,4503 4561,4811 4562,4488 4562,4679 4562,4622 4562,4612 4563,2423 4563,4684 4564,4815 4564,4814 4564,4813 4564,4602 4564,4565 4565,4564 4565,4640 4565,4602 4566,4763 4566,4567 4567,4566 4567,4537 4567,4667 4568,4553 4568,4679 4569,4651 4569,4637 4570,3364 4570,4761 4570,4621 4570,4614 4570,4571 4571,4570 4571,4628 4572,4573 4573,4572 4573,2249 4573,4652 4573,4574 4574,4573 4574,4477 4574,4656 4574,4595 4574,4594 4575,4508 4575,4820 4576,4549 4577,4661 4577,4621 4578,4722 4579,4555 4579,4544 4579,4524 4579,4598 4580,4491 4581,4513 4581,4659 4581,4582 4582,4581 4582,4492 4582,3352 4583,4623 4583,4622 4584,4551 4584,4491 4585,4515 4585,4589 4585,4587 4586,4551 4586,4589 4587,4585 4588,4540 4588,4487 4588,4788 4588,4694 4589,4586 4589,4585 4589,4504 4590,4482 4590,4471 4590,4657 4591,4723 4591,4665 4592,4555 4592,4520 4592,4635 4593,4611 4594,4574 4595,4574 4596,4532 4596,4494 4597,4538 4597,4519 4598,4579 4598,4513 4599,4820 4600,4505 4600,4624 4601,4485 4601,4654 4602,4565 4602,4564 4602,4469 4602,4820 4602,4641 4602,4611 4603,3331 4604,4605 4605,4604 4605,4473 4605,4619 4606,4547 4606,4497 4606,4703 4607,4512 4607,4630 4607,4608 4608,4607 4608,4690 4608,4655 4608,4644 4609,4773 4609,4686 4610,4489 4610,4636 4611,4602 4611,4593 4611,4531 4612,4562 4613,4512 4613,4468 4614,4570 4614,4516 4615,4654 4615,4643 4616,4493 4616,4791 4616,4683 4617,4503 4617,4473 4618,4534 4619,4605 4619,4637 4619,4625 4620,4522 4620,4520 4620,4776 4621,4577 4621,4570 4621,4633 4622,4583 4622,4562 4622,4560 4623,4583 4624,4600 4624,4550 4625,4619 4626,4510 4626,4469 4626,4786 4627,4552 4627,4733 4627,4649 4628,4571 4628,4476 4628,3643 4628,4662 4629,4653 4630,4607 4630,4672 4631,4536 4631,2241 4632,2409 4632,4743 4633,4621 4633,4664 4634,2355 4634,4683 4635,4592 4636,4610 4636,4508 4637,4619 4637,4569 4637,4642 4638,4548 4639,4470 4639,4689 4640,4565 4640,4821 4640,4641 4641,4640 4641,4602 4641,4645 4642,4637 4643,4615 4643,4557 4643,4511 4643,4644 4644,4643 4644,4608 4644,4652 4645,4641 4645,4668 4646,4473 4646,4675 4647,4674 4648,4556 4648,4549 4648,4490 4649,4627 4649,2409 4649,4753 4649,4750 4649,4739 4650,4531 4651,4569 4651,4541 4651,4532 4651,4826 4651,4723 4651,4652 4652,4651 4652,4644 4652,4573 4652,4552 4652,4474 4652,2249 4653,4629 4653,4654 4654,4653 4654,4615 4654,4601 4654,4523 4655,4608 4655,4481 4655,4479 4655,3336 4655,4656 4656,4655 4656,4574 4657,4590 4657,4687 4658,4700 4658,4660 4659,4581 4659,4524 4659,4495 4660,4658 4660,4506 4660,4493 4660,2387 4660,4688 4661,4577 4661,4517 4661,4662 4662,4661 4662,4628 4662,4543 4662,4476 4663,4664 4664,4663 4664,4633 4664,4509 4665,4591 4666,4554 4667,4567 4667,4779 4667,4686 4668,4645 4669,4515 4669,4491 4670,4556 4670,4827 4670,4689 4671,4472 4671,4674 4672,4630 4672,4676 4673,4534 4673,4823 4674,4671 4674,4647 4674,4499 4675,4646 4675,4542 4675,4799 4676,4672 4676,4528 4676,4470 4677,4560 4677,3360 4677,4684 4677,4678 4678,4677 4678,4476 4678,3361 4679,4568 4679,4562 4680,4826 4681,4825 4681,4771 4682,4683 4683,4682 4683,4634 4683,4616 4684,4677 4684,4563 4685,4771 4685,4686 4686,4685 4686,4667 4686,4609 4686,4537 4686,4525 4687,4657 4687,4530 4688,4660 4688,4484 4689,4670 4689,4639 4689,4691 4689,4690 4690,4689 4690,4608 4691,4689 4691,4518 4691,4781 4692,4694 4693,4695 4694,4692 4694,4588 4694,4695 4695,4694 4695,4693 4695,2414 4695,4927 4696,4512 4697,4818 4697,4699 4698,4699 4699,4698 4699,4697 4699,4520 4700,4658 4700,4558 4700,4546 4701,4554 4702,4511 4702,4494 4703,4606 4703,4487 4703,4793 4704,4746 4704,4711 4705,4745 4705,4714 4706,4719 4706,4716 4707,4716 4707,4713 4708,4752 4708,4746 4708,4733 4708,4729 4708,4728 4709,4729 4709,4728 4710,4724 4710,4714 4711,4704 4711,4735 4712,4728 4712,4727 4713,4707 4713,4732 4714,4710 4714,4705 4715,4751 4715,4727 4716,4707 4716,4706 4717,4728 4717,4720 4718,4737 4718,4731 4719,4706 4719,4552 4719,4732 4720,4717 4720,4736 4721,4755 4721,4751 4721,4739 4722,4578 4722,4534 4722,4723 4723,4722 4723,4651 4723,4591 4724,4710 4724,4735 4725,4754 4725,4727 4726,4784 4726,4756 4726,4749 4727,4725 4727,4715 4727,4712 4727,4775 4727,4774 4727,4736 4728,4717 4728,4712 4728,4709 4728,4708 4728,4748 4729,4709 4729,4708 4730,4751 4730,4748 4731,4718 4731,4738 4732,4719 4732,4713 4733,4708 4733,4627 4733,4757 4733,4745 4733,4740 4734,4744 4734,4738 4735,4724 4735,4711 4736,4727 4736,4720 4737,4718 4737,4739 4738,4734 4738,4731 4739,4737 4739,4721 4739,4649 4739,4742 4740,4733 4740,4747 4741,4747 4741,4742 4742,4741 4742,4739 4743,4632 4743,2209 4744,4734 4744,4751 4745,4733 4745,4705 4746,4708 4746,4704 4747,4741 4747,4740 4748,4730 4748,4728 4749,4726 4749,2409 4749,4784 4749,4754 4750,4649 4750,4751 4751,4750 4751,4744 4751,4730 4751,4721 4751,4715 4752,4708 4753,4649 4753,2409 4753,4754 4754,4753 4754,4749 4754,4725 4755,4721 4755,4812 4755,4758 4756,4726 4757,4733 4758,4755 4759,4525 4759,3334 4760,4761 4761,4760 4761,4570 4761,4777 4762,4768 4763,4566 4763,4539 4764,4500 4765,4500 4766,4470 4767,4529 4767,4496 4767,4769 4768,4762 4768,4522 4769,4767 4769,4770 4770,4769 4771,4685 4771,4681 4771,4538 4772,4482 4773,4609 4774,4727 4775,4727 4776,4620 4777,4761 4778,4518 4779,4667 4779,4780 4780,4779 4780,4824 4781,4691 4782,4518 4782,4827 4783,4784 4784,4783 4784,4749 4784,4726 4785,4786 4786,4785 4786,4626 4787,4794 4788,4588 4788,4792 4789,4540 4790,4791 4791,4790 4791,4616 4792,4788 4792,4795 4792,4793 4793,4792 4793,4703 4793,4794 4794,4793 4794,4787 4795,4792 4796,4469 4797,4493 4798,4497 4798,4822 4799,4675 4799,4542 4800,4520 4801,4520 4802,4520 4803,4526 4804,4526 4805,4538 4806,4538 4807,4538 4808,4539 4809,4539 4810,4823 4811,4561 4812,4755 4813,4564 4814,4564 4815,4564 4816,4541 4816,4817 4817,4816 4818,4697 4819,4820 4820,4819 4820,4602 4820,4599 4820,4575 4821,4640 4822,4798 4823,4810 4823,4673 4824,4780 4825,4681 4826,4680 4826,4651 4826,4532 4827,4782 4827,4670 4828,4897 4828,4884 4828,4866 4829,4874 4829,4866 4830,3322 4830,4845 4830,4831 4831,4830 4831,3331 4831,4899 4832,4477 4832,4889 4832,4841 4832,4837 4833,4898 4833,4896 4834,4923 4834,4916 4834,4847 4835,4836 4836,4835 4836,4897 4836,4884 4836,4849 4836,4837 4837,4836 4837,4832 4837,2312 4838,4904 4838,4890 4838,4881 4839,4904 4839,4903 4840,4867 4840,4843 4840,4842 4840,4841 4841,4840 4841,4832 4841,4887 4841,4844 4842,4840 4843,4840 4844,4841 4845,4830 4845,3454 4846,4848 4847,4834 4847,4878 4847,4848 4848,4847 4848,4846 4848,4900 4848,4883 4848,4873 4849,4836 4849,2396 4850,3385 4850,3381 4850,4922 4850,4909 4850,4908 4851,4892 4851,4855 4852,4882 4852,4860 4853,4854 4854,4853 4854,2265 4854,4897 4855,4851 4855,980 4856,4871 4856,4859 4857,4859 4858,4860 4859,4857 4859,4856 4859,2365 4859,4860 4860,4859 4860,4858 4860,4852 4861,4537 4861,3295 4861,4867 4862,3543 4862,4878 4862,4863 4863,4862 4863,4877 4864,3318 4864,4887 4864,4879 4865,3337 4865,4923 4866,4829 4866,4828 4866,4537 4866,4867 4867,4866 4867,4861 4867,4840 4867,4474 4867,4925 4867,4869 4867,4868 4868,4867 4869,4867 4870,4913 4870,4880 4871,4856 4871,4893 4872,4917 4872,4905 4872,4890 4872,4873 4873,4872 4873,4848 4873,4891 4874,4829 4874,4885 4874,4884 4875,3369 4875,3341 4875,4876 4876,4875 4876,4483 4876,3342 4876,3333 4876,4883 4877,4863 4877,4885 4878,4862 4878,4847 4878,3387 4878,3372 4878,4924 4878,4920 4878,4914 4878,4881 4878,4879 4879,4878 4879,4864 4879,4902 4880,4870 4880,4915 4880,4900 4881,4878 4881,4838 4882,4852 4882,138 4883,4876 4883,4848 4883,3348 4884,4874 4884,4836 4884,4828 4885,4877 4885,4874 4885,3649 4885,3642 4885,4886 4886,4885 4886,4888 4886,4887 4887,4886 4887,4864 4887,4841 4887,4889 4888,4886 4888,3345 4888,4900 4888,4889 4889,4888 4889,4887 4889,4832 4890,4872 4890,4838 4891,4873 4891,4893 4892,4851 4892,4893 4893,4892 4893,4891 4893,4871 4893,68 4893,4894 4894,4893 4894,1030 4895,4925 4896,4833 4896,4926 4897,4854 4897,4836 4897,4828 4897,2214 4898,4833 4898,4926 4898,4899 4899,4898 4899,4831 4899,4925 4900,4888 4900,4880 4900,4848 4901,4921 4901,4909 4901,4907 4901,4902 4902,4901 4902,4879 4902,1033 4903,4839 4903,4905 4904,4839 4904,4838 4905,4903 4905,4872 4906,4908 4906,4907 4907,4906 4907,4901 4908,4906 4908,4850 4908,4919 4909,4901 4909,4850 4910,4924 4910,4914 4911,4921 4912,4923 4913,4870 4913,4918 4914,4910 4914,4878 4915,4880 4916,4834 4917,4872 4917,4922 4918,4913 4918,4924 4919,4908 4920,4878 4921,4911 4921,4901 4922,4917 4922,4850 4923,4912 4923,4865 4923,4834 4924,4918 4924,4910 4924,4878 4925,4899 4925,4895 4925,4867 4926,4898 4926,4896 4927,4695 4927,4928 4928,4927 4928,776 4928,4929 4929,4928 4929,4938 4930,3 4930,4937 4930,4931 4931,4930 4932,4935 4932,4934 4933,4939 4933,4934 4934,4933 4934,4932 4934,782 4935,4932 4935,4937 4936,4938 4937,4935 4937,4930 4938,4936 4938,4929 4939,4933 4939,4940 4940,4939 4940,819 ================================================ FILE: examples/dataset/test_data_edge.csv ================================================ source,target,label 1,20000,node_1 ================================================ FILE: examples/dataset/test_data_edge_single.csv ================================================ source 0 1 ================================================ FILE: examples/dataset/test_data_node.csv ================================================ id,size 0,1.0 1,2.0 2,1.5 ================================================ FILE: examples/dataset/test_data_node_very_very_long_name.csv ================================================ id,size a,1.0 b,2.0 c,1.5 ================================================ FILE: examples/test_file.rs ================================================ use std::path::PathBuf; use graphpu::{ bootstrap::{start_frame, ConfigBuilder}, MainApp, utils::csv_loader::load_data, }; pub const ROOT: &str = env!("CARGO_MANIFEST_DIR"); #[tokio::main] async fn main() { let dataset_folder = PathBuf::from(ROOT).join("examples").join("dataset"); let test_node_data = dataset_folder.join("test_data_node.csv"); let test_edge_data = dataset_folder.join("small_data_edge_raw.csv"); let config_builder = ConfigBuilder::default().app_creator(Box::new(move |cc| { let mut app = MainApp::new(cc); app.models.setup_data( load_data( test_node_data.to_str().unwrap(), test_edge_data.to_str().unwrap(), 0, 1, ).unwrap() ); Box::new(app) })); start_frame(config_builder.build()); } ================================================ FILE: lib/naga/.github/workflows/lazy.yml ================================================ # Lazy jobs running on master post merges. name: lazy on: push: branches: [master] jobs: coverage: name: Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: stable - name: Generate report uses: actions-rs/tarpaulin@v0.1 with: args: '--tests --all-features --workspace' - name: Upload to codecov.io uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} - name: Archive code coverage results uses: actions/upload-artifact@v1 with: name: code-coverage-report path: cobertura.xml parse-dota2: name: Parse Dota2 shaders runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable - run: mkdir data - name: Download shaders run: curl https://user.fm/files/v2-5573e18b9f03f42c6ae53c392083da35/dota2-shaders.zip -o data/all.zip - name: Unpack shaders run: cd data && unzip all.zip - name: Build Naga run: cargo build --release --bin naga - name: Convert shaders run: for file in data/*.spv ; do echo "Translating" ${file} && target/release/naga --validate 27 ${file} ${file}.metal; done parse-vulkan-tutorial-shaders: name: Parse Sascha Willems Vulkan tutorial shaders runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable - name: Download shaders run: git clone https://github.com/SaschaWillems/Vulkan.git - name: Build Naga run: cargo build --release --bin naga - name: Convert metal shaders run: | # No needed to stop workflow if we can't validate one file set +e touch counter SUCCESS_RESULT_COUNT=0 FILE_COUNT=0 mkdir -p out find "Vulkan/data/shaders/glsl/" -name '*.spv' | while read fname; do echo "Convert: $fname" FILE_COUNT=$((FILE_COUNT+1)) target/release/naga --validate 27 $(realpath ${fname}) out/$(basename ${fname}).metal if [[ $? -eq 0 ]]; then SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1)) fi echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter done cat counter dneto0_spirv-samples: name: Parse dneto0 spirv-samples runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable - name: Download shaders run: git clone https://github.com/dneto0/spirv-samples.git - name: Build Naga run: cargo build --release --bin naga - name: Install spirv-tools run: | wget -q https://storage.googleapis.com/spirv-tools/artifacts/prod/graphics_shader_compiler/spirv-tools/linux-clang-release/continuous/1489/20210629-121459/install.tgz tar zxf install.tgz ./install/bin/spirv-as --version - name: Compile spv from spvasm run: | cd spirv-samples mkdir -p spv find "./spvasm" -name '*.spvasm' | while read fname; do echo "Convert to spv with spirv-as: $fname" ../install/bin/spirv-as --target-env spv1.3 $(realpath ${fname}) -o ./spv/$(basename ${fname}).spv done; - name: Validate spv and generate wgsl run: | set +e cd spirv-samples SUCCESS_RESULT_COUNT=0 FILE_COUNT=0 mkdir -p spv mkdir -p wgsl echo "==== Validate spv and generate wgsl ====" rm -f counter touch counter find "./spv" -name '*.spv' | while read fname; do echo "Convert: $fname" FILE_COUNT=$((FILE_COUNT+1)) ../target/release/naga --validate 27 $(realpath ${fname}) ./wgsl/$(basename ${fname}).wgsl if [[ $? -eq 0 ]]; then SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1)) fi echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter done cat counter - name: Validate output wgsl run: | set +e cd spirv-samples SUCCESS_RESULT_COUNT=0 FILE_COUNT=0 rm -f counter touch counter find "./wgsl" -name '*.wgsl' | while read fname; do echo "Validate: $fname" FILE_COUNT=$((FILE_COUNT+1)) ../target/release/naga --validate 27 $(realpath ${fname}) if [[ $? -eq 0 ]]; then SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1)) fi echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter done cat counter check-snapshots-extra: name: Check snapshots (validated or not) runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable - uses: actions-rs/cargo@v1 name: Test minimal (without span) with: command: test args: --features validate -p naga - uses: actions-rs/cargo@v1 name: Test all (without validation) with: command: test args: --features wgsl-in,wgsl-out,glsl-in,glsl-out,spv-in,spv-out,msl-out,hlsl-out,dot-out --workspace - name: Check snapshots (without validation) run: git diff --exit-code -- tests/out ================================================ FILE: lib/naga/.github/workflows/pipeline.yml ================================================ # Regular testing. name: pipeline on: [push, pull_request] jobs: test-msrv: name: Test MSRV and dependencies minimal-versions runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: "1.56.0" override: true - uses: taiki-e/install-action@cargo-hack - uses: taiki-e/install-action@cargo-minimal-versions # nightly is only used by cargo-minimal-versions to regenerate the lock file - run: rustup toolchain add nightly --no-self-update - name: Test all features run: cargo minimal-versions test --all-features --workspace - name: Check snapshots run: git diff --exit-code -- tests/out test: name: Test Nightly runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: nightly override: true - uses: actions-rs/cargo@v1 name: Default test with: # Our intention here is to test `naga` with no features enabled. But # since `cli` is the default package, a plain `cargo test` will build # `naga` with the features requested in `cli/Cargo.toml`. Passing # `--package naga` causes us to use the default features in the # top-level `Cargo.toml` instead. command: test args: --package naga - uses: actions-rs/cargo@v1 name: Test all features with: command: test args: --all-features --workspace - name: Check snapshots run: git diff --exit-code -- tests/out - uses: actions-rs/cargo@v1 name: Check benchmarks with: command: check args: --benches clippy: name: Clippy runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - run: rustup component add clippy - uses: actions-rs/cargo@v1 with: command: clippy args: --all-features --workspace -- -D warnings documentation: name: Documentation runs-on: ubuntu-latest env: RUSTDOCFLAGS: -Dwarnings steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - uses: actions-rs/cargo@v1 with: command: doc args: -p naga --all-features --document-private-items fmt: name: Format runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true components: rustfmt - name: run rustfmt run: | cargo fmt -- --check ================================================ FILE: lib/naga/.github/workflows/validation-linux.yml ================================================ name: validation-linux on: pull_request: paths: - 'tests/out/spv/*.spvasm' - 'tests/out/glsl/*.glsl' - 'tests/out/dot/*.dot' - 'tests/out/wgsl/*.wgsl' - 'src/front/wgsl/*' jobs: validate-linux: name: SPIR-V + GLSL runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Install tools run: sudo apt-get install spirv-tools glslang-tools graphviz - run: make validate-spv - run: make validate-glsl - run: make validate-dot - run: make validate-wgsl ================================================ FILE: lib/naga/.github/workflows/validation-macos.yml ================================================ name: validation-macos on: pull_request: paths: - 'tests/out/msl/*.msl' jobs: validate-macos: name: MSL runs-on: macos-latest steps: - uses: actions/checkout@v2 - run: make validate-msl ================================================ FILE: lib/naga/.github/workflows/validation-windows.yml ================================================ name: validation-windows on: pull_request: paths: - 'tests/out/hlsl/*.hlsl' jobs: validate-windows-dxc: name: HLSL via DXC runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Add DirectXShaderCompiler uses: napokue/setup-dxc@v1.0.0 - run: make validate-hlsl-dxc shell: sh validate-windows-fxc: name: HLSL via FXC runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Add fxc bin to PATH run: | Get-Childitem -Path "C:\Program Files (x86)\Windows Kits\10\bin\**\x64\fxc.exe" ` | Sort-Object -Property LastWriteTime -Descending ` | Select-Object -First 1 ` | Split-Path -Parent ` | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append shell: powershell - run: make validate-hlsl-fxc shell: sh ================================================ FILE: lib/naga/.gitignore ================================================ /target /Debug **/*.rs.bk Cargo.lock .DS_Store .fuse_hidden* .idea .vscode /*.dot /*.metal /*.metallib /*.ron /*.spv /*.vert /*.frag /*.comp /*.wgsl /*.hlsl /*.txt ================================================ FILE: lib/naga/CHANGELOG.md ================================================ # Change Log ## v0.10 (2022-10-05) - Make termcolor dependency optional by @AldaronLau in https://github.com/gfx-rs/naga/pull/2014 - Fix clippy lints for 1.63 by @JCapucho in https://github.com/gfx-rs/naga/pull/2026 - Saturate by @evahop in https://github.com/gfx-rs/naga/pull/2025 - Use `Option::as_deref` as appropriate. by @jimblandy in https://github.com/gfx-rs/naga/pull/2040 - Explicitely enable std for indexmap by @maxammann in https://github.com/gfx-rs/naga/pull/2062 - Fix compiler warning by @Gordon-F in https://github.com/gfx-rs/naga/pull/2074 API - Implement `Clone` for `Module` by @daxpedda in https://github.com/gfx-rs/naga/pull/2013 - Remove the glsl-validate feature by @JCapucho in https://github.com/gfx-rs/naga/pull/2045 DOCS - Document arithmetic binary operation type rules. by @jimblandy in https://github.com/gfx-rs/naga/pull/2051 VALIDATOR - Add `emit_to_{stderr,string}` helpers to validation error by @nolanderc in https://github.com/gfx-rs/naga/pull/2012 - Check regular functions don't have bindings by @JCapucho in https://github.com/gfx-rs/naga/pull/2050 WGSL-IN - Update reserved WGSL keywords by @norepimorphism in https://github.com/gfx-rs/naga/pull/2009 - Implement lexical scopes by @JCapucho in https://github.com/gfx-rs/naga/pull/2024 - Rename `Scope` to `Rule`, since we now have lexical scope. by @jimblandy in https://github.com/gfx-rs/naga/pull/2042 - Splat on compound assignments by @JCapucho in https://github.com/gfx-rs/naga/pull/2049 - Fix bad span in assignment lhs error by @JCapucho in https://github.com/gfx-rs/naga/pull/2054 - Fix inclusion of trivia in spans by @SparkyPotato in https://github.com/gfx-rs/naga/pull/2055 - Improve assignment diagnostics by @SparkyPotato in https://github.com/gfx-rs/naga/pull/2056 - Break up long string, reformat rest of file. by @jimblandy in https://github.com/gfx-rs/naga/pull/2057 - Fix line endings on wgsl reserved words list. by @jimblandy in https://github.com/gfx-rs/naga/pull/2059 GLSL-IN - Add support for .length() by @SpaceCat-Chan in https://github.com/gfx-rs/naga/pull/2017 - Fix missing stores for local declarations by @adeline-sparks in https://github.com/gfx-rs/naga/pull/2029 - Migrate to `SymbolTable` by @JCapucho in https://github.com/gfx-rs/naga/pull/2044 - Update initializer list type when parsing by @JCapucho in https://github.com/gfx-rs/naga/pull/2066 SPV-OUT - Don't decorate varyings with interpolation modes at pipeline start/end by @nical in https://github.com/gfx-rs/naga/pull/2038 - Decorate integer builtins as Flat in the spirv writer by @nical in https://github.com/gfx-rs/naga/pull/2035 - Properly combine the fixes for #2035 and #2038. by @jimblandy in https://github.com/gfx-rs/naga/pull/2041 - Don't emit no-op `OpBitCast` instructions. by @jimblandy in https://github.com/gfx-rs/naga/pull/2043 HLSL-OUT - Use the namer to sanitise entrypoint input/output struct names by @expenses in https://github.com/gfx-rs/naga/pull/2001 - Handle Unpack2x16float in hlsl by @expenses in https://github.com/gfx-rs/naga/pull/2002 - Add support for push constants by @JCapucho in https://github.com/gfx-rs/naga/pull/2005 DOT-OUT - Improvements by @JCapucho in https://github.com/gfx-rs/naga/pull/1987 ## v0.9 (2022-06-30) - Fix minimal-versions of dependencies ([#1840](https://github.com/gfx-rs/naga/pull/1840)) **@teoxoy** - Update MSRV to 1.56 ([#1838](https://github.com/gfx-rs/naga/pull/1838)) **@teoxoy** API - Rename `TypeFlags` `INTERFACE`/`HOST_SHARED` to `IO_SHARED`/`HOST_SHAREABLE` ([#1872](https://github.com/gfx-rs/naga/pull/1872)) **@jimblandy** - Expose more error information ([#1827](https://github.com/gfx-rs/naga/pull/1827), [#1937](https://github.com/gfx-rs/naga/pull/1937)) **@jakobhellermann** **@nical** **@jimblandy** - Do not unconditionally make error output colorful ([#1707](https://github.com/gfx-rs/naga/pull/1707)) **@rhysd** - Rename `StorageClass` to `AddressSpace` ([#1699](https://github.com/gfx-rs/naga/pull/1699)) **@kvark** - Add a way to emit errors to a path ([#1640](https://github.com/gfx-rs/naga/pull/1640)) **@laptou** CLI - Add `bincode` representation ([#1729](https://github.com/gfx-rs/naga/pull/1729)) **@kvark** - Include file path in WGSL parse error ([#1708](https://github.com/gfx-rs/naga/pull/1708)) **@rhysd** - Add `--version` flag ([#1706](https://github.com/gfx-rs/naga/pull/1706)) **@rhysd** - Support reading input from stdin via `--stdin-file-path` ([#1701](https://github.com/gfx-rs/naga/pull/1701)) **@rhysd** - Use `panic = "abort"` ([#1597](https://github.com/gfx-rs/naga/pull/1597)) **@jrmuizel** DOCS - Standardize some docs ([#1660](https://github.com/gfx-rs/naga/pull/1660)) **@NoelTautges** - Document `TypeInner::BindingArray` ([#1859](https://github.com/gfx-rs/naga/pull/1859)) **@jimblandy** - Clarify accepted types for `Expression::AccessIndex` ([#1862](https://github.com/gfx-rs/naga/pull/1862)) **@NoelTautges** - Document `proc::layouter` ([#1693](https://github.com/gfx-rs/naga/pull/1693)) **@jimblandy** - Document Naga's promises around validation and panics ([#1828](https://github.com/gfx-rs/naga/pull/1828)) **@jimblandy** - `FunctionInfo` doc fixes ([#1726](https://github.com/gfx-rs/naga/pull/1726)) **@jimblandy** VALIDATOR - Forbid returning pointers and atomics from functions ([#911](https://github.com/gfx-rs/naga/pull/911)) **@jimblandy** - Let validation check for more unsupported builtins ([#1962](https://github.com/gfx-rs/naga/pull/1962)) **@jimblandy** - Fix `Capabilities::SAMPLER_NON_UNIFORM_INDEXING` bitflag ([#1915](https://github.com/gfx-rs/naga/pull/1915)) **@cwfitzgerald** - Properly check that user-defined IO uses IO-shareable types ([#912](https://github.com/gfx-rs/naga/pull/912)) **@jimblandy** - Validate `ValuePointer` exactly like a `Pointer` to a `Scalar` ([#1875](https://github.com/gfx-rs/naga/pull/1875)) **@jimblandy** - Reject empty structs ([#1826](https://github.com/gfx-rs/naga/pull/1826)) **@jimblandy** - Validate uniform address space layout constraints ([#1812](https://github.com/gfx-rs/naga/pull/1812)) **@teoxoy** - Improve `AddressSpace` related error messages ([#1710](https://github.com/gfx-rs/naga/pull/1710)) **@kvark** WGSL-IN Main breaking changes - Commas to separate struct members (comma after last member is optional) - `struct S { a: f32; b: i32; }` -> `struct S { a: f32, b: i32 }` - Attribute syntax - `[[binding(0), group(0)]]` -> `@binding(0) @group(0)` - Entry point stage attributes - `@stage(vertex)` -> `@vertex` - `@stage(fragment)` -> `@fragment` - `@stage(compute)` -> `@compute` - Function renames - `smoothStep` -> `smoothstep` - `findLsb` -> `firstTrailingBit` - `findMsb` -> `firstLeadingBit` Specification Changes (relavant changes have also been applied to the WGSL backend) - Add support for `break if` ([#1993](https://github.com/gfx-rs/naga/pull/1993)) **@JCapucho** - Update number literal format ([#1863](https://github.com/gfx-rs/naga/pull/1863)) **@teoxoy** - Allow non-ascii characters in identifiers ([#1849](https://github.com/gfx-rs/naga/pull/1849)) **@teoxoy** - Update reserved keywords ([#1847](https://github.com/gfx-rs/naga/pull/1847), [#1870](https://github.com/gfx-rs/naga/pull/1870), [#1905](https://github.com/gfx-rs/naga/pull/1905)) **@teoxoy** **@Gordon-F** - Update entry point stage attributes ([#1833](https://github.com/gfx-rs/naga/pull/1833)) **@Gordon-F** - Make colon in case optional ([#1801](https://github.com/gfx-rs/naga/pull/1801)) **@Gordon-F** - Rename `smoothStep` to `smoothstep` ([#1800](https://github.com/gfx-rs/naga/pull/1800)) **@Gordon-F** - Make semicolon after struct declaration optional ([#1791](https://github.com/gfx-rs/naga/pull/1791)) **@stshine** - Use commas to separate struct members instead of semicolons ([#1773](https://github.com/gfx-rs/naga/pull/1773)) **@Gordon-F** - Rename `findLsb`/`findMsb` to `firstTrailingBit`/`firstLeadingBit` ([#1735](https://github.com/gfx-rs/naga/pull/1735)) **@kvark** - Make parenthesis optional for `if` and `switch` statements ([#1725](https://github.com/gfx-rs/naga/pull/1725)) **@Gordon-F** - Declare attribtues with `@attrib` instead of `[[attrib]]` ([#1676](https://github.com/gfx-rs/naga/pull/1676)) **@kvark** - Allow non-structure buffer types ([#1682](https://github.com/gfx-rs/naga/pull/1682)) **@kvark** - Remove `stride` attribute ([#1681](https://github.com/gfx-rs/naga/pull/1681)) **@kvark** Improvements - Implement complete validation for size and align attributes ([#1979](https://github.com/gfx-rs/naga/pull/1979)) **@teoxoy** - Implement `firstTrailingBit`/`firstLeadingBit` u32 overloads ([#1865](https://github.com/gfx-rs/naga/pull/1865)) **@teoxoy** - Add error for non-floating-point matrix ([#1917](https://github.com/gfx-rs/naga/pull/1917)) **@grovesNL** - Implement partial vector & matrix identity constructors ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy** - Implement phony assignment ([#1866](https://github.com/gfx-rs/naga/pull/1866), [#1869](https://github.com/gfx-rs/naga/pull/1869)) **@teoxoy** - Fix being able to match `~=` as LogicalOperation ([#1849](https://github.com/gfx-rs/naga/pull/1849)) **@teoxoy** - Implement Binding Arrays ([#1845](https://github.com/gfx-rs/naga/pull/1845)) **@cwfitzgerald** - Implement unary vector operators ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy** - Implement zero value constructors and constructors that infer their type from their parameters ([#1790](https://github.com/gfx-rs/naga/pull/1790)) **@teoxoy** - Implement invariant attribute ([#1789](https://github.com/gfx-rs/naga/pull/1789), [#1822](https://github.com/gfx-rs/naga/pull/1822)) **@teoxoy** **@jimblandy** - Implement increment and decrement statements ([#1788](https://github.com/gfx-rs/naga/pull/1788), [#1912](https://github.com/gfx-rs/naga/pull/1912)) **@teoxoy** - Implement `while` loop ([#1787](https://github.com/gfx-rs/naga/pull/1787)) **@teoxoy** - Fix array size on globals ([#1717](https://github.com/gfx-rs/naga/pull/1717)) **@jimblandy** - Implement integer vector overloads for `dot` function ([#1689](https://github.com/gfx-rs/naga/pull/1689)) **@francesco-cattoglio** - Implement block comments ([#1675](https://github.com/gfx-rs/naga/pull/1675)) **@kocsis1david** - Implement assignment binary operators ([#1662](https://github.com/gfx-rs/naga/pull/1662)) **@kvark** - Implement `radians`/`degrees` builtin functions ([#1627](https://github.com/gfx-rs/naga/pull/1627)) **@encounter** - Implement `findLsb`/`findMsb` builtin functions ([#1473](https://github.com/gfx-rs/naga/pull/1473)) **@fintelia** - Implement `textureGather`/`textureGatherCompare` builtin functions ([#1596](https://github.com/gfx-rs/naga/pull/1596)) **@kvark** SPV-IN - Implement `OpBitReverse` and `OpBitCount` ([#1954](https://github.com/gfx-rs/naga/pull/1954)) **@JCapucho** - Add `MultiView` to `SUPPORTED_CAPABILITIES` ([#1934](https://github.com/gfx-rs/naga/pull/1934)) **@expenses** - Translate `OpSMod` and `OpFMod` correctly ([#1867](https://github.com/gfx-rs/naga/pull/1867), [#1995](https://github.com/gfx-rs/naga/pull/1995)) **@teoxoy** **@JCapucho** - Error on unsupported `MatrixStride` ([#1805](https://github.com/gfx-rs/naga/pull/1805)) **@teoxoy** - Align array stride for undecorated arrays ([#1724](https://github.com/gfx-rs/naga/pull/1724)) **@JCapucho** GLSL-IN - Don't allow empty last case in switch ([#1981](https://github.com/gfx-rs/naga/pull/1981)) **@JCapucho** - Fix last case falltrough and empty switch ([#1981](https://github.com/gfx-rs/naga/pull/1981)) **@JCapucho** - Splat inputs for smoothstep if needed ([#1976](https://github.com/gfx-rs/naga/pull/1976)) **@JCapucho** - Fix parameter not changing to depth ([#1967](https://github.com/gfx-rs/naga/pull/1967)) **@JCapucho** - Fix matrix multiplication check ([#1953](https://github.com/gfx-rs/naga/pull/1953)) **@JCapucho** - Fix panic (stop emitter in conditional) ([#1952](https://github.com/gfx-rs/naga/pull/1952)) **@JCapucho** - Translate `mod` fn correctly ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy** - Make the ternary operator behave as an if ([#1877](https://github.com/gfx-rs/naga/pull/1877)) **@JCapucho** - Add support for `clamp` function ([#1502](https://github.com/gfx-rs/naga/pull/1502)) **@sjinno** - Better errors for bad constant expression ([#1501](https://github.com/gfx-rs/naga/pull/1501)) **@sjinno** - Error on a `matCx2` used with the `std140` layout ([#1806](https://github.com/gfx-rs/naga/pull/1806)) **@teoxoy** - Allow nested accesses in lhs positions ([#1794](https://github.com/gfx-rs/naga/pull/1794)) **@JCapucho** - Use forced conversions for vector/matrix constructors ([#1796](https://github.com/gfx-rs/naga/pull/1796)) **@JCapucho** - Add support for `barrier` function ([#1793](https://github.com/gfx-rs/naga/pull/1793)) **@fintelia** - Fix panic (resume expression emit after `imageStore`) ([#1795](https://github.com/gfx-rs/naga/pull/1795)) **@JCapucho** - Allow multiple array specifiers ([#1780](https://github.com/gfx-rs/naga/pull/1780)) **@JCapucho** - Fix memory qualifiers being inverted ([#1779](https://github.com/gfx-rs/naga/pull/1779)) **@JCapucho** - Support arrays as input/output types ([#1759](https://github.com/gfx-rs/naga/pull/1759)) **@JCapucho** - Fix freestanding constructor parsing ([#1758](https://github.com/gfx-rs/naga/pull/1758)) **@JCapucho** - Fix matrix - scalar operations ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho** - Fix matrix - matrix division ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho** - Fix matrix comparisons ([#1757](https://github.com/gfx-rs/naga/pull/1757)) **@JCapucho** - Add support for `texelFetchOffset` ([#1746](https://github.com/gfx-rs/naga/pull/1746)) **@JCapucho** - Inject `sampler2DMSArray` builtins on use ([#1737](https://github.com/gfx-rs/naga/pull/1737)) **@JCapucho** - Inject `samplerCubeArray` builtins on use ([#1736](https://github.com/gfx-rs/naga/pull/1736)) **@JCapucho** - Add support for image builtin functions ([#1723](https://github.com/gfx-rs/naga/pull/1723)) **@JCapucho** - Add support for image declarations ([#1723](https://github.com/gfx-rs/naga/pull/1723)) **@JCapucho** - Texture builtins fixes ([#1719](https://github.com/gfx-rs/naga/pull/1719)) **@JCapucho** - Type qualifiers rework ([#1713](https://github.com/gfx-rs/naga/pull/1713)) **@JCapucho** - `texelFetch` accept multisampled textures ([#1715](https://github.com/gfx-rs/naga/pull/1715)) **@JCapucho** - Fix panic when culling nested block ([#1714](https://github.com/gfx-rs/naga/pull/1714)) **@JCapucho** - Fix composite constructors ([#1631](https://github.com/gfx-rs/naga/pull/1631)) **@JCapucho** - Fix using swizzle as out arguments ([#1632](https://github.com/gfx-rs/naga/pull/1632)) **@JCapucho** SPV-OUT - Implement `reverseBits` and `countOneBits` ([#1897](https://github.com/gfx-rs/naga/pull/1897)) **@hasali19** - Use `OpCopyObject` for matrix identity casts ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy** - Use `OpCopyObject` for bool - bool conversion due to `OpBitcast` not being feasible for booleans ([#1916](https://github.com/gfx-rs/naga/pull/1916)) **@teoxoy** - Zero init variables in function and private address spaces ([#1871](https://github.com/gfx-rs/naga/pull/1871)) **@teoxoy** - Use `SRem` instead of `SMod` ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy** - Add support for integer vector - scalar multiplication ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy** - Add support for matrix addition and subtraction ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy** - Emit required decorations on wrapper struct types ([#1815](https://github.com/gfx-rs/naga/pull/1815)) **@jimblandy** - Decorate array and struct type layouts unconditionally ([#1815](https://github.com/gfx-rs/naga/pull/1815)) **@jimblandy** - Fix wrong `MatrixStride` for `matCx2` and `mat2xR` ([#1781](https://github.com/gfx-rs/naga/pull/1781)) **@teoxoy** - Use `OpImageQuerySize` for MS images ([#1742](https://github.com/gfx-rs/naga/pull/1742)) **@JCapucho** MSL-OUT - Insert padding initialization for global constants ([#1988](https://github.com/gfx-rs/naga/pull/1988)) **@teoxoy** - Don't rely on cached expressions ([#1975](https://github.com/gfx-rs/naga/pull/1975)) **@JCapucho** - Fix pointers to private or workgroup address spaces possibly being read only ([#1901](https://github.com/gfx-rs/naga/pull/1901)) **@teoxoy** - Zero init variables in function address space ([#1871](https://github.com/gfx-rs/naga/pull/1871)) **@teoxoy** - Make binding arrays play nice with bounds checks ([#1855](https://github.com/gfx-rs/naga/pull/1855)) **@cwfitzgerald** - Permit `invariant` qualifier on vertex shader outputs ([#1821](https://github.com/gfx-rs/naga/pull/1821)) **@jimblandy** - Fix packed `vec3` stores ([#1816](https://github.com/gfx-rs/naga/pull/1816)) **@teoxoy** - Actually test push constants to be used ([#1767](https://github.com/gfx-rs/naga/pull/1767)) **@kvark** - Properly rename entry point arguments for struct members ([#1766](https://github.com/gfx-rs/naga/pull/1766)) **@jimblandy** - Qualify read-only storage with const ([#1763](https://github.com/gfx-rs/naga/pull/1763)) **@kvark** - Fix not unary operator for integer scalars ([#1760](https://github.com/gfx-rs/naga/pull/1760)) **@vincentisambart** - Add bounds checks for `ImageLoad` and `ImageStore` ([#1730](https://github.com/gfx-rs/naga/pull/1730)) **@jimblandy** - Fix resource bindings for non-structures ([#1718](https://github.com/gfx-rs/naga/pull/1718)) **@kvark** - Always check whether _buffer_sizes arg is needed ([#1717](https://github.com/gfx-rs/naga/pull/1717)) **@jimblandy** - WGSL storage address space should always correspond to MSL device address space ([#1711](https://github.com/gfx-rs/naga/pull/1711)) **@wtholliday** - Mitigation for MSL atomic bounds check ([#1703](https://github.com/gfx-rs/naga/pull/1703)) **@glalonde** HLSL-OUT - More `matCx2` fixes (#1989) ([#1989](https://github.com/gfx-rs/naga/pull/1989)) **@teoxoy** - Fix fallthrough in switch statements ([#1920](https://github.com/gfx-rs/naga/pull/1920)) **@teoxoy** - Fix missing break statements ([#1919](https://github.com/gfx-rs/naga/pull/1919)) **@teoxoy** - Fix `countOneBits` and `reverseBits` for signed integers ([#1928](https://github.com/gfx-rs/naga/pull/1928)) **@hasali19** - Fix array constructor return type ([#1914](https://github.com/gfx-rs/naga/pull/1914)) **@teoxoy** - Fix hlsl output for writes to scalar/vector storage buffer ([#1903](https://github.com/gfx-rs/naga/pull/1903)) **@hasali19** - Use `fmod` instead of `%` ([#1867](https://github.com/gfx-rs/naga/pull/1867)) **@teoxoy** - Use wrapped constructors when loading from storage address space ([#1893](https://github.com/gfx-rs/naga/pull/1893)) **@teoxoy** - Zero init struct constructor ([#1890](https://github.com/gfx-rs/naga/pull/1890)) **@teoxoy** - Flesh out matrix handling documentation ([#1850](https://github.com/gfx-rs/naga/pull/1850)) **@jimblandy** - Emit `row_major` qualifier on matrix uniform globals ([#1846](https://github.com/gfx-rs/naga/pull/1846)) **@jimblandy** - Fix bool splat ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy** - Add more padding when necessary ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy** - Support multidimensional arrays ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy** - Don't output interpolation modifier if it's the default ([#1809](https://github.com/gfx-rs/naga/pull/1809)) **@NoelTautges** - Fix `matCx2` translation for uniform buffers ([#1802](https://github.com/gfx-rs/naga/pull/1802)) **@teoxoy** - Fix modifiers not being written in the vertex output and fragment input structs ([#1789](https://github.com/gfx-rs/naga/pull/1789)) **@teoxoy** - Fix matrix not being declared as transposed ([#1784](https://github.com/gfx-rs/naga/pull/1784)) **@teoxoy** - Insert padding between struct members ([#1786](https://github.com/gfx-rs/naga/pull/1786)) **@teoxoy** - Fix not unary operator for integer scalars ([#1760](https://github.com/gfx-rs/naga/pull/1760)) **@vincentisambart** GLSL-OUT - Fix vector bitcasts (#1966) ([#1966](https://github.com/gfx-rs/naga/pull/1966)) **@expenses** - Perform casts in int only math functions ([#1978](https://github.com/gfx-rs/naga/pull/1978)) **@JCapucho** - Don't rely on cached expressions ([#1975](https://github.com/gfx-rs/naga/pull/1975)) **@JCapucho** - Fix type error for `countOneBits` implementation ([#1897](https://github.com/gfx-rs/naga/pull/1897)) **@hasali19** - Fix storage format for `Rgba8Unorm` ([#1955](https://github.com/gfx-rs/naga/pull/1955)) **@JCapucho** - Implement bounds checks for `ImageLoad` ([#1889](https://github.com/gfx-rs/naga/pull/1889)) **@JCapucho** - Fix feature search in expressions ([#1887](https://github.com/gfx-rs/naga/pull/1887)) **@JCapucho** - Emit globals of any type ([#1823](https://github.com/gfx-rs/naga/pull/1823)) **@jimblandy** - Add support for boolean vector `~`, `|` and `&` ops ([#1820](https://github.com/gfx-rs/naga/pull/1820)) **@teoxoy** - Fix array function arguments ([#1814](https://github.com/gfx-rs/naga/pull/1814)) **@teoxoy** - Write constant sized array type for uniform ([#1768](https://github.com/gfx-rs/naga/pull/1768)) **@hatoo** - Texture function fixes ([#1742](https://github.com/gfx-rs/naga/pull/1742)) **@JCapucho** - Push constants use anonymous uniforms ([#1683](https://github.com/gfx-rs/naga/pull/1683)) **@JCapucho** - Add support for push constant emulation ([#1672](https://github.com/gfx-rs/naga/pull/1672)) **@JCapucho** - Skip unsized types if unused ([#1649](https://github.com/gfx-rs/naga/pull/1649)) **@kvark** - Write struct and array initializers ([#1644](https://github.com/gfx-rs/naga/pull/1644)) **@JCapucho** ## v0.8.5 (2022-01-25) MSL-OUT - Make VS-output positions invariant on even more systems ([#1697](https://github.com/gfx-rs/naga/pull/1697)) **@cwfitzgerald** - Improve support for point primitives ([#1696](https://github.com/gfx-rs/naga/pull/1696)) **@kvark** ## v0.8.4 (2022-01-24) MSL-OUT - Make VS-output positions invariant if possible ([#1687](https://github.com/gfx-rs/naga/pull/1687)) **@kvark** GLSL-OUT - Fix `floatBitsToUint` spelling ([#1688](https://github.com/gfx-rs/naga/pull/1688)) **@cwfitzgerald** - Call proper memory barrier functions ([#1680](https://github.com/gfx-rs/naga/pull/1680)) **@francesco-cattoglio** ## v0.8.3 (2022-01-20) - Don't pin `indexmap` version ([#1666](https://github.com/gfx-rs/naga/pull/1666)) **@a1phyr** MSL-OUT - Fix support for point primitives ([#1674](https://github.com/gfx-rs/naga/pull/1674)) **@kvark** GLSL-OUT - Fix sampler association ([#1671](https://github.com/gfx-rs/naga/pull/1671)) **@JCapucho** ## v0.8.2 (2022-01-11) VALIDATOR - Check structure resource types ([#1639](https://github.com/gfx-rs/naga/pull/1639)) **@kvark** WGSL-IN - Improve type mismatch errors ([#1658](https://github.com/gfx-rs/naga/pull/1658)) **@Gordon-F** SPV-IN - Implement more sign agnostic operations ([#1651](https://github.com/gfx-rs/naga/pull/1651), [#1650](https://github.com/gfx-rs/naga/pull/1650)) **@JCapucho** SPV-OUT - Fix modulo operator (use `OpFRem` instead of `OpFMod`) ([#1653](https://github.com/gfx-rs/naga/pull/1653)) **@JCapucho** MSL-OUT - Fix `texture1d` accesses ([#1647](https://github.com/gfx-rs/naga/pull/1647)) **@jimblandy** - Fix data packing functions ([#1637](https://github.com/gfx-rs/naga/pull/1637)) **@phoekz** ## v0.8.1 (2021-12-29) API - Make `WithSpan` clonable ([#1620](https://github.com/gfx-rs/naga/pull/1620)) **@jakobhellermann** MSL-OUT - Fix packed vec access ([#1634](https://github.com/gfx-rs/naga/pull/1634)) **@kvark** - Fix packed float support ([#1630](https://github.com/gfx-rs/naga/pull/1630)) **@kvark** HLSL-OUT - Support arrays of matrices ([#1629](https://github.com/gfx-rs/naga/pull/1629)) **@kvark** - Use `mad` instead of `fma` function ([#1580](https://github.com/gfx-rs/naga/pull/1580)) **@parasyte** GLSL-OUT - Fix conflicting names for globals ([#1616](https://github.com/gfx-rs/naga/pull/1616)) **@Gordon-F** - Fix `fma` function ([#1580](https://github.com/gfx-rs/naga/pull/1580)) **@parasyte** ## v0.8 (2021-12-18) - development release for wgpu-0.12 - lots of fixes in all parts - validator: - now gated by `validate` feature - nicely detailed error messages with spans - API: - image gather operations - WGSL-in: - remove `[[block]]` attribute - `elseif` is removed in favor of `else if` - MSL-out: - full out-of-bounds checking ## v0.7.3 (2021-12-14) - API: - `view_index` builtin - GLSL-out: - reflect textures without samplers - SPV-out: - fix incorrect pack/unpack ## v0.7.2 (2021-12-01) - validator: - check stores for proper pointer class - HLSL-out: - fix stores into `mat3` - respect array strides - SPV-out: - fix multi-word constants - WGSL-in: - permit names starting with underscores - SPV-in: - cull unused builtins - support empty debug labels - GLSL-in: - don't panic on invalid integer operations ## v0.7.1 (2021-10-12) - implement casts from and to booleans in the backends ## v0.7 (2021-10-07) - development release for wgpu-0.11 - API: - bit extraction and packing functions - hyperbolic trigonometry functions - validation is gated by a cargo feature - `view_index` builtin - separate bounds checking policies for locals/buffers/textures - IR: - types and constants are guaranteed to be unique - WGSL-in: - new hex literal parser - updated list of reserved words - rewritten logic for resolving references and pointers - `switch` can use unsigned selectors - GLSL-in: - better support for texture sampling - better logic for auto-splatting scalars - GLSL-out: - fixed storage buffer layout - fix module operator - HLSL-out: - fixed texture queries - SPV-in: - control flow handling is rewritten from scratch - SPV-out: - fully covered out-of-bounds checking - option to emit point size - option to clamp output depth ## v0.6.3 (2021-09-08) - Reduced heap allocations when generating WGSL, HLSL, and GLSL - WGSL-in: - support module-scope `let` type inference - SPV-in: - fix depth sampling with projection - HLSL-out: - fix local struct construction - GLSL-out: - fix `select()` order - SPV-out: - allow working around Adreno issue with `OpName` ## v0.6.2 (2021-09-01) - SPV-out fixes: - requested capabilities for 1D and cube images, storage formats - handling `break` and `continue` in a `switch` statement - avoid generating duplicate `OpTypeImage` types - HLSL-out fixes: - fix output struct member names - MSL-out fixes: - fix packing of fields in interface structs - GLSL-out fixes: - fix non-fallthrough `switch` cases - GLSL-in fixes: - avoid infinite loop on invalid statements ## v0.6.1 (2021-08-24) - HLSL-out fixes: - array arguments - pointers to array arguments - switch statement - rewritten interface matching - SPV-in fixes: - array storage texture stores - tracking sampling across function parameters - updated petgraph dependencies - MSL-out: - gradient sampling - GLSL-out: - modulo operator on floats ## v0.6 (2021-08-18) - development release for wgpu-0.10 - API: - atomic types and functions - storage access is moved from global variables to the storage class and storage texture type - new built-ins: `primitive_index` and `num_workgroups` - support for multi-sampled depth images - WGSL: - `select()` order of true/false is swapped - HLSL backend is vastly improved and now usable - GLSL frontend is heavily reworked ## v0.5 (2021-06-18) - development release for wgpu-0.9 - API: - barriers - dynamic indexing of matrices and arrays is only allowed on variables - validator now accepts a list of IR capabilities to allow - improved documentation - Infrastructure: - much richer test suite, focused around consuming or emitting WGSL - lazy testing on large shader corpuses - the binary is moved to a sub-crate "naga-cli" - Frontends: - GLSL frontend: - rewritten from scratch and effectively revived, no longer depends on `pomelo` - only supports 440/450/460 versions for now - has optional support for codespan messages - SPIRV frontend has improved CFG resolution (still with issues unresolved) - WGSL got better error messages, workgroup memory support - Backends: - general: better expression naming and emitting - new HLSL backend (in progress) - MSL: - support `ArraySize` expression - better texture sampling instructions - GLSL: - multisampling on GLES - WGSL is vastly improved and now usable ## v0.4.2 (2021-05-28) - SPIR-V frontend: - fix image stores - fix matrix stride check - SPIR-V backend: - fix auto-deriving the capabilities - GLSL backend: - support sample interpolation - write out swizzled vector accesses ## v0.4.1 (2021-05-14) - numerous additions and improvements to SPIR-V frontend: - int8, in16, int64 - null constant initializers for structs and matrices - `OpArrayLength`, `OpCopyMemory`, `OpInBoundsAccessChain`, `OpLogicalXxxEqual` - outer product - fix struct size alignment - initialize built-ins with default values - fix read-only decorations on struct members - fix struct size alignment in WGSL - fix `fwidth` in WGSL - fix scalars arrays in GLSL backend ## v0.4 (2021-04-29) - development release for wgpu-0.8 - API: - expressions are explicitly emitted with `Statement::Emit` - entry points have inputs in arguments and outputs in the result type - `input`/`output` storage classes are gone, but `push_constant` is added - `Interpolation` is moved into `Binding::Location` variant - real pointer semantics with required `Expression::Load` - `TypeInner::ValuePointer` is added - image query expressions are added - new `Statement::ImageStore` - all function calls are `Statement::Call` - `GlobalUse` is moved out into processing - `Header` is removed - entry points are an array instead of a map - new `Swizzle` and `Splat` expressions - interpolation qualifiers are extended and required - struct member layout is based on the byte offsets - Infrastructure: - control flow uniformity analysis - texture-sampler combination gathering - `CallGraph` processor is moved out into `glsl` backend - `Interface` is removed, instead the analysis produces `ModuleInfo` with all the derived info - validation of statement tree, expressions, and constants - code linting is more strict for matches - new GraphViz `dot` backend for pretty visualization of the IR - Metal support for inlined samplers - `convert` example is transformed into the default binary target named `naga` - lots of frontend and backend fixes ## v0.3.2 (2021-02-15) - fix logical expression types - fix _FragDepth_ semantics - spv-in: - derive block status of structures - spv-out: - add lots of missing math functions - implement discard ## v0.3.1 (2021-01-31) - wgsl: - support constant array sizes - spv-out: - fix block decorations on nested structures - fix fixed-size arrays - fix matrix decorations inside structures - implement read-only decorations ## v0.3 (2021-01-30) - development release for wgpu-0.7 - API: - math functions - type casts - updated storage classes - updated image sub-types - image sampling/loading options - storage images - interpolation qualifiers - early and conservative depth - Processors: - name manager - automatic layout - termination analysis - validation of types, constants, variables, and entry points ## v0.2 (2020-08-17) - development release for wgpu-0.6 ## v0.1 (2020-02-26) - initial release ================================================ FILE: lib/naga/Cargo.toml ================================================ [package] name = "naga" version = "0.10.0" authors = ["Naga Developers"] edition = "2018" description = "Shader translation infrastructure" homepage = "https://github.com/gfx-rs/naga" repository = "https://github.com/gfx-rs/naga/tree/v0.9" keywords = ["shader", "SPIR-V", "GLSL", "MSL"] license = "MIT OR Apache-2.0" exclude = ["bin/**/*", "tests/**/*", "Cargo.lock", "target/**/*"] resolver = "2" rust-version = "1.56" [package.metadata.docs.rs] all-features = true [profile.release] panic = "abort" [profile.dev] panic = "abort" [features] default = [] clone = [] dot-out = [] glsl-in = ["pp-rs"] glsl-out = [] msl-out = [] serialize = ["serde", "indexmap/serde-1"] deserialize = ["serde", "indexmap/serde-1"] spv-in = ["petgraph", "spirv"] spv-out = ["spirv"] wgsl-in = ["codespan-reporting", "hexf-parse", "termcolor", "unicode-xid"] wgsl-out = [] hlsl-out = [] span = ["codespan-reporting", "termcolor"] validate = [] [[bench]] name = "criterion" harness = false [dependencies] arbitrary = { version = "1.0.2", features = ["derive"], optional = true } bitflags = "1.0.5" bit-set = "0.5" termcolor = { version = "1.0.4", optional = true } # remove termcolor dep when updating to the next version of codespan-reporting # termcolor minimum version was wrong and was fixed in # https://github.com/brendanzab/codespan/commit/e99c867339a877731437e7ee6a903a3d03b5439e codespan-reporting = { version = "0.11.0", optional = true } rustc-hash = "1.1.0" indexmap = { version = "1.6", features = ["std"] } log = "0.4" num-traits = "0.2" spirv = { version = "0.2", optional = true } thiserror = "1.0.21" serde = { version = "1.0.103", features = ["derive"], optional = true } petgraph = { version ="0.6", optional = true } pp-rs = { version = "0.2.1", optional = true } hexf-parse = { version = "0.2.1", optional = true } unicode-xid = { version = "0.2.3", optional = true } [dev-dependencies] bincode = "1" criterion = { version = "0.3", features = [] } diff = "0.1" # Require at least version 0.7.1 of ron, this version changed how floating points are # serialized by forcing them to always have the decimal part, this makes it backwards # incompatible with our tests because we do a syntatic diff and not a semantic one. ron = "~0.7.1" serde = { version = "1.0", features = ["derive"] } spirv = { version = "0.2", features = ["deserialize"] } rspirv = "0.11" env_logger = "0.9" [workspace] members = [".", "cli"] # Include "cli", so that `cargo run` runs the CLI by default. Include ".", so # that `cargo test` includes naga's own tests by default (but note, using the # features that `cli/Cargo.toml` requests). default-members = [".", "cli"] ================================================ FILE: lib/naga/LICENSE-APACHE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: lib/naga/LICENSE-MIT ================================================ Copyright (c) [yyyy] [name of copyright owner] Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib/naga/Makefile ================================================ .PHONY: all clean validate-spv validate-msl validate-glsl validate-dot validate-wgsl validate-hlsl-dxc validate-hlsl-fxc .SECONDARY: boids.metal quad.metal SNAPSHOTS_BASE_IN=tests/in SNAPSHOTS_BASE_OUT=tests/out all: cargo fmt cargo test --all-features --workspace cargo clippy --all-features --workspace -- -D warnings clean: rm *.metal *.air *.metallib *.vert *.frag *.comp *.spv bench: #rm -Rf target/criterion cargo bench %.metal: $(SNAPSHOTS_BASE_IN)/%.wgsl $(wildcard src/*.rs src/**/*.rs examples/*.rs) cargo run --features wgsl-in,msl-out -- $< $@ %.air: %.metal xcrun -sdk macosx metal -c $< -mmacosx-version-min=10.11 %.metallib: %.air xcrun -sdk macosx metallib $< -o $@ %.dot: $(SNAPSHOTS_BASE_IN)/%.wgsl $(wildcard src/*.rs src/front/wgsl/*.rs src/back/dot/*.rs bin/naga.rs) cargo run --features wgsl-in,dot-out -- $< $@ %.png: %.dot dot -Tpng $< -o $@ validate-spv: $(SNAPSHOTS_BASE_OUT)/spv/*.spvasm @set -e && for file in $^ ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ cat $${file} | spirv-as --target-env vulkan1.0 -o - | spirv-val; \ done validate-msl: $(SNAPSHOTS_BASE_OUT)/msl/*.msl @set -e && for file in $^ ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ header=$$(head -n1 $${file}); \ cat $${file} | xcrun -sdk macosx metal -mmacosx-version-min=10.11 -std=macos-$${header:13:8} -x metal - -o /dev/null; \ done validate-glsl: $(SNAPSHOTS_BASE_OUT)/glsl/*.glsl @set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Vertex.glsl ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"};\ cat $${file} | glslangValidator --stdin -S vert; \ done @set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Fragment.glsl ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"};\ cat $${file} | glslangValidator --stdin -S frag; \ done @set -e && for file in $(SNAPSHOTS_BASE_OUT)/glsl/*.Compute.glsl ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"};\ cat $${file} | glslangValidator --stdin -S comp; \ done validate-dot: $(SNAPSHOTS_BASE_OUT)/dot/*.dot @set -e && for file in $^ ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ cat $${file} | dot -o /dev/null; \ done validate-wgsl: $(SNAPSHOTS_BASE_OUT)/wgsl/*.wgsl @set -e && for file in $^ ; do \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ cargo run $${file}; \ done validate-hlsl-dxc: SHELL:=/usr/bin/env bash # required because config files uses arrays validate-hlsl-dxc: $(SNAPSHOTS_BASE_OUT)/hlsl/*.hlsl @set -e && for file in $^ ; do \ DXC_PARAMS="-Wno-parentheses-equality -Zi -Qembed_debug -Od"; \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ config="$$(dirname $${file})/$$(basename $${file}).config"; \ . $${config}; \ for (( i=0; i<$${#vertex[@]}; i++ )); do \ name=`echo $${vertex[i]} | cut -d \: -f 1`; \ profile=`echo $${vertex[i]} | cut -d \: -f 2`; \ (set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \ done; \ for (( i=0; i<$${#fragment[@]}; i++ )); do \ name=`echo $${fragment[i]} | cut -d \: -f 1`; \ profile=`echo $${fragment[i]} | cut -d \: -f 2`; \ (set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \ done; \ for (( i=0; i<$${#compute[@]}; i++ )); do \ name=`echo $${compute[i]} | cut -d \: -f 1`; \ profile=`echo $${compute[i]} | cut -d \: -f 2`; \ (set -x; dxc $${file} -T $${profile} -E $${name} $${DXC_PARAMS} > /dev/null); \ done; \ echo "======================"; \ done validate-hlsl-fxc: SHELL:=/usr/bin/env bash # required because config files uses arrays validate-hlsl-fxc: $(SNAPSHOTS_BASE_OUT)/hlsl/*.hlsl @set -e && for file in $^ ; do \ FXC_PARAMS="-Zi -Od"; \ echo "Validating" $${file#"$(SNAPSHOTS_BASE_OUT)/"}; \ config="$$(dirname $${file})/$$(basename $${file}).config"; \ . $${config}; \ for (( i=0; i<$${#vertex[@]}; i++ )); do \ name=`echo $${vertex[i]} | cut -d \: -f 1`; \ profile=`echo $${vertex[i]} | cut -d \: -f 2`; \ sm=`echo $${profile} | cut -d \_ -f 2`; \ if (( sm < 6 )); then \ (set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \ fi \ done; \ for (( i=0; i<$${#fragment[@]}; i++ )); do \ name=`echo $${fragment[i]} | cut -d \: -f 1`; \ profile=`echo $${fragment[i]} | cut -d \: -f 2`; \ sm=`echo $${profile} | cut -d \_ -f 2`; \ if (( sm < 6 )); then \ (set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \ fi \ done; \ for (( i=0; i<$${#compute[@]}; i++ )); do \ name=`echo $${compute[i]} | cut -d \: -f 1`; \ profile=`echo $${compute[i]} | cut -d \: -f 2`; \ sm=`echo $${profile} | cut -d \_ -f 2`; \ if (( sm < 6 )); then \ (set -x; fxc $${file} -T $${profile} -E $${name} $${FXC_PARAMS} > /dev/null); \ fi \ done; \ echo "======================"; \ done ================================================ FILE: lib/naga/README.md ================================================ # Naga [![Matrix](https://img.shields.io/badge/Matrix-%23naga%3Amatrix.org-blueviolet.svg)](https://matrix.to/#/#naga:matrix.org) [![Crates.io](https://img.shields.io/crates/v/naga.svg?label=naga)](https://crates.io/crates/naga) [![Docs.rs](https://docs.rs/naga/badge.svg)](https://docs.rs/naga) [![Build Status](https://github.com/gfx-rs/naga/workflows/pipeline/badge.svg)](https://github.com/gfx-rs/naga/actions) ![MSRV](https://img.shields.io/badge/rustc-1.56+-blue.svg) [![codecov.io](https://codecov.io/gh/gfx-rs/naga/branch/master/graph/badge.svg?token=9VOKYO8BM2)](https://codecov.io/gh/gfx-rs/naga) The shader translation library for the needs of [wgpu](https://github.com/gfx-rs/wgpu). ## Supported end-points Front-end | Status | Feature | Notes | --------------- | ------------------ | ------- | ----- | SPIR-V (binary) | :white_check_mark: | spv-in | | WGSL | :white_check_mark: | wgsl-in | Fully validated | GLSL | :ok: | glsl-in | GLSL 440+ and Vulkan semantics only | Back-end | Status | Feature | Notes | --------------- | ------------------ | -------- | ----- | SPIR-V | :white_check_mark: | spv-out | | WGSL | :ok: | wgsl-out | | Metal | :white_check_mark: | msl-out | | HLSL | :white_check_mark: | hlsl-out | Shader Model 5.0+ (DirectX 11+) | GLSL | :ok: | glsl-out | GLSL 330+ and GLSL ES 300+ | AIR | | | | DXIL/DXIR | | | | DXBC | | | | DOT (GraphViz) | :ok: | dot-out | Not a shading language | :white_check_mark: = Primary support — :ok: = Secondary support — :construction: = Unsupported, but support in progress ## Conversion tool Naga can be used as a CLI, which allows to test the conversion of different code paths. First, install `naga-cli` from crates.io or directly from GitHub. ```bash # release version cargo install naga-cli # development version cargo install naga-cli --git https://github.com/gfx-rs/naga.git ``` Then, you can run `naga` command. ```bash naga my_shader.wgsl # validate only naga my_shader.spv my_shader.txt # dump the IR module into a file naga my_shader.spv my_shader.metal --flow-dir flow-dir # convert the SPV to Metal, also dump the SPIR-V flow graph to `flow-dir` naga my_shader.wgsl my_shader.vert --profile es310 # convert the WGSL to GLSL vertex stage under ES 3.20 profile ``` As naga includes a default binary target, you can also use `cargo run` without installation. This is useful when you develop naga itself, or investigate the behavior of naga at a specific commit (e.g. [wgpu](https://github.com/gfx-rs/wgpu) might pin a different version of naga than the `HEAD` of this repository). ```bash cargo run my_shader.wgsl ``` ## Development workflow The main instrument aiding the development is the good old `cargo test --all-features --workspace`, which will run the unit tests, and also update all the snapshots. You'll see these changes in git before committing the code. If working on a particular front-end or back-end, it may be convenient to enable the relevant features in `Cargo.toml`, e.g. ```toml default = ["spv-out"] #TEMP! ``` This allows IDE basic checks to report errors there, unless your IDE is sufficiently configurable already. Finally, when changes to the snapshots are made, we should verify that the produced shaders are indeed valid for the target platforms they are compiled for. We automate this with `Makefile`: ```bash make validate-spv # for Vulkan shaders, requires SPIRV-Tools installed make validate-msl # for Metal shaders, requires XCode command-line tools installed make validate-glsl # for OpenGL shaders, requires GLSLang installed make validate-dot # for dot files, requires GraphViz installed make validate-wgsl # for WGSL shaders make validate-hlsl-dxc # for HLSL shaders via DXC make validate-hlsl-fxc # for HLSL shaders via FXC # Note: HLSL Make targets make use of the "sh" shell. This is not the default shell in Windows. ``` ================================================ FILE: lib/naga/aa.metal ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size1; uint size2; uint size3; uint size4; uint size6; uint size7; }; struct Node { metal::float3 position; metal::float3 force; metal::packed_float3 prev_force; metal::atomic_uint mass; }; struct Uniforms { uint frame_num; }; struct Bound { metal::float3 bound_min; metal::float3 bound_max; }; struct BHTree { metal::atomic_uint max_depth; metal::atomic_uint bottom; float radius; }; struct BHTreeNode { metal::packed_float3 position; int _empty; metal::atomic_int mass; int count; metal::atomic_int start; int sort; }; typedef Node type_6[1]; typedef metal::uint2 type_8[1]; typedef metal::atomic_int type_9[1]; typedef Bound type_10[1]; typedef BHTreeNode type_11[1]; struct type_13 { metal::float3 inner[256]; }; struct type_14 { uint inner[8]; }; struct type_15 { int inner[8]; }; struct type_17 { uint inner[48]; }; struct type_18 { float inner[48]; }; uint hash( uint s_1 ) { uint t = {}; t = s_1; uint _e10 = t; t = _e10 ^ 2747636419u; uint _e13 = t; t = _e13 * 2654435769u; uint _e16 = t; uint _e17 = t; t = _e16 ^ (_e17 >> 16u); uint _e21 = t; t = _e21 * 2654435769u; uint _e24 = t; uint _e25 = t; t = _e24 ^ (_e25 >> 16u); uint _e29 = t; t = _e29 * 2654435769u; uint _e32 = t; return _e32; } float random( uint seed ) { uint _e9 = hash(seed); return static_cast(_e9) / 4294967296.0; } float random_xy( uint seed_x, uint seed_y ) { uint _e10 = hash(seed_x); uint _e12 = hash(_e10 + seed_y); return static_cast(_e12) / 4294967296.0; } void atomic_add_f32_( uint springIndex, float updateValue, device type_9& springForceSrc, constant _mslBufferSizes& _buffer_sizes ) { int new_u32_ = {}; int assumed = 0; int origin = {}; new_u32_ = as_type(updateValue); while(true) { if (true) { } else { break; } int _e17 = assumed; int _e18 = new_u32_; metal::atomic_compare_exchange_weak_explicit(&springForceSrc[springIndex], &_e17, _e18, metal::memory_order_relaxed, metal::memory_order_relaxed); origin = _e17; int _e20 = origin; int _e21 = assumed; if (_e20 == _e21) { break; } int _e23 = origin; assumed = _e23; int _e24 = origin; new_u32_ = as_type(as_type(_e24) + updateValue); } return; } struct gen_nodeInput { }; kernel void gen_node( metal::uint3 global_invocation_id [[thread_position_in_grid]] , constant Uniforms& uniforms [[user(fake0)]] , device type_6& nodeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos = {}; uint total = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_5 = global_invocation_id.x; if (index_5 >= total) { return; } metal::float3 _e14 = nodeSrc[index_5].position; vPos = _e14; uint _e20 = uniforms.frame_num; float _e23 = random_xy(index_5, 0u + (3u * _e20)); vPos.x = (_e23 * 2.0) - 1.0; uint _e32 = uniforms.frame_num; float _e35 = random_xy(index_5, 1u + (3u * _e32)); vPos.y = (_e35 * 2.0) - 1.0; uint _e44 = uniforms.frame_num; float _e47 = random_xy(index_5, 2u + (3u * _e44)); vPos.z = (_e47 * 2.0) - 1.0; metal::float3 _e54 = vPos; nodeSrc[index_5].position = _e54; nodeSrc[index_5].force = metal::float3(0.0); nodeSrc[index_5].prev_force = metal::float3(0.0); metal::atomic_store_explicit(&nodeSrc[index_5].mass, 1u, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 0u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 1u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 2u], 0, metal::memory_order_relaxed); return; } struct cal_massInput { }; kernel void cal_mass( metal::uint3 global_invocation_id_1 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device type_8 const& edgeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::uint2 edge = {}; uint total_1 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8; uint index_6 = global_invocation_id_1.x; if (index_6 >= total_1) { return; } metal::uint2 _e13 = edgeSrc[index_6]; edge = _e13; uint source_node = edge.x; uint target_node = edge.y; uint _e24 = metal::atomic_fetch_add_explicit(&nodeSrc[source_node].mass, 1u, metal::memory_order_relaxed); uint _e28 = metal::atomic_fetch_add_explicit(&nodeSrc[target_node].mass, 1u, metal::memory_order_relaxed); return; } struct cal_gravity_forceInput { }; kernel void cal_gravity_force( metal::uint3 global_invocation_id_2 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { float gravity_force = {}; uint total_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_7 = global_invocation_id_2.x; if (index_7 >= total_2) { return; } metal::float3 pos_3 = nodeSrc[index_7].position; uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_7].mass, metal::memory_order_relaxed); float mass = static_cast(_e19); if (true) { gravity_force = 0.25 * mass; } else { if (((pos_3.x != 0.0) || (pos_3.y != 0.0)) || (pos_3.z != 0.0)) { gravity_force = (0.25 * mass) * metal::rsqrt(metal::dot(pos_3, pos_3)); } else { gravity_force = 0.0; } } metal::float3 _e41 = nodeSrc[index_7].force; nodeSrc[index_7].force = _e41 + (-pos_3 * 0.25); return; } struct attractive_forceInput { }; kernel void attractive_force( metal::uint3 global_invocation_id_3 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device type_8 const& edgeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::uint2 edge_1 = {}; metal::float3 dir = {}; uint total_3 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8; uint index_8 = global_invocation_id_3.x; if (index_8 >= total_3) { return; } metal::uint2 _e13 = edgeSrc[index_8]; edge_1 = _e13; uint source_node_1 = edge_1.x; uint target_node_1 = edge_1.y; metal::float3 _e23 = nodeSrc[target_node_1].position; metal::float3 _e26 = nodeSrc[source_node_1].position; dir = _e23 - _e26; metal::float3 _e29 = dir; dir = _e29 * 0.009999999776482582; float _e37 = dir.x; atomic_add_f32_((source_node_1 * 3u) + 0u, _e37, springForceSrc, _buffer_sizes); float _e43 = dir.y; atomic_add_f32_((source_node_1 * 3u) + 1u, _e43, springForceSrc, _buffer_sizes); float _e49 = dir.z; atomic_add_f32_((source_node_1 * 3u) + 2u, _e49, springForceSrc, _buffer_sizes); float _e55 = dir.x; atomic_add_f32_((target_node_1 * 3u) + 0u, -_e55, springForceSrc, _buffer_sizes); float _e62 = dir.y; atomic_add_f32_((target_node_1 * 3u) + 1u, -_e62, springForceSrc, _buffer_sizes); float _e69 = dir.z; atomic_add_f32_((target_node_1 * 3u) + 2u, -_e69, springForceSrc, _buffer_sizes); return; } struct reduction_boundingInput { }; kernel void reduction_bounding( uint local_index [[thread_index_in_threadgroup]] , metal::uint3 global_id [[thread_position_in_grid]] , metal::uint3 group_id [[threadgroup_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device type_10& bounding [[user(fake0)]] , threadgroup type_13& smin , threadgroup type_13& smax , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index = {}; uint s = {}; index = global_id.x; uint total_4 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint _e16 = index; if (_e16 >= total_4) { index = total_4 - 1u; } uint _e21 = index; metal::float3 _e24 = nodeSrc[_e21].position; smin.inner[local_index] = _e24; uint _e26 = index; metal::float3 _e29 = nodeSrc[_e26].position; smax.inner[local_index] = _e29; metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); s = 256u / 2u; bool loop_init = true; while(true) { if (!loop_init) { uint _e37 = s; s = _e37 >> 1u; } loop_init = false; uint _e34 = s; if (_e34 > 0u) { } else { break; } uint _e40 = s; if (local_index < _e40) { uint _e42 = s; uint k = local_index + _e42; metal::float3 _e46 = smin.inner[local_index]; metal::float3 _e48 = smin.inner[k]; smin.inner[local_index] = metal::min(_e46, _e48); metal::float3 _e52 = smax.inner[local_index]; metal::float3 _e54 = smax.inner[k]; smax.inner[local_index] = metal::max(_e52, _e54); } metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); } if (local_index == 0u) { metal::float3 _e63 = smin.inner[0]; bounding[group_id.x].bound_min = _e63; metal::float3 _e69 = smax.inner[0]; bounding[group_id.x].bound_max = _e69; return; } else { return; } } kernel void bounding_box( device type_6 const& nodeSrc [[user(fake0)]] , device type_10& bounding [[user(fake0)]] , device BHTree& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 bound_min_min = {}; metal::float3 bound_max_max = {}; uint i = 0u; metal::float3 _e13 = bounding[0].bound_min; bound_min_min = _e13; metal::float3 _e18 = bounding[0].bound_max; bound_max_max = _e18; uint node_group_count = static_cast(metal::ceil(static_cast(1 + (_buffer_sizes.size1 - 0 - 48) / 48) / 256.0)); bool loop_init_1 = true; while(true) { if (!loop_init_1) { uint _e30 = i; i = _e30 + 1u; } loop_init_1 = false; uint _e28 = i; if (_e28 < node_group_count) { } else { break; } metal::float3 _e33 = bound_min_min; uint _e34 = i; metal::float3 _e37 = bounding[_e34].bound_min; bound_min_min = metal::min(_e33, _e37); metal::float3 _e39 = bound_max_max; uint _e40 = i; metal::float3 _e43 = bounding[_e40].bound_max; bound_max_max = metal::max(_e39, _e43); } metal::float3 _e48 = bound_min_min; bounding[0].bound_min = _e48; metal::float3 _e52 = bound_max_max; bounding[0].bound_max = _e52; metal::float3 _e53 = bound_max_max; metal::float3 _e54 = bound_min_min; metal::float3 box = _e53 - _e54; uint tree_node_count = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; bhTree.radius = metal::max(metal::max(box.x, box.y), box.z) * 0.5; metal::atomic_store_explicit(&bhTree.bottom, tree_node_count, metal::memory_order_relaxed); metal::atomic_store_explicit(&bhTree.max_depth, 0u, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[tree_node_count].mass, -1, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[tree_node_count].start, 0, metal::memory_order_relaxed); metal::float3 _e78 = bound_min_min; metal::float3 _e79 = bound_max_max; treeNode[tree_node_count].position = (_e78 + _e79) * 0.5; treeNode[tree_node_count].count = -1; treeNode[tree_node_count].sort = 0; return; } struct clear_1_Input { }; kernel void clear_1_( metal::uint3 global_invocation_id_4 [[thread_position_in_grid]] , device type_11 const& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint i_1 = 0u; uint total_5 = 1 + (_buffer_sizes.size6 - 0 - 32) / 32; uint index_9 = global_invocation_id_4.x; if (index_9 >= total_5) { return; } bool loop_init_2 = true; while(true) { if (!loop_init_2) { uint _e19 = i_1; i_1 = _e19 + 1u; } loop_init_2 = false; uint _e16 = i_1; if (_e16 < 8u) { } else { break; } uint _e24 = i_1; metal::atomic_store_explicit(&treeChild[(index_9 * 8u) + _e24], -1, metal::memory_order_relaxed); } return; } struct tree_buildingInput { }; kernel void tree_building( metal::uint3 global_invocation_id_5 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree& bhTree [[user(fake0)]] , device type_11 const& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_1 = {}; int skip = 1; metal::float3 pos = {}; metal::float3 dp = {}; metal::float3 rdp = {}; uint n = {}; uint depth = 1u; uint local_max_depth = 1u; uint j = 0u; float root_r = {}; float r = {}; int limit = 10000; int ch = {}; int locked_ch = {}; int v = {}; int v_1 = {}; index_1 = global_invocation_id_5.x; uint node_count = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint tree_node_count_1 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; metal::float3 root_pos = treeNode[tree_node_count_1].position; uint inc = metal::min(node_count, 16384u); n = tree_node_count_1; float _e35 = bhTree.radius; root_r = _e35; float _e37 = root_r; r = _e37 * 0.5; while(true) { uint _e43 = index_1; if (_e43 < node_count) { } else { break; } int _e45 = limit; limit = _e45 - 1; int _e48 = limit; if (_e48 < 0) { return; } int _e51 = skip; if (_e51 != 0) { skip = 0; uint _e55 = index_1; metal::float3 _e58 = nodeSrc[_e55].position; pos = _e58; n = tree_node_count_1; float _e59 = root_r; r = _e59 * 0.5; depth = 1u; metal::float3 _e63 = pos; metal::float3 compare = metal::step(root_pos, _e63); j = (static_cast(compare.x) << 0u) | ((static_cast(compare.y) << 1u) + (static_cast(compare.z) << 2u)); float _e79 = r; float _e82 = r; dp = metal::float3(-_e79) + (compare * (2.0 * _e82)); metal::float3 _e87 = dp; rdp = root_pos + _e87; } uint _e89 = n; uint _e92 = j; int _e95 = metal::atomic_load_explicit(&treeChild[(_e89 * 8u) + _e92], metal::memory_order_relaxed); ch = _e95; while(true) { int _e97 = ch; if (_e97 >= static_cast(node_count)) { } else { break; } int _e100 = ch; n = static_cast(_e100); uint _e102 = depth; depth = _e102 + 1u; float _e105 = r; r = _e105 * 0.5; metal::float3 _e108 = rdp; metal::float3 _e109 = pos; metal::float3 compare_1 = metal::step(_e108, _e109); j = (static_cast(compare_1.x) << 0u) | ((static_cast(compare_1.y) << 1u) + (static_cast(compare_1.z) << 2u)); float _e125 = r; float _e128 = r; dp = metal::float3(-_e125) + (compare_1 * (2.0 * _e128)); metal::float3 _e133 = rdp; metal::float3 _e134 = dp; rdp = _e133 + _e134; uint _e136 = n; uint _e139 = j; int _e142 = metal::atomic_load_explicit(&treeChild[(_e136 * 8u) + _e139], metal::memory_order_relaxed); ch = _e142; } uint _e143 = n; uint _e146 = j; uint locked = (_e143 * 8u) + _e146; locked_ch = -1; int _e150 = ch; if (_e150 != -2) { int _e153 = ch; if (_e153 == -1) { v = -1; int _e159 = v; uint _e160 = index_1; metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e159, static_cast(_e160), metal::memory_order_relaxed, metal::memory_order_relaxed); if (_e159 == -1) { uint _e165 = depth; uint _e166 = local_max_depth; local_max_depth = metal::max(_e165, _e166); uint _e168 = index_1; index_1 = _e168 + inc; skip = 1; } else { skip = 0; } } else { int _e172 = ch; v_1 = _e172; int _e175 = v_1; metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e175, -2, metal::memory_order_relaxed, metal::memory_order_relaxed); int _e178 = ch; if (_e178 == _e175) { int _e180 = ch; metal::float3 _e183 = nodeSrc[_e180].position; metal::float3 _e184 = pos; if (metal::all(_e183 == _e184)) { uint _e187 = index_1; metal::float3 _e190 = nodeSrc[_e187].position; nodeSrc[_e187].position = _e190 + metal::float3(0.10000000149011612, -0.05000000074505806, 0.10000000149011612); skip = 0; int _e198 = ch; metal::atomic_store_explicit(&treeChild[locked], _e198, metal::memory_order_relaxed); break; } locked_ch = -1; while(true) { uint _e202 = metal::atomic_fetch_sub_explicit(&bhTree.bottom, 1u, metal::memory_order_relaxed); uint cell = _e202 - 1u; if (cell <= node_count) { return; } int _e206 = locked_ch; if (_e206 != -1) { uint _e209 = n; uint _e212 = j; metal::atomic_store_explicit(&treeChild[(_e209 * 8u) + _e212], static_cast(cell), metal::memory_order_relaxed); } int _e216 = locked_ch; locked_ch = metal::max(_e216, static_cast(cell)); uint _e219 = depth; depth = _e219 + 1u; n = cell; float _e222 = r; r = _e222 * 0.5; metal::float3 _e225 = rdp; int _e226 = ch; metal::float3 _e229 = nodeSrc[_e226].position; metal::float3 compare_2 = metal::step(_e225, _e229); j = (static_cast(compare_2.x) << 0u) | ((static_cast(compare_2.y) << 1u) + (static_cast(compare_2.z) << 2u)); uint _e247 = j; int _e250 = ch; metal::atomic_store_explicit(&treeChild[(cell * 8u) + _e247], _e250, metal::memory_order_relaxed); metal::float3 _e251 = rdp; metal::float3 _e252 = pos; metal::float3 compare_3 = metal::step(_e251, _e252); j = (static_cast(compare_3.x) << 0u) | ((static_cast(compare_3.y) << 1u) + (static_cast(compare_3.z) << 2u)); float _e268 = r; float _e271 = r; dp = metal::float3(-_e268) + (compare_3 * (2.0 * _e271)); metal::float3 _e276 = rdp; metal::float3 _e277 = dp; rdp = _e276 + _e277; uint _e279 = n; uint _e282 = j; int _e285 = metal::atomic_load_explicit(&treeChild[(_e279 * 8u) + _e282], metal::memory_order_relaxed); ch = _e285; int _e286 = ch; if (_e286 < 0) { break; } } uint _e289 = n; uint _e292 = j; uint _e295 = index_1; metal::atomic_store_explicit(&treeChild[(_e289 * 8u) + _e292], static_cast(_e295), metal::memory_order_relaxed); uint _e297 = depth; uint _e298 = local_max_depth; local_max_depth = metal::max(_e297, _e298); uint _e300 = index_1; index_1 = _e300 + inc; skip = 2; } } } metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); int _e303 = skip; if (_e303 == 2) { int _e307 = locked_ch; metal::atomic_store_explicit(&treeChild[locked], _e307, metal::memory_order_relaxed); } } uint _e309 = local_max_depth; uint _e310 = metal::atomic_fetch_max_explicit(&bhTree.max_depth, _e309, metal::memory_order_relaxed); return; } struct clear_2_Input { }; kernel void clear_2_( metal::uint3 global_invocation_id_6 [[thread_position_in_grid]] , device type_11& treeNode [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint total_6 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint index_10 = global_invocation_id_6.x; if (index_10 >= total_6) { return; } treeNode[index_10].position = metal::float3(0.0); treeNode[index_10].count = -1; treeNode[index_10].sort = 0; metal::atomic_store_explicit(&treeNode[index_10].start, -1, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[index_10].mass, -1, metal::memory_order_relaxed); return; } struct summarizationInput { }; kernel void summarization( metal::uint3 global_invocation_id_7 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , device type_9 const& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_2 = {}; int cm = 0; type_14 schild = {}; type_15 smass = {}; int j_1 = 0; uint ch_1 = {}; uint i_2 = {}; metal::float3 pos_1 = {}; int cnt = {}; int j_2 = 0; bool flag = false; uint i_3 = {}; uint i_4 = {}; metal::float3 pos_2 = {}; int cnt_1 = {}; uint i_5 = {}; uint bottom = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed); uint tree_node_count_2 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint node_count_1 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_1 = metal::min(node_count_1, 16384u); index_2 = static_cast((static_cast(bottom) & -32) + static_cast(global_invocation_id_7.x)); uint _e27 = index_2; if (_e27 < bottom) { uint _e29 = index_2; index_2 = _e29 + inc_1; } uint restart = index_2; bool loop_init_3 = true; while(true) { if (!loop_init_3) { int _e41 = j_1; j_1 = _e41 + 1; } loop_init_3 = false; int _e38 = j_1; if (_e38 < 5) { } else { break; } while(true) { uint _e44 = index_2; if (_e44 <= tree_node_count_2) { } else { break; } uint _e46 = index_2; int _e49 = metal::atomic_load_explicit(&treeNode[_e46].mass, metal::memory_order_relaxed); if (_e49 < 0) { ch_1 = 0u; i_2 = 0u; i_2 = 0u; bool loop_init_4 = true; while(true) { if (!loop_init_4) { uint _e60 = i_2; i_2 = _e60 + 1u; } loop_init_4 = false; uint _e57 = i_2; if (_e57 < 8u) { } else { break; } uint _e63 = index_2; uint _e66 = i_2; int _e69 = metal::atomic_load_explicit(&treeChild[(_e63 * 8u) + _e66], metal::memory_order_relaxed); ch_1 = static_cast(_e69); uint _e71 = i_2; uint _e73 = ch_1; schild.inner[_e71] = _e73; uint _e74 = i_2; uint _e76 = ch_1; int _e79 = metal::atomic_load_explicit(&treeNode[_e76].mass, metal::memory_order_relaxed); smass.inner[_e74] = _e79; uint _e80 = ch_1; uint _e82 = i_2; int _e84 = smass.inner[_e82]; if ((_e80 >= node_count_1) && (_e84 < 0)) { break; } } uint _e88 = i_2; if (_e88 == 8u) { pos_1 = metal::float3(0.0); cnt = 0; i_2 = 0u; bool loop_init_5 = true; while(true) { if (!loop_init_5) { uint _e100 = i_2; i_2 = _e100 + 1u; } loop_init_5 = false; uint _e97 = i_2; if (_e97 < 8u) { } else { break; } uint _e103 = i_2; uint _e105 = schild.inner[_e103]; ch_1 = _e105; uint _e106 = ch_1; if (_e106 >= node_count_1) { uint _e108 = i_2; int m = smass.inner[_e108]; int _e111 = cnt; uint _e112 = ch_1; int _e115 = treeNode[_e112].count; cnt = _e111 + _e115; metal::float3 _e117 = pos_1; uint _e118 = ch_1; metal::float3 _e121 = treeNode[_e118].position; pos_1 = _e117 + (_e121 * static_cast(m)); int _e125 = cm; cm = _e125 + m; } else { uint _e127 = ch_1; uint _e130 = metal::atomic_load_explicit(&nodeSrc[_e127].mass, metal::memory_order_relaxed); int m_1 = static_cast(_e130); int _e132 = cnt; cnt = _e132 + 1; metal::float3 _e135 = pos_1; uint _e136 = ch_1; metal::float3 _e139 = nodeSrc[_e136].position; pos_1 = _e135 + (_e139 * static_cast(m_1)); int _e143 = cm; cm = _e143 + m_1; } } uint _e145 = index_2; int _e148 = cnt; treeNode[_e145].count = _e148; uint _e149 = index_2; metal::float3 _e152 = pos_1; int _e153 = cm; treeNode[_e149].position = _e152 / metal::float3(static_cast(_e153)); uint _e157 = index_2; int _e160 = cm; metal::atomic_store_explicit(&treeNode[_e157].mass, _e160, metal::memory_order_relaxed); } } uint _e161 = index_2; index_2 = _e161 + inc_1; } index_2 = restart; } while(true) { uint _e167 = index_2; if (_e167 <= tree_node_count_2) { } else { break; } uint _e169 = index_2; uint _e173 = index_2; uint _e175 = index_2; int _e178 = metal::atomic_load_explicit(&treeNode[_e175].mass, metal::memory_order_relaxed); if (_e169 < node_count_1) { uint _e171 = index_2; index_2 = _e171 + inc_1; } else { if ((_e173 >= node_count_1) && (_e178 >= 0)) { uint _e182 = index_2; index_2 = _e182 + inc_1; } else { int _e184 = j_2; if (_e184 == 0) { j_2 = 8; i_3 = 0u; bool loop_init_6 = true; while(true) { if (!loop_init_6) { uint _e193 = i_3; i_3 = _e193 + 1u; } loop_init_6 = false; uint _e190 = i_3; if (_e190 < 8u) { } else { break; } uint _e196 = index_2; uint _e199 = i_3; int _e202 = metal::atomic_load_explicit(&treeChild[(_e196 * 8u) + _e199], metal::memory_order_relaxed); uint ch_2 = static_cast(_e202); uint _e204 = i_3; schild.inner[_e204] = ch_2; uint _e206 = i_3; int _e210 = metal::atomic_load_explicit(&treeNode[ch_2].mass, metal::memory_order_relaxed); smass.inner[_e206] = _e210; uint _e212 = i_3; int _e214 = smass.inner[_e212]; if ((ch_2 < node_count_1) || (_e214 >= 0)) { int _e218 = j_2; j_2 = _e218 - 1; } } } else { j_2 = 8; i_4 = 0u; bool loop_init_7 = true; while(true) { if (!loop_init_7) { uint _e227 = i_4; i_4 = _e227 + 1u; } loop_init_7 = false; uint _e224 = i_4; if (_e224 < 8u) { } else { break; } uint _e230 = i_4; uint ch_3 = schild.inner[_e230]; uint _e233 = i_4; int old_mass = smass.inner[_e233]; uint _e236 = i_4; int _e240 = metal::atomic_load_explicit(&treeNode[ch_3].mass, metal::memory_order_relaxed); smass.inner[_e236] = _e240; uint _e245 = i_4; int _e247 = smass.inner[_e245]; if (((ch_3 < node_count_1) || (old_mass >= 0)) || (_e247 >= 0)) { int _e251 = j_2; j_2 = _e251 - 1; } } } int _e254 = j_2; if (_e254 == 0) { cm = 0; pos_2 = metal::float3(0.0); cnt_1 = 0; i_5 = 0u; bool loop_init_8 = true; while(true) { if (!loop_init_8) { uint _e268 = i_5; i_5 = _e268 + 1u; } loop_init_8 = false; uint _e265 = i_5; if (_e265 < 8u) { } else { break; } uint _e271 = i_5; uint ch_4 = schild.inner[_e271]; if (ch_4 >= node_count_1) { uint _e275 = i_5; int m_2 = smass.inner[_e275]; int _e278 = cnt_1; int _e281 = treeNode[ch_4].count; cnt_1 = _e278 + _e281; metal::float3 _e283 = pos_2; metal::float3 _e286 = treeNode[ch_4].position; pos_2 = _e283 + (_e286 * static_cast(m_2)); int _e290 = cm; cm = _e290 + m_2; } else { uint _e294 = metal::atomic_load_explicit(&nodeSrc[ch_4].mass, metal::memory_order_relaxed); int m_3 = static_cast(_e294); int _e296 = cnt_1; cnt_1 = _e296 + 1; metal::float3 _e299 = pos_2; metal::float3 _e302 = nodeSrc[ch_4].position; pos_2 = _e299 + (_e302 * static_cast(m_3)); int _e306 = cm; cm = _e306 + m_3; } } uint _e308 = index_2; int _e311 = cnt_1; treeNode[_e308].count = _e311; uint _e312 = index_2; metal::float3 _e315 = pos_2; int _e316 = cm; treeNode[_e312].position = _e315 / metal::float3(static_cast(_e316)); flag = true; } } } bool _e321 = flag; if (_e321) { uint _e322 = index_2; if (_e322 < node_count_1) { uint _e324 = index_2; int _e327 = cm; metal::atomic_store_explicit(&nodeSrc[_e324].mass, static_cast(_e327), metal::memory_order_relaxed); } else { uint _e329 = index_2; int _e332 = cm; metal::atomic_store_explicit(&treeNode[_e329].mass, _e332, metal::memory_order_relaxed); } uint _e333 = index_2; index_2 = _e333 + inc_1; flag = false; } } return; } struct sortInput { }; kernel void sort( metal::uint3 global_invocation_id_8 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_3 = {}; int limit_1 = 1000; int start = {}; uint j_3 = {}; uint i_6 = {}; uint tree_node_count_3 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint bottom_1 = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed); uint node_count_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_2 = metal::min(node_count_2, 16384u); index_3 = ((tree_node_count_3 + 1u) - inc_2) + global_invocation_id_8.x; while(true) { uint _e27 = index_3; if (_e27 >= bottom_1) { } else { break; } int _e29 = limit_1; limit_1 = _e29 - 1; int _e32 = limit_1; if (_e32 < 0) { uint _e35 = index_3; metal::atomic_store_explicit(&treeChild[_e35], 1000, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeChild[0], 1000, metal::memory_order_relaxed); return; } metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); uint _e41 = index_3; int _e44 = metal::atomic_load_explicit(&treeNode[_e41].start, metal::memory_order_relaxed); start = _e44; int _e46 = start; if (_e46 >= 0) { j_3 = 0u; i_6 = 0u; bool loop_init_9 = true; while(true) { if (!loop_init_9) { uint _e56 = i_6; i_6 = _e56 + 1u; } loop_init_9 = false; uint _e53 = i_6; if (_e53 < 8u) { } else { break; } uint _e59 = index_3; uint _e62 = i_6; int ch_5 = metal::atomic_load_explicit(&treeChild[(_e59 * 8u) + _e62], metal::memory_order_relaxed); if (ch_5 >= 0) { uint _e68 = i_6; uint _e69 = j_3; if (_e68 != _e69) { uint _e71 = index_3; uint _e74 = i_6; metal::atomic_store_explicit(&treeChild[(_e71 * 8u) + _e74], -1, metal::memory_order_relaxed); uint _e78 = index_3; uint _e81 = j_3; metal::atomic_store_explicit(&treeChild[(_e78 * 8u) + _e81], ch_5, metal::memory_order_relaxed); } uint _e84 = j_3; j_3 = _e84 + 1u; if (ch_5 >= static_cast(node_count_2)) { int _e91 = start; metal::atomic_store_explicit(&treeNode[ch_5].start, _e91, metal::memory_order_relaxed); int _e92 = start; int _e95 = treeNode[ch_5].count; start = _e92 + _e95; } else { int _e97 = start; treeNode[_e97].sort = ch_5; int _e100 = start; start = _e100 + 1; } } } uint _e103 = index_3; if (_e103 < inc_2) { break; } uint _e105 = index_3; index_3 = _e105 - inc_2; } } return; } struct electron_forceInput { }; kernel void electron_force( metal::uint3 global_invocation_id_9 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11 const& treeNode [[user(fake0)]] , device type_9 const& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { type_17 spos = {}; type_17 snode = {}; type_18 sdq = {}; uint j_4 = 1u; uint index_4 = {}; metal::float3 af = {}; uint depth_1 = {}; uint pd = {}; uint nd = {}; metal::float3 dp_1 = {}; uint tree_node_count_4 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint node_count_3 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_3 = metal::min(node_count_3, 16384u); float epssq = 0.05000000074505806 * 0.05000000074505806; float _e26 = bhTree.radius; float diameter = _e26 * 2.0; uint max_depth = metal::atomic_load_explicit(&bhTree.max_depth, metal::memory_order_relaxed); sdq.inner[0] = (diameter * diameter) * 1.0; bool loop_init_10 = true; while(true) { if (!loop_init_10) { uint _e39 = j_4; j_4 = _e39 + 1u; } loop_init_10 = false; uint _e37 = j_4; if (_e37 < max_depth) { } else { break; } uint _e42 = j_4; uint _e44 = j_4; float _e48 = sdq.inner[_e44 - 1u]; sdq.inner[_e42] = _e48 * 0.25; uint _e51 = j_4; float _e55 = sdq.inner[_e51 - 1u]; sdq.inner[_e51 - 1u] = _e55 + epssq; } float _e60 = sdq.inner[max_depth - 1u]; sdq.inner[max_depth - 1u] = _e60 + epssq; if (max_depth < 48u) { index_4 = global_invocation_id_9.x; bool loop_init_11 = true; while(true) { if (!loop_init_11) { uint _e68 = index_4; index_4 = _e68 + inc_3; } loop_init_11 = false; uint _e66 = index_4; if (_e66 < node_count_3) { } else { break; } uint _e70 = index_4; int order = treeNode[_e70].sort; metal::float3 pos_4 = nodeSrc[order].position; af = metal::float3(0.0); depth_1 = 0u; spos.inner[0] = 0u; snode.inner[0] = tree_node_count_4; while(true) { uint _e87 = depth_1; uint _e89 = spos.inner[_e87]; pd = _e89; uint _e91 = depth_1; uint _e93 = snode.inner[_e91]; nd = _e93; while(true) { uint _e95 = pd; if (_e95 < 8u) { } else { break; } uint _e98 = nd; uint _e101 = pd; int n_i32_ = metal::atomic_load_explicit(&treeChild[(_e98 * 8u) + _e101], metal::memory_order_relaxed); uint _e105 = pd; pd = _e105 + 1u; if (n_i32_ >= 0) { uint n_1 = static_cast(n_i32_); if (n_1 < node_count_3) { metal::float3 _e115 = nodeSrc[n_1].position; dp_1 = pos_4 - _e115; } else { metal::float3 _e119 = treeNode[n_1].position; dp_1 = pos_4 - _e119; } metal::float3 _e121 = dp_1; metal::float3 _e122 = dp_1; float dist2_ = metal::dot(_e121, _e122); if (n_1 < node_count_3) { if (dist2_ > 0.0) { uint _e129 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed); uint _e134 = metal::atomic_load_explicit(&nodeSrc[n_1].mass, metal::memory_order_relaxed); float factor = ((0.0003000000142492354 * static_cast(_e129)) * static_cast(_e134)) / dist2_; metal::float3 _e138 = af; metal::float3 _e139 = dp_1; af = _e138 + (_e139 * factor); } } else { uint _e142 = depth_1; float _e144 = sdq.inner[_e142]; if (dist2_ >= _e144) { if (dist2_ > 0.0) { uint _e150 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed); int _e155 = metal::atomic_load_explicit(&treeNode[n_1].mass, metal::memory_order_relaxed); float factor_1 = ((0.0003000000142492354 * static_cast(_e150)) * static_cast(_e155)) / dist2_; metal::float3 _e159 = af; metal::float3 _e160 = dp_1; af = _e159 + (_e160 * factor_1); } } else { uint _e163 = depth_1; uint _e165 = pd; spos.inner[_e163] = _e165; uint _e166 = depth_1; uint _e168 = nd; snode.inner[_e166] = _e168; uint _e169 = depth_1; depth_1 = _e169 + 1u; pd = 0u; nd = n_1; } } } else { pd = 8u; } } uint _e174 = depth_1; if (_e174 == 0u) { break; } uint _e177 = depth_1; depth_1 = _e177 - 1u; } metal::float3 _e182 = nodeSrc[order].force; metal::float3 _e183 = af; nodeSrc[order].force = _e182 + (_e183 * 0.10000000149011612); } return; } else { return; } } struct main_Input { }; kernel void main_( metal::uint3 global_invocation_id_10 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 spring_force = {}; uint total_7 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_11 = global_invocation_id_10.x; if (index_11 >= total_7) { return; } metal::float3 vPos_3 = nodeSrc[index_11].position; uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_11].mass, metal::memory_order_relaxed); float mass_1 = static_cast(_e19); spring_force = metal::float3(0.0); int _e31 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 0u], metal::memory_order_relaxed); spring_force.x = as_type(_e31); int _e39 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 1u], metal::memory_order_relaxed); spring_force.y = as_type(_e39); int _e47 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 2u], metal::memory_order_relaxed); spring_force.z = as_type(_e47); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 0u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 1u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 2u], 0, metal::memory_order_relaxed); metal::float3 _e67 = spring_force; spring_force = _e67 * 100.0; metal::float3 _e72 = nodeSrc[index_11].force; metal::float3 _e73 = spring_force; nodeSrc[index_11].force = _e72 + _e73; return; } struct displacementInput { }; kernel void displacement( metal::uint3 global_invocation_id_11 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint total_8 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_12 = global_invocation_id_11.x; if (index_12 >= total_8) { return; } metal::float3 _e17 = nodeSrc[index_12].force; metal::float3 _e20 = nodeSrc[index_12].prev_force; metal::float3 d_force = _e17 - _e20; float swg = metal::sqrt(metal::dot(d_force, d_force)); uint _e31 = metal::atomic_load_explicit(&nodeSrc[index_12].mass, metal::memory_order_relaxed); float factor_2 = (1.0 / (1.0 + metal::sqrt(1.0 * swg))) / static_cast(_e31); metal::float3 force = nodeSrc[index_12].force; nodeSrc[index_12].force = metal::float3(0.0); nodeSrc[index_12].prev_force = force; metal::float3 _e45 = nodeSrc[index_12].position; nodeSrc[index_12].position = _e45 + ((force * factor_2) * 0.009999999776482582); return; } struct randomizeInput { }; kernel void randomize( metal::uint3 global_invocation_id_12 [[thread_position_in_grid]] , constant Uniforms& uniforms [[user(fake0)]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos_1 = {}; uint total_9 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_13 = global_invocation_id_12.x; if (index_13 >= total_9) { return; } metal::float3 _e16 = nodeSrc[index_13].position; vPos_1 = _e16; uint _e22 = uniforms.frame_num; float _e25 = random_xy(index_13, 0u + (3u * _e22)); vPos_1.x = (_e25 * 2.0) - 1.0; uint _e34 = uniforms.frame_num; float _e37 = random_xy(index_13, 1u + (3u * _e34)); vPos_1.y = (_e37 * 2.0) - 1.0; uint _e46 = uniforms.frame_num; float _e49 = random_xy(index_13, 2u + (3u * _e46)); vPos_1.z = (_e49 * 2.0) - 1.0; metal::float3 _e56 = vPos_1; nodeSrc[index_13].position = _e56; nodeSrc[index_13].force = metal::float3(0.0); nodeSrc[index_13].prev_force = metal::float3(0.0); return; } struct copyInput { }; kernel void copy( metal::uint3 global_invocation_id_13 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos_2 = {}; uint total_10 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_14 = global_invocation_id_13.x; if (index_14 >= total_10) { return; } metal::float3 _e16 = nodeSrc[index_14].position; vPos_2 = _e16; return; } ================================================ FILE: lib/naga/benches/criterion.rs ================================================ use criterion::*; use std::{fs, path::PathBuf, slice}; fn gather_inputs(folder: &str, extension: &str) -> Vec> { let mut list = Vec::new(); let read_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join(folder) .read_dir() .unwrap(); for file_entry in read_dir { match file_entry { Ok(entry) => match entry.path().extension() { Some(ostr) if &*ostr == extension => { let input = fs::read(entry.path()).unwrap_or_default(); list.push(input.into_boxed_slice()); } _ => continue, }, Err(e) => { log::warn!("Skipping file: {:?}", e); continue; } } } list } fn parse_glsl(stage: naga::ShaderStage, inputs: &[Box<[u8]>]) { let mut parser = naga::front::glsl::Parser::default(); let options = naga::front::glsl::Options { stage, defines: Default::default(), }; for input in inputs.iter() { let string = std::str::from_utf8(input).unwrap(); parser.parse(&options, string).unwrap(); } } fn frontends(c: &mut Criterion) { let mut group = c.benchmark_group("front"); #[cfg(all(feature = "wgsl-in", feature = "serialize", feature = "deserialize"))] group.bench_function("bin", |b| { let inputs_wgsl = gather_inputs("tests/in", "wgsl"); let mut parser = naga::front::wgsl::Parser::new(); let inputs_bin = inputs_wgsl .iter() .map(|input| { let string = std::str::from_utf8(input).unwrap(); let module = parser.parse(string).unwrap(); bincode::serialize(&module).unwrap() }) .collect::>(); b.iter(move || { for input in inputs_bin.iter() { bincode::deserialize::(input).unwrap(); } }); }); #[cfg(feature = "wgsl-in")] group.bench_function("wgsl", |b| { let inputs_wgsl = gather_inputs("tests/in", "wgsl"); let inputs = inputs_wgsl .iter() .map(|input| std::str::from_utf8(input).unwrap()) .collect::>(); let mut parser = naga::front::wgsl::Parser::new(); b.iter(move || { for &input in inputs.iter() { parser.parse(input).unwrap(); } }); }); #[cfg(feature = "spv-in")] group.bench_function("spv", |b| { let inputs = gather_inputs("tests/in/spv", "spv"); b.iter(move || { let options = naga::front::spv::Options::default(); for input in inputs.iter() { let spv = unsafe { slice::from_raw_parts(input.as_ptr() as *const u32, input.len() / 4) }; let parser = naga::front::spv::Parser::new(spv.iter().cloned(), &options); parser.parse().unwrap(); } }); }); #[cfg(feature = "glsl-in")] group.bench_function("glsl", |b| { let vert = gather_inputs("tests/in/glsl", "vert"); b.iter(move || parse_glsl(naga::ShaderStage::Vertex, &vert)); let frag = gather_inputs("tests/in/glsl", "frag"); b.iter(move || parse_glsl(naga::ShaderStage::Vertex, &frag)); //TODO: hangs for some reason! //let comp = gather_inputs("tests/in/glsl", "comp"); //b.iter(move || parse_glsl(naga::ShaderStage::Compute, &comp)); }); } #[cfg(feature = "wgsl-in")] fn gather_modules() -> Vec { let inputs = gather_inputs("tests/in", "wgsl"); let mut parser = naga::front::wgsl::Parser::new(); inputs .iter() .map(|input| { let string = std::str::from_utf8(input).unwrap(); parser.parse(string).unwrap() }) .collect() } #[cfg(not(feature = "wgsl-in"))] fn gather_modules() -> Vec { Vec::new() } fn validation(c: &mut Criterion) { let inputs = gather_modules(); let mut group = c.benchmark_group("valid"); #[cfg(feature = "validate")] group.bench_function("safe", |b| { let mut validator = naga::valid::Validator::new( naga::valid::ValidationFlags::all(), naga::valid::Capabilities::all(), ); b.iter(|| { for input in inputs.iter() { validator.validate(input).unwrap(); } }); }); #[cfg(feature = "validate")] group.bench_function("unsafe", |b| { let mut validator = naga::valid::Validator::new( naga::valid::ValidationFlags::empty(), naga::valid::Capabilities::all(), ); b.iter(|| { for input in inputs.iter() { validator.validate(input).unwrap(); } }); }); } fn backends(c: &mut Criterion) { #[cfg(feature = "validate")] let inputs = { let mut validator = naga::valid::Validator::new( naga::valid::ValidationFlags::empty(), naga::valid::Capabilities::empty(), ); let input_modules = gather_modules(); input_modules .into_iter() .flat_map(|module| validator.validate(&module).ok().map(|info| (module, info))) .collect::>() }; #[cfg(not(feature = "validate"))] let inputs = Vec::<(naga::Module, naga::valid::ModuleInfo)>::new(); let mut group = c.benchmark_group("back"); #[cfg(feature = "wgsl-out")] group.bench_function("wgsl", |b| { b.iter(|| { let mut string = String::new(); let flags = naga::back::wgsl::WriterFlags::empty(); for &(ref module, ref info) in inputs.iter() { let mut writer = naga::back::wgsl::Writer::new(&mut string, flags); writer.write(module, info).unwrap(); string.clear(); } }); }); #[cfg(feature = "spv-out")] group.bench_function("spv", |b| { b.iter(|| { let mut data = Vec::new(); let options = naga::back::spv::Options::default(); for &(ref module, ref info) in inputs.iter() { let mut writer = naga::back::spv::Writer::new(&options).unwrap(); writer.write(module, info, None, &mut data).unwrap(); data.clear(); } }); }); #[cfg(feature = "spv-out")] group.bench_function("spv-separate", |b| { b.iter(|| { let mut data = Vec::new(); let options = naga::back::spv::Options::default(); for &(ref module, ref info) in inputs.iter() { let mut writer = naga::back::spv::Writer::new(&options).unwrap(); for ep in module.entry_points.iter() { let pipeline_options = naga::back::spv::PipelineOptions { shader_stage: ep.stage, entry_point: ep.name.clone(), }; writer .write(module, info, Some(&pipeline_options), &mut data) .unwrap(); data.clear(); } } }); }); #[cfg(feature = "msl-out")] group.bench_function("msl", |b| { b.iter(|| { let mut string = String::new(); let options = naga::back::msl::Options::default(); for &(ref module, ref info) in inputs.iter() { let pipeline_options = naga::back::msl::PipelineOptions::default(); let mut writer = naga::back::msl::Writer::new(&mut string); writer .write(module, info, &options, &pipeline_options) .unwrap(); string.clear(); } }); }); #[cfg(feature = "hlsl-out")] group.bench_function("hlsl", |b| { b.iter(|| { let options = naga::back::hlsl::Options::default(); let mut string = String::new(); for &(ref module, ref info) in inputs.iter() { let mut writer = naga::back::hlsl::Writer::new(&mut string, &options); let _ = writer.write(module, info); // may fail on unimplemented things string.clear(); } }); }); #[cfg(feature = "glsl-out")] group.bench_function("glsl-separate", |b| { b.iter(|| { let mut string = String::new(); let options = naga::back::glsl::Options { version: naga::back::glsl::Version::new_gles(320), writer_flags: naga::back::glsl::WriterFlags::empty(), binding_map: Default::default(), }; for &(ref module, ref info) in inputs.iter() { for ep in module.entry_points.iter() { let pipeline_options = naga::back::glsl::PipelineOptions { shader_stage: ep.stage, entry_point: ep.name.clone(), multiview: None, }; match naga::back::glsl::Writer::new( &mut string, module, info, &options, &pipeline_options, naga::proc::BoundsCheckPolicies::default(), ) { Ok(mut writer) => { let _ = writer.write(); // can error if unsupported } Err(_) => { // missing features } }; string.clear(); } } }); }); } criterion_group!(criterion, frontends, validation, backends,); criterion_main!(criterion); ================================================ FILE: lib/naga/cli/Cargo.toml ================================================ [package] name = "naga-cli" version = "0.10.0" authors = ["Naga Developers"] edition = "2018" description = "Shader translation command line tool" homepage = "https://github.com/gfx-rs/naga" repository = "https://github.com/gfx-rs/naga" keywords = ["shader", "SPIR-V", "GLSL", "MSL"] license = "MIT OR Apache-2.0" [[bin]] name = "naga" path = "src/main.rs" [dependencies] naga = { version = "0.10", path = "../", features = ["validate", "span", "wgsl-in", "wgsl-out", "glsl-in", "glsl-out", "spv-in", "spv-out", "msl-out", "hlsl-out", "dot-out", "serialize", "deserialize"] } bincode = "1" log = "0.4" codespan-reporting = "0.11" env_logger = "0.9" argh = "0.1.5" rspirv = "0.11.0" ================================================ FILE: lib/naga/cli/src/main.rs ================================================ #![allow(clippy::manual_strip)] #[allow(unused_imports)] use std::fs; use std::{error::Error, fmt, io::Read, path::Path, str::FromStr}; /// Translate shaders to different formats. #[derive(argh::FromArgs, Debug, Clone)] struct Args { /// bitmask of the ValidationFlags to be used, use 0 to disable validation #[argh(option)] validate: Option, /// what policy to use for index bounds checking for arrays, vectors, and /// matrices. /// /// May be `Restrict` (force all indices in-bounds), `ReadZeroSkipWrite` /// (out-of-bounds indices read zeros, and don't write at all), or /// `Unchecked` (generate the simplest code, and whatever happens, happens) /// /// `Unchecked` is the default. #[argh(option)] index_bounds_check_policy: Option, /// what policy to use for index bounds checking for arrays, vectors, and /// matrices, when they are stored in globals in the `storage` or `uniform` /// storage classes. /// /// Possible values are the same as for `index-bounds-check-policy`. If /// omitted, defaults to the index bounds check policy. #[argh(option)] buffer_bounds_check_policy: Option, /// what policy to use for texture bounds checking. /// /// Possible values are the same as for `index-bounds-check-policy`. If /// omitted, defaults to the index bounds check policy. #[argh(option)] image_bounds_check_policy: Option, /// directory to dump the SPIR-V block context dump to #[argh(option)] block_ctx_dir: Option, /// the shader entrypoint to use when compiling to GLSL #[argh(option)] entry_point: Option, /// the shader profile to use, for example `es`, `core`, `es330`, if translating to GLSL #[argh(option)] profile: Option, /// the shader model to use if targeting HLSL /// /// May be `50`, 51`, or `60` #[argh(option)] shader_model: Option, /// if the selected frontends/backends support coordinate space conversions, /// disable them #[argh(switch)] keep_coordinate_space: bool, /// in dot output, include only the control flow graph #[argh(switch)] dot_cfg_only: bool, /// specify file path to process STDIN as #[argh(option)] stdin_file_path: Option, /// show version #[argh(switch)] version: bool, /// the input and output files. /// /// First positional argument is the input file. If not specified, the /// input will be read from stdin. In the case, --stdin-file-path must also /// be specified. /// /// The rest arguments are the output files. If not specified, only /// validation will be performed. #[argh(positional)] files: Vec, } /// Newtype so we can implement [`FromStr`] for `BoundsCheckPolicy`. #[derive(Debug, Clone, Copy)] struct BoundsCheckPolicyArg(naga::proc::BoundsCheckPolicy); impl FromStr for BoundsCheckPolicyArg { type Err = String; fn from_str(s: &str) -> Result { use naga::proc::BoundsCheckPolicy; Ok(Self(match s.to_lowercase().as_str() { "restrict" => BoundsCheckPolicy::Restrict, "readzeroskipwrite" => BoundsCheckPolicy::ReadZeroSkipWrite, "unchecked" => BoundsCheckPolicy::Unchecked, _ => { return Err(format!( "Invalid value for --index-bounds-check-policy: {}", s )) } })) } } /// Newtype so we can implement [`FromStr`] for `ShaderModel`. #[derive(Debug, Clone)] struct ShaderModelArg(naga::back::hlsl::ShaderModel); impl FromStr for ShaderModelArg { type Err = String; fn from_str(s: &str) -> Result { use naga::back::hlsl::ShaderModel; Ok(Self(match s.to_lowercase().as_str() { "50" => ShaderModel::V5_0, "51" => ShaderModel::V5_1, "60" => ShaderModel::V6_0, _ => return Err(format!("Invalid value for --shader-model: {}", s)), })) } } /// Newtype so we can implement [`FromStr`] for [`naga::back::glsl::Version`]. #[derive(Clone, Debug)] struct GlslProfileArg(naga::back::glsl::Version); impl FromStr for GlslProfileArg { type Err = String; fn from_str(s: &str) -> Result { use naga::back::glsl::Version; Ok(Self(if s.starts_with("core") { Version::Desktop(s[4..].parse().unwrap_or(330)) } else if s.starts_with("es") { Version::new_gles(s[2..].parse().unwrap_or(310)) } else { return Err(format!("Unknown profile: {}", s)); })) } } #[derive(Default)] struct Parameters { validation_flags: naga::valid::ValidationFlags, bounds_check_policies: naga::proc::BoundsCheckPolicies, entry_point: Option, keep_coordinate_space: bool, spv_block_ctx_dump_prefix: Option, spv: naga::back::spv::Options, msl: naga::back::msl::Options, glsl: naga::back::glsl::Options, hlsl: naga::back::hlsl::Options, } trait PrettyResult { type Target; fn unwrap_pretty(self) -> Self::Target; } fn print_err(error: &dyn Error) { eprint!("{}", error); let mut e = error.source(); if e.is_some() { eprintln!(": "); } else { eprintln!(); } while let Some(source) = e { eprintln!("\t{}", source); e = source.source(); } } impl PrettyResult for Result { type Target = T; fn unwrap_pretty(self) -> T { match self { Result::Ok(value) => value, Result::Err(error) => { print_err(&error); std::process::exit(1); } } } } fn main() { if let Err(e) = run() { print_err(e.as_ref()); std::process::exit(1); } } /// Error type for the CLI #[derive(Debug, Clone)] struct CliError(&'static str); impl fmt::Display for CliError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) } } impl std::error::Error for CliError {} fn run() -> Result<(), Box> { env_logger::init(); // Initialize default parameters //TODO: read the parameters from RON? let mut params = Parameters::default(); // Parse commandline arguments let args: Args = argh::from_env(); if args.version { println!("{}", env!("CARGO_PKG_VERSION")); return Ok(()); } let (input_path, input) = if let Some(path) = args.files.first() { let path = Path::new(path); (path, fs::read(path)?) } else if let Some(path) = &args.stdin_file_path { let mut input = vec![]; std::io::stdin().lock().read_to_end(&mut input)?; (Path::new(path), input) } else { return Err(CliError("Input file path is not specified").into()); }; let output_paths = if !args.files.is_empty() { &args.files[1..] } else { &[] }; // Update parameters from commandline arguments if let Some(bits) = args.validate { params.validation_flags = naga::valid::ValidationFlags::from_bits(bits) .ok_or(CliError("Invalid validation flags"))?; } if let Some(policy) = args.index_bounds_check_policy { params.bounds_check_policies.index = policy.0; } params.bounds_check_policies.buffer = match args.buffer_bounds_check_policy { Some(arg) => arg.0, None => params.bounds_check_policies.index, }; params.bounds_check_policies.image = match args.image_bounds_check_policy { Some(arg) => arg.0, None => params.bounds_check_policies.index, }; params.spv_block_ctx_dump_prefix = args.block_ctx_dir; params.entry_point = args.entry_point; if let Some(version) = args.profile { params.glsl.version = version.0; } if let Some(model) = args.shader_model { params.hlsl.shader_model = model.0; } params.keep_coordinate_space = args.keep_coordinate_space; let (module, input_text) = match Path::new(&input_path) .extension() .ok_or(CliError("Input filename has no extension"))? .to_str() .ok_or(CliError("Input filename not valid unicode"))? { "bin" => (bincode::deserialize(&input)?, None), "spv" => { let options = naga::front::spv::Options { adjust_coordinate_space: !params.keep_coordinate_space, strict_capabilities: false, block_ctx_dump_prefix: params .spv_block_ctx_dump_prefix .map(std::path::PathBuf::from), }; naga::front::spv::parse_u8_slice(&input, &options).map(|m| (m, None))? } "wgsl" => { let input = String::from_utf8(input)?; let result = naga::front::wgsl::parse_str(&input); match result { Ok(v) => (v, Some(input)), Err(ref e) => { let path = input_path.to_string_lossy(); e.emit_to_stderr_with_path(&input, &path); return Err(CliError("Could not parse WGSL").into()); } } } ext @ ("vert" | "frag" | "comp") => { let input = String::from_utf8(input)?; let mut parser = naga::front::glsl::Parser::default(); ( parser .parse( &naga::front::glsl::Options { stage: match ext { "vert" => naga::ShaderStage::Vertex, "frag" => naga::ShaderStage::Fragment, "comp" => naga::ShaderStage::Compute, _ => unreachable!(), }, defines: Default::default(), }, &input, ) .unwrap_or_else(|errors| { let filename = input_path.file_name().and_then(std::ffi::OsStr::to_str); emit_glsl_parser_error(errors, filename.unwrap_or("glsl"), &input); std::process::exit(1); }), Some(input), ) } _ => return Err(CliError("Unknown input file extension").into()), }; // Decide which capabilities our output formats can support. let validation_caps = output_paths .iter() .fold(naga::valid::Capabilities::all(), |caps, path| { use naga::valid::Capabilities as C; let missing = match Path::new(path).extension().and_then(|ex| ex.to_str()) { Some("wgsl") => C::CLIP_DISTANCE | C::CULL_DISTANCE, Some("metal") => C::CULL_DISTANCE, _ => C::empty(), }; caps & !missing }); // validate the IR let info = match naga::valid::Validator::new(params.validation_flags, validation_caps) .validate(&module) { Ok(info) => Some(info), Err(error) => { if let Some(input) = input_text { let filename = input_path.file_name().and_then(std::ffi::OsStr::to_str); emit_annotated_error(&error, filename.unwrap_or("input"), &input); } print_err(&error); None } }; if output_paths.is_empty() { if info.is_some() { println!("Validation successful"); return Ok(()); } else { std::process::exit(-1); } } for output_path in output_paths { match Path::new(&output_path) .extension() .ok_or(CliError("Output filename has no extension"))? .to_str() .ok_or(CliError("Output filename not valid unicode"))? { "txt" => { use std::io::Write; let mut file = fs::File::create(output_path)?; writeln!(file, "{:#?}", module)?; if let Some(ref info) = info { writeln!(file)?; writeln!(file, "{:#?}", info)?; } } "bin" => { let file = fs::File::create(output_path)?; bincode::serialize_into(file, &module)?; } "metal" => { use naga::back::msl; let mut options = params.msl.clone(); options.bounds_check_policies = params.bounds_check_policies; let pipeline_options = msl::PipelineOptions::default(); let (msl, _) = msl::write_string( &module, info.as_ref().ok_or(CliError( "Generating metal output requires validation to \ succeed, and it failed in a previous step", ))?, &options, &pipeline_options, ) .unwrap_pretty(); fs::write(output_path, msl)?; } "spv" => { use naga::back::spv; let pipeline_options_owned; let pipeline_options = match params.entry_point { Some(ref name) => { let ep_index = module .entry_points .iter() .position(|ep| ep.name == *name) .expect("Unable to find the entry point"); pipeline_options_owned = spv::PipelineOptions { entry_point: name.clone(), shader_stage: module.entry_points[ep_index].stage, }; Some(&pipeline_options_owned) } None => None, }; params.spv.bounds_check_policies = params.bounds_check_policies; params.spv.flags.set( spv::WriterFlags::ADJUST_COORDINATE_SPACE, !params.keep_coordinate_space, ); let spv = spv::write_vec( &module, info.as_ref().ok_or(CliError( "Generating SPIR-V output requires validation to \ succeed, and it failed in a previous step", ))?, ¶ms.spv, pipeline_options, ) .unwrap_pretty(); let bytes = spv .iter() .fold(Vec::with_capacity(spv.len() * 4), |mut v, w| { v.extend_from_slice(&w.to_le_bytes()); v }); fs::write(output_path, bytes.as_slice())?; }, "spvasm" => { use naga::back::spv; use rspirv::binary::Disassemble; let pipeline_options_owned; let pipeline_options = match params.entry_point { Some(ref name) => { let ep_index = module .entry_points .iter() .position(|ep| ep.name == *name) .expect("Unable to find the entry point"); pipeline_options_owned = spv::PipelineOptions { entry_point: name.clone(), shader_stage: module.entry_points[ep_index].stage, }; Some(&pipeline_options_owned) } None => None, }; params.spv.bounds_check_policies = params.bounds_check_policies; params.spv.flags.set( spv::WriterFlags::ADJUST_COORDINATE_SPACE, !params.keep_coordinate_space, ); let spv = spv::write_vec( &module, info.as_ref().ok_or(CliError( "Generating SPIR-V output requires validation to \ succeed, and it failed in a previous step", ))?, ¶ms.spv, pipeline_options, ) .unwrap_pretty(); // let bytes = spv // .iter() // .fold(Vec::with_capacity(spv.len() * 4), |mut v, w| { // v.extend_from_slice(&w.to_le_bytes()); // v // }); let dis = rspirv::dr::load_words(spv) .expect("Produced invalid SPIR-V") .disassemble(); fs::write(output_path, dis)?; } stage @ ("vert" | "frag" | "comp") => { use naga::back::glsl; let pipeline_options = glsl::PipelineOptions { entry_point: match params.entry_point { Some(ref name) => name.clone(), None => "main".to_string(), }, shader_stage: match stage { "vert" => naga::ShaderStage::Vertex, "frag" => naga::ShaderStage::Fragment, "comp" => naga::ShaderStage::Compute, _ => unreachable!(), }, multiview: None, }; let mut buffer = String::new(); let mut writer = glsl::Writer::new( &mut buffer, &module, info.as_ref().ok_or(CliError( "Generating glsl output requires validation to \ succeed, and it failed in a previous step", ))?, ¶ms.glsl, &pipeline_options, params.bounds_check_policies, ) .unwrap_pretty(); writer.write()?; fs::write(output_path, buffer)?; } "dot" => { use naga::back::dot; let output = dot::write( &module, info.as_ref(), naga::back::dot::Options { cfg_only: args.dot_cfg_only, }, )?; fs::write(output_path, output)?; } "hlsl" => { use naga::back::hlsl; let mut buffer = String::new(); let mut writer = hlsl::Writer::new(&mut buffer, ¶ms.hlsl); writer .write( &module, info.as_ref().ok_or(CliError( "Generating hlsl output requires validation to \ succeed, and it failed in a previous step", ))?, ) .unwrap_pretty(); fs::write(output_path, buffer)?; } "wgsl" => { use naga::back::wgsl; let wgsl = wgsl::write_string( &module, info.as_ref().ok_or(CliError( "Generating wgsl output requires validation to \ succeed, and it failed in a previous step", ))?, wgsl::WriterFlags::empty(), ) .unwrap_pretty(); fs::write(output_path, wgsl)?; } other => { println!("Unknown output extension: {}", other); } } } Ok(()) } use codespan_reporting::{ diagnostic::{Diagnostic, Label}, files::SimpleFile, term::{ self, termcolor::{ColorChoice, StandardStream}, }, }; use naga::WithSpan; pub fn emit_glsl_parser_error(errors: Vec, filename: &str, source: &str) { let files = SimpleFile::new(filename, source); let config = codespan_reporting::term::Config::default(); let writer = StandardStream::stderr(ColorChoice::Auto); for err in errors { let mut diagnostic = Diagnostic::error().with_message(err.kind.to_string()); if let Some(range) = err.meta.to_range() { diagnostic = diagnostic.with_labels(vec![Label::primary((), range)]); } term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect("cannot write error"); } } pub fn emit_annotated_error(ann_err: &WithSpan, filename: &str, source: &str) { let files = SimpleFile::new(filename, source); let config = codespan_reporting::term::Config::default(); let writer = StandardStream::stderr(ColorChoice::Auto); let diagnostic = Diagnostic::error().with_labels( ann_err .spans() .map(|(span, desc)| { Label::primary((), span.to_range().unwrap()).with_message(desc.to_owned()) }) .collect(), ); term::emit(&mut writer.lock(), &config, &files, &diagnostic).expect("cannot write error"); } ================================================ FILE: lib/naga/debug/CS_boids.metal ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size1; uint size2; uint size3; uint size4; uint size6; uint size7; }; struct Node { metal::float3 position; metal::float3 force; metal::packed_float3 prev_force; metal::atomic_uint mass; }; struct Uniforms { uint frame_num; }; struct Bound { metal::float3 bound_min; metal::float3 bound_max; }; struct BHTree { metal::atomic_uint max_depth; metal::atomic_uint bottom; float radius; }; struct BHTreeNode { metal::packed_float3 position; metal::atomic_int mass; int count; metal::atomic_int start; int sort; }; typedef Node type_6[1]; typedef metal::uint2 type_8[1]; typedef metal::atomic_int type_9[1]; typedef Bound type_10[1]; typedef BHTreeNode type_11[1]; struct type_13 { metal::float3 inner[256]; }; struct type_14 { int inner[8]; }; struct type_16 { uint inner[48]; }; struct type_17 { float inner[48]; }; uint hash( uint s_1 ) { uint t = {}; t = s_1; uint _e10 = t; t = _e10 ^ 2747636419u; uint _e13 = t; t = _e13 * 2654435769u; uint _e16 = t; uint _e17 = t; t = _e16 ^ (_e17 >> 16u); uint _e21 = t; t = _e21 * 2654435769u; uint _e24 = t; uint _e25 = t; t = _e24 ^ (_e25 >> 16u); uint _e29 = t; t = _e29 * 2654435769u; uint _e32 = t; return _e32; } float random( uint seed ) { uint _e9 = hash(seed); return static_cast(_e9) / 4294967296.0; } float random_xy( uint seed_x, uint seed_y ) { uint _e10 = hash(seed_x); uint _e12 = hash(_e10 + seed_y); return static_cast(_e12) / 4294967296.0; } void atomic_add_f32_( uint springIndex, float updateValue, device type_9& springForceSrc, constant _mslBufferSizes& _buffer_sizes ) { int new_u32_ = {}; int assumed = 0; int origin = {}; new_u32_ = as_type(updateValue); while(true) { if (true) { } else { break; } int _e17 = assumed; int _e18 = new_u32_; metal::atomic_compare_exchange_weak_explicit(&springForceSrc[springIndex], &_e17, _e18, metal::memory_order_relaxed, metal::memory_order_relaxed); origin = _e17; int _e20 = origin; int _e21 = assumed; if (_e20 == _e21) { break; } int _e23 = origin; assumed = _e23; int _e24 = origin; new_u32_ = as_type(as_type(_e24) + updateValue); } return; } struct gen_nodeInput { }; kernel void gen_node( metal::uint3 global_invocation_id [[thread_position_in_grid]] , constant Uniforms& uniforms [[user(fake0)]] , device type_6& nodeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos = {}; uint total = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_5 = global_invocation_id.x; if (index_5 >= total) { return; } metal::float3 _e14 = nodeSrc[index_5].position; vPos = _e14; uint _e20 = uniforms.frame_num; float _e23 = random_xy(index_5, 0u + (3u * _e20)); vPos.x = (_e23 * 2.0) - 1.0; uint _e32 = uniforms.frame_num; float _e35 = random_xy(index_5, 1u + (3u * _e32)); vPos.y = (_e35 * 2.0) - 1.0; uint _e44 = uniforms.frame_num; float _e47 = random_xy(index_5, 2u + (3u * _e44)); vPos.z = (_e47 * 2.0) - 1.0; metal::float3 _e54 = vPos; nodeSrc[index_5].position = _e54; nodeSrc[index_5].force = metal::float3(0.0); nodeSrc[index_5].prev_force = metal::float3(0.0); metal::atomic_store_explicit(&nodeSrc[index_5].mass, 1u, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 0u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 1u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_5 * 3u) + 2u], 0, metal::memory_order_relaxed); uint target_node = (index_5 * 3u) + 2u; int _e90 = metal::atomic_exchange_explicit(&springForceSrc[target_node], 0, metal::memory_order_relaxed); return; } struct cal_massInput { }; kernel void cal_mass( metal::uint3 global_invocation_id_1 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device type_8 const& edgeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::uint2 edge = {}; uint total_1 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8; uint index_6 = global_invocation_id_1.x; if (index_6 >= total_1) { return; } metal::uint2 _e13 = edgeSrc[index_6]; edge = _e13; uint source_node = edge.x; uint target_node_1 = edge.y; uint _e24 = metal::atomic_fetch_add_explicit(&nodeSrc[source_node].mass, 1u, metal::memory_order_relaxed); uint _e28 = metal::atomic_fetch_add_explicit(&nodeSrc[target_node_1].mass, 1u, metal::memory_order_relaxed); return; } struct cal_gravity_forceInput { }; kernel void cal_gravity_force( metal::uint3 global_invocation_id_2 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { float gravity_force = {}; uint total_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_7 = global_invocation_id_2.x; if (index_7 >= total_2) { return; } metal::float3 pos_3 = nodeSrc[index_7].position; uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_7].mass, metal::memory_order_relaxed); float mass = static_cast(_e19); if (true) { gravity_force = 1.0 * mass; } else { if (((pos_3.x != 0.0) || (pos_3.y != 0.0)) || (pos_3.z != 0.0)) { gravity_force = (1.0 * mass) * metal::rsqrt(metal::dot(pos_3, pos_3)); } else { gravity_force = 0.0; } } metal::float3 _e41 = nodeSrc[index_7].force; float _e43 = gravity_force; nodeSrc[index_7].force = _e41 + (-pos_3 * _e43); return; } struct attractive_forceInput { }; kernel void attractive_force( metal::uint3 global_invocation_id_3 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device type_8 const& edgeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::uint2 edge_1 = {}; metal::float3 dir = {}; uint total_3 = 1 + (_buffer_sizes.size2 - 0 - 8) / 8; uint index_8 = global_invocation_id_3.x; if (index_8 >= total_3) { return; } metal::uint2 _e13 = edgeSrc[index_8]; edge_1 = _e13; uint source_node_1 = edge_1.x; uint target_node_2 = edge_1.y; metal::float3 _e23 = nodeSrc[target_node_2].position; metal::float3 _e26 = nodeSrc[source_node_1].position; dir = _e23 - _e26; float _e34 = dir.x; atomic_add_f32_((source_node_1 * 3u) + 0u, _e34, springForceSrc, _buffer_sizes); float _e40 = dir.y; atomic_add_f32_((source_node_1 * 3u) + 1u, _e40, springForceSrc, _buffer_sizes); float _e46 = dir.z; atomic_add_f32_((source_node_1 * 3u) + 2u, _e46, springForceSrc, _buffer_sizes); float _e52 = dir.x; atomic_add_f32_((target_node_2 * 3u) + 0u, -_e52, springForceSrc, _buffer_sizes); float _e59 = dir.y; atomic_add_f32_((target_node_2 * 3u) + 1u, -_e59, springForceSrc, _buffer_sizes); float _e66 = dir.z; atomic_add_f32_((target_node_2 * 3u) + 2u, -_e66, springForceSrc, _buffer_sizes); return; } struct reduction_boundingInput { }; kernel void reduction_bounding( uint local_index [[thread_index_in_threadgroup]] , metal::uint3 global_id [[thread_position_in_grid]] , metal::uint3 group_id [[threadgroup_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device type_10& bounding [[user(fake0)]] , threadgroup type_13& smin , threadgroup type_13& smax , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index = {}; uint s = {}; index = global_id.x; uint total_4 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint _e16 = index; if (_e16 >= total_4) { index = total_4 - 1u; } uint _e21 = index; metal::float3 _e24 = nodeSrc[_e21].position; smin.inner[local_index] = _e24; uint _e26 = index; metal::float3 _e29 = nodeSrc[_e26].position; smax.inner[local_index] = _e29; metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); s = 256u / 2u; bool loop_init = true; while(true) { if (!loop_init) { uint _e37 = s; s = _e37 >> 1u; } loop_init = false; uint _e34 = s; if (_e34 > 0u) { } else { break; } uint _e40 = s; if (local_index < _e40) { uint _e42 = s; uint k = local_index + _e42; metal::float3 _e46 = smin.inner[local_index]; metal::float3 _e48 = smin.inner[k]; smin.inner[local_index] = metal::min(_e46, _e48); metal::float3 _e52 = smax.inner[local_index]; metal::float3 _e54 = smax.inner[k]; smax.inner[local_index] = metal::max(_e52, _e54); } metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); } if (local_index == 0u) { metal::float3 _e63 = smin.inner[0]; bounding[group_id.x].bound_min = _e63; metal::float3 _e69 = smax.inner[0]; bounding[group_id.x].bound_max = _e69; return; } else { return; } } kernel void bounding_box( device type_6 const& nodeSrc [[user(fake0)]] , device type_10& bounding [[user(fake0)]] , device BHTree& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 bound_min_min = {}; metal::float3 bound_max_max = {}; uint i = 0u; metal::float3 _e13 = bounding[0].bound_min; bound_min_min = _e13; metal::float3 _e18 = bounding[0].bound_max; bound_max_max = _e18; uint node_group_count = static_cast(metal::ceil(static_cast(1 + (_buffer_sizes.size1 - 0 - 48) / 48) / 256.0)); bool loop_init_1 = true; while(true) { if (!loop_init_1) { uint _e30 = i; i = _e30 + 1u; } loop_init_1 = false; uint _e28 = i; if (_e28 < node_group_count) { } else { break; } metal::float3 _e33 = bound_min_min; uint _e34 = i; metal::float3 _e37 = bounding[_e34].bound_min; bound_min_min = metal::min(_e33, _e37); metal::float3 _e39 = bound_max_max; uint _e40 = i; metal::float3 _e43 = bounding[_e40].bound_max; bound_max_max = metal::max(_e39, _e43); } metal::float3 _e48 = bound_min_min; bounding[0].bound_min = _e48; metal::float3 _e52 = bound_max_max; bounding[0].bound_max = _e52; metal::float3 _e53 = bound_max_max; metal::float3 _e54 = bound_min_min; metal::float3 box = _e53 - _e54; uint tree_node_count = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; bhTree.radius = metal::max(metal::max(box.x, box.y), box.z) * 0.5; metal::atomic_store_explicit(&bhTree.bottom, tree_node_count, metal::memory_order_relaxed); metal::atomic_store_explicit(&bhTree.max_depth, 0u, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[tree_node_count].mass, -1, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[tree_node_count].start, 0, metal::memory_order_relaxed); metal::float3 _e78 = bound_min_min; metal::float3 _e79 = bound_max_max; treeNode[tree_node_count].position = (_e78 + _e79) * 0.5; treeNode[tree_node_count].count = -1; treeNode[tree_node_count].sort = 0; return; } struct clear_1_Input { }; kernel void clear_1_( metal::uint3 global_invocation_id_4 [[thread_position_in_grid]] , device type_11 const& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint i_1 = 0u; uint total_5 = 1 + (_buffer_sizes.size6 - 0 - 32) / 32; uint index_9 = global_invocation_id_4.x; if (index_9 >= total_5) { return; } bool loop_init_2 = true; while(true) { if (!loop_init_2) { uint _e19 = i_1; i_1 = _e19 + 1u; } loop_init_2 = false; uint _e16 = i_1; if (_e16 < 8u) { } else { break; } uint _e24 = i_1; metal::atomic_store_explicit(&treeChild[(index_9 * 8u) + _e24], -1, metal::memory_order_relaxed); } return; } struct tree_buildingInput { }; kernel void tree_building( metal::uint3 global_invocation_id_5 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree& bhTree [[user(fake0)]] , device type_11 const& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_1 = {}; int skip = 1; metal::float3 pos = {}; metal::float3 dp = {}; metal::float3 rdp = {}; uint n = {}; uint depth = 1u; uint local_max_depth = 1u; uint j = 0u; float root_r = {}; float r = {}; int limit = 10000; int ch = {}; int locked_ch = {}; int v = {}; int v_1 = {}; index_1 = global_invocation_id_5.x; uint node_count = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint tree_node_count_1 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; metal::float3 root_pos = treeNode[tree_node_count_1].position; uint inc = metal::min(node_count, 16384u); n = tree_node_count_1; float _e35 = bhTree.radius; root_r = _e35; float _e37 = root_r; r = _e37 * 0.5; while(true) { uint _e43 = index_1; if (_e43 < node_count) { } else { break; } int _e45 = limit; limit = _e45 - 1; int _e48 = limit; if (_e48 < 0) { return; } int _e51 = skip; if (_e51 != 0) { skip = 0; uint _e55 = index_1; metal::float3 _e58 = nodeSrc[_e55].position; pos = _e58; n = tree_node_count_1; float _e59 = root_r; r = _e59 * 0.5; depth = 1u; metal::float3 _e63 = pos; metal::float3 compare = metal::step(root_pos, _e63); j = (static_cast(compare.x) << 0u) | ((static_cast(compare.y) << 1u) + (static_cast(compare.z) << 2u)); float _e79 = r; float _e82 = r; dp = metal::float3(-_e79) + (compare * (2.0 * _e82)); metal::float3 _e87 = dp; rdp = root_pos + _e87; } uint _e89 = n; uint _e92 = j; int _e95 = metal::atomic_load_explicit(&treeChild[(_e89 * 8u) + _e92], metal::memory_order_relaxed); ch = _e95; while(true) { int _e97 = ch; if (_e97 >= static_cast(node_count)) { } else { break; } int _e100 = ch; n = static_cast(_e100); uint _e102 = depth; depth = _e102 + 1u; float _e105 = r; r = _e105 * 0.5; metal::float3 _e108 = rdp; metal::float3 _e109 = pos; metal::float3 compare_1 = metal::step(_e108, _e109); j = (static_cast(compare_1.x) << 0u) | ((static_cast(compare_1.y) << 1u) + (static_cast(compare_1.z) << 2u)); float _e125 = r; float _e128 = r; dp = metal::float3(-_e125) + (compare_1 * (2.0 * _e128)); metal::float3 _e133 = rdp; metal::float3 _e134 = dp; rdp = _e133 + _e134; uint _e136 = n; uint _e139 = j; int _e142 = metal::atomic_load_explicit(&treeChild[(_e136 * 8u) + _e139], metal::memory_order_relaxed); ch = _e142; } uint _e143 = n; uint _e146 = j; uint locked = (_e143 * 8u) + _e146; locked_ch = -1; int _e150 = ch; if (_e150 != -2) { int _e153 = ch; if (_e153 == -1) { v = -1; int _e159 = v; uint _e160 = index_1; metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e159, static_cast(_e160), metal::memory_order_relaxed, metal::memory_order_relaxed); if (_e159 == -1) { uint _e165 = depth; uint _e166 = local_max_depth; local_max_depth = metal::max(_e165, _e166); uint _e168 = index_1; index_1 = _e168 + inc; skip = 1; } else { skip = 0; } } else { int _e172 = ch; v_1 = _e172; int _e175 = v_1; metal::atomic_compare_exchange_weak_explicit(&treeChild[locked], &_e175, -2, metal::memory_order_relaxed, metal::memory_order_relaxed); int _e178 = ch; if (_e178 == _e175) { int _e180 = ch; metal::float3 _e183 = nodeSrc[_e180].position; metal::float3 _e184 = pos; if (metal::all(_e183 == _e184)) { uint _e187 = index_1; metal::float3 _e190 = nodeSrc[_e187].position; nodeSrc[_e187].position = _e190 + metal::float3(0.10000000149011612, -0.05000000074505806, 0.10000000149011612); skip = 0; int _e198 = ch; metal::atomic_store_explicit(&treeChild[locked], _e198, metal::memory_order_relaxed); break; } locked_ch = -1; while(true) { uint _e202 = metal::atomic_fetch_sub_explicit(&bhTree.bottom, 1u, metal::memory_order_relaxed); uint cell = _e202 - 1u; if (cell <= node_count) { return; } int _e206 = locked_ch; if (_e206 != -1) { uint _e209 = n; uint _e212 = j; metal::atomic_store_explicit(&treeChild[(_e209 * 8u) + _e212], static_cast(cell), metal::memory_order_relaxed); } int _e216 = locked_ch; locked_ch = metal::max(_e216, static_cast(cell)); uint _e219 = depth; depth = _e219 + 1u; n = cell; float _e222 = r; r = _e222 * 0.5; metal::float3 _e225 = rdp; int _e226 = ch; metal::float3 _e229 = nodeSrc[_e226].position; metal::float3 compare_2 = metal::step(_e225, _e229); j = (static_cast(compare_2.x) << 0u) | ((static_cast(compare_2.y) << 1u) + (static_cast(compare_2.z) << 2u)); uint _e247 = j; int _e250 = ch; metal::atomic_store_explicit(&treeChild[(cell * 8u) + _e247], _e250, metal::memory_order_relaxed); metal::float3 _e251 = rdp; metal::float3 _e252 = pos; metal::float3 compare_3 = metal::step(_e251, _e252); j = (static_cast(compare_3.x) << 0u) | ((static_cast(compare_3.y) << 1u) + (static_cast(compare_3.z) << 2u)); float _e268 = r; float _e271 = r; dp = metal::float3(-_e268) + (compare_3 * (2.0 * _e271)); metal::float3 _e276 = rdp; metal::float3 _e277 = dp; rdp = _e276 + _e277; uint _e279 = n; uint _e282 = j; int _e285 = metal::atomic_load_explicit(&treeChild[(_e279 * 8u) + _e282], metal::memory_order_relaxed); ch = _e285; int _e286 = ch; if (_e286 < 0) { break; } } uint _e289 = n; uint _e292 = j; uint _e295 = index_1; metal::atomic_store_explicit(&treeChild[(_e289 * 8u) + _e292], static_cast(_e295), metal::memory_order_relaxed); uint _e297 = depth; uint _e298 = local_max_depth; local_max_depth = metal::max(_e297, _e298); uint _e300 = index_1; index_1 = _e300 + inc; skip = 2; } } } metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); int _e303 = skip; if (_e303 == 2) { int _e307 = locked_ch; metal::atomic_store_explicit(&treeChild[locked], _e307, metal::memory_order_relaxed); } } uint _e309 = local_max_depth; uint _e310 = metal::atomic_fetch_max_explicit(&bhTree.max_depth, _e309, metal::memory_order_relaxed); return; } struct clear_2_Input { }; kernel void clear_2_( metal::uint3 global_invocation_id_6 [[thread_position_in_grid]] , device type_11& treeNode [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint total_6 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint index_10 = global_invocation_id_6.x; if (index_10 >= total_6) { return; } treeNode[index_10].position = metal::float3(0.0); treeNode[index_10].count = -1; treeNode[index_10].sort = 0; metal::atomic_store_explicit(&treeNode[index_10].start, -1, metal::memory_order_relaxed); metal::atomic_store_explicit(&treeNode[index_10].mass, -1, metal::memory_order_relaxed); return; } struct summarizationInput { }; kernel void summarization( metal::uint3 global_invocation_id_7 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , device type_9 const& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_2 = {}; type_14 schild = {}; type_14 smass = {}; int j_1 = 0; uint ch_1 = {}; uint i_2 = {}; int cm = {}; metal::float3 pos_1 = {}; int cnt = {}; int j_2 = 0; bool flag = false; uint i_3 = {}; uint i_4 = {}; int cm_1 = {}; metal::float3 pos_2 = {}; int cnt_1 = {}; uint bottom = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed); uint tree_node_count_2 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint node_count_1 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_1 = metal::min(node_count_1, 16384u); index_2 = static_cast((static_cast(bottom) & -32) + static_cast(global_invocation_id_7.x)); uint _e27 = index_2; if (_e27 < bottom) { uint _e29 = index_2; index_2 = _e29 + inc_1; } uint restart = index_2; bool loop_init_3 = true; while(true) { if (!loop_init_3) { int _e39 = j_1; j_1 = _e39 + 1; } loop_init_3 = false; int _e36 = j_1; if (_e36 < 5) { } else { break; } while(true) { uint _e42 = index_2; if (_e42 <= tree_node_count_2) { } else { break; } uint _e44 = index_2; int _e47 = metal::atomic_load_explicit(&treeNode[_e44].mass, metal::memory_order_relaxed); if (_e47 < 0) { ch_1 = 0u; i_2 = 0u; i_2 = 0u; bool loop_init_4 = true; while(true) { if (!loop_init_4) { uint _e58 = i_2; i_2 = _e58 + 1u; } loop_init_4 = false; uint _e55 = i_2; if (_e55 < 8u) { } else { break; } uint _e61 = index_2; uint _e64 = i_2; int _e67 = metal::atomic_load_explicit(&treeChild[(_e61 * 8u) + _e64], metal::memory_order_relaxed); ch_1 = static_cast(_e67); uint _e69 = i_2; uint _e71 = ch_1; schild.inner[_e69] = static_cast(_e71); uint _e73 = i_2; uint _e75 = ch_1; int _e78 = metal::atomic_load_explicit(&treeNode[_e75].mass, metal::memory_order_relaxed); smass.inner[_e73] = _e78; uint _e79 = ch_1; uint _e81 = i_2; int _e83 = smass.inner[_e81]; if ((_e79 >= node_count_1) && (_e83 < 0)) { break; } } uint _e87 = i_2; if (_e87 == 8u) { cm = 0; pos_1 = metal::float3(0.0); cnt = 0; i_2 = 0u; bool loop_init_5 = true; while(true) { if (!loop_init_5) { uint _e101 = i_2; i_2 = _e101 + 1u; } loop_init_5 = false; uint _e98 = i_2; if (_e98 < 8u) { } else { break; } uint _e104 = i_2; int _e106 = schild.inner[_e104]; if (_e106 >= 0) { uint _e109 = i_2; int _e111 = schild.inner[_e109]; uint ch_2 = static_cast(_e111); if (ch_2 >= node_count_1) { uint _e114 = i_2; int m = smass.inner[_e114]; int _e117 = cnt; int _e120 = treeNode[ch_2].count; cnt = _e117 + _e120; metal::float3 _e122 = pos_1; metal::float3 _e125 = treeNode[ch_2].position; pos_1 = _e122 + (_e125 * static_cast(m)); int _e129 = cm; cm = _e129 + m; } else { uint _e133 = metal::atomic_load_explicit(&nodeSrc[ch_2].mass, metal::memory_order_relaxed); int m_1 = static_cast(_e133); int _e135 = cnt; cnt = _e135 + 1; metal::float3 _e138 = pos_1; metal::float3 _e141 = nodeSrc[ch_2].position; pos_1 = _e138 + (_e141 * static_cast(m_1)); int _e145 = cm; cm = _e145 + m_1; } } } uint _e147 = index_2; int _e150 = cnt; treeNode[_e147].count = _e150; uint _e151 = index_2; metal::float3 _e154 = pos_1; int _e155 = cm; treeNode[_e151].position = _e154 / metal::float3(static_cast(_e155)); uint _e159 = index_2; int _e162 = cm; metal::atomic_store_explicit(&treeNode[_e159].mass, _e162, metal::memory_order_relaxed); } } uint _e163 = index_2; index_2 = _e163 + inc_1; } index_2 = restart; } while(true) { uint _e169 = index_2; if (_e169 <= tree_node_count_2) { } else { break; } uint _e171 = index_2; uint _e175 = index_2; uint _e177 = index_2; int _e180 = metal::atomic_load_explicit(&treeNode[_e177].mass, metal::memory_order_relaxed); if (_e171 < node_count_1) { uint _e173 = index_2; index_2 = _e173 + inc_1; } else { if ((_e175 >= node_count_1) && (_e180 >= 0)) { uint _e184 = index_2; index_2 = _e184 + inc_1; } else { int _e186 = j_2; if (_e186 == 0) { j_2 = 8; i_3 = 0u; bool loop_init_6 = true; while(true) { if (!loop_init_6) { uint _e195 = i_3; i_3 = _e195 + 1u; } loop_init_6 = false; uint _e192 = i_3; if (_e192 < 8u) { } else { break; } uint _e198 = index_2; uint _e201 = i_3; int ch_3 = metal::atomic_load_explicit(&treeChild[(_e198 * 8u) + _e201], metal::memory_order_relaxed); uint _e205 = i_3; schild.inner[_e205] = ch_3; uint _e207 = i_3; int _e211 = metal::atomic_load_explicit(&treeNode[ch_3].mass, metal::memory_order_relaxed); smass.inner[_e207] = _e211; uint _e214 = i_3; int _e216 = smass.inner[_e214]; if ((ch_3 < static_cast(node_count_1)) || (_e216 >= 0)) { int _e220 = j_2; j_2 = _e220 - 1; } } } else { j_2 = 8; i_4 = 0u; bool loop_init_7 = true; while(true) { if (!loop_init_7) { uint _e229 = i_4; i_4 = _e229 + 1u; } loop_init_7 = false; uint _e226 = i_4; if (_e226 < 8u) { } else { break; } uint _e232 = i_4; int _e234 = schild.inner[_e232]; uint ch_4 = static_cast(_e234); uint _e236 = i_4; int old_mass = smass.inner[_e236]; uint _e239 = i_4; int _e243 = metal::atomic_load_explicit(&treeNode[ch_4].mass, metal::memory_order_relaxed); smass.inner[_e239] = _e243; uint _e248 = i_4; int _e250 = smass.inner[_e248]; if (((ch_4 < node_count_1) || (old_mass >= 0)) || (_e250 >= 0)) { int _e254 = j_2; j_2 = _e254 - 1; } } } int _e257 = j_2; if (_e257 == 0) { cm_1 = 0; pos_2 = metal::float3(0.0); cnt_1 = 0; i_4 = 0u; bool loop_init_8 = true; while(true) { if (!loop_init_8) { uint _e271 = i_4; i_4 = _e271 + 1u; } loop_init_8 = false; uint _e268 = i_4; if (_e268 < 8u) { } else { break; } uint _e274 = i_4; int _e276 = schild.inner[_e274]; if (_e276 >= 0) { uint _e279 = i_4; int _e281 = schild.inner[_e279]; uint ch_5 = static_cast(_e281); if (ch_5 >= node_count_1) { uint _e284 = i_4; int m_2 = smass.inner[_e284]; int _e287 = cnt_1; int _e290 = treeNode[ch_5].count; cnt_1 = _e287 + _e290; metal::float3 _e292 = pos_2; metal::float3 _e295 = treeNode[ch_5].position; pos_2 = _e292 + (_e295 * static_cast(m_2)); int _e299 = cm_1; cm_1 = _e299 + m_2; } else { uint _e303 = metal::atomic_load_explicit(&nodeSrc[ch_5].mass, metal::memory_order_relaxed); int m_3 = static_cast(_e303); int _e305 = cnt_1; cnt_1 = _e305 + 1; metal::float3 _e308 = pos_2; metal::float3 _e311 = nodeSrc[ch_5].position; pos_2 = _e308 + (_e311 * static_cast(m_3)); int _e315 = cm_1; cm_1 = _e315 + m_3; } } } uint _e317 = index_2; int _e320 = cnt_1; treeNode[_e317].count = _e320; uint _e321 = index_2; metal::float3 _e324 = pos_2; int _e325 = cm_1; treeNode[_e321].position = _e324 / metal::float3(static_cast(_e325)); flag = true; } } } bool _e330 = flag; if (_e330) { uint _e331 = index_2; if (_e331 < node_count_1) { uint _e333 = index_2; int _e336 = cm_1; metal::atomic_store_explicit(&nodeSrc[_e333].mass, static_cast(_e336), metal::memory_order_relaxed); } else { uint _e338 = index_2; int _e341 = cm_1; metal::atomic_store_explicit(&treeNode[_e338].mass, _e341, metal::memory_order_relaxed); } uint _e342 = index_2; index_2 = _e342 + inc_1; flag = false; } } return; } struct sortInput { }; kernel void sort( metal::uint3 global_invocation_id_8 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11& treeNode [[user(fake0)]] , device type_9& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint index_3 = {}; int start = {}; uint j_3 = {}; uint i_5 = {}; uint tree_node_count_3 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint bottom_1 = metal::atomic_load_explicit(&bhTree.bottom, metal::memory_order_relaxed); uint node_count_2 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_2 = metal::min(node_count_2, 16384u); index_3 = ((tree_node_count_3 + 1u) - inc_2) + global_invocation_id_8.x; while(true) { uint _e25 = index_3; if (_e25 >= bottom_1) { } else { break; } uint _e27 = index_3; int _e30 = metal::atomic_load_explicit(&treeNode[_e27].start, metal::memory_order_relaxed); start = _e30; int _e32 = start; if (_e32 >= 0) { j_3 = 0u; i_5 = 0u; bool loop_init_9 = true; while(true) { if (!loop_init_9) { uint _e42 = i_5; i_5 = _e42 + 1u; } loop_init_9 = false; uint _e39 = i_5; if (_e39 < 8u) { } else { break; } uint _e45 = index_3; uint _e48 = i_5; int ch_6 = metal::atomic_load_explicit(&treeChild[(_e45 * 8u) + _e48], metal::memory_order_relaxed); if (ch_6 >= 0) { uint _e54 = i_5; uint _e55 = j_3; if (_e54 != _e55) { uint _e57 = index_3; uint _e60 = i_5; metal::atomic_store_explicit(&treeChild[(_e57 * 8u) + _e60], -1, metal::memory_order_relaxed); uint _e64 = index_3; uint _e67 = j_3; metal::atomic_store_explicit(&treeChild[(_e64 * 8u) + _e67], ch_6, metal::memory_order_relaxed); } uint _e70 = j_3; j_3 = _e70 + 1u; if (ch_6 >= static_cast(node_count_2)) { int _e77 = start; metal::atomic_store_explicit(&treeNode[ch_6].start, _e77, metal::memory_order_relaxed); int _e78 = start; int _e81 = treeNode[ch_6].count; start = _e78 + _e81; } else { int _e83 = start; treeNode[_e83].sort = ch_6; int _e86 = start; start = _e86 + 1; } } } uint _e89 = index_3; if (_e89 < inc_2) { break; } uint _e91 = index_3; index_3 = _e91 - inc_2; } } return; } struct electron_forceInput { }; kernel void electron_force( metal::uint3 global_invocation_id_9 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device BHTree const& bhTree [[user(fake0)]] , device type_11 const& treeNode [[user(fake0)]] , device type_9 const& treeChild [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { type_16 spos = {}; type_16 snode = {}; type_17 sdq = {}; uint j_4 = 1u; uint index_4 = {}; metal::float3 af = {}; uint depth_1 = {}; uint pd = {}; uint nd = {}; metal::float3 dp_1 = {}; uint tree_node_count_4 = (1 + (_buffer_sizes.size6 - 0 - 32) / 32) - 1u; uint node_count_3 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint inc_3 = metal::min(node_count_3, 16384u); float epssq = 0.05000000074505806 * 0.05000000074505806; float _e26 = bhTree.radius; float diameter = _e26 * 2.0; uint max_depth = metal::atomic_load_explicit(&bhTree.max_depth, metal::memory_order_relaxed); sdq.inner[0] = (diameter * diameter) * 1.0; bool loop_init_10 = true; while(true) { if (!loop_init_10) { uint _e39 = j_4; j_4 = _e39 + 1u; } loop_init_10 = false; uint _e37 = j_4; if (_e37 < max_depth) { } else { break; } uint _e42 = j_4; uint _e44 = j_4; float _e48 = sdq.inner[_e44 - 1u]; sdq.inner[_e42] = _e48 * 0.25; uint _e51 = j_4; float _e55 = sdq.inner[_e51 - 1u]; sdq.inner[_e51 - 1u] = _e55 + epssq; } float _e60 = sdq.inner[max_depth - 1u]; sdq.inner[max_depth - 1u] = _e60 + epssq; if (max_depth < 48u) { index_4 = global_invocation_id_9.x; bool loop_init_11 = true; while(true) { if (!loop_init_11) { uint _e68 = index_4; index_4 = _e68 + inc_3; } loop_init_11 = false; uint _e66 = index_4; if (_e66 < node_count_3) { } else { break; } uint _e70 = index_4; int order = treeNode[_e70].sort; metal::float3 pos_4 = nodeSrc[order].position; af = metal::float3(0.0); depth_1 = 0u; spos.inner[0] = 0u; snode.inner[0] = tree_node_count_4; while(true) { uint _e87 = depth_1; uint _e89 = spos.inner[_e87]; pd = _e89; uint _e91 = depth_1; uint _e93 = snode.inner[_e91]; nd = _e93; while(true) { uint _e95 = pd; if (_e95 < 8u) { } else { break; } uint _e98 = nd; uint _e101 = pd; int n_1 = metal::atomic_load_explicit(&treeChild[(_e98 * 8u) + _e101], metal::memory_order_relaxed); uint _e105 = pd; pd = _e105 + 1u; if (n_1 >= 0) { uint n_2 = static_cast(n_1); if (n_2 < node_count_3) { metal::float3 _e115 = nodeSrc[n_2].position; dp_1 = pos_4 - _e115; } else { metal::float3 _e119 = treeNode[n_2].position; dp_1 = pos_4 - _e119; } metal::float3 _e121 = dp_1; metal::float3 _e122 = dp_1; float dist2_ = metal::dot(_e121, _e122); if (n_2 < node_count_3) { if (dist2_ > 0.0) { uint _e129 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed); uint _e134 = metal::atomic_load_explicit(&nodeSrc[n_2].mass, metal::memory_order_relaxed); float factor = ((0.0003000000142492354 * static_cast(_e129)) * static_cast(_e134)) / dist2_; metal::float3 _e138 = af; metal::float3 _e139 = dp_1; af = _e138 + (_e139 * factor); } } else { uint _e142 = depth_1; float _e144 = sdq.inner[_e142]; if (dist2_ >= _e144) { if (dist2_ > 0.0) { uint _e150 = metal::atomic_load_explicit(&nodeSrc[order].mass, metal::memory_order_relaxed); int _e155 = metal::atomic_load_explicit(&treeNode[n_2].mass, metal::memory_order_relaxed); float factor_1 = ((0.0003000000142492354 * static_cast(_e150)) * static_cast(_e155)) / dist2_; metal::float3 _e159 = af; metal::float3 _e160 = dp_1; af = _e159 + (_e160 * factor_1); } } else { uint _e163 = depth_1; uint _e165 = pd; spos.inner[_e163] = _e165; uint _e166 = depth_1; uint _e168 = nd; snode.inner[_e166] = _e168; uint _e169 = depth_1; depth_1 = _e169 + 1u; pd = 0u; nd = n_2; } } } else { pd = 8u; } } uint _e174 = depth_1; if (_e174 == 0u) { break; } uint _e177 = depth_1; depth_1 = _e177 - 1u; } metal::float3 _e182 = nodeSrc[order].force; metal::float3 _e183 = af; nodeSrc[order].force = _e182 + _e183; } return; } else { return; } } struct main_Input { }; kernel void main_( metal::uint3 global_invocation_id_10 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , device type_9& springForceSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 spring_force = {}; uint total_7 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_11 = global_invocation_id_10.x; if (index_11 >= total_7) { return; } metal::float3 vPos_3 = nodeSrc[index_11].position; uint _e19 = metal::atomic_load_explicit(&nodeSrc[index_11].mass, metal::memory_order_relaxed); float mass_1 = static_cast(_e19); spring_force = metal::float3(0.0); int _e31 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 0u], metal::memory_order_relaxed); spring_force.x = as_type(_e31); int _e39 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 1u], metal::memory_order_relaxed); spring_force.y = as_type(_e39); int _e47 = metal::atomic_load_explicit(&springForceSrc[(index_11 * 3u) + 2u], metal::memory_order_relaxed); spring_force.z = as_type(_e47); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 0u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 1u], 0, metal::memory_order_relaxed); metal::atomic_store_explicit(&springForceSrc[(index_11 * 3u) + 2u], 0, metal::memory_order_relaxed); metal::float3 _e67 = spring_force; spring_force = _e67 * 100.0; metal::float3 _e72 = nodeSrc[index_11].force; metal::float3 _e73 = spring_force; nodeSrc[index_11].force = _e72 + _e73; return; } struct displacementInput { }; kernel void displacement( metal::uint3 global_invocation_id_11 [[thread_position_in_grid]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint total_8 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_12 = global_invocation_id_11.x; if (index_12 >= total_8) { return; } metal::float3 _e17 = nodeSrc[index_12].force; metal::float3 _e20 = nodeSrc[index_12].prev_force; metal::float3 d_force = _e17 - _e20; float swg = metal::sqrt(metal::dot(d_force, d_force)); uint _e31 = metal::atomic_load_explicit(&nodeSrc[index_12].mass, metal::memory_order_relaxed); float factor_2 = (1.0 / (1.0 + metal::sqrt(1.0 * swg))) / static_cast(_e31); metal::float3 _e36 = nodeSrc[index_12].position; metal::float3 _e39 = nodeSrc[index_12].force; nodeSrc[index_12].position = _e36 + ((_e39 * factor_2) * 0.009999999776482582); metal::float3 _e48 = nodeSrc[index_12].force; nodeSrc[index_12].prev_force = _e48; nodeSrc[index_12].force = metal::float3(0.0); return; } struct randomizeInput { }; kernel void randomize( metal::uint3 global_invocation_id_12 [[thread_position_in_grid]] , constant Uniforms& uniforms [[user(fake0)]] , device type_6& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos_1 = {}; uint total_9 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_13 = global_invocation_id_12.x; if (index_13 >= total_9) { return; } metal::float3 _e16 = nodeSrc[index_13].position; vPos_1 = _e16; uint _e22 = uniforms.frame_num; float _e25 = random_xy(index_13, 0u + (3u * _e22)); vPos_1.x = (_e25 * 2.0) - 1.0; uint _e34 = uniforms.frame_num; float _e37 = random_xy(index_13, 1u + (3u * _e34)); vPos_1.y = (_e37 * 2.0) - 1.0; uint _e46 = uniforms.frame_num; float _e49 = random_xy(index_13, 2u + (3u * _e46)); vPos_1.z = (_e49 * 2.0) - 1.0; metal::float3 _e56 = vPos_1; nodeSrc[index_13].position = _e56; nodeSrc[index_13].force = metal::float3(0.0); nodeSrc[index_13].prev_force = metal::float3(0.0); return; } struct copyInput { }; kernel void copy( metal::uint3 global_invocation_id_13 [[thread_position_in_grid]] , device type_6 const& nodeSrc [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { metal::float3 vPos_2 = {}; uint total_10 = 1 + (_buffer_sizes.size1 - 0 - 48) / 48; uint index_14 = global_invocation_id_13.x; if (index_14 >= total_10) { return; } metal::float3 _e16 = nodeSrc[index_14].position; vPos_2 = _e16; return; } ================================================ FILE: lib/naga/debug/CS_boids.wgsl ================================================ struct Node { position: vec3, force: vec3, prev_force: vec3, mass: atomic, }; struct Uniforms { frame_num: u32, }; struct Bound { bound_min: vec3, bound_max: vec3, } struct BHTree { max_depth: atomic, bottom: atomic, radius: f32, } struct BHTreeNode { position: vec3, mass: atomic, count: i32, start: atomic, sort: i32, } @group(0) @binding(0) var uniforms: Uniforms; @group(0) @binding(1) var nodeSrc: array; @group(0) @binding(2) var edgeSrc: array>; @group(0) @binding(3) var springForceSrc: array>; @group(0) @binding(4) var bounding: array; @group(0) @binding(5) var bhTree: BHTree; @group(0) @binding(6) var treeNode: array; @group(0) @binding(7) var treeChild: array>; fn hash(s: u32) -> u32 { var t : u32 = s; t ^= 2747636419u; t *= 2654435769u; t ^= t >> 16u; t *= 2654435769u; t ^= t >> 16u; t *= 2654435769u; return t; } fn random(seed: u32) -> f32 { return f32(hash(seed)) / 4294967295.0; // 2^32-1 } fn random_xy(seed_x: u32, seed_y: u32) -> f32 { return f32(hash(hash(seed_x) + seed_y)) / 4294967295.0; // 2^32-1 } fn atomic_add_f32(springIndex: u32, updateValue: f32) { let atomic_ptr = &springForceSrc[springIndex]; var new_u32 = bitcast(updateValue); var assumed: i32 = 0; var origin: i32; while (true) { origin = atomicCompareExchangeWeak(atomic_ptr, assumed, new_u32); if (origin == assumed) { break; } assumed = origin; new_u32 = bitcast(bitcast(origin) + updateValue); } } @compute @workgroup_size(256) fn gen_node(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = nodeSrc[index].position; vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0; // Write back nodeSrc[index].position = vPos; nodeSrc[index].force = vec3(0.0); nodeSrc[index].prev_force = vec3(0.0); atomicStore(&nodeSrc[index].mass, 1u); atomicStore(&springForceSrc[index * 3u + 0u], 0); atomicStore(&springForceSrc[index * 3u + 1u], 0); atomicStore(&springForceSrc[index * 3u + 2u], 0); let target_node: u32 = index * 3u + 2u; let aa = atomicExchange(&springForceSrc[target_node], 0); } @compute @workgroup_size(256) fn cal_mass(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&edgeSrc); let index = global_invocation_id.x; if (index >= total) { return; } var edge = edgeSrc[index]; let source_node: u32 = edge[0]; let target_node: u32 = edge[1]; atomicAdd(&nodeSrc[source_node].mass, 1u); atomicAdd(&nodeSrc[target_node].mass, 1u); } @compute @workgroup_size(256) fn cal_gravity_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } // TODO: Global Param let strong_gravity = true; let k_gravity = 1.0; let pos = nodeSrc[index].position; let mass = f32(atomicLoad(&nodeSrc[index].mass)); var gravity_force: f32; if (strong_gravity) { gravity_force = k_gravity * mass; } else { if (pos.x != 0.0 || pos.y != 0.0 || pos.z != 0.0) { gravity_force = k_gravity * mass * inverseSqrt(dot(pos, pos)); } else { gravity_force = 0.0; } } nodeSrc[index].force += -pos * gravity_force; // nodeSrc[index].force += -pos * 2.; } @compute @workgroup_size(256) fn attractive_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&edgeSrc); let index = global_invocation_id.x; if (index >= total) { return; } var edge = edgeSrc[index]; let source_node: u32 = edge[0]; let target_node: u32 = edge[1]; var dir = nodeSrc[target_node].position - nodeSrc[source_node].position; atomic_add_f32(source_node * 3u + 0u, dir.x); atomic_add_f32(source_node * 3u + 1u, dir.y); atomic_add_f32(source_node * 3u + 2u, dir.z); atomic_add_f32(target_node * 3u + 0u, -dir.x); atomic_add_f32(target_node * 3u + 1u, -dir.y); atomic_add_f32(target_node * 3u + 2u, -dir.z); } var smin: array, 256>; var smax: array, 256>; @compute @workgroup_size(256) fn reduction_bounding( @builtin(local_invocation_index) local_index: u32, @builtin(global_invocation_id) global_id: vec3, @builtin(workgroup_id) group_id: vec3, ) { var index = global_id.x; let total = arrayLength(&nodeSrc); if (index >= total) { index = total - 1u; } smin[local_index] = nodeSrc[index].position; smax[local_index] = nodeSrc[index].position; workgroupBarrier(); for (var s = 256u / 2u; s > 0u; s >>= 1u) { if (local_index < s) { let k = local_index + s; smin[local_index] = min(smin[local_index], smin[k]); smax[local_index] = max(smax[local_index], smax[k]); } workgroupBarrier(); } if (local_index == 0u) { bounding[group_id.x].bound_min = smin[0]; bounding[group_id.x].bound_max = smax[0]; } } @compute @workgroup_size(1) fn bounding_box() { var bound_min_min = bounding[0].bound_min; var bound_max_max = bounding[0].bound_max; let node_group_count = u32(ceil(f32(arrayLength(&nodeSrc)) / 256.0)); for (var i = 0u; i < node_group_count; i++) { bound_min_min = min(bound_min_min, bounding[i].bound_min); bound_max_max = max(bound_max_max, bounding[i].bound_max); } bounding[0].bound_min = bound_min_min; bounding[0].bound_max = bound_max_max; let box = bound_max_max - bound_min_min; let tree_node_count = arrayLength(&treeNode) - 1u; bhTree.radius = max(max(box.x, box.y), box.z) * 0.5; atomicStore(&bhTree.bottom, tree_node_count); atomicStore(&bhTree.max_depth, 0u); atomicStore(&treeNode[tree_node_count].mass, -1); atomicStore(&treeNode[tree_node_count].start, 0); treeNode[tree_node_count].position = (bound_min_min + bound_max_max) * 0.5; treeNode[tree_node_count].count = -1; treeNode[tree_node_count].sort = 0; } @compute @workgroup_size(256) fn clear_1(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&treeNode); let index = global_invocation_id.x; if (index >= total) { return; } for (var i = 0u; i < 8u; i++) { atomicStore(&treeChild[index * 8u + i], -1); } } @compute @workgroup_size(256) fn tree_building(@builtin(global_invocation_id) global_invocation_id: vec3) { var index = global_invocation_id.x; let node_count = arrayLength(&nodeSrc); let tree_node_count = arrayLength(&treeNode) - 1u; let root_pos = treeNode[tree_node_count].position; let inc = min(node_count, 16384u); // should change var skip = 1; var pos: vec3; var dp: vec3; var rdp: vec3; var n = tree_node_count; var depth = 1u; var local_max_depth = 1u; var j = 0u; var root_r = bhTree.radius; var r = root_r * 0.5; var limit = 10000; while (index < node_count) { limit--; if (limit < 0) { return; } if (skip != 0) { skip = 0; pos = nodeSrc[index].position; n = tree_node_count; r = root_r * 0.5; depth = 1u; let compare = step(root_pos, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); // 八个象限 dp = -r + compare * (2.0 * r); rdp = root_pos + dp; // 所在象限的原点 } // atomicAdd(&treeChild[n * 8u + j], 0); // ... var ch = atomicLoad(&treeChild[n * 8u + j]); // 迭代至叶节点 while (ch >= i32(node_count)) { n = u32(ch); depth++; r *= 0.5; let compare = step(rdp, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); dp = -r + compare * (2.0 * r); rdp += dp; ch = atomicLoad(&treeChild[n * 8u + j]); } let locked = n * 8u + j; var locked_ch = -1; // 非 lock 状态 if (ch != -2) { if (ch == -1) { var v = -1; let origin = atomicCompareExchangeWeak(&treeChild[locked], v, i32(index)); if (origin == -1) { local_max_depth = max(depth, local_max_depth); index += inc; skip = 1; } else { skip = 0; } } else { // 格子已被占用,将其设置为 lock 状态 var v = ch; let origin = atomicCompareExchangeWeak(&treeChild[locked], v, -2); if (ch == origin) { // lock 成功,如果两个点的位置相同,做一点微小偏移就行了 if (all(nodeSrc[ch].position == pos)) { nodeSrc[index].position += vec3(0.1, -0.05, 0.1); skip = 0; atomicStore(&treeChild[locked], ch); break; } // 两个点位置不同,则开始分裂 locked_ch = -1; loop { // 1. create new cell let cell = atomicSub(&bhTree.bottom, 1u) - 1u; if (cell <= node_count) { return; } if (locked_ch != -1) { atomicStore(&treeChild[n * 8u + j], i32(cell)); } locked_ch = max(locked_ch, i32(cell)); // 2. make newly created cell current depth++; n = cell; r *= 0.5; // 3. insert old body into current quadrant let compare = step(rdp, nodeSrc[ch].position); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); atomicStore(&treeChild[cell * 8u + j], ch); // 4. determin center + quadrant for cell of new body let compare = step(rdp, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); dp = -r + compare * (2.0 * r); rdp += dp; // 5. visit this cell/chec if in use (possibly by old body) ch = atomicLoad(&treeChild[n * 8u + j]); if (ch < 0) { break; } }; atomicStore(&treeChild[n * 8u + j], i32(index)); local_max_depth = max(depth, local_max_depth); index += inc; skip = 2; } } } workgroupBarrier(); if (skip == 2) { atomicStore(&treeChild[locked], locked_ch); } } atomicMax(&bhTree.max_depth, local_max_depth); } @compute @workgroup_size(256) fn clear_2(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&treeNode) - 1u; let index = global_invocation_id.x; if (index >= total) { return; } treeNode[index].position = vec3(0.0); treeNode[index].count = -1; treeNode[index].sort = 0; atomicStore(&treeNode[index].start, -1); atomicStore(&treeNode[index].mass, -1); } @compute @workgroup_size(256) fn summarization(@builtin(global_invocation_id) global_invocation_id: vec3) { let bottom = atomicLoad(&bhTree.bottom); let tree_node_count = arrayLength(&treeNode) - 1u; let node_count = arrayLength(&nodeSrc); let inc = min(node_count, 16384u); var index = u32((i32(bottom) & -32) + i32(global_invocation_id.x)); if (index < bottom) { index += inc; } // TODO: ch bounds check var schild: array; var smass: array; let restart = index; for (var j = 0; j < 5; j++) { while (index <= tree_node_count) { if (atomicLoad(&treeNode[index].mass) < 0) { var ch = 0u; var i = 0u; for (i = 0u; i < 8u; i++) { ch = u32(atomicLoad(&treeChild[index * 8u + i])); schild[i] = i32(ch); // atomicAdd(&treeNode[ch].mass, 0); smass[i] = atomicLoad(&treeNode[ch].mass); if (ch >= node_count && smass[i] < 0) { break; } } if (i == 8u) { var cm = 0; var pos = vec3(0.0); var cnt = 0; for (i = 0u; i < 8u; i++) { if (schild[i] >= 0) { let ch = u32(schild[i]); if (ch >= node_count) { let m = smass[i]; cnt += treeNode[ch].count; pos += treeNode[ch].position * f32(m); cm += m; } else { let m = i32(atomicLoad(&nodeSrc[ch].mass)); cnt += 1; pos += nodeSrc[ch].position * f32(m); cm += m; } } } treeNode[index].count = cnt; treeNode[index].position = pos / f32(cm); // workgroupBarrier(); atomicStore(&treeNode[index].mass, cm); } } index += inc; } index = restart; } var j = 0; var flag = false; while (index <= tree_node_count) { if (index < node_count) { index += inc; } else if (index >= node_count && atomicLoad(&treeNode[index].mass) >= 0) { index += inc; } else { if (j == 0) { j = 8; for (var i = 0u; i < 8u; i++) { let ch = atomicLoad(&treeChild[index * 8u + i]); schild[i] = ch; smass[i] = atomicLoad(&treeNode[ch].mass); if (ch < i32(node_count) || smass[i] >= 0) { j--; } } } else { j = 8; for (var i = 0u; i < 8u; i++) { let ch = u32(schild[i]); let old_mass = smass[i]; smass[i] = atomicLoad(&treeNode[ch].mass); if (ch < node_count || old_mass >= 0 || smass[i] >= 0) { j--; } } } if (j == 0) { var cm = 0; var pos = vec3(0.0); var cnt = 0; for (i = 0u; i < 8u; i++) { if (schild[i] >= 0) { let ch = u32(schild[i]); if (ch >= node_count) { let m = smass[i]; cnt += treeNode[ch].count; pos += treeNode[ch].position * f32(m); cm += m; } else { let m = i32(atomicLoad(&nodeSrc[ch].mass)); cnt += 1; pos += nodeSrc[ch].position * f32(m); cm += m; } } } treeNode[index].count = cnt; treeNode[index].position = pos / f32(cm); flag = true; } } // workgroupBarrier(); if (flag) { if (index < node_count) { atomicStore(&nodeSrc[index].mass, u32(cm)); } else { atomicStore(&treeNode[index].mass, cm); } index += inc; flag = false; } } } @compute @workgroup_size(256) fn sort(@builtin(global_invocation_id) global_invocation_id: vec3) { let tree_node_count = arrayLength(&treeNode) - 1u; let bottom = atomicLoad(&bhTree.bottom); let node_count = arrayLength(&nodeSrc); let inc = min(node_count, 16384u); var index = tree_node_count + 1u - inc + global_invocation_id.x; while (index >= bottom) { var start = atomicLoad(&treeNode[index].start); if (start >= 0) { var j = 0u; for (var i = 0u; i < 8u; i++) { let ch = atomicLoad(&treeChild[index * 8u + i]); if (ch >= 0) { // 把子节点集中到开头 if (i != j) { atomicStore(&treeChild[index * 8u + i], -1); atomicStore(&treeChild[index * 8u + j], ch); } j++; if (ch >= i32(node_count)) { atomicStore(&treeNode[ch].start, start); start += treeNode[ch].count; } else { treeNode[start].sort = ch; start++; } } } if (index < inc) { break; } index -= inc; } } } @compute @workgroup_size(256) fn electron_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let tree_node_count = arrayLength(&treeNode) - 1u; let node_count = arrayLength(&nodeSrc); let inc = min(node_count, 16384u); // TODO: Global Param let scale = 0.0003; var spos: array; var snode: array; var sdq: array; let itolsq = 1.0; let epssq = 0.05 * 0.05; let diameter = bhTree.radius * 2.0; let max_depth = atomicLoad(&bhTree.max_depth); sdq[0] = diameter * diameter * itolsq; for (var j = 1u; j < max_depth; j++) { sdq[j] = sdq[j - 1u] * 0.25; sdq[j - 1u] += epssq; } sdq[max_depth - 1u] += epssq; if (max_depth < 48u) { for (var index = global_invocation_id.x; index < node_count; index += inc) { let order = treeNode[index].sort; let pos = nodeSrc[order].position; var af = vec3(0.0); var depth = 0u; spos[0] = 0u; snode[0] = tree_node_count; loop { var pd = spos[depth]; var nd = snode[depth]; while (pd < 8u) { let n = atomicLoad(&treeChild[nd * 8u + pd]); pd++; if (n >= 0) { let n = u32(n); var dp: vec3; if (n < node_count) { dp = pos - nodeSrc[n].position; } else { dp = pos - treeNode[n].position; } let dist2 = dot(dp, dp); if (n < node_count) { if (dist2 > 0.0) { let factor = scale * f32(atomicLoad(&nodeSrc[order].mass)) * f32(atomicLoad(&nodeSrc[n].mass)) / dist2; af += dp * factor; } } else if (dist2 >= sdq[depth]) { if (dist2 > 0.0) { let factor = scale * f32(atomicLoad(&nodeSrc[order].mass)) * f32(atomicLoad(&treeNode[n].mass)) / dist2; af += dp * factor; } } else { spos[depth] = pd; snode[depth] = nd; depth++; pd = 0u; nd = n; } } else { pd = 8u; } } if (depth == 0u) { break; } depth--; } nodeSrc[order].force += af; } } } @compute @workgroup_size(256) fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } let vPos: vec3 = nodeSrc[index].position; let mass = f32(atomicLoad(&nodeSrc[index].mass)); // TODO: Global Param let scaling_ratio = 0.0002; var spring_force = vec3(0.0); spring_force.x = bitcast(atomicLoad(&springForceSrc[index * 3u + 0u])); spring_force.y = bitcast(atomicLoad(&springForceSrc[index * 3u + 1u])); spring_force.z = bitcast(atomicLoad(&springForceSrc[index * 3u + 2u])); atomicStore(&springForceSrc[index * 3u + 0u], 0); atomicStore(&springForceSrc[index * 3u + 1u], 0); atomicStore(&springForceSrc[index * 3u + 2u], 0); spring_force *= 100.0; nodeSrc[index].force += spring_force; } @compute @workgroup_size(256) fn displacement(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } // TODO: Global Param let global_speed = 1.0; let d_force = nodeSrc[index].force - nodeSrc[index].prev_force; let swg = sqrt(dot(d_force, d_force)); let factor = global_speed / (1.0 + sqrt(global_speed * swg)) / f32(nodeSrc[index].mass); nodeSrc[index].position += nodeSrc[index].force * factor * 0.01; nodeSrc[index].prev_force = nodeSrc[index].force; nodeSrc[index].force = vec3(0.0); } @compute @workgroup_size(256) fn randomize(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = nodeSrc[index].position; vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0; // Write back nodeSrc[index].position = vPos; nodeSrc[index].force = vec3(0.0); nodeSrc[index].prev_force = vec3(0.0); } @compute @workgroup_size(256) fn copy(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = arrayLength(&nodeSrc); let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = nodeSrc[index].position; // var vVel : vec3 = nodeSrc[index].velocity; // Write back // nodeSrc[index] = Node(vPos, vVel); } ================================================ FILE: lib/naga/debug/atomic.metal ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size0; }; typedef metal::atomic_int type_1[1]; void atomic_add_f32_( uint springIndex, float updateValue, device type_1& arr, constant _mslBufferSizes& _buffer_sizes ) { int new_u32_ = {}; int assumed = 0; int origin = {}; new_u32_ = as_type(updateValue); while(true) { if (true) { } else { break; } int _e10 = assumed; int _e11 = new_u32_; metal::atomic_compare_exchange_weak_explicit(&arr[springIndex], &_e10, _e11, metal::memory_order_relaxed, metal::memory_order_relaxed); origin = _e10; int _e13 = origin; int _e14 = assumed; if (_e13 == _e14) { break; } int _e16 = origin; assumed = _e16; int _e17 = origin; new_u32_ = as_type(as_type(_e17) + updateValue); } return; } void cas( device type_1& arr, constant _mslBufferSizes& _buffer_sizes ) { int v = -1; metal::atomic_compare_exchange_weak_explicit(&arr[0], &-1, 1, metal::memory_order_relaxed, metal::memory_order_relaxed); int _e10 = v; metal::atomic_compare_exchange_weak_explicit(&arr[0], &_e10, 1, metal::memory_order_relaxed, metal::memory_order_relaxed); return; } ================================================ FILE: lib/naga/debug/atomic.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 11 OpCapability Shader OpCapability Linkage %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpSource GLSL 450 OpName %7 "f" %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %5 = OpConstant %4 2.0 %8 = OpTypeFunction %2 %7 = OpFunction %2 None %8 %6 = OpLabel OpBranch %9 %9 = OpLabel %10 = OpExtInst %4 %1 Step %3 %5 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/debug/atomic.wgsl ================================================ fn f() { let x = 1.0; let y = 2.0; let z = step(x, y); } ================================================ FILE: lib/naga/fuzz/.gitignore ================================================ target corpus artifacts ================================================ FILE: lib/naga/fuzz/Cargo.toml ================================================ [package] name = "naga-fuzz" version = "0.0.0" authors = ["Automatically generated"] publish = false edition = "2018" [package.metadata] cargo-fuzz = true [dependencies] arbitrary = { version = "1.0.2", features = ["derive"] } libfuzzer-sys = "0.4" [dependencies.naga] path = ".." features = ["arbitrary", "spv-in", "wgsl-in", "glsl-in", "validate"] # Prevent this from interfering with workspaces [workspace] members = ["."] [[bin]] name = "spv_parser" path = "fuzz_targets/spv_parser.rs" test = false doc = false [[bin]] name = "wgsl_parser" path = "fuzz_targets/wgsl_parser.rs" test = false doc = false [[bin]] name = "glsl_parser" path = "fuzz_targets/glsl_parser.rs" test = false doc = false [[bin]] name = "ir" path = "fuzz_targets/ir.rs" test = false doc = false ================================================ FILE: lib/naga/fuzz/fuzz_targets/glsl_parser.rs ================================================ #![no_main] use arbitrary::Arbitrary; use libfuzzer_sys::fuzz_target; use naga::{ front::glsl::{Options, Parser}, FastHashMap, ShaderStage, }; #[derive(Debug, Arbitrary)] enum ShaderStageProxy { Vertex, Fragment, Compute, } impl From for ShaderStage { fn from(proxy: ShaderStageProxy) -> Self { match proxy { ShaderStageProxy::Vertex => ShaderStage::Vertex, ShaderStageProxy::Fragment => ShaderStage::Fragment, ShaderStageProxy::Compute => ShaderStage::Compute, } } } #[derive(Debug, Arbitrary)] struct OptionsProxy { pub stage: ShaderStageProxy, pub defines: FastHashMap, } impl From for Options { fn from(proxy: OptionsProxy) -> Self { Options { stage: proxy.stage.into(), defines: proxy.defines, } } } fuzz_target!(|data: (OptionsProxy, String)| { let (options, source) = data; // Ensure the parser can handle potentially malformed strings without crashing. let mut parser = Parser::default(); let _result = parser.parse(&options.into(), &source); }); ================================================ FILE: lib/naga/fuzz/fuzz_targets/ir.rs ================================================ #![no_main] use libfuzzer_sys::fuzz_target; fuzz_target!(|module: naga::Module| { use naga::valid as v; // Check if the module validates without errors. //TODO: may also fuzz the flags and capabilities let mut validator = v::Validator::new(v::ValidationFlags::all(), v::Capabilities::empty()); let _result = validator.validate(&module); }); ================================================ FILE: lib/naga/fuzz/fuzz_targets/spv_parser.rs ================================================ #![no_main] use libfuzzer_sys::fuzz_target; use naga::front::spv::{Options, Parser}; fuzz_target!(|data: Vec| { // Ensure the parser can handle potentially malformed data without crashing. let options = Options::default(); let _result = Parser::new(data.into_iter(), &options).parse(); }); ================================================ FILE: lib/naga/fuzz/fuzz_targets/wgsl_parser.rs ================================================ #![no_main] use libfuzzer_sys::fuzz_target; use naga::front::wgsl::Parser; fuzz_target!(|data: String| { // Ensure the parser can handle potentially malformed strings without crashing. let _result = Parser::new().parse(&data); }); ================================================ FILE: lib/naga/src/arena.rs ================================================ use std::{cmp::Ordering, fmt, hash, marker::PhantomData, num::NonZeroU32, ops}; /// An unique index in the arena array that a handle points to. /// The "non-zero" part ensures that an `Option>` has /// the same size and representation as `Handle`. type Index = NonZeroU32; use crate::Span; use indexmap::set::IndexSet; #[derive(Clone, Copy, Debug, thiserror::Error, PartialEq)] #[error("Handle {index} of {kind} is either not present, or inaccessible yet")] pub struct BadHandle { pub kind: &'static str, pub index: usize, } /// A strongly typed reference to an arena item. /// /// A `Handle` value can be used as an index into an [`Arena`] or [`UniqueArena`]. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr( any(feature = "serialize", feature = "deserialize"), serde(transparent) )] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Handle { index: Index, #[cfg_attr(any(feature = "serialize", feature = "deserialize"), serde(skip))] marker: PhantomData, } impl Clone for Handle { fn clone(&self) -> Self { Handle { index: self.index, marker: self.marker, } } } impl Copy for Handle {} impl PartialEq for Handle { fn eq(&self, other: &Self) -> bool { self.index == other.index } } impl Eq for Handle {} impl PartialOrd for Handle { fn partial_cmp(&self, other: &Self) -> Option { self.index.partial_cmp(&other.index) } } impl Ord for Handle { fn cmp(&self, other: &Self) -> Ordering { self.index.cmp(&other.index) } } impl fmt::Debug for Handle { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "[{}]", self.index) } } impl hash::Hash for Handle { fn hash(&self, hasher: &mut H) { self.index.hash(hasher) } } impl Handle { #[cfg(test)] pub const DUMMY: Self = Handle { index: unsafe { NonZeroU32::new_unchecked(u32::MAX) }, marker: PhantomData, }; pub(crate) const fn new(index: Index) -> Self { Handle { index, marker: PhantomData, } } /// Returns the zero-based index of this handle. pub const fn index(self) -> usize { let index = self.index.get() - 1; index as usize } /// Convert a `usize` index into a `Handle`. fn from_usize(index: usize) -> Self { use std::convert::TryFrom; let handle_index = u32::try_from(index + 1) .ok() .and_then(Index::new) .expect("Failed to insert into arena. Handle overflows"); Handle::new(handle_index) } /// Convert a `usize` index into a `Handle`, without range checks. const unsafe fn from_usize_unchecked(index: usize) -> Self { Handle::new(Index::new_unchecked((index + 1) as u32)) } } /// A strongly typed range of handles. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr( any(feature = "serialize", feature = "deserialize"), serde(transparent) )] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Range { inner: ops::Range, #[cfg_attr(any(feature = "serialize", feature = "deserialize"), serde(skip))] marker: PhantomData, } impl Clone for Range { fn clone(&self) -> Self { Range { inner: self.inner.clone(), marker: self.marker, } } } impl fmt::Debug for Range { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "[{}..{}]", self.inner.start + 1, self.inner.end) } } impl Iterator for Range { type Item = Handle; fn next(&mut self) -> Option { if self.inner.start < self.inner.end { self.inner.start += 1; Some(Handle { index: NonZeroU32::new(self.inner.start).unwrap(), marker: self.marker, }) } else { None } } } /// An arena holding some kind of component (e.g., type, constant, /// instruction, etc.) that can be referenced. /// /// Adding new items to the arena produces a strongly-typed [`Handle`]. /// The arena can be indexed using the given handle to obtain /// a reference to the stored item. #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "serialize", serde(transparent))] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] #[cfg_attr(test, derive(PartialEq))] pub struct Arena { /// Values of this arena. data: Vec, #[cfg(feature = "span")] #[cfg_attr(feature = "serialize", serde(skip))] span_info: Vec, } impl Default for Arena { fn default() -> Self { Self::new() } } impl fmt::Debug for Arena { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_map().entries(self.iter()).finish() } } impl Arena { /// Create a new arena with no initial capacity allocated. pub const fn new() -> Self { Arena { data: Vec::new(), #[cfg(feature = "span")] span_info: Vec::new(), } } /// Extracts the inner vector. #[allow(clippy::missing_const_for_fn)] // ignore due to requirement of #![feature(const_precise_live_drops)] pub fn into_inner(self) -> Vec { self.data } /// Returns the current number of items stored in this arena. pub fn len(&self) -> usize { self.data.len() } /// Returns `true` if the arena contains no elements. pub fn is_empty(&self) -> bool { self.data.is_empty() } /// Returns an iterator over the items stored in this arena, returning both /// the item's handle and a reference to it. pub fn iter(&self) -> impl DoubleEndedIterator, &T)> { self.data .iter() .enumerate() .map(|(i, v)| unsafe { (Handle::from_usize_unchecked(i), v) }) } /// Returns a iterator over the items stored in this arena, /// returning both the item's handle and a mutable reference to it. pub fn iter_mut(&mut self) -> impl DoubleEndedIterator, &mut T)> { self.data .iter_mut() .enumerate() .map(|(i, v)| unsafe { (Handle::from_usize_unchecked(i), v) }) } /// Adds a new value to the arena, returning a typed handle. pub fn append(&mut self, value: T, span: Span) -> Handle { #[cfg(not(feature = "span"))] let _ = span; let index = self.data.len(); self.data.push(value); #[cfg(feature = "span")] self.span_info.push(span); Handle::from_usize(index) } /// Fetch a handle to an existing type. pub fn fetch_if bool>(&self, fun: F) -> Option> { self.data .iter() .position(fun) .map(|index| unsafe { Handle::from_usize_unchecked(index) }) } /// Adds a value with a custom check for uniqueness: /// returns a handle pointing to /// an existing element if the check succeeds, or adds a new /// element otherwise. pub fn fetch_if_or_append bool>( &mut self, value: T, span: Span, fun: F, ) -> Handle { if let Some(index) = self.data.iter().position(|d| fun(d, &value)) { unsafe { Handle::from_usize_unchecked(index) } } else { self.append(value, span) } } /// Adds a value with a check for uniqueness, where the check is plain comparison. pub fn fetch_or_append(&mut self, value: T, span: Span) -> Handle where T: PartialEq, { self.fetch_if_or_append(value, span, T::eq) } pub fn try_get(&self, handle: Handle) -> Result<&T, BadHandle> { self.data.get(handle.index()).ok_or_else(|| BadHandle { kind: std::any::type_name::(), index: handle.index(), }) } /// Get a mutable reference to an element in the arena. pub fn get_mut(&mut self, handle: Handle) -> &mut T { self.data.get_mut(handle.index()).unwrap() } /// Get the range of handles from a particular number of elements to the end. pub fn range_from(&self, old_length: usize) -> Range { Range { inner: old_length as u32..self.data.len() as u32, marker: PhantomData, } } /// Clears the arena keeping all allocations pub fn clear(&mut self) { self.data.clear() } pub fn get_span(&self, handle: Handle) -> Span { #[cfg(feature = "span")] { *self .span_info .get(handle.index()) .unwrap_or(&Span::default()) } #[cfg(not(feature = "span"))] { let _ = handle; Span::default() } } } #[cfg(feature = "deserialize")] impl<'de, T> serde::Deserialize<'de> for Arena where T: serde::Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let data = Vec::deserialize(deserializer)?; #[cfg(feature = "span")] let span_info = std::iter::repeat(Span::default()) .take(data.len()) .collect(); Ok(Self { data, #[cfg(feature = "span")] span_info, }) } } impl ops::Index> for Arena { type Output = T; fn index(&self, handle: Handle) -> &T { &self.data[handle.index()] } } impl ops::IndexMut> for Arena { fn index_mut(&mut self, handle: Handle) -> &mut T { &mut self.data[handle.index()] } } impl ops::Index> for Arena { type Output = [T]; fn index(&self, range: Range) -> &[T] { &self.data[range.inner.start as usize..range.inner.end as usize] } } #[cfg(test)] mod tests { use super::*; #[test] fn append_non_unique() { let mut arena: Arena = Arena::new(); let t1 = arena.append(0, Default::default()); let t2 = arena.append(0, Default::default()); assert!(t1 != t2); assert!(arena[t1] == arena[t2]); } #[test] fn append_unique() { let mut arena: Arena = Arena::new(); let t1 = arena.append(0, Default::default()); let t2 = arena.append(1, Default::default()); assert!(t1 != t2); assert!(arena[t1] != arena[t2]); } #[test] fn fetch_or_append_non_unique() { let mut arena: Arena = Arena::new(); let t1 = arena.fetch_or_append(0, Default::default()); let t2 = arena.fetch_or_append(0, Default::default()); assert!(t1 == t2); assert!(arena[t1] == arena[t2]) } #[test] fn fetch_or_append_unique() { let mut arena: Arena = Arena::new(); let t1 = arena.fetch_or_append(0, Default::default()); let t2 = arena.fetch_or_append(1, Default::default()); assert!(t1 != t2); assert!(arena[t1] != arena[t2]); } } /// An arena whose elements are guaranteed to be unique. /// /// A `UniqueArena` holds a set of unique values of type `T`, each with an /// associated [`Span`]. Inserting a value returns a `Handle`, which can be /// used to index the `UniqueArena` and obtain shared access to the `T` element. /// Access via a `Handle` is an array lookup - no hash lookup is necessary. /// /// The element type must implement `Eq` and `Hash`. Insertions of equivalent /// elements, according to `Eq`, all return the same `Handle`. /// /// Once inserted, elements may not be mutated. /// /// `UniqueArena` is similar to [`Arena`]: If `Arena` is vector-like, /// `UniqueArena` is `HashSet`-like. #[cfg_attr(feature = "clone", derive(Clone))] pub struct UniqueArena { set: IndexSet, /// Spans for the elements, indexed by handle. /// /// The length of this vector is always equal to `set.len()`. `IndexSet` /// promises that its elements "are indexed in a compact range, without /// holes in the range 0..set.len()", so we can always use the indices /// returned by insertion as indices into this vector. #[cfg(feature = "span")] span_info: Vec, } impl UniqueArena { /// Create a new arena with no initial capacity allocated. pub fn new() -> Self { UniqueArena { set: IndexSet::new(), #[cfg(feature = "span")] span_info: Vec::new(), } } /// Return the current number of items stored in this arena. pub fn len(&self) -> usize { self.set.len() } /// Return `true` if the arena contains no elements. pub fn is_empty(&self) -> bool { self.set.is_empty() } /// Clears the arena, keeping all allocations. pub fn clear(&mut self) { self.set.clear(); #[cfg(feature = "span")] self.span_info.clear(); } /// Return the span associated with `handle`. /// /// If a value has been inserted multiple times, the span returned is the /// one provided with the first insertion. /// /// If the `span` feature is not enabled, always return `Span::default`. /// This can be detected with [`Span::is_defined`]. pub fn get_span(&self, handle: Handle) -> Span { #[cfg(feature = "span")] { *self .span_info .get(handle.index()) .unwrap_or(&Span::default()) } #[cfg(not(feature = "span"))] { let _ = handle; Span::default() } } } impl UniqueArena { /// Returns an iterator over the items stored in this arena, returning both /// the item's handle and a reference to it. pub fn iter(&self) -> impl DoubleEndedIterator, &T)> { self.set.iter().enumerate().map(|(i, v)| { let position = i + 1; let index = unsafe { Index::new_unchecked(position as u32) }; (Handle::new(index), v) }) } /// Insert a new value into the arena. /// /// Return a [`Handle`], which can be used to index this arena to get a /// shared reference to the element. /// /// If this arena already contains an element that is `Eq` to `value`, /// return a `Handle` to the existing element, and drop `value`. /// /// When the `span` feature is enabled, if `value` is inserted into the /// arena, associate `span` with it. An element's span can be retrieved with /// the [`get_span`] method. /// /// [`Handle`]: Handle /// [`get_span`]: UniqueArena::get_span pub fn insert(&mut self, value: T, span: Span) -> Handle { let (index, added) = self.set.insert_full(value); #[cfg(feature = "span")] { if added { debug_assert!(index == self.span_info.len()); self.span_info.push(span); } debug_assert!(self.set.len() == self.span_info.len()); } #[cfg(not(feature = "span"))] let _ = (span, added); Handle::from_usize(index) } /// Return this arena's handle for `value`, if present. /// /// If this arena already contains an element equal to `value`, /// return its handle. Otherwise, return `None`. pub fn get(&self, value: &T) -> Option> { self.set .get_index_of(value) .map(|index| unsafe { Handle::from_usize_unchecked(index) }) } /// Return this arena's value at `handle`, if that is a valid handle. pub fn get_handle(&self, handle: Handle) -> Result<&T, BadHandle> { self.set.get_index(handle.index()).ok_or_else(|| BadHandle { kind: std::any::type_name::(), index: handle.index(), }) } } impl Default for UniqueArena { fn default() -> Self { Self::new() } } impl fmt::Debug for UniqueArena { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_map().entries(self.iter()).finish() } } impl ops::Index> for UniqueArena { type Output = T; fn index(&self, handle: Handle) -> &T { &self.set[handle.index()] } } #[cfg(feature = "serialize")] impl serde::Serialize for UniqueArena where T: Eq + hash::Hash + serde::Serialize, { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { self.set.serialize(serializer) } } #[cfg(feature = "deserialize")] impl<'de, T> serde::Deserialize<'de> for UniqueArena where T: Eq + hash::Hash + serde::Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let set = IndexSet::deserialize(deserializer)?; #[cfg(feature = "span")] let span_info = std::iter::repeat(Span::default()).take(set.len()).collect(); Ok(Self { set, #[cfg(feature = "span")] span_info, }) } } //Note: largely borrowed from `HashSet` implementation #[cfg(feature = "arbitrary")] impl<'a, T> arbitrary::Arbitrary<'a> for UniqueArena where T: Eq + hash::Hash + arbitrary::Arbitrary<'a>, { fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { let mut arena = Self::default(); for elem in u.arbitrary_iter()? { arena.set.insert(elem?); #[cfg(feature = "span")] arena.span_info.push(Span::UNDEFINED); } Ok(arena) } fn arbitrary_take_rest(u: arbitrary::Unstructured<'a>) -> arbitrary::Result { let mut arena = Self::default(); for elem in u.arbitrary_take_rest_iter()? { arena.set.insert(elem?); #[cfg(feature = "span")] arena.span_info.push(Span::UNDEFINED); } Ok(arena) } #[inline] fn size_hint(depth: usize) -> (usize, Option) { let depth_hint = ::size_hint(depth); arbitrary::size_hint::and(depth_hint, (0, None)) } } ================================================ FILE: lib/naga/src/back/dot/mod.rs ================================================ /*! Backend for [DOT][dot] (Graphviz). This backend writes a graph in the DOT language, for the ease of IR inspection and debugging. [dot]: https://graphviz.org/doc/info/lang.html */ use crate::{ arena::Handle, valid::{FunctionInfo, ModuleInfo}, }; use std::{ borrow::Cow, fmt::{Error as FmtError, Write as _}, }; /// Configuration options for the dot backend #[derive(Default)] pub struct Options { /// Only emit function bodies pub cfg_only: bool, } /// Identifier used to address a graph node type NodeId = usize; /// Stores the target nodes for control flow statements #[derive(Default, Clone, Copy)] struct Targets { /// The node, if some, where continue operations will land continue_target: Option, /// The node, if some, where break operations will land break_target: Option, } /// Stores information about the graph of statements #[derive(Default)] struct StatementGraph { /// List of node names nodes: Vec<&'static str>, /// List of edges of the control flow, the items are defined as /// (from, to, label) flow: Vec<(NodeId, NodeId, &'static str)>, /// List of implicit edges of the control flow, used for jump /// operations such as continue or break, the items are defined as /// (from, to, label, color_id) jumps: Vec<(NodeId, NodeId, &'static str, usize)>, /// List of dependency relationships between a statement node and /// expressions dependencies: Vec<(NodeId, Handle, &'static str)>, /// List of expression emitted by statement node emits: Vec<(NodeId, Handle)>, /// List of function call by statement node calls: Vec<(NodeId, Handle)>, } impl StatementGraph { /// Adds a new block to the statement graph, returning the first and last node, respectively fn add(&mut self, block: &[crate::Statement], targets: Targets) -> (NodeId, NodeId) { use crate::Statement as S; // The first node of the block isn't a statement but a virtual node let root = self.nodes.len(); self.nodes.push(if root == 0 { "Root" } else { "Node" }); // Track the last placed node, this will be returned to the caller and // will also be used to generate the control flow edges let mut last_node = root; for statement in block { // Reserve a new node for the current statement and link it to the // node of the previous statement let id = self.nodes.len(); self.flow.push((last_node, id, "")); self.nodes.push(""); // reserve space // Track the node identifier for the merge node, the merge node is // the last node of a statement, normally this is the node itself, // but for control flow statements such as `if`s and `switch`s this // is a virtual node where all branches merge back. let mut merge_id = id; self.nodes[id] = match *statement { S::Emit(ref range) => { for handle in range.clone() { self.emits.push((id, handle)); } "Emit" } S::Kill => "Kill", //TODO: link to the beginning S::Break => { // Try to link to the break target, otherwise produce // a broken connection if let Some(target) = targets.break_target { self.jumps.push((id, target, "Break", 5)) } else { self.jumps.push((id, root, "Broken", 7)) } "Break" } S::Continue => { // Try to link to the continue target, otherwise produce // a broken connection if let Some(target) = targets.continue_target { self.jumps.push((id, target, "Continue", 5)) } else { self.jumps.push((id, root, "Broken", 7)) } "Continue" } S::Barrier(_flags) => "Barrier", S::Block(ref b) => { let (other, last) = self.add(b, targets); self.flow.push((id, other, "")); // All following nodes should connect to the end of the block // statement so change the merge id to it. merge_id = last; "Block" } S::If { condition, ref accept, ref reject, } => { self.dependencies.push((id, condition, "condition")); let (accept_id, accept_last) = self.add(accept, targets); self.flow.push((id, accept_id, "accept")); let (reject_id, reject_last) = self.add(reject, targets); self.flow.push((id, reject_id, "reject")); // Create a merge node, link the branches to it and set it // as the merge node to make the next statement node link to it merge_id = self.nodes.len(); self.nodes.push("Merge"); self.flow.push((accept_last, merge_id, "")); self.flow.push((reject_last, merge_id, "")); "If" } S::Switch { selector, ref cases, } => { self.dependencies.push((id, selector, "selector")); // Create a merge node and set it as the merge node to make // the next statement node link to it merge_id = self.nodes.len(); self.nodes.push("Merge"); // Create a new targets structure and set the break target // to the merge node let mut targets = targets; targets.break_target = Some(merge_id); for case in cases { let (case_id, case_last) = self.add(&case.body, targets); let label = match case.value { crate::SwitchValue::Integer(_) => "case", crate::SwitchValue::Default => "default", }; self.flow.push((id, case_id, label)); // Link the last node of the branch to the merge node self.flow.push((case_last, merge_id, "")); } "Switch" } S::Loop { ref body, ref continuing, break_if, } => { // Create a new targets structure and set the break target // to the merge node, this must happen before generating the // continuing block since it can break. let mut targets = targets; targets.break_target = Some(id); let (continuing_id, continuing_last) = self.add(continuing, targets); // Set the the continue target to the beginning // of the newly generated continuing block targets.continue_target = Some(continuing_id); let (body_id, body_last) = self.add(body, targets); self.flow.push((id, body_id, "body")); // Link the last node of the body to the continuing block self.flow.push((body_last, continuing_id, "continuing")); // Link the last node of the continuing block back to the // beginning of the loop body self.flow.push((continuing_last, body_id, "continuing")); if let Some(expr) = break_if { self.dependencies.push((continuing_id, expr, "break if")); } "Loop" } S::Return { value } => { if let Some(expr) = value { self.dependencies.push((id, expr, "value")); } "Return" } S::Store { pointer, value } => { self.dependencies.push((id, value, "value")); self.emits.push((id, pointer)); "Store" } S::ImageStore { image, coordinate, array_index, value, } => { self.dependencies.push((id, image, "image")); self.dependencies.push((id, coordinate, "coordinate")); if let Some(expr) = array_index { self.dependencies.push((id, expr, "array_index")); } self.dependencies.push((id, value, "value")); "ImageStore" } S::Call { function, ref arguments, result, } => { for &arg in arguments { self.dependencies.push((id, arg, "arg")); } if let Some(expr) = result { self.emits.push((id, expr)); } self.calls.push((id, function)); "Call" } S::Atomic { pointer, ref fun, value, result, } => { self.emits.push((id, result)); self.dependencies.push((id, pointer, "pointer")); self.dependencies.push((id, value, "value")); if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun { self.dependencies.push((id, cmp, "cmp")); } "Atomic" } }; // Set the last node to the merge node last_node = merge_id; } (root, last_node) } } #[allow(clippy::manual_unwrap_or)] fn name(option: &Option) -> &str { match *option { Some(ref name) => name, None => "", } } /// set39 color scheme from const COLORS: &[&str] = &[ "white", // pattern starts at 1 "#8dd3c7", "#ffffb3", "#bebada", "#fb8072", "#80b1d3", "#fdb462", "#b3de69", "#fccde5", "#d9d9d9", ]; fn write_fun( output: &mut String, prefix: String, fun: &crate::Function, info: Option<&FunctionInfo>, options: &Options, ) -> Result<(), FmtError> { writeln!(output, "\t\tnode [ style=filled ]")?; if !options.cfg_only { for (handle, var) in fun.local_variables.iter() { writeln!( output, "\t\t{}_l{} [ shape=hexagon label=\"{:?} '{}'\" ]", prefix, handle.index(), handle, name(&var.name), )?; } write_function_expressions(output, &prefix, fun, info)?; } let mut sg = StatementGraph::default(); sg.add(&fun.body, Targets::default()); for (index, label) in sg.nodes.into_iter().enumerate() { writeln!( output, "\t\t{}_s{} [ shape=square label=\"{}\" ]", prefix, index, label, )?; } for (from, to, label) in sg.flow { writeln!( output, "\t\t{}_s{} -> {}_s{} [ arrowhead=tee label=\"{}\" ]", prefix, from, prefix, to, label, )?; } for (from, to, label, color_id) in sg.jumps { writeln!( output, "\t\t{}_s{} -> {}_s{} [ arrowhead=tee style=dashed color=\"{}\" label=\"{}\" ]", prefix, from, prefix, to, COLORS[color_id], label, )?; } if !options.cfg_only { for (to, expr, label) in sg.dependencies { writeln!( output, "\t\t{}_e{} -> {}_s{} [ label=\"{}\" ]", prefix, expr.index(), prefix, to, label, )?; } for (from, to) in sg.emits { writeln!( output, "\t\t{}_s{} -> {}_e{} [ style=dotted ]", prefix, from, prefix, to.index(), )?; } } for (from, function) in sg.calls { writeln!( output, "\t\t{}_s{} -> f{}_s0", prefix, from, function.index(), )?; } Ok(()) } fn write_function_expressions( output: &mut String, prefix: &str, fun: &crate::Function, info: Option<&FunctionInfo>, ) -> Result<(), FmtError> { enum Payload<'a> { Arguments(&'a [Handle]), Local(Handle), Global(Handle), } let mut edges = crate::FastHashMap::<&str, _>::default(); let mut payload = None; for (handle, expression) in fun.expressions.iter() { use crate::Expression as E; let (label, color_id) = match *expression { E::Access { base, index } => { edges.insert("base", base); edges.insert("index", index); ("Access".into(), 1) } E::AccessIndex { base, index } => { edges.insert("base", base); (format!("AccessIndex[{}]", index).into(), 1) } E::Constant(_) => ("Constant".into(), 2), E::Splat { size, value } => { edges.insert("value", value); (format!("Splat{:?}", size).into(), 3) } E::Swizzle { size, vector, pattern, } => { edges.insert("vector", vector); (format!("Swizzle{:?}", &pattern[..size as usize]).into(), 3) } E::Compose { ref components, .. } => { payload = Some(Payload::Arguments(components)); ("Compose".into(), 3) } E::FunctionArgument(index) => (format!("Argument[{}]", index).into(), 1), E::GlobalVariable(h) => { payload = Some(Payload::Global(h)); ("Global".into(), 2) } E::LocalVariable(h) => { payload = Some(Payload::Local(h)); ("Local".into(), 1) } E::Load { pointer } => { edges.insert("pointer", pointer); ("Load".into(), 4) } E::ImageSample { image, sampler, gather, coordinate, array_index, offset: _, level, depth_ref, } => { edges.insert("image", image); edges.insert("sampler", sampler); edges.insert("coordinate", coordinate); if let Some(expr) = array_index { edges.insert("array_index", expr); } match level { crate::SampleLevel::Auto => {} crate::SampleLevel::Zero => {} crate::SampleLevel::Exact(expr) => { edges.insert("level", expr); } crate::SampleLevel::Bias(expr) => { edges.insert("bias", expr); } crate::SampleLevel::Gradient { x, y } => { edges.insert("grad_x", x); edges.insert("grad_y", y); } } if let Some(expr) = depth_ref { edges.insert("depth_ref", expr); } let string = match gather { Some(component) => Cow::Owned(format!("ImageGather{:?}", component)), _ => Cow::Borrowed("ImageSample"), }; (string, 5) } E::ImageLoad { image, coordinate, array_index, sample, level, } => { edges.insert("image", image); edges.insert("coordinate", coordinate); if let Some(expr) = array_index { edges.insert("array_index", expr); } if let Some(sample) = sample { edges.insert("sample", sample); } if let Some(level) = level { edges.insert("level", level); } ("ImageLoad".into(), 5) } E::ImageQuery { image, query } => { edges.insert("image", image); let args = match query { crate::ImageQuery::Size { level } => { if let Some(expr) = level { edges.insert("level", expr); } Cow::from("ImageSize") } _ => Cow::Owned(format!("{:?}", query)), }; (args, 7) } E::Unary { op, expr } => { edges.insert("expr", expr); (format!("{:?}", op).into(), 6) } E::Binary { op, left, right } => { edges.insert("left", left); edges.insert("right", right); (format!("{:?}", op).into(), 6) } E::Select { condition, accept, reject, } => { edges.insert("condition", condition); edges.insert("accept", accept); edges.insert("reject", reject); ("Select".into(), 3) } E::Derivative { axis, expr } => { edges.insert("", expr); (format!("d{:?}", axis).into(), 8) } E::Relational { fun, argument } => { edges.insert("arg", argument); (format!("{:?}", fun).into(), 6) } E::Math { fun, arg, arg1, arg2, arg3, } => { edges.insert("arg", arg); if let Some(expr) = arg1 { edges.insert("arg1", expr); } if let Some(expr) = arg2 { edges.insert("arg2", expr); } if let Some(expr) = arg3 { edges.insert("arg3", expr); } (format!("{:?}", fun).into(), 7) } E::As { kind, expr, convert, } => { edges.insert("", expr); let string = match convert { Some(width) => format!("Convert<{:?},{}>", kind, width), None => format!("Bitcast<{:?}>", kind), }; (string.into(), 3) } E::CallResult(_function) => ("CallResult".into(), 4), E::AtomicResult { .. } => ("AtomicResult".into(), 4), E::ArrayLength(expr) => { edges.insert("", expr); ("ArrayLength".into(), 7) } }; // give uniform expressions an outline let color_attr = match info { Some(info) if info[handle].uniformity.non_uniform_result.is_none() => "fillcolor", _ => "color", }; writeln!( output, "\t\t{}_e{} [ {}=\"{}\" label=\"{:?} {}\" ]", prefix, handle.index(), color_attr, COLORS[color_id], handle, label, )?; for (key, edge) in edges.drain() { writeln!( output, "\t\t{}_e{} -> {}_e{} [ label=\"{}\" ]", prefix, edge.index(), prefix, handle.index(), key, )?; } match payload.take() { Some(Payload::Arguments(list)) => { write!(output, "\t\t{{")?; for &comp in list { write!(output, " {}_e{}", prefix, comp.index())?; } writeln!(output, " }} -> {}_e{}", prefix, handle.index())?; } Some(Payload::Local(h)) => { writeln!( output, "\t\t{}_l{} -> {}_e{}", prefix, h.index(), prefix, handle.index(), )?; } Some(Payload::Global(h)) => { writeln!( output, "\t\tg{} -> {}_e{} [fillcolor=gray]", h.index(), prefix, handle.index(), )?; } None => {} } } Ok(()) } /// Write shader module to a [`String`]. pub fn write( module: &crate::Module, mod_info: Option<&ModuleInfo>, options: Options, ) -> Result { use std::fmt::Write as _; let mut output = String::new(); output += "digraph Module {\n"; if !options.cfg_only { writeln!(output, "\tsubgraph cluster_globals {{")?; writeln!(output, "\t\tlabel=\"Globals\"")?; for (handle, var) in module.global_variables.iter() { writeln!( output, "\t\tg{} [ shape=hexagon label=\"{:?} {:?}/'{}'\" ]", handle.index(), handle, var.space, name(&var.name), )?; } writeln!(output, "\t}}")?; } for (handle, fun) in module.functions.iter() { let prefix = format!("f{}", handle.index()); writeln!(output, "\tsubgraph cluster_{} {{", prefix)?; writeln!( output, "\t\tlabel=\"Function{:?}/'{}'\"", handle, name(&fun.name) )?; let info = mod_info.map(|a| &a[handle]); write_fun(&mut output, prefix, fun, info, &options)?; writeln!(output, "\t}}")?; } for (ep_index, ep) in module.entry_points.iter().enumerate() { let prefix = format!("ep{}", ep_index); writeln!(output, "\tsubgraph cluster_{} {{", prefix)?; writeln!(output, "\t\tlabel=\"{:?}/'{}'\"", ep.stage, ep.name)?; let info = mod_info.map(|a| a.get_entry_point(ep_index)); write_fun(&mut output, prefix, &ep.function, info, &options)?; writeln!(output, "\t}}")?; } output += "}\n"; Ok(output) } ================================================ FILE: lib/naga/src/back/glsl/features.rs ================================================ use super::{BackendResult, Error, Version, Writer}; use crate::{ AddressSpace, Binding, Bytes, Expression, Handle, ImageClass, ImageDimension, Interpolation, MathFunction, Sampling, ScalarKind, ShaderStage, StorageFormat, Type, TypeInner, }; use std::fmt::Write; bitflags::bitflags! { /// Structure used to encode additions to GLSL that aren't supported by all versions. pub struct Features: u32 { /// Buffer address space support. const BUFFER_STORAGE = 1; const ARRAY_OF_ARRAYS = 1 << 1; /// 8 byte floats. const DOUBLE_TYPE = 1 << 2; /// More image formats. const FULL_IMAGE_FORMATS = 1 << 3; const MULTISAMPLED_TEXTURES = 1 << 4; const MULTISAMPLED_TEXTURE_ARRAYS = 1 << 5; const CUBE_TEXTURES_ARRAY = 1 << 6; const COMPUTE_SHADER = 1 << 7; /// Image load and early depth tests. const IMAGE_LOAD_STORE = 1 << 8; const CONSERVATIVE_DEPTH = 1 << 9; /// Interpolation and auxiliary qualifiers. /// /// Perspective, Flat, and Centroid are available in all GLSL versions we support. const NOPERSPECTIVE_QUALIFIER = 1 << 11; const SAMPLE_QUALIFIER = 1 << 12; const CLIP_DISTANCE = 1 << 13; const CULL_DISTANCE = 1 << 14; /// Sample ID. const SAMPLE_VARIABLES = 1 << 15; /// Arrays with a dynamic length. const DYNAMIC_ARRAY_SIZE = 1 << 16; const MULTI_VIEW = 1 << 17; /// Fused multiply-add. const FMA = 1 << 18; /// Texture samples query const TEXTURE_SAMPLES = 1 << 19; /// Texture levels query const TEXTURE_LEVELS = 1 << 20; /// Image size query const IMAGE_SIZE = 1 << 21; } } /// Helper structure used to store the required [`Features`] needed to output a /// [`Module`](crate::Module) /// /// Provides helper methods to check for availability and writing required extensions pub struct FeaturesManager(Features); impl FeaturesManager { /// Creates a new [`FeaturesManager`] instance pub const fn new() -> Self { Self(Features::empty()) } /// Adds to the list of required [`Features`] pub fn request(&mut self, features: Features) { self.0 |= features } /// Checks that all required [`Features`] are available for the specified /// [`Version`](super::Version) otherwise returns an /// [`Error::MissingFeatures`](super::Error::MissingFeatures) pub fn check_availability(&self, version: Version) -> BackendResult { // Will store all the features that are unavailable let mut missing = Features::empty(); // Helper macro to check for feature availability macro_rules! check_feature { // Used when only core glsl supports the feature ($feature:ident, $core:literal) => { if self.0.contains(Features::$feature) && (version < Version::Desktop($core) || version.is_es()) { missing |= Features::$feature; } }; // Used when both core and es support the feature ($feature:ident, $core:literal, $es:literal) => { if self.0.contains(Features::$feature) && (version < Version::Desktop($core) || version < Version::new_gles($es)) { missing |= Features::$feature; } }; } check_feature!(COMPUTE_SHADER, 420, 310); check_feature!(BUFFER_STORAGE, 400, 310); check_feature!(DOUBLE_TYPE, 150); check_feature!(CUBE_TEXTURES_ARRAY, 130, 310); check_feature!(MULTISAMPLED_TEXTURES, 150, 300); check_feature!(MULTISAMPLED_TEXTURE_ARRAYS, 150, 310); check_feature!(ARRAY_OF_ARRAYS, 120, 310); check_feature!(IMAGE_LOAD_STORE, 130, 310); check_feature!(CONSERVATIVE_DEPTH, 130, 300); check_feature!(CONSERVATIVE_DEPTH, 130, 300); check_feature!(NOPERSPECTIVE_QUALIFIER, 130); check_feature!(SAMPLE_QUALIFIER, 400, 320); // gl_ClipDistance is supported by core versions > 1.3 and aren't supported by an es versions without extensions check_feature!(CLIP_DISTANCE, 130, 300); check_feature!(CULL_DISTANCE, 450, 300); check_feature!(SAMPLE_VARIABLES, 400, 300); check_feature!(DYNAMIC_ARRAY_SIZE, 430, 310); match version { Version::Embedded { is_webgl: true, .. } => check_feature!(MULTI_VIEW, 140, 300), _ => check_feature!(MULTI_VIEW, 140, 310), }; // Only available on glsl core, this means that opengl es can't query the number // of samples nor levels in a image and neither do bound checks on the sample nor // the level argument of texelFecth check_feature!(TEXTURE_SAMPLES, 150); check_feature!(TEXTURE_LEVELS, 130); check_feature!(IMAGE_SIZE, 430, 310); // Return an error if there are missing features if missing.is_empty() { Ok(()) } else { Err(Error::MissingFeatures(missing)) } } /// Helper method used to write all needed extensions /// /// # Notes /// This won't check for feature availability so it might output extensions that aren't even /// supported.[`check_availability`](Self::check_availability) will check feature availability pub fn write(&self, version: Version, mut out: impl Write) -> BackendResult { if self.0.contains(Features::COMPUTE_SHADER) && !version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_compute_shader.txt writeln!(out, "#extension GL_ARB_compute_shader : require")?; } if self.0.contains(Features::BUFFER_STORAGE) && !version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_storage_buffer_object.txt writeln!( out, "#extension GL_ARB_shader_storage_buffer_object : require" )?; } if self.0.contains(Features::DOUBLE_TYPE) && version < Version::Desktop(400) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gpu_shader_fp64.txt writeln!(out, "#extension GL_ARB_gpu_shader_fp64 : require")?; } if self.0.contains(Features::CUBE_TEXTURES_ARRAY) { if version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_cube_map_array.txt writeln!(out, "#extension GL_EXT_texture_cube_map_array : require")?; } else if version < Version::Desktop(400) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_cube_map_array.txt writeln!(out, "#extension GL_ARB_texture_cube_map_array : require")?; } } if self.0.contains(Features::MULTISAMPLED_TEXTURE_ARRAYS) && version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_storage_multisample_2d_array.txt writeln!( out, "#extension GL_OES_texture_storage_multisample_2d_array : require" )?; } if self.0.contains(Features::ARRAY_OF_ARRAYS) && version < Version::Desktop(430) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_arrays_of_arrays.txt writeln!(out, "#extension ARB_arrays_of_arrays : require")?; } if self.0.contains(Features::IMAGE_LOAD_STORE) { if self.0.contains(Features::FULL_IMAGE_FORMATS) && version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/NV/NV_image_formats.txt writeln!(out, "#extension GL_NV_image_formats : require")?; } if version < Version::Desktop(420) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_image_load_store.txt writeln!(out, "#extension GL_ARB_shader_image_load_store : require")?; } } if self.0.contains(Features::CONSERVATIVE_DEPTH) { if version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_conservative_depth.txt writeln!(out, "#extension GL_EXT_conservative_depth : require")?; } if version < Version::Desktop(420) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_conservative_depth.txt writeln!(out, "#extension GL_ARB_conservative_depth : require")?; } } if (self.0.contains(Features::CLIP_DISTANCE) || self.0.contains(Features::CULL_DISTANCE)) && version.is_es() { // TODO: handle gl_ClipDistance and gl_CullDistance usage in better way // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_cull_distance.txt // writeln!(out, "#extension GL_EXT_clip_cull_distance : require")?; } if self.0.contains(Features::SAMPLE_VARIABLES) && version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt writeln!(out, "#extension GL_OES_sample_variables : require")?; } if self.0.contains(Features::SAMPLE_VARIABLES) && version.is_es() { // https://www.khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt writeln!(out, "#extension GL_OES_sample_variables : require")?; } if self.0.contains(Features::MULTI_VIEW) { if let Version::Embedded { is_webgl: true, .. } = version { // https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt writeln!(out, "#extension GL_OVR_multiview2 : require")?; } else { // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_multiview.txt writeln!(out, "#extension GL_EXT_multiview : require")?; } } if self.0.contains(Features::FMA) && version >= Version::new_gles(310) { // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_gpu_shader5.txt writeln!(out, "#extension GL_EXT_gpu_shader5 : require")?; } if self.0.contains(Features::TEXTURE_SAMPLES) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_texture_image_samples.txt writeln!( out, "#extension GL_ARB_shader_texture_image_samples : require" )?; } if self.0.contains(Features::TEXTURE_LEVELS) && version < Version::Desktop(430) { // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_query_levels.txt writeln!(out, "#extension GL_ARB_texture_query_levels : require")?; } Ok(()) } } impl<'a, W> Writer<'a, W> { /// Helper method that searches the module for all the needed [`Features`] /// /// # Errors /// If the version doesn't support any of the needed [`Features`] a /// [`Error::MissingFeatures`](super::Error::MissingFeatures) will be returned pub(super) fn collect_required_features(&mut self) -> BackendResult { let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); if let Some(depth_test) = self.entry_point.early_depth_test { // If IMAGE_LOAD_STORE is supported for this version of GLSL if self.options.version.supports_early_depth_test() { self.features.request(Features::IMAGE_LOAD_STORE); } if depth_test.conservative.is_some() { self.features.request(Features::CONSERVATIVE_DEPTH); } } for arg in self.entry_point.function.arguments.iter() { self.varying_required_features(arg.binding.as_ref(), arg.ty); } if let Some(ref result) = self.entry_point.function.result { self.varying_required_features(result.binding.as_ref(), result.ty); } if let ShaderStage::Compute = self.entry_point.stage { self.features.request(Features::COMPUTE_SHADER) } if self.multiview.is_some() { self.features.request(Features::MULTI_VIEW); } for (ty_handle, ty) in self.module.types.iter() { match ty.inner { TypeInner::Scalar { kind, width } => self.scalar_required_features(kind, width), TypeInner::Vector { kind, width, .. } => self.scalar_required_features(kind, width), TypeInner::Matrix { width, .. } => { self.scalar_required_features(ScalarKind::Float, width) } TypeInner::Array { base, size, .. } => { if let TypeInner::Array { .. } = self.module.types[base].inner { self.features.request(Features::ARRAY_OF_ARRAYS) } // If the array is dynamically sized if size == crate::ArraySize::Dynamic { let mut is_used = false; // Check if this type is used in a global that is needed by the current entrypoint for (global_handle, global) in self.module.global_variables.iter() { // Skip unused globals if ep_info[global_handle].is_empty() { continue; } // If this array is the type of a global, then this array is used if global.ty == ty_handle { is_used = true; break; } // If the type of this global is a struct if let crate::TypeInner::Struct { ref members, .. } = self.module.types[global.ty].inner { // Check the last element of the struct to see if it's type uses // this array if let Some(last) = members.last() { if last.ty == ty_handle { is_used = true; break; } } } } // If this dynamically size array is used, we need dynamic array size support if is_used { self.features.request(Features::DYNAMIC_ARRAY_SIZE); } } } TypeInner::Image { dim, arrayed, class, } => { if arrayed && dim == ImageDimension::Cube { self.features.request(Features::CUBE_TEXTURES_ARRAY) } match class { ImageClass::Sampled { multi: true, .. } | ImageClass::Depth { multi: true } => { self.features.request(Features::MULTISAMPLED_TEXTURES); if arrayed { self.features.request(Features::MULTISAMPLED_TEXTURE_ARRAYS); } } ImageClass::Storage { format, .. } => match format { StorageFormat::R8Unorm | StorageFormat::R8Snorm | StorageFormat::R8Uint | StorageFormat::R8Sint | StorageFormat::R16Uint | StorageFormat::R16Sint | StorageFormat::R16Float | StorageFormat::Rg8Unorm | StorageFormat::Rg8Snorm | StorageFormat::Rg8Uint | StorageFormat::Rg8Sint | StorageFormat::Rg16Uint | StorageFormat::Rg16Sint | StorageFormat::Rg16Float | StorageFormat::Rgb10a2Unorm | StorageFormat::Rg11b10Float | StorageFormat::Rg32Uint | StorageFormat::Rg32Sint | StorageFormat::Rg32Float => { self.features.request(Features::FULL_IMAGE_FORMATS) } _ => {} }, ImageClass::Sampled { multi: false, .. } | ImageClass::Depth { multi: false } => {} } } _ => {} } } let mut push_constant_used = false; for (handle, global) in self.module.global_variables.iter() { if ep_info[handle].is_empty() { continue; } match global.space { AddressSpace::WorkGroup => self.features.request(Features::COMPUTE_SHADER), AddressSpace::Storage { .. } => self.features.request(Features::BUFFER_STORAGE), AddressSpace::PushConstant => { if push_constant_used { return Err(Error::MultiplePushConstants); } push_constant_used = true; } _ => {} } } // We will need to pass some of the members to a closure, so we need // to separate them otherwise the borrow checker will complain, this // shouldn't be needed in rust 2021 let &mut Self { module, info, ref mut features, entry_point, entry_point_idx, ref policies, .. } = self; // Loop trough all expressions in both functions and the entry point // to check for needed features for (expressions, info) in module .functions .iter() .map(|(h, f)| (&f.expressions, &info[h])) .chain(std::iter::once(( &entry_point.function.expressions, info.get_entry_point(entry_point_idx as usize), ))) { for (_, expr) in expressions.iter() { match *expr { // Check for fused multiply add use Expression::Math { fun, .. } if fun == MathFunction::Fma => { features.request(Features::FMA) } // Check for queries that neeed aditonal features Expression::ImageQuery { image, query, .. } => match query { // Storage images use `imageSize` which is only available // in glsl > 420 // // layers queries are also implemented as size queries crate::ImageQuery::Size { .. } | crate::ImageQuery::NumLayers => { if let TypeInner::Image { class: crate::ImageClass::Storage { .. }, .. } = *info[image].ty.inner_with(&module.types) { features.request(Features::IMAGE_SIZE) } }, crate::ImageQuery::NumLevels => features.request(Features::TEXTURE_LEVELS), crate::ImageQuery::NumSamples => features.request(Features::TEXTURE_SAMPLES), } , // Check for image loads that needs bound checking on the sample // or level argument since this requires a feature Expression::ImageLoad { sample, level, .. } => { if policies.image != crate::proc::BoundsCheckPolicy::Unchecked { if sample.is_some() { features.request(Features::TEXTURE_SAMPLES) } if level.is_some() { features.request(Features::TEXTURE_LEVELS) } } } _ => {} } } } self.features.check_availability(self.options.version) } /// Helper method that checks the [`Features`] needed by a scalar fn scalar_required_features(&mut self, kind: ScalarKind, width: Bytes) { if kind == ScalarKind::Float && width == 8 { self.features.request(Features::DOUBLE_TYPE); } } fn varying_required_features(&mut self, binding: Option<&Binding>, ty: Handle) { match self.module.types[ty].inner { crate::TypeInner::Struct { ref members, .. } => { for member in members { self.varying_required_features(member.binding.as_ref(), member.ty); } } _ => { if let Some(binding) = binding { match *binding { Binding::BuiltIn(built_in) => match built_in { crate::BuiltIn::ClipDistance => { self.features.request(Features::CLIP_DISTANCE) } crate::BuiltIn::CullDistance => { self.features.request(Features::CULL_DISTANCE) } crate::BuiltIn::SampleIndex => { self.features.request(Features::SAMPLE_VARIABLES) } crate::BuiltIn::ViewIndex => { self.features.request(Features::MULTI_VIEW) } _ => {} }, Binding::Location { location: _, interpolation, sampling, } => { if interpolation == Some(Interpolation::Linear) { self.features.request(Features::NOPERSPECTIVE_QUALIFIER); } if sampling == Some(Sampling::Sample) { self.features.request(Features::SAMPLE_QUALIFIER); } } } } } } } } ================================================ FILE: lib/naga/src/back/glsl/keywords.rs ================================================ pub const RESERVED_KEYWORDS: &[&str] = &[ "attribute", "const", "uniform", "varying", "buffer", "shared", "coherent", "volatile", "restrict", "readonly", "writeonly", "atomic_uint", "layout", "centroid", "flat", "smooth", "noperspective", "patch", "sample", "break", "continue", "do", "for", "while", "switch", "case", "default", "if", "else", "subroutine", "in", "out", "inout", "float", "double", "int", "void", "bool", "true", "false", "invariant", "precise", "discard", "return", "mat2", "mat3", "mat4", "dmat2", "dmat3", "dmat4", "mat2x2", "mat2x3", "mat2x4", "dmat2x2", "dmat2x3", "dmat2x4", "mat3x2", "mat3x3", "mat3x4", "dmat3x2", "dmat3x3", "dmat3x4", "mat4x2", "mat4x3", "mat4x4", "dmat4x2", "dmat4x3", "dmat4x4", "vec2", "vec3", "vec4", "ivec2", "ivec3", "ivec4", "bvec2", "bvec3", "bvec4", "dvec2", "dvec3", "dvec4", "uint", "uvec2", "uvec3", "uvec4", "lowp", "mediump", "highp", "precision", "sampler1D", "sampler2D", "sampler3D", "samplerCube", "sampler1DShadow", "sampler2DShadow", "samplerCubeShadow", "sampler1DArray", "sampler2DArray", "sampler1DArrayShadow", "sampler2DArrayShadow", "isampler1D", "isampler2D", "isampler3D", "isamplerCube", "isampler1DArray", "isampler2DArray", "usampler1D", "usampler2D", "usampler3D", "usamplerCube", "usampler1DArray", "usampler2DArray", "sampler2DRect", "sampler2DRectShadow", "isampler2D", "Rect", "usampler2DRect", "samplerBuffer", "isamplerBuffer", "usamplerBuffer", "sampler2DMS", "isampler2DMS", "usampler2DMS", "sampler2DMSArray", "isampler2DMSArray", "usampler2DMSArray", "samplerCubeArray", "samplerCubeArrayShadow", "isamplerCubeArray", "usamplerCubeArray", "image1D", "iimage1D", "uimage1D", "image2D", "iimage2D", "uimage2D", "image3D", "iimage3D", "uimage3D", "image2DRect", "iimage2DRect", "uimage2DRect", "imageCube", "iimageCube", "uimageCube", "imageBuffer", "iimageBuffer", "uimageBuffer", "image1DArray", "iimage1DArray", "uimage1DArray", "image2DArray", "iimage2DArray", "uimage2DArray", "imageCubeArray", "iimageCubeArray", "uimageCubeArray", "image2DMS", "iimage2DMS", "uimage2DMS", "image2DMSArray", "iimage2DMSArray", "uimage2DMSArraystruct", "common", "partition", "active", "asm", "class", "union", "enum", "typedef", "template", "this", "resource", "goto", "inline", "noinline", "public", "static", "extern", "external", "interface", "long", "short", "half", "fixed", "unsigned", "superp", "input", "output", "hvec2", "hvec3", "hvec4", "fvec2", "fvec3", "fvec4", "sampler3DRect", "filter", "sizeof", "cast", "namespace", "using", "main", ]; ================================================ FILE: lib/naga/src/back/glsl/mod.rs ================================================ /*! Backend for [GLSL][glsl] (OpenGL Shading Language). The main structure is [`Writer`], it maintains internal state that is used to output a [`Module`](crate::Module) into glsl # Supported versions ### Core - 330 - 400 - 410 - 420 - 430 - 450 ### ES - 300 - 310 [glsl]: https://www.khronos.org/registry/OpenGL/index_gl.php */ // GLSL is mostly a superset of C but it also removes some parts of it this is a list of relevant // aspects for this backend. // // The most notable change is the introduction of the version preprocessor directive that must // always be the first line of a glsl file and is written as // `#version number profile` // `number` is the version itself (i.e. 300) and `profile` is the // shader profile we only support "core" and "es", the former is used in desktop applications and // the later is used in embedded contexts, mobile devices and browsers. Each one as it's own // versions (at the time of writing this the latest version for "core" is 460 and for "es" is 320) // // Other important preprocessor addition is the extension directive which is written as // `#extension name: behaviour` // Extensions provide increased features in a plugin fashion but they aren't required to be // supported hence why they are called extensions, that's why `behaviour` is used it specifies // whether the extension is strictly required or if it should only be enabled if needed. In our case // when we use extensions we set behaviour to `require` always. // // The only thing that glsl removes that makes a difference are pointers. // // Additions that are relevant for the backend are the discard keyword, the introduction of // vector, matrices, samplers, image types and functions that provide common shader operations pub use features::Features; use crate::{ back, proc::{self, NameKey}, valid, Handle, ShaderStage, TypeInner, }; use features::FeaturesManager; use std::{ cmp::Ordering, fmt, fmt::{Error as FmtError, Write}, }; use thiserror::Error; /// Contains the features related code and the features querying method mod features; /// Contains a constant with a slice of all the reserved keywords RESERVED_KEYWORDS mod keywords; /// List of supported `core` GLSL versions. pub const SUPPORTED_CORE_VERSIONS: &[u16] = &[330, 400, 410, 420, 430, 440, 450]; /// List of supported `es` GLSL versions. pub const SUPPORTED_ES_VERSIONS: &[u16] = &[300, 310, 320]; /// The suffix of the variable that will hold the calculated clamped level /// of detail for bounds checking in `ImageLoad` const CLAMPED_LOD_SUFFIX: &str = "_clamped_lod"; /// Mapping between resources and bindings. pub type BindingMap = std::collections::BTreeMap; impl crate::AtomicFunction { const fn to_glsl(self) -> &'static str { match self { Self::Add | Self::Subtract => "Add", Self::And => "And", Self::InclusiveOr => "Or", Self::ExclusiveOr => "Xor", Self::Min => "Min", Self::Max => "Max", Self::Exchange { compare: None } => "Exchange", Self::Exchange { compare: Some(_) } => "", //TODO } } } impl crate::AddressSpace { const fn is_buffer(&self) -> bool { match *self { crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } => true, _ => false, } } /// Whether a variable with this address space can be initialized const fn initializable(&self) -> bool { match *self { crate::AddressSpace::Function | crate::AddressSpace::Private => true, crate::AddressSpace::WorkGroup | crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } | crate::AddressSpace::Handle | crate::AddressSpace::PushConstant => false, } } } /// A GLSL version. #[derive(Debug, Copy, Clone, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum Version { /// `core` GLSL. Desktop(u16), /// `es` GLSL. Embedded { version: u16, is_webgl: bool }, } impl Version { /// Create a new gles version pub const fn new_gles(version: u16) -> Self { Self::Embedded { version, is_webgl: false, } } /// Returns true if self is `Version::Embedded` (i.e. is a es version) const fn is_es(&self) -> bool { match *self { Version::Desktop(_) => false, Version::Embedded { .. } => true, } } /// Returns true if targetting WebGL const fn is_webgl(&self) -> bool { match *self { Version::Desktop(_) => false, Version::Embedded { is_webgl, .. } => is_webgl, } } /// Checks the list of currently supported versions and returns true if it contains the /// specified version /// /// # Notes /// As an invalid version number will never be added to the supported version list /// so this also checks for version validity fn is_supported(&self) -> bool { match *self { Version::Desktop(v) => SUPPORTED_CORE_VERSIONS.contains(&v), Version::Embedded { version: v, .. } => SUPPORTED_ES_VERSIONS.contains(&v), } } /// Checks if the version supports all of the explicit layouts: /// - `location=` qualifiers for bindings /// - `binding=` qualifiers for resources /// /// Note: `location=` for vertex inputs and fragment outputs is supported /// unconditionally for GLES 300. fn supports_explicit_locations(&self) -> bool { *self >= Version::Desktop(410) || *self >= Version::new_gles(310) } fn supports_early_depth_test(&self) -> bool { *self >= Version::Desktop(130) || *self >= Version::new_gles(310) } fn supports_std430_layout(&self) -> bool { *self >= Version::Desktop(430) || *self >= Version::new_gles(310) } fn supports_fma_function(&self) -> bool { *self >= Version::Desktop(400) || *self >= Version::new_gles(310) } } impl PartialOrd for Version { fn partial_cmp(&self, other: &Self) -> Option { match (*self, *other) { (Version::Desktop(x), Version::Desktop(y)) => Some(x.cmp(&y)), (Version::Embedded { version: x, .. }, Version::Embedded { version: y, .. }) => { Some(x.cmp(&y)) } _ => None, } } } impl fmt::Display for Version { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Version::Desktop(v) => write!(f, "{} core", v), Version::Embedded { version: v, .. } => write!(f, "{} es", v), } } } bitflags::bitflags! { /// Configuration flags for the [`Writer`]. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct WriterFlags: u32 { /// Flip output Y and extend Z from (0, 1) to (-1, 1). const ADJUST_COORDINATE_SPACE = 0x1; /// Supports GL_EXT_texture_shadow_lod on the host, which provides /// additional functions on shadows and arrays of shadows. const TEXTURE_SHADOW_LOD = 0x2; } } /// Configuration used in the [`Writer`]. #[derive(Debug, Clone)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Options { /// The GLSL version to be used. pub version: Version, /// Configuration flags for the [`Writer`]. pub writer_flags: WriterFlags, /// Map of resources association to binding locations. pub binding_map: BindingMap, } impl Default for Options { fn default() -> Self { Options { version: Version::new_gles(310), writer_flags: WriterFlags::ADJUST_COORDINATE_SPACE, binding_map: BindingMap::default(), } } } /// A subset of options meant to be changed per pipeline. #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct PipelineOptions { /// The stage of the entry point. pub shader_stage: ShaderStage, /// The name of the entry point. /// /// If no entry point that matches is found while creating a [`Writer`], a error will be thrown. pub entry_point: String, /// How many views to render to, if doing multiview rendering. pub multiview: Option, } /// Reflection info for texture mappings and uniforms. pub struct ReflectionInfo { /// Mapping between texture names and variables/samplers. pub texture_mapping: crate::FastHashMap, /// Mapping between uniform variables and names. pub uniforms: crate::FastHashMap, String>, } /// Mapping between a texture and its sampler, if it exists. /// /// GLSL pre-Vulkan has no concept of separate textures and samplers. Instead, everything is a /// `gsamplerN` where `g` is the scalar type and `N` is the dimension. But naga uses separate textures /// and samplers in the IR, so the backend produces a [`FastHashMap`](crate::FastHashMap) with the texture name /// as a key and a [`TextureMapping`] as a value. This way, the user knows where to bind. /// /// [`Storage`](crate::ImageClass::Storage) images produce `gimageN` and don't have an associated sampler, /// so the [`sampler`](Self::sampler) field will be [`None`]. #[derive(Debug, Clone)] pub struct TextureMapping { /// Handle to the image global variable. pub texture: Handle, /// Handle to the associated sampler global variable, if it exists. pub sampler: Option>, } /// Helper structure that generates a number #[derive(Default)] struct IdGenerator(u32); impl IdGenerator { /// Generates a number that's guaranteed to be unique for this `IdGenerator` fn generate(&mut self) -> u32 { // It's just an increasing number but it does the job let ret = self.0; self.0 += 1; ret } } /// Helper wrapper used to get a name for a varying /// /// Varying have different naming schemes depending on their binding: /// - Varyings with builtin bindings get the from [`glsl_built_in`](glsl_built_in). /// - Varyings with location bindings are named `_S_location_X` where `S` is a /// prefix identifying which pipeline stage the varying connects, and `X` is /// the location. struct VaryingName<'a> { binding: &'a crate::Binding, stage: ShaderStage, output: bool, targetting_webgl: bool, } impl fmt::Display for VaryingName<'_> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self.binding { crate::Binding::Location { location, .. } => { let prefix = match (self.stage, self.output) { (ShaderStage::Compute, _) => unreachable!(), // pipeline to vertex (ShaderStage::Vertex, false) => "p2vs", // vertex to fragment (ShaderStage::Vertex, true) | (ShaderStage::Fragment, false) => "vs2fs", // fragment to pipeline (ShaderStage::Fragment, true) => "fs2p", }; write!(f, "_{}_location{}", prefix, location,) } crate::Binding::BuiltIn(built_in) => { write!( f, "{}", glsl_built_in(built_in, self.output, self.targetting_webgl) ) } } } } impl ShaderStage { const fn to_str(self) -> &'static str { match self { ShaderStage::Compute => "cs", ShaderStage::Fragment => "fs", ShaderStage::Vertex => "vs", } } } /// Shorthand result used internally by the backend type BackendResult = Result; /// A GLSL compilation error. #[derive(Debug, Error)] pub enum Error { /// A error occurred while writing to the output. #[error("Format error")] FmtError(#[from] FmtError), /// The specified [`Version`] doesn't have all required [`Features`]. /// /// Contains the missing [`Features`]. #[error("The selected version doesn't support {0:?}")] MissingFeatures(Features), /// [`AddressSpace::PushConstant`](crate::AddressSpace::PushConstant) was used more than /// once in the entry point, which isn't supported. #[error("Multiple push constants aren't supported")] MultiplePushConstants, /// The specified [`Version`] isn't supported. #[error("The specified version isn't supported")] VersionNotSupported, /// The entry point couldn't be found. #[error("The requested entry point couldn't be found")] EntryPointNotFound, /// A call was made to an unsupported external. #[error("A call was made to an unsupported external: {0}")] UnsupportedExternal(String), /// A scalar with an unsupported width was requested. #[error("A scalar with an unsupported width was requested: {0:?} {1:?}")] UnsupportedScalar(crate::ScalarKind, crate::Bytes), /// A image was used with multiple samplers, which isn't supported. #[error("A image was used with multiple samplers")] ImageMultipleSamplers, #[error("{0}")] Custom(String), } /// Binary operation with a different logic on the GLSL side. enum BinaryOperation { /// Vector comparison should use the function like `greaterThan()`, etc. VectorCompare, /// Vector component wise operation; used to polyfill unsupported ops like `|` and `&` for `bvecN`'s VectorComponentWise, /// GLSL `%` is SPIR-V `OpUMod/OpSMod` and `mod()` is `OpFMod`, but [`BinaryOperator::Modulo`](crate::BinaryOperator::Modulo) is `OpFRem`. Modulo, /// Any plain operation. No additional logic required. Other, } /// Writer responsible for all code generation. pub struct Writer<'a, W> { // Inputs /// The module being written. module: &'a crate::Module, /// The module analysis. info: &'a valid::ModuleInfo, /// The output writer. out: W, /// User defined configuration to be used. options: &'a Options, /// The bound checking policies to be used policies: proc::BoundsCheckPolicies, // Internal State /// Features manager used to store all the needed features and write them. features: FeaturesManager, namer: proc::Namer, /// A map with all the names needed for writing the module /// (generated by a [`Namer`](crate::proc::Namer)). names: crate::FastHashMap, /// A map with the names of global variables needed for reflections. reflection_names_globals: crate::FastHashMap, String>, /// The selected entry point. entry_point: &'a crate::EntryPoint, /// The index of the selected entry point. entry_point_idx: proc::EntryPointIndex, /// A generator for unique block numbers. block_id: IdGenerator, /// Set of expressions that have associated temporary variables. named_expressions: crate::NamedExpressions, /// Set of expressions that need to be baked to avoid unnecessary repetition in output need_bake_expressions: back::NeedBakeExpressions, /// How many views to render to, if doing multiview rendering. multiview: Option, } impl<'a, W: Write> Writer<'a, W> { /// Creates a new [`Writer`] instance. /// /// # Errors /// - If the version specified is invalid or supported. /// - If the entry point couldn't be found in the module. /// - If the version specified doesn't support some used features. pub fn new( out: W, module: &'a crate::Module, info: &'a valid::ModuleInfo, options: &'a Options, pipeline_options: &'a PipelineOptions, policies: proc::BoundsCheckPolicies, ) -> Result { // Check if the requested version is supported if !options.version.is_supported() { log::error!("Version {}", options.version); return Err(Error::VersionNotSupported); } // Try to find the entry point and corresponding index let ep_idx = module .entry_points .iter() .position(|ep| { pipeline_options.shader_stage == ep.stage && pipeline_options.entry_point == ep.name }) .ok_or(Error::EntryPointNotFound)?; // Generate a map with names required to write the module let mut names = crate::FastHashMap::default(); let mut namer = proc::Namer::default(); namer.reset(module, keywords::RESERVED_KEYWORDS, &["gl_"], &mut names); // Build the instance let mut this = Self { module, info, out, options, policies, namer, features: FeaturesManager::new(), names, reflection_names_globals: crate::FastHashMap::default(), entry_point: &module.entry_points[ep_idx], entry_point_idx: ep_idx as u16, multiview: pipeline_options.multiview, block_id: IdGenerator::default(), named_expressions: Default::default(), need_bake_expressions: Default::default(), }; // Find all features required to print this module this.collect_required_features()?; Ok(this) } /// Writes the [`Module`](crate::Module) as glsl to the output /// /// # Notes /// If an error occurs while writing, the output might have been written partially /// /// # Panics /// Might panic if the module is invalid pub fn write(&mut self) -> Result { // We use `writeln!(self.out)` throughout the write to add newlines // to make the output more readable let es = self.options.version.is_es(); // Write the version (It must be the first thing or it isn't a valid glsl output) writeln!(self.out, "#version {}", self.options.version)?; // Write all the needed extensions // // This used to be the last thing being written as it allowed to search for features while // writing the module saving some loops but some older versions (420 or less) required the // extensions to appear before being used, even though extensions are part of the // preprocessor not the processor ¯\_(ツ)_/¯ self.features.write(self.options.version, &mut self.out)?; // Write the additional extensions if self .options .writer_flags .contains(WriterFlags::TEXTURE_SHADOW_LOD) { // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_shadow_lod.txt writeln!(self.out, "#extension GL_EXT_texture_shadow_lod : require")?; } // glsl es requires a precision to be specified for floats and ints // TODO: Should this be user configurable? if es { writeln!(self.out)?; writeln!(self.out, "precision highp float;")?; writeln!(self.out, "precision highp int;")?; writeln!(self.out)?; } if self.entry_point.stage == ShaderStage::Compute { let workgroup_size = self.entry_point.workgroup_size; writeln!( self.out, "layout(local_size_x = {}, local_size_y = {}, local_size_z = {}) in;", workgroup_size[0], workgroup_size[1], workgroup_size[2] )?; writeln!(self.out)?; } // Enable early depth tests if needed if let Some(depth_test) = self.entry_point.early_depth_test { // If early depth test is supported for this version of GLSL if self.options.version.supports_early_depth_test() { writeln!(self.out, "layout(early_fragment_tests) in;")?; if let Some(conservative) = depth_test.conservative { use crate::ConservativeDepth as Cd; let depth = match conservative { Cd::GreaterEqual => "greater", Cd::LessEqual => "less", Cd::Unchanged => "unchanged", }; writeln!(self.out, "layout (depth_{}) out float gl_FragDepth;", depth)?; } writeln!(self.out)?; } else { log::warn!( "Early depth testing is not supported for this version of GLSL: {}", self.options.version ); } } if self.entry_point.stage == ShaderStage::Vertex && self.options.version.is_webgl() { if let Some(multiview) = self.multiview.as_ref() { writeln!(self.out, "layout(num_views = {}) in;", multiview)?; writeln!(self.out)?; } } let ep_info = self.info.get_entry_point(self.entry_point_idx as usize); // Write struct types. // // This are always ordered because the IR is structured in a way that // you can't make a struct without adding all of its members first. for (handle, ty) in self.module.types.iter() { if let TypeInner::Struct { ref members, .. } = ty.inner { // Structures ending with runtime-sized arrays can only be // rendered as shader storage blocks in GLSL, not stand-alone // struct types. if !self.module.types[members.last().unwrap().ty] .inner .is_dynamically_sized(&self.module.types) { let name = &self.names[&NameKey::Type(handle)]; write!(self.out, "struct {} ", name)?; self.write_struct_body(handle, members)?; writeln!(self.out, ";")?; } } } // Write the globals // // We filter all globals that aren't used by the selected entry point as they might be // interfere with each other (i.e. two globals with the same location but different with // different classes) for (handle, global) in self.module.global_variables.iter() { if ep_info[handle].is_empty() { continue; } match self.module.types[global.ty].inner { // We treat images separately because they might require // writing the storage format TypeInner::Image { mut dim, arrayed, class, } => { // Gather the storage format if needed let storage_format_access = match self.module.types[global.ty].inner { TypeInner::Image { class: crate::ImageClass::Storage { format, access }, .. } => Some((format, access)), _ => None, }; if dim == crate::ImageDimension::D1 && es { dim = crate::ImageDimension::D2 } // Gether the location if needed let layout_binding = if self.options.version.supports_explicit_locations() { let br = global.binding.as_ref().unwrap(); self.options.binding_map.get(br).cloned() } else { None }; // Write all the layout qualifiers if layout_binding.is_some() || storage_format_access.is_some() { write!(self.out, "layout(")?; if let Some(binding) = layout_binding { write!(self.out, "binding = {}", binding)?; } if let Some((format, _)) = storage_format_access { let format_str = glsl_storage_format(format); let separator = match layout_binding { Some(_) => ",", None => "", }; write!(self.out, "{}{}", separator, format_str)?; } write!(self.out, ") ")?; } if let Some((_, access)) = storage_format_access { self.write_storage_access(access)?; } // All images in glsl are `uniform` // The trailing space is important write!(self.out, "uniform ")?; // write the type // // This is way we need the leading space because `write_image_type` doesn't add // any spaces at the beginning or end self.write_image_type(dim, arrayed, class)?; // Finally write the name and end the global with a `;` // The leading space is important let global_name = self.get_global_name(handle, global); writeln!(self.out, " {};", global_name)?; writeln!(self.out)?; self.reflection_names_globals.insert(handle, global_name); } // glsl has no concept of samplers so we just ignore it TypeInner::Sampler { .. } => continue, // All other globals are written by `write_global` _ => { if !ep_info[handle].is_empty() { self.write_global(handle, global)?; // Add a newline (only for readability) writeln!(self.out)?; } } } } for arg in self.entry_point.function.arguments.iter() { self.write_varying(arg.binding.as_ref(), arg.ty, false)?; } if let Some(ref result) = self.entry_point.function.result { self.write_varying(result.binding.as_ref(), result.ty, true)?; } writeln!(self.out)?; // Write all regular functions for (handle, function) in self.module.functions.iter() { // Check that the function doesn't use globals that aren't supported // by the current entry point if !ep_info.dominates_global_use(&self.info[handle]) { continue; } let fun_info = &self.info[handle]; // Write the function self.write_function(back::FunctionType::Function(handle), function, fun_info)?; writeln!(self.out)?; } self.write_function( back::FunctionType::EntryPoint(self.entry_point_idx), &self.entry_point.function, ep_info, )?; // Add newline at the end of file writeln!(self.out)?; // Collect all reflection info and return it to the user self.collect_reflection_info() } fn write_array_size( &mut self, base: Handle, size: crate::ArraySize, ) -> BackendResult { write!(self.out, "[")?; // Write the array size // Writes nothing if `ArraySize::Dynamic` // Panics if `ArraySize::Constant` has a constant that isn't an sint or uint match size { crate::ArraySize::Constant(const_handle) => { match self.module.constants[const_handle].inner { crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Uint(size), } => write!(self.out, "{}", size)?, crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Sint(size), } => write!(self.out, "{}", size)?, _ => unreachable!(), } } crate::ArraySize::Dynamic => (), } write!(self.out, "]")?; if let TypeInner::Array { base: next_base, size: next_size, .. } = self.module.types[base].inner { self.write_array_size(next_base, next_size)?; } Ok(()) } /// Helper method used to write value types /// /// # Notes /// Adds no trailing or leading whitespace /// /// # Panics /// - If type is either a image, a sampler, a pointer, or a struct /// - If it's an Array with a [`ArraySize::Constant`](crate::ArraySize::Constant) with a /// constant that isn't a [`Scalar`](crate::ConstantInner::Scalar) or if the /// scalar value isn't an [`Sint`](crate::ScalarValue::Sint) or [`Uint`](crate::ScalarValue::Uint) fn write_value_type(&mut self, inner: &TypeInner) -> BackendResult { match *inner { // Scalars are simple we just get the full name from `glsl_scalar` TypeInner::Scalar { kind, width } | TypeInner::Atomic { kind, width } | TypeInner::ValuePointer { size: None, kind, width, space: _, } => write!(self.out, "{}", glsl_scalar(kind, width)?.full)?, // Vectors are just `gvecN` where `g` is the scalar prefix and `N` is the vector size TypeInner::Vector { size, kind, width } | TypeInner::ValuePointer { size: Some(size), kind, width, space: _, } => write!( self.out, "{}vec{}", glsl_scalar(kind, width)?.prefix, size as u8 )?, // Matrices are written with `gmatMxN` where `g` is the scalar prefix (only floats and // doubles are allowed), `M` is the columns count and `N` is the rows count // // glsl supports a matrix shorthand `gmatN` where `N` = `M` but it doesn't justify the // extra branch to write matrices this way TypeInner::Matrix { columns, rows, width, } => write!( self.out, "{}mat{}x{}", glsl_scalar(crate::ScalarKind::Float, width)?.prefix, columns as u8, rows as u8 )?, // GLSL arrays are written as `type name[size]` // Current code is written arrays only as `[size]` // Base `type` and `name` should be written outside TypeInner::Array { base, size, .. } => self.write_array_size(base, size)?, // Panic if either Image, Sampler, Pointer, or a Struct is being written // // Write all variants instead of `_` so that if new variants are added a // no exhaustiveness error is thrown TypeInner::Pointer { .. } | TypeInner::Struct { .. } | TypeInner::Image { .. } | TypeInner::Sampler { .. } | TypeInner::BindingArray { .. } => { return Err(Error::Custom(format!("Unable to write type {:?}", inner))) } } Ok(()) } /// Helper method used to write non image/sampler types /// /// # Notes /// Adds no trailing or leading whitespace /// /// # Panics /// - If type is either a image or sampler /// - If it's an Array with a [`ArraySize::Constant`](crate::ArraySize::Constant) with a /// constant that isn't a [`Scalar`](crate::ConstantInner::Scalar) or if the /// scalar value isn't an [`Sint`](crate::ScalarValue::Sint) or [`Uint`](crate::ScalarValue::Uint) fn write_type(&mut self, ty: Handle) -> BackendResult { match self.module.types[ty].inner { // glsl has no pointer types so just write types as normal and loads are skipped TypeInner::Pointer { base, .. } => self.write_type(base), // glsl structs are written as just the struct name TypeInner::Struct { .. } => { // Get the struct name let name = &self.names[&NameKey::Type(ty)]; write!(self.out, "{}", name)?; Ok(()) } // glsl array has the size separated from the base type TypeInner::Array { base, .. } => self.write_type(base), ref other => self.write_value_type(other), } } /// Helper method to write a image type /// /// # Notes /// Adds no leading or trailing whitespace fn write_image_type( &mut self, dim: crate::ImageDimension, arrayed: bool, class: crate::ImageClass, ) -> BackendResult { // glsl images consist of four parts the scalar prefix, the image "type", the dimensions // and modifiers // // There exists two image types // - sampler - for sampled images // - image - for storage images // // There are three possible modifiers that can be used together and must be written in // this order to be valid // - MS - used if it's a multisampled image // - Array - used if it's an image array // - Shadow - used if it's a depth image use crate::ImageClass as Ic; let (base, kind, ms, comparison) = match class { Ic::Sampled { kind, multi: true } => ("sampler", kind, "MS", ""), Ic::Sampled { kind, multi: false } => ("sampler", kind, "", ""), Ic::Depth { multi: true } => ("sampler", crate::ScalarKind::Float, "MS", ""), Ic::Depth { multi: false } => ("sampler", crate::ScalarKind::Float, "", "Shadow"), Ic::Storage { format, .. } => ("image", format.into(), "", ""), }; write!( self.out, "highp {}{}{}{}{}{}", glsl_scalar(kind, 4)?.prefix, base, glsl_dimension(dim), ms, if arrayed { "Array" } else { "" }, comparison )?; Ok(()) } /// Helper method used to write non images/sampler globals /// /// # Notes /// Adds a newline /// /// # Panics /// If the global has type sampler fn write_global( &mut self, handle: Handle, global: &crate::GlobalVariable, ) -> BackendResult { if self.options.version.supports_explicit_locations() { if let Some(ref br) = global.binding { match self.options.binding_map.get(br) { Some(binding) => { let layout = match global.space { crate::AddressSpace::Storage { .. } => { if self.options.version.supports_std430_layout() { "std430, " } else { "std140, " } } crate::AddressSpace::Uniform => "std140, ", _ => "", }; write!(self.out, "layout({}binding = {}) ", layout, binding)? } None => { log::debug!("unassigned binding for {:?}", global.name); if let crate::AddressSpace::Storage { .. } = global.space { if self.options.version.supports_std430_layout() { write!(self.out, "layout(std430) ")? } } } } } } if let crate::AddressSpace::Storage { access } = global.space { self.write_storage_access(access)?; } if let Some(storage_qualifier) = glsl_storage_qualifier(global.space) { write!(self.out, "{} ", storage_qualifier)?; } match global.space { crate::AddressSpace::Private => { self.write_simple_global(handle, global)?; } crate::AddressSpace::WorkGroup => { self.write_simple_global(handle, global)?; } crate::AddressSpace::PushConstant => { self.write_simple_global(handle, global)?; } crate::AddressSpace::Uniform => { self.write_interface_block(handle, global)?; } crate::AddressSpace::Storage { .. } => { self.write_interface_block(handle, global)?; } // A global variable in the `Function` address space is a // contradiction in terms. crate::AddressSpace::Function => unreachable!(), // Textures and samplers are handled directly in `Writer::write`. crate::AddressSpace::Handle => unreachable!(), } Ok(()) } fn write_simple_global( &mut self, handle: Handle, global: &crate::GlobalVariable, ) -> BackendResult { self.write_type(global.ty)?; write!(self.out, " ")?; self.write_global_name(handle, global)?; if let TypeInner::Array { base, size, .. } = self.module.types[global.ty].inner { self.write_array_size(base, size)?; } if global.space.initializable() && is_value_init_supported(self.module, global.ty) { write!(self.out, " = ")?; if let Some(init) = global.init { self.write_constant(init)?; } else { self.write_zero_init_value(global.ty)?; } } writeln!(self.out, ";")?; if let crate::AddressSpace::PushConstant = global.space { let global_name = self.get_global_name(handle, global); self.reflection_names_globals.insert(handle, global_name); } Ok(()) } /// Write an interface block for a single Naga global. /// /// Write `block_name { members }`. Since `block_name` must be unique /// between blocks and structs, we add `_block_ID` where `ID` is a /// `IdGenerator` generated number. Write `members` in the same way we write /// a struct's members. fn write_interface_block( &mut self, handle: Handle, global: &crate::GlobalVariable, ) -> BackendResult { // Write the block name, it's just the struct name appended with `_block_ID` let ty_name = &self.names[&NameKey::Type(global.ty)]; let block_name = format!( "{}_block_{}{:?}", ty_name, self.block_id.generate(), self.entry_point.stage, ); write!(self.out, "{} ", block_name)?; self.reflection_names_globals.insert(handle, block_name); match self.module.types[global.ty].inner { crate::TypeInner::Struct { ref members, .. } if self.module.types[members.last().unwrap().ty] .inner .is_dynamically_sized(&self.module.types) => { // Structs with dynamically sized arrays must have their // members lifted up as members of the interface block. GLSL // can't write such struct types anyway. self.write_struct_body(global.ty, members)?; write!(self.out, " ")?; self.write_global_name(handle, global)?; } _ => { // A global of any other type is written as the sole member // of the interface block. Since the interface block is // anonymous, this becomes visible in the global scope. write!(self.out, "{{ ")?; self.write_type(global.ty)?; write!(self.out, " ")?; self.write_global_name(handle, global)?; if let TypeInner::Array { base, size, .. } = self.module.types[global.ty].inner { self.write_array_size(base, size)?; } write!(self.out, "; }}")?; } } writeln!(self.out, ";")?; Ok(()) } /// Helper method used to find which expressions of a given function require baking /// /// # Notes /// Clears `need_bake_expressions` set before adding to it fn update_expressions_to_bake(&mut self, func: &crate::Function, info: &valid::FunctionInfo) { use crate::Expression; self.need_bake_expressions.clear(); for expr in func.expressions.iter() { let expr_info = &info[expr.0]; let min_ref_count = func.expressions[expr.0].bake_ref_count(); if min_ref_count <= expr_info.ref_count { self.need_bake_expressions.insert(expr.0); } // if the expression is a Dot product with integer arguments, // then the args needs baking as well if let ( fun_handle, &Expression::Math { fun: crate::MathFunction::Dot, arg, arg1, .. }, ) = expr { let inner = info[fun_handle].ty.inner_with(&self.module.types); if let TypeInner::Scalar { kind, .. } = *inner { match kind { crate::ScalarKind::Sint | crate::ScalarKind::Uint => { self.need_bake_expressions.insert(arg); self.need_bake_expressions.insert(arg1.unwrap()); } _ => {} } } } } } /// Helper method used to get a name for a global /// /// Globals have different naming schemes depending on their binding: /// - Globals without bindings use the name from the [`Namer`](crate::proc::Namer) /// - Globals with resource binding are named `_group_X_binding_Y` where `X` /// is the group and `Y` is the binding fn get_global_name( &self, handle: Handle, global: &crate::GlobalVariable, ) -> String { match global.binding { Some(ref br) => { format!( "_group_{}_binding_{}_{}", br.group, br.binding, self.entry_point.stage.to_str() ) } None => self.names[&NameKey::GlobalVariable(handle)].clone(), } } /// Helper method used to write a name for a global without additional heap allocation fn write_global_name( &mut self, handle: Handle, global: &crate::GlobalVariable, ) -> BackendResult { match global.binding { Some(ref br) => write!( self.out, "_group_{}_binding_{}_{}", br.group, br.binding, self.entry_point.stage.to_str() )?, None => write!( self.out, "{}", &self.names[&NameKey::GlobalVariable(handle)] )?, } Ok(()) } /// Write a GLSL global that will carry a Naga entry point's argument or return value. /// /// A Naga entry point's arguments and return value are rendered in GLSL as /// variables at global scope with the `in` and `out` storage qualifiers. /// The code we generate for `main` loads from all the `in` globals into /// appropriately named locals. Before it returns, `main` assigns the /// components of its return value into all the `out` globals. /// /// This function writes a declaration for one such GLSL global, /// representing a value passed into or returned from [`self.entry_point`] /// that has a [`Location`] binding. The global's name is generated based on /// the location index and the shader stages being connected; see /// [`VaryingName`]. This means we don't need to know the names of /// arguments, just their types and bindings. /// /// Emit nothing for entry point arguments or return values with [`BuiltIn`] /// bindings; `main` will read from or assign to the appropriate GLSL /// special variable; these are pre-declared. As an exception, we do declare /// `gl_Position` or `gl_FragCoord` with the `invariant` qualifier if /// needed. /// /// Use `output` together with [`self.entry_point.stage`] to determine which /// shader stages are being connected, and choose the `in` or `out` storage /// qualifier. /// /// [`self.entry_point`]: Writer::entry_point /// [`self.entry_point.stage`]: crate::EntryPoint::stage /// [`Location`]: crate::Binding::Location /// [`BuiltIn`]: crate::Binding::BuiltIn fn write_varying( &mut self, binding: Option<&crate::Binding>, ty: Handle, output: bool, ) -> Result<(), Error> { // For a struct, emit a separate global for each member with a binding. if let crate::TypeInner::Struct { ref members, .. } = self.module.types[ty].inner { for member in members { self.write_varying(member.binding.as_ref(), member.ty, output)?; } return Ok(()); } let binding = match binding { None => return Ok(()), Some(binding) => binding, }; let (location, interpolation, sampling) = match *binding { crate::Binding::Location { location, interpolation, sampling, } => (location, interpolation, sampling), crate::Binding::BuiltIn(built_in) => { if let crate::BuiltIn::Position { invariant: true } = built_in { writeln!( self.out, "invariant {};", glsl_built_in(built_in, output, self.options.version.is_webgl()) )?; } return Ok(()); } }; // Write the interpolation modifier if needed // // We ignore all interpolation and auxiliary modifiers that aren't used in fragment // shaders' input globals or vertex shaders' output globals. let emit_interpolation_and_auxiliary = match self.entry_point.stage { ShaderStage::Vertex => output, ShaderStage::Fragment => !output, _ => false, }; // Write the I/O locations, if allowed if self.options.version.supports_explicit_locations() || !emit_interpolation_and_auxiliary { write!(self.out, "layout(location = {}) ", location)?; } // Write the interpolation qualifier. if let Some(interp) = interpolation { if emit_interpolation_and_auxiliary { write!(self.out, "{} ", glsl_interpolation(interp))?; } } // Write the sampling auxiliary qualifier. // // Before GLSL 4.2, the `centroid` and `sample` qualifiers were required to appear // immediately before the `in` / `out` qualifier, so we'll just follow that rule // here, regardless of the version. if let Some(sampling) = sampling { if emit_interpolation_and_auxiliary { if let Some(qualifier) = glsl_sampling(sampling) { write!(self.out, "{} ", qualifier)?; } } } // Write the input/output qualifier. write!(self.out, "{} ", if output { "out" } else { "in" })?; // Write the type // `write_type` adds no leading or trailing spaces self.write_type(ty)?; // Finally write the global name and end the global with a `;` and a newline // Leading space is important let vname = VaryingName { binding: &crate::Binding::Location { location, interpolation: None, sampling: None, }, stage: self.entry_point.stage, output, targetting_webgl: self.options.version.is_webgl(), }; writeln!(self.out, " {};", vname)?; Ok(()) } /// Helper method used to write functions (both entry points and regular functions) /// /// # Notes /// Adds a newline fn write_function( &mut self, ty: back::FunctionType, func: &crate::Function, info: &valid::FunctionInfo, ) -> BackendResult { // Create a function context for the function being written let ctx = back::FunctionCtx { ty, info, expressions: &func.expressions, named_expressions: &func.named_expressions, }; self.named_expressions.clear(); self.update_expressions_to_bake(func, info); // Write the function header // // glsl headers are the same as in c: // `ret_type name(args)` // `ret_type` is the return type // `name` is the function name // `args` is a comma separated list of `type name` // | - `type` is the argument type // | - `name` is the argument name // Start by writing the return type if any otherwise write void // This is the only place where `void` is a valid type // (though it's more a keyword than a type) if let back::FunctionType::EntryPoint(_) = ctx.ty { write!(self.out, "void")?; } else if let Some(ref result) = func.result { self.write_type(result.ty)?; } else { write!(self.out, "void")?; } // Write the function name and open parentheses for the argument list let function_name = match ctx.ty { back::FunctionType::Function(handle) => &self.names[&NameKey::Function(handle)], back::FunctionType::EntryPoint(_) => "main", }; write!(self.out, " {}(", function_name)?; // Write the comma separated argument list // // We need access to `Self` here so we use the reference passed to the closure as an // argument instead of capturing as that would cause a borrow checker error let arguments = match ctx.ty { back::FunctionType::EntryPoint(_) => &[][..], back::FunctionType::Function(_) => &func.arguments, }; let arguments: Vec<_> = arguments .iter() .enumerate() .filter(|&(_, arg)| match self.module.types[arg.ty].inner { TypeInner::Sampler { .. } => false, _ => true, }) .collect(); self.write_slice(&arguments, |this, _, &(i, arg)| { // Write the argument type match this.module.types[arg.ty].inner { // We treat images separately because they might require // writing the storage format TypeInner::Image { dim, arrayed, class, } => { // Write the storage format if needed if let TypeInner::Image { class: crate::ImageClass::Storage { format, .. }, .. } = this.module.types[arg.ty].inner { write!(this.out, "layout({}) ", glsl_storage_format(format))?; } // write the type // // This is way we need the leading space because `write_image_type` doesn't add // any spaces at the beginning or end this.write_image_type(dim, arrayed, class)?; } TypeInner::Pointer { base, .. } => { // write parameter qualifiers write!(this.out, "inout ")?; this.write_type(base)?; } // All other types are written by `write_type` _ => { this.write_type(arg.ty)?; } } // Write the argument name // The leading space is important write!(this.out, " {}", &this.names[&ctx.argument_key(i as u32)])?; // Write array size if let TypeInner::Array { base, size, .. } = this.module.types[arg.ty].inner { this.write_array_size(base, size)?; } Ok(()) })?; // Close the parentheses and open braces to start the function body writeln!(self.out, ") {{")?; // Compose the function arguments from globals, in case of an entry point. if let back::FunctionType::EntryPoint(ep_index) = ctx.ty { let stage = self.module.entry_points[ep_index as usize].stage; for (index, arg) in func.arguments.iter().enumerate() { write!(self.out, "{}", back::INDENT)?; self.write_type(arg.ty)?; let name = &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)]; write!(self.out, " {}", name)?; write!(self.out, " = ")?; match self.module.types[arg.ty].inner { crate::TypeInner::Struct { ref members, .. } => { self.write_type(arg.ty)?; write!(self.out, "(")?; for (index, member) in members.iter().enumerate() { let varying_name = VaryingName { binding: member.binding.as_ref().unwrap(), stage, output: false, targetting_webgl: self.options.version.is_webgl(), }; if index != 0 { write!(self.out, ", ")?; } write!(self.out, "{}", varying_name)?; } writeln!(self.out, ");")?; } _ => { let varying_name = VaryingName { binding: arg.binding.as_ref().unwrap(), stage, output: false, targetting_webgl: self.options.version.is_webgl(), }; writeln!(self.out, "{};", varying_name)?; } } } } // Write all function locals // Locals are `type name (= init)?;` where the init part (including the =) are optional // // Always adds a newline for (handle, local) in func.local_variables.iter() { // Write indentation (only for readability) and the type // `write_type` adds no trailing space write!(self.out, "{}", back::INDENT)?; self.write_type(local.ty)?; // Write the local name // The leading space is important write!(self.out, " {}", self.names[&ctx.name_key(handle)])?; // Write size for array type if let TypeInner::Array { base, size, .. } = self.module.types[local.ty].inner { self.write_array_size(base, size)?; } // Write the local initializer if needed if let Some(init) = local.init { // Put the equal signal only if there's a initializer // The leading and trailing spaces aren't needed but help with readability write!(self.out, " = ")?; // Write the constant // `write_constant` adds no trailing or leading space/newline self.write_constant(init)?; } else if is_value_init_supported(self.module, local.ty) { write!(self.out, " = ")?; self.write_zero_init_value(local.ty)?; } // Finish the local with `;` and add a newline (only for readability) writeln!(self.out, ";")? } // Write the function body (statement list) for sta in func.body.iter() { // Write a statement, the indentation should always be 1 when writing the function body // `write_stmt` adds a newline self.write_stmt(sta, &ctx, back::Level(1))?; } // Close braces and add a newline writeln!(self.out, "}}")?; Ok(()) } /// Helper method that writes a list of comma separated `T` with a writer function `F` /// /// The writer function `F` receives a mutable reference to `self` that if needed won't cause /// borrow checker issues (using for example a closure with `self` will cause issues), the /// second argument is the 0 based index of the element on the list, and the last element is /// a reference to the element `T` being written /// /// # Notes /// - Adds no newlines or leading/trailing whitespace /// - The last element won't have a trailing `,` fn write_slice BackendResult>( &mut self, data: &[T], mut f: F, ) -> BackendResult { // Loop trough `data` invoking `f` for each element for (i, item) in data.iter().enumerate() { f(self, i as u32, item)?; // Only write a comma if isn't the last element if i != data.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } Ok(()) } /// Helper method used to write constants /// /// # Notes /// Adds no newlines or leading/trailing whitespace fn write_constant(&mut self, handle: Handle) -> BackendResult { use crate::ScalarValue as Sv; match self.module.constants[handle].inner { crate::ConstantInner::Scalar { width: _, ref value, } => match *value { // Signed integers don't need anything special Sv::Sint(int) => write!(self.out, "{}", int)?, // Unsigned integers need a `u` at the end // // While `core` doesn't necessarily need it, it's allowed and since `es` needs it we // always write it as the extra branch wouldn't have any benefit in readability Sv::Uint(int) => write!(self.out, "{}u", int)?, // Floats are written using `Debug` instead of `Display` because it always appends the // decimal part even it's zero which is needed for a valid glsl float constant Sv::Float(float) => write!(self.out, "{:?}", float)?, // Booleans are either `true` or `false` so nothing special needs to be done Sv::Bool(boolean) => write!(self.out, "{}", boolean)?, }, // Composite constant are created using the same syntax as compose // `type(components)` where `components` is a comma separated list of constants crate::ConstantInner::Composite { ty, ref components } => { self.write_type(ty)?; if let TypeInner::Array { base, size, .. } = self.module.types[ty].inner { self.write_array_size(base, size)?; } write!(self.out, "(")?; // Write the comma separated constants self.write_slice(components, |this, _, arg| this.write_constant(*arg))?; write!(self.out, ")")? } } Ok(()) } /// Helper method used to output a dot product as an arithmetic expression /// fn write_dot_product( &mut self, arg: Handle, arg1: Handle, size: usize, ctx: &back::FunctionCtx<'_>, ) -> BackendResult { // Write parantheses around the dot product expression to prevent operators // with different precedences from applying earlier. write!(self.out, "(")?; // Cycle trough all the components of the vector for index in 0..size { let component = back::COMPONENTS[index]; // Write the addition to the previous product // This will print an extra '+' at the beginning but that is fine in glsl write!(self.out, " + ")?; // Write the first vector expression, this expression is marked to be // cached so unless it can't be cached (for example, it's a Constant) // it shouldn't produce large expressions. self.write_expr(arg, ctx)?; // Access the current component on the first vector write!(self.out, ".{} * ", component)?; // Write the second vector expression, this expression is marked to be // cached so unless it can't be cached (for example, it's a Constant) // it shouldn't produce large expressions. self.write_expr(arg1, ctx)?; // Access the current component on the second vector write!(self.out, ".{}", component)?; } write!(self.out, ")")?; Ok(()) } /// Helper method used to write structs /// /// # Notes /// Ends in a newline fn write_struct_body( &mut self, handle: Handle, members: &[crate::StructMember], ) -> BackendResult { // glsl structs are written as in C // `struct name() { members };` // | `struct` is a keyword // | `name` is the struct name // | `members` is a semicolon separated list of `type name` // | `type` is the member type // | `name` is the member name writeln!(self.out, "{{")?; for (idx, member) in members.iter().enumerate() { // The indentation is only for readability write!(self.out, "{}", back::INDENT)?; match self.module.types[member.ty].inner { TypeInner::Array { base, size, stride: _, } => { self.write_type(base)?; write!( self.out, " {}", &self.names[&NameKey::StructMember(handle, idx as u32)] )?; // Write [size] self.write_array_size(base, size)?; // Newline is important writeln!(self.out, ";")?; } _ => { // Write the member type // Adds no trailing space self.write_type(member.ty)?; // Write the member name and put a semicolon // The leading space is important // All members must have a semicolon even the last one writeln!( self.out, " {};", &self.names[&NameKey::StructMember(handle, idx as u32)] )?; } } } write!(self.out, "}}")?; Ok(()) } /// Helper method used to write statements /// /// # Notes /// Always adds a newline fn write_stmt( &mut self, sta: &crate::Statement, ctx: &back::FunctionCtx, level: back::Level, ) -> BackendResult { use crate::Statement; match *sta { // This is where we can generate intermediate constants for some expression types. Statement::Emit(ref range) => { for handle in range.clone() { let info = &ctx.info[handle]; let ptr_class = info.ty.inner_with(&self.module.types).pointer_space(); let expr_name = if ptr_class.is_some() { // GLSL can't save a pointer-valued expression in a variable, // but we shouldn't ever need to: they should never be named expressions, // and none of the expression types flagged by bake_ref_count can be pointer-valued. None } else if let Some(name) = ctx.named_expressions.get(&handle) { // Front end provides names for all variables at the start of writing. // But we write them to step by step. We need to recache them // Otherwise, we could accidentally write variable name instead of full expression. // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords. Some(self.namer.call(name)) } else if self.need_bake_expressions.contains(&handle) { Some(format!("{}{}", back::BAKE_PREFIX, handle.index())) } else if info.ref_count == 0 { Some(self.namer.call("")) } else { None }; // If we are going to write an `ImageLoad` next and the target image // is sampled and we are using the `Restrict` policy for bounds // checking images we need to write a local holding the clamped lod. if let crate::Expression::ImageLoad { image, level: Some(level_expr), .. } = ctx.expressions[handle] { if let TypeInner::Image { class: crate::ImageClass::Sampled { .. }, .. } = *ctx.info[image].ty.inner_with(&self.module.types) { if let proc::BoundsCheckPolicy::Restrict = self.policies.image { write!(self.out, "{}", level)?; self.write_clamped_lod(ctx, handle, image, level_expr)? } } } if let Some(name) = expr_name { write!(self.out, "{}", level)?; self.write_named_expr(handle, name, ctx)?; } } } // Blocks are simple we just need to write the block statements between braces // We could also just print the statements but this is more readable and maps more // closely to the IR Statement::Block(ref block) => { write!(self.out, "{}", level)?; writeln!(self.out, "{{")?; for sta in block.iter() { // Increase the indentation to help with readability self.write_stmt(sta, ctx, level.next())? } writeln!(self.out, "{}}}", level)? } // Ifs are written as in C: // ``` // if(condition) { // accept // } else { // reject // } // ``` Statement::If { condition, ref accept, ref reject, } => { write!(self.out, "{}", level)?; write!(self.out, "if (")?; self.write_expr(condition, ctx)?; writeln!(self.out, ") {{")?; for sta in accept { // Increase indentation to help with readability self.write_stmt(sta, ctx, level.next())?; } // If there are no statements in the reject block we skip writing it // This is only for readability if !reject.is_empty() { writeln!(self.out, "{}}} else {{", level)?; for sta in reject { // Increase indentation to help with readability self.write_stmt(sta, ctx, level.next())?; } } writeln!(self.out, "{}}}", level)? } // Switch are written as in C: // ``` // switch (selector) { // // Fallthrough // case label: // block // // Non fallthrough // case label: // block // break; // default: // block // } // ``` // Where the `default` case happens isn't important but we put it last // so that we don't need to print a `break` for it Statement::Switch { selector, ref cases, } => { // Start the switch write!(self.out, "{}", level)?; write!(self.out, "switch(")?; self.write_expr(selector, ctx)?; writeln!(self.out, ") {{")?; let type_postfix = match *ctx.info[selector].ty.inner_with(&self.module.types) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, .. } => "u", _ => "", }; // Write all cases let l2 = level.next(); for case in cases { match case.value { crate::SwitchValue::Integer(value) => { writeln!(self.out, "{}case {}{}:", l2, value, type_postfix)? } crate::SwitchValue::Default => writeln!(self.out, "{}default:", l2)?, } for sta in case.body.iter() { self.write_stmt(sta, ctx, l2.next())?; } // Write fallthrough comment if the case is fallthrough, // otherwise write a break, if the case is not already // broken out of at the end of its body. if case.fall_through { writeln!(self.out, "{}/* fallthrough */", l2.next())?; } else if case.body.last().map_or(true, |s| !s.is_terminator()) { writeln!(self.out, "{}break;", l2.next())?; } } writeln!(self.out, "{}}}", level)? } // Loops in naga IR are based on wgsl loops, glsl can emulate the behaviour by using a // while true loop and appending the continuing block to the body resulting on: // ``` // bool loop_init = true; // while(true) { // if (!loop_init) { } // loop_init = false; // // } // ``` Statement::Loop { ref body, ref continuing, break_if, } => { if !continuing.is_empty() || break_if.is_some() { let gate_name = self.namer.call("loop_init"); writeln!(self.out, "{}bool {} = true;", level, gate_name)?; writeln!(self.out, "{}while(true) {{", level)?; let l2 = level.next(); let l3 = l2.next(); writeln!(self.out, "{}if (!{}) {{", l2, gate_name)?; for sta in continuing { self.write_stmt(sta, ctx, l3)?; } if let Some(condition) = break_if { write!(self.out, "{}if (", l3)?; self.write_expr(condition, ctx)?; writeln!(self.out, ") {{")?; writeln!(self.out, "{}break;", l3.next())?; writeln!(self.out, "{}}}", l3)?; } writeln!(self.out, "{}}}", l2)?; writeln!(self.out, "{}{} = false;", level.next(), gate_name)?; } else { writeln!(self.out, "{}while(true) {{", level)?; } for sta in body { self.write_stmt(sta, ctx, level.next())?; } writeln!(self.out, "{}}}", level)? } // Break, continue and return as written as in C // `break;` Statement::Break => { write!(self.out, "{}", level)?; writeln!(self.out, "break;")? } // `continue;` Statement::Continue => { write!(self.out, "{}", level)?; writeln!(self.out, "continue;")? } // `return expr;`, `expr` is optional Statement::Return { value } => { write!(self.out, "{}", level)?; match ctx.ty { back::FunctionType::Function(_) => { write!(self.out, "return")?; // Write the expression to be returned if needed if let Some(expr) = value { write!(self.out, " ")?; self.write_expr(expr, ctx)?; } writeln!(self.out, ";")?; } back::FunctionType::EntryPoint(ep_index) => { let ep = &self.module.entry_points[ep_index as usize]; if let Some(ref result) = ep.function.result { let value = value.unwrap(); match self.module.types[result.ty].inner { crate::TypeInner::Struct { ref members, .. } => { let temp_struct_name = match ctx.expressions[value] { crate::Expression::Compose { .. } => { let return_struct = "_tmp_return"; write!( self.out, "{} {} = ", &self.names[&NameKey::Type(result.ty)], return_struct )?; self.write_expr(value, ctx)?; writeln!(self.out, ";")?; write!(self.out, "{}", level)?; Some(return_struct) } _ => None, }; for (index, member) in members.iter().enumerate() { // TODO: handle builtin in better way if let Some(crate::Binding::BuiltIn(builtin)) = member.binding { match builtin { crate::BuiltIn::ClipDistance | crate::BuiltIn::CullDistance | crate::BuiltIn::PointSize => { if self.options.version.is_es() { continue; } } _ => {} } } let varying_name = VaryingName { binding: member.binding.as_ref().unwrap(), stage: ep.stage, output: true, targetting_webgl: self.options.version.is_webgl(), }; write!(self.out, "{} = ", varying_name)?; if let Some(struct_name) = temp_struct_name { write!(self.out, "{}", struct_name)?; } else { self.write_expr(value, ctx)?; } // Write field name writeln!( self.out, ".{};", &self.names [&NameKey::StructMember(result.ty, index as u32)] )?; write!(self.out, "{}", level)?; } } _ => { let name = VaryingName { binding: result.binding.as_ref().unwrap(), stage: ep.stage, output: true, targetting_webgl: self.options.version.is_webgl(), }; write!(self.out, "{} = ", name)?; self.write_expr(value, ctx)?; writeln!(self.out, ";")?; write!(self.out, "{}", level)?; } } } if let back::FunctionType::EntryPoint(ep_index) = ctx.ty { if self.module.entry_points[ep_index as usize].stage == crate::ShaderStage::Vertex && self .options .writer_flags .contains(WriterFlags::ADJUST_COORDINATE_SPACE) { writeln!( self.out, "gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w);", )?; write!(self.out, "{}", level)?; } } writeln!(self.out, "return;")?; } } } // This is one of the places were glsl adds to the syntax of C in this case the discard // keyword which ceases all further processing in a fragment shader, it's called OpKill // in spir-v that's why it's called `Statement::Kill` Statement::Kill => writeln!(self.out, "{}discard;", level)?, // Issue a memory barrier. Please note that to ensure visibility, // OpenGL always requires a call to the `barrier()` function after a `memoryBarrier*()` Statement::Barrier(flags) => { if flags.contains(crate::Barrier::STORAGE) { writeln!(self.out, "{}memoryBarrierBuffer();", level)?; } if flags.contains(crate::Barrier::WORK_GROUP) { writeln!(self.out, "{}memoryBarrierShared();", level)?; } writeln!(self.out, "{}barrier();", level)?; } // Stores in glsl are just variable assignments written as `pointer = value;` Statement::Store { pointer, value } => { write!(self.out, "{}", level)?; self.write_expr(pointer, ctx)?; write!(self.out, " = ")?; self.write_expr(value, ctx)?; writeln!(self.out, ";")? } // Stores a value into an image. Statement::ImageStore { image, coordinate, array_index, value, } => { write!(self.out, "{}", level)?; self.write_image_store(ctx, image, coordinate, array_index, value)? } // A `Call` is written `name(arguments)` where `arguments` is a comma separated expressions list Statement::Call { function, ref arguments, result, } => { write!(self.out, "{}", level)?; if let Some(expr) = result { let name = format!("{}{}", back::BAKE_PREFIX, expr.index()); let result = self.module.functions[function].result.as_ref().unwrap(); self.write_type(result.ty)?; write!(self.out, " {} = ", name)?; self.named_expressions.insert(expr, name); } write!(self.out, "{}(", &self.names[&NameKey::Function(function)])?; let arguments: Vec<_> = arguments .iter() .enumerate() .filter_map(|(i, arg)| { let arg_ty = self.module.functions[function].arguments[i].ty; match self.module.types[arg_ty].inner { TypeInner::Sampler { .. } => None, _ => Some(*arg), } }) .collect(); self.write_slice(&arguments, |this, _, arg| this.write_expr(*arg, ctx))?; writeln!(self.out, ");")? } Statement::Atomic { pointer, ref fun, value, result, } => { write!(self.out, "{}", level)?; let res_name = format!("{}{}", back::BAKE_PREFIX, result.index()); let res_ty = ctx.info[result].ty.inner_with(&self.module.types); self.write_value_type(res_ty)?; write!(self.out, " {} = ", res_name)?; self.named_expressions.insert(result, res_name); let fun_str = fun.to_glsl(); write!(self.out, "atomic{}(", fun_str)?; self.write_expr(pointer, ctx)?; write!(self.out, ", ")?; // handle the special cases match *fun { crate::AtomicFunction::Subtract => { // we just wrote `InterlockedAdd`, so negate the argument write!(self.out, "-")?; } crate::AtomicFunction::Exchange { compare: Some(_) } => { return Err(Error::Custom( "atomic CompareExchange is not implemented".to_string(), )); } _ => {} } self.write_expr(value, ctx)?; writeln!(self.out, ");")?; } } Ok(()) } /// Helper method to write expressions /// /// # Notes /// Doesn't add any newlines or leading/trailing spaces fn write_expr( &mut self, expr: Handle, ctx: &back::FunctionCtx<'_>, ) -> BackendResult { use crate::Expression; if let Some(name) = self.named_expressions.get(&expr) { write!(self.out, "{}", name)?; return Ok(()); } match ctx.expressions[expr] { // `Access` is applied to arrays, vectors and matrices and is written as indexing Expression::Access { base, index } => { self.write_expr(base, ctx)?; write!(self.out, "[")?; self.write_expr(index, ctx)?; write!(self.out, "]")? } // `AccessIndex` is the same as `Access` except that the index is a constant and it can // be applied to structs, in this case we need to find the name of the field at that // index and write `base.field_name` Expression::AccessIndex { base, index } => { self.write_expr(base, ctx)?; let base_ty_res = &ctx.info[base].ty; let mut resolved = base_ty_res.inner_with(&self.module.types); let base_ty_handle = match *resolved { TypeInner::Pointer { base, space: _ } => { resolved = &self.module.types[base].inner; Some(base) } _ => base_ty_res.handle(), }; match *resolved { TypeInner::Vector { .. } => { // Write vector access as a swizzle write!(self.out, ".{}", back::COMPONENTS[index as usize])? } TypeInner::Matrix { .. } | TypeInner::Array { .. } | TypeInner::ValuePointer { .. } => write!(self.out, "[{}]", index)?, TypeInner::Struct { .. } => { // This will never panic in case the type is a `Struct`, this is not true // for other types so we can only check while inside this match arm let ty = base_ty_handle.unwrap(); write!( self.out, ".{}", &self.names[&NameKey::StructMember(ty, index)] )? } ref other => return Err(Error::Custom(format!("Cannot index {:?}", other))), } } // Constants are delegated to `write_constant` Expression::Constant(constant) => self.write_constant(constant)?, // `Splat` needs to actually write down a vector, it's not always inferred in GLSL. Expression::Splat { size: _, value } => { let resolved = ctx.info[expr].ty.inner_with(&self.module.types); self.write_value_type(resolved)?; write!(self.out, "(")?; self.write_expr(value, ctx)?; write!(self.out, ")")? } // `Swizzle` adds a few letters behind the dot. Expression::Swizzle { size, vector, pattern, } => { self.write_expr(vector, ctx)?; write!(self.out, ".")?; for &sc in pattern[..size as usize].iter() { self.out.write_char(back::COMPONENTS[sc as usize])?; } } // `Compose` is pretty simple we just write `type(components)` where `components` is a // comma separated list of expressions Expression::Compose { ty, ref components } => { self.write_type(ty)?; let resolved = ctx.info[expr].ty.inner_with(&self.module.types); if let TypeInner::Array { base, size, .. } = *resolved { self.write_array_size(base, size)?; } write!(self.out, "(")?; self.write_slice(components, |this, _, arg| this.write_expr(*arg, ctx))?; write!(self.out, ")")? } // Function arguments are written as the argument name Expression::FunctionArgument(pos) => { write!(self.out, "{}", &self.names[&ctx.argument_key(pos)])? } // Global variables need some special work for their name but // `get_global_name` does the work for us Expression::GlobalVariable(handle) => { let global = &self.module.global_variables[handle]; self.write_global_name(handle, global)? } // A local is written as it's name Expression::LocalVariable(handle) => { write!(self.out, "{}", self.names[&ctx.name_key(handle)])? } // glsl has no pointers so there's no load operation, just write the pointer expression Expression::Load { pointer } => self.write_expr(pointer, ctx)?, // `ImageSample` is a bit complicated compared to the rest of the IR. // // First there are three variations depending whether the sample level is explicitly set, // if it's automatic or it it's bias: // `texture(image, coordinate)` - Automatic sample level // `texture(image, coordinate, bias)` - Bias sample level // `textureLod(image, coordinate, level)` - Zero or Exact sample level // // Furthermore if `depth_ref` is some we need to append it to the coordinate vector Expression::ImageSample { image, sampler: _, //TODO? gather, coordinate, array_index, offset, level, depth_ref, } => { let dim = match *ctx.info[image].ty.inner_with(&self.module.types) { TypeInner::Image { dim, .. } => dim, _ => unreachable!(), }; if dim == crate::ImageDimension::Cube && array_index.is_some() && depth_ref.is_some() { match level { crate::SampleLevel::Zero | crate::SampleLevel::Exact(_) | crate::SampleLevel::Gradient { .. } | crate::SampleLevel::Bias(_) => { return Err(Error::Custom(String::from( "gsamplerCubeArrayShadow isn't supported in textureGrad, \ textureLod or texture with bias", ))) } crate::SampleLevel::Auto => {} } } // textureLod on sampler2DArrayShadow and samplerCubeShadow does not exist in GLSL. // To emulate this, we will have to use textureGrad with a constant gradient of 0. let workaround_lod_array_shadow_as_grad = (array_index.is_some() || dim == crate::ImageDimension::Cube) && depth_ref.is_some() && gather.is_none() && !self .options .writer_flags .contains(WriterFlags::TEXTURE_SHADOW_LOD); //Write the function to be used depending on the sample level let fun_name = match level { crate::SampleLevel::Zero if gather.is_some() => "textureGather", crate::SampleLevel::Auto | crate::SampleLevel::Bias(_) => "texture", crate::SampleLevel::Zero | crate::SampleLevel::Exact(_) => { if workaround_lod_array_shadow_as_grad { "textureGrad" } else { "textureLod" } } crate::SampleLevel::Gradient { .. } => "textureGrad", }; let offset_name = match offset { Some(_) => "Offset", None => "", }; write!(self.out, "{}{}(", fun_name, offset_name)?; // Write the image that will be used self.write_expr(image, ctx)?; // The space here isn't required but it helps with readability write!(self.out, ", ")?; // We need to get the coordinates vector size to later build a vector that's `size + 1` // if `depth_ref` is some, if it isn't a vector we panic as that's not a valid expression let mut coord_dim = match *ctx.info[coordinate].ty.inner_with(&self.module.types) { TypeInner::Vector { size, .. } => size as u8, TypeInner::Scalar { .. } => 1, _ => unreachable!(), }; if array_index.is_some() { coord_dim += 1; } let merge_depth_ref = depth_ref.is_some() && gather.is_none() && coord_dim < 4; if merge_depth_ref { coord_dim += 1; } let tex_1d_hack = dim == crate::ImageDimension::D1 && self.options.version.is_es(); let is_vec = tex_1d_hack || coord_dim != 1; // Compose a new texture coordinates vector if is_vec { write!(self.out, "vec{}(", coord_dim + tex_1d_hack as u8)?; } self.write_expr(coordinate, ctx)?; if tex_1d_hack { write!(self.out, ", 0.0")?; } if let Some(expr) = array_index { write!(self.out, ", ")?; self.write_expr(expr, ctx)?; } if merge_depth_ref { write!(self.out, ", ")?; self.write_expr(depth_ref.unwrap(), ctx)?; } if is_vec { write!(self.out, ")")?; } if let (Some(expr), false) = (depth_ref, merge_depth_ref) { write!(self.out, ", ")?; self.write_expr(expr, ctx)?; } match level { // Auto needs no more arguments crate::SampleLevel::Auto => (), // Zero needs level set to 0 crate::SampleLevel::Zero => { if workaround_lod_array_shadow_as_grad { let vec_dim = match dim { crate::ImageDimension::Cube => 3, _ => 2, }; write!(self.out, ", vec{}(0.0), vec{}(0.0)", vec_dim, vec_dim)?; } else if gather.is_none() { write!(self.out, ", 0.0")?; } } // Exact and bias require another argument crate::SampleLevel::Exact(expr) => { if workaround_lod_array_shadow_as_grad { log::warn!("Unable to `textureLod` a shadow array, ignoring the LOD"); write!(self.out, ", vec2(0,0), vec2(0,0)")?; } else { write!(self.out, ", ")?; self.write_expr(expr, ctx)?; } } crate::SampleLevel::Bias(_) => { // This needs to be done after the offset writing } crate::SampleLevel::Gradient { x, y } => { // If we are using sampler2D to replace sampler1D, we also // need to make sure to use vec2 gradients if tex_1d_hack { write!(self.out, ", vec2(")?; self.write_expr(x, ctx)?; write!(self.out, ", 0.0)")?; write!(self.out, ", vec2(")?; self.write_expr(y, ctx)?; write!(self.out, ", 0.0)")?; } else { write!(self.out, ", ")?; self.write_expr(x, ctx)?; write!(self.out, ", ")?; self.write_expr(y, ctx)?; } } } if let Some(constant) = offset { write!(self.out, ", ")?; if tex_1d_hack { write!(self.out, "ivec2(")?; } self.write_constant(constant)?; if tex_1d_hack { write!(self.out, ", 0)")?; } } // Bias is always the last argument if let crate::SampleLevel::Bias(expr) = level { write!(self.out, ", ")?; self.write_expr(expr, ctx)?; } if let (Some(component), None) = (gather, depth_ref) { write!(self.out, ", {}", component as usize)?; } // End the function write!(self.out, ")")? } Expression::ImageLoad { image, coordinate, array_index, sample, level, } => self.write_image_load(expr, ctx, image, coordinate, array_index, sample, level)?, // Query translates into one of the: // - textureSize/imageSize // - textureQueryLevels // - textureSamples/imageSamples Expression::ImageQuery { image, query } => { use crate::ImageClass; // This will only panic if the module is invalid let (dim, class) = match *ctx.info[image].ty.inner_with(&self.module.types) { TypeInner::Image { dim, arrayed: _, class, } => (dim, class), _ => unreachable!(), }; let components = match dim { crate::ImageDimension::D1 => 1, crate::ImageDimension::D2 => 2, crate::ImageDimension::D3 => 3, crate::ImageDimension::Cube => 2, }; match query { crate::ImageQuery::Size { level } => { match class { ImageClass::Sampled { multi, .. } | ImageClass::Depth { multi } => { write!(self.out, "textureSize(")?; self.write_expr(image, ctx)?; if let Some(expr) = level { write!(self.out, ", ")?; self.write_expr(expr, ctx)?; } else if !multi { // All textureSize calls requires an lod argument // except for multisampled samplers write!(self.out, ", 0")?; } } ImageClass::Storage { .. } => { write!(self.out, "imageSize(")?; self.write_expr(image, ctx)?; } } write!(self.out, ")")?; if components != 1 || self.options.version.is_es() { write!(self.out, ".{}", &"xyz"[..components])?; } } crate::ImageQuery::NumLevels => { write!(self.out, "textureQueryLevels(",)?; self.write_expr(image, ctx)?; write!(self.out, ")",)?; } crate::ImageQuery::NumLayers => { let fun_name = match class { ImageClass::Sampled { .. } | ImageClass::Depth { .. } => "textureSize", ImageClass::Storage { .. } => "imageSize", }; write!(self.out, "{}(", fun_name)?; self.write_expr(image, ctx)?; // All textureSize calls requires an lod argument // except for multisampled samplers if class.is_multisampled() { write!(self.out, ", 0")?; } write!(self.out, ")")?; if components != 1 || self.options.version.is_es() { write!(self.out, ".{}", back::COMPONENTS[components])?; } } crate::ImageQuery::NumSamples => { let fun_name = match class { ImageClass::Sampled { .. } | ImageClass::Depth { .. } => { "textureSamples" } ImageClass::Storage { .. } => "imageSamples", }; write!(self.out, "{}(", fun_name)?; self.write_expr(image, ctx)?; write!(self.out, ")",)?; } } } // `Unary` is pretty straightforward // "-" - for `Negate` // "~" - for `Not` if it's an integer // "!" - for `Not` if it's a boolean // // We also wrap the everything in parentheses to avoid precedence issues Expression::Unary { op, expr } => { use crate::{ScalarKind as Sk, UnaryOperator as Uo}; let ty = ctx.info[expr].ty.inner_with(&self.module.types); match *ty { TypeInner::Vector { kind: Sk::Bool, .. } => { write!(self.out, "not(")?; } _ => { let operator = match op { Uo::Negate => "-", Uo::Not => match ty.scalar_kind() { Some(Sk::Sint) | Some(Sk::Uint) => "~", Some(Sk::Bool) => "!", ref other => { return Err(Error::Custom(format!( "Cannot apply not to type {:?}", other ))) } }, }; write!(self.out, "({}", operator)?; } } self.write_expr(expr, ctx)?; write!(self.out, ")")? } // `Binary` we just write `left op right`, except when dealing with // comparison operations on vectors as they are implemented with // builtin functions. // Once again we wrap everything in parentheses to avoid precedence issues Expression::Binary { mut op, left, right, } => { // Holds `Some(function_name)` if the binary operation is // implemented as a function call use crate::{BinaryOperator as Bo, ScalarKind as Sk, TypeInner as Ti}; let left_inner = ctx.info[left].ty.inner_with(&self.module.types); let right_inner = ctx.info[right].ty.inner_with(&self.module.types); let function = match (left_inner, right_inner) { (&Ti::Vector { kind, .. }, &Ti::Vector { .. }) => match op { Bo::Less | Bo::LessEqual | Bo::Greater | Bo::GreaterEqual | Bo::Equal | Bo::NotEqual => BinaryOperation::VectorCompare, Bo::Modulo if kind == Sk::Float => BinaryOperation::Modulo, Bo::And if kind == Sk::Bool => { op = crate::BinaryOperator::LogicalAnd; BinaryOperation::VectorComponentWise } Bo::InclusiveOr if kind == Sk::Bool => { op = crate::BinaryOperator::LogicalOr; BinaryOperation::VectorComponentWise } _ => BinaryOperation::Other, }, _ => match (left_inner.scalar_kind(), right_inner.scalar_kind()) { (Some(Sk::Float), _) | (_, Some(Sk::Float)) => match op { Bo::Modulo => BinaryOperation::Modulo, _ => BinaryOperation::Other, }, (Some(Sk::Bool), Some(Sk::Bool)) => match op { Bo::InclusiveOr => { op = crate::BinaryOperator::LogicalOr; BinaryOperation::Other } Bo::And => { op = crate::BinaryOperator::LogicalAnd; BinaryOperation::Other } _ => BinaryOperation::Other, }, _ => BinaryOperation::Other, }, }; match function { BinaryOperation::VectorCompare => { let op_str = match op { Bo::Less => "lessThan(", Bo::LessEqual => "lessThanEqual(", Bo::Greater => "greaterThan(", Bo::GreaterEqual => "greaterThanEqual(", Bo::Equal => "equal(", Bo::NotEqual => "notEqual(", _ => unreachable!(), }; write!(self.out, "{}", op_str)?; self.write_expr(left, ctx)?; write!(self.out, ", ")?; self.write_expr(right, ctx)?; write!(self.out, ")")?; } BinaryOperation::VectorComponentWise => { self.write_value_type(left_inner)?; write!(self.out, "(")?; let size = match *left_inner { Ti::Vector { size, .. } => size, _ => unreachable!(), }; for i in 0..size as usize { if i != 0 { write!(self.out, ", ")?; } self.write_expr(left, ctx)?; write!(self.out, ".{}", back::COMPONENTS[i])?; write!(self.out, " {} ", back::binary_operation_str(op))?; self.write_expr(right, ctx)?; write!(self.out, ".{}", back::COMPONENTS[i])?; } write!(self.out, ")")?; } // TODO: handle undefined behavior of BinaryOperator::Modulo // // sint: // if right == 0 return 0 // if left == min(type_of(left)) && right == -1 return 0 // if sign(left) == -1 || sign(right) == -1 return result as defined by WGSL // // uint: // if right == 0 return 0 // // float: // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798 BinaryOperation::Modulo => { write!(self.out, "(")?; // write `e1 - e2 * trunc(e1 / e2)` self.write_expr(left, ctx)?; write!(self.out, " - ")?; self.write_expr(right, ctx)?; write!(self.out, " * ")?; write!(self.out, "trunc(")?; self.write_expr(left, ctx)?; write!(self.out, " / ")?; self.write_expr(right, ctx)?; write!(self.out, ")")?; write!(self.out, ")")?; } BinaryOperation::Other => { write!(self.out, "(")?; self.write_expr(left, ctx)?; write!(self.out, " {} ", back::binary_operation_str(op))?; self.write_expr(right, ctx)?; write!(self.out, ")")?; } } } // `Select` is written as `condition ? accept : reject` // We wrap everything in parentheses to avoid precedence issues Expression::Select { condition, accept, reject, } => { let cond_ty = ctx.info[condition].ty.inner_with(&self.module.types); let vec_select = if let TypeInner::Vector { .. } = *cond_ty { true } else { false }; // TODO: Boolean mix on desktop required GL_EXT_shader_integer_mix if vec_select { // Glsl defines that for mix when the condition is a boolean the first element // is picked if condition is false and the second if condition is true write!(self.out, "mix(")?; self.write_expr(reject, ctx)?; write!(self.out, ", ")?; self.write_expr(accept, ctx)?; write!(self.out, ", ")?; self.write_expr(condition, ctx)?; } else { write!(self.out, "(")?; self.write_expr(condition, ctx)?; write!(self.out, " ? ")?; self.write_expr(accept, ctx)?; write!(self.out, " : ")?; self.write_expr(reject, ctx)?; } write!(self.out, ")")? } // `Derivative` is a function call to a glsl provided function Expression::Derivative { axis, expr } => { use crate::DerivativeAxis as Da; write!( self.out, "{}(", match axis { Da::X => "dFdx", Da::Y => "dFdy", Da::Width => "fwidth", } )?; self.write_expr(expr, ctx)?; write!(self.out, ")")? } // `Relational` is a normal function call to some glsl provided functions Expression::Relational { fun, argument } => { use crate::RelationalFunction as Rf; let fun_name = match fun { // There's no specific function for this but we can invert the result of `isinf` Rf::IsFinite => "!isinf", Rf::IsInf => "isinf", Rf::IsNan => "isnan", // There's also no function for this but we can invert `isnan` Rf::IsNormal => "!isnan", Rf::All => "all", Rf::Any => "any", }; write!(self.out, "{}(", fun_name)?; self.write_expr(argument, ctx)?; write!(self.out, ")")? } Expression::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; let fun_name = match fun { // comparison Mf::Abs => "abs", Mf::Min => "min", Mf::Max => "max", Mf::Clamp => "clamp", Mf::Saturate => { write!(self.out, "clamp(")?; self.write_expr(arg, ctx)?; match *ctx.info[arg].ty.inner_with(&self.module.types) { crate::TypeInner::Vector { size, .. } => write!( self.out, ", vec{}(0.0), vec{0}(1.0)", back::vector_size_str(size) )?, _ => write!(self.out, ", 0.0, 1.0")?, } write!(self.out, ")")?; return Ok(()); } // trigonometry Mf::Cos => "cos", Mf::Cosh => "cosh", Mf::Sin => "sin", Mf::Sinh => "sinh", Mf::Tan => "tan", Mf::Tanh => "tanh", Mf::Acos => "acos", Mf::Asin => "asin", Mf::Atan => "atan", Mf::Asinh => "asinh", Mf::Acosh => "acosh", Mf::Atanh => "atanh", Mf::Radians => "radians", Mf::Degrees => "degrees", // glsl doesn't have atan2 function // use two-argument variation of the atan function Mf::Atan2 => "atan", // decomposition Mf::Ceil => "ceil", Mf::Floor => "floor", Mf::Round => "roundEven", Mf::Fract => "fract", Mf::Trunc => "trunc", Mf::Modf => "modf", Mf::Frexp => "frexp", Mf::Ldexp => "ldexp", // exponent Mf::Exp => "exp", Mf::Exp2 => "exp2", Mf::Log => "log", Mf::Log2 => "log2", Mf::Pow => "pow", // geometry Mf::Dot => match *ctx.info[arg].ty.inner_with(&self.module.types) { crate::TypeInner::Vector { kind: crate::ScalarKind::Float, .. } => "dot", crate::TypeInner::Vector { size, .. } => { return self.write_dot_product(arg, arg1.unwrap(), size as usize, ctx) } _ => unreachable!( "Correct TypeInner for dot product should be already validated" ), }, Mf::Outer => "outerProduct", Mf::Cross => "cross", Mf::Distance => "distance", Mf::Length => "length", Mf::Normalize => "normalize", Mf::FaceForward => "faceforward", Mf::Reflect => "reflect", Mf::Refract => "refract", // computational Mf::Sign => "sign", Mf::Fma => { if self.options.version.supports_fma_function() { // Use the fma function when available "fma" } else { // No fma support. Transform the function call into an arithmetic expression write!(self.out, "(")?; self.write_expr(arg, ctx)?; write!(self.out, " * ")?; let arg1 = arg1.ok_or_else(|| Error::Custom("Missing fma arg1".to_owned()))?; self.write_expr(arg1, ctx)?; write!(self.out, " + ")?; let arg2 = arg2.ok_or_else(|| Error::Custom("Missing fma arg2".to_owned()))?; self.write_expr(arg2, ctx)?; write!(self.out, ")")?; return Ok(()); } } Mf::Mix => "mix", Mf::Step => "step", Mf::SmoothStep => "smoothstep", Mf::Sqrt => "sqrt", Mf::InverseSqrt => "inversesqrt", Mf::Inverse => "inverse", Mf::Transpose => "transpose", Mf::Determinant => "determinant", // bits Mf::CountOneBits => "bitCount", Mf::ReverseBits => "bitfieldReverse", Mf::ExtractBits => "bitfieldExtract", Mf::InsertBits => "bitfieldInsert", Mf::FindLsb => "findLSB", Mf::FindMsb => "findMSB", // data packing Mf::Pack4x8snorm => "packSnorm4x8", Mf::Pack4x8unorm => "packUnorm4x8", Mf::Pack2x16snorm => "packSnorm2x16", Mf::Pack2x16unorm => "packUnorm2x16", Mf::Pack2x16float => "packHalf2x16", // data unpacking Mf::Unpack4x8snorm => "unpackSnorm4x8", Mf::Unpack4x8unorm => "unpackUnorm4x8", Mf::Unpack2x16snorm => "unpackSnorm2x16", Mf::Unpack2x16unorm => "unpackUnorm2x16", Mf::Unpack2x16float => "unpackHalf2x16", }; let extract_bits = fun == Mf::ExtractBits; let insert_bits = fun == Mf::InsertBits; // Some GLSL functions always return signed integers (like findMSB), // so they need to be cast to uint if the argument is also an uint. let ret_might_need_int_to_uint = matches!(fun, Mf::FindLsb | Mf::FindMsb | Mf::CountOneBits | Mf::Abs); // Some GLSL functions only accept signed integers (like abs), // so they need their argument cast from uint to int. let arg_might_need_uint_to_int = matches!(fun, Mf::Abs); // Check if the argument is an unsigned integer and return the vector size // in case it's a vector let maybe_uint_size = match *ctx.info[arg].ty.inner_with(&self.module.types) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, .. } => Some(None), crate::TypeInner::Vector { kind: crate::ScalarKind::Uint, size, .. } => Some(Some(size)), _ => None, }; // Cast to uint if the function needs it if ret_might_need_int_to_uint { if let Some(maybe_size) = maybe_uint_size { match maybe_size { Some(size) => write!(self.out, "uvec{}(", size as u8)?, None => write!(self.out, "uint(")?, } } } write!(self.out, "{}(", fun_name)?; // Cast to int if the function needs it if arg_might_need_uint_to_int { if let Some(maybe_size) = maybe_uint_size { match maybe_size { Some(size) => write!(self.out, "ivec{}(", size as u8)?, None => write!(self.out, "int(")?, } } } self.write_expr(arg, ctx)?; // Close the cast from uint to int if arg_might_need_uint_to_int && maybe_uint_size.is_some() { write!(self.out, ")")? } if let Some(arg) = arg1 { write!(self.out, ", ")?; if extract_bits { write!(self.out, "int(")?; self.write_expr(arg, ctx)?; write!(self.out, ")")?; } else { self.write_expr(arg, ctx)?; } } if let Some(arg) = arg2 { write!(self.out, ", ")?; if extract_bits || insert_bits { write!(self.out, "int(")?; self.write_expr(arg, ctx)?; write!(self.out, ")")?; } else { self.write_expr(arg, ctx)?; } } if let Some(arg) = arg3 { write!(self.out, ", ")?; if insert_bits { write!(self.out, "int(")?; self.write_expr(arg, ctx)?; write!(self.out, ")")?; } else { self.write_expr(arg, ctx)?; } } write!(self.out, ")")?; // Close the cast from int to uint if ret_might_need_int_to_uint && maybe_uint_size.is_some() { write!(self.out, ")")? } } // `As` is always a call. // If `convert` is true the function name is the type // Else the function name is one of the glsl provided bitcast functions Expression::As { expr, kind: target_kind, convert, } => { let inner = ctx.info[expr].ty.inner_with(&self.module.types); match convert { Some(width) => { // this is similar to `write_type`, but with the target kind let scalar = glsl_scalar(target_kind, width)?; match *inner { TypeInner::Matrix { columns, rows, .. } => write!( self.out, "{}mat{}x{}", scalar.prefix, columns as u8, rows as u8 )?, TypeInner::Vector { size, .. } => { write!(self.out, "{}vec{}", scalar.prefix, size as u8)? } _ => write!(self.out, "{}", scalar.full)?, } write!(self.out, "(")?; self.write_expr(expr, ctx)?; write!(self.out, ")")? } None => { use crate::ScalarKind as Sk; let target_vector_type = match *inner { TypeInner::Vector { size, width, .. } => Some(TypeInner::Vector { size, width, kind: target_kind, }), _ => None, }; let source_kind = inner.scalar_kind().unwrap(); match (source_kind, target_kind, target_vector_type) { // No conversion needed (Sk::Sint, Sk::Sint, _) | (Sk::Uint, Sk::Uint, _) | (Sk::Float, Sk::Float, _) | (Sk::Bool, Sk::Bool, _) => { self.write_expr(expr, ctx)?; return Ok(()); } // Cast to/from floats (Sk::Float, Sk::Sint, _) => write!(self.out, "floatBitsToInt")?, (Sk::Float, Sk::Uint, _) => write!(self.out, "floatBitsToUint")?, (Sk::Sint, Sk::Float, _) => write!(self.out, "intBitsToFloat")?, (Sk::Uint, Sk::Float, _) => write!(self.out, "uintBitsToFloat")?, // Cast between vector types (_, _, Some(vector)) => { self.write_value_type(&vector)?; } // There is no way to bitcast between Uint/Sint in glsl. Use constructor conversion (Sk::Uint | Sk::Bool, Sk::Sint, None) => write!(self.out, "int")?, (Sk::Sint | Sk::Bool, Sk::Uint, None) => write!(self.out, "uint")?, (Sk::Bool, Sk::Float, None) => write!(self.out, "float")?, (Sk::Sint | Sk::Uint | Sk::Float, Sk::Bool, None) => { write!(self.out, "bool")? } }; write!(self.out, "(")?; self.write_expr(expr, ctx)?; write!(self.out, ")")?; } } } // These expressions never show up in `Emit`. Expression::CallResult(_) | Expression::AtomicResult { .. } => unreachable!(), // `ArrayLength` is written as `expr.length()` and we convert it to a uint Expression::ArrayLength(expr) => { write!(self.out, "uint(")?; self.write_expr(expr, ctx)?; write!(self.out, ".length())")? } } Ok(()) } /// Helper function to write the local holding the clamped lod fn write_clamped_lod( &mut self, ctx: &back::FunctionCtx, expr: Handle, image: Handle, level_expr: Handle, ) -> Result<(), Error> { // Define our local and start a call to `clamp` write!( self.out, "int {}{}{} = clamp(", back::BAKE_PREFIX, expr.index(), CLAMPED_LOD_SUFFIX )?; // Write the lod that will be clamped self.write_expr(level_expr, ctx)?; // Set the min value to 0 and start a call to `textureQueryLevels` to get // the maximum value write!(self.out, ", 0, textureQueryLevels(")?; // Write the target image as an argument to `textureQueryLevels` self.write_expr(image, ctx)?; // Close the call to `textureQueryLevels` subtract 1 from it since // the lod argument is 0 based, close the `clamp` call and end the // local declaration statement. writeln!(self.out, ") - 1);")?; Ok(()) } // Helper method used to retrieve how many elements a coordinate vector // for the images operations need. fn get_coordinate_vector_size(&self, dim: crate::ImageDimension, arrayed: bool) -> u8 { // openGL es doesn't have 1D images so we need workaround it let tex_1d_hack = dim == crate::ImageDimension::D1 && self.options.version.is_es(); // Get how many components the coordinate vector needs for the dimensions only let tex_coord_size = match dim { crate::ImageDimension::D1 => 1, crate::ImageDimension::D2 => 2, crate::ImageDimension::D3 => 3, crate::ImageDimension::Cube => 2, }; // Calculate the true size of the coordinate vector by adding 1 for arrayed images // and another 1 if we need to workaround 1D images by making them 2D tex_coord_size + tex_1d_hack as u8 + arrayed as u8 } /// Helper method to write the coordinate vector for image operations fn write_texture_coord( &mut self, ctx: &back::FunctionCtx, vector_size: u8, coordinate: Handle, array_index: Option>, // Emulate 1D images as 2D for profiles that don't support it (glsl es) tex_1d_hack: bool, ) -> Result<(), Error> { match array_index { // If the image needs an array indice we need to add it to the end of our // coordinate vector, to do so we will use the `ivec(ivec, scalar)` // constructor notation (NOTE: the inner `ivec` can also be a scalar, this // is important for 1D arrayed images). Some(layer_expr) => { write!(self.out, "ivec{}(", vector_size)?; self.write_expr(coordinate, ctx)?; write!(self.out, ", ")?; // If we are replacing sampler1D with sampler2D we also need // to add another zero to the coordinates vector for the y component if tex_1d_hack { write!(self.out, "0, ")?; } self.write_expr(layer_expr, ctx)?; write!(self.out, ")")?; } // Otherwise write just the expression (and the 1D hack if needed) None => { if tex_1d_hack { write!(self.out, "ivec2(")?; } self.write_expr(coordinate, ctx)?; if tex_1d_hack { write!(self.out, ", 0)")?; } } } Ok(()) } /// Helper method to write the `ImageStore` statement fn write_image_store( &mut self, ctx: &back::FunctionCtx, image: Handle, coordinate: Handle, array_index: Option>, value: Handle, ) -> Result<(), Error> { use crate::ImageDimension as IDim; // NOTE: openGL requires that `imageStore`s have no effets when the texel is invalid // so we don't need to generate bounds checks (OpenGL 4.2 Core §3.9.20) // This will only panic if the module is invalid let dim = match *ctx.info[image].ty.inner_with(&self.module.types) { TypeInner::Image { dim, .. } => dim, _ => unreachable!(), }; // Begin our call to `imageStore` write!(self.out, "imageStore(")?; self.write_expr(image, ctx)?; // Separate the image argument from the coordinates write!(self.out, ", ")?; // openGL es doesn't have 1D images so we need workaround it let tex_1d_hack = dim == IDim::D1 && self.options.version.is_es(); // Write the coordinate vector self.write_texture_coord( ctx, // Get the size of the coordinate vector self.get_coordinate_vector_size(dim, array_index.is_some()), coordinate, array_index, tex_1d_hack, )?; // Separate the coordinate from the value to write and write the expression // of the value to write. write!(self.out, ", ")?; self.write_expr(value, ctx)?; // End the call to `imageStore` and the statement. writeln!(self.out, ");")?; Ok(()) } /// Helper method for writing an `ImageLoad` expression. #[allow(clippy::too_many_arguments)] fn write_image_load( &mut self, handle: Handle, ctx: &back::FunctionCtx, image: Handle, coordinate: Handle, array_index: Option>, sample: Option>, level: Option>, ) -> Result<(), Error> { use crate::ImageDimension as IDim; // `ImageLoad` is a bit complicated. // There are two functions one for sampled // images another for storage images, the former uses `texelFetch` and the // latter uses `imageLoad`. // // Furthermore we have `level` which is always `Some` for sampled images // and `None` for storage images, so we end up with two functions: // - `texelFetch(image, coordinate, level)` for sampled images // - `imageLoad(image, coordinate)` for storage images // // Finally we also have to consider bounds checking, for storage images // this is easy since openGL requires that invalid texels always return // 0, for sampled images we need to either verify that all arguments are // in bounds (`ReadZeroSkipWrite`) or make them a valid texel (`Restrict`). // This will only panic if the module is invalid let (dim, class) = match *ctx.info[image].ty.inner_with(&self.module.types) { TypeInner::Image { dim, arrayed: _, class, } => (dim, class), _ => unreachable!(), }; // Get the name of the function to be used for the load operation // and the policy to be used with it. let (fun_name, policy) = match class { // Sampled images inherit the policy from the user passed policies crate::ImageClass::Sampled { .. } => ("texelFetch", self.policies.image), crate::ImageClass::Storage { .. } => { // OpenGL 4.2 Core §3.9.20 defines that out of bounds texels in `imageLoad`s // always return zero values so we don't need to generate bounds checks ("imageLoad", proc::BoundsCheckPolicy::Unchecked) } // TODO: Is there even a function for this? crate::ImageClass::Depth { multi: _ } => { return Err(Error::Custom( "WGSL `textureLoad` from depth textures is not supported in GLSL".to_string(), )) } }; // openGL es doesn't have 1D images so we need workaround it let tex_1d_hack = dim == IDim::D1 && self.options.version.is_es(); // Get the size of the coordinate vector let vector_size = self.get_coordinate_vector_size(dim, array_index.is_some()); if let proc::BoundsCheckPolicy::ReadZeroSkipWrite = policy { // To write the bounds checks for `ReadZeroSkipWrite` we will use a // ternary operator since we are in the middle of an expression and // need to return a value. // // NOTE: glsl does short circuit when evaluating logical // expressions so we can be sure that after we test a // condition it will be true for the next ones // Write parantheses around the ternary operator to prevent problems with // expressions emitted before or after it having more precedence write!(self.out, "(",)?; // The lod check needs to precede the size check since we need // to use the lod to get the size of the image at that level. if let Some(level_expr) = level { self.write_expr(level_expr, ctx)?; write!(self.out, " < textureQueryLevels(",)?; self.write_expr(image, ctx)?; // Chain the next check write!(self.out, ") && ")?; } // Check that the sample arguments doesn't exceed the number of samples if let Some(sample_expr) = sample { self.write_expr(sample_expr, ctx)?; write!(self.out, " < textureSamples(",)?; self.write_expr(image, ctx)?; // Chain the next check write!(self.out, ") && ")?; } // We now need to write the size checks for the coordinates and array index // first we write the comparation function in case the image is 1D non arrayed // (and no 1D to 2D hack was needed) we are comparing scalars so the less than // operator will suffice, but otherwise we'll be comparing two vectors so we'll // need to use the `lessThan` function but it returns a vector of booleans (one // for each comparison) so we need to fold it all in one scalar boolean, since // we want all comparisons to pass we use the `all` function which will only // return `true` if all the elements of the boolean vector are also `true`. // // So we'll end with one of the following forms // - `coord < textureSize(image, lod)` for 1D images // - `all(lessThan(coord, textureSize(image, lod)))` for normal images // - `all(lessThan(ivec(coord, array_index), textureSize(image, lod)))` // for arrayed images // - `all(lessThan(coord, textureSize(image)))` for multi sampled images if vector_size != 1 { write!(self.out, "all(lessThan(")?; } // Write the coordinate vector self.write_texture_coord(ctx, vector_size, coordinate, array_index, tex_1d_hack)?; if vector_size != 1 { // If we used the `lessThan` function we need to separate the // coordinates from the image size. write!(self.out, ", ")?; } else { // If we didn't use it (ie. 1D images) we perform the comparsion // using the less than operator. write!(self.out, " < ")?; } // Call `textureSize` to get our image size write!(self.out, "textureSize(")?; self.write_expr(image, ctx)?; // `textureSize` uses the lod as a second argument for mipmapped images if let Some(level_expr) = level { // Separate the image from the lod write!(self.out, ", ")?; self.write_expr(level_expr, ctx)?; } // Close the `textureSize` call write!(self.out, ")")?; if vector_size != 1 { // Close the `all` and `lessThan` calls write!(self.out, "))")?; } // Finally end the condition part of the ternary operator write!(self.out, " ? ")?; } // Begin the call to the function used to load the texel write!(self.out, "{}(", fun_name)?; self.write_expr(image, ctx)?; write!(self.out, ", ")?; // If we are using `Restrict` bounds checking we need to pass valid texel // coordinates, to do so we use the `clamp` function to get a value between // 0 and the image size - 1 (indexing begins at 0) if let proc::BoundsCheckPolicy::Restrict = policy { write!(self.out, "clamp(")?; } // Write the coordinate vector self.write_texture_coord(ctx, vector_size, coordinate, array_index, tex_1d_hack)?; // If we are using `Restrict` bounds checking we need to write the rest of the // clamp we initiated before writing the coordinates. if let proc::BoundsCheckPolicy::Restrict = policy { // Write the min value 0 if vector_size == 1 { write!(self.out, ", 0")?; } else { write!(self.out, ", ivec{}(0)", vector_size)?; } // Start the `textureSize` call to use as the max value. write!(self.out, ", textureSize(")?; self.write_expr(image, ctx)?; // If the image is mipmapped we need to add the lod argument to the // `textureSize` call, but this needs to be the clamped lod, this should // have been generated earlier and put in a local. if class.is_mipmapped() { write!( self.out, ", {}{}{}", back::BAKE_PREFIX, handle.index(), CLAMPED_LOD_SUFFIX )?; } // Close the `textureSize` call write!(self.out, ")")?; // Subtract 1 from the `textureSize` call since the coordinates are zero based. if vector_size == 1 { write!(self.out, " - 1")?; } else { write!(self.out, " - ivec{}(1)", vector_size)?; } // Close the `clamp` call write!(self.out, ")")?; // Add the clamped lod (if present) as the second argument to the // image load function. if level.is_some() { write!( self.out, ", {}{}{}", back::BAKE_PREFIX, handle.index(), CLAMPED_LOD_SUFFIX )?; } // If a sample argument is needed we need to clamp it between 0 and // the number of samples the image has. if let Some(sample_expr) = sample { write!(self.out, ", clamp(")?; self.write_expr(sample_expr, ctx)?; // Set the min value to 0 and start the call to `textureSamples` write!(self.out, ", 0, textureSamples(")?; self.write_expr(image, ctx)?; // Close the `textureSamples` call, subtract 1 from it since the sample // argument is zero based, and close the `clamp` call writeln!(self.out, ") - 1)")?; } } else if let Some(sample_or_level) = sample.or(level) { // If no bounds checking is need just add the sample or level argument // after the coordinates write!(self.out, ", ")?; self.write_expr(sample_or_level, ctx)?; } // Close the image load function. write!(self.out, ")")?; // If we were using the `ReadZeroSkipWrite` policy we need to end the first branch // (which is taken if the condition is `true`) with a colon (`:`) and write the // second branch which is just a 0 value. if let proc::BoundsCheckPolicy::ReadZeroSkipWrite = policy { // Get the kind of the output value. let kind = match class { // Only sampled images can reach here since storage images // don't need bounds checks and depth images aren't implmented crate::ImageClass::Sampled { kind, .. } => kind, _ => unreachable!(), }; // End the first branch write!(self.out, " : ")?; // Write the 0 value write!(self.out, "{}vec4(", glsl_scalar(kind, 4)?.prefix,)?; self.write_zero_init_scalar(kind)?; // Close the zero value constructor write!(self.out, ")")?; // Close the parantheses surrounding our ternary write!(self.out, ")")?; } Ok(()) } fn write_named_expr( &mut self, handle: Handle, name: String, ctx: &back::FunctionCtx, ) -> BackendResult { match ctx.info[handle].ty { proc::TypeResolution::Handle(ty_handle) => match self.module.types[ty_handle].inner { TypeInner::Struct { .. } => { let ty_name = &self.names[&NameKey::Type(ty_handle)]; write!(self.out, "{}", ty_name)?; } _ => { self.write_type(ty_handle)?; } }, proc::TypeResolution::Value(ref inner) => { self.write_value_type(inner)?; } } let base_ty_res = &ctx.info[handle].ty; let resolved = base_ty_res.inner_with(&self.module.types); write!(self.out, " {}", name)?; if let TypeInner::Array { base, size, .. } = *resolved { self.write_array_size(base, size)?; } write!(self.out, " = ")?; self.write_expr(handle, ctx)?; writeln!(self.out, ";")?; self.named_expressions.insert(handle, name); Ok(()) } /// Helper function that write string with default zero initialization for supported types fn write_zero_init_value(&mut self, ty: Handle) -> BackendResult { let inner = &self.module.types[ty].inner; match *inner { TypeInner::Scalar { kind, .. } => { self.write_zero_init_scalar(kind)?; } TypeInner::Vector { kind, .. } => { self.write_value_type(inner)?; write!(self.out, "(")?; self.write_zero_init_scalar(kind)?; write!(self.out, ")")?; } TypeInner::Matrix { .. } => { self.write_value_type(inner)?; write!(self.out, "(")?; self.write_zero_init_scalar(crate::ScalarKind::Float)?; write!(self.out, ")")?; } TypeInner::Array { base, size, .. } => { let count = match size .to_indexable_length(self.module) .expect("Bad array size") { proc::IndexableLength::Known(count) => count, proc::IndexableLength::Dynamic => return Ok(()), }; self.write_type(base)?; self.write_array_size(base, size)?; write!(self.out, "(")?; for _ in 1..count { self.write_zero_init_value(base)?; write!(self.out, ", ")?; } // write last parameter without comma and space self.write_zero_init_value(base)?; write!(self.out, ")")?; } TypeInner::Struct { ref members, .. } => { let name = &self.names[&NameKey::Type(ty)]; write!(self.out, "{}(", name)?; for (i, member) in members.iter().enumerate() { self.write_zero_init_value(member.ty)?; if i != members.len().saturating_sub(1) { write!(self.out, ", ")?; } } write!(self.out, ")")?; } _ => {} // TODO: } Ok(()) } /// Helper function that write string with zero initialization for scalar fn write_zero_init_scalar(&mut self, kind: crate::ScalarKind) -> BackendResult { match kind { crate::ScalarKind::Bool => write!(self.out, "false")?, crate::ScalarKind::Uint => write!(self.out, "0u")?, crate::ScalarKind::Float => write!(self.out, "0.0")?, crate::ScalarKind::Sint => write!(self.out, "0")?, } Ok(()) } /// Helper function that return the glsl storage access string of [`StorageAccess`](crate::StorageAccess) /// /// glsl allows adding both `readonly` and `writeonly` but this means that /// they can only be used to query information about the resource which isn't what /// we want here so when storage access is both `LOAD` and `STORE` add no modifiers fn write_storage_access(&mut self, storage_access: crate::StorageAccess) -> BackendResult { if !storage_access.contains(crate::StorageAccess::STORE) { write!(self.out, "readonly ")?; } if !storage_access.contains(crate::StorageAccess::LOAD) { write!(self.out, "writeonly ")?; } Ok(()) } /// Helper method used to produce the reflection info that's returned to the user fn collect_reflection_info(&self) -> Result { use std::collections::hash_map::Entry; let info = self.info.get_entry_point(self.entry_point_idx as usize); let mut texture_mapping = crate::FastHashMap::default(); let mut uniforms = crate::FastHashMap::default(); for sampling in info.sampling_set.iter() { let tex_name = self.reflection_names_globals[&sampling.image].clone(); match texture_mapping.entry(tex_name) { Entry::Vacant(v) => { v.insert(TextureMapping { texture: sampling.image, sampler: Some(sampling.sampler), }); } Entry::Occupied(e) => { if e.get().sampler != Some(sampling.sampler) { log::error!("Conflicting samplers for {}", e.key()); return Err(Error::ImageMultipleSamplers); } } } } for (handle, var) in self.module.global_variables.iter() { if info[handle].is_empty() { continue; } match self.module.types[var.ty].inner { crate::TypeInner::Struct { .. } => match var.space { crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } => { let name = self.reflection_names_globals[&handle].clone(); uniforms.insert(handle, name); } _ => (), }, crate::TypeInner::Image { .. } => { let tex_name = self.reflection_names_globals[&handle].clone(); match texture_mapping.entry(tex_name) { Entry::Vacant(v) => { v.insert(TextureMapping { texture: handle, sampler: None, }); } Entry::Occupied(_) => { // already used with a sampler, do nothing } } } _ => {} } } Ok(ReflectionInfo { texture_mapping, uniforms, }) } } /// Structure returned by [`glsl_scalar`](glsl_scalar) /// /// It contains both a prefix used in other types and the full type name struct ScalarString<'a> { /// The prefix used to compose other types prefix: &'a str, /// The name of the scalar type full: &'a str, } /// Helper function that returns scalar related strings /// /// Check [`ScalarString`](ScalarString) for the information provided /// /// # Errors /// If a [`Float`](crate::ScalarKind::Float) with an width that isn't 4 or 8 const fn glsl_scalar( kind: crate::ScalarKind, width: crate::Bytes, ) -> Result, Error> { use crate::ScalarKind as Sk; Ok(match kind { Sk::Sint => ScalarString { prefix: "i", full: "int", }, Sk::Uint => ScalarString { prefix: "u", full: "uint", }, Sk::Float => match width { 4 => ScalarString { prefix: "", full: "float", }, 8 => ScalarString { prefix: "d", full: "double", }, _ => return Err(Error::UnsupportedScalar(kind, width)), }, Sk::Bool => ScalarString { prefix: "b", full: "bool", }, }) } /// Helper function that returns the glsl variable name for a builtin const fn glsl_built_in( built_in: crate::BuiltIn, output: bool, targetting_webgl: bool, ) -> &'static str { use crate::BuiltIn as Bi; match built_in { Bi::Position { .. } => { if output { "gl_Position" } else { "gl_FragCoord" } } Bi::ViewIndex if targetting_webgl => "int(gl_ViewID_OVR)", Bi::ViewIndex => "gl_ViewIndex", // vertex Bi::BaseInstance => "uint(gl_BaseInstance)", Bi::BaseVertex => "uint(gl_BaseVertex)", Bi::ClipDistance => "gl_ClipDistance", Bi::CullDistance => "gl_CullDistance", Bi::InstanceIndex => "uint(gl_InstanceID)", Bi::PointSize => "gl_PointSize", Bi::VertexIndex => "uint(gl_VertexID)", // fragment Bi::FragDepth => "gl_FragDepth", Bi::FrontFacing => "gl_FrontFacing", Bi::PrimitiveIndex => "uint(gl_PrimitiveID)", Bi::SampleIndex => "gl_SampleID", Bi::SampleMask => { if output { "gl_SampleMask" } else { "gl_SampleMaskIn" } } // compute Bi::GlobalInvocationId => "gl_GlobalInvocationID", Bi::LocalInvocationId => "gl_LocalInvocationID", Bi::LocalInvocationIndex => "gl_LocalInvocationIndex", Bi::WorkGroupId => "gl_WorkGroupID", Bi::WorkGroupSize => "gl_WorkGroupSize", Bi::NumWorkGroups => "gl_NumWorkGroups", } } /// Helper function that returns the string corresponding to the address space const fn glsl_storage_qualifier(space: crate::AddressSpace) -> Option<&'static str> { use crate::AddressSpace as As; match space { As::Function => None, As::Private => None, As::Storage { .. } => Some("buffer"), As::Uniform => Some("uniform"), As::Handle => Some("uniform"), As::WorkGroup => Some("shared"), As::PushConstant => Some("uniform"), } } /// Helper function that returns the string corresponding to the glsl interpolation qualifier const fn glsl_interpolation(interpolation: crate::Interpolation) -> &'static str { use crate::Interpolation as I; match interpolation { I::Perspective => "smooth", I::Linear => "noperspective", I::Flat => "flat", } } /// Return the GLSL auxiliary qualifier for the given sampling value. const fn glsl_sampling(sampling: crate::Sampling) -> Option<&'static str> { use crate::Sampling as S; match sampling { S::Center => None, S::Centroid => Some("centroid"), S::Sample => Some("sample"), } } /// Helper function that returns the glsl dimension string of [`ImageDimension`](crate::ImageDimension) const fn glsl_dimension(dim: crate::ImageDimension) -> &'static str { use crate::ImageDimension as IDim; match dim { IDim::D1 => "1D", IDim::D2 => "2D", IDim::D3 => "3D", IDim::Cube => "Cube", } } /// Helper function that returns the glsl storage format string of [`StorageFormat`](crate::StorageFormat) const fn glsl_storage_format(format: crate::StorageFormat) -> &'static str { use crate::StorageFormat as Sf; match format { Sf::R8Unorm => "r8", Sf::R8Snorm => "r8_snorm", Sf::R8Uint => "r8ui", Sf::R8Sint => "r8i", Sf::R16Uint => "r16ui", Sf::R16Sint => "r16i", Sf::R16Float => "r16f", Sf::Rg8Unorm => "rg8", Sf::Rg8Snorm => "rg8_snorm", Sf::Rg8Uint => "rg8ui", Sf::Rg8Sint => "rg8i", Sf::R32Uint => "r32ui", Sf::R32Sint => "r32i", Sf::R32Float => "r32f", Sf::Rg16Uint => "rg16ui", Sf::Rg16Sint => "rg16i", Sf::Rg16Float => "rg16f", Sf::Rgba8Unorm => "rgba8", Sf::Rgba8Snorm => "rgba8_snorm", Sf::Rgba8Uint => "rgba8ui", Sf::Rgba8Sint => "rgba8i", Sf::Rgb10a2Unorm => "rgb10_a2ui", Sf::Rg11b10Float => "r11f_g11f_b10f", Sf::Rg32Uint => "rg32ui", Sf::Rg32Sint => "rg32i", Sf::Rg32Float => "rg32f", Sf::Rgba16Uint => "rgba16ui", Sf::Rgba16Sint => "rgba16i", Sf::Rgba16Float => "rgba16f", Sf::Rgba32Uint => "rgba32ui", Sf::Rgba32Sint => "rgba32i", Sf::Rgba32Float => "rgba32f", } } fn is_value_init_supported(module: &crate::Module, ty: Handle) -> bool { match module.types[ty].inner { TypeInner::Scalar { .. } | TypeInner::Vector { .. } | TypeInner::Matrix { .. } => true, TypeInner::Array { base, size, .. } => { size != crate::ArraySize::Dynamic && is_value_init_supported(module, base) } TypeInner::Struct { ref members, .. } => members .iter() .all(|member| is_value_init_supported(module, member.ty)), _ => false, } } ================================================ FILE: lib/naga/src/back/hlsl/conv.rs ================================================ use std::borrow::Cow; use crate::proc::Alignment; use super::Error; impl crate::ScalarKind { pub(super) fn to_hlsl_cast(self) -> &'static str { match self { Self::Float => "asfloat", Self::Sint => "asint", Self::Uint => "asuint", Self::Bool => unreachable!(), } } /// Helper function that returns scalar related strings /// /// pub(super) const fn to_hlsl_str(self, width: crate::Bytes) -> Result<&'static str, Error> { match self { Self::Sint => Ok("int"), Self::Uint => Ok("uint"), Self::Float => match width { 2 => Ok("half"), 4 => Ok("float"), 8 => Ok("double"), _ => Err(Error::UnsupportedScalar(self, width)), }, Self::Bool => Ok("bool"), } } } impl crate::TypeInner { pub(super) const fn is_matrix(&self) -> bool { match *self { Self::Matrix { .. } => true, _ => false, } } pub(super) fn try_size_hlsl( &self, types: &crate::UniqueArena, constants: &crate::Arena, ) -> Result { Ok(match *self { Self::Matrix { columns, rows, width, } => { let stride = Alignment::from(rows) * width as u32; let last_row_size = rows as u32 * width as u32; ((columns as u32 - 1) * stride) + last_row_size } Self::Array { base, size, stride } => { let count = match size { crate::ArraySize::Constant(handle) => { let constant = constants.try_get(handle)?; constant.to_array_length().unwrap_or(1) } // A dynamically-sized array has to have at least one element crate::ArraySize::Dynamic => 1, }; let last_el_size = types[base].inner.try_size_hlsl(types, constants)?; ((count - 1) * stride) + last_el_size } _ => self.try_size(constants)?, }) } /// Used to generate the name of the wrapped type constructor pub(super) fn hlsl_type_id<'a>( &self, base: crate::Handle, types: &crate::UniqueArena, constants: &crate::Arena, names: &'a crate::FastHashMap, ) -> Result, Error> { Ok(match types[base].inner { crate::TypeInner::Scalar { kind, width } => Cow::Borrowed(kind.to_hlsl_str(width)?), crate::TypeInner::Vector { size, kind, width } => Cow::Owned(format!( "{}{}", kind.to_hlsl_str(width)?, crate::back::vector_size_str(size) )), crate::TypeInner::Matrix { columns, rows, width, } => Cow::Owned(format!( "{}{}x{}", crate::ScalarKind::Float.to_hlsl_str(width)?, crate::back::vector_size_str(columns), crate::back::vector_size_str(rows), )), crate::TypeInner::Array { base, size: crate::ArraySize::Constant(size), .. } => Cow::Owned(format!( "array{}_{}_", constants[size].to_array_length().unwrap(), self.hlsl_type_id(base, types, constants, names)? )), crate::TypeInner::Struct { .. } => { Cow::Borrowed(&names[&crate::proc::NameKey::Type(base)]) } _ => unreachable!(), }) } } impl crate::StorageFormat { pub(super) const fn to_hlsl_str(self) -> &'static str { match self { Self::R16Float => "float", Self::R8Unorm => "unorm float", Self::R8Snorm => "snorm float", Self::R8Uint | Self::R16Uint => "uint", Self::R8Sint | Self::R16Sint => "int", Self::Rg16Float => "float2", Self::Rg8Unorm => "unorm float2", Self::Rg8Snorm => "snorm float2", Self::Rg8Sint | Self::Rg16Sint => "int2", Self::Rg8Uint | Self::Rg16Uint => "uint2", Self::Rg11b10Float => "float3", Self::Rgba16Float | Self::R32Float | Self::Rg32Float | Self::Rgba32Float => "float4", Self::Rgba8Unorm | Self::Rgb10a2Unorm => "unorm float4", Self::Rgba8Snorm => "snorm float4", Self::Rgba8Uint | Self::Rgba16Uint | Self::R32Uint | Self::Rg32Uint | Self::Rgba32Uint => "uint4", Self::Rgba8Sint | Self::Rgba16Sint | Self::R32Sint | Self::Rg32Sint | Self::Rgba32Sint => "int4", } } } impl crate::BuiltIn { pub(super) fn to_hlsl_str(self) -> Result<&'static str, Error> { Ok(match self { Self::Position { .. } => "SV_Position", // vertex Self::ClipDistance => "SV_ClipDistance", Self::CullDistance => "SV_CullDistance", Self::InstanceIndex => "SV_InstanceID", // based on this page https://docs.microsoft.com/en-us/windows/uwp/gaming/glsl-to-hlsl-reference#comparing-opengl-es-20-with-direct3d-11 // No meaning unless you target Direct3D 9 Self::PointSize => "PSIZE", Self::VertexIndex => "SV_VertexID", // fragment Self::FragDepth => "SV_Depth", Self::FrontFacing => "SV_IsFrontFace", Self::PrimitiveIndex => "SV_PrimitiveID", Self::SampleIndex => "SV_SampleIndex", Self::SampleMask => "SV_Coverage", // compute Self::GlobalInvocationId => "SV_DispatchThreadID", Self::LocalInvocationId => "SV_GroupThreadID", Self::LocalInvocationIndex => "SV_GroupIndex", Self::WorkGroupId => "SV_GroupID", // The specific semantic we use here doesn't matter, because references // to this field will get replaced with references to `SPECIAL_CBUF_VAR` // in `Writer::write_expr`. Self::NumWorkGroups => "SV_GroupID", Self::BaseInstance | Self::BaseVertex | Self::WorkGroupSize => { return Err(Error::Unimplemented(format!("builtin {:?}", self))) } Self::ViewIndex => { return Err(Error::Custom(format!("Unsupported builtin {:?}", self))) } }) } } impl crate::Interpolation { /// Return the string corresponding to the HLSL interpolation qualifier. pub(super) const fn to_hlsl_str(self) -> Option<&'static str> { match self { // Would be "linear", but it's the default interpolation in SM4 and up // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-struct#interpolation-modifiers-introduced-in-shader-model-4 Self::Perspective => None, Self::Linear => Some("noperspective"), Self::Flat => Some("nointerpolation"), } } } impl crate::Sampling { /// Return the HLSL auxiliary qualifier for the given sampling value. pub(super) const fn to_hlsl_str(self) -> Option<&'static str> { match self { Self::Center => None, Self::Centroid => Some("centroid"), Self::Sample => Some("sample"), } } } impl crate::AtomicFunction { /// Return the HLSL suffix for the `InterlockedXxx` method. pub(super) const fn to_hlsl_suffix(self) -> &'static str { match self { Self::Add | Self::Subtract => "Add", Self::And => "And", Self::InclusiveOr => "Or", Self::ExclusiveOr => "Xor", Self::Min => "Min", Self::Max => "Max", Self::Exchange { compare: None } => "Exchange", Self::Exchange { .. } => "", //TODO } } } ================================================ FILE: lib/naga/src/back/hlsl/help.rs ================================================ /*! Helpers for the hlsl backend Important note about `Expression::ImageQuery`/`Expression::ArrayLength` and hlsl backend: Due to implementation of `GetDimensions` function in hlsl () backend can't work with it as an expression. Instead, it generates a unique wrapped function per `Expression::ImageQuery`, based on texture info and query function. See `WrappedImageQuery` struct that represents a unique function and will be generated before writing all statements and expressions. This allowed to works with `Expression::ImageQuery` as expression and write wrapped function. For example: ```wgsl let dim_1d = textureDimensions(image_1d); ``` ```hlsl int NagaDimensions1D(Texture1D) { uint4 ret; image_1d.GetDimensions(ret.x); return ret.x; } int dim_1d = NagaDimensions1D(image_1d); ``` */ use super::{super::FunctionCtx, BackendResult}; use crate::{arena::Handle, proc::NameKey}; use std::fmt::Write; #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) struct WrappedArrayLength { pub(super) writable: bool, } #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) struct WrappedImageQuery { pub(super) dim: crate::ImageDimension, pub(super) arrayed: bool, pub(super) class: crate::ImageClass, pub(super) query: ImageQuery, } #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) struct WrappedConstructor { pub(super) ty: Handle, } #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) struct WrappedStructMatrixAccess { pub(super) ty: Handle, pub(super) index: u32, } #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) struct WrappedMatCx2 { pub(super) columns: crate::VectorSize, } /// HLSL backend requires its own `ImageQuery` enum. /// /// It is used inside `WrappedImageQuery` and should be unique per ImageQuery function. /// IR version can't be unique per function, because it's store mipmap level as an expression. /// /// For example: /// ```wgsl /// let dim_cube_array_lod = textureDimensions(image_cube_array, 1); /// let dim_cube_array_lod2 = textureDimensions(image_cube_array, 1); /// ``` /// /// ```ir /// ImageQuery { /// image: [1], /// query: Size { /// level: Some( /// [1], /// ), /// }, /// }, /// ImageQuery { /// image: [1], /// query: Size { /// level: Some( /// [2], /// ), /// }, /// }, /// ``` /// /// HLSL should generate only 1 function for this case. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] pub(super) enum ImageQuery { Size, SizeLevel, NumLevels, NumLayers, NumSamples, } impl From for ImageQuery { fn from(q: crate::ImageQuery) -> Self { use crate::ImageQuery as Iq; match q { Iq::Size { level: Some(_) } => ImageQuery::SizeLevel, Iq::Size { level: None } => ImageQuery::Size, Iq::NumLevels => ImageQuery::NumLevels, Iq::NumLayers => ImageQuery::NumLayers, Iq::NumSamples => ImageQuery::NumSamples, } } } impl<'a, W: Write> super::Writer<'a, W> { pub(super) fn write_image_type( &mut self, dim: crate::ImageDimension, arrayed: bool, class: crate::ImageClass, ) -> BackendResult { let access_str = match class { crate::ImageClass::Storage { .. } => "RW", _ => "", }; let dim_str = dim.to_hlsl_str(); let arrayed_str = if arrayed { "Array" } else { "" }; write!(self.out, "{}Texture{}{}", access_str, dim_str, arrayed_str)?; match class { crate::ImageClass::Depth { multi } => { let multi_str = if multi { "MS" } else { "" }; write!(self.out, "{}", multi_str)? } crate::ImageClass::Sampled { kind, multi } => { let multi_str = if multi { "MS" } else { "" }; let scalar_kind_str = kind.to_hlsl_str(4)?; write!(self.out, "{}<{}4>", multi_str, scalar_kind_str)? } crate::ImageClass::Storage { format, .. } => { let storage_format_str = format.to_hlsl_str(); write!(self.out, "<{}>", storage_format_str)? } } Ok(()) } pub(super) fn write_wrapped_array_length_function_name( &mut self, query: WrappedArrayLength, ) -> BackendResult { let access_str = if query.writable { "RW" } else { "" }; write!(self.out, "NagaBufferLength{}", access_str,)?; Ok(()) } /// Helper function that write wrapped function for `Expression::ArrayLength` /// /// pub(super) fn write_wrapped_array_length_function( &mut self, module: &crate::Module, wal: WrappedArrayLength, expr_handle: Handle, func_ctx: &FunctionCtx, ) -> BackendResult { use crate::back::INDENT; const ARGUMENT_VARIABLE_NAME: &str = "buffer"; const RETURN_VARIABLE_NAME: &str = "ret"; // Write function return type and name let ret_ty = func_ctx.info[expr_handle].ty.inner_with(&module.types); self.write_value_type(module, ret_ty)?; write!(self.out, " ")?; self.write_wrapped_array_length_function_name(wal)?; // Write function parameters write!(self.out, "(")?; let access_str = if wal.writable { "RW" } else { "" }; writeln!( self.out, "{}ByteAddressBuffer {})", access_str, ARGUMENT_VARIABLE_NAME )?; // Write function body writeln!(self.out, "{{")?; // Write `GetDimensions` function. writeln!(self.out, "{}uint {};", INDENT, RETURN_VARIABLE_NAME)?; writeln!( self.out, "{}{}.GetDimensions({});", INDENT, ARGUMENT_VARIABLE_NAME, RETURN_VARIABLE_NAME )?; // Write return value writeln!(self.out, "{}return {};", INDENT, RETURN_VARIABLE_NAME)?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_image_query_function_name( &mut self, query: WrappedImageQuery, ) -> BackendResult { let dim_str = query.dim.to_hlsl_str(); let class_str = match query.class { crate::ImageClass::Sampled { multi: true, .. } => "MS", crate::ImageClass::Depth { multi: true } => "DepthMS", crate::ImageClass::Depth { multi: false } => "Depth", crate::ImageClass::Sampled { multi: false, .. } => "", crate::ImageClass::Storage { .. } => "RW", }; let arrayed_str = if query.arrayed { "Array" } else { "" }; let query_str = match query.query { ImageQuery::Size => "Dimensions", ImageQuery::SizeLevel => "MipDimensions", ImageQuery::NumLevels => "NumLevels", ImageQuery::NumLayers => "NumLayers", ImageQuery::NumSamples => "NumSamples", }; write!( self.out, "Naga{}{}{}{}", class_str, query_str, dim_str, arrayed_str )?; Ok(()) } /// Helper function that write wrapped function for `Expression::ImageQuery` /// /// pub(super) fn write_wrapped_image_query_function( &mut self, module: &crate::Module, wiq: WrappedImageQuery, expr_handle: Handle, func_ctx: &FunctionCtx, ) -> BackendResult { use crate::{ back::{COMPONENTS, INDENT}, ImageDimension as IDim, }; const ARGUMENT_VARIABLE_NAME: &str = "tex"; const RETURN_VARIABLE_NAME: &str = "ret"; const MIP_LEVEL_PARAM: &str = "mip_level"; // Write function return type and name let ret_ty = func_ctx.info[expr_handle].ty.inner_with(&module.types); self.write_value_type(module, ret_ty)?; write!(self.out, " ")?; self.write_wrapped_image_query_function_name(wiq)?; // Write function parameters write!(self.out, "(")?; // Texture always first parameter self.write_image_type(wiq.dim, wiq.arrayed, wiq.class)?; write!(self.out, " {}", ARGUMENT_VARIABLE_NAME)?; // Mipmap is a second parameter if exists if let ImageQuery::SizeLevel = wiq.query { write!(self.out, ", uint {}", MIP_LEVEL_PARAM)?; } writeln!(self.out, ")")?; // Write function body writeln!(self.out, "{{")?; let array_coords = if wiq.arrayed { 1 } else { 0 }; // extra parameter is the mip level count or the sample count let extra_coords = match wiq.class { crate::ImageClass::Storage { .. } => 0, crate::ImageClass::Sampled { .. } | crate::ImageClass::Depth { .. } => 1, }; // GetDimensions Overloaded Methods // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-getdimensions#overloaded-methods let (ret_swizzle, number_of_params) = match wiq.query { ImageQuery::Size | ImageQuery::SizeLevel => { let ret = match wiq.dim { IDim::D1 => "x", IDim::D2 => "xy", IDim::D3 => "xyz", IDim::Cube => "xy", }; (ret, ret.len() + array_coords + extra_coords) } ImageQuery::NumLevels | ImageQuery::NumSamples | ImageQuery::NumLayers => { if wiq.arrayed || wiq.dim == IDim::D3 { ("w", 4) } else { ("z", 3) } } }; // Write `GetDimensions` function. writeln!(self.out, "{}uint4 {};", INDENT, RETURN_VARIABLE_NAME)?; write!( self.out, "{}{}.GetDimensions(", INDENT, ARGUMENT_VARIABLE_NAME )?; match wiq.query { ImageQuery::SizeLevel => { write!(self.out, "{}, ", MIP_LEVEL_PARAM)?; } _ => match wiq.class { crate::ImageClass::Sampled { multi: true, .. } | crate::ImageClass::Depth { multi: true } | crate::ImageClass::Storage { .. } => {} _ => { // Write zero mipmap level for supported types write!(self.out, "0, ")?; } }, } for component in COMPONENTS[..number_of_params - 1].iter() { write!(self.out, "{}.{}, ", RETURN_VARIABLE_NAME, component)?; } // write last parameter without comma and space for last parameter write!( self.out, "{}.{}", RETURN_VARIABLE_NAME, COMPONENTS[number_of_params - 1] )?; writeln!(self.out, ");")?; // Write return value writeln!( self.out, "{}return {}.{};", INDENT, RETURN_VARIABLE_NAME, ret_swizzle )?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_constructor_function_name( &mut self, module: &crate::Module, constructor: WrappedConstructor, ) -> BackendResult { let name = module.types[constructor.ty].inner.hlsl_type_id( constructor.ty, &module.types, &module.constants, &self.names, )?; write!(self.out, "Construct{}", name)?; Ok(()) } /// Helper function that write wrapped function for `Expression::Compose` for structures. pub(super) fn write_wrapped_constructor_function( &mut self, module: &crate::Module, constructor: WrappedConstructor, ) -> BackendResult { use crate::back::INDENT; const ARGUMENT_VARIABLE_NAME: &str = "arg"; const RETURN_VARIABLE_NAME: &str = "ret"; // Write function return type and name if let crate::TypeInner::Array { base, size, .. } = module.types[constructor.ty].inner { write!(self.out, "typedef ")?; self.write_type(module, constructor.ty)?; write!(self.out, " ret_")?; self.write_wrapped_constructor_function_name(module, constructor)?; self.write_array_size(module, base, size)?; writeln!(self.out, ";")?; write!(self.out, "ret_")?; self.write_wrapped_constructor_function_name(module, constructor)?; } else { self.write_type(module, constructor.ty)?; } write!(self.out, " ")?; self.write_wrapped_constructor_function_name(module, constructor)?; // Write function parameters write!(self.out, "(")?; let mut write_arg = |i, ty| -> BackendResult { if i != 0 { write!(self.out, ", ")?; } self.write_type(module, ty)?; write!(self.out, " {}{}", ARGUMENT_VARIABLE_NAME, i)?; if let crate::TypeInner::Array { base, size, .. } = module.types[ty].inner { self.write_array_size(module, base, size)?; } Ok(()) }; match module.types[constructor.ty].inner { crate::TypeInner::Struct { ref members, .. } => { for (i, member) in members.iter().enumerate() { write_arg(i, member.ty)?; } } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(size), .. } => { let count = module.constants[size].to_array_length().unwrap(); for i in 0..count as usize { write_arg(i, base)?; } } _ => unreachable!(), }; write!(self.out, ")")?; // Write function body writeln!(self.out, " {{")?; match module.types[constructor.ty].inner { crate::TypeInner::Struct { ref members, .. } => { let struct_name = &self.names[&NameKey::Type(constructor.ty)]; writeln!( self.out, "{}{} {} = ({})0;", INDENT, struct_name, RETURN_VARIABLE_NAME, struct_name )?; for (i, member) in members.iter().enumerate() { let field_name = &self.names[&NameKey::StructMember(constructor.ty, i as u32)]; match module.types[member.ty].inner { crate::TypeInner::Matrix { columns, rows: crate::VectorSize::Bi, .. } if member.binding.is_none() => { for j in 0..columns as u8 { writeln!( self.out, "{}{}.{}_{} = {}{}[{}];", INDENT, RETURN_VARIABLE_NAME, field_name, j, ARGUMENT_VARIABLE_NAME, i, j )?; } } ref other => { // We cast arrays of native HLSL `floatCx2`s to arrays of `matCx2`s // (where the inner matrix is represented by a struct with C `float2` members). // See the module-level block comment in mod.rs for details. if let Some(super::writer::MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = super::writer::get_inner_matrix_data(module, member.ty) { write!( self.out, "{}{}.{} = (__mat{}x2", INDENT, RETURN_VARIABLE_NAME, field_name, columns as u8 )?; if let crate::TypeInner::Array { base, size, .. } = *other { self.write_array_size(module, base, size)?; } writeln!(self.out, "){}{};", ARGUMENT_VARIABLE_NAME, i,)?; } else { writeln!( self.out, "{}{}.{} = {}{};", INDENT, RETURN_VARIABLE_NAME, field_name, ARGUMENT_VARIABLE_NAME, i, )?; } } } } } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(size), .. } => { write!(self.out, "{}", INDENT)?; self.write_type(module, base)?; write!(self.out, " {}", RETURN_VARIABLE_NAME)?; self.write_array_size(module, base, crate::ArraySize::Constant(size))?; write!(self.out, " = {{ ")?; let count = module.constants[size].to_array_length().unwrap(); for i in 0..count { if i != 0 { write!(self.out, ", ")?; } write!(self.out, "{}{}", ARGUMENT_VARIABLE_NAME, i)?; } writeln!(self.out, " }};",)?; } _ => unreachable!(), } // Write return value writeln!(self.out, "{}return {};", INDENT, RETURN_VARIABLE_NAME)?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_struct_matrix_get_function_name( &mut self, access: WrappedStructMatrixAccess, ) -> BackendResult { let name = &self.names[&NameKey::Type(access.ty)]; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; write!(self.out, "GetMat{}On{}", field_name, name)?; Ok(()) } /// Writes a function used to get a matCx2 from within a structure. pub(super) fn write_wrapped_struct_matrix_get_function( &mut self, module: &crate::Module, access: WrappedStructMatrixAccess, ) -> BackendResult { use crate::back::INDENT; const STRUCT_ARGUMENT_VARIABLE_NAME: &str = "obj"; // Write function return type and name let member = match module.types[access.ty].inner { crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize], _ => unreachable!(), }; let ret_ty = &module.types[member.ty].inner; self.write_value_type(module, ret_ty)?; write!(self.out, " ")?; self.write_wrapped_struct_matrix_get_function_name(access)?; // Write function parameters write!(self.out, "(")?; let struct_name = &self.names[&NameKey::Type(access.ty)]; write!( self.out, "{} {}", struct_name, STRUCT_ARGUMENT_VARIABLE_NAME )?; // Write function body writeln!(self.out, ") {{")?; // Write return value write!(self.out, "{}return ", INDENT)?; self.write_value_type(module, ret_ty)?; write!(self.out, "(")?; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; match module.types[member.ty].inner { crate::TypeInner::Matrix { columns, .. } => { for i in 0..columns as u8 { if i != 0 { write!(self.out, ", ")?; } write!( self.out, "{}.{}_{}", STRUCT_ARGUMENT_VARIABLE_NAME, field_name, i )?; } } _ => unreachable!(), } writeln!(self.out, ");")?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_struct_matrix_set_function_name( &mut self, access: WrappedStructMatrixAccess, ) -> BackendResult { let name = &self.names[&NameKey::Type(access.ty)]; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; write!(self.out, "SetMat{}On{}", field_name, name)?; Ok(()) } /// Writes a function used to set a matCx2 from within a structure. pub(super) fn write_wrapped_struct_matrix_set_function( &mut self, module: &crate::Module, access: WrappedStructMatrixAccess, ) -> BackendResult { use crate::back::INDENT; const STRUCT_ARGUMENT_VARIABLE_NAME: &str = "obj"; const MATRIX_ARGUMENT_VARIABLE_NAME: &str = "mat"; // Write function return type and name write!(self.out, "void ")?; self.write_wrapped_struct_matrix_set_function_name(access)?; // Write function parameters write!(self.out, "(")?; let struct_name = &self.names[&NameKey::Type(access.ty)]; write!( self.out, "{} {}, ", struct_name, STRUCT_ARGUMENT_VARIABLE_NAME )?; let member = match module.types[access.ty].inner { crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize], _ => unreachable!(), }; self.write_type(module, member.ty)?; write!(self.out, " {}", MATRIX_ARGUMENT_VARIABLE_NAME)?; // Write function body writeln!(self.out, ") {{")?; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; match module.types[member.ty].inner { crate::TypeInner::Matrix { columns, .. } => { for i in 0..columns as u8 { writeln!( self.out, "{}{}.{}_{} = {}[{}];", INDENT, STRUCT_ARGUMENT_VARIABLE_NAME, field_name, i, MATRIX_ARGUMENT_VARIABLE_NAME, i )?; } } _ => unreachable!(), } // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_struct_matrix_set_vec_function_name( &mut self, access: WrappedStructMatrixAccess, ) -> BackendResult { let name = &self.names[&NameKey::Type(access.ty)]; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; write!(self.out, "SetMatVec{}On{}", field_name, name)?; Ok(()) } /// Writes a function used to set a vec2 on a matCx2 from within a structure. pub(super) fn write_wrapped_struct_matrix_set_vec_function( &mut self, module: &crate::Module, access: WrappedStructMatrixAccess, ) -> BackendResult { use crate::back::INDENT; const STRUCT_ARGUMENT_VARIABLE_NAME: &str = "obj"; const VECTOR_ARGUMENT_VARIABLE_NAME: &str = "vec"; const MATRIX_INDEX_ARGUMENT_VARIABLE_NAME: &str = "mat_idx"; // Write function return type and name write!(self.out, "void ")?; self.write_wrapped_struct_matrix_set_vec_function_name(access)?; // Write function parameters write!(self.out, "(")?; let struct_name = &self.names[&NameKey::Type(access.ty)]; write!( self.out, "{} {}, ", struct_name, STRUCT_ARGUMENT_VARIABLE_NAME )?; let member = match module.types[access.ty].inner { crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize], _ => unreachable!(), }; let vec_ty = match module.types[member.ty].inner { crate::TypeInner::Matrix { rows, width, .. } => crate::TypeInner::Vector { size: rows, kind: crate::ScalarKind::Float, width, }, _ => unreachable!(), }; self.write_value_type(module, &vec_ty)?; write!( self.out, " {}, uint {}", VECTOR_ARGUMENT_VARIABLE_NAME, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME )?; // Write function body writeln!(self.out, ") {{")?; writeln!( self.out, "{}switch({}) {{", INDENT, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME )?; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; match module.types[member.ty].inner { crate::TypeInner::Matrix { columns, .. } => { for i in 0..columns as u8 { writeln!( self.out, "{}case {}: {{ {}.{}_{} = {}; break; }}", INDENT, i, STRUCT_ARGUMENT_VARIABLE_NAME, field_name, i, VECTOR_ARGUMENT_VARIABLE_NAME )?; } } _ => unreachable!(), } writeln!(self.out, "{}}}", INDENT)?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } pub(super) fn write_wrapped_struct_matrix_set_scalar_function_name( &mut self, access: WrappedStructMatrixAccess, ) -> BackendResult { let name = &self.names[&NameKey::Type(access.ty)]; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; write!(self.out, "SetMatScalar{}On{}", field_name, name)?; Ok(()) } /// Writes a function used to set a float on a matCx2 from within a structure. pub(super) fn write_wrapped_struct_matrix_set_scalar_function( &mut self, module: &crate::Module, access: WrappedStructMatrixAccess, ) -> BackendResult { use crate::back::INDENT; const STRUCT_ARGUMENT_VARIABLE_NAME: &str = "obj"; const SCALAR_ARGUMENT_VARIABLE_NAME: &str = "scalar"; const MATRIX_INDEX_ARGUMENT_VARIABLE_NAME: &str = "mat_idx"; const VECTOR_INDEX_ARGUMENT_VARIABLE_NAME: &str = "vec_idx"; // Write function return type and name write!(self.out, "void ")?; self.write_wrapped_struct_matrix_set_scalar_function_name(access)?; // Write function parameters write!(self.out, "(")?; let struct_name = &self.names[&NameKey::Type(access.ty)]; write!( self.out, "{} {}, ", struct_name, STRUCT_ARGUMENT_VARIABLE_NAME )?; let member = match module.types[access.ty].inner { crate::TypeInner::Struct { ref members, .. } => &members[access.index as usize], _ => unreachable!(), }; let scalar_ty = match module.types[member.ty].inner { crate::TypeInner::Matrix { width, .. } => crate::TypeInner::Scalar { kind: crate::ScalarKind::Float, width, }, _ => unreachable!(), }; self.write_value_type(module, &scalar_ty)?; write!( self.out, " {}, uint {}, uint {}", SCALAR_ARGUMENT_VARIABLE_NAME, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME, VECTOR_INDEX_ARGUMENT_VARIABLE_NAME )?; // Write function body writeln!(self.out, ") {{")?; writeln!( self.out, "{}switch({}) {{", INDENT, MATRIX_INDEX_ARGUMENT_VARIABLE_NAME )?; let field_name = &self.names[&NameKey::StructMember(access.ty, access.index)]; match module.types[member.ty].inner { crate::TypeInner::Matrix { columns, .. } => { for i in 0..columns as u8 { writeln!( self.out, "{}case {}: {{ {}.{}_{}[{}] = {}; break; }}", INDENT, i, STRUCT_ARGUMENT_VARIABLE_NAME, field_name, i, VECTOR_INDEX_ARGUMENT_VARIABLE_NAME, SCALAR_ARGUMENT_VARIABLE_NAME )?; } } _ => unreachable!(), } writeln!(self.out, "{}}}", INDENT)?; // End of function body writeln!(self.out, "}}")?; // Write extra new line writeln!(self.out)?; Ok(()) } /// Helper function that write wrapped function for `Expression::ImageQuery` and `Expression::ArrayLength` /// /// pub(super) fn write_wrapped_functions( &mut self, module: &crate::Module, func_ctx: &FunctionCtx, ) -> BackendResult { for (handle, _) in func_ctx.expressions.iter() { match func_ctx.expressions[handle] { crate::Expression::ArrayLength(expr) => { let global_expr = match func_ctx.expressions[expr] { crate::Expression::GlobalVariable(_) => expr, crate::Expression::AccessIndex { base, index: _ } => base, ref other => unreachable!("Array length of {:?}", other), }; let global_var = match func_ctx.expressions[global_expr] { crate::Expression::GlobalVariable(var_handle) => { &module.global_variables[var_handle] } ref other => unreachable!("Array length of base {:?}", other), }; let storage_access = match global_var.space { crate::AddressSpace::Storage { access } => access, _ => crate::StorageAccess::default(), }; let wal = WrappedArrayLength { writable: storage_access.contains(crate::StorageAccess::STORE), }; if !self.wrapped.array_lengths.contains(&wal) { self.write_wrapped_array_length_function(module, wal, handle, func_ctx)?; self.wrapped.array_lengths.insert(wal); } } crate::Expression::ImageQuery { image, query } => { let wiq = match *func_ctx.info[image].ty.inner_with(&module.types) { crate::TypeInner::Image { dim, arrayed, class, } => WrappedImageQuery { dim, arrayed, class, query: query.into(), }, _ => unreachable!("we only query images"), }; if !self.wrapped.image_queries.contains(&wiq) { self.write_wrapped_image_query_function(module, wiq, handle, func_ctx)?; self.wrapped.image_queries.insert(wiq); } } // Write `WrappedConstructor` for structs that are loaded from `AddressSpace::Storage` // since they will later be used by the fn `write_storage_load` crate::Expression::Load { pointer } => { let pointer_space = func_ctx.info[pointer] .ty .inner_with(&module.types) .pointer_space(); if let Some(crate::AddressSpace::Storage { .. }) = pointer_space { if let Some(ty) = func_ctx.info[handle].ty.handle() { write_wrapped_constructor(self, ty, module, func_ctx)?; } } fn write_wrapped_constructor( writer: &mut super::Writer<'_, W>, ty: Handle, module: &crate::Module, func_ctx: &FunctionCtx, ) -> BackendResult { match module.types[ty].inner { crate::TypeInner::Struct { ref members, .. } => { for member in members { write_wrapped_constructor(writer, member.ty, module, func_ctx)?; } let constructor = WrappedConstructor { ty }; if !writer.wrapped.constructors.contains(&constructor) { writer .write_wrapped_constructor_function(module, constructor)?; writer.wrapped.constructors.insert(constructor); } } crate::TypeInner::Array { base, .. } => { write_wrapped_constructor(writer, base, module, func_ctx)?; } _ => {} }; Ok(()) } } crate::Expression::Compose { ty, components: _ } => { let constructor = match module.types[ty].inner { crate::TypeInner::Struct { .. } | crate::TypeInner::Array { .. } => { WrappedConstructor { ty } } _ => continue, }; if !self.wrapped.constructors.contains(&constructor) { self.write_wrapped_constructor_function(module, constructor)?; self.wrapped.constructors.insert(constructor); } } // We treat matrices of the form `matCx2` as a sequence of C `vec2`s // (see top level module docs for details). // // The functions injected here are required to get the matrix accesses working. crate::Expression::AccessIndex { base, index } => { let base_ty_res = &func_ctx.info[base].ty; let mut resolved = base_ty_res.inner_with(&module.types); let base_ty_handle = match *resolved { crate::TypeInner::Pointer { base, .. } => { resolved = &module.types[base].inner; Some(base) } _ => base_ty_res.handle(), }; if let crate::TypeInner::Struct { ref members, .. } = *resolved { let member = &members[index as usize]; match module.types[member.ty].inner { crate::TypeInner::Matrix { rows: crate::VectorSize::Bi, .. } if member.binding.is_none() => { let ty = base_ty_handle.unwrap(); let access = WrappedStructMatrixAccess { ty, index }; if !self.wrapped.struct_matrix_access.contains(&access) { self.write_wrapped_struct_matrix_get_function(module, access)?; self.write_wrapped_struct_matrix_set_function(module, access)?; self.write_wrapped_struct_matrix_set_vec_function( module, access, )?; self.write_wrapped_struct_matrix_set_scalar_function( module, access, )?; self.wrapped.struct_matrix_access.insert(access); } } _ => {} } } } _ => {} }; } Ok(()) } pub(super) fn write_wrapped_constructor_function_for_constant( &mut self, module: &crate::Module, constant: &crate::Constant, ) -> BackendResult { if let crate::ConstantInner::Composite { ty, ref components } = constant.inner { match module.types[ty].inner { crate::TypeInner::Struct { .. } | crate::TypeInner::Array { .. } => { let constructor = WrappedConstructor { ty }; if !self.wrapped.constructors.contains(&constructor) { self.write_wrapped_constructor_function(module, constructor)?; self.wrapped.constructors.insert(constructor); } } _ => {} } for constant in components { self.write_wrapped_constructor_function_for_constant( module, &module.constants[*constant], )?; } } Ok(()) } pub(super) fn write_texture_coordinates( &mut self, kind: &str, coordinate: Handle, array_index: Option>, mip_level: Option>, module: &crate::Module, func_ctx: &FunctionCtx, ) -> BackendResult { // HLSL expects the array index to be merged with the coordinate let extra = array_index.is_some() as usize + (mip_level.is_some()) as usize; if extra == 0 { self.write_expr(module, coordinate, func_ctx)?; } else { let num_coords = match *func_ctx.info[coordinate].ty.inner_with(&module.types) { crate::TypeInner::Scalar { .. } => 1, crate::TypeInner::Vector { size, .. } => size as usize, _ => unreachable!(), }; write!(self.out, "{}{}(", kind, num_coords + extra)?; self.write_expr(module, coordinate, func_ctx)?; if let Some(expr) = array_index { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } if let Some(expr) = mip_level { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } write!(self.out, ")")?; } Ok(()) } pub(super) fn write_mat_cx2_typedef_and_functions( &mut self, WrappedMatCx2 { columns }: WrappedMatCx2, ) -> BackendResult { use crate::back::INDENT; // typedef write!(self.out, "typedef struct {{ ")?; for i in 0..columns as u8 { write!(self.out, "float2 _{}; ", i)?; } writeln!(self.out, "}} __mat{}x2;", columns as u8)?; // __get_col_of_mat writeln!( self.out, "float2 __get_col_of_mat{}x2(__mat{}x2 mat, uint idx) {{", columns as u8, columns as u8 )?; writeln!(self.out, "{}switch(idx) {{", INDENT)?; for i in 0..columns as u8 { writeln!(self.out, "{}case {}: {{ return mat._{}; }}", INDENT, i, i)?; } writeln!(self.out, "{}default: {{ return (float2)0; }}", INDENT)?; writeln!(self.out, "{}}}", INDENT)?; writeln!(self.out, "}}")?; // __set_col_of_mat writeln!( self.out, "void __set_col_of_mat{}x2(__mat{}x2 mat, uint idx, float2 value) {{", columns as u8, columns as u8 )?; writeln!(self.out, "{}switch(idx) {{", INDENT)?; for i in 0..columns as u8 { writeln!( self.out, "{}case {}: {{ mat._{} = value; break; }}", INDENT, i, i )?; } writeln!(self.out, "{}}}", INDENT)?; writeln!(self.out, "}}")?; // __set_el_of_mat writeln!( self.out, "void __set_el_of_mat{}x2(__mat{}x2 mat, uint idx, uint vec_idx, float value) {{", columns as u8, columns as u8 )?; writeln!(self.out, "{}switch(idx) {{", INDENT)?; for i in 0..columns as u8 { writeln!( self.out, "{}case {}: {{ mat._{}[vec_idx] = value; break; }}", INDENT, i, i )?; } writeln!(self.out, "{}}}", INDENT)?; writeln!(self.out, "}}")?; writeln!(self.out)?; Ok(()) } pub(super) fn write_all_mat_cx2_typedefs_and_functions( &mut self, module: &crate::Module, ) -> BackendResult { for (handle, _) in module.global_variables.iter() { let global = &module.global_variables[handle]; if global.space == crate::AddressSpace::Uniform { if let Some(super::writer::MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = super::writer::get_inner_matrix_data(module, global.ty) { let entry = WrappedMatCx2 { columns }; if !self.wrapped.mat_cx2s.contains(&entry) { self.write_mat_cx2_typedef_and_functions(entry)?; self.wrapped.mat_cx2s.insert(entry); } } } } for (_, ty) in module.types.iter() { if let crate::TypeInner::Struct { ref members, .. } = ty.inner { for member in members.iter() { if let crate::TypeInner::Array { .. } = module.types[member.ty].inner { if let Some(super::writer::MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = super::writer::get_inner_matrix_data(module, member.ty) { let entry = WrappedMatCx2 { columns }; if !self.wrapped.mat_cx2s.contains(&entry) { self.write_mat_cx2_typedef_and_functions(entry)?; self.wrapped.mat_cx2s.insert(entry); } } } } } } Ok(()) } } ================================================ FILE: lib/naga/src/back/hlsl/keywords.rs ================================================ /*! HLSL Reserved Words - - */ pub const RESERVED: &[&str] = &[ "AppendStructuredBuffer", "asm", "asm_fragment", "BlendState", "bool", "break", "Buffer", "ByteAddressBuffer", "case", "cbuffer", "centroid", "class", "column_major", "compile", "compile_fragment", "CompileShader", "const", "continue", "ComputeShader", "ConsumeStructuredBuffer", "default", "DepthStencilState", "DepthStencilView", "discard", "do", "double", "DomainShader", "dword", "else", "export", "extern", "false", "float", "for", "fxgroup", "GeometryShader", "groupshared", "half", "Hullshader", "if", "in", "inline", "inout", "InputPatch", "int", "interface", "line", "lineadj", "linear", "LineStream", "matrix", "min16float", "min10float", "min16int", "min12int", "min16uint", "namespace", "nointerpolation", "noperspective", "NULL", "out", "OutputPatch", "packoffset", "pass", "pixelfragment", "PixelShader", "point", "PointStream", "precise", "RasterizerState", "RenderTargetView", "return", "register", "row_major", "RWBuffer", "RWByteAddressBuffer", "RWStructuredBuffer", "RWTexture1D", "RWTexture1DArray", "RWTexture2D", "RWTexture2DArray", "RWTexture3D", "sample", "sampler", "SamplerState", "SamplerComparisonState", "shared", "snorm", "stateblock", "stateblock_state", "static", "string", "struct", "switch", "StructuredBuffer", "tbuffer", "technique", "technique10", "technique11", "texture", "Texture1D", "Texture1DArray", "Texture2D", "Texture2DArray", "Texture2DMS", "Texture2DMSArray", "Texture3D", "TextureCube", "TextureCubeArray", "true", "typedef", "triangle", "triangleadj", "TriangleStream", "uint", "uniform", "unorm", "unsigned", "vector", "vertexfragment", "VertexShader", "void", "volatile", "while", "auto", "case", "catch", "char", "class", "const_cast", "default", "delete", "dynamic_cast", "enum", "explicit", "friend", "goto", "long", "mutable", "new", "operator", "private", "protected", "public", "reinterpret_cast", "short", "signed", "sizeof", "static_cast", "template", "this", "throw", "try", "typename", "union", "unsigned", "using", "virtual", ]; ================================================ FILE: lib/naga/src/back/hlsl/mod.rs ================================================ /*! Backend for [HLSL][hlsl] (High-Level Shading Language). # Supported shader model versions: - 5.0 - 5.1 - 6.0 # Layout of values in `uniform` buffers WGSL's ["Internal Layout of Values"][ilov] rules specify how each WGSL type should be stored in `uniform` and `storage` buffers. The HLSL we generate must access values in that form, even when it is not what HLSL would use normally. The rules described here only apply to WGSL `uniform` variables. WGSL `storage` buffers are translated as HLSL `ByteAddressBuffers`, for which we generate `Load` and `Store` method calls with explicit byte offsets. WGSL pipeline inputs must be scalars or vectors; they cannot be matrices, which is where the interesting problems arise. ## Row- and column-major ordering for matrices WGSL specifies that matrices in uniform buffers are stored in column-major order. This matches HLSL's default, so one might expect things to be straightforward. Unfortunately, WGSL and HLSL disagree on what indexing a matrix means: in WGSL, `m[i]` retrieves the `i`'th *column* of `m`, whereas in HLSL it retrieves the `i`'th *row*. We want to avoid translating `m[i]` into some complicated reassembly of a vector from individually fetched components, so this is a problem. However, with a bit of trickery, it is possible to use HLSL's `m[i]` as the translation of WGSL's `m[i]`: - We declare all matrices in uniform buffers in HLSL with the `row_major` qualifier, and transpose the row and column counts: a WGSL `mat3x4`, say, becomes an HLSL `row_major float3x4`. (Note that WGSL and HLSL type names put the row and column in reverse order.) Since the HLSL type is the transpose of how WebGPU directs the user to store the data, HLSL will load all matrices transposed. - Since matrices are transposed, an HLSL indexing expression retrieves the "columns" of the intended WGSL value, as desired. - For vector-matrix multiplication, since `mul(transpose(m), v)` is equivalent to `mul(v, m)` (note the reversal of the arguments), and `mul(v, transpose(m))` is equivalent to `mul(m, v)`, we can translate WGSL `m * v` and `v * m` to HLSL by simply reversing the arguments to `mul`. ## Padding in two-row matrices An HLSL `row_major floatKx2` matrix has padding between its rows that the WGSL `matKx2` matrix it represents does not. HLSL stores all matrix rows [aligned on 16-byte boundaries][16bb], whereas WGSL says that the columns of a `matKx2` need only be [aligned as required for `vec2`][ilov], which is [eight-byte alignment][8bb]. To compensate for this, any time a `matKx2` appears in a WGSL `uniform` variable, whether directly as the variable's type or as part of a struct/array, we actually emit `K` separate `float2` members, and assemble/disassemble the matrix from its columns (in WGSL; rows in HLSL) upon load and store. For example, the following WGSL struct type: ```ignore struct Baz { m: mat3x2, } ``` is rendered as the HLSL struct type: ```ignore struct Baz { float2 m_0; float2 m_1; float2 m_2; }; ``` The `wrapped_struct_matrix` functions in `help.rs` generate HLSL helper functions to access such members, converting between the stored form and the HLSL matrix types appropriately. For example, for reading the member `m` of the `Baz` struct above, we emit: ```ignore float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); } ``` We also emit an analogous `Set` function, as well as functions for accessing individual columns by dynamic index. [hlsl]: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl [ilov]: https://gpuweb.github.io/gpuweb/wgsl/#internal-value-layout [16bb]: https://github.com/microsoft/DirectXShaderCompiler/wiki/Buffer-Packing#constant-buffer-packing [8bb]: https://gpuweb.github.io/gpuweb/wgsl/#alignment-and-size */ mod conv; mod help; mod keywords; mod storage; mod writer; use std::fmt::Error as FmtError; use thiserror::Error; use crate::proc; #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct BindTarget { pub space: u8, pub register: u32, /// If the binding is an unsized binding array, this overrides the size. pub binding_array_size: Option, } // Using `BTreeMap` instead of `HashMap` so that we can hash itself. pub type BindingMap = std::collections::BTreeMap; /// A HLSL shader model version. #[allow(non_snake_case, non_camel_case_types)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum ShaderModel { V5_0, V5_1, V6_0, } impl ShaderModel { pub const fn to_str(self) -> &'static str { match self { Self::V5_0 => "5_0", Self::V5_1 => "5_1", Self::V6_0 => "6_0", } } } impl crate::ShaderStage { pub const fn to_hlsl_str(self) -> &'static str { match self { Self::Vertex => "vs", Self::Fragment => "ps", Self::Compute => "cs", } } } impl crate::ImageDimension { const fn to_hlsl_str(self) -> &'static str { match self { Self::D1 => "1D", Self::D2 => "2D", Self::D3 => "3D", Self::Cube => "Cube", } } } /// Shorthand result used internally by the backend type BackendResult = Result<(), Error>; #[derive(Clone, Debug, PartialEq, thiserror::Error)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum EntryPointError { #[error("mapping of {0:?} is missing")] MissingBinding(crate::ResourceBinding), } /// Configuration used in the [`Writer`]. #[derive(Clone, Debug, Hash, PartialEq, Eq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Options { /// The hlsl shader model to be used pub shader_model: ShaderModel, /// Map of resources association to binding locations. pub binding_map: BindingMap, /// Don't panic on missing bindings, instead generate any HLSL. pub fake_missing_bindings: bool, /// Add special constants to `SV_VertexIndex` and `SV_InstanceIndex`, /// to make them work like in Vulkan/Metal, with help of the host. pub special_constants_binding: Option, /// Bind target of the push constant buffer pub push_constants_target: Option, } impl Default for Options { fn default() -> Self { Options { shader_model: ShaderModel::V5_1, binding_map: BindingMap::default(), fake_missing_bindings: true, special_constants_binding: None, push_constants_target: None, } } } impl Options { fn resolve_resource_binding( &self, res_binding: &crate::ResourceBinding, ) -> Result { match self.binding_map.get(res_binding) { Some(target) => Ok(target.clone()), None if self.fake_missing_bindings => Ok(BindTarget { space: res_binding.group as u8, register: res_binding.binding, binding_array_size: None, }), None => Err(EntryPointError::MissingBinding(res_binding.clone())), } } } /// Reflection info for entry point names. #[derive(Default)] pub struct ReflectionInfo { /// Mapping of the entry point names. /// /// Each item in the array corresponds to an entry point index. The real entry point name may be different if one of the /// reserved words are used. /// /// Note: Some entry points may fail translation because of missing bindings. pub entry_point_names: Vec>, } #[derive(Error, Debug)] pub enum Error { #[error(transparent)] IoError(#[from] FmtError), #[error("A scalar with an unsupported width was requested: {0:?} {1:?}")] UnsupportedScalar(crate::ScalarKind, crate::Bytes), #[error("{0}")] Unimplemented(String), // TODO: Error used only during development #[error("{0}")] Custom(String), } #[derive(Default)] struct Wrapped { array_lengths: crate::FastHashSet, image_queries: crate::FastHashSet, constructors: crate::FastHashSet, struct_matrix_access: crate::FastHashSet, mat_cx2s: crate::FastHashSet, } impl Wrapped { fn clear(&mut self) { self.array_lengths.clear(); self.image_queries.clear(); self.constructors.clear(); self.struct_matrix_access.clear(); self.mat_cx2s.clear(); } } pub struct Writer<'a, W> { out: W, names: crate::FastHashMap, namer: proc::Namer, /// HLSL backend options options: &'a Options, /// Information about entry point arguments and result types. entry_point_io: Vec, /// Set of expressions that have associated temporary variables named_expressions: crate::NamedExpressions, wrapped: Wrapped, temp_access_chain: Vec, } ================================================ FILE: lib/naga/src/back/hlsl/storage.rs ================================================ /*! Logic related to `ByteAddressBuffer` operations. HLSL backend uses byte address buffers for all storage buffers in IR. */ use super::{super::FunctionCtx, BackendResult, Error}; use crate::{ proc::{Alignment, NameKey, TypeResolution}, Handle, }; use std::{fmt, mem}; const STORE_TEMP_NAME: &str = "_value"; #[derive(Debug)] pub(super) enum SubAccess { Offset(u32), Index { value: Handle, stride: u32, }, } pub(super) enum StoreValue { Expression(Handle), TempIndex { depth: usize, index: u32, ty: TypeResolution, }, TempAccess { depth: usize, base: Handle, member_index: u32, }, } impl super::Writer<'_, W> { pub(super) fn write_storage_address( &mut self, module: &crate::Module, chain: &[SubAccess], func_ctx: &FunctionCtx, ) -> BackendResult { if chain.is_empty() { write!(self.out, "0")?; } for (i, access) in chain.iter().enumerate() { if i != 0 { write!(self.out, "+")?; } match *access { SubAccess::Offset(offset) => { write!(self.out, "{}", offset)?; } SubAccess::Index { value, stride } => { self.write_expr(module, value, func_ctx)?; write!(self.out, "*{}", stride)?; } } } Ok(()) } fn write_storage_load_sequence>( &mut self, module: &crate::Module, var_handle: Handle, sequence: I, func_ctx: &FunctionCtx, ) -> BackendResult { for (i, (ty_resolution, offset)) in sequence.enumerate() { // add the index temporarily self.temp_access_chain.push(SubAccess::Offset(offset)); if i != 0 { write!(self.out, ", ")?; }; self.write_storage_load(module, var_handle, ty_resolution, func_ctx)?; self.temp_access_chain.pop(); } Ok(()) } /// Helper function to write down the Load operation on a `ByteAddressBuffer`. pub(super) fn write_storage_load( &mut self, module: &crate::Module, var_handle: Handle, result_ty: TypeResolution, func_ctx: &FunctionCtx, ) -> BackendResult { match *result_ty.inner_with(&module.types) { crate::TypeInner::Scalar { kind, width: _ } => { // working around the borrow checker in `self.write_expr` let chain = mem::take(&mut self.temp_access_chain); let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; let cast = kind.to_hlsl_cast(); write!(self.out, "{}({}.Load(", cast, var_name)?; self.write_storage_address(module, &chain, func_ctx)?; write!(self.out, "))")?; self.temp_access_chain = chain; } crate::TypeInner::Vector { size, kind, width: _, } => { // working around the borrow checker in `self.write_expr` let chain = mem::take(&mut self.temp_access_chain); let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; let cast = kind.to_hlsl_cast(); write!(self.out, "{}({}.Load{}(", cast, var_name, size as u8)?; self.write_storage_address(module, &chain, func_ctx)?; write!(self.out, "))")?; self.temp_access_chain = chain; } crate::TypeInner::Matrix { columns, rows, width, } => { write!( self.out, "{}{}x{}(", crate::ScalarKind::Float.to_hlsl_str(width)?, columns as u8, rows as u8, )?; // Note: Matrices containing vec3s, due to padding, act like they contain vec4s. let row_stride = Alignment::from(rows) * width as u32; let iter = (0..columns as u32).map(|i| { let ty_inner = crate::TypeInner::Vector { size: rows, kind: crate::ScalarKind::Float, width, }; (TypeResolution::Value(ty_inner), i * row_stride) }); self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?; write!(self.out, ")")?; } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(const_handle), .. } => { write!(self.out, "{{")?; let count = module.constants[const_handle].to_array_length().unwrap(); let stride = module.types[base].inner.size(&module.constants); let iter = (0..count).map(|i| (TypeResolution::Handle(base), stride * i)); self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?; write!(self.out, "}}")?; } crate::TypeInner::Struct { ref members, .. } => { let constructor = super::help::WrappedConstructor { ty: result_ty.handle().unwrap(), }; self.write_wrapped_constructor_function_name(module, constructor)?; write!(self.out, "(")?; let iter = members .iter() .map(|m| (TypeResolution::Handle(m.ty), m.offset)); self.write_storage_load_sequence(module, var_handle, iter, func_ctx)?; write!(self.out, ")")?; } _ => unreachable!(), } Ok(()) } fn write_store_value( &mut self, module: &crate::Module, value: &StoreValue, func_ctx: &FunctionCtx, ) -> BackendResult { match *value { StoreValue::Expression(expr) => self.write_expr(module, expr, func_ctx)?, StoreValue::TempIndex { depth, index, ty: _, } => write!(self.out, "{}{}[{}]", STORE_TEMP_NAME, depth, index)?, StoreValue::TempAccess { depth, base, member_index, } => { let name = &self.names[&NameKey::StructMember(base, member_index)]; write!(self.out, "{}{}.{}", STORE_TEMP_NAME, depth, name)? } } Ok(()) } /// Helper function to write down the Store operation on a `ByteAddressBuffer`. pub(super) fn write_storage_store( &mut self, module: &crate::Module, var_handle: Handle, value: StoreValue, func_ctx: &FunctionCtx, level: crate::back::Level, ) -> BackendResult { let temp_resolution; let ty_resolution = match value { StoreValue::Expression(expr) => &func_ctx.info[expr].ty, StoreValue::TempIndex { depth: _, index: _, ref ty, } => ty, StoreValue::TempAccess { depth: _, base, member_index, } => { let ty_handle = match module.types[base].inner { crate::TypeInner::Struct { ref members, .. } => { members[member_index as usize].ty } _ => unreachable!(), }; temp_resolution = TypeResolution::Handle(ty_handle); &temp_resolution } }; match *ty_resolution.inner_with(&module.types) { crate::TypeInner::Scalar { .. } => { // working around the borrow checker in `self.write_expr` let chain = mem::take(&mut self.temp_access_chain); let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; write!(self.out, "{}{}.Store(", level, var_name)?; self.write_storage_address(module, &chain, func_ctx)?; write!(self.out, ", asuint(")?; self.write_store_value(module, &value, func_ctx)?; writeln!(self.out, "));")?; self.temp_access_chain = chain; } crate::TypeInner::Vector { size, .. } => { // working around the borrow checker in `self.write_expr` let chain = mem::take(&mut self.temp_access_chain); let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; write!(self.out, "{}{}.Store{}(", level, var_name, size as u8)?; self.write_storage_address(module, &chain, func_ctx)?; write!(self.out, ", asuint(")?; self.write_store_value(module, &value, func_ctx)?; writeln!(self.out, "));")?; self.temp_access_chain = chain; } crate::TypeInner::Matrix { columns, rows, width, } => { // first, assign the value to a temporary writeln!(self.out, "{}{{", level)?; let depth = level.0 + 1; write!( self.out, "{}{}{}x{} {}{} = ", level.next(), crate::ScalarKind::Float.to_hlsl_str(width)?, columns as u8, rows as u8, STORE_TEMP_NAME, depth, )?; self.write_store_value(module, &value, func_ctx)?; writeln!(self.out, ";")?; // Note: Matrices containing vec3s, due to padding, act like they contain vec4s. let row_stride = Alignment::from(rows) * width as u32; // then iterate the stores for i in 0..columns as u32 { self.temp_access_chain .push(SubAccess::Offset(i * row_stride)); let ty_inner = crate::TypeInner::Vector { size: rows, kind: crate::ScalarKind::Float, width, }; let sv = StoreValue::TempIndex { depth, index: i, ty: TypeResolution::Value(ty_inner), }; self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?; self.temp_access_chain.pop(); } // done writeln!(self.out, "{}}}", level)?; } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(const_handle), .. } => { // first, assign the value to a temporary writeln!(self.out, "{}{{", level)?; write!(self.out, "{}", level.next())?; self.write_value_type(module, &module.types[base].inner)?; let depth = level.next().0; write!(self.out, " {}{}", STORE_TEMP_NAME, depth)?; self.write_array_size(module, base, crate::ArraySize::Constant(const_handle))?; write!(self.out, " = ")?; self.write_store_value(module, &value, func_ctx)?; writeln!(self.out, ";")?; // then iterate the stores let count = module.constants[const_handle].to_array_length().unwrap(); let stride = module.types[base].inner.size(&module.constants); for i in 0..count { self.temp_access_chain.push(SubAccess::Offset(i * stride)); let sv = StoreValue::TempIndex { depth, index: i, ty: TypeResolution::Handle(base), }; self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?; self.temp_access_chain.pop(); } // done writeln!(self.out, "{}}}", level)?; } crate::TypeInner::Struct { ref members, .. } => { // first, assign the value to a temporary writeln!(self.out, "{}{{", level)?; let depth = level.next().0; let struct_ty = ty_resolution.handle().unwrap(); let struct_name = &self.names[&NameKey::Type(struct_ty)]; write!( self.out, "{}{} {}{} = ", level.next(), struct_name, STORE_TEMP_NAME, depth )?; self.write_store_value(module, &value, func_ctx)?; writeln!(self.out, ";")?; // then iterate the stores for (i, member) in members.iter().enumerate() { self.temp_access_chain .push(SubAccess::Offset(member.offset)); let sv = StoreValue::TempAccess { depth, base: struct_ty, member_index: i as u32, }; self.write_storage_store(module, var_handle, sv, func_ctx, level.next())?; self.temp_access_chain.pop(); } // done writeln!(self.out, "{}}}", level)?; } _ => unreachable!(), } Ok(()) } pub(super) fn fill_access_chain( &mut self, module: &crate::Module, mut cur_expr: Handle, func_ctx: &FunctionCtx, ) -> Result, Error> { enum AccessIndex { Expression(Handle), Constant(u32), } enum Parent<'a> { Array { stride: u32 }, Struct(&'a [crate::StructMember]), } self.temp_access_chain.clear(); loop { let (next_expr, access_index) = match func_ctx.expressions[cur_expr] { crate::Expression::GlobalVariable(handle) => return Ok(handle), crate::Expression::Access { base, index } => (base, AccessIndex::Expression(index)), crate::Expression::AccessIndex { base, index } => { (base, AccessIndex::Constant(index)) } ref other => { return Err(Error::Unimplemented(format!( "Pointer access of {:?}", other ))) } }; let parent = match *func_ctx.info[next_expr].ty.inner_with(&module.types) { crate::TypeInner::Pointer { base, .. } => match module.types[base].inner { crate::TypeInner::Struct { ref members, .. } => Parent::Struct(members), crate::TypeInner::Array { stride, .. } => Parent::Array { stride }, crate::TypeInner::Vector { width, .. } => Parent::Array { stride: width as u32, }, crate::TypeInner::Matrix { columns, width, .. } => Parent::Array { stride: Alignment::from(columns) * width as u32, }, _ => unreachable!(), }, crate::TypeInner::ValuePointer { width, .. } => Parent::Array { stride: width as u32, }, _ => unreachable!(), }; let sub = match (parent, access_index) { (Parent::Array { stride }, AccessIndex::Expression(value)) => { SubAccess::Index { value, stride } } (Parent::Array { stride }, AccessIndex::Constant(index)) => { SubAccess::Offset(stride * index) } (Parent::Struct(members), AccessIndex::Constant(index)) => { SubAccess::Offset(members[index as usize].offset) } (Parent::Struct(_), AccessIndex::Expression(_)) => unreachable!(), }; self.temp_access_chain.push(sub); cur_expr = next_expr; } } } ================================================ FILE: lib/naga/src/back/hlsl/writer.rs ================================================ use super::{ help::{WrappedArrayLength, WrappedConstructor, WrappedImageQuery, WrappedStructMatrixAccess}, storage::StoreValue, BackendResult, Error, Options, }; use crate::{ back, proc::{self, NameKey}, valid, Handle, Module, ScalarKind, ShaderStage, TypeInner, }; use std::{fmt, mem}; const LOCATION_SEMANTIC: &str = "LOC"; const SPECIAL_CBUF_TYPE: &str = "NagaConstants"; const SPECIAL_CBUF_VAR: &str = "_NagaConstants"; const SPECIAL_BASE_VERTEX: &str = "base_vertex"; const SPECIAL_BASE_INSTANCE: &str = "base_instance"; const SPECIAL_OTHER: &str = "other"; struct EpStructMember { name: String, ty: Handle, // technically, this should always be `Some` binding: Option, index: u32, } /// Structure contains information required for generating /// wrapped structure of all entry points arguments struct EntryPointBinding { /// Name of the fake EP argument that contains the struct /// with all the flattened input data. arg_name: String, /// Generated structure name ty_name: String, /// Members of generated structure members: Vec, } pub(super) struct EntryPointInterface { /// If `Some`, the input of an entry point is gathered in a special /// struct with members sorted by binding. /// The `EntryPointBinding::members` array is sorted by index, /// so that we can walk it in `write_ep_arguments_initialization`. input: Option, /// If `Some`, the output of an entry point is flattened. /// The `EntryPointBinding::members` array is sorted by binding, /// So that we can walk it in `Statement::Return` handler. output: Option, } #[derive(Clone, Eq, PartialEq, PartialOrd, Ord)] enum InterfaceKey { Location(u32), BuiltIn(crate::BuiltIn), Other, } impl InterfaceKey { const fn new(binding: Option<&crate::Binding>) -> Self { match binding { Some(&crate::Binding::Location { location, .. }) => Self::Location(location), Some(&crate::Binding::BuiltIn(built_in)) => Self::BuiltIn(built_in), None => Self::Other, } } } #[derive(Copy, Clone, PartialEq)] enum Io { Input, Output, } impl<'a, W: fmt::Write> super::Writer<'a, W> { pub fn new(out: W, options: &'a Options) -> Self { Self { out, names: crate::FastHashMap::default(), namer: proc::Namer::default(), options, entry_point_io: Vec::new(), named_expressions: crate::NamedExpressions::default(), wrapped: super::Wrapped::default(), temp_access_chain: Vec::new(), } } fn reset(&mut self, module: &Module) { self.names.clear(); self.namer .reset(module, super::keywords::RESERVED, &[], &mut self.names); self.entry_point_io.clear(); self.named_expressions.clear(); self.wrapped.clear(); } pub fn write( &mut self, module: &Module, module_info: &valid::ModuleInfo, ) -> Result { self.reset(module); // Write special constants, if needed if let Some(ref bt) = self.options.special_constants_binding { writeln!(self.out, "struct {} {{", SPECIAL_CBUF_TYPE)?; writeln!(self.out, "{}int {};", back::INDENT, SPECIAL_BASE_VERTEX)?; writeln!(self.out, "{}int {};", back::INDENT, SPECIAL_BASE_INSTANCE)?; writeln!(self.out, "{}uint {};", back::INDENT, SPECIAL_OTHER)?; writeln!(self.out, "}};")?; write!( self.out, "ConstantBuffer<{}> {}: register(b{}", SPECIAL_CBUF_TYPE, SPECIAL_CBUF_VAR, bt.register )?; if bt.space != 0 { write!(self.out, ", space{}", bt.space)?; } writeln!(self.out, ");")?; } // Write all constants // For example, input wgsl shader: // ```wgsl // let c_scale: f32 = 1.2; // return VertexOutput(uv, vec4(c_scale * pos, 0.0, 1.0)); // ``` // // Output shader: // ```hlsl // static const float c_scale = 1.2; // const VertexOutput vertexoutput1 = { vertexinput.uv3, float4((c_scale * vertexinput.pos1), 0.0, 1.0) }; // ``` // // If we remove `write_global_constant` `c_scale` will be inlined. for (handle, constant) in module.constants.iter() { if constant.name.is_some() { self.write_global_constant(module, &constant.inner, handle)?; } } // Extra newline for readability writeln!(self.out)?; // Save all entry point output types let ep_results = module .entry_points .iter() .map(|ep| (ep.stage, ep.function.result.clone())) .collect::)>>(); self.write_all_mat_cx2_typedefs_and_functions(module)?; // Write all structs for (handle, ty) in module.types.iter() { if let TypeInner::Struct { ref members, span } = ty.inner { if module.types[members.last().unwrap().ty] .inner .is_dynamically_sized(&module.types) { // unsized arrays can only be in storage buffers, // for which we use `ByteAddressBuffer` anyway. continue; } let ep_result = ep_results.iter().find(|e| { if let Some(ref result) = e.1 { result.ty == handle } else { false } }); self.write_struct( module, handle, members, span, ep_result.map(|r| (r.0, Io::Output)), )?; writeln!(self.out)?; } } // Write wrapped constructor functions used in constants for (_, constant) in module.constants.iter() { self.write_wrapped_constructor_function_for_constant(module, constant)?; } // Write all globals for (ty, _) in module.global_variables.iter() { self.write_global(module, ty)?; } if !module.global_variables.is_empty() { // Add extra newline for readability writeln!(self.out)?; } // Write all entry points wrapped structs for (index, ep) in module.entry_points.iter().enumerate() { let ep_name = self.names[&NameKey::EntryPoint(index as u16)].clone(); let ep_io = self.write_ep_interface(module, &ep.function, ep.stage, &ep_name)?; self.entry_point_io.push(ep_io); } // Write all regular functions for (handle, function) in module.functions.iter() { let info = &module_info[handle]; // Check if all of the globals are accessible if !self.options.fake_missing_bindings { if let Some((var_handle, _)) = module .global_variables .iter() .find(|&(var_handle, var)| match var.binding { Some(ref binding) if !info[var_handle].is_empty() => { self.options.resolve_resource_binding(binding).is_err() } _ => false, }) { log::info!( "Skipping function {:?} (name {:?}) because global {:?} is inaccessible", handle, function.name, var_handle ); continue; } } let ctx = back::FunctionCtx { ty: back::FunctionType::Function(handle), info, expressions: &function.expressions, named_expressions: &function.named_expressions, }; let name = self.names[&NameKey::Function(handle)].clone(); // Write wrapped function for `Expression::ImageQuery` and `Expressions::ArrayLength` // before writing all statements and expressions. self.write_wrapped_functions(module, &ctx)?; self.write_function(module, name.as_str(), function, &ctx)?; writeln!(self.out)?; } let mut entry_point_names = Vec::with_capacity(module.entry_points.len()); // Write all entry points for (index, ep) in module.entry_points.iter().enumerate() { let info = module_info.get_entry_point(index); if !self.options.fake_missing_bindings { let mut ep_error = None; for (var_handle, var) in module.global_variables.iter() { match var.binding { Some(ref binding) if !info[var_handle].is_empty() => { if let Err(err) = self.options.resolve_resource_binding(binding) { ep_error = Some(err); break; } } _ => {} } } if let Some(err) = ep_error { entry_point_names.push(Err(err)); continue; } } let ctx = back::FunctionCtx { ty: back::FunctionType::EntryPoint(index as u16), info, expressions: &ep.function.expressions, named_expressions: &ep.function.named_expressions, }; // Write wrapped function for `Expression::ImageQuery` and `Expressions::ArrayLength` // before writing all statements and expressions. self.write_wrapped_functions(module, &ctx)?; if ep.stage == ShaderStage::Compute { // HLSL is calling workgroup size "num threads" let num_threads = ep.workgroup_size; writeln!( self.out, "[numthreads({}, {}, {})]", num_threads[0], num_threads[1], num_threads[2] )?; } let name = self.names[&NameKey::EntryPoint(index as u16)].clone(); self.write_function(module, &name, &ep.function, &ctx)?; if index < module.entry_points.len() - 1 { writeln!(self.out)?; } entry_point_names.push(Ok(name)); } Ok(super::ReflectionInfo { entry_point_names }) } fn write_modifier(&mut self, binding: &crate::Binding) -> BackendResult { match *binding { crate::Binding::BuiltIn(crate::BuiltIn::Position { invariant: true }) => { write!(self.out, "precise ")?; } crate::Binding::Location { interpolation, sampling, .. } => { if let Some(interpolation) = interpolation { if let Some(string) = interpolation.to_hlsl_str() { write!(self.out, "{} ", string)? } } if let Some(sampling) = sampling { if let Some(string) = sampling.to_hlsl_str() { write!(self.out, "{} ", string)? } } } _ => {} } Ok(()) } //TODO: we could force fragment outputs to always go through `entry_point_io.output` path // if they are struct, so that the `stage` argument here could be omitted. fn write_semantic( &mut self, binding: &crate::Binding, stage: Option<(ShaderStage, Io)>, ) -> BackendResult { match *binding { crate::Binding::BuiltIn(builtin) => { let builtin_str = builtin.to_hlsl_str()?; write!(self.out, " : {}", builtin_str)?; } crate::Binding::Location { location, .. } => { if stage == Some((crate::ShaderStage::Fragment, Io::Output)) { write!(self.out, " : SV_Target{}", location)?; } else { write!(self.out, " : {}{}", LOCATION_SEMANTIC, location)?; } } } Ok(()) } fn write_interface_struct( &mut self, module: &Module, shader_stage: (ShaderStage, Io), struct_name: String, mut members: Vec, ) -> Result { // Sort the members so that first come the user-defined varyings // in ascending locations, and then built-ins. This allows VS and FS // interfaces to match with regards to order. members.sort_by_key(|m| InterfaceKey::new(m.binding.as_ref())); write!(self.out, "struct {}", struct_name)?; writeln!(self.out, " {{")?; for m in members.iter() { write!(self.out, "{}", back::INDENT)?; if let Some(ref binding) = m.binding { self.write_modifier(binding)?; } self.write_type(module, m.ty)?; write!(self.out, " {}", &m.name)?; if let Some(ref binding) = m.binding { self.write_semantic(binding, Some(shader_stage))?; } writeln!(self.out, ";")?; } writeln!(self.out, "}};")?; writeln!(self.out)?; match shader_stage.1 { Io::Input => { // bring back the original order members.sort_by_key(|m| m.index); } Io::Output => { // keep it sorted by binding } } Ok(EntryPointBinding { arg_name: self.namer.call(struct_name.to_lowercase().as_str()), ty_name: struct_name, members, }) } /// Flatten all entry point arguments into a single struct. /// This is needed since we need to re-order them: first placing user locations, /// then built-ins. fn write_ep_input_struct( &mut self, module: &Module, func: &crate::Function, stage: ShaderStage, entry_point_name: &str, ) -> Result { let struct_name = format!("{:?}Input_{}", stage, entry_point_name); let mut fake_members = Vec::new(); for arg in func.arguments.iter() { match module.types[arg.ty].inner { TypeInner::Struct { ref members, .. } => { for member in members.iter() { let name = self.namer.call_or(&member.name, "member"); let index = fake_members.len() as u32; fake_members.push(EpStructMember { name, ty: member.ty, binding: member.binding.clone(), index, }); } } _ => { let member_name = self.namer.call_or(&arg.name, "member"); let index = fake_members.len() as u32; fake_members.push(EpStructMember { name: member_name, ty: arg.ty, binding: arg.binding.clone(), index, }); } } } self.write_interface_struct(module, (stage, Io::Input), struct_name, fake_members) } /// Flatten all entry point results into a single struct. /// This is needed since we need to re-order them: first placing user locations, /// then built-ins. fn write_ep_output_struct( &mut self, module: &Module, result: &crate::FunctionResult, stage: ShaderStage, entry_point_name: &str, ) -> Result { let struct_name = format!("{:?}Output_{}", stage, entry_point_name); let mut fake_members = Vec::new(); let empty = []; let members = match module.types[result.ty].inner { TypeInner::Struct { ref members, .. } => members, ref other => { log::error!("Unexpected {:?} output type without a binding", other); &empty[..] } }; for member in members.iter() { let member_name = self.namer.call_or(&member.name, "member"); let index = fake_members.len() as u32; fake_members.push(EpStructMember { name: member_name, ty: member.ty, binding: member.binding.clone(), index, }); } self.write_interface_struct(module, (stage, Io::Output), struct_name, fake_members) } /// Writes special interface structures for an entry point. The special structures have /// all the fields flattened into them and sorted by binding. They are only needed for /// VS outputs and FS inputs, so that these interfaces match. fn write_ep_interface( &mut self, module: &Module, func: &crate::Function, stage: ShaderStage, ep_name: &str, ) -> Result { Ok(EntryPointInterface { input: if !func.arguments.is_empty() && stage == ShaderStage::Fragment { Some(self.write_ep_input_struct(module, func, stage, ep_name)?) } else { None }, output: match func.result { Some(ref fr) if fr.binding.is_none() && stage == ShaderStage::Vertex => { Some(self.write_ep_output_struct(module, fr, stage, ep_name)?) } _ => None, }, }) } /// Write an entry point preface that initializes the arguments as specified in IR. fn write_ep_arguments_initialization( &mut self, module: &Module, func: &crate::Function, ep_index: u16, ) -> BackendResult { let ep_input = match self.entry_point_io[ep_index as usize].input.take() { Some(ep_input) => ep_input, None => return Ok(()), }; let mut fake_iter = ep_input.members.iter(); for (arg_index, arg) in func.arguments.iter().enumerate() { write!(self.out, "{}", back::INDENT)?; self.write_type(module, arg.ty)?; let arg_name = &self.names[&NameKey::EntryPointArgument(ep_index, arg_index as u32)]; write!(self.out, " {}", arg_name)?; match module.types[arg.ty].inner { TypeInner::Array { base, size, .. } => { self.write_array_size(module, base, size)?; let fake_member = fake_iter.next().unwrap(); writeln!(self.out, " = {}.{};", ep_input.arg_name, fake_member.name)?; } TypeInner::Struct { ref members, .. } => { write!(self.out, " = {{ ")?; for index in 0..members.len() { if index != 0 { write!(self.out, ", ")?; } let fake_member = fake_iter.next().unwrap(); write!(self.out, "{}.{}", ep_input.arg_name, fake_member.name)?; } writeln!(self.out, " }};")?; } _ => { let fake_member = fake_iter.next().unwrap(); writeln!(self.out, " = {}.{};", ep_input.arg_name, fake_member.name)?; } } } assert!(fake_iter.next().is_none()); Ok(()) } /// Helper method used to write global variables /// # Notes /// Always adds a newline fn write_global( &mut self, module: &Module, handle: Handle, ) -> BackendResult { let global = &module.global_variables[handle]; let inner = &module.types[global.ty].inner; if let Some(ref binding) = global.binding { if let Err(err) = self.options.resolve_resource_binding(binding) { log::info!( "Skipping global {:?} (name {:?}) for being inaccessible: {}", handle, global.name, err, ); return Ok(()); } } // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-variable-register let register_ty = match global.space { crate::AddressSpace::Function => unreachable!("Function address space"), crate::AddressSpace::Private => { write!(self.out, "static ")?; self.write_type(module, global.ty)?; "" } crate::AddressSpace::WorkGroup => { write!(self.out, "groupshared ")?; self.write_type(module, global.ty)?; "" } crate::AddressSpace::Uniform => { // constant buffer declarations are expected to be inlined, e.g. // `cbuffer foo: register(b0) { field1: type1; }` write!(self.out, "cbuffer")?; "b" } crate::AddressSpace::Storage { access } => { let (prefix, register) = if access.contains(crate::StorageAccess::STORE) { ("RW", "u") } else { ("", "t") }; write!(self.out, "{}ByteAddressBuffer", prefix)?; register } crate::AddressSpace::Handle => { let handle_ty = match *inner { TypeInner::BindingArray { ref base, .. } => &module.types[*base].inner, _ => inner, }; let register = match *handle_ty { TypeInner::Sampler { .. } => "s", // all storage textures are UAV, unconditionally TypeInner::Image { class: crate::ImageClass::Storage { .. }, .. } => "u", _ => "t", }; self.write_type(module, global.ty)?; register } crate::AddressSpace::PushConstant => { // The type of the push constants will be wrapped in `ConstantBuffer` write!(self.out, "ConstantBuffer<")?; "b" } }; // If the global is a push constant write the type now because it will be a // generic argument to `ConstantBuffer` if global.space == crate::AddressSpace::PushConstant { self.write_global_type(module, global.ty)?; // need to write the array size if the type was emitted with `write_type` if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner { self.write_array_size(module, base, size)?; } // Close the angled brackets for the generic argument write!(self.out, ">")?; } let name = &self.names[&NameKey::GlobalVariable(handle)]; write!(self.out, " {}", name)?; // Push constants need to be assigned a binding explicitly by the consumer // since naga has no way to know the binding from the shader alone if global.space == crate::AddressSpace::PushConstant { let target = self .options .push_constants_target .as_ref() .expect("No bind target was defined for the push constants block"); write!(self.out, ": register(b{}", target.register)?; if target.space != 0 { write!(self.out, ", space{}", target.space)?; } write!(self.out, ")")?; } if let Some(ref binding) = global.binding { // this was already resolved earlier when we started evaluating an entry point. let bt = self.options.resolve_resource_binding(binding).unwrap(); // need to write the binding array size if the type was emitted with `write_type` if let TypeInner::BindingArray { base, size, .. } = module.types[global.ty].inner { if let Some(overridden_size) = bt.binding_array_size { write!(self.out, "[{}]", overridden_size)?; } else { self.write_array_size(module, base, size)?; } } write!(self.out, " : register({}{}", register_ty, bt.register)?; if bt.space != 0 { write!(self.out, ", space{}", bt.space)?; } write!(self.out, ")")?; } else { // need to write the array size if the type was emitted with `write_type` if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner { self.write_array_size(module, base, size)?; } if global.space == crate::AddressSpace::Private { write!(self.out, " = ")?; if let Some(init) = global.init { self.write_constant(module, init)?; } else { self.write_default_init(module, global.ty)?; } } } if global.space == crate::AddressSpace::Uniform { write!(self.out, " {{ ")?; self.write_global_type(module, global.ty)?; write!( self.out, " {}", &self.names[&NameKey::GlobalVariable(handle)] )?; // need to write the array size if the type was emitted with `write_type` if let TypeInner::Array { base, size, .. } = module.types[global.ty].inner { self.write_array_size(module, base, size)?; } writeln!(self.out, "; }}")?; } else { writeln!(self.out, ";")?; } Ok(()) } /// Helper method used to write global constants /// /// # Notes /// Ends in a newline fn write_global_constant( &mut self, module: &Module, inner: &crate::ConstantInner, handle: Handle, ) -> BackendResult { write!(self.out, "static const ")?; match *inner { crate::ConstantInner::Scalar { width: _, ref value, } => { // Write type let ty_str = match *value { crate::ScalarValue::Sint(_) => "int", crate::ScalarValue::Uint(_) => "uint", crate::ScalarValue::Float(_) => "float", crate::ScalarValue::Bool(_) => "bool", }; let name = &self.names[&NameKey::Constant(handle)]; write!(self.out, "{} {} = ", ty_str, name)?; // Second match required to avoid heap allocation by `format!()` match *value { crate::ScalarValue::Sint(value) => write!(self.out, "{}", value)?, crate::ScalarValue::Uint(value) => write!(self.out, "{}", value)?, crate::ScalarValue::Float(value) => { // Floats are written using `Debug` instead of `Display` because it always appends the // decimal part even it's zero write!(self.out, "{:?}", value)? } crate::ScalarValue::Bool(value) => write!(self.out, "{}", value)?, }; } crate::ConstantInner::Composite { ty, ref components } => { self.write_type(module, ty)?; let name = &self.names[&NameKey::Constant(handle)]; write!(self.out, " {} = ", name)?; self.write_composite_constant(module, ty, components)?; } } writeln!(self.out, ";")?; Ok(()) } pub(super) fn write_array_size( &mut self, module: &Module, base: Handle, size: crate::ArraySize, ) -> BackendResult { write!(self.out, "[")?; // Write the array size // Writes nothing if `ArraySize::Dynamic` // Panics if `ArraySize::Constant` has a constant that isn't an sint or uint match size { crate::ArraySize::Constant(const_handle) => { let size = module.constants[const_handle].to_array_length().unwrap(); write!(self.out, "{}", size)?; } crate::ArraySize::Dynamic => {} } write!(self.out, "]")?; if let TypeInner::Array { base: next_base, size: next_size, .. } = module.types[base].inner { self.write_array_size(module, next_base, next_size)?; } Ok(()) } /// Helper method used to write structs /// /// # Notes /// Ends in a newline fn write_struct( &mut self, module: &Module, handle: Handle, members: &[crate::StructMember], span: u32, shader_stage: Option<(ShaderStage, Io)>, ) -> BackendResult { // Write struct name let struct_name = &self.names[&NameKey::Type(handle)]; writeln!(self.out, "struct {} {{", struct_name)?; let mut last_offset = 0; for (index, member) in members.iter().enumerate() { if member.binding.is_none() && member.offset > last_offset { // using int as padding should work as long as the backend // doesn't support a type that's less than 4 bytes in size // (Error::UnsupportedScalar catches this) let padding = (member.offset - last_offset) / 4; for i in 0..padding { writeln!(self.out, "{}int _pad{}_{};", back::INDENT, index, i)?; } } let ty_inner = &module.types[member.ty].inner; last_offset = member.offset + ty_inner .try_size_hlsl(&module.types, &module.constants) .unwrap(); // The indentation is only for readability write!(self.out, "{}", back::INDENT)?; match module.types[member.ty].inner { TypeInner::Array { base, size, .. } => { // HLSL arrays are written as `type name[size]` self.write_global_type(module, member.ty)?; // Write `name` write!( self.out, " {}", &self.names[&NameKey::StructMember(handle, index as u32)] )?; // Write [size] self.write_array_size(module, base, size)?; } // We treat matrices of the form `matCx2` as a sequence of C `vec2`s. // See the module-level block comment in mod.rs for details. TypeInner::Matrix { rows, columns, width, } if member.binding.is_none() && rows == crate::VectorSize::Bi => { let vec_ty = crate::TypeInner::Vector { size: rows, kind: crate::ScalarKind::Float, width, }; let field_name_key = NameKey::StructMember(handle, index as u32); for i in 0..columns as u8 { if i != 0 { write!(self.out, "; ")?; } self.write_value_type(module, &vec_ty)?; write!(self.out, " {}_{}", &self.names[&field_name_key], i)?; } } _ => { // Write modifier before type if let Some(ref binding) = member.binding { self.write_modifier(binding)?; } // Even though Naga IR matrices are column-major, we must describe // matrices passed from the CPU as being in row-major order. // See the module-level block comment in mod.rs for details. if let TypeInner::Matrix { .. } = module.types[member.ty].inner { write!(self.out, "row_major ")?; } // Write the member type and name self.write_type(module, member.ty)?; write!( self.out, " {}", &self.names[&NameKey::StructMember(handle, index as u32)] )?; } } if let Some(ref binding) = member.binding { self.write_semantic(binding, shader_stage)?; }; writeln!(self.out, ";")?; } // add padding at the end since sizes of types don't get rounded up to their alignment in HLSL if members.last().unwrap().binding.is_none() && span > last_offset { let padding = (span - last_offset) / 4; for i in 0..padding { writeln!(self.out, "{}int _end_pad_{};", back::INDENT, i)?; } } writeln!(self.out, "}};")?; Ok(()) } /// Helper method used to write global/structs non image/sampler types /// /// # Notes /// Adds no trailing or leading whitespace pub(super) fn write_global_type( &mut self, module: &Module, ty: Handle, ) -> BackendResult { let matrix_data = get_inner_matrix_data(module, ty); // We treat matrices of the form `matCx2` as a sequence of C `vec2`s. // See the module-level block comment in mod.rs for details. if let Some(MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = matrix_data { write!(self.out, "__mat{}x2", columns as u8)?; } else { // Even though Naga IR matrices are column-major, we must describe // matrices passed from the CPU as being in row-major order. // See the module-level block comment in mod.rs for details. if matrix_data.is_some() { write!(self.out, "row_major ")?; } self.write_type(module, ty)?; } Ok(()) } /// Helper method used to write non image/sampler types /// /// # Notes /// Adds no trailing or leading whitespace pub(super) fn write_type(&mut self, module: &Module, ty: Handle) -> BackendResult { let inner = &module.types[ty].inner; match *inner { TypeInner::Struct { .. } => write!(self.out, "{}", self.names[&NameKey::Type(ty)])?, // hlsl array has the size separated from the base type TypeInner::Array { base, .. } | TypeInner::BindingArray { base, .. } => { self.write_type(module, base)? } ref other => self.write_value_type(module, other)?, } Ok(()) } /// Helper method used to write value types /// /// # Notes /// Adds no trailing or leading whitespace pub(super) fn write_value_type(&mut self, module: &Module, inner: &TypeInner) -> BackendResult { match *inner { TypeInner::Scalar { kind, width } | TypeInner::Atomic { kind, width } => { write!(self.out, "{}", kind.to_hlsl_str(width)?)?; } TypeInner::Vector { size, kind, width } => { write!( self.out, "{}{}", kind.to_hlsl_str(width)?, back::vector_size_str(size) )?; } TypeInner::Matrix { columns, rows, width, } => { // The IR supports only float matrix // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-matrix // Because of the implicit transpose all matrices have in HLSL, we need to transpose the size as well. write!( self.out, "{}{}x{}", crate::ScalarKind::Float.to_hlsl_str(width)?, back::vector_size_str(columns), back::vector_size_str(rows), )?; } TypeInner::Image { dim, arrayed, class, } => { self.write_image_type(dim, arrayed, class)?; } TypeInner::Sampler { comparison } => { let sampler = if comparison { "SamplerComparisonState" } else { "SamplerState" }; write!(self.out, "{}", sampler)?; } // HLSL arrays are written as `type name[size]` // Current code is written arrays only as `[size]` // Base `type` and `name` should be written outside TypeInner::Array { base, size, .. } | TypeInner::BindingArray { base, size } => { self.write_array_size(module, base, size)?; } _ => { return Err(Error::Unimplemented(format!( "write_value_type {:?}", inner ))) } } Ok(()) } /// Helper method used to write functions /// # Notes /// Ends in a newline fn write_function( &mut self, module: &Module, name: &str, func: &crate::Function, func_ctx: &back::FunctionCtx<'_>, ) -> BackendResult { // Function Declaration Syntax - https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-function-syntax // Write modifier if let Some(crate::FunctionResult { binding: Some( ref binding @ crate::Binding::BuiltIn(crate::BuiltIn::Position { invariant: true, }), ), .. }) = func.result { self.write_modifier(binding)?; } // Write return type if let Some(ref result) = func.result { match func_ctx.ty { back::FunctionType::Function(_) => { self.write_type(module, result.ty)?; } back::FunctionType::EntryPoint(index) => { if let Some(ref ep_output) = self.entry_point_io[index as usize].output { write!(self.out, "{}", ep_output.ty_name)?; } else { self.write_type(module, result.ty)?; } } } } else { write!(self.out, "void")?; } // Write function name write!(self.out, " {}(", name)?; // Write function arguments for non entry point functions match func_ctx.ty { back::FunctionType::Function(handle) => { for (index, arg) in func.arguments.iter().enumerate() { if index != 0 { write!(self.out, ", ")?; } // Write argument type let arg_ty = match module.types[arg.ty].inner { // pointers in function arguments are expected and resolve to `inout` TypeInner::Pointer { base, .. } => { //TODO: can we narrow this down to just `in` when possible? write!(self.out, "inout ")?; base } _ => arg.ty, }; self.write_type(module, arg_ty)?; let argument_name = &self.names[&NameKey::FunctionArgument(handle, index as u32)]; // Write argument name. Space is important. write!(self.out, " {}", argument_name)?; if let TypeInner::Array { base, size, .. } = module.types[arg.ty].inner { self.write_array_size(module, base, size)?; } } } back::FunctionType::EntryPoint(ep_index) => { if let Some(ref ep_input) = self.entry_point_io[ep_index as usize].input { write!(self.out, "{} {}", ep_input.ty_name, ep_input.arg_name,)?; } else { let stage = module.entry_points[ep_index as usize].stage; for (index, arg) in func.arguments.iter().enumerate() { if index != 0 { write!(self.out, ", ")?; } self.write_type(module, arg.ty)?; let argument_name = &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)]; write!(self.out, " {}", argument_name)?; if let TypeInner::Array { base, size, .. } = module.types[arg.ty].inner { self.write_array_size(module, base, size)?; } if let Some(ref binding) = arg.binding { self.write_semantic(binding, Some((stage, Io::Input)))?; } } } } } // Ends of arguments write!(self.out, ")")?; // Write semantic if it present if let back::FunctionType::EntryPoint(index) = func_ctx.ty { let stage = module.entry_points[index as usize].stage; if let Some(crate::FunctionResult { binding: Some(ref binding), .. }) = func.result { self.write_semantic(binding, Some((stage, Io::Output)))?; } } // Function body start writeln!(self.out)?; writeln!(self.out, "{{")?; if let back::FunctionType::EntryPoint(index) = func_ctx.ty { self.write_ep_arguments_initialization(module, func, index)?; } // Write function local variables for (handle, local) in func.local_variables.iter() { // Write indentation (only for readability) write!(self.out, "{}", back::INDENT)?; // Write the local name // The leading space is important self.write_type(module, local.ty)?; write!(self.out, " {}", self.names[&func_ctx.name_key(handle)])?; // Write size for array type if let TypeInner::Array { base, size, .. } = module.types[local.ty].inner { self.write_array_size(module, base, size)?; } write!(self.out, " = ")?; // Write the local initializer if needed if let Some(init) = local.init { // Put the equal signal only if there's a initializer // The leading and trailing spaces aren't needed but help with readability // Write the constant // `write_constant` adds no trailing or leading space/newline self.write_constant(module, init)?; } else { // Zero initialize local variables self.write_default_init(module, local.ty)?; } // Finish the local with `;` and add a newline (only for readability) writeln!(self.out, ";")? } if !func.local_variables.is_empty() { writeln!(self.out)?; } // Write the function body (statement list) for sta in func.body.iter() { // The indentation should always be 1 when writing the function body self.write_stmt(module, sta, func_ctx, back::Level(1))?; } writeln!(self.out, "}}")?; self.named_expressions.clear(); Ok(()) } /// Helper method used to write statements /// /// # Notes /// Always adds a newline fn write_stmt( &mut self, module: &Module, stmt: &crate::Statement, func_ctx: &back::FunctionCtx<'_>, level: back::Level, ) -> BackendResult { use crate::Statement; match *stmt { Statement::Emit(ref range) => { for handle in range.clone() { let info = &func_ctx.info[handle]; let ptr_class = info.ty.inner_with(&module.types).pointer_space(); let expr_name = if ptr_class.is_some() { // HLSL can't save a pointer-valued expression in a variable, // but we shouldn't ever need to: they should never be named expressions, // and none of the expression types flagged by bake_ref_count can be pointer-valued. None } else if let Some(name) = func_ctx.named_expressions.get(&handle) { // Front end provides names for all variables at the start of writing. // But we write them to step by step. We need to recache them // Otherwise, we could accidentally write variable name instead of full expression. // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords. Some(self.namer.call(name)) } else if info.ref_count == 0 { Some(self.namer.call("")) } else { let min_ref_count = func_ctx.expressions[handle].bake_ref_count(); if min_ref_count <= info.ref_count { Some(format!("_expr{}", handle.index())) } else { None } }; if let Some(name) = expr_name { write!(self.out, "{}", level)?; self.write_named_expr(module, handle, name, func_ctx)?; } } } // TODO: copy-paste from glsl-out Statement::Block(ref block) => { write!(self.out, "{}", level)?; writeln!(self.out, "{{")?; for sta in block.iter() { // Increase the indentation to help with readability self.write_stmt(module, sta, func_ctx, level.next())? } writeln!(self.out, "{}}}", level)? } // TODO: copy-paste from glsl-out Statement::If { condition, ref accept, ref reject, } => { write!(self.out, "{}", level)?; write!(self.out, "if (")?; self.write_expr(module, condition, func_ctx)?; writeln!(self.out, ") {{")?; let l2 = level.next(); for sta in accept { // Increase indentation to help with readability self.write_stmt(module, sta, func_ctx, l2)?; } // If there are no statements in the reject block we skip writing it // This is only for readability if !reject.is_empty() { writeln!(self.out, "{}}} else {{", level)?; for sta in reject { // Increase indentation to help with readability self.write_stmt(module, sta, func_ctx, l2)?; } } writeln!(self.out, "{}}}", level)? } // TODO: copy-paste from glsl-out Statement::Kill => writeln!(self.out, "{}discard;", level)?, Statement::Return { value: None } => { writeln!(self.out, "{}return;", level)?; } Statement::Return { value: Some(expr) } => { let base_ty_res = &func_ctx.info[expr].ty; let mut resolved = base_ty_res.inner_with(&module.types); if let TypeInner::Pointer { base, space: _ } = *resolved { resolved = &module.types[base].inner; } if let TypeInner::Struct { .. } = *resolved { // We can safely unwrap here, since we now we working with struct let ty = base_ty_res.handle().unwrap(); let struct_name = &self.names[&NameKey::Type(ty)]; let variable_name = self.namer.call(&struct_name.to_lowercase()); write!( self.out, "{}const {} {} = ", level, struct_name, variable_name, )?; self.write_expr(module, expr, func_ctx)?; writeln!(self.out, ";")?; // for entry point returns, we may need to reshuffle the outputs into a different struct let ep_output = match func_ctx.ty { back::FunctionType::Function(_) => None, back::FunctionType::EntryPoint(index) => { self.entry_point_io[index as usize].output.as_ref() } }; let final_name = match ep_output { Some(ep_output) => { let final_name = self.namer.call(&variable_name); write!( self.out, "{}const {} {} = {{ ", level, ep_output.ty_name, final_name, )?; for (index, m) in ep_output.members.iter().enumerate() { if index != 0 { write!(self.out, ", ")?; } let member_name = &self.names[&NameKey::StructMember(ty, m.index)]; write!(self.out, "{}.{}", variable_name, member_name)?; } writeln!(self.out, " }};")?; final_name } None => variable_name, }; writeln!(self.out, "{}return {};", level, final_name)?; } else { write!(self.out, "{}return ", level)?; self.write_expr(module, expr, func_ctx)?; writeln!(self.out, ";")? } } Statement::Store { pointer, value } => { let ty_inner = func_ctx.info[pointer].ty.inner_with(&module.types); if let Some(crate::AddressSpace::Storage { .. }) = ty_inner.pointer_space() { let var_handle = self.fill_access_chain(module, pointer, func_ctx)?; self.write_storage_store( module, var_handle, StoreValue::Expression(value), func_ctx, level, )?; } else { // We treat matrices of the form `matCx2` as a sequence of C `vec2`s. // See the module-level block comment in mod.rs for details. // // We handle matrix Stores here directly (including sub accesses for Vectors and Scalars). // Loads are handled by `Expression::AccessIndex` (since sub accesses work fine for Loads). struct MatrixAccess { base: Handle, index: u32, } enum Index { Expression(Handle), Static(u32), } let get_members = |expr: Handle| { let base_ty_res = &func_ctx.info[expr].ty; let resolved = base_ty_res.inner_with(&module.types); match *resolved { TypeInner::Pointer { base, .. } => match module.types[base].inner { TypeInner::Struct { ref members, .. } => Some(members), _ => None, }, _ => None, } }; let mut matrix = None; let mut vector = None; let mut scalar = None; let mut current_expr = pointer; for _ in 0..3 { let resolved = func_ctx.info[current_expr].ty.inner_with(&module.types); match (resolved, &func_ctx.expressions[current_expr]) { ( &TypeInner::Pointer { base: ty, .. }, &crate::Expression::AccessIndex { base, index }, ) if matches!( module.types[ty].inner, TypeInner::Matrix { rows: crate::VectorSize::Bi, .. } ) && get_members(base) .map(|members| members[index as usize].binding.is_none()) == Some(true) => { matrix = Some(MatrixAccess { base, index }); break; } ( &TypeInner::ValuePointer { size: Some(crate::VectorSize::Bi), .. }, &crate::Expression::Access { base, index }, ) => { vector = Some(Index::Expression(index)); current_expr = base; } ( &TypeInner::ValuePointer { size: Some(crate::VectorSize::Bi), .. }, &crate::Expression::AccessIndex { base, index }, ) => { vector = Some(Index::Static(index)); current_expr = base; } ( &TypeInner::ValuePointer { size: None, .. }, &crate::Expression::Access { base, index }, ) => { scalar = Some(Index::Expression(index)); current_expr = base; } ( &TypeInner::ValuePointer { size: None, .. }, &crate::Expression::AccessIndex { base, index }, ) => { scalar = Some(Index::Static(index)); current_expr = base; } _ => break, } } write!(self.out, "{}", level)?; if let Some(MatrixAccess { index, base }) = matrix { let base_ty_res = &func_ctx.info[base].ty; let resolved = base_ty_res.inner_with(&module.types); let ty = match *resolved { TypeInner::Pointer { base, .. } => base, _ => base_ty_res.handle().unwrap(), }; if let Some(Index::Static(vec_index)) = vector { self.write_expr(module, base, func_ctx)?; write!( self.out, ".{}_{}", &self.names[&NameKey::StructMember(ty, index)], vec_index )?; if let Some(scalar_index) = scalar { write!(self.out, "[")?; match scalar_index { Index::Static(index) => { write!(self.out, "{}", index)?; } Index::Expression(index) => { self.write_expr(module, index, func_ctx)?; } } write!(self.out, "]")?; } write!(self.out, " = ")?; self.write_expr(module, value, func_ctx)?; writeln!(self.out, ";")?; } else { let access = WrappedStructMatrixAccess { ty, index }; match (&vector, &scalar) { (&Some(_), &Some(_)) => { self.write_wrapped_struct_matrix_set_scalar_function_name( access, )?; } (&Some(_), &None) => { self.write_wrapped_struct_matrix_set_vec_function_name(access)?; } (&None, _) => { self.write_wrapped_struct_matrix_set_function_name(access)?; } } write!(self.out, "(")?; self.write_expr(module, base, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, value, func_ctx)?; if let Some(Index::Expression(vec_index)) = vector { write!(self.out, ", ")?; self.write_expr(module, vec_index, func_ctx)?; if let Some(scalar_index) = scalar { write!(self.out, ", ")?; match scalar_index { Index::Static(index) => { write!(self.out, "{}", index)?; } Index::Expression(index) => { self.write_expr(module, index, func_ctx)?; } } } } writeln!(self.out, ");")?; } } else { // We handle `Store`s to __matCx2 column vectors and scalar elements via // the previously injected functions __set_col_of_matCx2 / __set_el_of_matCx2. struct MatrixData { columns: crate::VectorSize, base: Handle, } enum Index { Expression(Handle), Static(u32), } let mut matrix = None; let mut vector = None; let mut scalar = None; let mut current_expr = pointer; for _ in 0..3 { let resolved = func_ctx.info[current_expr].ty.inner_with(&module.types); match (resolved, &func_ctx.expressions[current_expr]) { ( &TypeInner::ValuePointer { size: Some(crate::VectorSize::Bi), .. }, &crate::Expression::Access { base, index }, ) => { vector = Some(index); current_expr = base; } ( &TypeInner::ValuePointer { size: None, .. }, &crate::Expression::Access { base, index }, ) => { scalar = Some(Index::Expression(index)); current_expr = base; } ( &TypeInner::ValuePointer { size: None, .. }, &crate::Expression::AccessIndex { base, index }, ) => { scalar = Some(Index::Static(index)); current_expr = base; } _ => { if let Some(MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = get_inner_matrix_of_struct_array_member( module, current_expr, func_ctx, true, ) { matrix = Some(MatrixData { columns, base: current_expr, }); } break; } } } if let (Some(MatrixData { columns, base }), Some(vec_index)) = (matrix, vector) { if scalar.is_some() { write!(self.out, "__set_el_of_mat{}x2", columns as u8)?; } else { write!(self.out, "__set_col_of_mat{}x2", columns as u8)?; } write!(self.out, "(")?; self.write_expr(module, base, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, vec_index, func_ctx)?; if let Some(scalar_index) = scalar { write!(self.out, ", ")?; match scalar_index { Index::Static(index) => { write!(self.out, "{}", index)?; } Index::Expression(index) => { self.write_expr(module, index, func_ctx)?; } } } write!(self.out, ", ")?; self.write_expr(module, value, func_ctx)?; writeln!(self.out, ");")?; } else { self.write_expr(module, pointer, func_ctx)?; write!(self.out, " = ")?; // We cast the RHS of this store in cases where the LHS // is a struct member with type: // - matCx2 or // - a (possibly nested) array of matCx2's if let Some(MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = get_inner_matrix_of_struct_array_member( module, pointer, func_ctx, false, ) { let mut resolved = func_ctx.info[pointer].ty.inner_with(&module.types); if let TypeInner::Pointer { base, .. } = *resolved { resolved = &module.types[base].inner; } write!(self.out, "(__mat{}x2", columns as u8)?; if let TypeInner::Array { base, size, .. } = *resolved { self.write_array_size(module, base, size)?; } write!(self.out, ")")?; } self.write_expr(module, value, func_ctx)?; writeln!(self.out, ";")? } } } } Statement::Loop { ref body, ref continuing, break_if, } => { let l2 = level.next(); if !continuing.is_empty() || break_if.is_some() { let gate_name = self.namer.call("loop_init"); writeln!(self.out, "{}bool {} = true;", level, gate_name)?; writeln!(self.out, "{}while(true) {{", level)?; writeln!(self.out, "{}if (!{}) {{", l2, gate_name)?; let l3 = l2.next(); for sta in continuing.iter() { self.write_stmt(module, sta, func_ctx, l3)?; } if let Some(condition) = break_if { write!(self.out, "{}if (", l3)?; self.write_expr(module, condition, func_ctx)?; writeln!(self.out, ") {{")?; writeln!(self.out, "{}break;", l3.next())?; writeln!(self.out, "{}}}", l3)?; } writeln!(self.out, "{}}}", l2)?; writeln!(self.out, "{}{} = false;", l2, gate_name)?; } else { writeln!(self.out, "{}while(true) {{", level)?; } for sta in body.iter() { self.write_stmt(module, sta, func_ctx, l2)?; } writeln!(self.out, "{}}}", level)? } Statement::Break => writeln!(self.out, "{}break;", level)?, Statement::Continue => writeln!(self.out, "{}continue;", level)?, Statement::Barrier(barrier) => { if barrier.contains(crate::Barrier::STORAGE) { writeln!(self.out, "{}DeviceMemoryBarrierWithGroupSync();", level)?; } if barrier.contains(crate::Barrier::WORK_GROUP) { writeln!(self.out, "{}GroupMemoryBarrierWithGroupSync();", level)?; } } Statement::ImageStore { image, coordinate, array_index, value, } => { write!(self.out, "{}", level)?; self.write_expr(module, image, func_ctx)?; write!(self.out, "[")?; if let Some(index) = array_index { // Array index accepted only for texture_storage_2d_array, so we can safety use int3(coordinate, array_index) here write!(self.out, "int3(")?; self.write_expr(module, coordinate, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, index, func_ctx)?; write!(self.out, ")")?; } else { self.write_expr(module, coordinate, func_ctx)?; } write!(self.out, "]")?; write!(self.out, " = ")?; self.write_expr(module, value, func_ctx)?; writeln!(self.out, ";")?; } Statement::Call { function, ref arguments, result, } => { write!(self.out, "{}", level)?; if let Some(expr) = result { write!(self.out, "const ")?; let name = format!("{}{}", back::BAKE_PREFIX, expr.index()); let expr_ty = &func_ctx.info[expr].ty; match *expr_ty { proc::TypeResolution::Handle(handle) => self.write_type(module, handle)?, proc::TypeResolution::Value(ref value) => { self.write_value_type(module, value)? } }; write!(self.out, " {} = ", name)?; self.named_expressions.insert(expr, name); } let func_name = &self.names[&NameKey::Function(function)]; write!(self.out, "{}(", func_name)?; for (index, argument) in arguments.iter().enumerate() { self.write_expr(module, *argument, func_ctx)?; // Only write a comma if isn't the last element if index != arguments.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } writeln!(self.out, ");")? } Statement::Atomic { pointer, ref fun, value, result, } => { write!(self.out, "{}", level)?; let res_name = format!("{}{}", back::BAKE_PREFIX, result.index()); match func_ctx.info[result].ty { proc::TypeResolution::Handle(handle) => self.write_type(module, handle)?, proc::TypeResolution::Value(ref value) => { self.write_value_type(module, value)? } }; let var_handle = self.fill_access_chain(module, pointer, func_ctx)?; // working around the borrow checker in `self.write_expr` let chain = mem::take(&mut self.temp_access_chain); let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; let fun_str = fun.to_hlsl_suffix(); write!( self.out, " {}; {}.Interlocked{}(", res_name, var_name, fun_str )?; self.write_storage_address(module, &chain, func_ctx)?; write!(self.out, ", ")?; // handle the special cases match *fun { crate::AtomicFunction::Subtract => { // we just wrote `InterlockedAdd`, so negate the argument write!(self.out, "-")?; } crate::AtomicFunction::Exchange { compare: Some(_) } => { return Err(Error::Unimplemented("atomic CompareExchange".to_string())); } _ => {} } self.write_expr(module, value, func_ctx)?; writeln!(self.out, ", {});", res_name)?; self.temp_access_chain = chain; self.named_expressions.insert(result, res_name); } Statement::Switch { selector, ref cases, } => { // Start the switch write!(self.out, "{}", level)?; write!(self.out, "switch(")?; self.write_expr(module, selector, func_ctx)?; writeln!(self.out, ") {{")?; let type_postfix = match *func_ctx.info[selector].ty.inner_with(&module.types) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, .. } => "u", _ => "", }; // Write all cases let indent_level_1 = level.next(); let indent_level_2 = indent_level_1.next(); for (i, case) in cases.iter().enumerate() { match case.value { crate::SwitchValue::Integer(value) => writeln!( self.out, "{}case {}{}: {{", indent_level_1, value, type_postfix )?, crate::SwitchValue::Default => { writeln!(self.out, "{}default: {{", indent_level_1)? } } // FXC doesn't support fallthrough so we duplicate the body of the following case blocks if case.fall_through { let curr_len = i + 1; let end_case_idx = curr_len + cases .iter() .skip(curr_len) .position(|case| !case.fall_through) .unwrap(); let indent_level_3 = indent_level_2.next(); for case in &cases[i..=end_case_idx] { writeln!(self.out, "{}{{", indent_level_2)?; for sta in case.body.iter() { self.write_stmt(module, sta, func_ctx, indent_level_3)?; } writeln!(self.out, "{}}}", indent_level_2)?; } let last_case = &cases[end_case_idx]; if last_case.body.last().map_or(true, |s| !s.is_terminator()) { writeln!(self.out, "{}break;", indent_level_2)?; } } else { for sta in case.body.iter() { self.write_stmt(module, sta, func_ctx, indent_level_2)?; } if case.body.last().map_or(true, |s| !s.is_terminator()) { writeln!(self.out, "{}break;", indent_level_2)?; } } writeln!(self.out, "{}}}", indent_level_1)?; } writeln!(self.out, "{}}}", level)? } } Ok(()) } /// Helper method to write expressions /// /// # Notes /// Doesn't add any newlines or leading/trailing spaces pub(super) fn write_expr( &mut self, module: &Module, expr: Handle, func_ctx: &back::FunctionCtx<'_>, ) -> BackendResult { use crate::Expression; // Handle the special semantics for base vertex/instance let ff_input = if self.options.special_constants_binding.is_some() { func_ctx.is_fixed_function_input(expr, module) } else { None }; let closing_bracket = match ff_input { Some(crate::BuiltIn::VertexIndex) => { write!(self.out, "({}.{} + ", SPECIAL_CBUF_VAR, SPECIAL_BASE_VERTEX)?; ")" } Some(crate::BuiltIn::InstanceIndex) => { write!( self.out, "({}.{} + ", SPECIAL_CBUF_VAR, SPECIAL_BASE_INSTANCE, )?; ")" } Some(crate::BuiltIn::NumWorkGroups) => { //Note: despite their names (`BASE_VERTEX` and `BASE_INSTANCE`), // in compute shaders the special constants contain the number // of workgroups, which we are using here. write!( self.out, "uint3({}.{}, {}.{}, {}.{})", SPECIAL_CBUF_VAR, SPECIAL_BASE_VERTEX, SPECIAL_CBUF_VAR, SPECIAL_BASE_INSTANCE, SPECIAL_CBUF_VAR, SPECIAL_OTHER, )?; return Ok(()); } _ => "", }; if let Some(name) = self.named_expressions.get(&expr) { write!(self.out, "{}{}", name, closing_bracket)?; return Ok(()); } let expression = &func_ctx.expressions[expr]; match *expression { Expression::Constant(constant) => self.write_constant(module, constant)?, Expression::Compose { ty, ref components } => { match module.types[ty].inner { TypeInner::Struct { .. } | TypeInner::Array { .. } => { self.write_wrapped_constructor_function_name( module, WrappedConstructor { ty }, )?; } _ => { self.write_type(module, ty)?; } }; write!(self.out, "(")?; for (index, &component) in components.iter().enumerate() { if index != 0 { // The leading space is for readability only write!(self.out, ", ")?; } self.write_expr(module, component, func_ctx)?; } write!(self.out, ")")?; } // All of the multiplication can be expressed as `mul`, // except vector * vector, which needs to use the "*" operator. Expression::Binary { op: crate::BinaryOperator::Multiply, left, right, } if func_ctx.info[left].ty.inner_with(&module.types).is_matrix() || func_ctx.info[right] .ty .inner_with(&module.types) .is_matrix() => { // We intentionally flip the order of multiplication as our matrices are implicitly transposed. write!(self.out, "mul(")?; self.write_expr(module, right, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, left, func_ctx)?; write!(self.out, ")")?; } // TODO: handle undefined behavior of BinaryOperator::Modulo // // sint: // if right == 0 return 0 // if left == min(type_of(left)) && right == -1 return 0 // if sign(left) != sign(right) return result as defined by WGSL // // uint: // if right == 0 return 0 // // float: // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798 // While HLSL supports float operands with the % operator it is only // defined in cases where both sides are either positive or negative. Expression::Binary { op: crate::BinaryOperator::Modulo, left, right, } if func_ctx.info[left] .ty .inner_with(&module.types) .scalar_kind() == Some(crate::ScalarKind::Float) => { write!(self.out, "fmod(")?; self.write_expr(module, left, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, right, func_ctx)?; write!(self.out, ")")?; } Expression::Binary { op, left, right } => { write!(self.out, "(")?; self.write_expr(module, left, func_ctx)?; write!(self.out, " {} ", crate::back::binary_operation_str(op))?; self.write_expr(module, right, func_ctx)?; write!(self.out, ")")?; } Expression::Access { base, index } => { if let Some(crate::AddressSpace::Storage { .. }) = func_ctx.info[expr] .ty .inner_with(&module.types) .pointer_space() { // do nothing, the chain is written on `Load`/`Store` } else { // We use the function __get_col_of_matCx2 here in cases // where `base`s type resolves to a matCx2 and is part of a // struct member with type of (possibly nested) array of matCx2's. // // Note that this only works for `Load`s and we handle // `Store`s differently in `Statement::Store`. if let Some(MatrixType { columns, rows: crate::VectorSize::Bi, width: 4, }) = get_inner_matrix_of_struct_array_member(module, base, func_ctx, true) { write!(self.out, "__get_col_of_mat{}x2(", columns as u8)?; self.write_expr(module, base, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, index, func_ctx)?; write!(self.out, ")")?; return Ok(()); } let base_ty_res = &func_ctx.info[base].ty; let resolved = base_ty_res.inner_with(&module.types); let non_uniform_qualifier = match *resolved { TypeInner::BindingArray { .. } => { let uniformity = &func_ctx.info[index].uniformity; uniformity.non_uniform_result.is_some() } _ => false, }; self.write_expr(module, base, func_ctx)?; write!(self.out, "[")?; if non_uniform_qualifier { write!(self.out, "NonUniformResourceIndex(")?; } self.write_expr(module, index, func_ctx)?; if non_uniform_qualifier { write!(self.out, ")")?; } write!(self.out, "]")?; } } Expression::AccessIndex { base, index } => { if let Some(crate::AddressSpace::Storage { .. }) = func_ctx.info[expr] .ty .inner_with(&module.types) .pointer_space() { // do nothing, the chain is written on `Load`/`Store` } else { fn write_access( writer: &mut super::Writer<'_, W>, resolved: &TypeInner, base_ty_handle: Option>, index: u32, ) -> BackendResult { match *resolved { TypeInner::Vector { .. } => { // Write vector access as a swizzle write!(writer.out, ".{}", back::COMPONENTS[index as usize])? } TypeInner::Matrix { .. } | TypeInner::Array { .. } | TypeInner::BindingArray { .. } | TypeInner::ValuePointer { .. } => write!(writer.out, "[{}]", index)?, TypeInner::Struct { .. } => { // This will never panic in case the type is a `Struct`, this is not true // for other types so we can only check while inside this match arm let ty = base_ty_handle.unwrap(); write!( writer.out, ".{}", &writer.names[&NameKey::StructMember(ty, index)] )? } ref other => { return Err(Error::Custom(format!("Cannot index {:?}", other))) } } Ok(()) } // We write the matrix column access in a special way since // the type of `base` is our special __matCx2 struct. if let Some(MatrixType { rows: crate::VectorSize::Bi, width: 4, .. }) = get_inner_matrix_of_struct_array_member(module, base, func_ctx, true) { self.write_expr(module, base, func_ctx)?; write!(self.out, "._{}", index)?; return Ok(()); } let base_ty_res = &func_ctx.info[base].ty; let mut resolved = base_ty_res.inner_with(&module.types); let base_ty_handle = match *resolved { TypeInner::Pointer { base, .. } => { resolved = &module.types[base].inner; Some(base) } _ => base_ty_res.handle(), }; // We treat matrices of the form `matCx2` as a sequence of C `vec2`s. // See the module-level block comment in mod.rs for details. // // We handle matrix reconstruction here for Loads. // Stores are handled directly by `Statement::Store`. if let TypeInner::Struct { ref members, .. } = *resolved { let member = &members[index as usize]; match module.types[member.ty].inner { TypeInner::Matrix { rows: crate::VectorSize::Bi, .. } if member.binding.is_none() => { let ty = base_ty_handle.unwrap(); self.write_wrapped_struct_matrix_get_function_name( WrappedStructMatrixAccess { ty, index }, )?; write!(self.out, "(")?; self.write_expr(module, base, func_ctx)?; write!(self.out, ")")?; return Ok(()); } _ => {} } } self.write_expr(module, base, func_ctx)?; write_access(self, resolved, base_ty_handle, index)?; } } Expression::FunctionArgument(pos) => { let key = match func_ctx.ty { back::FunctionType::Function(handle) => NameKey::FunctionArgument(handle, pos), back::FunctionType::EntryPoint(index) => { NameKey::EntryPointArgument(index, pos) } }; let name = &self.names[&key]; write!(self.out, "{}", name)?; } Expression::ImageSample { image, sampler, gather, coordinate, array_index, offset, level, depth_ref, } => { use crate::SampleLevel as Sl; const COMPONENTS: [&str; 4] = ["", "Green", "Blue", "Alpha"]; let (base_str, component_str) = match gather { Some(component) => ("Gather", COMPONENTS[component as usize]), None => ("Sample", ""), }; let cmp_str = match depth_ref { Some(_) => "Cmp", None => "", }; let level_str = match level { Sl::Zero if gather.is_none() => "LevelZero", Sl::Auto | Sl::Zero => "", Sl::Exact(_) => "Level", Sl::Bias(_) => "Bias", Sl::Gradient { .. } => "Grad", }; self.write_expr(module, image, func_ctx)?; write!( self.out, ".{}{}{}{}(", base_str, cmp_str, component_str, level_str )?; self.write_expr(module, sampler, func_ctx)?; write!(self.out, ", ")?; self.write_texture_coordinates( "float", coordinate, array_index, None, module, func_ctx, )?; if let Some(depth_ref) = depth_ref { write!(self.out, ", ")?; self.write_expr(module, depth_ref, func_ctx)?; } match level { Sl::Auto | Sl::Zero => {} Sl::Exact(expr) => { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } Sl::Bias(expr) => { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } Sl::Gradient { x, y } => { write!(self.out, ", ")?; self.write_expr(module, x, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, y, func_ctx)?; } } if let Some(offset) = offset { write!(self.out, ", ")?; self.write_constant(module, offset)?; } write!(self.out, ")")?; } Expression::ImageQuery { image, query } => { // use wrapped image query function if let TypeInner::Image { dim, arrayed, class, } = *func_ctx.info[image].ty.inner_with(&module.types) { let wrapped_image_query = WrappedImageQuery { dim, arrayed, class, query: query.into(), }; self.write_wrapped_image_query_function_name(wrapped_image_query)?; write!(self.out, "(")?; // Image always first param self.write_expr(module, image, func_ctx)?; if let crate::ImageQuery::Size { level: Some(level) } = query { write!(self.out, ", ")?; self.write_expr(module, level, func_ctx)?; } write!(self.out, ")")?; } } Expression::ImageLoad { image, coordinate, array_index, sample, level, } => { // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-load self.write_expr(module, image, func_ctx)?; write!(self.out, ".Load(")?; self.write_texture_coordinates( "int", coordinate, array_index, level, module, func_ctx, )?; if let Some(sample) = sample { write!(self.out, ", ")?; self.write_expr(module, sample, func_ctx)?; } // close bracket for Load function write!(self.out, ")")?; // return x component if return type is scalar if let TypeInner::Scalar { .. } = *func_ctx.info[expr].ty.inner_with(&module.types) { write!(self.out, ".x")?; } } Expression::GlobalVariable(handle) => match module.global_variables[handle].space { crate::AddressSpace::Storage { .. } => {} _ => { let name = &self.names[&NameKey::GlobalVariable(handle)]; write!(self.out, "{}", name)?; } }, Expression::LocalVariable(handle) => { write!(self.out, "{}", self.names[&func_ctx.name_key(handle)])? } Expression::Load { pointer } => { match func_ctx.info[pointer] .ty .inner_with(&module.types) .pointer_space() { Some(crate::AddressSpace::Storage { .. }) => { let var_handle = self.fill_access_chain(module, pointer, func_ctx)?; let result_ty = func_ctx.info[expr].ty.clone(); self.write_storage_load(module, var_handle, result_ty, func_ctx)?; } _ => { let mut close_paren = false; // We cast the value loaded to a native HLSL floatCx2 // in cases where it is of type: // - __matCx2 or // - a (possibly nested) array of __matCx2's if let Some(MatrixType { rows: crate::VectorSize::Bi, width: 4, .. }) = get_inner_matrix_of_struct_array_member( module, pointer, func_ctx, false, ) .or_else(|| get_inner_matrix_of_global_uniform(module, pointer, func_ctx)) { let mut resolved = func_ctx.info[pointer].ty.inner_with(&module.types); if let TypeInner::Pointer { base, .. } = *resolved { resolved = &module.types[base].inner; } write!(self.out, "((")?; if let TypeInner::Array { base, size, .. } = *resolved { self.write_type(module, base)?; self.write_array_size(module, base, size)?; } else { self.write_value_type(module, resolved)?; } write!(self.out, ")")?; close_paren = true; } self.write_expr(module, pointer, func_ctx)?; if close_paren { write!(self.out, ")")?; } } } } Expression::Unary { op, expr } => { use crate::{ScalarKind as Sk, UnaryOperator as Uo}; // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-operators#unary-operators let op_str = match op { Uo::Negate => "-", Uo::Not => match func_ctx.info[expr] .ty .inner_with(&module.types) .scalar_kind() { Some(Sk::Sint) | Some(Sk::Uint) => "~", Some(Sk::Bool) => "!", ref other => { return Err(Error::Custom(format!( "Cannot apply not to type {:?}", other ))) } }, }; write!(self.out, "{}", op_str)?; self.write_expr(module, expr, func_ctx)?; } Expression::As { expr, kind, convert, } => { let inner = func_ctx.info[expr].ty.inner_with(&module.types); let get_width = |src_width| kind.to_hlsl_str(convert.unwrap_or(src_width)); match *inner { TypeInner::Vector { size, width, .. } => { write!( self.out, "{}{}(", get_width(width)?, back::vector_size_str(size) )?; } TypeInner::Scalar { width, .. } => { write!(self.out, "{}(", get_width(width)?,)?; } TypeInner::Matrix { columns, rows, width, } => { write!( self.out, "{}{}x{}(", get_width(width)?, back::vector_size_str(columns), back::vector_size_str(rows) )?; } _ => { return Err(Error::Unimplemented(format!( "write_expr expression::as {:?}", inner ))); } }; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")?; } Expression::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; enum Function { Asincosh { is_sin: bool }, Atanh, Unpack2x16float, Regular(&'static str), MissingIntOverload(&'static str), } let fun = match fun { // comparison Mf::Abs => Function::Regular("abs"), Mf::Min => Function::Regular("min"), Mf::Max => Function::Regular("max"), Mf::Clamp => Function::Regular("clamp"), Mf::Saturate => Function::Regular("saturate"), // trigonometry Mf::Cos => Function::Regular("cos"), Mf::Cosh => Function::Regular("cosh"), Mf::Sin => Function::Regular("sin"), Mf::Sinh => Function::Regular("sinh"), Mf::Tan => Function::Regular("tan"), Mf::Tanh => Function::Regular("tanh"), Mf::Acos => Function::Regular("acos"), Mf::Asin => Function::Regular("asin"), Mf::Atan => Function::Regular("atan"), Mf::Atan2 => Function::Regular("atan2"), Mf::Asinh => Function::Asincosh { is_sin: true }, Mf::Acosh => Function::Asincosh { is_sin: false }, Mf::Atanh => Function::Atanh, Mf::Radians => Function::Regular("radians"), Mf::Degrees => Function::Regular("degrees"), // decomposition Mf::Ceil => Function::Regular("ceil"), Mf::Floor => Function::Regular("floor"), Mf::Round => Function::Regular("round"), Mf::Fract => Function::Regular("frac"), Mf::Trunc => Function::Regular("trunc"), Mf::Modf => Function::Regular("modf"), Mf::Frexp => Function::Regular("frexp"), Mf::Ldexp => Function::Regular("ldexp"), // exponent Mf::Exp => Function::Regular("exp"), Mf::Exp2 => Function::Regular("exp2"), Mf::Log => Function::Regular("log"), Mf::Log2 => Function::Regular("log2"), Mf::Pow => Function::Regular("pow"), // geometry Mf::Dot => Function::Regular("dot"), //Mf::Outer => , Mf::Cross => Function::Regular("cross"), Mf::Distance => Function::Regular("distance"), Mf::Length => Function::Regular("length"), Mf::Normalize => Function::Regular("normalize"), Mf::FaceForward => Function::Regular("faceforward"), Mf::Reflect => Function::Regular("reflect"), Mf::Refract => Function::Regular("refract"), // computational Mf::Sign => Function::Regular("sign"), Mf::Fma => Function::Regular("mad"), Mf::Mix => Function::Regular("lerp"), Mf::Step => Function::Regular("step"), Mf::SmoothStep => Function::Regular("smoothstep"), Mf::Sqrt => Function::Regular("sqrt"), Mf::InverseSqrt => Function::Regular("rsqrt"), //Mf::Inverse =>, Mf::Transpose => Function::Regular("transpose"), Mf::Determinant => Function::Regular("determinant"), // bits Mf::CountOneBits => Function::MissingIntOverload("countbits"), Mf::ReverseBits => Function::MissingIntOverload("reversebits"), Mf::FindLsb => Function::Regular("firstbitlow"), Mf::FindMsb => Function::Regular("firstbithigh"), Mf::Unpack2x16float => Function::Unpack2x16float, _ => return Err(Error::Unimplemented(format!("write_expr_math {:?}", fun))), }; match fun { Function::Asincosh { is_sin } => { write!(self.out, "log(")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, " + sqrt(")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, " * ")?; self.write_expr(module, arg, func_ctx)?; match is_sin { true => write!(self.out, " + 1.0))")?, false => write!(self.out, " - 1.0))")?, } } Function::Atanh => { write!(self.out, "0.5 * log((1.0 + ")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, ") / (1.0 - ")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, "))")?; } Function::Unpack2x16float => { write!(self.out, "float2(f16tof32(")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, "), f16tof32((")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, ") >> 16))")?; } Function::Regular(fun_name) => { write!(self.out, "{}(", fun_name)?; self.write_expr(module, arg, func_ctx)?; if let Some(arg) = arg1 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } if let Some(arg) = arg2 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } if let Some(arg) = arg3 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } write!(self.out, ")")? } Function::MissingIntOverload(fun_name) => { let scalar_kind = &func_ctx.info[arg] .ty .inner_with(&module.types) .scalar_kind(); if let Some(ScalarKind::Sint) = *scalar_kind { write!(self.out, "asint({}(asuint(", fun_name)?; self.write_expr(module, arg, func_ctx)?; write!(self.out, ")))")?; } else { write!(self.out, "{}(", fun_name)?; self.write_expr(module, arg, func_ctx)?; write!(self.out, ")")?; } } } } Expression::Swizzle { size, vector, pattern, } => { self.write_expr(module, vector, func_ctx)?; write!(self.out, ".")?; for &sc in pattern[..size as usize].iter() { self.out.write_char(back::COMPONENTS[sc as usize])?; } } Expression::ArrayLength(expr) => { let var_handle = match func_ctx.expressions[expr] { Expression::AccessIndex { base, index: _ } => { match func_ctx.expressions[base] { Expression::GlobalVariable(handle) => handle, _ => unreachable!(), } } Expression::GlobalVariable(handle) => handle, _ => unreachable!(), }; let var = &module.global_variables[var_handle]; let (offset, stride) = match module.types[var.ty].inner { TypeInner::Array { stride, .. } => (0, stride), TypeInner::Struct { ref members, .. } => { let last = members.last().unwrap(); let stride = match module.types[last.ty].inner { TypeInner::Array { stride, .. } => stride, _ => unreachable!(), }; (last.offset, stride) } _ => unreachable!(), }; let storage_access = match var.space { crate::AddressSpace::Storage { access } => access, _ => crate::StorageAccess::default(), }; let wrapped_array_length = WrappedArrayLength { writable: storage_access.contains(crate::StorageAccess::STORE), }; write!(self.out, "((")?; self.write_wrapped_array_length_function_name(wrapped_array_length)?; let var_name = &self.names[&NameKey::GlobalVariable(var_handle)]; write!(self.out, "({}) - {}) / {})", var_name, offset, stride)? } Expression::Derivative { axis, expr } => { use crate::DerivativeAxis as Da; let fun_str = match axis { Da::X => "ddx", Da::Y => "ddy", Da::Width => "fwidth", }; write!(self.out, "{}(", fun_str)?; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")? } Expression::Relational { fun, argument } => { use crate::RelationalFunction as Rf; let fun_str = match fun { Rf::All => "all", Rf::Any => "any", Rf::IsNan => "isnan", Rf::IsInf => "isinf", Rf::IsFinite => "isfinite", Rf::IsNormal => "isnormal", }; write!(self.out, "{}(", fun_str)?; self.write_expr(module, argument, func_ctx)?; write!(self.out, ")")? } Expression::Splat { size, value } => { // hlsl is not supported one value constructor // if we write, for example, int4(0), dxc returns error: // error: too few elements in vector initialization (expected 4 elements, have 1) let number_of_components = match size { crate::VectorSize::Bi => "xx", crate::VectorSize::Tri => "xxx", crate::VectorSize::Quad => "xxxx", }; write!(self.out, "(")?; self.write_expr(module, value, func_ctx)?; write!(self.out, ").{}", number_of_components)? } Expression::Select { condition, accept, reject, } => { write!(self.out, "(")?; self.write_expr(module, condition, func_ctx)?; write!(self.out, " ? ")?; self.write_expr(module, accept, func_ctx)?; write!(self.out, " : ")?; self.write_expr(module, reject, func_ctx)?; write!(self.out, ")")? } // Nothing to do here, since call expression already cached Expression::CallResult(_) | Expression::AtomicResult { .. } => {} } if !closing_bracket.is_empty() { write!(self.out, "{}", closing_bracket)?; } Ok(()) } /// Helper method used to write constants /// /// # Notes /// Doesn't add any newlines or leading/trailing spaces fn write_constant( &mut self, module: &Module, handle: Handle, ) -> BackendResult { let constant = &module.constants[handle]; match constant.inner { crate::ConstantInner::Scalar { width: _, ref value, } => { if constant.name.is_some() { write!(self.out, "{}", &self.names[&NameKey::Constant(handle)])?; } else { self.write_scalar_value(*value)?; } } crate::ConstantInner::Composite { ty, ref components } => { self.write_composite_constant(module, ty, components)?; } } Ok(()) } fn write_composite_constant( &mut self, module: &Module, ty: Handle, components: &[Handle], ) -> BackendResult { match module.types[ty].inner { TypeInner::Struct { .. } | TypeInner::Array { .. } => { self.write_wrapped_constructor_function_name(module, WrappedConstructor { ty })?; } _ => { self.write_type(module, ty)?; } }; write!(self.out, "(")?; for (index, constant) in components.iter().enumerate() { self.write_constant(module, *constant)?; // Only write a comma if isn't the last element if index != components.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } write!(self.out, ")")?; Ok(()) } /// Helper method used to write [`ScalarValue`](crate::ScalarValue) /// /// # Notes /// Adds no trailing or leading whitespace fn write_scalar_value(&mut self, value: crate::ScalarValue) -> BackendResult { use crate::ScalarValue as Sv; match value { Sv::Sint(value) => write!(self.out, "{}", value)?, Sv::Uint(value) => write!(self.out, "{}u", value)?, // Floats are written using `Debug` instead of `Display` because it always appends the // decimal part even it's zero Sv::Float(value) => write!(self.out, "{:?}", value)?, Sv::Bool(value) => write!(self.out, "{}", value)?, } Ok(()) } fn write_named_expr( &mut self, module: &Module, handle: Handle, name: String, ctx: &back::FunctionCtx, ) -> BackendResult { match ctx.info[handle].ty { proc::TypeResolution::Handle(ty_handle) => match module.types[ty_handle].inner { TypeInner::Struct { .. } => { let ty_name = &self.names[&NameKey::Type(ty_handle)]; write!(self.out, "{}", ty_name)?; } _ => { self.write_type(module, ty_handle)?; } }, proc::TypeResolution::Value(ref inner) => { self.write_value_type(module, inner)?; } } let base_ty_res = &ctx.info[handle].ty; let resolved = base_ty_res.inner_with(&module.types); write!(self.out, " {}", name)?; // If rhs is a array type, we should write array size if let TypeInner::Array { base, size, .. } = *resolved { self.write_array_size(module, base, size)?; } write!(self.out, " = ")?; self.write_expr(module, handle, ctx)?; writeln!(self.out, ";")?; self.named_expressions.insert(handle, name); Ok(()) } /// Helper function that write default zero initialization fn write_default_init(&mut self, module: &Module, ty: Handle) -> BackendResult { match module.types[ty].inner { TypeInner::Array { size: crate::ArraySize::Constant(const_handle), base, .. } => { write!(self.out, "{{")?; let count = module.constants[const_handle].to_array_length().unwrap(); for i in 0..count { if i != 0 { write!(self.out, ",")?; } self.write_default_init(module, base)?; } write!(self.out, "}}")?; } _ => { write!(self.out, "(")?; self.write_type(module, ty)?; write!(self.out, ")0")?; } } Ok(()) } } pub(super) struct MatrixType { pub(super) columns: crate::VectorSize, pub(super) rows: crate::VectorSize, pub(super) width: crate::Bytes, } pub(super) fn get_inner_matrix_data( module: &Module, handle: Handle, ) -> Option { match module.types[handle].inner { TypeInner::Matrix { columns, rows, width, } => Some(MatrixType { columns, rows, width, }), TypeInner::Array { base, .. } => get_inner_matrix_data(module, base), _ => None, } } /// Returns the matrix data if the access chain starting at `base`: /// - starts with an expression with resolved type of [`TypeInner::Matrix`] if `direct = true` /// - contains one or more expressions with resolved type of [`TypeInner::Array`] of [`TypeInner::Matrix`] /// - ends at an expression with resolved type of [`TypeInner::Struct`] pub(super) fn get_inner_matrix_of_struct_array_member( module: &Module, base: Handle, func_ctx: &back::FunctionCtx<'_>, direct: bool, ) -> Option { let mut mat_data = None; let mut array_base = None; let mut current_base = base; loop { let mut resolved = func_ctx.info[current_base].ty.inner_with(&module.types); if let TypeInner::Pointer { base, .. } = *resolved { resolved = &module.types[base].inner; }; match *resolved { TypeInner::Matrix { columns, rows, width, } => { mat_data = Some(MatrixType { columns, rows, width, }) } TypeInner::Array { base, .. } => { array_base = Some(base); } TypeInner::Struct { .. } => { if let Some(array_base) = array_base { if direct { return mat_data; } else { return get_inner_matrix_data(module, array_base); } } break; } _ => break, } current_base = match func_ctx.expressions[current_base] { crate::Expression::Access { base, .. } => base, crate::Expression::AccessIndex { base, .. } => base, _ => break, }; } None } /// Returns the matrix data if the access chain starting at `base`: /// - starts with an expression with resolved type of [`TypeInner::Matrix`] /// - contains zero or more expressions with resolved type of [`TypeInner::Array`] of [`TypeInner::Matrix`] /// - ends with an [`Expression::GlobalVariable`](crate::Expression::GlobalVariable) in [`AddressSpace::Uniform`](crate::AddressSpace::Uniform) fn get_inner_matrix_of_global_uniform( module: &Module, base: Handle, func_ctx: &back::FunctionCtx<'_>, ) -> Option { let mut mat_data = None; let mut array_base = None; let mut current_base = base; loop { let mut resolved = func_ctx.info[current_base].ty.inner_with(&module.types); if let TypeInner::Pointer { base, .. } = *resolved { resolved = &module.types[base].inner; }; match *resolved { TypeInner::Matrix { columns, rows, width, } => { mat_data = Some(MatrixType { columns, rows, width, }) } TypeInner::Array { base, .. } => { array_base = Some(base); } _ => break, } current_base = match func_ctx.expressions[current_base] { crate::Expression::Access { base, .. } => base, crate::Expression::AccessIndex { base, .. } => base, crate::Expression::GlobalVariable(handle) if module.global_variables[handle].space == crate::AddressSpace::Uniform => { return mat_data.or_else(|| { array_base.and_then(|array_base| get_inner_matrix_data(module, array_base)) }) } _ => break, }; } None } ================================================ FILE: lib/naga/src/back/mod.rs ================================================ /*! Backend functions that export shader [`Module`](super::Module)s into binary and text formats. */ #![allow(dead_code)] // can be dead if none of the enabled backends need it #[cfg(feature = "dot-out")] pub mod dot; #[cfg(feature = "glsl-out")] pub mod glsl; #[cfg(feature = "hlsl-out")] pub mod hlsl; #[cfg(feature = "msl-out")] pub mod msl; #[cfg(feature = "spv-out")] pub mod spv; #[cfg(feature = "wgsl-out")] pub mod wgsl; const COMPONENTS: &[char] = &['x', 'y', 'z', 'w']; const INDENT: &str = " "; const BAKE_PREFIX: &str = "_e"; type NeedBakeExpressions = crate::FastHashSet>; #[derive(Clone, Copy)] struct Level(usize); impl Level { const fn next(&self) -> Self { Level(self.0 + 1) } } impl std::fmt::Display for Level { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { (0..self.0).try_for_each(|_| formatter.write_str(INDENT)) } } /// Stores the current function type (either a regular function or an entry point) /// /// Also stores data needed to identify it (handle for a regular function or index for an entry point) enum FunctionType { /// A regular function and it's handle Function(crate::Handle), /// A entry point and it's index EntryPoint(crate::proc::EntryPointIndex), } /// Helper structure that stores data needed when writing the function struct FunctionCtx<'a> { /// The current function being written ty: FunctionType, /// Analysis about the function info: &'a crate::valid::FunctionInfo, /// The expression arena of the current function being written expressions: &'a crate::Arena, /// Map of expressions that have associated variable names named_expressions: &'a crate::NamedExpressions, } impl FunctionCtx<'_> { /// Helper method that generates a [`NameKey`](crate::proc::NameKey) for a local in the current function const fn name_key(&self, local: crate::Handle) -> crate::proc::NameKey { match self.ty { FunctionType::Function(handle) => crate::proc::NameKey::FunctionLocal(handle, local), FunctionType::EntryPoint(idx) => crate::proc::NameKey::EntryPointLocal(idx, local), } } /// Helper method that generates a [`NameKey`](crate::proc::NameKey) for a function argument. /// /// # Panics /// - If the function arguments are less or equal to `arg` const fn argument_key(&self, arg: u32) -> crate::proc::NameKey { match self.ty { FunctionType::Function(handle) => crate::proc::NameKey::FunctionArgument(handle, arg), FunctionType::EntryPoint(ep_index) => { crate::proc::NameKey::EntryPointArgument(ep_index, arg) } } } // Returns true if the given expression points to a fixed-function pipeline input. fn is_fixed_function_input( &self, mut expression: crate::Handle, module: &crate::Module, ) -> Option { let ep_function = match self.ty { FunctionType::Function(_) => return None, FunctionType::EntryPoint(ep_index) => &module.entry_points[ep_index as usize].function, }; let mut built_in = None; loop { match self.expressions[expression] { crate::Expression::FunctionArgument(arg_index) => { return match ep_function.arguments[arg_index as usize].binding { Some(crate::Binding::BuiltIn(bi)) => Some(bi), _ => built_in, }; } crate::Expression::AccessIndex { base, index } => { match *self.info[base].ty.inner_with(&module.types) { crate::TypeInner::Struct { ref members, .. } => { if let Some(crate::Binding::BuiltIn(bi)) = members[index as usize].binding { built_in = Some(bi); } } _ => return None, } expression = base; } _ => return None, } } } } impl crate::Expression { /// Returns the ref count, upon reaching which this expression /// should be considered for baking. /// /// Note: we have to cache any expressions that depend on the control flow, /// or otherwise they may be moved into a non-uniform control flow, accidentally. /// See the [module-level documentation][emit] for details. /// /// [emit]: index.html#expression-evaluation-time const fn bake_ref_count(&self) -> usize { match *self { // accesses are never cached, only loads are crate::Expression::Access { .. } | crate::Expression::AccessIndex { .. } => usize::MAX, // sampling may use the control flow, and image ops look better by themselves crate::Expression::ImageSample { .. } | crate::Expression::ImageLoad { .. } => 1, // derivatives use the control flow crate::Expression::Derivative { .. } => 1, // TODO: We need a better fix for named `Load` expressions // More info - https://github.com/gfx-rs/naga/pull/914 // And https://github.com/gfx-rs/naga/issues/910 crate::Expression::Load { .. } => 1, // cache expressions that are referenced multiple times _ => 2, } } } /// Helper function that returns the string corresponding to the [`BinaryOperator`](crate::BinaryOperator) /// # Notes /// Used by `glsl-out`, `msl-out`, `wgsl-out`, `hlsl-out`. const fn binary_operation_str(op: crate::BinaryOperator) -> &'static str { use crate::BinaryOperator as Bo; match op { Bo::Add => "+", Bo::Subtract => "-", Bo::Multiply => "*", Bo::Divide => "/", Bo::Modulo => "%", Bo::Equal => "==", Bo::NotEqual => "!=", Bo::Less => "<", Bo::LessEqual => "<=", Bo::Greater => ">", Bo::GreaterEqual => ">=", Bo::And => "&", Bo::ExclusiveOr => "^", Bo::InclusiveOr => "|", Bo::LogicalAnd => "&&", Bo::LogicalOr => "||", Bo::ShiftLeft => "<<", Bo::ShiftRight => ">>", } } /// Helper function that returns the string corresponding to the [`VectorSize`](crate::VectorSize) /// # Notes /// Used by `msl-out`, `wgsl-out`, `hlsl-out`. const fn vector_size_str(size: crate::VectorSize) -> &'static str { match size { crate::VectorSize::Bi => "2", crate::VectorSize::Tri => "3", crate::VectorSize::Quad => "4", } } impl crate::TypeInner { const fn is_handle(&self) -> bool { match *self { crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } => true, _ => false, } } } impl crate::Statement { /// Returns true if the statement directly terminates the current block. /// /// Used to decide whether case blocks require a explicit `break`. pub const fn is_terminator(&self) -> bool { match *self { crate::Statement::Break | crate::Statement::Continue | crate::Statement::Return { .. } | crate::Statement::Kill => true, _ => false, } } } ================================================ FILE: lib/naga/src/back/msl/keywords.rs ================================================ //TODO: find a complete list pub const RESERVED: &[&str] = &[ // control flow "break", "if", "else", "continue", "goto", "do", "while", "for", "switch", "case", // types and values "void", "unsigned", "signed", "bool", "char", "int", "uint", "long", "float", "double", "char8_t", "wchar_t", "true", "false", "nullptr", "union", "class", "struct", "enum", // other "main", "using", "decltype", "sizeof", "typeof", "typedef", "explicit", "export", "friend", "namespace", "operator", "public", "template", "typename", "typeid", "co_await", "co_return", "co_yield", "module", "import", "ray_data", "vec_step", "visible", "as_type", "this", // qualifiers "mutable", "static", "volatile", "restrict", "const", "non-temporal", "dereferenceable", "invariant", // exceptions "throw", "try", "catch", // operators "const_cast", "dynamic_cast", "reinterpret_cast", "static_cast", "new", "delete", "and", "and_eq", "bitand", "bitor", "compl", "not", "not_eq", "or", "or_eq", "xor", "xor_eq", "compl", // Metal-specific "constant", "device", "threadgroup", "threadgroup_imageblock", "kernel", "compute", "vertex", "fragment", "read_only", "write_only", "read_write", "auto", // Metal reserved types "llong", "ullong", "quad", "complex", "imaginary", // Metal constants "CHAR_BIT", "SCHAR_MAX", "SCHAR_MIN", "UCHAR_MAX", "CHAR_MAX", "CHAR_MIN", "USHRT_MAX", "SHRT_MAX", "SHRT_MIN", "UINT_MAX", "INT_MAX", "INT_MIN", "ULONG_MAX", "LONG_MAX", "LONG_MIN", "ULLONG_MAX", "LLONG_MAX", "LLONG_MIN", "FLT_DIG", "FLT_MANT_DIG", "FLT_MAX_10_EXP", "FLT_MAX_EXP", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX", "FLT_MAX", "FLT_MIN", "FLT_EPSILON", "FLT_DECIMAL_DIG", "FP_ILOGB0", "FP_ILOGB0", "FP_ILOGBNAN", "FP_ILOGBNAN", "MAXFLOAT", "HUGE_VALF", "INFINITY", "NAN", "M_E_F", "M_LOG2E_F", "M_LOG10E_F", "M_LN2_F", "M_LN10_F", "M_PI_F", "M_PI_2_F", "M_PI_4_F", "M_1_PI_F", "M_2_PI_F", "M_2_SQRTPI_F", "M_SQRT2_F", "M_SQRT1_2_F", "HALF_DIG", "HALF_MANT_DIG", "HALF_MAX_10_EXP", "HALF_MAX_EXP", "HALF_MIN_10_EXP", "HALF_MIN_EXP", "HALF_RADIX", "HALF_MAX", "HALF_MIN", "HALF_EPSILON", "HALF_DECIMAL_DIG", "MAXHALF", "HUGE_VALH", "M_E_H", "M_LOG2E_H", "M_LOG10E_H", "M_LN2_H", "M_LN10_H", "M_PI_H", "M_PI_2_H", "M_PI_4_H", "M_1_PI_H", "M_2_PI_H", "M_2_SQRTPI_H", "M_SQRT2_H", "M_SQRT1_2_H", "DBL_DIG", "DBL_MANT_DIG", "DBL_MAX_10_EXP", "DBL_MAX_EXP", "DBL_MIN_10_EXP", "DBL_MIN_EXP", "DBL_RADIX", "DBL_MAX", "DBL_MIN", "DBL_EPSILON", "DBL_DECIMAL_DIG", "MAXDOUBLE", "HUGE_VAL", "M_E", "M_LOG2E", "M_LOG10E", "M_LN2", "M_LN10", "M_PI", "M_PI_2", "M_PI_4", "M_1_PI", "M_2_PI", "M_2_SQRTPI", "M_SQRT2", "M_SQRT1_2", // Naga utilities "DefaultConstructible", "clamped_lod_e", ]; ================================================ FILE: lib/naga/src/back/msl/mod.rs ================================================ /*! Backend for [MSL][msl] (Metal Shading Language). ## Binding model Metal's bindings are flat per resource. Since there isn't an obvious mapping from SPIR-V's descriptor sets, we require a separate mapping provided in the options. This mapping may have one or more resource end points for each descriptor set + index pair. ## Entry points Even though MSL and our IR appear to be similar in that the entry points in both can accept arguments and return values, the restrictions are different. MSL allows the varyings to be either in separate arguments, or inside a single `[[stage_in]]` struct. We gather input varyings and form this artificial structure. We also add all the (non-Private) globals into the arguments. At the beginning of the entry point, we assign the local constants and re-compose the arguments as they are declared on IR side, so that the rest of the logic can pretend that MSL doesn't have all the restrictions it has. For the result type, if it's a structure, we re-compose it with a temporary value holding the result. [msl]: https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf */ use crate::{arena::Handle, proc::index, valid::ModuleInfo}; use std::{ fmt::{Error as FmtError, Write}, ops, }; mod keywords; pub mod sampler; mod writer; pub use writer::Writer; pub type Slot = u8; pub type InlineSamplerIndex = u8; #[derive(Clone, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum BindSamplerTarget { Resource(Slot), Inline(InlineSamplerIndex), } #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr(any(feature = "serialize", feature = "deserialize"), serde(default))] pub struct BindTarget { pub buffer: Option, pub texture: Option, pub sampler: Option, /// If the binding is an unsized binding array, this overrides the size. pub binding_array_size: Option, pub mutable: bool, } // Using `BTreeMap` instead of `HashMap` so that we can hash itself. pub type BindingMap = std::collections::BTreeMap; #[derive(Clone, Debug, Default, Hash, Eq, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr(any(feature = "serialize", feature = "deserialize"), serde(default))] pub struct PerStageResources { pub resources: BindingMap, pub push_constant_buffer: Option, /// The slot of a buffer that contains an array of `u32`, /// one for the size of each bound buffer that contains a runtime array, /// in order of [`crate::GlobalVariable`] declarations. pub sizes_buffer: Option, } #[derive(Clone, Debug, Default, Hash, Eq, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr(any(feature = "serialize", feature = "deserialize"), serde(default))] pub struct PerStageMap { pub vs: PerStageResources, pub fs: PerStageResources, pub cs: PerStageResources, } impl ops::Index for PerStageMap { type Output = PerStageResources; fn index(&self, stage: crate::ShaderStage) -> &PerStageResources { match stage { crate::ShaderStage::Vertex => &self.vs, crate::ShaderStage::Fragment => &self.fs, crate::ShaderStage::Compute => &self.cs, } } } enum ResolvedBinding { BuiltIn(crate::BuiltIn), Attribute(u32), Color(u32), User { prefix: &'static str, index: u32, interpolation: Option, }, Resource(BindTarget), } #[derive(Copy, Clone)] enum ResolvedInterpolation { CenterPerspective, CenterNoPerspective, CentroidPerspective, CentroidNoPerspective, SamplePerspective, SampleNoPerspective, Flat, } // Note: some of these should be removed in favor of proper IR validation. #[derive(Debug, thiserror::Error)] pub enum Error { #[error(transparent)] Format(#[from] FmtError), #[error("bind target {0:?} is empty")] UnimplementedBindTarget(BindTarget), #[error("composing of {0:?} is not implemented yet")] UnsupportedCompose(Handle), #[error("operation {0:?} is not implemented yet")] UnsupportedBinaryOp(crate::BinaryOperator), #[error("standard function '{0}' is not implemented yet")] UnsupportedCall(String), #[error("feature '{0}' is not implemented yet")] FeatureNotImplemented(String), #[error("module is not valid")] Validation, #[error("BuiltIn {0:?} is not supported")] UnsupportedBuiltIn(crate::BuiltIn), #[error("capability {0:?} is not supported")] CapabilityNotSupported(crate::valid::Capabilities), #[error("address space {0:?} is not supported for target MSL version")] UnsupportedAddressSpace(crate::AddressSpace), #[error("attribute '{0}' is not supported for target MSL version")] UnsupportedAttribute(String), } #[derive(Clone, Debug, PartialEq, thiserror::Error)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum EntryPointError { #[error("mapping of {0:?} is missing")] MissingBinding(crate::ResourceBinding), #[error("mapping for push constants is missing")] MissingPushConstants, #[error("mapping for sizes buffer is missing")] MissingSizesBuffer, } /// Points in the MSL code where we might emit a pipeline input or output. /// /// Note that, even though vertex shaders' outputs are always fragment /// shaders' inputs, we still need to distinguish `VertexOutput` and /// `FragmentInput`, since there are certain differences in the way /// [`ResolvedBinding`s] are represented on either side. /// /// [`ResolvedBinding`s]: ResolvedBinding #[derive(Clone, Copy, Debug)] enum LocationMode { /// Input to the vertex shader. VertexInput, /// Output from the vertex shader. VertexOutput, /// Input to the fragment shader. FragmentInput, /// Output from the fragment shader. FragmentOutput, /// Compute shader input or output. Uniform, } #[derive(Clone, Debug, Hash, PartialEq, Eq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Options { /// (Major, Minor) target version of the Metal Shading Language. pub lang_version: (u8, u8), /// Map of per-stage resources to slots. pub per_stage_map: PerStageMap, /// Samplers to be inlined into the code. pub inline_samplers: Vec, /// Make it possible to link different stages via SPIRV-Cross. pub spirv_cross_compatibility: bool, /// Don't panic on missing bindings, instead generate invalid MSL. pub fake_missing_bindings: bool, /// Bounds checking policies. #[cfg_attr(feature = "deserialize", serde(default))] pub bounds_check_policies: index::BoundsCheckPolicies, } impl Default for Options { fn default() -> Self { Options { lang_version: (2, 0), per_stage_map: PerStageMap::default(), inline_samplers: Vec::new(), spirv_cross_compatibility: false, fake_missing_bindings: true, bounds_check_policies: index::BoundsCheckPolicies::default(), } } } /// A subset of options that are meant to be changed per pipeline. #[derive(Debug, Default, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct PipelineOptions { /// Allow `BuiltIn::PointSize` in the vertex shader. /// /// Metal doesn't like this for non-point primitive topologies. pub allow_point_size: bool, } impl Options { fn resolve_local_binding( &self, binding: &crate::Binding, mode: LocationMode, ) -> Result { match *binding { crate::Binding::BuiltIn(mut built_in) => { if let crate::BuiltIn::Position { ref mut invariant } = built_in { if *invariant && self.lang_version < (2, 1) { return Err(Error::UnsupportedAttribute("invariant".to_string())); } // The 'invariant' attribute may only appear on vertex // shader outputs, not fragment shader inputs. if !matches!(mode, LocationMode::VertexOutput) { *invariant = false; } } Ok(ResolvedBinding::BuiltIn(built_in)) } crate::Binding::Location { location, interpolation, sampling, } => match mode { LocationMode::VertexInput => Ok(ResolvedBinding::Attribute(location)), LocationMode::FragmentOutput => Ok(ResolvedBinding::Color(location)), LocationMode::VertexOutput | LocationMode::FragmentInput => { Ok(ResolvedBinding::User { prefix: if self.spirv_cross_compatibility { "locn" } else { "loc" }, index: location, interpolation: { // unwrap: The verifier ensures that vertex shader outputs and fragment // shader inputs always have fully specified interpolation, and that // sampling is `None` only for Flat interpolation. let interpolation = interpolation.unwrap(); let sampling = sampling.unwrap_or(crate::Sampling::Center); Some(ResolvedInterpolation::from_binding(interpolation, sampling)) }, }) } LocationMode::Uniform => { log::error!( "Unexpected Binding::Location({}) for the Uniform mode", location ); Err(Error::Validation) } }, } } fn resolve_resource_binding( &self, stage: crate::ShaderStage, res_binding: &crate::ResourceBinding, ) -> Result { match self.per_stage_map[stage].resources.get(res_binding) { Some(target) => Ok(ResolvedBinding::Resource(target.clone())), None if self.fake_missing_bindings => Ok(ResolvedBinding::User { prefix: "fake", index: 0, interpolation: None, }), None => Err(EntryPointError::MissingBinding(res_binding.clone())), } } const fn resolve_push_constants( &self, stage: crate::ShaderStage, ) -> Result { let slot = match stage { crate::ShaderStage::Vertex => self.per_stage_map.vs.push_constant_buffer, crate::ShaderStage::Fragment => self.per_stage_map.fs.push_constant_buffer, crate::ShaderStage::Compute => self.per_stage_map.cs.push_constant_buffer, }; match slot { Some(slot) => Ok(ResolvedBinding::Resource(BindTarget { buffer: Some(slot), texture: None, sampler: None, binding_array_size: None, mutable: false, })), None if self.fake_missing_bindings => Ok(ResolvedBinding::User { prefix: "fake", index: 0, interpolation: None, }), None => Err(EntryPointError::MissingPushConstants), } } fn resolve_sizes_buffer( &self, stage: crate::ShaderStage, ) -> Result { let slot = self.per_stage_map[stage].sizes_buffer; match slot { Some(slot) => Ok(ResolvedBinding::Resource(BindTarget { buffer: Some(slot), texture: None, sampler: None, binding_array_size: None, mutable: false, })), None if self.fake_missing_bindings => Ok(ResolvedBinding::User { prefix: "fake", index: 0, interpolation: None, }), None => Err(EntryPointError::MissingSizesBuffer), } } } impl ResolvedBinding { fn as_inline_sampler<'a>(&self, options: &'a Options) -> Option<&'a sampler::InlineSampler> { match *self { Self::Resource(BindTarget { sampler: Some(BindSamplerTarget::Inline(index)), .. }) => Some(&options.inline_samplers[index as usize]), _ => None, } } const fn as_bind_target(&self) -> Option<&BindTarget> { match *self { Self::Resource(ref target) => Some(target), _ => None, } } fn try_fmt(&self, out: &mut W) -> Result<(), Error> { write!(out, " [[")?; match *self { Self::BuiltIn(built_in) => { use crate::BuiltIn as Bi; let name = match built_in { Bi::Position { invariant: false } => "position", Bi::Position { invariant: true } => "position, invariant", // vertex Bi::BaseInstance => "base_instance", Bi::BaseVertex => "base_vertex", Bi::ClipDistance => "clip_distance", Bi::InstanceIndex => "instance_id", Bi::PointSize => "point_size", Bi::VertexIndex => "vertex_id", // fragment Bi::FragDepth => "depth(any)", Bi::FrontFacing => "front_facing", Bi::PrimitiveIndex => "primitive_id", Bi::SampleIndex => "sample_id", Bi::SampleMask => "sample_mask", // compute Bi::GlobalInvocationId => "thread_position_in_grid", Bi::LocalInvocationId => "thread_position_in_threadgroup", Bi::LocalInvocationIndex => "thread_index_in_threadgroup", Bi::WorkGroupId => "threadgroup_position_in_grid", Bi::WorkGroupSize => "dispatch_threads_per_threadgroup", Bi::NumWorkGroups => "threadgroups_per_grid", Bi::CullDistance | Bi::ViewIndex => { return Err(Error::UnsupportedBuiltIn(built_in)) } }; write!(out, "{}", name)?; } Self::Attribute(index) => write!(out, "attribute({})", index)?, Self::Color(index) => write!(out, "color({})", index)?, Self::User { prefix, index, interpolation, } => { write!(out, "user({}{})", prefix, index)?; if let Some(interpolation) = interpolation { write!(out, ", ")?; interpolation.try_fmt(out)?; } } Self::Resource(ref target) => { if let Some(id) = target.buffer { write!(out, "buffer({})", id)?; } else if let Some(id) = target.texture { write!(out, "texture({})", id)?; } else if let Some(BindSamplerTarget::Resource(id)) = target.sampler { write!(out, "sampler({})", id)?; } else { return Err(Error::UnimplementedBindTarget(target.clone())); } } } write!(out, "]]")?; Ok(()) } } impl ResolvedInterpolation { const fn from_binding(interpolation: crate::Interpolation, sampling: crate::Sampling) -> Self { use crate::Interpolation as I; use crate::Sampling as S; match (interpolation, sampling) { (I::Perspective, S::Center) => Self::CenterPerspective, (I::Perspective, S::Centroid) => Self::CentroidPerspective, (I::Perspective, S::Sample) => Self::SamplePerspective, (I::Linear, S::Center) => Self::CenterNoPerspective, (I::Linear, S::Centroid) => Self::CentroidNoPerspective, (I::Linear, S::Sample) => Self::SampleNoPerspective, (I::Flat, _) => Self::Flat, } } fn try_fmt(self, out: &mut W) -> Result<(), Error> { let identifier = match self { Self::CenterPerspective => "center_perspective", Self::CenterNoPerspective => "center_no_perspective", Self::CentroidPerspective => "centroid_perspective", Self::CentroidNoPerspective => "centroid_no_perspective", Self::SamplePerspective => "sample_perspective", Self::SampleNoPerspective => "sample_no_perspective", Self::Flat => "flat", }; out.write_str(identifier)?; Ok(()) } } /// Information about a translated module that is required /// for the use of the result. pub struct TranslationInfo { /// Mapping of the entry point names. Each item in the array /// corresponds to an entry point index. /// ///Note: Some entry points may fail translation because of missing bindings. pub entry_point_names: Vec>, } pub fn write_string( module: &crate::Module, info: &ModuleInfo, options: &Options, pipeline_options: &PipelineOptions, ) -> Result<(String, TranslationInfo), Error> { let mut w = writer::Writer::new(String::new()); let info = w.write(module, info, options, pipeline_options)?; Ok((w.finish(), info)) } #[test] fn test_error_size() { use std::mem::size_of; assert_eq!(size_of::(), 32); } ================================================ FILE: lib/naga/src/back/msl/sampler.rs ================================================ #[cfg(feature = "deserialize")] use serde::Deserialize; #[cfg(feature = "serialize")] use serde::Serialize; use std::{num::NonZeroU32, ops::Range}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub enum Coord { Normalized, Pixel, } impl Default for Coord { fn default() -> Self { Self::Normalized } } impl Coord { pub const fn as_str(&self) -> &'static str { match *self { Self::Normalized => "normalized", Self::Pixel => "pixel", } } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub enum Address { Repeat, MirroredRepeat, ClampToEdge, ClampToZero, ClampToBorder, } impl Default for Address { fn default() -> Self { Self::ClampToEdge } } impl Address { pub const fn as_str(&self) -> &'static str { match *self { Self::Repeat => "repeat", Self::MirroredRepeat => "mirrored_repeat", Self::ClampToEdge => "clamp_to_edge", Self::ClampToZero => "clamp_to_zero", Self::ClampToBorder => "clamp_to_border", } } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub enum BorderColor { TransparentBlack, OpaqueBlack, OpaqueWhite, } impl Default for BorderColor { fn default() -> Self { Self::TransparentBlack } } impl BorderColor { pub const fn as_str(&self) -> &'static str { match *self { Self::TransparentBlack => "transparent_black", Self::OpaqueBlack => "opaque_black", Self::OpaqueWhite => "opaque_white", } } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub enum Filter { Nearest, Linear, } impl Filter { pub const fn as_str(&self) -> &'static str { match *self { Self::Nearest => "nearest", Self::Linear => "linear", } } } impl Default for Filter { fn default() -> Self { Self::Nearest } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub enum CompareFunc { Never, Less, LessEqual, Greater, GreaterEqual, Equal, NotEqual, Always, } impl Default for CompareFunc { fn default() -> Self { Self::Never } } impl CompareFunc { pub const fn as_str(&self) -> &'static str { match *self { Self::Never => "never", Self::Less => "less", Self::LessEqual => "less_equal", Self::Greater => "greater", Self::GreaterEqual => "greater_equal", Self::Equal => "equal", Self::NotEqual => "not_equal", Self::Always => "always", } } } #[derive(Clone, Debug, Default, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] pub struct InlineSampler { pub coord: Coord, pub address: [Address; 3], pub border_color: BorderColor, pub mag_filter: Filter, pub min_filter: Filter, pub mip_filter: Option, pub lod_clamp: Option>, pub max_anisotropy: Option, pub compare_func: CompareFunc, } impl Eq for InlineSampler {} #[allow(clippy::derive_hash_xor_eq)] impl std::hash::Hash for InlineSampler { fn hash(&self, hasher: &mut H) { self.coord.hash(hasher); self.address.hash(hasher); self.border_color.hash(hasher); self.mag_filter.hash(hasher); self.min_filter.hash(hasher); self.mip_filter.hash(hasher); self.lod_clamp .as_ref() .map(|range| (range.start.to_bits(), range.end.to_bits())) .hash(hasher); self.max_anisotropy.hash(hasher); self.compare_func.hash(hasher); } } ================================================ FILE: lib/naga/src/back/msl/writer.rs ================================================ use super::{sampler as sm, Error, LocationMode, Options, PipelineOptions, TranslationInfo}; use crate::{ arena::Handle, back, proc::index, proc::{self, NameKey, TypeResolution}, valid, FastHashMap, FastHashSet, }; use bit_set::BitSet; use std::{ fmt::{Display, Error as FmtError, Formatter, Write}, iter, }; /// Shorthand result used internally by the backend type BackendResult = Result<(), Error>; const NAMESPACE: &str = "metal"; // The name of the array member of the Metal struct types we generate to // represent Naga `Array` types. See the comments in `Writer::write_type_defs` // for details. const WRAPPED_ARRAY_FIELD: &str = "inner"; // This is a hack: we need to pass a pointer to an atomic, // but generally the backend isn't putting "&" in front of every pointer. // Some more general handling of pointers is needed to be implemented here. const ATOMIC_REFERENCE: &str = "&"; /// Write the Metal name for a Naga numeric type: scalar, vector, or matrix. /// /// The `sizes` slice determines whether this function writes a /// scalar, vector, or matrix type: /// /// - An empty slice produces a scalar type. /// - A one-element slice produces a vector type. /// - A two element slice `[ROWS COLUMNS]` produces a matrix of the given size. fn put_numeric_type( out: &mut impl Write, kind: crate::ScalarKind, sizes: &[crate::VectorSize], ) -> Result<(), FmtError> { match (kind, sizes) { (kind, &[]) => { write!(out, "{}", kind.to_msl_name()) } (kind, &[rows]) => { write!( out, "{}::{}{}", NAMESPACE, kind.to_msl_name(), back::vector_size_str(rows) ) } (kind, &[rows, columns]) => { write!( out, "{}::{}{}x{}", NAMESPACE, kind.to_msl_name(), back::vector_size_str(columns), back::vector_size_str(rows) ) } (_, _) => Ok(()), // not meaningful } } /// Prefix for cached clamped level-of-detail values for `ImageLoad` expressions. const CLAMPED_LOD_LOAD_PREFIX: &str = "clamped_lod_e"; struct TypeContext<'a> { handle: Handle, module: &'a crate::Module, names: &'a FastHashMap, access: crate::StorageAccess, binding: Option<&'a super::ResolvedBinding>, first_time: bool, } impl<'a> Display for TypeContext<'a> { fn fmt(&self, out: &mut Formatter<'_>) -> Result<(), FmtError> { let ty = &self.module.types[self.handle]; if ty.needs_alias() && !self.first_time { let name = &self.names[&NameKey::Type(self.handle)]; return write!(out, "{}", name); } match ty.inner { crate::TypeInner::Scalar { kind, .. } => put_numeric_type(out, kind, &[]), crate::TypeInner::Atomic { kind, .. } => { write!(out, "{}::atomic_{}", NAMESPACE, kind.to_msl_name()) } crate::TypeInner::Vector { size, kind, .. } => put_numeric_type(out, kind, &[size]), crate::TypeInner::Matrix { columns, rows, .. } => { put_numeric_type(out, crate::ScalarKind::Float, &[rows, columns]) } crate::TypeInner::Pointer { base, space } => { let sub = Self { handle: base, first_time: false, ..*self }; let space_name = match space.to_msl_name() { Some(name) => name, None => return Ok(()), }; write!(out, "{} {}&", space_name, sub) } crate::TypeInner::ValuePointer { size, kind, width: _, space, } => { match space.to_msl_name() { Some(name) => write!(out, "{} ", name)?, None => return Ok(()), }; match size { Some(rows) => put_numeric_type(out, kind, &[rows])?, None => put_numeric_type(out, kind, &[])?, }; write!(out, "&") } crate::TypeInner::Array { base, .. } => { let sub = Self { handle: base, first_time: false, ..*self }; // Array lengths go at the end of the type definition, // so just print the element type here. write!(out, "{}", sub) } crate::TypeInner::Struct { .. } => unreachable!(), crate::TypeInner::Image { dim, arrayed, class, } => { let dim_str = match dim { crate::ImageDimension::D1 => "1d", crate::ImageDimension::D2 => "2d", crate::ImageDimension::D3 => "3d", crate::ImageDimension::Cube => "cube", }; let (texture_str, msaa_str, kind, access) = match class { crate::ImageClass::Sampled { kind, multi } => { let (msaa_str, access) = if multi { ("_ms", "read") } else { ("", "sample") }; ("texture", msaa_str, kind, access) } crate::ImageClass::Depth { multi } => { let (msaa_str, access) = if multi { ("_ms", "read") } else { ("", "sample") }; ("depth", msaa_str, crate::ScalarKind::Float, access) } crate::ImageClass::Storage { format, .. } => { let access = if self .access .contains(crate::StorageAccess::LOAD | crate::StorageAccess::STORE) { "read_write" } else if self.access.contains(crate::StorageAccess::STORE) { "write" } else if self.access.contains(crate::StorageAccess::LOAD) { "read" } else { log::warn!( "Storage access for {:?} (name '{}'): {:?}", self.handle, ty.name.as_deref().unwrap_or_default(), self.access ); unreachable!("module is not valid"); }; ("texture", "", format.into(), access) } }; let base_name = kind.to_msl_name(); let array_str = if arrayed { "_array" } else { "" }; write!( out, "{}::{}{}{}{}<{}, {}::access::{}>", NAMESPACE, texture_str, dim_str, msaa_str, array_str, base_name, NAMESPACE, access, ) } crate::TypeInner::Sampler { comparison: _ } => { write!(out, "{}::sampler", NAMESPACE) } crate::TypeInner::BindingArray { base, size } => { let base_tyname = Self { handle: base, first_time: false, ..*self }; if let Some(&super::ResolvedBinding::Resource(super::BindTarget { binding_array_size: Some(override_size), .. })) = self.binding { write!( out, "{}::array<{}, {}>", NAMESPACE, base_tyname, override_size ) } else if let crate::ArraySize::Constant(size) = size { let constant_ctx = ConstantContext { handle: size, arena: &self.module.constants, names: self.names, first_time: false, }; write!( out, "{}::array<{}, {}>", NAMESPACE, base_tyname, constant_ctx ) } else { unreachable!("metal requires all arrays be constant sized"); } } } } } struct TypedGlobalVariable<'a> { module: &'a crate::Module, names: &'a FastHashMap, handle: Handle, usage: valid::GlobalUse, binding: Option<&'a super::ResolvedBinding>, reference: bool, } impl<'a> TypedGlobalVariable<'a> { fn try_fmt(&self, out: &mut W) -> BackendResult { let var = &self.module.global_variables[self.handle]; let name = &self.names[&NameKey::GlobalVariable(self.handle)]; let storage_access = match var.space { crate::AddressSpace::Storage { access } => access, _ => match self.module.types[var.ty].inner { crate::TypeInner::Image { class: crate::ImageClass::Storage { access, .. }, .. } => access, crate::TypeInner::BindingArray { base, .. } => { match self.module.types[base].inner { crate::TypeInner::Image { class: crate::ImageClass::Storage { access, .. }, .. } => access, _ => crate::StorageAccess::default(), } } _ => crate::StorageAccess::default(), }, }; let ty_name = TypeContext { handle: var.ty, module: self.module, names: self.names, access: storage_access, binding: self.binding, first_time: false, }; let (space, access, reference) = match var.space.to_msl_name() { Some(space) if self.reference => { let access = if var.space.needs_access_qualifier() && !self.usage.contains(valid::GlobalUse::WRITE) { "const" } else { "" }; (space, access, "&") } _ => ("", "", ""), }; Ok(write!( out, "{}{}{}{}{}{} {}", space, if space.is_empty() { "" } else { " " }, ty_name, if access.is_empty() { "" } else { " " }, access, reference, name, )?) } } struct ConstantContext<'a> { handle: Handle, arena: &'a crate::Arena, names: &'a FastHashMap, first_time: bool, } impl<'a> Display for ConstantContext<'a> { fn fmt(&self, out: &mut Formatter<'_>) -> Result<(), FmtError> { let con = &self.arena[self.handle]; if con.needs_alias() && !self.first_time { let name = &self.names[&NameKey::Constant(self.handle)]; return write!(out, "{}", name); } match con.inner { crate::ConstantInner::Scalar { value, width: _ } => match value { crate::ScalarValue::Sint(value) => { write!(out, "{}", value) } crate::ScalarValue::Uint(value) => { write!(out, "{}u", value) } crate::ScalarValue::Float(value) => { if value.is_infinite() { let sign = if value.is_sign_negative() { "-" } else { "" }; write!(out, "{}INFINITY", sign) } else if value.is_nan() { write!(out, "NAN") } else { let suffix = if value.fract() == 0.0 { ".0" } else { "" }; write!(out, "{}{}", value, suffix) } } crate::ScalarValue::Bool(value) => { write!(out, "{}", value) } }, crate::ConstantInner::Composite { .. } => unreachable!("should be aliased"), } } } pub struct Writer { out: W, names: FastHashMap, named_expressions: crate::NamedExpressions, /// Set of expressions that need to be baked to avoid unnecessary repetition in output need_bake_expressions: back::NeedBakeExpressions, namer: proc::Namer, #[cfg(test)] put_expression_stack_pointers: FastHashSet<*const ()>, #[cfg(test)] put_block_stack_pointers: FastHashSet<*const ()>, /// Set of (struct type, struct field index) denoting which fields require /// padding inserted **before** them (i.e. between fields at index - 1 and index) struct_member_pads: FastHashSet<(Handle, u32)>, } impl crate::ScalarKind { const fn to_msl_name(self) -> &'static str { match self { Self::Float => "float", Self::Sint => "int", Self::Uint => "uint", Self::Bool => "bool", } } } const fn separate(need_separator: bool) -> &'static str { if need_separator { "," } else { "" } } fn should_pack_struct_member( members: &[crate::StructMember], span: u32, index: usize, module: &crate::Module, ) -> Option { let member = &members[index]; //Note: this is imperfect - the same structure can be used for host-shared // things, where packed float would matter. if member.binding.is_some() { return None; } let ty_inner = &module.types[member.ty].inner; let last_offset = member.offset + ty_inner.size(&module.constants); let next_offset = match members.get(index + 1) { Some(next) => next.offset, None => span, }; let is_tight = next_offset == last_offset; match *ty_inner { crate::TypeInner::Vector { size: crate::VectorSize::Tri, width: 4, kind, } if member.offset & 0xF != 0 || is_tight => Some(kind), _ => None, } } fn needs_array_length(ty: Handle, arena: &crate::UniqueArena) -> bool { match arena[ty].inner { crate::TypeInner::Struct { ref members, .. } => { if let Some(member) = members.last() { if let crate::TypeInner::Array { size: crate::ArraySize::Dynamic, .. } = arena[member.ty].inner { return true; } } false } crate::TypeInner::Array { size: crate::ArraySize::Dynamic, .. } => true, _ => false, } } impl crate::AddressSpace { /// Returns true if global variables in this address space are /// passed in function arguments. These arguments need to be /// passed through any functions called from the entry point. const fn needs_pass_through(&self) -> bool { match *self { Self::Uniform | Self::Storage { .. } | Self::Private | Self::WorkGroup | Self::PushConstant | Self::Handle => true, Self::Function => false, } } /// Returns true if the address space may need a "const" qualifier. const fn needs_access_qualifier(&self) -> bool { match *self { //Note: we are ignoring the storage access here, and instead // rely on the actual use of a global by functions. This means we // may end up with "const" even if the binding is read-write, // and that should be OK. Self::Storage { .. } => true, // These should always be read-write. Self::Private | Self::WorkGroup => false, // These translate to `constant` address space, no need for qualifiers. Self::Uniform | Self::PushConstant => false, // Not applicable. Self::Handle | Self::Function => false, } } const fn to_msl_name(self) -> Option<&'static str> { match self { Self::Handle => None, Self::Uniform | Self::PushConstant => Some("constant"), Self::Storage { .. } => Some("device"), Self::Private | Self::Function => Some("thread"), Self::WorkGroup => Some("threadgroup"), } } } impl crate::Type { // Returns `true` if we need to emit an alias for this type. const fn needs_alias(&self) -> bool { use crate::TypeInner as Ti; match self.inner { // value types are concise enough, we only alias them if they are named Ti::Scalar { .. } | Ti::Vector { .. } | Ti::Matrix { .. } | Ti::Atomic { .. } | Ti::Pointer { .. } | Ti::ValuePointer { .. } => self.name.is_some(), // composite types are better to be aliased, regardless of the name Ti::Struct { .. } | Ti::Array { .. } => true, // handle types may be different, depending on the global var access, so we always inline them Ti::Image { .. } | Ti::Sampler { .. } | Ti::BindingArray { .. } => false, } } } impl crate::Constant { // Returns `true` if we need to emit an alias for this constant. const fn needs_alias(&self) -> bool { match self.inner { crate::ConstantInner::Scalar { .. } => self.name.is_some(), crate::ConstantInner::Composite { .. } => true, } } } enum FunctionOrigin { Handle(Handle), EntryPoint(proc::EntryPointIndex), } /// A level of detail argument. /// /// When [`BoundsCheckPolicy::Restrict`] applies to an [`ImageLoad`] access, we /// save the clamped level of detail in a temporary variable whose name is based /// on the handle of the `ImageLoad` expression. But for other policies, we just /// use the expression directly. /// /// [`BoundsCheckPolicy::Restrict`]: index::BoundsCheckPolicy::Restrict /// [`ImageLoad`]: crate::Expression::ImageLoad #[derive(Clone, Copy)] enum LevelOfDetail { Direct(Handle), Restricted(Handle), } /// Values needed to select a particular texel for [`ImageLoad`] and [`ImageStore`]. /// /// When this is used in code paths unconcerned with the `Restrict` bounds check /// policy, the `LevelOfDetail` enum introduces an unneeded match, since `level` /// will always be either `None` or `Some(Direct(_))`. But this turns out not to /// be too awkward. If that changes, we can revisit. /// /// [`ImageLoad`]: crate::Expression::ImageLoad /// [`ImageStore`]: crate::Statement::ImageStore struct TexelAddress { coordinate: Handle, array_index: Option>, sample: Option>, level: Option, } struct ExpressionContext<'a> { function: &'a crate::Function, origin: FunctionOrigin, info: &'a valid::FunctionInfo, module: &'a crate::Module, pipeline_options: &'a PipelineOptions, policies: index::BoundsCheckPolicies, /// A bitset containing the `Expression` handle indexes of expressions used /// as indices in `ReadZeroSkipWrite`-policy accesses. These may need to be /// cached in temporary variables. See `index::find_checked_indexes` for /// details. guarded_indices: BitSet, } impl<'a> ExpressionContext<'a> { fn resolve_type(&self, handle: Handle) -> &'a crate::TypeInner { self.info[handle].ty.inner_with(&self.module.types) } /// Return true if calls to `image`'s `read` and `write` methods should supply a level of detail. /// /// Only mipmapped images need to specify a level of detail. Since 1D /// textures cannot have mipmaps, MSL requires that the level argument to /// texture1d queries and accesses must be a constexpr 0. It's easiest /// just to omit the level entirely for 1D textures. fn image_needs_lod(&self, image: Handle) -> bool { let image_ty = self.resolve_type(image); if let crate::TypeInner::Image { dim, class, .. } = *image_ty { class.is_mipmapped() && dim != crate::ImageDimension::D1 } else { false } } fn choose_bounds_check_policy( &self, pointer: Handle, ) -> index::BoundsCheckPolicy { self.policies .choose_policy(pointer, &self.module.types, self.info) } fn access_needs_check( &self, base: Handle, index: index::GuardedIndex, ) -> Option { index::access_needs_check(base, index, self.module, self.function, self.info) } fn get_packed_vec_kind( &self, expr_handle: Handle, ) -> Option { match self.function.expressions[expr_handle] { crate::Expression::AccessIndex { base, index } => { let ty = match *self.resolve_type(base) { crate::TypeInner::Pointer { base, .. } => &self.module.types[base].inner, ref ty => ty, }; match *ty { crate::TypeInner::Struct { ref members, span, .. } => should_pack_struct_member(members, span, index as usize, self.module), _ => None, } } _ => None, } } } struct StatementContext<'a> { expression: ExpressionContext<'a>, mod_info: &'a valid::ModuleInfo, result_struct: Option<&'a str>, } impl Writer { /// Creates a new `Writer` instance. pub fn new(out: W) -> Self { Writer { out, names: FastHashMap::default(), named_expressions: Default::default(), need_bake_expressions: Default::default(), namer: proc::Namer::default(), #[cfg(test)] put_expression_stack_pointers: Default::default(), #[cfg(test)] put_block_stack_pointers: Default::default(), struct_member_pads: FastHashSet::default(), } } /// Finishes writing and returns the output. // See https://github.com/rust-lang/rust-clippy/issues/4979. #[allow(clippy::missing_const_for_fn)] pub fn finish(self) -> W { self.out } fn put_call_parameters( &mut self, parameters: impl Iterator>, context: &ExpressionContext, ) -> BackendResult { write!(self.out, "(")?; for (i, handle) in parameters.enumerate() { if i != 0 { write!(self.out, ", ")?; } self.put_expression(handle, context, true)?; } write!(self.out, ")")?; Ok(()) } fn put_level_of_detail( &mut self, level: LevelOfDetail, context: &ExpressionContext, ) -> BackendResult { match level { LevelOfDetail::Direct(expr) => self.put_expression(expr, context, true)?, LevelOfDetail::Restricted(load) => { write!(self.out, "{}{}", CLAMPED_LOD_LOAD_PREFIX, load.index())? } } Ok(()) } fn put_image_query( &mut self, image: Handle, query: &str, level: Option, context: &ExpressionContext, ) -> BackendResult { self.put_expression(image, context, false)?; write!(self.out, ".get_{}(", query)?; if let Some(level) = level { self.put_level_of_detail(level, context)?; } write!(self.out, ")")?; Ok(()) } fn put_image_size_query( &mut self, image: Handle, level: Option, kind: crate::ScalarKind, context: &ExpressionContext, ) -> BackendResult { //Note: MSL only has separate width/height/depth queries, // so compose the result of them. let dim = match *context.resolve_type(image) { crate::TypeInner::Image { dim, .. } => dim, ref other => unreachable!("Unexpected type {:?}", other), }; let coordinate_type = kind.to_msl_name(); match dim { crate::ImageDimension::D1 => { // Since 1D textures never have mipmaps, MSL requires that the // `level` argument be a constexpr 0. It's simplest for us just // to pass `None` and omit the level entirely. if kind == crate::ScalarKind::Uint { // No need to construct a vector. No cast needed. self.put_image_query(image, "width", None, context)?; } else { // There's no definition for `int` in the `metal` namespace. write!(self.out, "int(")?; self.put_image_query(image, "width", None, context)?; write!(self.out, ")")?; } } crate::ImageDimension::D2 => { write!(self.out, "{}::{}2(", NAMESPACE, coordinate_type)?; self.put_image_query(image, "width", level, context)?; write!(self.out, ", ")?; self.put_image_query(image, "height", level, context)?; write!(self.out, ")")?; } crate::ImageDimension::D3 => { write!(self.out, "{}::{}3(", NAMESPACE, coordinate_type)?; self.put_image_query(image, "width", level, context)?; write!(self.out, ", ")?; self.put_image_query(image, "height", level, context)?; write!(self.out, ", ")?; self.put_image_query(image, "depth", level, context)?; write!(self.out, ")")?; } crate::ImageDimension::Cube => { write!(self.out, "{}::{}2(", NAMESPACE, coordinate_type)?; self.put_image_query(image, "width", level, context)?; write!(self.out, ")")?; } } Ok(()) } fn put_cast_to_uint_scalar_or_vector( &mut self, expr: Handle, context: &ExpressionContext, ) -> BackendResult { // coordinates in IR are int, but Metal expects uint match *context.resolve_type(expr) { crate::TypeInner::Scalar { .. } => { put_numeric_type(&mut self.out, crate::ScalarKind::Uint, &[])? } crate::TypeInner::Vector { size, .. } => { put_numeric_type(&mut self.out, crate::ScalarKind::Uint, &[size])? } _ => return Err(Error::Validation), }; write!(self.out, "(")?; self.put_expression(expr, context, true)?; write!(self.out, ")")?; Ok(()) } fn put_image_sample_level( &mut self, image: Handle, level: crate::SampleLevel, context: &ExpressionContext, ) -> BackendResult { let has_levels = context.image_needs_lod(image); match level { crate::SampleLevel::Auto => {} crate::SampleLevel::Zero => { //TODO: do we support Zero on `Sampled` image classes? } _ if !has_levels => { log::warn!("1D image can't be sampled with level {:?}", level); } crate::SampleLevel::Exact(h) => { write!(self.out, ", {}::level(", NAMESPACE)?; self.put_expression(h, context, true)?; write!(self.out, ")")?; } crate::SampleLevel::Bias(h) => { write!(self.out, ", {}::bias(", NAMESPACE)?; self.put_expression(h, context, true)?; write!(self.out, ")")?; } crate::SampleLevel::Gradient { x, y } => { write!(self.out, ", {}::gradient2d(", NAMESPACE)?; self.put_expression(x, context, true)?; write!(self.out, ", ")?; self.put_expression(y, context, true)?; write!(self.out, ")")?; } } Ok(()) } fn put_image_coordinate_limits( &mut self, image: Handle, level: Option, context: &ExpressionContext, ) -> BackendResult { self.put_image_size_query(image, level, crate::ScalarKind::Uint, context)?; write!(self.out, " - 1")?; Ok(()) } /// General function for writing restricted image indexes. /// /// This is used to produce restricted mip levels, array indices, and sample /// indices for [`ImageLoad`] and [`ImageStore`] accesses under the /// [`Restrict`] bounds check policy. /// /// This function writes an expression of the form: /// /// ```ignore /// /// metal::min(uint(INDEX), IMAGE.LIMIT_METHOD() - 1) /// /// ``` /// /// [`ImageLoad`]: crate::Expression::ImageLoad /// [`ImageStore`]: crate::Statement::ImageStore /// [`Restrict`]: index::BoundsCheckPolicy::Restrict fn put_restricted_scalar_image_index( &mut self, image: Handle, index: Handle, limit_method: &str, context: &ExpressionContext, ) -> BackendResult { write!(self.out, "{}::min(uint(", NAMESPACE)?; self.put_expression(index, context, true)?; write!(self.out, "), ")?; self.put_expression(image, context, false)?; write!(self.out, ".{}() - 1)", limit_method)?; Ok(()) } fn put_restricted_texel_address( &mut self, image: Handle, address: &TexelAddress, context: &ExpressionContext, ) -> BackendResult { // Write the coordinate. write!(self.out, "{}::min(", NAMESPACE)?; self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?; write!(self.out, ", ")?; self.put_image_coordinate_limits(image, address.level, context)?; write!(self.out, ")")?; // Write the array index, if present. if let Some(array_index) = address.array_index { write!(self.out, ", ")?; self.put_restricted_scalar_image_index(image, array_index, "get_array_size", context)?; } // Write the sample index, if present. if let Some(sample) = address.sample { write!(self.out, ", ")?; self.put_restricted_scalar_image_index(image, sample, "get_num_samples", context)?; } // The level of detail should be clamped and cached by // `put_cache_restricted_level`, so we don't need to clamp it here. if let Some(level) = address.level { write!(self.out, ", ")?; self.put_level_of_detail(level, context)?; } Ok(()) } /// Write an expression that is true if the given image access is in bounds. fn put_image_access_bounds_check( &mut self, image: Handle, address: &TexelAddress, context: &ExpressionContext, ) -> BackendResult { let mut conjunction = ""; // First, check the level of detail. Only if that is in bounds can we // use it to find the appropriate bounds for the coordinates. let level = if let Some(level) = address.level { write!(self.out, "uint(")?; self.put_level_of_detail(level, context)?; write!(self.out, ") < ")?; self.put_expression(image, context, true)?; write!(self.out, ".get_num_mip_levels()")?; conjunction = " && "; Some(level) } else { None }; // Check sample index, if present. if let Some(sample) = address.sample { write!(self.out, "uint(")?; self.put_expression(sample, context, true)?; write!(self.out, ") < ")?; self.put_expression(image, context, true)?; write!(self.out, ".get_num_samples()")?; conjunction = " && "; } // Check array index, if present. if let Some(array_index) = address.array_index { write!(self.out, "{}uint(", conjunction)?; self.put_expression(array_index, context, true)?; write!(self.out, ") < ")?; self.put_expression(image, context, true)?; write!(self.out, ".get_array_size()")?; conjunction = " && "; } // Finally, check if the coordinates are within bounds. let coord_is_vector = match *context.resolve_type(address.coordinate) { crate::TypeInner::Vector { .. } => true, _ => false, }; write!(self.out, "{}", conjunction)?; if coord_is_vector { write!(self.out, "{}::all(", NAMESPACE)?; } self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?; write!(self.out, " < ")?; self.put_image_size_query(image, level, crate::ScalarKind::Uint, context)?; if coord_is_vector { write!(self.out, ")")?; } Ok(()) } fn put_image_load( &mut self, load: Handle, image: Handle, mut address: TexelAddress, context: &ExpressionContext, ) -> BackendResult { match context.policies.image { proc::BoundsCheckPolicy::Restrict => { // Use the cached restricted level of detail, if any. Omit the // level altogether for 1D textures. if address.level.is_some() { address.level = if context.image_needs_lod(image) { Some(LevelOfDetail::Restricted(load)) } else { None } } self.put_expression(image, context, false)?; write!(self.out, ".read(")?; self.put_restricted_texel_address(image, &address, context)?; write!(self.out, ")")?; } proc::BoundsCheckPolicy::ReadZeroSkipWrite => { write!(self.out, "(")?; self.put_image_access_bounds_check(image, &address, context)?; write!(self.out, " ? ")?; self.put_unchecked_image_load(image, &address, context)?; write!(self.out, ": DefaultConstructible())")?; } proc::BoundsCheckPolicy::Unchecked => { self.put_unchecked_image_load(image, &address, context)?; } } Ok(()) } fn put_unchecked_image_load( &mut self, image: Handle, address: &TexelAddress, context: &ExpressionContext, ) -> BackendResult { self.put_expression(image, context, false)?; write!(self.out, ".read(")?; // coordinates in IR are int, but Metal expects uint self.put_cast_to_uint_scalar_or_vector(address.coordinate, context)?; if let Some(expr) = address.array_index { write!(self.out, ", ")?; self.put_expression(expr, context, true)?; } if let Some(sample) = address.sample { write!(self.out, ", ")?; self.put_expression(sample, context, true)?; } if let Some(level) = address.level { if context.image_needs_lod(image) { write!(self.out, ", ")?; self.put_level_of_detail(level, context)?; } } write!(self.out, ")")?; Ok(()) } fn put_image_store( &mut self, level: back::Level, image: Handle, address: &TexelAddress, value: Handle, context: &StatementContext, ) -> BackendResult { match context.expression.policies.image { proc::BoundsCheckPolicy::Restrict => { // We don't have a restricted level value, because we don't // support writes to mipmapped textures. debug_assert!(address.level.is_none()); write!(self.out, "{}", level)?; self.put_expression(image, &context.expression, false)?; write!(self.out, ".write(")?; self.put_expression(value, &context.expression, true)?; write!(self.out, ", ")?; self.put_restricted_texel_address(image, address, &context.expression)?; writeln!(self.out, ");")?; } proc::BoundsCheckPolicy::ReadZeroSkipWrite => { write!(self.out, "{}if (", level)?; self.put_image_access_bounds_check(image, address, &context.expression)?; writeln!(self.out, ") {{")?; self.put_unchecked_image_store(level.next(), image, address, value, context)?; writeln!(self.out, "{}}}", level)?; } proc::BoundsCheckPolicy::Unchecked => { self.put_unchecked_image_store(level, image, address, value, context)?; } } Ok(()) } fn put_unchecked_image_store( &mut self, level: back::Level, image: Handle, address: &TexelAddress, value: Handle, context: &StatementContext, ) -> BackendResult { write!(self.out, "{}", level)?; self.put_expression(image, &context.expression, false)?; write!(self.out, ".write(")?; self.put_expression(value, &context.expression, true)?; write!(self.out, ", ")?; // coordinates in IR are int, but Metal expects uint self.put_cast_to_uint_scalar_or_vector(address.coordinate, &context.expression)?; if let Some(expr) = address.array_index { write!(self.out, ", ")?; self.put_expression(expr, &context.expression, true)?; } writeln!(self.out, ");")?; Ok(()) } fn put_compose( &mut self, ty: Handle, components: &[Handle], context: &ExpressionContext, ) -> BackendResult { match context.module.types[ty].inner { crate::TypeInner::Scalar { width: 4, kind } if components.len() == 1 => { write!(self.out, "{}", kind.to_msl_name())?; self.put_call_parameters(components.iter().cloned(), context)?; } crate::TypeInner::Vector { size, kind, .. } => { put_numeric_type(&mut self.out, kind, &[size])?; self.put_call_parameters(components.iter().cloned(), context)?; } crate::TypeInner::Matrix { columns, rows, .. } => { put_numeric_type(&mut self.out, crate::ScalarKind::Float, &[rows, columns])?; self.put_call_parameters(components.iter().cloned(), context)?; } crate::TypeInner::Array { .. } | crate::TypeInner::Struct { .. } => { write!(self.out, "{} {{", &self.names[&NameKey::Type(ty)])?; for (index, &component) in components.iter().enumerate() { if index != 0 { write!(self.out, ", ")?; } // insert padding initialization, if needed if self.struct_member_pads.contains(&(ty, index as u32)) { write!(self.out, "{{}}, ")?; } self.put_expression(component, context, true)?; } write!(self.out, "}}")?; } _ => return Err(Error::UnsupportedCompose(ty)), } Ok(()) } /// Write the maximum valid index of the dynamically sized array at the end of `handle`. /// /// The 'maximum valid index' is simply one less than the array's length. /// /// This emits an expression of the form `a / b`, so the caller must /// parenthesize its output if it will be applying operators of higher /// precedence. /// /// `handle` must be the handle of a global variable whose final member is a /// dynamically sized array. fn put_dynamic_array_max_index( &mut self, handle: Handle, context: &ExpressionContext, ) -> BackendResult { let global = &context.module.global_variables[handle]; let (offset, array_ty) = match context.module.types[global.ty].inner { crate::TypeInner::Struct { ref members, .. } => match members.last() { Some(&crate::StructMember { offset, ty, .. }) => (offset, ty), None => return Err(Error::Validation), }, crate::TypeInner::Array { size: crate::ArraySize::Dynamic, .. } => (0, global.ty), _ => return Err(Error::Validation), }; let (size, stride) = match context.module.types[array_ty].inner { crate::TypeInner::Array { base, stride, .. } => ( context.module.types[base] .inner .size(&context.module.constants), stride, ), _ => return Err(Error::Validation), }; // When the stride length is larger than the size, the final element's stride of // bytes would have padding following the value. But the buffer size in // `buffer_sizes.sizeN` may not include this padding - it only needs to be large // enough to hold the actual values' bytes. // // So subtract off the size to get a byte size that falls at the start or within // the final element. Then divide by the stride size, to get one less than the // length, and then add one. This works even if the buffer size does include the // stride padding, since division rounds towards zero (MSL 2.4 §6.1). It will fail // if there are zero elements in the array, but the WebGPU `validating shader binding` // rules, together with draw-time validation when `minBindingSize` is zero, // prevent that. write!( self.out, "(_buffer_sizes.size{idx} - {offset} - {size}) / {stride}", idx = handle.index(), offset = offset, size = size, stride = stride, )?; Ok(()) } fn put_atomic_fetch( &mut self, pointer: Handle, key: &str, value: Handle, context: &ExpressionContext, ) -> BackendResult { // If the pointer we're passing to the atomic operation needs to be conditional // for `ReadZeroSkipWrite`, the condition needs to *surround* the atomic op, and // the pointer operand should be unchecked. let policy = context.choose_bounds_check_policy(pointer); let checked = policy == index::BoundsCheckPolicy::ReadZeroSkipWrite && self.put_bounds_checks(pointer, context, back::Level(0), "")?; // If requested and successfully put bounds checks, continue the ternary expression. if checked { write!(self.out, " ? ")?; } write!( self.out, "{}::atomic_fetch_{}_explicit({}", NAMESPACE, key, ATOMIC_REFERENCE )?; self.put_access_chain(pointer, policy, context)?; write!(self.out, ", ")?; self.put_expression(value, context, true)?; write!(self.out, ", {}::memory_order_relaxed)", NAMESPACE)?; // Finish the ternary expression. if checked { write!(self.out, " : DefaultConstructible()")?; } Ok(()) } /// Emit code for the arithmetic expression of the dot product. /// fn put_dot_product( &mut self, arg: Handle, arg1: Handle, size: usize, context: &ExpressionContext, ) -> BackendResult { // Write parantheses around the dot product expression to prevent operators // with different precedences from applying earlier. write!(self.out, "(")?; // Cycle trough all the components of the vector for index in 0..size { let component = back::COMPONENTS[index]; // Write the addition to the previous product // This will print an extra '+' at the beginning but that is fine in msl write!(self.out, " + ")?; // Write the first vector expression, this expression is marked to be // cached so unless it can't be cached (for example, it's a Constant) // it shouldn't produce large expressions. self.put_expression(arg, context, true)?; // Access the current component on the first vector write!(self.out, ".{} * ", component)?; // Write the second vector expression, this expression is marked to be // cached so unless it can't be cached (for example, it's a Constant) // it shouldn't produce large expressions. self.put_expression(arg1, context, true)?; // Access the current component on the second vector write!(self.out, ".{}", component)?; } write!(self.out, ")")?; Ok(()) } /// Emit code for the expression `expr_handle`. /// /// The `is_scoped` argument is true if the surrounding operators have the /// precedence of the comma operator, or lower. So, for example: /// /// - Pass `true` for `is_scoped` when writing function arguments, an /// expression statement, an initializer expression, or anything already /// wrapped in parenthesis. /// /// - Pass `false` if it is an operand of a `?:` operator, a `[]`, or really /// almost anything else. fn put_expression( &mut self, expr_handle: Handle, context: &ExpressionContext, is_scoped: bool, ) -> BackendResult { // Add to the set in order to track the stack size. #[cfg(test)] #[allow(trivial_casts)] self.put_expression_stack_pointers .insert(&expr_handle as *const _ as *const ()); if let Some(name) = self.named_expressions.get(&expr_handle) { write!(self.out, "{}", name)?; return Ok(()); } let expression = &context.function.expressions[expr_handle]; log::trace!("expression {:?} = {:?}", expr_handle, expression); match *expression { crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { // This is an acceptable place to generate a `ReadZeroSkipWrite` check. // Since `put_bounds_checks` and `put_access_chain` handle an entire // access chain at a time, recursing back through `put_expression` only // for index expressions and the base object, we will never see intermediate // `Access` or `AccessIndex` expressions here. let policy = context.choose_bounds_check_policy(base); if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite && self.put_bounds_checks( expr_handle, context, back::Level(0), if is_scoped { "" } else { "(" }, )? { write!(self.out, " ? ")?; self.put_access_chain(expr_handle, policy, context)?; write!(self.out, " : DefaultConstructible()")?; if !is_scoped { write!(self.out, ")")?; } } else { self.put_access_chain(expr_handle, policy, context)?; } } crate::Expression::Constant(handle) => { let coco = ConstantContext { handle, arena: &context.module.constants, names: &self.names, first_time: false, }; write!(self.out, "{}", coco)?; } crate::Expression::Splat { size, value } => { let scalar_kind = match *context.resolve_type(value) { crate::TypeInner::Scalar { kind, .. } => kind, _ => return Err(Error::Validation), }; put_numeric_type(&mut self.out, scalar_kind, &[size])?; write!(self.out, "(")?; self.put_expression(value, context, true)?; write!(self.out, ")")?; } crate::Expression::Swizzle { size, vector, pattern, } => { self.put_wrapped_expression_for_packed_vec3_access(vector, context, false)?; write!(self.out, ".")?; for &sc in pattern[..size as usize].iter() { write!(self.out, "{}", back::COMPONENTS[sc as usize])?; } } crate::Expression::Compose { ty, ref components } => { self.put_compose(ty, components, context)?; } crate::Expression::FunctionArgument(index) => { let name_key = match context.origin { FunctionOrigin::Handle(handle) => NameKey::FunctionArgument(handle, index), FunctionOrigin::EntryPoint(ep_index) => { NameKey::EntryPointArgument(ep_index, index) } }; let name = &self.names[&name_key]; write!(self.out, "{}", name)?; } crate::Expression::GlobalVariable(handle) => { let name = &self.names[&NameKey::GlobalVariable(handle)]; write!(self.out, "{}", name)?; } crate::Expression::LocalVariable(handle) => { let name_key = match context.origin { FunctionOrigin::Handle(fun_handle) => { NameKey::FunctionLocal(fun_handle, handle) } FunctionOrigin::EntryPoint(ep_index) => { NameKey::EntryPointLocal(ep_index, handle) } }; let name = &self.names[&name_key]; write!(self.out, "{}", name)?; } crate::Expression::Load { pointer } => self.put_load(pointer, context, is_scoped)?, crate::Expression::ImageSample { image, sampler, gather, coordinate, array_index, offset, level, depth_ref, } => { let main_op = match gather { Some(_) => "gather", None => "sample", }; let comparison_op = match depth_ref { Some(_) => "_compare", None => "", }; self.put_expression(image, context, false)?; write!(self.out, ".{}{}(", main_op, comparison_op)?; self.put_expression(sampler, context, true)?; write!(self.out, ", ")?; self.put_expression(coordinate, context, true)?; if let Some(expr) = array_index { write!(self.out, ", ")?; self.put_expression(expr, context, true)?; } if let Some(dref) = depth_ref { write!(self.out, ", ")?; self.put_expression(dref, context, true)?; } self.put_image_sample_level(image, level, context)?; if let Some(constant) = offset { let coco = ConstantContext { handle: constant, arena: &context.module.constants, names: &self.names, first_time: false, }; write!(self.out, ", {}", coco)?; } match gather { None | Some(crate::SwizzleComponent::X) => {} Some(component) => { let is_cube_map = match *context.resolve_type(image) { crate::TypeInner::Image { dim: crate::ImageDimension::Cube, .. } => true, _ => false, }; // Offset always comes before the gather, except // in cube maps where it's not applicable if offset.is_none() && !is_cube_map { write!(self.out, ", int2(0)")?; } let letter = ['x', 'y', 'z', 'w'][component as usize]; write!(self.out, ", {}::component::{}", NAMESPACE, letter)?; } } write!(self.out, ")")?; } crate::Expression::ImageLoad { image, coordinate, array_index, sample, level, } => { let address = TexelAddress { coordinate, array_index, sample, level: level.map(LevelOfDetail::Direct), }; self.put_image_load(expr_handle, image, address, context)?; } //Note: for all the queries, the signed integers are expected, // so a conversion is needed. crate::Expression::ImageQuery { image, query } => match query { crate::ImageQuery::Size { level } => { self.put_image_size_query( image, level.map(LevelOfDetail::Direct), crate::ScalarKind::Sint, context, )?; } crate::ImageQuery::NumLevels => { write!(self.out, "int(")?; self.put_expression(image, context, false)?; write!(self.out, ".get_num_mip_levels())")?; } crate::ImageQuery::NumLayers => { write!(self.out, "int(")?; self.put_expression(image, context, false)?; write!(self.out, ".get_array_size())")?; } crate::ImageQuery::NumSamples => { write!(self.out, "int(")?; self.put_expression(image, context, false)?; write!(self.out, ".get_num_samples())")?; } }, crate::Expression::Unary { op, expr } => { use crate::{ScalarKind as Sk, UnaryOperator as Uo}; let op_str = match op { Uo::Negate => "-", Uo::Not => match context.resolve_type(expr).scalar_kind() { Some(Sk::Sint) | Some(Sk::Uint) => "~", Some(Sk::Bool) => "!", _ => return Err(Error::Validation), }, }; write!(self.out, "{}", op_str)?; self.put_expression(expr, context, false)?; } crate::Expression::Binary { op, left, right } => { let op_str = crate::back::binary_operation_str(op); let kind = context .resolve_type(left) .scalar_kind() .ok_or(Error::UnsupportedBinaryOp(op))?; // TODO: handle undefined behavior of BinaryOperator::Modulo // // sint: // if right == 0 return 0 // if left == min(type_of(left)) && right == -1 return 0 // if sign(left) == -1 || sign(right) == -1 return result as defined by WGSL // // uint: // if right == 0 return 0 // // float: // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798 if op == crate::BinaryOperator::Modulo && kind == crate::ScalarKind::Float { write!(self.out, "{}::fmod(", NAMESPACE)?; self.put_expression(left, context, true)?; write!(self.out, ", ")?; self.put_expression(right, context, true)?; write!(self.out, ")")?; } else { if !is_scoped { write!(self.out, "(")?; } // Cast packed vector if necessary // Packed vector - matrix multiplications are not supported in MSL if op == crate::BinaryOperator::Multiply && matches!( context.resolve_type(right), &crate::TypeInner::Matrix { .. } ) { self.put_wrapped_expression_for_packed_vec3_access(left, context, false)?; } else { self.put_expression(left, context, false)?; } write!(self.out, " {} ", op_str)?; // See comment above if op == crate::BinaryOperator::Multiply && matches!(context.resolve_type(left), &crate::TypeInner::Matrix { .. }) { self.put_wrapped_expression_for_packed_vec3_access(right, context, false)?; } else { self.put_expression(right, context, false)?; } if !is_scoped { write!(self.out, ")")?; } } } crate::Expression::Select { condition, accept, reject, } => match *context.resolve_type(condition) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Bool, .. } => { if !is_scoped { write!(self.out, "(")?; } self.put_expression(condition, context, false)?; write!(self.out, " ? ")?; self.put_expression(accept, context, false)?; write!(self.out, " : ")?; self.put_expression(reject, context, false)?; if !is_scoped { write!(self.out, ")")?; } } crate::TypeInner::Vector { kind: crate::ScalarKind::Bool, .. } => { write!(self.out, "{}::select(", NAMESPACE)?; self.put_expression(reject, context, true)?; write!(self.out, ", ")?; self.put_expression(accept, context, true)?; write!(self.out, ", ")?; self.put_expression(condition, context, true)?; write!(self.out, ")")?; } _ => return Err(Error::Validation), }, crate::Expression::Derivative { axis, expr } => { let op = match axis { crate::DerivativeAxis::X => "dfdx", crate::DerivativeAxis::Y => "dfdy", crate::DerivativeAxis::Width => "fwidth", }; write!(self.out, "{}::{}", NAMESPACE, op)?; self.put_call_parameters(iter::once(expr), context)?; } crate::Expression::Relational { fun, argument } => { let op = match fun { crate::RelationalFunction::Any => "any", crate::RelationalFunction::All => "all", crate::RelationalFunction::IsNan => "isnan", crate::RelationalFunction::IsInf => "isinf", crate::RelationalFunction::IsFinite => "isfinite", crate::RelationalFunction::IsNormal => "isnormal", }; write!(self.out, "{}::{}", NAMESPACE, op)?; self.put_call_parameters(iter::once(argument), context)?; } crate::Expression::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; let scalar_argument = match *context.resolve_type(arg) { crate::TypeInner::Scalar { .. } => true, _ => false, }; let fun_name = match fun { // comparison Mf::Abs => "abs", Mf::Min => "min", Mf::Max => "max", Mf::Clamp => "clamp", Mf::Saturate => "saturate", // trigonometry Mf::Cos => "cos", Mf::Cosh => "cosh", Mf::Sin => "sin", Mf::Sinh => "sinh", Mf::Tan => "tan", Mf::Tanh => "tanh", Mf::Acos => "acos", Mf::Asin => "asin", Mf::Atan => "atan", Mf::Atan2 => "atan2", Mf::Asinh => "asinh", Mf::Acosh => "acosh", Mf::Atanh => "atanh", Mf::Radians => "", Mf::Degrees => "", // decomposition Mf::Ceil => "ceil", Mf::Floor => "floor", Mf::Round => "rint", Mf::Fract => "fract", Mf::Trunc => "trunc", Mf::Modf => "modf", Mf::Frexp => "frexp", Mf::Ldexp => "ldexp", // exponent Mf::Exp => "exp", Mf::Exp2 => "exp2", Mf::Log => "log", Mf::Log2 => "log2", Mf::Pow => "pow", // geometry Mf::Dot => match *context.resolve_type(arg) { crate::TypeInner::Vector { kind: crate::ScalarKind::Float, .. } => "dot", crate::TypeInner::Vector { size, .. } => { return self.put_dot_product(arg, arg1.unwrap(), size as usize, context) } _ => unreachable!( "Correct TypeInner for dot product should be already validated" ), }, Mf::Outer => return Err(Error::UnsupportedCall(format!("{:?}", fun))), Mf::Cross => "cross", Mf::Distance => "distance", Mf::Length if scalar_argument => "abs", Mf::Length => "length", Mf::Normalize => "normalize", Mf::FaceForward => "faceforward", Mf::Reflect => "reflect", Mf::Refract => "refract", // computational Mf::Sign => "sign", Mf::Fma => "fma", Mf::Mix => "mix", Mf::Step => "step", Mf::SmoothStep => "smoothstep", Mf::Sqrt => "sqrt", Mf::InverseSqrt => "rsqrt", Mf::Inverse => return Err(Error::UnsupportedCall(format!("{:?}", fun))), Mf::Transpose => "transpose", Mf::Determinant => "determinant", // bits Mf::CountOneBits => "popcount", Mf::ReverseBits => "reverse_bits", Mf::ExtractBits => "extract_bits", Mf::InsertBits => "insert_bits", Mf::FindLsb => "", Mf::FindMsb => "", // data packing Mf::Pack4x8snorm => "pack_float_to_snorm4x8", Mf::Pack4x8unorm => "pack_float_to_unorm4x8", Mf::Pack2x16snorm => "pack_float_to_snorm2x16", Mf::Pack2x16unorm => "pack_float_to_unorm2x16", Mf::Pack2x16float => "", // data unpacking Mf::Unpack4x8snorm => "unpack_snorm4x8_to_float", Mf::Unpack4x8unorm => "unpack_unorm4x8_to_float", Mf::Unpack2x16snorm => "unpack_snorm2x16_to_float", Mf::Unpack2x16unorm => "unpack_unorm2x16_to_float", Mf::Unpack2x16float => "", }; if fun == Mf::Distance && scalar_argument { write!(self.out, "{}::abs(", NAMESPACE)?; self.put_expression(arg, context, false)?; write!(self.out, " - ")?; self.put_expression(arg1.unwrap(), context, false)?; write!(self.out, ")")?; } else if fun == Mf::FindLsb { write!(self.out, "((({}::ctz(", NAMESPACE)?; self.put_expression(arg, context, true)?; write!(self.out, ") + 1) % 33) - 1)")?; } else if fun == Mf::FindMsb { write!(self.out, "((({}::clz(", NAMESPACE)?; self.put_expression(arg, context, true)?; write!(self.out, ") + 1) % 33) - 1)")? } else if fun == Mf::Unpack2x16float { write!(self.out, "float2(as_type(")?; self.put_expression(arg, context, false)?; write!(self.out, "))")?; } else if fun == Mf::Pack2x16float { write!(self.out, "as_type(half2(")?; self.put_expression(arg, context, false)?; write!(self.out, "))")?; } else if fun == Mf::Radians { write!(self.out, "((")?; self.put_expression(arg, context, false)?; write!(self.out, ") * 0.017453292519943295474)")?; } else if fun == Mf::Degrees { write!(self.out, "((")?; self.put_expression(arg, context, false)?; write!(self.out, ") * 57.295779513082322865)")?; } else { write!(self.out, "{}::{}", NAMESPACE, fun_name)?; self.put_call_parameters( iter::once(arg).chain(arg1).chain(arg2).chain(arg3), context, )?; } } crate::Expression::As { expr, kind, convert, } => match *context.resolve_type(expr) { crate::TypeInner::Scalar { kind: src_kind, width: src_width, } | crate::TypeInner::Vector { kind: src_kind, width: src_width, .. } => { let is_bool_cast = kind == crate::ScalarKind::Bool || src_kind == crate::ScalarKind::Bool; let op = match convert { Some(w) if w == src_width || is_bool_cast => "static_cast", Some(8) if kind == crate::ScalarKind::Float => { return Err(Error::CapabilityNotSupported(valid::Capabilities::FLOAT64)) } Some(_) => return Err(Error::Validation), None => "as_type", }; write!(self.out, "{}<", op)?; match *context.resolve_type(expr) { crate::TypeInner::Vector { size, .. } => { put_numeric_type(&mut self.out, kind, &[size])? } _ => put_numeric_type(&mut self.out, kind, &[])?, }; write!(self.out, ">(")?; self.put_expression(expr, context, true)?; write!(self.out, ")")?; } crate::TypeInner::Matrix { columns, rows, .. } => { put_numeric_type(&mut self.out, kind, &[rows, columns])?; write!(self.out, "(")?; self.put_expression(expr, context, true)?; write!(self.out, ")")?; } _ => return Err(Error::Validation), }, // has to be a named expression crate::Expression::CallResult(_) | crate::Expression::AtomicResult { .. } => { unreachable!() } crate::Expression::ArrayLength(expr) => { // Find the global to which the array belongs. let global = match context.function.expressions[expr] { crate::Expression::AccessIndex { base, .. } => { match context.function.expressions[base] { crate::Expression::GlobalVariable(handle) => handle, _ => return Err(Error::Validation), } } crate::Expression::GlobalVariable(handle) => handle, _ => return Err(Error::Validation), }; if !is_scoped { write!(self.out, "(")?; } write!(self.out, "1 + ")?; self.put_dynamic_array_max_index(global, context)?; if !is_scoped { write!(self.out, ")")?; } } } Ok(()) } /// Used by expressions like Swizzle and Binary since they need packed_vec3's to be casted to a vec3 fn put_wrapped_expression_for_packed_vec3_access( &mut self, expr_handle: Handle, context: &ExpressionContext, is_scoped: bool, ) -> BackendResult { if let Some(scalar_kind) = context.get_packed_vec_kind(expr_handle) { write!(self.out, "{}::{}3(", NAMESPACE, scalar_kind.to_msl_name())?; self.put_expression(expr_handle, context, is_scoped)?; write!(self.out, ")")?; } else { self.put_expression(expr_handle, context, is_scoped)?; } Ok(()) } /// Write a `GuardedIndex` as a Metal expression. fn put_index( &mut self, index: index::GuardedIndex, context: &ExpressionContext, is_scoped: bool, ) -> BackendResult { match index { index::GuardedIndex::Expression(expr) => { self.put_expression(expr, context, is_scoped)? } index::GuardedIndex::Known(value) => write!(self.out, "{}", value)?, } Ok(()) } /// Emit an index bounds check condition for `chain`, if required. /// /// `chain` is a subtree of `Access` and `AccessIndex` expressions, /// operating either on a pointer to a value, or on a value directly. If we cannot /// statically determine that all indexing operations in `chain` are within /// bounds, then write a conditional expression to check them dynamically, /// and return true. All accesses in the chain are checked by the generated /// expression. /// /// This assumes that the [`BoundsCheckPolicy`] for `chain` is [`ReadZeroSkipWrite`]. /// /// The text written is of the form: /// /// ```ignore /// {level}{prefix}uint(i) < 4 && uint(j) < 10 /// ``` /// /// where `{level}` and `{prefix}` are the arguments to this function. For [`Store`] /// statements, presumably these arguments start an indented `if` statement; for /// [`Load`] expressions, the caller is probably building up a ternary `?:` /// expression. In either case, what is written is not a complete syntactic structure /// in its own right, and the caller will have to finish it off if we return `true`. /// /// If no expression is written, return false. /// /// [`BoundsCheckPolicy`]: index::BoundsCheckPolicy /// [`ReadZeroSkipWrite`]: index::BoundsCheckPolicy::ReadZeroSkipWrite /// [`Store`]: crate::Statement::Store /// [`Load`]: crate::Expression::Load #[allow(unused_variables)] fn put_bounds_checks( &mut self, mut chain: Handle, context: &ExpressionContext, level: back::Level, prefix: &'static str, ) -> Result { let mut check_written = false; // Iterate over the access chain, handling each expression. loop { // Produce a `GuardedIndex`, so we can shared code between the // `Access` and `AccessIndex` cases. let (base, guarded_index) = match context.function.expressions[chain] { crate::Expression::Access { base, index } => { (base, Some(index::GuardedIndex::Expression(index))) } crate::Expression::AccessIndex { base, index } => { // Don't try to check indices into structs. Validation already took // care of them, and index::needs_guard doesn't handle that case. let mut base_inner = context.resolve_type(base); if let crate::TypeInner::Pointer { base, .. } = *base_inner { base_inner = &context.module.types[base].inner; } match *base_inner { crate::TypeInner::Struct { .. } => (base, None), _ => (base, Some(index::GuardedIndex::Known(index))), } } _ => break, }; if let Some(index) = guarded_index { if let Some(length) = context.access_needs_check(base, index) { if check_written { write!(self.out, " && ")?; } else { write!(self.out, "{}{}", level, prefix)?; check_written = true; } // Check that the index falls within bounds. Do this with a single // comparison, by casting the index to `uint` first, so that negative // indices become large positive values. write!(self.out, "uint(")?; self.put_index(index, context, true)?; self.out.write_str(") < ")?; match length { index::IndexableLength::Known(value) => write!(self.out, "{}", value)?, index::IndexableLength::Dynamic => { let global = context .function .originating_global(base) .ok_or(Error::Validation)?; write!(self.out, "1 + ")?; self.put_dynamic_array_max_index(global, context)? } } } } chain = base } Ok(check_written) } /// Write the access chain `chain`. /// /// `chain` is a subtree of [`Access`] and [`AccessIndex`] expressions, /// operating either on a pointer to a value, or on a value directly. /// /// Generate bounds checks code only if `policy` is [`Restrict`]. The /// [`ReadZeroSkipWrite`] policy requires checks before any accesses take place, so /// that must be handled in the caller. /// /// Handle the entire chain, recursing back into `put_expression` only for index /// expressions and the base expression that originates the pointer or composite value /// being accessed. This allows `put_expression` to assume that any `Access` or /// `AccessIndex` expressions it sees are the top of a chain, so it can emit /// `ReadZeroSkipWrite` checks. /// /// [`Access`]: crate::Expression::Access /// [`AccessIndex`]: crate::Expression::AccessIndex /// [`Restrict`]: crate::proc::index::BoundsCheckPolicy::Restrict /// [`ReadZeroSkipWrite`]: crate::proc::index::BoundsCheckPolicy::ReadZeroSkipWrite fn put_access_chain( &mut self, chain: Handle, policy: index::BoundsCheckPolicy, context: &ExpressionContext, ) -> BackendResult { match context.function.expressions[chain] { crate::Expression::Access { base, index } => { let mut base_ty = context.resolve_type(base); // Look through any pointers to see what we're really indexing. if let crate::TypeInner::Pointer { base, space: _ } = *base_ty { base_ty = &context.module.types[base].inner; } self.put_subscripted_access_chain( base, base_ty, index::GuardedIndex::Expression(index), policy, context, )?; } crate::Expression::AccessIndex { base, index } => { let base_resolution = &context.info[base].ty; let mut base_ty = base_resolution.inner_with(&context.module.types); let mut base_ty_handle = base_resolution.handle(); // Look through any pointers to see what we're really indexing. if let crate::TypeInner::Pointer { base, space: _ } = *base_ty { base_ty = &context.module.types[base].inner; base_ty_handle = Some(base); } // Handle structs and anything else that can use `.x` syntax here, so // `put_subscripted_access_chain` won't have to handle the absurd case of // indexing a struct with an expression. match *base_ty { crate::TypeInner::Struct { .. } => { let base_ty = base_ty_handle.unwrap(); self.put_access_chain(base, policy, context)?; let name = &self.names[&NameKey::StructMember(base_ty, index)]; write!(self.out, ".{}", name)?; } crate::TypeInner::ValuePointer { .. } | crate::TypeInner::Vector { .. } => { self.put_access_chain(base, policy, context)?; // Prior to Metal v2.1 component access for packed vectors wasn't available // however array indexing is if context.get_packed_vec_kind(base).is_some() { write!(self.out, "[{}]", index)?; } else { write!(self.out, ".{}", back::COMPONENTS[index as usize])?; } } _ => { self.put_subscripted_access_chain( base, base_ty, index::GuardedIndex::Known(index), policy, context, )?; } } } _ => self.put_expression(chain, context, false)?, } Ok(()) } /// Write a `[]`-style access of `base` by `index`. /// /// If `policy` is [`Restrict`], then generate code as needed to force all index /// values within bounds. /// /// The `base_ty` argument must be the type we are actually indexing, like [`Array`] or /// [`Vector`]. In other words, it's `base`'s type with any surrounding [`Pointer`] /// removed. Our callers often already have this handy. /// /// This only emits `[]` expressions; it doesn't handle struct member accesses or /// referencing vector components by name. /// /// [`Restrict`]: crate::proc::index::BoundsCheckPolicy::Restrict /// [`Array`]: crate::TypeInner::Array /// [`Vector`]: crate::TypeInner::Vector /// [`Pointer`]: crate::TypeInner::Pointer fn put_subscripted_access_chain( &mut self, base: Handle, base_ty: &crate::TypeInner, index: index::GuardedIndex, policy: index::BoundsCheckPolicy, context: &ExpressionContext, ) -> BackendResult { let accessing_wrapped_array = match *base_ty { crate::TypeInner::Array { size: crate::ArraySize::Constant(_), .. } => true, _ => false, }; self.put_access_chain(base, policy, context)?; if accessing_wrapped_array { write!(self.out, ".{}", WRAPPED_ARRAY_FIELD)?; } write!(self.out, "[")?; // Decide whether this index needs to be clamped to fall within range. let restriction_needed = if policy == index::BoundsCheckPolicy::Restrict { context.access_needs_check(base, index) } else { None }; if let Some(limit) = restriction_needed { write!(self.out, "{}::min(unsigned(", NAMESPACE)?; self.put_index(index, context, true)?; write!(self.out, "), ")?; match limit { index::IndexableLength::Known(limit) => { write!(self.out, "{}u", limit - 1)?; } index::IndexableLength::Dynamic => { let global = context .function .originating_global(base) .ok_or(Error::Validation)?; self.put_dynamic_array_max_index(global, context)?; } } write!(self.out, ")")?; } else { self.put_index(index, context, true)?; } write!(self.out, "]")?; Ok(()) } fn put_load( &mut self, pointer: Handle, context: &ExpressionContext, is_scoped: bool, ) -> BackendResult { // Since access chains never cross between address spaces, we can just // check the index bounds check policy once at the top. let policy = context.choose_bounds_check_policy(pointer); if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite && self.put_bounds_checks( pointer, context, back::Level(0), if is_scoped { "" } else { "(" }, )? { write!(self.out, " ? ")?; self.put_unchecked_load(pointer, policy, context)?; write!(self.out, " : DefaultConstructible()")?; if !is_scoped { write!(self.out, ")")?; } } else { self.put_unchecked_load(pointer, policy, context)?; } Ok(()) } fn put_unchecked_load( &mut self, pointer: Handle, policy: index::BoundsCheckPolicy, context: &ExpressionContext, ) -> BackendResult { let is_atomic = match *context.resolve_type(pointer) { crate::TypeInner::Pointer { base, .. } => match context.module.types[base].inner { crate::TypeInner::Atomic { .. } => true, _ => false, }, _ => false, }; if is_atomic { write!( self.out, "{}::atomic_load_explicit({}", NAMESPACE, ATOMIC_REFERENCE )?; self.put_access_chain(pointer, policy, context)?; write!(self.out, ", {}::memory_order_relaxed)", NAMESPACE)?; } else { // We don't do any dereferencing with `*` here as pointer arguments to functions // are done by `&` references and not `*` pointers. These do not need to be // dereferenced. self.put_access_chain(pointer, policy, context)?; } Ok(()) } fn put_return_value( &mut self, level: back::Level, expr_handle: Handle, result_struct: Option<&str>, context: &ExpressionContext, ) -> BackendResult { match result_struct { Some(struct_name) => { let mut has_point_size = false; let result_ty = context.function.result.as_ref().unwrap().ty; match context.module.types[result_ty].inner { crate::TypeInner::Struct { ref members, .. } => { let tmp = "_tmp"; write!(self.out, "{}const auto {} = ", level, tmp)?; self.put_expression(expr_handle, context, true)?; writeln!(self.out, ";")?; write!(self.out, "{}return {} {{", level, struct_name)?; let mut is_first = true; for (index, member) in members.iter().enumerate() { match member.binding { Some(crate::Binding::BuiltIn(crate::BuiltIn::PointSize)) => { has_point_size = true; if !context.pipeline_options.allow_point_size { continue; } } Some(crate::Binding::BuiltIn(crate::BuiltIn::CullDistance)) => { log::warn!("Ignoring CullDistance built-in"); continue; } _ => {} } let comma = if is_first { "" } else { "," }; is_first = false; let name = &self.names[&NameKey::StructMember(result_ty, index as u32)]; // HACK: we are forcefully deduplicating the expression here // to convert from a wrapped struct to a raw array, e.g. // `float gl_ClipDistance1 [[clip_distance]] [1];`. if let crate::TypeInner::Array { size: crate::ArraySize::Constant(const_handle), .. } = context.module.types[member.ty].inner { let size = context.module.constants[const_handle] .to_array_length() .unwrap(); write!(self.out, "{} {{", comma)?; for j in 0..size { if j != 0 { write!(self.out, ",")?; } write!( self.out, "{}.{}.{}[{}]", tmp, name, WRAPPED_ARRAY_FIELD, j )?; } write!(self.out, "}}")?; } else { write!(self.out, "{} {}.{}", comma, tmp, name)?; } } } _ => { write!(self.out, "{}return {} {{ ", level, struct_name)?; self.put_expression(expr_handle, context, true)?; } } if let FunctionOrigin::EntryPoint(ep_index) = context.origin { let stage = context.module.entry_points[ep_index as usize].stage; if context.pipeline_options.allow_point_size && stage == crate::ShaderStage::Vertex && !has_point_size { // point size was injected and comes last write!(self.out, ", 1.0")?; } } write!(self.out, " }}")?; } None => { write!(self.out, "{}return ", level)?; self.put_expression(expr_handle, context, true)?; } } writeln!(self.out, ";")?; Ok(()) } /// Helper method used to find which expressions of a given function require baking /// /// # Notes /// This function overwrites the contents of `self.need_bake_expressions` fn update_expressions_to_bake( &mut self, func: &crate::Function, info: &valid::FunctionInfo, context: &ExpressionContext, ) { use crate::Expression; self.need_bake_expressions.clear(); for expr in func.expressions.iter() { // Expressions whose reference count is above the // threshold should always be stored in temporaries. let expr_info = &info[expr.0]; let min_ref_count = func.expressions[expr.0].bake_ref_count(); if min_ref_count <= expr_info.ref_count { self.need_bake_expressions.insert(expr.0); } // WGSL's `dot` function works on any `vecN` type, but Metal's only // works on floating-point vectors, so we emit inline code for // integer vector `dot` calls. But that code uses each argument `N` // times, once for each component (see `put_dot_product`), so to // avoid duplicated evaluation, we must bake integer operands. if let ( fun_handle, &Expression::Math { fun: crate::MathFunction::Dot, arg, arg1, .. }, ) = expr { use crate::TypeInner; // check what kind of product this is depending // on the resolve type of the Dot function itself let inner = context.resolve_type(fun_handle); if let TypeInner::Scalar { kind, .. } = *inner { match kind { crate::ScalarKind::Sint | crate::ScalarKind::Uint => { self.need_bake_expressions.insert(arg); self.need_bake_expressions.insert(arg1.unwrap()); } _ => {} } } } } } fn start_baking_expression( &mut self, handle: Handle, context: &ExpressionContext, name: &str, ) -> BackendResult { match context.info[handle].ty { TypeResolution::Handle(ty_handle) => { let ty_name = TypeContext { handle: ty_handle, module: context.module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; write!(self.out, "{}", ty_name)?; } TypeResolution::Value(crate::TypeInner::Scalar { kind, .. }) => { put_numeric_type(&mut self.out, kind, &[])?; } TypeResolution::Value(crate::TypeInner::Vector { size, kind, .. }) => { put_numeric_type(&mut self.out, kind, &[size])?; } TypeResolution::Value(crate::TypeInner::Matrix { columns, rows, .. }) => { put_numeric_type(&mut self.out, crate::ScalarKind::Float, &[rows, columns])?; } TypeResolution::Value(ref other) => { log::warn!("Type {:?} isn't a known local", other); //TEMP! return Err(Error::FeatureNotImplemented("weird local type".to_string())); } } //TODO: figure out the naming scheme that wouldn't collide with user names. write!(self.out, " {} = ", name)?; Ok(()) } /// Cache a clamped level of detail value, if necessary. /// /// [`ImageLoad`] accesses covered by [`BoundsCheckPolicy::Restrict`] use a /// properly clamped level of detail value both in the access itself, and /// for fetching the size of the requested MIP level, needed to clamp the /// coordinates. To avoid recomputing this clamped level of detail, we cache /// it in a temporary variable, as part of the [`Emit`] statement covering /// the [`ImageLoad`] expression. /// /// [`ImageLoad`]: crate::Expression::ImageLoad /// [`BoundsCheckPolicy::Restrict`]: index::BoundsCheckPolicy::Restrict /// [`Emit`]: crate::Statement::Emit fn put_cache_restricted_level( &mut self, load: Handle, image: Handle, mip_level: Option>, indent: back::Level, context: &StatementContext, ) -> BackendResult { // Does this image access actually require (or even permit) a // level-of-detail, and does the policy require us to restrict it? let level_of_detail = match mip_level { Some(level) => level, None => return Ok(()), }; if context.expression.policies.image != index::BoundsCheckPolicy::Restrict || !context.expression.image_needs_lod(image) { return Ok(()); } write!( self.out, "{}uint {}{} = ", indent, CLAMPED_LOD_LOAD_PREFIX, load.index(), )?; self.put_restricted_scalar_image_index( image, level_of_detail, "get_num_mip_levels", &context.expression, )?; writeln!(self.out, ";")?; Ok(()) } fn put_block( &mut self, level: back::Level, statements: &[crate::Statement], context: &StatementContext, ) -> BackendResult { // Add to the set in order to track the stack size. #[cfg(test)] #[allow(trivial_casts)] self.put_block_stack_pointers .insert(&level as *const _ as *const ()); for statement in statements { log::trace!("statement[{}] {:?}", level.0, statement); match *statement { crate::Statement::Emit(ref range) => { for handle in range.clone() { // `ImageLoad` expressions covered by the `Restrict` bounds check policy // may need to cache a clamped version of their level-of-detail argument. if let crate::Expression::ImageLoad { image, level: mip_level, .. } = context.expression.function.expressions[handle] { self.put_cache_restricted_level( handle, image, mip_level, level, context, )?; } let info = &context.expression.info[handle]; let ptr_class = info .ty .inner_with(&context.expression.module.types) .pointer_space(); let expr_name = if ptr_class.is_some() { None // don't bake pointer expressions (just yet) } else if let Some(name) = context.expression.function.named_expressions.get(&handle) { // The `crate::Function::named_expressions` table holds // expressions that should be saved in temporaries once they // are `Emit`ted. We only add them to `self.named_expressions` // when we reach the `Emit` that covers them, so that we don't // try to use their names before we've actually initialized // the temporary that holds them. // // Don't assume the names in `named_expressions` are unique, // or even valid. Use the `Namer`. Some(self.namer.call(name)) } else if info.ref_count == 0 { Some(self.namer.call("")) } else { // If this expression is an index that we're going to first compare // against a limit, and then actually use as an index, then we may // want to cache it in a temporary, to avoid evaluating it twice. let bake = if context.expression.guarded_indices.contains(handle.index()) { true } else { self.need_bake_expressions.contains(&handle) }; if bake { Some(format!("{}{}", back::BAKE_PREFIX, handle.index())) } else { None } }; if let Some(name) = expr_name { write!(self.out, "{}", level)?; self.start_baking_expression(handle, &context.expression, &name)?; self.put_expression(handle, &context.expression, true)?; self.named_expressions.insert(handle, name); writeln!(self.out, ";")?; } } } crate::Statement::Block(ref block) => { if !block.is_empty() { writeln!(self.out, "{}{{", level)?; self.put_block(level.next(), block, context)?; writeln!(self.out, "{}}}", level)?; } } crate::Statement::If { condition, ref accept, ref reject, } => { write!(self.out, "{}if (", level)?; self.put_expression(condition, &context.expression, true)?; writeln!(self.out, ") {{")?; self.put_block(level.next(), accept, context)?; if !reject.is_empty() { writeln!(self.out, "{}}} else {{", level)?; self.put_block(level.next(), reject, context)?; } writeln!(self.out, "{}}}", level)?; } crate::Statement::Switch { selector, ref cases, } => { write!(self.out, "{}switch(", level)?; self.put_expression(selector, &context.expression, true)?; let type_postfix = match *context.expression.resolve_type(selector) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, .. } => "u", _ => "", }; writeln!(self.out, ") {{")?; let lcase = level.next(); for case in cases.iter() { match case.value { crate::SwitchValue::Integer(value) => { writeln!(self.out, "{}case {}{}: {{", lcase, value, type_postfix)?; } crate::SwitchValue::Default => { writeln!(self.out, "{}default: {{", lcase)?; } } self.put_block(lcase.next(), &case.body, context)?; if !case.fall_through && case.body.last().map_or(true, |s| !s.is_terminator()) { writeln!(self.out, "{}break;", lcase.next())?; } writeln!(self.out, "{}}}", lcase)?; } writeln!(self.out, "{}}}", level)?; } crate::Statement::Loop { ref body, ref continuing, break_if, } => { if !continuing.is_empty() || break_if.is_some() { let gate_name = self.namer.call("loop_init"); writeln!(self.out, "{}bool {} = true;", level, gate_name)?; writeln!(self.out, "{}while(true) {{", level)?; let lif = level.next(); let lcontinuing = lif.next(); writeln!(self.out, "{}if (!{}) {{", lif, gate_name)?; self.put_block(lcontinuing, continuing, context)?; if let Some(condition) = break_if { write!(self.out, "{}if (", lcontinuing)?; self.put_expression(condition, &context.expression, true)?; writeln!(self.out, ") {{")?; writeln!(self.out, "{}break;", lcontinuing.next())?; writeln!(self.out, "{}}}", lcontinuing)?; } writeln!(self.out, "{}}}", lif)?; writeln!(self.out, "{}{} = false;", lif, gate_name)?; } else { writeln!(self.out, "{}while(true) {{", level)?; } self.put_block(level.next(), body, context)?; writeln!(self.out, "{}}}", level)?; } crate::Statement::Break => { writeln!(self.out, "{}break;", level)?; } crate::Statement::Continue => { writeln!(self.out, "{}continue;", level)?; } crate::Statement::Return { value: Some(expr_handle), } => { self.put_return_value( level, expr_handle, context.result_struct, &context.expression, )?; } crate::Statement::Return { value: None } => { writeln!(self.out, "{}return;", level)?; } crate::Statement::Kill => { writeln!(self.out, "{}{}::discard_fragment();", level, NAMESPACE)?; } crate::Statement::Barrier(flags) => { //Note: OR-ring bitflags requires `__HAVE_MEMFLAG_OPERATORS__`, // so we try to avoid it here. if flags.is_empty() { writeln!( self.out, "{}{}::threadgroup_barrier({}::mem_flags::mem_none);", level, NAMESPACE, NAMESPACE, )?; } if flags.contains(crate::Barrier::STORAGE) { writeln!( self.out, "{}{}::threadgroup_barrier({}::mem_flags::mem_device);", level, NAMESPACE, NAMESPACE, )?; } if flags.contains(crate::Barrier::WORK_GROUP) { writeln!( self.out, "{}{}::threadgroup_barrier({}::mem_flags::mem_threadgroup);", level, NAMESPACE, NAMESPACE, )?; } } crate::Statement::Store { pointer, value } => { self.put_store(pointer, value, level, context)? } crate::Statement::ImageStore { image, coordinate, array_index, value, } => { let address = TexelAddress { coordinate, array_index, sample: None, level: None, }; self.put_image_store(level, image, &address, value, context)? } crate::Statement::Call { function, ref arguments, result, } => { write!(self.out, "{}", level)?; if let Some(expr) = result { let name = format!("{}{}", back::BAKE_PREFIX, expr.index()); self.start_baking_expression(expr, &context.expression, &name)?; self.named_expressions.insert(expr, name); } let fun_name = &self.names[&NameKey::Function(function)]; write!(self.out, "{}(", fun_name)?; // first, write down the actual arguments for (i, &handle) in arguments.iter().enumerate() { if i != 0 { write!(self.out, ", ")?; } self.put_expression(handle, &context.expression, true)?; } // follow-up with any global resources used let mut separate = !arguments.is_empty(); let fun_info = &context.mod_info[function]; let mut supports_array_length = false; for (handle, var) in context.expression.module.global_variables.iter() { if fun_info[handle].is_empty() { continue; } if var.space.needs_pass_through() { let name = &self.names[&NameKey::GlobalVariable(handle)]; if separate { write!(self.out, ", ")?; } else { separate = true; } write!(self.out, "{}", name)?; } supports_array_length |= needs_array_length(var.ty, &context.expression.module.types); } if supports_array_length { if separate { write!(self.out, ", ")?; } write!(self.out, "_buffer_sizes")?; } // done writeln!(self.out, ");")?; } crate::Statement::Atomic { pointer, ref fun, value, result, } => { write!(self.out, "{}", level)?; if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun { let res_name = format!("{}{}", back::BAKE_PREFIX, cmp.index()); self.named_expressions.insert(result, res_name); // returned bool is useless let context = &context.expression; let policy = context.choose_bounds_check_policy(pointer); let checked = policy == index::BoundsCheckPolicy::ReadZeroSkipWrite && self.put_bounds_checks(pointer, context, back::Level(0), "")?; if checked { write!(self.out, " ? ")?; } write!(self.out, "{}::atomic_compare_exchange_weak_explicit({}", NAMESPACE, ATOMIC_REFERENCE)?; self.put_access_chain(pointer, policy, context)?; write!(self.out, ", ")?; write!(self.out, "{}", ATOMIC_REFERENCE)?; self.put_access_chain(cmp, policy, context)?; write!(self.out, ", ")?; self.put_expression(value, context, true)?; write!(self.out, ", {}::memory_order_relaxed", NAMESPACE)?; write!(self.out, ", {}::memory_order_relaxed)", NAMESPACE)?; if checked { write!(self.out, " : DefaultConstructible()")?; } writeln!(self.out, ";")?; continue; } let res_name = format!("{}{}", back::BAKE_PREFIX, result.index()); self.start_baking_expression(result, &context.expression, &res_name)?; self.named_expressions.insert(result, res_name); match *fun { crate::AtomicFunction::Add => { self.put_atomic_fetch(pointer, "add", value, &context.expression)?; } crate::AtomicFunction::Subtract => { self.put_atomic_fetch(pointer, "sub", value, &context.expression)?; } crate::AtomicFunction::And => { self.put_atomic_fetch(pointer, "and", value, &context.expression)?; } crate::AtomicFunction::InclusiveOr => { self.put_atomic_fetch(pointer, "or", value, &context.expression)?; } crate::AtomicFunction::ExclusiveOr => { self.put_atomic_fetch(pointer, "xor", value, &context.expression)?; } crate::AtomicFunction::Min => { self.put_atomic_fetch(pointer, "min", value, &context.expression)?; } crate::AtomicFunction::Max => { self.put_atomic_fetch(pointer, "max", value, &context.expression)?; } crate::AtomicFunction::Exchange { compare: None } => { write!( self.out, "{}::atomic_exchange_explicit({}", NAMESPACE, ATOMIC_REFERENCE, )?; self.put_expression(pointer, &context.expression, true)?; write!(self.out, ", ")?; self.put_expression(value, &context.expression, true)?; write!(self.out, ", {}::memory_order_relaxed)", NAMESPACE)?; } _ => {}, } // done writeln!(self.out, ";")?; } } } // un-emit expressions //TODO: take care of loop/continuing? for statement in statements { if let crate::Statement::Emit(ref range) = *statement { for handle in range.clone() { self.named_expressions.remove(&handle); } } } Ok(()) } fn put_store( &mut self, pointer: Handle, value: Handle, level: back::Level, context: &StatementContext, ) -> BackendResult { let policy = context.expression.choose_bounds_check_policy(pointer); if policy == index::BoundsCheckPolicy::ReadZeroSkipWrite && self.put_bounds_checks(pointer, &context.expression, level, "if (")? { writeln!(self.out, ") {{")?; self.put_unchecked_store(pointer, value, policy, level.next(), context)?; writeln!(self.out, "{}}}", level)?; } else { self.put_unchecked_store(pointer, value, policy, level, context)?; } Ok(()) } fn put_unchecked_store( &mut self, pointer: Handle, value: Handle, policy: index::BoundsCheckPolicy, level: back::Level, context: &StatementContext, ) -> BackendResult { let pointer_inner = context.expression.resolve_type(pointer); let (array_size, is_atomic) = match *pointer_inner { crate::TypeInner::Pointer { base, .. } => { match context.expression.module.types[base].inner { crate::TypeInner::Array { size: crate::ArraySize::Constant(ch), .. } => (Some(ch), false), crate::TypeInner::Atomic { .. } => (None, true), _ => (None, false), } } _ => (None, false), }; // we can't assign fixed-size arrays if let Some(const_handle) = array_size { let size = context.expression.module.constants[const_handle] .to_array_length() .unwrap(); write!(self.out, "{}for(int _i=0; _i<{}; ++_i) ", level, size)?; self.put_access_chain(pointer, policy, &context.expression)?; write!(self.out, ".{}[_i] = ", WRAPPED_ARRAY_FIELD)?; self.put_expression(value, &context.expression, true)?; writeln!(self.out, ".{}[_i];", WRAPPED_ARRAY_FIELD)?; } else if is_atomic { write!( self.out, "{}{}::atomic_store_explicit({}", level, NAMESPACE, ATOMIC_REFERENCE )?; self.put_access_chain(pointer, policy, &context.expression)?; write!(self.out, ", ")?; self.put_expression(value, &context.expression, true)?; writeln!(self.out, ", {}::memory_order_relaxed);", NAMESPACE)?; } else { write!(self.out, "{}", level)?; self.put_access_chain(pointer, policy, &context.expression)?; write!(self.out, " = ")?; self.put_expression(value, &context.expression, true)?; writeln!(self.out, ";")?; } Ok(()) } pub fn write( &mut self, module: &crate::Module, info: &valid::ModuleInfo, options: &Options, pipeline_options: &PipelineOptions, ) -> Result { self.names.clear(); self.namer .reset(module, super::keywords::RESERVED, &[], &mut self.names); self.struct_member_pads.clear(); writeln!( self.out, "// language: metal{}.{}", options.lang_version.0, options.lang_version.1 )?; writeln!(self.out, "#include ")?; writeln!(self.out, "#include ")?; writeln!(self.out)?; // Work around Metal bug where `uint` is not available by default writeln!(self.out, "using {}::uint;", NAMESPACE)?; writeln!(self.out)?; if options .bounds_check_policies .contains(index::BoundsCheckPolicy::ReadZeroSkipWrite) { self.put_default_constructible()?; } { let mut indices = vec![]; for (handle, var) in module.global_variables.iter() { if needs_array_length(var.ty, &module.types) { let idx = handle.index(); indices.push(idx); } } if !indices.is_empty() { writeln!(self.out, "struct _mslBufferSizes {{")?; for idx in indices { writeln!(self.out, "{}uint size{};", back::INDENT, idx)?; } writeln!(self.out, "}};")?; writeln!(self.out)?; } }; self.write_scalar_constants(module)?; self.write_type_defs(module)?; self.write_composite_constants(module)?; self.write_functions(module, info, options, pipeline_options) } /// Write the definition for the `DefaultConstructible` class. /// /// The [`ReadZeroSkipWrite`] bounds check policy requires us to be able to /// produce 'zero' values for any type, including structs, arrays, and so /// on. We could do this by emitting default constructor applications, but /// that would entail printing the name of the type, which is more trouble /// than you'd think. Instead, we just construct this magic C++14 class that /// can be converted to any type that can be default constructed, using /// template parameter inference to detect which type is needed, so we don't /// have to figure out the name. /// /// [`ReadZeroSkipWrite`]: index::BoundsCheckPolicy::ReadZeroSkipWrite fn put_default_constructible(&mut self) -> BackendResult { writeln!(self.out, "struct DefaultConstructible {{")?; writeln!(self.out, " template")?; writeln!(self.out, " operator T() && {{")?; writeln!(self.out, " return T {{}};")?; writeln!(self.out, " }}")?; writeln!(self.out, "}};")?; Ok(()) } fn write_type_defs(&mut self, module: &crate::Module) -> BackendResult { for (handle, ty) in module.types.iter() { if !ty.needs_alias() { continue; } let name = &self.names[&NameKey::Type(handle)]; match ty.inner { // Naga IR can pass around arrays by value, but Metal, following // C++, performs an array-to-pointer conversion (C++ [conv.array]) // on expressions of array type, so assigning the array by value // isn't possible. However, Metal *does* assign structs by // value. So in our Metal output, we wrap all array types in // synthetic struct types: // // struct type1 { // float inner[10] // }; // // Then we carefully include `.inner` (`WRAPPED_ARRAY_FIELD`) in // any expression that actually wants access to the array. crate::TypeInner::Array { base, size, stride: _, } => { let base_name = TypeContext { handle: base, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; match size { crate::ArraySize::Constant(const_handle) => { let coco = ConstantContext { handle: const_handle, arena: &module.constants, names: &self.names, first_time: false, }; writeln!(self.out, "struct {} {{", name)?; writeln!( self.out, "{}{} {}[{}];", back::INDENT, base_name, WRAPPED_ARRAY_FIELD, coco )?; writeln!(self.out, "}};")?; } crate::ArraySize::Dynamic => { writeln!(self.out, "typedef {} {}[1];", base_name, name)?; } } } crate::TypeInner::Struct { ref members, span, .. } => { writeln!(self.out, "struct {} {{", name)?; let mut last_offset = 0; for (index, member) in members.iter().enumerate() { // quick and dirty way to figure out if we need this... if member.binding.is_none() && member.offset > last_offset { self.struct_member_pads.insert((handle, index as u32)); let pad = member.offset - last_offset; writeln!(self.out, "{}char _pad{}[{}];", back::INDENT, index, pad)?; } let ty_inner = &module.types[member.ty].inner; last_offset = member.offset + ty_inner.size(&module.constants); let member_name = &self.names[&NameKey::StructMember(handle, index as u32)]; // If the member should be packed (as is the case for a misaligned vec3) issue a packed vector match should_pack_struct_member(members, span, index, module) { Some(kind) => { writeln!( self.out, "{}{}::packed_{}3 {};", back::INDENT, NAMESPACE, kind.to_msl_name(), member_name )?; } None => { let base_name = TypeContext { handle: member.ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; writeln!( self.out, "{}{} {};", back::INDENT, base_name, member_name )?; // for 3-component vectors, add one component if let crate::TypeInner::Vector { size: crate::VectorSize::Tri, kind: _, width, } = *ty_inner { last_offset += width as u32; } } } } writeln!(self.out, "}};")?; } _ => { let ty_name = TypeContext { handle, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: true, }; writeln!(self.out, "typedef {} {};", ty_name, name)?; } } } Ok(()) } fn write_scalar_constants(&mut self, module: &crate::Module) -> BackendResult { for (handle, constant) in module.constants.iter() { match constant.inner { crate::ConstantInner::Scalar { width: _, ref value, } if constant.name.is_some() => { debug_assert!(constant.needs_alias()); write!(self.out, "constexpr constant ")?; match *value { crate::ScalarValue::Sint(_) => { write!(self.out, "int")?; } crate::ScalarValue::Uint(_) => { write!(self.out, "unsigned")?; } crate::ScalarValue::Float(_) => { write!(self.out, "float")?; } crate::ScalarValue::Bool(_) => { write!(self.out, "bool")?; } } let name = &self.names[&NameKey::Constant(handle)]; let coco = ConstantContext { handle, arena: &module.constants, names: &self.names, first_time: true, }; writeln!(self.out, " {} = {};", name, coco)?; } _ => {} } } Ok(()) } fn write_composite_constants(&mut self, module: &crate::Module) -> BackendResult { for (handle, constant) in module.constants.iter() { match constant.inner { crate::ConstantInner::Scalar { .. } => {} crate::ConstantInner::Composite { ty, ref components } => { debug_assert!(constant.needs_alias()); let name = &self.names[&NameKey::Constant(handle)]; let ty_name = TypeContext { handle: ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; write!(self.out, "constant {} {} = {{", ty_name, name,)?; for (i, &sub_handle) in components.iter().enumerate() { // insert padding initialization, if needed if self.struct_member_pads.contains(&(ty, i as u32)) { write!(self.out, ", {{}}")?; } let separator = if i != 0 { ", " } else { "" }; let coco = ConstantContext { handle: sub_handle, arena: &module.constants, names: &self.names, first_time: false, }; write!(self.out, "{}{}", separator, coco)?; } writeln!(self.out, "}};")?; } } } Ok(()) } fn put_inline_sampler_properties( &mut self, level: back::Level, sampler: &sm::InlineSampler, ) -> BackendResult { for (&letter, address) in ['s', 't', 'r'].iter().zip(sampler.address.iter()) { writeln!( self.out, "{}{}::{}_address::{},", level, NAMESPACE, letter, address.as_str(), )?; } writeln!( self.out, "{}{}::mag_filter::{},", level, NAMESPACE, sampler.mag_filter.as_str(), )?; writeln!( self.out, "{}{}::min_filter::{},", level, NAMESPACE, sampler.min_filter.as_str(), )?; if let Some(filter) = sampler.mip_filter { writeln!( self.out, "{}{}::mip_filter::{},", level, NAMESPACE, filter.as_str(), )?; } // avoid setting it on platforms that don't support it if sampler.border_color != sm::BorderColor::TransparentBlack { writeln!( self.out, "{}{}::border_color::{},", level, NAMESPACE, sampler.border_color.as_str(), )?; } //TODO: I'm not able to feed this in a way that MSL likes: //>error: use of undeclared identifier 'lod_clamp' //>error: no member named 'max_anisotropy' in namespace 'metal' if false { if let Some(ref lod) = sampler.lod_clamp { writeln!(self.out, "{}lod_clamp({},{}),", level, lod.start, lod.end,)?; } if let Some(aniso) = sampler.max_anisotropy { writeln!(self.out, "{}max_anisotropy({}),", level, aniso.get(),)?; } } if sampler.compare_func != sm::CompareFunc::Never { writeln!( self.out, "{}{}::compare_func::{},", level, NAMESPACE, sampler.compare_func.as_str(), )?; } writeln!( self.out, "{}{}::coord::{}", level, NAMESPACE, sampler.coord.as_str() )?; Ok(()) } // Returns the array of mapped entry point names. fn write_functions( &mut self, module: &crate::Module, mod_info: &valid::ModuleInfo, options: &Options, pipeline_options: &PipelineOptions, ) -> Result { let mut pass_through_globals = Vec::new(); for (fun_handle, fun) in module.functions.iter() { log::trace!( "function {:?}, handle {:?}", fun.name.as_deref().unwrap_or("(anonymous)"), fun_handle ); let fun_info = &mod_info[fun_handle]; pass_through_globals.clear(); let mut supports_array_length = false; for (handle, var) in module.global_variables.iter() { if !fun_info[handle].is_empty() { if var.space.needs_pass_through() { pass_through_globals.push(handle); } supports_array_length |= needs_array_length(var.ty, &module.types); } } writeln!(self.out)?; let fun_name = &self.names[&NameKey::Function(fun_handle)]; match fun.result { Some(ref result) => { let ty_name = TypeContext { handle: result.ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; write!(self.out, "{}", ty_name)?; } None => { write!(self.out, "void")?; } } writeln!(self.out, " {}(", fun_name)?; for (index, arg) in fun.arguments.iter().enumerate() { let name = &self.names[&NameKey::FunctionArgument(fun_handle, index as u32)]; let param_type_name = TypeContext { handle: arg.ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; let separator = separate( !pass_through_globals.is_empty() || index + 1 != fun.arguments.len() || supports_array_length, ); writeln!( self.out, "{}{} {}{}", back::INDENT, param_type_name, name, separator )?; } for (index, &handle) in pass_through_globals.iter().enumerate() { let tyvar = TypedGlobalVariable { module, names: &self.names, handle, usage: fun_info[handle], binding: None, reference: true, }; let separator = separate(index + 1 != pass_through_globals.len() || supports_array_length); write!(self.out, "{}", back::INDENT)?; tyvar.try_fmt(&mut self.out)?; writeln!(self.out, "{}", separator)?; } if supports_array_length { writeln!( self.out, "{}constant _mslBufferSizes& _buffer_sizes", back::INDENT )?; } writeln!(self.out, ") {{")?; for (local_handle, local) in fun.local_variables.iter() { let ty_name = TypeContext { handle: local.ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; let local_name = &self.names[&NameKey::FunctionLocal(fun_handle, local_handle)]; write!(self.out, "{}{} {}", back::INDENT, ty_name, local_name)?; match local.init { Some(value) => { let coco = ConstantContext { handle: value, arena: &module.constants, names: &self.names, first_time: false, }; write!(self.out, " = {}", coco)?; } None => { write!(self.out, " = {{}}")?; } }; writeln!(self.out, ";")?; } let guarded_indices = index::find_checked_indexes(module, fun, fun_info, options.bounds_check_policies); let context = StatementContext { expression: ExpressionContext { function: fun, origin: FunctionOrigin::Handle(fun_handle), info: fun_info, policies: options.bounds_check_policies, guarded_indices, module, pipeline_options, }, mod_info, result_struct: None, }; self.named_expressions.clear(); self.update_expressions_to_bake(fun, fun_info, &context.expression); self.put_block(back::Level(1), &fun.body, &context)?; writeln!(self.out, "}}")?; } let mut info = TranslationInfo { entry_point_names: Vec::with_capacity(module.entry_points.len()), }; for (ep_index, ep) in module.entry_points.iter().enumerate() { let fun = &ep.function; let fun_info = mod_info.get_entry_point(ep_index); let mut ep_error = None; log::trace!( "entry point {:?}, index {:?}", fun.name.as_deref().unwrap_or("(anonymous)"), ep_index ); // Is any global variable used by this entry point dynamically sized? let supports_array_length = module .global_variables .iter() .filter(|&(handle, _)| !fun_info[handle].is_empty()) .any(|(_, var)| needs_array_length(var.ty, &module.types)); // skip this entry point if any global bindings are missing, // or their types are incompatible. if !options.fake_missing_bindings { for (var_handle, var) in module.global_variables.iter() { if fun_info[var_handle].is_empty() { continue; } if let Some(ref br) = var.binding { let good = match options.per_stage_map[ep.stage].resources.get(br) { Some(target) => { let binding_ty = match module.types[var.ty].inner { crate::TypeInner::BindingArray { base, .. } => { &module.types[base].inner } ref ty => ty, }; match *binding_ty { crate::TypeInner::Image { .. } => target.texture.is_some(), crate::TypeInner::Sampler { .. } => target.sampler.is_some(), _ => target.buffer.is_some(), } } None => false, }; if !good { ep_error = Some(super::EntryPointError::MissingBinding(br.clone())); break; } } if var.space == crate::AddressSpace::PushConstant { if let Err(e) = options.resolve_push_constants(ep.stage) { ep_error = Some(e); break; } } } if supports_array_length { if let Err(err) = options.resolve_sizes_buffer(ep.stage) { ep_error = Some(err); } } } if let Some(err) = ep_error { info.entry_point_names.push(Err(err)); continue; } let fun_name = &self.names[&NameKey::EntryPoint(ep_index as _)]; info.entry_point_names.push(Ok(fun_name.clone())); writeln!(self.out)?; let (em_str, in_mode, out_mode) = match ep.stage { crate::ShaderStage::Vertex => ( "vertex", LocationMode::VertexInput, LocationMode::VertexOutput, ), crate::ShaderStage::Fragment { .. } => ( "fragment", LocationMode::FragmentInput, LocationMode::FragmentOutput, ), crate::ShaderStage::Compute { .. } => { ("kernel", LocationMode::Uniform, LocationMode::Uniform) } }; // List all the Naga `EntryPoint`'s `Function`'s arguments, // flattening structs into their members. In Metal, we will pass // each of these values to the entry point as a separate argument— // except for the varyings, handled next. let mut flattened_arguments = Vec::new(); for (arg_index, arg) in fun.arguments.iter().enumerate() { match module.types[arg.ty].inner { crate::TypeInner::Struct { ref members, .. } => { for (member_index, member) in members.iter().enumerate() { let member_index = member_index as u32; flattened_arguments.push(( NameKey::StructMember(arg.ty, member_index), member.ty, member.binding.as_ref(), )); } } _ => flattened_arguments.push(( NameKey::EntryPointArgument(ep_index as _, arg_index as u32), arg.ty, arg.binding.as_ref(), )), } } // Identify the varyings among the argument values, and emit a // struct type named `Input` to hold them. let stage_in_name = format!("{}Input", fun_name); let varyings_member_name = self.namer.call("varyings"); let mut has_varyings = false; if !flattened_arguments.is_empty() { writeln!(self.out, "struct {} {{", stage_in_name)?; for &(ref name_key, ty, binding) in flattened_arguments.iter() { let binding = match binding { Some(ref binding @ &crate::Binding::Location { .. }) => binding, _ => continue, }; has_varyings = true; let name = &self.names[name_key]; let ty_name = TypeContext { handle: ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; let resolved = options.resolve_local_binding(binding, in_mode)?; write!(self.out, "{}{} {}", back::INDENT, ty_name, name)?; resolved.try_fmt(&mut self.out)?; writeln!(self.out, ";")?; } writeln!(self.out, "}};")?; } // Define a struct type named for the return value, if any, named // `Output`. let stage_out_name = format!("{}Output", fun_name); let result_member_name = self.namer.call("member"); let result_type_name = match fun.result { Some(ref result) => { let mut result_members = Vec::new(); if let crate::TypeInner::Struct { ref members, .. } = module.types[result.ty].inner { for (member_index, member) in members.iter().enumerate() { result_members.push(( &self.names[&NameKey::StructMember(result.ty, member_index as u32)], member.ty, member.binding.as_ref(), )); } } else { result_members.push(( &result_member_name, result.ty, result.binding.as_ref(), )); } writeln!(self.out, "struct {} {{", stage_out_name)?; let mut has_point_size = false; for (name, ty, binding) in result_members { let ty_name = TypeContext { handle: ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: true, }; let binding = binding.ok_or(Error::Validation)?; match *binding { // Point size is only supported in VS of pipelines with // point primitive topology. crate::Binding::BuiltIn(crate::BuiltIn::PointSize) => { has_point_size = true; if !pipeline_options.allow_point_size { continue; } } // Cull Distance is not supported in Metal. // But we can't return UnsupportedBuiltIn error to user. // Because otherwise we can't generate msl shader from any glslang SPIR-V shaders. // glslang generates gl_PerVertex struct with gl_CullDistance builtin inside by default. crate::Binding::BuiltIn(crate::BuiltIn::CullDistance) => { log::warn!("Ignoring CullDistance BuiltIn"); continue; } _ => {} } let array_len = match module.types[ty].inner { crate::TypeInner::Array { size: crate::ArraySize::Constant(handle), .. } => module.constants[handle].to_array_length(), _ => None, }; let resolved = options.resolve_local_binding(binding, out_mode)?; write!(self.out, "{}{} {}", back::INDENT, ty_name, name)?; if let Some(array_len) = array_len { write!(self.out, " [{}]", array_len)?; } resolved.try_fmt(&mut self.out)?; writeln!(self.out, ";")?; } if pipeline_options.allow_point_size && ep.stage == crate::ShaderStage::Vertex && !has_point_size { // inject the point size output last writeln!( self.out, "{}float _point_size [[point_size]];", back::INDENT )?; } writeln!(self.out, "}};")?; &stage_out_name } None => "void", }; // Write the entry point function's name, and begin its argument list. writeln!(self.out, "{} {} {}(", em_str, result_type_name, fun_name)?; let mut is_first_argument = true; // If we have produced a struct holding the `EntryPoint`'s // `Function`'s arguments' varyings, pass that struct first. if has_varyings { writeln!( self.out, " {} {} [[stage_in]]", stage_in_name, varyings_member_name )?; is_first_argument = false; } // Then pass the remaining arguments not included in the varyings // struct. // // Since `Namer.reset` wasn't expecting struct members to be // suddenly injected into the normal namespace like this, // `self.names` doesn't keep them distinct from other variables. // Generate fresh names for these arguments, and remember the // mapping. let mut flattened_member_names = FastHashMap::default(); for &(ref name_key, ty, binding) in flattened_arguments.iter() { let binding = match binding { Some(ref binding @ &crate::Binding::BuiltIn { .. }) => binding, _ => continue, }; let name = if let NameKey::StructMember(ty, index) = *name_key { // We should always insert a fresh entry here, but use // `or_insert` to get a reference to the `String` we just // inserted. flattened_member_names .entry(NameKey::StructMember(ty, index)) .or_insert_with(|| self.namer.call(&self.names[name_key])) } else { &self.names[name_key] }; let ty_name = TypeContext { handle: ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; let resolved = options.resolve_local_binding(binding, in_mode)?; let separator = if is_first_argument { is_first_argument = false; ' ' } else { ',' }; write!(self.out, "{} {} {}", separator, ty_name, name)?; resolved.try_fmt(&mut self.out)?; writeln!(self.out)?; } // Those global variables used by this entry point and its callees // get passed as arguments. `Private` globals are an exception, they // don't outlive this invocation, so we declare them below as locals // within the entry point. for (handle, var) in module.global_variables.iter() { let usage = fun_info[handle]; if usage.is_empty() || var.space == crate::AddressSpace::Private { continue; } // the resolves have already been checked for `!fake_missing_bindings` case let resolved = match var.space { crate::AddressSpace::PushConstant => { options.resolve_push_constants(ep.stage).ok() } crate::AddressSpace::WorkGroup => None, crate::AddressSpace::Storage { .. } if options.lang_version < (2, 0) => { return Err(Error::UnsupportedAddressSpace(var.space)) } _ => options .resolve_resource_binding(ep.stage, var.binding.as_ref().unwrap()) .ok(), }; if let Some(ref resolved) = resolved { // Inline samplers are be defined in the EP body if resolved.as_inline_sampler(options).is_some() { continue; } } let tyvar = TypedGlobalVariable { module, names: &self.names, handle, usage, binding: resolved.as_ref(), reference: true, }; let separator = if is_first_argument { is_first_argument = false; ' ' } else { ',' }; write!(self.out, "{} ", separator)?; tyvar.try_fmt(&mut self.out)?; if let Some(resolved) = resolved { resolved.try_fmt(&mut self.out)?; } if let Some(value) = var.init { let coco = ConstantContext { handle: value, arena: &module.constants, names: &self.names, first_time: false, }; write!(self.out, " = {}", coco)?; } writeln!(self.out)?; } // If this entry uses any variable-length arrays, their sizes are // passed as a final struct-typed argument. if supports_array_length { // this is checked earlier let resolved = options.resolve_sizes_buffer(ep.stage).unwrap(); let separator = if module.global_variables.is_empty() { ' ' } else { ',' }; write!( self.out, "{} constant _mslBufferSizes& _buffer_sizes", separator, )?; resolved.try_fmt(&mut self.out)?; writeln!(self.out)?; } // end of the entry point argument list writeln!(self.out, ") {{")?; // Metal doesn't support private mutable variables outside of functions, // so we put them here, just like the locals. for (handle, var) in module.global_variables.iter() { let usage = fun_info[handle]; if usage.is_empty() { continue; } if var.space == crate::AddressSpace::Private { let tyvar = TypedGlobalVariable { module, names: &self.names, handle, usage, binding: None, reference: false, }; write!(self.out, "{}", back::INDENT)?; tyvar.try_fmt(&mut self.out)?; match var.init { Some(value) => { let coco = ConstantContext { handle: value, arena: &module.constants, names: &self.names, first_time: false, }; writeln!(self.out, " = {};", coco)?; } None => { writeln!(self.out, " = {{}};")?; } }; } else if let Some(ref binding) = var.binding { // write an inline sampler let resolved = options.resolve_resource_binding(ep.stage, binding).unwrap(); if let Some(sampler) = resolved.as_inline_sampler(options) { let name = &self.names[&NameKey::GlobalVariable(handle)]; writeln!( self.out, "{}constexpr {}::sampler {}(", back::INDENT, NAMESPACE, name )?; self.put_inline_sampler_properties(back::Level(2), sampler)?; writeln!(self.out, "{});", back::INDENT)?; } } } // Now take the arguments that we gathered into structs, and the // structs that we flattened into arguments, and emit local // variables with initializers that put everything back the way the // body code expects. // // If we had to generate fresh names for struct members passed as // arguments, be sure to use those names when rebuilding the struct. // // "Each day, I change some zeros to ones, and some ones to zeros. // The rest, I leave alone." for (arg_index, arg) in fun.arguments.iter().enumerate() { let arg_name = &self.names[&NameKey::EntryPointArgument(ep_index as _, arg_index as u32)]; match module.types[arg.ty].inner { crate::TypeInner::Struct { ref members, .. } => { let struct_name = &self.names[&NameKey::Type(arg.ty)]; write!( self.out, "{}const {} {} = {{ ", back::INDENT, struct_name, arg_name )?; for (member_index, member) in members.iter().enumerate() { let key = NameKey::StructMember(arg.ty, member_index as u32); // If it's not in the varying struct, then we should // have passed it as its own argument and assigned // it a new name. let name = match member.binding { Some(crate::Binding::BuiltIn { .. }) => { &flattened_member_names[&key] } _ => &self.names[&key], }; if member_index != 0 { write!(self.out, ", ")?; } if let Some(crate::Binding::Location { .. }) = member.binding { write!(self.out, "{}.", varyings_member_name)?; } write!(self.out, "{}", name)?; } writeln!(self.out, " }};")?; } _ => { if let Some(crate::Binding::Location { .. }) = arg.binding { writeln!( self.out, "{}const auto {} = {}.{};", back::INDENT, arg_name, varyings_member_name, arg_name )?; } } } } // Finally, declare all the local variables that we need //TODO: we can postpone this till the relevant expressions are emitted for (local_handle, local) in fun.local_variables.iter() { let name = &self.names[&NameKey::EntryPointLocal(ep_index as _, local_handle)]; let ty_name = TypeContext { handle: local.ty, module, names: &self.names, access: crate::StorageAccess::empty(), binding: None, first_time: false, }; write!(self.out, "{}{} {}", back::INDENT, ty_name, name)?; match local.init { Some(value) => { let coco = ConstantContext { handle: value, arena: &module.constants, names: &self.names, first_time: false, }; write!(self.out, " = {}", coco)?; } None => { write!(self.out, " = {{}}")?; } }; writeln!(self.out, ";")?; } let guarded_indices = index::find_checked_indexes(module, fun, fun_info, options.bounds_check_policies); let context = StatementContext { expression: ExpressionContext { function: fun, origin: FunctionOrigin::EntryPoint(ep_index as _), info: fun_info, policies: options.bounds_check_policies, guarded_indices, module, pipeline_options, }, mod_info, result_struct: Some(&stage_out_name), }; self.named_expressions.clear(); self.update_expressions_to_bake(fun, fun_info, &context.expression); self.put_block(back::Level(1), &fun.body, &context)?; writeln!(self.out, "}}")?; if ep_index + 1 != module.entry_points.len() { writeln!(self.out)?; } } Ok(info) } } #[test] fn test_stack_size() { use crate::valid::{Capabilities, ValidationFlags}; // create a module with at least one expression nested let mut module = crate::Module::default(); let constant = module.constants.append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(1.0), width: 4, }, }, Default::default(), ); let mut fun = crate::Function::default(); let const_expr = fun .expressions .append(crate::Expression::Constant(constant), Default::default()); let nested_expr = fun.expressions.append( crate::Expression::Unary { op: crate::UnaryOperator::Negate, expr: const_expr, }, Default::default(), ); fun.body.push( crate::Statement::Emit(fun.expressions.range_from(1)), Default::default(), ); fun.body.push( crate::Statement::If { condition: nested_expr, accept: crate::Block::new(), reject: crate::Block::new(), }, Default::default(), ); let _ = module.functions.append(fun, Default::default()); // analyse the module let info = crate::valid::Validator::new(ValidationFlags::empty(), Capabilities::empty()) .validate(&module) .unwrap(); // process the module let mut writer = Writer::new(String::new()); writer .write(&module, &info, &Default::default(), &Default::default()) .unwrap(); { // check expression stack let mut addresses = usize::MAX..0usize; for pointer in writer.put_expression_stack_pointers { addresses.start = addresses.start.min(pointer as usize); addresses.end = addresses.end.max(pointer as usize); } let stack_size = addresses.end - addresses.start; // check the size (in debug only) // last observed macOS value: 20528 (CI) if !(11000..=25000).contains(&stack_size) { panic!("`put_expression` stack size {} has changed!", stack_size); } } { // check block stack let mut addresses = usize::MAX..0usize; for pointer in writer.put_block_stack_pointers { addresses.start = addresses.start.min(pointer as usize); addresses.end = addresses.end.max(pointer as usize); } let stack_size = addresses.end - addresses.start; // check the size (in debug only) // last observed macOS value: 19152 (CI) if !(9500..=20000).contains(&stack_size) { panic!("`put_block` stack size {} has changed!", stack_size); } } } ================================================ FILE: lib/naga/src/back/spv/block.rs ================================================ /*! Implementations for `BlockContext` methods. */ use super::{ index::BoundsCheckResult, make_local, selection::Selection, Block, BlockContext, Dimension, Error, Instruction, LocalType, LookupType, LoopContext, ResultMember, Writer, WriterFlags, }; use crate::{arena::Handle, proc::TypeResolution}; use spirv::Word; fn get_dimension(type_inner: &crate::TypeInner) -> Dimension { match *type_inner { crate::TypeInner::Scalar { .. } => Dimension::Scalar, crate::TypeInner::Vector { .. } => Dimension::Vector, crate::TypeInner::Matrix { .. } => Dimension::Matrix, _ => unreachable!(), } } /// The results of emitting code for a left-hand-side expression. /// /// On success, `write_expression_pointer` returns one of these. enum ExpressionPointer { /// The pointer to the expression's value is available, as the value of the /// expression with the given id. Ready { pointer_id: Word }, /// The access expression must be conditional on the value of `condition`, a boolean /// expression that is true if all indices are in bounds. If `condition` is true, then /// `access` is an `OpAccessChain` instruction that will compute a pointer to the /// expression's value. If `condition` is false, then executing `access` would be /// undefined behavior. Conditional { condition: Word, access: Instruction, }, } /// The termination statement to be added to the end of the block pub enum BlockExit { /// Generates an OpReturn (void return) Return, /// Generates an OpBranch to the specified block Branch { /// The branch target block target: Word, }, /// Translates a loop `break if` into an `OpBranchConditional` to the /// merge block if true (the merge block is passed through [`LoopContext::break_id`] /// or else to the loop header (passed through [`preamble_id`]) /// /// [`preamble_id`]: Self::BreakIf::preamble_id BreakIf { /// The condition of the `break if` condition: Handle, /// The loop header block id preamble_id: Word, }, } impl Writer { // Flip Y coordinate to adjust for coordinate space difference // between SPIR-V and our IR. // The `position_id` argument is a pointer to a `vecN`, // whose `y` component we will negate. fn write_epilogue_position_y_flip( &mut self, position_id: Word, body: &mut Vec, ) -> Result<(), Error> { let float_ptr_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Float, width: 4, pointer_space: Some(spirv::StorageClass::Output), })); let index_y_id = self.get_index_constant(1); let access_id = self.id_gen.next(); body.push(Instruction::access_chain( float_ptr_type_id, access_id, position_id, &[index_y_id], )); let float_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Float, width: 4, pointer_space: None, })); let load_id = self.id_gen.next(); body.push(Instruction::load(float_type_id, load_id, access_id, None)); let neg_id = self.id_gen.next(); body.push(Instruction::unary( spirv::Op::FNegate, float_type_id, neg_id, load_id, )); body.push(Instruction::store(access_id, neg_id, None)); Ok(()) } // Clamp fragment depth between 0 and 1. fn write_epilogue_frag_depth_clamp( &mut self, frag_depth_id: Word, body: &mut Vec, ) -> Result<(), Error> { let float_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Float, width: 4, pointer_space: None, })); let value0_id = self.get_constant_scalar(crate::ScalarValue::Float(0.0), 4); let value1_id = self.get_constant_scalar(crate::ScalarValue::Float(1.0), 4); let original_id = self.id_gen.next(); body.push(Instruction::load( float_type_id, original_id, frag_depth_id, None, )); let clamp_id = self.id_gen.next(); body.push(Instruction::ext_inst( self.gl450_ext_inst_id, spirv::GLOp::FClamp, float_type_id, clamp_id, &[original_id, value0_id, value1_id], )); body.push(Instruction::store(frag_depth_id, clamp_id, None)); Ok(()) } fn write_entry_point_return( &mut self, value_id: Word, ir_result: &crate::FunctionResult, result_members: &[ResultMember], body: &mut Vec, ) -> Result<(), Error> { for (index, res_member) in result_members.iter().enumerate() { let member_value_id = match ir_result.binding { Some(_) => value_id, None => { let member_value_id = self.id_gen.next(); body.push(Instruction::composite_extract( res_member.type_id, member_value_id, value_id, &[index as u32], )); member_value_id } }; body.push(Instruction::store(res_member.id, member_value_id, None)); match res_member.built_in { Some(crate::BuiltIn::Position { .. }) if self.flags.contains(WriterFlags::ADJUST_COORDINATE_SPACE) => { self.write_epilogue_position_y_flip(res_member.id, body)?; } Some(crate::BuiltIn::FragDepth) if self.flags.contains(WriterFlags::CLAMP_FRAG_DEPTH) => { self.write_epilogue_frag_depth_clamp(res_member.id, body)?; } _ => {} } } Ok(()) } } impl<'w> BlockContext<'w> { /// Decide whether to put off emitting instructions for `expr_handle`. /// /// We would like to gather together chains of `Access` and `AccessIndex` /// Naga expressions into a single `OpAccessChain` SPIR-V instruction. To do /// this, we don't generate instructions for these exprs when we first /// encounter them. Their ids in `self.writer.cached.ids` are left as zero. Then, /// once we encounter a `Load` or `Store` expression that actually needs the /// chain's value, we call `write_expression_pointer` to handle the whole /// thing in one fell swoop. fn is_intermediate(&self, expr_handle: Handle) -> bool { match self.ir_function.expressions[expr_handle] { crate::Expression::GlobalVariable(handle) => { let ty = self.ir_module.global_variables[handle].ty; match self.ir_module.types[ty].inner { crate::TypeInner::BindingArray { .. } => false, _ => true, } } crate::Expression::LocalVariable(_) => true, crate::Expression::FunctionArgument(index) => { let arg = &self.ir_function.arguments[index as usize]; self.ir_module.types[arg.ty].inner.pointer_space().is_some() } // The chain rule: if this `Access...`'s `base` operand was // previously omitted, then omit this one, too. _ => self.cached.ids[expr_handle.index()] == 0, } } /// Cache an expression for a value. pub(super) fn cache_expression_value( &mut self, expr_handle: Handle, block: &mut Block, ) -> Result<(), Error> { let result_type_id = self.get_expression_type_id(&self.fun_info[expr_handle].ty); let id = match self.ir_function.expressions[expr_handle] { crate::Expression::Access { base, index: _ } if self.is_intermediate(base) => { // See `is_intermediate`; we'll handle this later in // `write_expression_pointer`. 0 } crate::Expression::Access { base, index } => { let base_ty_inner = self.fun_info[base].ty.inner_with(&self.ir_module.types); match *base_ty_inner { crate::TypeInner::Vector { .. } => { self.write_vector_access(expr_handle, base, index, block)? } crate::TypeInner::BindingArray { base: binding_type, .. } => { let binding_array_false_pointer = LookupType::Local(LocalType::Pointer { base: binding_type, class: spirv::StorageClass::UniformConstant, }); let result_id = match self.write_expression_pointer( expr_handle, block, Some(binding_array_false_pointer), )? { ExpressionPointer::Ready { pointer_id } => pointer_id, ExpressionPointer::Conditional { .. } => { return Err(Error::FeatureNotImplemented( "Texture array out-of-bounds handling", )); } }; let binding_type_id = self.get_type_id(LookupType::Handle(binding_type)); let load_id = self.gen_id(); block.body.push(Instruction::load( binding_type_id, load_id, result_id, None, )); if self.fun_info[index].uniformity.non_uniform_result.is_some() { self.writer.require_any( "NonUniformEXT", &[spirv::Capability::ShaderNonUniform], )?; self.writer.use_extension("SPV_EXT_descriptor_indexing"); self.writer .decorate(load_id, spirv::Decoration::NonUniform, &[]); } load_id } ref other => { log::error!( "Unable to access base {:?} of type {:?}", self.ir_function.expressions[base], other ); return Err(Error::Validation( "only vectors may be dynamically indexed by value", )); } } } crate::Expression::AccessIndex { base, index: _ } if self.is_intermediate(base) => { // See `is_intermediate`; we'll handle this later in // `write_expression_pointer`. 0 } crate::Expression::AccessIndex { base, index } => { match *self.fun_info[base].ty.inner_with(&self.ir_module.types) { crate::TypeInner::Vector { .. } | crate::TypeInner::Matrix { .. } | crate::TypeInner::Array { .. } | crate::TypeInner::Struct { .. } => { // We never need bounds checks here: dynamically sized arrays can // only appear behind pointers, and are thus handled by the // `is_intermediate` case above. Everything else's size is // statically known and checked in validation. let id = self.gen_id(); let base_id = self.cached[base]; block.body.push(Instruction::composite_extract( result_type_id, id, base_id, &[index], )); id } crate::TypeInner::BindingArray { base: binding_type, .. } => { let binding_array_false_pointer = LookupType::Local(LocalType::Pointer { base: binding_type, class: spirv::StorageClass::UniformConstant, }); let result_id = match self.write_expression_pointer( expr_handle, block, Some(binding_array_false_pointer), )? { ExpressionPointer::Ready { pointer_id } => pointer_id, ExpressionPointer::Conditional { .. } => { return Err(Error::FeatureNotImplemented( "Texture array out-of-bounds handling", )); } }; let binding_type_id = self.get_type_id(LookupType::Handle(binding_type)); let load_id = self.gen_id(); block.body.push(Instruction::load( binding_type_id, load_id, result_id, None, )); load_id } ref other => { log::error!("Unable to access index of {:?}", other); return Err(Error::FeatureNotImplemented("access index for type")); } } } crate::Expression::GlobalVariable(handle) => { self.writer.global_variables[handle.index()].access_id } crate::Expression::Constant(handle) => self.writer.constant_ids[handle.index()], crate::Expression::Splat { size, value } => { let value_id = self.cached[value]; let components = [value_id; 4]; let id = self.gen_id(); block.body.push(Instruction::composite_construct( result_type_id, id, &components[..size as usize], )); id } crate::Expression::Swizzle { size, vector, pattern, } => { let vector_id = self.cached[vector]; self.temp_list.clear(); for &sc in pattern[..size as usize].iter() { self.temp_list.push(sc as Word); } let id = self.gen_id(); block.body.push(Instruction::vector_shuffle( result_type_id, id, vector_id, vector_id, &self.temp_list, )); id } crate::Expression::Compose { ty: _, ref components, } => { self.temp_list.clear(); for &component in components { self.temp_list.push(self.cached[component]); } let id = self.gen_id(); block.body.push(Instruction::composite_construct( result_type_id, id, &self.temp_list, )); id } crate::Expression::Unary { op, expr } => { let id = self.gen_id(); let expr_id = self.cached[expr]; let expr_ty_inner = self.fun_info[expr].ty.inner_with(&self.ir_module.types); let spirv_op = match op { crate::UnaryOperator::Negate => match expr_ty_inner.scalar_kind() { Some(crate::ScalarKind::Float) => spirv::Op::FNegate, Some(crate::ScalarKind::Sint) => spirv::Op::SNegate, Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNot, Some(crate::ScalarKind::Uint) | None => { log::error!("Unable to negate {:?}", expr_ty_inner); return Err(Error::FeatureNotImplemented("negation")); } }, crate::UnaryOperator::Not => match expr_ty_inner.scalar_kind() { Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNot, _ => spirv::Op::Not, }, }; block .body .push(Instruction::unary(spirv_op, result_type_id, id, expr_id)); id } crate::Expression::Binary { op, left, right } => { let id = self.gen_id(); let left_id = self.cached[left]; let right_id = self.cached[right]; let left_ty_inner = self.fun_info[left].ty.inner_with(&self.ir_module.types); let right_ty_inner = self.fun_info[right].ty.inner_with(&self.ir_module.types); let left_dimension = get_dimension(left_ty_inner); let right_dimension = get_dimension(right_ty_inner); let mut reverse_operands = false; let spirv_op = match op { crate::BinaryOperator::Add => match *left_ty_inner { crate::TypeInner::Scalar { kind, .. } | crate::TypeInner::Vector { kind, .. } => match kind { crate::ScalarKind::Float => spirv::Op::FAdd, _ => spirv::Op::IAdd, }, crate::TypeInner::Matrix { columns, rows, width, } => { self.write_matrix_matrix_column_op( block, id, result_type_id, left_id, right_id, columns, rows, width, spirv::Op::FAdd, ); self.cached[expr_handle] = id; return Ok(()); } _ => unimplemented!(), }, crate::BinaryOperator::Subtract => match *left_ty_inner { crate::TypeInner::Scalar { kind, .. } | crate::TypeInner::Vector { kind, .. } => match kind { crate::ScalarKind::Float => spirv::Op::FSub, _ => spirv::Op::ISub, }, crate::TypeInner::Matrix { columns, rows, width, } => { self.write_matrix_matrix_column_op( block, id, result_type_id, left_id, right_id, columns, rows, width, spirv::Op::FSub, ); self.cached[expr_handle] = id; return Ok(()); } _ => unimplemented!(), }, crate::BinaryOperator::Multiply => match (left_dimension, right_dimension) { (Dimension::Scalar, Dimension::Vector) => { self.write_vector_scalar_mult( block, id, result_type_id, right_id, left_id, right_ty_inner, ); self.cached[expr_handle] = id; return Ok(()); } (Dimension::Vector, Dimension::Scalar) => { self.write_vector_scalar_mult( block, id, result_type_id, left_id, right_id, left_ty_inner, ); self.cached[expr_handle] = id; return Ok(()); } (Dimension::Vector, Dimension::Matrix) => spirv::Op::VectorTimesMatrix, (Dimension::Matrix, Dimension::Scalar) => spirv::Op::MatrixTimesScalar, (Dimension::Scalar, Dimension::Matrix) => { reverse_operands = true; spirv::Op::MatrixTimesScalar } (Dimension::Matrix, Dimension::Vector) => spirv::Op::MatrixTimesVector, (Dimension::Matrix, Dimension::Matrix) => spirv::Op::MatrixTimesMatrix, (Dimension::Vector, Dimension::Vector) | (Dimension::Scalar, Dimension::Scalar) if left_ty_inner.scalar_kind() == Some(crate::ScalarKind::Float) => { spirv::Op::FMul } (Dimension::Vector, Dimension::Vector) | (Dimension::Scalar, Dimension::Scalar) => spirv::Op::IMul, }, crate::BinaryOperator::Divide => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::SDiv, Some(crate::ScalarKind::Uint) => spirv::Op::UDiv, Some(crate::ScalarKind::Float) => spirv::Op::FDiv, _ => unimplemented!(), }, crate::BinaryOperator::Modulo => match left_ty_inner.scalar_kind() { // TODO: handle undefined behavior // if right == 0 return 0 // if left == min(type_of(left)) && right == -1 return 0 Some(crate::ScalarKind::Sint) => spirv::Op::SRem, // TODO: handle undefined behavior // if right == 0 return 0 Some(crate::ScalarKind::Uint) => spirv::Op::UMod, // TODO: handle undefined behavior // if right == 0 return ? see https://github.com/gpuweb/gpuweb/issues/2798 Some(crate::ScalarKind::Float) => spirv::Op::FRem, _ => unimplemented!(), }, crate::BinaryOperator::Equal => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => { spirv::Op::IEqual } Some(crate::ScalarKind::Float) => spirv::Op::FOrdEqual, Some(crate::ScalarKind::Bool) => spirv::Op::LogicalEqual, _ => unimplemented!(), }, crate::BinaryOperator::NotEqual => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => { spirv::Op::INotEqual } Some(crate::ScalarKind::Float) => spirv::Op::FOrdNotEqual, Some(crate::ScalarKind::Bool) => spirv::Op::LogicalNotEqual, _ => unimplemented!(), }, crate::BinaryOperator::Less => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::SLessThan, Some(crate::ScalarKind::Uint) => spirv::Op::ULessThan, Some(crate::ScalarKind::Float) => spirv::Op::FOrdLessThan, _ => unimplemented!(), }, crate::BinaryOperator::LessEqual => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::SLessThanEqual, Some(crate::ScalarKind::Uint) => spirv::Op::ULessThanEqual, Some(crate::ScalarKind::Float) => spirv::Op::FOrdLessThanEqual, _ => unimplemented!(), }, crate::BinaryOperator::Greater => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::SGreaterThan, Some(crate::ScalarKind::Uint) => spirv::Op::UGreaterThan, Some(crate::ScalarKind::Float) => spirv::Op::FOrdGreaterThan, _ => unimplemented!(), }, crate::BinaryOperator::GreaterEqual => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::SGreaterThanEqual, Some(crate::ScalarKind::Uint) => spirv::Op::UGreaterThanEqual, Some(crate::ScalarKind::Float) => spirv::Op::FOrdGreaterThanEqual, _ => unimplemented!(), }, crate::BinaryOperator::And => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Bool) => spirv::Op::LogicalAnd, _ => spirv::Op::BitwiseAnd, }, crate::BinaryOperator::ExclusiveOr => spirv::Op::BitwiseXor, crate::BinaryOperator::InclusiveOr => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Bool) => spirv::Op::LogicalOr, _ => spirv::Op::BitwiseOr, }, crate::BinaryOperator::LogicalAnd => spirv::Op::LogicalAnd, crate::BinaryOperator::LogicalOr => spirv::Op::LogicalOr, crate::BinaryOperator::ShiftLeft => spirv::Op::ShiftLeftLogical, crate::BinaryOperator::ShiftRight => match left_ty_inner.scalar_kind() { Some(crate::ScalarKind::Sint) => spirv::Op::ShiftRightArithmetic, Some(crate::ScalarKind::Uint) => spirv::Op::ShiftRightLogical, _ => unimplemented!(), }, }; block.body.push(Instruction::binary( spirv_op, result_type_id, id, if reverse_operands { right_id } else { left_id }, if reverse_operands { left_id } else { right_id }, )); id } crate::Expression::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; enum MathOp { Ext(spirv::GLOp), Custom(Instruction), } let arg0_id = self.cached[arg]; let arg_ty = self.fun_info[arg].ty.inner_with(&self.ir_module.types); let arg_scalar_kind = arg_ty.scalar_kind(); let arg1_id = match arg1 { Some(handle) => self.cached[handle], None => 0, }; let arg2_id = match arg2 { Some(handle) => self.cached[handle], None => 0, }; let arg3_id = match arg3 { Some(handle) => self.cached[handle], None => 0, }; let id = self.gen_id(); let math_op = match fun { // comparison Mf::Abs => { match arg_scalar_kind { Some(crate::ScalarKind::Float) => MathOp::Ext(spirv::GLOp::FAbs), Some(crate::ScalarKind::Sint) => MathOp::Ext(spirv::GLOp::SAbs), Some(crate::ScalarKind::Uint) => { MathOp::Custom(Instruction::unary( spirv::Op::CopyObject, // do nothing result_type_id, id, arg0_id, )) } other => unimplemented!("Unexpected abs({:?})", other), } } Mf::Min => MathOp::Ext(match arg_scalar_kind { Some(crate::ScalarKind::Float) => spirv::GLOp::FMin, Some(crate::ScalarKind::Sint) => spirv::GLOp::SMin, Some(crate::ScalarKind::Uint) => spirv::GLOp::UMin, other => unimplemented!("Unexpected min({:?})", other), }), Mf::Max => MathOp::Ext(match arg_scalar_kind { Some(crate::ScalarKind::Float) => spirv::GLOp::FMax, Some(crate::ScalarKind::Sint) => spirv::GLOp::SMax, Some(crate::ScalarKind::Uint) => spirv::GLOp::UMax, other => unimplemented!("Unexpected max({:?})", other), }), Mf::Clamp => MathOp::Ext(match arg_scalar_kind { Some(crate::ScalarKind::Float) => spirv::GLOp::FClamp, Some(crate::ScalarKind::Sint) => spirv::GLOp::SClamp, Some(crate::ScalarKind::Uint) => spirv::GLOp::UClamp, other => unimplemented!("Unexpected max({:?})", other), }), Mf::Saturate => { let (maybe_size, width) = match *arg_ty { crate::TypeInner::Vector { size, width, .. } => (Some(size), width), crate::TypeInner::Scalar { width, .. } => (None, width), ref other => unimplemented!("Unexpected saturate({:?})", other), }; let mut arg1_id = self .writer .get_constant_scalar(crate::ScalarValue::Float(0.0), width); let mut arg2_id = self .writer .get_constant_scalar(crate::ScalarValue::Float(1.0), width); if let Some(size) = maybe_size { let value = LocalType::Value { vector_size: Some(size), kind: crate::ScalarKind::Float, width, pointer_space: None, }; let result_type_id = self.get_type_id(LookupType::Local(value)); self.temp_list.clear(); self.temp_list.resize(size as _, arg1_id); let id = self.gen_id(); block.body.push(Instruction::composite_construct( result_type_id, id, &self.temp_list, )); arg1_id = id; self.temp_list.clear(); self.temp_list.resize(size as _, arg2_id); let id = self.gen_id(); block.body.push(Instruction::composite_construct( result_type_id, id, &self.temp_list, )); arg2_id = id; } MathOp::Custom(Instruction::ext_inst( self.writer.gl450_ext_inst_id, spirv::GLOp::FClamp, result_type_id, id, &[arg0_id, arg1_id, arg2_id], )) } // trigonometry Mf::Sin => MathOp::Ext(spirv::GLOp::Sin), Mf::Sinh => MathOp::Ext(spirv::GLOp::Sinh), Mf::Asin => MathOp::Ext(spirv::GLOp::Asin), Mf::Cos => MathOp::Ext(spirv::GLOp::Cos), Mf::Cosh => MathOp::Ext(spirv::GLOp::Cosh), Mf::Acos => MathOp::Ext(spirv::GLOp::Acos), Mf::Tan => MathOp::Ext(spirv::GLOp::Tan), Mf::Tanh => MathOp::Ext(spirv::GLOp::Tanh), Mf::Atan => MathOp::Ext(spirv::GLOp::Atan), Mf::Atan2 => MathOp::Ext(spirv::GLOp::Atan2), Mf::Asinh => MathOp::Ext(spirv::GLOp::Asinh), Mf::Acosh => MathOp::Ext(spirv::GLOp::Acosh), Mf::Atanh => MathOp::Ext(spirv::GLOp::Atanh), Mf::Radians => MathOp::Ext(spirv::GLOp::Radians), Mf::Degrees => MathOp::Ext(spirv::GLOp::Degrees), // decomposition Mf::Ceil => MathOp::Ext(spirv::GLOp::Ceil), Mf::Round => MathOp::Ext(spirv::GLOp::RoundEven), Mf::Floor => MathOp::Ext(spirv::GLOp::Floor), Mf::Fract => MathOp::Ext(spirv::GLOp::Fract), Mf::Trunc => MathOp::Ext(spirv::GLOp::Trunc), Mf::Modf => MathOp::Ext(spirv::GLOp::Modf), Mf::Frexp => MathOp::Ext(spirv::GLOp::Frexp), Mf::Ldexp => MathOp::Ext(spirv::GLOp::Ldexp), // geometry Mf::Dot => match *self.fun_info[arg].ty.inner_with(&self.ir_module.types) { crate::TypeInner::Vector { kind: crate::ScalarKind::Float, .. } => MathOp::Custom(Instruction::binary( spirv::Op::Dot, result_type_id, id, arg0_id, arg1_id, )), // TODO: consider using integer dot product if VK_KHR_shader_integer_dot_product is available crate::TypeInner::Vector { size, .. } => { self.write_dot_product( id, result_type_id, arg0_id, arg1_id, size as u32, block, ); self.cached[expr_handle] = id; return Ok(()); } _ => unreachable!( "Correct TypeInner for dot product should be already validated" ), }, Mf::Outer => MathOp::Custom(Instruction::binary( spirv::Op::OuterProduct, result_type_id, id, arg0_id, arg1_id, )), Mf::Cross => MathOp::Ext(spirv::GLOp::Cross), Mf::Distance => MathOp::Ext(spirv::GLOp::Distance), Mf::Length => MathOp::Ext(spirv::GLOp::Length), Mf::Normalize => MathOp::Ext(spirv::GLOp::Normalize), Mf::FaceForward => MathOp::Ext(spirv::GLOp::FaceForward), Mf::Reflect => MathOp::Ext(spirv::GLOp::Reflect), Mf::Refract => MathOp::Ext(spirv::GLOp::Refract), // exponent Mf::Exp => MathOp::Ext(spirv::GLOp::Exp), Mf::Exp2 => MathOp::Ext(spirv::GLOp::Exp2), Mf::Log => MathOp::Ext(spirv::GLOp::Log), Mf::Log2 => MathOp::Ext(spirv::GLOp::Log2), Mf::Pow => MathOp::Ext(spirv::GLOp::Pow), // computational Mf::Sign => MathOp::Ext(match arg_scalar_kind { Some(crate::ScalarKind::Float) => spirv::GLOp::FSign, Some(crate::ScalarKind::Sint) => spirv::GLOp::SSign, other => unimplemented!("Unexpected sign({:?})", other), }), Mf::Fma => MathOp::Ext(spirv::GLOp::Fma), Mf::Mix => { let selector = arg2.unwrap(); let selector_ty = self.fun_info[selector].ty.inner_with(&self.ir_module.types); match (arg_ty, selector_ty) { // if the selector is a scalar, we need to splat it ( &crate::TypeInner::Vector { size, .. }, &crate::TypeInner::Scalar { kind, width }, ) => { let selector_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(size), kind, width, pointer_space: None, })); self.temp_list.clear(); self.temp_list.resize(size as usize, arg2_id); let selector_id = self.gen_id(); block.body.push(Instruction::composite_construct( selector_type_id, selector_id, &self.temp_list, )); MathOp::Custom(Instruction::ext_inst( self.writer.gl450_ext_inst_id, spirv::GLOp::FMix, result_type_id, id, &[arg0_id, arg1_id, selector_id], )) } _ => MathOp::Ext(spirv::GLOp::FMix), } } Mf::Step => MathOp::Ext(spirv::GLOp::Step), Mf::SmoothStep => MathOp::Ext(spirv::GLOp::SmoothStep), Mf::Sqrt => MathOp::Ext(spirv::GLOp::Sqrt), Mf::InverseSqrt => MathOp::Ext(spirv::GLOp::InverseSqrt), Mf::Inverse => MathOp::Ext(spirv::GLOp::MatrixInverse), Mf::Transpose => MathOp::Custom(Instruction::unary( spirv::Op::Transpose, result_type_id, id, arg0_id, )), Mf::Determinant => MathOp::Ext(spirv::GLOp::Determinant), Mf::ReverseBits => MathOp::Custom(Instruction::unary( spirv::Op::BitReverse, result_type_id, id, arg0_id, )), Mf::CountOneBits => MathOp::Custom(Instruction::unary( spirv::Op::BitCount, result_type_id, id, arg0_id, )), Mf::ExtractBits => { let op = match arg_scalar_kind { Some(crate::ScalarKind::Uint) => spirv::Op::BitFieldUExtract, Some(crate::ScalarKind::Sint) => spirv::Op::BitFieldSExtract, other => unimplemented!("Unexpected sign({:?})", other), }; MathOp::Custom(Instruction::ternary( op, result_type_id, id, arg0_id, arg1_id, arg2_id, )) } Mf::InsertBits => MathOp::Custom(Instruction::quaternary( spirv::Op::BitFieldInsert, result_type_id, id, arg0_id, arg1_id, arg2_id, arg3_id, )), Mf::FindLsb => MathOp::Ext(spirv::GLOp::FindILsb), Mf::FindMsb => MathOp::Ext(match arg_scalar_kind { Some(crate::ScalarKind::Uint) => spirv::GLOp::FindUMsb, Some(crate::ScalarKind::Sint) => spirv::GLOp::FindSMsb, other => unimplemented!("Unexpected findMSB({:?})", other), }), Mf::Pack4x8unorm => MathOp::Ext(spirv::GLOp::PackUnorm4x8), Mf::Pack4x8snorm => MathOp::Ext(spirv::GLOp::PackSnorm4x8), Mf::Pack2x16float => MathOp::Ext(spirv::GLOp::PackHalf2x16), Mf::Pack2x16unorm => MathOp::Ext(spirv::GLOp::PackUnorm2x16), Mf::Pack2x16snorm => MathOp::Ext(spirv::GLOp::PackSnorm2x16), Mf::Unpack4x8unorm => MathOp::Ext(spirv::GLOp::UnpackUnorm4x8), Mf::Unpack4x8snorm => MathOp::Ext(spirv::GLOp::UnpackSnorm4x8), Mf::Unpack2x16float => MathOp::Ext(spirv::GLOp::UnpackHalf2x16), Mf::Unpack2x16unorm => MathOp::Ext(spirv::GLOp::UnpackUnorm2x16), Mf::Unpack2x16snorm => MathOp::Ext(spirv::GLOp::UnpackSnorm2x16), }; block.body.push(match math_op { MathOp::Ext(op) => Instruction::ext_inst( self.writer.gl450_ext_inst_id, op, result_type_id, id, &[arg0_id, arg1_id, arg2_id, arg3_id][..fun.argument_count()], ), MathOp::Custom(inst) => inst, }); id } crate::Expression::LocalVariable(variable) => self.function.variables[&variable].id, crate::Expression::Load { pointer } => { match self.write_expression_pointer(pointer, block, None)? { ExpressionPointer::Ready { pointer_id } => { let id = self.gen_id(); let atomic_space = match *self.fun_info[pointer].ty.inner_with(&self.ir_module.types) { crate::TypeInner::Pointer { base, space } => { match self.ir_module.types[base].inner { crate::TypeInner::Atomic { .. } => Some(space), _ => None, } } _ => None, }; let instruction = if let Some(space) = atomic_space { let (semantics, scope) = space.to_spirv_semantics_and_scope(); let scope_constant_id = self.get_scope_constant(scope as u32); let semantics_id = self.get_index_constant(semantics.bits()); Instruction::atomic_load( result_type_id, id, pointer_id, scope_constant_id, semantics_id, ) } else { Instruction::load(result_type_id, id, pointer_id, None) }; block.body.push(instruction); id } ExpressionPointer::Conditional { condition, access } => { //TODO: support atomics? self.write_conditional_indexed_load( result_type_id, condition, block, move |id_gen, block| { // The in-bounds path. Perform the access and the load. let pointer_id = access.result_id.unwrap(); let value_id = id_gen.next(); block.body.push(access); block.body.push(Instruction::load( result_type_id, value_id, pointer_id, None, )); value_id }, ) } } } crate::Expression::FunctionArgument(index) => self.function.parameter_id(index), crate::Expression::CallResult(_) | crate::Expression::AtomicResult { .. } => { self.cached[expr_handle] } crate::Expression::As { expr, kind, convert, } => { use crate::ScalarKind as Sk; let expr_id = self.cached[expr]; let (src_kind, src_size, src_width, is_matrix) = match *self.fun_info[expr].ty.inner_with(&self.ir_module.types) { crate::TypeInner::Scalar { kind, width } => (kind, None, width, false), crate::TypeInner::Vector { kind, width, size } => { (kind, Some(size), width, false) } crate::TypeInner::Matrix { width, .. } => (kind, None, width, true), ref other => { log::error!("As source {:?}", other); return Err(Error::Validation("Unexpected Expression::As source")); } }; enum Cast { Identity, Unary(spirv::Op), Binary(spirv::Op, Word), Ternary(spirv::Op, Word, Word), } let cast = if is_matrix { // we only support identity casts for matrices Cast::Unary(spirv::Op::CopyObject) } else { match (src_kind, kind, convert) { // Filter out identity casts. Some Adreno drivers are // confused by no-op OpBitCast instructions. (src_kind, kind, convert) if src_kind == kind && convert.unwrap_or(src_width) == src_width => { Cast::Identity } (Sk::Bool, Sk::Bool, _) => Cast::Unary(spirv::Op::CopyObject), (_, _, None) => Cast::Unary(spirv::Op::Bitcast), // casting to a bool - generate `OpXxxNotEqual` (_, Sk::Bool, Some(_)) => { let (op, value) = match src_kind { Sk::Sint => (spirv::Op::INotEqual, crate::ScalarValue::Sint(0)), Sk::Uint => (spirv::Op::INotEqual, crate::ScalarValue::Uint(0)), Sk::Float => { (spirv::Op::FUnordNotEqual, crate::ScalarValue::Float(0.0)) } Sk::Bool => unreachable!(), }; let zero_scalar_id = self.writer.get_constant_scalar(value, src_width); let zero_id = match src_size { Some(size) => { let vector_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(size), kind: src_kind, width: src_width, pointer_space: None, })); let components = [zero_scalar_id; 4]; let zero_id = self.gen_id(); block.body.push(Instruction::composite_construct( vector_type_id, zero_id, &components[..size as usize], )); zero_id } None => zero_scalar_id, }; Cast::Binary(op, zero_id) } // casting from a bool - generate `OpSelect` (Sk::Bool, _, Some(dst_width)) => { let (val0, val1) = match kind { Sk::Sint => { (crate::ScalarValue::Sint(0), crate::ScalarValue::Sint(1)) } Sk::Uint => { (crate::ScalarValue::Uint(0), crate::ScalarValue::Uint(1)) } Sk::Float => ( crate::ScalarValue::Float(0.0), crate::ScalarValue::Float(1.0), ), Sk::Bool => unreachable!(), }; let scalar0_id = self.writer.get_constant_scalar(val0, dst_width); let scalar1_id = self.writer.get_constant_scalar(val1, dst_width); let (accept_id, reject_id) = match src_size { Some(size) => { let vector_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(size), kind, width: dst_width, pointer_space: None, })); let components0 = [scalar0_id; 4]; let components1 = [scalar1_id; 4]; let vec0_id = self.gen_id(); block.body.push(Instruction::composite_construct( vector_type_id, vec0_id, &components0[..size as usize], )); let vec1_id = self.gen_id(); block.body.push(Instruction::composite_construct( vector_type_id, vec1_id, &components1[..size as usize], )); (vec1_id, vec0_id) } None => (scalar1_id, scalar0_id), }; Cast::Ternary(spirv::Op::Select, accept_id, reject_id) } (Sk::Float, Sk::Uint, Some(_)) => Cast::Unary(spirv::Op::ConvertFToU), (Sk::Float, Sk::Sint, Some(_)) => Cast::Unary(spirv::Op::ConvertFToS), (Sk::Float, Sk::Float, Some(dst_width)) if src_width != dst_width => { Cast::Unary(spirv::Op::FConvert) } (Sk::Sint, Sk::Float, Some(_)) => Cast::Unary(spirv::Op::ConvertSToF), (Sk::Sint, Sk::Sint, Some(dst_width)) if src_width != dst_width => { Cast::Unary(spirv::Op::SConvert) } (Sk::Uint, Sk::Float, Some(_)) => Cast::Unary(spirv::Op::ConvertUToF), (Sk::Uint, Sk::Uint, Some(dst_width)) if src_width != dst_width => { Cast::Unary(spirv::Op::UConvert) } // We assume it's either an identity cast, or int-uint. _ => Cast::Unary(spirv::Op::Bitcast), } }; let id = self.gen_id(); let instruction = match cast { Cast::Identity => None, Cast::Unary(op) => Some(Instruction::unary(op, result_type_id, id, expr_id)), Cast::Binary(op, operand) => Some(Instruction::binary( op, result_type_id, id, expr_id, operand, )), Cast::Ternary(op, op1, op2) => Some(Instruction::ternary( op, result_type_id, id, expr_id, op1, op2, )), }; if let Some(instruction) = instruction { block.body.push(instruction); id } else { expr_id } } crate::Expression::ImageLoad { image, coordinate, array_index, sample, level, } => self.write_image_load( result_type_id, image, coordinate, array_index, level, sample, block, )?, crate::Expression::ImageSample { image, sampler, gather, coordinate, array_index, offset, level, depth_ref, } => self.write_image_sample( result_type_id, image, sampler, gather, coordinate, array_index, offset, level, depth_ref, block, )?, crate::Expression::Select { condition, accept, reject, } => { let id = self.gen_id(); let mut condition_id = self.cached[condition]; let accept_id = self.cached[accept]; let reject_id = self.cached[reject]; let condition_ty = self.fun_info[condition] .ty .inner_with(&self.ir_module.types); let object_ty = self.fun_info[accept].ty.inner_with(&self.ir_module.types); if let ( &crate::TypeInner::Scalar { kind: crate::ScalarKind::Bool, width, }, &crate::TypeInner::Vector { size, .. }, ) = (condition_ty, object_ty) { self.temp_list.clear(); self.temp_list.resize(size as usize, condition_id); let bool_vector_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(size), kind: crate::ScalarKind::Bool, width, pointer_space: None, })); let id = self.gen_id(); block.body.push(Instruction::composite_construct( bool_vector_type_id, id, &self.temp_list, )); condition_id = id } let instruction = Instruction::select(result_type_id, id, condition_id, accept_id, reject_id); block.body.push(instruction); id } crate::Expression::Derivative { axis, expr } => { use crate::DerivativeAxis as Da; let id = self.gen_id(); let expr_id = self.cached[expr]; let op = match axis { Da::X => spirv::Op::DPdx, Da::Y => spirv::Op::DPdy, Da::Width => spirv::Op::Fwidth, }; block .body .push(Instruction::derivative(op, result_type_id, id, expr_id)); id } crate::Expression::ImageQuery { image, query } => { self.write_image_query(result_type_id, image, query, block)? } crate::Expression::Relational { fun, argument } => { use crate::RelationalFunction as Rf; let arg_id = self.cached[argument]; let op = match fun { Rf::All => spirv::Op::All, Rf::Any => spirv::Op::Any, Rf::IsNan => spirv::Op::IsNan, Rf::IsInf => spirv::Op::IsInf, //TODO: these require Kernel capability Rf::IsFinite | Rf::IsNormal => { return Err(Error::FeatureNotImplemented("is finite/normal")) } }; let id = self.gen_id(); block .body .push(Instruction::relational(op, result_type_id, id, arg_id)); id } crate::Expression::ArrayLength(expr) => self.write_runtime_array_length(expr, block)?, }; self.cached[expr_handle] = id; Ok(()) } /// Build an `OpAccessChain` instruction. /// /// Emit any needed bounds-checking expressions to `block`. /// /// Some cases we need to generate a different return type than what the IR gives us. /// This is because pointers to binding arrays don't exist in the IR, but we need to /// create them to create an access chain in SPIRV. /// /// On success, the return value is an [`ExpressionPointer`] value; see the /// documentation for that type. fn write_expression_pointer( &mut self, mut expr_handle: Handle, block: &mut Block, return_type_override: Option, ) -> Result { let result_lookup_ty = match self.fun_info[expr_handle].ty { TypeResolution::Handle(ty_handle) => match return_type_override { // We use the return type override as a special case for binding arrays as the OpAccessChain // needs to return a pointer, but indexing into a binding array just gives you the type of // the binding in the IR. Some(ty) => ty, None => LookupType::Handle(ty_handle), }, TypeResolution::Value(ref inner) => LookupType::Local(make_local(inner).unwrap()), }; let result_type_id = self.get_type_id(result_lookup_ty); // The id of the boolean `and` of all dynamic bounds checks up to this point. If // `None`, then we haven't done any dynamic bounds checks yet. // // When we have a chain of bounds checks, we combine them with `OpLogicalAnd`, not // a short-circuit branch. This means we might do comparisons we don't need to, // but we expect these checks to almost always succeed, and keeping branches to a // minimum is essential. let mut accumulated_checks = None; self.temp_list.clear(); let root_id = loop { expr_handle = match self.ir_function.expressions[expr_handle] { crate::Expression::Access { base, index } => { let index_id = match self.write_bounds_check(base, index, block)? { BoundsCheckResult::KnownInBounds(known_index) => { // Even if the index is known, `OpAccessIndex` // requires expression operands, not literals. let scalar = crate::ScalarValue::Uint(known_index as u64); self.writer.get_constant_scalar(scalar, 4) } BoundsCheckResult::Computed(computed_index_id) => computed_index_id, BoundsCheckResult::Conditional(comparison_id) => { match accumulated_checks { Some(prior_checks) => { let combined = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::LogicalAnd, self.writer.get_bool_type_id(), combined, prior_checks, comparison_id, )); accumulated_checks = Some(combined); } None => { // Start a fresh chain of checks. accumulated_checks = Some(comparison_id); } } // Either way, the index to use is unchanged. self.cached[index] } }; self.temp_list.push(index_id); base } crate::Expression::AccessIndex { base, index } => { let const_id = self.get_index_constant(index); self.temp_list.push(const_id); base } crate::Expression::GlobalVariable(handle) => { let gv = &self.writer.global_variables[handle.index()]; break gv.access_id; } crate::Expression::LocalVariable(variable) => { let local_var = &self.function.variables[&variable]; break local_var.id; } crate::Expression::FunctionArgument(index) => { break self.function.parameter_id(index); } ref other => unimplemented!("Unexpected pointer expression {:?}", other), } }; let pointer = if self.temp_list.is_empty() { ExpressionPointer::Ready { pointer_id: root_id, } } else { self.temp_list.reverse(); let pointer_id = self.gen_id(); let access = Instruction::access_chain(result_type_id, pointer_id, root_id, &self.temp_list); // If we generated some bounds checks, we need to leave it to our // caller to generate the branch, the access, the load or store, and // the zero value (for loads). Otherwise, we can emit the access // ourselves, and just hand them the id of the pointer. match accumulated_checks { Some(condition) => ExpressionPointer::Conditional { condition, access }, None => { block.body.push(access); ExpressionPointer::Ready { pointer_id } } } }; Ok(pointer) } /// Build the instructions for matrix - matrix column operations #[allow(clippy::too_many_arguments)] fn write_matrix_matrix_column_op( &mut self, block: &mut Block, result_id: Word, result_type_id: Word, left_id: Word, right_id: Word, columns: crate::VectorSize, rows: crate::VectorSize, width: u8, op: spirv::Op, ) { self.temp_list.clear(); let vector_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(rows), kind: crate::ScalarKind::Float, width, pointer_space: None, })); for index in 0..columns as u32 { let column_id_left = self.gen_id(); let column_id_right = self.gen_id(); let column_id_res = self.gen_id(); block.body.push(Instruction::composite_extract( vector_type_id, column_id_left, left_id, &[index], )); block.body.push(Instruction::composite_extract( vector_type_id, column_id_right, right_id, &[index], )); block.body.push(Instruction::binary( op, vector_type_id, column_id_res, column_id_left, column_id_right, )); self.temp_list.push(column_id_res); } block.body.push(Instruction::composite_construct( result_type_id, result_id, &self.temp_list, )); } /// Build the instructions for vector - scalar multiplication fn write_vector_scalar_mult( &mut self, block: &mut Block, result_id: Word, result_type_id: Word, vector_id: Word, scalar_id: Word, vector: &crate::TypeInner, ) { let (size, kind) = match *vector { crate::TypeInner::Vector { size, kind, .. } => (size, kind), _ => unreachable!(), }; let (op, operand_id) = match kind { crate::ScalarKind::Float => (spirv::Op::VectorTimesScalar, scalar_id), _ => { let operand_id = self.gen_id(); self.temp_list.clear(); self.temp_list.resize(size as usize, scalar_id); block.body.push(Instruction::composite_construct( result_type_id, operand_id, &self.temp_list, )); (spirv::Op::IMul, operand_id) } }; block.body.push(Instruction::binary( op, result_type_id, result_id, vector_id, operand_id, )); } /// Build the instructions for the arithmetic expression of a dot product fn write_dot_product( &mut self, result_id: Word, result_type_id: Word, arg0_id: Word, arg1_id: Word, size: u32, block: &mut Block, ) { let const_null = self.gen_id(); block .body .push(Instruction::constant_null(result_type_id, const_null)); let mut partial_sum = const_null; let last_component = size - 1; for index in 0..=last_component { // compute the product of the current components let a_id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, a_id, arg0_id, &[index], )); let b_id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, b_id, arg1_id, &[index], )); let prod_id = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::IMul, result_type_id, prod_id, a_id, b_id, )); // choose the id for the next sum, depending on current index let id = if index == last_component { result_id } else { self.gen_id() }; // sum the computed product with the partial sum block.body.push(Instruction::binary( spirv::Op::IAdd, result_type_id, id, partial_sum, prod_id, )); // set the id of the result as the previous partial sum partial_sum = id; } } pub(super) fn write_block( &mut self, label_id: Word, statements: &[crate::Statement], exit: BlockExit, loop_context: LoopContext, ) -> Result<(), Error> { let mut block = Block::new(label_id); for statement in statements { match *statement { crate::Statement::Emit(ref range) => { for handle in range.clone() { self.cache_expression_value(handle, &mut block)?; } } crate::Statement::Block(ref block_statements) => { let scope_id = self.gen_id(); self.function.consume(block, Instruction::branch(scope_id)); let merge_id = self.gen_id(); self.write_block( scope_id, block_statements, BlockExit::Branch { target: merge_id }, loop_context, )?; block = Block::new(merge_id); } crate::Statement::If { condition, ref accept, ref reject, } => { let condition_id = self.cached[condition]; let merge_id = self.gen_id(); block.body.push(Instruction::selection_merge( merge_id, spirv::SelectionControl::NONE, )); let accept_id = if accept.is_empty() { None } else { Some(self.gen_id()) }; let reject_id = if reject.is_empty() { None } else { Some(self.gen_id()) }; self.function.consume( block, Instruction::branch_conditional( condition_id, accept_id.unwrap_or(merge_id), reject_id.unwrap_or(merge_id), ), ); if let Some(block_id) = accept_id { self.write_block( block_id, accept, BlockExit::Branch { target: merge_id }, loop_context, )?; } if let Some(block_id) = reject_id { self.write_block( block_id, reject, BlockExit::Branch { target: merge_id }, loop_context, )?; } block = Block::new(merge_id); } crate::Statement::Switch { selector, ref cases, } => { let selector_id = self.cached[selector]; let merge_id = self.gen_id(); block.body.push(Instruction::selection_merge( merge_id, spirv::SelectionControl::NONE, )); let default_id = self.gen_id(); let mut reached_default = false; let mut raw_cases = Vec::with_capacity(cases.len()); let mut case_ids = Vec::with_capacity(cases.len()); for case in cases.iter() { match case.value { crate::SwitchValue::Integer(value) => { let label_id = self.gen_id(); // No cases should be added after the default case is encountered // since the default case catches all if !reached_default { raw_cases.push(super::instructions::Case { value: value as Word, label_id, }); } case_ids.push(label_id); } crate::SwitchValue::Default => { case_ids.push(default_id); reached_default = true; } } } self.function.consume( block, Instruction::switch(selector_id, default_id, &raw_cases), ); let inner_context = LoopContext { break_id: Some(merge_id), ..loop_context }; for (i, (case, label_id)) in cases.iter().zip(case_ids.iter()).enumerate() { let case_finish_id = if case.fall_through { case_ids[i + 1] } else { merge_id }; self.write_block( *label_id, &case.body, BlockExit::Branch { target: case_finish_id, }, inner_context, )?; } // If no default was encountered write a empty block to satisfy the presence of // a block the default label if !reached_default { self.write_block( default_id, &[], BlockExit::Branch { target: merge_id }, inner_context, )?; } block = Block::new(merge_id); } crate::Statement::Loop { ref body, ref continuing, break_if, } => { let preamble_id = self.gen_id(); self.function .consume(block, Instruction::branch(preamble_id)); let merge_id = self.gen_id(); let body_id = self.gen_id(); let continuing_id = self.gen_id(); // SPIR-V requires the continuing to the `OpLoopMerge`, // so we have to start a new block with it. block = Block::new(preamble_id); block.body.push(Instruction::loop_merge( merge_id, continuing_id, spirv::SelectionControl::NONE, )); self.function.consume(block, Instruction::branch(body_id)); self.write_block( body_id, body, BlockExit::Branch { target: continuing_id, }, LoopContext { continuing_id: Some(continuing_id), break_id: Some(merge_id), }, )?; let exit = match break_if { Some(condition) => BlockExit::BreakIf { condition, preamble_id, }, None => BlockExit::Branch { target: preamble_id, }, }; self.write_block( continuing_id, continuing, exit, LoopContext { continuing_id: None, break_id: Some(merge_id), }, )?; block = Block::new(merge_id); } crate::Statement::Break => { self.function .consume(block, Instruction::branch(loop_context.break_id.unwrap())); return Ok(()); } crate::Statement::Continue => { self.function.consume( block, Instruction::branch(loop_context.continuing_id.unwrap()), ); return Ok(()); } crate::Statement::Return { value: Some(value) } => { let value_id = self.cached[value]; let instruction = match self.function.entry_point_context { // If this is an entry point, and we need to return anything, // let's instead store the output variables and return `void`. Some(ref context) => { self.writer.write_entry_point_return( value_id, self.ir_function.result.as_ref().unwrap(), &context.results, &mut block.body, )?; Instruction::return_void() } None => Instruction::return_value(value_id), }; self.function.consume(block, instruction); return Ok(()); } crate::Statement::Return { value: None } => { self.function.consume(block, Instruction::return_void()); return Ok(()); } crate::Statement::Kill => { self.function.consume(block, Instruction::kill()); return Ok(()); } crate::Statement::Barrier(flags) => { let memory_scope = if flags.contains(crate::Barrier::STORAGE) { spirv::Scope::Device } else { spirv::Scope::Workgroup }; let mut semantics = spirv::MemorySemantics::ACQUIRE_RELEASE; semantics.set( spirv::MemorySemantics::UNIFORM_MEMORY, flags.contains(crate::Barrier::STORAGE), ); semantics.set( spirv::MemorySemantics::WORKGROUP_MEMORY, flags.contains(crate::Barrier::WORK_GROUP), ); let exec_scope_id = self.get_index_constant(spirv::Scope::Workgroup as u32); let mem_scope_id = self.get_index_constant(memory_scope as u32); let semantics_id = self.get_index_constant(semantics.bits()); block.body.push(Instruction::control_barrier( exec_scope_id, mem_scope_id, semantics_id, )); } crate::Statement::Store { pointer, value } => { let value_id = self.cached[value]; match self.write_expression_pointer(pointer, &mut block, None)? { ExpressionPointer::Ready { pointer_id } => { let atomic_space = match *self.fun_info[pointer] .ty .inner_with(&self.ir_module.types) { crate::TypeInner::Pointer { base, space } => { match self.ir_module.types[base].inner { crate::TypeInner::Atomic { .. } => Some(space), _ => None, } } _ => None, }; let instruction = if let Some(space) = atomic_space { let (semantics, scope) = space.to_spirv_semantics_and_scope(); let scope_constant_id = self.get_scope_constant(scope as u32); let semantics_id = self.get_index_constant(semantics.bits()); Instruction::atomic_store( pointer_id, scope_constant_id, semantics_id, value_id, ) } else { Instruction::store(pointer_id, value_id, None) }; block.body.push(instruction); } ExpressionPointer::Conditional { condition, access } => { let mut selection = Selection::start(&mut block, ()); selection.if_true(self, condition, ()); // The in-bounds path. Perform the access and the store. let pointer_id = access.result_id.unwrap(); selection.block().body.push(access); selection .block() .body .push(Instruction::store(pointer_id, value_id, None)); // Finish the in-bounds block and start the merge block. This // is the block we'll leave current on return. selection.finish(self, ()); } }; } crate::Statement::ImageStore { image, coordinate, array_index, value, } => self.write_image_store(image, coordinate, array_index, value, &mut block)?, crate::Statement::Call { function: local_function, ref arguments, result, } => { let id = self.gen_id(); self.temp_list.clear(); for &argument in arguments { self.temp_list.push(self.cached[argument]); } let type_id = match result { Some(expr) => { self.cached[expr] = id; self.get_expression_type_id(&self.fun_info[expr].ty) } None => self.writer.void_type, }; block.body.push(Instruction::function_call( type_id, id, self.writer.lookup_function[&local_function], &self.temp_list, )); } crate::Statement::Atomic { pointer, ref fun, value, result, } => { let id = self.gen_id(); let result_type_id = self.get_expression_type_id(&self.fun_info[result].ty); self.cached[result] = id; let pointer_id = match self.write_expression_pointer(pointer, &mut block, None)? { ExpressionPointer::Ready { pointer_id } => pointer_id, ExpressionPointer::Conditional { .. } => { return Err(Error::FeatureNotImplemented( "Atomics out-of-bounds handling", )); } }; let space = self.fun_info[pointer] .ty .inner_with(&self.ir_module.types) .pointer_space() .unwrap(); let (semantics, scope) = space.to_spirv_semantics_and_scope(); let scope_constant_id = self.get_scope_constant(scope as u32); let semantics_id = self.get_index_constant(semantics.bits()); let value_id = self.cached[value]; let value_inner = self.fun_info[value].ty.inner_with(&self.ir_module.types); let instruction = match *fun { crate::AtomicFunction::Add => Instruction::atomic_binary( spirv::Op::AtomicIAdd, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ), crate::AtomicFunction::Subtract => Instruction::atomic_binary( spirv::Op::AtomicISub, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ), crate::AtomicFunction::And => Instruction::atomic_binary( spirv::Op::AtomicAnd, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ), crate::AtomicFunction::InclusiveOr => Instruction::atomic_binary( spirv::Op::AtomicOr, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ), crate::AtomicFunction::ExclusiveOr => Instruction::atomic_binary( spirv::Op::AtomicXor, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ), crate::AtomicFunction::Min => { let spirv_op = match *value_inner { crate::TypeInner::Scalar { kind: crate::ScalarKind::Sint, width: _, } => spirv::Op::AtomicSMin, crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, width: _, } => spirv::Op::AtomicUMin, _ => unimplemented!(), }; Instruction::atomic_binary( spirv_op, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ) } crate::AtomicFunction::Max => { let spirv_op = match *value_inner { crate::TypeInner::Scalar { kind: crate::ScalarKind::Sint, width: _, } => spirv::Op::AtomicSMax, crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, width: _, } => spirv::Op::AtomicUMax, _ => unimplemented!(), }; Instruction::atomic_binary( spirv_op, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ) } crate::AtomicFunction::Exchange { compare: None } => { Instruction::atomic_binary( spirv::Op::AtomicExchange, result_type_id, id, pointer_id, scope_constant_id, semantics_id, value_id, ) } crate::AtomicFunction::Exchange { compare: Some(cmp) } => { let comparator_id = self.cached[cmp]; Instruction::atomic_compare_exchange( result_type_id, id, pointer_id, scope_constant_id, semantics_id, semantics_id, value_id, comparator_id ) } }; block.body.push(instruction); } } } let termination = match exit { // We're generating code for the top-level Block of the function, so we // need to end it with some kind of return instruction. BlockExit::Return => match self.ir_function.result { Some(ref result) if self.function.entry_point_context.is_none() => { let type_id = self.get_type_id(LookupType::Handle(result.ty)); let null_id = self.writer.write_constant_null(type_id); Instruction::return_value(null_id) } _ => Instruction::return_void(), }, BlockExit::Branch { target } => Instruction::branch(target), BlockExit::BreakIf { condition, preamble_id, } => { let condition_id = self.cached[condition]; Instruction::branch_conditional( condition_id, loop_context.break_id.unwrap(), preamble_id, ) } }; self.function.consume(block, termination); Ok(()) } } ================================================ FILE: lib/naga/src/back/spv/helpers.rs ================================================ use crate::{Handle, UniqueArena}; use spirv::Word; pub(super) fn bytes_to_words(bytes: &[u8]) -> Vec { bytes .chunks(4) .map(|chars| chars.iter().rev().fold(0u32, |u, c| (u << 8) | *c as u32)) .collect() } pub(super) fn string_to_words(input: &str) -> Vec { let bytes = input.as_bytes(); let mut words = bytes_to_words(bytes); if bytes.len() % 4 == 0 { // nul-termination words.push(0x0u32); } words } pub(super) const fn map_storage_class(space: crate::AddressSpace) -> spirv::StorageClass { match space { crate::AddressSpace::Handle => spirv::StorageClass::UniformConstant, crate::AddressSpace::Function => spirv::StorageClass::Function, crate::AddressSpace::Private => spirv::StorageClass::Private, crate::AddressSpace::Storage { .. } => spirv::StorageClass::StorageBuffer, crate::AddressSpace::Uniform => spirv::StorageClass::Uniform, crate::AddressSpace::WorkGroup => spirv::StorageClass::Workgroup, crate::AddressSpace::PushConstant => spirv::StorageClass::PushConstant, } } pub(super) fn contains_builtin( binding: Option<&crate::Binding>, ty: Handle, arena: &UniqueArena, built_in: crate::BuiltIn, ) -> bool { if let Some(&crate::Binding::BuiltIn(bi)) = binding { bi == built_in } else if let crate::TypeInner::Struct { ref members, .. } = arena[ty].inner { members .iter() .any(|member| contains_builtin(member.binding.as_ref(), member.ty, arena, built_in)) } else { false // unreachable } } impl crate::AddressSpace { pub(super) const fn to_spirv_semantics_and_scope( self, ) -> (spirv::MemorySemantics, spirv::Scope) { match self { Self::Storage { .. } => (spirv::MemorySemantics::UNIFORM_MEMORY, spirv::Scope::Device), Self::WorkGroup => ( spirv::MemorySemantics::WORKGROUP_MEMORY, spirv::Scope::Workgroup, ), _ => (spirv::MemorySemantics::empty(), spirv::Scope::Invocation), } } } /// Return true if the global requires a type decorated with `Block`. /// /// Vulkan spec v1.3 §15.6.2, "Descriptor Set Interface", says: /// /// > Variables identified with the `Uniform` storage class are used to /// > access transparent buffer backed resources. Such variables must /// > be: /// > /// > - typed as `OpTypeStruct`, or an array of this type, /// > /// > - identified with a `Block` or `BufferBlock` decoration, and /// > /// > - laid out explicitly using the `Offset`, `ArrayStride`, and /// > `MatrixStride` decorations as specified in §15.6.4, "Offset /// > and Stride Assignment." // See `back::spv::GlobalVariable::access_id` for details. pub fn global_needs_wrapper(ir_module: &crate::Module, var: &crate::GlobalVariable) -> bool { match var.space { crate::AddressSpace::Uniform | crate::AddressSpace::Storage { .. } | crate::AddressSpace::PushConstant => {} _ => return false, }; match ir_module.types[var.ty].inner { crate::TypeInner::Struct { ref members, span: _, } => match members.last() { Some(member) => match ir_module.types[member.ty].inner { // Structs with dynamically sized arrays can't be copied and can't be wrapped. crate::TypeInner::Array { size: crate::ArraySize::Dynamic, .. } => false, _ => true, }, None => false, }, // if it's not a structure, let's wrap it to be able to put "Block" _ => true, } } ================================================ FILE: lib/naga/src/back/spv/image.rs ================================================ /*! Generating SPIR-V for image operations. */ use super::{ selection::{MergeTuple, Selection}, Block, BlockContext, Error, IdGenerator, Instruction, LocalType, LookupType, }; use crate::arena::Handle; use spirv::Word; /// Information about a vector of coordinates. /// /// The coordinate vectors expected by SPIR-V `OpImageRead` and `OpImageFetch` /// supply the array index for arrayed images as an additional component at /// the end, whereas Naga's `ImageLoad`, `ImageStore`, and `ImageSample` carry /// the array index as a separate field. /// /// In the process of generating code to compute the combined vector, we also /// produce SPIR-V types and vector lengths that are useful elsewhere. This /// struct gathers that information into one place, with standard names. struct ImageCoordinates { /// The SPIR-V id of the combined coordinate/index vector value. /// /// Note: when indexing a non-arrayed 1D image, this will be a scalar. value_id: Word, /// The SPIR-V id of the type of `value`. type_id: Word, /// The number of components in `value`, if it is a vector, or `None` if it /// is a scalar. size: Option, } /// A trait for image access (load or store) code generators. /// /// Types implementing this trait hold information about an `ImageStore` or /// `ImageLoad` operation that is not affected by the bounds check policy. The /// `generate` method emits code for the access, given the results of bounds /// checking. /// /// The [`image`] bounds checks policy affects access coordinates, level of /// detail, and sample index, but never the image id, result type (if any), or /// the specific SPIR-V instruction used. Types that implement this trait gather /// together the latter category, so we don't have to plumb them through the /// bounds-checking code. /// /// [`image`]: crate::proc::BoundsCheckPolicies::index trait Access { /// The Rust type that represents SPIR-V values and types for this access. /// /// For operations like loads, this is `Word`. For operations like stores, /// this is `()`. /// /// For `ReadZeroSkipWrite`, this will be the type of the selection /// construct that performs the bounds checks, so it must implement /// `MergeTuple`. type Output: MergeTuple + Copy + Clone; /// Write an image access to `block`. /// /// Access the texel at `coordinates_id`. The optional `level_id` indicates /// the level of detail, and `sample_id` is the index of the sample to /// access in a multisampled texel. /// /// Ths method assumes that `coordinates_id` has already had the image array /// index, if any, folded in, as done by `write_image_coordinates`. /// /// Return the value id produced by the instruction, if any. /// /// Use `id_gen` to generate SPIR-V ids as necessary. fn generate( &self, id_gen: &mut IdGenerator, coordinates_id: Word, level_id: Option, sample_id: Option, block: &mut Block, ) -> Self::Output; /// Return the SPIR-V type of the value produced by the code written by /// `generate`. If the access does not produce a value, `Self::Output` /// should be `()`. fn result_type(&self) -> Self::Output; /// Construct the SPIR-V 'zero' value to be returned for an out-of-bounds /// access under the `ReadZeroSkipWrite` policy. If the access does not /// produce a value, `Self::Output` should be `()`. fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Self::Output; } /// Texel access information for an [`ImageLoad`] expression. /// /// [`ImageLoad`]: crate::Expression::ImageLoad struct Load { /// The specific opcode we'll use to perform the fetch. Storage images /// require `OpImageRead`, while sampled images require `OpImageFetch`. opcode: spirv::Op, /// The type id produced by the actual image access instruction. type_id: Word, /// The id of the image being accessed. image_id: Word, } impl Load { fn from_image_expr( ctx: &mut BlockContext<'_>, image_id: Word, image_class: crate::ImageClass, result_type_id: Word, ) -> Result { let opcode = match image_class { crate::ImageClass::Storage { .. } => spirv::Op::ImageRead, crate::ImageClass::Depth { .. } | crate::ImageClass::Sampled { .. } => { spirv::Op::ImageFetch } }; // `OpImageRead` and `OpImageFetch` instructions produce vec4 // values. Most of the time, we can just use `result_type_id` for // this. The exception is that `Expression::ImageLoad` from a depth // image produces a scalar `f32`, so in that case we need to find // the right SPIR-V type for the access instruction here. let type_id = match image_class { crate::ImageClass::Depth { .. } => { ctx.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(crate::VectorSize::Quad), kind: crate::ScalarKind::Float, width: 4, pointer_space: None, })) } _ => result_type_id, }; Ok(Load { opcode, type_id, image_id, }) } } impl Access for Load { type Output = Word; /// Write an instruction to access a given texel of this image. fn generate( &self, id_gen: &mut IdGenerator, coordinates_id: Word, level_id: Option, sample_id: Option, block: &mut Block, ) -> Word { let texel_id = id_gen.next(); let mut instruction = Instruction::image_fetch_or_read( self.opcode, self.type_id, texel_id, self.image_id, coordinates_id, ); match (level_id, sample_id) { (None, None) => {} (Some(level_id), None) => { instruction.add_operand(spirv::ImageOperands::LOD.bits()); instruction.add_operand(level_id); } (None, Some(sample_id)) => { instruction.add_operand(spirv::ImageOperands::SAMPLE.bits()); instruction.add_operand(sample_id); } // There's no such thing as a multi-sampled mipmap. (Some(_), Some(_)) => unreachable!(), } block.body.push(instruction); texel_id } fn result_type(&self) -> Word { self.type_id } fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Word { ctx.writer.write_constant_null(self.type_id) } } /// Texel access information for a [`Store`] statement. /// /// [`Store`]: crate::Statement::Store struct Store { /// The id of the image being written to. image_id: Word, /// The value we're going to write to the texel. value_id: Word, } impl Access for Store { /// Stores don't generate any value. type Output = (); fn generate( &self, _id_gen: &mut IdGenerator, coordinates_id: Word, _level_id: Option, _sample_id: Option, block: &mut Block, ) { block.body.push(Instruction::image_write( self.image_id, coordinates_id, self.value_id, )); } /// Stores don't generate any value, so this just returns `()`. fn result_type(&self) {} /// Stores don't generate any value, so this just returns `()`. fn out_of_bounds_value(&self, _ctx: &mut BlockContext<'_>) {} } impl<'w> BlockContext<'w> { /// Extend image coordinates with an array index, if necessary. /// /// Whereas [`Expression::ImageLoad`] and [`ImageSample`] treat the array /// index as a separate operand from the coordinates, SPIR-V image access /// instructions include the array index in the `coordinates` operand. This /// function builds a SPIR-V coordinate vector from a Naga coordinate vector /// and array index, if one is supplied, and returns a `ImageCoordinates` /// struct describing what it built. /// /// If `array_index` is `Some(expr)`, then this function constructs a new /// vector that is `coordinates` with `array_index` concatenated onto the /// end: a `vec2` becomes a `vec3`, a scalar becomes a `vec2`, and so on. /// /// If `array_index` is `None`, then the return value uses `coordinates` /// unchanged. Note that, when indexing a non-arrayed 1D image, this will be /// a scalar value. /// /// If needed, this function generates code to convert the array index, /// always an integer scalar, to match the component type of `coordinates`. /// Naga's `ImageLoad` and SPIR-V's `OpImageRead`, `OpImageFetch`, and /// `OpImageWrite` all use integer coordinates, while Naga's `ImageSample` /// and SPIR-V's `OpImageSample...` instructions all take floating-point /// coordinate vectors. /// /// [`Expression::ImageLoad`]: crate::Expression::ImageLoad /// [`ImageSample`]: crate::Expression::ImageSample fn write_image_coordinates( &mut self, coordinates: Handle, array_index: Option>, block: &mut Block, ) -> Result { use crate::TypeInner as Ti; use crate::VectorSize as Vs; let coordinates_id = self.cached[coordinates]; let ty = &self.fun_info[coordinates].ty; let inner_ty = ty.inner_with(&self.ir_module.types); // If there's no array index, the image coordinates are exactly the // `coordinate` field of the `Expression::ImageLoad`. No work is needed. let array_index = match array_index { None => { let value_id = coordinates_id; let type_id = self.get_expression_type_id(ty); let size = match *inner_ty { Ti::Scalar { .. } => None, Ti::Vector { size, .. } => Some(size), _ => return Err(Error::Validation("coordinate type")), }; return Ok(ImageCoordinates { value_id, type_id, size, }); } Some(ix) => ix, }; // Find the component type of `coordinates`, and figure out the size the // combined coordinate vector will have. let (component_kind, size) = match *inner_ty { Ti::Scalar { kind, width: 4 } => (kind, Some(Vs::Bi)), Ti::Vector { kind, width: 4, size: Vs::Bi, } => (kind, Some(Vs::Tri)), Ti::Vector { kind, width: 4, size: Vs::Tri, } => (kind, Some(Vs::Quad)), Ti::Vector { size: Vs::Quad, .. } => { return Err(Error::Validation("extending vec4 coordinate")); } ref other => { log::error!("wrong coordinate type {:?}", other); return Err(Error::Validation("coordinate type")); } }; // Convert the index to the coordinate component type, if necessary. let array_index_i32_id = self.cached[array_index]; let reconciled_array_index_id = if component_kind == crate::ScalarKind::Sint { array_index_i32_id } else { let component_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: component_kind, width: 4, pointer_space: None, })); let reconciled_id = self.gen_id(); block.body.push(Instruction::unary( spirv::Op::ConvertUToF, component_type_id, reconciled_id, array_index_i32_id, )); reconciled_id }; // Find the SPIR-V type for the combined coordinates/index vector. let type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: size, kind: component_kind, width: 4, pointer_space: None, })); // Schmear the coordinates and index together. let value_id = self.gen_id(); block.body.push(Instruction::composite_construct( type_id, value_id, &[coordinates_id, reconciled_array_index_id], )); Ok(ImageCoordinates { value_id, type_id, size, }) } fn get_image_id(&mut self, expr_handle: Handle) -> Word { let id = match self.ir_function.expressions[expr_handle] { crate::Expression::GlobalVariable(handle) => { self.writer.global_variables[handle.index()].handle_id } crate::Expression::FunctionArgument(i) => { self.function.parameters[i as usize].handle_id } crate::Expression::Access { .. } | crate::Expression::AccessIndex { .. } => { self.cached[expr_handle] } ref other => unreachable!("Unexpected image expression {:?}", other), }; if id == 0 { unreachable!( "Image expression {:?} doesn't have a handle ID", expr_handle ); } id } /// Generate a vector or scalar 'one' for arithmetic on `coordinates`. /// /// If `coordinates` is a scalar, return a scalar one. Otherwise, return /// a vector of ones. fn write_coordinate_one(&mut self, coordinates: &ImageCoordinates) -> Result { let one = self.get_scope_constant(1); match coordinates.size { None => Ok(one), Some(vector_size) => { let ones = [one; 4]; let id = self.gen_id(); Instruction::constant_composite( coordinates.type_id, id, &ones[..vector_size as usize], ) .to_words(&mut self.writer.logical_layout.declarations); Ok(id) } } } /// Generate code to restrict `input` to fall between zero and one less than /// `size_id`. /// /// Both must be 32-bit scalar integer values, whose type is given by /// `type_id`. The computed value is also of type `type_id`. fn restrict_scalar( &mut self, type_id: Word, input_id: Word, size_id: Word, block: &mut Block, ) -> Result { let i32_one_id = self.get_scope_constant(1); // Subtract one from `size` to get the largest valid value. let limit_id = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::ISub, type_id, limit_id, size_id, i32_one_id, )); // Use an unsigned minimum, to handle both positive out-of-range values // and negative values in a single instruction: negative values of // `input_id` get treated as very large positive values. let restricted_id = self.gen_id(); block.body.push(Instruction::ext_inst( self.writer.gl450_ext_inst_id, spirv::GLOp::UMin, type_id, restricted_id, &[input_id, limit_id], )); Ok(restricted_id) } /// Write instructions to query the size of an image. /// /// This takes care of selecting the right instruction depending on whether /// a level of detail parameter is present. fn write_coordinate_bounds( &mut self, type_id: Word, image_id: Word, level_id: Option, block: &mut Block, ) -> Word { let coordinate_bounds_id = self.gen_id(); match level_id { Some(level_id) => { // A level of detail was provided, so fetch the image size for // that level. let mut inst = Instruction::image_query( spirv::Op::ImageQuerySizeLod, type_id, coordinate_bounds_id, image_id, ); inst.add_operand(level_id); block.body.push(inst); } _ => { // No level of detail was given. block.body.push(Instruction::image_query( spirv::Op::ImageQuerySize, type_id, coordinate_bounds_id, image_id, )); } } coordinate_bounds_id } /// Write code to restrict coordinates for an image reference. /// /// First, clamp the level of detail or sample index to fall within bounds. /// Then, obtain the image size, possibly using the clamped level of detail. /// Finally, use an unsigned minimum instruction to force all coordinates /// into range. /// /// Return a triple `(COORDS, LEVEL, SAMPLE)`, where `COORDS` is a coordinate /// vector (including the array index, if any), `LEVEL` is an optional level /// of detail, and `SAMPLE` is an optional sample index, all guaranteed to /// be in-bounds for `image_id`. /// /// The result is usually a vector, but it is a scalar when indexing /// non-arrayed 1D images. fn write_restricted_coordinates( &mut self, image_id: Word, coordinates: ImageCoordinates, level_id: Option, sample_id: Option, block: &mut Block, ) -> Result<(Word, Option, Option), Error> { self.writer.require_any( "the `Restrict` image bounds check policy", &[spirv::Capability::ImageQuery], )?; let i32_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Sint, width: 4, pointer_space: None, })); // If `level` is `Some`, clamp it to fall within bounds. This must // happen first, because we'll use it to query the image size for // clamping the actual coordinates. let level_id = level_id .map(|level_id| { // Find the number of mipmap levels in this image. let num_levels_id = self.gen_id(); block.body.push(Instruction::image_query( spirv::Op::ImageQueryLevels, i32_type_id, num_levels_id, image_id, )); self.restrict_scalar(i32_type_id, level_id, num_levels_id, block) }) .transpose()?; // If `sample_id` is `Some`, clamp it to fall within bounds. let sample_id = sample_id .map(|sample_id| { // Find the number of samples per texel. let num_samples_id = self.gen_id(); block.body.push(Instruction::image_query( spirv::Op::ImageQuerySamples, i32_type_id, num_samples_id, image_id, )); self.restrict_scalar(i32_type_id, sample_id, num_samples_id, block) }) .transpose()?; // Obtain the image bounds, including the array element count. let coordinate_bounds_id = self.write_coordinate_bounds(coordinates.type_id, image_id, level_id, block); // Compute maximum valid values from the bounds. let ones = self.write_coordinate_one(&coordinates)?; let coordinate_limit_id = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::ISub, coordinates.type_id, coordinate_limit_id, coordinate_bounds_id, ones, )); // Restrict the coordinates to fall within those bounds. // // Use an unsigned minimum, to handle both positive out-of-range values // and negative values in a single instruction: negative values of // `coordinates` get treated as very large positive values. let restricted_coordinates_id = self.gen_id(); block.body.push(Instruction::ext_inst( self.writer.gl450_ext_inst_id, spirv::GLOp::UMin, coordinates.type_id, restricted_coordinates_id, &[coordinates.value_id, coordinate_limit_id], )); Ok((restricted_coordinates_id, level_id, sample_id)) } fn write_conditional_image_access( &mut self, image_id: Word, coordinates: ImageCoordinates, level_id: Option, sample_id: Option, block: &mut Block, access: &A, ) -> Result { self.writer.require_any( "the `ReadZeroSkipWrite` image bounds check policy", &[spirv::Capability::ImageQuery], )?; let bool_type_id = self.writer.get_bool_type_id(); let i32_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Sint, width: 4, pointer_space: None, })); let null_id = access.out_of_bounds_value(self); let mut selection = Selection::start(block, access.result_type()); // If `level_id` is `Some`, check whether it is within bounds. This must // happen first, because we'll be supplying this as an argument when we // query the image size. if let Some(level_id) = level_id { // Find the number of mipmap levels in this image. let num_levels_id = self.gen_id(); selection.block().body.push(Instruction::image_query( spirv::Op::ImageQueryLevels, i32_type_id, num_levels_id, image_id, )); let lod_cond_id = self.gen_id(); selection.block().body.push(Instruction::binary( spirv::Op::ULessThan, bool_type_id, lod_cond_id, level_id, num_levels_id, )); selection.if_true(self, lod_cond_id, null_id); } // If `sample_id` is `Some`, check whether it is in bounds. if let Some(sample_id) = sample_id { // Find the number of samples per texel. let num_samples_id = self.gen_id(); selection.block().body.push(Instruction::image_query( spirv::Op::ImageQuerySamples, i32_type_id, num_samples_id, image_id, )); let samples_cond_id = self.gen_id(); selection.block().body.push(Instruction::binary( spirv::Op::ULessThan, bool_type_id, samples_cond_id, sample_id, num_samples_id, )); selection.if_true(self, samples_cond_id, null_id); } // Obtain the image bounds, including any array element count. let coordinate_bounds_id = self.write_coordinate_bounds( coordinates.type_id, image_id, level_id, selection.block(), ); // Compare the coordinates against the bounds. let coords_bool_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: coordinates.size, kind: crate::ScalarKind::Bool, width: 1, pointer_space: None, })); let coords_conds_id = self.gen_id(); selection.block().body.push(Instruction::binary( spirv::Op::ULessThan, coords_bool_type_id, coords_conds_id, coordinates.value_id, coordinate_bounds_id, )); // If the comparison above was a vector comparison, then we need to // check that all components of the comparison are true. let coords_cond_id = if coords_bool_type_id != bool_type_id { let id = self.gen_id(); selection.block().body.push(Instruction::relational( spirv::Op::All, bool_type_id, id, coords_conds_id, )); id } else { coords_conds_id }; selection.if_true(self, coords_cond_id, null_id); // All conditions are met. We can carry out the access. let texel_id = access.generate( &mut self.writer.id_gen, coordinates.value_id, level_id, sample_id, selection.block(), ); // This, then, is the value of the 'true' branch. Ok(selection.finish(self, texel_id)) } /// Generate code for an `ImageLoad` expression. /// /// The arguments are the components of an `Expression::ImageLoad` variant. #[allow(clippy::too_many_arguments)] pub(super) fn write_image_load( &mut self, result_type_id: Word, image: Handle, coordinate: Handle, array_index: Option>, level: Option>, sample: Option>, block: &mut Block, ) -> Result { let image_id = self.get_image_id(image); let image_type = self.fun_info[image].ty.inner_with(&self.ir_module.types); let image_class = match *image_type { crate::TypeInner::Image { class, .. } => class, _ => return Err(Error::Validation("image type")), }; let access = Load::from_image_expr(self, image_id, image_class, result_type_id)?; let coordinates = self.write_image_coordinates(coordinate, array_index, block)?; let level_id = level.map(|expr| self.cached[expr]); let sample_id = sample.map(|expr| self.cached[expr]); // Perform the access, according to the bounds check policy. let access_id = match self.writer.bounds_check_policies.image { crate::proc::BoundsCheckPolicy::Restrict => { let (coords, level_id, sample_id) = self.write_restricted_coordinates( image_id, coordinates, level_id, sample_id, block, )?; access.generate(&mut self.writer.id_gen, coords, level_id, sample_id, block) } crate::proc::BoundsCheckPolicy::ReadZeroSkipWrite => self .write_conditional_image_access( image_id, coordinates, level_id, sample_id, block, &access, )?, crate::proc::BoundsCheckPolicy::Unchecked => access.generate( &mut self.writer.id_gen, coordinates.value_id, level_id, sample_id, block, ), }; // For depth images, `ImageLoad` expressions produce a single f32, // whereas the SPIR-V instructions always produce a vec4. So we may have // to pull out the component we need. let result_id = if result_type_id == access.result_type() { // The instruction produced the type we expected. We can use // its result as-is. access_id } else { // For `ImageClass::Depth` images, SPIR-V gave us four components, // but we only want the first one. let component_id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, component_id, access_id, &[0], )); component_id }; Ok(result_id) } /// Generate code for an `ImageSample` expression. /// /// The arguments are the components of an `Expression::ImageSample` variant. #[allow(clippy::too_many_arguments)] pub(super) fn write_image_sample( &mut self, result_type_id: Word, image: Handle, sampler: Handle, gather: Option, coordinate: Handle, array_index: Option>, offset: Option>, level: crate::SampleLevel, depth_ref: Option>, block: &mut Block, ) -> Result { use super::instructions::SampleLod; // image let image_id = self.get_image_id(image); let image_type = self.fun_info[image].ty.handle().unwrap(); // SPIR-V doesn't know about our `Depth` class, and it returns // `vec4`, so we need to grab the first component out of it. let needs_sub_access = match self.ir_module.types[image_type].inner { crate::TypeInner::Image { class: crate::ImageClass::Depth { .. }, .. } => depth_ref.is_none() && gather.is_none(), _ => false, }; let sample_result_type_id = if needs_sub_access { self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(crate::VectorSize::Quad), kind: crate::ScalarKind::Float, width: 4, pointer_space: None, })) } else { result_type_id }; // OpTypeSampledImage let image_type_id = self.get_type_id(LookupType::Handle(image_type)); let sampled_image_type_id = self.get_type_id(LookupType::Local(LocalType::SampledImage { image_type_id })); let sampler_id = self.get_image_id(sampler); let coordinates_id = self .write_image_coordinates(coordinate, array_index, block)? .value_id; let sampled_image_id = self.gen_id(); block.body.push(Instruction::sampled_image( sampled_image_type_id, sampled_image_id, image_id, sampler_id, )); let id = self.gen_id(); let depth_id = depth_ref.map(|handle| self.cached[handle]); let mut mask = spirv::ImageOperands::empty(); mask.set(spirv::ImageOperands::CONST_OFFSET, offset.is_some()); let mut main_instruction = match (level, gather) { (_, Some(component)) => { let component_id = self.get_index_constant(component as u32); let mut inst = Instruction::image_gather( sample_result_type_id, id, sampled_image_id, coordinates_id, component_id, depth_id, ); if !mask.is_empty() { inst.add_operand(mask.bits()); } inst } (crate::SampleLevel::Zero, None) => { let mut inst = Instruction::image_sample( sample_result_type_id, id, SampleLod::Explicit, sampled_image_id, coordinates_id, depth_id, ); let zero_id = self .writer .get_constant_scalar(crate::ScalarValue::Float(0.0), 4); mask |= spirv::ImageOperands::LOD; inst.add_operand(mask.bits()); inst.add_operand(zero_id); inst } (crate::SampleLevel::Auto, None) => { let mut inst = Instruction::image_sample( sample_result_type_id, id, SampleLod::Implicit, sampled_image_id, coordinates_id, depth_id, ); if !mask.is_empty() { inst.add_operand(mask.bits()); } inst } (crate::SampleLevel::Exact(lod_handle), None) => { let mut inst = Instruction::image_sample( sample_result_type_id, id, SampleLod::Explicit, sampled_image_id, coordinates_id, depth_id, ); let lod_id = self.cached[lod_handle]; mask |= spirv::ImageOperands::LOD; inst.add_operand(mask.bits()); inst.add_operand(lod_id); inst } (crate::SampleLevel::Bias(bias_handle), None) => { let mut inst = Instruction::image_sample( sample_result_type_id, id, SampleLod::Implicit, sampled_image_id, coordinates_id, depth_id, ); let bias_id = self.cached[bias_handle]; mask |= spirv::ImageOperands::BIAS; inst.add_operand(mask.bits()); inst.add_operand(bias_id); inst } (crate::SampleLevel::Gradient { x, y }, None) => { let mut inst = Instruction::image_sample( sample_result_type_id, id, SampleLod::Explicit, sampled_image_id, coordinates_id, depth_id, ); let x_id = self.cached[x]; let y_id = self.cached[y]; mask |= spirv::ImageOperands::GRAD; inst.add_operand(mask.bits()); inst.add_operand(x_id); inst.add_operand(y_id); inst } }; if let Some(offset_const) = offset { let offset_id = self.writer.constant_ids[offset_const.index()]; main_instruction.add_operand(offset_id); } block.body.push(main_instruction); let id = if needs_sub_access { let sub_id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, sub_id, id, &[0], )); sub_id } else { id }; Ok(id) } /// Generate code for an `ImageQuery` expression. /// /// The arguments are the components of an `Expression::ImageQuery` variant. pub(super) fn write_image_query( &mut self, result_type_id: Word, image: Handle, query: crate::ImageQuery, block: &mut Block, ) -> Result { use crate::{ImageClass as Ic, ImageDimension as Id, ImageQuery as Iq}; let image_id = self.get_image_id(image); let image_type = self.fun_info[image].ty.handle().unwrap(); let (dim, arrayed, class) = match self.ir_module.types[image_type].inner { crate::TypeInner::Image { dim, arrayed, class, } => (dim, arrayed, class), _ => { return Err(Error::Validation("image type")); } }; self.writer .require_any("image queries", &[spirv::Capability::ImageQuery])?; let id = match query { Iq::Size { level } => { let dim_coords = match dim { Id::D1 => 1, Id::D2 | Id::Cube => 2, Id::D3 => 3, }; let extended_size_type_id = { let array_coords = if arrayed { 1 } else { 0 }; let vector_size = match dim_coords + array_coords { 2 => Some(crate::VectorSize::Bi), 3 => Some(crate::VectorSize::Tri), 4 => Some(crate::VectorSize::Quad), _ => None, }; self.get_type_id(LookupType::Local(LocalType::Value { vector_size, kind: crate::ScalarKind::Sint, width: 4, pointer_space: None, })) }; let (query_op, level_id) = match class { Ic::Sampled { multi: true, .. } | Ic::Depth { multi: true } | Ic::Storage { .. } => (spirv::Op::ImageQuerySize, None), _ => { let level_id = match level { Some(expr) => self.cached[expr], None => self.get_index_constant(0), }; (spirv::Op::ImageQuerySizeLod, Some(level_id)) } }; // The ID of the vector returned by SPIR-V, which contains the dimensions // as well as the layer count. let id_extended = self.gen_id(); let mut inst = Instruction::image_query( query_op, extended_size_type_id, id_extended, image_id, ); if let Some(expr_id) = level_id { inst.add_operand(expr_id); } block.body.push(inst); if result_type_id != extended_size_type_id { let id = self.gen_id(); let components = match dim { // always pick the first component, and duplicate it for all 3 dimensions Id::Cube => &[0u32, 0][..], _ => &[0u32, 1, 2, 3][..dim_coords], }; block.body.push(Instruction::vector_shuffle( result_type_id, id, id_extended, id_extended, components, )); id } else { id_extended } } Iq::NumLevels => { let id = self.gen_id(); block.body.push(Instruction::image_query( spirv::Op::ImageQueryLevels, result_type_id, id, image_id, )); id } Iq::NumLayers => { let vec_size = match dim { Id::D1 => crate::VectorSize::Bi, Id::D2 | Id::Cube => crate::VectorSize::Tri, Id::D3 => crate::VectorSize::Quad, }; let extended_size_type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(vec_size), kind: crate::ScalarKind::Sint, width: 4, pointer_space: None, })); let id_extended = self.gen_id(); let mut inst = Instruction::image_query( spirv::Op::ImageQuerySizeLod, extended_size_type_id, id_extended, image_id, ); inst.add_operand(self.get_index_constant(0)); block.body.push(inst); let id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, id, id_extended, &[vec_size as u32 - 1], )); id } Iq::NumSamples => { let id = self.gen_id(); block.body.push(Instruction::image_query( spirv::Op::ImageQuerySamples, result_type_id, id, image_id, )); id } }; Ok(id) } pub(super) fn write_image_store( &mut self, image: Handle, coordinate: Handle, array_index: Option>, value: Handle, block: &mut Block, ) -> Result<(), Error> { let image_id = self.get_image_id(image); let coordinates = self.write_image_coordinates(coordinate, array_index, block)?; let value_id = self.cached[value]; let write = Store { image_id, value_id }; match self.writer.bounds_check_policies.image { crate::proc::BoundsCheckPolicy::Restrict => { let (coords, _, _) = self.write_restricted_coordinates(image_id, coordinates, None, None, block)?; write.generate(&mut self.writer.id_gen, coords, None, None, block); } crate::proc::BoundsCheckPolicy::ReadZeroSkipWrite => { self.write_conditional_image_access( image_id, coordinates, None, None, block, &write, )?; } crate::proc::BoundsCheckPolicy::Unchecked => { write.generate( &mut self.writer.id_gen, coordinates.value_id, None, None, block, ); } } Ok(()) } } ================================================ FILE: lib/naga/src/back/spv/index.rs ================================================ /*! Bounds-checking for SPIR-V output. */ use super::{ helpers::global_needs_wrapper, selection::Selection, Block, BlockContext, Error, IdGenerator, Instruction, Word, }; use crate::{arena::Handle, proc::BoundsCheckPolicy}; /// The results of performing a bounds check. /// /// On success, `write_bounds_check` returns a value of this type. pub(super) enum BoundsCheckResult { /// The index is statically known and in bounds, with the given value. KnownInBounds(u32), /// The given instruction computes the index to be used. Computed(Word), /// The given instruction computes a boolean condition which is true /// if the index is in bounds. Conditional(Word), } /// A value that we either know at translation time, or need to compute at runtime. pub(super) enum MaybeKnown { /// The value is known at shader translation time. Known(T), /// The value is computed by the instruction with the given id. Computed(Word), } impl<'w> BlockContext<'w> { /// Emit code to compute the length of a run-time array. /// /// Given `array`, an expression referring a runtime-sized array, return the /// instruction id for the array's length. pub(super) fn write_runtime_array_length( &mut self, array: Handle, block: &mut Block, ) -> Result { // Naga IR permits runtime-sized arrays as global variables or as the // final member of a struct that is a global variable. SPIR-V permits // only the latter, so this back end wraps bare runtime-sized arrays // in a made-up struct; see `helpers::global_needs_wrapper` and its uses. // This code must handle both cases. let (structure_id, last_member_index) = match self.ir_function.expressions[array] { crate::Expression::AccessIndex { base, index } => { match self.ir_function.expressions[base] { crate::Expression::GlobalVariable(handle) => ( self.writer.global_variables[handle.index()].access_id, index, ), _ => return Err(Error::Validation("array length expression")), } } crate::Expression::GlobalVariable(handle) => { let global = &self.ir_module.global_variables[handle]; if !global_needs_wrapper(self.ir_module, global) { return Err(Error::Validation("array length expression")); } (self.writer.global_variables[handle.index()].var_id, 0) } _ => return Err(Error::Validation("array length expression")), }; let length_id = self.gen_id(); block.body.push(Instruction::array_length( self.writer.get_uint_type_id(), length_id, structure_id, last_member_index, )); Ok(length_id) } /// Compute the length of a subscriptable value. /// /// Given `sequence`, an expression referring to some indexable type, return /// its length. The result may either be computed by SPIR-V instructions, or /// known at shader translation time. /// /// `sequence` may be a `Vector`, `Matrix`, or `Array`, a `Pointer` to any /// of those, or a `ValuePointer`. An array may be fixed-size, dynamically /// sized, or use a specializable constant as its length. fn write_sequence_length( &mut self, sequence: Handle, block: &mut Block, ) -> Result, Error> { let sequence_ty = self.fun_info[sequence].ty.inner_with(&self.ir_module.types); match sequence_ty.indexable_length(self.ir_module) { Ok(crate::proc::IndexableLength::Known(known_length)) => { Ok(MaybeKnown::Known(known_length)) } Ok(crate::proc::IndexableLength::Dynamic) => { let length_id = self.write_runtime_array_length(sequence, block)?; Ok(MaybeKnown::Computed(length_id)) } Err(err) => { log::error!("Sequence length for {:?} failed: {}", sequence, err); Err(Error::Validation("indexable length")) } } } /// Compute the maximum valid index of a subscriptable value. /// /// Given `sequence`, an expression referring to some indexable type, return /// its maximum valid index - one less than its length. The result may /// either be computed, or known at shader translation time. /// /// `sequence` may be a `Vector`, `Matrix`, or `Array`, a `Pointer` to any /// of those, or a `ValuePointer`. An array may be fixed-size, dynamically /// sized, or use a specializable constant as its length. fn write_sequence_max_index( &mut self, sequence: Handle, block: &mut Block, ) -> Result, Error> { match self.write_sequence_length(sequence, block)? { MaybeKnown::Known(known_length) => { // We should have thrown out all attempts to subscript zero-length // sequences during validation, so the following subtraction should never // underflow. assert!(known_length > 0); // Compute the max index from the length now. Ok(MaybeKnown::Known(known_length - 1)) } MaybeKnown::Computed(length_id) => { // Emit code to compute the max index from the length. let const_one_id = self.get_index_constant(1); let max_index_id = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::ISub, self.writer.get_uint_type_id(), max_index_id, length_id, const_one_id, )); Ok(MaybeKnown::Computed(max_index_id)) } } } /// Restrict an index to be in range for a vector, matrix, or array. /// /// This is used to implement `BoundsCheckPolicy::Restrict`. An in-bounds /// index is left unchanged. An out-of-bounds index is replaced with some /// arbitrary in-bounds index. Note,this is not necessarily clamping; for /// example, negative indices might be changed to refer to the last element /// of the sequence, not the first, as clamping would do. /// /// Either return the restricted index value, if known, or add instructions /// to `block` to compute it, and return the id of the result. See the /// documentation for `BoundsCheckResult` for details. /// /// The `sequence` expression may be a `Vector`, `Matrix`, or `Array`, a /// `Pointer` to any of those, or a `ValuePointer`. An array may be /// fixed-size, dynamically sized, or use a specializable constant as its /// length. pub(super) fn write_restricted_index( &mut self, sequence: Handle, index: Handle, block: &mut Block, ) -> Result { let index_id = self.cached[index]; // Get the sequence's maximum valid index. Return early if we've already // done the bounds check. let max_index_id = match self.write_sequence_max_index(sequence, block)? { MaybeKnown::Known(known_max_index) => { if let crate::Expression::Constant(index_k) = self.ir_function.expressions[index] { if let Some(known_index) = self.ir_module.constants[index_k].to_array_length() { // Both the index and length are known at compile time. // // In strict WGSL compliance mode, out-of-bounds indices cannot be // reported at shader translation time, and must be replaced with // in-bounds indices at run time. So we cannot assume that // validation ensured the index was in bounds. Restrict now. let restricted = std::cmp::min(known_index, known_max_index); return Ok(BoundsCheckResult::KnownInBounds(restricted)); } } self.get_index_constant(known_max_index) } MaybeKnown::Computed(max_index_id) => max_index_id, }; // One or the other of the index or length is dynamic, so emit code for // BoundsCheckPolicy::Restrict. let restricted_index_id = self.gen_id(); block.body.push(Instruction::ext_inst( self.writer.gl450_ext_inst_id, spirv::GLOp::UMin, self.writer.get_uint_type_id(), restricted_index_id, &[index_id, max_index_id], )); Ok(BoundsCheckResult::Computed(restricted_index_id)) } /// Write an index bounds comparison to `block`, if needed. /// /// If we're able to determine statically that `index` is in bounds for /// `sequence`, return `KnownInBounds(value)`, where `value` is the actual /// value of the index. (In principle, one could know that the index is in /// bounds without knowing its specific value, but in our simple-minded /// situation, we always know it.) /// /// If instead we must generate code to perform the comparison at run time, /// return `Conditional(comparison_id)`, where `comparison_id` is an /// instruction producing a boolean value that is true if `index` is in /// bounds for `sequence`. /// /// The `sequence` expression may be a `Vector`, `Matrix`, or `Array`, a /// `Pointer` to any of those, or a `ValuePointer`. An array may be /// fixed-size, dynamically sized, or use a specializable constant as its /// length. fn write_index_comparison( &mut self, sequence: Handle, index: Handle, block: &mut Block, ) -> Result { let index_id = self.cached[index]; // Get the sequence's length. Return early if we've already done the // bounds check. let length_id = match self.write_sequence_length(sequence, block)? { MaybeKnown::Known(known_length) => { if let crate::Expression::Constant(index_k) = self.ir_function.expressions[index] { if let Some(known_index) = self.ir_module.constants[index_k].to_array_length() { // Both the index and length are known at compile time. // // It would be nice to assume that, since we are using the // `ReadZeroSkipWrite` policy, we are not in strict WGSL // compliance mode, and thus we can count on the validator to have // rejected any programs with known out-of-bounds indices, and // thus just return `KnownInBounds` here without actually // checking. // // But it's also reasonable to expect that bounds check policies // and error reporting policies should be able to vary // independently without introducing security holes. So, we should // support the case where bad indices do not cause validation // errors, and are handled via `ReadZeroSkipWrite`. // // In theory, when `known_index` is bad, we could return a new // `KnownOutOfBounds` variant here. But it's simpler just to fall // through and let the bounds check take place. The shader is // broken anyway, so it doesn't make sense to invest in emitting // the ideal code for it. if known_index < known_length { return Ok(BoundsCheckResult::KnownInBounds(known_index)); } } } self.get_index_constant(known_length) } MaybeKnown::Computed(length_id) => length_id, }; // Compare the index against the length. let condition_id = self.gen_id(); block.body.push(Instruction::binary( spirv::Op::ULessThan, self.writer.get_bool_type_id(), condition_id, index_id, length_id, )); // Indicate that we did generate the check. Ok(BoundsCheckResult::Conditional(condition_id)) } /// Emit a conditional load for `BoundsCheckPolicy::ReadZeroSkipWrite`. /// /// Generate code to load a value of `result_type` if `condition` is true, /// and generate a null value of that type if it is false. Call `emit_load` /// to emit the instructions to perform the load. Return the id of the /// merged value of the two branches. pub(super) fn write_conditional_indexed_load( &mut self, result_type: Word, condition: Word, block: &mut Block, emit_load: F, ) -> Word where F: FnOnce(&mut IdGenerator, &mut Block) -> Word, { // For the out-of-bounds case, we produce a zero value. let null_id = self.writer.write_constant_null(result_type); let mut selection = Selection::start(block, result_type); // As it turns out, we don't actually need a full 'if-then-else' // structure for this: SPIR-V constants are declared up front, so the // 'else' block would have no instructions. Instead we emit something // like this: // // result = zero; // if in_bounds { // result = do the load; // } // use result; // Continue only if the index was in bounds. Otherwise, branch to the // merge block. selection.if_true(self, condition, null_id); // The in-bounds path. Perform the access and the load. let loaded_value = emit_load(&mut self.writer.id_gen, selection.block()); selection.finish(self, loaded_value) } /// Emit code for bounds checks for an array, vector, or matrix access. /// /// This implements either `index_bounds_check_policy` or /// `buffer_bounds_check_policy`, depending on the address space of the /// pointer being accessed. /// /// Return a `BoundsCheckResult` indicating how the index should be /// consumed. See that type's documentation for details. pub(super) fn write_bounds_check( &mut self, base: Handle, index: Handle, block: &mut Block, ) -> Result { let policy = self.writer.bounds_check_policies.choose_policy( base, &self.ir_module.types, self.fun_info, ); Ok(match policy { BoundsCheckPolicy::Restrict => self.write_restricted_index(base, index, block)?, BoundsCheckPolicy::ReadZeroSkipWrite => { self.write_index_comparison(base, index, block)? } BoundsCheckPolicy::Unchecked => BoundsCheckResult::Computed(self.cached[index]), }) } /// Emit code to subscript a vector by value with a computed index. /// /// Return the id of the element value. pub(super) fn write_vector_access( &mut self, expr_handle: Handle, base: Handle, index: Handle, block: &mut Block, ) -> Result { let result_type_id = self.get_expression_type_id(&self.fun_info[expr_handle].ty); let base_id = self.cached[base]; let index_id = self.cached[index]; let result_id = match self.write_bounds_check(base, index, block)? { BoundsCheckResult::KnownInBounds(known_index) => { let result_id = self.gen_id(); block.body.push(Instruction::composite_extract( result_type_id, result_id, base_id, &[known_index], )); result_id } BoundsCheckResult::Computed(computed_index_id) => { let result_id = self.gen_id(); block.body.push(Instruction::vector_extract_dynamic( result_type_id, result_id, base_id, computed_index_id, )); result_id } BoundsCheckResult::Conditional(comparison_id) => { // Run-time bounds checks were required. Emit // conditional load. self.write_conditional_indexed_load( result_type_id, comparison_id, block, |id_gen, block| { // The in-bounds path. Generate the access. let element_id = id_gen.next(); block.body.push(Instruction::vector_extract_dynamic( result_type_id, element_id, base_id, index_id, )); element_id }, ) } }; Ok(result_id) } } ================================================ FILE: lib/naga/src/back/spv/instructions.rs ================================================ use super::helpers; use spirv::{Op, Word}; pub(super) enum Signedness { Unsigned = 0, Signed = 1, } pub(super) enum SampleLod { Explicit, Implicit, } pub(super) struct Case { pub value: Word, pub label_id: Word, } impl super::Instruction { // // Debug Instructions // pub(super) fn source(source_language: spirv::SourceLanguage, version: u32) -> Self { let mut instruction = Self::new(Op::Source); instruction.add_operand(source_language as u32); instruction.add_operands(helpers::bytes_to_words(&version.to_le_bytes())); instruction } pub(super) fn name(target_id: Word, name: &str) -> Self { let mut instruction = Self::new(Op::Name); instruction.add_operand(target_id); instruction.add_operands(helpers::string_to_words(name)); instruction } pub(super) fn member_name(target_id: Word, member: Word, name: &str) -> Self { let mut instruction = Self::new(Op::MemberName); instruction.add_operand(target_id); instruction.add_operand(member); instruction.add_operands(helpers::string_to_words(name)); instruction } // // Annotation Instructions // pub(super) fn decorate( target_id: Word, decoration: spirv::Decoration, operands: &[Word], ) -> Self { let mut instruction = Self::new(Op::Decorate); instruction.add_operand(target_id); instruction.add_operand(decoration as u32); for operand in operands { instruction.add_operand(*operand) } instruction } pub(super) fn member_decorate( target_id: Word, member_index: Word, decoration: spirv::Decoration, operands: &[Word], ) -> Self { let mut instruction = Self::new(Op::MemberDecorate); instruction.add_operand(target_id); instruction.add_operand(member_index); instruction.add_operand(decoration as u32); for operand in operands { instruction.add_operand(*operand) } instruction } // // Extension Instructions // pub(super) fn extension(name: &str) -> Self { let mut instruction = Self::new(Op::Extension); instruction.add_operands(helpers::string_to_words(name)); instruction } pub(super) fn ext_inst_import(id: Word, name: &str) -> Self { let mut instruction = Self::new(Op::ExtInstImport); instruction.set_result(id); instruction.add_operands(helpers::string_to_words(name)); instruction } pub(super) fn ext_inst( set_id: Word, op: spirv::GLOp, result_type_id: Word, id: Word, operands: &[Word], ) -> Self { let mut instruction = Self::new(Op::ExtInst); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(set_id); instruction.add_operand(op as u32); for operand in operands { instruction.add_operand(*operand) } instruction } // // Mode-Setting Instructions // pub(super) fn memory_model( addressing_model: spirv::AddressingModel, memory_model: spirv::MemoryModel, ) -> Self { let mut instruction = Self::new(Op::MemoryModel); instruction.add_operand(addressing_model as u32); instruction.add_operand(memory_model as u32); instruction } pub(super) fn entry_point( execution_model: spirv::ExecutionModel, entry_point_id: Word, name: &str, interface_ids: &[Word], ) -> Self { let mut instruction = Self::new(Op::EntryPoint); instruction.add_operand(execution_model as u32); instruction.add_operand(entry_point_id); instruction.add_operands(helpers::string_to_words(name)); for interface_id in interface_ids { instruction.add_operand(*interface_id); } instruction } pub(super) fn execution_mode( entry_point_id: Word, execution_mode: spirv::ExecutionMode, args: &[Word], ) -> Self { let mut instruction = Self::new(Op::ExecutionMode); instruction.add_operand(entry_point_id); instruction.add_operand(execution_mode as u32); for arg in args { instruction.add_operand(*arg); } instruction } pub(super) fn capability(capability: spirv::Capability) -> Self { let mut instruction = Self::new(Op::Capability); instruction.add_operand(capability as u32); instruction } // // Type-Declaration Instructions // pub(super) fn type_void(id: Word) -> Self { let mut instruction = Self::new(Op::TypeVoid); instruction.set_result(id); instruction } pub(super) fn type_bool(id: Word) -> Self { let mut instruction = Self::new(Op::TypeBool); instruction.set_result(id); instruction } pub(super) fn type_int(id: Word, width: Word, signedness: Signedness) -> Self { let mut instruction = Self::new(Op::TypeInt); instruction.set_result(id); instruction.add_operand(width); instruction.add_operand(signedness as u32); instruction } pub(super) fn type_float(id: Word, width: Word) -> Self { let mut instruction = Self::new(Op::TypeFloat); instruction.set_result(id); instruction.add_operand(width); instruction } pub(super) fn type_vector( id: Word, component_type_id: Word, component_count: crate::VectorSize, ) -> Self { let mut instruction = Self::new(Op::TypeVector); instruction.set_result(id); instruction.add_operand(component_type_id); instruction.add_operand(component_count as u32); instruction } pub(super) fn type_matrix( id: Word, column_type_id: Word, column_count: crate::VectorSize, ) -> Self { let mut instruction = Self::new(Op::TypeMatrix); instruction.set_result(id); instruction.add_operand(column_type_id); instruction.add_operand(column_count as u32); instruction } #[allow(clippy::too_many_arguments)] pub(super) fn type_image( id: Word, sampled_type_id: Word, dim: spirv::Dim, flags: super::ImageTypeFlags, image_format: spirv::ImageFormat, ) -> Self { let mut instruction = Self::new(Op::TypeImage); instruction.set_result(id); instruction.add_operand(sampled_type_id); instruction.add_operand(dim as u32); instruction.add_operand(flags.contains(super::ImageTypeFlags::DEPTH) as u32); instruction.add_operand(flags.contains(super::ImageTypeFlags::ARRAYED) as u32); instruction.add_operand(flags.contains(super::ImageTypeFlags::MULTISAMPLED) as u32); instruction.add_operand(if flags.contains(super::ImageTypeFlags::SAMPLED) { 1 } else { 2 }); instruction.add_operand(image_format as u32); instruction } pub(super) fn type_sampler(id: Word) -> Self { let mut instruction = Self::new(Op::TypeSampler); instruction.set_result(id); instruction } pub(super) fn type_sampled_image(id: Word, image_type_id: Word) -> Self { let mut instruction = Self::new(Op::TypeSampledImage); instruction.set_result(id); instruction.add_operand(image_type_id); instruction } pub(super) fn type_array(id: Word, element_type_id: Word, length_id: Word) -> Self { let mut instruction = Self::new(Op::TypeArray); instruction.set_result(id); instruction.add_operand(element_type_id); instruction.add_operand(length_id); instruction } pub(super) fn type_runtime_array(id: Word, element_type_id: Word) -> Self { let mut instruction = Self::new(Op::TypeRuntimeArray); instruction.set_result(id); instruction.add_operand(element_type_id); instruction } pub(super) fn type_struct(id: Word, member_ids: &[Word]) -> Self { let mut instruction = Self::new(Op::TypeStruct); instruction.set_result(id); for member_id in member_ids { instruction.add_operand(*member_id) } instruction } pub(super) fn type_pointer( id: Word, storage_class: spirv::StorageClass, type_id: Word, ) -> Self { let mut instruction = Self::new(Op::TypePointer); instruction.set_result(id); instruction.add_operand(storage_class as u32); instruction.add_operand(type_id); instruction } pub(super) fn type_function(id: Word, return_type_id: Word, parameter_ids: &[Word]) -> Self { let mut instruction = Self::new(Op::TypeFunction); instruction.set_result(id); instruction.add_operand(return_type_id); for parameter_id in parameter_ids { instruction.add_operand(*parameter_id); } instruction } // // Constant-Creation Instructions // pub(super) fn constant_null(result_type_id: Word, id: Word) -> Self { let mut instruction = Self::new(Op::ConstantNull); instruction.set_type(result_type_id); instruction.set_result(id); instruction } pub(super) fn constant_true(result_type_id: Word, id: Word) -> Self { let mut instruction = Self::new(Op::ConstantTrue); instruction.set_type(result_type_id); instruction.set_result(id); instruction } pub(super) fn constant_false(result_type_id: Word, id: Word) -> Self { let mut instruction = Self::new(Op::ConstantFalse); instruction.set_type(result_type_id); instruction.set_result(id); instruction } pub(super) fn constant(result_type_id: Word, id: Word, values: &[Word]) -> Self { let mut instruction = Self::new(Op::Constant); instruction.set_type(result_type_id); instruction.set_result(id); for value in values { instruction.add_operand(*value); } instruction } pub(super) fn constant_composite( result_type_id: Word, id: Word, constituent_ids: &[Word], ) -> Self { let mut instruction = Self::new(Op::ConstantComposite); instruction.set_type(result_type_id); instruction.set_result(id); for constituent_id in constituent_ids { instruction.add_operand(*constituent_id); } instruction } // // Memory Instructions // pub(super) fn variable( result_type_id: Word, id: Word, storage_class: spirv::StorageClass, initializer_id: Option, ) -> Self { let mut instruction = Self::new(Op::Variable); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(storage_class as u32); if let Some(initializer_id) = initializer_id { instruction.add_operand(initializer_id); } instruction } pub(super) fn load( result_type_id: Word, id: Word, pointer_id: Word, memory_access: Option, ) -> Self { let mut instruction = Self::new(Op::Load); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(pointer_id); if let Some(memory_access) = memory_access { instruction.add_operand(memory_access.bits()); } instruction } pub(super) fn atomic_load( result_type_id: Word, id: Word, pointer_id: Word, scope_id: Word, semantics_id: Word, ) -> Self { let mut instruction = Self::new(Op::AtomicLoad); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(pointer_id); instruction.add_operand(scope_id); instruction.add_operand(semantics_id); instruction } pub(super) fn store( pointer_id: Word, value_id: Word, memory_access: Option, ) -> Self { let mut instruction = Self::new(Op::Store); instruction.add_operand(pointer_id); instruction.add_operand(value_id); if let Some(memory_access) = memory_access { instruction.add_operand(memory_access.bits()); } instruction } pub(super) fn atomic_store( pointer_id: Word, scope_id: Word, semantics_id: Word, value_id: Word, ) -> Self { let mut instruction = Self::new(Op::AtomicStore); instruction.add_operand(pointer_id); instruction.add_operand(scope_id); instruction.add_operand(semantics_id); instruction.add_operand(value_id); instruction } pub(super) fn access_chain( result_type_id: Word, id: Word, base_id: Word, index_ids: &[Word], ) -> Self { let mut instruction = Self::new(Op::AccessChain); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(base_id); for index_id in index_ids { instruction.add_operand(*index_id); } instruction } pub(super) fn array_length( result_type_id: Word, id: Word, structure_id: Word, array_member: Word, ) -> Self { let mut instruction = Self::new(Op::ArrayLength); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(structure_id); instruction.add_operand(array_member); instruction } // // Function Instructions // pub(super) fn function( return_type_id: Word, id: Word, function_control: spirv::FunctionControl, function_type_id: Word, ) -> Self { let mut instruction = Self::new(Op::Function); instruction.set_type(return_type_id); instruction.set_result(id); instruction.add_operand(function_control.bits()); instruction.add_operand(function_type_id); instruction } pub(super) fn function_parameter(result_type_id: Word, id: Word) -> Self { let mut instruction = Self::new(Op::FunctionParameter); instruction.set_type(result_type_id); instruction.set_result(id); instruction } pub(super) const fn function_end() -> Self { Self::new(Op::FunctionEnd) } pub(super) fn function_call( result_type_id: Word, id: Word, function_id: Word, argument_ids: &[Word], ) -> Self { let mut instruction = Self::new(Op::FunctionCall); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(function_id); for argument_id in argument_ids { instruction.add_operand(*argument_id); } instruction } // // Image Instructions // pub(super) fn sampled_image( result_type_id: Word, id: Word, image: Word, sampler: Word, ) -> Self { let mut instruction = Self::new(Op::SampledImage); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(image); instruction.add_operand(sampler); instruction } pub(super) fn image_sample( result_type_id: Word, id: Word, lod: SampleLod, sampled_image: Word, coordinates: Word, depth_ref: Option, ) -> Self { let op = match (lod, depth_ref) { (SampleLod::Explicit, None) => Op::ImageSampleExplicitLod, (SampleLod::Implicit, None) => Op::ImageSampleImplicitLod, (SampleLod::Explicit, Some(_)) => Op::ImageSampleDrefExplicitLod, (SampleLod::Implicit, Some(_)) => Op::ImageSampleDrefImplicitLod, }; let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(sampled_image); instruction.add_operand(coordinates); if let Some(dref) = depth_ref { instruction.add_operand(dref); } instruction } pub(super) fn image_gather( result_type_id: Word, id: Word, sampled_image: Word, coordinates: Word, component_id: Word, depth_ref: Option, ) -> Self { let op = match depth_ref { None => Op::ImageGather, Some(_) => Op::ImageDrefGather, }; let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(sampled_image); instruction.add_operand(coordinates); if let Some(dref) = depth_ref { instruction.add_operand(dref); } else { instruction.add_operand(component_id); } instruction } pub(super) fn image_fetch_or_read( op: Op, result_type_id: Word, id: Word, image: Word, coordinates: Word, ) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(image); instruction.add_operand(coordinates); instruction } pub(super) fn image_write(image: Word, coordinates: Word, value: Word) -> Self { let mut instruction = Self::new(Op::ImageWrite); instruction.add_operand(image); instruction.add_operand(coordinates); instruction.add_operand(value); instruction } pub(super) fn image_query(op: Op, result_type_id: Word, id: Word, image: Word) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(image); instruction } // // Conversion Instructions // pub(super) fn unary(op: Op, result_type_id: Word, id: Word, value: Word) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(value); instruction } // // Composite Instructions // pub(super) fn composite_construct( result_type_id: Word, id: Word, constituent_ids: &[Word], ) -> Self { let mut instruction = Self::new(Op::CompositeConstruct); instruction.set_type(result_type_id); instruction.set_result(id); for constituent_id in constituent_ids { instruction.add_operand(*constituent_id); } instruction } pub(super) fn composite_extract( result_type_id: Word, id: Word, composite_id: Word, indices: &[Word], ) -> Self { let mut instruction = Self::new(Op::CompositeExtract); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(composite_id); for index in indices { instruction.add_operand(*index); } instruction } pub(super) fn vector_extract_dynamic( result_type_id: Word, id: Word, vector_id: Word, index_id: Word, ) -> Self { let mut instruction = Self::new(Op::VectorExtractDynamic); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(vector_id); instruction.add_operand(index_id); instruction } pub(super) fn vector_shuffle( result_type_id: Word, id: Word, v1_id: Word, v2_id: Word, components: &[Word], ) -> Self { let mut instruction = Self::new(Op::VectorShuffle); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(v1_id); instruction.add_operand(v2_id); for &component in components { instruction.add_operand(component); } instruction } // // Arithmetic Instructions // pub(super) fn binary( op: Op, result_type_id: Word, id: Word, operand_1: Word, operand_2: Word, ) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(operand_1); instruction.add_operand(operand_2); instruction } pub(super) fn ternary( op: Op, result_type_id: Word, id: Word, operand_1: Word, operand_2: Word, operand_3: Word, ) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(operand_1); instruction.add_operand(operand_2); instruction.add_operand(operand_3); instruction } pub(super) fn quaternary( op: Op, result_type_id: Word, id: Word, operand_1: Word, operand_2: Word, operand_3: Word, operand_4: Word, ) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(operand_1); instruction.add_operand(operand_2); instruction.add_operand(operand_3); instruction.add_operand(operand_4); instruction } pub(super) fn relational(op: Op, result_type_id: Word, id: Word, expr_id: Word) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(expr_id); instruction } pub(super) fn atomic_binary( op: Op, result_type_id: Word, id: Word, pointer: Word, scope_id: Word, semantics_id: Word, value: Word, ) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(pointer); instruction.add_operand(scope_id); instruction.add_operand(semantics_id); instruction.add_operand(value); instruction } pub(super) fn atomic_compare_exchange( result_type_id: Word, id: Word, pointer: Word, scope_id: Word, equal: Word, unequal: Word, value: Word, comparator: Word, ) -> Self { let mut instruction = Self::new(Op::AtomicCompareExchange); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(pointer); instruction.add_operand(scope_id); instruction.add_operand(equal); instruction.add_operand(unequal); instruction.add_operand(value); instruction.add_operand(comparator); instruction } // // Bit Instructions // // // Relational and Logical Instructions // // // Derivative Instructions // pub(super) fn derivative(op: Op, result_type_id: Word, id: Word, expr_id: Word) -> Self { let mut instruction = Self::new(op); instruction.set_type(result_type_id); instruction.set_result(id); instruction.add_operand(expr_id); instruction } // // Control-Flow Instructions // pub(super) fn phi( result_type_id: Word, result_id: Word, var_parent_pairs: &[(Word, Word)], ) -> Self { let mut instruction = Self::new(Op::Phi); instruction.add_operand(result_type_id); instruction.add_operand(result_id); for &(variable, parent) in var_parent_pairs { instruction.add_operand(variable); instruction.add_operand(parent); } instruction } pub(super) fn selection_merge( merge_id: Word, selection_control: spirv::SelectionControl, ) -> Self { let mut instruction = Self::new(Op::SelectionMerge); instruction.add_operand(merge_id); instruction.add_operand(selection_control.bits()); instruction } pub(super) fn loop_merge( merge_id: Word, continuing_id: Word, selection_control: spirv::SelectionControl, ) -> Self { let mut instruction = Self::new(Op::LoopMerge); instruction.add_operand(merge_id); instruction.add_operand(continuing_id); instruction.add_operand(selection_control.bits()); instruction } pub(super) fn label(id: Word) -> Self { let mut instruction = Self::new(Op::Label); instruction.set_result(id); instruction } pub(super) fn branch(id: Word) -> Self { let mut instruction = Self::new(Op::Branch); instruction.add_operand(id); instruction } // TODO Branch Weights not implemented. pub(super) fn branch_conditional( condition_id: Word, true_label: Word, false_label: Word, ) -> Self { let mut instruction = Self::new(Op::BranchConditional); instruction.add_operand(condition_id); instruction.add_operand(true_label); instruction.add_operand(false_label); instruction } pub(super) fn switch(selector_id: Word, default_id: Word, cases: &[Case]) -> Self { let mut instruction = Self::new(Op::Switch); instruction.add_operand(selector_id); instruction.add_operand(default_id); for case in cases { instruction.add_operand(case.value); instruction.add_operand(case.label_id); } instruction } pub(super) fn select( result_type_id: Word, id: Word, condition_id: Word, accept_id: Word, reject_id: Word, ) -> Self { let mut instruction = Self::new(Op::Select); instruction.add_operand(result_type_id); instruction.add_operand(id); instruction.add_operand(condition_id); instruction.add_operand(accept_id); instruction.add_operand(reject_id); instruction } pub(super) const fn kill() -> Self { Self::new(Op::Kill) } pub(super) const fn return_void() -> Self { Self::new(Op::Return) } pub(super) fn return_value(value_id: Word) -> Self { let mut instruction = Self::new(Op::ReturnValue); instruction.add_operand(value_id); instruction } // // Atomic Instructions // // // Primitive Instructions // // Barriers pub(super) fn control_barrier( exec_scope_id: Word, mem_scope_id: Word, semantics_id: Word, ) -> Self { let mut instruction = Self::new(Op::ControlBarrier); instruction.add_operand(exec_scope_id); instruction.add_operand(mem_scope_id); instruction.add_operand(semantics_id); instruction } } impl From for spirv::ImageFormat { fn from(format: crate::StorageFormat) -> Self { use crate::StorageFormat as Sf; match format { Sf::R8Unorm => Self::R8, Sf::R8Snorm => Self::R8Snorm, Sf::R8Uint => Self::R8ui, Sf::R8Sint => Self::R8i, Sf::R16Uint => Self::R16ui, Sf::R16Sint => Self::R16i, Sf::R16Float => Self::R16f, Sf::Rg8Unorm => Self::Rg8, Sf::Rg8Snorm => Self::Rg8Snorm, Sf::Rg8Uint => Self::Rg8ui, Sf::Rg8Sint => Self::Rg8i, Sf::R32Uint => Self::R32ui, Sf::R32Sint => Self::R32i, Sf::R32Float => Self::R32f, Sf::Rg16Uint => Self::Rg16ui, Sf::Rg16Sint => Self::Rg16i, Sf::Rg16Float => Self::Rg16f, Sf::Rgba8Unorm => Self::Rgba8, Sf::Rgba8Snorm => Self::Rgba8Snorm, Sf::Rgba8Uint => Self::Rgba8ui, Sf::Rgba8Sint => Self::Rgba8i, Sf::Rgb10a2Unorm => Self::Rgb10a2ui, Sf::Rg11b10Float => Self::R11fG11fB10f, Sf::Rg32Uint => Self::Rg32ui, Sf::Rg32Sint => Self::Rg32i, Sf::Rg32Float => Self::Rg32f, Sf::Rgba16Uint => Self::Rgba16ui, Sf::Rgba16Sint => Self::Rgba16i, Sf::Rgba16Float => Self::Rgba16f, Sf::Rgba32Uint => Self::Rgba32ui, Sf::Rgba32Sint => Self::Rgba32i, Sf::Rgba32Float => Self::Rgba32f, } } } impl From for spirv::Dim { fn from(dim: crate::ImageDimension) -> Self { use crate::ImageDimension as Id; match dim { Id::D1 => Self::Dim1D, Id::D2 => Self::Dim2D, Id::D3 => Self::Dim3D, Id::Cube => Self::DimCube, } } } ================================================ FILE: lib/naga/src/back/spv/layout.rs ================================================ use super::{Instruction, LogicalLayout, PhysicalLayout}; use spirv::{Op, Word, MAGIC_NUMBER}; use std::iter; // https://github.com/KhronosGroup/SPIRV-Headers/pull/195 const GENERATOR: Word = 28; impl PhysicalLayout { pub(super) const fn new(version: Word) -> Self { PhysicalLayout { magic_number: MAGIC_NUMBER, version, generator: GENERATOR, bound: 0, instruction_schema: 0x0u32, } } pub(super) fn in_words(&self, sink: &mut impl Extend) { sink.extend(iter::once(self.magic_number)); sink.extend(iter::once(self.version)); sink.extend(iter::once(self.generator)); sink.extend(iter::once(self.bound)); sink.extend(iter::once(self.instruction_schema)); } } impl super::recyclable::Recyclable for PhysicalLayout { fn recycle(self) -> Self { PhysicalLayout { magic_number: self.magic_number, version: self.version, generator: self.generator, instruction_schema: self.instruction_schema, bound: 0, } } } impl LogicalLayout { pub(super) fn in_words(&self, sink: &mut impl Extend) { sink.extend(self.capabilities.iter().cloned()); sink.extend(self.extensions.iter().cloned()); sink.extend(self.ext_inst_imports.iter().cloned()); sink.extend(self.memory_model.iter().cloned()); sink.extend(self.entry_points.iter().cloned()); sink.extend(self.execution_modes.iter().cloned()); sink.extend(self.debugs.iter().cloned()); sink.extend(self.annotations.iter().cloned()); sink.extend(self.declarations.iter().cloned()); sink.extend(self.function_declarations.iter().cloned()); sink.extend(self.function_definitions.iter().cloned()); } } impl super::recyclable::Recyclable for LogicalLayout { fn recycle(self) -> Self { Self { capabilities: self.capabilities.recycle(), extensions: self.extensions.recycle(), ext_inst_imports: self.ext_inst_imports.recycle(), memory_model: self.memory_model.recycle(), entry_points: self.entry_points.recycle(), execution_modes: self.execution_modes.recycle(), debugs: self.debugs.recycle(), annotations: self.annotations.recycle(), declarations: self.declarations.recycle(), function_declarations: self.function_declarations.recycle(), function_definitions: self.function_definitions.recycle(), } } } impl Instruction { pub(super) const fn new(op: Op) -> Self { Instruction { op, wc: 1, // Always start at 1 for the first word (OP + WC), type_id: None, result_id: None, operands: vec![], } } #[allow(clippy::panic)] pub(super) fn set_type(&mut self, id: Word) { assert!(self.type_id.is_none(), "Type can only be set once"); self.type_id = Some(id); self.wc += 1; } #[allow(clippy::panic)] pub(super) fn set_result(&mut self, id: Word) { assert!(self.result_id.is_none(), "Result can only be set once"); self.result_id = Some(id); self.wc += 1; } pub(super) fn add_operand(&mut self, operand: Word) { self.operands.push(operand); self.wc += 1; } pub(super) fn add_operands(&mut self, operands: Vec) { for operand in operands.into_iter() { self.add_operand(operand) } } pub(super) fn to_words(&self, sink: &mut impl Extend) { sink.extend(Some(self.wc << 16 | self.op as u32)); sink.extend(self.type_id); sink.extend(self.result_id); sink.extend(self.operands.iter().cloned()); } } impl Instruction { #[cfg(test)] fn validate(&self, words: &[Word]) { let mut inst_index = 0; let (wc, op) = ((words[inst_index] >> 16) as u16, words[inst_index] as u16); inst_index += 1; assert_eq!(wc, words.len() as u16); assert_eq!(op, self.op as u16); if self.type_id.is_some() { assert_eq!(words[inst_index], self.type_id.unwrap()); inst_index += 1; } if self.result_id.is_some() { assert_eq!(words[inst_index], self.result_id.unwrap()); inst_index += 1; } for (op_index, i) in (inst_index..wc as usize).enumerate() { assert_eq!(words[i], self.operands[op_index]); } } } #[test] fn test_physical_layout_in_words() { let bound = 5; let version = 0x10203; let mut output = vec![]; let mut layout = PhysicalLayout::new(version); layout.bound = bound; layout.in_words(&mut output); assert_eq!(&output, &[MAGIC_NUMBER, version, GENERATOR, bound, 0,]); } #[test] fn test_logical_layout_in_words() { let mut output = vec![]; let mut layout = LogicalLayout::default(); let layout_vectors = 11; let mut instructions = Vec::with_capacity(layout_vectors); let vector_names = &[ "Capabilities", "Extensions", "External Instruction Imports", "Memory Model", "Entry Points", "Execution Modes", "Debugs", "Annotations", "Declarations", "Function Declarations", "Function Definitions", ]; for (i, _) in vector_names.iter().enumerate().take(layout_vectors) { let mut dummy_instruction = Instruction::new(Op::Constant); dummy_instruction.set_type((i + 1) as u32); dummy_instruction.set_result((i + 2) as u32); dummy_instruction.add_operand((i + 3) as u32); dummy_instruction.add_operands(super::helpers::string_to_words( format!("This is the vector: {}", vector_names[i]).as_str(), )); instructions.push(dummy_instruction); } instructions[0].to_words(&mut layout.capabilities); instructions[1].to_words(&mut layout.extensions); instructions[2].to_words(&mut layout.ext_inst_imports); instructions[3].to_words(&mut layout.memory_model); instructions[4].to_words(&mut layout.entry_points); instructions[5].to_words(&mut layout.execution_modes); instructions[6].to_words(&mut layout.debugs); instructions[7].to_words(&mut layout.annotations); instructions[8].to_words(&mut layout.declarations); instructions[9].to_words(&mut layout.function_declarations); instructions[10].to_words(&mut layout.function_definitions); layout.in_words(&mut output); let mut index: usize = 0; for instruction in instructions { let wc = instruction.wc as usize; instruction.validate(&output[index..index + wc]); index += wc; } } ================================================ FILE: lib/naga/src/back/spv/mod.rs ================================================ /*! Backend for [SPIR-V][spv] (Standard Portable Intermediate Representation). [spv]: https://www.khronos.org/registry/SPIR-V/ */ mod block; mod helpers; mod image; mod index; mod instructions; mod layout; mod recyclable; mod selection; mod writer; pub use spirv::Capability; use crate::arena::Handle; use crate::proc::{BoundsCheckPolicies, TypeResolution}; use spirv::Word; use std::ops; use thiserror::Error; #[derive(Clone)] struct PhysicalLayout { magic_number: Word, version: Word, generator: Word, bound: Word, instruction_schema: Word, } #[derive(Default)] struct LogicalLayout { capabilities: Vec, extensions: Vec, ext_inst_imports: Vec, memory_model: Vec, entry_points: Vec, execution_modes: Vec, debugs: Vec, annotations: Vec, declarations: Vec, function_declarations: Vec, function_definitions: Vec, } struct Instruction { op: spirv::Op, wc: u32, type_id: Option, result_id: Option, operands: Vec, } const BITS_PER_BYTE: crate::Bytes = 8; #[derive(Clone, Debug, Error)] pub enum Error { #[error("The requested entry point couldn't be found")] EntryPointNotFound, #[error("target SPIRV-{0}.{1} is not supported")] UnsupportedVersion(u8, u8), #[error("using {0} requires at least one of the capabilities {1:?}, but none are available")] MissingCapabilities(&'static str, Vec), #[error("unimplemented {0}")] FeatureNotImplemented(&'static str), #[error("module is not validated properly: {0}")] Validation(&'static str), } #[derive(Default)] struct IdGenerator(Word); impl IdGenerator { fn next(&mut self) -> Word { self.0 += 1; self.0 } } /// A SPIR-V block to which we are still adding instructions. /// /// A `Block` represents a SPIR-V block that does not yet have a termination /// instruction like `OpBranch` or `OpReturn`. /// /// The `OpLabel` that starts the block is implicit. It will be emitted based on /// `label_id` when we write the block to a `LogicalLayout`. /// /// To terminate a `Block`, pass the block and the termination instruction to /// `Function::consume`. This takes ownership of the `Block` and transforms it /// into a `TerminatedBlock`. struct Block { label_id: Word, body: Vec, } /// A SPIR-V block that ends with a termination instruction. struct TerminatedBlock { label_id: Word, body: Vec, } impl Block { const fn new(label_id: Word) -> Self { Block { label_id, body: Vec::new(), } } } struct LocalVariable { id: Word, instruction: Instruction, } struct ResultMember { id: Word, type_id: Word, built_in: Option, } struct EntryPointContext { argument_ids: Vec, results: Vec, } #[derive(Default)] struct Function { signature: Option, parameters: Vec, variables: crate::FastHashMap, LocalVariable>, blocks: Vec, entry_point_context: Option, } impl Function { fn consume(&mut self, mut block: Block, termination: Instruction) { block.body.push(termination); self.blocks.push(TerminatedBlock { label_id: block.label_id, body: block.body, }) } fn parameter_id(&self, index: u32) -> Word { match self.entry_point_context { Some(ref context) => context.argument_ids[index as usize], None => self.parameters[index as usize] .instruction .result_id .unwrap(), } } } /// Characteristics of a SPIR-V `OpTypeImage` type. /// /// SPIR-V requires non-composite types to be unique, including images. Since we /// use `LocalType` for this deduplication, it's essential that `LocalImageType` /// be equal whenever the corresponding `OpTypeImage`s would be. To reduce the /// likelihood of mistakes, we use fields that correspond exactly to the /// operands of an `OpTypeImage` instruction, using the actual SPIR-V types /// where practical. #[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)] struct LocalImageType { sampled_type: crate::ScalarKind, dim: spirv::Dim, flags: ImageTypeFlags, image_format: spirv::ImageFormat, } bitflags::bitflags! { /// Flags corresponding to the boolean(-ish) parameters to OpTypeImage. pub struct ImageTypeFlags: u8 { const DEPTH = 0x1; const ARRAYED = 0x2; const MULTISAMPLED = 0x4; const SAMPLED = 0x8; } } impl LocalImageType { /// Construct a `LocalImageType` from the fields of a `TypeInner::Image`. fn from_inner(dim: crate::ImageDimension, arrayed: bool, class: crate::ImageClass) -> Self { let make_flags = |multi: bool, other: ImageTypeFlags| -> ImageTypeFlags { let mut flags = other; flags.set(ImageTypeFlags::ARRAYED, arrayed); flags.set(ImageTypeFlags::MULTISAMPLED, multi); flags }; let dim = spirv::Dim::from(dim); match class { crate::ImageClass::Sampled { kind, multi } => LocalImageType { sampled_type: kind, dim, flags: make_flags(multi, ImageTypeFlags::SAMPLED), image_format: spirv::ImageFormat::Unknown, }, crate::ImageClass::Depth { multi } => LocalImageType { sampled_type: crate::ScalarKind::Float, dim, flags: make_flags(multi, ImageTypeFlags::DEPTH | ImageTypeFlags::SAMPLED), image_format: spirv::ImageFormat::Unknown, }, crate::ImageClass::Storage { format, access: _ } => LocalImageType { sampled_type: crate::ScalarKind::from(format), dim, flags: make_flags(false, ImageTypeFlags::empty()), image_format: format.into(), }, } } } /// A SPIR-V type constructed during code generation. /// /// This is the variant of [`LookupType`] used to represent types that might not /// be available in the arena. Variants are present here for one of two reasons: /// /// - They represent types synthesized during code generation, as explained /// in the documentation for [`LookupType`]. /// /// - They represent types for which SPIR-V forbids duplicate `OpType...` /// instructions, requiring deduplication. /// /// This is not a complete copy of [`TypeInner`]: for example, SPIR-V generation /// never synthesizes new struct types, so `LocalType` has nothing for that. /// /// Each `LocalType` variant should be handled identically to its analogous /// `TypeInner` variant. You can use the [`make_local`] function to help with /// this, by converting everything possible to a `LocalType` before inspecting /// it. /// /// ## `Localtype` equality and SPIR-V `OpType` uniqueness /// /// The definition of `Eq` on `LocalType` is carefully chosen to help us follow /// certain SPIR-V rules. SPIR-V §2.8 requires some classes of `OpType...` /// instructions to be unique; for example, you can't have two `OpTypeInt 32 1` /// instructions in the same module. All 32-bit signed integers must use the /// same type id. /// /// All SPIR-V types that must be unique can be represented as a `LocalType`, /// and two `LocalType`s are always `Eq` if SPIR-V would require them to use the /// same `OpType...` instruction. This lets us avoid duplicates by recording the /// ids of the type instructions we've already generated in a hash table, /// [`Writer::lookup_type`], keyed by `LocalType`. /// /// As another example, [`LocalImageType`], stored in the `LocalType::Image` /// variant, is designed to help us deduplicate `OpTypeImage` instructions. See /// its documentation for details. /// /// `LocalType` also includes variants like `Pointer` that do not need to be /// unique - but it is harmless to avoid the duplication. /// /// As it always must, the `Hash` implementation respects the `Eq` relation. /// /// [`TypeInner`]: crate::TypeInner #[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)] enum LocalType { /// A scalar, vector, or pointer to one of those. Value { /// If `None`, this represents a scalar type. If `Some`, this represents /// a vector type of the given size. vector_size: Option, kind: crate::ScalarKind, width: crate::Bytes, pointer_space: Option, }, /// A matrix of floating-point values. Matrix { columns: crate::VectorSize, rows: crate::VectorSize, width: crate::Bytes, }, Pointer { base: Handle, class: spirv::StorageClass, }, Image(LocalImageType), SampledImage { image_type_id: Word, }, Sampler, PointerToBindingArray { base: Handle, size: u64, }, BindingArray { base: Handle, size: u64, }, } /// A type encountered during SPIR-V generation. /// /// In the process of writing SPIR-V, we need to synthesize various types for /// intermediate results and such: pointer types, vector/matrix component types, /// or even booleans, which usually appear in SPIR-V code even when they're not /// used by the module source. /// /// However, we can't use `crate::Type` or `crate::TypeInner` for these, as the /// type arena may not contain what we need (it only contains types used /// directly by other parts of the IR), and the IR module is immutable, so we /// can't add anything to it. /// /// So for local use in the SPIR-V writer, we use this type, which holds either /// a handle into the arena, or a [`LocalType`] containing something synthesized /// locally. /// /// This is very similar to the [`proc::TypeResolution`] enum, with `LocalType` /// playing the role of `TypeInner`. However, `LocalType` also has other /// properties needed for SPIR-V generation; see the description of /// [`LocalType`] for details. /// /// [`proc::TypeResolution`]: crate::proc::TypeResolution #[derive(Debug, PartialEq, Hash, Eq, Copy, Clone)] enum LookupType { Handle(Handle), Local(LocalType), } impl From for LookupType { fn from(local: LocalType) -> Self { Self::Local(local) } } #[derive(Debug, PartialEq, Clone, Hash, Eq)] struct LookupFunctionType { parameter_type_ids: Vec, return_type_id: Word, } fn make_local(inner: &crate::TypeInner) -> Option { Some(match *inner { crate::TypeInner::Scalar { kind, width } | crate::TypeInner::Atomic { kind, width } => { LocalType::Value { vector_size: None, kind, width, pointer_space: None, } } crate::TypeInner::Vector { size, kind, width } => LocalType::Value { vector_size: Some(size), kind, width, pointer_space: None, }, crate::TypeInner::Matrix { columns, rows, width, } => LocalType::Matrix { columns, rows, width, }, crate::TypeInner::Pointer { base, space } => LocalType::Pointer { base, class: helpers::map_storage_class(space), }, crate::TypeInner::ValuePointer { size, kind, width, space, } => LocalType::Value { vector_size: size, kind, width, pointer_space: Some(helpers::map_storage_class(space)), }, crate::TypeInner::Image { dim, arrayed, class, } => LocalType::Image(LocalImageType::from_inner(dim, arrayed, class)), crate::TypeInner::Sampler { comparison: _ } => LocalType::Sampler, _ => return None, }) } #[derive(Debug)] enum Dimension { Scalar, Vector, Matrix, } /// A map from evaluated [`Expression`](crate::Expression)s to their SPIR-V ids. /// /// When we emit code to evaluate a given `Expression`, we record the /// SPIR-V id of its value here, under its `Handle` index. /// /// A `CachedExpressions` value can be indexed by a `Handle` value. /// /// [emit]: index.html#expression-evaluation-time-and-scope #[derive(Default)] struct CachedExpressions { ids: Vec, } impl CachedExpressions { fn reset(&mut self, length: usize) { self.ids.clear(); self.ids.resize(length, 0); } } impl ops::Index> for CachedExpressions { type Output = Word; fn index(&self, h: Handle) -> &Word { let id = &self.ids[h.index()]; if *id == 0 { unreachable!("Expression {:?} is not cached!", h); } id } } impl ops::IndexMut> for CachedExpressions { fn index_mut(&mut self, h: Handle) -> &mut Word { let id = &mut self.ids[h.index()]; if *id != 0 { unreachable!("Expression {:?} is already cached!", h); } id } } impl recyclable::Recyclable for CachedExpressions { fn recycle(self) -> Self { CachedExpressions { ids: self.ids.recycle(), } } } #[derive(Clone)] struct GlobalVariable { /// ID of the OpVariable that declares the global. /// /// If you need the variable's value, use [`access_id`] instead of this /// field. If we wrapped the Naga IR `GlobalVariable`'s type in a struct to /// comply with Vulkan's requirements, then this points to the `OpVariable` /// with the synthesized struct type, whereas `access_id` points to the /// field of said struct that holds the variable's actual value. /// /// This is used to compute the `access_id` pointer in function prologues, /// and used for `ArrayLength` expressions, which do need the struct. /// /// [`access_id`]: GlobalVariable::access_id var_id: Word, /// For `AddressSpace::Handle` variables, this ID is recorded in the function /// prelude block (and reset before every function) as `OpLoad` of the variable. /// It is then used for all the global ops, such as `OpImageSample`. handle_id: Word, /// Actual ID used to access this variable. /// For wrapped buffer variables, this ID is `OpAccessChain` into the /// wrapper. Otherwise, the same as `var_id`. /// /// Vulkan requires that globals in the `StorageBuffer` and `Uniform` storage /// classes must be structs with the `Block` decoration, but WGSL and Naga IR /// make no such requirement. So for such variables, we generate a wrapper struct /// type with a single element of the type given by Naga, generate an /// `OpAccessChain` for that member in the function prelude, and use that pointer /// to refer to the global in the function body. This is the id of that access, /// updated for each function in `write_function`. access_id: Word, } impl GlobalVariable { const fn dummy() -> Self { Self { var_id: 0, handle_id: 0, access_id: 0, } } const fn new(id: Word) -> Self { Self { var_id: id, handle_id: 0, access_id: 0, } } /// Prepare `self` for use within a single function. fn reset_for_function(&mut self) { self.handle_id = 0; self.access_id = 0; } } struct FunctionArgument { /// Actual instruction of the argument. instruction: Instruction, handle_id: Word, } /// General information needed to emit SPIR-V for Naga statements. struct BlockContext<'w> { /// The writer handling the module to which this code belongs. writer: &'w mut Writer, /// The [`Module`](crate::Module) for which we're generating code. ir_module: &'w crate::Module, /// The [`Function`](crate::Function) for which we're generating code. ir_function: &'w crate::Function, /// Information module validation produced about /// [`ir_function`](BlockContext::ir_function). fun_info: &'w crate::valid::FunctionInfo, /// The [`spv::Function`](Function) to which we are contributing SPIR-V instructions. function: &'w mut Function, /// SPIR-V ids for expressions we've evaluated. cached: CachedExpressions, /// The `Writer`'s temporary vector, for convenience. temp_list: Vec, } impl BlockContext<'_> { fn gen_id(&mut self) -> Word { self.writer.id_gen.next() } fn get_type_id(&mut self, lookup_type: LookupType) -> Word { self.writer.get_type_id(lookup_type) } fn get_expression_type_id(&mut self, tr: &TypeResolution) -> Word { self.writer.get_expression_type_id(tr) } fn get_index_constant(&mut self, index: Word) -> Word { self.writer .get_constant_scalar(crate::ScalarValue::Uint(index as _), 4) } fn get_scope_constant(&mut self, scope: Word) -> Word { self.writer .get_constant_scalar(crate::ScalarValue::Sint(scope as _), 4) } } #[derive(Clone, Copy, Default)] struct LoopContext { continuing_id: Option, break_id: Option, } pub struct Writer { physical_layout: PhysicalLayout, logical_layout: LogicalLayout, id_gen: IdGenerator, /// The set of capabilities modules are permitted to use. /// /// This is initialized from `Options::capabilities`. capabilities_available: Option>, /// The set of capabilities used by this module. /// /// If `capabilities_available` is `Some`, then this is always a subset of /// that. capabilities_used: crate::FastHashSet, /// The set of spirv extensions used. extensions_used: crate::FastHashSet<&'static str>, debugs: Vec, annotations: Vec, flags: WriterFlags, bounds_check_policies: BoundsCheckPolicies, void_type: Word, //TODO: convert most of these into vectors, addressable by handle indices lookup_type: crate::FastHashMap, lookup_function: crate::FastHashMap, Word>, lookup_function_type: crate::FastHashMap, constant_ids: Vec, cached_constants: crate::FastHashMap<(crate::ScalarValue, crate::Bytes), Word>, global_variables: Vec, binding_map: BindingMap, // Cached expressions are only meaningful within a BlockContext, but we // retain the table here between functions to save heap allocations. saved_cached: CachedExpressions, gl450_ext_inst_id: Word, // Just a temporary list of SPIR-V ids temp_list: Vec, } bitflags::bitflags! { pub struct WriterFlags: u32 { /// Include debug labels for everything. const DEBUG = 0x1; /// Flip Y coordinate of `BuiltIn::Position` output. const ADJUST_COORDINATE_SPACE = 0x2; /// Emit `OpName` for input/output locations. /// Contrary to spec, some drivers treat it as semantic, not allowing /// any conflicts. const LABEL_VARYINGS = 0x4; /// Emit `PointSize` output builtin to vertex shaders, which is /// required for drawing with `PointList` topology. const FORCE_POINT_SIZE = 0x8; /// Clamp `BuiltIn::FragDepth` output between 0 and 1. const CLAMP_FRAG_DEPTH = 0x10; } } #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct BindingInfo { /// If the binding is an unsized binding array, this overrides the size. pub binding_array_size: Option, } // Using `BTreeMap` instead of `HashMap` so that we can hash itself. pub type BindingMap = std::collections::BTreeMap; #[derive(Debug, Clone)] pub struct Options { /// (Major, Minor) target version of the SPIR-V. pub lang_version: (u8, u8), /// Configuration flags for the writer. pub flags: WriterFlags, /// Map of resources to information about the binding. pub binding_map: BindingMap, /// If given, the set of capabilities modules are allowed to use. Code that /// requires capabilities beyond these is rejected with an error. /// /// If this is `None`, all capabilities are permitted. pub capabilities: Option>, /// How should generate code handle array, vector, matrix, or image texel /// indices that are out of range? pub bounds_check_policies: BoundsCheckPolicies, } impl Default for Options { fn default() -> Self { let mut flags = WriterFlags::ADJUST_COORDINATE_SPACE | WriterFlags::LABEL_VARYINGS | WriterFlags::CLAMP_FRAG_DEPTH; if cfg!(debug_assertions) { flags |= WriterFlags::DEBUG; } Options { lang_version: (1, 0), flags, binding_map: BindingMap::default(), capabilities: None, bounds_check_policies: crate::proc::BoundsCheckPolicies::default(), } } } // A subset of options meant to be changed per pipeline. #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct PipelineOptions { /// The stage of the entry point. pub shader_stage: crate::ShaderStage, /// The name of the entry point. /// /// If no entry point that matches is found while creating a [`Writer`], a error will be thrown. pub entry_point: String, } pub fn write_vec( module: &crate::Module, info: &crate::valid::ModuleInfo, options: &Options, pipeline_options: Option<&PipelineOptions>, ) -> Result, Error> { let mut words = Vec::new(); let mut w = Writer::new(options)?; w.write(module, info, pipeline_options, &mut words)?; Ok(words) } ================================================ FILE: lib/naga/src/back/spv/recyclable.rs ================================================ /*! Reusing collections' previous allocations. */ /// A value that can be reset to its initial state, retaining its current allocations. /// /// Naga attempts to lower the cost of SPIR-V generation by allowing clients to /// reuse the same `Writer` for multiple Module translations. Reusing a `Writer` /// means that the `Vec`s, `HashMap`s, and other heap-allocated structures the /// `Writer` uses internally begin the translation with heap-allocated buffers /// ready to use. /// /// But this approach introduces the risk of `Writer` state leaking from one /// module to the next. When a developer adds fields to `Writer` or its internal /// types, they must remember to reset their contents between modules. /// /// One trick to ensure that every field has been accounted for is to use Rust's /// struct literal syntax to construct a new, reset value. If a developer adds a /// field, but neglects to update the reset code, the compiler will complain /// that a field is missing from the literal. This trait's `recycle` method /// takes `self` by value, and returns `Self` by value, encouraging the use of /// struct literal expressions in its implementation. pub trait Recyclable { /// Clear `self`, retaining its current memory allocations. /// /// Shrink the buffer if it's currently much larger than was actually used. /// This prevents a module with exceptionally large allocations from causing /// the `Writer` to retain more memory than it needs indefinitely. fn recycle(self) -> Self; } // Stock values for various collections. impl Recyclable for Vec { fn recycle(mut self) -> Self { self.clear(); self } } impl Recyclable for std::collections::HashMap { fn recycle(mut self) -> Self { self.clear(); self } } impl Recyclable for std::collections::HashSet { fn recycle(mut self) -> Self { self.clear(); self } } impl Recyclable for std::collections::BTreeMap { fn recycle(mut self) -> Self { self.clear(); self } } ================================================ FILE: lib/naga/src/back/spv/selection.rs ================================================ /*! Generate SPIR-V conditional structures. Builders for `if` structures with `and`s. The types in this module track the information needed to emit SPIR-V code for complex conditional structures, like those whose conditions involve short-circuiting 'and' and 'or' structures. These track labels and can emit `OpPhi` instructions to merge values produced along different paths. This currently only supports exactly the forms Naga uses, so it doesn't support `or` or `else`, and only supports zero or one merged values. Naga needs to emit code roughly like this: ```ignore value = DEFAULT; if COND1 && COND2 { value = THEN_VALUE; } // use value ``` Assuming `ctx` and `block` are a mutable references to a [`BlockContext`] and the current [`Block`], and `merge_type` is the SPIR-V type for the merged value `value`, we can build SPIR-V for the code above like so: ```ignore let cond = Selection::start(block, merge_type); // ... compute `cond1` ... cond.if_true(ctx, cond1, DEFAULT); // ... compute `cond2` ... cond.if_true(ctx, cond2, DEFAULT); // ... compute THEN_VALUE let merged_value = cond.finish(ctx, THEN_VALUE); ``` After this, `merged_value` is either `DEFAULT` or `THEN_VALUE`, depending on the path by which the merged block was reached. This takes care of writing all branch instructions, including an `OpSelectionMerge` annotation in the header block; starting new blocks and assigning them labels; and emitting the `OpPhi` that gathers together the right sources for the merged values, for every path through the selection construct. When there is no merged value to produce, you can pass `()` for `merge_type` and the merge values. In this case no `OpPhi` instructions are produced, and the `finish` method returns `()`. To enforce proper nesting, a `Selection` takes ownership of the `&mut Block` pointer for the duration of its lifetime. To obtain the block for generating code in the selection's body, call the `Selection::block` method. */ use super::{Block, BlockContext, Instruction}; use spirv::Word; /// A private struct recording what we know about the selection construct so far. pub(super) struct Selection<'b, M: MergeTuple> { /// The block pointer we're emitting code into. block: &'b mut Block, /// The label of the selection construct's merge block, or `None` if we /// haven't yet written the `OpSelectionMerge` merge instruction. merge_label: Option, /// A set of `(VALUES, PARENT)` pairs, used to build `OpPhi` instructions in /// the merge block. Each `PARENT` is the label of a predecessor block of /// the merge block. The corresponding `VALUES` holds the ids of the values /// that `PARENT` contributes to the merged values. /// /// We emit all branches to the merge block, so we know all its /// predecessors. And we refuse to emit a branch unless we're given the /// values the branching block contributes to the merge, so we always have /// everything we need to emit the correct phis, by construction. values: Vec<(M, Word)>, /// The types of the values in each element of `values`. merge_types: M, } impl<'b, M: MergeTuple> Selection<'b, M> { /// Start a new selection construct. /// /// The `block` argument indicates the selection's header block. /// /// The `merge_types` argument should be a `Word` or tuple of `Word`s, each /// value being the SPIR-V result type id of an `OpPhi` instruction that /// will be written to the selection's merge block when this selection's /// [`finish`] method is called. This argument may also be `()`, for /// selections that produce no values. /// /// (This function writes no code to `block` itself; it simply constructs a /// fresh `Selection`.) /// /// [`finish`]: Selection::finish pub(super) fn start(block: &'b mut Block, merge_types: M) -> Self { Selection { block, merge_label: None, values: vec![], merge_types, } } pub(super) fn block(&mut self) -> &mut Block { self.block } /// Branch to a successor block if `cond` is true, otherwise merge. /// /// If `cond` is false, branch to the merge block, using `values` as the /// merged values. Otherwise, proceed to a new block. /// /// The `values` argument must be the same shape as the `merge_types` /// argument passed to `Selection::start`. pub(super) fn if_true(&mut self, ctx: &mut BlockContext, cond: Word, values: M) { self.values.push((values, self.block.label_id)); let merge_label = self.make_merge_label(ctx); let next_label = ctx.gen_id(); ctx.function.consume( std::mem::replace(self.block, Block::new(next_label)), Instruction::branch_conditional(cond, next_label, merge_label), ); } /// Emit an unconditional branch to the merge block, and compute merged /// values. /// /// Use `final_values` as the merged values contributed by the current /// block, and transition to the merge block, emitting `OpPhi` instructions /// to produce the merged values. This must be the same shape as the /// `merge_types` argument passed to [`Selection::start`]. /// /// Return the SPIR-V ids of the merged values. This value has the same /// shape as the `merge_types` argument passed to `Selection::start`. pub(super) fn finish(self, ctx: &mut BlockContext, final_values: M) -> M { match self { Selection { merge_label: None, .. } => { // We didn't actually emit any branches, so `self.values` must // be empty, and `final_values` are the only sources we have for // the merged values. Easy peasy. final_values } Selection { block, merge_label: Some(merge_label), mut values, merge_types, } => { // Emit the final branch and transition to the merge block. values.push((final_values, block.label_id)); ctx.function.consume( std::mem::replace(block, Block::new(merge_label)), Instruction::branch(merge_label), ); // Now that we're in the merge block, build the phi instructions. merge_types.write_phis(ctx, block, &values) } } } /// Return the id of the merge block, writing a merge instruction if needed. fn make_merge_label(&mut self, ctx: &mut BlockContext) -> Word { match self.merge_label { None => { let merge_label = ctx.gen_id(); self.block.body.push(Instruction::selection_merge( merge_label, spirv::SelectionControl::NONE, )); self.merge_label = Some(merge_label); merge_label } Some(merge_label) => merge_label, } } } /// A trait to help `Selection` manage any number of merged values. /// /// Some selection constructs, like a `ReadZeroSkipWrite` bounds check on a /// [`Load`] expression, produce a single merged value. Others produce no merged /// value, like a bounds check on a [`Store`] statement. /// /// To let `Selection` work nicely with both cases, we let the merge type /// argument passed to [`Selection::start`] be any type that implements this /// `MergeTuple` trait. `MergeTuple` is then implemented for `()`, `Word`, /// `(Word, Word)`, and so on. /// /// A `MergeTuple` type can represent either a bunch of SPIR-V types or values; /// the `merge_types` argument to `Selection::start` are type ids, whereas the /// `values` arguments to the [`if_true`] and [`finish`] methods are value ids. /// The set of merged value returned by `finish` is a tuple of value ids. /// /// In fact, since Naga only uses zero- and single-valued selection constructs /// at present, we only implement `MergeTuple` for `()` and `Word`. But if you /// add more cases, feel free to add more implementations. Once const generics /// are available, we could have a single implementation of `MergeTuple` for all /// lengths of arrays, and be done with it. /// /// [`Load`]: crate::Expression::Load /// [`Store`]: crate::Statement::Store /// [`if_true`]: Selection::if_true /// [`finish`]: Selection::finish pub(super) trait MergeTuple: Sized { /// Write OpPhi instructions for the given set of predecessors. /// /// The `predecessors` vector should be a vector of `(LABEL, VALUES)` pairs, /// where each `VALUES` holds the values contributed by the branch from /// `LABEL`, which should be one of the current block's predecessors. fn write_phis( self, ctx: &mut BlockContext, block: &mut Block, predecessors: &[(Self, Word)], ) -> Self; } /// Selections that produce a single merged value. /// /// For example, `ImageLoad` with `BoundsCheckPolicy::ReadZeroSkipWrite` either /// returns a texel value or zeros. impl MergeTuple for Word { fn write_phis( self, ctx: &mut BlockContext, block: &mut Block, predecessors: &[(Word, Word)], ) -> Word { let merged_value = ctx.gen_id(); block .body .push(Instruction::phi(self, merged_value, predecessors)); merged_value } } /// Selections that produce no merged values. /// /// For example, `ImageStore` under `BoundsCheckPolicy::ReadZeroSkipWrite` /// either does the store or skips it, but in neither case does it produce a /// value. impl MergeTuple for () { /// No phis need to be generated. fn write_phis(self, _: &mut BlockContext, _: &mut Block, _: &[((), Word)]) {} } ================================================ FILE: lib/naga/src/back/spv/writer.rs ================================================ use super::{ helpers::{contains_builtin, global_needs_wrapper, map_storage_class}, make_local, Block, BlockContext, CachedExpressions, EntryPointContext, Error, Function, FunctionArgument, GlobalVariable, IdGenerator, Instruction, LocalType, LocalVariable, LogicalLayout, LookupFunctionType, LookupType, LoopContext, Options, PhysicalLayout, PipelineOptions, ResultMember, Writer, WriterFlags, BITS_PER_BYTE, }; use crate::{ arena::{Handle, UniqueArena}, back::spv::BindingInfo, proc::{Alignment, TypeResolution}, valid::{FunctionInfo, ModuleInfo}, }; use spirv::Word; use std::collections::hash_map::Entry; struct FunctionInterface<'a> { varying_ids: &'a mut Vec, stage: crate::ShaderStage, } impl Function { fn to_words(&self, sink: &mut impl Extend) { self.signature.as_ref().unwrap().to_words(sink); for argument in self.parameters.iter() { argument.instruction.to_words(sink); } for (index, block) in self.blocks.iter().enumerate() { Instruction::label(block.label_id).to_words(sink); if index == 0 { for local_var in self.variables.values() { local_var.instruction.to_words(sink); } } for instruction in block.body.iter() { instruction.to_words(sink); } } } } impl Writer { pub fn new(options: &Options) -> Result { let (major, minor) = options.lang_version; if major != 1 { return Err(Error::UnsupportedVersion(major, minor)); } let raw_version = ((major as u32) << 16) | ((minor as u32) << 8); let mut capabilities_used = crate::FastHashSet::default(); capabilities_used.insert(spirv::Capability::Shader); let mut id_gen = IdGenerator::default(); let gl450_ext_inst_id = id_gen.next(); let void_type = id_gen.next(); Ok(Writer { physical_layout: PhysicalLayout::new(raw_version), logical_layout: LogicalLayout::default(), id_gen, capabilities_available: options.capabilities.clone(), capabilities_used, extensions_used: crate::FastHashSet::default(), debugs: vec![], annotations: vec![], flags: options.flags, bounds_check_policies: options.bounds_check_policies, void_type, lookup_type: crate::FastHashMap::default(), lookup_function: crate::FastHashMap::default(), lookup_function_type: crate::FastHashMap::default(), constant_ids: Vec::new(), cached_constants: crate::FastHashMap::default(), global_variables: Vec::new(), binding_map: options.binding_map.clone(), saved_cached: CachedExpressions::default(), gl450_ext_inst_id, temp_list: Vec::new(), }) } /// Reset `Writer` to its initial state, retaining any allocations. /// /// Why not just implement `Recyclable` for `Writer`? By design, /// `Recyclable::recycle` requires ownership of the value, not just /// `&mut`; see the trait documentation. But we need to use this method /// from functions like `Writer::write`, which only have `&mut Writer`. /// Workarounds include unsafe code (`std::ptr::read`, then `write`, ugh) /// or something like a `Default` impl that returns an oddly-initialized /// `Writer`, which is worse. fn reset(&mut self) { use super::recyclable::Recyclable; use std::mem::take; let mut id_gen = IdGenerator::default(); let gl450_ext_inst_id = id_gen.next(); let void_type = id_gen.next(); // Every field of the old writer that is not determined by the `Options` // passed to `Writer::new` should be reset somehow. let fresh = Writer { // Copied from the old Writer: flags: self.flags, bounds_check_policies: self.bounds_check_policies, capabilities_available: take(&mut self.capabilities_available), binding_map: take(&mut self.binding_map), // Initialized afresh: id_gen, void_type, gl450_ext_inst_id, // Recycled: capabilities_used: take(&mut self.capabilities_used).recycle(), extensions_used: take(&mut self.extensions_used).recycle(), physical_layout: self.physical_layout.clone().recycle(), logical_layout: take(&mut self.logical_layout).recycle(), debugs: take(&mut self.debugs).recycle(), annotations: take(&mut self.annotations).recycle(), lookup_type: take(&mut self.lookup_type).recycle(), lookup_function: take(&mut self.lookup_function).recycle(), lookup_function_type: take(&mut self.lookup_function_type).recycle(), constant_ids: take(&mut self.constant_ids).recycle(), cached_constants: take(&mut self.cached_constants).recycle(), global_variables: take(&mut self.global_variables).recycle(), saved_cached: take(&mut self.saved_cached).recycle(), temp_list: take(&mut self.temp_list).recycle(), }; *self = fresh; self.capabilities_used.insert(spirv::Capability::Shader); } /// Indicate that the code requires any one of the listed capabilities. /// /// If nothing in `capabilities` appears in the available capabilities /// specified in the [`Options`] from which this `Writer` was created, /// return an error. The `what` string is used in the error message to /// explain what provoked the requirement. (If no available capabilities were /// given, assume everything is available.) /// /// The first acceptable capability will be added to this `Writer`'s /// [`capabilities_used`] table, and an `OpCapability` emitted for it in the /// result. For this reason, more specific capabilities should be listed /// before more general. /// /// [`capabilities_used`]: Writer::capabilities_used pub(super) fn require_any( &mut self, what: &'static str, capabilities: &[spirv::Capability], ) -> Result<(), Error> { match *capabilities { [] => Ok(()), [first, ..] => { // Find the first acceptable capability, or return an error if // there is none. let selected = match self.capabilities_available { None => first, Some(ref available) => { match capabilities.iter().find(|cap| available.contains(cap)) { Some(&cap) => cap, None => { return Err(Error::MissingCapabilities(what, capabilities.to_vec())) } } } }; self.capabilities_used.insert(selected); Ok(()) } } } /// Indicate that the code uses the given extension. pub(super) fn use_extension(&mut self, extension: &'static str) { self.extensions_used.insert(extension); } pub(super) fn get_type_id(&mut self, lookup_ty: LookupType) -> Word { match self.lookup_type.entry(lookup_ty) { Entry::Occupied(e) => *e.get(), Entry::Vacant(e) => { let local = match lookup_ty { LookupType::Handle(_handle) => unreachable!("Handles are populated at start"), LookupType::Local(local) => local, }; let id = self.id_gen.next(); e.insert(id); self.write_type_declaration_local(id, local); id } } } pub(super) fn get_expression_type_id(&mut self, tr: &TypeResolution) -> Word { let lookup_ty = match *tr { TypeResolution::Handle(ty_handle) => LookupType::Handle(ty_handle), TypeResolution::Value(ref inner) => LookupType::Local(make_local(inner).unwrap()), }; self.get_type_id(lookup_ty) } pub(super) fn get_pointer_id( &mut self, arena: &UniqueArena, handle: Handle, class: spirv::StorageClass, ) -> Result { let ty_id = self.get_type_id(LookupType::Handle(handle)); if let crate::TypeInner::Pointer { .. } = arena[handle].inner { return Ok(ty_id); } let lookup_type = LookupType::Local(LocalType::Pointer { base: handle, class, }); Ok(if let Some(&id) = self.lookup_type.get(&lookup_type) { id } else { let id = self.id_gen.next(); let instruction = Instruction::type_pointer(id, class, ty_id); instruction.to_words(&mut self.logical_layout.declarations); self.lookup_type.insert(lookup_type, id); id }) } pub(super) fn get_uint_type_id(&mut self) -> Word { let local_type = LocalType::Value { vector_size: None, kind: crate::ScalarKind::Uint, width: 4, pointer_space: None, }; self.get_type_id(local_type.into()) } pub(super) fn get_float_type_id(&mut self) -> Word { let local_type = LocalType::Value { vector_size: None, kind: crate::ScalarKind::Float, width: 4, pointer_space: None, }; self.get_type_id(local_type.into()) } pub(super) fn get_float_pointer_type_id(&mut self, class: spirv::StorageClass) -> Word { let lookup_type = LookupType::Local(LocalType::Value { vector_size: None, kind: crate::ScalarKind::Float, width: 4, pointer_space: Some(class), }); if let Some(&id) = self.lookup_type.get(&lookup_type) { id } else { let id = self.id_gen.next(); let ty_id = self.get_float_type_id(); let instruction = Instruction::type_pointer(id, class, ty_id); instruction.to_words(&mut self.logical_layout.declarations); self.lookup_type.insert(lookup_type, id); id } } pub(super) fn get_bool_type_id(&mut self) -> Word { let local_type = LocalType::Value { vector_size: None, kind: crate::ScalarKind::Bool, width: 1, pointer_space: None, }; self.get_type_id(local_type.into()) } pub(super) fn decorate(&mut self, id: Word, decoration: spirv::Decoration, operands: &[Word]) { self.annotations .push(Instruction::decorate(id, decoration, operands)); } fn write_function( &mut self, ir_function: &crate::Function, info: &FunctionInfo, ir_module: &crate::Module, mut interface: Option, ) -> Result { let mut function = Function::default(); for (handle, variable) in ir_function.local_variables.iter() { let id = self.id_gen.next(); if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = variable.name { self.debugs.push(Instruction::name(id, name)); } } let init_word = variable .init .map(|constant| self.constant_ids[constant.index()]); let pointer_type_id = self.get_pointer_id(&ir_module.types, variable.ty, spirv::StorageClass::Function)?; let instruction = Instruction::variable( pointer_type_id, id, spirv::StorageClass::Function, init_word.or_else(|| { let type_id = self.get_type_id(LookupType::Handle(variable.ty)); Some(self.write_constant_null(type_id)) }), ); function .variables .insert(handle, LocalVariable { id, instruction }); } let prelude_id = self.id_gen.next(); let mut prelude = Block::new(prelude_id); let mut ep_context = EntryPointContext { argument_ids: Vec::new(), results: Vec::new(), }; let mut parameter_type_ids = Vec::with_capacity(ir_function.arguments.len()); for argument in ir_function.arguments.iter() { let class = spirv::StorageClass::Input; let handle_ty = ir_module.types[argument.ty].inner.is_handle(); let argument_type_id = match handle_ty { true => self.get_pointer_id( &ir_module.types, argument.ty, spirv::StorageClass::UniformConstant, )?, false => self.get_type_id(LookupType::Handle(argument.ty)), }; if let Some(ref mut iface) = interface { let id = if let Some(ref binding) = argument.binding { let name = argument.name.as_deref(); let varying_id = self.write_varying( ir_module, iface.stage, class, name, argument.ty, binding, )?; iface.varying_ids.push(varying_id); let id = self.id_gen.next(); prelude .body .push(Instruction::load(argument_type_id, id, varying_id, None)); id } else if let crate::TypeInner::Struct { ref members, .. } = ir_module.types[argument.ty].inner { let struct_id = self.id_gen.next(); let mut constituent_ids = Vec::with_capacity(members.len()); for member in members { let type_id = self.get_type_id(LookupType::Handle(member.ty)); let name = member.name.as_deref(); let binding = member.binding.as_ref().unwrap(); let varying_id = self.write_varying( ir_module, iface.stage, class, name, member.ty, binding, )?; iface.varying_ids.push(varying_id); let id = self.id_gen.next(); prelude .body .push(Instruction::load(type_id, id, varying_id, None)); constituent_ids.push(id); } prelude.body.push(Instruction::composite_construct( argument_type_id, struct_id, &constituent_ids, )); struct_id } else { unreachable!("Missing argument binding on an entry point"); }; ep_context.argument_ids.push(id); } else { let argument_id = self.id_gen.next(); let instruction = Instruction::function_parameter(argument_type_id, argument_id); if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = argument.name { self.debugs.push(Instruction::name(argument_id, name)); } } function.parameters.push(FunctionArgument { instruction, handle_id: if handle_ty { let id = self.id_gen.next(); prelude.body.push(Instruction::load( self.get_type_id(LookupType::Handle(argument.ty)), id, argument_id, None, )); id } else { 0 }, }); parameter_type_ids.push(argument_type_id); }; } let return_type_id = match ir_function.result { Some(ref result) => { if let Some(ref mut iface) = interface { let mut has_point_size = false; let class = spirv::StorageClass::Output; if let Some(ref binding) = result.binding { has_point_size |= *binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize); let type_id = self.get_type_id(LookupType::Handle(result.ty)); let varying_id = self.write_varying( ir_module, iface.stage, class, None, result.ty, binding, )?; iface.varying_ids.push(varying_id); ep_context.results.push(ResultMember { id: varying_id, type_id, built_in: binding.to_built_in(), }); } else if let crate::TypeInner::Struct { ref members, .. } = ir_module.types[result.ty].inner { for member in members { let type_id = self.get_type_id(LookupType::Handle(member.ty)); let name = member.name.as_deref(); let binding = member.binding.as_ref().unwrap(); has_point_size |= *binding == crate::Binding::BuiltIn(crate::BuiltIn::PointSize); let varying_id = self.write_varying( ir_module, iface.stage, class, name, member.ty, binding, )?; iface.varying_ids.push(varying_id); ep_context.results.push(ResultMember { id: varying_id, type_id, built_in: binding.to_built_in(), }); } } else { unreachable!("Missing result binding on an entry point"); } if self.flags.contains(WriterFlags::FORCE_POINT_SIZE) && iface.stage == crate::ShaderStage::Vertex && !has_point_size { // add point size artificially let varying_id = self.id_gen.next(); let pointer_type_id = self.get_float_pointer_type_id(class); Instruction::variable(pointer_type_id, varying_id, class, None) .to_words(&mut self.logical_layout.declarations); self.decorate( varying_id, spirv::Decoration::BuiltIn, &[spirv::BuiltIn::PointSize as u32], ); iface.varying_ids.push(varying_id); let default_value_id = self.get_constant_scalar(crate::ScalarValue::Float(1.0), 4); prelude .body .push(Instruction::store(varying_id, default_value_id, None)); } self.void_type } else { self.get_type_id(LookupType::Handle(result.ty)) } } None => self.void_type, }; let lookup_function_type = LookupFunctionType { parameter_type_ids, return_type_id, }; let function_id = self.id_gen.next(); if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = ir_function.name { self.debugs.push(Instruction::name(function_id, name)); } } let function_type = self.get_function_type(lookup_function_type); function.signature = Some(Instruction::function( return_type_id, function_id, spirv::FunctionControl::empty(), function_type, )); if interface.is_some() { function.entry_point_context = Some(ep_context); } // fill up the `GlobalVariable::access_id` for gv in self.global_variables.iter_mut() { gv.reset_for_function(); } for (handle, var) in ir_module.global_variables.iter() { if info[handle].is_empty() { continue; } let mut gv = self.global_variables[handle.index()].clone(); // Handle globals are pre-emitted and should be loaded automatically. // // Any that are binding arrays we skip as we cannot load the array, we must load the result after indexing. let is_binding_array = match ir_module.types[var.ty].inner { crate::TypeInner::BindingArray { .. } => true, _ => false, }; if var.space == crate::AddressSpace::Handle && !is_binding_array { let var_type_id = self.get_type_id(LookupType::Handle(var.ty)); let id = self.id_gen.next(); prelude .body .push(Instruction::load(var_type_id, id, gv.var_id, None)); gv.access_id = gv.var_id; gv.handle_id = id; } else if global_needs_wrapper(ir_module, var) { let class = map_storage_class(var.space); let pointer_type_id = self.get_pointer_id(&ir_module.types, var.ty, class)?; let index_id = self.get_index_constant(0); let id = self.id_gen.next(); prelude.body.push(Instruction::access_chain( pointer_type_id, id, gv.var_id, &[index_id], )); gv.access_id = id; } else { // by default, the variable ID is accessed as is gv.access_id = gv.var_id; }; // work around borrow checking in the presence of `self.xxx()` calls self.global_variables[handle.index()] = gv; } // Create a `BlockContext` for generating SPIR-V for the function's // body. let mut context = BlockContext { ir_module, ir_function, fun_info: info, function: &mut function, // Re-use the cached expression table from prior functions. cached: std::mem::take(&mut self.saved_cached), // Steal the Writer's temp list for a bit. temp_list: std::mem::take(&mut self.temp_list), writer: self, }; // fill up the pre-emitted expressions context.cached.reset(ir_function.expressions.len()); for (handle, expr) in ir_function.expressions.iter() { if expr.needs_pre_emit() { context.cache_expression_value(handle, &mut prelude)?; } } let main_id = context.gen_id(); context .function .consume(prelude, Instruction::branch(main_id)); context.write_block( main_id, &ir_function.body, super::block::BlockExit::Return, LoopContext::default(), )?; // Consume the `BlockContext`, ending its borrows and letting the // `Writer` steal back its cached expression table and temp_list. let BlockContext { cached, temp_list, .. } = context; self.saved_cached = cached; self.temp_list = temp_list; function.to_words(&mut self.logical_layout.function_definitions); Instruction::function_end().to_words(&mut self.logical_layout.function_definitions); Ok(function_id) } fn write_execution_mode( &mut self, function_id: Word, mode: spirv::ExecutionMode, ) -> Result<(), Error> { //self.check(mode.required_capabilities())?; Instruction::execution_mode(function_id, mode, &[]) .to_words(&mut self.logical_layout.execution_modes); Ok(()) } // TODO Move to instructions module fn write_entry_point( &mut self, entry_point: &crate::EntryPoint, info: &FunctionInfo, ir_module: &crate::Module, ) -> Result { let mut interface_ids = Vec::new(); let function_id = self.write_function( &entry_point.function, info, ir_module, Some(FunctionInterface { varying_ids: &mut interface_ids, stage: entry_point.stage, }), )?; let exec_model = match entry_point.stage { crate::ShaderStage::Vertex => spirv::ExecutionModel::Vertex, crate::ShaderStage::Fragment => { self.write_execution_mode(function_id, spirv::ExecutionMode::OriginUpperLeft)?; if let Some(ref result) = entry_point.function.result { if contains_builtin( result.binding.as_ref(), result.ty, &ir_module.types, crate::BuiltIn::FragDepth, ) { self.write_execution_mode( function_id, spirv::ExecutionMode::DepthReplacing, )?; } } spirv::ExecutionModel::Fragment } crate::ShaderStage::Compute => { let execution_mode = spirv::ExecutionMode::LocalSize; //self.check(execution_mode.required_capabilities())?; Instruction::execution_mode( function_id, execution_mode, &entry_point.workgroup_size, ) .to_words(&mut self.logical_layout.execution_modes); spirv::ExecutionModel::GLCompute } }; //self.check(exec_model.required_capabilities())?; Ok(Instruction::entry_point( exec_model, function_id, &entry_point.name, interface_ids.as_slice(), )) } fn make_scalar( &mut self, id: Word, kind: crate::ScalarKind, width: crate::Bytes, ) -> Instruction { use crate::ScalarKind as Sk; let bits = (width * BITS_PER_BYTE) as u32; match kind { Sk::Sint | Sk::Uint => { let signedness = if kind == Sk::Sint { super::instructions::Signedness::Signed } else { super::instructions::Signedness::Unsigned }; let cap = match bits { 8 => Some(spirv::Capability::Int8), 16 => Some(spirv::Capability::Int16), 64 => Some(spirv::Capability::Int64), _ => None, }; if let Some(cap) = cap { self.capabilities_used.insert(cap); } Instruction::type_int(id, bits, signedness) } Sk::Float => { if bits == 64 { self.capabilities_used.insert(spirv::Capability::Float64); } Instruction::type_float(id, bits) } Sk::Bool => Instruction::type_bool(id), } } fn request_image_capabilities(&mut self, inner: &crate::TypeInner) -> Result<(), Error> { if let crate::TypeInner::Image { dim, arrayed, class, } = *inner { let sampled = match class { crate::ImageClass::Sampled { .. } => true, crate::ImageClass::Depth { .. } => true, crate::ImageClass::Storage { format, .. } => { self.request_image_format_capabilities(format.into())?; false } }; match dim { crate::ImageDimension::D1 => { if sampled { self.require_any("sampled 1D images", &[spirv::Capability::Sampled1D])?; } else { self.require_any("1D storage images", &[spirv::Capability::Image1D])?; } } crate::ImageDimension::Cube if arrayed => { if sampled { self.require_any( "sampled cube array images", &[spirv::Capability::SampledCubeArray], )?; } else { self.require_any( "cube array storage images", &[spirv::Capability::ImageCubeArray], )?; } } _ => {} } } Ok(()) } fn write_type_declaration_local(&mut self, id: Word, local_ty: LocalType) { let instruction = match local_ty { LocalType::Value { vector_size: None, kind, width, pointer_space: None, } => self.make_scalar(id, kind, width), LocalType::Value { vector_size: Some(size), kind, width, pointer_space: None, } => { let scalar_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind, width, pointer_space: None, })); Instruction::type_vector(id, scalar_id, size) } LocalType::Matrix { columns, rows, width, } => { let vector_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: Some(rows), kind: crate::ScalarKind::Float, width, pointer_space: None, })); Instruction::type_matrix(id, vector_id, columns) } LocalType::Pointer { base, class } => { let type_id = self.get_type_id(LookupType::Handle(base)); Instruction::type_pointer(id, class, type_id) } LocalType::Value { vector_size, kind, width, pointer_space: Some(class), } => { let type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size, kind, width, pointer_space: None, })); Instruction::type_pointer(id, class, type_id) } LocalType::Image(image) => { let local_type = LocalType::Value { vector_size: None, kind: image.sampled_type, width: 4, pointer_space: None, }; let type_id = self.get_type_id(LookupType::Local(local_type)); Instruction::type_image(id, type_id, image.dim, image.flags, image.image_format) } LocalType::Sampler => Instruction::type_sampler(id), LocalType::SampledImage { image_type_id } => { Instruction::type_sampled_image(id, image_type_id) } LocalType::BindingArray { base, size } => { let inner_ty = self.get_type_id(LookupType::Handle(base)); let scalar_id = self.get_constant_scalar(crate::ScalarValue::Uint(size), 4); Instruction::type_array(id, inner_ty, scalar_id) } LocalType::PointerToBindingArray { base, size } => { let inner_ty = self.get_type_id(LookupType::Local(LocalType::BindingArray { base, size })); Instruction::type_pointer(id, spirv::StorageClass::UniformConstant, inner_ty) } }; instruction.to_words(&mut self.logical_layout.declarations); } fn write_type_declaration_arena( &mut self, arena: &UniqueArena, handle: Handle, ) -> Result { let ty = &arena[handle]; let id = if let Some(local) = make_local(&ty.inner) { // This type can be represented as a `LocalType`, so check if we've // already written an instruction for it. If not, do so now, with // `write_type_declaration_local`. match self.lookup_type.entry(LookupType::Local(local)) { // We already have an id for this `LocalType`. Entry::Occupied(e) => *e.get(), // It's a type we haven't seen before. Entry::Vacant(e) => { let id = self.id_gen.next(); e.insert(id); self.write_type_declaration_local(id, local); // If it's an image type, request SPIR-V capabilities here, so // write_type_declaration_local can stay infallible. self.request_image_capabilities(&ty.inner)?; id } } } else { use spirv::Decoration; let id = self.id_gen.next(); let instruction = match ty.inner { crate::TypeInner::Array { base, size, stride } => { self.decorate(id, Decoration::ArrayStride, &[stride]); let type_id = self.get_type_id(LookupType::Handle(base)); match size { crate::ArraySize::Constant(const_handle) => { let length_id = self.constant_ids[const_handle.index()]; Instruction::type_array(id, type_id, length_id) } crate::ArraySize::Dynamic => Instruction::type_runtime_array(id, type_id), } } crate::TypeInner::BindingArray { base, size } => { let type_id = self.get_type_id(LookupType::Handle(base)); match size { crate::ArraySize::Constant(const_handle) => { let length_id = self.constant_ids[const_handle.index()]; Instruction::type_array(id, type_id, length_id) } crate::ArraySize::Dynamic => Instruction::type_runtime_array(id, type_id), } } crate::TypeInner::Struct { ref members, span: _, } => { let mut member_ids = Vec::with_capacity(members.len()); for (index, member) in members.iter().enumerate() { self.decorate_struct_member(id, index, member, arena)?; let member_id = self.get_type_id(LookupType::Handle(member.ty)); member_ids.push(member_id); } Instruction::type_struct(id, member_ids.as_slice()) } // These all have TypeLocal representations, so they should have been // handled by `write_type_declaration_local` above. crate::TypeInner::Scalar { .. } | crate::TypeInner::Atomic { .. } | crate::TypeInner::Vector { .. } | crate::TypeInner::Matrix { .. } | crate::TypeInner::Pointer { .. } | crate::TypeInner::ValuePointer { .. } | crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } => unreachable!(), }; instruction.to_words(&mut self.logical_layout.declarations); id }; // Add this handle as a new alias for that type. self.lookup_type.insert(LookupType::Handle(handle), id); if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = ty.name { self.debugs.push(Instruction::name(id, name)); } } Ok(id) } fn request_image_format_capabilities( &mut self, format: spirv::ImageFormat, ) -> Result<(), Error> { use spirv::ImageFormat as If; match format { If::Rg32f | If::Rg16f | If::R11fG11fB10f | If::R16f | If::Rgba16 | If::Rgb10A2 | If::Rg16 | If::Rg8 | If::R16 | If::R8 | If::Rgba16Snorm | If::Rg16Snorm | If::Rg8Snorm | If::R16Snorm | If::R8Snorm | If::Rg32i | If::Rg16i | If::Rg8i | If::R16i | If::R8i | If::Rgb10a2ui | If::Rg32ui | If::Rg16ui | If::Rg8ui | If::R16ui | If::R8ui => self.require_any( "storage image format", &[spirv::Capability::StorageImageExtendedFormats], ), If::R64ui | If::R64i => self.require_any( "64-bit integer storage image format", &[spirv::Capability::Int64ImageEXT], ), If::Unknown | If::Rgba32f | If::Rgba16f | If::R32f | If::Rgba8 | If::Rgba8Snorm | If::Rgba32i | If::Rgba16i | If::Rgba8i | If::R32i | If::Rgba32ui | If::Rgba16ui | If::Rgba8ui | If::R32ui => Ok(()), } } pub(super) fn get_index_constant(&mut self, index: Word) -> Word { self.get_constant_scalar(crate::ScalarValue::Uint(index as _), 4) } pub(super) fn get_constant_scalar( &mut self, value: crate::ScalarValue, width: crate::Bytes, ) -> Word { if let Some(&id) = self.cached_constants.get(&(value, width)) { return id; } let id = self.id_gen.next(); self.write_constant_scalar(id, &value, width, None); self.cached_constants.insert((value, width), id); id } fn write_constant_scalar( &mut self, id: Word, value: &crate::ScalarValue, width: crate::Bytes, debug_name: Option<&String>, ) { if self.flags.contains(WriterFlags::DEBUG) { if let Some(name) = debug_name { self.debugs.push(Instruction::name(id, name)); } } let type_id = self.get_type_id(LookupType::Local(LocalType::Value { vector_size: None, kind: value.scalar_kind(), width, pointer_space: None, })); let (solo, pair); let instruction = match *value { crate::ScalarValue::Sint(val) => { let words = match width { 4 => { solo = [val as u32]; &solo[..] } 8 => { pair = [val as u32, (val >> 32) as u32]; &pair } _ => unreachable!(), }; Instruction::constant(type_id, id, words) } crate::ScalarValue::Uint(val) => { let words = match width { 4 => { solo = [val as u32]; &solo[..] } 8 => { pair = [val as u32, (val >> 32) as u32]; &pair } _ => unreachable!(), }; Instruction::constant(type_id, id, words) } crate::ScalarValue::Float(val) => { let words = match width { 4 => { solo = [(val as f32).to_bits()]; &solo[..] } 8 => { let bits = f64::to_bits(val); pair = [bits as u32, (bits >> 32) as u32]; &pair } _ => unreachable!(), }; Instruction::constant(type_id, id, words) } crate::ScalarValue::Bool(true) => Instruction::constant_true(type_id, id), crate::ScalarValue::Bool(false) => Instruction::constant_false(type_id, id), }; instruction.to_words(&mut self.logical_layout.declarations); } fn write_constant_composite( &mut self, id: Word, ty: Handle, components: &[Handle], ) -> Result<(), Error> { let mut constituent_ids = Vec::with_capacity(components.len()); for constituent in components.iter() { let constituent_id = self.constant_ids[constituent.index()]; constituent_ids.push(constituent_id); } let type_id = self.get_type_id(LookupType::Handle(ty)); Instruction::constant_composite(type_id, id, constituent_ids.as_slice()) .to_words(&mut self.logical_layout.declarations); Ok(()) } pub(super) fn write_constant_null(&mut self, type_id: Word) -> Word { let null_id = self.id_gen.next(); Instruction::constant_null(type_id, null_id) .to_words(&mut self.logical_layout.declarations); null_id } /// Generate an `OpVariable` for one value in an [`EntryPoint`]'s IO interface. /// /// The [`Binding`]s of the arguments and result of an [`EntryPoint`]'s /// [`Function`] describe a SPIR-V shader interface. In SPIR-V, the /// interface is represented by global variables in the `Input` and `Output` /// storage classes, with decorations indicating which builtin or location /// each variable corresponds to. /// /// This function emits a single global `OpVariable` for a single value from /// the interface, and adds appropriate decorations to indicate which /// builtin or location it represents, how it should be interpolated, and so /// on. The `class` argument gives the variable's SPIR-V storage class, /// which should be either [`Input`] or [`Output`]. /// /// [`Binding`]: crate::Binding /// [`Function`]: crate::Function /// [`EntryPoint`]: crate::EntryPoint /// [`Input`]: spirv::StorageClass::Input /// [`Output`]: spirv::StorageClass::Output fn write_varying( &mut self, ir_module: &crate::Module, stage: crate::ShaderStage, class: spirv::StorageClass, debug_name: Option<&str>, ty: Handle, binding: &crate::Binding, ) -> Result { let id = self.id_gen.next(); let pointer_type_id = self.get_pointer_id(&ir_module.types, ty, class)?; Instruction::variable(pointer_type_id, id, class, None) .to_words(&mut self.logical_layout.declarations); if self .flags .contains(WriterFlags::DEBUG | WriterFlags::LABEL_VARYINGS) { if let Some(name) = debug_name { self.debugs.push(Instruction::name(id, name)); } } use spirv::{BuiltIn, Decoration}; match *binding { crate::Binding::Location { location, interpolation, sampling, } => { self.decorate(id, Decoration::Location, &[location]); // The Vulkan spec says: VUID-StandaloneSpirv-Flat-06202 // // > The Flat, NoPerspective, Sample, and Centroid decorations // > must not be used on variables with the Input storage class in // > a vertex shader if class != spirv::StorageClass::Input || stage != crate::ShaderStage::Vertex { match interpolation { // Perspective-correct interpolation is the default in SPIR-V. None | Some(crate::Interpolation::Perspective) => (), Some(crate::Interpolation::Flat) => { self.decorate(id, Decoration::Flat, &[]); } Some(crate::Interpolation::Linear) => { self.decorate(id, Decoration::NoPerspective, &[]); } } } match sampling { // Center sampling is the default in SPIR-V. None | Some(crate::Sampling::Center) => (), Some(crate::Sampling::Centroid) => { self.decorate(id, Decoration::Centroid, &[]); } Some(crate::Sampling::Sample) => { self.require_any( "per-sample interpolation", &[spirv::Capability::SampleRateShading], )?; self.decorate(id, Decoration::Sample, &[]); } } } crate::Binding::BuiltIn(built_in) => { use crate::BuiltIn as Bi; let built_in = match built_in { Bi::Position { invariant } => { if invariant { self.decorate(id, Decoration::Invariant, &[]); } if class == spirv::StorageClass::Output { BuiltIn::Position } else { BuiltIn::FragCoord } } Bi::ViewIndex => { self.require_any("`view_index` built-in", &[spirv::Capability::MultiView])?; BuiltIn::ViewIndex } // vertex Bi::BaseInstance => BuiltIn::BaseInstance, Bi::BaseVertex => BuiltIn::BaseVertex, Bi::ClipDistance => BuiltIn::ClipDistance, Bi::CullDistance => BuiltIn::CullDistance, Bi::InstanceIndex => BuiltIn::InstanceIndex, Bi::PointSize => BuiltIn::PointSize, Bi::VertexIndex => BuiltIn::VertexIndex, // fragment Bi::FragDepth => BuiltIn::FragDepth, Bi::FrontFacing => BuiltIn::FrontFacing, Bi::PrimitiveIndex => { self.require_any( "`primitive_index` built-in", &[spirv::Capability::Geometry], )?; BuiltIn::PrimitiveId } Bi::SampleIndex => { self.require_any( "`sample_index` built-in", &[spirv::Capability::SampleRateShading], )?; BuiltIn::SampleId } Bi::SampleMask => BuiltIn::SampleMask, // compute Bi::GlobalInvocationId => BuiltIn::GlobalInvocationId, Bi::LocalInvocationId => BuiltIn::LocalInvocationId, Bi::LocalInvocationIndex => BuiltIn::LocalInvocationIndex, Bi::WorkGroupId => BuiltIn::WorkgroupId, Bi::WorkGroupSize => BuiltIn::WorkgroupSize, Bi::NumWorkGroups => BuiltIn::NumWorkgroups, }; self.decorate(id, Decoration::BuiltIn, &[built_in as u32]); use crate::ScalarKind as Sk; // Per the Vulkan spec, `VUID-StandaloneSpirv-Flat-04744`: // // > Any variable with integer or double-precision floating- // > point type and with Input storage class in a fragment // > shader, must be decorated Flat if class == spirv::StorageClass::Input && stage == crate::ShaderStage::Fragment { let is_flat = match ir_module.types[ty].inner { crate::TypeInner::Scalar { kind, .. } | crate::TypeInner::Vector { kind, .. } => match kind { Sk::Uint | Sk::Sint | Sk::Bool => true, Sk::Float => false, }, _ => false, }; if is_flat { self.decorate(id, Decoration::Flat, &[]); } } } } Ok(id) } fn write_global_variable( &mut self, ir_module: &crate::Module, global_variable: &crate::GlobalVariable, ) -> Result { use spirv::Decoration; let id = self.id_gen.next(); let class = map_storage_class(global_variable.space); //self.check(class.required_capabilities())?; if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = global_variable.name { self.debugs.push(Instruction::name(id, name)); } } let storage_access = match global_variable.space { crate::AddressSpace::Storage { access } => Some(access), _ => match ir_module.types[global_variable.ty].inner { crate::TypeInner::Image { class: crate::ImageClass::Storage { access, .. }, .. } => Some(access), _ => None, }, }; if let Some(storage_access) = storage_access { if !storage_access.contains(crate::StorageAccess::LOAD) { self.decorate(id, Decoration::NonReadable, &[]); } if !storage_access.contains(crate::StorageAccess::STORE) { self.decorate(id, Decoration::NonWritable, &[]); } } let mut substitute_inner_type_lookup = None; if let Some(ref res_binding) = global_variable.binding { self.decorate(id, Decoration::DescriptorSet, &[res_binding.group]); self.decorate(id, Decoration::Binding, &[res_binding.binding]); if let Some(&BindingInfo { binding_array_size: Some(remapped_binding_array_size), }) = self.binding_map.get(res_binding) { if let crate::TypeInner::BindingArray { base, .. } = ir_module.types[global_variable.ty].inner { substitute_inner_type_lookup = Some(LookupType::Local(LocalType::PointerToBindingArray { base, size: remapped_binding_array_size as u64, })) } } else { } }; let init_word = global_variable .init .map(|constant| self.constant_ids[constant.index()]); let inner_type_id = self.get_type_id( substitute_inner_type_lookup.unwrap_or(LookupType::Handle(global_variable.ty)), ); // generate the wrapping structure if needed let pointer_type_id = if global_needs_wrapper(ir_module, global_variable) { let wrapper_type_id = self.id_gen.next(); self.decorate(wrapper_type_id, Decoration::Block, &[]); let member = crate::StructMember { name: None, ty: global_variable.ty, binding: None, offset: 0, }; self.decorate_struct_member(wrapper_type_id, 0, &member, &ir_module.types)?; Instruction::type_struct(wrapper_type_id, &[inner_type_id]) .to_words(&mut self.logical_layout.declarations); let pointer_type_id = self.id_gen.next(); Instruction::type_pointer(pointer_type_id, class, wrapper_type_id) .to_words(&mut self.logical_layout.declarations); pointer_type_id } else { // This is a global variable in the Storage address space. The only // way it could have `global_needs_wrapper() == false` is if it has // a runtime-sized array. In this case, we need to decorate it with // Block. if let crate::AddressSpace::Storage { .. } = global_variable.space { self.decorate(inner_type_id, Decoration::Block, &[]); } if substitute_inner_type_lookup.is_some() { inner_type_id } else { self.get_pointer_id(&ir_module.types, global_variable.ty, class)? } }; let init_word = match global_variable.space { crate::AddressSpace::Private => { init_word.or_else(|| Some(self.write_constant_null(inner_type_id))) } _ => init_word, }; Instruction::variable(pointer_type_id, id, class, init_word) .to_words(&mut self.logical_layout.declarations); Ok(id) } /// Write the necessary decorations for a struct member. /// /// Emit decorations for the `index`'th member of the struct type /// designated by `struct_id`, described by `member`. fn decorate_struct_member( &mut self, struct_id: Word, index: usize, member: &crate::StructMember, arena: &UniqueArena, ) -> Result<(), Error> { use spirv::Decoration; self.annotations.push(Instruction::member_decorate( struct_id, index as u32, Decoration::Offset, &[member.offset], )); if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = member.name { self.debugs .push(Instruction::member_name(struct_id, index as u32, name)); } } // Matrices and arrays of matrices both require decorations, // so "see through" an array to determine if they're needed. let member_array_subty_inner = match arena[member.ty].inner { crate::TypeInner::Array { base, .. } => &arena[base].inner, ref other => other, }; if let crate::TypeInner::Matrix { columns: _, rows, width, } = *member_array_subty_inner { let byte_stride = Alignment::from(rows) * width as u32; self.annotations.push(Instruction::member_decorate( struct_id, index as u32, Decoration::ColMajor, &[], )); self.annotations.push(Instruction::member_decorate( struct_id, index as u32, Decoration::MatrixStride, &[byte_stride], )); } Ok(()) } fn get_function_type(&mut self, lookup_function_type: LookupFunctionType) -> Word { match self .lookup_function_type .entry(lookup_function_type.clone()) { Entry::Occupied(e) => *e.get(), _ => { let id = self.id_gen.next(); let instruction = Instruction::type_function( id, lookup_function_type.return_type_id, &lookup_function_type.parameter_type_ids, ); instruction.to_words(&mut self.logical_layout.declarations); self.lookup_function_type.insert(lookup_function_type, id); id } } } fn write_physical_layout(&mut self) { self.physical_layout.bound = self.id_gen.0 + 1; } fn write_logical_layout( &mut self, ir_module: &crate::Module, mod_info: &ModuleInfo, ep_index: Option, ) -> Result<(), Error> { fn has_view_index_check( ir_module: &crate::Module, binding: Option<&crate::Binding>, ty: Handle, ) -> bool { match ir_module.types[ty].inner { crate::TypeInner::Struct { ref members, .. } => members.iter().any(|member| { has_view_index_check(ir_module, member.binding.as_ref(), member.ty) }), _ => binding == Some(&crate::Binding::BuiltIn(crate::BuiltIn::ViewIndex)), } } let has_storage_buffers = ir_module .global_variables .iter() .any(|(_, var)| match var.space { crate::AddressSpace::Storage { .. } => true, _ => false, }); let has_view_index = ir_module .entry_points .iter() .flat_map(|entry| entry.function.arguments.iter()) .any(|arg| has_view_index_check(ir_module, arg.binding.as_ref(), arg.ty)); if self.physical_layout.version < 0x10300 && has_storage_buffers { // enable the storage buffer class on < SPV-1.3 Instruction::extension("SPV_KHR_storage_buffer_storage_class") .to_words(&mut self.logical_layout.extensions); } if has_view_index { Instruction::extension("SPV_KHR_multiview") .to_words(&mut self.logical_layout.extensions) } Instruction::type_void(self.void_type).to_words(&mut self.logical_layout.declarations); Instruction::ext_inst_import(self.gl450_ext_inst_id, "GLSL.std.450") .to_words(&mut self.logical_layout.ext_inst_imports); if self.flags.contains(WriterFlags::DEBUG) { self.debugs .push(Instruction::source(spirv::SourceLanguage::GLSL, 450)); } self.constant_ids.resize(ir_module.constants.len(), 0); // first, output all the scalar constants for (handle, constant) in ir_module.constants.iter() { match constant.inner { crate::ConstantInner::Composite { .. } => continue, crate::ConstantInner::Scalar { width, ref value } => { self.constant_ids[handle.index()] = match constant.name { Some(ref name) => { let id = self.id_gen.next(); self.write_constant_scalar(id, value, width, Some(name)); id } None => self.get_constant_scalar(*value, width), }; } } } // then all types, some of them may rely on constants and struct type set for (handle, _) in ir_module.types.iter() { self.write_type_declaration_arena(&ir_module.types, handle)?; } // the all the composite constants, they rely on types for (handle, constant) in ir_module.constants.iter() { match constant.inner { crate::ConstantInner::Scalar { .. } => continue, crate::ConstantInner::Composite { ty, ref components } => { let id = self.id_gen.next(); self.constant_ids[handle.index()] = id; if self.flags.contains(WriterFlags::DEBUG) { if let Some(ref name) = constant.name { self.debugs.push(Instruction::name(id, name)); } } self.write_constant_composite(id, ty, components)?; } } } debug_assert_eq!(self.constant_ids.iter().position(|&id| id == 0), None); // now write all globals for (handle, var) in ir_module.global_variables.iter() { // If a single entry point was specified, only write `OpVariable` instructions // for the globals it actually uses. Emit dummies for the others, // to preserve the indices in `global_variables`. let gvar = match ep_index { Some(index) if mod_info.get_entry_point(index)[handle].is_empty() => { GlobalVariable::dummy() } _ => { let id = self.write_global_variable(ir_module, var)?; GlobalVariable::new(id) } }; self.global_variables.push(gvar); } // all functions for (handle, ir_function) in ir_module.functions.iter() { let info = &mod_info[handle]; if let Some(index) = ep_index { let ep_info = mod_info.get_entry_point(index); // If this function uses globals that we omitted from the SPIR-V // because the entry point and its callees didn't use them, // then we must skip it. if !ep_info.dominates_global_use(info) { log::info!("Skip function {:?}", ir_function.name); continue; } } let id = self.write_function(ir_function, info, ir_module, None)?; self.lookup_function.insert(handle, id); } // and entry points for (index, ir_ep) in ir_module.entry_points.iter().enumerate() { if ep_index.is_some() && ep_index != Some(index) { continue; } let info = mod_info.get_entry_point(index); let ep_instruction = self.write_entry_point(ir_ep, info, ir_module)?; ep_instruction.to_words(&mut self.logical_layout.entry_points); } for capability in self.capabilities_used.iter() { Instruction::capability(*capability).to_words(&mut self.logical_layout.capabilities); } for extension in self.extensions_used.iter() { Instruction::extension(extension).to_words(&mut self.logical_layout.extensions); } if ir_module.entry_points.is_empty() { // SPIR-V doesn't like modules without entry points Instruction::capability(spirv::Capability::Linkage) .to_words(&mut self.logical_layout.capabilities); } let addressing_model = spirv::AddressingModel::Logical; let memory_model = spirv::MemoryModel::GLSL450; //self.check(addressing_model.required_capabilities())?; //self.check(memory_model.required_capabilities())?; Instruction::memory_model(addressing_model, memory_model) .to_words(&mut self.logical_layout.memory_model); if self.flags.contains(WriterFlags::DEBUG) { for debug in self.debugs.iter() { debug.to_words(&mut self.logical_layout.debugs); } } for annotation in self.annotations.iter() { annotation.to_words(&mut self.logical_layout.annotations); } Ok(()) } pub fn write( &mut self, ir_module: &crate::Module, info: &ModuleInfo, pipeline_options: Option<&PipelineOptions>, words: &mut Vec, ) -> Result<(), Error> { self.reset(); // Try to find the entry point and corresponding index let ep_index = match pipeline_options { Some(po) => { let index = ir_module .entry_points .iter() .position(|ep| po.shader_stage == ep.stage && po.entry_point == ep.name) .ok_or(Error::EntryPointNotFound)?; Some(index) } None => None, }; self.write_logical_layout(ir_module, info, ep_index)?; self.write_physical_layout(); self.physical_layout.in_words(words); self.logical_layout.in_words(words); Ok(()) } /// Return the set of capabilities the last module written used. pub const fn get_capabilities_used(&self) -> &crate::FastHashSet { &self.capabilities_used } } #[test] fn test_write_physical_layout() { let mut writer = Writer::new(&Options::default()).unwrap(); assert_eq!(writer.physical_layout.bound, 0); writer.write_physical_layout(); assert_eq!(writer.physical_layout.bound, 3); } ================================================ FILE: lib/naga/src/back/wgsl/mod.rs ================================================ /*! Backend for [WGSL][wgsl] (WebGPU Shading Language). [wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html */ mod writer; use thiserror::Error; pub use writer::{Writer, WriterFlags}; #[derive(Error, Debug)] pub enum Error { #[error(transparent)] FmtError(#[from] std::fmt::Error), #[error("{0}")] Custom(String), #[error("{0}")] Unimplemented(String), // TODO: Error used only during development #[error("Unsupported math function: {0:?}")] UnsupportedMathFunction(crate::MathFunction), #[error("Unsupported relational function: {0:?}")] UnsupportedRelationalFunction(crate::RelationalFunction), } pub fn write_string( module: &crate::Module, info: &crate::valid::ModuleInfo, flags: WriterFlags, ) -> Result { let mut w = Writer::new(String::new(), flags); w.write(module, info)?; let output = w.finish(); Ok(output) } impl crate::AtomicFunction { const fn to_wgsl(self) -> &'static str { match self { Self::Add => "Add", Self::Subtract => "Sub", Self::And => "And", Self::InclusiveOr => "Or", Self::ExclusiveOr => "Xor", Self::Min => "Min", Self::Max => "Max", Self::Exchange { compare: None } => "Exchange", Self::Exchange { .. } => "CompareExchangeWeak", } } } ================================================ FILE: lib/naga/src/back/wgsl/writer.rs ================================================ use super::Error; use crate::{ back, proc::{self, NameKey}, valid, Handle, Module, ShaderStage, TypeInner, }; use std::fmt::Write; /// Shorthand result used internally by the backend type BackendResult = Result<(), Error>; /// WGSL [attribute](https://gpuweb.github.io/gpuweb/wgsl/#attributes) enum Attribute { Binding(u32), BuiltIn(crate::BuiltIn), Group(u32), Invariant, Interpolate(Option, Option), Location(u32), Stage(ShaderStage), WorkGroupSize([u32; 3]), } /// The WGSL form that `write_expr_with_indirection` should use to render a Naga /// expression. /// /// Sometimes a Naga `Expression` alone doesn't provide enough information to /// choose the right rendering for it in WGSL. For example, one natural WGSL /// rendering of a Naga `LocalVariable(x)` expression might be `&x`, since /// `LocalVariable` produces a pointer to the local variable's storage. But when /// rendering a `Store` statement, the `pointer` operand must be the left hand /// side of a WGSL assignment, so the proper rendering is `x`. /// /// The caller of `write_expr_with_indirection` must provide an `Expected` value /// to indicate how ambiguous expressions should be rendered. #[derive(Clone, Copy, Debug)] enum Indirection { /// Render pointer-construction expressions as WGSL `ptr`-typed expressions. /// /// This is the right choice for most cases. Whenever a Naga pointer /// expression is not the `pointer` operand of a `Load` or `Store`, it /// must be a WGSL pointer expression. Ordinary, /// Render pointer-construction expressions as WGSL reference-typed /// expressions. /// /// For example, this is the right choice for the `pointer` operand when /// rendering a `Store` statement as a WGSL assignment. Reference, } bitflags::bitflags! { #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct WriterFlags: u32 { /// Always annotate the type information instead of inferring. const EXPLICIT_TYPES = 0x1; } } pub struct Writer { out: W, flags: WriterFlags, names: crate::FastHashMap, namer: proc::Namer, named_expressions: crate::NamedExpressions, ep_results: Vec<(ShaderStage, Handle)>, } impl Writer { pub fn new(out: W, flags: WriterFlags) -> Self { Writer { out, flags, names: crate::FastHashMap::default(), namer: proc::Namer::default(), named_expressions: crate::NamedExpressions::default(), ep_results: vec![], } } fn reset(&mut self, module: &Module) { self.names.clear(); self.namer.reset( module, crate::keywords::wgsl::RESERVED, // an identifier must not start with two underscore &["__"], &mut self.names, ); self.named_expressions.clear(); self.ep_results.clear(); } pub fn write(&mut self, module: &Module, info: &valid::ModuleInfo) -> BackendResult { self.reset(module); // Save all ep result types for (_, ep) in module.entry_points.iter().enumerate() { if let Some(ref result) = ep.function.result { self.ep_results.push((ep.stage, result.ty)); } } // Write all structs for (handle, ty) in module.types.iter() { if let TypeInner::Struct { ref members, span: _, } = ty.inner { self.write_struct(module, handle, members)?; writeln!(self.out)?; } } // Write all constants for (handle, constant) in module.constants.iter() { if constant.name.is_some() { self.write_global_constant(module, &constant.inner, handle)?; } } // Write all globals for (ty, global) in module.global_variables.iter() { self.write_global(module, global, ty)?; } if !module.global_variables.is_empty() { // Add extra newline for readability writeln!(self.out)?; } // Write all regular functions for (handle, function) in module.functions.iter() { let fun_info = &info[handle]; let func_ctx = back::FunctionCtx { ty: back::FunctionType::Function(handle), info: fun_info, expressions: &function.expressions, named_expressions: &function.named_expressions, }; // Write the function self.write_function(module, function, &func_ctx)?; writeln!(self.out)?; } // Write all entry points for (index, ep) in module.entry_points.iter().enumerate() { let attributes = match ep.stage { ShaderStage::Vertex | ShaderStage::Fragment => vec![Attribute::Stage(ep.stage)], ShaderStage::Compute => vec![ Attribute::Stage(ShaderStage::Compute), Attribute::WorkGroupSize(ep.workgroup_size), ], }; self.write_attributes(&attributes)?; // Add a newline after attribute writeln!(self.out)?; let func_ctx = back::FunctionCtx { ty: back::FunctionType::EntryPoint(index as u16), info: info.get_entry_point(index), expressions: &ep.function.expressions, named_expressions: &ep.function.named_expressions, }; self.write_function(module, &ep.function, &func_ctx)?; if index < module.entry_points.len() - 1 { writeln!(self.out)?; } } Ok(()) } /// Helper method used to write [`ScalarValue`](crate::ScalarValue) /// /// # Notes /// Adds no trailing or leading whitespace fn write_scalar_value(&mut self, value: crate::ScalarValue) -> BackendResult { use crate::ScalarValue as Sv; match value { Sv::Sint(value) => write!(self.out, "{}", value)?, Sv::Uint(value) => write!(self.out, "{}u", value)?, // Floats are written using `Debug` instead of `Display` because it always appends the // decimal part even it's zero Sv::Float(value) => write!(self.out, "{:?}", value)?, Sv::Bool(value) => write!(self.out, "{}", value)?, } Ok(()) } /// Helper method used to write struct name /// /// # Notes /// Adds no trailing or leading whitespace fn write_struct_name(&mut self, module: &Module, handle: Handle) -> BackendResult { if module.types[handle].name.is_none() { if let Some(&(stage, _)) = self.ep_results.iter().find(|&&(_, ty)| ty == handle) { let name = match stage { ShaderStage::Compute => "ComputeOutput", ShaderStage::Fragment => "FragmentOutput", ShaderStage::Vertex => "VertexOutput", }; write!(self.out, "{}", name)?; return Ok(()); } } write!(self.out, "{}", self.names[&NameKey::Type(handle)])?; Ok(()) } /// Helper method used to write /// [functions](https://gpuweb.github.io/gpuweb/wgsl/#functions) /// /// # Notes /// Ends in a newline fn write_function( &mut self, module: &Module, func: &crate::Function, func_ctx: &back::FunctionCtx<'_>, ) -> BackendResult { let func_name = match func_ctx.ty { back::FunctionType::EntryPoint(index) => &self.names[&NameKey::EntryPoint(index)], back::FunctionType::Function(handle) => &self.names[&NameKey::Function(handle)], }; // Write function name write!(self.out, "fn {}(", func_name)?; // Write function arguments for (index, arg) in func.arguments.iter().enumerate() { // Write argument attribute if a binding is present if let Some(ref binding) = arg.binding { self.write_attributes(&map_binding_to_attribute( binding, module.types[arg.ty].inner.scalar_kind(), ))?; } // Write argument name let argument_name = match func_ctx.ty { back::FunctionType::Function(handle) => { &self.names[&NameKey::FunctionArgument(handle, index as u32)] } back::FunctionType::EntryPoint(ep_index) => { &self.names[&NameKey::EntryPointArgument(ep_index, index as u32)] } }; write!(self.out, "{}: ", argument_name)?; // Write argument type self.write_type(module, arg.ty)?; if index < func.arguments.len() - 1 { // Add a separator between args write!(self.out, ", ")?; } } write!(self.out, ")")?; // Write function return type if let Some(ref result) = func.result { write!(self.out, " -> ")?; if let Some(ref binding) = result.binding { self.write_attributes(&map_binding_to_attribute( binding, module.types[result.ty].inner.scalar_kind(), ))?; } self.write_type(module, result.ty)?; } write!(self.out, " {{")?; writeln!(self.out)?; // Write function local variables for (handle, local) in func.local_variables.iter() { // Write indentation (only for readability) write!(self.out, "{}", back::INDENT)?; // Write the local name // The leading space is important write!(self.out, "var {}: ", self.names[&func_ctx.name_key(handle)])?; // Write the local type self.write_type(module, local.ty)?; // Write the local initializer if needed if let Some(init) = local.init { // Put the equal signal only if there's a initializer // The leading and trailing spaces aren't needed but help with readability write!(self.out, " = ")?; // Write the constant // `write_constant` adds no trailing or leading space/newline self.write_constant(module, init)?; } // Finish the local with `;` and add a newline (only for readability) writeln!(self.out, ";")? } if !func.local_variables.is_empty() { writeln!(self.out)?; } // Write the function body (statement list) for sta in func.body.iter() { // The indentation should always be 1 when writing the function body self.write_stmt(module, sta, func_ctx, back::Level(1))?; } writeln!(self.out, "}}")?; self.named_expressions.clear(); Ok(()) } /// Helper method to write a attribute fn write_attributes(&mut self, attributes: &[Attribute]) -> BackendResult { for attribute in attributes { match *attribute { Attribute::Location(id) => write!(self.out, "@location({}) ", id)?, Attribute::BuiltIn(builtin_attrib) => { if let Some(builtin) = builtin_str(builtin_attrib) { write!(self.out, "@builtin({}) ", builtin)?; } else { log::warn!("Unsupported builtin attribute: {:?}", builtin_attrib); } } Attribute::Stage(shader_stage) => { let stage_str = match shader_stage { ShaderStage::Vertex => "vertex", ShaderStage::Fragment => "fragment", ShaderStage::Compute => "compute", }; write!(self.out, "@{} ", stage_str)?; } Attribute::WorkGroupSize(size) => { write!( self.out, "@workgroup_size({}, {}, {}) ", size[0], size[1], size[2] )?; } Attribute::Binding(id) => write!(self.out, "@binding({}) ", id)?, Attribute::Group(id) => write!(self.out, "@group({}) ", id)?, Attribute::Invariant => write!(self.out, "@invariant ")?, Attribute::Interpolate(interpolation, sampling) => { if sampling.is_some() && sampling != Some(crate::Sampling::Center) { write!( self.out, "@interpolate({}, {}) ", interpolation_str( interpolation.unwrap_or(crate::Interpolation::Perspective) ), sampling_str(sampling.unwrap_or(crate::Sampling::Center)) )?; } else if interpolation.is_some() && interpolation != Some(crate::Interpolation::Perspective) { write!( self.out, "@interpolate({}) ", interpolation_str( interpolation.unwrap_or(crate::Interpolation::Perspective) ) )?; } } }; } Ok(()) } /// Helper method used to write structs /// /// # Notes /// Ends in a newline fn write_struct( &mut self, module: &Module, handle: Handle, members: &[crate::StructMember], ) -> BackendResult { write!(self.out, "struct ")?; self.write_struct_name(module, handle)?; write!(self.out, " {{")?; writeln!(self.out)?; for (index, member) in members.iter().enumerate() { // Skip struct member with unsupported built in if let Some(crate::Binding::BuiltIn(built_in)) = member.binding { if builtin_str(built_in).is_none() { log::warn!("Skip member with unsupported builtin {:?}", built_in); continue; } } // The indentation is only for readability write!(self.out, "{}", back::INDENT)?; if let Some(ref binding) = member.binding { self.write_attributes(&map_binding_to_attribute( binding, module.types[member.ty].inner.scalar_kind(), ))?; } // Write struct member name and type let member_name = &self.names[&NameKey::StructMember(handle, index as u32)]; write!(self.out, "{}: ", member_name)?; self.write_type(module, member.ty)?; write!(self.out, ",")?; writeln!(self.out)?; } write!(self.out, "}}")?; writeln!(self.out)?; Ok(()) } /// Helper method used to write non image/sampler types /// /// # Notes /// Adds no trailing or leading whitespace fn write_type(&mut self, module: &Module, ty: Handle) -> BackendResult { let inner = &module.types[ty].inner; match *inner { TypeInner::Struct { .. } => self.write_struct_name(module, ty)?, ref other => self.write_value_type(module, other)?, } Ok(()) } /// Helper method used to write value types /// /// # Notes /// Adds no trailing or leading whitespace fn write_value_type(&mut self, module: &Module, inner: &TypeInner) -> BackendResult { match *inner { TypeInner::Vector { size, kind, .. } => write!( self.out, "vec{}<{}>", back::vector_size_str(size), scalar_kind_str(kind), )?, TypeInner::Sampler { comparison: false } => { write!(self.out, "sampler")?; } TypeInner::Sampler { comparison: true } => { write!(self.out, "sampler_comparison")?; } TypeInner::Image { dim, arrayed, class, } => { // More about texture types: https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type use crate::ImageClass as Ic; let dim_str = image_dimension_str(dim); let arrayed_str = if arrayed { "_array" } else { "" }; let (class_str, multisampled_str, format_str, storage_str) = match class { Ic::Sampled { kind, multi } => ( "", if multi { "multisampled_" } else { "" }, scalar_kind_str(kind), "", ), Ic::Depth { multi } => { ("depth_", if multi { "multisampled_" } else { "" }, "", "") } Ic::Storage { format, access } => ( "storage_", "", storage_format_str(format), if access.contains(crate::StorageAccess::LOAD | crate::StorageAccess::STORE) { ",read_write" } else if access.contains(crate::StorageAccess::LOAD) { ",read" } else { ",write" }, ), }; write!( self.out, "texture_{}{}{}{}", class_str, multisampled_str, dim_str, arrayed_str )?; if !format_str.is_empty() { write!(self.out, "<{}{}>", format_str, storage_str)?; } } TypeInner::Scalar { kind, .. } => { write!(self.out, "{}", scalar_kind_str(kind))?; } TypeInner::Atomic { kind, .. } => { write!(self.out, "atomic<{}>", scalar_kind_str(kind))?; } TypeInner::Array { base, size, stride: _, } => { // More info https://gpuweb.github.io/gpuweb/wgsl/#array-types // array -- Constant array // array -- Dynamic array write!(self.out, "array<")?; match size { crate::ArraySize::Constant(handle) => { self.write_type(module, base)?; write!(self.out, ",")?; self.write_constant(module, handle)?; } crate::ArraySize::Dynamic => { self.write_type(module, base)?; } } write!(self.out, ">")?; } TypeInner::BindingArray { base, size } => { // More info https://github.com/gpuweb/gpuweb/issues/2105 write!(self.out, "binding_array<")?; match size { crate::ArraySize::Constant(handle) => { self.write_type(module, base)?; write!(self.out, ",")?; self.write_constant(module, handle)?; } crate::ArraySize::Dynamic => { self.write_type(module, base)?; } } write!(self.out, ">")?; } TypeInner::Matrix { columns, rows, width: _, } => { write!( self.out, //TODO: Can matrix be other than f32? "mat{}x{}", back::vector_size_str(columns), back::vector_size_str(rows), )?; } TypeInner::Pointer { base, space } => { let (address, maybe_access) = address_space_str(space); // Everything but `AddressSpace::Handle` gives us a `address` name, but // Naga IR never produces pointers to handles, so it doesn't matter much // how we write such a type. Just write it as the base type alone. if let Some(space) = address { write!(self.out, "ptr<{}, ", space)?; } self.write_type(module, base)?; if address.is_some() { if let Some(access) = maybe_access { write!(self.out, ", {}", access)?; } write!(self.out, ">")?; } } TypeInner::ValuePointer { size: None, kind, width: _, space, } => { let (address, maybe_access) = address_space_str(space); if let Some(space) = address { write!(self.out, "ptr<{}, {}", space, scalar_kind_str(kind))?; if let Some(access) = maybe_access { write!(self.out, ", {}", access)?; } write!(self.out, ">")?; } else { return Err(Error::Unimplemented(format!( "ValuePointer to AddressSpace::Handle {:?}", inner ))); } } TypeInner::ValuePointer { size: Some(size), kind, width: _, space, } => { let (address, maybe_access) = address_space_str(space); if let Some(space) = address { write!( self.out, "ptr<{}, vec{}<{}>", space, back::vector_size_str(size), scalar_kind_str(kind) )?; if let Some(access) = maybe_access { write!(self.out, ", {}", access)?; } write!(self.out, ">")?; } else { return Err(Error::Unimplemented(format!( "ValuePointer to AddressSpace::Handle {:?}", inner ))); } write!(self.out, ">")?; } _ => { return Err(Error::Unimplemented(format!( "write_value_type {:?}", inner ))); } } Ok(()) } /// Helper method used to write statements /// /// # Notes /// Always adds a newline fn write_stmt( &mut self, module: &Module, stmt: &crate::Statement, func_ctx: &back::FunctionCtx<'_>, level: back::Level, ) -> BackendResult { use crate::{Expression, Statement}; match *stmt { Statement::Emit(ref range) => { for handle in range.clone() { let info = &func_ctx.info[handle]; let expr_name = if let Some(name) = func_ctx.named_expressions.get(&handle) { // Front end provides names for all variables at the start of writing. // But we write them to step by step. We need to recache them // Otherwise, we could accidentally write variable name instead of full expression. // Also, we use sanitized names! It defense backend from generating variable with name from reserved keywords. Some(self.namer.call(name)) } else if info.ref_count == 0 { write!(self.out, "{}_ = ", level)?; self.write_expr(module, handle, func_ctx)?; writeln!(self.out, ";")?; continue; } else { let expr = &func_ctx.expressions[handle]; let min_ref_count = expr.bake_ref_count(); // Forcefully creating baking expressions in some cases to help with readability let required_baking_expr = match *expr { Expression::ImageLoad { .. } | Expression::ImageQuery { .. } | Expression::ImageSample { .. } => true, _ => false, }; if min_ref_count <= info.ref_count || required_baking_expr { // If expression contains unsupported builtin we should skip it if let Expression::Load { pointer } = func_ctx.expressions[handle] { if let Expression::AccessIndex { base, index } = func_ctx.expressions[pointer] { if access_to_unsupported_builtin( base, index, module, func_ctx.info, ) { return Ok(()); } } } Some(format!("{}{}", back::BAKE_PREFIX, handle.index())) } else { None } }; if let Some(name) = expr_name { write!(self.out, "{}", level)?; self.start_named_expr(module, handle, func_ctx, &name)?; self.write_expr(module, handle, func_ctx)?; self.named_expressions.insert(handle, name); writeln!(self.out, ";")?; } } } // TODO: copy-paste from glsl-out Statement::If { condition, ref accept, ref reject, } => { write!(self.out, "{}", level)?; write!(self.out, "if ")?; self.write_expr(module, condition, func_ctx)?; writeln!(self.out, " {{")?; let l2 = level.next(); for sta in accept { // Increase indentation to help with readability self.write_stmt(module, sta, func_ctx, l2)?; } // If there are no statements in the reject block we skip writing it // This is only for readability if !reject.is_empty() { writeln!(self.out, "{}}} else {{", level)?; for sta in reject { // Increase indentation to help with readability self.write_stmt(module, sta, func_ctx, l2)?; } } writeln!(self.out, "{}}}", level)? } Statement::Return { value } => { write!(self.out, "{}", level)?; write!(self.out, "return")?; if let Some(return_value) = value { // The leading space is important write!(self.out, " ")?; self.write_expr(module, return_value, func_ctx)?; } writeln!(self.out, ";")?; } // TODO: copy-paste from glsl-out Statement::Kill => { write!(self.out, "{}", level)?; writeln!(self.out, "discard;")? } Statement::Store { pointer, value } => { // WGSL does not support all SPIR-V builtins and we should skip it in generated shaders. // We already skip them when we generate struct type. // Now we need to find expression that used struct with ignored builtins if let Expression::AccessIndex { base, index } = func_ctx.expressions[pointer] { if access_to_unsupported_builtin(base, index, module, func_ctx.info) { return Ok(()); } } write!(self.out, "{}", level)?; let is_atomic = match *func_ctx.info[pointer].ty.inner_with(&module.types) { crate::TypeInner::Pointer { base, .. } => match module.types[base].inner { crate::TypeInner::Atomic { .. } => true, _ => false, }, _ => false, }; if is_atomic { write!(self.out, "atomicStore(")?; self.write_expr(module, pointer, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, value, func_ctx)?; write!(self.out, ")")?; } else { self.write_expr_with_indirection( module, pointer, func_ctx, Indirection::Reference, )?; write!(self.out, " = ")?; self.write_expr(module, value, func_ctx)?; } writeln!(self.out, ";")? } Statement::Call { function, ref arguments, result, } => { write!(self.out, "{}", level)?; if let Some(expr) = result { let name = format!("{}{}", back::BAKE_PREFIX, expr.index()); self.start_named_expr(module, expr, func_ctx, &name)?; self.named_expressions.insert(expr, name); } let func_name = &self.names[&NameKey::Function(function)]; write!(self.out, "{}(", func_name)?; for (index, &argument) in arguments.iter().enumerate() { self.write_expr(module, argument, func_ctx)?; // Only write a comma if isn't the last element if index != arguments.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } writeln!(self.out, ");")? } Statement::Atomic { pointer, ref fun, value, result, } => { write!(self.out, "{}", level)?; let res_name = format!("{}{}", back::BAKE_PREFIX, result.index()); self.start_named_expr(module, result, func_ctx, &res_name)?; self.named_expressions.insert(result, res_name); let fun_str = fun.to_wgsl(); write!(self.out, "atomic{}(", fun_str)?; self.write_expr(module, pointer, func_ctx)?; if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun { write!(self.out, ", ")?; self.write_expr(module, cmp, func_ctx)?; } write!(self.out, ", ")?; self.write_expr(module, value, func_ctx)?; writeln!(self.out, ");")? } Statement::ImageStore { image, coordinate, array_index, value, } => { write!(self.out, "{}", level)?; write!(self.out, "textureStore(")?; self.write_expr(module, image, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, coordinate, func_ctx)?; if let Some(array_index_expr) = array_index { write!(self.out, ", ")?; self.write_expr(module, array_index_expr, func_ctx)?; } write!(self.out, ", ")?; self.write_expr(module, value, func_ctx)?; writeln!(self.out, ");")?; } // TODO: copy-paste from glsl-out Statement::Block(ref block) => { write!(self.out, "{}", level)?; writeln!(self.out, "{{")?; for sta in block.iter() { // Increase the indentation to help with readability self.write_stmt(module, sta, func_ctx, level.next())? } writeln!(self.out, "{}}}", level)? } Statement::Switch { selector, ref cases, } => { // Start the switch write!(self.out, "{}", level)?; write!(self.out, "switch ")?; self.write_expr(module, selector, func_ctx)?; writeln!(self.out, " {{")?; let type_postfix = match *func_ctx.info[selector].ty.inner_with(&module.types) { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, .. } => "u", _ => "", }; let l2 = level.next(); if !cases.is_empty() { for case in cases { match case.value { crate::SwitchValue::Integer(value) => { writeln!(self.out, "{}case {}{}: {{", l2, value, type_postfix)?; } crate::SwitchValue::Default => { writeln!(self.out, "{}default: {{", l2)?; } } for sta in case.body.iter() { self.write_stmt(module, sta, func_ctx, l2.next())?; } if case.fall_through { writeln!(self.out, "{}fallthrough;", l2.next())?; } writeln!(self.out, "{}}}", l2)?; } } writeln!(self.out, "{}}}", level)? } Statement::Loop { ref body, ref continuing, break_if, } => { write!(self.out, "{}", level)?; writeln!(self.out, "loop {{")?; let l2 = level.next(); for sta in body.iter() { self.write_stmt(module, sta, func_ctx, l2)?; } // The continuing is optional so we don't need to write it if // it is empty, but the `break if` counts as a continuing statement // so even if `continuing` is empty we must generate it if a // `break if` exists if !continuing.is_empty() || break_if.is_some() { writeln!(self.out, "{}continuing {{", l2)?; for sta in continuing.iter() { self.write_stmt(module, sta, func_ctx, l2.next())?; } // The `break if` is always the last // statement of the `continuing` block if let Some(condition) = break_if { // The trailing space is important write!(self.out, "{}break if ", l2.next())?; self.write_expr(module, condition, func_ctx)?; // Close the `break if` statement writeln!(self.out, ";")?; } writeln!(self.out, "{}}}", l2)?; } writeln!(self.out, "{}}}", level)? } Statement::Break => { writeln!(self.out, "{}break;", level)?; } Statement::Continue => { writeln!(self.out, "{}continue;", level)?; } Statement::Barrier(barrier) => { if barrier.contains(crate::Barrier::STORAGE) { writeln!(self.out, "{}storageBarrier();", level)?; } if barrier.contains(crate::Barrier::WORK_GROUP) { writeln!(self.out, "{}workgroupBarrier();", level)?; } } } Ok(()) } /// Return the sort of indirection that `expr`'s plain form evaluates to. /// /// An expression's 'plain form' is the most general rendition of that /// expression into WGSL, lacking `&` or `*` operators: /// /// - The plain form of `LocalVariable(x)` is simply `x`, which is a reference /// to the local variable's storage. /// /// - The plain form of `GlobalVariable(g)` is simply `g`, which is usually a /// reference to the global variable's storage. However, globals in the /// `Handle` address space are immutable, and `GlobalVariable` expressions for /// those produce the value directly, not a pointer to it. Such /// `GlobalVariable` expressions are `Ordinary`. /// /// - `Access` and `AccessIndex` are `Reference` when their `base` operand is a /// pointer. If they are applied directly to a composite value, they are /// `Ordinary`. /// /// Note that `FunctionArgument` expressions are never `Reference`, even when /// the argument's type is `Pointer`. `FunctionArgument` always evaluates to the /// argument's value directly, so any pointer it produces is merely the value /// passed by the caller. fn plain_form_indirection( &self, expr: Handle, module: &Module, func_ctx: &back::FunctionCtx<'_>, ) -> Indirection { use crate::Expression as Ex; // Named expressions are `let` expressions, which apply the Load Rule, // so if their type is a Naga pointer, then that must be a WGSL pointer // as well. if self.named_expressions.contains_key(&expr) { return Indirection::Ordinary; } match func_ctx.expressions[expr] { Ex::LocalVariable(_) => Indirection::Reference, Ex::GlobalVariable(handle) => { let global = &module.global_variables[handle]; match global.space { crate::AddressSpace::Handle => Indirection::Ordinary, _ => Indirection::Reference, } } Ex::Access { base, .. } | Ex::AccessIndex { base, .. } => { let base_ty = func_ctx.info[base].ty.inner_with(&module.types); match *base_ty { crate::TypeInner::Pointer { .. } | crate::TypeInner::ValuePointer { .. } => { Indirection::Reference } _ => Indirection::Ordinary, } } _ => Indirection::Ordinary, } } fn start_named_expr( &mut self, module: &Module, handle: Handle, func_ctx: &back::FunctionCtx, name: &str, ) -> BackendResult { // Write variable name write!(self.out, "let {}", name)?; if self.flags.contains(WriterFlags::EXPLICIT_TYPES) { write!(self.out, ": ")?; let ty = &func_ctx.info[handle].ty; // Write variable type match *ty { proc::TypeResolution::Handle(handle) => { self.write_type(module, handle)?; } proc::TypeResolution::Value(ref inner) => { self.write_value_type(module, inner)?; } } } write!(self.out, " = ")?; Ok(()) } /// Write the ordinary WGSL form of `expr`. /// /// See `write_expr_with_indirection` for details. fn write_expr( &mut self, module: &Module, expr: Handle, func_ctx: &back::FunctionCtx<'_>, ) -> BackendResult { self.write_expr_with_indirection(module, expr, func_ctx, Indirection::Ordinary) } /// Write `expr` as a WGSL expression with the requested indirection. /// /// In terms of the WGSL grammar, the resulting expression is a /// `singular_expression`. It may be parenthesized. This makes it suitable /// for use as the operand of a unary or binary operator without worrying /// about precedence. /// /// This does not produce newlines or indentation. /// /// The `requested` argument indicates (roughly) whether Naga /// `Pointer`-valued expressions represent WGSL references or pointers. See /// `Indirection` for details. fn write_expr_with_indirection( &mut self, module: &Module, expr: Handle, func_ctx: &back::FunctionCtx<'_>, requested: Indirection, ) -> BackendResult { // If the plain form of the expression is not what we need, emit the // operator necessary to correct that. let plain = self.plain_form_indirection(expr, module, func_ctx); match (requested, plain) { (Indirection::Ordinary, Indirection::Reference) => { write!(self.out, "(&")?; self.write_expr_plain_form(module, expr, func_ctx, plain)?; write!(self.out, ")")?; } (Indirection::Reference, Indirection::Ordinary) => { write!(self.out, "(*")?; self.write_expr_plain_form(module, expr, func_ctx, plain)?; write!(self.out, ")")?; } (_, _) => self.write_expr_plain_form(module, expr, func_ctx, plain)?, } Ok(()) } /// Write the 'plain form' of `expr`. /// /// An expression's 'plain form' is the most general rendition of that /// expression into WGSL, lacking `&` or `*` operators. The plain forms of /// `LocalVariable(x)` and `GlobalVariable(g)` are simply `x` and `g`. Such /// Naga expressions represent both WGSL pointers and references; it's the /// caller's responsibility to distinguish those cases appropriately. fn write_expr_plain_form( &mut self, module: &Module, expr: Handle, func_ctx: &back::FunctionCtx<'_>, indirection: Indirection, ) -> BackendResult { use crate::Expression; if let Some(name) = self.named_expressions.get(&expr) { write!(self.out, "{}", name)?; return Ok(()); } let expression = &func_ctx.expressions[expr]; // Write the plain WGSL form of a Naga expression. // // The plain form of `LocalVariable` and `GlobalVariable` expressions is // simply the variable name; `*` and `&` operators are never emitted. // // The plain form of `Access` and `AccessIndex` expressions are WGSL // `postfix_expression` forms for member/component access and // subscripting. match *expression { Expression::Constant(constant) => self.write_constant(module, constant)?, Expression::Compose { ty, ref components } => { self.write_type(module, ty)?; write!(self.out, "(")?; // !spv-in specific notes! // WGSL does not support all SPIR-V builtins and we should skip it in generated shaders. // We already skip them when we generate struct type. // Now we need to find components that used struct with ignored builtins. // So, why we can't just return the error to a user? // We can, but otherwise, we can't generate WGSL shader from any glslang SPIR-V shaders. // glslang generates gl_PerVertex struct with gl_CullDistance, gl_ClipDistance and gl_PointSize builtin inside by default. // All of them are not supported by WGSL. // We need to copy components to another vec because we don't know which of them we should write. let mut components_to_write = Vec::with_capacity(components.len()); for component in components { let mut skip_component = false; if let Expression::Load { pointer } = func_ctx.expressions[*component] { if let Expression::AccessIndex { base, index } = func_ctx.expressions[pointer] { if access_to_unsupported_builtin(base, index, module, func_ctx.info) { skip_component = true; } } } if skip_component { continue; } else { components_to_write.push(*component); } } // non spv-in specific notes! // Real `Expression::Compose` logic generates here. for (index, component) in components_to_write.iter().enumerate() { self.write_expr(module, *component, func_ctx)?; // Only write a comma if isn't the last element if index != components_to_write.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } write!(self.out, ")")? } Expression::FunctionArgument(pos) => { let name_key = func_ctx.argument_key(pos); let name = &self.names[&name_key]; write!(self.out, "{}", name)?; } Expression::Binary { op, left, right } => { write!(self.out, "(")?; self.write_expr(module, left, func_ctx)?; write!(self.out, " {} ", back::binary_operation_str(op))?; self.write_expr(module, right, func_ctx)?; write!(self.out, ")")?; } Expression::Access { base, index } => { self.write_expr_with_indirection(module, base, func_ctx, indirection)?; write!(self.out, "[")?; self.write_expr(module, index, func_ctx)?; write!(self.out, "]")? } Expression::AccessIndex { base, index } => { let base_ty_res = &func_ctx.info[base].ty; let mut resolved = base_ty_res.inner_with(&module.types); self.write_expr_with_indirection(module, base, func_ctx, indirection)?; let base_ty_handle = match *resolved { TypeInner::Pointer { base, space: _ } => { resolved = &module.types[base].inner; Some(base) } _ => base_ty_res.handle(), }; match *resolved { TypeInner::Vector { .. } => { // Write vector access as a swizzle write!(self.out, ".{}", back::COMPONENTS[index as usize])? } TypeInner::Matrix { .. } | TypeInner::Array { .. } | TypeInner::BindingArray { .. } | TypeInner::ValuePointer { .. } => write!(self.out, "[{}]", index)?, TypeInner::Struct { .. } => { // This will never panic in case the type is a `Struct`, this is not true // for other types so we can only check while inside this match arm let ty = base_ty_handle.unwrap(); write!( self.out, ".{}", &self.names[&NameKey::StructMember(ty, index)] )? } ref other => return Err(Error::Custom(format!("Cannot index {:?}", other))), } } Expression::ImageSample { image, sampler, gather: None, coordinate, array_index, offset, level, depth_ref, } => { use crate::SampleLevel as Sl; let suffix_cmp = match depth_ref { Some(_) => "Compare", None => "", }; let suffix_level = match level { Sl::Auto => "", Sl::Zero | Sl::Exact(_) => "Level", Sl::Bias(_) => "Bias", Sl::Gradient { .. } => "Grad", }; write!(self.out, "textureSample{}{}(", suffix_cmp, suffix_level)?; self.write_expr(module, image, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, sampler, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, coordinate, func_ctx)?; if let Some(array_index) = array_index { write!(self.out, ", ")?; self.write_expr(module, array_index, func_ctx)?; } if let Some(depth_ref) = depth_ref { write!(self.out, ", ")?; self.write_expr(module, depth_ref, func_ctx)?; } match level { Sl::Auto => {} Sl::Zero => { // Level 0 is implied for depth comparison if depth_ref.is_none() { write!(self.out, ", 0.0")?; } } Sl::Exact(expr) => { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } Sl::Bias(expr) => { write!(self.out, ", ")?; self.write_expr(module, expr, func_ctx)?; } Sl::Gradient { x, y } => { write!(self.out, ", ")?; self.write_expr(module, x, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, y, func_ctx)?; } } if let Some(offset) = offset { write!(self.out, ", ")?; self.write_constant(module, offset)?; } write!(self.out, ")")?; } Expression::ImageSample { image, sampler, gather: Some(component), coordinate, array_index, offset, level: _, depth_ref, } => { let suffix_cmp = match depth_ref { Some(_) => "Compare", None => "", }; write!(self.out, "textureGather{}(", suffix_cmp)?; match *func_ctx.info[image].ty.inner_with(&module.types) { TypeInner::Image { class: crate::ImageClass::Depth { multi: _ }, .. } => {} _ => { write!(self.out, "{}, ", component as u8)?; } } self.write_expr(module, image, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, sampler, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, coordinate, func_ctx)?; if let Some(array_index) = array_index { write!(self.out, ", ")?; self.write_expr(module, array_index, func_ctx)?; } if let Some(depth_ref) = depth_ref { write!(self.out, ", ")?; self.write_expr(module, depth_ref, func_ctx)?; } if let Some(offset) = offset { write!(self.out, ", ")?; self.write_constant(module, offset)?; } write!(self.out, ")")?; } Expression::ImageQuery { image, query } => { use crate::ImageQuery as Iq; let texture_function = match query { Iq::Size { .. } => "textureDimensions", Iq::NumLevels => "textureNumLevels", Iq::NumLayers => "textureNumLayers", Iq::NumSamples => "textureNumSamples", }; write!(self.out, "{}(", texture_function)?; self.write_expr(module, image, func_ctx)?; if let Iq::Size { level: Some(level) } = query { write!(self.out, ", ")?; self.write_expr(module, level, func_ctx)?; }; write!(self.out, ")")?; } Expression::ImageLoad { image, coordinate, array_index, sample, level, } => { write!(self.out, "textureLoad(")?; self.write_expr(module, image, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, coordinate, func_ctx)?; if let Some(array_index) = array_index { write!(self.out, ", ")?; self.write_expr(module, array_index, func_ctx)?; } if let Some(index) = sample.or(level) { write!(self.out, ", ")?; self.write_expr(module, index, func_ctx)?; } write!(self.out, ")")?; } Expression::GlobalVariable(handle) => { let name = &self.names[&NameKey::GlobalVariable(handle)]; write!(self.out, "{}", name)?; } Expression::As { expr, kind, convert, } => { let inner = func_ctx.info[expr].ty.inner_with(&module.types); match *inner { TypeInner::Matrix { columns, rows, .. } => { write!( self.out, "mat{}x{}", back::vector_size_str(columns), back::vector_size_str(rows) )?; } TypeInner::Vector { size, .. } => { let vector_size_str = back::vector_size_str(size); let scalar_kind_str = scalar_kind_str(kind); if convert.is_some() { write!(self.out, "vec{}<{}>", vector_size_str, scalar_kind_str)?; } else { write!( self.out, "bitcast>", vector_size_str, scalar_kind_str )?; } } TypeInner::Scalar { .. } => { if convert.is_some() { write!(self.out, "{}", scalar_kind_str(kind))? } else { write!(self.out, "bitcast<{}>", scalar_kind_str(kind))? } } _ => { return Err(Error::Unimplemented(format!( "write_expr expression::as {:?}", inner ))); } }; write!(self.out, "(")?; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")?; } Expression::Splat { size, value } => { let inner = func_ctx.info[value].ty.inner_with(&module.types); let scalar_kind = match *inner { crate::TypeInner::Scalar { kind, .. } => kind, _ => { return Err(Error::Unimplemented(format!( "write_expr expression::splat {:?}", inner ))); } }; let scalar = scalar_kind_str(scalar_kind); let size = back::vector_size_str(size); write!(self.out, "vec{}<{}>(", size, scalar)?; self.write_expr(module, value, func_ctx)?; write!(self.out, ")")?; } Expression::Load { pointer } => { let is_atomic = match *func_ctx.info[pointer].ty.inner_with(&module.types) { crate::TypeInner::Pointer { base, .. } => match module.types[base].inner { crate::TypeInner::Atomic { .. } => true, _ => false, }, _ => false, }; if is_atomic { write!(self.out, "atomicLoad(")?; self.write_expr(module, pointer, func_ctx)?; write!(self.out, ")")?; } else { self.write_expr_with_indirection( module, pointer, func_ctx, Indirection::Reference, )?; } } Expression::LocalVariable(handle) => { write!(self.out, "{}", self.names[&func_ctx.name_key(handle)])? } Expression::ArrayLength(expr) => { write!(self.out, "arrayLength(")?; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")?; } Expression::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; enum Function { Asincosh { is_sin: bool }, Atanh, Regular(&'static str), } // NOTE: If https://github.com/gpuweb/gpuweb/issues/1622 ever is // accepted, replace this with the builtin functions let function = match fun { Mf::Abs => Function::Regular("abs"), Mf::Min => Function::Regular("min"), Mf::Max => Function::Regular("max"), Mf::Clamp => Function::Regular("clamp"), Mf::Saturate => Function::Regular("saturate"), // trigonometry Mf::Cos => Function::Regular("cos"), Mf::Cosh => Function::Regular("cosh"), Mf::Sin => Function::Regular("sin"), Mf::Sinh => Function::Regular("sinh"), Mf::Tan => Function::Regular("tan"), Mf::Tanh => Function::Regular("tanh"), Mf::Acos => Function::Regular("acos"), Mf::Asin => Function::Regular("asin"), Mf::Atan => Function::Regular("atan"), Mf::Atan2 => Function::Regular("atan2"), Mf::Asinh => Function::Asincosh { is_sin: true }, Mf::Acosh => Function::Asincosh { is_sin: false }, Mf::Atanh => Function::Atanh, Mf::Radians => Function::Regular("radians"), Mf::Degrees => Function::Regular("degrees"), // decomposition Mf::Ceil => Function::Regular("ceil"), Mf::Floor => Function::Regular("floor"), Mf::Round => Function::Regular("round"), Mf::Fract => Function::Regular("fract"), Mf::Trunc => Function::Regular("trunc"), Mf::Modf => Function::Regular("modf"), Mf::Frexp => Function::Regular("frexp"), Mf::Ldexp => Function::Regular("ldexp"), // exponent Mf::Exp => Function::Regular("exp"), Mf::Exp2 => Function::Regular("exp2"), Mf::Log => Function::Regular("log"), Mf::Log2 => Function::Regular("log2"), Mf::Pow => Function::Regular("pow"), // geometry Mf::Dot => Function::Regular("dot"), Mf::Outer => Function::Regular("outerProduct"), Mf::Cross => Function::Regular("cross"), Mf::Distance => Function::Regular("distance"), Mf::Length => Function::Regular("length"), Mf::Normalize => Function::Regular("normalize"), Mf::FaceForward => Function::Regular("faceForward"), Mf::Reflect => Function::Regular("reflect"), // computational Mf::Sign => Function::Regular("sign"), Mf::Fma => Function::Regular("fma"), Mf::Mix => Function::Regular("mix"), Mf::Step => Function::Regular("step"), Mf::SmoothStep => Function::Regular("smoothstep"), Mf::Sqrt => Function::Regular("sqrt"), Mf::InverseSqrt => Function::Regular("inverseSqrt"), Mf::Transpose => Function::Regular("transpose"), Mf::Determinant => Function::Regular("determinant"), // bits Mf::CountOneBits => Function::Regular("countOneBits"), Mf::ReverseBits => Function::Regular("reverseBits"), Mf::ExtractBits => Function::Regular("extractBits"), Mf::InsertBits => Function::Regular("insertBits"), Mf::FindLsb => Function::Regular("firstTrailingBit"), Mf::FindMsb => Function::Regular("firstLeadingBit"), // data packing Mf::Pack4x8snorm => Function::Regular("pack4x8snorm"), Mf::Pack4x8unorm => Function::Regular("pack4x8unorm"), Mf::Pack2x16snorm => Function::Regular("pack2x16snorm"), Mf::Pack2x16unorm => Function::Regular("pack2x16unorm"), Mf::Pack2x16float => Function::Regular("pack2x16float"), // data unpacking Mf::Unpack4x8snorm => Function::Regular("unpack4x8snorm"), Mf::Unpack4x8unorm => Function::Regular("unpack4x8unorm"), Mf::Unpack2x16snorm => Function::Regular("unpack2x16snorm"), Mf::Unpack2x16unorm => Function::Regular("unpack2x16unorm"), Mf::Unpack2x16float => Function::Regular("unpack2x16float"), _ => { return Err(Error::UnsupportedMathFunction(fun)); } }; match function { Function::Asincosh { is_sin } => { write!(self.out, "log(")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, " + sqrt(")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, " * ")?; self.write_expr(module, arg, func_ctx)?; match is_sin { true => write!(self.out, " + 1.0))")?, false => write!(self.out, " - 1.0))")?, } } Function::Atanh => { write!(self.out, "0.5 * log((1.0 + ")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, ") / (1.0 - ")?; self.write_expr(module, arg, func_ctx)?; write!(self.out, "))")?; } Function::Regular(fun_name) => { write!(self.out, "{}(", fun_name)?; self.write_expr(module, arg, func_ctx)?; if let Some(arg) = arg1 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } if let Some(arg) = arg2 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } if let Some(arg) = arg3 { write!(self.out, ", ")?; self.write_expr(module, arg, func_ctx)?; } write!(self.out, ")")? } } } Expression::Swizzle { size, vector, pattern, } => { self.write_expr(module, vector, func_ctx)?; write!(self.out, ".")?; for &sc in pattern[..size as usize].iter() { self.out.write_char(back::COMPONENTS[sc as usize])?; } } Expression::Unary { op, expr } => { let unary = match op { crate::UnaryOperator::Negate => "-", crate::UnaryOperator::Not => { match *func_ctx.info[expr].ty.inner_with(&module.types) { TypeInner::Scalar { kind: crate::ScalarKind::Bool, .. } | TypeInner::Vector { .. } => "!", _ => "~", } } }; write!(self.out, "{}(", unary)?; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")? } Expression::Select { condition, accept, reject, } => { write!(self.out, "select(")?; self.write_expr(module, reject, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, accept, func_ctx)?; write!(self.out, ", ")?; self.write_expr(module, condition, func_ctx)?; write!(self.out, ")")? } Expression::Derivative { axis, expr } => { use crate::DerivativeAxis as Da; let op = match axis { Da::X => "dpdx", Da::Y => "dpdy", Da::Width => "fwidth", }; write!(self.out, "{}(", op)?; self.write_expr(module, expr, func_ctx)?; write!(self.out, ")")? } Expression::Relational { fun, argument } => { use crate::RelationalFunction as Rf; let fun_name = match fun { Rf::IsFinite => "isFinite", Rf::IsNormal => "isNormal", Rf::All => "all", Rf::Any => "any", _ => return Err(Error::UnsupportedRelationalFunction(fun)), }; write!(self.out, "{}(", fun_name)?; self.write_expr(module, argument, func_ctx)?; write!(self.out, ")")? } // Nothing to do here, since call expression already cached Expression::CallResult(_) | Expression::AtomicResult { .. } => {} } Ok(()) } /// Helper method used to write global variables /// # Notes /// Always adds a newline fn write_global( &mut self, module: &Module, global: &crate::GlobalVariable, handle: Handle, ) -> BackendResult { // Write group and binding attributes if present if let Some(ref binding) = global.binding { self.write_attributes(&[ Attribute::Group(binding.group), Attribute::Binding(binding.binding), ])?; writeln!(self.out)?; } // First write global name and address space if supported write!(self.out, "var")?; let (address, maybe_access) = address_space_str(global.space); if let Some(space) = address { write!(self.out, "<{}", space)?; if let Some(access) = maybe_access { write!(self.out, ", {}", access)?; } write!(self.out, ">")?; } write!( self.out, " {}: ", &self.names[&NameKey::GlobalVariable(handle)] )?; // Write global type self.write_type(module, global.ty)?; // Write initializer if let Some(init) = global.init { write!(self.out, " = ")?; self.write_constant(module, init)?; } // End with semicolon writeln!(self.out, ";")?; Ok(()) } /// Helper method used to write constants /// /// # Notes /// Doesn't add any newlines or leading/trailing spaces fn write_constant( &mut self, module: &Module, handle: Handle, ) -> BackendResult { let constant = &module.constants[handle]; match constant.inner { crate::ConstantInner::Scalar { width: _, ref value, } => { if constant.name.is_some() { write!(self.out, "{}", self.names[&NameKey::Constant(handle)])?; } else { self.write_scalar_value(*value)?; } } crate::ConstantInner::Composite { ty, ref components } => { self.write_type(module, ty)?; write!(self.out, "(")?; let members = match module.types[ty].inner { TypeInner::Struct { ref members, .. } => Some(members), _ => None, }; // Write the comma separated constants for (index, constant) in components.iter().enumerate() { if let Some(&crate::Binding::BuiltIn(built_in)) = members.and_then(|members| members.get(index)?.binding.as_ref()) { if builtin_str(built_in).is_none() { log::warn!( "Skip constant for struct member with unsupported builtin {:?}", built_in ); continue; } } self.write_constant(module, *constant)?; // Only write a comma if isn't the last element if index != components.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } write!(self.out, ")")? } } Ok(()) } /// Helper method used to write global constants /// /// # Notes /// Ends in a newline fn write_global_constant( &mut self, module: &Module, inner: &crate::ConstantInner, handle: Handle, ) -> BackendResult { match *inner { crate::ConstantInner::Scalar { width: _, ref value, } => { let name = &self.names[&NameKey::Constant(handle)]; // First write only constant name write!(self.out, "let {}: ", name)?; // Next write constant type and value match *value { crate::ScalarValue::Sint(value) => { write!(self.out, "i32 = {}", value)?; } crate::ScalarValue::Uint(value) => { write!(self.out, "u32 = {}u", value)?; } crate::ScalarValue::Float(value) => { // Floats are written using `Debug` instead of `Display` because it always appends the // decimal part even it's zero write!(self.out, "f32 = {:?}", value)?; } crate::ScalarValue::Bool(value) => { write!(self.out, "bool = {}", value)?; } }; // End with semicolon writeln!(self.out, ";")?; } crate::ConstantInner::Composite { ty, ref components } => { let name = &self.names[&NameKey::Constant(handle)]; // First write only constant name write!(self.out, "let {}: ", name)?; // Next write constant type self.write_type(module, ty)?; write!(self.out, " = ")?; self.write_type(module, ty)?; write!(self.out, "(")?; for (index, constant) in components.iter().enumerate() { self.write_constant(module, *constant)?; // Only write a comma if isn't the last element if index != components.len().saturating_sub(1) { // The leading space is for readability only write!(self.out, ", ")?; } } write!(self.out, ");")?; } } // End with extra newline for readability writeln!(self.out)?; Ok(()) } // See https://github.com/rust-lang/rust-clippy/issues/4979. #[allow(clippy::missing_const_for_fn)] pub fn finish(self) -> W { self.out } } const fn builtin_str(built_in: crate::BuiltIn) -> Option<&'static str> { use crate::BuiltIn as Bi; match built_in { Bi::VertexIndex => Some("vertex_index"), Bi::InstanceIndex => Some("instance_index"), Bi::Position { .. } => Some("position"), Bi::FrontFacing => Some("front_facing"), Bi::FragDepth => Some("frag_depth"), Bi::LocalInvocationId => Some("local_invocation_id"), Bi::LocalInvocationIndex => Some("local_invocation_index"), Bi::GlobalInvocationId => Some("global_invocation_id"), Bi::WorkGroupId => Some("workgroup_id"), Bi::WorkGroupSize => Some("workgroup_size"), Bi::NumWorkGroups => Some("num_workgroups"), Bi::SampleIndex => Some("sample_index"), Bi::SampleMask => Some("sample_mask"), Bi::PrimitiveIndex => Some("primitive_index"), Bi::ViewIndex => Some("view_index"), _ => None, } } const fn image_dimension_str(dim: crate::ImageDimension) -> &'static str { use crate::ImageDimension as IDim; match dim { IDim::D1 => "1d", IDim::D2 => "2d", IDim::D3 => "3d", IDim::Cube => "cube", } } const fn scalar_kind_str(kind: crate::ScalarKind) -> &'static str { use crate::ScalarKind as Sk; match kind { Sk::Float => "f32", Sk::Sint => "i32", Sk::Uint => "u32", Sk::Bool => "bool", } } const fn storage_format_str(format: crate::StorageFormat) -> &'static str { use crate::StorageFormat as Sf; match format { Sf::R8Unorm => "r8unorm", Sf::R8Snorm => "r8snorm", Sf::R8Uint => "r8uint", Sf::R8Sint => "r8sint", Sf::R16Uint => "r16uint", Sf::R16Sint => "r16sint", Sf::R16Float => "r16float", Sf::Rg8Unorm => "rg8unorm", Sf::Rg8Snorm => "rg8snorm", Sf::Rg8Uint => "rg8uint", Sf::Rg8Sint => "rg8sint", Sf::R32Uint => "r32uint", Sf::R32Sint => "r32sint", Sf::R32Float => "r32float", Sf::Rg16Uint => "rg16uint", Sf::Rg16Sint => "rg16sint", Sf::Rg16Float => "rg16float", Sf::Rgba8Unorm => "rgba8unorm", Sf::Rgba8Snorm => "rgba8snorm", Sf::Rgba8Uint => "rgba8uint", Sf::Rgba8Sint => "rgba8sint", Sf::Rgb10a2Unorm => "rgb10a2unorm", Sf::Rg11b10Float => "rg11b10float", Sf::Rg32Uint => "rg32uint", Sf::Rg32Sint => "rg32sint", Sf::Rg32Float => "rg32float", Sf::Rgba16Uint => "rgba16uint", Sf::Rgba16Sint => "rgba16sint", Sf::Rgba16Float => "rgba16float", Sf::Rgba32Uint => "rgba32uint", Sf::Rgba32Sint => "rgba32sint", Sf::Rgba32Float => "rgba32float", } } /// Helper function that returns the string corresponding to the WGSL interpolation qualifier const fn interpolation_str(interpolation: crate::Interpolation) -> &'static str { use crate::Interpolation as I; match interpolation { I::Perspective => "perspective", I::Linear => "linear", I::Flat => "flat", } } /// Return the WGSL auxiliary qualifier for the given sampling value. const fn sampling_str(sampling: crate::Sampling) -> &'static str { use crate::Sampling as S; match sampling { S::Center => "", S::Centroid => "centroid", S::Sample => "sample", } } const fn address_space_str( space: crate::AddressSpace, ) -> (Option<&'static str>, Option<&'static str>) { use crate::AddressSpace as As; ( Some(match space { As::Private => "private", As::Uniform => "uniform", As::Storage { access } => { if access.contains(crate::StorageAccess::STORE) { return (Some("storage"), Some("read_write")); } else { "storage" } } As::PushConstant => "push_constant", As::WorkGroup => "workgroup", As::Handle => return (None, None), As::Function => "function", }), None, ) } fn map_binding_to_attribute( binding: &crate::Binding, scalar_kind: Option, ) -> Vec { match *binding { crate::Binding::BuiltIn(built_in) => { if let crate::BuiltIn::Position { invariant: true } = built_in { vec![Attribute::BuiltIn(built_in), Attribute::Invariant] } else { vec![Attribute::BuiltIn(built_in)] } } crate::Binding::Location { location, interpolation, sampling, } => match scalar_kind { Some(crate::ScalarKind::Float) => vec![ Attribute::Location(location), Attribute::Interpolate(interpolation, sampling), ], _ => vec![Attribute::Location(location)], }, } } /// Helper function that check that expression don't access to structure member with unsupported builtin. fn access_to_unsupported_builtin( expr: Handle, index: u32, module: &Module, info: &valid::FunctionInfo, ) -> bool { let base_ty_res = &info[expr].ty; let resolved = base_ty_res.inner_with(&module.types); if let TypeInner::Pointer { base: pointer_base_handle, .. } = *resolved { // Let's check that we try to access a struct member with unsupported built-in and skip it. if let TypeInner::Struct { ref members, .. } = module.types[pointer_base_handle].inner { if let Some(crate::Binding::BuiltIn(built_in)) = members[index as usize].binding { if builtin_str(built_in).is_none() { log::warn!("Skip component with unsupported builtin {:?}", built_in); return true; } } } } false } ================================================ FILE: lib/naga/src/block.rs ================================================ use crate::{Span, Statement}; use std::ops::{Deref, DerefMut, RangeBounds}; /// A code block is a vector of statements, with maybe a vector of spans. #[derive(Debug, Clone, Default)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "serialize", serde(transparent))] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Block { body: Vec, #[cfg(feature = "span")] #[cfg_attr(feature = "serialize", serde(skip))] span_info: Vec, } impl Block { pub const fn new() -> Self { Self { body: Vec::new(), #[cfg(feature = "span")] span_info: Vec::new(), } } pub fn from_vec(body: Vec) -> Self { #[cfg(feature = "span")] let span_info = std::iter::repeat(Span::default()) .take(body.len()) .collect(); Self { body, #[cfg(feature = "span")] span_info, } } pub fn with_capacity(capacity: usize) -> Self { Self { body: Vec::with_capacity(capacity), #[cfg(feature = "span")] span_info: Vec::with_capacity(capacity), } } #[allow(unused_variables)] pub fn push(&mut self, end: Statement, span: Span) { self.body.push(end); #[cfg(feature = "span")] self.span_info.push(span); } pub fn extend(&mut self, item: Option<(Statement, Span)>) { if let Some((end, span)) = item { self.push(end, span) } } pub fn extend_block(&mut self, other: Self) { #[cfg(feature = "span")] self.span_info.extend(other.span_info); self.body.extend(other.body); } pub fn append(&mut self, other: &mut Self) { #[cfg(feature = "span")] self.span_info.append(&mut other.span_info); self.body.append(&mut other.body); } pub fn cull + Clone>(&mut self, range: R) { #[cfg(feature = "span")] self.span_info.drain(range.clone()); self.body.drain(range); } pub fn splice + Clone>(&mut self, range: R, other: Self) { #[cfg(feature = "span")] self.span_info .splice(range.clone(), other.span_info.into_iter()); self.body.splice(range, other.body.into_iter()); } pub fn span_iter(&self) -> impl Iterator { #[cfg(feature = "span")] let span_iter = self.span_info.iter(); #[cfg(not(feature = "span"))] let span_iter = std::iter::repeat_with(|| &Span::UNDEFINED); self.body.iter().zip(span_iter) } pub fn span_iter_mut(&mut self) -> impl Iterator)> { #[cfg(feature = "span")] let span_iter = self.span_info.iter_mut().map(Some); #[cfg(not(feature = "span"))] let span_iter = std::iter::repeat_with(|| None); self.body.iter_mut().zip(span_iter) } pub fn is_empty(&self) -> bool { self.body.is_empty() } pub fn len(&self) -> usize { self.body.len() } } impl Deref for Block { type Target = [Statement]; fn deref(&self) -> &[Statement] { &self.body } } impl DerefMut for Block { fn deref_mut(&mut self) -> &mut [Statement] { &mut self.body } } impl<'a> IntoIterator for &'a Block { type Item = &'a Statement; type IntoIter = std::slice::Iter<'a, Statement>; fn into_iter(self) -> std::slice::Iter<'a, Statement> { self.iter() } } #[cfg(feature = "deserialize")] impl<'de> serde::Deserialize<'de> for Block { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { Ok(Self::from_vec(Vec::deserialize(deserializer)?)) } } impl From> for Block { fn from(body: Vec) -> Self { Self::from_vec(body) } } ================================================ FILE: lib/naga/src/front/glsl/ast.rs ================================================ use std::{borrow::Cow, fmt}; use super::{builtins::MacroCall, context::ExprPos, Span}; use crate::{ AddressSpace, BinaryOperator, Binding, Constant, Expression, Function, GlobalVariable, Handle, Interpolation, Sampling, StorageAccess, Type, UnaryOperator, }; #[derive(Debug, Clone, Copy)] pub enum GlobalLookupKind { Variable(Handle), Constant(Handle, Handle), BlockSelect(Handle, u32), } #[derive(Debug, Clone, Copy)] pub struct GlobalLookup { pub kind: GlobalLookupKind, pub entry_arg: Option, pub mutable: bool, } #[derive(Debug, Clone)] pub struct ParameterInfo { pub qualifier: ParameterQualifier, /// Whether the parameter should be treated as a depth image instead of a /// sampled image. pub depth: bool, } /// How the function is implemented #[derive(Clone, Copy)] pub enum FunctionKind { /// The function is user defined Call(Handle), /// The function is a builtin Macro(MacroCall), } impl fmt::Debug for FunctionKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Self::Call(_) => write!(f, "Call"), Self::Macro(_) => write!(f, "Macro"), } } } #[derive(Debug)] pub struct Overload { /// Normalized function parameters, modifiers are not applied pub parameters: Vec>, pub parameters_info: Vec, /// How the function is implemented pub kind: FunctionKind, /// Whether this function was already defined or is just a prototype pub defined: bool, /// Whether this overload is the one provided by the language or has /// been redeclared by the user (builtins only) pub internal: bool, /// Whether or not this function returns void (nothing) pub void: bool, } bitflags::bitflags! { /// Tracks the variations of the builtin already generated, this is needed because some /// builtins overloads can't be generated unless explicitly used, since they might cause /// unneeded capabilities to be requested #[derive(Default)] pub struct BuiltinVariations: u32 { /// Request the standard overloads const STANDARD = 1 << 0; /// Request overloads that use the double type const DOUBLE = 1 << 1; /// Request overloads that use samplerCubeArray(Shadow) const CUBE_TEXTURES_ARRAY = 1 << 2; /// Request overloads that use sampler2DMSArray const D2_MULTI_TEXTURES_ARRAY = 1 << 3; } } #[derive(Debug, Default)] pub struct FunctionDeclaration { pub overloads: Vec, /// Tracks the builtin overload variations that were already generated pub variations: BuiltinVariations, } #[derive(Debug)] pub struct EntryArg { pub name: Option, pub binding: Binding, pub handle: Handle, pub storage: StorageQualifier, } #[derive(Debug, Clone)] pub struct VariableReference { pub expr: Handle, /// Wether the variable is of a pointer type (and needs loading) or not pub load: bool, /// Wether the value of the variable can be changed or not pub mutable: bool, pub constant: Option<(Handle, Handle)>, pub entry_arg: Option, } #[derive(Debug, Clone)] pub struct HirExpr { pub kind: HirExprKind, pub meta: Span, } #[derive(Debug, Clone)] pub enum HirExprKind { Access { base: Handle, index: Handle, }, Select { base: Handle, field: String, }, Constant(Handle), Binary { left: Handle, op: BinaryOperator, right: Handle, }, Unary { op: UnaryOperator, expr: Handle, }, Variable(VariableReference), Call(FunctionCall), /// Represents the ternary operator in glsl (`:?`) Conditional { /// The expression that will decide which branch to take, must evaluate to a boolean condition: Handle, /// The expression that will be evaluated if [`condition`] returns `true` /// /// [`condition`]: Self::Conditional::condition accept: Handle, /// The expression that will be evaluated if [`condition`] returns `false` /// /// [`condition`]: Self::Conditional::condition reject: Handle, }, Assign { tgt: Handle, value: Handle, }, /// A prefix/postfix operator like `++` PrePostfix { /// The operation to be performed op: BinaryOperator, /// Whether this is a postfix or a prefix postfix: bool, /// The target expression expr: Handle, }, /// A method call like `what.something(a, b, c)` Method { /// expression the method call applies to (`what` in the example) expr: Handle, /// the method name (`something` in the example) name: String, /// the arguments to the method (`a`, `b`, and `c` in the example) args: Vec>, }, } #[derive(Debug, Hash, PartialEq, Eq)] pub enum QualifierKey<'a> { String(Cow<'a, str>), /// Used for `std140` and `std430` layout qualifiers Layout, /// Used for image formats Format, } #[derive(Debug)] pub enum QualifierValue { None, Uint(u32), Layout(StructLayout), Format(crate::StorageFormat), } #[derive(Debug, Default)] pub struct TypeQualifiers<'a> { pub span: Span, pub storage: (StorageQualifier, Span), pub invariant: Option, pub interpolation: Option<(Interpolation, Span)>, pub precision: Option<(Precision, Span)>, pub sampling: Option<(Sampling, Span)>, /// Memory qualifiers used in the declaration to set the storage access to be used /// in declarations that support it (storage images and buffers) pub storage_access: Option<(StorageAccess, Span)>, pub layout_qualifiers: crate::FastHashMap, (QualifierValue, Span)>, } impl<'a> TypeQualifiers<'a> { /// Appends `errors` with errors for all unused qualifiers pub fn unused_errors(&self, errors: &mut Vec) { if let Some(meta) = self.invariant { errors.push(super::Error { kind: super::ErrorKind::SemanticError( "Invariant qualifier can only be used in in/out variables".into(), ), meta, }); } if let Some((_, meta)) = self.interpolation { errors.push(super::Error { kind: super::ErrorKind::SemanticError( "Interpolation qualifiers can only be used in in/out variables".into(), ), meta, }); } if let Some((_, meta)) = self.sampling { errors.push(super::Error { kind: super::ErrorKind::SemanticError( "Sampling qualifiers can only be used in in/out variables".into(), ), meta, }); } if let Some((_, meta)) = self.storage_access { errors.push(super::Error { kind: super::ErrorKind::SemanticError( "Memory qualifiers can only be used in storage variables".into(), ), meta, }); } for &(_, meta) in self.layout_qualifiers.values() { errors.push(super::Error { kind: super::ErrorKind::SemanticError("Unexpected qualifier".into()), meta, }); } } /// Removes the layout qualifier with `name`, if it exists and adds an error if it isn't /// a [`QualifierValue::Uint`] pub fn uint_layout_qualifier( &mut self, name: &'a str, errors: &mut Vec, ) -> Option { match self .layout_qualifiers .remove(&QualifierKey::String(name.into())) { Some((QualifierValue::Uint(v), _)) => Some(v), Some((_, meta)) => { errors.push(super::Error { kind: super::ErrorKind::SemanticError("Qualifier expects a uint value".into()), meta, }); // Return a dummy value instead of `None` to differentiate from // the qualifier not existing, since some parts might require the // qualifier to exist and throwing another error that it doesn't // exist would be unhelpful Some(0) } _ => None, } } /// Removes the layout qualifier with `name`, if it exists and adds an error if it isn't /// a [`QualifierValue::None`] pub fn none_layout_qualifier(&mut self, name: &'a str, errors: &mut Vec) -> bool { match self .layout_qualifiers .remove(&QualifierKey::String(name.into())) { Some((QualifierValue::None, _)) => true, Some((_, meta)) => { errors.push(super::Error { kind: super::ErrorKind::SemanticError( "Qualifier doesn't expect a value".into(), ), meta, }); // Return a `true` to since the qualifier is defined and adding // another error for it not being defined would be unhelpful true } _ => false, } } } #[derive(Debug, Clone)] pub enum FunctionCallKind { TypeConstructor(Handle), Function(String), } #[derive(Debug, Clone)] pub struct FunctionCall { pub kind: FunctionCallKind, pub args: Vec>, } #[derive(Debug, Clone, Copy, PartialEq)] pub enum StorageQualifier { AddressSpace(AddressSpace), Input, Output, Const, } impl Default for StorageQualifier { fn default() -> Self { StorageQualifier::AddressSpace(AddressSpace::Function) } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum StructLayout { Std140, Std430, } // TODO: Encode precision hints in the IR /// A precision hint used in GLSL declarations. /// /// Precision hints can be used to either speed up shader execution or control /// the precision of arithmetic operations. /// /// To use a precision hint simply add it before the type in the declaration. /// ```glsl /// mediump float a; /// ``` /// /// The default when no precision is declared is `highp` which means that all /// operations operate with the type defined width. /// /// For `mediump` and `lowp` operations follow the spir-v /// [`RelaxedPrecision`][RelaxedPrecision] decoration semantics. /// /// [RelaxedPrecision]: https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#_a_id_relaxedprecisionsection_a_relaxed_precision #[derive(Debug, Clone, PartialEq, Copy)] pub enum Precision { /// `lowp` precision Low, /// `mediump` precision Medium, /// `highp` precision High, } #[derive(Debug, Clone, PartialEq, Copy)] pub enum ParameterQualifier { In, Out, InOut, Const, } impl ParameterQualifier { /// Returns true if the argument should be passed as a lhs expression pub const fn is_lhs(&self) -> bool { match *self { ParameterQualifier::Out | ParameterQualifier::InOut => true, _ => false, } } /// Converts from a parameter qualifier into a [`ExprPos`](ExprPos) pub const fn as_pos(&self) -> ExprPos { match *self { ParameterQualifier::Out | ParameterQualifier::InOut => ExprPos::Lhs, _ => ExprPos::Rhs, } } } /// The GLSL profile used by a shader. #[derive(Debug, Clone, Copy, PartialEq)] pub enum Profile { /// The `core` profile, default when no profile is specified. Core, } ================================================ FILE: lib/naga/src/front/glsl/builtins.rs ================================================ use super::{ ast::{ BuiltinVariations, FunctionDeclaration, FunctionKind, Overload, ParameterInfo, ParameterQualifier, }, context::Context, Error, ErrorKind, Parser, Result, }; use crate::{ BinaryOperator, Block, Constant, DerivativeAxis, Expression, Handle, ImageClass, ImageDimension as Dim, ImageQuery, MathFunction, Module, RelationalFunction, SampleLevel, ScalarKind as Sk, Span, Type, TypeInner, VectorSize, }; impl crate::ScalarKind { const fn dummy_storage_format(&self) -> crate::StorageFormat { match *self { Sk::Sint => crate::StorageFormat::R16Sint, Sk::Uint => crate::StorageFormat::R16Uint, _ => crate::StorageFormat::R16Float, } } } impl Module { /// Helper function, to create a function prototype for a builtin fn add_builtin(&mut self, args: Vec, builtin: MacroCall) -> Overload { let mut parameters = Vec::with_capacity(args.len()); let mut parameters_info = Vec::with_capacity(args.len()); for arg in args { parameters.push(self.types.insert( Type { name: None, inner: arg, }, Span::default(), )); parameters_info.push(ParameterInfo { qualifier: ParameterQualifier::In, depth: false, }); } Overload { parameters, parameters_info, kind: FunctionKind::Macro(builtin), defined: false, internal: true, void: false, } } } const fn make_coords_arg(number_of_components: usize, kind: Sk) -> TypeInner { let width = 4; match number_of_components { 1 => TypeInner::Scalar { kind, width }, _ => TypeInner::Vector { size: match number_of_components { 2 => VectorSize::Bi, 3 => VectorSize::Tri, _ => VectorSize::Quad, }, kind, width, }, } } /// Inject builtins into the declaration /// /// This is done to not add a large startup cost and not increase memory /// usage if it isn't needed. pub fn inject_builtin( declaration: &mut FunctionDeclaration, module: &mut Module, name: &str, mut variations: BuiltinVariations, ) { log::trace!( "{} variations: {:?} {:?}", name, variations, declaration.variations ); // Don't regeneate variations variations.remove(declaration.variations); declaration.variations |= variations; if variations.contains(BuiltinVariations::STANDARD) { inject_standard_builtins(declaration, module, name) } if variations.contains(BuiltinVariations::DOUBLE) { inject_double_builtin(declaration, module, name) } let width = 4; match name { "texture" | "textureGrad" | "textureGradOffset" | "textureLod" | "textureLodOffset" | "textureOffset" | "textureProj" | "textureProjGrad" | "textureProjGradOffset" | "textureProjLod" | "textureProjLodOffset" | "textureProjOffset" => { let f = |kind, dim, arrayed, multi, shadow| { for bits in 0..=0b11 { let variant = bits & 0b1 != 0; let bias = bits & 0b10 != 0; let (proj, offset, level_type) = match name { // texture(gsampler, gvec P, [float bias]); "texture" => (false, false, TextureLevelType::None), // textureGrad(gsampler, gvec P, gvec dPdx, gvec dPdy); "textureGrad" => (false, false, TextureLevelType::Grad), // textureGradOffset(gsampler, gvec P, gvec dPdx, gvec dPdy, ivec offset); "textureGradOffset" => (false, true, TextureLevelType::Grad), // textureLod(gsampler, gvec P, float lod); "textureLod" => (false, false, TextureLevelType::Lod), // textureLodOffset(gsampler, gvec P, float lod, ivec offset); "textureLodOffset" => (false, true, TextureLevelType::Lod), // textureOffset(gsampler, gvec+1 P, ivec offset, [float bias]); "textureOffset" => (false, true, TextureLevelType::None), // textureProj(gsampler, gvec+1 P, [float bias]); "textureProj" => (true, false, TextureLevelType::None), // textureProjGrad(gsampler, gvec+1 P, gvec dPdx, gvec dPdy); "textureProjGrad" => (true, false, TextureLevelType::Grad), // textureProjGradOffset(gsampler, gvec+1 P, gvec dPdx, gvec dPdy, ivec offset); "textureProjGradOffset" => (true, true, TextureLevelType::Grad), // textureProjLod(gsampler, gvec+1 P, float lod); "textureProjLod" => (true, false, TextureLevelType::Lod), // textureProjLodOffset(gsampler, gvec+1 P, gvec dPdx, gvec dPdy, ivec offset); "textureProjLodOffset" => (true, true, TextureLevelType::Lod), // textureProjOffset(gsampler, gvec+1 P, ivec offset, [float bias]); "textureProjOffset" => (true, true, TextureLevelType::None), _ => unreachable!(), }; let builtin = MacroCall::Texture { proj, offset, shadow, level_type, }; // Parse out the variant settings. let grad = level_type == TextureLevelType::Grad; let lod = level_type == TextureLevelType::Lod; let supports_variant = proj && !shadow; if variant && !supports_variant { continue; } if bias && !matches!(level_type, TextureLevelType::None) { continue; } // Proj doesn't work with arrayed or Cube if proj && (arrayed || dim == Dim::Cube) { continue; } // texture operations with offset are not supported for cube maps if dim == Dim::Cube && offset { continue; } // sampler2DArrayShadow can't be used in textureLod or in texture with bias if (lod || bias) && arrayed && shadow && dim == Dim::D2 { continue; } // TODO: glsl supports using bias with depth samplers but naga doesn't if bias && shadow { continue; } let class = match shadow { true => ImageClass::Depth { multi }, false => ImageClass::Sampled { kind, multi }, }; let image = TypeInner::Image { dim, arrayed, class, }; let num_coords_from_dim = image_dims_to_coords_size(dim).min(3); let mut num_coords = num_coords_from_dim; if shadow && proj { num_coords = 4; } else if dim == Dim::D1 && shadow { num_coords = 3; } else if shadow { num_coords += 1; } else if proj { if variant && num_coords == 4 { // Normal form already has 4 components, no need to have a variant form. continue; } else if variant { num_coords = 4; } else { num_coords += 1; } } if !(dim == Dim::D1 && shadow) { num_coords += arrayed as usize; } // Special case: texture(gsamplerCubeArrayShadow) kicks the shadow compare ref to a separate argument, // since it would otherwise take five arguments. It also can't take a bias, nor can it be proj/grad/lod/offset // (presumably because nobody asked for it, and implementation complexity?) if num_coords >= 5 { if lod || grad || offset || proj || bias { continue; } debug_assert!(dim == Dim::Cube && shadow && arrayed); } debug_assert!(num_coords <= 5); let vector = make_coords_arg(num_coords, Sk::Float); let mut args = vec![image, vector]; if num_coords == 5 { args.push(TypeInner::Scalar { kind: Sk::Float, width, }); } match level_type { TextureLevelType::Lod => { args.push(TypeInner::Scalar { kind: Sk::Float, width, }); } TextureLevelType::Grad => { args.push(make_coords_arg(num_coords_from_dim, Sk::Float)); args.push(make_coords_arg(num_coords_from_dim, Sk::Float)); } _ => {} }; if offset { args.push(make_coords_arg(num_coords_from_dim, Sk::Sint)); } if bias { args.push(TypeInner::Scalar { kind: Sk::Float, width, }); } declaration .overloads .push(module.add_builtin(args, builtin)); } }; texture_args_generator(TextureArgsOptions::SHADOW | variations.into(), f) } "textureSize" => { let f = |kind, dim, arrayed, multi, shadow| { let class = match shadow { true => ImageClass::Depth { multi }, false => ImageClass::Sampled { kind, multi }, }; let image = TypeInner::Image { dim, arrayed, class, }; let mut args = vec![image]; if !multi { args.push(TypeInner::Scalar { kind: Sk::Sint, width, }) } declaration .overloads .push(module.add_builtin(args, MacroCall::TextureSize { arrayed })) }; texture_args_generator( TextureArgsOptions::SHADOW | TextureArgsOptions::MULTI | variations.into(), f, ) } "texelFetch" | "texelFetchOffset" => { let offset = "texelFetchOffset" == name; let f = |kind, dim, arrayed, multi, _shadow| { // Cube images aren't supported if let Dim::Cube = dim { return; } let image = TypeInner::Image { dim, arrayed, class: ImageClass::Sampled { kind, multi }, }; let dim_value = image_dims_to_coords_size(dim); let coordinates = make_coords_arg(dim_value + arrayed as usize, Sk::Sint); let mut args = vec![ image, coordinates, TypeInner::Scalar { kind: Sk::Sint, width, }, ]; if offset { args.push(make_coords_arg(dim_value, Sk::Sint)); } declaration .overloads .push(module.add_builtin(args, MacroCall::ImageLoad { multi })) }; // Don't generate shadow images since they aren't supported texture_args_generator(TextureArgsOptions::MULTI | variations.into(), f) } "imageSize" => { let f = |kind: Sk, dim, arrayed, _, _| { // Naga doesn't support cube images and it's usefulness // is questionable, so they won't be supported for now if dim == Dim::Cube { return; } let image = TypeInner::Image { dim, arrayed, class: ImageClass::Storage { format: kind.dummy_storage_format(), access: crate::StorageAccess::empty(), }, }; declaration .overloads .push(module.add_builtin(vec![image], MacroCall::TextureSize { arrayed })) }; texture_args_generator(variations.into(), f) } "imageLoad" => { let f = |kind: Sk, dim, arrayed, _, _| { // Naga doesn't support cube images and it's usefulness // is questionable, so they won't be supported for now if dim == Dim::Cube { return; } let image = TypeInner::Image { dim, arrayed, class: ImageClass::Storage { format: kind.dummy_storage_format(), access: crate::StorageAccess::LOAD, }, }; let dim_value = image_dims_to_coords_size(dim); let mut coord_size = dim_value + arrayed as usize; // > Every OpenGL API call that operates on cubemap array // > textures takes layer-faces, not array layers // // So this means that imageCubeArray only takes a three component // vector coordinate and the third component is a layer index. if Dim::Cube == dim && arrayed { coord_size = 3 } let coordinates = make_coords_arg(coord_size, Sk::Sint); let args = vec![image, coordinates]; declaration .overloads .push(module.add_builtin(args, MacroCall::ImageLoad { multi: false })) }; // Don't generate shadow nor multisampled images since they aren't supported texture_args_generator(variations.into(), f) } "imageStore" => { let f = |kind: Sk, dim, arrayed, _, _| { // Naga doesn't support cube images and it's usefulness // is questionable, so they won't be supported for now if dim == Dim::Cube { return; } let image = TypeInner::Image { dim, arrayed, class: ImageClass::Storage { format: kind.dummy_storage_format(), access: crate::StorageAccess::STORE, }, }; let dim_value = image_dims_to_coords_size(dim); let mut coord_size = dim_value + arrayed as usize; // > Every OpenGL API call that operates on cubemap array // > textures takes layer-faces, not array layers // // So this means that imageCubeArray only takes a three component // vector coordinate and the third component is a layer index. if Dim::Cube == dim && arrayed { coord_size = 3 } let coordinates = make_coords_arg(coord_size, Sk::Sint); let args = vec![ image, coordinates, TypeInner::Vector { size: VectorSize::Quad, kind, width, }, ]; let mut overload = module.add_builtin(args, MacroCall::ImageStore); overload.void = true; declaration.overloads.push(overload) }; // Don't generate shadow nor multisampled images since they aren't supported texture_args_generator(variations.into(), f) } _ => {} } } /// Injects the builtins into declaration that don't need any special variations fn inject_standard_builtins( declaration: &mut FunctionDeclaration, module: &mut Module, name: &str, ) { let width = 4; match name { "sampler1D" | "sampler1DArray" | "sampler2D" | "sampler2DArray" | "sampler2DMS" | "sampler2DMSArray" | "sampler3D" | "samplerCube" | "samplerCubeArray" => { declaration.overloads.push(module.add_builtin( vec![ TypeInner::Image { dim: match name { "sampler1D" | "sampler1DArray" => Dim::D1, "sampler2D" | "sampler2DArray" | "sampler2DMS" | "sampler2DMSArray" => { Dim::D2 } "sampler3D" => Dim::D3, _ => Dim::Cube, }, arrayed: matches!( name, "sampler1DArray" | "sampler2DArray" | "sampler2DMSArray" | "samplerCubeArray" ), class: ImageClass::Sampled { kind: Sk::Float, multi: matches!(name, "sampler2DMS" | "sampler2DMSArray"), }, }, TypeInner::Sampler { comparison: false }, ], MacroCall::Sampler, )) } "sampler1DShadow" | "sampler1DArrayShadow" | "sampler2DShadow" | "sampler2DArrayShadow" | "samplerCubeShadow" | "samplerCubeArrayShadow" => { let dim = match name { "sampler1DShadow" | "sampler1DArrayShadow" => Dim::D1, "sampler2DShadow" | "sampler2DArrayShadow" => Dim::D2, _ => Dim::Cube, }; let arrayed = matches!( name, "sampler1DArrayShadow" | "sampler2DArrayShadow" | "samplerCubeArrayShadow" ); for i in 0..2 { let ty = TypeInner::Image { dim, arrayed, class: match i { 0 => ImageClass::Sampled { kind: Sk::Float, multi: false, }, _ => ImageClass::Depth { multi: false }, }, }; declaration.overloads.push(module.add_builtin( vec![ty, TypeInner::Sampler { comparison: true }], MacroCall::SamplerShadow, )) } } "sin" | "exp" | "exp2" | "sinh" | "cos" | "cosh" | "tan" | "tanh" | "acos" | "asin" | "log" | "log2" | "radians" | "degrees" | "asinh" | "acosh" | "atanh" | "floatBitsToInt" | "floatBitsToUint" | "dFdx" | "dFdxFine" | "dFdxCoarse" | "dFdy" | "dFdyFine" | "dFdyCoarse" | "fwidth" | "fwidthFine" | "fwidthCoarse" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = Sk::Float; declaration.overloads.push(module.add_builtin( vec![match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }], match name { "sin" => MacroCall::MathFunction(MathFunction::Sin), "exp" => MacroCall::MathFunction(MathFunction::Exp), "exp2" => MacroCall::MathFunction(MathFunction::Exp2), "sinh" => MacroCall::MathFunction(MathFunction::Sinh), "cos" => MacroCall::MathFunction(MathFunction::Cos), "cosh" => MacroCall::MathFunction(MathFunction::Cosh), "tan" => MacroCall::MathFunction(MathFunction::Tan), "tanh" => MacroCall::MathFunction(MathFunction::Tanh), "acos" => MacroCall::MathFunction(MathFunction::Acos), "asin" => MacroCall::MathFunction(MathFunction::Asin), "log" => MacroCall::MathFunction(MathFunction::Log), "log2" => MacroCall::MathFunction(MathFunction::Log2), "asinh" => MacroCall::MathFunction(MathFunction::Asinh), "acosh" => MacroCall::MathFunction(MathFunction::Acosh), "atanh" => MacroCall::MathFunction(MathFunction::Atanh), "radians" => MacroCall::MathFunction(MathFunction::Radians), "degrees" => MacroCall::MathFunction(MathFunction::Degrees), "floatBitsToInt" => MacroCall::BitCast(Sk::Sint), "floatBitsToUint" => MacroCall::BitCast(Sk::Uint), "dFdx" | "dFdxFine" | "dFdxCoarse" => { MacroCall::Derivate(DerivativeAxis::X) } "dFdy" | "dFdyFine" | "dFdyCoarse" => { MacroCall::Derivate(DerivativeAxis::Y) } "fwidth" | "fwidthFine" | "fwidthCoarse" => { MacroCall::Derivate(DerivativeAxis::Width) } _ => unreachable!(), }, )) } } "intBitsToFloat" | "uintBitsToFloat" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = match name { "intBitsToFloat" => Sk::Sint, _ => Sk::Uint, }; declaration.overloads.push(module.add_builtin( vec![match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }], MacroCall::BitCast(Sk::Float), )) } } "pow" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = Sk::Float; let ty = || match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; declaration.overloads.push( module .add_builtin(vec![ty(), ty()], MacroCall::MathFunction(MathFunction::Pow)), ) } } "abs" | "sign" => { // bits layout // bit 0 trough 1 - dims // bit 2 - float/sint for bits in 0..0b1000 { let size = match bits & 0b11 { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = match bits >> 2 { 0b0 => Sk::Float, _ => Sk::Sint, }; let args = vec![match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }]; declaration.overloads.push(module.add_builtin( args, MacroCall::MathFunction(match name { "abs" => MathFunction::Abs, "sign" => MathFunction::Sign, _ => unreachable!(), }), )) } } "bitCount" | "bitfieldReverse" | "bitfieldExtract" | "bitfieldInsert" | "findLSB" | "findMSB" => { let fun = match name { "bitCount" => MathFunction::CountOneBits, "bitfieldReverse" => MathFunction::ReverseBits, "bitfieldExtract" => MathFunction::ExtractBits, "bitfieldInsert" => MathFunction::InsertBits, "findLSB" => MathFunction::FindLsb, "findMSB" => MathFunction::FindMsb, _ => unreachable!(), }; let mc = match fun { MathFunction::ExtractBits => MacroCall::BitfieldExtract, MathFunction::InsertBits => MacroCall::BitfieldInsert, _ => MacroCall::MathFunction(fun), }; // bits layout // bit 0 - int/uint // bit 1 trough 2 - dims for bits in 0..0b1000 { let kind = match bits & 0b1 { 0b0 => Sk::Sint, _ => Sk::Uint, }; let size = match bits >> 1 { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let ty = || match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let mut args = vec![ty()]; match fun { MathFunction::ExtractBits => { args.push(TypeInner::Scalar { kind: Sk::Sint, width: 4, }); args.push(TypeInner::Scalar { kind: Sk::Sint, width: 4, }); } MathFunction::InsertBits => { args.push(ty()); args.push(TypeInner::Scalar { kind: Sk::Sint, width: 4, }); args.push(TypeInner::Scalar { kind: Sk::Sint, width: 4, }); } _ => {} } // we need to cast the return type of findLsb / findMsb let mc = if kind == Sk::Uint { match mc { MacroCall::MathFunction(MathFunction::FindLsb) => MacroCall::FindLsbUint, MacroCall::MathFunction(MathFunction::FindMsb) => MacroCall::FindMsbUint, mc => mc, } } else { mc }; declaration.overloads.push(module.add_builtin(args, mc)) } } "packSnorm4x8" | "packUnorm4x8" | "packSnorm2x16" | "packUnorm2x16" | "packHalf2x16" => { let fun = match name { "packSnorm4x8" => MathFunction::Pack4x8snorm, "packUnorm4x8" => MathFunction::Pack4x8unorm, "packSnorm2x16" => MathFunction::Pack2x16unorm, "packUnorm2x16" => MathFunction::Pack2x16snorm, "packHalf2x16" => MathFunction::Pack2x16float, _ => unreachable!(), }; let ty = match fun { MathFunction::Pack4x8snorm | MathFunction::Pack4x8unorm => TypeInner::Vector { size: crate::VectorSize::Quad, kind: Sk::Float, width: 4, }, MathFunction::Pack2x16unorm | MathFunction::Pack2x16snorm | MathFunction::Pack2x16float => TypeInner::Vector { size: crate::VectorSize::Bi, kind: Sk::Float, width: 4, }, _ => unreachable!(), }; let args = vec![ty]; declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(fun))); } "unpackSnorm4x8" | "unpackUnorm4x8" | "unpackSnorm2x16" | "unpackUnorm2x16" | "unpackHalf2x16" => { let fun = match name { "unpackSnorm4x8" => MathFunction::Unpack4x8snorm, "unpackUnorm4x8" => MathFunction::Unpack4x8unorm, "unpackSnorm2x16" => MathFunction::Unpack2x16snorm, "unpackUnorm2x16" => MathFunction::Unpack2x16unorm, "unpackHalf2x16" => MathFunction::Unpack2x16float, _ => unreachable!(), }; let args = vec![TypeInner::Scalar { kind: Sk::Uint, width: 4, }]; declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(fun))); } "atan" => { // bits layout // bit 0 - atan/atan2 // bit 1 trough 2 - dims for bits in 0..0b1000 { let fun = match bits & 0b1 { 0b0 => MathFunction::Atan, _ => MathFunction::Atan2, }; let size = match bits >> 1 { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = Sk::Float; let ty = || match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let mut args = vec![ty()]; if fun == MathFunction::Atan2 { args.push(ty()) } declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(fun))) } } "all" | "any" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b11 { let size = match bits { 0b00 => VectorSize::Bi, 0b01 => VectorSize::Tri, _ => VectorSize::Quad, }; let args = vec![TypeInner::Vector { size, kind: Sk::Bool, width: crate::BOOL_WIDTH, }]; let fun = MacroCall::Relational(match name { "all" => RelationalFunction::All, "any" => RelationalFunction::Any, _ => unreachable!(), }); declaration.overloads.push(module.add_builtin(args, fun)) } } "lessThan" | "greaterThan" | "lessThanEqual" | "greaterThanEqual" | "equal" | "notEqual" => { for bits in 0..0b1001 { let (size, kind) = match bits { 0b0000 => (VectorSize::Bi, Sk::Float), 0b0001 => (VectorSize::Tri, Sk::Float), 0b0010 => (VectorSize::Quad, Sk::Float), 0b0011 => (VectorSize::Bi, Sk::Sint), 0b0100 => (VectorSize::Tri, Sk::Sint), 0b0101 => (VectorSize::Quad, Sk::Sint), 0b0110 => (VectorSize::Bi, Sk::Uint), 0b0111 => (VectorSize::Tri, Sk::Uint), _ => (VectorSize::Quad, Sk::Uint), }; let ty = || TypeInner::Vector { size, kind, width }; let args = vec![ty(), ty()]; let fun = MacroCall::Binary(match name { "lessThan" => BinaryOperator::Less, "greaterThan" => BinaryOperator::Greater, "lessThanEqual" => BinaryOperator::LessEqual, "greaterThanEqual" => BinaryOperator::GreaterEqual, "equal" => BinaryOperator::Equal, "notEqual" => BinaryOperator::NotEqual, _ => unreachable!(), }); declaration.overloads.push(module.add_builtin(args, fun)) } } "min" | "max" => { // bits layout // bit 0 trough 1 - scalar kind // bit 2 trough 4 - dims for bits in 0..0b11100 { let kind = match bits & 0b11 { 0b00 => Sk::Float, 0b01 => Sk::Sint, 0b10 => Sk::Uint, _ => continue, }; let (size, second_size) = match bits >> 2 { 0b000 => (None, None), 0b001 => (Some(VectorSize::Bi), None), 0b010 => (Some(VectorSize::Tri), None), 0b011 => (Some(VectorSize::Quad), None), 0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)), 0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)), _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)), }; let args = vec![ match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }, match second_size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }, ]; let fun = match name { "max" => MacroCall::Splatted(MathFunction::Max, size, 1), "min" => MacroCall::Splatted(MathFunction::Min, size, 1), _ => unreachable!(), }; declaration.overloads.push(module.add_builtin(args, fun)) } } "mix" => { // bits layout // bit 0 trough 1 - dims // bit 2 trough 4 - types // // 0b10011 is the last element since splatted single elements // were already added for bits in 0..0b10011 { let size = match bits & 0b11 { 0b00 => Some(VectorSize::Bi), 0b01 => Some(VectorSize::Tri), 0b10 => Some(VectorSize::Quad), _ => None, }; let (kind, splatted, boolean) = match bits >> 2 { 0b000 => (Sk::Sint, false, true), 0b001 => (Sk::Uint, false, true), 0b010 => (Sk::Float, false, true), 0b011 => (Sk::Float, false, false), _ => (Sk::Float, true, false), }; let ty = |kind, width| match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let args = vec![ ty(kind, width), ty(kind, width), match (boolean, splatted) { (true, _) => ty(Sk::Bool, crate::BOOL_WIDTH), (_, false) => TypeInner::Scalar { kind, width }, _ => ty(kind, width), }, ]; declaration.overloads.push(module.add_builtin( args, match boolean { true => MacroCall::MixBoolean, false => MacroCall::Splatted(MathFunction::Mix, size, 2), }, )) } } "clamp" => { // bits layout // bit 0 trough 1 - float/int/uint // bit 2 trough 3 - dims // bit 4 - splatted // // 0b11010 is the last element since splatted single elements // were already added for bits in 0..0b11011 { let kind = match bits & 0b11 { 0b00 => Sk::Float, 0b01 => Sk::Sint, 0b10 => Sk::Uint, _ => continue, }; let size = match (bits >> 2) & 0b11 { 0b00 => Some(VectorSize::Bi), 0b01 => Some(VectorSize::Tri), 0b10 => Some(VectorSize::Quad), _ => None, }; let splatted = bits & 0b10000 == 0b10000; let base_ty = || match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let limit_ty = || match splatted { true => TypeInner::Scalar { kind, width }, false => base_ty(), }; let args = vec![base_ty(), limit_ty(), limit_ty()]; declaration .overloads .push(module.add_builtin(args, MacroCall::Clamp(size))) } } "barrier" => declaration .overloads .push(module.add_builtin(Vec::new(), MacroCall::Barrier)), // Add common builtins with floats _ => inject_common_builtin(declaration, module, name, 4), } } /// Injects the builtins into declaration that need doubles fn inject_double_builtin(declaration: &mut FunctionDeclaration, module: &mut Module, name: &str) { let width = 8; match name { "abs" | "sign" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let kind = Sk::Float; let args = vec![match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }]; declaration.overloads.push(module.add_builtin( args, MacroCall::MathFunction(match name { "abs" => MathFunction::Abs, "sign" => MathFunction::Sign, _ => unreachable!(), }), )) } } "min" | "max" => { // bits layout // bit 0 trough 2 - dims for bits in 0..0b111 { let (size, second_size) = match bits { 0b000 => (None, None), 0b001 => (Some(VectorSize::Bi), None), 0b010 => (Some(VectorSize::Tri), None), 0b011 => (Some(VectorSize::Quad), None), 0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)), 0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)), _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)), }; let kind = Sk::Float; let args = vec![ match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }, match second_size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }, ]; let fun = match name { "max" => MacroCall::Splatted(MathFunction::Max, size, 1), "min" => MacroCall::Splatted(MathFunction::Min, size, 1), _ => unreachable!(), }; declaration.overloads.push(module.add_builtin(args, fun)) } } "mix" => { // bits layout // bit 0 trough 1 - dims // bit 2 trough 3 - splatted/boolean // // 0b1010 is the last element since splatted with single elements // is equal to normal single elements for bits in 0..0b1011 { let size = match bits & 0b11 { 0b00 => Some(VectorSize::Quad), 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => None, }; let kind = Sk::Float; let (splatted, boolean) = match bits >> 2 { 0b00 => (false, false), 0b01 => (false, true), _ => (true, false), }; let ty = |kind, width| match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let args = vec![ ty(kind, width), ty(kind, width), match (boolean, splatted) { (true, _) => ty(Sk::Bool, crate::BOOL_WIDTH), (_, false) => TypeInner::Scalar { kind, width }, _ => ty(kind, width), }, ]; declaration.overloads.push(module.add_builtin( args, match boolean { true => MacroCall::MixBoolean, false => MacroCall::Splatted(MathFunction::Mix, size, 2), }, )) } } "clamp" => { // bits layout // bit 0 trough 1 - dims // bit 2 - splatted // // 0b110 is the last element since splatted with single elements // is equal to normal single elements for bits in 0..0b111 { let kind = Sk::Float; let size = match bits & 0b11 { 0b00 => Some(VectorSize::Bi), 0b01 => Some(VectorSize::Tri), 0b10 => Some(VectorSize::Quad), _ => None, }; let splatted = bits & 0b100 == 0b100; let base_ty = || match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; let limit_ty = || match splatted { true => TypeInner::Scalar { kind, width }, false => base_ty(), }; let args = vec![base_ty(), limit_ty(), limit_ty()]; declaration .overloads .push(module.add_builtin(args, MacroCall::Clamp(size))) } } // Add common builtins with doubles _ => inject_common_builtin(declaration, module, name, 8), } } /// Injects the builtins into declaration that can used either float or doubles fn inject_common_builtin( declaration: &mut FunctionDeclaration, module: &mut Module, name: &str, float_width: crate::Bytes, ) { match name { "ceil" | "round" | "roundEven" | "floor" | "fract" | "trunc" | "sqrt" | "inversesqrt" | "normalize" | "length" | "isinf" | "isnan" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let args = vec![match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }]; let fun = match name { "ceil" => MacroCall::MathFunction(MathFunction::Ceil), "round" | "roundEven" => MacroCall::MathFunction(MathFunction::Round), "floor" => MacroCall::MathFunction(MathFunction::Floor), "fract" => MacroCall::MathFunction(MathFunction::Fract), "trunc" => MacroCall::MathFunction(MathFunction::Trunc), "sqrt" => MacroCall::MathFunction(MathFunction::Sqrt), "inversesqrt" => MacroCall::MathFunction(MathFunction::InverseSqrt), "normalize" => MacroCall::MathFunction(MathFunction::Normalize), "length" => MacroCall::MathFunction(MathFunction::Length), "isinf" => MacroCall::Relational(RelationalFunction::IsInf), "isnan" => MacroCall::Relational(RelationalFunction::IsNan), _ => unreachable!(), }; declaration.overloads.push(module.add_builtin(args, fun)) } } "dot" | "reflect" | "distance" | "ldexp" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let ty = || match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }; let fun = match name { "dot" => MacroCall::MathFunction(MathFunction::Dot), "reflect" => MacroCall::MathFunction(MathFunction::Reflect), "distance" => MacroCall::MathFunction(MathFunction::Distance), "ldexp" => MacroCall::MathFunction(MathFunction::Ldexp), _ => unreachable!(), }; declaration .overloads .push(module.add_builtin(vec![ty(), ty()], fun)) } } "transpose" => { // bits layout // bit 0 trough 3 - dims for bits in 0..0b1001 { let (rows, columns) = match bits { 0b0000 => (VectorSize::Bi, VectorSize::Bi), 0b0001 => (VectorSize::Bi, VectorSize::Tri), 0b0010 => (VectorSize::Bi, VectorSize::Quad), 0b0011 => (VectorSize::Tri, VectorSize::Bi), 0b0100 => (VectorSize::Tri, VectorSize::Tri), 0b0101 => (VectorSize::Tri, VectorSize::Quad), 0b0110 => (VectorSize::Quad, VectorSize::Bi), 0b0111 => (VectorSize::Quad, VectorSize::Tri), _ => (VectorSize::Quad, VectorSize::Quad), }; declaration.overloads.push(module.add_builtin( vec![TypeInner::Matrix { columns, rows, width: float_width, }], MacroCall::MathFunction(MathFunction::Transpose), )) } } "inverse" | "determinant" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b11 { let (rows, columns) = match bits { 0b00 => (VectorSize::Bi, VectorSize::Bi), 0b01 => (VectorSize::Tri, VectorSize::Tri), _ => (VectorSize::Quad, VectorSize::Quad), }; let args = vec![TypeInner::Matrix { columns, rows, width: float_width, }]; declaration.overloads.push(module.add_builtin( args, MacroCall::MathFunction(match name { "inverse" => MathFunction::Inverse, "determinant" => MathFunction::Determinant, _ => unreachable!(), }), )) } } "mod" | "step" => { // bits layout // bit 0 trough 2 - dims for bits in 0..0b111 { let (size, second_size) = match bits { 0b000 => (None, None), 0b001 => (Some(VectorSize::Bi), None), 0b010 => (Some(VectorSize::Tri), None), 0b011 => (Some(VectorSize::Quad), None), 0b100 => (Some(VectorSize::Bi), Some(VectorSize::Bi)), 0b101 => (Some(VectorSize::Tri), Some(VectorSize::Tri)), _ => (Some(VectorSize::Quad), Some(VectorSize::Quad)), }; let mut args = Vec::with_capacity(2); let step = name == "step"; for i in 0..2 { let maybe_size = match i == step as u32 { true => size, false => second_size, }; args.push(match maybe_size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }) } let fun = match name { "mod" => MacroCall::Mod(size), "step" => MacroCall::Splatted(MathFunction::Step, size, 0), _ => unreachable!(), }; declaration.overloads.push(module.add_builtin(args, fun)) } } "modf" | "frexp" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let ty = module.types.insert( Type { name: None, inner: match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }, }, Span::default(), ); let parameters = vec![ty, ty]; let fun = match name { "modf" => MacroCall::MathFunction(MathFunction::Modf), "frexp" => MacroCall::MathFunction(MathFunction::Frexp), _ => unreachable!(), }; declaration.overloads.push(Overload { parameters, parameters_info: vec![ ParameterInfo { qualifier: ParameterQualifier::In, depth: false, }, ParameterInfo { qualifier: ParameterQualifier::Out, depth: false, }, ], kind: FunctionKind::Macro(fun), defined: false, internal: true, void: false, }) } } "cross" => { let args = vec![ TypeInner::Vector { size: VectorSize::Tri, kind: Sk::Float, width: float_width, }, TypeInner::Vector { size: VectorSize::Tri, kind: Sk::Float, width: float_width, }, ]; declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Cross))) } "outerProduct" => { // bits layout // bit 0 trough 3 - dims for bits in 0..0b1001 { let (size1, size2) = match bits { 0b0000 => (VectorSize::Bi, VectorSize::Bi), 0b0001 => (VectorSize::Bi, VectorSize::Tri), 0b0010 => (VectorSize::Bi, VectorSize::Quad), 0b0011 => (VectorSize::Tri, VectorSize::Bi), 0b0100 => (VectorSize::Tri, VectorSize::Tri), 0b0101 => (VectorSize::Tri, VectorSize::Quad), 0b0110 => (VectorSize::Quad, VectorSize::Bi), 0b0111 => (VectorSize::Quad, VectorSize::Tri), _ => (VectorSize::Quad, VectorSize::Quad), }; let args = vec![ TypeInner::Vector { size: size1, kind: Sk::Float, width: float_width, }, TypeInner::Vector { size: size2, kind: Sk::Float, width: float_width, }, ]; declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Outer))) } } "faceforward" | "fma" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let ty = || match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }; let args = vec![ty(), ty(), ty()]; let fun = match name { "faceforward" => MacroCall::MathFunction(MathFunction::FaceForward), "fma" => MacroCall::MathFunction(MathFunction::Fma), _ => unreachable!(), }; declaration.overloads.push(module.add_builtin(args, fun)) } } "refract" => { // bits layout // bit 0 trough 1 - dims for bits in 0..0b100 { let size = match bits { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; let ty = || match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }; let args = vec![ ty(), ty(), TypeInner::Scalar { kind: Sk::Float, width: 4, }, ]; declaration .overloads .push(module.add_builtin(args, MacroCall::MathFunction(MathFunction::Refract))) } } "smoothstep" => { // bit 0 - splatted // bit 1 trough 2 - dims for bits in 0..0b1000 { let splatted = bits & 0b1 == 0b1; let size = match bits >> 1 { 0b00 => None, 0b01 => Some(VectorSize::Bi), 0b10 => Some(VectorSize::Tri), _ => Some(VectorSize::Quad), }; if splatted && size.is_none() { continue; } let base_ty = || match size { Some(size) => TypeInner::Vector { size, kind: Sk::Float, width: float_width, }, None => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, }; let ty = || match splatted { true => TypeInner::Scalar { kind: Sk::Float, width: float_width, }, false => base_ty(), }; declaration.overloads.push(module.add_builtin( vec![ty(), ty(), base_ty()], MacroCall::SmoothStep { splatted: size }, )) } } // The function isn't a builtin or we don't yet support it _ => {} } } #[derive(Clone, Copy, PartialEq, Debug)] pub enum TextureLevelType { None, Lod, Grad, } /// A compiler defined builtin function #[derive(Clone, Copy, PartialEq, Debug)] pub enum MacroCall { Sampler, SamplerShadow, Texture { proj: bool, offset: bool, shadow: bool, level_type: TextureLevelType, }, TextureSize { arrayed: bool, }, ImageLoad { multi: bool, }, ImageStore, MathFunction(MathFunction), FindLsbUint, FindMsbUint, BitfieldExtract, BitfieldInsert, Relational(RelationalFunction), Binary(BinaryOperator), Mod(Option), Splatted(MathFunction, Option, usize), MixBoolean, Clamp(Option), BitCast(Sk), Derivate(DerivativeAxis), Barrier, /// SmoothStep needs a separate variant because it might need it's inputs /// to be splatted depending on the overload SmoothStep { /// The size of the splat operation if some splatted: Option, }, } impl MacroCall { /// Adds the necessary expressions and statements to the passed body and /// finally returns the final expression with the correct result pub fn call( &self, parser: &mut Parser, ctx: &mut Context, body: &mut Block, args: &mut [Handle], meta: Span, ) -> Result>> { Ok(Some(match *self { MacroCall::Sampler => { ctx.samplers.insert(args[0], args[1]); args[0] } MacroCall::SamplerShadow => { sampled_to_depth(&mut parser.module, ctx, args[0], meta, &mut parser.errors); parser.invalidate_expression(ctx, args[0], meta)?; ctx.samplers.insert(args[0], args[1]); args[0] } MacroCall::Texture { proj, offset, shadow, level_type, } => { let mut coords = args[1]; if proj { let size = match *parser.resolve_type(ctx, coords, meta)? { TypeInner::Vector { size, .. } => size, _ => unreachable!(), }; let mut right = ctx.add_expression( Expression::AccessIndex { base: coords, index: size as u32 - 1, }, Span::default(), body, ); let left = if let VectorSize::Bi = size { ctx.add_expression( Expression::AccessIndex { base: coords, index: 0, }, Span::default(), body, ) } else { let size = match size { VectorSize::Tri => VectorSize::Bi, _ => VectorSize::Tri, }; right = ctx.add_expression( Expression::Splat { size, value: right }, Span::default(), body, ); ctx.vector_resize(size, coords, Span::default(), body) }; coords = ctx.add_expression( Expression::Binary { op: BinaryOperator::Divide, left, right, }, Span::default(), body, ); } let extra = args.get(2).copied(); let comps = parser.coordinate_components(ctx, args[0], coords, extra, meta, body)?; let mut num_args = 2; if comps.used_extra { num_args += 1; }; // Parse out explicit texture level. let mut level = match level_type { TextureLevelType::None => SampleLevel::Auto, TextureLevelType::Lod => { num_args += 1; if shadow { log::warn!("Assuming LOD {:?} is zero", args[2],); SampleLevel::Zero } else { SampleLevel::Exact(args[2]) } } TextureLevelType::Grad => { num_args += 2; if shadow { log::warn!( "Assuming gradients {:?} and {:?} are not greater than 1", args[2], args[3], ); SampleLevel::Zero } else { SampleLevel::Gradient { x: args[2], y: args[3], } } } }; let texture_offset = match offset { true => { let offset_arg = args[num_args]; num_args += 1; match parser.solve_constant(ctx, offset_arg, meta) { Ok(v) => Some(v), Err(e) => { parser.errors.push(e); None } } } false => None, }; // Now go back and look for optional bias arg (if available) if let TextureLevelType::None = level_type { level = args .get(num_args) .copied() .map_or(SampleLevel::Auto, SampleLevel::Bias); } texture_call(ctx, args[0], level, comps, texture_offset, body, meta)? } MacroCall::TextureSize { arrayed } => { let mut expr = ctx.add_expression( Expression::ImageQuery { image: args[0], query: ImageQuery::Size { level: args.get(1).copied(), }, }, Span::default(), body, ); if arrayed { let mut components = Vec::with_capacity(4); let size = match *parser.resolve_type(ctx, expr, meta)? { TypeInner::Vector { size: ori_size, .. } => { for index in 0..(ori_size as u32) { components.push(ctx.add_expression( Expression::AccessIndex { base: expr, index }, Span::default(), body, )) } match ori_size { VectorSize::Bi => VectorSize::Tri, _ => VectorSize::Quad, } } _ => { components.push(expr); VectorSize::Bi } }; components.push(ctx.add_expression( Expression::ImageQuery { image: args[0], query: ImageQuery::NumLayers, }, Span::default(), body, )); let ty = parser.module.types.insert( Type { name: None, inner: TypeInner::Vector { size, kind: crate::ScalarKind::Sint, width: 4, }, }, Span::default(), ); expr = ctx.add_expression(Expression::Compose { components, ty }, meta, body) } expr } MacroCall::ImageLoad { multi } => { let comps = parser.coordinate_components(ctx, args[0], args[1], None, meta, body)?; let (sample, level) = match (multi, args.get(2)) { (_, None) => (None, None), (true, Some(&arg)) => (Some(arg), None), (false, Some(&arg)) => (None, Some(arg)), }; ctx.add_expression( Expression::ImageLoad { image: args[0], coordinate: comps.coordinate, array_index: comps.array_index, sample, level, }, Span::default(), body, ) } MacroCall::ImageStore => { let comps = parser.coordinate_components(ctx, args[0], args[1], None, meta, body)?; ctx.emit_restart(body); body.push( crate::Statement::ImageStore { image: args[0], coordinate: comps.coordinate, array_index: comps.array_index, value: args[2], }, meta, ); return Ok(None); } MacroCall::MathFunction(fun) => ctx.add_expression( Expression::Math { fun, arg: args[0], arg1: args.get(1).copied(), arg2: args.get(2).copied(), arg3: args.get(3).copied(), }, Span::default(), body, ), mc @ (MacroCall::FindLsbUint | MacroCall::FindMsbUint) => { let fun = match mc { MacroCall::FindLsbUint => MathFunction::FindLsb, MacroCall::FindMsbUint => MathFunction::FindMsb, _ => unreachable!(), }; let res = ctx.add_expression( Expression::Math { fun, arg: args[0], arg1: None, arg2: None, arg3: None, }, Span::default(), body, ); ctx.add_expression( Expression::As { expr: res, kind: Sk::Sint, convert: Some(4), }, Span::default(), body, ) } MacroCall::BitfieldInsert => { let conv_arg_2 = ctx.add_expression( Expression::As { expr: args[2], kind: Sk::Uint, convert: Some(4), }, Span::default(), body, ); let conv_arg_3 = ctx.add_expression( Expression::As { expr: args[3], kind: Sk::Uint, convert: Some(4), }, Span::default(), body, ); ctx.add_expression( Expression::Math { fun: MathFunction::InsertBits, arg: args[0], arg1: Some(args[1]), arg2: Some(conv_arg_2), arg3: Some(conv_arg_3), }, Span::default(), body, ) } MacroCall::BitfieldExtract => { let conv_arg_1 = ctx.add_expression( Expression::As { expr: args[1], kind: Sk::Uint, convert: Some(4), }, Span::default(), body, ); let conv_arg_2 = ctx.add_expression( Expression::As { expr: args[2], kind: Sk::Uint, convert: Some(4), }, Span::default(), body, ); ctx.add_expression( Expression::Math { fun: MathFunction::ExtractBits, arg: args[0], arg1: Some(conv_arg_1), arg2: Some(conv_arg_2), arg3: None, }, Span::default(), body, ) } MacroCall::Relational(fun) => ctx.add_expression( Expression::Relational { fun, argument: args[0], }, Span::default(), body, ), MacroCall::Binary(op) => ctx.add_expression( Expression::Binary { op, left: args[0], right: args[1], }, Span::default(), body, ), MacroCall::Mod(size) => { ctx.implicit_splat(parser, &mut args[1], meta, size)?; // x - y * floor(x / y) let div = ctx.add_expression( Expression::Binary { op: BinaryOperator::Divide, left: args[0], right: args[1], }, Span::default(), body, ); let floor = ctx.add_expression( Expression::Math { fun: MathFunction::Floor, arg: div, arg1: None, arg2: None, arg3: None, }, Span::default(), body, ); let mult = ctx.add_expression( Expression::Binary { op: BinaryOperator::Multiply, left: floor, right: args[1], }, Span::default(), body, ); ctx.add_expression( Expression::Binary { op: BinaryOperator::Subtract, left: args[0], right: mult, }, Span::default(), body, ) } MacroCall::Splatted(fun, size, i) => { ctx.implicit_splat(parser, &mut args[i], meta, size)?; ctx.add_expression( Expression::Math { fun, arg: args[0], arg1: args.get(1).copied(), arg2: args.get(2).copied(), arg3: args.get(3).copied(), }, Span::default(), body, ) } MacroCall::MixBoolean => ctx.add_expression( Expression::Select { condition: args[2], accept: args[1], reject: args[0], }, Span::default(), body, ), MacroCall::Clamp(size) => { ctx.implicit_splat(parser, &mut args[1], meta, size)?; ctx.implicit_splat(parser, &mut args[2], meta, size)?; ctx.add_expression( Expression::Math { fun: MathFunction::Clamp, arg: args[0], arg1: args.get(1).copied(), arg2: args.get(2).copied(), arg3: args.get(3).copied(), }, Span::default(), body, ) } MacroCall::BitCast(kind) => ctx.add_expression( Expression::As { expr: args[0], kind, convert: None, }, Span::default(), body, ), MacroCall::Derivate(axis) => ctx.add_expression( Expression::Derivative { axis, expr: args[0], }, Span::default(), body, ), MacroCall::Barrier => { ctx.emit_restart(body); body.push(crate::Statement::Barrier(crate::Barrier::all()), meta); return Ok(None); } MacroCall::SmoothStep { splatted } => { ctx.implicit_splat(parser, &mut args[0], meta, splatted)?; ctx.implicit_splat(parser, &mut args[1], meta, splatted)?; ctx.add_expression( Expression::Math { fun: MathFunction::SmoothStep, arg: args[0], arg1: args.get(1).copied(), arg2: args.get(2).copied(), arg3: None, }, Span::default(), body, ) } })) } } fn texture_call( ctx: &mut Context, image: Handle, level: SampleLevel, comps: CoordComponents, offset: Option>, body: &mut Block, meta: Span, ) -> Result> { if let Some(sampler) = ctx.samplers.get(&image).copied() { let mut array_index = comps.array_index; if let Some(ref mut array_index_expr) = array_index { ctx.conversion(array_index_expr, meta, Sk::Sint, 4)?; } Ok(ctx.add_expression( Expression::ImageSample { image, sampler, gather: None, //TODO coordinate: comps.coordinate, array_index, offset, level, depth_ref: comps.depth_ref, }, meta, body, )) } else { Err(Error { kind: ErrorKind::SemanticError("Bad call".into()), meta, }) } } /// Helper struct for texture calls with the separate components from the vector argument /// /// Obtained by calling [`coordinate_components`](Parser::coordinate_components) #[derive(Debug)] struct CoordComponents { coordinate: Handle, depth_ref: Option>, array_index: Option>, used_extra: bool, } impl Parser { /// Helper function for texture calls, splits the vector argument into it's components fn coordinate_components( &mut self, ctx: &mut Context, image: Handle, coord: Handle, extra: Option>, meta: Span, body: &mut Block, ) -> Result { if let TypeInner::Image { dim, arrayed, class, } = *self.resolve_type(ctx, image, meta)? { let image_size = match dim { Dim::D1 => None, Dim::D2 => Some(VectorSize::Bi), Dim::D3 => Some(VectorSize::Tri), Dim::Cube => Some(VectorSize::Tri), }; let coord_size = match *self.resolve_type(ctx, coord, meta)? { TypeInner::Vector { size, .. } => Some(size), _ => None, }; let (shadow, storage) = match class { ImageClass::Depth { .. } => (true, false), ImageClass::Storage { .. } => (false, true), _ => (false, false), }; let coordinate = match (image_size, coord_size) { (Some(size), Some(coord_s)) if size != coord_s => { ctx.vector_resize(size, coord, Span::default(), body) } (None, Some(_)) => ctx.add_expression( Expression::AccessIndex { base: coord, index: 0, }, Span::default(), body, ), _ => coord, }; let mut coord_index = image_size.map_or(1, |s| s as u32); let array_index = if arrayed && !(storage && dim == Dim::Cube) { let index = coord_index; coord_index += 1; Some(ctx.add_expression( Expression::AccessIndex { base: coord, index }, Span::default(), body, )) } else { None }; let mut used_extra = false; let depth_ref = match shadow { true => { let index = coord_index; if index == 4 { used_extra = true; extra } else { Some(ctx.add_expression( Expression::AccessIndex { base: coord, index }, Span::default(), body, )) } } false => None, }; Ok(CoordComponents { coordinate, depth_ref, array_index, used_extra, }) } else { self.errors.push(Error { kind: ErrorKind::SemanticError("Type is not an image".into()), meta, }); Ok(CoordComponents { coordinate: coord, depth_ref: None, array_index: None, used_extra: false, }) } } } /// Helper function to cast a expression holding a sampled image to a /// depth image. pub fn sampled_to_depth( module: &mut Module, ctx: &mut Context, image: Handle, meta: Span, errors: &mut Vec, ) { // Get the a mutable type handle of the underlying image storage let ty = match ctx[image] { Expression::GlobalVariable(handle) => &mut module.global_variables.get_mut(handle).ty, Expression::FunctionArgument(i) => { // Mark the function argument as carrying a depth texture ctx.parameters_info[i as usize].depth = true; // NOTE: We need to later also change the parameter type &mut ctx.arguments[i as usize].ty } _ => { // Only globals and function arguments are allowed to carry an image return errors.push(Error { kind: ErrorKind::SemanticError("Not a valid texture expression".into()), meta, }); } }; match module.types[*ty].inner { // Update the image class to depth in case it already isn't TypeInner::Image { class, dim, arrayed, } => match class { ImageClass::Sampled { multi, .. } => { *ty = module.types.insert( Type { name: None, inner: TypeInner::Image { dim, arrayed, class: ImageClass::Depth { multi }, }, }, Span::default(), ) } ImageClass::Depth { .. } => {} // Other image classes aren't allowed to be transformed to depth _ => errors.push(Error { kind: ErrorKind::SemanticError("Not a texture".into()), meta, }), }, _ => errors.push(Error { kind: ErrorKind::SemanticError("Not a texture".into()), meta, }), }; // Copy the handle to allow borrowing the `ctx` again let ty = *ty; // If the image was passed trough a function argument we also need to change // the corresponding parameter if let Expression::FunctionArgument(i) = ctx[image] { ctx.parameters[i as usize] = ty; } } bitflags::bitflags! { /// Influences the operation `texture_args_generator` struct TextureArgsOptions: u32 { /// Generates multisampled variants of images const MULTI = 1 << 0; /// Generates shadow variants of images const SHADOW = 1 << 1; /// Generates standard images const STANDARD = 1 << 2; /// Generates cube arrayed images const CUBE_ARRAY = 1 << 3; /// Generates cube arrayed images const D2_MULTI_ARRAY = 1 << 4; } } impl From for TextureArgsOptions { fn from(variations: BuiltinVariations) -> Self { let mut options = TextureArgsOptions::empty(); if variations.contains(BuiltinVariations::STANDARD) { options |= TextureArgsOptions::STANDARD } if variations.contains(BuiltinVariations::CUBE_TEXTURES_ARRAY) { options |= TextureArgsOptions::CUBE_ARRAY } if variations.contains(BuiltinVariations::D2_MULTI_TEXTURES_ARRAY) { options |= TextureArgsOptions::D2_MULTI_ARRAY } options } } /// Helper function to generate the image components for texture/image builtins /// /// Calls the passed function `f` with: /// ```text /// f(ScalarKind, ImageDimension, arrayed, multi, shadow) /// ``` /// /// `options` controls extra image variants generation like multisampling and depth, /// see the struct documentation fn texture_args_generator( options: TextureArgsOptions, mut f: impl FnMut(crate::ScalarKind, Dim, bool, bool, bool), ) { for kind in [Sk::Float, Sk::Uint, Sk::Sint].iter().copied() { for dim in [Dim::D1, Dim::D2, Dim::D3, Dim::Cube].iter().copied() { for arrayed in [false, true].iter().copied() { if dim == Dim::Cube && arrayed { if !options.contains(TextureArgsOptions::CUBE_ARRAY) { continue; } } else if Dim::D2 == dim && options.contains(TextureArgsOptions::MULTI) && arrayed && options.contains(TextureArgsOptions::D2_MULTI_ARRAY) { // multisampling for sampler2DMSArray f(kind, dim, arrayed, true, false); } else if !options.contains(TextureArgsOptions::STANDARD) { continue; } f(kind, dim, arrayed, false, false); // 3D images can't be neither arrayed nor shadow // so we break out early, this way arrayed will always // be false and we won't hit the shadow branch if let Dim::D3 = dim { break; } if Dim::D2 == dim && options.contains(TextureArgsOptions::MULTI) && !arrayed { // multisampling f(kind, dim, arrayed, true, false); } if Sk::Float == kind && options.contains(TextureArgsOptions::SHADOW) { // shadow f(kind, dim, arrayed, false, true); } } } } } /// Helper functions used to convert from a image dimension into a integer representing the /// number of components needed for the coordinates vector (1 means scalar instead of vector) const fn image_dims_to_coords_size(dim: Dim) -> usize { match dim { Dim::D1 => 1, Dim::D2 => 2, _ => 3, } } ================================================ FILE: lib/naga/src/front/glsl/constants.rs ================================================ use crate::{ arena::{Arena, Handle, UniqueArena}, BinaryOperator, Constant, ConstantInner, Expression, ScalarKind, ScalarValue, Type, TypeInner, UnaryOperator, }; #[derive(Debug)] pub struct ConstantSolver<'a> { pub types: &'a mut UniqueArena, pub expressions: &'a Arena, pub constants: &'a mut Arena, } #[derive(Clone, Debug, PartialEq, thiserror::Error)] pub enum ConstantSolvingError { #[error("Constants cannot access function arguments")] FunctionArg, #[error("Constants cannot access global variables")] GlobalVariable, #[error("Constants cannot access local variables")] LocalVariable, #[error("Cannot get the array length of a non array type")] InvalidArrayLengthArg, #[error("Constants cannot get the array length of a dynamically sized array")] ArrayLengthDynamic, #[error("Constants cannot call functions")] Call, #[error("Constants don't support atomic functions")] Atomic, #[error("Constants don't support relational functions")] Relational, #[error("Constants don't support derivative functions")] Derivative, #[error("Constants don't support select expressions")] Select, #[error("Constants don't support load expressions")] Load, #[error("Constants don't support image expressions")] ImageExpression, #[error("Cannot access the type")] InvalidAccessBase, #[error("Cannot access at the index")] InvalidAccessIndex, #[error("Cannot access with index of type")] InvalidAccessIndexTy, #[error("Constants don't support bitcasts")] Bitcast, #[error("Cannot cast type")] InvalidCastArg, #[error("Cannot apply the unary op to the argument")] InvalidUnaryOpArg, #[error("Cannot apply the binary op to the arguments")] InvalidBinaryOpArgs, #[error("Cannot apply math function to type")] InvalidMathArg, #[error("Splat is defined only on scalar values")] SplatScalarOnly, #[error("Can only swizzle vector constants")] SwizzleVectorOnly, #[error("Not implemented as constant expression: {0}")] NotImplemented(String), } impl<'a> ConstantSolver<'a> { pub fn solve( &mut self, expr: Handle, ) -> Result, ConstantSolvingError> { let span = self.expressions.get_span(expr); match self.expressions[expr] { Expression::Constant(constant) => Ok(constant), Expression::AccessIndex { base, index } => self.access(base, index as usize), Expression::Access { base, index } => { let index = self.solve(index)?; self.access(base, self.constant_index(index)?) } Expression::Splat { size, value: splat_value, } => { let value_constant = self.solve(splat_value)?; let ty = match self.constants[value_constant].inner { ConstantInner::Scalar { ref value, width } => { let kind = value.scalar_kind(); self.types.insert( Type { name: None, inner: TypeInner::Vector { size, kind, width }, }, span, ) } ConstantInner::Composite { .. } => { return Err(ConstantSolvingError::SplatScalarOnly); } }; let inner = ConstantInner::Composite { ty, components: vec![value_constant; size as usize], }; Ok(self.register_constant(inner, span)) } Expression::Swizzle { size, vector: src_vector, pattern, } => { let src_constant = self.solve(src_vector)?; let (ty, src_components) = match self.constants[src_constant].inner { ConstantInner::Scalar { .. } => { return Err(ConstantSolvingError::SwizzleVectorOnly); } ConstantInner::Composite { ty, components: ref src_components, } => match self.types[ty].inner { crate::TypeInner::Vector { size: _, kind, width, } => { let dst_ty = self.types.insert( Type { name: None, inner: crate::TypeInner::Vector { size, kind, width }, }, span, ); (dst_ty, &src_components[..]) } _ => { return Err(ConstantSolvingError::SwizzleVectorOnly); } }, }; let components = pattern .iter() .map(|&sc| src_components[sc as usize]) .collect(); let inner = ConstantInner::Composite { ty, components }; Ok(self.register_constant(inner, span)) } Expression::Compose { ty, ref components } => { let components = components .iter() .map(|c| self.solve(*c)) .collect::>()?; let inner = ConstantInner::Composite { ty, components }; Ok(self.register_constant(inner, span)) } Expression::Unary { expr, op } => { let expr_constant = self.solve(expr)?; self.unary_op(op, expr_constant, span) } Expression::Binary { left, right, op } => { let left_constant = self.solve(left)?; let right_constant = self.solve(right)?; self.binary_op(op, left_constant, right_constant, span) } Expression::Math { fun, arg, arg1, arg2, .. } => { let arg = self.solve(arg)?; let arg1 = arg1.map(|arg| self.solve(arg)).transpose()?; let arg2 = arg2.map(|arg| self.solve(arg)).transpose()?; let const0 = &self.constants[arg].inner; let const1 = arg1.map(|arg| &self.constants[arg].inner); let const2 = arg2.map(|arg| &self.constants[arg].inner); match fun { crate::MathFunction::Pow => { let (value, width) = match (const0, const1.unwrap()) { ( &ConstantInner::Scalar { width, value: value0, }, &ConstantInner::Scalar { value: value1, .. }, ) => ( match (value0, value1) { (ScalarValue::Sint(a), ScalarValue::Sint(b)) => { ScalarValue::Sint(a.pow(b as u32)) } (ScalarValue::Uint(a), ScalarValue::Uint(b)) => { ScalarValue::Uint(a.pow(b as u32)) } (ScalarValue::Float(a), ScalarValue::Float(b)) => { ScalarValue::Float(a.powf(b)) } _ => return Err(ConstantSolvingError::InvalidMathArg), }, width, ), _ => return Err(ConstantSolvingError::InvalidMathArg), }; let inner = ConstantInner::Scalar { width, value }; Ok(self.register_constant(inner, span)) } crate::MathFunction::Clamp => { let (value, width) = match (const0, const1.unwrap(), const2.unwrap()) { ( &ConstantInner::Scalar { width, value: value0, }, &ConstantInner::Scalar { value: value1, .. }, &ConstantInner::Scalar { value: value2, .. }, ) => ( match (value0, value1, value2) { ( ScalarValue::Sint(a), ScalarValue::Sint(b), ScalarValue::Sint(c), ) => ScalarValue::Sint(a.max(b).min(c)), ( ScalarValue::Uint(a), ScalarValue::Uint(b), ScalarValue::Uint(c), ) => ScalarValue::Uint(a.max(b).min(c)), ( ScalarValue::Float(a), ScalarValue::Float(b), ScalarValue::Float(c), ) => ScalarValue::Float(glsl_float_clamp(a, b, c)), _ => return Err(ConstantSolvingError::InvalidMathArg), }, width, ), _ => { return Err(ConstantSolvingError::NotImplemented(format!( "{:?} applied to vector values", fun ))) } }; let inner = ConstantInner::Scalar { width, value }; Ok(self.register_constant(inner, span)) } _ => Err(ConstantSolvingError::NotImplemented(format!("{:?}", fun))), } } Expression::As { convert, expr, kind, } => { let expr_constant = self.solve(expr)?; match convert { Some(width) => self.cast(expr_constant, kind, width, span), None => Err(ConstantSolvingError::Bitcast), } } Expression::ArrayLength(expr) => { let array = self.solve(expr)?; match self.constants[array].inner { ConstantInner::Scalar { .. } => { Err(ConstantSolvingError::InvalidArrayLengthArg) } ConstantInner::Composite { ty, .. } => match self.types[ty].inner { TypeInner::Array { size, .. } => match size { crate::ArraySize::Constant(constant) => Ok(constant), crate::ArraySize::Dynamic => { Err(ConstantSolvingError::ArrayLengthDynamic) } }, _ => Err(ConstantSolvingError::InvalidArrayLengthArg), }, } } Expression::Load { .. } => Err(ConstantSolvingError::Load), Expression::Select { .. } => Err(ConstantSolvingError::Select), Expression::LocalVariable(_) => Err(ConstantSolvingError::LocalVariable), Expression::Derivative { .. } => Err(ConstantSolvingError::Derivative), Expression::Relational { .. } => Err(ConstantSolvingError::Relational), Expression::CallResult { .. } => Err(ConstantSolvingError::Call), Expression::AtomicResult { .. } => Err(ConstantSolvingError::Atomic), Expression::FunctionArgument(_) => Err(ConstantSolvingError::FunctionArg), Expression::GlobalVariable(_) => Err(ConstantSolvingError::GlobalVariable), Expression::ImageSample { .. } | Expression::ImageLoad { .. } | Expression::ImageQuery { .. } => Err(ConstantSolvingError::ImageExpression), } } fn access( &mut self, base: Handle, index: usize, ) -> Result, ConstantSolvingError> { let base = self.solve(base)?; match self.constants[base].inner { ConstantInner::Scalar { .. } => Err(ConstantSolvingError::InvalidAccessBase), ConstantInner::Composite { ty, ref components } => { match self.types[ty].inner { TypeInner::Vector { .. } | TypeInner::Matrix { .. } | TypeInner::Array { .. } | TypeInner::Struct { .. } => (), _ => return Err(ConstantSolvingError::InvalidAccessBase), } components .get(index) .copied() .ok_or(ConstantSolvingError::InvalidAccessIndex) } } } fn constant_index(&self, constant: Handle) -> Result { match self.constants[constant].inner { ConstantInner::Scalar { value: ScalarValue::Uint(index), .. } => Ok(index as usize), _ => Err(ConstantSolvingError::InvalidAccessIndexTy), } } fn cast( &mut self, constant: Handle, kind: ScalarKind, target_width: crate::Bytes, span: crate::Span, ) -> Result, ConstantSolvingError> { let mut inner = self.constants[constant].inner.clone(); match inner { ConstantInner::Scalar { ref mut value, ref mut width, } => { *width = target_width; *value = match kind { ScalarKind::Sint => ScalarValue::Sint(match *value { ScalarValue::Sint(v) => v, ScalarValue::Uint(v) => v as i64, ScalarValue::Float(v) => v as i64, ScalarValue::Bool(v) => v as i64, }), ScalarKind::Uint => ScalarValue::Uint(match *value { ScalarValue::Sint(v) => v as u64, ScalarValue::Uint(v) => v, ScalarValue::Float(v) => v as u64, ScalarValue::Bool(v) => v as u64, }), ScalarKind::Float => ScalarValue::Float(match *value { ScalarValue::Sint(v) => v as f64, ScalarValue::Uint(v) => v as f64, ScalarValue::Float(v) => v, ScalarValue::Bool(v) => v as u64 as f64, }), ScalarKind::Bool => ScalarValue::Bool(match *value { ScalarValue::Sint(v) => v != 0, ScalarValue::Uint(v) => v != 0, ScalarValue::Float(v) => v != 0.0, ScalarValue::Bool(v) => v, }), } } ConstantInner::Composite { ty, ref mut components, } => { match self.types[ty].inner { TypeInner::Vector { .. } | TypeInner::Matrix { .. } => (), _ => return Err(ConstantSolvingError::InvalidCastArg), } for component in components { *component = self.cast(*component, kind, target_width, span)?; } } } Ok(self.register_constant(inner, span)) } fn unary_op( &mut self, op: UnaryOperator, constant: Handle, span: crate::Span, ) -> Result, ConstantSolvingError> { let mut inner = self.constants[constant].inner.clone(); match inner { ConstantInner::Scalar { ref mut value, .. } => match op { UnaryOperator::Negate => match *value { ScalarValue::Sint(ref mut v) => *v = -*v, ScalarValue::Float(ref mut v) => *v = -*v, _ => return Err(ConstantSolvingError::InvalidUnaryOpArg), }, UnaryOperator::Not => match *value { ScalarValue::Sint(ref mut v) => *v = !*v, ScalarValue::Uint(ref mut v) => *v = !*v, ScalarValue::Bool(ref mut v) => *v = !*v, _ => return Err(ConstantSolvingError::InvalidUnaryOpArg), }, }, ConstantInner::Composite { ty, ref mut components, } => { match self.types[ty].inner { TypeInner::Vector { .. } | TypeInner::Matrix { .. } => (), _ => return Err(ConstantSolvingError::InvalidCastArg), } for component in components { *component = self.unary_op(op, *component, span)? } } } Ok(self.register_constant(inner, span)) } fn binary_op( &mut self, op: BinaryOperator, left: Handle, right: Handle, span: crate::Span, ) -> Result, ConstantSolvingError> { let left_inner = &self.constants[left].inner; let right_inner = &self.constants[right].inner; let inner = match (left_inner, right_inner) { ( &ConstantInner::Scalar { value: left_value, width, }, &ConstantInner::Scalar { value: right_value, width: _, }, ) => { let value = match op { BinaryOperator::Equal => ScalarValue::Bool(left_value == right_value), BinaryOperator::NotEqual => ScalarValue::Bool(left_value != right_value), BinaryOperator::Less => ScalarValue::Bool(left_value < right_value), BinaryOperator::LessEqual => ScalarValue::Bool(left_value <= right_value), BinaryOperator::Greater => ScalarValue::Bool(left_value > right_value), BinaryOperator::GreaterEqual => ScalarValue::Bool(left_value >= right_value), _ => match (left_value, right_value) { (ScalarValue::Sint(a), ScalarValue::Sint(b)) => { ScalarValue::Sint(match op { BinaryOperator::Add => a.wrapping_add(b), BinaryOperator::Subtract => a.wrapping_sub(b), BinaryOperator::Multiply => a.wrapping_mul(b), BinaryOperator::Divide => a.checked_div(b).unwrap_or(0), BinaryOperator::Modulo => a.checked_rem(b).unwrap_or(0), BinaryOperator::And => a & b, BinaryOperator::ExclusiveOr => a ^ b, BinaryOperator::InclusiveOr => a | b, _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }) } (ScalarValue::Sint(a), ScalarValue::Uint(b)) => { ScalarValue::Sint(match op { BinaryOperator::ShiftLeft => a.wrapping_shl(b as u32), BinaryOperator::ShiftRight => a.wrapping_shr(b as u32), _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }) } (ScalarValue::Uint(a), ScalarValue::Uint(b)) => { ScalarValue::Uint(match op { BinaryOperator::Add => a.wrapping_add(b), BinaryOperator::Subtract => a.wrapping_sub(b), BinaryOperator::Multiply => a.wrapping_mul(b), BinaryOperator::Divide => a.checked_div(b).unwrap_or(0), BinaryOperator::Modulo => a.checked_rem(b).unwrap_or(0), BinaryOperator::And => a & b, BinaryOperator::ExclusiveOr => a ^ b, BinaryOperator::InclusiveOr => a | b, BinaryOperator::ShiftLeft => a.wrapping_shl(b as u32), BinaryOperator::ShiftRight => a.wrapping_shr(b as u32), _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }) } (ScalarValue::Float(a), ScalarValue::Float(b)) => { ScalarValue::Float(match op { BinaryOperator::Add => a + b, BinaryOperator::Subtract => a - b, BinaryOperator::Multiply => a * b, BinaryOperator::Divide => a / b, BinaryOperator::Modulo => a - b * (a / b).floor(), _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }) } (ScalarValue::Bool(a), ScalarValue::Bool(b)) => { ScalarValue::Bool(match op { BinaryOperator::LogicalAnd => a && b, BinaryOperator::LogicalOr => a || b, _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }) } _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }, }; ConstantInner::Scalar { value, width } } (&ConstantInner::Composite { ref components, ty }, &ConstantInner::Scalar { .. }) => { let mut components = components.clone(); for comp in components.iter_mut() { *comp = self.binary_op(op, *comp, right, span)?; } ConstantInner::Composite { ty, components } } (&ConstantInner::Scalar { .. }, &ConstantInner::Composite { ref components, ty }) => { let mut components = components.clone(); for comp in components.iter_mut() { *comp = self.binary_op(op, left, *comp, span)?; } ConstantInner::Composite { ty, components } } _ => return Err(ConstantSolvingError::InvalidBinaryOpArgs), }; Ok(self.register_constant(inner, span)) } fn register_constant(&mut self, inner: ConstantInner, span: crate::Span) -> Handle { self.constants.fetch_or_append( Constant { name: None, specialization: None, inner, }, span, ) } } /// Helper function to implement the GLSL `max` function for floats. /// /// While Rust does provide a `f64::max` method, it has a different behavior than the /// GLSL `max` for NaNs. In Rust, if any of the arguments is a NaN, then the other /// is returned. /// /// This leads to different results in the following example /// ``` /// use std::cmp::max; /// std::f64::NAN.max(1.0); /// ``` /// /// Rust will return `1.0` while GLSL should return NaN. fn glsl_float_max(x: f64, y: f64) -> f64 { if x < y { y } else { x } } /// Helper function to implement the GLSL `min` function for floats. /// /// While Rust does provide a `f64::min` method, it has a different behavior than the /// GLSL `min` for NaNs. In Rust, if any of the arguments is a NaN, then the other /// is returned. /// /// This leads to different results in the following example /// ``` /// use std::cmp::min; /// std::f64::NAN.min(1.0); /// ``` /// /// Rust will return `1.0` while GLSL should return NaN. fn glsl_float_min(x: f64, y: f64) -> f64 { if y < x { y } else { x } } /// Helper function to implement the GLSL `clamp` function for floats. /// /// While Rust does provide a `f64::clamp` method, it panics if either /// `min` or `max` are `NaN`s which is not the behavior specified by /// the glsl specification. fn glsl_float_clamp(value: f64, min: f64, max: f64) -> f64 { glsl_float_min(glsl_float_max(value, min), max) } #[cfg(test)] mod tests { use std::vec; use crate::{ Arena, Constant, ConstantInner, Expression, ScalarKind, ScalarValue, Type, TypeInner, UnaryOperator, UniqueArena, VectorSize, }; use super::ConstantSolver; #[test] fn nan_handling() { assert!(super::glsl_float_max(f64::NAN, 2.0).is_nan()); assert!(!super::glsl_float_max(2.0, f64::NAN).is_nan()); assert!(super::glsl_float_min(f64::NAN, 2.0).is_nan()); assert!(!super::glsl_float_min(2.0, f64::NAN).is_nan()); assert!(super::glsl_float_clamp(f64::NAN, 1.0, 2.0).is_nan()); assert!(!super::glsl_float_clamp(1.0, f64::NAN, 2.0).is_nan()); assert!(!super::glsl_float_clamp(1.0, 2.0, f64::NAN).is_nan()); } #[test] fn unary_op() { let mut types = UniqueArena::new(); let mut expressions = Arena::new(); let mut constants = Arena::new(); let vec_ty = types.insert( Type { name: None, inner: TypeInner::Vector { size: VectorSize::Bi, kind: ScalarKind::Sint, width: 4, }, }, Default::default(), ); let h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(4), }, }, Default::default(), ); let h1 = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(8), }, }, Default::default(), ); let vec_h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Composite { ty: vec_ty, components: vec![h, h1], }, }, Default::default(), ); let expr = expressions.append(Expression::Constant(h), Default::default()); let expr1 = expressions.append(Expression::Constant(vec_h), Default::default()); let root1 = expressions.append( Expression::Unary { op: UnaryOperator::Negate, expr, }, Default::default(), ); let root2 = expressions.append( Expression::Unary { op: UnaryOperator::Not, expr, }, Default::default(), ); let root3 = expressions.append( Expression::Unary { op: UnaryOperator::Not, expr: expr1, }, Default::default(), ); let mut solver = ConstantSolver { types: &mut types, expressions: &expressions, constants: &mut constants, }; let res1 = solver.solve(root1).unwrap(); let res2 = solver.solve(root2).unwrap(); let res3 = solver.solve(root3).unwrap(); assert_eq!( constants[res1].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(-4), }, ); assert_eq!( constants[res2].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(!4), }, ); let res3_inner = &constants[res3].inner; match res3_inner { ConstantInner::Composite { ty, components } => { assert_eq!(*ty, vec_ty); let mut components_iter = components.iter().copied(); assert_eq!( constants[components_iter.next().unwrap()].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(!4), }, ); assert_eq!( constants[components_iter.next().unwrap()].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(!8), }, ); assert!(components_iter.next().is_none()); } _ => panic!("Expected vector"), } } #[test] fn cast() { let mut expressions = Arena::new(); let mut constants = Arena::new(); let h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Sint(4), }, }, Default::default(), ); let expr = expressions.append(Expression::Constant(h), Default::default()); let root = expressions.append( Expression::As { expr, kind: ScalarKind::Bool, convert: Some(crate::BOOL_WIDTH), }, Default::default(), ); let mut solver = ConstantSolver { types: &mut UniqueArena::new(), expressions: &expressions, constants: &mut constants, }; let res = solver.solve(root).unwrap(); assert_eq!( constants[res].inner, ConstantInner::Scalar { width: crate::BOOL_WIDTH, value: ScalarValue::Bool(true), }, ); } #[test] fn access() { let mut types = UniqueArena::new(); let mut expressions = Arena::new(); let mut constants = Arena::new(); let matrix_ty = types.insert( Type { name: None, inner: TypeInner::Matrix { columns: VectorSize::Bi, rows: VectorSize::Tri, width: 4, }, }, Default::default(), ); let vec_ty = types.insert( Type { name: None, inner: TypeInner::Vector { size: VectorSize::Tri, kind: ScalarKind::Float, width: 4, }, }, Default::default(), ); let mut vec1_components = Vec::with_capacity(3); let mut vec2_components = Vec::with_capacity(3); for i in 0..3 { let h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Float(i as f64), }, }, Default::default(), ); vec1_components.push(h) } for i in 3..6 { let h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Float(i as f64), }, }, Default::default(), ); vec2_components.push(h) } let vec1 = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Composite { ty: vec_ty, components: vec1_components, }, }, Default::default(), ); let vec2 = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Composite { ty: vec_ty, components: vec2_components, }, }, Default::default(), ); let h = constants.append( Constant { name: None, specialization: None, inner: ConstantInner::Composite { ty: matrix_ty, components: vec![vec1, vec2], }, }, Default::default(), ); let base = expressions.append(Expression::Constant(h), Default::default()); let root1 = expressions.append( Expression::AccessIndex { base, index: 1 }, Default::default(), ); let root2 = expressions.append( Expression::AccessIndex { base: root1, index: 2, }, Default::default(), ); let mut solver = ConstantSolver { types: &mut types, expressions: &expressions, constants: &mut constants, }; let res1 = solver.solve(root1).unwrap(); let res2 = solver.solve(root2).unwrap(); let res1_inner = &constants[res1].inner; match res1_inner { ConstantInner::Composite { ty, components } => { assert_eq!(*ty, vec_ty); let mut components_iter = components.iter().copied(); assert_eq!( constants[components_iter.next().unwrap()].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Float(3.), }, ); assert_eq!( constants[components_iter.next().unwrap()].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Float(4.), }, ); assert_eq!( constants[components_iter.next().unwrap()].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Float(5.), }, ); assert!(components_iter.next().is_none()); } _ => panic!("Expected vector"), } assert_eq!( constants[res2].inner, ConstantInner::Scalar { width: 4, value: ScalarValue::Float(5.), }, ); } } ================================================ FILE: lib/naga/src/front/glsl/context.rs ================================================ use super::{ ast::{ GlobalLookup, GlobalLookupKind, HirExpr, HirExprKind, ParameterInfo, ParameterQualifier, VariableReference, }, error::{Error, ErrorKind}, types::{scalar_components, type_power}, Parser, Result, }; use crate::{ front::{Emitter, Typifier}, AddressSpace, Arena, BinaryOperator, Block, Constant, Expression, FastHashMap, FunctionArgument, Handle, LocalVariable, RelationalFunction, ScalarKind, ScalarValue, Span, Statement, Type, TypeInner, VectorSize, }; use std::{convert::TryFrom, ops::Index}; /// The position at which an expression is, used while lowering #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum ExprPos { /// The expression is in the left hand side of an assignment Lhs, /// The expression is in the right hand side of an assignment Rhs, /// The expression is an array being indexed, needed to allow constant /// arrays to be dynamically indexed AccessBase { /// The index is a constant constant_index: bool, }, } impl ExprPos { /// Returns an lhs position if the current position is lhs otherwise AccessBase const fn maybe_access_base(&self, constant_index: bool) -> Self { match *self { ExprPos::Lhs => *self, _ => ExprPos::AccessBase { constant_index }, } } } #[derive(Debug)] pub struct Context { pub expressions: Arena, pub locals: Arena, pub arguments: Vec, pub parameters: Vec>, pub parameters_info: Vec, pub symbol_table: crate::front::SymbolTable, pub samplers: FastHashMap, Handle>, pub typifier: Typifier, emitter: Emitter, stmt_ctx: Option, } impl Context { pub fn new(parser: &Parser, body: &mut Block) -> Self { let mut this = Context { expressions: Arena::new(), locals: Arena::new(), arguments: Vec::new(), parameters: Vec::new(), parameters_info: Vec::new(), symbol_table: crate::front::SymbolTable::default(), samplers: FastHashMap::default(), typifier: Typifier::new(), emitter: Emitter::default(), stmt_ctx: Some(StmtContext::new()), }; this.emit_start(); for &(ref name, lookup) in parser.global_variables.iter() { this.add_global(parser, name, lookup, body) } this } pub fn add_global( &mut self, parser: &Parser, name: &str, GlobalLookup { kind, entry_arg, mutable, }: GlobalLookup, body: &mut Block, ) { self.emit_end(body); let (expr, load, constant) = match kind { GlobalLookupKind::Variable(v) => { let span = parser.module.global_variables.get_span(v); let res = ( self.expressions.append(Expression::GlobalVariable(v), span), parser.module.global_variables[v].space != AddressSpace::Handle, None, ); self.emit_start(); res } GlobalLookupKind::BlockSelect(handle, index) => { let span = parser.module.global_variables.get_span(handle); let base = self .expressions .append(Expression::GlobalVariable(handle), span); self.emit_start(); let expr = self .expressions .append(Expression::AccessIndex { base, index }, span); ( expr, { let ty = parser.module.global_variables[handle].ty; match parser.module.types[ty].inner { TypeInner::Struct { ref members, .. } => { if let TypeInner::Array { size: crate::ArraySize::Dynamic, .. } = parser.module.types[members[index as usize].ty].inner { false } else { true } } _ => true, } }, None, ) } GlobalLookupKind::Constant(v, ty) => { let span = parser.module.constants.get_span(v); let res = ( self.expressions.append(Expression::Constant(v), span), false, Some((v, ty)), ); self.emit_start(); res } }; let var = VariableReference { expr, load, mutable, constant, entry_arg, }; self.symbol_table.add(name.into(), var); } /// Starts the expression emitter /// /// # Panics /// /// - If called twice in a row without calling [`emit_end`][Self::emit_end]. #[inline] pub fn emit_start(&mut self) { self.emitter.start(&self.expressions) } /// Emits all the expressions captured by the emitter to the passed `body` /// /// # Panics /// /// - If called before calling [`emit_start`]. /// - If called twice in a row without calling [`emit_start`]. /// /// [`emit_start`]: Self::emit_start pub fn emit_end(&mut self, body: &mut Block) { body.extend(self.emitter.finish(&self.expressions)) } /// Emits all the expressions captured by the emitter to the passed `body` /// and starts the emitter again /// /// # Panics /// /// - If called before calling [`emit_start`][Self::emit_start]. pub fn emit_restart(&mut self, body: &mut Block) { self.emit_end(body); self.emit_start() } pub fn add_expression( &mut self, expr: Expression, meta: Span, body: &mut Block, ) -> Handle { let needs_pre_emit = expr.needs_pre_emit(); if needs_pre_emit { self.emit_end(body); } let handle = self.expressions.append(expr, meta); if needs_pre_emit { self.emit_start(); } handle } /// Add variable to current scope /// /// Returns a variable if a variable with the same name was already defined, /// otherwise returns `None` pub fn add_local_var( &mut self, name: String, expr: Handle, mutable: bool, ) -> Option { let var = VariableReference { expr, load: true, mutable, constant: None, entry_arg: None, }; self.symbol_table.add(name, var) } /// Add function argument to current scope pub fn add_function_arg( &mut self, parser: &mut Parser, body: &mut Block, name_meta: Option<(String, Span)>, ty: Handle, qualifier: ParameterQualifier, ) { let index = self.arguments.len(); let mut arg = FunctionArgument { name: name_meta.as_ref().map(|&(ref name, _)| name.clone()), ty, binding: None, }; self.parameters.push(ty); let opaque = match parser.module.types[ty].inner { TypeInner::Image { .. } | TypeInner::Sampler { .. } => true, _ => false, }; if qualifier.is_lhs() { let span = parser.module.types.get_span(arg.ty); arg.ty = parser.module.types.insert( Type { name: None, inner: TypeInner::Pointer { base: arg.ty, space: AddressSpace::Function, }, }, span, ) } self.arguments.push(arg); self.parameters_info.push(ParameterInfo { qualifier, depth: false, }); if let Some((name, meta)) = name_meta { let expr = self.add_expression(Expression::FunctionArgument(index as u32), meta, body); let mutable = qualifier != ParameterQualifier::Const && !opaque; let load = qualifier.is_lhs(); let var = if mutable && !load { let handle = self.locals.append( LocalVariable { name: Some(name.clone()), ty, init: None, }, meta, ); let local_expr = self.add_expression(Expression::LocalVariable(handle), meta, body); self.emit_restart(body); body.push( Statement::Store { pointer: local_expr, value: expr, }, meta, ); VariableReference { expr: local_expr, load: true, mutable, constant: None, entry_arg: None, } } else { VariableReference { expr, load, mutable, constant: None, entry_arg: None, } }; self.symbol_table.add(name, var); } } /// Returns a [`StmtContext`](StmtContext) to be used in parsing and lowering /// /// # Panics /// - If more than one [`StmtContext`](StmtContext) are active at the same /// time or if the previous call didn't use it in lowering. #[must_use] pub fn stmt_ctx(&mut self) -> StmtContext { self.stmt_ctx.take().unwrap() } /// Lowers a [`HirExpr`](HirExpr) which might produce a [`Expression`](Expression). /// /// consumes a [`StmtContext`](StmtContext) returning it to the context so /// that it can be used again later. pub fn lower( &mut self, mut stmt: StmtContext, parser: &mut Parser, expr: Handle, pos: ExprPos, body: &mut Block, ) -> Result<(Option>, Span)> { let res = self.lower_inner(&stmt, parser, expr, pos, body); stmt.hir_exprs.clear(); self.stmt_ctx = Some(stmt); res } /// Similar to [`lower`](Self::lower) but returns an error if the expression /// returns void (ie. doesn't produce a [`Expression`](Expression)). /// /// consumes a [`StmtContext`](StmtContext) returning it to the context so /// that it can be used again later. pub fn lower_expect( &mut self, mut stmt: StmtContext, parser: &mut Parser, expr: Handle, pos: ExprPos, body: &mut Block, ) -> Result<(Handle, Span)> { let res = self.lower_expect_inner(&stmt, parser, expr, pos, body); stmt.hir_exprs.clear(); self.stmt_ctx = Some(stmt); res } /// internal implementation of [`lower_expect`](Self::lower_expect) /// /// this method is only public because it's used in /// [`function_call`](Parser::function_call), unless you know what /// you're doing use [`lower_expect`](Self::lower_expect) pub fn lower_expect_inner( &mut self, stmt: &StmtContext, parser: &mut Parser, expr: Handle, pos: ExprPos, body: &mut Block, ) -> Result<(Handle, Span)> { let (maybe_expr, meta) = self.lower_inner(stmt, parser, expr, pos, body)?; let expr = match maybe_expr { Some(e) => e, None => { return Err(Error { kind: ErrorKind::SemanticError("Expression returns void".into()), meta, }) } }; Ok((expr, meta)) } fn lower_store( &mut self, pointer: Handle, value: Handle, meta: Span, body: &mut Block, ) { if let Expression::Swizzle { size, mut vector, pattern, } = self.expressions[pointer] { // Stores to swizzled values are not directly supported, // lower them as series of per-component stores. let size = match size { VectorSize::Bi => 2, VectorSize::Tri => 3, VectorSize::Quad => 4, }; if let Expression::Load { pointer } = self.expressions[vector] { vector = pointer; } #[allow(clippy::needless_range_loop)] for index in 0..size { let dst = self.add_expression( Expression::AccessIndex { base: vector, index: pattern[index].index(), }, meta, body, ); let src = self.add_expression( Expression::AccessIndex { base: value, index: index as u32, }, meta, body, ); self.emit_restart(body); body.push( Statement::Store { pointer: dst, value: src, }, meta, ); } } else { self.emit_restart(body); body.push(Statement::Store { pointer, value }, meta); } } /// Internal implementation of [`lower`](Self::lower) fn lower_inner( &mut self, stmt: &StmtContext, parser: &mut Parser, expr: Handle, pos: ExprPos, body: &mut Block, ) -> Result<(Option>, Span)> { let HirExpr { ref kind, meta } = stmt.hir_exprs[expr]; log::debug!("Lowering {:?}", expr); let handle = match *kind { HirExprKind::Access { base, index } => { let (index, index_meta) = self.lower_expect_inner(stmt, parser, index, ExprPos::Rhs, body)?; let maybe_constant_index = match pos { // Don't try to generate `AccessIndex` if in a LHS position, since it // wouldn't produce a pointer. ExprPos::Lhs => None, _ => parser.solve_constant(self, index, index_meta).ok(), }; let base = self .lower_expect_inner( stmt, parser, base, pos.maybe_access_base(maybe_constant_index.is_some()), body, )? .0; let pointer = maybe_constant_index .and_then(|constant| { Some(self.add_expression( Expression::AccessIndex { base, index: match parser.module.constants[constant].inner { crate::ConstantInner::Scalar { value: ScalarValue::Uint(i), .. } => u32::try_from(i).ok()?, crate::ConstantInner::Scalar { value: ScalarValue::Sint(i), .. } => u32::try_from(i).ok()?, _ => return None, }, }, meta, body, )) }) .unwrap_or_else(|| { self.add_expression(Expression::Access { base, index }, meta, body) }); if ExprPos::Rhs == pos { let resolved = parser.resolve_type(self, pointer, meta)?; if resolved.pointer_space().is_some() { return Ok(( Some(self.add_expression(Expression::Load { pointer }, meta, body)), meta, )); } } pointer } HirExprKind::Select { base, ref field } => { let base = self .lower_expect_inner(stmt, parser, base, pos.maybe_access_base(true), body)? .0; parser.field_selection(self, pos, body, base, field, meta)? } HirExprKind::Constant(constant) if pos != ExprPos::Lhs => { self.add_expression(Expression::Constant(constant), meta, body) } HirExprKind::Binary { left, op, right } if pos != ExprPos::Lhs => { let (mut left, left_meta) = self.lower_expect_inner(stmt, parser, left, ExprPos::Rhs, body)?; let (mut right, right_meta) = self.lower_expect_inner(stmt, parser, right, ExprPos::Rhs, body)?; match op { BinaryOperator::ShiftLeft | BinaryOperator::ShiftRight => self .implicit_conversion(parser, &mut right, right_meta, ScalarKind::Uint, 4)?, _ => self.binary_implicit_conversion( parser, &mut left, left_meta, &mut right, right_meta, )?, } parser.typifier_grow(self, left, left_meta)?; parser.typifier_grow(self, right, right_meta)?; let left_inner = self.typifier.get(left, &parser.module.types); let right_inner = self.typifier.get(right, &parser.module.types); match (left_inner, right_inner) { ( &TypeInner::Matrix { columns: left_columns, rows: left_rows, width: left_width, }, &TypeInner::Matrix { columns: right_columns, rows: right_rows, width: right_width, }, ) => { let dimensions_ok = if op == BinaryOperator::Multiply { left_columns == right_rows } else { left_columns == right_columns && left_rows == right_rows }; // Check that the two arguments have the same dimensions if !dimensions_ok || left_width != right_width { parser.errors.push(Error { kind: ErrorKind::SemanticError( format!( "Cannot apply operation to {:?} and {:?}", left_inner, right_inner ) .into(), ), meta, }) } match op { BinaryOperator::Divide => { // Naga IR doesn't support matrix division so we need to // divide the columns individually and reassemble the matrix let mut components = Vec::with_capacity(left_columns as usize); for index in 0..left_columns as u32 { // Get the column vectors let left_vector = self.add_expression( Expression::AccessIndex { base: left, index }, meta, body, ); let right_vector = self.add_expression( Expression::AccessIndex { base: right, index }, meta, body, ); // Divide the vectors let column = self.expressions.append( Expression::Binary { op, left: left_vector, right: right_vector, }, meta, ); components.push(column) } // Rebuild the matrix from the divided vectors self.expressions.append( Expression::Compose { ty: parser.module.types.insert( Type { name: None, inner: TypeInner::Matrix { columns: left_columns, rows: left_rows, width: left_width, }, }, Span::default(), ), components, }, meta, ) } BinaryOperator::Equal | BinaryOperator::NotEqual => { // Naga IR doesn't support matrix comparisons so we need to // compare the columns individually and then fold them together // // The folding is done using a logical and for equality and // a logical or for inequality let equals = op == BinaryOperator::Equal; let (op, combine, fun) = match equals { true => ( BinaryOperator::Equal, BinaryOperator::LogicalAnd, RelationalFunction::All, ), false => ( BinaryOperator::NotEqual, BinaryOperator::LogicalOr, RelationalFunction::Any, ), }; let mut root = None; for index in 0..left_columns as u32 { // Get the column vectors let left_vector = self.add_expression( Expression::AccessIndex { base: left, index }, meta, body, ); let right_vector = self.add_expression( Expression::AccessIndex { base: right, index }, meta, body, ); let argument = self.expressions.append( Expression::Binary { op, left: left_vector, right: right_vector, }, meta, ); // The result of comparing two vectors is a boolean vector // so use a relational function like all to get a single // boolean value let compare = self.add_expression( Expression::Relational { fun, argument }, meta, body, ); // Fold the result root = Some(match root { Some(right) => self.add_expression( Expression::Binary { op: combine, left: compare, right, }, meta, body, ), None => compare, }); } root.unwrap() } _ => self.add_expression( Expression::Binary { left, op, right }, meta, body, ), } } (&TypeInner::Vector { .. }, &TypeInner::Vector { .. }) => match op { BinaryOperator::Equal | BinaryOperator::NotEqual => { let equals = op == BinaryOperator::Equal; let (op, fun) = match equals { true => (BinaryOperator::Equal, RelationalFunction::All), false => (BinaryOperator::NotEqual, RelationalFunction::Any), }; let argument = self .expressions .append(Expression::Binary { op, left, right }, meta); self.add_expression( Expression::Relational { fun, argument }, meta, body, ) } _ => { self.add_expression(Expression::Binary { left, op, right }, meta, body) } }, (&TypeInner::Vector { size, .. }, &TypeInner::Scalar { .. }) => match op { BinaryOperator::Add | BinaryOperator::Subtract | BinaryOperator::Divide | BinaryOperator::And | BinaryOperator::ExclusiveOr | BinaryOperator::InclusiveOr | BinaryOperator::ShiftLeft | BinaryOperator::ShiftRight => { let scalar_vector = self.add_expression( Expression::Splat { size, value: right }, meta, body, ); self.add_expression( Expression::Binary { op, left, right: scalar_vector, }, meta, body, ) } _ => { self.add_expression(Expression::Binary { left, op, right }, meta, body) } }, (&TypeInner::Scalar { .. }, &TypeInner::Vector { size, .. }) => match op { BinaryOperator::Add | BinaryOperator::Subtract | BinaryOperator::Divide | BinaryOperator::And | BinaryOperator::ExclusiveOr | BinaryOperator::InclusiveOr => { let scalar_vector = self.add_expression( Expression::Splat { size, value: left }, meta, body, ); self.add_expression( Expression::Binary { op, left: scalar_vector, right, }, meta, body, ) } _ => { self.add_expression(Expression::Binary { left, op, right }, meta, body) } }, ( &TypeInner::Scalar { width: left_width, .. }, &TypeInner::Matrix { rows, columns, width: right_width, }, ) => { // Check that the two arguments have the same width if left_width != right_width { parser.errors.push(Error { kind: ErrorKind::SemanticError( format!( "Cannot apply operation to {:?} and {:?}", left_inner, right_inner ) .into(), ), meta, }) } match op { BinaryOperator::Divide | BinaryOperator::Add | BinaryOperator::Subtract => { // Naga IR doesn't support all matrix by scalar operations so // we need for some to turn the scalar into a vector by // splatting it and then for each column vector apply the // operation and finally reconstruct the matrix let scalar_vector = self.add_expression( Expression::Splat { size: rows, value: left, }, meta, body, ); let mut components = Vec::with_capacity(columns as usize); for index in 0..columns as u32 { // Get the column vector let matrix_column = self.add_expression( Expression::AccessIndex { base: right, index }, meta, body, ); // Apply the operation to the splatted vector and // the column vector let column = self.expressions.append( Expression::Binary { op, left: scalar_vector, right: matrix_column, }, meta, ); components.push(column) } // Rebuild the matrix from the operation result vectors self.expressions.append( Expression::Compose { ty: parser.module.types.insert( Type { name: None, inner: TypeInner::Matrix { columns, rows, width: left_width, }, }, Span::default(), ), components, }, meta, ) } _ => self.add_expression( Expression::Binary { left, op, right }, meta, body, ), } } ( &TypeInner::Matrix { rows, columns, width: left_width, }, &TypeInner::Scalar { width: right_width, .. }, ) => { // Check that the two arguments have the same width if left_width != right_width { parser.errors.push(Error { kind: ErrorKind::SemanticError( format!( "Cannot apply operation to {:?} and {:?}", left_inner, right_inner ) .into(), ), meta, }) } match op { BinaryOperator::Divide | BinaryOperator::Add | BinaryOperator::Subtract => { // Naga IR doesn't support all matrix by scalar operations so // we need for some to turn the scalar into a vector by // splatting it and then for each column vector apply the // operation and finally reconstruct the matrix let scalar_vector = self.add_expression( Expression::Splat { size: rows, value: right, }, meta, body, ); let mut components = Vec::with_capacity(columns as usize); for index in 0..columns as u32 { // Get the column vector let matrix_column = self.add_expression( Expression::AccessIndex { base: left, index }, meta, body, ); // Apply the operation to the splatted vector and // the column vector let column = self.expressions.append( Expression::Binary { op, left: matrix_column, right: scalar_vector, }, meta, ); components.push(column) } // Rebuild the matrix from the operation result vectors self.expressions.append( Expression::Compose { ty: parser.module.types.insert( Type { name: None, inner: TypeInner::Matrix { columns, rows, width: left_width, }, }, Span::default(), ), components, }, meta, ) } _ => self.add_expression( Expression::Binary { left, op, right }, meta, body, ), } } _ => self.add_expression(Expression::Binary { left, op, right }, meta, body), } } HirExprKind::Unary { op, expr } if pos != ExprPos::Lhs => { let expr = self .lower_expect_inner(stmt, parser, expr, ExprPos::Rhs, body)? .0; self.add_expression(Expression::Unary { op, expr }, meta, body) } HirExprKind::Variable(ref var) => match pos { ExprPos::Lhs => { if !var.mutable { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Variable cannot be used in LHS position".into(), ), meta, }) } var.expr } ExprPos::AccessBase { constant_index } => { // If the index isn't constant all accesses backed by a constant base need // to be done trough a proxy local variable, since constants have a non // pointer type which is required for dynamic indexing if !constant_index { if let Some((constant, ty)) = var.constant { let local = self.locals.append( LocalVariable { name: None, ty, init: Some(constant), }, Span::default(), ); self.add_expression( Expression::LocalVariable(local), Span::default(), body, ) } else { var.expr } } else { var.expr } } _ if var.load => { self.add_expression(Expression::Load { pointer: var.expr }, meta, body) } _ => var.expr, }, HirExprKind::Call(ref call) if pos != ExprPos::Lhs => { let maybe_expr = parser.function_or_constructor_call( self, stmt, body, call.kind.clone(), &call.args, meta, )?; return Ok((maybe_expr, meta)); } // `HirExprKind::Conditional` represents the ternary operator in glsl (`:?`) // // The ternary operator is defined to only evaluate one of the two possible // expressions which means that it's behavior is that of an `if` statement, // and it's merely syntatic sugar for it. HirExprKind::Conditional { condition, accept, reject, } if ExprPos::Lhs != pos => { // Given an expression `a ? b : c`, we need to produce a Naga // statement roughly like: // // var temp; // if a { // temp = convert(b); // } else { // temp = convert(c); // } // // where `convert` stands for type conversions to bring `b` and `c` to // the same type, and then use `temp` to represent the value of the whole // conditional expression in subsequent code. // Lower the condition first to the current bodyy let condition = self .lower_expect_inner(stmt, parser, condition, ExprPos::Rhs, body)? .0; // Emit all expressions since we will be adding statements to // other bodies next self.emit_restart(body); // Create the bodies for the two cases let mut accept_body = Block::new(); let mut reject_body = Block::new(); // Lower the `true` branch let (mut accept, accept_meta) = self.lower_expect_inner(stmt, parser, accept, pos, &mut accept_body)?; // Flush the body of the `true` branch, to start emitting on the // `false` branch self.emit_restart(&mut accept_body); // Lower the `false` branch let (mut reject, reject_meta) = self.lower_expect_inner(stmt, parser, reject, pos, &mut reject_body)?; // Flush the body of the `false` branch self.emit_restart(&mut reject_body); // We need to do some custom implicit conversions since the two target expressions // are in different bodies if let ( Some((accept_power, accept_width, accept_kind)), Some((reject_power, reject_width, reject_kind)), ) = ( // Get the components of both branches and calculate the type power self.expr_scalar_components(parser, accept, accept_meta)? .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))), self.expr_scalar_components(parser, reject, reject_meta)? .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))), ) { match accept_power.cmp(&reject_power) { std::cmp::Ordering::Less => { self.conversion(&mut accept, accept_meta, reject_kind, reject_width)?; // The expression belongs to the `true` branch so we need to flush to // the respective body self.emit_end(&mut accept_body); } // Technically there's nothing to flush but later we will need to // add some expressions that must not be emitted so instead // of flushing, starting and flushing again, just make sure // everything is flushed. std::cmp::Ordering::Equal => self.emit_end(body), std::cmp::Ordering::Greater => { self.conversion(&mut reject, reject_meta, accept_kind, accept_width)?; // The expression belongs to the `false` branch so we need to flush to // the respective body self.emit_end(&mut reject_body); } } } else { // Technically there's nothing to flush but later we will need to // add some expressions that must not be emitted. self.emit_end(body) } // We need to get the type of the resulting expression to create the local, // this must be done after implicit conversions to ensure both branches have // the same type. let ty = parser.resolve_type_handle(self, accept, accept_meta)?; // Add the local that will hold the result of our conditional let local = self.locals.append( LocalVariable { name: None, ty, init: None, }, meta, ); // Note: `Expression::LocalVariable` must not be emited so it's important // that at this point the emitter is flushed but not started. let local_expr = self .expressions .append(Expression::LocalVariable(local), meta); // Add to each body the store to the result variable accept_body.push( Statement::Store { pointer: local_expr, value: accept, }, accept_meta, ); reject_body.push( Statement::Store { pointer: local_expr, value: reject, }, reject_meta, ); // Finally add the `If` to the main body with the `condition` we lowered // earlier and the branches we prepared. body.push( Statement::If { condition, accept: accept_body, reject: reject_body, }, meta, ); // Restart the emitter self.emit_start(); // Note: `Expression::Load` must be emited before it's used so make // sure the emitter is active here. self.expressions.append( Expression::Load { pointer: local_expr, }, meta, ) } HirExprKind::Assign { tgt, value } if ExprPos::Lhs != pos => { let (pointer, ptr_meta) = self.lower_expect_inner(stmt, parser, tgt, ExprPos::Lhs, body)?; let (mut value, value_meta) = self.lower_expect_inner(stmt, parser, value, ExprPos::Rhs, body)?; let ty = match *parser.resolve_type(self, pointer, ptr_meta)? { TypeInner::Pointer { base, .. } => &parser.module.types[base].inner, ref ty => ty, }; if let Some((kind, width)) = scalar_components(ty) { self.implicit_conversion(parser, &mut value, value_meta, kind, width)?; } self.lower_store(pointer, value, meta, body); value } HirExprKind::PrePostfix { op, postfix, expr } if ExprPos::Lhs != pos => { let (pointer, _) = self.lower_expect_inner(stmt, parser, expr, ExprPos::Lhs, body)?; let left = if let Expression::Swizzle { .. } = self.expressions[pointer] { pointer } else { self.add_expression(Expression::Load { pointer }, meta, body) }; let make_constant_inner = |kind, width| { let value = match kind { ScalarKind::Sint => crate::ScalarValue::Sint(1), ScalarKind::Uint => crate::ScalarValue::Uint(1), ScalarKind::Float => crate::ScalarValue::Float(1.0), ScalarKind::Bool => return None, }; Some(crate::ConstantInner::Scalar { width, value }) }; let res = match *parser.resolve_type(self, left, meta)? { TypeInner::Scalar { kind, width } => { let ty = TypeInner::Scalar { kind, width }; make_constant_inner(kind, width).map(|i| (ty, i, None, None)) } TypeInner::Vector { size, kind, width } => { let ty = TypeInner::Vector { size, kind, width }; make_constant_inner(kind, width).map(|i| (ty, i, Some(size), None)) } TypeInner::Matrix { columns, rows, width, } => { let ty = TypeInner::Matrix { columns, rows, width, }; make_constant_inner(ScalarKind::Float, width) .map(|i| (ty, i, Some(rows), Some(columns))) } _ => None, }; let (ty_inner, inner, rows, columns) = match res { Some(res) => res, None => { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Increment/decrement only works on scalar/vector/matrix".into(), ), meta, }); return Ok((Some(left), meta)); } }; let constant_1 = parser.module.constants.append( Constant { name: None, specialization: None, inner, }, Default::default(), ); let mut right = self.add_expression(Expression::Constant(constant_1), meta, body); // Glsl allows pre/postfixes operations on vectors and matrices, so if the // target is either of them change the right side of the addition to be splatted // to the same size as the target, furthermore if the target is a matrix // use a composed matrix using the splatted value. if let Some(size) = rows { right = self.add_expression(Expression::Splat { size, value: right }, meta, body); if let Some(cols) = columns { let ty = parser.module.types.insert( Type { name: None, inner: ty_inner, }, meta, ); right = self.add_expression( Expression::Compose { ty, components: std::iter::repeat(right).take(cols as usize).collect(), }, meta, body, ); } } let value = self.add_expression(Expression::Binary { op, left, right }, meta, body); self.lower_store(pointer, value, meta, body); if postfix { left } else { value } } HirExprKind::Method { expr: object, ref name, ref args, } if ExprPos::Lhs != pos => { let args = args .iter() .map(|e| self.lower_expect_inner(stmt, parser, *e, ExprPos::Rhs, body)) .collect::>>()?; match name.as_ref() { "length" => { if !args.is_empty() { parser.errors.push(Error { kind: ErrorKind::SemanticError( ".length() doesn't take any arguments".into(), ), meta, }); } let lowered_array = self.lower_expect_inner(stmt, parser, object, pos, body)?.0; let array_type = parser.resolve_type(self, lowered_array, meta)?; match *array_type { TypeInner::Array { size: crate::ArraySize::Constant(size), .. } => { let mut array_length = self.add_expression(Expression::Constant(size), meta, body); self.forced_conversion( parser, &mut array_length, meta, ScalarKind::Sint, 4, )?; array_length } // let the error be handled in type checking if it's not a dynamic array _ => { let mut array_length = self.add_expression( Expression::ArrayLength(lowered_array), meta, body, ); self.conversion(&mut array_length, meta, ScalarKind::Sint, 4)?; array_length } } } _ => { return Err(Error { kind: ErrorKind::SemanticError( format!("unknown method '{}'", name).into(), ), meta, }); } } } _ => { return Err(Error { kind: ErrorKind::SemanticError( format!("{:?} cannot be in the left hand side", stmt.hir_exprs[expr]) .into(), ), meta, }) } }; log::trace!( "Lowered {:?}\n\tKind = {:?}\n\tPos = {:?}\n\tResult = {:?}", expr, kind, pos, handle ); Ok((Some(handle), meta)) } pub fn expr_scalar_components( &mut self, parser: &Parser, expr: Handle, meta: Span, ) -> Result> { let ty = parser.resolve_type(self, expr, meta)?; Ok(scalar_components(ty)) } pub fn expr_power( &mut self, parser: &Parser, expr: Handle, meta: Span, ) -> Result> { Ok(self .expr_scalar_components(parser, expr, meta)? .and_then(|(kind, width)| type_power(kind, width))) } pub fn conversion( &mut self, expr: &mut Handle, meta: Span, kind: ScalarKind, width: crate::Bytes, ) -> Result<()> { *expr = self.expressions.append( Expression::As { expr: *expr, kind, convert: Some(width), }, meta, ); Ok(()) } pub fn implicit_conversion( &mut self, parser: &Parser, expr: &mut Handle, meta: Span, kind: ScalarKind, width: crate::Bytes, ) -> Result<()> { if let (Some(tgt_power), Some(expr_power)) = ( type_power(kind, width), self.expr_power(parser, *expr, meta)?, ) { if tgt_power > expr_power { self.conversion(expr, meta, kind, width)?; } } Ok(()) } pub fn forced_conversion( &mut self, parser: &Parser, expr: &mut Handle, meta: Span, kind: ScalarKind, width: crate::Bytes, ) -> Result<()> { if let Some((expr_scalar_kind, expr_width)) = self.expr_scalar_components(parser, *expr, meta)? { if expr_scalar_kind != kind || expr_width != width { self.conversion(expr, meta, kind, width)?; } } Ok(()) } pub fn binary_implicit_conversion( &mut self, parser: &Parser, left: &mut Handle, left_meta: Span, right: &mut Handle, right_meta: Span, ) -> Result<()> { let left_components = self.expr_scalar_components(parser, *left, left_meta)?; let right_components = self.expr_scalar_components(parser, *right, right_meta)?; if let ( Some((left_power, left_width, left_kind)), Some((right_power, right_width, right_kind)), ) = ( left_components.and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))), right_components .and_then(|(kind, width)| Some((type_power(kind, width)?, width, kind))), ) { match left_power.cmp(&right_power) { std::cmp::Ordering::Less => { self.conversion(left, left_meta, right_kind, right_width)?; } std::cmp::Ordering::Equal => {} std::cmp::Ordering::Greater => { self.conversion(right, right_meta, left_kind, left_width)?; } } } Ok(()) } pub fn implicit_splat( &mut self, parser: &Parser, expr: &mut Handle, meta: Span, vector_size: Option, ) -> Result<()> { let expr_type = parser.resolve_type(self, *expr, meta)?; if let (&TypeInner::Scalar { .. }, Some(size)) = (expr_type, vector_size) { *expr = self .expressions .append(Expression::Splat { size, value: *expr }, meta) } Ok(()) } pub fn vector_resize( &mut self, size: VectorSize, vector: Handle, meta: Span, body: &mut Block, ) -> Handle { self.add_expression( Expression::Swizzle { size, vector, pattern: crate::SwizzleComponent::XYZW, }, meta, body, ) } } impl Index> for Context { type Output = Expression; fn index(&self, index: Handle) -> &Self::Output { &self.expressions[index] } } /// Helper struct passed when parsing expressions /// /// This struct should only be obtained trough [`stmt_ctx`](Context::stmt_ctx) /// and only one of these may be active at any time per context. #[derive(Debug)] pub struct StmtContext { /// A arena of high level expressions which can be lowered trough a /// [`Context`](Context) to naga's [`Expression`](crate::Expression)s pub hir_exprs: Arena, } impl StmtContext { const fn new() -> Self { StmtContext { hir_exprs: Arena::new(), } } } ================================================ FILE: lib/naga/src/front/glsl/error.rs ================================================ use super::{constants::ConstantSolvingError, token::TokenValue}; use crate::Span; use pp_rs::token::PreprocessorError; use std::borrow::Cow; use thiserror::Error; fn join_with_comma(list: &[ExpectedToken]) -> String { let mut string = "".to_string(); for (i, val) in list.iter().enumerate() { string.push_str(&val.to_string()); match i { i if i == list.len() - 1 => {} i if i == list.len() - 2 => string.push_str(" or "), _ => string.push_str(", "), } } string } /// One of the expected tokens returned in [`InvalidToken`](ErrorKind::InvalidToken). #[derive(Debug, PartialEq)] pub enum ExpectedToken { /// A specific token was expected. Token(TokenValue), /// A type was expected. TypeName, /// An identifier was expected. Identifier, /// An integer literal was expected. IntLiteral, /// A float literal was expected. FloatLiteral, /// A boolean literal was expected. BoolLiteral, /// The end of file was expected. Eof, } impl From for ExpectedToken { fn from(token: TokenValue) -> Self { ExpectedToken::Token(token) } } impl std::fmt::Display for ExpectedToken { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match *self { ExpectedToken::Token(ref token) => write!(f, "{:?}", token), ExpectedToken::TypeName => write!(f, "a type"), ExpectedToken::Identifier => write!(f, "identifier"), ExpectedToken::IntLiteral => write!(f, "integer literal"), ExpectedToken::FloatLiteral => write!(f, "float literal"), ExpectedToken::BoolLiteral => write!(f, "bool literal"), ExpectedToken::Eof => write!(f, "end of file"), } } } /// Information about the cause of an error. #[derive(Debug, Error)] #[cfg_attr(test, derive(PartialEq))] pub enum ErrorKind { /// Whilst parsing as encountered an unexpected EOF. #[error("Unexpected end of file")] EndOfFile, /// The shader specified an unsupported or invalid profile. #[error("Invalid profile: {0}")] InvalidProfile(String), /// The shader requested an unsupported or invalid version. #[error("Invalid version: {0}")] InvalidVersion(u64), /// Whilst parsing an unexpected token was encountered. /// /// A list of expected tokens is also returned. #[error("Expected {}, found {0:?}", join_with_comma(.1))] InvalidToken(TokenValue, Vec), /// A specific feature is not yet implemented. /// /// To help prioritize work please open an issue in the github issue tracker /// if none exist already or react to the already existing one. #[error("Not implemented: {0}")] NotImplemented(&'static str), /// A reference to a variable that wasn't declared was used. #[error("Unknown variable: {0}")] UnknownVariable(String), /// A reference to a type that wasn't declared was used. #[error("Unknown type: {0}")] UnknownType(String), /// A reference to a non existent member of a type was made. #[error("Unknown field: {0}")] UnknownField(String), /// An unknown layout qualifier was used. /// /// If the qualifier does exist please open an issue in the github issue tracker /// if none exist already or react to the already existing one to help /// prioritize work. #[error("Unknown layout qualifier: {0}")] UnknownLayoutQualifier(String), /// Unsupported matrix of the form matCx2 /// /// Our IR expects matrices of the form matCx2 to have a stride of 8 however /// matrices in the std140 layout have a stride of at least 16 #[error("unsupported matrix of the form matCx2 in std140 block layout")] UnsupportedMatrixTypeInStd140, /// A variable with the same name already exists in the current scope. #[error("Variable already declared: {0}")] VariableAlreadyDeclared(String), /// A semantic error was detected in the shader. #[error("{0}")] SemanticError(Cow<'static, str>), /// An error was returned by the preprocessor. #[error("{0:?}")] PreprocessorError(PreprocessorError), /// The parser entered an illegal state and exited /// /// This obviously is a bug and as such should be reported in the github issue tracker #[error("Internal error: {0}")] InternalError(&'static str), } impl From for ErrorKind { fn from(err: ConstantSolvingError) -> Self { ErrorKind::SemanticError(err.to_string().into()) } } /// Error returned during shader parsing. #[derive(Debug, Error)] #[error("{kind}")] #[cfg_attr(test, derive(PartialEq))] pub struct Error { /// Holds the information about the error itself. pub kind: ErrorKind, /// Holds information about the range of the source code where the error happened. pub meta: Span, } ================================================ FILE: lib/naga/src/front/glsl/functions.rs ================================================ use super::{ ast::*, builtins::{inject_builtin, sampled_to_depth}, context::{Context, ExprPos, StmtContext}, error::{Error, ErrorKind}, types::scalar_components, Parser, Result, }; use crate::{ front::glsl::types::type_power, proc::ensure_block_returns, AddressSpace, Arena, Block, Constant, ConstantInner, EntryPoint, Expression, FastHashMap, Function, FunctionArgument, FunctionResult, Handle, LocalVariable, ScalarKind, ScalarValue, Span, Statement, StructMember, Type, TypeInner, }; use std::iter; impl Parser { fn add_constant_value( &mut self, scalar_kind: ScalarKind, value: u64, meta: Span, ) -> Handle { let value = match scalar_kind { ScalarKind::Uint => ScalarValue::Uint(value), ScalarKind::Sint => ScalarValue::Sint(value as i64), ScalarKind::Float => ScalarValue::Float(value as f64), _ => unreachable!(), }; self.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value }, }, meta, ) } pub(crate) fn function_or_constructor_call( &mut self, ctx: &mut Context, stmt: &StmtContext, body: &mut Block, fc: FunctionCallKind, raw_args: &[Handle], meta: Span, ) -> Result>> { let args: Vec<_> = raw_args .iter() .map(|e| ctx.lower_expect_inner(stmt, self, *e, ExprPos::Rhs, body)) .collect::>()?; match fc { FunctionCallKind::TypeConstructor(ty) => { if args.len() == 1 { self.constructor_single(ctx, body, ty, args[0], meta) .map(Some) } else { self.constructor_many(ctx, body, ty, args, meta).map(Some) } } FunctionCallKind::Function(name) => { self.function_call(ctx, stmt, body, name, args, raw_args, meta) } } } fn constructor_single( &mut self, ctx: &mut Context, body: &mut Block, ty: Handle, (mut value, expr_meta): (Handle, Span), meta: Span, ) -> Result> { let expr_type = self.resolve_type(ctx, value, expr_meta)?; let vector_size = match *expr_type { TypeInner::Vector { size, .. } => Some(size), _ => None, }; // Special case: if casting from a bool, we need to use Select and not As. match self.module.types[ty].inner.scalar_kind() { Some(result_scalar_kind) if expr_type.scalar_kind() == Some(ScalarKind::Bool) && result_scalar_kind != ScalarKind::Bool => { let c0 = self.add_constant_value(result_scalar_kind, 0u64, meta); let c1 = self.add_constant_value(result_scalar_kind, 1u64, meta); let mut reject = ctx.add_expression(Expression::Constant(c0), expr_meta, body); let mut accept = ctx.add_expression(Expression::Constant(c1), expr_meta, body); ctx.implicit_splat(self, &mut reject, meta, vector_size)?; ctx.implicit_splat(self, &mut accept, meta, vector_size)?; let h = ctx.add_expression( Expression::Select { accept, reject, condition: value, }, expr_meta, body, ); return Ok(h); } _ => {} } Ok(match self.module.types[ty].inner { TypeInner::Vector { size, kind, width } if vector_size.is_none() => { ctx.forced_conversion(self, &mut value, expr_meta, kind, width)?; if let TypeInner::Scalar { .. } = *self.resolve_type(ctx, value, expr_meta)? { ctx.add_expression(Expression::Splat { size, value }, meta, body) } else { self.vector_constructor( ctx, body, ty, size, kind, width, &[(value, expr_meta)], meta, )? } } TypeInner::Scalar { kind, width } => { let mut expr = value; if let TypeInner::Vector { .. } | TypeInner::Matrix { .. } = *self.resolve_type(ctx, value, expr_meta)? { expr = ctx.add_expression( Expression::AccessIndex { base: expr, index: 0, }, meta, body, ); } if let TypeInner::Matrix { .. } = *self.resolve_type(ctx, value, expr_meta)? { expr = ctx.add_expression( Expression::AccessIndex { base: expr, index: 0, }, meta, body, ); } ctx.add_expression( Expression::As { kind, expr, convert: Some(width), }, meta, body, ) } TypeInner::Vector { size, kind, width } => { if vector_size.map_or(true, |s| s != size) { value = ctx.vector_resize(size, value, expr_meta, body); } ctx.add_expression( Expression::As { kind, expr: value, convert: Some(width), }, meta, body, ) } TypeInner::Matrix { columns, rows, width, } => self.matrix_one_arg( ctx, body, ty, columns, rows, width, (value, expr_meta), meta, )?, TypeInner::Struct { ref members, .. } => { let scalar_components = members .get(0) .and_then(|member| scalar_components(&self.module.types[member.ty].inner)); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(self, &mut value, expr_meta, kind, width)?; } ctx.add_expression( Expression::Compose { ty, components: vec![value], }, meta, body, ) } TypeInner::Array { base, .. } => { let scalar_components = scalar_components(&self.module.types[base].inner); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(self, &mut value, expr_meta, kind, width)?; } ctx.add_expression( Expression::Compose { ty, components: vec![value], }, meta, body, ) } _ => { self.errors.push(Error { kind: ErrorKind::SemanticError("Bad type constructor".into()), meta, }); value } }) } #[allow(clippy::too_many_arguments)] fn matrix_one_arg( &mut self, ctx: &mut Context, body: &mut Block, ty: Handle, columns: crate::VectorSize, rows: crate::VectorSize, width: crate::Bytes, (mut value, expr_meta): (Handle, Span), meta: Span, ) -> Result> { let mut components = Vec::with_capacity(columns as usize); // TODO: casts // `Expression::As` doesn't support matrix width // casts so we need to do some extra work for casts ctx.forced_conversion(self, &mut value, expr_meta, ScalarKind::Float, width)?; match *self.resolve_type(ctx, value, expr_meta)? { TypeInner::Scalar { .. } => { // If a matrix is constructed with a single scalar value, then that // value is used to initialize all the values along the diagonal of // the matrix; the rest are given zeros. let vector_ty = self.module.types.insert( Type { name: None, inner: TypeInner::Vector { size: rows, kind: ScalarKind::Float, width, }, }, meta, ); let zero_constant = self.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width, value: ScalarValue::Float(0.0), }, }, meta, ); let zero = ctx.add_expression(Expression::Constant(zero_constant), meta, body); for i in 0..columns as u32 { components.push( ctx.add_expression( Expression::Compose { ty: vector_ty, components: (0..rows as u32) .into_iter() .map(|r| match r == i { true => value, false => zero, }) .collect(), }, meta, body, ), ) } } TypeInner::Matrix { rows: ori_rows, columns: ori_cols, .. } => { // If a matrix is constructed from a matrix, then each component // (column i, row j) in the result that has a corresponding component // (column i, row j) in the argument will be initialized from there. All // other components will be initialized to the identity matrix. let zero_constant = self.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width, value: ScalarValue::Float(0.0), }, }, meta, ); let zero = ctx.add_expression(Expression::Constant(zero_constant), meta, body); let one_constant = self.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width, value: ScalarValue::Float(1.0), }, }, meta, ); let one = ctx.add_expression(Expression::Constant(one_constant), meta, body); let vector_ty = self.module.types.insert( Type { name: None, inner: TypeInner::Vector { size: rows, kind: ScalarKind::Float, width, }, }, meta, ); for i in 0..columns as u32 { if i < ori_cols as u32 { use std::cmp::Ordering; let vector = ctx.add_expression( Expression::AccessIndex { base: value, index: i, }, meta, body, ); components.push(match ori_rows.cmp(&rows) { Ordering::Less => { let components = (0..rows as u32) .into_iter() .map(|r| { if r < ori_rows as u32 { ctx.add_expression( Expression::AccessIndex { base: vector, index: r, }, meta, body, ) } else if r == i { one } else { zero } }) .collect(); ctx.add_expression( Expression::Compose { ty: vector_ty, components, }, meta, body, ) } Ordering::Equal => vector, Ordering::Greater => ctx.vector_resize(rows, vector, meta, body), }) } else { let vec_constant = self.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Composite { ty: vector_ty, components: (0..rows as u32) .into_iter() .map(|r| match r == i { true => one_constant, false => zero_constant, }) .collect(), }, }, meta, ); let vec = ctx.add_expression(Expression::Constant(vec_constant), meta, body); components.push(vec) } } } _ => { components = iter::repeat(value).take(columns as usize).collect(); } } Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body)) } #[allow(clippy::too_many_arguments)] fn vector_constructor( &mut self, ctx: &mut Context, body: &mut Block, ty: Handle, size: crate::VectorSize, kind: ScalarKind, width: crate::Bytes, args: &[(Handle, Span)], meta: Span, ) -> Result> { let mut components = Vec::with_capacity(size as usize); for (mut arg, expr_meta) in args.iter().copied() { ctx.forced_conversion(self, &mut arg, expr_meta, kind, width)?; if components.len() >= size as usize { break; } match *self.resolve_type(ctx, arg, expr_meta)? { TypeInner::Scalar { .. } => components.push(arg), TypeInner::Matrix { rows, columns, .. } => { components.reserve(rows as usize * columns as usize); for c in 0..(columns as u32) { let base = ctx.add_expression( Expression::AccessIndex { base: arg, index: c, }, expr_meta, body, ); for r in 0..(rows as u32) { components.push(ctx.add_expression( Expression::AccessIndex { base, index: r }, expr_meta, body, )) } } } TypeInner::Vector { size: ori_size, .. } => { components.reserve(ori_size as usize); for index in 0..(ori_size as u32) { components.push(ctx.add_expression( Expression::AccessIndex { base: arg, index }, expr_meta, body, )) } } _ => components.push(arg), } } components.truncate(size as usize); Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body)) } fn constructor_many( &mut self, ctx: &mut Context, body: &mut Block, ty: Handle, args: Vec<(Handle, Span)>, meta: Span, ) -> Result> { let mut components = Vec::with_capacity(args.len()); match self.module.types[ty].inner { TypeInner::Matrix { columns, rows, width, } => { let mut flattened = Vec::with_capacity(columns as usize * rows as usize); for (mut arg, meta) in args.iter().copied() { ctx.forced_conversion(self, &mut arg, meta, ScalarKind::Float, width)?; match *self.resolve_type(ctx, arg, meta)? { TypeInner::Vector { size, .. } => { for i in 0..(size as u32) { flattened.push(ctx.add_expression( Expression::AccessIndex { base: arg, index: i, }, meta, body, )) } } _ => flattened.push(arg), } } let ty = self.module.types.insert( Type { name: None, inner: TypeInner::Vector { size: rows, kind: ScalarKind::Float, width, }, }, meta, ); for chunk in flattened.chunks(rows as usize) { components.push(ctx.add_expression( Expression::Compose { ty, components: Vec::from(chunk), }, meta, body, )) } } TypeInner::Vector { size, kind, width } => { return self.vector_constructor(ctx, body, ty, size, kind, width, &args, meta) } TypeInner::Array { base, .. } => { for (mut arg, meta) in args.iter().copied() { let scalar_components = scalar_components(&self.module.types[base].inner); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(self, &mut arg, meta, kind, width)?; } components.push(arg) } } TypeInner::Struct { ref members, .. } => { for ((mut arg, meta), member) in args.iter().copied().zip(members.iter()) { let scalar_components = scalar_components(&self.module.types[member.ty].inner); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(self, &mut arg, meta, kind, width)?; } components.push(arg) } } _ => { return Err(Error { kind: ErrorKind::SemanticError("Constructor: Too many arguments".into()), meta, }) } } Ok(ctx.add_expression(Expression::Compose { ty, components }, meta, body)) } #[allow(clippy::too_many_arguments)] fn function_call( &mut self, ctx: &mut Context, stmt: &StmtContext, body: &mut Block, name: String, args: Vec<(Handle, Span)>, raw_args: &[Handle], meta: Span, ) -> Result>> { // Grow the typifier to be able to index it later without needing // to hold the context mutably for &(expr, span) in args.iter() { self.typifier_grow(ctx, expr, span)?; } // Check if the passed arguments require any special variations let mut variations = builtin_required_variations( args.iter() .map(|&(expr, _)| ctx.typifier.get(expr, &self.module.types)), ); // Initiate the declaration if it wasn't previously initialized and inject builtins let declaration = self.lookup_function.entry(name.clone()).or_insert_with(|| { variations |= BuiltinVariations::STANDARD; Default::default() }); inject_builtin(declaration, &mut self.module, &name, variations); // Borrow again but without mutability, at this point a declaration is guaranteed let declaration = self.lookup_function.get(&name).unwrap(); // Possibly contains the overload to be used in the call let mut maybe_overload = None; // The conversions needed for the best analyzed overload, this is initialized all to // `NONE` to make sure that conversions always pass the first time without ambiguity let mut old_conversions = vec![Conversion::None; args.len()]; // Tracks whether the comparison between overloads lead to an ambiguity let mut ambiguous = false; // Iterate over all the available overloads to select either an exact match or a // overload which has suitable implicit conversions 'outer: for overload in declaration.overloads.iter() { // If the overload and the function call don't have the same number of arguments // continue to the next overload if args.len() != overload.parameters.len() { continue; } // Stores whether the current overload matches exactly the function call let mut exact = true; // State of the selection // If None we still don't know what is the best overload // If Some(true) the new overload is better // If Some(false) the old overload is better let mut superior = None; // Store the conversions for the current overload so that later they can replace the // conversions used for querying the best overload let mut new_conversions = vec![Conversion::None; args.len()]; // Loop trough the overload parameters and check if the current overload is better // compared to the previous best overload. for (i, overload_parameter) in overload.parameters.iter().enumerate() { let call_argument = &args[i]; let parameter_info = &overload.parameters_info[i]; // If the image is used in the overload as a depth texture convert it // before comparing, otherwise exact matches wouldn't be reported if parameter_info.depth { sampled_to_depth( &mut self.module, ctx, call_argument.0, call_argument.1, &mut self.errors, ); self.invalidate_expression(ctx, call_argument.0, call_argument.1)? } let overload_param_ty = &self.module.types[*overload_parameter].inner; let call_arg_ty = self.resolve_type(ctx, call_argument.0, call_argument.1)?; log::trace!( "Testing parameter {}\n\tOverload = {:?}\n\tCall = {:?}", i, overload_param_ty, call_arg_ty ); // Storage images cannot be directly compared since while the access is part of the // type in naga's IR, in glsl they are a qualifier and don't enter in the match as // long as the access needed is satisfied. if let ( &TypeInner::Image { class: crate::ImageClass::Storage { format: overload_format, access: overload_access, }, dim: overload_dim, arrayed: overload_arrayed, }, &TypeInner::Image { class: crate::ImageClass::Storage { format: call_format, access: call_access, }, dim: call_dim, arrayed: call_arrayed, }, ) = (overload_param_ty, call_arg_ty) { // Images size must match otherwise the overload isn't what we want let good_size = call_dim == overload_dim && call_arrayed == overload_arrayed; // Glsl requires the formats to strictly match unless you are builtin // function overload and have not been replaced, in which case we only // check that the format scalar kind matches let good_format = overload_format == call_format || (overload.internal && ScalarKind::from(overload_format) == ScalarKind::from(call_format)); if !(good_size && good_format) { continue 'outer; } // While storage access mismatch is an error it isn't one that causes // the overload matching to fail so we defer the error and consider // that the images match exactly if !call_access.contains(overload_access) { self.errors.push(Error { kind: ErrorKind::SemanticError( format!( "'{}': image needs {:?} access but only {:?} was provided", name, overload_access, call_access ) .into(), ), meta, }); } // The images satisfy the conditions to be considered as an exact match new_conversions[i] = Conversion::Exact; continue; } else if overload_param_ty == call_arg_ty { // If the types match there's no need to check for conversions so continue new_conversions[i] = Conversion::Exact; continue; } // If the argument is to be passed as a pointer (i.e. either `out` or // `inout` where used as qualifiers) no conversion shall be performed if parameter_info.qualifier.is_lhs() { continue 'outer; } // Try to get the type of conversion needed otherwise this overload can't be used // since no conversion makes it possible so skip it let conversion = match conversion(overload_param_ty, call_arg_ty) { Some(info) => info, None => continue 'outer, }; // At this point a conversion will be needed so the overload no longer // exactly matches the call arguments exact = false; // Compare the conversions needed for this overload parameter to that of the // last overload analyzed respective parameter, the value is: // - `true` when the new overload argument has a better conversion // - `false` when the old overload argument has a better conversion let best_arg = match (conversion, old_conversions[i]) { // An exact match is always better, we don't need to check this for the // current overload since it was checked earlier (_, Conversion::Exact) => false, // No overload was yet analyzed so this one is the best yet (_, Conversion::None) => true, // A conversion from a float to a double is the best possible conversion (Conversion::FloatToDouble, _) => true, (_, Conversion::FloatToDouble) => false, // A conversion from a float to an integer is preferred than one // from double to an integer (Conversion::IntToFloat, Conversion::IntToDouble) => true, (Conversion::IntToDouble, Conversion::IntToFloat) => false, // This case handles things like no conversion and exact which were already // treated and other cases which no conversion is better than the other _ => continue, }; // Check if the best parameter corresponds to the current selected overload // to pass to the next comparison, if this isn't true mark it as ambiguous match best_arg { true => match superior { Some(false) => ambiguous = true, _ => { superior = Some(true); new_conversions[i] = conversion } }, false => match superior { Some(true) => ambiguous = true, _ => superior = Some(false), }, } } // The overload matches exactly the function call so there's no ambiguity (since // repeated overload aren't allowed) and the current overload is selected, no // further querying is needed. if exact { maybe_overload = Some(overload); ambiguous = false; break; } match superior { // New overload is better keep it Some(true) => { maybe_overload = Some(overload); // Replace the conversions old_conversions = new_conversions; } // Old overload is better do nothing Some(false) => {} // No overload was better than the other this can be caused // when all conversions are ambiguous in which the overloads themselves are // ambiguous. None => { ambiguous = true; // Assign the new overload, this helps ensures that in this case of // ambiguity the parsing won't end immediately and allow for further // collection of errors. maybe_overload = Some(overload); } } } if ambiguous { self.errors.push(Error { kind: ErrorKind::SemanticError( format!("Ambiguous best function for '{}'", name).into(), ), meta, }) } let overload = maybe_overload.ok_or_else(|| Error { kind: ErrorKind::SemanticError(format!("Unknown function '{}'", name).into()), meta, })?; let parameters_info = overload.parameters_info.clone(); let parameters = overload.parameters.clone(); let is_void = overload.void; let kind = overload.kind; let mut arguments = Vec::with_capacity(args.len()); let mut proxy_writes = Vec::new(); // Iterate trough the function call arguments applying transformations as needed for (parameter_info, (expr, parameter)) in parameters_info .iter() .zip(raw_args.iter().zip(parameters.iter())) { let (mut handle, meta) = ctx.lower_expect_inner(stmt, self, *expr, parameter_info.qualifier.as_pos(), body)?; if parameter_info.qualifier.is_lhs() { let (ty, value) = match *self.resolve_type(ctx, handle, meta)? { // If the argument is to be passed as a pointer but the type of the // expression returns a vector it must mean that it was for example // swizzled and it must be spilled into a local before calling TypeInner::Vector { size, kind, width } => ( self.module.types.insert( Type { name: None, inner: TypeInner::Vector { size, kind, width }, }, Span::default(), ), handle, ), // If the argument is a pointer whose address space isn't `Function`, an // indirection through a local variable is needed to align the address // spaces of the call argument and the overload parameter. TypeInner::Pointer { base, space } if space != AddressSpace::Function => ( base, ctx.add_expression( Expression::Load { pointer: handle }, Span::default(), body, ), ), TypeInner::ValuePointer { size, kind, width, space, } if space != AddressSpace::Function => { let inner = match size { Some(size) => TypeInner::Vector { size, kind, width }, None => TypeInner::Scalar { kind, width }, }; ( self.module .types .insert(Type { name: None, inner }, Span::default()), ctx.add_expression( Expression::Load { pointer: handle }, Span::default(), body, ), ) } _ => { arguments.push(handle); continue; } }; let temp_var = ctx.locals.append( LocalVariable { name: None, ty, init: None, }, Span::default(), ); let temp_expr = ctx.add_expression(Expression::LocalVariable(temp_var), Span::default(), body); body.push( Statement::Store { pointer: temp_expr, value, }, Span::default(), ); arguments.push(temp_expr); // Register the temporary local to be written back to it's original // place after the function call if let Expression::Swizzle { size, mut vector, pattern, } = ctx.expressions[value] { if let Expression::Load { pointer } = ctx.expressions[vector] { vector = pointer; } for (i, component) in pattern.iter().take(size as usize).enumerate() { let original = ctx.add_expression( Expression::AccessIndex { base: vector, index: *component as u32, }, Span::default(), body, ); let temp = ctx.add_expression( Expression::AccessIndex { base: temp_expr, index: i as u32, }, Span::default(), body, ); proxy_writes.push((original, temp)); } } else { proxy_writes.push((handle, temp_expr)); } continue; } // Apply implicit conversions as needed let scalar_components = scalar_components(&self.module.types[*parameter].inner); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(self, &mut handle, meta, kind, width)?; } arguments.push(handle) } match kind { FunctionKind::Call(function) => { ctx.emit_end(body); let result = if !is_void { Some(ctx.add_expression(Expression::CallResult(function), meta, body)) } else { None }; body.push( crate::Statement::Call { function, arguments, result, }, meta, ); ctx.emit_start(); // Write back all the variables that were scheduled to their original place for (original, pointer) in proxy_writes { let value = ctx.add_expression(Expression::Load { pointer }, meta, body); ctx.emit_restart(body); body.push( Statement::Store { pointer: original, value, }, meta, ); } Ok(result) } FunctionKind::Macro(builtin) => { builtin.call(self, ctx, body, arguments.as_mut_slice(), meta) } } } pub(crate) fn add_function( &mut self, ctx: Context, name: String, result: Option, mut body: Block, meta: Span, ) { ensure_block_returns(&mut body); let void = result.is_none(); let &mut Parser { ref mut lookup_function, ref mut module, .. } = self; // Check if the passed arguments require any special variations let mut variations = builtin_required_variations(ctx.parameters.iter().map(|&arg| &module.types[arg].inner)); // Initiate the declaration if it wasn't previously initialized and inject builtins let declaration = lookup_function.entry(name.clone()).or_insert_with(|| { variations |= BuiltinVariations::STANDARD; Default::default() }); inject_builtin(declaration, module, &name, variations); let Context { expressions, locals, arguments, parameters, parameters_info, .. } = ctx; let function = Function { name: Some(name), arguments, result, local_variables: locals, expressions, named_expressions: FastHashMap::default(), body, }; 'outer: for decl in declaration.overloads.iter_mut() { if parameters.len() != decl.parameters.len() { continue; } for (new_parameter, old_parameter) in parameters.iter().zip(decl.parameters.iter()) { let new_inner = &module.types[*new_parameter].inner; let old_inner = &module.types[*old_parameter].inner; if new_inner != old_inner { continue 'outer; } } if decl.defined { return self.errors.push(Error { kind: ErrorKind::SemanticError("Function already defined".into()), meta, }); } decl.defined = true; decl.parameters_info = parameters_info; match decl.kind { FunctionKind::Call(handle) => *self.module.functions.get_mut(handle) = function, FunctionKind::Macro(_) => { let handle = module.functions.append(function, meta); decl.kind = FunctionKind::Call(handle) } } return; } let handle = module.functions.append(function, meta); declaration.overloads.push(Overload { parameters, parameters_info, kind: FunctionKind::Call(handle), defined: true, internal: false, void, }); } pub(crate) fn add_prototype( &mut self, ctx: Context, name: String, result: Option, meta: Span, ) { let void = result.is_none(); let &mut Parser { ref mut lookup_function, ref mut module, .. } = self; // Check if the passed arguments require any special variations let mut variations = builtin_required_variations(ctx.parameters.iter().map(|&arg| &module.types[arg].inner)); // Initiate the declaration if it wasn't previously initialized and inject builtins let declaration = lookup_function.entry(name.clone()).or_insert_with(|| { variations |= BuiltinVariations::STANDARD; Default::default() }); inject_builtin(declaration, module, &name, variations); let Context { arguments, parameters, parameters_info, .. } = ctx; let function = Function { name: Some(name), arguments, result, ..Default::default() }; 'outer: for decl in declaration.overloads.iter() { if parameters.len() != decl.parameters.len() { continue; } for (new_parameter, old_parameter) in parameters.iter().zip(decl.parameters.iter()) { let new_inner = &module.types[*new_parameter].inner; let old_inner = &module.types[*old_parameter].inner; if new_inner != old_inner { continue 'outer; } } return self.errors.push(Error { kind: ErrorKind::SemanticError("Prototype already defined".into()), meta, }); } let handle = module.functions.append(function, meta); declaration.overloads.push(Overload { parameters, parameters_info, kind: FunctionKind::Call(handle), defined: false, internal: false, void, }); } /// Helper function for building the input/output interface of the entry point /// /// Calls `f` with the data of the entry point argument, flattening composite types /// recursively /// /// The passed arguments to the callback are: /// - The name /// - The pointer expression to the global storage /// - The handle to the type of the entry point argument /// - The binding of the entry point argument /// - The expression arena fn arg_type_walker( &self, name: Option, binding: crate::Binding, pointer: Handle, ty: Handle, expressions: &mut Arena, f: &mut impl FnMut( Option, Handle, Handle, crate::Binding, &mut Arena, ), ) { match self.module.types[ty].inner { TypeInner::Array { base, size: crate::ArraySize::Constant(constant), .. } => { let mut location = match binding { crate::Binding::Location { location, .. } => location, _ => return, }; // TODO: Better error reporting // right now we just don't walk the array if the size isn't known at // compile time and let validation catch it let size = match self.module.constants[constant].to_array_length() { Some(val) => val, None => return f(name, pointer, ty, binding, expressions), }; let interpolation = self.module.types[base] .inner .scalar_kind() .map(|kind| match kind { ScalarKind::Float => crate::Interpolation::Perspective, _ => crate::Interpolation::Flat, }); for index in 0..size { let member_pointer = expressions.append( Expression::AccessIndex { base: pointer, index, }, crate::Span::default(), ); let binding = crate::Binding::Location { location, interpolation, sampling: None, }; location += 1; self.arg_type_walker( name.clone(), binding, member_pointer, base, expressions, f, ) } } TypeInner::Struct { ref members, .. } => { let mut location = match binding { crate::Binding::Location { location, .. } => location, _ => return, }; for (i, member) in members.iter().enumerate() { let member_pointer = expressions.append( Expression::AccessIndex { base: pointer, index: i as u32, }, crate::Span::default(), ); let binding = match member.binding.clone() { Some(binding) => binding, None => { let interpolation = self.module.types[member.ty] .inner .scalar_kind() .map(|kind| match kind { ScalarKind::Float => crate::Interpolation::Perspective, _ => crate::Interpolation::Flat, }); let binding = crate::Binding::Location { location, interpolation, sampling: None, }; location += 1; binding } }; self.arg_type_walker( member.name.clone(), binding, member_pointer, member.ty, expressions, f, ) } } _ => f(name, pointer, ty, binding, expressions), } } pub(crate) fn add_entry_point( &mut self, function: Handle, global_init_body: Block, mut expressions: Arena, ) { let mut arguments = Vec::new(); let mut body = Block::with_capacity( // global init body global_init_body.len() + // prologue and epilogue self.entry_args.len() * 2 // Call, Emit for composing struct and return + 3, ); for arg in self.entry_args.iter() { if arg.storage != StorageQualifier::Input { continue; } let pointer = expressions.append(Expression::GlobalVariable(arg.handle), Default::default()); self.arg_type_walker( arg.name.clone(), arg.binding.clone(), pointer, self.module.global_variables[arg.handle].ty, &mut expressions, &mut |name, pointer, ty, binding, expressions| { let idx = arguments.len() as u32; arguments.push(FunctionArgument { name, ty, binding: Some(binding), }); let value = expressions.append(Expression::FunctionArgument(idx), Default::default()); body.push(Statement::Store { pointer, value }, Default::default()); }, ) } body.extend_block(global_init_body); body.push( Statement::Call { function, arguments: Vec::new(), result: None, }, Default::default(), ); let mut span = 0; let mut members = Vec::new(); let mut components = Vec::new(); for arg in self.entry_args.iter() { if arg.storage != StorageQualifier::Output { continue; } let pointer = expressions.append(Expression::GlobalVariable(arg.handle), Default::default()); self.arg_type_walker( arg.name.clone(), arg.binding.clone(), pointer, self.module.global_variables[arg.handle].ty, &mut expressions, &mut |name, pointer, ty, binding, expressions| { members.push(StructMember { name, ty, binding: Some(binding), offset: span, }); span += self.module.types[ty].inner.size(&self.module.constants); let len = expressions.len(); let load = expressions.append(Expression::Load { pointer }, Default::default()); body.push( Statement::Emit(expressions.range_from(len)), Default::default(), ); components.push(load) }, ) } let (ty, value) = if !components.is_empty() { let ty = self.module.types.insert( Type { name: None, inner: TypeInner::Struct { members, span }, }, Default::default(), ); let len = expressions.len(); let res = expressions.append(Expression::Compose { ty, components }, Default::default()); body.push( Statement::Emit(expressions.range_from(len)), Default::default(), ); (Some(ty), Some(res)) } else { (None, None) }; body.push(Statement::Return { value }, Default::default()); self.module.entry_points.push(EntryPoint { name: "main".to_string(), stage: self.meta.stage, early_depth_test: Some(crate::EarlyDepthTest { conservative: None }) .filter(|_| self.meta.early_fragment_tests), workgroup_size: self.meta.workgroup_size, function: Function { arguments, expressions, body, result: ty.map(|ty| FunctionResult { ty, binding: None }), ..Default::default() }, }); } } /// Helper enum containing the type of conversion need for a call #[derive(PartialEq, Eq, Clone, Copy, Debug)] enum Conversion { /// No conversion needed Exact, /// Float to double conversion needed FloatToDouble, /// Int or uint to float conversion needed IntToFloat, /// Int or uint to double conversion needed IntToDouble, /// Other type of conversion needed Other, /// No conversion was yet registered None, } /// Helper function, returns the type of conversion from `source` to `target`, if a /// conversion is not possible returns None. fn conversion(target: &TypeInner, source: &TypeInner) -> Option { use ScalarKind::*; // Gather the `ScalarKind` and scalar width from both the target and the source let (target_kind, target_width, source_kind, source_width) = match (target, source) { // Conversions between scalars are allowed ( &TypeInner::Scalar { kind: tgt_kind, width: tgt_width, }, &TypeInner::Scalar { kind: src_kind, width: src_width, }, ) => (tgt_kind, tgt_width, src_kind, src_width), // Conversions between vectors of the same size are allowed ( &TypeInner::Vector { kind: tgt_kind, size: tgt_size, width: tgt_width, }, &TypeInner::Vector { kind: src_kind, size: src_size, width: src_width, }, ) if tgt_size == src_size => (tgt_kind, tgt_width, src_kind, src_width), // Conversions between matrices of the same size are allowed ( &TypeInner::Matrix { rows: tgt_rows, columns: tgt_cols, width: tgt_width, }, &TypeInner::Matrix { rows: src_rows, columns: src_cols, width: src_width, }, ) if tgt_cols == src_cols && tgt_rows == src_rows => (Float, tgt_width, Float, src_width), _ => return None, }; // Check if source can be converted into target, if this is the case then the type // power of target must be higher than that of source let target_power = type_power(target_kind, target_width); let source_power = type_power(source_kind, source_width); if target_power < source_power { return None; } Some( match ((target_kind, target_width), (source_kind, source_width)) { // A conversion from a float to a double is special ((Float, 8), (Float, 4)) => Conversion::FloatToDouble, // A conversion from an integer to a float is special ((Float, 4), (Sint | Uint, _)) => Conversion::IntToFloat, // A conversion from an integer to a double is special ((Float, 8), (Sint | Uint, _)) => Conversion::IntToDouble, _ => Conversion::Other, }, ) } /// Helper method returning all the non standard builtin variations needed /// to process the function call with the passed arguments fn builtin_required_variations<'a>(args: impl Iterator) -> BuiltinVariations { let mut variations = BuiltinVariations::empty(); for ty in args { match *ty { TypeInner::ValuePointer { kind, width, .. } | TypeInner::Scalar { kind, width } | TypeInner::Vector { kind, width, .. } => { if kind == ScalarKind::Float && width == 8 { variations |= BuiltinVariations::DOUBLE } } TypeInner::Matrix { width, .. } => { if width == 8 { variations |= BuiltinVariations::DOUBLE } } TypeInner::Image { dim, arrayed, class, } => { if dim == crate::ImageDimension::Cube && arrayed { variations |= BuiltinVariations::CUBE_TEXTURES_ARRAY } if dim == crate::ImageDimension::D2 && arrayed && class.is_multisampled() { variations |= BuiltinVariations::D2_MULTI_TEXTURES_ARRAY } } _ => {} } } variations } ================================================ FILE: lib/naga/src/front/glsl/lex.rs ================================================ use super::{ ast::Precision, token::{Directive, DirectiveKind, Token, TokenValue}, types::parse_type, }; use crate::{FastHashMap, Span, StorageAccess}; use pp_rs::{ pp::Preprocessor, token::{PreprocessorError, Punct, TokenValue as PPTokenValue}, }; #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub struct LexerResult { pub kind: LexerResultKind, pub meta: Span, } #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub enum LexerResultKind { Token(Token), Directive(Directive), Error(PreprocessorError), } pub struct Lexer<'a> { pp: Preprocessor<'a>, } impl<'a> Lexer<'a> { pub fn new(input: &'a str, defines: &'a FastHashMap) -> Self { let mut pp = Preprocessor::new(input); for (define, value) in defines { pp.add_define(define, value).unwrap(); //TODO: handle error } Lexer { pp } } } impl<'a> Iterator for Lexer<'a> { type Item = LexerResult; fn next(&mut self) -> Option { let pp_token = match self.pp.next()? { Ok(t) => t, Err((err, loc)) => { return Some(LexerResult { kind: LexerResultKind::Error(err), meta: loc.into(), }); } }; let meta = pp_token.location.into(); let value = match pp_token.value { PPTokenValue::Extension(extension) => { return Some(LexerResult { kind: LexerResultKind::Directive(Directive { kind: DirectiveKind::Extension, tokens: extension.tokens, }), meta, }) } PPTokenValue::Float(float) => TokenValue::FloatConstant(float), PPTokenValue::Ident(ident) => { match ident.as_str() { // Qualifiers "layout" => TokenValue::Layout, "in" => TokenValue::In, "out" => TokenValue::Out, "uniform" => TokenValue::Uniform, "buffer" => TokenValue::Buffer, "shared" => TokenValue::Shared, "invariant" => TokenValue::Invariant, "flat" => TokenValue::Interpolation(crate::Interpolation::Flat), "noperspective" => TokenValue::Interpolation(crate::Interpolation::Linear), "smooth" => TokenValue::Interpolation(crate::Interpolation::Perspective), "centroid" => TokenValue::Sampling(crate::Sampling::Centroid), "sample" => TokenValue::Sampling(crate::Sampling::Sample), "const" => TokenValue::Const, "inout" => TokenValue::InOut, "precision" => TokenValue::Precision, "highp" => TokenValue::PrecisionQualifier(Precision::High), "mediump" => TokenValue::PrecisionQualifier(Precision::Medium), "lowp" => TokenValue::PrecisionQualifier(Precision::Low), "restrict" => TokenValue::Restrict, "readonly" => TokenValue::MemoryQualifier(StorageAccess::LOAD), "writeonly" => TokenValue::MemoryQualifier(StorageAccess::STORE), // values "true" => TokenValue::BoolConstant(true), "false" => TokenValue::BoolConstant(false), // jump statements "continue" => TokenValue::Continue, "break" => TokenValue::Break, "return" => TokenValue::Return, "discard" => TokenValue::Discard, // selection statements "if" => TokenValue::If, "else" => TokenValue::Else, "switch" => TokenValue::Switch, "case" => TokenValue::Case, "default" => TokenValue::Default, // iteration statements "while" => TokenValue::While, "do" => TokenValue::Do, "for" => TokenValue::For, // types "void" => TokenValue::Void, "struct" => TokenValue::Struct, word => match parse_type(word) { Some(t) => TokenValue::TypeName(t), None => TokenValue::Identifier(String::from(word)), }, } } PPTokenValue::Integer(integer) => TokenValue::IntConstant(integer), PPTokenValue::Punct(punct) => match punct { // Compound assignments Punct::AddAssign => TokenValue::AddAssign, Punct::SubAssign => TokenValue::SubAssign, Punct::MulAssign => TokenValue::MulAssign, Punct::DivAssign => TokenValue::DivAssign, Punct::ModAssign => TokenValue::ModAssign, Punct::LeftShiftAssign => TokenValue::LeftShiftAssign, Punct::RightShiftAssign => TokenValue::RightShiftAssign, Punct::AndAssign => TokenValue::AndAssign, Punct::XorAssign => TokenValue::XorAssign, Punct::OrAssign => TokenValue::OrAssign, // Two character punctuation Punct::Increment => TokenValue::Increment, Punct::Decrement => TokenValue::Decrement, Punct::LogicalAnd => TokenValue::LogicalAnd, Punct::LogicalOr => TokenValue::LogicalOr, Punct::LogicalXor => TokenValue::LogicalXor, Punct::LessEqual => TokenValue::LessEqual, Punct::GreaterEqual => TokenValue::GreaterEqual, Punct::EqualEqual => TokenValue::Equal, Punct::NotEqual => TokenValue::NotEqual, Punct::LeftShift => TokenValue::LeftShift, Punct::RightShift => TokenValue::RightShift, // Parenthesis or similar Punct::LeftBrace => TokenValue::LeftBrace, Punct::RightBrace => TokenValue::RightBrace, Punct::LeftParen => TokenValue::LeftParen, Punct::RightParen => TokenValue::RightParen, Punct::LeftBracket => TokenValue::LeftBracket, Punct::RightBracket => TokenValue::RightBracket, // Other one character punctuation Punct::LeftAngle => TokenValue::LeftAngle, Punct::RightAngle => TokenValue::RightAngle, Punct::Semicolon => TokenValue::Semicolon, Punct::Comma => TokenValue::Comma, Punct::Colon => TokenValue::Colon, Punct::Dot => TokenValue::Dot, Punct::Equal => TokenValue::Assign, Punct::Bang => TokenValue::Bang, Punct::Minus => TokenValue::Dash, Punct::Tilde => TokenValue::Tilde, Punct::Plus => TokenValue::Plus, Punct::Star => TokenValue::Star, Punct::Slash => TokenValue::Slash, Punct::Percent => TokenValue::Percent, Punct::Pipe => TokenValue::VerticalBar, Punct::Caret => TokenValue::Caret, Punct::Ampersand => TokenValue::Ampersand, Punct::Question => TokenValue::Question, }, PPTokenValue::Pragma(pragma) => { return Some(LexerResult { kind: LexerResultKind::Directive(Directive { kind: DirectiveKind::Pragma, tokens: pragma.tokens, }), meta, }) } PPTokenValue::Version(version) => { return Some(LexerResult { kind: LexerResultKind::Directive(Directive { kind: DirectiveKind::Version { is_first_directive: version.is_first_directive, }, tokens: version.tokens, }), meta, }) } }; Some(LexerResult { kind: LexerResultKind::Token(Token { value, meta }), meta, }) } } #[cfg(test)] mod tests { use pp_rs::token::{Integer, Location, Token as PPToken, TokenValue as PPTokenValue}; use super::{ super::token::{Directive, DirectiveKind, Token, TokenValue}, Lexer, LexerResult, LexerResultKind, }; use crate::Span; #[test] fn lex_tokens() { let defines = crate::FastHashMap::default(); // line comments let mut lex = Lexer::new("#version 450\nvoid main () {}", &defines); let mut location = Location::default(); location.start = 9; location.end = 12; assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Directive(Directive { kind: DirectiveKind::Version { is_first_directive: true }, tokens: vec![PPToken { value: PPTokenValue::Integer(Integer { signed: true, value: 450, width: 32 }), location }] }), meta: Span::new(1, 8) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::Void, meta: Span::new(13, 17) }), meta: Span::new(13, 17) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::Identifier("main".into()), meta: Span::new(18, 22) }), meta: Span::new(18, 22) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::LeftParen, meta: Span::new(23, 24) }), meta: Span::new(23, 24) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::RightParen, meta: Span::new(24, 25) }), meta: Span::new(24, 25) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::LeftBrace, meta: Span::new(26, 27) }), meta: Span::new(26, 27) } ); assert_eq!( lex.next().unwrap(), LexerResult { kind: LexerResultKind::Token(Token { value: TokenValue::RightBrace, meta: Span::new(27, 28) }), meta: Span::new(27, 28) } ); assert_eq!(lex.next(), None); } } ================================================ FILE: lib/naga/src/front/glsl/mod.rs ================================================ /*! Frontend for [GLSL][glsl] (OpenGL Shading Language). To begin, take a look at the documentation for the [`Parser`](Parser). # Supported versions ## Vulkan - 440 (partial) - 450 - 460 [glsl]: https://www.khronos.org/registry/OpenGL/index_gl.php */ pub use ast::{Precision, Profile}; pub use error::{Error, ErrorKind, ExpectedToken}; pub use token::TokenValue; use crate::{proc::Layouter, FastHashMap, FastHashSet, Handle, Module, ShaderStage, Span, Type}; use ast::{EntryArg, FunctionDeclaration, GlobalLookup}; use parser::ParsingContext; mod ast; mod builtins; mod constants; mod context; mod error; mod functions; mod lex; mod offset; mod parser; #[cfg(test)] mod parser_tests; mod token; mod types; mod variables; type Result = std::result::Result; /// Per-shader options passed to [`parse`](Parser::parse). /// /// The [`From`](From) trait is implemented for [`ShaderStage`](ShaderStage) to /// provide a quick way to create a Options instance. /// ```rust /// # use naga::ShaderStage; /// # use naga::front::glsl::Options; /// Options::from(ShaderStage::Vertex); /// ``` #[derive(Debug)] pub struct Options { /// The shader stage in the pipeline. pub stage: ShaderStage, /// Preprocesor definitions to be used, akin to having /// ```glsl /// #define key value /// ``` /// for each key value pair in the map. pub defines: FastHashMap, } impl From for Options { fn from(stage: ShaderStage) -> Self { Options { stage, defines: FastHashMap::default(), } } } /// Additional information about the GLSL shader. /// /// Stores additional information about the GLSL shader which might not be /// stored in the shader [`Module`](Module). #[derive(Debug)] pub struct ShaderMetadata { /// The GLSL version specified in the shader trough the use of the /// `#version` preprocessor directive. pub version: u16, /// The GLSL profile specified in the shader trough the use of the /// `#version` preprocessor directive. pub profile: Profile, /// The shader stage in the pipeline, passed to the [`parse`](Parser::parse) /// method via the [`Options`](Options) struct. pub stage: ShaderStage, /// The workgroup size for compute shaders, defaults to `[1; 3]` for /// compute shaders and `[0; 3]` for non compute shaders. pub workgroup_size: [u32; 3], /// Whether or not early fragment tests where requested by the shader. /// Defaults to `false`. pub early_fragment_tests: bool, /// The shader can request extensions via the /// `#extension` preprocessor directive, in the directive a behavior /// parameter is used to control whether the extension should be disabled, /// warn on usage, enabled if possible or required. /// /// This field only stores extensions which were required or requested to /// be enabled if possible and they are supported. pub extensions: FastHashSet, } impl ShaderMetadata { fn reset(&mut self, stage: ShaderStage) { self.version = 0; self.profile = Profile::Core; self.stage = stage; self.workgroup_size = [if stage == ShaderStage::Compute { 1 } else { 0 }; 3]; self.early_fragment_tests = false; self.extensions.clear(); } } impl Default for ShaderMetadata { fn default() -> Self { ShaderMetadata { version: 0, profile: Profile::Core, stage: ShaderStage::Vertex, workgroup_size: [0; 3], early_fragment_tests: false, extensions: FastHashSet::default(), } } } /// The `Parser` is the central structure of the GLSL frontend. /// /// To instantiate a new `Parser` the [`Default`](Default) trait is used, so a /// call to the associated function [`Parser::default`](Parser::default) will /// return a new `Parser` instance. /// /// To parse a shader simply call the [`parse`](Parser::parse) method with a /// [`Options`](Options) struct and a [`&str`](str) holding the glsl code. /// /// The `Parser` also provides the [`metadata`](Parser::metadata) to get some /// further information about the previously parsed shader, like version and /// extensions used (see the documentation for /// [`ShaderMetadata`](ShaderMetadata) to see all the returned information) /// /// # Example usage /// ```rust /// use naga::ShaderStage; /// use naga::front::glsl::{Parser, Options}; /// /// let glsl = r#" /// #version 450 core /// /// void main() {} /// "#; /// /// let mut parser = Parser::default(); /// let options = Options::from(ShaderStage::Vertex); /// parser.parse(&options, glsl); /// ``` /// /// # Reusability /// /// If there's a need to parse more than one shader reusing the same `Parser` /// instance may be beneficial since internal allocations will be reused. /// /// Calling the [`parse`](Parser::parse) method multiple times will reset the /// `Parser` so no extra care is needed when reusing. #[derive(Debug, Default)] pub struct Parser { meta: ShaderMetadata, lookup_function: FastHashMap, lookup_type: FastHashMap>, global_variables: Vec<(String, GlobalLookup)>, entry_args: Vec, layouter: Layouter, errors: Vec, module: Module, } impl Parser { fn reset(&mut self, stage: ShaderStage) { self.meta.reset(stage); self.lookup_function.clear(); self.lookup_type.clear(); self.global_variables.clear(); self.entry_args.clear(); self.layouter.clear(); // This is necessary because if the last parsing errored out, the module // wouldn't have been taken self.module = Module::default(); } /// Parses a shader either outputting a shader [`Module`](Module) or a list /// of [`Error`](Error)s. /// /// Multiple calls using the same `Parser` and different shaders are supported. pub fn parse( &mut self, options: &Options, source: &str, ) -> std::result::Result> { self.reset(options.stage); let lexer = lex::Lexer::new(source, &options.defines); let mut ctx = ParsingContext::new(lexer); if let Err(e) = ctx.parse(self) { self.errors.push(e); } if self.errors.is_empty() { Ok(std::mem::take(&mut self.module)) } else { Err(std::mem::take(&mut self.errors)) } } /// Returns additional information about the parsed shader which might not be /// stored in the [`Module`](Module), see the documentation for /// [`ShaderMetadata`](ShaderMetadata) for more information about the /// returned data. /// /// # Notes /// /// Following an unsuccessful parsing the state of the returned information /// is undefined, it might contain only partial information about the /// current shader, the previous shader or both. pub const fn metadata(&self) -> &ShaderMetadata { &self.meta } } ================================================ FILE: lib/naga/src/front/glsl/offset.rs ================================================ /*! Module responsible for calculating the offset and span for types. There exists two types of layouts std140 and std430 (there's technically two more layouts, shared and packed. Shared is not supported by spirv. Packed is implementation dependent and for now it's just implemented as an alias to std140). The OpenGl spec (the layout rules are defined by the OpenGl spec in section 7.6.2.2 as opposed to the GLSL spec) uses the term basic machine units which are equivalent to bytes. */ use super::{ ast::StructLayout, error::{Error, ErrorKind}, Span, }; use crate::{proc::Alignment, Arena, Constant, Handle, Type, TypeInner, UniqueArena}; /// Struct with information needed for defining a struct member. /// /// Returned by [`calculate_offset`](calculate_offset) #[derive(Debug)] pub struct TypeAlignSpan { /// The handle to the type, this might be the same handle passed to /// [`calculate_offset`](calculate_offset) or a new such a new array type /// with a different stride set. pub ty: Handle, /// The alignment required by the type. pub align: Alignment, /// The size of the type. pub span: u32, } /// Returns the type, alignment and span of a struct member according to a [`StructLayout`](StructLayout). /// /// The functions returns a [`TypeAlignSpan`](TypeAlignSpan) which has a `ty` member /// this should be used as the struct member type because for example arrays may have to /// change the stride and as such need to have a different type. pub fn calculate_offset( mut ty: Handle, meta: Span, layout: StructLayout, types: &mut UniqueArena, constants: &Arena, errors: &mut Vec, ) -> TypeAlignSpan { // When using the std430 storage layout, shader storage blocks will be laid out in buffer storage // identically to uniform and shader storage blocks using the std140 layout, except // that the base alignment and stride of arrays of scalars and vectors in rule 4 and of // structures in rule 9 are not rounded up a multiple of the base alignment of a vec4. let (align, span) = match types[ty].inner { // 1. If the member is a scalar consuming N basic machine units, // the base alignment is N. TypeInner::Scalar { width, .. } => (Alignment::from_width(width), width as u32), // 2. If the member is a two- or four-component vector with components // consuming N basic machine units, the base alignment is 2N or 4N, respectively. // 3. If the member is a three-component vector with components consuming N // basic machine units, the base alignment is 4N. TypeInner::Vector { size, width, .. } => ( Alignment::from(size) * Alignment::from_width(width), size as u32 * width as u32, ), // 4. If the member is an array of scalars or vectors, the base alignment and array // stride are set to match the base alignment of a single array element, according // to rules (1), (2), and (3), and rounded up to the base alignment of a vec4. // TODO: Matrices array TypeInner::Array { base, size, .. } => { let info = calculate_offset(base, meta, layout, types, constants, errors); let name = types[ty].name.clone(); // See comment at the beginning of the function let (align, stride) = if StructLayout::Std430 == layout { (info.align, info.align.round_up(info.span)) } else { let align = info.align.max(Alignment::MIN_UNIFORM); (align, align.round_up(info.span)) }; let span = match size { crate::ArraySize::Constant(s) => { constants[s].to_array_length().unwrap_or(1) * stride } crate::ArraySize::Dynamic => stride, }; let ty_span = types.get_span(ty); ty = types.insert( Type { name, inner: TypeInner::Array { base: info.ty, size, stride, }, }, ty_span, ); (align, span) } // 5. If the member is a column-major matrix with C columns and R rows, the // matrix is stored identically to an array of C column vectors with R // components each, according to rule (4) // TODO: Row major matrices TypeInner::Matrix { columns, rows, width, } => { let mut align = Alignment::from(rows) * Alignment::from_width(width); // See comment at the beginning of the function if StructLayout::Std430 != layout { align = align.max(Alignment::MIN_UNIFORM); } // See comment on the error kind if StructLayout::Std140 == layout && rows == crate::VectorSize::Bi { errors.push(Error { kind: ErrorKind::UnsupportedMatrixTypeInStd140, meta, }); } (align, align * columns as u32) } TypeInner::Struct { ref members, .. } => { let mut span = 0; let mut align = Alignment::ONE; let mut members = members.clone(); let name = types[ty].name.clone(); for member in members.iter_mut() { let info = calculate_offset(member.ty, meta, layout, types, constants, errors); let member_alignment = info.align; span = member_alignment.round_up(span); align = member_alignment.max(align); member.ty = info.ty; member.offset = span; span += info.span; } span = align.round_up(span); let ty_span = types.get_span(ty); ty = types.insert( Type { name, inner: TypeInner::Struct { members, span }, }, ty_span, ); (align, span) } _ => { errors.push(Error { kind: ErrorKind::SemanticError("Invalid struct member type".into()), meta, }); (Alignment::ONE, 0) } }; TypeAlignSpan { ty, align, span } } ================================================ FILE: lib/naga/src/front/glsl/parser/declarations.rs ================================================ use crate::{ front::glsl::{ ast::{ GlobalLookup, GlobalLookupKind, Precision, QualifierKey, QualifierValue, StorageQualifier, StructLayout, TypeQualifiers, }, context::{Context, ExprPos}, error::ExpectedToken, offset, token::{Token, TokenValue}, types::scalar_components, variables::{GlobalOrConstant, VarDeclaration}, Error, ErrorKind, Parser, Span, }, proc::Alignment, AddressSpace, Block, Expression, FunctionResult, Handle, ScalarKind, Statement, StructMember, Type, TypeInner, }; use super::{DeclarationContext, ParsingContext, Result}; /// Helper method used to retrieve the child type of `ty` at /// index `i`. /// /// # Note /// /// Does not check if the index is valid and returns the same type /// when indexing out-of-bounds a struct or indexing a non indexable /// type. fn element_or_member_type( ty: Handle, i: usize, types: &mut crate::UniqueArena, ) -> Handle { match types[ty].inner { // The child type of a vector is a scalar of the same kind and width TypeInner::Vector { kind, width, .. } => types.insert( Type { name: None, inner: TypeInner::Scalar { kind, width }, }, Default::default(), ), // The child type of a matrix is a vector of floats with the same // width and the size of the matrix rows. TypeInner::Matrix { rows, width, .. } => types.insert( Type { name: None, inner: TypeInner::Vector { size: rows, kind: ScalarKind::Float, width, }, }, Default::default(), ), // The child type of an array is the base type of the array TypeInner::Array { base, .. } => base, // The child type of a struct at index `i` is the type of it's // member at that same index. // // In case the index is out of bounds the same type is returned TypeInner::Struct { ref members, .. } => { members.get(i).map(|member| member.ty).unwrap_or(ty) } // The type isn't indexable, the same type is returned _ => ty, } } impl<'source> ParsingContext<'source> { pub fn parse_external_declaration( &mut self, parser: &mut Parser, global_ctx: &mut Context, global_body: &mut Block, ) -> Result<()> { if self .parse_declaration(parser, global_ctx, global_body, true)? .is_none() { let token = self.bump(parser)?; match token.value { TokenValue::Semicolon if parser.meta.version == 460 => Ok(()), _ => { let expected = match parser.meta.version { 460 => vec![TokenValue::Semicolon.into(), ExpectedToken::Eof], _ => vec![ExpectedToken::Eof], }; Err(Error { kind: ErrorKind::InvalidToken(token.value, expected), meta: token.meta, }) } } } else { Ok(()) } } pub fn parse_initializer( &mut self, parser: &mut Parser, ty: Handle, ctx: &mut Context, body: &mut Block, ) -> Result<(Handle, Span)> { // initializer: // assignment_expression // LEFT_BRACE initializer_list RIGHT_BRACE // LEFT_BRACE initializer_list COMMA RIGHT_BRACE // // initializer_list: // initializer // initializer_list COMMA initializer if let Some(Token { mut meta, .. }) = self.bump_if(parser, TokenValue::LeftBrace) { // initializer_list let mut components = Vec::new(); loop { // The type expected to be parsed inside the initializer list let new_ty = element_or_member_type(ty, components.len(), &mut parser.module.types); components.push(self.parse_initializer(parser, new_ty, ctx, body)?.0); let token = self.bump(parser)?; match token.value { TokenValue::Comma => { if let Some(Token { meta: end_meta, .. }) = self.bump_if(parser, TokenValue::RightBrace) { meta.subsume(end_meta); break; } } TokenValue::RightBrace => { meta.subsume(token.meta); break; } _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![TokenValue::Comma.into(), TokenValue::RightBrace.into()], ), meta: token.meta, }) } } } Ok(( ctx.add_expression(Expression::Compose { ty, components }, meta, body), meta, )) } else { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_assignment(parser, ctx, &mut stmt, body)?; let (mut init, init_meta) = ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?; let scalar_components = scalar_components(&parser.module.types[ty].inner); if let Some((kind, width)) = scalar_components { ctx.implicit_conversion(parser, &mut init, init_meta, kind, width)?; } Ok((init, init_meta)) } } // Note: caller preparsed the type and qualifiers // Note: caller skips this if the fallthrough token is not expected to be consumed here so this // produced Error::InvalidToken if it isn't consumed pub fn parse_init_declarator_list( &mut self, parser: &mut Parser, mut ty: Handle, ctx: &mut DeclarationContext, ) -> Result<()> { // init_declarator_list: // single_declaration // init_declarator_list COMMA IDENTIFIER // init_declarator_list COMMA IDENTIFIER array_specifier // init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer // init_declarator_list COMMA IDENTIFIER EQUAL initializer // // single_declaration: // fully_specified_type // fully_specified_type IDENTIFIER // fully_specified_type IDENTIFIER array_specifier // fully_specified_type IDENTIFIER array_specifier EQUAL initializer // fully_specified_type IDENTIFIER EQUAL initializer // Consume any leading comma, e.g. this is valid: `float, a=1;` if self .peek(parser) .map_or(false, |t| t.value == TokenValue::Comma) { self.next(parser); } loop { let token = self.bump(parser)?; let name = match token.value { TokenValue::Semicolon => break, TokenValue::Identifier(name) => name, _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()], ), meta: token.meta, }) } }; let mut meta = token.meta; // array_specifier // array_specifier EQUAL initializer // EQUAL initializer // parse an array specifier if it exists // NOTE: unlike other parse methods this one doesn't expect an array specifier and // returns Ok(None) rather than an error if there is not one self.parse_array_specifier(parser, &mut meta, &mut ty)?; let init = self .bump_if(parser, TokenValue::Assign) .map::, _>(|_| { let (mut expr, init_meta) = self.parse_initializer(parser, ty, ctx.ctx, ctx.body)?; let scalar_components = scalar_components(&parser.module.types[ty].inner); if let Some((kind, width)) = scalar_components { ctx.ctx .implicit_conversion(parser, &mut expr, init_meta, kind, width)?; } meta.subsume(init_meta); Ok((expr, init_meta)) }) .transpose()?; let is_const = ctx.qualifiers.storage.0 == StorageQualifier::Const; let maybe_constant = if ctx.external { if let Some((root, meta)) = init { match parser.solve_constant(ctx.ctx, root, meta) { Ok(res) => Some(res), // If the declaration is external (global scope) and is constant qualified // then the initializer must be a constant expression Err(err) if is_const => return Err(err), _ => None, } } else { None } } else { None }; let pointer = ctx.add_var(parser, ty, name, maybe_constant, meta)?; if let Some((value, _)) = init.filter(|_| maybe_constant.is_none()) { ctx.flush_expressions(); ctx.body.push(Statement::Store { pointer, value }, meta); } let token = self.bump(parser)?; match token.value { TokenValue::Semicolon => break, TokenValue::Comma => {} _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![TokenValue::Comma.into(), TokenValue::Semicolon.into()], ), meta: token.meta, }) } } } Ok(()) } /// `external` whether or not we are in a global or local context pub fn parse_declaration( &mut self, parser: &mut Parser, ctx: &mut Context, body: &mut Block, external: bool, ) -> Result> { //declaration: // function_prototype SEMICOLON // // init_declarator_list SEMICOLON // PRECISION precision_qualifier type_specifier SEMICOLON // // type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON // type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON // type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER array_specifier SEMICOLON // type_qualifier SEMICOLON type_qualifier IDENTIFIER SEMICOLON // type_qualifier IDENTIFIER identifier_list SEMICOLON if self.peek_type_qualifier(parser) || self.peek_type_name(parser) { let mut qualifiers = self.parse_type_qualifiers(parser)?; if self.peek_type_name(parser) { // This branch handles variables and function prototypes and if // external is true also function definitions let (ty, mut meta) = self.parse_type(parser)?; let token = self.bump(parser)?; let token_fallthrough = match token.value { TokenValue::Identifier(name) => match self.expect_peek(parser)?.value { TokenValue::LeftParen => { // This branch handles function definition and prototypes self.bump(parser)?; let result = ty.map(|ty| FunctionResult { ty, binding: None }); let mut body = Block::new(); let mut context = Context::new(parser, &mut body); self.parse_function_args(parser, &mut context, &mut body)?; let end_meta = self.expect(parser, TokenValue::RightParen)?.meta; meta.subsume(end_meta); let token = self.bump(parser)?; return match token.value { TokenValue::Semicolon => { // This branch handles function prototypes parser.add_prototype(context, name, result, meta); Ok(Some(meta)) } TokenValue::LeftBrace if external => { // This branch handles function definitions // as you can see by the guard this branch // only happens if external is also true // parse the body self.parse_compound_statement( token.meta, parser, &mut context, &mut body, &mut None, )?; parser.add_function(context, name, result, body, meta); Ok(Some(meta)) } _ if external => Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ TokenValue::LeftBrace.into(), TokenValue::Semicolon.into(), ], ), meta: token.meta, }), _ => Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![TokenValue::Semicolon.into()], ), meta: token.meta, }), }; } // Pass the token to the init_declarator_list parser _ => Token { value: TokenValue::Identifier(name), meta: token.meta, }, }, // Pass the token to the init_declarator_list parser _ => token, }; // If program execution has reached here then this will be a // init_declarator_list // token_falltrough will have a token that was already bumped if let Some(ty) = ty { let mut ctx = DeclarationContext { qualifiers, external, ctx, body, }; self.backtrack(token_fallthrough)?; self.parse_init_declarator_list(parser, ty, &mut ctx)?; } else { parser.errors.push(Error { kind: ErrorKind::SemanticError("Declaration cannot have void type".into()), meta, }) } Ok(Some(meta)) } else { // This branch handles struct definitions and modifiers like // ```glsl // layout(early_fragment_tests); // ``` let token = self.bump(parser)?; match token.value { TokenValue::Identifier(ty_name) => { if self.bump_if(parser, TokenValue::LeftBrace).is_some() { self.parse_block_declaration( parser, ctx, body, &mut qualifiers, ty_name, token.meta, ) .map(Some) } else { if qualifiers.invariant.take().is_some() { parser.make_variable_invariant(ctx, body, &ty_name, token.meta); qualifiers.unused_errors(&mut parser.errors); self.expect(parser, TokenValue::Semicolon)?; return Ok(Some(qualifiers.span)); } //TODO: declaration // type_qualifier IDENTIFIER SEMICOLON // type_qualifier IDENTIFIER identifier_list SEMICOLON Err(Error { kind: ErrorKind::NotImplemented("variable qualifier"), meta: token.meta, }) } } TokenValue::Semicolon => { if let Some(value) = qualifiers.uint_layout_qualifier("local_size_x", &mut parser.errors) { parser.meta.workgroup_size[0] = value; } if let Some(value) = qualifiers.uint_layout_qualifier("local_size_y", &mut parser.errors) { parser.meta.workgroup_size[1] = value; } if let Some(value) = qualifiers.uint_layout_qualifier("local_size_z", &mut parser.errors) { parser.meta.workgroup_size[2] = value; } parser.meta.early_fragment_tests |= qualifiers .none_layout_qualifier("early_fragment_tests", &mut parser.errors); qualifiers.unused_errors(&mut parser.errors); Ok(Some(qualifiers.span)) } _ => Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()], ), meta: token.meta, }), } } } else { match self.peek(parser).map(|t| &t.value) { Some(&TokenValue::Precision) => { // PRECISION precision_qualifier type_specifier SEMICOLON self.bump(parser)?; let token = self.bump(parser)?; let _ = match token.value { TokenValue::PrecisionQualifier(p) => p, _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ TokenValue::PrecisionQualifier(Precision::High).into(), TokenValue::PrecisionQualifier(Precision::Medium).into(), TokenValue::PrecisionQualifier(Precision::Low).into(), ], ), meta: token.meta, }) } }; let (ty, meta) = self.parse_type_non_void(parser)?; match parser.module.types[ty].inner { TypeInner::Scalar { kind: ScalarKind::Float | ScalarKind::Sint, .. } => {} _ => parser.errors.push(Error { kind: ErrorKind::SemanticError( "Precision statement can only work on floats and ints".into(), ), meta, }), } self.expect(parser, TokenValue::Semicolon)?; Ok(Some(meta)) } _ => Ok(None), } } } pub fn parse_block_declaration( &mut self, parser: &mut Parser, ctx: &mut Context, body: &mut Block, qualifiers: &mut TypeQualifiers, ty_name: String, mut meta: Span, ) -> Result { let layout = match qualifiers.layout_qualifiers.remove(&QualifierKey::Layout) { Some((QualifierValue::Layout(l), _)) => l, None => { if let StorageQualifier::AddressSpace(AddressSpace::Storage { .. }) = qualifiers.storage.0 { StructLayout::Std430 } else { StructLayout::Std140 } } _ => unreachable!(), }; let mut members = Vec::new(); let span = self.parse_struct_declaration_list(parser, &mut members, layout)?; self.expect(parser, TokenValue::RightBrace)?; let mut ty = parser.module.types.insert( Type { name: Some(ty_name), inner: TypeInner::Struct { members: members.clone(), span, }, }, Default::default(), ); let token = self.bump(parser)?; let name = match token.value { TokenValue::Semicolon => None, TokenValue::Identifier(name) => { self.parse_array_specifier(parser, &mut meta, &mut ty)?; self.expect(parser, TokenValue::Semicolon)?; Some(name) } _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ExpectedToken::Identifier, TokenValue::Semicolon.into()], ), meta: token.meta, }) } }; let global = parser.add_global_var( ctx, body, VarDeclaration { qualifiers, ty, name, init: None, meta, }, )?; for (i, k, ty) in members.into_iter().enumerate().filter_map(|(i, m)| { let ty = m.ty; m.name.map(|s| (i as u32, s, ty)) }) { let lookup = GlobalLookup { kind: match global { GlobalOrConstant::Global(handle) => GlobalLookupKind::BlockSelect(handle, i), GlobalOrConstant::Constant(handle) => GlobalLookupKind::Constant(handle, ty), }, entry_arg: None, mutable: true, }; ctx.add_global(parser, &k, lookup, body); parser.global_variables.push((k, lookup)); } Ok(meta) } // TODO: Accept layout arguments pub fn parse_struct_declaration_list( &mut self, parser: &mut Parser, members: &mut Vec, layout: StructLayout, ) -> Result { let mut span = 0; let mut align = Alignment::ONE; loop { // TODO: type_qualifier let (mut ty, mut meta) = self.parse_type_non_void(parser)?; let (name, end_meta) = self.expect_ident(parser)?; meta.subsume(end_meta); self.parse_array_specifier(parser, &mut meta, &mut ty)?; self.expect(parser, TokenValue::Semicolon)?; let info = offset::calculate_offset( ty, meta, layout, &mut parser.module.types, &parser.module.constants, &mut parser.errors, ); let member_alignment = info.align; span = member_alignment.round_up(span); align = member_alignment.max(align); members.push(StructMember { name: Some(name), ty: info.ty, binding: None, offset: span, }); span += info.span; if let TokenValue::RightBrace = self.expect_peek(parser)?.value { break; } } span = align.round_up(span); Ok(span) } } ================================================ FILE: lib/naga/src/front/glsl/parser/expressions.rs ================================================ use crate::{ front::glsl::{ ast::{FunctionCall, FunctionCallKind, HirExpr, HirExprKind}, context::{Context, StmtContext}, error::{ErrorKind, ExpectedToken}, parser::ParsingContext, token::{Token, TokenValue}, Error, Parser, Result, Span, }, ArraySize, BinaryOperator, Block, Constant, ConstantInner, Handle, ScalarValue, Type, TypeInner, UnaryOperator, }; impl<'source> ParsingContext<'source> { pub fn parse_primary( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, ) -> Result> { let mut token = self.bump(parser)?; let (width, value) = match token.value { TokenValue::IntConstant(int) => ( (int.width / 8) as u8, if int.signed { ScalarValue::Sint(int.value as i64) } else { ScalarValue::Uint(int.value) }, ), TokenValue::FloatConstant(float) => ( (float.width / 8) as u8, ScalarValue::Float(float.value as f64), ), TokenValue::BoolConstant(value) => (1, ScalarValue::Bool(value)), TokenValue::LeftParen => { let expr = self.parse_expression(parser, ctx, stmt, body)?; let meta = self.expect(parser, TokenValue::RightParen)?.meta; token.meta.subsume(meta); return Ok(expr); } _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ TokenValue::LeftParen.into(), ExpectedToken::IntLiteral, ExpectedToken::FloatLiteral, ExpectedToken::BoolLiteral, ], ), meta: token.meta, }); } }; let handle = parser.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width, value }, }, token.meta, ); Ok(stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Constant(handle), meta: token.meta, }, Default::default(), )) } pub fn parse_function_call_args( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, meta: &mut Span, ) -> Result>> { let mut args = Vec::new(); if let Some(token) = self.bump_if(parser, TokenValue::RightParen) { meta.subsume(token.meta); } else { loop { args.push(self.parse_assignment(parser, ctx, stmt, body)?); let token = self.bump(parser)?; match token.value { TokenValue::Comma => {} TokenValue::RightParen => { meta.subsume(token.meta); break; } _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![TokenValue::Comma.into(), TokenValue::RightParen.into()], ), meta: token.meta, }); } } } } Ok(args) } pub fn parse_postfix( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, ) -> Result> { let mut base = if self.peek_type_name(parser) { let (mut handle, mut meta) = self.parse_type_non_void(parser)?; self.expect(parser, TokenValue::LeftParen)?; let args = self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?; if let TypeInner::Array { size: ArraySize::Dynamic, stride, base, } = parser.module.types[handle].inner { let span = parser.module.types.get_span(handle); let constant = parser.module.constants.fetch_or_append( Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Uint(args.len() as u64), }, }, Span::default(), ); handle = parser.module.types.insert( Type { name: None, inner: TypeInner::Array { stride, base, size: ArraySize::Constant(constant), }, }, span, ) } stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Call(FunctionCall { kind: FunctionCallKind::TypeConstructor(handle), args, }), meta, }, Default::default(), ) } else if let TokenValue::Identifier(_) = self.expect_peek(parser)?.value { let (name, mut meta) = self.expect_ident(parser)?; let expr = if self.bump_if(parser, TokenValue::LeftParen).is_some() { let args = self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?; let kind = match parser.lookup_type.get(&name) { Some(ty) => FunctionCallKind::TypeConstructor(*ty), None => FunctionCallKind::Function(name), }; HirExpr { kind: HirExprKind::Call(FunctionCall { kind, args }), meta, } } else { let var = match parser.lookup_variable(ctx, body, &name, meta) { Some(var) => var, None => { return Err(Error { kind: ErrorKind::UnknownVariable(name), meta, }) } }; HirExpr { kind: HirExprKind::Variable(var), meta, } }; stmt.hir_exprs.append(expr, Default::default()) } else { self.parse_primary(parser, ctx, stmt, body)? }; while let TokenValue::LeftBracket | TokenValue::Dot | TokenValue::Increment | TokenValue::Decrement = self.expect_peek(parser)?.value { let Token { value, mut meta } = self.bump(parser)?; match value { TokenValue::LeftBracket => { let index = self.parse_expression(parser, ctx, stmt, body)?; let end_meta = self.expect(parser, TokenValue::RightBracket)?.meta; meta.subsume(end_meta); base = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Access { base, index }, meta, }, Default::default(), ) } TokenValue::Dot => { let (field, end_meta) = self.expect_ident(parser)?; if self.bump_if(parser, TokenValue::LeftParen).is_some() { let args = self.parse_function_call_args(parser, ctx, stmt, body, &mut meta)?; base = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Method { expr: base, name: field, args, }, meta, }, Default::default(), ); continue; } meta.subsume(end_meta); base = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Select { base, field }, meta, }, Default::default(), ) } TokenValue::Increment | TokenValue::Decrement => { base = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::PrePostfix { op: match value { TokenValue::Increment => crate::BinaryOperator::Add, _ => crate::BinaryOperator::Subtract, }, postfix: true, expr: base, }, meta, }, Default::default(), ) } _ => unreachable!(), } } Ok(base) } pub fn parse_unary( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, ) -> Result> { Ok(match self.expect_peek(parser)?.value { TokenValue::Plus | TokenValue::Dash | TokenValue::Bang | TokenValue::Tilde => { let Token { value, mut meta } = self.bump(parser)?; let expr = self.parse_unary(parser, ctx, stmt, body)?; let end_meta = stmt.hir_exprs[expr].meta; let kind = match value { TokenValue::Dash => HirExprKind::Unary { op: UnaryOperator::Negate, expr, }, TokenValue::Bang | TokenValue::Tilde => HirExprKind::Unary { op: UnaryOperator::Not, expr, }, _ => return Ok(expr), }; meta.subsume(end_meta); stmt.hir_exprs .append(HirExpr { kind, meta }, Default::default()) } TokenValue::Increment | TokenValue::Decrement => { let Token { value, meta } = self.bump(parser)?; let expr = self.parse_unary(parser, ctx, stmt, body)?; stmt.hir_exprs.append( HirExpr { kind: HirExprKind::PrePostfix { op: match value { TokenValue::Increment => crate::BinaryOperator::Add, _ => crate::BinaryOperator::Subtract, }, postfix: false, expr, }, meta, }, Default::default(), ) } _ => self.parse_postfix(parser, ctx, stmt, body)?, }) } pub fn parse_binary( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, passtrough: Option>, min_bp: u8, ) -> Result> { let mut left = passtrough .ok_or(ErrorKind::EndOfFile /* Dummy error */) .or_else(|_| self.parse_unary(parser, ctx, stmt, body))?; let mut meta = stmt.hir_exprs[left].meta; while let Some((l_bp, r_bp)) = binding_power(&self.expect_peek(parser)?.value) { if l_bp < min_bp { break; } let Token { value, .. } = self.bump(parser)?; let right = self.parse_binary(parser, ctx, stmt, body, None, r_bp)?; let end_meta = stmt.hir_exprs[right].meta; meta.subsume(end_meta); left = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Binary { left, op: match value { TokenValue::LogicalOr => BinaryOperator::LogicalOr, TokenValue::LogicalXor => BinaryOperator::NotEqual, TokenValue::LogicalAnd => BinaryOperator::LogicalAnd, TokenValue::VerticalBar => BinaryOperator::InclusiveOr, TokenValue::Caret => BinaryOperator::ExclusiveOr, TokenValue::Ampersand => BinaryOperator::And, TokenValue::Equal => BinaryOperator::Equal, TokenValue::NotEqual => BinaryOperator::NotEqual, TokenValue::GreaterEqual => BinaryOperator::GreaterEqual, TokenValue::LessEqual => BinaryOperator::LessEqual, TokenValue::LeftAngle => BinaryOperator::Less, TokenValue::RightAngle => BinaryOperator::Greater, TokenValue::LeftShift => BinaryOperator::ShiftLeft, TokenValue::RightShift => BinaryOperator::ShiftRight, TokenValue::Plus => BinaryOperator::Add, TokenValue::Dash => BinaryOperator::Subtract, TokenValue::Star => BinaryOperator::Multiply, TokenValue::Slash => BinaryOperator::Divide, TokenValue::Percent => BinaryOperator::Modulo, _ => unreachable!(), }, right, }, meta, }, Default::default(), ) } Ok(left) } pub fn parse_conditional( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, passtrough: Option>, ) -> Result> { let mut condition = self.parse_binary(parser, ctx, stmt, body, passtrough, 0)?; let mut meta = stmt.hir_exprs[condition].meta; if self.bump_if(parser, TokenValue::Question).is_some() { let accept = self.parse_expression(parser, ctx, stmt, body)?; self.expect(parser, TokenValue::Colon)?; let reject = self.parse_assignment(parser, ctx, stmt, body)?; let end_meta = stmt.hir_exprs[reject].meta; meta.subsume(end_meta); condition = stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Conditional { condition, accept, reject, }, meta, }, Default::default(), ) } Ok(condition) } pub fn parse_assignment( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, ) -> Result> { let tgt = self.parse_unary(parser, ctx, stmt, body)?; let mut meta = stmt.hir_exprs[tgt].meta; Ok(match self.expect_peek(parser)?.value { TokenValue::Assign => { self.bump(parser)?; let value = self.parse_assignment(parser, ctx, stmt, body)?; let end_meta = stmt.hir_exprs[value].meta; meta.subsume(end_meta); stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Assign { tgt, value }, meta, }, Default::default(), ) } TokenValue::OrAssign | TokenValue::AndAssign | TokenValue::AddAssign | TokenValue::DivAssign | TokenValue::ModAssign | TokenValue::SubAssign | TokenValue::MulAssign | TokenValue::LeftShiftAssign | TokenValue::RightShiftAssign | TokenValue::XorAssign => { let token = self.bump(parser)?; let right = self.parse_assignment(parser, ctx, stmt, body)?; let end_meta = stmt.hir_exprs[right].meta; meta.subsume(end_meta); let value = stmt.hir_exprs.append( HirExpr { meta, kind: HirExprKind::Binary { left: tgt, op: match token.value { TokenValue::OrAssign => BinaryOperator::InclusiveOr, TokenValue::AndAssign => BinaryOperator::And, TokenValue::AddAssign => BinaryOperator::Add, TokenValue::DivAssign => BinaryOperator::Divide, TokenValue::ModAssign => BinaryOperator::Modulo, TokenValue::SubAssign => BinaryOperator::Subtract, TokenValue::MulAssign => BinaryOperator::Multiply, TokenValue::LeftShiftAssign => BinaryOperator::ShiftLeft, TokenValue::RightShiftAssign => BinaryOperator::ShiftRight, TokenValue::XorAssign => BinaryOperator::ExclusiveOr, _ => unreachable!(), }, right, }, }, Default::default(), ); stmt.hir_exprs.append( HirExpr { kind: HirExprKind::Assign { tgt, value }, meta, }, Default::default(), ) } _ => self.parse_conditional(parser, ctx, stmt, body, Some(tgt))?, }) } pub fn parse_expression( &mut self, parser: &mut Parser, ctx: &mut Context, stmt: &mut StmtContext, body: &mut Block, ) -> Result> { let mut expr = self.parse_assignment(parser, ctx, stmt, body)?; while let TokenValue::Comma = self.expect_peek(parser)?.value { self.bump(parser)?; expr = self.parse_assignment(parser, ctx, stmt, body)?; } Ok(expr) } } const fn binding_power(value: &TokenValue) -> Option<(u8, u8)> { Some(match *value { TokenValue::LogicalOr => (1, 2), TokenValue::LogicalXor => (3, 4), TokenValue::LogicalAnd => (5, 6), TokenValue::VerticalBar => (7, 8), TokenValue::Caret => (9, 10), TokenValue::Ampersand => (11, 12), TokenValue::Equal | TokenValue::NotEqual => (13, 14), TokenValue::GreaterEqual | TokenValue::LessEqual | TokenValue::LeftAngle | TokenValue::RightAngle => (15, 16), TokenValue::LeftShift | TokenValue::RightShift => (17, 18), TokenValue::Plus | TokenValue::Dash => (19, 20), TokenValue::Star | TokenValue::Slash | TokenValue::Percent => (21, 22), _ => return None, }) } ================================================ FILE: lib/naga/src/front/glsl/parser/functions.rs ================================================ use crate::front::glsl::context::ExprPos; use crate::front::glsl::Span; use crate::{ front::glsl::{ ast::ParameterQualifier, context::Context, parser::ParsingContext, token::{Token, TokenValue}, variables::VarDeclaration, Error, ErrorKind, Parser, Result, }, Block, ConstantInner, Expression, ScalarValue, Statement, SwitchCase, UnaryOperator, }; impl<'source> ParsingContext<'source> { pub fn peek_parameter_qualifier(&mut self, parser: &mut Parser) -> bool { self.peek(parser).map_or(false, |t| match t.value { TokenValue::In | TokenValue::Out | TokenValue::InOut | TokenValue::Const => true, _ => false, }) } /// Returns the parsed `ParameterQualifier` or `ParameterQualifier::In` pub fn parse_parameter_qualifier(&mut self, parser: &mut Parser) -> ParameterQualifier { if self.peek_parameter_qualifier(parser) { match self.bump(parser).unwrap().value { TokenValue::In => ParameterQualifier::In, TokenValue::Out => ParameterQualifier::Out, TokenValue::InOut => ParameterQualifier::InOut, TokenValue::Const => ParameterQualifier::Const, _ => unreachable!(), } } else { ParameterQualifier::In } } pub fn parse_statement( &mut self, parser: &mut Parser, ctx: &mut Context, body: &mut Block, terminator: &mut Option, ) -> Result> { // Type qualifiers always identify a declaration statement if self.peek_type_qualifier(parser) { return self.parse_declaration(parser, ctx, body, false); } // Type names can identify either declaration statements or type constructors // depending on wether the token following the type name is a `(` (LeftParen) if self.peek_type_name(parser) { // Start by consuming the type name so that we can peek the token after it let token = self.bump(parser)?; // Peek the next token and check if it's a `(` (LeftParen) if so the statement // is a constructor, otherwise it's a declaration. We need to do the check // beforehand and not in the if since we will backtrack before the if let declaration = TokenValue::LeftParen != self.expect_peek(parser)?.value; self.backtrack(token)?; if declaration { return self.parse_declaration(parser, ctx, body, false); } } let new_break = || { let mut block = Block::new(); block.push(Statement::Break, crate::Span::default()); block }; let &Token { ref value, mut meta, } = self.expect_peek(parser)?; let meta_rest = match *value { TokenValue::Continue => { let meta = self.bump(parser)?.meta; body.push(Statement::Continue, meta); terminator.get_or_insert(body.len()); self.expect(parser, TokenValue::Semicolon)?.meta } TokenValue::Break => { let meta = self.bump(parser)?.meta; body.push(Statement::Break, meta); terminator.get_or_insert(body.len()); self.expect(parser, TokenValue::Semicolon)?.meta } TokenValue::Return => { self.bump(parser)?; let (value, meta) = match self.expect_peek(parser)?.value { TokenValue::Semicolon => (None, self.bump(parser)?.meta), _ => { // TODO: Implicit conversions let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; self.expect(parser, TokenValue::Semicolon)?; let (handle, meta) = ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?; (Some(handle), meta) } }; ctx.emit_restart(body); body.push(Statement::Return { value }, meta); terminator.get_or_insert(body.len()); meta } TokenValue::Discard => { let meta = self.bump(parser)?.meta; body.push(Statement::Kill, meta); terminator.get_or_insert(body.len()); self.expect(parser, TokenValue::Semicolon)?.meta } TokenValue::If => { let mut meta = self.bump(parser)?.meta; self.expect(parser, TokenValue::LeftParen)?; let condition = { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; let (handle, more_meta) = ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?; meta.subsume(more_meta); handle }; self.expect(parser, TokenValue::RightParen)?; ctx.emit_restart(body); let mut accept = Block::new(); if let Some(more_meta) = self.parse_statement(parser, ctx, &mut accept, &mut None)? { meta.subsume(more_meta) } let mut reject = Block::new(); if self.bump_if(parser, TokenValue::Else).is_some() { if let Some(more_meta) = self.parse_statement(parser, ctx, &mut reject, &mut None)? { meta.subsume(more_meta); } } body.push( Statement::If { condition, accept, reject, }, meta, ); meta } TokenValue::Switch => { let mut meta = self.bump(parser)?.meta; let end_meta; self.expect(parser, TokenValue::LeftParen)?; let selector = { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?.0 }; self.expect(parser, TokenValue::RightParen)?; ctx.emit_restart(body); let mut cases = Vec::new(); // Track if any default case is present in the switch statement. let mut default_present = false; self.expect(parser, TokenValue::LeftBrace)?; loop { let value = match self.expect_peek(parser)?.value { TokenValue::Case => { self.bump(parser)?; let value = { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; let (root, meta) = ctx.lower_expect(stmt, parser, expr, ExprPos::Rhs, body)?; let constant = parser.solve_constant(ctx, root, meta)?; match parser.module.constants[constant].inner { ConstantInner::Scalar { value: ScalarValue::Sint(int), .. } => int as i32, ConstantInner::Scalar { value: ScalarValue::Uint(int), .. } => int as i32, _ => { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Case values can only be integers".into(), ), meta, }); 0 } } }; crate::SwitchValue::Integer(value) } TokenValue::Default => { self.bump(parser)?; default_present = true; crate::SwitchValue::Default } TokenValue::RightBrace => { end_meta = self.bump(parser)?.meta; break; } _ => { let Token { value, meta } = self.bump(parser)?; return Err(Error { kind: ErrorKind::InvalidToken( value, vec![ TokenValue::Case.into(), TokenValue::Default.into(), TokenValue::RightBrace.into(), ], ), meta, }); } }; self.expect(parser, TokenValue::Colon)?; let mut body = Block::new(); let mut case_terminator = None; loop { match self.expect_peek(parser)?.value { TokenValue::Case | TokenValue::Default | TokenValue::RightBrace => { break } _ => { self.parse_statement(parser, ctx, &mut body, &mut case_terminator)?; } } } let mut fall_through = true; if let Some(mut idx) = case_terminator { if let Statement::Break = body[idx - 1] { fall_through = false; idx -= 1; } body.cull(idx..) } cases.push(SwitchCase { value, body, fall_through, }) } meta.subsume(end_meta); // NOTE: do not unwrap here since a switch statement isn't required // to have any cases. if let Some(case) = cases.last_mut() { // GLSL requires that the last case not be empty, so we check // that here and produce an error otherwise (fall_trough must // also be checked because `break`s count as statements but // they aren't added to the body) if case.body.is_empty() && case.fall_through { parser.errors.push(Error { kind: ErrorKind::SemanticError( "last case/default label must be followed by statements".into(), ), meta, }) } // GLSL allows the last case to not have any `break` statement, // this would mark it as fall trough but naga's IR requires that // the last case must not be fall trough, so we mark need to mark // the last case as not fall trough always. case.fall_through = false; } // Add an empty default case in case non was present, this is needed because // naga's IR requires that all switch statements must have a default case but // GLSL doesn't require that, so we might need to add an empty default case. if !default_present { cases.push(SwitchCase { value: crate::SwitchValue::Default, body: Block::new(), fall_through: false, }) } body.push(Statement::Switch { selector, cases }, meta); meta } TokenValue::While => { let mut meta = self.bump(parser)?.meta; let mut loop_body = Block::new(); let mut stmt = ctx.stmt_ctx(); self.expect(parser, TokenValue::LeftParen)?; let root = self.parse_expression(parser, ctx, &mut stmt, &mut loop_body)?; meta.subsume(self.expect(parser, TokenValue::RightParen)?.meta); let (expr, expr_meta) = ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut loop_body)?; let condition = ctx.add_expression( Expression::Unary { op: UnaryOperator::Not, expr, }, expr_meta, &mut loop_body, ); ctx.emit_restart(&mut loop_body); loop_body.push( Statement::If { condition, accept: new_break(), reject: Block::new(), }, crate::Span::default(), ); meta.subsume(expr_meta); if let Some(body_meta) = self.parse_statement(parser, ctx, &mut loop_body, &mut None)? { meta.subsume(body_meta); } body.push( Statement::Loop { body: loop_body, continuing: Block::new(), break_if: None, }, meta, ); meta } TokenValue::Do => { let mut meta = self.bump(parser)?.meta; let mut loop_body = Block::new(); let mut terminator = None; self.parse_statement(parser, ctx, &mut loop_body, &mut terminator)?; let mut stmt = ctx.stmt_ctx(); self.expect(parser, TokenValue::While)?; self.expect(parser, TokenValue::LeftParen)?; let root = self.parse_expression(parser, ctx, &mut stmt, &mut loop_body)?; let end_meta = self.expect(parser, TokenValue::RightParen)?.meta; meta.subsume(end_meta); let (expr, expr_meta) = ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut loop_body)?; let condition = ctx.add_expression( Expression::Unary { op: UnaryOperator::Not, expr, }, expr_meta, &mut loop_body, ); ctx.emit_restart(&mut loop_body); loop_body.push( Statement::If { condition, accept: new_break(), reject: Block::new(), }, crate::Span::default(), ); if let Some(idx) = terminator { loop_body.cull(idx..) } body.push( Statement::Loop { body: loop_body, continuing: Block::new(), break_if: None, }, meta, ); meta } TokenValue::For => { let mut meta = self.bump(parser)?.meta; ctx.symbol_table.push_scope(); self.expect(parser, TokenValue::LeftParen)?; if self.bump_if(parser, TokenValue::Semicolon).is_none() { if self.peek_type_name(parser) || self.peek_type_qualifier(parser) { self.parse_declaration(parser, ctx, body, false)?; } else { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; ctx.lower(stmt, parser, expr, ExprPos::Rhs, body)?; self.expect(parser, TokenValue::Semicolon)?; } } let (mut block, mut continuing) = (Block::new(), Block::new()); if self.bump_if(parser, TokenValue::Semicolon).is_none() { let (expr, expr_meta) = if self.peek_type_name(parser) || self.peek_type_qualifier(parser) { let mut qualifiers = self.parse_type_qualifiers(parser)?; let (ty, mut meta) = self.parse_type_non_void(parser)?; let name = self.expect_ident(parser)?.0; self.expect(parser, TokenValue::Assign)?; let (value, end_meta) = self.parse_initializer(parser, ty, ctx, &mut block)?; meta.subsume(end_meta); let decl = VarDeclaration { qualifiers: &mut qualifiers, ty, name: Some(name), init: None, meta, }; let pointer = parser.add_local_var(ctx, &mut block, decl)?; ctx.emit_restart(&mut block); block.push(Statement::Store { pointer, value }, meta); (value, end_meta) } else { let mut stmt = ctx.stmt_ctx(); let root = self.parse_expression(parser, ctx, &mut stmt, &mut block)?; ctx.lower_expect(stmt, parser, root, ExprPos::Rhs, &mut block)? }; let condition = ctx.add_expression( Expression::Unary { op: UnaryOperator::Not, expr, }, expr_meta, &mut block, ); ctx.emit_restart(&mut block); block.push( Statement::If { condition, accept: new_break(), reject: Block::new(), }, crate::Span::default(), ); self.expect(parser, TokenValue::Semicolon)?; } match self.expect_peek(parser)?.value { TokenValue::RightParen => {} _ => { let mut stmt = ctx.stmt_ctx(); let rest = self.parse_expression(parser, ctx, &mut stmt, &mut continuing)?; ctx.lower(stmt, parser, rest, ExprPos::Rhs, &mut continuing)?; } } meta.subsume(self.expect(parser, TokenValue::RightParen)?.meta); if let Some(stmt_meta) = self.parse_statement(parser, ctx, &mut block, &mut None)? { meta.subsume(stmt_meta); } body.push( Statement::Loop { body: block, continuing, break_if: None, }, meta, ); ctx.symbol_table.pop_scope(); meta } TokenValue::LeftBrace => { let meta = self.bump(parser)?.meta; let mut block = Block::new(); let mut block_terminator = None; let meta = self.parse_compound_statement( meta, parser, ctx, &mut block, &mut block_terminator, )?; body.push(Statement::Block(block), meta); if block_terminator.is_some() { terminator.get_or_insert(body.len()); } meta } TokenValue::Semicolon => self.bump(parser)?.meta, _ => { // Attempt to force expression parsing for remainder of the // tokens. Unknown or invalid tokens will be caught there and // turned into an error. let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(parser, ctx, &mut stmt, body)?; ctx.lower(stmt, parser, expr, ExprPos::Rhs, body)?; self.expect(parser, TokenValue::Semicolon)?.meta } }; meta.subsume(meta_rest); Ok(Some(meta)) } pub fn parse_compound_statement( &mut self, mut meta: Span, parser: &mut Parser, ctx: &mut Context, body: &mut Block, terminator: &mut Option, ) -> Result { ctx.symbol_table.push_scope(); loop { if let Some(Token { meta: brace_meta, .. }) = self.bump_if(parser, TokenValue::RightBrace) { meta.subsume(brace_meta); break; } let stmt = self.parse_statement(parser, ctx, body, terminator)?; if let Some(stmt_meta) = stmt { meta.subsume(stmt_meta); } } if let Some(idx) = *terminator { body.cull(idx..) } ctx.symbol_table.pop_scope(); Ok(meta) } pub fn parse_function_args( &mut self, parser: &mut Parser, context: &mut Context, body: &mut Block, ) -> Result<()> { if self.bump_if(parser, TokenValue::Void).is_some() { return Ok(()); } loop { if self.peek_type_name(parser) || self.peek_parameter_qualifier(parser) { let qualifier = self.parse_parameter_qualifier(parser); let mut ty = self.parse_type_non_void(parser)?.0; match self.expect_peek(parser)?.value { TokenValue::Comma => { self.bump(parser)?; context.add_function_arg(parser, body, None, ty, qualifier); continue; } TokenValue::Identifier(_) => { let mut name = self.expect_ident(parser)?; self.parse_array_specifier(parser, &mut name.1, &mut ty)?; context.add_function_arg(parser, body, Some(name), ty, qualifier); if self.bump_if(parser, TokenValue::Comma).is_some() { continue; } break; } _ => break, } } break; } Ok(()) } } ================================================ FILE: lib/naga/src/front/glsl/parser/types.rs ================================================ use crate::{ front::glsl::{ ast::{QualifierKey, QualifierValue, StorageQualifier, StructLayout, TypeQualifiers}, error::ExpectedToken, parser::ParsingContext, token::{Token, TokenValue}, Error, ErrorKind, Parser, Result, }, AddressSpace, ArraySize, Handle, Span, Type, TypeInner, }; impl<'source> ParsingContext<'source> { /// Parses an optional array_specifier returning wether or not it's present /// and modifying the type handle if it exists pub fn parse_array_specifier( &mut self, parser: &mut Parser, span: &mut Span, ty: &mut Handle, ) -> Result<()> { while self.parse_array_specifier_single(parser, span, ty)? {} Ok(()) } /// Implementation of [`Self::parse_array_specifier`] for a single array_specifier fn parse_array_specifier_single( &mut self, parser: &mut Parser, span: &mut Span, ty: &mut Handle, ) -> Result { if self.bump_if(parser, TokenValue::LeftBracket).is_some() { let size = if let Some(Token { meta, .. }) = self.bump_if(parser, TokenValue::RightBracket) { span.subsume(meta); ArraySize::Dynamic } else { let (value, constant_span) = self.parse_uint_constant(parser)?; let constant = parser.module.constants.fetch_or_append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { width: 4, value: crate::ScalarValue::Uint(value as u64), }, }, constant_span, ); let end_span = self.expect(parser, TokenValue::RightBracket)?.meta; span.subsume(end_span); ArraySize::Constant(constant) }; parser .layouter .update(&parser.module.types, &parser.module.constants) .unwrap(); let stride = parser.layouter[*ty].to_stride(); *ty = parser.module.types.insert( Type { name: None, inner: TypeInner::Array { base: *ty, size, stride, }, }, *span, ); Ok(true) } else { Ok(false) } } pub fn parse_type(&mut self, parser: &mut Parser) -> Result<(Option>, Span)> { let token = self.bump(parser)?; let mut handle = match token.value { TokenValue::Void => return Ok((None, token.meta)), TokenValue::TypeName(ty) => parser.module.types.insert(ty, token.meta), TokenValue::Struct => { let mut meta = token.meta; let ty_name = self.expect_ident(parser)?.0; self.expect(parser, TokenValue::LeftBrace)?; let mut members = Vec::new(); let span = self.parse_struct_declaration_list(parser, &mut members, StructLayout::Std140)?; let end_meta = self.expect(parser, TokenValue::RightBrace)?.meta; meta.subsume(end_meta); let ty = parser.module.types.insert( Type { name: Some(ty_name.clone()), inner: TypeInner::Struct { members, span }, }, meta, ); parser.lookup_type.insert(ty_name, ty); ty } TokenValue::Identifier(ident) => match parser.lookup_type.get(&ident) { Some(ty) => *ty, None => { return Err(Error { kind: ErrorKind::UnknownType(ident), meta: token.meta, }) } }, _ => { return Err(Error { kind: ErrorKind::InvalidToken( token.value, vec![ TokenValue::Void.into(), TokenValue::Struct.into(), ExpectedToken::TypeName, ], ), meta: token.meta, }); } }; let mut span = token.meta; self.parse_array_specifier(parser, &mut span, &mut handle)?; Ok((Some(handle), span)) } pub fn parse_type_non_void(&mut self, parser: &mut Parser) -> Result<(Handle, Span)> { let (maybe_ty, meta) = self.parse_type(parser)?; let ty = maybe_ty.ok_or_else(|| Error { kind: ErrorKind::SemanticError("Type can't be void".into()), meta, })?; Ok((ty, meta)) } pub fn peek_type_qualifier(&mut self, parser: &mut Parser) -> bool { self.peek(parser).map_or(false, |t| match t.value { TokenValue::Invariant | TokenValue::Interpolation(_) | TokenValue::Sampling(_) | TokenValue::PrecisionQualifier(_) | TokenValue::Const | TokenValue::In | TokenValue::Out | TokenValue::Uniform | TokenValue::Shared | TokenValue::Buffer | TokenValue::Restrict | TokenValue::MemoryQualifier(_) | TokenValue::Layout => true, _ => false, }) } pub fn parse_type_qualifiers<'a>(&mut self, parser: &mut Parser) -> Result> { let mut qualifiers = TypeQualifiers::default(); while self.peek_type_qualifier(parser) { let token = self.bump(parser)?; // Handle layout qualifiers outside the match since this can push multiple values if token.value == TokenValue::Layout { self.parse_layout_qualifier_id_list(parser, &mut qualifiers)?; continue; } qualifiers.span.subsume(token.meta); match token.value { TokenValue::Invariant => { if qualifiers.invariant.is_some() { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Cannot use more than one invariant qualifier per declaration" .into(), ), meta: token.meta, }) } qualifiers.invariant = Some(token.meta); } TokenValue::Interpolation(i) => { if qualifiers.interpolation.is_some() { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Cannot use more than one interpolation qualifier per declaration" .into(), ), meta: token.meta, }) } qualifiers.interpolation = Some((i, token.meta)); } TokenValue::Const | TokenValue::In | TokenValue::Out | TokenValue::Uniform | TokenValue::Shared | TokenValue::Buffer => { let storage = match token.value { TokenValue::Const => StorageQualifier::Const, TokenValue::In => StorageQualifier::Input, TokenValue::Out => StorageQualifier::Output, TokenValue::Uniform => { StorageQualifier::AddressSpace(AddressSpace::Uniform) } TokenValue::Shared => { StorageQualifier::AddressSpace(AddressSpace::WorkGroup) } TokenValue::Buffer => { StorageQualifier::AddressSpace(AddressSpace::Storage { access: crate::StorageAccess::all(), }) } _ => unreachable!(), }; if StorageQualifier::AddressSpace(AddressSpace::Function) != qualifiers.storage.0 { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Cannot use more than one storage qualifier per declaration".into(), ), meta: token.meta, }); } qualifiers.storage = (storage, token.meta); } TokenValue::Sampling(s) => { if qualifiers.sampling.is_some() { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Cannot use more than one sampling qualifier per declaration" .into(), ), meta: token.meta, }) } qualifiers.sampling = Some((s, token.meta)); } TokenValue::PrecisionQualifier(p) => { if qualifiers.precision.is_some() { parser.errors.push(Error { kind: ErrorKind::SemanticError( "Cannot use more than one precision qualifier per declaration" .into(), ), meta: token.meta, }) } qualifiers.precision = Some((p, token.meta)); } TokenValue::MemoryQualifier(access) => { let storage_access = qualifiers .storage_access .get_or_insert((crate::StorageAccess::all(), Span::default())); if !storage_access.0.contains(!access) { parser.errors.push(Error { kind: ErrorKind::SemanticError( "The same memory qualifier can only be used once".into(), ), meta: token.meta, }) } storage_access.0 &= access; storage_access.1.subsume(token.meta); } TokenValue::Restrict => continue, _ => unreachable!(), }; } Ok(qualifiers) } pub fn parse_layout_qualifier_id_list( &mut self, parser: &mut Parser, qualifiers: &mut TypeQualifiers, ) -> Result<()> { self.expect(parser, TokenValue::LeftParen)?; loop { self.parse_layout_qualifier_id(parser, &mut qualifiers.layout_qualifiers)?; if self.bump_if(parser, TokenValue::Comma).is_some() { continue; } break; } let token = self.expect(parser, TokenValue::RightParen)?; qualifiers.span.subsume(token.meta); Ok(()) } pub fn parse_layout_qualifier_id( &mut self, parser: &mut Parser, qualifiers: &mut crate::FastHashMap, ) -> Result<()> { // layout_qualifier_id: // IDENTIFIER // IDENTIFIER EQUAL constant_expression // SHARED let mut token = self.bump(parser)?; match token.value { TokenValue::Identifier(name) => { let (key, value) = match name.as_str() { "std140" => ( QualifierKey::Layout, QualifierValue::Layout(StructLayout::Std140), ), "std430" => ( QualifierKey::Layout, QualifierValue::Layout(StructLayout::Std430), ), word => { if let Some(format) = map_image_format(word) { (QualifierKey::Format, QualifierValue::Format(format)) } else { let key = QualifierKey::String(name.into()); let value = if self.bump_if(parser, TokenValue::Assign).is_some() { let (value, end_meta) = match self.parse_uint_constant(parser) { Ok(v) => v, Err(e) => { parser.errors.push(e); (0, Span::default()) } }; token.meta.subsume(end_meta); QualifierValue::Uint(value) } else { QualifierValue::None }; (key, value) } } }; qualifiers.insert(key, (value, token.meta)); } _ => parser.errors.push(Error { kind: ErrorKind::InvalidToken(token.value, vec![ExpectedToken::Identifier]), meta: token.meta, }), } Ok(()) } pub fn peek_type_name(&mut self, parser: &mut Parser) -> bool { self.peek(parser).map_or(false, |t| match t.value { TokenValue::TypeName(_) | TokenValue::Void => true, TokenValue::Struct => true, TokenValue::Identifier(ref ident) => parser.lookup_type.contains_key(ident), _ => false, }) } } fn map_image_format(word: &str) -> Option { use crate::StorageFormat as Sf; let format = match word { // float-image-format-qualifier: "rgba32f" => Sf::Rgba32Float, "rgba16f" => Sf::Rgba16Float, "rg32f" => Sf::Rg32Float, "rg16f" => Sf::Rg16Float, "r11f_g11f_b10f" => Sf::Rg11b10Float, "r32f" => Sf::R32Float, "r16f" => Sf::R16Float, "rgba16" => Sf::Rgba16Float, "rgb10_a2" => Sf::Rgb10a2Unorm, "rgba8" => Sf::Rgba8Unorm, "rg16" => Sf::Rg16Float, "rg8" => Sf::Rg8Unorm, "r16" => Sf::R16Float, "r8" => Sf::R8Unorm, "rgba8_snorm" => Sf::Rgba8Snorm, "rg8_snorm" => Sf::Rg8Snorm, "r8_snorm" => Sf::R8Snorm, // int-image-format-qualifier: "rgba32i" => Sf::Rgba32Sint, "rgba16i" => Sf::Rgba16Sint, "rgba8i" => Sf::Rgba8Sint, "rg32i" => Sf::Rg32Sint, "rg16i" => Sf::Rg16Sint, "rg8i" => Sf::Rg8Sint, "r32i" => Sf::R32Sint, "r16i" => Sf::R16Sint, "r8i" => Sf::R8Sint, // uint-image-format-qualifier: "rgba32ui" => Sf::Rgba32Uint, "rgba16ui" => Sf::Rgba16Uint, "rgba8ui" => Sf::Rgba8Uint, "rg32ui" => Sf::Rg32Uint, "rg16ui" => Sf::Rg16Uint, "rg8ui" => Sf::Rg8Uint, "r32ui" => Sf::R32Uint, "r16ui" => Sf::R16Uint, "r8ui" => Sf::R8Uint, // TODO: These next ones seem incorrect to me // "rgba16_snorm" => Sf::Rgba16Float, // "rg16_snorm" => Sf::Rg16Float, // "r16_snorm" => Sf::R16Float, // "rgb10_a2ui" => Sf::Rgb10a2Unorm, _ => return None, }; Some(format) } ================================================ FILE: lib/naga/src/front/glsl/parser.rs ================================================ use super::{ ast::{FunctionKind, Profile, TypeQualifiers}, context::{Context, ExprPos}, error::ExpectedToken, error::{Error, ErrorKind}, lex::{Lexer, LexerResultKind}, token::{Directive, DirectiveKind}, token::{Token, TokenValue}, variables::{GlobalOrConstant, VarDeclaration}, Parser, Result, }; use crate::{arena::Handle, Block, Constant, ConstantInner, Expression, ScalarValue, Span, Type}; use core::convert::TryFrom; use pp_rs::token::{PreprocessorError, Token as PPToken, TokenValue as PPTokenValue}; use std::iter::Peekable; mod declarations; mod expressions; mod functions; mod types; pub struct ParsingContext<'source> { lexer: Peekable>, /// Used to store tokens already consumed by the parser but that need to be backtracked backtracked_token: Option, last_meta: Span, } impl<'source> ParsingContext<'source> { pub fn new(lexer: Lexer<'source>) -> Self { ParsingContext { lexer: lexer.peekable(), backtracked_token: None, last_meta: Span::default(), } } /// Helper method for backtracking from a consumed token /// /// This method should always be used instead of assigning to `backtracked_token` since /// it validates that backtracking hasn't occurred more than one time in a row /// /// # Panics /// - If the parser already backtracked without bumping in between pub fn backtrack(&mut self, token: Token) -> Result<()> { // This should never happen if let Some(ref prev_token) = self.backtracked_token { return Err(Error { kind: ErrorKind::InternalError("The parser tried to backtrack twice in a row"), meta: prev_token.meta, }); } self.backtracked_token = Some(token); Ok(()) } pub fn expect_ident(&mut self, parser: &mut Parser) -> Result<(String, Span)> { let token = self.bump(parser)?; match token.value { TokenValue::Identifier(name) => Ok((name, token.meta)), _ => Err(Error { kind: ErrorKind::InvalidToken(token.value, vec![ExpectedToken::Identifier]), meta: token.meta, }), } } pub fn expect(&mut self, parser: &mut Parser, value: TokenValue) -> Result { let token = self.bump(parser)?; if token.value != value { Err(Error { kind: ErrorKind::InvalidToken(token.value, vec![value.into()]), meta: token.meta, }) } else { Ok(token) } } pub fn next(&mut self, parser: &mut Parser) -> Option { loop { if let Some(token) = self.backtracked_token.take() { self.last_meta = token.meta; break Some(token); } let res = self.lexer.next()?; match res.kind { LexerResultKind::Token(token) => { self.last_meta = token.meta; break Some(token); } LexerResultKind::Directive(directive) => { parser.handle_directive(directive, res.meta) } LexerResultKind::Error(error) => parser.errors.push(Error { kind: ErrorKind::PreprocessorError(error), meta: res.meta, }), } } } pub fn bump(&mut self, parser: &mut Parser) -> Result { self.next(parser).ok_or(Error { kind: ErrorKind::EndOfFile, meta: self.last_meta, }) } /// Returns None on the end of the file rather than an error like other methods pub fn bump_if(&mut self, parser: &mut Parser, value: TokenValue) -> Option { if self.peek(parser).filter(|t| t.value == value).is_some() { self.bump(parser).ok() } else { None } } pub fn peek(&mut self, parser: &mut Parser) -> Option<&Token> { loop { if let Some(ref token) = self.backtracked_token { break Some(token); } match self.lexer.peek()?.kind { LexerResultKind::Token(_) => { let res = self.lexer.peek()?; match res.kind { LexerResultKind::Token(ref token) => break Some(token), _ => unreachable!(), } } LexerResultKind::Error(_) | LexerResultKind::Directive(_) => { let res = self.lexer.next()?; match res.kind { LexerResultKind::Directive(directive) => { parser.handle_directive(directive, res.meta) } LexerResultKind::Error(error) => parser.errors.push(Error { kind: ErrorKind::PreprocessorError(error), meta: res.meta, }), _ => unreachable!(), } } } } } pub fn expect_peek(&mut self, parser: &mut Parser) -> Result<&Token> { let meta = self.last_meta; self.peek(parser).ok_or(Error { kind: ErrorKind::EndOfFile, meta, }) } pub fn parse(&mut self, parser: &mut Parser) -> Result<()> { // Body and expression arena for global initialization let mut body = Block::new(); let mut ctx = Context::new(parser, &mut body); while self.peek(parser).is_some() { self.parse_external_declaration(parser, &mut ctx, &mut body)?; } // Add an `EntryPoint` to `parser.module` for `main`, if a // suitable overload exists. Error out if we can't find one. if let Some(declaration) = parser.lookup_function.get("main") { for decl in declaration.overloads.iter() { if let FunctionKind::Call(handle) = decl.kind { if decl.defined && decl.parameters.is_empty() { parser.add_entry_point(handle, body, ctx.expressions); return Ok(()); } } } } Err(Error { kind: ErrorKind::SemanticError("Missing entry point".into()), meta: Span::default(), }) } fn parse_uint_constant(&mut self, parser: &mut Parser) -> Result<(u32, Span)> { let (value, meta) = self.parse_constant_expression(parser)?; let int = match parser.module.constants[value].inner { ConstantInner::Scalar { value: ScalarValue::Uint(int), .. } => u32::try_from(int).map_err(|_| Error { kind: ErrorKind::SemanticError("int constant overflows".into()), meta, })?, ConstantInner::Scalar { value: ScalarValue::Sint(int), .. } => u32::try_from(int).map_err(|_| Error { kind: ErrorKind::SemanticError("int constant overflows".into()), meta, })?, _ => { return Err(Error { kind: ErrorKind::SemanticError("Expected a uint constant".into()), meta, }) } }; Ok((int, meta)) } fn parse_constant_expression( &mut self, parser: &mut Parser, ) -> Result<(Handle, Span)> { let mut block = Block::new(); let mut ctx = Context::new(parser, &mut block); let mut stmt_ctx = ctx.stmt_ctx(); let expr = self.parse_conditional(parser, &mut ctx, &mut stmt_ctx, &mut block, None)?; let (root, meta) = ctx.lower_expect(stmt_ctx, parser, expr, ExprPos::Rhs, &mut block)?; Ok((parser.solve_constant(&ctx, root, meta)?, meta)) } } impl Parser { fn handle_directive(&mut self, directive: Directive, meta: Span) { let mut tokens = directive.tokens.into_iter(); match directive.kind { DirectiveKind::Version { is_first_directive } => { if !is_first_directive { self.errors.push(Error { kind: ErrorKind::SemanticError( "#version must occur first in shader".into(), ), meta, }) } match tokens.next() { Some(PPToken { value: PPTokenValue::Integer(int), location, }) => match int.value { 440 | 450 | 460 => self.meta.version = int.value as u16, _ => self.errors.push(Error { kind: ErrorKind::InvalidVersion(int.value), meta: location.into(), }), }, Some(PPToken { value, location }) => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }), None => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine), meta, }), }; match tokens.next() { Some(PPToken { value: PPTokenValue::Ident(name), location, }) => match name.as_str() { "core" => self.meta.profile = Profile::Core, _ => self.errors.push(Error { kind: ErrorKind::InvalidProfile(name), meta: location.into(), }), }, Some(PPToken { value, location }) => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }), None => {} }; if let Some(PPToken { value, location }) = tokens.next() { self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }) } } DirectiveKind::Extension => { // TODO: Proper extension handling // - Checking for extension support in the compiler // - Handle behaviors such as warn // - Handle the all extension let name = match tokens.next() { Some(PPToken { value: PPTokenValue::Ident(name), .. }) => Some(name), Some(PPToken { value, location }) => { self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }); None } None => { self.errors.push(Error { kind: ErrorKind::PreprocessorError( PreprocessorError::UnexpectedNewLine, ), meta, }); None } }; match tokens.next() { Some(PPToken { value: PPTokenValue::Punct(pp_rs::token::Punct::Colon), .. }) => {} Some(PPToken { value, location }) => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }), None => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine), meta, }), }; match tokens.next() { Some(PPToken { value: PPTokenValue::Ident(behavior), location, }) => match behavior.as_str() { "require" | "enable" | "warn" | "disable" => { if let Some(name) = name { self.meta.extensions.insert(name); } } _ => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( PPTokenValue::Ident(behavior), )), meta: location.into(), }), }, Some(PPToken { value, location }) => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }), None => self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedNewLine), meta, }), } if let Some(PPToken { value, location }) = tokens.next() { self.errors.push(Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedToken( value, )), meta: location.into(), }) } } DirectiveKind::Pragma => { // TODO: handle some common pragmas? } } } } pub struct DeclarationContext<'ctx, 'qualifiers> { qualifiers: TypeQualifiers<'qualifiers>, /// Indicates a global declaration external: bool, ctx: &'ctx mut Context, body: &'ctx mut Block, } impl<'ctx, 'qualifiers> DeclarationContext<'ctx, 'qualifiers> { fn add_var( &mut self, parser: &mut Parser, ty: Handle, name: String, init: Option>, meta: Span, ) -> Result> { let decl = VarDeclaration { qualifiers: &mut self.qualifiers, ty, name: Some(name), init, meta, }; match self.external { true => { let global = parser.add_global_var(self.ctx, self.body, decl)?; let expr = match global { GlobalOrConstant::Global(handle) => Expression::GlobalVariable(handle), GlobalOrConstant::Constant(handle) => Expression::Constant(handle), }; Ok(self.ctx.add_expression(expr, meta, self.body)) } false => parser.add_local_var(self.ctx, self.body, decl), } } /// Emits all the expressions captured by the emitter and starts the emitter again /// /// Alias to [`emit_restart`] with the declaration body /// /// [`emit_restart`]: Context::emit_restart #[inline] fn flush_expressions(&mut self) { self.ctx.emit_restart(self.body); } } ================================================ FILE: lib/naga/src/front/glsl/parser_tests.rs ================================================ use super::{ ast::Profile, error::ExpectedToken, error::{Error, ErrorKind}, token::TokenValue, Options, Parser, Span, }; use crate::ShaderStage; use pp_rs::token::PreprocessorError; #[test] fn version() { let mut parser = Parser::default(); // invalid versions assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), "#version 99000\n void main(){}", ) .err() .unwrap(), vec![Error { kind: ErrorKind::InvalidVersion(99000), meta: Span::new(9, 14) }], ); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), "#version 449\n void main(){}", ) .err() .unwrap(), vec![Error { kind: ErrorKind::InvalidVersion(449), meta: Span::new(9, 12) }] ); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), "#version 450 smart\n void main(){}", ) .err() .unwrap(), vec![Error { kind: ErrorKind::InvalidProfile("smart".into()), meta: Span::new(13, 18), }] ); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), "#version 450\nvoid main(){} #version 450", ) .err() .unwrap(), vec![ Error { kind: ErrorKind::PreprocessorError(PreprocessorError::UnexpectedHash,), meta: Span::new(27, 28), }, Error { kind: ErrorKind::InvalidToken( TokenValue::Identifier("version".into()), vec![ExpectedToken::Eof] ), meta: Span::new(28, 35) } ] ); // valid versions parser .parse( &Options::from(ShaderStage::Vertex), " # version 450\nvoid main() {}", ) .unwrap(); assert_eq!( (parser.metadata().version, parser.metadata().profile), (450, Profile::Core) ); parser .parse( &Options::from(ShaderStage::Vertex), "#version 450\nvoid main() {}", ) .unwrap(); assert_eq!( (parser.metadata().version, parser.metadata().profile), (450, Profile::Core) ); parser .parse( &Options::from(ShaderStage::Vertex), "#version 450 core\nvoid main(void) {}", ) .unwrap(); assert_eq!( (parser.metadata().version, parser.metadata().profile), (450, Profile::Core) ); } #[test] fn control_flow() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { if (true) { return 1; } else { return 2; } } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { if (true) { return 1; } } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { int x; int y = 3; switch (5) { case 2: x = 2; case 5: x = 5; y = 2; break; default: x = 0; } } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { int x = 0; while(x < 5) { x = x + 1; } do { x = x - 1; } while(x >= 4) } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { int x = 0; for(int i = 0; i < 10;) { x = x + 2; } for(;;); return x; } "#, ) .unwrap(); } #[test] fn declarations() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(location = 0) in vec2 v_uv; layout(location = 0) out vec4 o_color; layout(set = 1, binding = 1) uniform texture2D tex; layout(set = 1, binding = 2) uniform sampler tex_sampler; layout(early_fragment_tests) in; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(std140, set = 2, binding = 0) uniform u_locals { vec3 model_offs; float load_time; ivec4 atlas_offs; }; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(push_constant) uniform u_locals { vec3 model_offs; float load_time; ivec4 atlas_offs; }; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(std430, set = 2, binding = 0) uniform u_locals { vec3 model_offs; float load_time; ivec4 atlas_offs; }; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(std140, set = 2, binding = 0) uniform u_locals { vec3 model_offs; float load_time; } block_var; void main() { load_time * model_offs; block_var.load_time * block_var.model_offs; } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 float vector = vec4(1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0); void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 precision highp float; void main() {} "#, ) .unwrap(); } #[test] fn textures() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" #version 450 layout(location = 0) in vec2 v_uv; layout(location = 0) out vec4 o_color; layout(set = 1, binding = 1) uniform texture2D tex; layout(set = 1, binding = 2) uniform sampler tex_sampler; void main() { o_color = texture(sampler2D(tex, tex_sampler), v_uv); o_color.a = texture(sampler2D(tex, tex_sampler), v_uv, 2.0).a; } "#, ) .unwrap(); } #[test] fn functions() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void test1(float); void test1(float) {} void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void test2(float a) {} void test3(float a, float b) {} void test4(float, float) {} void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float test(float a) { return a; } void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float test(vec4 p) { return p.x; } void main() {} "#, ) .unwrap(); // Function overloading parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float test(vec2 p); float test(vec3 p); float test(vec4 p); float test(vec2 p) { return p.x; } float test(vec3 p) { return p.x; } float test(vec4 p) { return p.x; } void main() {} "#, ) .unwrap(); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 int test(vec4 p) { return p.x; } float test(vec4 p) { return p.x; } void main() {} "#, ) .err() .unwrap(), vec![Error { kind: ErrorKind::SemanticError("Function already defined".into()), meta: Span::new(134, 152), }] ); println!(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float callee(uint q) { return float(q); } float caller() { callee(1u); } void main() {} "#, ) .unwrap(); // Nested function call parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 layout(set = 0, binding = 1) uniform texture2D t_noise; layout(set = 0, binding = 2) uniform sampler s_noise; void main() { textureLod(sampler2D(t_noise, s_noise), vec2(1.0), 0); } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void fun(vec2 in_parameter, out float out_parameter) { ivec2 _ = ivec2(in_parameter); } void main() { float a; fun(vec2(1.0), a); } "#, ) .unwrap(); } #[test] fn constants() { use crate::{Constant, ConstantInner, ScalarValue}; let mut parser = Parser::default(); let module = parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 const float a = 1.0; float global = a; const float b = a; void main() {} "#, ) .unwrap(); let mut constants = module.constants.iter(); assert_eq!( constants.next().unwrap().1, &Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Float(1.0) } } ); assert!(constants.next().is_none()); } #[test] fn function_overloading() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float saturate(float v) { return clamp(v, 0.0, 1.0); } vec2 saturate(vec2 v) { return clamp(v, vec2(0.0), vec2(1.0)); } vec3 saturate(vec3 v) { return clamp(v, vec3(0.0), vec3(1.0)); } vec4 saturate(vec4 v) { return clamp(v, vec4(0.0), vec4(1.0)); } void main() { float v1 = saturate(1.5); vec2 v2 = saturate(vec2(0.5, 1.5)); vec3 v3 = saturate(vec3(0.5, 1.5, 2.5)); vec3 v4 = saturate(vec4(0.5, 1.5, 2.5, 3.5)); } "#, ) .unwrap(); } #[test] fn implicit_conversions() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { mat4 a = mat4(1); float b = 1u; float c = 1 + 2.0; } "#, ) .unwrap(); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void test(int a) {} void test(uint a) {} void main() { test(1.0); } "#, ) .err() .unwrap(), vec![Error { kind: ErrorKind::SemanticError("Unknown function \'test\'".into()), meta: Span::new(156, 165), }] ); assert_eq!( parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void test(float a) {} void test(uint a) {} void main() { test(1); } "#, ) .err() .unwrap(), vec![Error { kind: ErrorKind::SemanticError("Ambiguous best function for \'test\'".into()), meta: Span::new(158, 165), }] ); } #[test] fn structs() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 Test { vec4 pos; } xx; void main() {} "#, ) .unwrap_err(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 struct Test { vec4 pos; }; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 const int NUM_VECS = 42; struct Test { vec4 vecs[NUM_VECS]; }; void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 struct Hello { vec4 test; } test() { return Hello( vec4(1.0) ); } void main() {} "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 struct Test {}; void main() {} "#, ) .unwrap_err(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 inout struct Test { vec4 x; }; void main() {} "#, ) .unwrap_err(); } #[test] fn swizzles() { let mut parser = Parser::default(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { vec4 v = vec4(1); v.xyz = vec3(2); v.x = 5.0; v.xyz.zxy.yx.xy = vec2(5.0, 1.0); } "#, ) .unwrap(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { vec4 v = vec4(1); v.xx = vec2(5.0); } "#, ) .unwrap_err(); parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { vec3 v = vec3(1); v.w = 2.0; } "#, ) .unwrap_err(); } #[test] fn expressions() { let mut parser = Parser::default(); // Vector indexing parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 float test(int index) { vec4 v = vec4(1.0, 2.0, 3.0, 4.0); return v[index] + 1.0; } void main() {} "#, ) .unwrap(); // Prefix increment/decrement parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { uint index = 0; --index; ++index; } "#, ) .unwrap(); // Dynamic indexing of array parser .parse( &Options::from(ShaderStage::Vertex), r#" # version 450 void main() { const vec4 positions[1] = { vec4(0) }; gl_Position = positions[gl_VertexIndex]; } "#, ) .unwrap(); } ================================================ FILE: lib/naga/src/front/glsl/token.rs ================================================ pub use pp_rs::token::{Float, Integer, Location, PreprocessorError, Token as PPToken}; use super::ast::Precision; use crate::{Interpolation, Sampling, Span, Type}; impl From for Span { fn from(loc: Location) -> Self { Span::new(loc.start, loc.end) } } #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub struct Token { pub value: TokenValue, pub meta: Span, } /// A token passed from the lexing used in the parsing. /// /// This type is exported since it's returned in the /// [`InvalidToken`](super::ErrorKind::InvalidToken) error. #[derive(Debug, PartialEq)] pub enum TokenValue { Identifier(String), FloatConstant(Float), IntConstant(Integer), BoolConstant(bool), Layout, In, Out, InOut, Uniform, Buffer, Const, Shared, Restrict, /// A `glsl` memory qualifier such as `writeonly` /// /// The associated [`crate::StorageAccess`] is the access being allowed /// (for example `writeonly` has an associated value of [`crate::StorageAccess::STORE`]) MemoryQualifier(crate::StorageAccess), Invariant, Interpolation(Interpolation), Sampling(Sampling), Precision, PrecisionQualifier(Precision), Continue, Break, Return, Discard, If, Else, Switch, Case, Default, While, Do, For, Void, Struct, TypeName(Type), Assign, AddAssign, SubAssign, MulAssign, DivAssign, ModAssign, LeftShiftAssign, RightShiftAssign, AndAssign, XorAssign, OrAssign, Increment, Decrement, LogicalOr, LogicalAnd, LogicalXor, LessEqual, GreaterEqual, Equal, NotEqual, LeftShift, RightShift, LeftBrace, RightBrace, LeftParen, RightParen, LeftBracket, RightBracket, LeftAngle, RightAngle, Comma, Semicolon, Colon, Dot, Bang, Dash, Tilde, Plus, Star, Slash, Percent, VerticalBar, Caret, Ampersand, Question, } #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub struct Directive { pub kind: DirectiveKind, pub tokens: Vec, } #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub enum DirectiveKind { Version { is_first_directive: bool }, Extension, Pragma, } ================================================ FILE: lib/naga/src/front/glsl/types.rs ================================================ use super::{constants::ConstantSolver, context::Context, Error, ErrorKind, Parser, Result, Span}; use crate::{ proc::ResolveContext, Bytes, Constant, Expression, Handle, ImageClass, ImageDimension, ScalarKind, Type, TypeInner, VectorSize, }; pub fn parse_type(type_name: &str) -> Option { match type_name { "bool" => Some(Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Bool, width: crate::BOOL_WIDTH, }, }), "float" => Some(Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Float, width: 4, }, }), "double" => Some(Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Float, width: 8, }, }), "int" => Some(Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Sint, width: 4, }, }), "uint" => Some(Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Uint, width: 4, }, }), "sampler" | "samplerShadow" => Some(Type { name: None, inner: TypeInner::Sampler { comparison: type_name == "samplerShadow", }, }), word => { fn kind_width_parse(ty: &str) -> Option<(ScalarKind, u8)> { Some(match ty { "" => (ScalarKind::Float, 4), "b" => (ScalarKind::Bool, crate::BOOL_WIDTH), "i" => (ScalarKind::Sint, 4), "u" => (ScalarKind::Uint, 4), "d" => (ScalarKind::Float, 8), _ => return None, }) } fn size_parse(n: &str) -> Option { Some(match n { "2" => VectorSize::Bi, "3" => VectorSize::Tri, "4" => VectorSize::Quad, _ => return None, }) } let vec_parse = |word: &str| { let mut iter = word.split("vec"); let kind = iter.next()?; let size = iter.next()?; let (kind, width) = kind_width_parse(kind)?; let size = size_parse(size)?; Some(Type { name: None, inner: TypeInner::Vector { size, kind, width }, }) }; let mat_parse = |word: &str| { let mut iter = word.split("mat"); let kind = iter.next()?; let size = iter.next()?; let (_, width) = kind_width_parse(kind)?; let (columns, rows) = if let Some(size) = size_parse(size) { (size, size) } else { let mut iter = size.split('x'); match (iter.next()?, iter.next()?, iter.next()) { (col, row, None) => (size_parse(col)?, size_parse(row)?), _ => return None, } }; Some(Type { name: None, inner: TypeInner::Matrix { columns, rows, width, }, }) }; let texture_parse = |word: &str| { let mut iter = word.split("texture"); let texture_kind = |ty| { Some(match ty { "" => ScalarKind::Float, "i" => ScalarKind::Sint, "u" => ScalarKind::Uint, _ => return None, }) }; let kind = iter.next()?; let size = iter.next()?; let kind = texture_kind(kind)?; let sampled = |multi| ImageClass::Sampled { kind, multi }; let (dim, arrayed, class) = match size { "1D" => (ImageDimension::D1, false, sampled(false)), "1DArray" => (ImageDimension::D1, true, sampled(false)), "2D" => (ImageDimension::D2, false, sampled(false)), "2DArray" => (ImageDimension::D2, true, sampled(false)), "2DMS" => (ImageDimension::D2, false, sampled(true)), "2DMSArray" => (ImageDimension::D2, true, sampled(true)), "3D" => (ImageDimension::D3, false, sampled(false)), "Cube" => (ImageDimension::Cube, false, sampled(false)), "CubeArray" => (ImageDimension::Cube, true, sampled(false)), _ => return None, }; Some(Type { name: None, inner: TypeInner::Image { dim, arrayed, class, }, }) }; let image_parse = |word: &str| { let mut iter = word.split("image"); let texture_kind = |ty| { Some(match ty { "" => ScalarKind::Float, "i" => ScalarKind::Sint, "u" => ScalarKind::Uint, _ => return None, }) }; let kind = iter.next()?; let size = iter.next()?; // TODO: Check that the texture format and the kind match let _ = texture_kind(kind)?; let class = ImageClass::Storage { format: crate::StorageFormat::R8Uint, access: crate::StorageAccess::all(), }; // TODO: glsl support multisampled storage images, naga doesn't let (dim, arrayed) = match size { "1D" => (ImageDimension::D1, false), "1DArray" => (ImageDimension::D1, true), "2D" => (ImageDimension::D2, false), "2DArray" => (ImageDimension::D2, true), "3D" => (ImageDimension::D3, false), // Naga doesn't support cube images and it's usefulness // is questionable, so they won't be supported for now // "Cube" => (ImageDimension::Cube, false), // "CubeArray" => (ImageDimension::Cube, true), _ => return None, }; Some(Type { name: None, inner: TypeInner::Image { dim, arrayed, class, }, }) }; vec_parse(word) .or_else(|| mat_parse(word)) .or_else(|| texture_parse(word)) .or_else(|| image_parse(word)) } } } pub const fn scalar_components(ty: &TypeInner) -> Option<(ScalarKind, Bytes)> { match *ty { TypeInner::Scalar { kind, width } => Some((kind, width)), TypeInner::Vector { kind, width, .. } => Some((kind, width)), TypeInner::Matrix { width, .. } => Some((ScalarKind::Float, width)), TypeInner::ValuePointer { kind, width, .. } => Some((kind, width)), _ => None, } } pub const fn type_power(kind: ScalarKind, width: Bytes) -> Option { Some(match kind { ScalarKind::Sint => 0, ScalarKind::Uint => 1, ScalarKind::Float if width == 4 => 2, ScalarKind::Float => 3, ScalarKind::Bool => return None, }) } impl Parser { /// Resolves the types of the expressions until `expr` (inclusive) /// /// This needs to be done before the [`typifier`] can be queried for /// the types of the expressions in the range between the last grow and `expr`. /// /// # Note /// /// The `resolve_type*` methods (like [`resolve_type`]) automatically /// grow the [`typifier`] so calling this method is not necessary when using /// them. /// /// [`typifier`]: Context::typifier /// [`resolve_type`]: Self::resolve_type pub(crate) fn typifier_grow( &self, ctx: &mut Context, expr: Handle, meta: Span, ) -> Result<()> { let resolve_ctx = ResolveContext { constants: &self.module.constants, types: &self.module.types, global_vars: &self.module.global_variables, local_vars: &ctx.locals, functions: &self.module.functions, arguments: &ctx.arguments, }; ctx.typifier .grow(expr, &ctx.expressions, &resolve_ctx) .map_err(|error| Error { kind: ErrorKind::SemanticError(format!("Can't resolve type: {:?}", error).into()), meta, }) } /// Gets the type for the result of the `expr` expression /// /// Automatically grows the [`typifier`] to `expr` so calling /// [`typifier_grow`] is not necessary /// /// [`typifier`]: Context::typifier /// [`typifier_grow`]: Self::typifier_grow pub(crate) fn resolve_type<'b>( &'b self, ctx: &'b mut Context, expr: Handle, meta: Span, ) -> Result<&'b TypeInner> { self.typifier_grow(ctx, expr, meta)?; Ok(ctx.typifier.get(expr, &self.module.types)) } /// Gets the type handle for the result of the `expr` expression /// /// Automatically grows the [`typifier`] to `expr` so calling /// [`typifier_grow`] is not necessary /// /// # Note /// /// Consider using [`resolve_type`] whenever possible /// since it doesn't require adding each type to the [`types`] arena /// and it doesn't need to mutably borrow the [`Parser`][Self] /// /// [`types`]: crate::Module::types /// [`typifier`]: Context::typifier /// [`typifier_grow`]: Self::typifier_grow /// [`resolve_type`]: Self::resolve_type pub(crate) fn resolve_type_handle( &mut self, ctx: &mut Context, expr: Handle, meta: Span, ) -> Result> { self.typifier_grow(ctx, expr, meta)?; let resolution = &ctx.typifier[expr]; Ok(match *resolution { // If the resolution is already a handle return early crate::proc::TypeResolution::Handle(ty) => ty, // If it's a value we need to clone it crate::proc::TypeResolution::Value(_) => match resolution.clone() { // This is unreachable crate::proc::TypeResolution::Handle(ty) => ty, // Add the value to the type arena and return the handle crate::proc::TypeResolution::Value(inner) => { self.module.types.insert(Type { name: None, inner }, meta) } }, }) } /// Invalidates the cached type resolution for `expr` forcing a recomputation pub(crate) fn invalidate_expression<'b>( &'b self, ctx: &'b mut Context, expr: Handle, meta: Span, ) -> Result<()> { let resolve_ctx = ResolveContext { constants: &self.module.constants, types: &self.module.types, global_vars: &self.module.global_variables, local_vars: &ctx.locals, functions: &self.module.functions, arguments: &ctx.arguments, }; ctx.typifier .invalidate(expr, &ctx.expressions, &resolve_ctx) .map_err(|error| Error { kind: ErrorKind::SemanticError(format!("Can't resolve type: {:?}", error).into()), meta, }) } pub(crate) fn solve_constant( &mut self, ctx: &Context, root: Handle, meta: Span, ) -> Result> { let mut solver = ConstantSolver { types: &mut self.module.types, expressions: &ctx.expressions, constants: &mut self.module.constants, }; solver.solve(root).map_err(|e| Error { kind: e.into(), meta, }) } } ================================================ FILE: lib/naga/src/front/glsl/variables.rs ================================================ use super::{ ast::*, context::{Context, ExprPos}, error::{Error, ErrorKind}, Parser, Result, Span, }; use crate::{ AddressSpace, Binding, Block, BuiltIn, Constant, Expression, GlobalVariable, Handle, Interpolation, LocalVariable, ResourceBinding, ScalarKind, ShaderStage, SwizzleComponent, Type, TypeInner, VectorSize, }; pub struct VarDeclaration<'a, 'key> { pub qualifiers: &'a mut TypeQualifiers<'key>, pub ty: Handle, pub name: Option, pub init: Option>, pub meta: Span, } /// Information about a builtin used in [`add_builtin`](Parser::add_builtin). struct BuiltInData { /// The type of the builtin. inner: TypeInner, /// The associated builtin class. builtin: BuiltIn, /// Whether the builtin can be written to or not. mutable: bool, /// The storage used for the builtin. storage: StorageQualifier, } pub enum GlobalOrConstant { Global(Handle), Constant(Handle), } impl Parser { /// Adds a builtin and returns a variable reference to it fn add_builtin( &mut self, ctx: &mut Context, body: &mut Block, name: &str, data: BuiltInData, meta: Span, ) -> Option { let ty = self.module.types.insert( Type { name: None, inner: data.inner, }, meta, ); let handle = self.module.global_variables.append( GlobalVariable { name: Some(name.into()), space: AddressSpace::Private, binding: None, ty, init: None, }, meta, ); let idx = self.entry_args.len(); self.entry_args.push(EntryArg { name: None, binding: Binding::BuiltIn(data.builtin), handle, storage: data.storage, }); self.global_variables.push(( name.into(), GlobalLookup { kind: GlobalLookupKind::Variable(handle), entry_arg: Some(idx), mutable: data.mutable, }, )); let expr = ctx.add_expression(Expression::GlobalVariable(handle), meta, body); let var = VariableReference { expr, load: true, mutable: data.mutable, constant: None, entry_arg: Some(idx), }; ctx.symbol_table.add_root(name.into(), var.clone()); Some(var) } pub(crate) fn lookup_variable( &mut self, ctx: &mut Context, body: &mut Block, name: &str, meta: Span, ) -> Option { if let Some(var) = ctx.symbol_table.lookup(name).cloned() { return Some(var); } let data = match name { "gl_Position" => BuiltInData { inner: TypeInner::Vector { size: VectorSize::Quad, kind: ScalarKind::Float, width: 4, }, builtin: BuiltIn::Position { invariant: false }, mutable: true, storage: StorageQualifier::Output, }, "gl_FragCoord" => BuiltInData { inner: TypeInner::Vector { size: VectorSize::Quad, kind: ScalarKind::Float, width: 4, }, builtin: BuiltIn::Position { invariant: false }, mutable: false, storage: StorageQualifier::Input, }, "gl_GlobalInvocationID" | "gl_NumWorkGroups" | "gl_WorkGroupSize" | "gl_WorkGroupID" | "gl_LocalInvocationID" => BuiltInData { inner: TypeInner::Vector { size: VectorSize::Tri, kind: ScalarKind::Uint, width: 4, }, builtin: match name { "gl_GlobalInvocationID" => BuiltIn::GlobalInvocationId, "gl_NumWorkGroups" => BuiltIn::NumWorkGroups, "gl_WorkGroupSize" => BuiltIn::WorkGroupSize, "gl_WorkGroupID" => BuiltIn::WorkGroupId, "gl_LocalInvocationID" => BuiltIn::LocalInvocationId, _ => unreachable!(), }, mutable: false, storage: StorageQualifier::Input, }, "gl_FrontFacing" => BuiltInData { inner: TypeInner::Scalar { kind: ScalarKind::Bool, width: crate::BOOL_WIDTH, }, builtin: BuiltIn::FrontFacing, mutable: false, storage: StorageQualifier::Input, }, "gl_PointSize" | "gl_FragDepth" => BuiltInData { inner: TypeInner::Scalar { kind: ScalarKind::Float, width: 4, }, builtin: match name { "gl_PointSize" => BuiltIn::PointSize, "gl_FragDepth" => BuiltIn::FragDepth, _ => unreachable!(), }, mutable: true, storage: StorageQualifier::Output, }, "gl_ClipDistance" | "gl_CullDistance" => { let base = self.module.types.insert( Type { name: None, inner: TypeInner::Scalar { kind: ScalarKind::Float, width: 4, }, }, meta, ); BuiltInData { inner: TypeInner::Array { base, size: crate::ArraySize::Dynamic, stride: 4, }, builtin: match name { "gl_ClipDistance" => BuiltIn::PointSize, "gl_CullDistance" => BuiltIn::FragDepth, _ => unreachable!(), }, mutable: self.meta.stage == ShaderStage::Vertex, storage: StorageQualifier::Output, } } _ => { let builtin = match name { "gl_BaseVertex" => BuiltIn::BaseVertex, "gl_BaseInstance" => BuiltIn::BaseInstance, "gl_PrimitiveID" => BuiltIn::PrimitiveIndex, "gl_InstanceIndex" => BuiltIn::InstanceIndex, "gl_VertexIndex" => BuiltIn::VertexIndex, "gl_SampleID" => BuiltIn::SampleIndex, "gl_LocalInvocationIndex" => BuiltIn::LocalInvocationIndex, _ => return None, }; BuiltInData { inner: TypeInner::Scalar { kind: ScalarKind::Uint, width: 4, }, builtin, mutable: false, storage: StorageQualifier::Input, } } }; self.add_builtin(ctx, body, name, data, meta) } pub(crate) fn make_variable_invariant( &mut self, ctx: &mut Context, body: &mut Block, name: &str, meta: Span, ) { if let Some(var) = self.lookup_variable(ctx, body, name, meta) { if let Some(index) = var.entry_arg { if let Binding::BuiltIn(BuiltIn::Position { ref mut invariant }) = self.entry_args[index].binding { *invariant = true; } } } } pub(crate) fn field_selection( &mut self, ctx: &mut Context, pos: ExprPos, body: &mut Block, expression: Handle, name: &str, meta: Span, ) -> Result> { let (ty, is_pointer) = match *self.resolve_type(ctx, expression, meta)? { TypeInner::Pointer { base, .. } => (&self.module.types[base].inner, true), ref ty => (ty, false), }; match *ty { TypeInner::Struct { ref members, .. } => { let index = members .iter() .position(|m| m.name == Some(name.into())) .ok_or_else(|| Error { kind: ErrorKind::UnknownField(name.into()), meta, })?; let pointer = ctx.add_expression( Expression::AccessIndex { base: expression, index: index as u32, }, meta, body, ); Ok(match pos { ExprPos::Rhs if is_pointer => { ctx.add_expression(Expression::Load { pointer }, meta, body) } _ => pointer, }) } // swizzles (xyzw, rgba, stpq) TypeInner::Vector { size, .. } => { let check_swizzle_components = |comps: &str| { name.chars() .map(|c| { comps .find(c) .filter(|i| *i < size as usize) .map(|i| SwizzleComponent::from_index(i as u32)) }) .collect::>>() }; let components = check_swizzle_components("xyzw") .or_else(|| check_swizzle_components("rgba")) .or_else(|| check_swizzle_components("stpq")); if let Some(components) = components { if let ExprPos::Lhs = pos { let not_unique = (1..components.len()) .any(|i| components[i..].contains(&components[i - 1])); if not_unique { self.errors.push(Error { kind: ErrorKind::SemanticError( format!( "swizzle cannot have duplicate components in left-hand-side expression for \"{:?}\"", name ) .into(), ), meta , }) } } let mut pattern = [SwizzleComponent::X; 4]; for (pat, component) in pattern.iter_mut().zip(&components) { *pat = *component; } // flatten nested swizzles (vec.zyx.xy.x => vec.z) let mut expression = expression; if let Expression::Swizzle { size: _, vector, pattern: ref src_pattern, } = ctx[expression] { expression = vector; for pat in &mut pattern { *pat = src_pattern[pat.index() as usize]; } } let size = match components.len() { // Swizzles with just one component are accesses and not swizzles 1 => { match pos { // If the position is in the right hand side and the base // vector is a pointer, load it, otherwise the swizzle would // produce a pointer ExprPos::Rhs if is_pointer => { expression = ctx.add_expression( Expression::Load { pointer: expression, }, meta, body, ); } _ => {} }; return Ok(ctx.add_expression( Expression::AccessIndex { base: expression, index: pattern[0].index(), }, meta, body, )); } 2 => VectorSize::Bi, 3 => VectorSize::Tri, 4 => VectorSize::Quad, _ => { self.errors.push(Error { kind: ErrorKind::SemanticError( format!("Bad swizzle size for \"{:?}\"", name).into(), ), meta, }); VectorSize::Quad } }; if is_pointer { // NOTE: for lhs expression, this extra load ends up as an unused expr, because the // assignment will extract the pointer and use it directly anyway. Unfortunately we // need it for validation to pass, as swizzles cannot operate on pointer values. expression = ctx.add_expression( Expression::Load { pointer: expression, }, meta, body, ); } Ok(ctx.add_expression( Expression::Swizzle { size, vector: expression, pattern, }, meta, body, )) } else { Err(Error { kind: ErrorKind::SemanticError( format!("Invalid swizzle for vector \"{}\"", name).into(), ), meta, }) } } _ => Err(Error { kind: ErrorKind::SemanticError( format!("Can't lookup field on this type \"{}\"", name).into(), ), meta, }), } } pub(crate) fn add_global_var( &mut self, ctx: &mut Context, body: &mut Block, VarDeclaration { qualifiers, mut ty, name, init, meta, }: VarDeclaration, ) -> Result { let storage = qualifiers.storage.0; let (ret, lookup) = match storage { StorageQualifier::Input | StorageQualifier::Output => { let input = storage == StorageQualifier::Input; // TODO: glslang seems to use a counter for variables without // explicit location (even if that causes collisions) let location = qualifiers .uint_layout_qualifier("location", &mut self.errors) .unwrap_or(0); let interpolation = qualifiers.interpolation.take().map(|(i, _)| i).or_else(|| { let kind = self.module.types[ty].inner.scalar_kind()?; Some(match kind { ScalarKind::Float => Interpolation::Perspective, _ => Interpolation::Flat, }) }); let sampling = qualifiers.sampling.take().map(|(s, _)| s); let handle = self.module.global_variables.append( GlobalVariable { name: name.clone(), space: AddressSpace::Private, binding: None, ty, init, }, meta, ); let idx = self.entry_args.len(); self.entry_args.push(EntryArg { name: name.clone(), binding: Binding::Location { location, interpolation, sampling, }, handle, storage, }); let lookup = GlobalLookup { kind: GlobalLookupKind::Variable(handle), entry_arg: Some(idx), mutable: !input, }; (GlobalOrConstant::Global(handle), lookup) } StorageQualifier::Const => { let init = init.ok_or_else(|| Error { kind: ErrorKind::SemanticError("const values must have an initializer".into()), meta, })?; let lookup = GlobalLookup { kind: GlobalLookupKind::Constant(init, ty), entry_arg: None, mutable: false, }; (GlobalOrConstant::Constant(init), lookup) } StorageQualifier::AddressSpace(mut space) => { match space { AddressSpace::Storage { ref mut access } => { if let Some((allowed_access, _)) = qualifiers.storage_access.take() { *access = allowed_access; } } AddressSpace::Uniform => match self.module.types[ty].inner { TypeInner::Image { class, dim, arrayed, } => { if let crate::ImageClass::Storage { mut access, mut format, } = class { if let Some((allowed_access, _)) = qualifiers.storage_access.take() { access = allowed_access; } match qualifiers.layout_qualifiers.remove(&QualifierKey::Format) { Some((QualifierValue::Format(f), _)) => format = f, // TODO: glsl supports images without format qualifier // if they are `writeonly` None => self.errors.push(Error { kind: ErrorKind::SemanticError( "image types require a format layout qualifier".into(), ), meta, }), _ => unreachable!(), } ty = self.module.types.insert( Type { name: None, inner: TypeInner::Image { dim, arrayed, class: crate::ImageClass::Storage { format, access }, }, }, meta, ); } space = AddressSpace::Handle } TypeInner::Sampler { .. } => space = AddressSpace::Handle, _ => { if qualifiers.none_layout_qualifier("push_constant", &mut self.errors) { space = AddressSpace::PushConstant } } }, AddressSpace::Function => space = AddressSpace::Private, _ => {} }; let binding = match space { AddressSpace::Uniform | AddressSpace::Storage { .. } | AddressSpace::Handle => { let binding = qualifiers.uint_layout_qualifier("binding", &mut self.errors); if binding.is_none() { self.errors.push(Error { kind: ErrorKind::SemanticError( "uniform/buffer blocks require layout(binding=X)".into(), ), meta, }); } let set = qualifiers.uint_layout_qualifier("set", &mut self.errors); binding.map(|binding| ResourceBinding { group: set.unwrap_or(0), binding, }) } _ => None, }; let handle = self.module.global_variables.append( GlobalVariable { name: name.clone(), space, binding, ty, init, }, meta, ); let lookup = GlobalLookup { kind: GlobalLookupKind::Variable(handle), entry_arg: None, mutable: true, }; (GlobalOrConstant::Global(handle), lookup) } }; if let Some(name) = name { ctx.add_global(self, &name, lookup, body); self.global_variables.push((name, lookup)); } qualifiers.unused_errors(&mut self.errors); Ok(ret) } pub(crate) fn add_local_var( &mut self, ctx: &mut Context, body: &mut Block, decl: VarDeclaration, ) -> Result> { let storage = decl.qualifiers.storage; let mutable = match storage.0 { StorageQualifier::AddressSpace(AddressSpace::Function) => true, StorageQualifier::Const => false, _ => { self.errors.push(Error { kind: ErrorKind::SemanticError("Locals cannot have a storage qualifier".into()), meta: storage.1, }); true } }; let handle = ctx.locals.append( LocalVariable { name: decl.name.clone(), ty: decl.ty, init: None, }, decl.meta, ); let expr = ctx.add_expression(Expression::LocalVariable(handle), decl.meta, body); if let Some(name) = decl.name { let maybe_var = ctx.add_local_var(name.clone(), expr, mutable); if maybe_var.is_some() { self.errors.push(Error { kind: ErrorKind::VariableAlreadyDeclared(name), meta: decl.meta, }) } } decl.qualifiers.unused_errors(&mut self.errors); Ok(expr) } } ================================================ FILE: lib/naga/src/front/interpolator.rs ================================================ /*! Interpolation defaults. */ impl crate::Binding { /// Apply the usual default interpolation for `ty` to `binding`. /// /// This function is a utility front ends may use to satisfy the Naga IR's /// requirement, meant to ensure that input languages' policies have been /// applied appropriately, that all I/O `Binding`s from the vertex shader to the /// fragment shader must have non-`None` `interpolation` values. /// /// All the shader languages Naga supports have similar rules: /// perspective-correct, center-sampled interpolation is the default for any /// binding that can vary, and everything else either defaults to flat, or /// requires an explicit flat qualifier/attribute/what-have-you. /// /// If `binding` is not a [`Location`] binding, or if its [`interpolation`] is /// already set, then make no changes. Otherwise, set `binding`'s interpolation /// and sampling to reasonable defaults depending on `ty`, the type of the value /// being interpolated: /// /// - If `ty` is a floating-point scalar, vector, or matrix type, then /// default to [`Perspective`] interpolation and [`Center`] sampling. /// /// - If `ty` is an integral scalar or vector, then default to [`Flat`] /// interpolation, which has no associated sampling. /// /// - For any other types, make no change. Such types are not permitted as /// user-defined IO values, and will probably be flagged by the verifier /// /// When structs appear in input or output types, each member ought to have its /// own [`Binding`], so structs are simply covered by the third case. /// /// [`Binding`]: crate::Binding /// [`Location`]: crate::Binding::Location /// [`interpolation`]: crate::Binding::Location::interpolation /// [`Perspective`]: crate::Interpolation::Perspective /// [`Flat`]: crate::Interpolation::Flat /// [`Center`]: crate::Sampling::Center pub fn apply_default_interpolation(&mut self, ty: &crate::TypeInner) { if let crate::Binding::Location { location: _, interpolation: ref mut interpolation @ None, ref mut sampling, } = *self { match ty.scalar_kind() { Some(crate::ScalarKind::Float) => { *interpolation = Some(crate::Interpolation::Perspective); *sampling = Some(crate::Sampling::Center); } Some(crate::ScalarKind::Sint | crate::ScalarKind::Uint) => { *interpolation = Some(crate::Interpolation::Flat); *sampling = None; } Some(_) | None => {} } } } } ================================================ FILE: lib/naga/src/front/mod.rs ================================================ /*! Frontend parsers that consume binary and text shaders and load them into [`Module`](super::Module)s. */ mod interpolator; #[cfg(feature = "glsl-in")] pub mod glsl; #[cfg(feature = "spv-in")] pub mod spv; #[cfg(feature = "wgsl-in")] pub mod wgsl; use crate::{ arena::{Arena, Handle, UniqueArena}, proc::{ResolveContext, ResolveError, TypeResolution}, FastHashMap, }; use std::ops; /// Helper class to emit expressions #[allow(dead_code)] #[derive(Default, Debug)] struct Emitter { start_len: Option, } #[allow(dead_code)] impl Emitter { fn start(&mut self, arena: &Arena) { if self.start_len.is_some() { unreachable!("Emitting has already started!"); } self.start_len = Some(arena.len()); } #[must_use] fn finish( &mut self, arena: &Arena, ) -> Option<(crate::Statement, crate::span::Span)> { let start_len = self.start_len.take().unwrap(); if start_len != arena.len() { #[allow(unused_mut)] let mut span = crate::span::Span::default(); let range = arena.range_from(start_len); #[cfg(feature = "span")] for handle in range.clone() { span.subsume(arena.get_span(handle)) } Some((crate::Statement::Emit(range), span)) } else { None } } } #[allow(dead_code)] impl super::ConstantInner { const fn boolean(value: bool) -> Self { Self::Scalar { width: super::BOOL_WIDTH, value: super::ScalarValue::Bool(value), } } } /// Helper processor that derives the types of all expressions. #[derive(Debug, Default)] pub struct Typifier { resolutions: Vec, } impl Typifier { pub const fn new() -> Self { Typifier { resolutions: Vec::new(), } } pub fn reset(&mut self) { self.resolutions.clear() } pub fn get<'a>( &'a self, expr_handle: Handle, types: &'a UniqueArena, ) -> &'a crate::TypeInner { self.resolutions[expr_handle.index()].inner_with(types) } pub fn grow( &mut self, expr_handle: Handle, expressions: &Arena, ctx: &ResolveContext, ) -> Result<(), ResolveError> { if self.resolutions.len() <= expr_handle.index() { for (eh, expr) in expressions.iter().skip(self.resolutions.len()) { //Note: the closure can't `Err` by construction let resolution = ctx.resolve(expr, |h| Ok(&self.resolutions[h.index()]))?; log::debug!("Resolving {:?} = {:?} : {:?}", eh, expr, resolution); self.resolutions.push(resolution); } } Ok(()) } /// Invalidates the cached type resolution for `expr_handle` forcing a recomputation /// /// If the type of the expression hasn't yet been calculated a /// [`grow`](Self::grow) is performed instead pub fn invalidate( &mut self, expr_handle: Handle, expressions: &Arena, ctx: &ResolveContext, ) -> Result<(), ResolveError> { if self.resolutions.len() <= expr_handle.index() { self.grow(expr_handle, expressions, ctx) } else { let expr = &expressions[expr_handle]; //Note: the closure can't `Err` by construction let resolution = ctx.resolve(expr, |h| Ok(&self.resolutions[h.index()]))?; self.resolutions[expr_handle.index()] = resolution; Ok(()) } } } impl ops::Index> for Typifier { type Output = TypeResolution; fn index(&self, handle: Handle) -> &Self::Output { &self.resolutions[handle.index()] } } /// Type representing a lexical scope, associating a name to a single variable /// /// The scope is generic over the variable representation and name representaion /// in order to allow larger flexibility on the frontends on how they might /// represent them. type Scope = FastHashMap; /// Structure responsible for managing variable lookups and keeping track of /// lexical scopes /// /// The symbol table is generic over the variable representation and its name /// to allow larger flexibility on the frontends on how they might represent them. /// /// ``` /// use naga::front::SymbolTable; /// /// // Create a new symbol table with `u32`s representing the variable /// let mut symbol_table: SymbolTable<&str, u32> = SymbolTable::default(); /// /// // Add two variables named `var1` and `var2` with 0 and 2 respectively /// symbol_table.add("var1", 0); /// symbol_table.add("var2", 2); /// /// // Check that `var1` exists and is `0` /// assert_eq!(symbol_table.lookup("var1"), Some(&0)); /// /// // Push a new scope and add a variable to it named `var1` shadowing the /// // variable of our previous scope /// symbol_table.push_scope(); /// symbol_table.add("var1", 1); /// /// // Check that `var1` now points to the new value of `1` and `var2` still /// // exists with its value of `2` /// assert_eq!(symbol_table.lookup("var1"), Some(&1)); /// assert_eq!(symbol_table.lookup("var2"), Some(&2)); /// /// // Pop the scope /// symbol_table.pop_scope(); /// /// // Check that `var1` now refers to our initial variable with value `0` /// assert_eq!(symbol_table.lookup("var1"), Some(&0)); /// ``` /// /// Scopes are ordered as a LIFO stack so a variable defined in a later scope /// with the same name as another variable defined in a earlier scope will take /// precedence in the lookup. Scopes can be added with [`push_scope`] and /// removed with [`pop_scope`]. /// /// A root scope is added when the symbol table is created and must always be /// present. Trying to pop it will result in a panic. /// /// Variables can be added with [`add`] and looked up with [`lookup`]. Adding a /// variable will do so in the currently active scope and as mentioned /// previously a lookup will search from the current scope to the root scope. /// /// [`push_scope`]: Self::push_scope /// [`pop_scope`]: Self::push_scope /// [`add`]: Self::add /// [`lookup`]: Self::lookup pub struct SymbolTable { /// Stack of lexical scopes. Not all scopes are active; see [`cursor`]. /// /// [`cursor`]: Self::cursor scopes: Vec>, /// Limit of the [`scopes`] stack (exclusive). By using a separate value for /// the stack length instead of `Vec`'s own internal length, the scopes can /// be reused to cache memory allocations. /// /// [`scopes`]: Self::scopes cursor: usize, } impl SymbolTable { /// Adds a new lexical scope. /// /// All variables declared after this point will be added to this scope /// until another scope is pushed or [`pop_scope`] is called, causing this /// scope to be removed along with all variables added to it. /// /// [`pop_scope`]: Self::pop_scope pub fn push_scope(&mut self) { // If the cursor is equal to the scope's stack length then we need to // push another empty scope. Otherwise we can reuse the already existing // scope. if self.scopes.len() == self.cursor { self.scopes.push(FastHashMap::default()) } else { self.scopes[self.cursor].clear(); } self.cursor += 1; } /// Removes the current lexical scope and all its variables /// /// # PANICS /// - If the current lexical scope is the root scope pub fn pop_scope(&mut self) { // Despite the method title, the variables are only deleted when the // scope is reused. This is because while a clear is inevitable if the // scope needs to be reused, there are cases where the scope might be // popped and not reused, i.e. if another scope with the same nesting // level is never pushed again. assert!(self.cursor != 1, "Tried to pop the root scope"); self.cursor -= 1; } } impl SymbolTable where Name: std::hash::Hash + Eq, { /// Perform a lookup for a variable named `name`. /// /// As stated in the struct level documentation the lookup will proceed from /// the current scope to the root scope, returning `Some` when a variable is /// found or `None` if there doesn't exist a variable with `name` in any /// scope. pub fn lookup(&self, name: &Q) -> Option<&Var> where Name: std::borrow::Borrow, Q: std::hash::Hash + Eq, { // Iterate backwards trough the scopes and try to find the variable for scope in self.scopes[..self.cursor].iter().rev() { if let Some(var) = scope.get(name) { return Some(var); } } None } /// Adds a new variable to the current scope. /// /// Returns the previous variable with the same name in this scope if it /// exists, so that the frontend might handle it in case variable shadowing /// is disallowed. pub fn add(&mut self, name: Name, var: Var) -> Option { self.scopes[self.cursor - 1].insert(name, var) } /// Adds a new variable to the root scope. /// /// This is used in GLSL for builtins which aren't known in advance and only /// when used for the first time, so there must be a way to add those /// declarations to the root unconditionally from the current scope. /// /// Returns the previous variable with the same name in the root scope if it /// exists, so that the frontend might handle it in case variable shadowing /// is disallowed. pub fn add_root(&mut self, name: Name, var: Var) -> Option { self.scopes[0].insert(name, var) } } impl Default for SymbolTable { /// Constructs a new symbol table with a root scope fn default() -> Self { Self { scopes: vec![FastHashMap::default()], cursor: 1, } } } use std::fmt; impl fmt::Debug for SymbolTable { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("SymbolTable ")?; f.debug_list() .entries(self.scopes[..self.cursor].iter()) .finish() } } ================================================ FILE: lib/naga/src/front/spv/convert.rs ================================================ use super::error::Error; use num_traits::cast::FromPrimitive; use std::convert::TryInto; pub(super) const fn map_binary_operator(word: spirv::Op) -> Result { use crate::BinaryOperator; use spirv::Op; match word { // Arithmetic Instructions +, -, *, /, % Op::IAdd | Op::FAdd => Ok(BinaryOperator::Add), Op::ISub | Op::FSub => Ok(BinaryOperator::Subtract), Op::IMul | Op::FMul => Ok(BinaryOperator::Multiply), Op::UDiv | Op::SDiv | Op::FDiv => Ok(BinaryOperator::Divide), Op::SRem => Ok(BinaryOperator::Modulo), // Relational and Logical Instructions Op::IEqual | Op::FOrdEqual | Op::FUnordEqual | Op::LogicalEqual => { Ok(BinaryOperator::Equal) } Op::INotEqual | Op::FOrdNotEqual | Op::FUnordNotEqual | Op::LogicalNotEqual => { Ok(BinaryOperator::NotEqual) } Op::ULessThan | Op::SLessThan | Op::FOrdLessThan | Op::FUnordLessThan => { Ok(BinaryOperator::Less) } Op::ULessThanEqual | Op::SLessThanEqual | Op::FOrdLessThanEqual | Op::FUnordLessThanEqual => Ok(BinaryOperator::LessEqual), Op::UGreaterThan | Op::SGreaterThan | Op::FOrdGreaterThan | Op::FUnordGreaterThan => { Ok(BinaryOperator::Greater) } Op::UGreaterThanEqual | Op::SGreaterThanEqual | Op::FOrdGreaterThanEqual | Op::FUnordGreaterThanEqual => Ok(BinaryOperator::GreaterEqual), Op::BitwiseOr => Ok(BinaryOperator::InclusiveOr), Op::BitwiseXor => Ok(BinaryOperator::ExclusiveOr), Op::BitwiseAnd => Ok(BinaryOperator::And), _ => Err(Error::UnknownBinaryOperator(word)), } } pub(super) const fn map_relational_fun( word: spirv::Op, ) -> Result { use crate::RelationalFunction as Rf; use spirv::Op; match word { Op::All => Ok(Rf::All), Op::Any => Ok(Rf::Any), Op::IsNan => Ok(Rf::IsNan), Op::IsInf => Ok(Rf::IsInf), Op::IsFinite => Ok(Rf::IsFinite), Op::IsNormal => Ok(Rf::IsNormal), _ => Err(Error::UnknownRelationalFunction(word)), } } pub(super) const fn map_vector_size(word: spirv::Word) -> Result { match word { 2 => Ok(crate::VectorSize::Bi), 3 => Ok(crate::VectorSize::Tri), 4 => Ok(crate::VectorSize::Quad), _ => Err(Error::InvalidVectorSize(word)), } } pub(super) fn map_image_dim(word: spirv::Word) -> Result { use spirv::Dim as D; match D::from_u32(word) { Some(D::Dim1D) => Ok(crate::ImageDimension::D1), Some(D::Dim2D) => Ok(crate::ImageDimension::D2), Some(D::Dim3D) => Ok(crate::ImageDimension::D3), Some(D::DimCube) => Ok(crate::ImageDimension::Cube), _ => Err(Error::UnsupportedImageDim(word)), } } pub(super) fn map_image_format(word: spirv::Word) -> Result { match spirv::ImageFormat::from_u32(word) { Some(spirv::ImageFormat::R8) => Ok(crate::StorageFormat::R8Unorm), Some(spirv::ImageFormat::R8Snorm) => Ok(crate::StorageFormat::R8Snorm), Some(spirv::ImageFormat::R8ui) => Ok(crate::StorageFormat::R8Uint), Some(spirv::ImageFormat::R8i) => Ok(crate::StorageFormat::R8Sint), Some(spirv::ImageFormat::R16ui) => Ok(crate::StorageFormat::R16Uint), Some(spirv::ImageFormat::R16i) => Ok(crate::StorageFormat::R16Sint), Some(spirv::ImageFormat::R16f) => Ok(crate::StorageFormat::R16Float), Some(spirv::ImageFormat::Rg8) => Ok(crate::StorageFormat::Rg8Unorm), Some(spirv::ImageFormat::Rg8Snorm) => Ok(crate::StorageFormat::Rg8Snorm), Some(spirv::ImageFormat::Rg8ui) => Ok(crate::StorageFormat::Rg8Uint), Some(spirv::ImageFormat::Rg8i) => Ok(crate::StorageFormat::Rg8Sint), Some(spirv::ImageFormat::R32ui) => Ok(crate::StorageFormat::R32Uint), Some(spirv::ImageFormat::R32i) => Ok(crate::StorageFormat::R32Sint), Some(spirv::ImageFormat::R32f) => Ok(crate::StorageFormat::R32Float), Some(spirv::ImageFormat::Rg16ui) => Ok(crate::StorageFormat::Rg16Uint), Some(spirv::ImageFormat::Rg16i) => Ok(crate::StorageFormat::Rg16Sint), Some(spirv::ImageFormat::Rg16f) => Ok(crate::StorageFormat::Rg16Float), Some(spirv::ImageFormat::Rgba8) => Ok(crate::StorageFormat::Rgba8Unorm), Some(spirv::ImageFormat::Rgba8Snorm) => Ok(crate::StorageFormat::Rgba8Snorm), Some(spirv::ImageFormat::Rgba8ui) => Ok(crate::StorageFormat::Rgba8Uint), Some(spirv::ImageFormat::Rgba8i) => Ok(crate::StorageFormat::Rgba8Sint), Some(spirv::ImageFormat::Rgb10a2ui) => Ok(crate::StorageFormat::Rgb10a2Unorm), Some(spirv::ImageFormat::R11fG11fB10f) => Ok(crate::StorageFormat::Rg11b10Float), Some(spirv::ImageFormat::Rg32ui) => Ok(crate::StorageFormat::Rg32Uint), Some(spirv::ImageFormat::Rg32i) => Ok(crate::StorageFormat::Rg32Sint), Some(spirv::ImageFormat::Rg32f) => Ok(crate::StorageFormat::Rg32Float), Some(spirv::ImageFormat::Rgba16ui) => Ok(crate::StorageFormat::Rgba16Uint), Some(spirv::ImageFormat::Rgba16i) => Ok(crate::StorageFormat::Rgba16Sint), Some(spirv::ImageFormat::Rgba16f) => Ok(crate::StorageFormat::Rgba16Float), Some(spirv::ImageFormat::Rgba32ui) => Ok(crate::StorageFormat::Rgba32Uint), Some(spirv::ImageFormat::Rgba32i) => Ok(crate::StorageFormat::Rgba32Sint), Some(spirv::ImageFormat::Rgba32f) => Ok(crate::StorageFormat::Rgba32Float), _ => Err(Error::UnsupportedImageFormat(word)), } } pub(super) fn map_width(word: spirv::Word) -> Result { (word >> 3) // bits to bytes .try_into() .map_err(|_| Error::InvalidTypeWidth(word)) } pub(super) fn map_builtin(word: spirv::Word, invariant: bool) -> Result { use spirv::BuiltIn as Bi; Ok(match spirv::BuiltIn::from_u32(word) { Some(Bi::Position | Bi::FragCoord) => crate::BuiltIn::Position { invariant }, Some(Bi::ViewIndex) => crate::BuiltIn::ViewIndex, // vertex Some(Bi::BaseInstance) => crate::BuiltIn::BaseInstance, Some(Bi::BaseVertex) => crate::BuiltIn::BaseVertex, Some(Bi::ClipDistance) => crate::BuiltIn::ClipDistance, Some(Bi::CullDistance) => crate::BuiltIn::CullDistance, Some(Bi::InstanceIndex) => crate::BuiltIn::InstanceIndex, Some(Bi::PointSize) => crate::BuiltIn::PointSize, Some(Bi::VertexIndex) => crate::BuiltIn::VertexIndex, // fragment Some(Bi::FragDepth) => crate::BuiltIn::FragDepth, Some(Bi::FrontFacing) => crate::BuiltIn::FrontFacing, Some(Bi::PrimitiveId) => crate::BuiltIn::PrimitiveIndex, Some(Bi::SampleId) => crate::BuiltIn::SampleIndex, Some(Bi::SampleMask) => crate::BuiltIn::SampleMask, // compute Some(Bi::GlobalInvocationId) => crate::BuiltIn::GlobalInvocationId, Some(Bi::LocalInvocationId) => crate::BuiltIn::LocalInvocationId, Some(Bi::LocalInvocationIndex) => crate::BuiltIn::LocalInvocationIndex, Some(Bi::WorkgroupId) => crate::BuiltIn::WorkGroupId, Some(Bi::WorkgroupSize) => crate::BuiltIn::WorkGroupSize, Some(Bi::NumWorkgroups) => crate::BuiltIn::NumWorkGroups, _ => return Err(Error::UnsupportedBuiltIn(word)), }) } pub(super) fn map_storage_class(word: spirv::Word) -> Result { use super::ExtendedClass as Ec; use spirv::StorageClass as Sc; Ok(match Sc::from_u32(word) { Some(Sc::Function) => Ec::Global(crate::AddressSpace::Function), Some(Sc::Input) => Ec::Input, Some(Sc::Output) => Ec::Output, Some(Sc::Private) => Ec::Global(crate::AddressSpace::Private), Some(Sc::UniformConstant) => Ec::Global(crate::AddressSpace::Handle), Some(Sc::StorageBuffer) => Ec::Global(crate::AddressSpace::Storage { //Note: this is restricted by decorations later access: crate::StorageAccess::all(), }), // we expect the `Storage` case to be filtered out before calling this function. Some(Sc::Uniform) => Ec::Global(crate::AddressSpace::Uniform), Some(Sc::Workgroup) => Ec::Global(crate::AddressSpace::WorkGroup), Some(Sc::PushConstant) => Ec::Global(crate::AddressSpace::PushConstant), _ => return Err(Error::UnsupportedStorageClass(word)), }) } ================================================ FILE: lib/naga/src/front/spv/error.rs ================================================ use super::ModuleState; use crate::arena::Handle; #[derive(Debug, thiserror::Error)] pub enum Error { #[error("invalid header")] InvalidHeader, #[error("invalid word count")] InvalidWordCount, #[error("unknown instruction {0}")] UnknownInstruction(u16), #[error("unknown capability %{0}")] UnknownCapability(spirv::Word), #[error("unsupported instruction {1:?} at {0:?}")] UnsupportedInstruction(ModuleState, spirv::Op), #[error("unsupported capability {0:?}")] UnsupportedCapability(spirv::Capability), #[error("unsupported extension {0}")] UnsupportedExtension(String), #[error("unsupported extension set {0}")] UnsupportedExtSet(String), #[error("unsupported extension instantiation set %{0}")] UnsupportedExtInstSet(spirv::Word), #[error("unsupported extension instantiation %{0}")] UnsupportedExtInst(spirv::Word), #[error("unsupported type {0:?}")] UnsupportedType(Handle), #[error("unsupported execution model %{0}")] UnsupportedExecutionModel(spirv::Word), #[error("unsupported execution mode %{0}")] UnsupportedExecutionMode(spirv::Word), #[error("unsupported storage class %{0}")] UnsupportedStorageClass(spirv::Word), #[error("unsupported image dimension %{0}")] UnsupportedImageDim(spirv::Word), #[error("unsupported image format %{0}")] UnsupportedImageFormat(spirv::Word), #[error("unsupported builtin %{0}")] UnsupportedBuiltIn(spirv::Word), #[error("unsupported control flow %{0}")] UnsupportedControlFlow(spirv::Word), #[error("unsupported binary operator %{0}")] UnsupportedBinaryOperator(spirv::Word), #[error("Naga supports OpTypeRuntimeArray in the StorageBuffer storage class only")] UnsupportedRuntimeArrayStorageClass, #[error("unsupported matrix stride {stride} for a {columns}x{rows} matrix with scalar width={width}")] UnsupportedMatrixStride { stride: u32, columns: u8, rows: u8, width: u8, }, #[error("unknown binary operator {0:?}")] UnknownBinaryOperator(spirv::Op), #[error("unknown relational function {0:?}")] UnknownRelationalFunction(spirv::Op), #[error("invalid parameter {0:?}")] InvalidParameter(spirv::Op), #[error("invalid operand count {1} for {0:?}")] InvalidOperandCount(spirv::Op, u16), #[error("invalid operand")] InvalidOperand, #[error("invalid id %{0}")] InvalidId(spirv::Word), #[error("invalid decoration %{0}")] InvalidDecoration(spirv::Word), #[error("invalid type width %{0}")] InvalidTypeWidth(spirv::Word), #[error("invalid sign %{0}")] InvalidSign(spirv::Word), #[error("invalid inner type %{0}")] InvalidInnerType(spirv::Word), #[error("invalid vector size %{0}")] InvalidVectorSize(spirv::Word), #[error("invalid access type %{0}")] InvalidAccessType(spirv::Word), #[error("invalid access {0:?}")] InvalidAccess(crate::Expression), #[error("invalid access index %{0}")] InvalidAccessIndex(spirv::Word), #[error("invalid binding %{0}")] InvalidBinding(spirv::Word), #[error("invalid global var {0:?}")] InvalidGlobalVar(crate::Expression), #[error("invalid image/sampler expression {0:?}")] InvalidImageExpression(crate::Expression), #[error("invalid image base type {0:?}")] InvalidImageBaseType(Handle), #[error("invalid image {0:?}")] InvalidImage(Handle), #[error("invalid as type {0:?}")] InvalidAsType(Handle), #[error("invalid vector type {0:?}")] InvalidVectorType(Handle), #[error("inconsistent comparison sampling {0:?}")] InconsistentComparisonSampling(Handle), #[error("wrong function result type %{0}")] WrongFunctionResultType(spirv::Word), #[error("wrong function argument type %{0}")] WrongFunctionArgumentType(spirv::Word), #[error("missing decoration {0:?}")] MissingDecoration(spirv::Decoration), #[error("bad string")] BadString, #[error("incomplete data")] IncompleteData, #[error("invalid terminator")] InvalidTerminator, #[error("invalid edge classification")] InvalidEdgeClassification, #[error("cycle detected in the CFG during traversal at {0}")] ControlFlowGraphCycle(crate::front::spv::BlockId), #[error("recursive function call %{0}")] FunctionCallCycle(spirv::Word), #[error("invalid array size {0:?}")] InvalidArraySize(Handle), #[error("invalid barrier scope %{0}")] InvalidBarrierScope(spirv::Word), #[error("invalid barrier memory semantics %{0}")] InvalidBarrierMemorySemantics(spirv::Word), // incomplete implementation errors } ================================================ FILE: lib/naga/src/front/spv/function.rs ================================================ use crate::{ arena::{Arena, Handle}, front::spv::{BlockContext, BodyIndex}, }; use super::{Error, Instruction, LookupExpression, LookupHelper as _}; use crate::front::Emitter; pub type BlockId = u32; #[derive(Copy, Clone, Debug)] pub struct MergeInstruction { pub merge_block_id: BlockId, pub continue_block_id: Option, } impl> super::Parser { // Registers a function call. It will generate a dummy handle to call, which // gets resolved after all the functions are processed. pub(super) fn add_call( &mut self, from: spirv::Word, to: spirv::Word, ) -> Handle { let dummy_handle = self .dummy_functions .append(crate::Function::default(), Default::default()); self.deferred_function_calls.push(to); self.function_call_graph.add_edge(from, to, ()); dummy_handle } pub(super) fn parse_function(&mut self, module: &mut crate::Module) -> Result<(), Error> { let start = self.data_offset; self.lookup_expression.clear(); self.lookup_load_override.clear(); self.lookup_sampled_image.clear(); let result_type_id = self.next()?; let fun_id = self.next()?; let _fun_control = self.next()?; let fun_type_id = self.next()?; let mut fun = { let ft = self.lookup_function_type.lookup(fun_type_id)?; if ft.return_type_id != result_type_id { return Err(Error::WrongFunctionResultType(result_type_id)); } crate::Function { name: self.future_decor.remove(&fun_id).and_then(|dec| dec.name), arguments: Vec::with_capacity(ft.parameter_type_ids.len()), result: if self.lookup_void_type == Some(result_type_id) { None } else { let lookup_result_ty = self.lookup_type.lookup(result_type_id)?; Some(crate::FunctionResult { ty: lookup_result_ty.handle, binding: None, }) }, local_variables: Arena::new(), expressions: self .make_expression_storage(&module.global_variables, &module.constants), named_expressions: crate::FastHashMap::default(), body: crate::Block::new(), } }; // read parameters for i in 0..fun.arguments.capacity() { let start = self.data_offset; match self.next_inst()? { Instruction { op: spirv::Op::FunctionParameter, wc: 3, } => { let type_id = self.next()?; let id = self.next()?; let handle = fun.expressions.append( crate::Expression::FunctionArgument(i as u32), self.span_from(start), ); self.lookup_expression.insert( id, LookupExpression { handle, type_id, // Setting this to an invalid id will cause get_expr_handle // to default to the main body making sure no load/stores // are added. block_id: 0, }, ); //Note: we redo the lookup in order to work around `self` borrowing if type_id != self .lookup_function_type .lookup(fun_type_id)? .parameter_type_ids[i] { return Err(Error::WrongFunctionArgumentType(type_id)); } let ty = self.lookup_type.lookup(type_id)?.handle; let decor = self.future_decor.remove(&id).unwrap_or_default(); fun.arguments.push(crate::FunctionArgument { name: decor.name, ty, binding: None, }); } Instruction { op, .. } => return Err(Error::InvalidParameter(op)), } } // Read body self.function_call_graph.add_node(fun_id); let mut parameters_sampling = vec![super::image::SamplingFlags::empty(); fun.arguments.len()]; let mut block_ctx = BlockContext { phis: Default::default(), blocks: Default::default(), body_for_label: Default::default(), mergers: Default::default(), bodies: Default::default(), function_id: fun_id, expressions: &mut fun.expressions, local_arena: &mut fun.local_variables, const_arena: &mut module.constants, type_arena: &module.types, global_arena: &module.global_variables, arguments: &fun.arguments, parameter_sampling: &mut parameters_sampling, }; // Insert the main body whose parent is also himself block_ctx.bodies.push(super::Body::with_parent(0)); // Scan the blocks and add them as nodes loop { let fun_inst = self.next_inst()?; log::debug!("{:?}", fun_inst.op); match fun_inst.op { spirv::Op::Line => { fun_inst.expect(4)?; let _file_id = self.next()?; let _row_id = self.next()?; let _col_id = self.next()?; } spirv::Op::Label => { // Read the label ID fun_inst.expect(2)?; let block_id = self.next()?; self.next_block(block_id, &mut block_ctx)?; } spirv::Op::FunctionEnd => { fun_inst.expect(1)?; break; } _ => { return Err(Error::UnsupportedInstruction(self.state, fun_inst.op)); } } } if let Some(ref prefix) = self.options.block_ctx_dump_prefix { let dump_suffix = match self.lookup_entry_point.get(&fun_id) { Some(ep) => format!("block_ctx.{:?}-{}.txt", ep.stage, ep.name), None => format!("block_ctx.Fun-{}.txt", module.functions.len()), }; let dest = prefix.join(dump_suffix); let dump = format!("{:#?}", block_ctx); if let Err(e) = std::fs::write(&dest, dump) { log::error!("Unable to dump the block context into {:?}: {}", dest, e); } } // Emit `Store` statements to properly initialize all the local variables we // created for `phi` expressions. // // Note that get_expr_handle also contributes slightly odd entries to this table, // to get the spill. for phi in block_ctx.phis.iter() { // Get a pointer to the local variable for the phi's value. let phi_pointer = block_ctx.expressions.append( crate::Expression::LocalVariable(phi.local), crate::Span::default(), ); // At the end of each of `phi`'s predecessor blocks, store the corresponding // source value in the phi's local variable. for &(source, predecessor) in phi.expressions.iter() { let source_lexp = &self.lookup_expression[&source]; let predecessor_body_idx = block_ctx.body_for_label[&predecessor]; // If the expression is a global/argument it will have a 0 block // id so we must use a default value instead of panicking let source_body_idx = block_ctx .body_for_label .get(&source_lexp.block_id) .copied() .unwrap_or(0); // If the Naga `Expression` generated for `source` is in scope, then we // can simply store that in the phi's local variable. // // Otherwise, spill the source value to a local variable in the block that // defines it. (We know this store dominates the predecessor; otherwise, // the phi wouldn't have been able to refer to that source expression in // the first place.) Then, the predecessor block can count on finding the // source's value in that local variable. let value = if super::is_parent(predecessor_body_idx, source_body_idx, &block_ctx) { source_lexp.handle } else { // The source SPIR-V expression is not defined in the phi's // predecessor block, nor is it a globally available expression. So it // must be defined off in some other block that merely dominates the // predecessor. This means that the corresponding Naga `Expression` // may not be in scope in the predecessor block. // // In the block that defines `source`, spill it to a fresh local // variable, to ensure we can still use it at the end of the // predecessor. let ty = self.lookup_type[&source_lexp.type_id].handle; let local = block_ctx.local_arena.append( crate::LocalVariable { name: None, ty, init: None, }, crate::Span::default(), ); let pointer = block_ctx.expressions.append( crate::Expression::LocalVariable(local), crate::Span::default(), ); // Get the spilled value of the source expression. let start = block_ctx.expressions.len(); let expr = block_ctx .expressions .append(crate::Expression::Load { pointer }, crate::Span::default()); let range = block_ctx.expressions.range_from(start); block_ctx .blocks .get_mut(&predecessor) .unwrap() .push(crate::Statement::Emit(range), crate::Span::default()); // At the end of the block that defines it, spill the source // expression's value. block_ctx .blocks .get_mut(&source_lexp.block_id) .unwrap() .push( crate::Statement::Store { pointer, value: source_lexp.handle, }, crate::Span::default(), ); expr }; // At the end of the phi predecessor block, store the source // value in the phi's value. block_ctx.blocks.get_mut(&predecessor).unwrap().push( crate::Statement::Store { pointer: phi_pointer, value, }, crate::Span::default(), ) } } fun.body = block_ctx.lower(); // done let fun_handle = module.functions.append(fun, self.span_from_with_op(start)); self.lookup_function.insert( fun_id, super::LookupFunction { handle: fun_handle, parameters_sampling, }, ); if let Some(ep) = self.lookup_entry_point.remove(&fun_id) { // create a wrapping function let mut function = crate::Function { name: Some(format!("{}_wrap", ep.name)), arguments: Vec::new(), result: None, local_variables: Arena::new(), expressions: Arena::new(), named_expressions: crate::FastHashMap::default(), body: crate::Block::new(), }; // 1. copy the inputs from arguments to privates for &v_id in ep.variable_ids.iter() { let lvar = self.lookup_variable.lookup(v_id)?; if let super::Variable::Input(ref arg) = lvar.inner { let span = module.global_variables.get_span(lvar.handle); let arg_expr = function.expressions.append( crate::Expression::FunctionArgument(function.arguments.len() as u32), span, ); let load_expr = if arg.ty == module.global_variables[lvar.handle].ty { arg_expr } else { // The only case where the type is different is if we need to treat // unsigned integer as signed. let mut emitter = Emitter::default(); emitter.start(&function.expressions); let handle = function.expressions.append( crate::Expression::As { expr: arg_expr, kind: crate::ScalarKind::Sint, convert: Some(4), }, span, ); function.body.extend(emitter.finish(&function.expressions)); handle }; function.body.push( crate::Statement::Store { pointer: function .expressions .append(crate::Expression::GlobalVariable(lvar.handle), span), value: load_expr, }, span, ); let mut arg = arg.clone(); if ep.stage == crate::ShaderStage::Fragment { if let Some(ref mut binding) = arg.binding { binding.apply_default_interpolation(&module.types[arg.ty].inner); } } function.arguments.push(arg); } } // 2. call the wrapped function let fake_id = !(module.entry_points.len() as u32); // doesn't matter, as long as it's not a collision let dummy_handle = self.add_call(fake_id, fun_id); function.body.push( crate::Statement::Call { function: dummy_handle, arguments: Vec::new(), result: None, }, crate::Span::default(), ); // 3. copy the outputs from privates to the result let mut members = Vec::new(); let mut components = Vec::new(); for &v_id in ep.variable_ids.iter() { let lvar = self.lookup_variable.lookup(v_id)?; if let super::Variable::Output(ref result) = lvar.inner { let span = module.global_variables.get_span(lvar.handle); let expr_handle = function .expressions .append(crate::Expression::GlobalVariable(lvar.handle), span); match module.types[result.ty].inner { crate::TypeInner::Struct { members: ref sub_members, .. } => { for (index, sm) in sub_members.iter().enumerate() { match sm.binding { Some(crate::Binding::BuiltIn(built_in)) => { // Cull unused builtins to preserve performances if !self.builtin_usage.contains(&built_in) { continue; } } // unrecognized binding, skip None => continue, _ => {} } members.push(sm.clone()); components.push(function.expressions.append( crate::Expression::AccessIndex { base: expr_handle, index: index as u32, }, span, )); } } _ => { members.push(crate::StructMember { name: None, ty: result.ty, binding: result.binding.clone(), offset: 0, }); // populate just the globals first, then do `Load` in a // separate step, so that we can get a range. components.push(expr_handle); } } } } for (member_index, member) in members.iter().enumerate() { match member.binding { Some(crate::Binding::BuiltIn(crate::BuiltIn::Position { .. })) if self.options.adjust_coordinate_space => { let mut emitter = Emitter::default(); emitter.start(&function.expressions); let global_expr = components[member_index]; let span = function.expressions.get_span(global_expr); let access_expr = function.expressions.append( crate::Expression::AccessIndex { base: global_expr, index: 1, }, span, ); let load_expr = function.expressions.append( crate::Expression::Load { pointer: access_expr, }, span, ); let neg_expr = function.expressions.append( crate::Expression::Unary { op: crate::UnaryOperator::Negate, expr: load_expr, }, span, ); function.body.extend(emitter.finish(&function.expressions)); function.body.push( crate::Statement::Store { pointer: access_expr, value: neg_expr, }, span, ); } _ => {} } } let mut emitter = Emitter::default(); emitter.start(&function.expressions); for component in components.iter_mut() { let load_expr = crate::Expression::Load { pointer: *component, }; let span = function.expressions.get_span(*component); *component = function.expressions.append(load_expr, span); } match members[..] { [] => {} [ref member] => { function.body.extend(emitter.finish(&function.expressions)); let span = function.expressions.get_span(components[0]); function.body.push( crate::Statement::Return { value: components.first().cloned(), }, span, ); function.result = Some(crate::FunctionResult { ty: member.ty, binding: member.binding.clone(), }); } _ => { let span = crate::Span::total_span( components.iter().map(|h| function.expressions.get_span(*h)), ); let ty = module.types.insert( crate::Type { name: None, inner: crate::TypeInner::Struct { members, span: 0xFFFF, // shouldn't matter }, }, span, ); let result_expr = function .expressions .append(crate::Expression::Compose { ty, components }, span); function.body.extend(emitter.finish(&function.expressions)); function.body.push( crate::Statement::Return { value: Some(result_expr), }, span, ); function.result = Some(crate::FunctionResult { ty, binding: None }); } } module.entry_points.push(crate::EntryPoint { name: ep.name, stage: ep.stage, early_depth_test: ep.early_depth_test, workgroup_size: ep.workgroup_size, function, }); } Ok(()) } } impl<'function> BlockContext<'function> { /// Consumes the `BlockContext` producing a Ir [`Block`](crate::Block) fn lower(mut self) -> crate::Block { fn lower_impl( blocks: &mut crate::FastHashMap, bodies: &[super::Body], body_idx: BodyIndex, ) -> crate::Block { let mut block = crate::Block::new(); for item in bodies[body_idx].data.iter() { match *item { super::BodyFragment::BlockId(id) => block.append(blocks.get_mut(&id).unwrap()), super::BodyFragment::If { condition, accept, reject, } => { let accept = lower_impl(blocks, bodies, accept); let reject = lower_impl(blocks, bodies, reject); block.push( crate::Statement::If { condition, accept, reject, }, crate::Span::default(), ) } super::BodyFragment::Loop { body, continuing } => { let body = lower_impl(blocks, bodies, body); let continuing = lower_impl(blocks, bodies, continuing); block.push( crate::Statement::Loop { body, continuing, break_if: None, }, crate::Span::default(), ) } super::BodyFragment::Switch { selector, ref cases, default, } => { let mut ir_cases: Vec<_> = cases .iter() .map(|&(value, body_idx)| { let body = lower_impl(blocks, bodies, body_idx); // Handle simple cases that would make a fallthrough statement unreachable code let fall_through = body.last().map_or(true, |s| !s.is_terminator()); crate::SwitchCase { value: crate::SwitchValue::Integer(value), body, fall_through, } }) .collect(); ir_cases.push(crate::SwitchCase { value: crate::SwitchValue::Default, body: lower_impl(blocks, bodies, default), fall_through: false, }); block.push( crate::Statement::Switch { selector, cases: ir_cases, }, crate::Span::default(), ) } super::BodyFragment::Break => { block.push(crate::Statement::Break, crate::Span::default()) } super::BodyFragment::Continue => { block.push(crate::Statement::Continue, crate::Span::default()) } } } block } lower_impl(&mut self.blocks, &self.bodies, 0) } } ================================================ FILE: lib/naga/src/front/spv/image.rs ================================================ use crate::arena::{Arena, Handle, UniqueArena}; use super::{Error, LookupExpression, LookupHelper as _}; #[derive(Clone, Debug)] pub(super) struct LookupSampledImage { image: Handle, sampler: Handle, } bitflags::bitflags! { /// Flags describing sampling method. pub struct SamplingFlags: u32 { /// Regular sampling. const REGULAR = 0x1; /// Comparison sampling. const COMPARISON = 0x2; } } impl<'function> super::BlockContext<'function> { fn get_image_expr_ty( &self, handle: Handle, ) -> Result, Error> { match self.expressions[handle] { crate::Expression::GlobalVariable(handle) => Ok(self.global_arena[handle].ty), crate::Expression::FunctionArgument(i) => Ok(self.arguments[i as usize].ty), ref other => Err(Error::InvalidImageExpression(other.clone())), } } } /// Options of a sampling operation. #[derive(Debug)] pub struct SamplingOptions { /// Projection sampling: the division by W is expected to happen /// in the texture unit. pub project: bool, /// Depth comparison sampling with a reference value. pub compare: bool, } enum ExtraCoordinate { ArrayLayer, Projection, Garbage, } /// Return the texture coordinates separated from the array layer, /// and/or divided by the projection term. /// /// The Proj sampling ops expect an extra coordinate for the W. /// The arrayed (can't be Proj!) images expect an extra coordinate for the layer. fn extract_image_coordinates( image_dim: crate::ImageDimension, extra_coordinate: ExtraCoordinate, base: Handle, coordinate_ty: Handle, ctx: &mut super::BlockContext, ) -> (Handle, Option>) { let (given_size, kind) = match ctx.type_arena[coordinate_ty].inner { crate::TypeInner::Scalar { kind, .. } => (None, kind), crate::TypeInner::Vector { size, kind, .. } => (Some(size), kind), ref other => unreachable!("Unexpected texture coordinate {:?}", other), }; let required_size = image_dim.required_coordinate_size(); let required_ty = required_size.map(|size| { ctx.type_arena .get(&crate::Type { name: None, inner: crate::TypeInner::Vector { size, kind, width: 4, }, }) .expect("Required coordinate type should have been set up by `parse_type_image`!") }); let extra_expr = crate::Expression::AccessIndex { base, index: required_size.map_or(1, |size| size as u32), }; let base_span = ctx.expressions.get_span(base); match extra_coordinate { ExtraCoordinate::ArrayLayer => { let extracted = match required_size { None => ctx .expressions .append(crate::Expression::AccessIndex { base, index: 0 }, base_span), Some(size) => { let mut components = Vec::with_capacity(size as usize); for index in 0..size as u32 { let comp = ctx .expressions .append(crate::Expression::AccessIndex { base, index }, base_span); components.push(comp); } ctx.expressions.append( crate::Expression::Compose { ty: required_ty.unwrap(), components, }, base_span, ) } }; let array_index_f32 = ctx.expressions.append(extra_expr, base_span); let array_index = ctx.expressions.append( crate::Expression::As { kind: crate::ScalarKind::Sint, expr: array_index_f32, convert: Some(4), }, base_span, ); (extracted, Some(array_index)) } ExtraCoordinate::Projection => { let projection = ctx.expressions.append(extra_expr, base_span); let divided = match required_size { None => { let temp = ctx .expressions .append(crate::Expression::AccessIndex { base, index: 0 }, base_span); ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Divide, left: temp, right: projection, }, base_span, ) } Some(size) => { let mut components = Vec::with_capacity(size as usize); for index in 0..size as u32 { let temp = ctx .expressions .append(crate::Expression::AccessIndex { base, index }, base_span); let comp = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Divide, left: temp, right: projection, }, base_span, ); components.push(comp); } ctx.expressions.append( crate::Expression::Compose { ty: required_ty.unwrap(), components, }, base_span, ) } }; (divided, None) } ExtraCoordinate::Garbage if given_size == required_size => (base, None), ExtraCoordinate::Garbage => { use crate::SwizzleComponent as Sc; let cut_expr = match required_size { None => crate::Expression::AccessIndex { base, index: 0 }, Some(size) => crate::Expression::Swizzle { size, vector: base, pattern: [Sc::X, Sc::Y, Sc::Z, Sc::W], }, }; (ctx.expressions.append(cut_expr, base_span), None) } } } pub(super) fn patch_comparison_type( flags: SamplingFlags, var: &mut crate::GlobalVariable, arena: &mut UniqueArena, ) -> bool { if !flags.contains(SamplingFlags::COMPARISON) { return true; } if flags == SamplingFlags::all() { return false; } log::debug!("Flipping comparison for {:?}", var); let original_ty = &arena[var.ty]; let original_ty_span = arena.get_span(var.ty); let ty_inner = match original_ty.inner { crate::TypeInner::Image { class: crate::ImageClass::Sampled { multi, .. }, dim, arrayed, } => crate::TypeInner::Image { class: crate::ImageClass::Depth { multi }, dim, arrayed, }, crate::TypeInner::Sampler { .. } => crate::TypeInner::Sampler { comparison: true }, ref other => unreachable!("Unexpected type for comparison mutation: {:?}", other), }; let name = original_ty.name.clone(); var.ty = arena.insert( crate::Type { name, inner: ty_inner, }, original_ty_span, ); true } impl> super::Parser { pub(super) fn parse_image_couple(&mut self) -> Result<(), Error> { let _result_type_id = self.next()?; let result_id = self.next()?; let image_id = self.next()?; let sampler_id = self.next()?; let image_lexp = self.lookup_expression.lookup(image_id)?; let sampler_lexp = self.lookup_expression.lookup(sampler_id)?; self.lookup_sampled_image.insert( result_id, LookupSampledImage { image: image_lexp.handle, sampler: sampler_lexp.handle, }, ); Ok(()) } pub(super) fn parse_image_uncouple(&mut self, block_id: spirv::Word) -> Result<(), Error> { let result_type_id = self.next()?; let result_id = self.next()?; let sampled_image_id = self.next()?; self.lookup_expression.insert( result_id, LookupExpression { handle: self.lookup_sampled_image.lookup(sampled_image_id)?.image, type_id: result_type_id, block_id, }, ); Ok(()) } pub(super) fn parse_image_write( &mut self, words_left: u16, ctx: &mut super::BlockContext, emitter: &mut crate::front::Emitter, block: &mut crate::Block, body_idx: usize, ) -> Result { let image_id = self.next()?; let coordinate_id = self.next()?; let value_id = self.next()?; let image_ops = if words_left != 0 { self.next()? } else { 0 }; if image_ops != 0 { let other = spirv::ImageOperands::from_bits_truncate(image_ops); log::warn!("Unknown image write ops {:?}", other); for _ in 1..words_left { self.next()?; } } let image_lexp = self.lookup_expression.lookup(image_id)?; let image_ty = ctx.get_image_expr_ty(image_lexp.handle)?; let coord_lexp = self.lookup_expression.lookup(coordinate_id)?; let coord_handle = self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx); let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle; let (coordinate, array_index) = match ctx.type_arena[image_ty].inner { crate::TypeInner::Image { dim, arrayed, class: _, } => extract_image_coordinates( dim, if arrayed { ExtraCoordinate::ArrayLayer } else { ExtraCoordinate::Garbage }, coord_handle, coord_type_handle, ctx, ), _ => return Err(Error::InvalidImage(image_ty)), }; let value_lexp = self.lookup_expression.lookup(value_id)?; let value = self.get_expr_handle(value_id, value_lexp, ctx, emitter, block, body_idx); Ok(crate::Statement::ImageStore { image: image_lexp.handle, coordinate, array_index, value, }) } pub(super) fn parse_image_load( &mut self, mut words_left: u16, ctx: &mut super::BlockContext, emitter: &mut crate::front::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let image_id = self.next()?; let coordinate_id = self.next()?; let mut image_ops = if words_left != 0 { words_left -= 1; self.next()? } else { 0 }; let mut sample = None; let mut level = None; while image_ops != 0 { let bit = 1 << image_ops.trailing_zeros(); match spirv::ImageOperands::from_bits_truncate(bit) { spirv::ImageOperands::LOD => { let lod_expr = self.next()?; let lod_lexp = self.lookup_expression.lookup(lod_expr)?; let lod_handle = self.get_expr_handle(lod_expr, lod_lexp, ctx, emitter, block, body_idx); level = Some(lod_handle); words_left -= 1; } spirv::ImageOperands::SAMPLE => { let sample_expr = self.next()?; let sample_handle = self.lookup_expression.lookup(sample_expr)?.handle; sample = Some(sample_handle); words_left -= 1; } other => { log::warn!("Unknown image load op {:?}", other); for _ in 0..words_left { self.next()?; } break; } } image_ops ^= bit; } // No need to call get_expr_handle here since only globals/arguments are // allowed as images and they are always in the root scope let image_lexp = self.lookup_expression.lookup(image_id)?; let image_ty = ctx.get_image_expr_ty(image_lexp.handle)?; let coord_lexp = self.lookup_expression.lookup(coordinate_id)?; let coord_handle = self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx); let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle; let (coordinate, array_index) = match ctx.type_arena[image_ty].inner { crate::TypeInner::Image { dim, arrayed, class: _, } => extract_image_coordinates( dim, if arrayed { ExtraCoordinate::ArrayLayer } else { ExtraCoordinate::Garbage }, coord_handle, coord_type_handle, ctx, ), _ => return Err(Error::InvalidImage(image_ty)), }; let expr = crate::Expression::ImageLoad { image: image_lexp.handle, coordinate, array_index, sample, level, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } #[allow(clippy::too_many_arguments)] pub(super) fn parse_image_sample( &mut self, mut words_left: u16, options: SamplingOptions, ctx: &mut super::BlockContext, emitter: &mut crate::front::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let sampled_image_id = self.next()?; let coordinate_id = self.next()?; let dref_id = if options.compare { Some(self.next()?) } else { None }; let mut image_ops = if words_left != 0 { words_left -= 1; self.next()? } else { 0 }; let mut level = crate::SampleLevel::Auto; let mut offset = None; while image_ops != 0 { let bit = 1 << image_ops.trailing_zeros(); match spirv::ImageOperands::from_bits_truncate(bit) { spirv::ImageOperands::BIAS => { let bias_expr = self.next()?; let bias_lexp = self.lookup_expression.lookup(bias_expr)?; let bias_handle = self.get_expr_handle(bias_expr, bias_lexp, ctx, emitter, block, body_idx); level = crate::SampleLevel::Bias(bias_handle); words_left -= 1; } spirv::ImageOperands::LOD => { let lod_expr = self.next()?; let lod_lexp = self.lookup_expression.lookup(lod_expr)?; let lod_handle = self.get_expr_handle(lod_expr, lod_lexp, ctx, emitter, block, body_idx); level = if options.compare { log::debug!("Assuming {:?} is zero", lod_handle); crate::SampleLevel::Zero } else { crate::SampleLevel::Exact(lod_handle) }; words_left -= 1; } spirv::ImageOperands::GRAD => { let grad_x_expr = self.next()?; let grad_x_lexp = self.lookup_expression.lookup(grad_x_expr)?; let grad_x_handle = self.get_expr_handle( grad_x_expr, grad_x_lexp, ctx, emitter, block, body_idx, ); let grad_y_expr = self.next()?; let grad_y_lexp = self.lookup_expression.lookup(grad_y_expr)?; let grad_y_handle = self.get_expr_handle( grad_y_expr, grad_y_lexp, ctx, emitter, block, body_idx, ); level = if options.compare { log::debug!( "Assuming gradients {:?} and {:?} are not greater than 1", grad_x_handle, grad_y_handle ); crate::SampleLevel::Zero } else { crate::SampleLevel::Gradient { x: grad_x_handle, y: grad_y_handle, } }; words_left -= 2; } spirv::ImageOperands::CONST_OFFSET => { let offset_constant = self.next()?; let offset_handle = self.lookup_constant.lookup(offset_constant)?.handle; offset = Some(offset_handle); words_left -= 1; } other => { log::warn!("Unknown image sample operand {:?}", other); for _ in 0..words_left { self.next()?; } break; } } image_ops ^= bit; } let si_lexp = self.lookup_sampled_image.lookup(sampled_image_id)?; let coord_lexp = self.lookup_expression.lookup(coordinate_id)?; let coord_handle = self.get_expr_handle(coordinate_id, coord_lexp, ctx, emitter, block, body_idx); let coord_type_handle = self.lookup_type.lookup(coord_lexp.type_id)?.handle; let sampling_bit = if options.compare { SamplingFlags::COMPARISON } else { SamplingFlags::REGULAR }; let image_ty = match ctx.expressions[si_lexp.image] { crate::Expression::GlobalVariable(handle) => { if let Some(flags) = self.handle_sampling.get_mut(&handle) { *flags |= sampling_bit; } ctx.global_arena[handle].ty } crate::Expression::FunctionArgument(i) => { ctx.parameter_sampling[i as usize] |= sampling_bit; ctx.arguments[i as usize].ty } ref other => return Err(Error::InvalidGlobalVar(other.clone())), }; match ctx.expressions[si_lexp.sampler] { crate::Expression::GlobalVariable(handle) => { *self.handle_sampling.get_mut(&handle).unwrap() |= sampling_bit } crate::Expression::FunctionArgument(i) => { ctx.parameter_sampling[i as usize] |= sampling_bit; } ref other => return Err(Error::InvalidGlobalVar(other.clone())), } let ((coordinate, array_index), depth_ref) = match ctx.type_arena[image_ty].inner { crate::TypeInner::Image { dim, arrayed, class: _, } => ( extract_image_coordinates( dim, if options.project { ExtraCoordinate::Projection } else if arrayed { ExtraCoordinate::ArrayLayer } else { ExtraCoordinate::Garbage }, coord_handle, coord_type_handle, ctx, ), { match dref_id { Some(id) => { let expr_lexp = self.lookup_expression.lookup(id)?; let mut expr = self.get_expr_handle(id, expr_lexp, ctx, emitter, block, body_idx); if options.project { let required_size = dim.required_coordinate_size(); let right = ctx.expressions.append( crate::Expression::AccessIndex { base: coord_handle, index: required_size.map_or(1, |size| size as u32), }, crate::Span::default(), ); expr = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Divide, left: expr, right, }, crate::Span::default(), ) }; Some(expr) } None => None, } }, ), _ => return Err(Error::InvalidImage(image_ty)), }; let expr = crate::Expression::ImageSample { image: si_lexp.image, sampler: si_lexp.sampler, gather: None, //TODO coordinate, array_index, offset, level, depth_ref, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } pub(super) fn parse_image_query_size( &mut self, at_level: bool, ctx: &mut super::BlockContext, emitter: &mut crate::front::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let image_id = self.next()?; let level = if at_level { let level_id = self.next()?; let level_lexp = self.lookup_expression.lookup(level_id)?; Some(self.get_expr_handle(level_id, level_lexp, ctx, emitter, block, body_idx)) } else { None }; // No need to call get_expr_handle here since only globals/arguments are // allowed as images and they are always in the root scope //TODO: handle arrays and cubes let image_lexp = self.lookup_expression.lookup(image_id)?; let expr = crate::Expression::ImageQuery { image: image_lexp.handle, query: crate::ImageQuery::Size { level }, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } pub(super) fn parse_image_query_other( &mut self, query: crate::ImageQuery, expressions: &mut Arena, block_id: spirv::Word, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let image_id = self.next()?; // No need to call get_expr_handle here since only globals/arguments are // allowed as images and they are always in the root scope let image_lexp = self.lookup_expression.lookup(image_id)?.clone(); let expr = crate::Expression::ImageQuery { image: image_lexp.handle, query, }; self.lookup_expression.insert( result_id, LookupExpression { handle: expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } } ================================================ FILE: lib/naga/src/front/spv/mod.rs ================================================ /*! Frontend for [SPIR-V][spv] (Standard Portable Intermediate Representation). ## ID lookups Our IR links to everything with `Handle`, while SPIR-V uses IDs. In order to keep track of the associations, the parser has many lookup tables. There map `spv::Word` into a specific IR handle, plus potentially a bit of extra info, such as the related SPIR-V type ID. TODO: would be nice to find ways that avoid looking up as much ## Inputs/Outputs We create a private variable for each input/output. The relevant inputs are populated at the start of an entry point. The outputs are saved at the end. The function associated with an entry point is wrapped in another function, such that we can handle any `Return` statements without problems. ## Row-major matrices We don't handle them natively, since the IR only expects column majority. Instead, we detect when such matrix is accessed in the `OpAccessChain`, and we generate a parallel expression that loads the value, but transposed. This value then gets used instead of `OpLoad` result later on. [spv]: https://www.khronos.org/registry/SPIR-V/ */ mod convert; mod error; mod function; mod image; mod null; use convert::*; pub use error::Error; use function::*; use crate::{ arena::{Arena, Handle, UniqueArena}, proc::{Alignment, Layouter}, FastHashMap, FastHashSet, }; use num_traits::cast::FromPrimitive; use petgraph::graphmap::GraphMap; use std::{convert::TryInto, mem, num::NonZeroU32, path::PathBuf}; pub const SUPPORTED_CAPABILITIES: &[spirv::Capability] = &[ spirv::Capability::Shader, spirv::Capability::VulkanMemoryModel, spirv::Capability::ClipDistance, spirv::Capability::CullDistance, spirv::Capability::SampleRateShading, spirv::Capability::DerivativeControl, spirv::Capability::InterpolationFunction, spirv::Capability::Matrix, spirv::Capability::ImageQuery, spirv::Capability::Sampled1D, spirv::Capability::Image1D, spirv::Capability::SampledCubeArray, spirv::Capability::ImageCubeArray, spirv::Capability::ImageMSArray, spirv::Capability::StorageImageExtendedFormats, spirv::Capability::Sampled1D, spirv::Capability::SampledCubeArray, spirv::Capability::Int8, spirv::Capability::Int16, spirv::Capability::Int64, spirv::Capability::Float16, spirv::Capability::Float64, spirv::Capability::Geometry, spirv::Capability::MultiView, // tricky ones spirv::Capability::UniformBufferArrayDynamicIndexing, spirv::Capability::StorageBufferArrayDynamicIndexing, ]; pub const SUPPORTED_EXTENSIONS: &[&str] = &[ "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_vulkan_memory_model", "SPV_KHR_multiview", ]; pub const SUPPORTED_EXT_SETS: &[&str] = &["GLSL.std.450"]; #[derive(Copy, Clone)] pub struct Instruction { op: spirv::Op, wc: u16, } impl Instruction { const fn expect(self, count: u16) -> Result<(), Error> { if self.wc == count { Ok(()) } else { Err(Error::InvalidOperandCount(self.op, self.wc)) } } fn expect_at_least(self, count: u16) -> Result { self.wc .checked_sub(count) .ok_or(Error::InvalidOperandCount(self.op, self.wc)) } } impl crate::TypeInner { const fn can_comparison_sample(&self) -> bool { match *self { crate::TypeInner::Image { class: crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: false, }, .. } => true, crate::TypeInner::Sampler { .. } => true, _ => false, } } } #[derive(Clone, Copy, Debug, PartialEq, PartialOrd)] pub enum ModuleState { Empty, Capability, Extension, ExtInstImport, MemoryModel, EntryPoint, ExecutionMode, Source, Name, ModuleProcessed, Annotation, Type, Function, } trait LookupHelper { type Target; fn lookup(&self, key: spirv::Word) -> Result<&Self::Target, Error>; } impl LookupHelper for FastHashMap { type Target = T; fn lookup(&self, key: spirv::Word) -> Result<&T, Error> { self.get(&key).ok_or(Error::InvalidId(key)) } } impl crate::ImageDimension { const fn required_coordinate_size(&self) -> Option { match *self { crate::ImageDimension::D1 => None, crate::ImageDimension::D2 => Some(crate::VectorSize::Bi), crate::ImageDimension::D3 => Some(crate::VectorSize::Tri), crate::ImageDimension::Cube => Some(crate::VectorSize::Tri), } } } type MemberIndex = u32; bitflags::bitflags! { #[derive(Default)] struct DecorationFlags: u32 { const NON_READABLE = 0x1; const NON_WRITABLE = 0x2; } } impl DecorationFlags { fn to_storage_access(self) -> crate::StorageAccess { let mut access = crate::StorageAccess::all(); if self.contains(DecorationFlags::NON_READABLE) { access &= !crate::StorageAccess::LOAD; } if self.contains(DecorationFlags::NON_WRITABLE) { access &= !crate::StorageAccess::STORE; } access } } #[derive(Debug, PartialEq)] enum Majority { Column, Row, } #[derive(Debug, Default)] struct Decoration { name: Option, built_in: Option, location: Option, desc_set: Option, desc_index: Option, specialization: Option, storage_buffer: bool, offset: Option, array_stride: Option, matrix_stride: Option, matrix_major: Option, invariant: bool, interpolation: Option, sampling: Option, flags: DecorationFlags, } impl Decoration { fn debug_name(&self) -> &str { match self.name { Some(ref name) => name.as_str(), None => "?", } } const fn resource_binding(&self) -> Option { match *self { Decoration { desc_set: Some(group), desc_index: Some(binding), .. } => Some(crate::ResourceBinding { group, binding }), _ => None, } } fn io_binding(&self) -> Result { match *self { Decoration { built_in: Some(built_in), location: None, invariant, .. } => Ok(crate::Binding::BuiltIn(map_builtin(built_in, invariant)?)), Decoration { built_in: None, location: Some(location), interpolation, sampling, .. } => Ok(crate::Binding::Location { location, interpolation, sampling, }), _ => Err(Error::MissingDecoration(spirv::Decoration::Location)), } } } #[derive(Debug)] struct LookupFunctionType { parameter_type_ids: Vec, return_type_id: spirv::Word, } struct LookupFunction { handle: Handle, parameters_sampling: Vec, } #[derive(Debug)] struct EntryPoint { stage: crate::ShaderStage, name: String, early_depth_test: Option, workgroup_size: [u32; 3], variable_ids: Vec, } #[derive(Clone, Debug)] struct LookupType { handle: Handle, base_id: Option, } #[derive(Debug)] struct LookupConstant { handle: Handle, type_id: spirv::Word, } #[derive(Debug)] enum Variable { Global, Input(crate::FunctionArgument), Output(crate::FunctionResult), } #[derive(Debug)] struct LookupVariable { inner: Variable, handle: Handle, type_id: spirv::Word, } /// Information about SPIR-V result ids, stored in `Parser::lookup_expression`. #[derive(Clone, Debug)] struct LookupExpression { /// The `Expression` constructed for this result. /// /// Note that, while a SPIR-V result id can be used in any block dominated /// by its definition, a Naga `Expression` is only in scope for the rest of /// its subtree. `Parser::get_expr_handle` takes care of spilling the result /// to a `LocalVariable` which can then be used anywhere. handle: Handle, /// The SPIR-V type of this result. type_id: spirv::Word, /// The label id of the block that defines this expression. /// /// This is zero for globals, constants, and function parameters, since they /// originate outside any function's block. block_id: spirv::Word, } #[derive(Debug)] struct LookupMember { type_id: spirv::Word, // This is true for either matrices, or arrays of matrices (yikes). row_major: bool, } #[derive(Clone, Debug)] enum LookupLoadOverride { /// For arrays of matrices, we track them but not loading yet. Pending, /// For matrices, vectors, and scalars, we pre-load the data. Loaded(Handle), } #[derive(PartialEq)] enum ExtendedClass { Global(crate::AddressSpace), Input, Output, } #[derive(Clone, Debug)] pub struct Options { /// The IR coordinate space matches all the APIs except SPIR-V, /// so by default we flip the Y coordinate of the `BuiltIn::Position`. /// This flag can be used to avoid this. pub adjust_coordinate_space: bool, /// Only allow shaders with the known set of capabilities. pub strict_capabilities: bool, pub block_ctx_dump_prefix: Option, } impl Default for Options { fn default() -> Self { Options { adjust_coordinate_space: true, strict_capabilities: false, block_ctx_dump_prefix: None, } } } /// An index into the `BlockContext::bodies` table. type BodyIndex = usize; /// An intermediate representation of a Naga [`Statement`]. /// /// `Body` and `BodyFragment` values form a tree: the `BodyIndex` fields of the /// variants are indices of the child `Body` values in [`BlockContext::bodies`]. /// The `lower` function assembles the final `Statement` tree from this `Body` /// tree. See [`BlockContext`] for details. /// /// [`Statement`]: crate::Statement #[derive(Debug)] enum BodyFragment { BlockId(spirv::Word), If { condition: Handle, accept: BodyIndex, reject: BodyIndex, }, Loop { body: BodyIndex, continuing: BodyIndex, }, Switch { selector: Handle, cases: Vec<(i32, BodyIndex)>, default: BodyIndex, }, Break, Continue, } /// An intermediate representation of a Naga [`Block`]. /// /// This will be assembled into a `Block` once we've added spills for phi nodes /// and out-of-scope expressions. See [`BlockContext`] for details. /// /// [`Block`]: crate::Block #[derive(Debug)] struct Body { /// The index of the direct parent of this body parent: usize, data: Vec, } impl Body { /// Creates a new empty `Body` with the specified `parent` pub const fn with_parent(parent: usize) -> Self { Body { parent, data: Vec::new(), } } } #[derive(Debug)] struct PhiExpression { /// The local variable used for the phi node local: Handle, /// List of (expression, block) expressions: Vec<(spirv::Word, spirv::Word)>, } #[derive(Debug)] enum MergeBlockInformation { LoopMerge, LoopContinue, SelectionMerge, SwitchMerge, } /// Fragments of Naga IR, to be assembled into `Statements` once data flow is /// resolved. /// /// We can't build a Naga `Statement` tree directly from SPIR-V blocks for two /// main reasons: /// /// - A SPIR-V expression can be used in any SPIR-V block dominated by its /// definition, whereas Naga expressions are scoped to the rest of their /// subtree. This means that discovering an expression use later in the /// function retroactively requires us to have spilled that expression into a /// local variable back before we left its scope. /// /// - We translate SPIR-V OpPhi expressions as Naga local variables in which we /// store the appropriate value before jumping to the OpPhi's block. /// /// Both cases require us to go back and amend previously generated Naga IR /// based on things we discover later. But modifying old blocks in arbitrary /// spots in a `Statement` tree is awkward. /// /// Instead, as we iterate through the function's body, we accumulate /// control-flow-free fragments of Naga IR in the [`blocks`] table, while /// building a skeleton of the Naga `Statement` tree in [`bodies`]. We note any /// spills and temporaries we must introduce in [`phis`]. /// /// Finally, once we've processed the entire function, we add temporaries and /// spills to the fragmentary `Blocks` as directed by `phis`, and assemble them /// into the final Naga `Statement` tree as directed by `bodies`. /// /// [`blocks`]: BlockContext::blocks /// [`bodies`]: BlockContext::bodies /// [`phis`]: BlockContext::phis /// [`lower`]: function::lower #[derive(Debug)] struct BlockContext<'function> { /// Phi nodes encountered when parsing the function, used to generate spills /// to local variables. phis: Vec, /// Fragments of control-flow-free Naga IR. /// /// These will be stitched together into a proper `Statement` tree according /// to `bodies`, once parsing is complete. blocks: FastHashMap, /// Map from block label ids to the index of the corresponding `Body` in /// `bodies`. body_for_label: FastHashMap, /// SPIR-V metadata about merge/continue blocks. mergers: FastHashMap, /// A table of `Body` values, each representing a block in the final IR. bodies: Vec, /// Id of the function currently being processed function_id: spirv::Word, /// Expression arena of the function currently being processed expressions: &'function mut Arena, /// Local variables arena of the function currently being processed local_arena: &'function mut Arena, /// Constants arena of the module being processed const_arena: &'function mut Arena, /// Type arena of the module being processed type_arena: &'function UniqueArena, /// Global arena of the module being processed global_arena: &'function Arena, /// Arguments of the function currently being processed arguments: &'function [crate::FunctionArgument], /// Metadata about the usage of function parameters as sampling objects parameter_sampling: &'function mut [image::SamplingFlags], } enum SignAnchor { Result, Operand, } pub struct Parser { data: I, data_offset: usize, state: ModuleState, layouter: Layouter, temp_bytes: Vec, ext_glsl_id: Option, future_decor: FastHashMap, future_member_decor: FastHashMap<(spirv::Word, MemberIndex), Decoration>, lookup_member: FastHashMap<(Handle, MemberIndex), LookupMember>, handle_sampling: FastHashMap, image::SamplingFlags>, lookup_type: FastHashMap, lookup_void_type: Option, lookup_storage_buffer_types: FastHashMap, crate::StorageAccess>, // Lookup for samplers and sampled images, storing flags on how they are used. lookup_constant: FastHashMap, lookup_variable: FastHashMap, lookup_expression: FastHashMap, // Load overrides are used to work around row-major matrices lookup_load_override: FastHashMap, lookup_sampled_image: FastHashMap, lookup_function_type: FastHashMap, lookup_function: FastHashMap, lookup_entry_point: FastHashMap, //Note: each `OpFunctionCall` gets a single entry here, indexed by the // dummy `Handle` of the call site. deferred_function_calls: Vec, dummy_functions: Arena, // Graph of all function calls through the module. // It's used to sort the functions (as nodes) topologically, // so that in the IR any called function is already known. function_call_graph: GraphMap, options: Options, index_constants: Vec>, index_constant_expressions: Vec>, /// Maps for a switch from a case target to the respective body and associated literals that /// use that target block id. /// /// Used to preserve allocations between instruction parsing. switch_cases: indexmap::IndexMap< spirv::Word, (BodyIndex, Vec), std::hash::BuildHasherDefault, >, /// Tracks usage of builtins, used to cull unused builtins since they can /// have serious performance implications. builtin_usage: FastHashSet, } impl> Parser { pub fn new(data: I, options: &Options) -> Self { Parser { data, data_offset: 0, state: ModuleState::Empty, layouter: Layouter::default(), temp_bytes: Vec::new(), ext_glsl_id: None, future_decor: FastHashMap::default(), future_member_decor: FastHashMap::default(), handle_sampling: FastHashMap::default(), lookup_member: FastHashMap::default(), lookup_type: FastHashMap::default(), lookup_void_type: None, lookup_storage_buffer_types: FastHashMap::default(), lookup_constant: FastHashMap::default(), lookup_variable: FastHashMap::default(), lookup_expression: FastHashMap::default(), lookup_load_override: FastHashMap::default(), lookup_sampled_image: FastHashMap::default(), lookup_function_type: FastHashMap::default(), lookup_function: FastHashMap::default(), lookup_entry_point: FastHashMap::default(), deferred_function_calls: Vec::default(), dummy_functions: Arena::new(), function_call_graph: GraphMap::new(), options: options.clone(), index_constants: Vec::new(), index_constant_expressions: Vec::new(), switch_cases: indexmap::IndexMap::default(), builtin_usage: FastHashSet::default(), } } fn span_from(&self, from: usize) -> crate::Span { crate::Span::from(from..self.data_offset) } fn span_from_with_op(&self, from: usize) -> crate::Span { crate::Span::from((from - 4)..self.data_offset) } fn next(&mut self) -> Result { if let Some(res) = self.data.next() { self.data_offset += 4; Ok(res) } else { Err(Error::IncompleteData) } } fn next_inst(&mut self) -> Result { let word = self.next()?; let (wc, opcode) = ((word >> 16) as u16, (word & 0xffff) as u16); if wc == 0 { return Err(Error::InvalidWordCount); } let op = spirv::Op::from_u16(opcode).ok_or(Error::UnknownInstruction(opcode))?; Ok(Instruction { op, wc }) } fn next_string(&mut self, mut count: u16) -> Result<(String, u16), Error> { self.temp_bytes.clear(); loop { if count == 0 { return Err(Error::BadString); } count -= 1; let chars = self.next()?.to_le_bytes(); let pos = chars.iter().position(|&c| c == 0).unwrap_or(4); self.temp_bytes.extend_from_slice(&chars[..pos]); if pos < 4 { break; } } std::str::from_utf8(&self.temp_bytes) .map(|s| (s.to_owned(), count)) .map_err(|_| Error::BadString) } fn next_decoration( &mut self, inst: Instruction, base_words: u16, dec: &mut Decoration, ) -> Result<(), Error> { let raw = self.next()?; let dec_typed = spirv::Decoration::from_u32(raw).ok_or(Error::InvalidDecoration(raw))?; log::trace!("\t\t{}: {:?}", dec.debug_name(), dec_typed); match dec_typed { spirv::Decoration::BuiltIn => { inst.expect(base_words + 2)?; dec.built_in = Some(self.next()?); } spirv::Decoration::Location => { inst.expect(base_words + 2)?; dec.location = Some(self.next()?); } spirv::Decoration::DescriptorSet => { inst.expect(base_words + 2)?; dec.desc_set = Some(self.next()?); } spirv::Decoration::Binding => { inst.expect(base_words + 2)?; dec.desc_index = Some(self.next()?); } spirv::Decoration::BufferBlock => { dec.storage_buffer = true; } spirv::Decoration::Offset => { inst.expect(base_words + 2)?; dec.offset = Some(self.next()?); } spirv::Decoration::ArrayStride => { inst.expect(base_words + 2)?; dec.array_stride = NonZeroU32::new(self.next()?); } spirv::Decoration::MatrixStride => { inst.expect(base_words + 2)?; dec.matrix_stride = NonZeroU32::new(self.next()?); } spirv::Decoration::Invariant => { dec.invariant = true; } spirv::Decoration::NoPerspective => { dec.interpolation = Some(crate::Interpolation::Linear); } spirv::Decoration::Flat => { dec.interpolation = Some(crate::Interpolation::Flat); } spirv::Decoration::Centroid => { dec.sampling = Some(crate::Sampling::Centroid); } spirv::Decoration::Sample => { dec.sampling = Some(crate::Sampling::Sample); } spirv::Decoration::NonReadable => { dec.flags |= DecorationFlags::NON_READABLE; } spirv::Decoration::NonWritable => { dec.flags |= DecorationFlags::NON_WRITABLE; } spirv::Decoration::ColMajor => { dec.matrix_major = Some(Majority::Column); } spirv::Decoration::RowMajor => { dec.matrix_major = Some(Majority::Row); } spirv::Decoration::SpecId => { dec.specialization = Some(self.next()?); } other => { log::warn!("Unknown decoration {:?}", other); for _ in base_words + 1..inst.wc { let _var = self.next()?; } } } Ok(()) } /// Return the Naga `Expression` for a given SPIR-V result `id`. /// /// `lookup` must be the `LookupExpression` for `id`. /// /// SPIR-V result ids can be used by any block dominated by the id's /// definition, but Naga `Expressions` are only in scope for the remainder /// of their `Statement` subtree. This means that the `Expression` generated /// for `id` may no longer be in scope. In such cases, this function takes /// care of spilling the value of `id` to a `LocalVariable` which can then /// be used anywhere. The SPIR-V domination rule ensures that the /// `LocalVariable` has been initialized before it is used. /// /// The `body_idx` argument should be the index of the `Body` that hopes to /// use `id`'s `Expression`. fn get_expr_handle( &self, id: spirv::Word, lookup: &LookupExpression, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, body_idx: BodyIndex, ) -> Handle { // What `Body` was `id` defined in? let expr_body_idx = ctx .body_for_label .get(&lookup.block_id) .copied() .unwrap_or(0); // Don't need to do a load/store if the expression is in the main body // or if the expression is in the same body as where the query was // requested. The body_idx might actually not be the final one if a loop // or conditional occurs but in those cases we know that the new body // will be a subscope of the body that was passed so we can still reuse // the handle and not issue a load/store. if is_parent(body_idx, expr_body_idx, ctx) { lookup.handle } else { // Add a temporary variable of the same type which will be used to // store the original expression and used in the current block let ty = self.lookup_type[&lookup.type_id].handle; let local = ctx.local_arena.append( crate::LocalVariable { name: None, ty, init: None, }, crate::Span::default(), ); block.extend(emitter.finish(ctx.expressions)); let pointer = ctx.expressions.append( crate::Expression::LocalVariable(local), crate::Span::default(), ); emitter.start(ctx.expressions); let expr = ctx .expressions .append(crate::Expression::Load { pointer }, crate::Span::default()); // Add a slightly odd entry to the phi table, so that while `id`'s // `Expression` is still in scope, the usual phi processing will // spill its value to `local`, where we can find it later. // // This pretends that the block in which `id` is defined is the // predecessor of some other block with a phi in it that cites id as // one of its sources, and uses `local` as its variable. There is no // such phi, but nobody needs to know that. ctx.phis.push(PhiExpression { local, expressions: vec![(id, lookup.block_id)], }); expr } } fn parse_expr_unary_op( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::UnaryOperator, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p_id = self.next()?; let p_lexp = self.lookup_expression.lookup(p_id)?; let handle = self.get_expr_handle(p_id, p_lexp, ctx, emitter, block, body_idx); let expr = crate::Expression::Unary { op, expr: handle }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } fn parse_expr_binary_op( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::BinaryOperator, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx); let expr = crate::Expression::Binary { op, left, right }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } /// A more complicated version of the unary op, /// where we force the operand to have the same type as the result. fn parse_expr_unary_op_sign_adjusted( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::UnaryOperator, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let span = self.span_from_with_op(start); let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx); let result_lookup_ty = self.lookup_type.lookup(result_type_id)?; let kind = ctx.type_arena[result_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let expr = crate::Expression::Unary { op, expr: if p1_lexp.type_id == result_type_id { left } else { ctx.expressions.append( crate::Expression::As { expr: left, kind, convert: None, }, span, ) }, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); Ok(()) } /// A more complicated version of the binary op, /// where we force the operand to have the same type as the result. /// This is mostly needed for "i++" and "i--" coming from GLSL. #[allow(clippy::too_many_arguments)] fn parse_expr_binary_op_sign_adjusted( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::BinaryOperator, // For arithmetic operations, we need the sign of operands to match the result. // For boolean operations, however, the operands need to match the signs, but // result is always different - a boolean. anchor: SignAnchor, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let span = self.span_from_with_op(start); let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx); let expected_type_id = match anchor { SignAnchor::Result => result_type_id, SignAnchor::Operand => p1_lexp.type_id, }; let expected_lookup_ty = self.lookup_type.lookup(expected_type_id)?; let kind = ctx.type_arena[expected_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let expr = crate::Expression::Binary { op, left: if p1_lexp.type_id == expected_type_id { left } else { ctx.expressions.append( crate::Expression::As { expr: left, kind, convert: None, }, span, ) }, right: if p2_lexp.type_id == expected_type_id { right } else { ctx.expressions.append( crate::Expression::As { expr: right, kind, convert: None, }, span, ) }, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); Ok(()) } /// A version of the binary op where one or both of the arguments might need to be casted to a /// specific integer kind (unsigned or signed), used for operations like OpINotEqual or /// OpUGreaterThan. #[allow(clippy::too_many_arguments)] fn parse_expr_int_comparison( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::BinaryOperator, kind: crate::ScalarKind, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let span = self.span_from_with_op(start); let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx); let p1_lookup_ty = self.lookup_type.lookup(p1_lexp.type_id)?; let p1_kind = ctx.type_arena[p1_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let right = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx); let p2_lookup_ty = self.lookup_type.lookup(p2_lexp.type_id)?; let p2_kind = ctx.type_arena[p2_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let expr = crate::Expression::Binary { op, left: if p1_kind == kind { left } else { ctx.expressions.append( crate::Expression::As { expr: left, kind, convert: None, }, span, ) }, right: if p2_kind == kind { right } else { ctx.expressions.append( crate::Expression::As { expr: right, kind, convert: None, }, span, ) }, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); Ok(()) } fn parse_expr_shift_op( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, op: crate::BinaryOperator, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let span = self.span_from_with_op(start); let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle(p1_id, p1_lexp, ctx, emitter, block, body_idx); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let p2_handle = self.get_expr_handle(p2_id, p2_lexp, ctx, emitter, block, body_idx); // convert the shift to Uint let right = ctx.expressions.append( crate::Expression::As { expr: p2_handle, kind: crate::ScalarKind::Uint, convert: None, }, span, ); let expr = crate::Expression::Binary { op, left, right }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); Ok(()) } fn parse_expr_derivative( &mut self, ctx: &mut BlockContext, emitter: &mut super::Emitter, block: &mut crate::Block, block_id: spirv::Word, body_idx: usize, axis: crate::DerivativeAxis, ) -> Result<(), Error> { let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let arg_id = self.next()?; let arg_lexp = self.lookup_expression.lookup(arg_id)?; let arg_handle = self.get_expr_handle(arg_id, arg_lexp, ctx, emitter, block, body_idx); let expr = crate::Expression::Derivative { axis, expr: arg_handle, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, self.span_from_with_op(start)), type_id: result_type_id, block_id, }, ); Ok(()) } #[allow(clippy::too_many_arguments)] fn insert_composite( &self, root_expr: Handle, root_type_id: spirv::Word, object_expr: Handle, selections: &[spirv::Word], type_arena: &UniqueArena, expressions: &mut Arena, constants: &Arena, span: crate::Span, ) -> Result, Error> { let selection = match selections.first() { Some(&index) => index, None => return Ok(object_expr), }; let root_span = expressions.get_span(root_expr); let root_lookup = self.lookup_type.lookup(root_type_id)?; let (count, child_type_id) = match type_arena[root_lookup.handle].inner { crate::TypeInner::Struct { ref members, .. } => { let child_member = self .lookup_member .get(&(root_lookup.handle, selection)) .ok_or(Error::InvalidAccessType(root_type_id))?; (members.len(), child_member.type_id) } crate::TypeInner::Array { size, .. } => { let size = match size { crate::ArraySize::Constant(handle) => match constants[handle] { crate::Constant { specialization: Some(_), .. } => return Err(Error::UnsupportedType(root_lookup.handle)), ref unspecialized => unspecialized .to_array_length() .ok_or(Error::InvalidArraySize(handle))?, }, // A runtime sized array is not a composite type crate::ArraySize::Dynamic => { return Err(Error::InvalidAccessType(root_type_id)) } }; let child_type_id = root_lookup .base_id .ok_or(Error::InvalidAccessType(root_type_id))?; (size as usize, child_type_id) } crate::TypeInner::Vector { size, .. } | crate::TypeInner::Matrix { columns: size, .. } => { let child_type_id = root_lookup .base_id .ok_or(Error::InvalidAccessType(root_type_id))?; (size as usize, child_type_id) } _ => return Err(Error::InvalidAccessType(root_type_id)), }; let mut components = Vec::with_capacity(count); for index in 0..count as u32 { let expr = expressions.append( crate::Expression::AccessIndex { base: root_expr, index, }, if index == selection { span } else { root_span }, ); components.push(expr); } components[selection as usize] = self.insert_composite( components[selection as usize], child_type_id, object_expr, &selections[1..], type_arena, expressions, constants, span, )?; Ok(expressions.append( crate::Expression::Compose { ty: root_lookup.handle, components, }, span, )) } /// Add the next SPIR-V block's contents to `block_ctx`. /// /// Except for the function's entry block, `block_id` should be the label of /// a block we've seen mentioned before, with an entry in /// `block_ctx.body_for_label` to tell us which `Body` it contributes to. fn next_block(&mut self, block_id: spirv::Word, ctx: &mut BlockContext) -> Result<(), Error> { // Extend `body` with the correct form for a branch to `target`. fn merger(body: &mut Body, target: &MergeBlockInformation) { body.data.push(match *target { MergeBlockInformation::LoopContinue => BodyFragment::Continue, MergeBlockInformation::LoopMerge | MergeBlockInformation::SwitchMerge => { BodyFragment::Break } // Finishing a selection merge means just falling off the end of // the `accept` or `reject` block of the `If` statement. MergeBlockInformation::SelectionMerge => return, }) } let mut emitter = super::Emitter::default(); emitter.start(ctx.expressions); // Find the `Body` that this block belongs to. Index zero is the // function's root `Body`, corresponding to `Function::body`. let mut body_idx = *ctx.body_for_label.entry(block_id).or_default(); let mut block = crate::Block::new(); // Stores the merge block as defined by a `OpSelectionMerge` otherwise is `None` // // This is used in `OpSwitch` to promote the `MergeBlockInformation` from // `SelectionMerge` to `SwitchMerge` to allow `Break`s this isn't desirable for // `LoopMerge`s because otherwise `Continue`s wouldn't be allowed let mut selection_merge_block = None; macro_rules! get_expr_handle { ($id:expr, $lexp:expr) => { self.get_expr_handle($id, $lexp, ctx, &mut emitter, &mut block, body_idx) }; } macro_rules! parse_expr_op { ($op:expr, BINARY) => { self.parse_expr_binary_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op) }; ($op:expr, SHIFT) => { self.parse_expr_shift_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op) }; ($op:expr, UNARY) => { self.parse_expr_unary_op(ctx, &mut emitter, &mut block, block_id, body_idx, $op) }; ($axis:expr, DERIVATIVE) => { self.parse_expr_derivative(ctx, &mut emitter, &mut block, block_id, body_idx, $axis) }; } let terminator = loop { use spirv::Op; let start = self.data_offset; let inst = self.next_inst()?; let span = crate::Span::from(start..(start + 4 * (inst.wc as usize))); log::debug!("\t\t{:?} [{}]", inst.op, inst.wc); match inst.op { Op::Line => { inst.expect(4)?; let _file_id = self.next()?; let _row_id = self.next()?; let _col_id = self.next()?; } Op::NoLine => inst.expect(1)?, Op::Undef => { inst.expect(3)?; let (type_id, id, handle) = self.parse_null_constant(inst, ctx.type_arena, ctx.const_arena)?; self.lookup_expression.insert( id, LookupExpression { handle: ctx .expressions .append(crate::Expression::Constant(handle), span), type_id, block_id, }, ); } Op::Variable => { inst.expect_at_least(4)?; block.extend(emitter.finish(ctx.expressions)); let result_type_id = self.next()?; let result_id = self.next()?; let _storage_class = self.next()?; let init = if inst.wc > 4 { inst.expect(5)?; let init_id = self.next()?; let lconst = self.lookup_constant.lookup(init_id)?; Some(lconst.handle) } else { None }; let name = self .future_decor .remove(&result_id) .and_then(|decor| decor.name); if let Some(ref name) = name { log::debug!("\t\t\tid={} name={}", result_id, name); } let lookup_ty = self.lookup_type.lookup(result_type_id)?; let var_handle = ctx.local_arena.append( crate::LocalVariable { name, ty: match ctx.type_arena[lookup_ty.handle].inner { crate::TypeInner::Pointer { base, .. } => base, _ => lookup_ty.handle, }, init, }, span, ); self.lookup_expression.insert( result_id, LookupExpression { handle: ctx .expressions .append(crate::Expression::LocalVariable(var_handle), span), type_id: result_type_id, block_id, }, ); emitter.start(ctx.expressions); } Op::Phi => { inst.expect_at_least(3)?; block.extend(emitter.finish(ctx.expressions)); let result_type_id = self.next()?; let result_id = self.next()?; let name = format!("phi_{}", result_id); let local = ctx.local_arena.append( crate::LocalVariable { name: Some(name), ty: self.lookup_type.lookup(result_type_id)?.handle, init: None, }, self.span_from(start), ); let pointer = ctx .expressions .append(crate::Expression::LocalVariable(local), span); let in_count = (inst.wc - 3) / 2; let mut phi = PhiExpression { local, expressions: Vec::with_capacity(in_count as usize), }; for _ in 0..in_count { let expr = self.next()?; let block = self.next()?; phi.expressions.push((expr, block)); } ctx.phis.push(phi); emitter.start(ctx.expressions); // Associate the lookup with an actual value, which is emitted // into the current block. self.lookup_expression.insert( result_id, LookupExpression { handle: ctx .expressions .append(crate::Expression::Load { pointer }, span), type_id: result_type_id, block_id, }, ); } Op::AccessChain | Op::InBoundsAccessChain => { struct AccessExpression { base_handle: Handle, type_id: spirv::Word, load_override: Option, } inst.expect_at_least(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let base_id = self.next()?; log::trace!("\t\t\tlooking up expr {:?}", base_id); let mut acex = { // the base type has to be a pointer, // so we dereference it here for the traversal let lexp = self.lookup_expression.lookup(base_id)?; let lty = self.lookup_type.lookup(lexp.type_id)?; AccessExpression { base_handle: get_expr_handle!(base_id, lexp), type_id: lty.base_id.ok_or(Error::InvalidAccessType(lexp.type_id))?, load_override: self.lookup_load_override.get(&base_id).cloned(), } }; for _ in 4..inst.wc { let access_id = self.next()?; log::trace!("\t\t\tlooking up index expr {:?}", access_id); let index_expr = self.lookup_expression.lookup(access_id)?.clone(); let index_expr_handle = get_expr_handle!(access_id, &index_expr); let index_expr_data = &ctx.expressions[index_expr.handle]; let index_maybe = match *index_expr_data { crate::Expression::Constant(const_handle) => { Some(ctx.const_arena[const_handle].to_array_length().ok_or( Error::InvalidAccess(crate::Expression::Constant(const_handle)), )?) } _ => None, }; log::trace!("\t\t\tlooking up type {:?}", acex.type_id); let type_lookup = self.lookup_type.lookup(acex.type_id)?; acex = match ctx.type_arena[type_lookup.handle].inner { // can only index a struct with a constant crate::TypeInner::Struct { ref members, .. } => { let index = index_maybe .ok_or_else(|| Error::InvalidAccess(index_expr_data.clone()))?; let lookup_member = self .lookup_member .get(&(type_lookup.handle, index)) .ok_or(Error::InvalidAccessType(acex.type_id))?; let base_handle = ctx.expressions.append( crate::Expression::AccessIndex { base: acex.base_handle, index, }, span, ); if let Some(crate::Binding::BuiltIn(built_in)) = members[index as usize].binding { self.builtin_usage.insert(built_in); } AccessExpression { base_handle, type_id: lookup_member.type_id, load_override: if lookup_member.row_major { debug_assert!(acex.load_override.is_none()); let sub_type_lookup = self.lookup_type.lookup(lookup_member.type_id)?; Some(match ctx.type_arena[sub_type_lookup.handle].inner { // load it transposed, to match column major expectations crate::TypeInner::Matrix { .. } => { let loaded = ctx.expressions.append( crate::Expression::Load { pointer: base_handle, }, span, ); let transposed = ctx.expressions.append( crate::Expression::Math { fun: crate::MathFunction::Transpose, arg: loaded, arg1: None, arg2: None, arg3: None, }, span, ); LookupLoadOverride::Loaded(transposed) } _ => LookupLoadOverride::Pending, }) } else { None }, } } crate::TypeInner::Matrix { .. } => { let load_override = match acex.load_override { // We are indexing inside a row-major matrix Some(LookupLoadOverride::Loaded(load_expr)) => { let index = index_maybe.ok_or_else(|| { Error::InvalidAccess(index_expr_data.clone()) })?; let sub_handle = ctx.expressions.append( crate::Expression::AccessIndex { base: load_expr, index, }, span, ); Some(LookupLoadOverride::Loaded(sub_handle)) } _ => None, }; let sub_expr = match index_maybe { Some(index) => crate::Expression::AccessIndex { base: acex.base_handle, index, }, None => crate::Expression::Access { base: acex.base_handle, index: index_expr_handle, }, }; AccessExpression { base_handle: ctx.expressions.append(sub_expr, span), type_id: type_lookup .base_id .ok_or(Error::InvalidAccessType(acex.type_id))?, load_override, } } // This must be a vector or an array. _ => { let base_handle = ctx.expressions.append( crate::Expression::Access { base: acex.base_handle, index: index_expr_handle, }, span, ); let load_override = match acex.load_override { // If there is a load override in place, then we always end up // with a side-loaded value here. Some(lookup_load_override) => { let sub_expr = match lookup_load_override { // We must be indexing into the array of row-major matrices. // Let's load the result of indexing and transpose it. LookupLoadOverride::Pending => { let loaded = ctx.expressions.append( crate::Expression::Load { pointer: base_handle, }, span, ); ctx.expressions.append( crate::Expression::Math { fun: crate::MathFunction::Transpose, arg: loaded, arg1: None, arg2: None, arg3: None, }, span, ) } // We are indexing inside a row-major matrix. LookupLoadOverride::Loaded(load_expr) => { ctx.expressions.append( crate::Expression::Access { base: load_expr, index: index_expr_handle, }, span, ) } }; Some(LookupLoadOverride::Loaded(sub_expr)) } None => None, }; AccessExpression { base_handle, type_id: type_lookup .base_id .ok_or(Error::InvalidAccessType(acex.type_id))?, load_override, } } }; } if let Some(load_expr) = acex.load_override { self.lookup_load_override.insert(result_id, load_expr); } let lookup_expression = LookupExpression { handle: acex.base_handle, type_id: result_type_id, block_id, }; self.lookup_expression.insert(result_id, lookup_expression); } Op::VectorExtractDynamic => { inst.expect(5)?; let result_type_id = self.next()?; let id = self.next()?; let composite_id = self.next()?; let index_id = self.next()?; let root_lexp = self.lookup_expression.lookup(composite_id)?; let root_handle = get_expr_handle!(composite_id, root_lexp); let root_type_lookup = self.lookup_type.lookup(root_lexp.type_id)?; let index_lexp = self.lookup_expression.lookup(index_id)?; let index_handle = get_expr_handle!(index_id, index_lexp); let num_components = match ctx.type_arena[root_type_lookup.handle].inner { crate::TypeInner::Vector { size, .. } => size as usize, _ => return Err(Error::InvalidVectorType(root_type_lookup.handle)), }; let mut handle = ctx.expressions.append( crate::Expression::Access { base: root_handle, index: self.index_constant_expressions[0], }, span, ); for &index_expr in self.index_constant_expressions[1..num_components].iter() { let access_expr = ctx.expressions.append( crate::Expression::Access { base: root_handle, index: index_expr, }, span, ); let cond = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Equal, left: index_expr, right: index_handle, }, span, ); handle = ctx.expressions.append( crate::Expression::Select { condition: cond, accept: access_expr, reject: handle, }, span, ); } self.lookup_expression.insert( id, LookupExpression { handle, type_id: result_type_id, block_id, }, ); } Op::VectorInsertDynamic => { inst.expect(6)?; let result_type_id = self.next()?; let id = self.next()?; let composite_id = self.next()?; let object_id = self.next()?; let index_id = self.next()?; let object_lexp = self.lookup_expression.lookup(object_id)?; let object_handle = get_expr_handle!(object_id, object_lexp); let root_lexp = self.lookup_expression.lookup(composite_id)?; let root_handle = get_expr_handle!(composite_id, root_lexp); let root_type_lookup = self.lookup_type.lookup(root_lexp.type_id)?; let index_lexp = self.lookup_expression.lookup(index_id)?; let mut index_handle = get_expr_handle!(index_id, index_lexp); let index_type = self.lookup_type.lookup(index_lexp.type_id)?.handle; // SPIR-V allows signed and unsigned indices but naga's is strict about // types and since the `index_constants` are all signed integers, we need // to cast the index to a signed integer if it's unsigned. if let Some(crate::ScalarKind::Uint) = ctx.type_arena[index_type].inner.scalar_kind() { index_handle = ctx.expressions.append( crate::Expression::As { expr: index_handle, kind: crate::ScalarKind::Sint, convert: None, }, span, ) } let num_components = match ctx.type_arena[root_type_lookup.handle].inner { crate::TypeInner::Vector { size, .. } => size as usize, _ => return Err(Error::InvalidVectorType(root_type_lookup.handle)), }; let mut components = Vec::with_capacity(num_components); for &index_expr in self.index_constant_expressions[..num_components].iter() { let access_expr = ctx.expressions.append( crate::Expression::Access { base: root_handle, index: index_expr, }, span, ); let cond = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Equal, left: index_expr, right: index_handle, }, span, ); let handle = ctx.expressions.append( crate::Expression::Select { condition: cond, accept: object_handle, reject: access_expr, }, span, ); components.push(handle); } let handle = ctx.expressions.append( crate::Expression::Compose { ty: root_type_lookup.handle, components, }, span, ); self.lookup_expression.insert( id, LookupExpression { handle, type_id: result_type_id, block_id, }, ); } Op::CompositeExtract => { inst.expect_at_least(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let base_id = self.next()?; log::trace!("\t\t\tlooking up expr {:?}", base_id); let mut lexp = self.lookup_expression.lookup(base_id)?.clone(); lexp.handle = get_expr_handle!(base_id, &lexp); for _ in 4..inst.wc { let index = self.next()?; log::trace!("\t\t\tlooking up type {:?}", lexp.type_id); let type_lookup = self.lookup_type.lookup(lexp.type_id)?; let type_id = match ctx.type_arena[type_lookup.handle].inner { crate::TypeInner::Struct { .. } => { self.lookup_member .get(&(type_lookup.handle, index)) .ok_or(Error::InvalidAccessType(lexp.type_id))? .type_id } crate::TypeInner::Array { .. } | crate::TypeInner::Vector { .. } | crate::TypeInner::Matrix { .. } => type_lookup .base_id .ok_or(Error::InvalidAccessType(lexp.type_id))?, ref other => { log::warn!("composite type {:?}", other); return Err(Error::UnsupportedType(type_lookup.handle)); } }; lexp = LookupExpression { handle: ctx.expressions.append( crate::Expression::AccessIndex { base: lexp.handle, index, }, span, ), type_id, block_id, }; } self.lookup_expression.insert( result_id, LookupExpression { handle: lexp.handle, type_id: result_type_id, block_id, }, ); } Op::CompositeInsert => { inst.expect_at_least(5)?; let result_type_id = self.next()?; let id = self.next()?; let object_id = self.next()?; let composite_id = self.next()?; let mut selections = Vec::with_capacity(inst.wc as usize - 5); for _ in 5..inst.wc { selections.push(self.next()?); } let object_lexp = self.lookup_expression.lookup(object_id)?.clone(); let object_handle = get_expr_handle!(object_id, &object_lexp); let root_lexp = self.lookup_expression.lookup(composite_id)?.clone(); let root_handle = get_expr_handle!(composite_id, &root_lexp); let handle = self.insert_composite( root_handle, result_type_id, object_handle, &selections, ctx.type_arena, ctx.expressions, ctx.const_arena, span, )?; self.lookup_expression.insert( id, LookupExpression { handle, type_id: result_type_id, block_id, }, ); } Op::CompositeConstruct => { inst.expect_at_least(3)?; let result_type_id = self.next()?; let id = self.next()?; let mut components = Vec::with_capacity(inst.wc as usize - 2); for _ in 3..inst.wc { let comp_id = self.next()?; log::trace!("\t\t\tlooking up expr {:?}", comp_id); let lexp = self.lookup_expression.lookup(comp_id)?; let handle = get_expr_handle!(comp_id, lexp); components.push(handle); } let ty = self.lookup_type.lookup(result_type_id)?.handle; let first = components[0]; let expr = match ctx.type_arena[ty].inner { // this is an optimization to detect the splat crate::TypeInner::Vector { size, .. } if components.len() == size as usize && components[1..].iter().all(|&c| c == first) => { crate::Expression::Splat { size, value: first } } _ => crate::Expression::Compose { ty, components }, }; self.lookup_expression.insert( id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::Load => { inst.expect_at_least(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let pointer_id = self.next()?; if inst.wc != 4 { inst.expect(5)?; let _memory_access = self.next()?; } let base_lexp = self.lookup_expression.lookup(pointer_id)?; let base_handle = get_expr_handle!(pointer_id, base_lexp); let type_lookup = self.lookup_type.lookup(base_lexp.type_id)?; let handle = match ctx.type_arena[type_lookup.handle].inner { crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } => { base_handle } _ => match self.lookup_load_override.get(&pointer_id) { Some(&LookupLoadOverride::Loaded(handle)) => handle, //Note: we aren't handling `LookupLoadOverride::Pending` properly here _ => ctx.expressions.append( crate::Expression::Load { pointer: base_handle, }, span, ), }, }; self.lookup_expression.insert( result_id, LookupExpression { handle, type_id: result_type_id, block_id, }, ); } Op::Store => { inst.expect_at_least(3)?; let pointer_id = self.next()?; let value_id = self.next()?; if inst.wc != 3 { inst.expect(4)?; let _memory_access = self.next()?; } let base_expr = self.lookup_expression.lookup(pointer_id)?; let base_handle = get_expr_handle!(pointer_id, base_expr); let value_expr = self.lookup_expression.lookup(value_id)?; let value_handle = get_expr_handle!(value_id, value_expr); block.extend(emitter.finish(ctx.expressions)); block.push( crate::Statement::Store { pointer: base_handle, value: value_handle, }, span, ); emitter.start(ctx.expressions); } // Arithmetic Instructions +, -, *, /, % Op::SNegate | Op::FNegate => { inst.expect(4)?; self.parse_expr_unary_op_sign_adjusted( ctx, &mut emitter, &mut block, block_id, body_idx, crate::UnaryOperator::Negate, )?; } Op::IAdd | Op::ISub | Op::IMul | Op::BitwiseOr | Op::BitwiseXor | Op::BitwiseAnd | Op::SDiv | Op::SRem => { inst.expect(5)?; let operator = map_binary_operator(inst.op)?; self.parse_expr_binary_op_sign_adjusted( ctx, &mut emitter, &mut block, block_id, body_idx, operator, SignAnchor::Result, )?; } Op::IEqual | Op::INotEqual => { inst.expect(5)?; let operator = map_binary_operator(inst.op)?; self.parse_expr_binary_op_sign_adjusted( ctx, &mut emitter, &mut block, block_id, body_idx, operator, SignAnchor::Operand, )?; } Op::FAdd => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Add, BINARY)?; } Op::FSub => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Subtract, BINARY)?; } Op::FMul => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Multiply, BINARY)?; } Op::UDiv | Op::FDiv => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Divide, BINARY)?; } Op::UMod | Op::FRem => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Modulo, BINARY)?; } Op::SMod => { inst.expect(5)?; // x - y * int(floor(float(x) / float(y))) let start = self.data_offset; let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let span = self.span_from_with_op(start); let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle( p1_id, p1_lexp, ctx, &mut emitter, &mut block, body_idx, ); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let right = self.get_expr_handle( p2_id, p2_lexp, ctx, &mut emitter, &mut block, body_idx, ); let result_ty = self.lookup_type.lookup(result_type_id)?; let inner = &ctx.type_arena[result_ty.handle].inner; let kind = inner.scalar_kind().unwrap(); let size = inner.size(ctx.const_arena) as u8; let left_cast = ctx.expressions.append( crate::Expression::As { expr: left, kind: crate::ScalarKind::Float, convert: Some(size), }, span, ); let right_cast = ctx.expressions.append( crate::Expression::As { expr: right, kind: crate::ScalarKind::Float, convert: Some(size), }, span, ); let div = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Divide, left: left_cast, right: right_cast, }, span, ); let floor = ctx.expressions.append( crate::Expression::Math { fun: crate::MathFunction::Floor, arg: div, arg1: None, arg2: None, arg3: None, }, span, ); let cast = ctx.expressions.append( crate::Expression::As { expr: floor, kind, convert: Some(size), }, span, ); let mult = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Multiply, left: cast, right, }, span, ); let sub = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Subtract, left, right: mult, }, span, ); self.lookup_expression.insert( result_id, LookupExpression { handle: sub, type_id: result_type_id, block_id, }, ); } Op::FMod => { inst.expect(5)?; // x - y * floor(x / y) let start = self.data_offset; let span = self.span_from_with_op(start); let result_type_id = self.next()?; let result_id = self.next()?; let p1_id = self.next()?; let p2_id = self.next()?; let p1_lexp = self.lookup_expression.lookup(p1_id)?; let left = self.get_expr_handle( p1_id, p1_lexp, ctx, &mut emitter, &mut block, body_idx, ); let p2_lexp = self.lookup_expression.lookup(p2_id)?; let right = self.get_expr_handle( p2_id, p2_lexp, ctx, &mut emitter, &mut block, body_idx, ); let div = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Divide, left, right, }, span, ); let floor = ctx.expressions.append( crate::Expression::Math { fun: crate::MathFunction::Floor, arg: div, arg1: None, arg2: None, arg3: None, }, span, ); let mult = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Multiply, left: floor, right, }, span, ); let sub = ctx.expressions.append( crate::Expression::Binary { op: crate::BinaryOperator::Subtract, left, right: mult, }, span, ); self.lookup_expression.insert( result_id, LookupExpression { handle: sub, type_id: result_type_id, block_id, }, ); } Op::VectorTimesScalar | Op::VectorTimesMatrix | Op::MatrixTimesScalar | Op::MatrixTimesVector | Op::MatrixTimesMatrix => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::Multiply, BINARY)?; } Op::Transpose => { inst.expect(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let matrix_id = self.next()?; let matrix_lexp = self.lookup_expression.lookup(matrix_id)?; let matrix_handle = get_expr_handle!(matrix_id, matrix_lexp); let expr = crate::Expression::Math { fun: crate::MathFunction::Transpose, arg: matrix_handle, arg1: None, arg2: None, arg3: None, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::Dot => { inst.expect(5)?; let result_type_id = self.next()?; let result_id = self.next()?; let left_id = self.next()?; let right_id = self.next()?; let left_lexp = self.lookup_expression.lookup(left_id)?; let left_handle = get_expr_handle!(left_id, left_lexp); let right_lexp = self.lookup_expression.lookup(right_id)?; let right_handle = get_expr_handle!(right_id, right_lexp); let expr = crate::Expression::Math { fun: crate::MathFunction::Dot, arg: left_handle, arg1: Some(right_handle), arg2: None, arg3: None, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::BitFieldInsert => { inst.expect(7)?; let start = self.data_offset; let span = self.span_from_with_op(start); let result_type_id = self.next()?; let result_id = self.next()?; let base_id = self.next()?; let insert_id = self.next()?; let offset_id = self.next()?; let count_id = self.next()?; let base_lexp = self.lookup_expression.lookup(base_id)?; let base_handle = get_expr_handle!(base_id, base_lexp); let insert_lexp = self.lookup_expression.lookup(insert_id)?; let insert_handle = get_expr_handle!(insert_id, insert_lexp); let offset_lexp = self.lookup_expression.lookup(offset_id)?; let offset_handle = get_expr_handle!(offset_id, offset_lexp); let offset_lookup_ty = self.lookup_type.lookup(offset_lexp.type_id)?; let count_lexp = self.lookup_expression.lookup(count_id)?; let count_handle = get_expr_handle!(count_id, count_lexp); let count_lookup_ty = self.lookup_type.lookup(count_lexp.type_id)?; let offset_kind = ctx.type_arena[offset_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let count_kind = ctx.type_arena[count_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let offset_cast_handle = if offset_kind != crate::ScalarKind::Uint { ctx.expressions.append( crate::Expression::As { expr: offset_handle, kind: crate::ScalarKind::Uint, convert: None, }, span, ) } else { offset_handle }; let count_cast_handle = if count_kind != crate::ScalarKind::Uint { ctx.expressions.append( crate::Expression::As { expr: count_handle, kind: crate::ScalarKind::Uint, convert: None, }, span, ) } else { count_handle }; let expr = crate::Expression::Math { fun: crate::MathFunction::InsertBits, arg: base_handle, arg1: Some(insert_handle), arg2: Some(offset_cast_handle), arg3: Some(count_cast_handle), }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::BitFieldSExtract | Op::BitFieldUExtract => { inst.expect(6)?; let result_type_id = self.next()?; let result_id = self.next()?; let base_id = self.next()?; let offset_id = self.next()?; let count_id = self.next()?; let base_lexp = self.lookup_expression.lookup(base_id)?; let base_handle = get_expr_handle!(base_id, base_lexp); let offset_lexp = self.lookup_expression.lookup(offset_id)?; let offset_handle = get_expr_handle!(offset_id, offset_lexp); let offset_lookup_ty = self.lookup_type.lookup(offset_lexp.type_id)?; let count_lexp = self.lookup_expression.lookup(count_id)?; let count_handle = get_expr_handle!(count_id, count_lexp); let count_lookup_ty = self.lookup_type.lookup(count_lexp.type_id)?; let offset_kind = ctx.type_arena[offset_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let count_kind = ctx.type_arena[count_lookup_ty.handle] .inner .scalar_kind() .unwrap(); let offset_cast_handle = if offset_kind != crate::ScalarKind::Uint { ctx.expressions.append( crate::Expression::As { expr: offset_handle, kind: crate::ScalarKind::Uint, convert: None, }, span, ) } else { offset_handle }; let count_cast_handle = if count_kind != crate::ScalarKind::Uint { ctx.expressions.append( crate::Expression::As { expr: count_handle, kind: crate::ScalarKind::Uint, convert: None, }, span, ) } else { count_handle }; let expr = crate::Expression::Math { fun: crate::MathFunction::ExtractBits, arg: base_handle, arg1: Some(offset_cast_handle), arg2: Some(count_cast_handle), arg3: None, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::BitReverse | Op::BitCount => { inst.expect(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let base_id = self.next()?; let base_lexp = self.lookup_expression.lookup(base_id)?; let base_handle = get_expr_handle!(base_id, base_lexp); let expr = crate::Expression::Math { fun: match inst.op { Op::BitReverse => crate::MathFunction::ReverseBits, Op::BitCount => crate::MathFunction::CountOneBits, _ => unreachable!(), }, arg: base_handle, arg1: None, arg2: None, arg3: None, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::OuterProduct => { inst.expect(5)?; let result_type_id = self.next()?; let result_id = self.next()?; let left_id = self.next()?; let right_id = self.next()?; let left_lexp = self.lookup_expression.lookup(left_id)?; let left_handle = get_expr_handle!(left_id, left_lexp); let right_lexp = self.lookup_expression.lookup(right_id)?; let right_handle = get_expr_handle!(right_id, right_lexp); let expr = crate::Expression::Math { fun: crate::MathFunction::Outer, arg: left_handle, arg1: Some(right_handle), arg2: None, arg3: None, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } // Bitwise instructions Op::Not => { inst.expect(4)?; self.parse_expr_unary_op_sign_adjusted( ctx, &mut emitter, &mut block, block_id, body_idx, crate::UnaryOperator::Not, )?; } Op::ShiftRightLogical => { inst.expect(5)?; //TODO: convert input and result to usigned parse_expr_op!(crate::BinaryOperator::ShiftRight, SHIFT)?; } Op::ShiftRightArithmetic => { inst.expect(5)?; //TODO: convert input and result to signed parse_expr_op!(crate::BinaryOperator::ShiftRight, SHIFT)?; } Op::ShiftLeftLogical => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::ShiftLeft, SHIFT)?; } // Sampling Op::Image => { inst.expect(4)?; self.parse_image_uncouple(block_id)?; } Op::SampledImage => { inst.expect(5)?; self.parse_image_couple()?; } Op::ImageWrite => { let extra = inst.expect_at_least(4)?; let stmt = self.parse_image_write(extra, ctx, &mut emitter, &mut block, body_idx)?; block.extend(emitter.finish(ctx.expressions)); block.push(stmt, span); emitter.start(ctx.expressions); } Op::ImageFetch | Op::ImageRead => { let extra = inst.expect_at_least(5)?; self.parse_image_load( extra, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageSampleImplicitLod | Op::ImageSampleExplicitLod => { let extra = inst.expect_at_least(5)?; let options = image::SamplingOptions { compare: false, project: false, }; self.parse_image_sample( extra, options, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageSampleProjImplicitLod | Op::ImageSampleProjExplicitLod => { let extra = inst.expect_at_least(5)?; let options = image::SamplingOptions { compare: false, project: true, }; self.parse_image_sample( extra, options, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageSampleDrefImplicitLod | Op::ImageSampleDrefExplicitLod => { let extra = inst.expect_at_least(6)?; let options = image::SamplingOptions { compare: true, project: false, }; self.parse_image_sample( extra, options, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageSampleProjDrefImplicitLod | Op::ImageSampleProjDrefExplicitLod => { let extra = inst.expect_at_least(6)?; let options = image::SamplingOptions { compare: true, project: true, }; self.parse_image_sample( extra, options, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageQuerySize => { inst.expect(4)?; self.parse_image_query_size( false, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageQuerySizeLod => { inst.expect(5)?; self.parse_image_query_size( true, ctx, &mut emitter, &mut block, block_id, body_idx, )?; } Op::ImageQueryLevels => { inst.expect(4)?; self.parse_image_query_other( crate::ImageQuery::NumLevels, ctx.expressions, block_id, )?; } Op::ImageQuerySamples => { inst.expect(4)?; self.parse_image_query_other( crate::ImageQuery::NumSamples, ctx.expressions, block_id, )?; } // other ops Op::Select => { inst.expect(6)?; let result_type_id = self.next()?; let result_id = self.next()?; let condition = self.next()?; let o1_id = self.next()?; let o2_id = self.next()?; let cond_lexp = self.lookup_expression.lookup(condition)?; let cond_handle = get_expr_handle!(condition, cond_lexp); let o1_lexp = self.lookup_expression.lookup(o1_id)?; let o1_handle = get_expr_handle!(o1_id, o1_lexp); let o2_lexp = self.lookup_expression.lookup(o2_id)?; let o2_handle = get_expr_handle!(o2_id, o2_lexp); let expr = crate::Expression::Select { condition: cond_handle, accept: o1_handle, reject: o2_handle, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::VectorShuffle => { inst.expect_at_least(5)?; let result_type_id = self.next()?; let result_id = self.next()?; let v1_id = self.next()?; let v2_id = self.next()?; let v1_lexp = self.lookup_expression.lookup(v1_id)?; let v1_lty = self.lookup_type.lookup(v1_lexp.type_id)?; let v1_handle = get_expr_handle!(v1_id, v1_lexp); let n1 = match ctx.type_arena[v1_lty.handle].inner { crate::TypeInner::Vector { size, .. } => size as u32, _ => return Err(Error::InvalidInnerType(v1_lexp.type_id)), }; let v2_lexp = self.lookup_expression.lookup(v2_id)?; let v2_lty = self.lookup_type.lookup(v2_lexp.type_id)?; let v2_handle = get_expr_handle!(v2_id, v2_lexp); let n2 = match ctx.type_arena[v2_lty.handle].inner { crate::TypeInner::Vector { size, .. } => size as u32, _ => return Err(Error::InvalidInnerType(v2_lexp.type_id)), }; self.temp_bytes.clear(); let mut max_component = 0; for _ in 5..inst.wc as usize { let mut index = self.next()?; if index == u32::MAX { // treat Undefined as X index = 0; } max_component = max_component.max(index); self.temp_bytes.push(index as u8); } // Check for swizzle first. let expr = if max_component < n1 { use crate::SwizzleComponent as Sc; let size = match self.temp_bytes.len() { 2 => crate::VectorSize::Bi, 3 => crate::VectorSize::Tri, _ => crate::VectorSize::Quad, }; let mut pattern = [Sc::X; 4]; for (pat, index) in pattern.iter_mut().zip(self.temp_bytes.drain(..)) { *pat = match index { 0 => Sc::X, 1 => Sc::Y, 2 => Sc::Z, _ => Sc::W, }; } crate::Expression::Swizzle { size, vector: v1_handle, pattern, } } else { // Fall back to access + compose let mut components = Vec::with_capacity(self.temp_bytes.len()); for index in self.temp_bytes.drain(..).map(|i| i as u32) { let expr = if index < n1 { crate::Expression::AccessIndex { base: v1_handle, index, } } else if index < n1 + n2 { crate::Expression::AccessIndex { base: v2_handle, index: index - n1, } } else { return Err(Error::InvalidAccessIndex(index)); }; components.push(ctx.expressions.append(expr, span)); } crate::Expression::Compose { ty: self.lookup_type.lookup(result_type_id)?.handle, components, } }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::Bitcast | Op::ConvertSToF | Op::ConvertUToF | Op::ConvertFToU | Op::ConvertFToS | Op::FConvert | Op::UConvert | Op::SConvert => { inst.expect(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let value_id = self.next()?; let value_lexp = self.lookup_expression.lookup(value_id)?; let ty_lookup = self.lookup_type.lookup(result_type_id)?; let (kind, width) = match ctx.type_arena[ty_lookup.handle].inner { crate::TypeInner::Scalar { kind, width } | crate::TypeInner::Vector { kind, width, .. } => (kind, width), crate::TypeInner::Matrix { width, .. } => (crate::ScalarKind::Float, width), _ => return Err(Error::InvalidAsType(ty_lookup.handle)), }; let expr = crate::Expression::As { expr: get_expr_handle!(value_id, value_lexp), kind, convert: if kind == crate::ScalarKind::Bool { Some(crate::BOOL_WIDTH) } else if inst.op == Op::Bitcast { None } else { Some(width) }, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::FunctionCall => { inst.expect_at_least(4)?; block.extend(emitter.finish(ctx.expressions)); let result_type_id = self.next()?; let result_id = self.next()?; let func_id = self.next()?; let mut arguments = Vec::with_capacity(inst.wc as usize - 4); for _ in 0..arguments.capacity() { let arg_id = self.next()?; let lexp = self.lookup_expression.lookup(arg_id)?; arguments.push(get_expr_handle!(arg_id, lexp)); } // We just need an unique handle here, nothing more. let function = self.add_call(ctx.function_id, func_id); let result = if self.lookup_void_type == Some(result_type_id) { None } else { let expr_handle = ctx .expressions .append(crate::Expression::CallResult(function), span); self.lookup_expression.insert( result_id, LookupExpression { handle: expr_handle, type_id: result_type_id, block_id, }, ); Some(expr_handle) }; block.push( crate::Statement::Call { function, arguments, result, }, span, ); emitter.start(ctx.expressions); } Op::ExtInst => { use crate::MathFunction as Mf; use spirv::GLOp as Glo; let base_wc = 5; inst.expect_at_least(base_wc)?; let result_type_id = self.next()?; let result_id = self.next()?; let set_id = self.next()?; if Some(set_id) != self.ext_glsl_id { return Err(Error::UnsupportedExtInstSet(set_id)); } let inst_id = self.next()?; let gl_op = Glo::from_u32(inst_id).ok_or(Error::UnsupportedExtInst(inst_id))?; let fun = match gl_op { Glo::Round => Mf::Round, Glo::RoundEven => Mf::Round, Glo::Trunc => Mf::Trunc, Glo::FAbs | Glo::SAbs => Mf::Abs, Glo::FSign | Glo::SSign => Mf::Sign, Glo::Floor => Mf::Floor, Glo::Ceil => Mf::Ceil, Glo::Fract => Mf::Fract, Glo::Sin => Mf::Sin, Glo::Cos => Mf::Cos, Glo::Tan => Mf::Tan, Glo::Asin => Mf::Asin, Glo::Acos => Mf::Acos, Glo::Atan => Mf::Atan, Glo::Sinh => Mf::Sinh, Glo::Cosh => Mf::Cosh, Glo::Tanh => Mf::Tanh, Glo::Atan2 => Mf::Atan2, Glo::Asinh => Mf::Asinh, Glo::Acosh => Mf::Acosh, Glo::Atanh => Mf::Atanh, Glo::Radians => Mf::Radians, Glo::Degrees => Mf::Degrees, Glo::Pow => Mf::Pow, Glo::Exp => Mf::Exp, Glo::Log => Mf::Log, Glo::Exp2 => Mf::Exp2, Glo::Log2 => Mf::Log2, Glo::Sqrt => Mf::Sqrt, Glo::InverseSqrt => Mf::InverseSqrt, Glo::MatrixInverse => Mf::Inverse, Glo::Determinant => Mf::Determinant, Glo::Modf => Mf::Modf, Glo::FMin | Glo::UMin | Glo::SMin | Glo::NMin => Mf::Min, Glo::FMax | Glo::UMax | Glo::SMax | Glo::NMax => Mf::Max, Glo::FClamp | Glo::UClamp | Glo::SClamp | Glo::NClamp => Mf::Clamp, Glo::FMix => Mf::Mix, Glo::Step => Mf::Step, Glo::SmoothStep => Mf::SmoothStep, Glo::Fma => Mf::Fma, Glo::Frexp => Mf::Frexp, //TODO: FrexpStruct? Glo::Ldexp => Mf::Ldexp, Glo::Length => Mf::Length, Glo::Distance => Mf::Distance, Glo::Cross => Mf::Cross, Glo::Normalize => Mf::Normalize, Glo::FaceForward => Mf::FaceForward, Glo::Reflect => Mf::Reflect, Glo::Refract => Mf::Refract, Glo::PackUnorm4x8 => Mf::Pack4x8unorm, Glo::PackSnorm4x8 => Mf::Pack4x8snorm, Glo::PackHalf2x16 => Mf::Pack2x16float, Glo::PackUnorm2x16 => Mf::Pack2x16unorm, Glo::PackSnorm2x16 => Mf::Pack2x16snorm, Glo::UnpackUnorm4x8 => Mf::Unpack4x8unorm, Glo::UnpackSnorm4x8 => Mf::Unpack4x8snorm, Glo::UnpackHalf2x16 => Mf::Unpack2x16float, Glo::UnpackUnorm2x16 => Mf::Unpack2x16unorm, Glo::UnpackSnorm2x16 => Mf::Unpack2x16snorm, Glo::FindILsb => Mf::FindLsb, Glo::FindUMsb | Glo::FindSMsb => Mf::FindMsb, _ => return Err(Error::UnsupportedExtInst(inst_id)), }; let arg_count = fun.argument_count(); inst.expect(base_wc + arg_count as u16)?; let arg = { let arg_id = self.next()?; let lexp = self.lookup_expression.lookup(arg_id)?; get_expr_handle!(arg_id, lexp) }; let arg1 = if arg_count > 1 { let arg_id = self.next()?; let lexp = self.lookup_expression.lookup(arg_id)?; Some(get_expr_handle!(arg_id, lexp)) } else { None }; let arg2 = if arg_count > 2 { let arg_id = self.next()?; let lexp = self.lookup_expression.lookup(arg_id)?; Some(get_expr_handle!(arg_id, lexp)) } else { None }; let arg3 = if arg_count > 3 { let arg_id = self.next()?; let lexp = self.lookup_expression.lookup(arg_id)?; Some(get_expr_handle!(arg_id, lexp)) } else { None }; let expr = crate::Expression::Math { fun, arg, arg1, arg2, arg3, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } // Relational and Logical Instructions Op::LogicalNot => { inst.expect(4)?; parse_expr_op!(crate::UnaryOperator::Not, UNARY)?; } Op::LogicalOr => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::LogicalOr, BINARY)?; } Op::LogicalAnd => { inst.expect(5)?; parse_expr_op!(crate::BinaryOperator::LogicalAnd, BINARY)?; } Op::SGreaterThan | Op::SGreaterThanEqual | Op::SLessThan | Op::SLessThanEqual => { inst.expect(5)?; self.parse_expr_int_comparison( ctx, &mut emitter, &mut block, block_id, body_idx, map_binary_operator(inst.op)?, crate::ScalarKind::Sint, )?; } Op::UGreaterThan | Op::UGreaterThanEqual | Op::ULessThan | Op::ULessThanEqual => { inst.expect(5)?; self.parse_expr_int_comparison( ctx, &mut emitter, &mut block, block_id, body_idx, map_binary_operator(inst.op)?, crate::ScalarKind::Uint, )?; } Op::FOrdEqual | Op::FUnordEqual | Op::FOrdNotEqual | Op::FUnordNotEqual | Op::FOrdLessThan | Op::FUnordLessThan | Op::FOrdGreaterThan | Op::FUnordGreaterThan | Op::FOrdLessThanEqual | Op::FUnordLessThanEqual | Op::FOrdGreaterThanEqual | Op::FUnordGreaterThanEqual | Op::LogicalEqual | Op::LogicalNotEqual => { inst.expect(5)?; let operator = map_binary_operator(inst.op)?; parse_expr_op!(operator, BINARY)?; } Op::Any | Op::All | Op::IsNan | Op::IsInf | Op::IsFinite | Op::IsNormal => { inst.expect(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let arg_id = self.next()?; let arg_lexp = self.lookup_expression.lookup(arg_id)?; let arg_handle = get_expr_handle!(arg_id, arg_lexp); let expr = crate::Expression::Relational { fun: map_relational_fun(inst.op)?, argument: arg_handle, }; self.lookup_expression.insert( result_id, LookupExpression { handle: ctx.expressions.append(expr, span), type_id: result_type_id, block_id, }, ); } Op::Kill => { inst.expect(1)?; break Some(crate::Statement::Kill); } Op::Unreachable => { inst.expect(1)?; break None; } Op::Return => { inst.expect(1)?; break Some(crate::Statement::Return { value: None }); } Op::ReturnValue => { inst.expect(2)?; let value_id = self.next()?; let value_lexp = self.lookup_expression.lookup(value_id)?; let value_handle = get_expr_handle!(value_id, value_lexp); break Some(crate::Statement::Return { value: Some(value_handle), }); } Op::Branch => { inst.expect(2)?; let target_id = self.next()?; // If this is a branch to a merge or continue block, // then that ends the current body. if let Some(info) = ctx.mergers.get(&target_id) { block.extend(emitter.finish(ctx.expressions)); ctx.blocks.insert(block_id, block); let body = &mut ctx.bodies[body_idx]; body.data.push(BodyFragment::BlockId(block_id)); merger(body, info); return Ok(()); } // Since the target of the branch has no merge information, // this must be the only branch to that block. This means // we can treat it as an extension of the current `Body`. // // NOTE: it's possible that another branch was already made to this block // setting the body index in which case it SHOULD NOT be overridden. // For example a switch with falltrough, the OpSwitch will set the body to // the respective case and the case may branch to another case in which case // the body index shouldn't be changed ctx.body_for_label.entry(target_id).or_insert(body_idx); break None; } Op::BranchConditional => { inst.expect_at_least(4)?; let condition = { let condition_id = self.next()?; let lexp = self.lookup_expression.lookup(condition_id)?; get_expr_handle!(condition_id, lexp) }; block.extend(emitter.finish(ctx.expressions)); ctx.blocks.insert(block_id, block); let body = &mut ctx.bodies[body_idx]; body.data.push(BodyFragment::BlockId(block_id)); let true_id = self.next()?; let false_id = self.next()?; let same_target = true_id == false_id; // Start a body block for the `accept` branch. let accept = ctx.bodies.len(); let mut accept_block = Body::with_parent(body_idx); // If the `OpBranchConditional`target is somebody else's // merge or continue block, then put a `Break` or `Continue` // statement in this new body block. if let Some(info) = ctx.mergers.get(&true_id) { merger( match same_target { true => &mut ctx.bodies[body_idx], false => &mut accept_block, }, info, ) } else { // Note the body index for the block we're branching to. let prev = ctx.body_for_label.insert( true_id, match same_target { true => body_idx, false => accept, }, ); debug_assert!(prev.is_none()); } if same_target { return Ok(()); } ctx.bodies.push(accept_block); // Handle the `reject` branch just like the `accept` block. let reject = ctx.bodies.len(); let mut reject_block = Body::with_parent(body_idx); if let Some(info) = ctx.mergers.get(&false_id) { merger(&mut reject_block, info) } else { let prev = ctx.body_for_label.insert(false_id, reject); debug_assert!(prev.is_none()); } ctx.bodies.push(reject_block); let body = &mut ctx.bodies[body_idx]; body.data.push(BodyFragment::If { condition, accept, reject, }); // Consume branch weights for _ in 4..inst.wc { let _ = self.next()?; } return Ok(()); } Op::Switch => { inst.expect_at_least(3)?; let selector = self.next()?; let default_id = self.next()?; // If the previous instruction was a `OpSelectionMerge` then we must // promote the `MergeBlockInformation` to a `SwitchMerge` if let Some(merge) = selection_merge_block { ctx.mergers .insert(merge, MergeBlockInformation::SwitchMerge); } let default = ctx.bodies.len(); ctx.bodies.push(Body::with_parent(body_idx)); ctx.body_for_label.entry(default_id).or_insert(default); let selector_lexp = &self.lookup_expression[&selector]; let selector_lty = self.lookup_type.lookup(selector_lexp.type_id)?; let selector_handle = get_expr_handle!(selector, selector_lexp); let selector = match ctx.type_arena[selector_lty.handle].inner { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, width: _, } => { // IR expects a signed integer, so do a bitcast ctx.expressions.append( crate::Expression::As { kind: crate::ScalarKind::Sint, expr: selector_handle, convert: None, }, span, ) } crate::TypeInner::Scalar { kind: crate::ScalarKind::Sint, width: _, } => selector_handle, ref other => unimplemented!("Unexpected selector {:?}", other), }; // Clear past switch cases to prevent them from entering this one self.switch_cases.clear(); for _ in 0..(inst.wc - 3) / 2 { let literal = self.next()?; let target = self.next()?; let case_body_idx = ctx.bodies.len(); // Check if any previous case already used this target block id, if so // group them together to reorder them later so that no weird // falltrough cases happen. if let Some(&mut (_, ref mut literals)) = self.switch_cases.get_mut(&target) { literals.push(literal as i32); continue; } let mut body = Body::with_parent(body_idx); if let Some(info) = ctx.mergers.get(&target) { merger(&mut body, info); } ctx.bodies.push(body); ctx.body_for_label.entry(target).or_insert(case_body_idx); // Register this target block id as already having been processed and // the respective body index assigned and the first case value self.switch_cases .insert(target, (case_body_idx, vec![literal as i32])); } // Loop trough the collected target blocks creating a new case for each // literal pointing to it, only one case will have the true body and all the // others will be empty falltrough so that they all execute the same body // without duplicating code. // // Since `switch_cases` is an indexmap the order of insertion is preserved // this is needed because spir-v defines falltrough order in the switch // instruction. let mut cases = Vec::with_capacity((inst.wc as usize - 3) / 2); for &(case_body_idx, ref literals) in self.switch_cases.values() { let value = literals[0]; for &literal in literals.iter().skip(1) { let empty_body_idx = ctx.bodies.len(); let body = Body::with_parent(body_idx); ctx.bodies.push(body); cases.push((literal, empty_body_idx)); } cases.push((value, case_body_idx)); } block.extend(emitter.finish(ctx.expressions)); let body = &mut ctx.bodies[body_idx]; ctx.blocks.insert(block_id, block); // Make sure the vector has space for at least two more allocations body.data.reserve(2); body.data.push(BodyFragment::BlockId(block_id)); body.data.push(BodyFragment::Switch { selector, cases, default, }); return Ok(()); } Op::SelectionMerge => { inst.expect(3)?; let merge_block_id = self.next()?; // TODO: Selection Control Mask let _selection_control = self.next()?; // Indicate that the merge block is a continuation of the // current `Body`. ctx.body_for_label.entry(merge_block_id).or_insert(body_idx); // Let subsequent branches to the merge block know that // they've reached the end of the selection construct. ctx.mergers .insert(merge_block_id, MergeBlockInformation::SelectionMerge); selection_merge_block = Some(merge_block_id); } Op::LoopMerge => { inst.expect_at_least(4)?; let merge_block_id = self.next()?; let continuing = self.next()?; // TODO: Loop Control Parameters for _ in 0..inst.wc - 3 { self.next()?; } // Indicate that the merge block is a continuation of the // current `Body`. ctx.body_for_label.entry(merge_block_id).or_insert(body_idx); // Let subsequent branches to the merge block know that // they're `Break` statements. ctx.mergers .insert(merge_block_id, MergeBlockInformation::LoopMerge); let loop_body_idx = ctx.bodies.len(); ctx.bodies.push(Body::with_parent(body_idx)); let continue_idx = ctx.bodies.len(); // The continue block inherits the scope of the loop body ctx.bodies.push(Body::with_parent(loop_body_idx)); ctx.body_for_label.entry(continuing).or_insert(continue_idx); // Let subsequent branches to the continue block know that // they're `Continue` statements. ctx.mergers .insert(continuing, MergeBlockInformation::LoopContinue); // The loop header always belongs to the loop body ctx.body_for_label.insert(block_id, loop_body_idx); let parent_body = &mut ctx.bodies[body_idx]; parent_body.data.push(BodyFragment::Loop { body: loop_body_idx, continuing: continue_idx, }); body_idx = loop_body_idx; } Op::DPdx | Op::DPdxFine | Op::DPdxCoarse => { parse_expr_op!(crate::DerivativeAxis::X, DERIVATIVE)?; } Op::DPdy | Op::DPdyFine | Op::DPdyCoarse => { parse_expr_op!(crate::DerivativeAxis::Y, DERIVATIVE)?; } Op::Fwidth | Op::FwidthFine | Op::FwidthCoarse => { parse_expr_op!(crate::DerivativeAxis::Width, DERIVATIVE)?; } Op::ArrayLength => { inst.expect(5)?; let result_type_id = self.next()?; let result_id = self.next()?; let structure_id = self.next()?; let member_index = self.next()?; // We're assuming that the validation pass, if it's run, will catch if the // wrong types or parameters are supplied here. let structure_ptr = self.lookup_expression.lookup(structure_id)?; let structure_handle = get_expr_handle!(structure_id, structure_ptr); let member_ptr = ctx.expressions.append( crate::Expression::AccessIndex { base: structure_handle, index: member_index, }, span, ); let length = ctx .expressions .append(crate::Expression::ArrayLength(member_ptr), span); self.lookup_expression.insert( result_id, LookupExpression { handle: length, type_id: result_type_id, block_id, }, ); } Op::CopyMemory => { inst.expect_at_least(3)?; let target_id = self.next()?; let source_id = self.next()?; let _memory_access = if inst.wc != 3 { inst.expect(4)?; spirv::MemoryAccess::from_bits(self.next()?) .ok_or(Error::InvalidParameter(Op::CopyMemory))? } else { spirv::MemoryAccess::NONE }; // TODO: check if the source and target types are the same? let target = self.lookup_expression.lookup(target_id)?; let target_handle = get_expr_handle!(target_id, target); let source = self.lookup_expression.lookup(source_id)?; let source_handle = get_expr_handle!(source_id, source); // This operation is practically the same as loading and then storing, I think. let value_expr = ctx.expressions.append( crate::Expression::Load { pointer: source_handle, }, span, ); block.extend(emitter.finish(ctx.expressions)); block.push( crate::Statement::Store { pointer: target_handle, value: value_expr, }, span, ); emitter.start(ctx.expressions); } Op::ControlBarrier => { inst.expect(4)?; let exec_scope_id = self.next()?; let _mem_scope_raw = self.next()?; let semantics_id = self.next()?; let exec_scope_const = self.lookup_constant.lookup(exec_scope_id)?; let semantics_const = self.lookup_constant.lookup(semantics_id)?; let exec_scope = match ctx.const_arena[exec_scope_const.handle].inner { crate::ConstantInner::Scalar { value: crate::ScalarValue::Uint(raw), width: _, } => raw as u32, _ => return Err(Error::InvalidBarrierScope(exec_scope_id)), }; let semantics = match ctx.const_arena[semantics_const.handle].inner { crate::ConstantInner::Scalar { value: crate::ScalarValue::Uint(raw), width: _, } => raw as u32, _ => return Err(Error::InvalidBarrierMemorySemantics(semantics_id)), }; if exec_scope == spirv::Scope::Workgroup as u32 { let mut flags = crate::Barrier::empty(); flags.set( crate::Barrier::STORAGE, semantics & spirv::MemorySemantics::UNIFORM_MEMORY.bits() != 0, ); flags.set( crate::Barrier::WORK_GROUP, semantics & (spirv::MemorySemantics::SUBGROUP_MEMORY | spirv::MemorySemantics::WORKGROUP_MEMORY) .bits() != 0, ); block.push(crate::Statement::Barrier(flags), span); } else { log::warn!("Unsupported barrier execution scope: {}", exec_scope); } } Op::CopyObject => { inst.expect(4)?; let result_type_id = self.next()?; let result_id = self.next()?; let operand_id = self.next()?; let lookup = self.lookup_expression.lookup(operand_id)?; let handle = get_expr_handle!(operand_id, lookup); self.lookup_expression.insert( result_id, LookupExpression { handle, type_id: result_type_id, block_id, }, ); } _ => return Err(Error::UnsupportedInstruction(self.state, inst.op)), } }; block.extend(emitter.finish(ctx.expressions)); if let Some(stmt) = terminator { block.push(stmt, crate::Span::default()); } // Save this block fragment in `block_ctx.blocks`, and mark it to be // incorporated into the current body at `Statement` assembly time. ctx.blocks.insert(block_id, block); let body = &mut ctx.bodies[body_idx]; body.data.push(BodyFragment::BlockId(block_id)); Ok(()) } fn make_expression_storage( &mut self, globals: &Arena, constants: &Arena, ) -> Arena { let mut expressions = Arena::new(); #[allow(clippy::panic)] { assert!(self.lookup_expression.is_empty()); } // register global variables for (&id, var) in self.lookup_variable.iter() { let span = globals.get_span(var.handle); let handle = expressions.append(crate::Expression::GlobalVariable(var.handle), span); self.lookup_expression.insert( id, LookupExpression { type_id: var.type_id, handle, // Setting this to an invalid id will cause get_expr_handle // to default to the main body making sure no load/stores // are added. block_id: 0, }, ); } // register special constants self.index_constant_expressions.clear(); for &con_handle in self.index_constants.iter() { let span = constants.get_span(con_handle); let handle = expressions.append(crate::Expression::Constant(con_handle), span); self.index_constant_expressions.push(handle); } // register constants for (&id, con) in self.lookup_constant.iter() { let span = constants.get_span(con.handle); let handle = expressions.append(crate::Expression::Constant(con.handle), span); self.lookup_expression.insert( id, LookupExpression { type_id: con.type_id, handle, // Setting this to an invalid id will cause get_expr_handle // to default to the main body making sure no load/stores // are added. block_id: 0, }, ); } // done expressions } fn switch(&mut self, state: ModuleState, op: spirv::Op) -> Result<(), Error> { if state < self.state { Err(Error::UnsupportedInstruction(self.state, op)) } else { self.state = state; Ok(()) } } /// Walk the statement tree and patch it in the following cases: /// 1. Function call targets are replaced by `deferred_function_calls` map fn patch_statements( &mut self, statements: &mut crate::Block, expressions: &mut Arena, fun_parameter_sampling: &mut [image::SamplingFlags], ) -> Result<(), Error> { use crate::Statement as S; let mut i = 0usize; while i < statements.len() { match statements[i] { S::Emit(_) => {} S::Block(ref mut block) => { self.patch_statements(block, expressions, fun_parameter_sampling)?; } S::If { condition: _, ref mut accept, ref mut reject, } => { self.patch_statements(reject, expressions, fun_parameter_sampling)?; self.patch_statements(accept, expressions, fun_parameter_sampling)?; } S::Switch { selector: _, ref mut cases, } => { for case in cases.iter_mut() { self.patch_statements(&mut case.body, expressions, fun_parameter_sampling)?; } } S::Loop { ref mut body, ref mut continuing, break_if: _, } => { self.patch_statements(body, expressions, fun_parameter_sampling)?; self.patch_statements(continuing, expressions, fun_parameter_sampling)?; } S::Break | S::Continue | S::Return { .. } | S::Kill | S::Barrier(_) | S::Store { .. } | S::ImageStore { .. } | S::Atomic { .. } => {} S::Call { function: ref mut callee, ref arguments, .. } => { let fun_id = self.deferred_function_calls[callee.index()]; let fun_lookup = self.lookup_function.lookup(fun_id)?; *callee = fun_lookup.handle; // Patch sampling flags for (arg_index, arg) in arguments.iter().enumerate() { let flags = match fun_lookup.parameters_sampling.get(arg_index) { Some(&flags) if !flags.is_empty() => flags, _ => continue, }; match expressions[*arg] { crate::Expression::GlobalVariable(handle) => { if let Some(sampling) = self.handle_sampling.get_mut(&handle) { *sampling |= flags } } crate::Expression::FunctionArgument(i) => { fun_parameter_sampling[i as usize] |= flags; } ref other => return Err(Error::InvalidGlobalVar(other.clone())), } } } } i += 1; } Ok(()) } fn patch_function( &mut self, handle: Option>, fun: &mut crate::Function, ) -> Result<(), Error> { // Note: this search is a bit unfortunate let (fun_id, mut parameters_sampling) = match handle { Some(h) => { let (&fun_id, lookup) = self .lookup_function .iter_mut() .find(|&(_, ref lookup)| lookup.handle == h) .unwrap(); (fun_id, mem::take(&mut lookup.parameters_sampling)) } None => (0, Vec::new()), }; for (_, expr) in fun.expressions.iter_mut() { if let crate::Expression::CallResult(ref mut function) = *expr { let fun_id = self.deferred_function_calls[function.index()]; *function = self.lookup_function.lookup(fun_id)?.handle; } } self.patch_statements( &mut fun.body, &mut fun.expressions, &mut parameters_sampling, )?; if let Some(lookup) = self.lookup_function.get_mut(&fun_id) { lookup.parameters_sampling = parameters_sampling; } Ok(()) } pub fn parse(mut self) -> Result { let mut module = { if self.next()? != spirv::MAGIC_NUMBER { return Err(Error::InvalidHeader); } let version_raw = self.next()?; let generator = self.next()?; let _bound = self.next()?; let _schema = self.next()?; log::info!("Generated by {} version {:x}", generator, version_raw); crate::Module::default() }; // register indexing constants self.index_constants.clear(); for i in 0..4 { let handle = module.constants.append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { width: 4, value: crate::ScalarValue::Sint(i), }, }, Default::default(), ); self.index_constants.push(handle); } self.layouter.clear(); self.dummy_functions = Arena::new(); self.lookup_function.clear(); self.function_call_graph.clear(); loop { use spirv::Op; let inst = match self.next_inst() { Ok(inst) => inst, Err(Error::IncompleteData) => break, Err(other) => return Err(other), }; log::debug!("\t{:?} [{}]", inst.op, inst.wc); match inst.op { Op::Capability => self.parse_capability(inst), Op::Extension => self.parse_extension(inst), Op::ExtInstImport => self.parse_ext_inst_import(inst), Op::MemoryModel => self.parse_memory_model(inst), Op::EntryPoint => self.parse_entry_point(inst), Op::ExecutionMode => self.parse_execution_mode(inst), Op::String => self.parse_string(inst), Op::Source => self.parse_source(inst), Op::SourceExtension => self.parse_source_extension(inst), Op::Name => self.parse_name(inst), Op::MemberName => self.parse_member_name(inst), Op::ModuleProcessed => self.parse_module_processed(inst), Op::Decorate => self.parse_decorate(inst), Op::MemberDecorate => self.parse_member_decorate(inst), Op::TypeVoid => self.parse_type_void(inst), Op::TypeBool => self.parse_type_bool(inst, &mut module), Op::TypeInt => self.parse_type_int(inst, &mut module), Op::TypeFloat => self.parse_type_float(inst, &mut module), Op::TypeVector => self.parse_type_vector(inst, &mut module), Op::TypeMatrix => self.parse_type_matrix(inst, &mut module), Op::TypeFunction => self.parse_type_function(inst), Op::TypePointer => self.parse_type_pointer(inst, &mut module), Op::TypeArray => self.parse_type_array(inst, &mut module), Op::TypeRuntimeArray => self.parse_type_runtime_array(inst, &mut module), Op::TypeStruct => self.parse_type_struct(inst, &mut module), Op::TypeImage => self.parse_type_image(inst, &mut module), Op::TypeSampledImage => self.parse_type_sampled_image(inst), Op::TypeSampler => self.parse_type_sampler(inst, &mut module), Op::Constant | Op::SpecConstant => self.parse_constant(inst, &mut module), Op::ConstantComposite => self.parse_composite_constant(inst, &mut module), Op::ConstantNull | Op::Undef => self .parse_null_constant(inst, &module.types, &mut module.constants) .map(|_| ()), Op::ConstantTrue => self.parse_bool_constant(inst, true, &mut module), Op::ConstantFalse => self.parse_bool_constant(inst, false, &mut module), Op::Variable => self.parse_global_variable(inst, &mut module), Op::Function => { self.switch(ModuleState::Function, inst.op)?; inst.expect(5)?; self.parse_function(&mut module) } _ => Err(Error::UnsupportedInstruction(self.state, inst.op)), //TODO }?; } log::info!("Patching..."); { let mut nodes = petgraph::algo::toposort(&self.function_call_graph, None) .map_err(|cycle| Error::FunctionCallCycle(cycle.node_id()))?; nodes.reverse(); // we need dominated first let mut functions = mem::take(&mut module.functions); for fun_id in nodes { if fun_id > !(functions.len() as u32) { // skip all the fake IDs registered for the entry points continue; } let lookup = self.lookup_function.get_mut(&fun_id).unwrap(); // take out the function from the old array let fun = mem::take(&mut functions[lookup.handle]); // add it to the newly formed arena, and adjust the lookup lookup.handle = module .functions .append(fun, functions.get_span(lookup.handle)); } } // patch all the functions for (handle, fun) in module.functions.iter_mut() { self.patch_function(Some(handle), fun)?; } for ep in module.entry_points.iter_mut() { self.patch_function(None, &mut ep.function)?; } // Check all the images and samplers to have consistent comparison property. for (handle, flags) in self.handle_sampling.drain() { if !image::patch_comparison_type( flags, module.global_variables.get_mut(handle), &mut module.types, ) { return Err(Error::InconsistentComparisonSampling(handle)); } } if !self.future_decor.is_empty() { log::warn!("Unused item decorations: {:?}", self.future_decor); self.future_decor.clear(); } if !self.future_member_decor.is_empty() { log::warn!("Unused member decorations: {:?}", self.future_member_decor); self.future_member_decor.clear(); } Ok(module) } fn parse_capability(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Capability, inst.op)?; inst.expect(2)?; let capability = self.next()?; let cap = spirv::Capability::from_u32(capability).ok_or(Error::UnknownCapability(capability))?; if !SUPPORTED_CAPABILITIES.contains(&cap) { if self.options.strict_capabilities { return Err(Error::UnsupportedCapability(cap)); } else { log::warn!("Unknown capability {:?}", cap); } } Ok(()) } fn parse_extension(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Extension, inst.op)?; inst.expect_at_least(2)?; let (name, left) = self.next_string(inst.wc - 1)?; if left != 0 { return Err(Error::InvalidOperand); } if !SUPPORTED_EXTENSIONS.contains(&name.as_str()) { return Err(Error::UnsupportedExtension(name)); } Ok(()) } fn parse_ext_inst_import(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Extension, inst.op)?; inst.expect_at_least(3)?; let result_id = self.next()?; let (name, left) = self.next_string(inst.wc - 2)?; if left != 0 { return Err(Error::InvalidOperand); } if !SUPPORTED_EXT_SETS.contains(&name.as_str()) { return Err(Error::UnsupportedExtSet(name)); } self.ext_glsl_id = Some(result_id); Ok(()) } fn parse_memory_model(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::MemoryModel, inst.op)?; inst.expect(3)?; let _addressing_model = self.next()?; let _memory_model = self.next()?; Ok(()) } fn parse_entry_point(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::EntryPoint, inst.op)?; inst.expect_at_least(4)?; let exec_model = self.next()?; let exec_model = spirv::ExecutionModel::from_u32(exec_model) .ok_or(Error::UnsupportedExecutionModel(exec_model))?; let function_id = self.next()?; let (name, left) = self.next_string(inst.wc - 3)?; let ep = EntryPoint { stage: match exec_model { spirv::ExecutionModel::Vertex => crate::ShaderStage::Vertex, spirv::ExecutionModel::Fragment => crate::ShaderStage::Fragment, spirv::ExecutionModel::GLCompute => crate::ShaderStage::Compute, _ => return Err(Error::UnsupportedExecutionModel(exec_model as u32)), }, name, early_depth_test: None, workgroup_size: [0; 3], variable_ids: self.data.by_ref().take(left as usize).collect(), }; self.lookup_entry_point.insert(function_id, ep); Ok(()) } fn parse_execution_mode(&mut self, inst: Instruction) -> Result<(), Error> { use spirv::ExecutionMode; self.switch(ModuleState::ExecutionMode, inst.op)?; inst.expect_at_least(3)?; let ep_id = self.next()?; let mode_id = self.next()?; let args: Vec = self.data.by_ref().take(inst.wc as usize - 3).collect(); let ep = self .lookup_entry_point .get_mut(&ep_id) .ok_or(Error::InvalidId(ep_id))?; let mode = spirv::ExecutionMode::from_u32(mode_id) .ok_or(Error::UnsupportedExecutionMode(mode_id))?; match mode { ExecutionMode::EarlyFragmentTests => { if ep.early_depth_test.is_none() { ep.early_depth_test = Some(crate::EarlyDepthTest { conservative: None }); } } ExecutionMode::DepthUnchanged => { ep.early_depth_test = Some(crate::EarlyDepthTest { conservative: Some(crate::ConservativeDepth::Unchanged), }); } ExecutionMode::DepthGreater => { ep.early_depth_test = Some(crate::EarlyDepthTest { conservative: Some(crate::ConservativeDepth::GreaterEqual), }); } ExecutionMode::DepthLess => { ep.early_depth_test = Some(crate::EarlyDepthTest { conservative: Some(crate::ConservativeDepth::LessEqual), }); } ExecutionMode::DepthReplacing => { // Ignored because it can be deduced from the IR. } ExecutionMode::OriginUpperLeft => { // Ignored because the other option (OriginLowerLeft) is not valid in Vulkan mode. } ExecutionMode::LocalSize => { ep.workgroup_size = [args[0], args[1], args[2]]; } _ => { return Err(Error::UnsupportedExecutionMode(mode_id)); } } Ok(()) } fn parse_string(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Source, inst.op)?; inst.expect_at_least(3)?; let _id = self.next()?; let (_name, _) = self.next_string(inst.wc - 2)?; Ok(()) } fn parse_source(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Source, inst.op)?; for _ in 1..inst.wc { let _ = self.next()?; } Ok(()) } fn parse_source_extension(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Source, inst.op)?; inst.expect_at_least(2)?; let (_name, _) = self.next_string(inst.wc - 1)?; Ok(()) } fn parse_name(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Name, inst.op)?; inst.expect_at_least(3)?; let id = self.next()?; let (name, left) = self.next_string(inst.wc - 2)?; if left != 0 { return Err(Error::InvalidOperand); } self.future_decor.entry(id).or_default().name = Some(name); Ok(()) } fn parse_member_name(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Name, inst.op)?; inst.expect_at_least(4)?; let id = self.next()?; let member = self.next()?; let (name, left) = self.next_string(inst.wc - 3)?; if left != 0 { return Err(Error::InvalidOperand); } self.future_member_decor .entry((id, member)) .or_default() .name = Some(name); Ok(()) } fn parse_module_processed(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Name, inst.op)?; inst.expect_at_least(2)?; let (_info, left) = self.next_string(inst.wc - 1)?; //Note: string is ignored if left != 0 { return Err(Error::InvalidOperand); } Ok(()) } fn parse_decorate(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Annotation, inst.op)?; inst.expect_at_least(3)?; let id = self.next()?; let mut dec = self.future_decor.remove(&id).unwrap_or_default(); self.next_decoration(inst, 2, &mut dec)?; self.future_decor.insert(id, dec); Ok(()) } fn parse_member_decorate(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Annotation, inst.op)?; inst.expect_at_least(4)?; let id = self.next()?; let member = self.next()?; let mut dec = self .future_member_decor .remove(&(id, member)) .unwrap_or_default(); self.next_decoration(inst, 3, &mut dec)?; self.future_member_decor.insert((id, member), dec); Ok(()) } fn parse_type_void(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Type, inst.op)?; inst.expect(2)?; let id = self.next()?; self.lookup_void_type = Some(id); Ok(()) } fn parse_type_bool( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(2)?; let id = self.next()?; let inner = crate::TypeInner::Scalar { kind: crate::ScalarKind::Bool, width: crate::BOOL_WIDTH, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: self.future_decor.remove(&id).and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ), base_id: None, }, ); Ok(()) } fn parse_type_int( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(4)?; let id = self.next()?; let width = self.next()?; let sign = self.next()?; let inner = crate::TypeInner::Scalar { kind: match sign { 0 => crate::ScalarKind::Uint, 1 => crate::ScalarKind::Sint, _ => return Err(Error::InvalidSign(sign)), }, width: map_width(width)?, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: self.future_decor.remove(&id).and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ), base_id: None, }, ); Ok(()) } fn parse_type_float( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(3)?; let id = self.next()?; let width = self.next()?; let inner = crate::TypeInner::Scalar { kind: crate::ScalarKind::Float, width: map_width(width)?, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: self.future_decor.remove(&id).and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ), base_id: None, }, ); Ok(()) } fn parse_type_vector( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(4)?; let id = self.next()?; let type_id = self.next()?; let type_lookup = self.lookup_type.lookup(type_id)?; let (kind, width) = match module.types[type_lookup.handle].inner { crate::TypeInner::Scalar { kind, width } => (kind, width), _ => return Err(Error::InvalidInnerType(type_id)), }; let component_count = self.next()?; let inner = crate::TypeInner::Vector { size: map_vector_size(component_count)?, kind, width, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: self.future_decor.remove(&id).and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ), base_id: Some(type_id), }, ); Ok(()) } fn parse_type_matrix( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(4)?; let id = self.next()?; let vector_type_id = self.next()?; let num_columns = self.next()?; let decor = self.future_decor.remove(&id); let vector_type_lookup = self.lookup_type.lookup(vector_type_id)?; let inner = match module.types[vector_type_lookup.handle].inner { crate::TypeInner::Vector { size, width, .. } => crate::TypeInner::Matrix { columns: map_vector_size(num_columns)?, rows: size, width, }, _ => return Err(Error::InvalidInnerType(vector_type_id)), }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: decor.and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ), base_id: Some(vector_type_id), }, ); Ok(()) } fn parse_type_function(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Type, inst.op)?; inst.expect_at_least(3)?; let id = self.next()?; let return_type_id = self.next()?; let parameter_type_ids = self.data.by_ref().take(inst.wc as usize - 3).collect(); self.lookup_function_type.insert( id, LookupFunctionType { parameter_type_ids, return_type_id, }, ); Ok(()) } fn parse_type_pointer( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(4)?; let id = self.next()?; let storage_class = self.next()?; let type_id = self.next()?; let decor = self.future_decor.remove(&id); let base_lookup_ty = self.lookup_type.lookup(type_id)?; let base_inner = &module.types[base_lookup_ty.handle].inner; let space = if let Some(space) = base_inner.pointer_space() { space } else if self .lookup_storage_buffer_types .contains_key(&base_lookup_ty.handle) { crate::AddressSpace::Storage { access: crate::StorageAccess::default(), } } else { match map_storage_class(storage_class)? { ExtendedClass::Global(space) => space, ExtendedClass::Input | ExtendedClass::Output => crate::AddressSpace::Private, } }; // We don't support pointers to runtime-sized arrays in the `Uniform` // storage class with the `BufferBlock` decoration. Runtime-sized arrays // should be in the StorageBuffer class. if let crate::TypeInner::Array { size: crate::ArraySize::Dynamic, .. } = *base_inner { match space { crate::AddressSpace::Storage { .. } => {} _ => { return Err(Error::UnsupportedRuntimeArrayStorageClass); } } } // Don't bother with pointer stuff for `Handle` types. let lookup_ty = if space == crate::AddressSpace::Handle { base_lookup_ty.clone() } else { LookupType { handle: module.types.insert( crate::Type { name: decor.and_then(|dec| dec.name), inner: crate::TypeInner::Pointer { base: base_lookup_ty.handle, space, }, }, self.span_from_with_op(start), ), base_id: Some(type_id), } }; self.lookup_type.insert(id, lookup_ty); Ok(()) } fn parse_type_array( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(4)?; let id = self.next()?; let type_id = self.next()?; let length_id = self.next()?; let length_const = self.lookup_constant.lookup(length_id)?; let decor = self.future_decor.remove(&id).unwrap_or_default(); let base = self.lookup_type.lookup(type_id)?.handle; self.layouter .update(&module.types, &module.constants) .unwrap(); let inner = crate::TypeInner::Array { base, size: crate::ArraySize::Constant(length_const.handle), stride: match decor.array_stride { Some(stride) => stride.get(), None => self.layouter[base].to_stride(), }, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: decor.name, inner, }, self.span_from_with_op(start), ), base_id: Some(type_id), }, ); Ok(()) } fn parse_type_runtime_array( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(3)?; let id = self.next()?; let type_id = self.next()?; let decor = self.future_decor.remove(&id).unwrap_or_default(); let base = self.lookup_type.lookup(type_id)?.handle; self.layouter .update(&module.types, &module.constants) .unwrap(); let inner = crate::TypeInner::Array { base: self.lookup_type.lookup(type_id)?.handle, size: crate::ArraySize::Dynamic, stride: match decor.array_stride { Some(stride) => stride.get(), None => self.layouter[base].to_stride(), }, }; self.lookup_type.insert( id, LookupType { handle: module.types.insert( crate::Type { name: decor.name, inner, }, self.span_from_with_op(start), ), base_id: Some(type_id), }, ); Ok(()) } fn parse_type_struct( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect_at_least(2)?; let id = self.next()?; let parent_decor = self.future_decor.remove(&id); let is_storage_buffer = parent_decor .as_ref() .map_or(false, |decor| decor.storage_buffer); self.layouter .update(&module.types, &module.constants) .unwrap(); let mut members = Vec::::with_capacity(inst.wc as usize - 2); let mut member_lookups = Vec::with_capacity(members.capacity()); let mut storage_access = crate::StorageAccess::empty(); let mut span = 0; let mut alignment = Alignment::ONE; for i in 0..u32::from(inst.wc) - 2 { let type_id = self.next()?; let ty = self.lookup_type.lookup(type_id)?.handle; let decor = self .future_member_decor .remove(&(id, i)) .unwrap_or_default(); storage_access |= decor.flags.to_storage_access(); member_lookups.push(LookupMember { type_id, row_major: decor.matrix_major == Some(Majority::Row), }); let member_alignment = self.layouter[ty].alignment; span = member_alignment.round_up(span); alignment = member_alignment.max(alignment); let mut binding = decor.io_binding().ok(); if let Some(offset) = decor.offset { span = offset; } let offset = span; span += self.layouter[ty].size; let inner = &module.types[ty].inner; if let crate::TypeInner::Matrix { columns, rows, width, } = *inner { if let Some(stride) = decor.matrix_stride { let expected_stride = Alignment::from(rows) * width as u32; if stride.get() != expected_stride { return Err(Error::UnsupportedMatrixStride { stride: stride.get(), columns: columns as u8, rows: rows as u8, width, }); } } } if let Some(ref mut binding) = binding { binding.apply_default_interpolation(inner); } members.push(crate::StructMember { name: decor.name, ty, binding, offset, }); } span = alignment.round_up(span); let inner = crate::TypeInner::Struct { span, members }; let ty_handle = module.types.insert( crate::Type { name: parent_decor.and_then(|dec| dec.name), inner, }, self.span_from_with_op(start), ); if is_storage_buffer { self.lookup_storage_buffer_types .insert(ty_handle, storage_access); } for (i, member_lookup) in member_lookups.into_iter().enumerate() { self.lookup_member .insert((ty_handle, i as u32), member_lookup); } self.lookup_type.insert( id, LookupType { handle: ty_handle, base_id: None, }, ); Ok(()) } fn parse_type_image( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(9)?; let id = self.next()?; let sample_type_id = self.next()?; let dim = self.next()?; let _is_depth = self.next()?; let is_array = self.next()? != 0; let is_msaa = self.next()? != 0; let _is_sampled = self.next()?; let format = self.next()?; let dim = map_image_dim(dim)?; let decor = self.future_decor.remove(&id).unwrap_or_default(); // ensure there is a type for texture coordinate without extra components module.types.insert( crate::Type { name: None, inner: { let kind = crate::ScalarKind::Float; let width = 4; match dim.required_coordinate_size() { None => crate::TypeInner::Scalar { kind, width }, Some(size) => crate::TypeInner::Vector { size, kind, width }, } }, }, Default::default(), ); let base_handle = self.lookup_type.lookup(sample_type_id)?.handle; let kind = module.types[base_handle] .inner .scalar_kind() .ok_or(Error::InvalidImageBaseType(base_handle))?; let inner = crate::TypeInner::Image { class: if format != 0 { crate::ImageClass::Storage { format: map_image_format(format)?, access: crate::StorageAccess::default(), } } else { crate::ImageClass::Sampled { kind, multi: is_msaa, } }, dim, arrayed: is_array, }; let handle = module.types.insert( crate::Type { name: decor.name, inner, }, self.span_from_with_op(start), ); self.lookup_type.insert( id, LookupType { handle, base_id: Some(sample_type_id), }, ); Ok(()) } fn parse_type_sampled_image(&mut self, inst: Instruction) -> Result<(), Error> { self.switch(ModuleState::Type, inst.op)?; inst.expect(3)?; let id = self.next()?; let image_id = self.next()?; self.lookup_type.insert( id, LookupType { handle: self.lookup_type.lookup(image_id)?.handle, base_id: Some(image_id), }, ); Ok(()) } fn parse_type_sampler( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(2)?; let id = self.next()?; let decor = self.future_decor.remove(&id).unwrap_or_default(); let handle = module.types.insert( crate::Type { name: decor.name, inner: crate::TypeInner::Sampler { comparison: false }, }, self.span_from_with_op(start), ); self.lookup_type.insert( id, LookupType { handle, base_id: None, }, ); Ok(()) } fn parse_constant( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect_at_least(4)?; let type_id = self.next()?; let id = self.next()?; let type_lookup = self.lookup_type.lookup(type_id)?; let ty = type_lookup.handle; let inner = match module.types[ty].inner { crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, width, } => { let low = self.next()?; let high = if width > 4 { inst.expect(5)?; self.next()? } else { 0 }; crate::ConstantInner::Scalar { width, value: crate::ScalarValue::Uint((u64::from(high) << 32) | u64::from(low)), } } crate::TypeInner::Scalar { kind: crate::ScalarKind::Sint, width, } => { let low = self.next()?; let high = if width > 4 { inst.expect(5)?; self.next()? } else { 0 }; crate::ConstantInner::Scalar { width, value: crate::ScalarValue::Sint( (i64::from(high as i32) << 32) | ((i64::from(low as i32) << 32) >> 32), ), } } crate::TypeInner::Scalar { kind: crate::ScalarKind::Float, width, } => { let low = self.next()?; let extended = match width { 4 => f64::from(f32::from_bits(low)), 8 => { inst.expect(5)?; let high = self.next()?; f64::from_bits((u64::from(high) << 32) | u64::from(low)) } _ => return Err(Error::InvalidTypeWidth(width as u32)), }; crate::ConstantInner::Scalar { width, value: crate::ScalarValue::Float(extended), } } _ => return Err(Error::UnsupportedType(type_lookup.handle)), }; let decor = self.future_decor.remove(&id).unwrap_or_default(); self.lookup_constant.insert( id, LookupConstant { handle: module.constants.append( crate::Constant { specialization: decor.specialization, name: decor.name, inner, }, self.span_from_with_op(start), ), type_id, }, ); Ok(()) } fn parse_composite_constant( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect_at_least(3)?; let type_id = self.next()?; let type_lookup = self.lookup_type.lookup(type_id)?; let ty = type_lookup.handle; let id = self.next()?; let mut components = Vec::with_capacity(inst.wc as usize - 3); for _ in 0..components.capacity() { let component_id = self.next()?; let constant = self.lookup_constant.lookup(component_id)?; components.push(constant.handle); } self.lookup_constant.insert( id, LookupConstant { handle: module.constants.append( crate::Constant { name: self.future_decor.remove(&id).and_then(|dec| dec.name), specialization: None, inner: crate::ConstantInner::Composite { ty, components }, }, self.span_from_with_op(start), ), type_id, }, ); Ok(()) } fn parse_null_constant( &mut self, inst: Instruction, types: &UniqueArena, constants: &mut Arena, ) -> Result<(u32, u32, Handle), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(3)?; let type_id = self.next()?; let id = self.next()?; let span = self.span_from_with_op(start); let type_lookup = self.lookup_type.lookup(type_id)?; let ty = type_lookup.handle; let inner = null::generate_null_constant(ty, types, constants, span)?; let handle = constants.append( crate::Constant { name: self.future_decor.remove(&id).and_then(|dec| dec.name), specialization: None, //TODO inner, }, span, ); self.lookup_constant .insert(id, LookupConstant { handle, type_id }); Ok((type_id, id, handle)) } fn parse_bool_constant( &mut self, inst: Instruction, value: bool, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect(3)?; let type_id = self.next()?; let id = self.next()?; self.lookup_constant.insert( id, LookupConstant { handle: module.constants.append( crate::Constant { name: self.future_decor.remove(&id).and_then(|dec| dec.name), specialization: None, //TODO inner: crate::ConstantInner::boolean(value), }, self.span_from_with_op(start), ), type_id, }, ); Ok(()) } fn parse_global_variable( &mut self, inst: Instruction, module: &mut crate::Module, ) -> Result<(), Error> { let start = self.data_offset; self.switch(ModuleState::Type, inst.op)?; inst.expect_at_least(4)?; let type_id = self.next()?; let id = self.next()?; let storage_class = self.next()?; let init = if inst.wc > 4 { inst.expect(5)?; let init_id = self.next()?; let lconst = self.lookup_constant.lookup(init_id)?; Some(lconst.handle) } else { None }; let span = self.span_from_with_op(start); let mut dec = self.future_decor.remove(&id).unwrap_or_default(); let original_ty = self.lookup_type.lookup(type_id)?.handle; let mut effective_ty = original_ty; if let crate::TypeInner::Pointer { base, space: _ } = module.types[original_ty].inner { effective_ty = base; }; if let crate::TypeInner::Image { dim, arrayed, class: crate::ImageClass::Storage { format, access: _ }, } = module.types[effective_ty].inner { // Storage image types in IR have to contain the access, but not in the SPIR-V. // The same image type in SPIR-V can be used (and has to be used) for multiple images. // So we copy the type out and apply the variable access decorations. let access = dec.flags.to_storage_access(); let ty = crate::Type { name: None, inner: crate::TypeInner::Image { dim, arrayed, class: crate::ImageClass::Storage { format, access }, }, }; effective_ty = module.types.insert(ty, Default::default()); } let ext_class = match self.lookup_storage_buffer_types.get(&effective_ty) { Some(&access) => ExtendedClass::Global(crate::AddressSpace::Storage { access }), None => map_storage_class(storage_class)?, }; // Fix empty name for gl_PerVertex struct generated by glslang if let crate::TypeInner::Pointer { .. } = module.types[original_ty].inner { if ext_class == ExtendedClass::Input || ext_class == ExtendedClass::Output { if let Some(ref dec_name) = dec.name { if dec_name.is_empty() { dec.name = Some("perVertexStruct".to_string()) } } } } let (inner, var) = match ext_class { ExtendedClass::Global(mut space) => { if let crate::AddressSpace::Storage { ref mut access } = space { *access &= dec.flags.to_storage_access(); } let var = crate::GlobalVariable { binding: dec.resource_binding(), name: dec.name, space, ty: effective_ty, init, }; (Variable::Global, var) } ExtendedClass::Input => { let mut binding = dec.io_binding()?; let mut unsigned_ty = effective_ty; if let crate::Binding::BuiltIn(built_in) = binding { let needs_inner_uint = match built_in { crate::BuiltIn::BaseInstance | crate::BuiltIn::BaseVertex | crate::BuiltIn::InstanceIndex | crate::BuiltIn::SampleIndex | crate::BuiltIn::VertexIndex | crate::BuiltIn::PrimitiveIndex | crate::BuiltIn::LocalInvocationIndex => Some(crate::TypeInner::Scalar { kind: crate::ScalarKind::Uint, width: 4, }), crate::BuiltIn::GlobalInvocationId | crate::BuiltIn::LocalInvocationId | crate::BuiltIn::WorkGroupId | crate::BuiltIn::WorkGroupSize => Some(crate::TypeInner::Vector { size: crate::VectorSize::Tri, kind: crate::ScalarKind::Uint, width: 4, }), _ => None, }; if let (Some(inner), Some(crate::ScalarKind::Sint)) = ( needs_inner_uint, module.types[effective_ty].inner.scalar_kind(), ) { unsigned_ty = module .types .insert(crate::Type { name: None, inner }, Default::default()); } } let var = crate::GlobalVariable { name: dec.name.clone(), space: crate::AddressSpace::Private, binding: None, ty: effective_ty, init: None, }; binding.apply_default_interpolation(&module.types[unsigned_ty].inner); let inner = Variable::Input(crate::FunctionArgument { name: dec.name, ty: unsigned_ty, binding: Some(binding), }); (inner, var) } ExtendedClass::Output => { // For output interface blocks, this would be a structure. let mut binding = dec.io_binding().ok(); let init = match binding { Some(crate::Binding::BuiltIn(built_in)) => { match null::generate_default_built_in( Some(built_in), effective_ty, &module.types, &mut module.constants, span, ) { Ok(handle) => Some(handle), Err(e) => { log::warn!("Failed to initialize output built-in: {}", e); None } } } Some(crate::Binding::Location { .. }) => None, None => match module.types[effective_ty].inner { crate::TypeInner::Struct { ref members, .. } => { // A temporary to avoid borrowing `module.types` let pairs = members .iter() .map(|member| { let built_in = match member.binding { Some(crate::Binding::BuiltIn(built_in)) => Some(built_in), _ => None, }; (built_in, member.ty) }) .collect::>(); let mut components = Vec::with_capacity(members.len()); for (built_in, member_ty) in pairs { let handle = null::generate_default_built_in( built_in, member_ty, &module.types, &mut module.constants, span, )?; components.push(handle); } Some(module.constants.append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Composite { ty: effective_ty, components, }, }, span, )) } _ => None, }, }; let var = crate::GlobalVariable { name: dec.name, space: crate::AddressSpace::Private, binding: None, ty: effective_ty, init, }; if let Some(ref mut binding) = binding { binding.apply_default_interpolation(&module.types[effective_ty].inner); } let inner = Variable::Output(crate::FunctionResult { ty: effective_ty, binding, }); (inner, var) } }; let handle = module.global_variables.append(var, span); if module.types[effective_ty].inner.can_comparison_sample() { log::debug!("\t\ttracking {:?} for sampling properties", handle); self.handle_sampling .insert(handle, image::SamplingFlags::empty()); } self.lookup_variable.insert( id, LookupVariable { inner, handle, type_id, }, ); Ok(()) } } pub fn parse_u8_slice(data: &[u8], options: &Options) -> Result { if data.len() % 4 != 0 { return Err(Error::IncompleteData); } let words = data .chunks(4) .map(|c| u32::from_le_bytes(c.try_into().unwrap())); Parser::new(words, options).parse() } #[cfg(test)] mod test { #[test] fn parse() { let bin = vec![ // Magic number. Version number: 1.0. 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, // Generator number: 0. Bound: 0. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved word: 0. 0x00, 0x00, 0x00, 0x00, // OpMemoryModel. Logical. 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // GLSL450. 0x01, 0x00, 0x00, 0x00, ]; let _ = super::parse_u8_slice(&bin, &Default::default()).unwrap(); } } /// Helper function to check if `child` is in the scope of `parent` fn is_parent(mut child: usize, parent: usize, block_ctx: &BlockContext) -> bool { loop { if child == parent { // The child is in the scope parent break true; } else if child == 0 { // Searched finished at the root the child isn't in the parent's body break false; } child = block_ctx.bodies[child].parent; } } ================================================ FILE: lib/naga/src/front/spv/null.rs ================================================ use super::Error; use crate::arena::{Arena, Handle, UniqueArena}; const fn make_scalar_inner(kind: crate::ScalarKind, width: crate::Bytes) -> crate::ConstantInner { crate::ConstantInner::Scalar { width, value: match kind { crate::ScalarKind::Uint => crate::ScalarValue::Uint(0), crate::ScalarKind::Sint => crate::ScalarValue::Sint(0), crate::ScalarKind::Float => crate::ScalarValue::Float(0.0), crate::ScalarKind::Bool => crate::ScalarValue::Bool(false), }, } } pub fn generate_null_constant( ty: Handle, type_arena: &UniqueArena, constant_arena: &mut Arena, span: crate::Span, ) -> Result { let inner = match type_arena[ty].inner { crate::TypeInner::Scalar { kind, width } => make_scalar_inner(kind, width), crate::TypeInner::Vector { size, kind, width } => { let mut components = Vec::with_capacity(size as usize); for _ in 0..size as usize { components.push(constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner: make_scalar_inner(kind, width), }, span, )); } crate::ConstantInner::Composite { ty, components } } crate::TypeInner::Matrix { columns, rows, width, } => { // If we successfully declared a matrix type, we have declared a vector type for it too. let vector_ty = type_arena .get(&crate::Type { name: None, inner: crate::TypeInner::Vector { kind: crate::ScalarKind::Float, size: rows, width, }, }) .unwrap(); let vector_inner = generate_null_constant(vector_ty, type_arena, constant_arena, span)?; let vector_handle = constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner: vector_inner, }, span, ); crate::ConstantInner::Composite { ty, components: vec![vector_handle; columns as usize], } } crate::TypeInner::Struct { ref members, .. } => { let mut components = Vec::with_capacity(members.len()); // copy out the types to avoid borrowing `members` let member_tys = members.iter().map(|member| member.ty).collect::>(); for member_ty in member_tys { let inner = generate_null_constant(member_ty, type_arena, constant_arena, span)?; components.push(constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner, }, span, )); } crate::ConstantInner::Composite { ty, components } } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(handle), .. } => { let size = constant_arena[handle] .to_array_length() .ok_or(Error::InvalidArraySize(handle))?; let inner = generate_null_constant(base, type_arena, constant_arena, span)?; let value = constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner, }, span, ); crate::ConstantInner::Composite { ty, components: vec![value; size as usize], } } ref other => { log::warn!("null constant type {:?}", other); return Err(Error::UnsupportedType(ty)); } }; Ok(inner) } /// Create a default value for an output built-in. pub fn generate_default_built_in( built_in: Option, ty: Handle, type_arena: &UniqueArena, constant_arena: &mut Arena, span: crate::Span, ) -> Result, Error> { let inner = match built_in { Some(crate::BuiltIn::Position { .. }) => { let zero = constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(0.0), width: 4, }, }, span, ); let one = constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(1.0), width: 4, }, }, span, ); crate::ConstantInner::Composite { ty, components: vec![zero, zero, zero, one], } } Some(crate::BuiltIn::PointSize) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(1.0), width: 4, }, Some(crate::BuiltIn::FragDepth) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(0.0), width: 4, }, Some(crate::BuiltIn::SampleMask) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Uint(u64::MAX), width: 4, }, //Note: `crate::BuiltIn::ClipDistance` is intentionally left for the default path _ => generate_null_constant(ty, type_arena, constant_arena, span)?, }; Ok(constant_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner, }, span, )) } ================================================ FILE: lib/naga/src/front/wgsl/construction.rs ================================================ use crate::{ proc::TypeResolution, Arena, ArraySize, Bytes, Constant, ConstantInner, Expression, Handle, ScalarKind, ScalarValue, Span as NagaSpan, Type, TypeInner, UniqueArena, VectorSize, }; use super::{Error, ExpressionContext, Lexer, Parser, Rule, Span, Token}; /// Represents the type of the constructor /// /// Vectors, Matrices and Arrays can have partial type information /// which later gets inferred from the constructor parameters enum ConstructorType { Scalar { kind: ScalarKind, width: Bytes, }, PartialVector { size: VectorSize, }, Vector { size: VectorSize, kind: ScalarKind, width: Bytes, }, PartialMatrix { columns: VectorSize, rows: VectorSize, }, Matrix { columns: VectorSize, rows: VectorSize, width: Bytes, }, PartialArray, Array { base: Handle, size: ArraySize, stride: u32, }, Struct(Handle), } impl ConstructorType { const fn to_type_resolution(&self) -> Option { Some(match *self { ConstructorType::Scalar { kind, width } => { TypeResolution::Value(TypeInner::Scalar { kind, width }) } ConstructorType::Vector { size, kind, width } => { TypeResolution::Value(TypeInner::Vector { size, kind, width }) } ConstructorType::Matrix { columns, rows, width, } => TypeResolution::Value(TypeInner::Matrix { columns, rows, width, }), ConstructorType::Array { base, size, stride } => { TypeResolution::Value(TypeInner::Array { base, size, stride }) } ConstructorType::Struct(handle) => TypeResolution::Handle(handle), _ => return None, }) } } impl ConstructorType { fn to_error_string(&self, types: &UniqueArena, constants: &Arena) -> String { match *self { ConstructorType::Scalar { kind, width } => kind.to_wgsl(width), ConstructorType::PartialVector { size } => { format!("vec{}", size as u32,) } ConstructorType::Vector { size, kind, width } => { format!("vec{}<{}>", size as u32, kind.to_wgsl(width)) } ConstructorType::PartialMatrix { columns, rows } => { format!("mat{}x{}", columns as u32, rows as u32,) } ConstructorType::Matrix { columns, rows, width, } => { format!( "mat{}x{}<{}>", columns as u32, rows as u32, ScalarKind::Float.to_wgsl(width) ) } ConstructorType::PartialArray => "array".to_string(), ConstructorType::Array { base, size, .. } => { format!( "array<{}, {}>", types[base].name.as_deref().unwrap_or("?"), match size { ArraySize::Constant(size) => { constants[size] .to_array_length() .map(|len| len.to_string()) .unwrap_or_else(|| "?".to_string()) } _ => unreachable!(), } ) } ConstructorType::Struct(handle) => types[handle] .name .clone() .unwrap_or_else(|| "?".to_string()), } } } fn parse_constructor_type<'a>( parser: &mut Parser, lexer: &mut Lexer<'a>, word: &'a str, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { if let Some((kind, width)) = super::conv::get_scalar_type(word) { return Ok(Some(ConstructorType::Scalar { kind, width })); } let partial = match word { "vec2" => ConstructorType::PartialVector { size: VectorSize::Bi, }, "vec3" => ConstructorType::PartialVector { size: VectorSize::Tri, }, "vec4" => ConstructorType::PartialVector { size: VectorSize::Quad, }, "mat2x2" => ConstructorType::PartialMatrix { columns: VectorSize::Bi, rows: VectorSize::Bi, }, "mat2x3" => ConstructorType::PartialMatrix { columns: VectorSize::Bi, rows: VectorSize::Tri, }, "mat2x4" => ConstructorType::PartialMatrix { columns: VectorSize::Bi, rows: VectorSize::Quad, }, "mat3x2" => ConstructorType::PartialMatrix { columns: VectorSize::Tri, rows: VectorSize::Bi, }, "mat3x3" => ConstructorType::PartialMatrix { columns: VectorSize::Tri, rows: VectorSize::Tri, }, "mat3x4" => ConstructorType::PartialMatrix { columns: VectorSize::Tri, rows: VectorSize::Quad, }, "mat4x2" => ConstructorType::PartialMatrix { columns: VectorSize::Quad, rows: VectorSize::Bi, }, "mat4x3" => ConstructorType::PartialMatrix { columns: VectorSize::Quad, rows: VectorSize::Tri, }, "mat4x4" => ConstructorType::PartialMatrix { columns: VectorSize::Quad, rows: VectorSize::Quad, }, "array" => ConstructorType::PartialArray, _ => return Ok(None), }; // parse component type if present match (lexer.peek().0, partial) { (Token::Paren('<'), ConstructorType::PartialVector { size }) => { let (kind, width) = lexer.next_scalar_generic()?; Ok(Some(ConstructorType::Vector { size, kind, width })) } (Token::Paren('<'), ConstructorType::PartialMatrix { columns, rows }) => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; match kind { ScalarKind::Float => Ok(Some(ConstructorType::Matrix { columns, rows, width, })), _ => Err(Error::BadMatrixScalarKind(span, kind, width)), } } (Token::Paren('<'), ConstructorType::PartialArray) => { lexer.expect_generic_paren('<')?; let base = parser.parse_type_decl(lexer, None, type_arena, const_arena)?; let size = if lexer.skip(Token::Separator(',')) { let const_handle = parser.parse_const_expression(lexer, type_arena, const_arena)?; ArraySize::Constant(const_handle) } else { ArraySize::Dynamic }; lexer.expect_generic_paren('>')?; let stride = { parser.layouter.update(type_arena, const_arena).unwrap(); parser.layouter[base].to_stride() }; Ok(Some(ConstructorType::Array { base, size, stride })) } (_, partial) => Ok(Some(partial)), } } /// Expects [`Rule::PrimaryExpr`] on top of rule stack; if returning Some(_), pops it. pub(super) fn parse_construction<'a>( parser: &mut Parser, lexer: &mut Lexer<'a>, type_name: &'a str, type_span: Span, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result>, Error<'a>> { assert_eq!( parser.rules.last().map(|&(ref rule, _)| rule.clone()), Some(Rule::PrimaryExpr) ); let dst_ty = match parser.lookup_type.get(type_name) { Some(&handle) => ConstructorType::Struct(handle), None => match parse_constructor_type(parser, lexer, type_name, ctx.types, ctx.constants)? { Some(inner) => inner, None => { match parser.parse_type_decl_impl( lexer, super::TypeAttributes::default(), type_name, ctx.types, ctx.constants, )? { Some(_) => { return Err(Error::TypeNotConstructible(type_span)); } None => return Ok(None), } } }, }; lexer.open_arguments()?; let mut components = Vec::new(); let mut spans = Vec::new(); if lexer.peek().0 == Token::Paren(')') { let _ = lexer.next(); } else { while components.is_empty() || lexer.next_argument()? { let (component, span) = lexer .capture_span(|lexer| parser.parse_general_expression(lexer, ctx.reborrow()))?; components.push(component); spans.push(span); } } enum Components<'a> { None, One { component: Handle, span: Span, ty: &'a TypeInner, }, Many { components: Vec>, spans: Vec, first_component_ty: &'a TypeInner, }, } impl<'a> Components<'a> { fn into_components_vec(self) -> Vec> { match self { Components::None => vec![], Components::One { component, .. } => vec![component], Components::Many { components, .. } => components, } } } let components = match *components.as_slice() { [] => Components::None, [component] => { ctx.resolve_type(component)?; Components::One { component, span: spans[0].clone(), ty: ctx.typifier.get(component, ctx.types), } } [component, ..] => { ctx.resolve_type(component)?; Components::Many { components, spans, first_component_ty: ctx.typifier.get(component, ctx.types), } } }; let expr = match (components, dst_ty) { // Empty constructor (Components::None, dst_ty) => { let ty = match dst_ty.to_type_resolution() { Some(TypeResolution::Handle(handle)) => handle, Some(TypeResolution::Value(inner)) => ctx .types .insert(Type { name: None, inner }, Default::default()), None => return Err(Error::TypeNotInferrable(type_span)), }; return match ctx.create_zero_value_constant(ty) { Some(constant) => { let span = parser.pop_rule_span(lexer); Ok(Some(ctx.interrupt_emitter( Expression::Constant(constant), span.into(), ))) } None => Err(Error::TypeNotConstructible(type_span)), }; } // Scalar constructor & conversion (scalar -> scalar) ( Components::One { component, ty: &TypeInner::Scalar { .. }, .. }, ConstructorType::Scalar { kind, width }, ) => Expression::As { expr: component, kind, convert: Some(width), }, // Vector conversion (vector -> vector) ( Components::One { component, ty: &TypeInner::Vector { size: src_size, .. }, .. }, ConstructorType::Vector { size: dst_size, kind: dst_kind, width: dst_width, }, ) if dst_size == src_size => Expression::As { expr: component, kind: dst_kind, convert: Some(dst_width), }, // Vector conversion (vector -> vector) - partial ( Components::One { component, ty: &TypeInner::Vector { size: src_size, kind: src_kind, .. }, .. }, ConstructorType::PartialVector { size: dst_size }, ) if dst_size == src_size => Expression::As { expr: component, kind: src_kind, convert: None, }, // Matrix conversion (matrix -> matrix) ( Components::One { component, ty: &TypeInner::Matrix { columns: src_columns, rows: src_rows, .. }, .. }, ConstructorType::Matrix { columns: dst_columns, rows: dst_rows, width: dst_width, }, ) if dst_columns == src_columns && dst_rows == src_rows => Expression::As { expr: component, kind: ScalarKind::Float, convert: Some(dst_width), }, // Matrix conversion (matrix -> matrix) - partial ( Components::One { component, ty: &TypeInner::Matrix { columns: src_columns, rows: src_rows, .. }, .. }, ConstructorType::PartialMatrix { columns: dst_columns, rows: dst_rows, }, ) if dst_columns == src_columns && dst_rows == src_rows => Expression::As { expr: component, kind: ScalarKind::Float, convert: None, }, // Vector constructor (splat) - infer type ( Components::One { component, ty: &TypeInner::Scalar { .. }, .. }, ConstructorType::PartialVector { size }, ) => Expression::Splat { size, value: component, }, // Vector constructor (splat) ( Components::One { component, ty: &TypeInner::Scalar { kind: src_kind, width: src_width, .. }, .. }, ConstructorType::Vector { size, kind: dst_kind, width: dst_width, }, ) if dst_kind == src_kind || dst_width == src_width => Expression::Splat { size, value: component, }, // Vector constructor (by elements) ( Components::Many { components, first_component_ty: &TypeInner::Scalar { kind, width } | &TypeInner::Vector { kind, width, .. }, .. }, ConstructorType::PartialVector { size }, ) | ( Components::Many { components, first_component_ty: &TypeInner::Scalar { .. } | &TypeInner::Vector { .. }, .. }, ConstructorType::Vector { size, width, kind }, ) => { let ty = ctx.types.insert( Type { name: None, inner: TypeInner::Vector { size, kind, width }, }, Default::default(), ); Expression::Compose { ty, components } } // Matrix constructor (by elements) ( Components::Many { components, first_component_ty: &TypeInner::Scalar { width, .. }, .. }, ConstructorType::PartialMatrix { columns, rows }, ) | ( Components::Many { components, first_component_ty: &TypeInner::Scalar { .. }, .. }, ConstructorType::Matrix { columns, rows, width, }, ) => { let vec_ty = ctx.types.insert( Type { name: None, inner: TypeInner::Vector { width, kind: ScalarKind::Float, size: rows, }, }, Default::default(), ); let components = components .chunks(rows as usize) .map(|vec_components| { ctx.expressions.append( Expression::Compose { ty: vec_ty, components: Vec::from(vec_components), }, Default::default(), ) }) .collect(); let ty = ctx.types.insert( Type { name: None, inner: TypeInner::Matrix { columns, rows, width, }, }, Default::default(), ); Expression::Compose { ty, components } } // Matrix constructor (by columns) ( Components::Many { components, first_component_ty: &TypeInner::Vector { width, .. }, .. }, ConstructorType::PartialMatrix { columns, rows }, ) | ( Components::Many { components, first_component_ty: &TypeInner::Vector { .. }, .. }, ConstructorType::Matrix { columns, rows, width, }, ) => { let ty = ctx.types.insert( Type { name: None, inner: TypeInner::Matrix { columns, rows, width, }, }, Default::default(), ); Expression::Compose { ty, components } } // Array constructor - infer type (components, ConstructorType::PartialArray) => { let components = components.into_components_vec(); let base = match ctx.typifier[components[0]].clone() { TypeResolution::Handle(ty) => ty, TypeResolution::Value(inner) => ctx .types .insert(Type { name: None, inner }, Default::default()), }; let size = Constant { name: None, specialization: None, inner: ConstantInner::Scalar { width: 4, value: ScalarValue::Uint(components.len() as u64), }, }; let inner = TypeInner::Array { base, size: ArraySize::Constant(ctx.constants.append(size, Default::default())), stride: { parser.layouter.update(ctx.types, ctx.constants).unwrap(); parser.layouter[base].to_stride() }, }; let ty = ctx .types .insert(Type { name: None, inner }, Default::default()); Expression::Compose { ty, components } } // Array constructor (components, ConstructorType::Array { base, size, stride }) => { let components = components.into_components_vec(); let inner = TypeInner::Array { base, size, stride }; let ty = ctx .types .insert(Type { name: None, inner }, Default::default()); Expression::Compose { ty, components } } // Struct constructor (components, ConstructorType::Struct(ty)) => Expression::Compose { ty, components: components.into_components_vec(), }, // ERRORS // Bad conversion (type cast) ( Components::One { span, ty: src_ty, .. }, dst_ty, ) => { return Err(Error::BadTypeCast { span, from_type: src_ty.to_wgsl(ctx.types, ctx.constants), to_type: dst_ty.to_error_string(ctx.types, ctx.constants), }); } // Too many parameters for scalar constructor (Components::Many { spans, .. }, ConstructorType::Scalar { .. }) => { return Err(Error::UnexpectedComponents(Span { start: spans[1].start, end: spans.last().unwrap().end, })); } // Parameters are of the wrong type for vector or matrix constructor ( Components::Many { spans, .. }, ConstructorType::Vector { .. } | ConstructorType::Matrix { .. } | ConstructorType::PartialVector { .. } | ConstructorType::PartialMatrix { .. }, ) => { return Err(Error::InvalidConstructorComponentType(spans[0].clone(), 0)); } }; let span = NagaSpan::from(parser.pop_rule_span(lexer)); Ok(Some(ctx.expressions.append(expr, span))) } ================================================ FILE: lib/naga/src/front/wgsl/conv.rs ================================================ use super::{Error, Span}; pub fn map_address_space(word: &str, span: Span) -> Result> { match word { "private" => Ok(crate::AddressSpace::Private), "workgroup" => Ok(crate::AddressSpace::WorkGroup), "uniform" => Ok(crate::AddressSpace::Uniform), "storage" => Ok(crate::AddressSpace::Storage { access: crate::StorageAccess::default(), }), "push_constant" => Ok(crate::AddressSpace::PushConstant), "function" => Ok(crate::AddressSpace::Function), _ => Err(Error::UnknownAddressSpace(span)), } } pub fn map_built_in(word: &str, span: Span) -> Result> { Ok(match word { "position" => crate::BuiltIn::Position { invariant: false }, // vertex "vertex_index" => crate::BuiltIn::VertexIndex, "instance_index" => crate::BuiltIn::InstanceIndex, "view_index" => crate::BuiltIn::ViewIndex, // fragment "front_facing" => crate::BuiltIn::FrontFacing, "frag_depth" => crate::BuiltIn::FragDepth, "primitive_index" => crate::BuiltIn::PrimitiveIndex, "sample_index" => crate::BuiltIn::SampleIndex, "sample_mask" => crate::BuiltIn::SampleMask, // compute "global_invocation_id" => crate::BuiltIn::GlobalInvocationId, "local_invocation_id" => crate::BuiltIn::LocalInvocationId, "local_invocation_index" => crate::BuiltIn::LocalInvocationIndex, "workgroup_id" => crate::BuiltIn::WorkGroupId, "workgroup_size" => crate::BuiltIn::WorkGroupSize, "num_workgroups" => crate::BuiltIn::NumWorkGroups, _ => return Err(Error::UnknownBuiltin(span)), }) } pub fn map_interpolation(word: &str, span: Span) -> Result> { match word { "linear" => Ok(crate::Interpolation::Linear), "flat" => Ok(crate::Interpolation::Flat), "perspective" => Ok(crate::Interpolation::Perspective), _ => Err(Error::UnknownAttribute(span)), } } pub fn map_sampling(word: &str, span: Span) -> Result> { match word { "center" => Ok(crate::Sampling::Center), "centroid" => Ok(crate::Sampling::Centroid), "sample" => Ok(crate::Sampling::Sample), _ => Err(Error::UnknownAttribute(span)), } } pub fn map_storage_format(word: &str, span: Span) -> Result> { use crate::StorageFormat as Sf; Ok(match word { "r8unorm" => Sf::R8Unorm, "r8snorm" => Sf::R8Snorm, "r8uint" => Sf::R8Uint, "r8sint" => Sf::R8Sint, "r16uint" => Sf::R16Uint, "r16sint" => Sf::R16Sint, "r16float" => Sf::R16Float, "rg8unorm" => Sf::Rg8Unorm, "rg8snorm" => Sf::Rg8Snorm, "rg8uint" => Sf::Rg8Uint, "rg8sint" => Sf::Rg8Sint, "r32uint" => Sf::R32Uint, "r32sint" => Sf::R32Sint, "r32float" => Sf::R32Float, "rg16uint" => Sf::Rg16Uint, "rg16sint" => Sf::Rg16Sint, "rg16float" => Sf::Rg16Float, "rgba8unorm" => Sf::Rgba8Unorm, "rgba8snorm" => Sf::Rgba8Snorm, "rgba8uint" => Sf::Rgba8Uint, "rgba8sint" => Sf::Rgba8Sint, "rgb10a2unorm" => Sf::Rgb10a2Unorm, "rg11b10float" => Sf::Rg11b10Float, "rg32uint" => Sf::Rg32Uint, "rg32sint" => Sf::Rg32Sint, "rg32float" => Sf::Rg32Float, "rgba16uint" => Sf::Rgba16Uint, "rgba16sint" => Sf::Rgba16Sint, "rgba16float" => Sf::Rgba16Float, "rgba32uint" => Sf::Rgba32Uint, "rgba32sint" => Sf::Rgba32Sint, "rgba32float" => Sf::Rgba32Float, _ => return Err(Error::UnknownStorageFormat(span)), }) } pub fn get_scalar_type(word: &str) -> Option<(crate::ScalarKind, crate::Bytes)> { match word { "f16" => Some((crate::ScalarKind::Float, 2)), "f32" => Some((crate::ScalarKind::Float, 4)), "f64" => Some((crate::ScalarKind::Float, 8)), "i8" => Some((crate::ScalarKind::Sint, 1)), "i16" => Some((crate::ScalarKind::Sint, 2)), "i32" => Some((crate::ScalarKind::Sint, 4)), "i64" => Some((crate::ScalarKind::Sint, 8)), "u8" => Some((crate::ScalarKind::Uint, 1)), "u16" => Some((crate::ScalarKind::Uint, 2)), "u32" => Some((crate::ScalarKind::Uint, 4)), "u64" => Some((crate::ScalarKind::Uint, 8)), "bool" => Some((crate::ScalarKind::Bool, crate::BOOL_WIDTH)), _ => None, } } pub fn map_derivative_axis(word: &str) -> Option { match word { "dpdx" => Some(crate::DerivativeAxis::X), "dpdy" => Some(crate::DerivativeAxis::Y), "fwidth" => Some(crate::DerivativeAxis::Width), _ => None, } } pub fn map_relational_fun(word: &str) -> Option { match word { "any" => Some(crate::RelationalFunction::Any), "all" => Some(crate::RelationalFunction::All), "isFinite" => Some(crate::RelationalFunction::IsFinite), "isNormal" => Some(crate::RelationalFunction::IsNormal), _ => None, } } pub fn map_standard_fun(word: &str) -> Option { use crate::MathFunction as Mf; Some(match word { // comparison "abs" => Mf::Abs, "min" => Mf::Min, "max" => Mf::Max, "clamp" => Mf::Clamp, "saturate" => Mf::Saturate, // trigonometry "cos" => Mf::Cos, "cosh" => Mf::Cosh, "sin" => Mf::Sin, "sinh" => Mf::Sinh, "tan" => Mf::Tan, "tanh" => Mf::Tanh, "acos" => Mf::Acos, "asin" => Mf::Asin, "atan" => Mf::Atan, "atan2" => Mf::Atan2, "radians" => Mf::Radians, "degrees" => Mf::Degrees, // decomposition "ceil" => Mf::Ceil, "floor" => Mf::Floor, "round" => Mf::Round, "fract" => Mf::Fract, "trunc" => Mf::Trunc, "modf" => Mf::Modf, "frexp" => Mf::Frexp, "ldexp" => Mf::Ldexp, // exponent "exp" => Mf::Exp, "exp2" => Mf::Exp2, "log" => Mf::Log, "log2" => Mf::Log2, "pow" => Mf::Pow, // geometry "dot" => Mf::Dot, "outerProduct" => Mf::Outer, "cross" => Mf::Cross, "distance" => Mf::Distance, "length" => Mf::Length, "normalize" => Mf::Normalize, "faceForward" => Mf::FaceForward, "reflect" => Mf::Reflect, // computational "sign" => Mf::Sign, "fma" => Mf::Fma, "mix" => Mf::Mix, "step" => Mf::Step, "smoothstep" => Mf::SmoothStep, "sqrt" => Mf::Sqrt, "inverseSqrt" => Mf::InverseSqrt, "transpose" => Mf::Transpose, "determinant" => Mf::Determinant, // bits "countOneBits" => Mf::CountOneBits, "reverseBits" => Mf::ReverseBits, "extractBits" => Mf::ExtractBits, "insertBits" => Mf::InsertBits, "firstTrailingBit" => Mf::FindLsb, "firstLeadingBit" => Mf::FindMsb, // data packing "pack4x8snorm" => Mf::Pack4x8snorm, "pack4x8unorm" => Mf::Pack4x8unorm, "pack2x16snorm" => Mf::Pack2x16snorm, "pack2x16unorm" => Mf::Pack2x16unorm, "pack2x16float" => Mf::Pack2x16float, // data unpacking "unpack4x8snorm" => Mf::Unpack4x8snorm, "unpack4x8unorm" => Mf::Unpack4x8unorm, "unpack2x16snorm" => Mf::Unpack2x16snorm, "unpack2x16unorm" => Mf::Unpack2x16unorm, "unpack2x16float" => Mf::Unpack2x16float, _ => return None, }) } pub fn map_conservative_depth( word: &str, span: Span, ) -> Result> { use crate::ConservativeDepth as Cd; match word { "greater_equal" => Ok(Cd::GreaterEqual), "less_equal" => Ok(Cd::LessEqual), "unchanged" => Ok(Cd::Unchanged), _ => Err(Error::UnknownConservativeDepth(span)), } } ================================================ FILE: lib/naga/src/front/wgsl/lexer.rs ================================================ use super::{conv, number::consume_number, Error, ExpectedToken, Span, Token, TokenSpan}; fn consume_any(input: &str, what: impl Fn(char) -> bool) -> (&str, &str) { let pos = input.find(|c| !what(c)).unwrap_or(input.len()); input.split_at(pos) } fn consume_token(input: &str, generic: bool) -> (Token<'_>, &str) { let mut chars = input.chars(); let cur = match chars.next() { Some(c) => c, None => return (Token::End, ""), }; match cur { ':' | ';' | ',' => (Token::Separator(cur), chars.as_str()), '.' => { let og_chars = chars.as_str(); match chars.next() { Some('0'..='9') => consume_number(input), _ => (Token::Separator(cur), og_chars), } } '@' => (Token::Attribute, chars.as_str()), '(' | ')' | '{' | '}' | '[' | ']' => (Token::Paren(cur), chars.as_str()), '<' | '>' => { let og_chars = chars.as_str(); match chars.next() { Some('=') if !generic => (Token::LogicalOperation(cur), chars.as_str()), Some(c) if c == cur && !generic => { let og_chars = chars.as_str(); match chars.next() { Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::ShiftOperation(cur), og_chars), } } _ => (Token::Paren(cur), og_chars), } } '0'..='9' => consume_number(input), '/' => { let og_chars = chars.as_str(); match chars.next() { Some('/') => { let _ = chars.position(is_comment_end); (Token::Trivia, chars.as_str()) } Some('*') => { let mut depth = 1; let mut prev = None; for c in &mut chars { match (prev, c) { (Some('*'), '/') => { prev = None; depth -= 1; if depth == 0 { return (Token::Trivia, chars.as_str()); } } (Some('/'), '*') => { prev = None; depth += 1; } _ => { prev = Some(c); } } } (Token::End, "") } Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } '-' => { let og_chars = chars.as_str(); match chars.next() { Some('>') => (Token::Arrow, chars.as_str()), Some('0'..='9' | '.') => consume_number(input), Some('-') => (Token::DecrementOperation, chars.as_str()), Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } '+' => { let og_chars = chars.as_str(); match chars.next() { Some('+') => (Token::IncrementOperation, chars.as_str()), Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } '*' | '%' | '^' => { let og_chars = chars.as_str(); match chars.next() { Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } '~' => (Token::Operation(cur), chars.as_str()), '=' | '!' => { let og_chars = chars.as_str(); match chars.next() { Some('=') => (Token::LogicalOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } '&' | '|' => { let og_chars = chars.as_str(); match chars.next() { Some(c) if c == cur => (Token::LogicalOperation(cur), chars.as_str()), Some('=') => (Token::AssignmentOperation(cur), chars.as_str()), _ => (Token::Operation(cur), og_chars), } } _ if is_blankspace(cur) => { let (_, rest) = consume_any(input, is_blankspace); (Token::Trivia, rest) } _ if is_word_start(cur) => { let (word, rest) = consume_any(input, is_word_part); (Token::Word(word), rest) } _ => (Token::Unknown(cur), chars.as_str()), } } /// Returns whether or not a char is a comment end /// (Unicode Pattern_White_Space excluding U+0020, U+0009, U+200E and U+200F) const fn is_comment_end(c: char) -> bool { match c { '\u{000a}'..='\u{000d}' | '\u{0085}' | '\u{2028}' | '\u{2029}' => true, _ => false, } } /// Returns whether or not a char is a blankspace (Unicode Pattern_White_Space) const fn is_blankspace(c: char) -> bool { match c { '\u{0020}' | '\u{0009}'..='\u{000d}' | '\u{0085}' | '\u{200e}' | '\u{200f}' | '\u{2028}' | '\u{2029}' => true, _ => false, } } /// Returns whether or not a char is a word start (Unicode XID_Start + '_') fn is_word_start(c: char) -> bool { c == '_' || unicode_xid::UnicodeXID::is_xid_start(c) } /// Returns whether or not a char is a word part (Unicode XID_Continue) fn is_word_part(c: char) -> bool { unicode_xid::UnicodeXID::is_xid_continue(c) } #[derive(Clone)] pub(super) struct Lexer<'a> { input: &'a str, pub(super) source: &'a str, // The byte offset of the end of the last non-trivia token. last_end_offset: usize, } impl<'a> Lexer<'a> { pub(super) const fn new(input: &'a str) -> Self { Lexer { input, source: input, last_end_offset: 0, } } pub(super) const fn _leftover_span(&self) -> Span { self.source.len() - self.input.len()..self.source.len() } /// Calls the function with a lexer and returns the result of the function as well as the span for everything the function parsed /// /// # Examples /// ```ignore /// let lexer = Lexer::new("5"); /// let (value, span) = lexer.capture_span(Lexer::next_uint_literal); /// assert_eq!(value, 5); /// ``` #[inline] pub fn capture_span( &mut self, inner: impl FnOnce(&mut Self) -> Result, ) -> Result<(T, Span), E> { let start = self.current_byte_offset(); let res = inner(self)?; let end = self.current_byte_offset(); Ok((res, start..end)) } pub(super) fn start_byte_offset(&mut self) -> usize { loop { // Eat all trivia because `next` doesn't eat trailing trivia. let (token, rest) = consume_token(self.input, false); if let Token::Trivia = token { self.input = rest; } else { return self.current_byte_offset(); } } } pub(super) const fn end_byte_offset(&self) -> usize { self.last_end_offset } fn peek_token_and_rest(&mut self) -> (TokenSpan<'a>, &'a str) { let mut cloned = self.clone(); let token = cloned.next(); let rest = cloned.input; (token, rest) } const fn current_byte_offset(&self) -> usize { self.source.len() - self.input.len() } pub(super) const fn span_from(&self, offset: usize) -> Span { offset..self.end_byte_offset() } #[must_use] pub(super) fn next(&mut self) -> TokenSpan<'a> { let mut start_byte_offset = self.current_byte_offset(); loop { let (token, rest) = consume_token(self.input, false); self.input = rest; match token { Token::Trivia => start_byte_offset = self.current_byte_offset(), _ => { self.last_end_offset = self.current_byte_offset(); return (token, start_byte_offset..self.last_end_offset); } } } } #[must_use] pub(super) fn next_generic(&mut self) -> TokenSpan<'a> { let mut start_byte_offset = self.current_byte_offset(); loop { let (token, rest) = consume_token(self.input, true); self.input = rest; match token { Token::Trivia => start_byte_offset = self.current_byte_offset(), _ => return (token, start_byte_offset..self.current_byte_offset()), } } } #[must_use] pub(super) fn peek(&mut self) -> TokenSpan<'a> { let (token, _) = self.peek_token_and_rest(); token } pub(super) fn expect_span( &mut self, expected: Token<'a>, ) -> Result, Error<'a>> { let next = self.next(); if next.0 == expected { Ok(next.1) } else { Err(Error::Unexpected(next.1, ExpectedToken::Token(expected))) } } pub(super) fn expect(&mut self, expected: Token<'a>) -> Result<(), Error<'a>> { self.expect_span(expected)?; Ok(()) } pub(super) fn expect_generic_paren(&mut self, expected: char) -> Result<(), Error<'a>> { let next = self.next_generic(); if next.0 == Token::Paren(expected) { Ok(()) } else { Err(Error::Unexpected( next.1, ExpectedToken::Token(Token::Paren(expected)), )) } } /// If the next token matches it is skipped and true is returned pub(super) fn skip(&mut self, what: Token<'_>) -> bool { let (peeked_token, rest) = self.peek_token_and_rest(); if peeked_token.0 == what { self.input = rest; true } else { false } } pub(super) fn next_ident_with_span(&mut self) -> Result<(&'a str, Span), Error<'a>> { match self.next() { (Token::Word(word), span) if word == "_" => { Err(Error::InvalidIdentifierUnderscore(span)) } (Token::Word(word), span) if word.starts_with("__") => { Err(Error::ReservedIdentifierPrefix(span)) } (Token::Word(word), span) => Ok((word, span)), other => Err(Error::Unexpected(other.1, ExpectedToken::Identifier)), } } pub(super) fn next_ident(&mut self) -> Result<&'a str, Error<'a>> { self.next_ident_with_span().map(|(word, _)| word) } /// Parses a generic scalar type, for example ``. pub(super) fn next_scalar_generic( &mut self, ) -> Result<(crate::ScalarKind, crate::Bytes), Error<'a>> { self.expect_generic_paren('<')?; let pair = match self.next() { (Token::Word(word), span) => { conv::get_scalar_type(word).ok_or(Error::UnknownScalarType(span)) } (_, span) => Err(Error::UnknownScalarType(span)), }?; self.expect_generic_paren('>')?; Ok(pair) } /// Parses a generic scalar type, for example ``. /// /// Returns the span covering the inner type, excluding the brackets. pub(super) fn next_scalar_generic_with_span( &mut self, ) -> Result<(crate::ScalarKind, crate::Bytes, Span), Error<'a>> { self.expect_generic_paren('<')?; let pair = match self.next() { (Token::Word(word), span) => conv::get_scalar_type(word) .map(|(a, b)| (a, b, span.clone())) .ok_or(Error::UnknownScalarType(span)), (_, span) => Err(Error::UnknownScalarType(span)), }?; self.expect_generic_paren('>')?; Ok(pair) } pub(super) fn next_storage_access(&mut self) -> Result> { let (ident, span) = self.next_ident_with_span()?; match ident { "read" => Ok(crate::StorageAccess::LOAD), "write" => Ok(crate::StorageAccess::STORE), "read_write" => Ok(crate::StorageAccess::LOAD | crate::StorageAccess::STORE), _ => Err(Error::UnknownAccess(span)), } } pub(super) fn next_format_generic( &mut self, ) -> Result<(crate::StorageFormat, crate::StorageAccess), Error<'a>> { self.expect(Token::Paren('<'))?; let (ident, ident_span) = self.next_ident_with_span()?; let format = conv::map_storage_format(ident, ident_span)?; self.expect(Token::Separator(','))?; let access = self.next_storage_access()?; self.expect(Token::Paren('>'))?; Ok((format, access)) } pub(super) fn open_arguments(&mut self) -> Result<(), Error<'a>> { self.expect(Token::Paren('(')) } pub(super) fn close_arguments(&mut self) -> Result<(), Error<'a>> { let _ = self.skip(Token::Separator(',')); self.expect(Token::Paren(')')) } pub(super) fn next_argument(&mut self) -> Result> { let paren = Token::Paren(')'); if self.skip(Token::Separator(',')) { Ok(!self.skip(paren)) } else { self.expect(paren).map(|()| false) } } } #[cfg(test)] use super::{number::Number, NumberError}; #[cfg(test)] fn sub_test(source: &str, expected_tokens: &[Token]) { let mut lex = Lexer::new(source); for &token in expected_tokens { assert_eq!(lex.next().0, token); } assert_eq!(lex.next().0, Token::End); } #[test] fn test_numbers() { // WGSL spec examples // // decimal integer sub_test( "0x123 0X123u 1u 123 0 0i 0x3f", &[ Token::Number(Ok(Number::I32(291))), Token::Number(Ok(Number::U32(291))), Token::Number(Ok(Number::U32(1))), Token::Number(Ok(Number::I32(123))), Token::Number(Ok(Number::I32(0))), Token::Number(Ok(Number::I32(0))), Token::Number(Ok(Number::I32(63))), ], ); // decimal floating point sub_test( "0.e+4f 01. .01 12.34 .0f 0h 1e-3 0xa.fp+2 0x1P+4f 0X.3 0x3p+2h 0X1.fp-4 0x3.2p+2h", &[ Token::Number(Ok(Number::F32(0.))), Token::Number(Ok(Number::F32(1.))), Token::Number(Ok(Number::F32(0.01))), Token::Number(Ok(Number::F32(12.34))), Token::Number(Ok(Number::F32(0.))), Token::Number(Err(NumberError::UnimplementedF16)), Token::Number(Ok(Number::F32(0.001))), Token::Number(Ok(Number::F32(43.75))), Token::Number(Ok(Number::F32(16.))), Token::Number(Ok(Number::F32(0.1875))), Token::Number(Err(NumberError::UnimplementedF16)), Token::Number(Ok(Number::F32(0.12109375))), Token::Number(Err(NumberError::UnimplementedF16)), ], ); // MIN / MAX // // min / max decimal signed integer sub_test( "-2147483648i 2147483647i -2147483649i 2147483648i", &[ Token::Number(Ok(Number::I32(i32::MIN))), Token::Number(Ok(Number::I32(i32::MAX))), Token::Number(Err(NumberError::NotRepresentable)), Token::Number(Err(NumberError::NotRepresentable)), ], ); // min / max decimal unsigned integer sub_test( "0u 4294967295u -1u 4294967296u", &[ Token::Number(Ok(Number::U32(u32::MIN))), Token::Number(Ok(Number::U32(u32::MAX))), Token::Number(Err(NumberError::NotRepresentable)), Token::Number(Err(NumberError::NotRepresentable)), ], ); // min / max hexadecimal signed integer sub_test( "-0x80000000i 0x7FFFFFFFi -0x80000001i 0x80000000i", &[ Token::Number(Ok(Number::I32(i32::MIN))), Token::Number(Ok(Number::I32(i32::MAX))), Token::Number(Err(NumberError::NotRepresentable)), Token::Number(Err(NumberError::NotRepresentable)), ], ); // min / max hexadecimal unsigned integer sub_test( "0x0u 0xFFFFFFFFu -0x1u 0x100000000u", &[ Token::Number(Ok(Number::U32(u32::MIN))), Token::Number(Ok(Number::U32(u32::MAX))), Token::Number(Err(NumberError::NotRepresentable)), Token::Number(Err(NumberError::NotRepresentable)), ], ); /// ≈ 2^-126 * 2^−23 (= 2^−149) const SMALLEST_POSITIVE_SUBNORMAL_F32: f32 = 1e-45; /// ≈ 2^-126 * (1 − 2^−23) const LARGEST_SUBNORMAL_F32: f32 = 1.1754942e-38; /// ≈ 2^-126 const SMALLEST_POSITIVE_NORMAL_F32: f32 = f32::MIN_POSITIVE; /// ≈ 1 − 2^−24 const LARGEST_F32_LESS_THAN_ONE: f32 = 0.99999994; /// ≈ 1 + 2^−23 const SMALLEST_F32_LARGER_THAN_ONE: f32 = 1.0000001; /// ≈ -(2^127 * (2 − 2^−23)) const SMALLEST_NORMAL_F32: f32 = f32::MIN; /// ≈ 2^127 * (2 − 2^−23) const LARGEST_NORMAL_F32: f32 = f32::MAX; // decimal floating point sub_test( "1e-45f 1.1754942e-38f 1.17549435e-38f 0.99999994f 1.0000001f -3.40282347e+38f 3.40282347e+38f", &[ Token::Number(Ok(Number::F32( SMALLEST_POSITIVE_SUBNORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_SUBNORMAL_F32, ))), Token::Number(Ok(Number::F32( SMALLEST_POSITIVE_NORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_F32_LESS_THAN_ONE, ))), Token::Number(Ok(Number::F32( SMALLEST_F32_LARGER_THAN_ONE, ))), Token::Number(Ok(Number::F32( SMALLEST_NORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_NORMAL_F32, ))), ], ); sub_test( "-3.40282367e+38f 3.40282367e+38f", &[ Token::Number(Err(NumberError::NotRepresentable)), // ≈ -2^128 Token::Number(Err(NumberError::NotRepresentable)), // ≈ 2^128 ], ); // hexadecimal floating point sub_test( "0x1p-149f 0x7FFFFFp-149f 0x1p-126f 0xFFFFFFp-24f 0x800001p-23f -0xFFFFFFp+104f 0xFFFFFFp+104f", &[ Token::Number(Ok(Number::F32( SMALLEST_POSITIVE_SUBNORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_SUBNORMAL_F32, ))), Token::Number(Ok(Number::F32( SMALLEST_POSITIVE_NORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_F32_LESS_THAN_ONE, ))), Token::Number(Ok(Number::F32( SMALLEST_F32_LARGER_THAN_ONE, ))), Token::Number(Ok(Number::F32( SMALLEST_NORMAL_F32, ))), Token::Number(Ok(Number::F32( LARGEST_NORMAL_F32, ))), ], ); sub_test( "-0x1p128f 0x1p128f 0x1.000001p0f", &[ Token::Number(Err(NumberError::NotRepresentable)), // = -2^128 Token::Number(Err(NumberError::NotRepresentable)), // = 2^128 Token::Number(Err(NumberError::NotRepresentable)), ], ); } #[test] fn test_tokens() { sub_test("id123_OK", &[Token::Word("id123_OK")]); sub_test( "92No", &[Token::Number(Ok(Number::I32(92))), Token::Word("No")], ); sub_test( "2u3o", &[ Token::Number(Ok(Number::U32(2))), Token::Number(Ok(Number::I32(3))), Token::Word("o"), ], ); sub_test( "2.4f44po", &[ Token::Number(Ok(Number::F32(2.4))), Token::Number(Ok(Number::I32(44))), Token::Word("po"), ], ); sub_test( "Δέλτα réflexion Кызыл 𐰓𐰏𐰇 朝焼け سلام 검정 שָׁלוֹם गुलाबी փիրուզ", &[ Token::Word("Δέλτα"), Token::Word("réflexion"), Token::Word("Кызыл"), Token::Word("𐰓𐰏𐰇"), Token::Word("朝焼け"), Token::Word("سلام"), Token::Word("검정"), Token::Word("שָׁלוֹם"), Token::Word("गुलाबी"), Token::Word("փիրուզ"), ], ); sub_test("æNoø", &[Token::Word("æNoø")]); sub_test("No¾", &[Token::Word("No"), Token::Unknown('¾')]); sub_test("No好", &[Token::Word("No好")]); sub_test("_No", &[Token::Word("_No")]); sub_test( "*/*/***/*//=/*****//", &[ Token::Operation('*'), Token::AssignmentOperation('/'), Token::Operation('/'), ], ); } #[test] fn test_variable_decl() { sub_test( "@group(0 ) var< uniform> texture: texture_multisampled_2d ;", &[ Token::Attribute, Token::Word("group"), Token::Paren('('), Token::Number(Ok(Number::I32(0))), Token::Paren(')'), Token::Word("var"), Token::Paren('<'), Token::Word("uniform"), Token::Paren('>'), Token::Word("texture"), Token::Separator(':'), Token::Word("texture_multisampled_2d"), Token::Paren('<'), Token::Word("f32"), Token::Paren('>'), Token::Separator(';'), ], ); sub_test( "var buffer: array;", &[ Token::Word("var"), Token::Paren('<'), Token::Word("storage"), Token::Separator(','), Token::Word("read_write"), Token::Paren('>'), Token::Word("buffer"), Token::Separator(':'), Token::Word("array"), Token::Paren('<'), Token::Word("u32"), Token::Paren('>'), Token::Separator(';'), ], ); } ================================================ FILE: lib/naga/src/front/wgsl/mod.rs ================================================ /*! Frontend for [WGSL][wgsl] (WebGPU Shading Language). [wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html */ mod construction; mod conv; mod lexer; mod number; #[cfg(test)] mod tests; use crate::{ arena::{Arena, Handle, UniqueArena}, proc::{ ensure_block_returns, Alignment, Layouter, ResolveContext, ResolveError, TypeResolution, }, span::SourceLocation, span::Span as NagaSpan, ConstantInner, FastHashMap, ScalarValue, }; use self::{lexer::Lexer, number::Number}; use codespan_reporting::{ diagnostic::{Diagnostic, Label}, files::SimpleFile, term::{ self, termcolor::{ColorChoice, NoColor, StandardStream}, }, }; use std::{borrow::Cow, convert::TryFrom, ops}; use thiserror::Error; type Span = ops::Range; type TokenSpan<'a> = (Token<'a>, Span); #[derive(Copy, Clone, Debug, PartialEq)] pub enum Token<'a> { Separator(char), Paren(char), Attribute, Number(Result), Word(&'a str), Operation(char), LogicalOperation(char), ShiftOperation(char), AssignmentOperation(char), IncrementOperation, DecrementOperation, Arrow, Unknown(char), Trivia, End, } #[derive(Copy, Clone, Debug, PartialEq)] pub enum NumberType { I32, U32, F32, } #[derive(Copy, Clone, Debug, PartialEq)] pub enum ExpectedToken<'a> { Token(Token<'a>), Identifier, Number(NumberType), Integer, Constant, /// Expected: constant, parenthesized expression, identifier PrimaryExpression, /// Expected: assignment, increment/decrement expression Assignment, /// Expected: '}', identifier FieldName, /// Expected: attribute for a type TypeAttribute, /// Expected: ';', '{', word Statement, /// Expected: 'case', 'default', '}' SwitchItem, /// Expected: ',', ')' WorkgroupSizeSeparator, /// Expected: 'struct', 'let', 'var', 'type', ';', 'fn', eof GlobalItem, } #[derive(Clone, Copy, Debug, Error, PartialEq)] pub enum NumberError { #[error("invalid numeric literal format")] Invalid, #[error("numeric literal not representable by target type")] NotRepresentable, #[error("unimplemented f16 type")] UnimplementedF16, } #[derive(Copy, Clone, Debug, PartialEq)] pub enum InvalidAssignmentType { Other, Swizzle, ImmutableBinding, } #[derive(Clone, Debug)] pub enum Error<'a> { Unexpected(Span, ExpectedToken<'a>), UnexpectedComponents(Span), BadNumber(Span, NumberError), /// A negative signed integer literal where both signed and unsigned, /// but only non-negative literals are allowed. NegativeInt(Span), BadU32Constant(Span), BadMatrixScalarKind(Span, crate::ScalarKind, u8), BadAccessor(Span), BadTexture(Span), BadTypeCast { span: Span, from_type: String, to_type: String, }, BadTextureSampleType { span: Span, kind: crate::ScalarKind, width: u8, }, BadIncrDecrReferenceType(Span), InvalidResolve(ResolveError), InvalidForInitializer(Span), /// A break if appeared outside of a continuing block InvalidBreakIf(Span), InvalidGatherComponent(Span, u32), InvalidConstructorComponentType(Span, i32), InvalidIdentifierUnderscore(Span), ReservedIdentifierPrefix(Span), UnknownAddressSpace(Span), UnknownAttribute(Span), UnknownBuiltin(Span), UnknownAccess(Span), UnknownShaderStage(Span), UnknownIdent(Span, &'a str), UnknownScalarType(Span), UnknownType(Span), UnknownStorageFormat(Span), UnknownConservativeDepth(Span), SizeAttributeTooLow(Span, u32), AlignAttributeTooLow(Span, Alignment), NonPowerOfTwoAlignAttribute(Span), InconsistentBinding(Span), UnknownLocalFunction(Span), TypeNotConstructible(Span), TypeNotInferrable(Span), InitializationTypeMismatch(Span, String), MissingType(Span), MissingAttribute(&'static str, Span), InvalidAtomicPointer(Span), InvalidAtomicOperandType(Span), Pointer(&'static str, Span), NotPointer(Span), NotReference(&'static str, Span), InvalidAssignment { span: Span, ty: InvalidAssignmentType, }, ReservedKeyword(Span), Redefinition { previous: Span, current: Span, }, Other, } impl<'a> Error<'a> { fn as_parse_error(&self, source: &'a str) -> ParseError { match *self { Error::Unexpected(ref unexpected_span, expected) => { let expected_str = match expected { ExpectedToken::Token(token) => { match token { Token::Separator(c) => format!("'{}'", c), Token::Paren(c) => format!("'{}'", c), Token::Attribute => "@".to_string(), Token::Number(_) => "number".to_string(), Token::Word(s) => s.to_string(), Token::Operation(c) => format!("operation ('{}')", c), Token::LogicalOperation(c) => format!("logical operation ('{}')", c), Token::ShiftOperation(c) => format!("bitshift ('{}{}')", c, c), Token::AssignmentOperation(c) if c=='<' || c=='>' => format!("bitshift ('{}{}=')", c, c), Token::AssignmentOperation(c) => format!("operation ('{}=')", c), Token::IncrementOperation => "increment operation".to_string(), Token::DecrementOperation => "decrement operation".to_string(), Token::Arrow => "->".to_string(), Token::Unknown(c) => format!("unknown ('{}')", c), Token::Trivia => "trivia".to_string(), Token::End => "end".to_string(), } } ExpectedToken::Identifier => "identifier".to_string(), ExpectedToken::Number(ty) => { match ty { NumberType::I32 => "32-bit signed integer literal", NumberType::U32 => "32-bit unsigned integer literal", NumberType::F32 => "32-bit floating-point literal", }.to_string() }, ExpectedToken::Integer => "unsigned/signed integer literal".to_string(), ExpectedToken::Constant => "constant".to_string(), ExpectedToken::PrimaryExpression => "expression".to_string(), ExpectedToken::Assignment => "assignment or increment/decrement".to_string(), ExpectedToken::FieldName => "field name or a closing curly bracket to signify the end of the struct".to_string(), ExpectedToken::TypeAttribute => "type attribute".to_string(), ExpectedToken::Statement => "statement".to_string(), ExpectedToken::SwitchItem => "switch item ('case' or 'default') or a closing curly bracket to signify the end of the switch statement ('}')".to_string(), ExpectedToken::WorkgroupSizeSeparator => "workgroup size separator (',') or a closing parenthesis".to_string(), ExpectedToken::GlobalItem => "global item ('struct', 'let', 'var', 'type', ';', 'fn') or the end of the file".to_string(), }; ParseError { message: format!( "expected {}, found '{}'", expected_str, &source[unexpected_span.clone()], ), labels: vec![( unexpected_span.clone(), format!("expected {}", expected_str).into(), )], notes: vec![], } } Error::UnexpectedComponents(ref bad_span) => ParseError { message: "unexpected components".to_string(), labels: vec![(bad_span.clone(), "unexpected components".into())], notes: vec![], }, Error::BadNumber(ref bad_span, ref err) => ParseError { message: format!("{}: `{}`", err, &source[bad_span.clone()],), labels: vec![(bad_span.clone(), err.to_string().into())], notes: vec![], }, Error::NegativeInt(ref bad_span) => ParseError { message: format!( "expected non-negative integer literal, found `{}`", &source[bad_span.clone()], ), labels: vec![(bad_span.clone(), "expected non-negative integer".into())], notes: vec![], }, Error::BadU32Constant(ref bad_span) => ParseError { message: format!( "expected unsigned integer constant expression, found `{}`", &source[bad_span.clone()], ), labels: vec![(bad_span.clone(), "expected unsigned integer".into())], notes: vec![], }, Error::BadMatrixScalarKind(ref span, kind, width) => ParseError { message: format!( "matrix scalar type must be floating-point, but found `{}`", kind.to_wgsl(width) ), labels: vec![(span.clone(), "must be floating-point (e.g. `f32`)".into())], notes: vec![], }, Error::BadAccessor(ref accessor_span) => ParseError { message: format!( "invalid field accessor `{}`", &source[accessor_span.clone()], ), labels: vec![(accessor_span.clone(), "invalid accessor".into())], notes: vec![], }, Error::UnknownIdent(ref ident_span, ident) => ParseError { message: format!("no definition in scope for identifier: '{}'", ident), labels: vec![(ident_span.clone(), "unknown identifier".into())], notes: vec![], }, Error::UnknownScalarType(ref bad_span) => ParseError { message: format!("unknown scalar type: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown scalar type".into())], notes: vec!["Valid scalar types are f16, f32, f64, \ i8, i16, i32, i64, \ u8, u16, u32, u64, bool" .into()], }, Error::BadTextureSampleType { ref span, kind, width, } => ParseError { message: format!( "texture sample type must be one of f32, i32 or u32, but found {}", kind.to_wgsl(width) ), labels: vec![(span.clone(), "must be one of f32, i32 or u32".into())], notes: vec![], }, Error::BadIncrDecrReferenceType(ref span) => ParseError { message: "increment/decrement operation requires reference type to be one of i32 or u32" .to_string(), labels: vec![( span.clone(), "must be a reference type of i32 or u32".into(), )], notes: vec![], }, Error::BadTexture(ref bad_span) => ParseError { message: format!( "expected an image, but found '{}' which is not an image", &source[bad_span.clone()] ), labels: vec![(bad_span.clone(), "not an image".into())], notes: vec![], }, Error::BadTypeCast { ref span, ref from_type, ref to_type, } => { let msg = format!("cannot cast a {} to a {}", from_type, to_type); ParseError { message: msg.clone(), labels: vec![(span.clone(), msg.into())], notes: vec![], } } Error::InvalidResolve(ref resolve_error) => ParseError { message: resolve_error.to_string(), labels: vec![], notes: vec![], }, Error::InvalidForInitializer(ref bad_span) => ParseError { message: format!( "for(;;) initializer is not an assignment or a function call: '{}'", &source[bad_span.clone()] ), labels: vec![( bad_span.clone(), "not an assignment or function call".into(), )], notes: vec![], }, Error::InvalidBreakIf(ref bad_span) => ParseError { message: "A break if is only allowed in a continuing block".to_string(), labels: vec![(bad_span.clone(), "not in a continuing block".into())], notes: vec![], }, Error::InvalidGatherComponent(ref bad_span, component) => ParseError { message: format!( "textureGather component {} doesn't exist, must be 0, 1, 2, or 3", component ), labels: vec![(bad_span.clone(), "invalid component".into())], notes: vec![], }, Error::InvalidConstructorComponentType(ref bad_span, component) => ParseError { message: format!( "invalid type for constructor component at index [{}]", component ), labels: vec![(bad_span.clone(), "invalid component type".into())], notes: vec![], }, Error::InvalidIdentifierUnderscore(ref bad_span) => ParseError { message: "Identifier can't be '_'".to_string(), labels: vec![(bad_span.clone(), "invalid identifier".into())], notes: vec![ "Use phony assignment instead ('_ =' notice the absence of 'let' or 'var')" .to_string(), ], }, Error::ReservedIdentifierPrefix(ref bad_span) => ParseError { message: format!( "Identifier starts with a reserved prefix: '{}'", &source[bad_span.clone()] ), labels: vec![(bad_span.clone(), "invalid identifier".into())], notes: vec![], }, Error::UnknownAddressSpace(ref bad_span) => ParseError { message: format!("unknown address space: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown address space".into())], notes: vec![], }, Error::UnknownAttribute(ref bad_span) => ParseError { message: format!("unknown attribute: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown attribute".into())], notes: vec![], }, Error::UnknownBuiltin(ref bad_span) => ParseError { message: format!("unknown builtin: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown builtin".into())], notes: vec![], }, Error::UnknownAccess(ref bad_span) => ParseError { message: format!("unknown access: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown access".into())], notes: vec![], }, Error::UnknownShaderStage(ref bad_span) => ParseError { message: format!("unknown shader stage: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown shader stage".into())], notes: vec![], }, Error::UnknownStorageFormat(ref bad_span) => ParseError { message: format!("unknown storage format: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown storage format".into())], notes: vec![], }, Error::UnknownConservativeDepth(ref bad_span) => ParseError { message: format!( "unknown conservative depth: '{}'", &source[bad_span.clone()] ), labels: vec![(bad_span.clone(), "unknown conservative depth".into())], notes: vec![], }, Error::UnknownType(ref bad_span) => ParseError { message: format!("unknown type: '{}'", &source[bad_span.clone()]), labels: vec![(bad_span.clone(), "unknown type".into())], notes: vec![], }, Error::SizeAttributeTooLow(ref bad_span, min_size) => ParseError { message: format!("struct member size must be at least {}", min_size), labels: vec![( bad_span.clone(), format!("must be at least {}", min_size).into(), )], notes: vec![], }, Error::AlignAttributeTooLow(ref bad_span, min_align) => ParseError { message: format!("struct member alignment must be at least {}", min_align), labels: vec![( bad_span.clone(), format!("must be at least {}", min_align).into(), )], notes: vec![], }, Error::NonPowerOfTwoAlignAttribute(ref bad_span) => ParseError { message: "struct member alignment must be a power of 2".to_string(), labels: vec![(bad_span.clone(), "must be a power of 2".into())], notes: vec![], }, Error::InconsistentBinding(ref span) => ParseError { message: "input/output binding is not consistent".to_string(), labels: vec![( span.clone(), "input/output binding is not consistent".into(), )], notes: vec![], }, Error::UnknownLocalFunction(ref span) => ParseError { message: format!("unknown local function `{}`", &source[span.clone()]), labels: vec![(span.clone(), "unknown local function".into())], notes: vec![], }, Error::TypeNotConstructible(ref span) => ParseError { message: format!("type `{}` is not constructible", &source[span.clone()]), labels: vec![(span.clone(), "type is not constructible".into())], notes: vec![], }, Error::TypeNotInferrable(ref span) => ParseError { message: "type can't be inferred".to_string(), labels: vec![(span.clone(), "type can't be inferred".into())], notes: vec![], }, Error::InitializationTypeMismatch(ref name_span, ref expected_ty) => ParseError { message: format!( "the type of `{}` is expected to be `{}`", &source[name_span.clone()], expected_ty ), labels: vec![( name_span.clone(), format!("definition of `{}`", &source[name_span.clone()]).into(), )], notes: vec![], }, Error::MissingType(ref name_span) => ParseError { message: format!("variable `{}` needs a type", &source[name_span.clone()]), labels: vec![( name_span.clone(), format!("definition of `{}`", &source[name_span.clone()]).into(), )], notes: vec![], }, Error::MissingAttribute(name, ref name_span) => ParseError { message: format!( "variable `{}` needs a '{}' attribute", &source[name_span.clone()], name ), labels: vec![( name_span.clone(), format!("definition of `{}`", &source[name_span.clone()]).into(), )], notes: vec![], }, Error::InvalidAtomicPointer(ref span) => ParseError { message: "atomic operation is done on a pointer to a non-atomic".to_string(), labels: vec![(span.clone(), "atomic pointer is invalid".into())], notes: vec![], }, Error::InvalidAtomicOperandType(ref span) => ParseError { message: "atomic operand type is inconsistent with the operation".to_string(), labels: vec![(span.clone(), "atomic operand type is invalid".into())], notes: vec![], }, Error::NotPointer(ref span) => ParseError { message: "the operand of the `*` operator must be a pointer".to_string(), labels: vec![(span.clone(), "expression is not a pointer".into())], notes: vec![], }, Error::NotReference(what, ref span) => ParseError { message: format!("{} must be a reference", what), labels: vec![(span.clone(), "expression is not a reference".into())], notes: vec![], }, Error::InvalidAssignment { ref span, ty } => ParseError { message: "invalid left-hand side of assignment".into(), labels: vec![(span.clone(), "cannot assign to this expression".into())], notes: match ty { InvalidAssignmentType::Swizzle => vec![ "WGSL does not support assignments to swizzles".into(), "consider assigning each component individually".into(), ], InvalidAssignmentType::ImmutableBinding => vec![ format!("'{}' is an immutable binding", &source[span.clone()]), "consider declaring it with `var` instead of `let`".into(), ], InvalidAssignmentType::Other => vec![], }, }, Error::Pointer(what, ref span) => ParseError { message: format!("{} must not be a pointer", what), labels: vec![(span.clone(), "expression is a pointer".into())], notes: vec![], }, Error::ReservedKeyword(ref name_span) => ParseError { message: format!( "name `{}` is a reserved keyword", &source[name_span.clone()] ), labels: vec![( name_span.clone(), format!("definition of `{}`", &source[name_span.clone()]).into(), )], notes: vec![], }, Error::Redefinition { ref previous, ref current, } => ParseError { message: format!("redefinition of `{}`", &source[current.clone()]), labels: vec![ ( current.clone(), format!("redefinition of `{}`", &source[current.clone()]).into(), ), ( previous.clone(), format!("previous definition of `{}`", &source[previous.clone()]).into(), ), ], notes: vec![], }, Error::Other => ParseError { message: "other error".to_string(), labels: vec![], notes: vec![], }, } } } impl crate::StorageFormat { const fn to_wgsl(self) -> &'static str { use crate::StorageFormat as Sf; match self { Sf::R8Unorm => "r8unorm", Sf::R8Snorm => "r8snorm", Sf::R8Uint => "r8uint", Sf::R8Sint => "r8sint", Sf::R16Uint => "r16uint", Sf::R16Sint => "r16sint", Sf::R16Float => "r16float", Sf::Rg8Unorm => "rg8unorm", Sf::Rg8Snorm => "rg8snorm", Sf::Rg8Uint => "rg8uint", Sf::Rg8Sint => "rg8sint", Sf::R32Uint => "r32uint", Sf::R32Sint => "r32sint", Sf::R32Float => "r32float", Sf::Rg16Uint => "rg16uint", Sf::Rg16Sint => "rg16sint", Sf::Rg16Float => "rg16float", Sf::Rgba8Unorm => "rgba8unorm", Sf::Rgba8Snorm => "rgba8snorm", Sf::Rgba8Uint => "rgba8uint", Sf::Rgba8Sint => "rgba8sint", Sf::Rgb10a2Unorm => "rgb10a2unorm", Sf::Rg11b10Float => "rg11b10float", Sf::Rg32Uint => "rg32uint", Sf::Rg32Sint => "rg32sint", Sf::Rg32Float => "rg32float", Sf::Rgba16Uint => "rgba16uint", Sf::Rgba16Sint => "rgba16sint", Sf::Rgba16Float => "rgba16float", Sf::Rgba32Uint => "rgba32uint", Sf::Rgba32Sint => "rgba32sint", Sf::Rgba32Float => "rgba32float", } } } impl crate::TypeInner { /// Formats the type as it is written in wgsl. /// /// For example `vec3`. /// /// Note: The names of a `TypeInner::Struct` is not known. Therefore this method will simply return "struct" for them. fn to_wgsl( &self, types: &UniqueArena, constants: &Arena, ) -> String { use crate::TypeInner as Ti; match *self { Ti::Scalar { kind, width } => kind.to_wgsl(width), Ti::Vector { size, kind, width } => { format!("vec{}<{}>", size as u32, kind.to_wgsl(width)) } Ti::Matrix { columns, rows, width, } => { format!( "mat{}x{}<{}>", columns as u32, rows as u32, crate::ScalarKind::Float.to_wgsl(width), ) } Ti::Atomic { kind, width } => { format!("atomic<{}>", kind.to_wgsl(width)) } Ti::Pointer { base, .. } => { let base = &types[base]; let name = base.name.as_deref().unwrap_or("unknown"); format!("ptr<{}>", name) } Ti::ValuePointer { kind, width, .. } => { format!("ptr<{}>", kind.to_wgsl(width)) } Ti::Array { base, size, .. } => { let member_type = &types[base]; let base = member_type.name.as_deref().unwrap_or("unknown"); match size { crate::ArraySize::Constant(size) => { let size = constants[size].name.as_deref().unwrap_or("unknown"); format!("array<{}, {}>", base, size) } crate::ArraySize::Dynamic => format!("array<{}>", base), } } Ti::Struct { .. } => { // TODO: Actually output the struct? "struct".to_string() } Ti::Image { dim, arrayed, class, } => { let dim_suffix = match dim { crate::ImageDimension::D1 => "_1d", crate::ImageDimension::D2 => "_2d", crate::ImageDimension::D3 => "_3d", crate::ImageDimension::Cube => "_cube", }; let array_suffix = if arrayed { "_array" } else { "" }; let class_suffix = match class { crate::ImageClass::Sampled { multi: true, .. } => "_multisampled", crate::ImageClass::Depth { multi: false } => "_depth", crate::ImageClass::Depth { multi: true } => "_depth_multisampled", crate::ImageClass::Sampled { multi: false, .. } | crate::ImageClass::Storage { .. } => "", }; let type_in_brackets = match class { crate::ImageClass::Sampled { kind, .. } => { // Note: The only valid widths are 4 bytes wide. // The lexer has already verified this, so we can safely assume it here. // https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type let element_type = kind.to_wgsl(4); format!("<{}>", element_type) } crate::ImageClass::Depth { multi: _ } => String::new(), crate::ImageClass::Storage { format, access } => { if access.contains(crate::StorageAccess::STORE) { format!("<{},write>", format.to_wgsl()) } else { format!("<{}>", format.to_wgsl()) } } }; format!( "texture{}{}{}{}", class_suffix, dim_suffix, array_suffix, type_in_brackets ) } Ti::Sampler { .. } => "sampler".to_string(), Ti::BindingArray { base, size, .. } => { let member_type = &types[base]; let base = member_type.name.as_deref().unwrap_or("unknown"); match size { crate::ArraySize::Constant(size) => { let size = constants[size].name.as_deref().unwrap_or("unknown"); format!("binding_array<{}, {}>", base, size) } crate::ArraySize::Dynamic => format!("binding_array<{}>", base), } } } } } mod type_inner_tests { #[test] fn to_wgsl() { let mut types = crate::UniqueArena::new(); let mut constants = crate::Arena::new(); let c = constants.append( crate::Constant { name: Some("C".to_string()), specialization: None, inner: crate::ConstantInner::Scalar { width: 4, value: crate::ScalarValue::Uint(32), }, }, Default::default(), ); let mytype1 = types.insert( crate::Type { name: Some("MyType1".to_string()), inner: crate::TypeInner::Struct { members: vec![], span: 0, }, }, Default::default(), ); let mytype2 = types.insert( crate::Type { name: Some("MyType2".to_string()), inner: crate::TypeInner::Struct { members: vec![], span: 0, }, }, Default::default(), ); let array = crate::TypeInner::Array { base: mytype1, stride: 4, size: crate::ArraySize::Constant(c), }; assert_eq!(array.to_wgsl(&types, &constants), "array"); let mat = crate::TypeInner::Matrix { rows: crate::VectorSize::Quad, columns: crate::VectorSize::Bi, width: 8, }; assert_eq!(mat.to_wgsl(&types, &constants), "mat2x4"); let ptr = crate::TypeInner::Pointer { base: mytype2, space: crate::AddressSpace::Storage { access: crate::StorageAccess::default(), }, }; assert_eq!(ptr.to_wgsl(&types, &constants), "ptr"); let img1 = crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: true, }, }; assert_eq!( img1.to_wgsl(&types, &constants), "texture_multisampled_2d" ); let img2 = crate::TypeInner::Image { dim: crate::ImageDimension::Cube, arrayed: true, class: crate::ImageClass::Depth { multi: false }, }; assert_eq!(img2.to_wgsl(&types, &constants), "texture_depth_cube_array"); let img3 = crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Depth { multi: true }, }; assert_eq!( img3.to_wgsl(&types, &constants), "texture_depth_multisampled_2d" ); let array = crate::TypeInner::BindingArray { base: mytype1, size: crate::ArraySize::Constant(c), }; assert_eq!( array.to_wgsl(&types, &constants), "binding_array" ); } } impl crate::ScalarKind { /// Format a scalar kind+width as a type is written in wgsl. /// /// Examples: `f32`, `u64`, `bool`. fn to_wgsl(self, width: u8) -> String { let prefix = match self { crate::ScalarKind::Sint => "i", crate::ScalarKind::Uint => "u", crate::ScalarKind::Float => "f", crate::ScalarKind::Bool => return "bool".to_string(), }; format!("{}{}", prefix, width * 8) } } trait StringValueLookup<'a> { type Value; fn lookup(&self, key: &'a str, span: Span) -> Result>; } impl<'a> StringValueLookup<'a> for FastHashMap<&'a str, TypedExpression> { type Value = TypedExpression; fn lookup(&self, key: &'a str, span: Span) -> Result> { self.get(key).cloned().ok_or(Error::UnknownIdent(span, key)) } } struct StatementContext<'input, 'temp, 'out> { symbol_table: &'temp mut super::SymbolTable<&'input str, TypedExpression>, typifier: &'temp mut super::Typifier, variables: &'out mut Arena, expressions: &'out mut Arena, named_expressions: &'out mut FastHashMap, String>, types: &'out mut UniqueArena, constants: &'out mut Arena, global_vars: &'out Arena, functions: &'out Arena, arguments: &'out [crate::FunctionArgument], } impl<'a, 'temp> StatementContext<'a, 'temp, '_> { fn reborrow(&mut self) -> StatementContext<'a, '_, '_> { StatementContext { symbol_table: self.symbol_table, typifier: self.typifier, variables: self.variables, expressions: self.expressions, named_expressions: self.named_expressions, types: self.types, constants: self.constants, global_vars: self.global_vars, functions: self.functions, arguments: self.arguments, } } fn as_expression<'t>( &'t mut self, block: &'t mut crate::Block, emitter: &'t mut super::Emitter, ) -> ExpressionContext<'a, 't, '_> where 'temp: 't, { ExpressionContext { symbol_table: self.symbol_table, typifier: self.typifier, expressions: self.expressions, types: self.types, constants: self.constants, global_vars: self.global_vars, local_vars: self.variables, functions: self.functions, arguments: self.arguments, block, emitter, } } } struct SamplingContext { image: Handle, arrayed: bool, } struct ExpressionContext<'input, 'temp, 'out> { symbol_table: &'temp mut super::SymbolTable<&'input str, TypedExpression>, typifier: &'temp mut super::Typifier, expressions: &'out mut Arena, types: &'out mut UniqueArena, constants: &'out mut Arena, global_vars: &'out Arena, local_vars: &'out Arena, arguments: &'out [crate::FunctionArgument], functions: &'out Arena, block: &'temp mut crate::Block, emitter: &'temp mut super::Emitter, } impl<'a> ExpressionContext<'a, '_, '_> { fn reborrow(&mut self) -> ExpressionContext<'a, '_, '_> { ExpressionContext { symbol_table: self.symbol_table, typifier: self.typifier, expressions: self.expressions, types: self.types, constants: self.constants, global_vars: self.global_vars, local_vars: self.local_vars, functions: self.functions, arguments: self.arguments, block: self.block, emitter: self.emitter, } } fn resolve_type( &mut self, handle: Handle, ) -> Result<&crate::TypeInner, Error<'a>> { let resolve_ctx = ResolveContext { constants: self.constants, types: self.types, global_vars: self.global_vars, local_vars: self.local_vars, functions: self.functions, arguments: self.arguments, }; match self.typifier.grow(handle, self.expressions, &resolve_ctx) { Err(e) => Err(Error::InvalidResolve(e)), Ok(()) => Ok(self.typifier.get(handle, self.types)), } } fn prepare_sampling( &mut self, image: Handle, span: Span, ) -> Result> { Ok(SamplingContext { image, arrayed: match *self.resolve_type(image)? { crate::TypeInner::Image { arrayed, .. } => arrayed, _ => return Err(Error::BadTexture(span)), }, }) } fn parse_binary_op( &mut self, lexer: &mut Lexer<'a>, classifier: impl Fn(Token<'a>) -> Option, mut parser: impl FnMut( &mut Lexer<'a>, ExpressionContext<'a, '_, '_>, ) -> Result>, ) -> Result> { let start = lexer.start_byte_offset() as u32; let mut accumulator = parser(lexer, self.reborrow())?; while let Some(op) = classifier(lexer.peek().0) { let _ = lexer.next(); // Binary expressions always apply the load rule to their operands. let mut left = self.apply_load_rule(accumulator); let unloaded_right = parser(lexer, self.reborrow())?; let right = self.apply_load_rule(unloaded_right); let end = lexer.end_byte_offset() as u32; left = self.expressions.append( crate::Expression::Binary { op, left, right }, NagaSpan::new(start, end), ); // Binary expressions never produce references. accumulator = TypedExpression::non_reference(left); } Ok(accumulator) } fn parse_binary_splat_op( &mut self, lexer: &mut Lexer<'a>, classifier: impl Fn(Token<'a>) -> Option, mut parser: impl FnMut( &mut Lexer<'a>, ExpressionContext<'a, '_, '_>, ) -> Result>, ) -> Result> { let start = lexer.start_byte_offset() as u32; let mut accumulator = parser(lexer, self.reborrow())?; while let Some(op) = classifier(lexer.peek().0) { let _ = lexer.next(); // Binary expressions always apply the load rule to their operands. let mut left = self.apply_load_rule(accumulator); let unloaded_right = parser(lexer, self.reborrow())?; let mut right = self.apply_load_rule(unloaded_right); let end = lexer.end_byte_offset() as u32; self.binary_op_splat(op, &mut left, &mut right)?; accumulator = TypedExpression::non_reference(self.expressions.append( crate::Expression::Binary { op, left, right }, NagaSpan::new(start, end), )); } Ok(accumulator) } /// Insert splats, if needed by the non-'*' operations. fn binary_op_splat( &mut self, op: crate::BinaryOperator, left: &mut Handle, right: &mut Handle, ) -> Result<(), Error<'a>> { if op != crate::BinaryOperator::Multiply { let left_size = match *self.resolve_type(*left)? { crate::TypeInner::Vector { size, .. } => Some(size), _ => None, }; match (left_size, self.resolve_type(*right)?) { (Some(size), &crate::TypeInner::Scalar { .. }) => { *right = self.expressions.append( crate::Expression::Splat { size, value: *right, }, self.expressions.get_span(*right), ); } (None, &crate::TypeInner::Vector { size, .. }) => { *left = self.expressions.append( crate::Expression::Splat { size, value: *left }, self.expressions.get_span(*left), ); } _ => {} } } Ok(()) } /// Add a single expression to the expression table that is not covered by `self.emitter`. /// /// This is useful for `CallResult` and `AtomicResult` expressions, which should not be covered by /// `Emit` statements. fn interrupt_emitter( &mut self, expression: crate::Expression, span: NagaSpan, ) -> Handle { self.block.extend(self.emitter.finish(self.expressions)); let result = self.expressions.append(expression, span); self.emitter.start(self.expressions); result } /// Apply the WGSL Load Rule to `expr`. /// /// If `expr` is has type `ref`, perform a load to produce a value of type /// `T`. Otherwise, return `expr` unchanged. fn apply_load_rule(&mut self, expr: TypedExpression) -> Handle { if expr.is_reference { let load = crate::Expression::Load { pointer: expr.handle, }; let span = self.expressions.get_span(expr.handle); self.expressions.append(load, span) } else { expr.handle } } /// Creates a zero value constant of type `ty` /// /// Returns `None` if the given `ty` is not a constructible type fn create_zero_value_constant( &mut self, ty: Handle, ) -> Option> { let inner = match self.types[ty].inner { crate::TypeInner::Scalar { kind, width } => { let value = match kind { crate::ScalarKind::Sint => crate::ScalarValue::Sint(0), crate::ScalarKind::Uint => crate::ScalarValue::Uint(0), crate::ScalarKind::Float => crate::ScalarValue::Float(0.), crate::ScalarKind::Bool => crate::ScalarValue::Bool(false), }; crate::ConstantInner::Scalar { width, value } } crate::TypeInner::Vector { size, kind, width } => { let scalar_ty = self.types.insert( crate::Type { name: None, inner: crate::TypeInner::Scalar { width, kind }, }, Default::default(), ); let component = self.create_zero_value_constant(scalar_ty); crate::ConstantInner::Composite { ty, components: (0..size as u8).map(|_| component).collect::>()?, } } crate::TypeInner::Matrix { columns, rows, width, } => { let vec_ty = self.types.insert( crate::Type { name: None, inner: crate::TypeInner::Vector { width, kind: crate::ScalarKind::Float, size: rows, }, }, Default::default(), ); let component = self.create_zero_value_constant(vec_ty); crate::ConstantInner::Composite { ty, components: (0..columns as u8) .map(|_| component) .collect::>()?, } } crate::TypeInner::Array { base, size: crate::ArraySize::Constant(size), .. } => { let component = self.create_zero_value_constant(base); crate::ConstantInner::Composite { ty, components: (0..self.constants[size].to_array_length().unwrap()) .map(|_| component) .collect::>()?, } } crate::TypeInner::Struct { ref members, .. } => { let members = members.clone(); crate::ConstantInner::Composite { ty, components: members .iter() .map(|member| self.create_zero_value_constant(member.ty)) .collect::>()?, } } _ => return None, }; let constant = self.constants.fetch_or_append( crate::Constant { name: None, specialization: None, inner, }, crate::Span::default(), ); Some(constant) } } /// A Naga [`Expression`] handle, with WGSL type information. /// /// Naga and WGSL types are very close, but Naga lacks WGSL's 'reference' types, /// which we need to know to apply the Load Rule. This struct carries a Naga /// `Handle` along with enough information to determine its WGSL type. /// /// [`Expression`]: crate::Expression #[derive(Debug, Copy, Clone)] struct TypedExpression { /// The handle of the Naga expression. handle: Handle, /// True if this expression's WGSL type is a reference. /// /// When this is true, `handle` must be a pointer. is_reference: bool, } impl TypedExpression { const fn non_reference(handle: Handle) -> TypedExpression { TypedExpression { handle, is_reference: false, } } } enum Composition { Single(u32), Multi(crate::VectorSize, [crate::SwizzleComponent; 4]), } impl Composition { const fn letter_component(letter: char) -> Option { use crate::SwizzleComponent as Sc; match letter { 'x' | 'r' => Some(Sc::X), 'y' | 'g' => Some(Sc::Y), 'z' | 'b' => Some(Sc::Z), 'w' | 'a' => Some(Sc::W), _ => None, } } fn extract_impl(name: &str, name_span: Span) -> Result { let ch = name .chars() .next() .ok_or_else(|| Error::BadAccessor(name_span.clone()))?; match Self::letter_component(ch) { Some(sc) => Ok(sc as u32), None => Err(Error::BadAccessor(name_span)), } } fn make(name: &str, name_span: Span) -> Result { if name.len() > 1 { let mut components = [crate::SwizzleComponent::X; 4]; for (comp, ch) in components.iter_mut().zip(name.chars()) { *comp = Self::letter_component(ch) .ok_or_else(|| Error::BadAccessor(name_span.clone()))?; } let size = match name.len() { 2 => crate::VectorSize::Bi, 3 => crate::VectorSize::Tri, 4 => crate::VectorSize::Quad, _ => return Err(Error::BadAccessor(name_span)), }; Ok(Composition::Multi(size, components)) } else { Self::extract_impl(name, name_span).map(Composition::Single) } } } #[derive(Default)] struct TypeAttributes { // Although WGSL nas no type attributes at the moment, it had them in the past // (`[[stride]]`) and may as well acquire some again in the future. // Therefore, we are leaving the plumbing in for now. } /// Which grammar rule we are in the midst of parsing. /// /// This is used for error checking. `Parser` maintains a stack of /// these and (occasionally) checks that it is being pushed and popped /// as expected. #[derive(Clone, Debug, PartialEq)] enum Rule { Attribute, VariableDecl, TypeDecl, FunctionDecl, Block, Statement, ConstantExpr, PrimaryExpr, SingularExpr, UnaryExpr, GeneralExpr, } type LocalFunctionCall = (Handle, Vec>); #[derive(Default)] struct BindingParser { location: Option, built_in: Option, interpolation: Option, sampling: Option, invariant: bool, } impl BindingParser { fn parse<'a>( &mut self, lexer: &mut Lexer<'a>, name: &'a str, name_span: Span, ) -> Result<(), Error<'a>> { match name { "location" => { lexer.expect(Token::Paren('('))?; self.location = Some(Parser::parse_non_negative_i32_literal(lexer)?); lexer.expect(Token::Paren(')'))?; } "builtin" => { lexer.expect(Token::Paren('('))?; let (raw, span) = lexer.next_ident_with_span()?; self.built_in = Some(conv::map_built_in(raw, span)?); lexer.expect(Token::Paren(')'))?; } "interpolate" => { lexer.expect(Token::Paren('('))?; let (raw, span) = lexer.next_ident_with_span()?; self.interpolation = Some(conv::map_interpolation(raw, span)?); if lexer.skip(Token::Separator(',')) { let (raw, span) = lexer.next_ident_with_span()?; self.sampling = Some(conv::map_sampling(raw, span)?); } lexer.expect(Token::Paren(')'))?; } "invariant" => self.invariant = true, _ => return Err(Error::UnknownAttribute(name_span)), } Ok(()) } const fn finish<'a>(self, span: Span) -> Result, Error<'a>> { match ( self.location, self.built_in, self.interpolation, self.sampling, self.invariant, ) { (None, None, None, None, false) => Ok(None), (Some(location), None, interpolation, sampling, false) => { // Before handing over the completed `Module`, we call // `apply_default_interpolation` to ensure that the interpolation and // sampling have been explicitly specified on all vertex shader output and fragment // shader input user bindings, so leaving them potentially `None` here is fine. Ok(Some(crate::Binding::Location { location, interpolation, sampling, })) } (None, Some(crate::BuiltIn::Position { .. }), None, None, invariant) => { Ok(Some(crate::Binding::BuiltIn(crate::BuiltIn::Position { invariant, }))) } (None, Some(built_in), None, None, false) => { Ok(Some(crate::Binding::BuiltIn(built_in))) } (_, _, _, _, _) => Err(Error::InconsistentBinding(span)), } } } struct ParsedVariable<'a> { name: &'a str, name_span: Span, space: Option, ty: Handle, init: Option>, } struct CalledFunction { result: Option>, } #[derive(Clone, Debug)] pub struct ParseError { message: String, labels: Vec<(Span, Cow<'static, str>)>, notes: Vec, } impl ParseError { pub fn labels(&self) -> impl Iterator + ExactSizeIterator + '_ { self.labels .iter() .map(|&(ref span, ref msg)| (span.clone(), msg.as_ref())) } pub fn message(&self) -> &str { &self.message } fn diagnostic(&self) -> Diagnostic<()> { let diagnostic = Diagnostic::error() .with_message(self.message.to_string()) .with_labels( self.labels .iter() .map(|label| { Label::primary((), label.0.clone()).with_message(label.1.to_string()) }) .collect(), ) .with_notes( self.notes .iter() .map(|note| format!("note: {}", note)) .collect(), ); diagnostic } /// Emits a summary of the error to standard error stream. pub fn emit_to_stderr(&self, source: &str) { self.emit_to_stderr_with_path(source, "wgsl") } /// Emits a summary of the error to standard error stream. pub fn emit_to_stderr_with_path(&self, source: &str, path: &str) { let files = SimpleFile::new(path, source); let config = codespan_reporting::term::Config::default(); let writer = StandardStream::stderr(ColorChoice::Auto); term::emit(&mut writer.lock(), &config, &files, &self.diagnostic()) .expect("cannot write error"); } /// Emits a summary of the error to a string. pub fn emit_to_string(&self, source: &str) -> String { self.emit_to_string_with_path(source, "wgsl") } /// Emits a summary of the error to a string. pub fn emit_to_string_with_path(&self, source: &str, path: &str) -> String { let files = SimpleFile::new(path, source); let config = codespan_reporting::term::Config::default(); let mut writer = NoColor::new(Vec::new()); term::emit(&mut writer, &config, &files, &self.diagnostic()).expect("cannot write error"); String::from_utf8(writer.into_inner()).unwrap() } /// Returns a [`SourceLocation`] for the first label in the error message. pub fn location(&self, source: &str) -> Option { self.labels .get(0) .map(|label| NagaSpan::new(label.0.start as u32, label.0.end as u32).location(source)) } } impl std::fmt::Display for ParseError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.message) } } impl std::error::Error for ParseError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None } } pub struct Parser { rules: Vec<(Rule, usize)>, module_scope_identifiers: FastHashMap, lookup_type: FastHashMap>, layouter: Layouter, } impl Parser { pub fn new() -> Self { Parser { rules: Vec::new(), module_scope_identifiers: FastHashMap::default(), lookup_type: FastHashMap::default(), layouter: Default::default(), } } fn reset(&mut self) { self.rules.clear(); self.module_scope_identifiers.clear(); self.lookup_type.clear(); self.layouter.clear(); } fn push_rule_span(&mut self, rule: Rule, lexer: &mut Lexer<'_>) { self.rules.push((rule, lexer.start_byte_offset())); } fn pop_rule_span(&mut self, lexer: &Lexer<'_>) -> Span { let (_, initial) = self.rules.pop().unwrap(); lexer.span_from(initial) } fn peek_rule_span(&mut self, lexer: &Lexer<'_>) -> Span { let &(_, initial) = self.rules.last().unwrap(); lexer.span_from(initial) } fn parse_switch_value<'a>(lexer: &mut Lexer<'a>, uint: bool) -> Result> { let token_span = lexer.next(); match token_span.0 { Token::Number(Ok(Number::U32(num))) if uint => Ok(num as i32), Token::Number(Ok(Number::I32(num))) if !uint => Ok(num), Token::Number(Err(e)) => Err(Error::BadNumber(token_span.1, e)), _ => Err(Error::Unexpected(token_span.1, ExpectedToken::Integer)), } } /// Parse a non-negative signed integer literal. /// This is for attributes like `size`, `location` and others. fn parse_non_negative_i32_literal<'a>(lexer: &mut Lexer<'a>) -> Result> { match lexer.next() { (Token::Number(Ok(Number::I32(num))), span) => { u32::try_from(num).map_err(|_| Error::NegativeInt(span)) } (Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)), other => Err(Error::Unexpected( other.1, ExpectedToken::Number(NumberType::I32), )), } } /// Parse a non-negative integer literal that may be either signed or unsigned. /// This is for the `workgroup_size` attribute and array lengths. /// Note: these values should be no larger than [`i32::MAX`], but this is not checked here. fn parse_generic_non_negative_int_literal<'a>(lexer: &mut Lexer<'a>) -> Result> { match lexer.next() { (Token::Number(Ok(Number::I32(num))), span) => { u32::try_from(num).map_err(|_| Error::NegativeInt(span)) } (Token::Number(Ok(Number::U32(num))), _) => Ok(num), (Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)), other => Err(Error::Unexpected( other.1, ExpectedToken::Number(NumberType::I32), )), } } fn parse_atomic_pointer<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result, Error<'a>> { let (pointer, pointer_span) = lexer.capture_span(|lexer| self.parse_general_expression(lexer, ctx.reborrow()))?; // Check if the pointer expression is to an atomic. // The IR uses regular `Expression::Load` and `Statement::Store` for atomic load/stores, // and it will not catch the use of a non-atomic variable here. match *ctx.resolve_type(pointer)? { crate::TypeInner::Pointer { base, .. } => match ctx.types[base].inner { crate::TypeInner::Atomic { .. } => Ok(pointer), ref other => { log::error!("Pointer type to {:?} passed to atomic op", other); Err(Error::InvalidAtomicPointer(pointer_span)) } }, ref other => { log::error!("Type {:?} passed to atomic op", other); Err(Error::InvalidAtomicPointer(pointer_span)) } } } /// Expects name to be peeked from lexer, does not consume if returns None. fn parse_local_function_call<'a>( &mut self, lexer: &mut Lexer<'a>, name: &'a str, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result, Error<'a>> { let fun_handle = match ctx.functions.iter().find(|&(_, fun)| match fun.name { Some(ref string) => string == name, None => false, }) { Some((fun_handle, _)) => fun_handle, None => return Ok(None), }; let count = ctx.functions[fun_handle].arguments.len(); let mut arguments = Vec::with_capacity(count); let _ = lexer.next(); lexer.open_arguments()?; while arguments.len() != count { if !arguments.is_empty() { lexer.expect(Token::Separator(','))?; } let arg = self.parse_general_expression(lexer, ctx.reborrow())?; arguments.push(arg); } lexer.close_arguments()?; Ok(Some((fun_handle, arguments))) } fn parse_atomic_helper<'a>( &mut self, lexer: &mut Lexer<'a>, fun: crate::AtomicFunction, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result, Error<'a>> { lexer.open_arguments()?; let pointer = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let ctx_span = ctx.reborrow(); let (value, value_span) = lexer.capture_span(|lexer| self.parse_general_expression(lexer, ctx_span))?; lexer.close_arguments()?; let expression = match *ctx.resolve_type(value)? { crate::TypeInner::Scalar { kind, width } => crate::Expression::AtomicResult { kind, width, comparison: false, }, _ => return Err(Error::InvalidAtomicOperandType(value_span)), }; let span = NagaSpan::from(value_span); let result = ctx.interrupt_emitter(expression, span); ctx.block.push( crate::Statement::Atomic { pointer, fun, value, result, }, span, ); Ok(result) } /// Expects [`Rule::PrimaryExpr`] or [`Rule::SingularExpr`] on top; does not pop it. /// Expects `word` to be peeked (still in lexer), doesn't consume if returning None. fn parse_function_call_inner<'a>( &mut self, lexer: &mut Lexer<'a>, name: &'a str, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result, Error<'a>> { assert!(self.rules.last().is_some()); let expr = if let Some(fun) = conv::map_relational_fun(name) { let _ = lexer.next(); lexer.open_arguments()?; let argument = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::Relational { fun, argument } } else if let Some(axis) = conv::map_derivative_axis(name) { let _ = lexer.next(); lexer.open_arguments()?; let expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::Derivative { axis, expr } } else if let Some(fun) = conv::map_standard_fun(name) { let _ = lexer.next(); lexer.open_arguments()?; let arg_count = fun.argument_count(); let arg = self.parse_general_expression(lexer, ctx.reborrow())?; let arg1 = if arg_count > 1 { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let arg2 = if arg_count > 2 { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let arg3 = if arg_count > 3 { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.close_arguments()?; crate::Expression::Math { fun, arg, arg1, arg2, arg3, } } else { match name { "bitcast" => { let _ = lexer.next(); lexer.expect_generic_paren('<')?; let (ty, type_span) = lexer.capture_span(|lexer| { self.parse_type_decl(lexer, None, ctx.types, ctx.constants) })?; lexer.expect_generic_paren('>')?; lexer.open_arguments()?; let expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; let kind = match ctx.types[ty].inner { crate::TypeInner::Scalar { kind, .. } => kind, crate::TypeInner::Vector { kind, .. } => kind, _ => { return Err(Error::BadTypeCast { from_type: format!("{:?}", ctx.resolve_type(expr)?), span: type_span, to_type: format!("{:?}", ctx.types[ty].inner), }) } }; crate::Expression::As { expr, kind, convert: None, } } "select" => { let _ = lexer.next(); lexer.open_arguments()?; let reject = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let accept = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let condition = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::Select { condition, accept, reject, } } "arrayLength" => { let _ = lexer.next(); lexer.open_arguments()?; let array = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::ArrayLength(array) } // atomics "atomicLoad" => { let _ = lexer.next(); lexer.open_arguments()?; let pointer = self.parse_atomic_pointer(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::Load { pointer } } "atomicAdd" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::Add, ctx.reborrow(), )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicSub" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::Subtract, ctx.reborrow(), )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicAnd" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::And, ctx.reborrow(), )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicOr" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::InclusiveOr, ctx.reborrow(), )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicXor" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::ExclusiveOr, ctx.reborrow(), )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicMin" => { let _ = lexer.next(); let handle = self.parse_atomic_helper(lexer, crate::AtomicFunction::Min, ctx)?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicMax" => { let _ = lexer.next(); let handle = self.parse_atomic_helper(lexer, crate::AtomicFunction::Max, ctx)?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicExchange" => { let _ = lexer.next(); let handle = self.parse_atomic_helper( lexer, crate::AtomicFunction::Exchange { compare: None }, ctx, )?; return Ok(Some(CalledFunction { result: Some(handle), })); } "atomicCompareExchangeWeak" => { let _ = lexer.next(); lexer.open_arguments()?; let pointer = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let cmp = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let (value, value_span) = lexer.capture_span(|lexer| { self.parse_general_expression(lexer, ctx.reborrow()) })?; lexer.close_arguments()?; let expression = match *ctx.resolve_type(value)? { crate::TypeInner::Scalar { kind, width } => { crate::Expression::AtomicResult { kind, width, comparison: true, } } _ => return Err(Error::InvalidAtomicOperandType(value_span)), }; let span = NagaSpan::from(self.peek_rule_span(lexer)); let result = ctx.interrupt_emitter(expression, span); ctx.block.push( crate::Statement::Atomic { pointer, fun: crate::AtomicFunction::Exchange { compare: Some(cmp) }, value, result, }, span, ); return Ok(Some(CalledFunction { result: Some(result), })); } // texture sampling "textureSample" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Auto, depth_ref: None, } } "textureSampleLevel" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let level = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Exact(level), depth_ref: None, } } "textureSampleBias" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let bias = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Bias(bias), depth_ref: None, } } "textureSampleGrad" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let x = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let y = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Gradient { x, y }, depth_ref: None, } } "textureSampleCompare" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let reference = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Auto, depth_ref: Some(reference), } } "textureSampleCompareLevel" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let reference = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: None, coordinate, array_index, offset, level: crate::SampleLevel::Zero, depth_ref: Some(reference), } } "textureGather" => { let _ = lexer.next(); lexer.open_arguments()?; let component = if let (Token::Number(..), span) = lexer.peek() { let index = Self::parse_non_negative_i32_literal(lexer)?; lexer.expect(Token::Separator(','))?; *crate::SwizzleComponent::XYZW .get(index as usize) .ok_or(Error::InvalidGatherComponent(span, index))? } else { crate::SwizzleComponent::X }; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: Some(component), coordinate, array_index, offset, level: crate::SampleLevel::Zero, depth_ref: None, } } "textureGatherCompare" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let sampler_expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let sc = ctx.prepare_sampling(image, image_span)?; let array_index = if sc.arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.expect(Token::Separator(','))?; let reference = self.parse_general_expression(lexer, ctx.reborrow())?; let offset = if lexer.skip(Token::Separator(',')) { Some(self.parse_const_expression(lexer, ctx.types, ctx.constants)?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageSample { image: sc.image, sampler: sampler_expr, gather: Some(crate::SwizzleComponent::X), coordinate, array_index, offset, level: crate::SampleLevel::Zero, depth_ref: Some(reference), } } "textureLoad" => { let _ = lexer.next(); lexer.open_arguments()?; let (image, image_span) = self.parse_general_expression_with_span(lexer, ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let coordinate = self.parse_general_expression(lexer, ctx.reborrow())?; let (class, arrayed) = match *ctx.resolve_type(image)? { crate::TypeInner::Image { class, arrayed, .. } => (class, arrayed), _ => return Err(Error::BadTexture(image_span)), }; let array_index = if arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let level = if class.is_mipmapped() { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; let sample = if class.is_multisampled() { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression(lexer, ctx.reborrow())?) } else { None }; lexer.close_arguments()?; crate::Expression::ImageLoad { image, coordinate, array_index, sample, level, } } "textureDimensions" => { let _ = lexer.next(); lexer.open_arguments()?; let image = self.parse_general_expression(lexer, ctx.reborrow())?; let level = if lexer.skip(Token::Separator(',')) { let expr = self.parse_general_expression(lexer, ctx.reborrow())?; Some(expr) } else { None }; lexer.close_arguments()?; crate::Expression::ImageQuery { image, query: crate::ImageQuery::Size { level }, } } "textureNumLevels" => { let _ = lexer.next(); lexer.open_arguments()?; let image = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::ImageQuery { image, query: crate::ImageQuery::NumLevels, } } "textureNumLayers" => { let _ = lexer.next(); lexer.open_arguments()?; let image = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::ImageQuery { image, query: crate::ImageQuery::NumLayers, } } "textureNumSamples" => { let _ = lexer.next(); lexer.open_arguments()?; let image = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.close_arguments()?; crate::Expression::ImageQuery { image, query: crate::ImageQuery::NumSamples, } } // other _ => { let result = match self.parse_local_function_call(lexer, name, ctx.reborrow())? { Some((function, arguments)) => { let span = NagaSpan::from(self.peek_rule_span(lexer)); ctx.block.extend(ctx.emitter.finish(ctx.expressions)); let result = ctx.functions[function].result.as_ref().map(|_| { ctx.expressions .append(crate::Expression::CallResult(function), span) }); ctx.emitter.start(ctx.expressions); ctx.block.push( crate::Statement::Call { function, arguments, result, }, span, ); result } None => return Ok(None), }; return Ok(Some(CalledFunction { result })); } } }; let span = NagaSpan::from(self.peek_rule_span(lexer)); let handle = ctx.expressions.append(expr, span); Ok(Some(CalledFunction { result: Some(handle), })) } fn parse_const_expression_impl<'a>( &mut self, first_token_span: TokenSpan<'a>, lexer: &mut Lexer<'a>, register_name: Option<&'a str>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { self.push_rule_span(Rule::ConstantExpr, lexer); let inner = match first_token_span { (Token::Word("true"), _) => crate::ConstantInner::boolean(true), (Token::Word("false"), _) => crate::ConstantInner::boolean(false), (Token::Number(num), _) => match num { Ok(Number::I32(num)) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Sint(num as i64), width: 4, }, Ok(Number::U32(num)) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Uint(num as u64), width: 4, }, Ok(Number::F32(num)) => crate::ConstantInner::Scalar { value: crate::ScalarValue::Float(num as f64), width: 4, }, Ok(Number::AbstractInt(_) | Number::AbstractFloat(_)) => unreachable!(), Err(e) => return Err(Error::BadNumber(first_token_span.1, e)), }, (Token::Word(name), name_span) => { // look for an existing constant first for (handle, var) in const_arena.iter() { match var.name { Some(ref string) if string == name => { self.pop_rule_span(lexer); return Ok(handle); } _ => {} } } let composite_ty = self.parse_type_decl_name( lexer, name, name_span, None, TypeAttributes::default(), type_arena, const_arena, )?; lexer.open_arguments()?; //Note: this expects at least one argument let mut components = Vec::new(); while components.is_empty() || lexer.next_argument()? { let component = self.parse_const_expression(lexer, type_arena, const_arena)?; components.push(component); } crate::ConstantInner::Composite { ty: composite_ty, components, } } other => return Err(Error::Unexpected(other.1, ExpectedToken::Constant)), }; // Only set span if it's a named constant. Otherwise, the enclosing Expression should have // the span. let span = self.pop_rule_span(lexer); let handle = if let Some(name) = register_name { if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(span)); } const_arena.append( crate::Constant { name: Some(name.to_string()), specialization: None, inner, }, NagaSpan::from(span), ) } else { const_arena.fetch_or_append( crate::Constant { name: None, specialization: None, inner, }, Default::default(), ) }; Ok(handle) } fn parse_const_expression<'a>( &mut self, lexer: &mut Lexer<'a>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { self.parse_const_expression_impl(lexer.next(), lexer, None, type_arena, const_arena) } fn parse_primary_expression<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result> { // Will be popped inside match, possibly inside parse_function_call_inner or parse_construction self.push_rule_span(Rule::PrimaryExpr, lexer); let expr = match lexer.peek() { (Token::Paren('('), _) => { let _ = lexer.next(); let (expr, _span) = self.parse_general_expression_for_reference(lexer, ctx.reborrow())?; lexer.expect(Token::Paren(')'))?; self.pop_rule_span(lexer); expr } (Token::Word("true" | "false") | Token::Number(..), _) => { let const_handle = self.parse_const_expression(lexer, ctx.types, ctx.constants)?; let span = NagaSpan::from(self.pop_rule_span(lexer)); TypedExpression::non_reference( ctx.interrupt_emitter(crate::Expression::Constant(const_handle), span), ) } (Token::Word(word), span) => { if let Some(definition) = ctx.symbol_table.lookup(word) { let _ = lexer.next(); self.pop_rule_span(lexer); *definition } else if let Some(CalledFunction { result: Some(expr) }) = self.parse_function_call_inner(lexer, word, ctx.reborrow())? { //TODO: resolve the duplicate call in `parse_singular_expression` self.pop_rule_span(lexer); TypedExpression::non_reference(expr) } else { let _ = lexer.next(); if let Some(expr) = construction::parse_construction( self, lexer, word, span.clone(), ctx.reborrow(), )? { TypedExpression::non_reference(expr) } else { return Err(Error::UnknownIdent(span, word)); } } } other => return Err(Error::Unexpected(other.1, ExpectedToken::PrimaryExpression)), }; Ok(expr) } fn parse_postfix<'a>( &mut self, span_start: usize, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, expr: TypedExpression, ) -> Result> { // Parse postfix expressions, adjusting `handle` and `is_reference` along the way. // // Most postfix expressions don't affect `is_reference`: for example, `s.x` is a // reference whenever `s` is a reference. But swizzles (WGSL spec: "multiple // component selection") apply the load rule, converting references to values, so // those affect `is_reference` as well as `handle`. let TypedExpression { mut handle, mut is_reference, } = expr; let mut prefix_span = lexer.span_from(span_start); loop { // Step lightly around `resolve_type`'s mutable borrow. ctx.resolve_type(handle)?; // Find the type of the composite whose elements, components or members we're // accessing, skipping through references: except for swizzles, the `Access` // or `AccessIndex` expressions we'd generate are the same either way. // // Pointers, however, are not permitted. For error checks below, note whether // the base expression is a WGSL pointer. let temp_inner; let (composite, wgsl_pointer) = match *ctx.typifier.get(handle, ctx.types) { crate::TypeInner::Pointer { base, .. } => (&ctx.types[base].inner, !is_reference), crate::TypeInner::ValuePointer { size: None, kind, width, .. } => { temp_inner = crate::TypeInner::Scalar { kind, width }; (&temp_inner, !is_reference) } crate::TypeInner::ValuePointer { size: Some(size), kind, width, .. } => { temp_inner = crate::TypeInner::Vector { size, kind, width }; (&temp_inner, !is_reference) } ref other => (other, false), }; let expression = match lexer.peek().0 { Token::Separator('.') => { let _ = lexer.next(); let (name, name_span) = lexer.next_ident_with_span()?; // WGSL doesn't allow accessing members on pointers, or swizzling // them. But Naga IR doesn't distinguish pointers and references, so // we must check here. if wgsl_pointer { return Err(Error::Pointer( "the value accessed by a `.member` expression", prefix_span, )); } let access = match *composite { crate::TypeInner::Struct { ref members, .. } => { let index = members .iter() .position(|m| m.name.as_deref() == Some(name)) .ok_or(Error::BadAccessor(name_span))? as u32; crate::Expression::AccessIndex { base: handle, index, } } crate::TypeInner::Vector { .. } | crate::TypeInner::Matrix { .. } => { match Composition::make(name, name_span)? { Composition::Multi(size, pattern) => { // Once you apply the load rule, the expression is no // longer a reference. let current_expr = TypedExpression { handle, is_reference, }; let vector = ctx.apply_load_rule(current_expr); is_reference = false; crate::Expression::Swizzle { size, vector, pattern, } } Composition::Single(index) => crate::Expression::AccessIndex { base: handle, index, }, } } _ => return Err(Error::BadAccessor(name_span)), }; access } Token::Paren('[') => { let (_, open_brace_span) = lexer.next(); let index = self.parse_general_expression(lexer, ctx.reborrow())?; let close_brace_span = lexer.expect_span(Token::Paren(']'))?; // WGSL doesn't allow pointers to be subscripted. But Naga IR doesn't // distinguish pointers and references, so we must check here. if wgsl_pointer { return Err(Error::Pointer( "the value indexed by a `[]` subscripting expression", prefix_span, )); } if let crate::Expression::Constant(constant) = ctx.expressions[index] { let expr_span = open_brace_span.end..close_brace_span.start; let index = match ctx.constants[constant].inner { ConstantInner::Scalar { value: ScalarValue::Uint(int), .. } => u32::try_from(int).map_err(|_| Error::BadU32Constant(expr_span)), ConstantInner::Scalar { value: ScalarValue::Sint(int), .. } => u32::try_from(int).map_err(|_| Error::BadU32Constant(expr_span)), _ => Err(Error::BadU32Constant(expr_span)), }?; crate::Expression::AccessIndex { base: handle, index, } } else { crate::Expression::Access { base: handle, index, } } } _ => break, }; prefix_span = lexer.span_from(span_start); handle = ctx .expressions .append(expression, NagaSpan::from(prefix_span.clone())); } Ok(TypedExpression { handle, is_reference, }) } /// Parse a `unary_expression`. fn parse_unary_expression<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result> { self.push_rule_span(Rule::UnaryExpr, lexer); //TODO: refactor this to avoid backing up let expr = match lexer.peek().0 { Token::Operation('-') => { let _ = lexer.next(); let unloaded_expr = self.parse_unary_expression(lexer, ctx.reborrow())?; let expr = ctx.apply_load_rule(unloaded_expr); let expr = crate::Expression::Unary { op: crate::UnaryOperator::Negate, expr, }; let span = NagaSpan::from(self.peek_rule_span(lexer)); TypedExpression::non_reference(ctx.expressions.append(expr, span)) } Token::Operation('!' | '~') => { let _ = lexer.next(); let unloaded_expr = self.parse_unary_expression(lexer, ctx.reborrow())?; let expr = ctx.apply_load_rule(unloaded_expr); let expr = crate::Expression::Unary { op: crate::UnaryOperator::Not, expr, }; let span = NagaSpan::from(self.peek_rule_span(lexer)); TypedExpression::non_reference(ctx.expressions.append(expr, span)) } Token::Operation('*') => { let _ = lexer.next(); // The `*` operator does not accept a reference, so we must apply the Load // Rule here. But the operator itself simply changes the type from // `ptr` to `ref`, so we generate no code for the // operator itself. We simply return a `TypedExpression` with // `is_reference` set to true. let unloaded_pointer = self.parse_unary_expression(lexer, ctx.reborrow())?; let pointer = ctx.apply_load_rule(unloaded_pointer); // An expression like `&*ptr` may generate no Naga IR at all, but WGSL requires // an error if `ptr` is not a pointer. So we have to type-check this ourselves. if ctx.resolve_type(pointer)?.pointer_space().is_none() { let span = ctx .expressions .get_span(pointer) .to_range() .unwrap_or_else(|| self.peek_rule_span(lexer)); return Err(Error::NotPointer(span)); } TypedExpression { handle: pointer, is_reference: true, } } Token::Operation('&') => { let _ = lexer.next(); // The `&` operator simply converts a reference to a pointer. And since a // reference is required, the Load Rule is not applied. let operand = self.parse_unary_expression(lexer, ctx.reborrow())?; if !operand.is_reference { let span = ctx .expressions .get_span(operand.handle) .to_range() .unwrap_or_else(|| self.peek_rule_span(lexer)); return Err(Error::NotReference("the operand of the `&` operator", span)); } // No code is generated. We just declare the pointer a reference now. TypedExpression { is_reference: false, ..operand } } _ => self.parse_singular_expression(lexer, ctx.reborrow())?, }; self.pop_rule_span(lexer); Ok(expr) } /// Parse a `singular_expression`. fn parse_singular_expression<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result> { let start = lexer.start_byte_offset(); self.push_rule_span(Rule::SingularExpr, lexer); let primary_expr = self.parse_primary_expression(lexer, ctx.reborrow())?; let singular_expr = self.parse_postfix(start, lexer, ctx.reborrow(), primary_expr)?; self.pop_rule_span(lexer); Ok(singular_expr) } fn parse_equality_expression<'a>( &mut self, lexer: &mut Lexer<'a>, mut context: ExpressionContext<'a, '_, '_>, ) -> Result> { // equality_expression context.parse_binary_op( lexer, |token| match token { Token::LogicalOperation('=') => Some(crate::BinaryOperator::Equal), Token::LogicalOperation('!') => Some(crate::BinaryOperator::NotEqual), _ => None, }, // relational_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::Paren('<') => Some(crate::BinaryOperator::Less), Token::Paren('>') => Some(crate::BinaryOperator::Greater), Token::LogicalOperation('<') => Some(crate::BinaryOperator::LessEqual), Token::LogicalOperation('>') => Some(crate::BinaryOperator::GreaterEqual), _ => None, }, // shift_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::ShiftOperation('<') => { Some(crate::BinaryOperator::ShiftLeft) } Token::ShiftOperation('>') => { Some(crate::BinaryOperator::ShiftRight) } _ => None, }, // additive_expression |lexer, mut context| { context.parse_binary_splat_op( lexer, |token| match token { Token::Operation('+') => Some(crate::BinaryOperator::Add), Token::Operation('-') => { Some(crate::BinaryOperator::Subtract) } _ => None, }, // multiplicative_expression |lexer, mut context| { context.parse_binary_splat_op( lexer, |token| match token { Token::Operation('*') => { Some(crate::BinaryOperator::Multiply) } Token::Operation('/') => { Some(crate::BinaryOperator::Divide) } Token::Operation('%') => { Some(crate::BinaryOperator::Modulo) } _ => None, }, |lexer, context| { self.parse_unary_expression(lexer, context) }, ) }, ) }, ) }, ) }, ) } fn parse_general_expression_with_span<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result<(Handle, Span), Error<'a>> { let (expr, span) = self.parse_general_expression_for_reference(lexer, ctx.reborrow())?; Ok((ctx.apply_load_rule(expr), span)) } fn parse_general_expression<'a>( &mut self, lexer: &mut Lexer<'a>, mut ctx: ExpressionContext<'a, '_, '_>, ) -> Result, Error<'a>> { let (expr, _span) = self.parse_general_expression_for_reference(lexer, ctx.reborrow())?; Ok(ctx.apply_load_rule(expr)) } fn parse_general_expression_for_reference<'a>( &mut self, lexer: &mut Lexer<'a>, mut context: ExpressionContext<'a, '_, '_>, ) -> Result<(TypedExpression, Span), Error<'a>> { self.push_rule_span(Rule::GeneralExpr, lexer); // logical_or_expression let handle = context.parse_binary_op( lexer, |token| match token { Token::LogicalOperation('|') => Some(crate::BinaryOperator::LogicalOr), _ => None, }, // logical_and_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::LogicalOperation('&') => Some(crate::BinaryOperator::LogicalAnd), _ => None, }, // inclusive_or_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::Operation('|') => Some(crate::BinaryOperator::InclusiveOr), _ => None, }, // exclusive_or_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::Operation('^') => { Some(crate::BinaryOperator::ExclusiveOr) } _ => None, }, // and_expression |lexer, mut context| { context.parse_binary_op( lexer, |token| match token { Token::Operation('&') => { Some(crate::BinaryOperator::And) } _ => None, }, |lexer, context| { self.parse_equality_expression(lexer, context) }, ) }, ) }, ) }, ) }, )?; Ok((handle, self.pop_rule_span(lexer))) } fn parse_variable_ident_decl<'a>( &mut self, lexer: &mut Lexer<'a>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result<(&'a str, Span, Handle), Error<'a>> { let (name, name_span) = lexer.next_ident_with_span()?; lexer.expect(Token::Separator(':'))?; let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?; Ok((name, name_span, ty)) } fn parse_variable_decl<'a>( &mut self, lexer: &mut Lexer<'a>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { self.push_rule_span(Rule::VariableDecl, lexer); let mut space = None; if lexer.skip(Token::Paren('<')) { let (class_str, span) = lexer.next_ident_with_span()?; space = Some(match class_str { "storage" => { let access = if lexer.skip(Token::Separator(',')) { lexer.next_storage_access()? } else { // defaulting to `read` crate::StorageAccess::LOAD }; crate::AddressSpace::Storage { access } } _ => conv::map_address_space(class_str, span)?, }); lexer.expect(Token::Paren('>'))?; } let name = lexer.next_ident()?; lexer.expect(Token::Separator(':'))?; let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?; let init = if lexer.skip(Token::Operation('=')) { let handle = self.parse_const_expression(lexer, type_arena, const_arena)?; Some(handle) } else { None }; lexer.expect(Token::Separator(';'))?; let name_span = self.pop_rule_span(lexer); Ok(ParsedVariable { name, name_span, space, ty, init, }) } fn parse_struct_body<'a>( &mut self, lexer: &mut Lexer<'a>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result<(Vec, u32), Error<'a>> { let mut offset = 0; let mut struct_alignment = Alignment::ONE; let mut members = Vec::new(); lexer.expect(Token::Paren('{'))?; let mut ready = true; while !lexer.skip(Token::Paren('}')) { if !ready { return Err(Error::Unexpected( lexer.next().1, ExpectedToken::Token(Token::Separator(',')), )); } let (mut size_attr, mut align_attr) = (None, None); self.push_rule_span(Rule::Attribute, lexer); let mut bind_parser = BindingParser::default(); while lexer.skip(Token::Attribute) { match lexer.next_ident_with_span()? { ("size", _) => { lexer.expect(Token::Paren('('))?; let (value, span) = lexer.capture_span(Self::parse_non_negative_i32_literal)?; lexer.expect(Token::Paren(')'))?; size_attr = Some((value, span)); } ("align", _) => { lexer.expect(Token::Paren('('))?; let (value, span) = lexer.capture_span(Self::parse_non_negative_i32_literal)?; lexer.expect(Token::Paren(')'))?; align_attr = Some((value, span)); } (word, word_span) => bind_parser.parse(lexer, word, word_span)?, } } let bind_span = self.pop_rule_span(lexer); let mut binding = bind_parser.finish(bind_span)?; let (name, span) = match lexer.next() { (Token::Word(word), span) => (word, span), other => return Err(Error::Unexpected(other.1, ExpectedToken::FieldName)), }; if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(span)); } lexer.expect(Token::Separator(':'))?; let ty = self.parse_type_decl(lexer, None, type_arena, const_arena)?; ready = lexer.skip(Token::Separator(',')); self.layouter.update(type_arena, const_arena).unwrap(); let member_min_size = self.layouter[ty].size; let member_min_alignment = self.layouter[ty].alignment; let member_size = if let Some((size, span)) = size_attr { if size < member_min_size { return Err(Error::SizeAttributeTooLow(span, member_min_size)); } else { size } } else { member_min_size }; let member_alignment = if let Some((align, span)) = align_attr { if let Some(alignment) = Alignment::new(align) { if alignment < member_min_alignment { return Err(Error::AlignAttributeTooLow(span, member_min_alignment)); } else { alignment } } else { return Err(Error::NonPowerOfTwoAlignAttribute(span)); } } else { member_min_alignment }; offset = member_alignment.round_up(offset); struct_alignment = struct_alignment.max(member_alignment); if let Some(ref mut binding) = binding { binding.apply_default_interpolation(&type_arena[ty].inner); } members.push(crate::StructMember { name: Some(name.to_owned()), ty, binding, offset, }); offset += member_size; } let struct_size = struct_alignment.round_up(offset); Ok((members, struct_size)) } fn parse_matrix_scalar_type<'a>( &mut self, lexer: &mut Lexer<'a>, columns: crate::VectorSize, rows: crate::VectorSize, ) -> Result> { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; match kind { crate::ScalarKind::Float => Ok(crate::TypeInner::Matrix { columns, rows, width, }), _ => Err(Error::BadMatrixScalarKind(span, kind, width)), } } fn parse_type_decl_impl<'a>( &mut self, lexer: &mut Lexer<'a>, _attribute: TypeAttributes, word: &'a str, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { if let Some((kind, width)) = conv::get_scalar_type(word) { return Ok(Some(crate::TypeInner::Scalar { kind, width })); } Ok(Some(match word { "vec2" => { let (kind, width) = lexer.next_scalar_generic()?; crate::TypeInner::Vector { size: crate::VectorSize::Bi, kind, width, } } "vec3" => { let (kind, width) = lexer.next_scalar_generic()?; crate::TypeInner::Vector { size: crate::VectorSize::Tri, kind, width, } } "vec4" => { let (kind, width) = lexer.next_scalar_generic()?; crate::TypeInner::Vector { size: crate::VectorSize::Quad, kind, width, } } "mat2x2" => { self.parse_matrix_scalar_type(lexer, crate::VectorSize::Bi, crate::VectorSize::Bi)? } "mat2x3" => { self.parse_matrix_scalar_type(lexer, crate::VectorSize::Bi, crate::VectorSize::Tri)? } "mat2x4" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Bi, crate::VectorSize::Quad, )?, "mat3x2" => { self.parse_matrix_scalar_type(lexer, crate::VectorSize::Tri, crate::VectorSize::Bi)? } "mat3x3" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Tri, crate::VectorSize::Tri, )?, "mat3x4" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Tri, crate::VectorSize::Quad, )?, "mat4x2" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Quad, crate::VectorSize::Bi, )?, "mat4x3" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Quad, crate::VectorSize::Tri, )?, "mat4x4" => self.parse_matrix_scalar_type( lexer, crate::VectorSize::Quad, crate::VectorSize::Quad, )?, "atomic" => { let (kind, width) = lexer.next_scalar_generic()?; crate::TypeInner::Atomic { kind, width } } "ptr" => { lexer.expect_generic_paren('<')?; let (ident, span) = lexer.next_ident_with_span()?; let mut space = conv::map_address_space(ident, span)?; lexer.expect(Token::Separator(','))?; let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?; if let crate::AddressSpace::Storage { ref mut access } = space { *access = if lexer.skip(Token::Separator(',')) { lexer.next_storage_access()? } else { crate::StorageAccess::LOAD }; } lexer.expect_generic_paren('>')?; crate::TypeInner::Pointer { base, space } } "array" => { lexer.expect_generic_paren('<')?; let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?; let size = if lexer.skip(Token::Separator(',')) { let const_handle = self.parse_const_expression(lexer, type_arena, const_arena)?; crate::ArraySize::Constant(const_handle) } else { crate::ArraySize::Dynamic }; lexer.expect_generic_paren('>')?; let stride = { self.layouter.update(type_arena, const_arena).unwrap(); self.layouter[base].to_stride() }; crate::TypeInner::Array { base, size, stride } } "binding_array" => { lexer.expect_generic_paren('<')?; let base = self.parse_type_decl(lexer, None, type_arena, const_arena)?; let size = if lexer.skip(Token::Separator(',')) { let const_handle = self.parse_const_expression(lexer, type_arena, const_arena)?; crate::ArraySize::Constant(const_handle) } else { crate::ArraySize::Dynamic }; lexer.expect_generic_paren('>')?; crate::TypeInner::BindingArray { base, size } } "sampler" => crate::TypeInner::Sampler { comparison: false }, "sampler_comparison" => crate::TypeInner::Sampler { comparison: true }, "texture_1d" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D1, arrayed: false, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_1d_array" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D1, arrayed: true, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_2d" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_2d_array" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: true, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_3d" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D3, arrayed: false, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_cube" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::Cube, arrayed: false, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_cube_array" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::Cube, arrayed: true, class: crate::ImageClass::Sampled { kind, multi: false }, } } "texture_multisampled_2d" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Sampled { kind, multi: true }, } } "texture_multisampled_2d_array" => { let (kind, width, span) = lexer.next_scalar_generic_with_span()?; Self::check_texture_sample_type(kind, width, span)?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: true, class: crate::ImageClass::Sampled { kind, multi: true }, } } "texture_depth_2d" => crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Depth { multi: false }, }, "texture_depth_2d_array" => crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: true, class: crate::ImageClass::Depth { multi: false }, }, "texture_depth_cube" => crate::TypeInner::Image { dim: crate::ImageDimension::Cube, arrayed: false, class: crate::ImageClass::Depth { multi: false }, }, "texture_depth_cube_array" => crate::TypeInner::Image { dim: crate::ImageDimension::Cube, arrayed: true, class: crate::ImageClass::Depth { multi: false }, }, "texture_depth_multisampled_2d" => crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Depth { multi: true }, }, "texture_storage_1d" => { let (format, access) = lexer.next_format_generic()?; crate::TypeInner::Image { dim: crate::ImageDimension::D1, arrayed: false, class: crate::ImageClass::Storage { format, access }, } } "texture_storage_1d_array" => { let (format, access) = lexer.next_format_generic()?; crate::TypeInner::Image { dim: crate::ImageDimension::D1, arrayed: true, class: crate::ImageClass::Storage { format, access }, } } "texture_storage_2d" => { let (format, access) = lexer.next_format_generic()?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: false, class: crate::ImageClass::Storage { format, access }, } } "texture_storage_2d_array" => { let (format, access) = lexer.next_format_generic()?; crate::TypeInner::Image { dim: crate::ImageDimension::D2, arrayed: true, class: crate::ImageClass::Storage { format, access }, } } "texture_storage_3d" => { let (format, access) = lexer.next_format_generic()?; crate::TypeInner::Image { dim: crate::ImageDimension::D3, arrayed: false, class: crate::ImageClass::Storage { format, access }, } } _ => return Ok(None), })) } const fn check_texture_sample_type( kind: crate::ScalarKind, width: u8, span: Span, ) -> Result<(), Error<'static>> { use crate::ScalarKind::*; // Validate according to https://gpuweb.github.io/gpuweb/wgsl/#sampled-texture-type match (kind, width) { (Float | Sint | Uint, 4) => Ok(()), _ => Err(Error::BadTextureSampleType { span, kind, width }), } } /// Parse type declaration of a given name and attribute. #[allow(clippy::too_many_arguments)] fn parse_type_decl_name<'a>( &mut self, lexer: &mut Lexer<'a>, name: &'a str, name_span: Span, debug_name: Option<&'a str>, attribute: TypeAttributes, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { Ok(match self.lookup_type.get(name) { Some(&handle) => handle, None => { match self.parse_type_decl_impl(lexer, attribute, name, type_arena, const_arena)? { Some(inner) => { let span = name_span.start..lexer.end_byte_offset(); type_arena.insert( crate::Type { name: debug_name.map(|s| s.to_string()), inner, }, NagaSpan::from(span), ) } None => return Err(Error::UnknownType(name_span)), } } }) } fn parse_type_decl<'a>( &mut self, lexer: &mut Lexer<'a>, debug_name: Option<&'a str>, type_arena: &mut UniqueArena, const_arena: &mut Arena, ) -> Result, Error<'a>> { self.push_rule_span(Rule::TypeDecl, lexer); let attribute = TypeAttributes::default(); if lexer.skip(Token::Attribute) { let other = lexer.next(); return Err(Error::Unexpected(other.1, ExpectedToken::TypeAttribute)); } let (name, name_span) = lexer.next_ident_with_span()?; let handle = self.parse_type_decl_name( lexer, name, name_span, debug_name, attribute, type_arena, const_arena, )?; self.pop_rule_span(lexer); // Only set span if it's the first occurrence of the type. // Type spans therefore should only be used for errors in type declarations; // use variable spans/expression spans/etc. otherwise Ok(handle) } /// Parse an assignment statement (will also parse increment and decrement statements) fn parse_assignment_statement<'a, 'out>( &mut self, lexer: &mut Lexer<'a>, mut context: StatementContext<'a, '_, 'out>, block: &mut crate::Block, emitter: &mut super::Emitter, ) -> Result<(), Error<'a>> { use crate::BinaryOperator as Bo; let span_start = lexer.start_byte_offset(); emitter.start(context.expressions); let (reference, lhs_span) = self .parse_general_expression_for_reference(lexer, context.as_expression(block, emitter))?; let op = lexer.next(); // The left hand side of an assignment must be a reference. if !matches!( op.0, Token::Operation('=') | Token::AssignmentOperation(_) | Token::IncrementOperation | Token::DecrementOperation ) { return Err(Error::Unexpected(lhs_span, ExpectedToken::Assignment)); } else if !reference.is_reference { let ty = if context.named_expressions.contains_key(&reference.handle) { InvalidAssignmentType::ImmutableBinding } else { match *context.expressions.get_mut(reference.handle) { crate::Expression::Swizzle { .. } => InvalidAssignmentType::Swizzle, _ => InvalidAssignmentType::Other, } }; return Err(Error::InvalidAssignment { span: lhs_span, ty }); } let mut context = context.as_expression(block, emitter); let value = match op { (Token::Operation('='), _) => { self.parse_general_expression(lexer, context.reborrow())? } (Token::AssignmentOperation(c), span) => { let op = match c { '<' => Bo::ShiftLeft, '>' => Bo::ShiftRight, '+' => Bo::Add, '-' => Bo::Subtract, '*' => Bo::Multiply, '/' => Bo::Divide, '%' => Bo::Modulo, '&' => Bo::And, '|' => Bo::InclusiveOr, '^' => Bo::ExclusiveOr, //Note: `consume_token` shouldn't produce any other assignment ops _ => unreachable!(), }; let mut left = context.expressions.append( crate::Expression::Load { pointer: reference.handle, }, lhs_span.into(), ); let mut right = self.parse_general_expression(lexer, context.reborrow())?; context.binary_op_splat(op, &mut left, &mut right)?; context .expressions .append(crate::Expression::Binary { op, left, right }, span.into()) } token @ (Token::IncrementOperation | Token::DecrementOperation, _) => { let op = match token.0 { Token::IncrementOperation => Bo::Add, Token::DecrementOperation => Bo::Subtract, _ => unreachable!(), }; let op_span = token.1; // prepare the typifier, but work around mutable borrowing... let _ = context.resolve_type(reference.handle)?; let ty = context.typifier.get(reference.handle, context.types); let (kind, width) = match *ty { crate::TypeInner::ValuePointer { size: None, kind, width, .. } => (kind, width), crate::TypeInner::Pointer { base, .. } => match context.types[base].inner { crate::TypeInner::Scalar { kind, width } => (kind, width), _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)), }, _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)), }; let constant_inner = crate::ConstantInner::Scalar { width, value: match kind { crate::ScalarKind::Sint => crate::ScalarValue::Sint(1), crate::ScalarKind::Uint => crate::ScalarValue::Uint(1), _ => return Err(Error::BadIncrDecrReferenceType(lhs_span)), }, }; let constant = context.constants.append( crate::Constant { name: None, specialization: None, inner: constant_inner, }, crate::Span::default(), ); let left = context.expressions.append( crate::Expression::Load { pointer: reference.handle, }, lhs_span.into(), ); let right = context.interrupt_emitter( crate::Expression::Constant(constant), crate::Span::default(), ); context.expressions.append( crate::Expression::Binary { op, left, right }, op_span.into(), ) } other => return Err(Error::Unexpected(other.1, ExpectedToken::SwitchItem)), }; let span_end = lexer.end_byte_offset(); context .block .extend(context.emitter.finish(context.expressions)); context.block.push( crate::Statement::Store { pointer: reference.handle, value, }, NagaSpan::from(span_start..span_end), ); Ok(()) } /// Parse a function call statement. fn parse_function_statement<'a, 'out>( &mut self, lexer: &mut Lexer<'a>, ident: &'a str, mut context: ExpressionContext<'a, '_, 'out>, ) -> Result<(), Error<'a>> { self.push_rule_span(Rule::SingularExpr, lexer); context.emitter.start(context.expressions); if self .parse_function_call_inner(lexer, ident, context.reborrow())? .is_none() { let span = lexer.next().1; return Err(Error::UnknownLocalFunction(span)); } context .block .extend(context.emitter.finish(context.expressions)); self.pop_rule_span(lexer); Ok(()) } fn parse_switch_case_body<'a, 'out>( &mut self, lexer: &mut Lexer<'a>, mut context: StatementContext<'a, '_, 'out>, ) -> Result<(bool, crate::Block), Error<'a>> { let mut body = crate::Block::new(); // Push a new lexical scope for the switch case body context.symbol_table.push_scope(); lexer.expect(Token::Paren('{'))?; let fall_through = loop { // default statements if lexer.skip(Token::Word("fallthrough")) { lexer.expect(Token::Separator(';'))?; lexer.expect(Token::Paren('}'))?; break true; } if lexer.skip(Token::Paren('}')) { break false; } self.parse_statement(lexer, context.reborrow(), &mut body, false)?; }; // Pop the switch case body lexical scope context.symbol_table.pop_scope(); Ok((fall_through, body)) } fn parse_statement<'a, 'out>( &mut self, lexer: &mut Lexer<'a>, mut context: StatementContext<'a, '_, 'out>, block: &'out mut crate::Block, is_uniform_control_flow: bool, ) -> Result<(), Error<'a>> { self.push_rule_span(Rule::Statement, lexer); match lexer.peek() { (Token::Separator(';'), _) => { let _ = lexer.next(); self.pop_rule_span(lexer); return Ok(()); } (Token::Paren('{'), _) => { self.push_rule_span(Rule::Block, lexer); // Push a new lexical scope for the block statement context.symbol_table.push_scope(); let _ = lexer.next(); let mut statements = crate::Block::new(); while !lexer.skip(Token::Paren('}')) { self.parse_statement( lexer, context.reborrow(), &mut statements, is_uniform_control_flow, )?; } // Pop the block statement lexical scope context.symbol_table.pop_scope(); self.pop_rule_span(lexer); let span = NagaSpan::from(self.pop_rule_span(lexer)); block.push(crate::Statement::Block(statements), span); return Ok(()); } (Token::Word(word), _) => { let mut emitter = super::Emitter::default(); let statement = match word { "_" => { let _ = lexer.next(); emitter.start(context.expressions); lexer.expect(Token::Operation('='))?; self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; lexer.expect(Token::Separator(';'))?; block.extend(emitter.finish(context.expressions)); None } "let" => { let _ = lexer.next(); emitter.start(context.expressions); let (name, name_span) = lexer.next_ident_with_span()?; if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(name_span)); } let given_ty = if lexer.skip(Token::Separator(':')) { let ty = self.parse_type_decl( lexer, None, context.types, context.constants, )?; Some(ty) } else { None }; lexer.expect(Token::Operation('='))?; let expr_id = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; lexer.expect(Token::Separator(';'))?; if let Some(ty) = given_ty { // prepare the typifier, but work around mutable borrowing... let _ = context .as_expression(block, &mut emitter) .resolve_type(expr_id)?; let expr_inner = context.typifier.get(expr_id, context.types); let given_inner = &context.types[ty].inner; if !given_inner.equivalent(expr_inner, context.types) { log::error!( "Given type {:?} doesn't match expected {:?}", given_inner, expr_inner ); return Err(Error::InitializationTypeMismatch( name_span, expr_inner.to_wgsl(context.types, context.constants), )); } } block.extend(emitter.finish(context.expressions)); context.symbol_table.add( name, TypedExpression { handle: expr_id, is_reference: false, }, ); context .named_expressions .insert(expr_id, String::from(name)); None } "var" => { let _ = lexer.next(); enum Init { Empty, Constant(Handle), Variable(Handle), } let (name, name_span) = lexer.next_ident_with_span()?; if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(name_span)); } let given_ty = if lexer.skip(Token::Separator(':')) { let ty = self.parse_type_decl( lexer, None, context.types, context.constants, )?; Some(ty) } else { None }; let (init, ty) = if lexer.skip(Token::Operation('=')) { emitter.start(context.expressions); let value = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; block.extend(emitter.finish(context.expressions)); // prepare the typifier, but work around mutable borrowing... let _ = context .as_expression(block, &mut emitter) .resolve_type(value)?; //TODO: share more of this code with `let` arm let ty = match given_ty { Some(ty) => { let expr_inner = context.typifier.get(value, context.types); let given_inner = &context.types[ty].inner; if !given_inner.equivalent(expr_inner, context.types) { log::error!( "Given type {:?} doesn't match expected {:?}", given_inner, expr_inner ); return Err(Error::InitializationTypeMismatch( name_span, expr_inner.to_wgsl(context.types, context.constants), )); } ty } None => { // register the type, if needed match context.typifier[value].clone() { TypeResolution::Handle(ty) => ty, TypeResolution::Value(inner) => context.types.insert( crate::Type { name: None, inner }, Default::default(), ), } } }; let init = match context.expressions[value] { crate::Expression::Constant(handle) if is_uniform_control_flow => { Init::Constant(handle) } _ => Init::Variable(value), }; (init, ty) } else { match given_ty { Some(ty) => (Init::Empty, ty), None => { log::error!( "Variable '{}' without an initializer needs a type", name ); return Err(Error::MissingType(name_span)); } } }; lexer.expect(Token::Separator(';'))?; let var_id = context.variables.append( crate::LocalVariable { name: Some(name.to_owned()), ty, init: match init { Init::Constant(value) => Some(value), _ => None, }, }, NagaSpan::from(name_span), ); // Doesn't make sense to assign a span to cached lookup let expr_id = context .expressions .append(crate::Expression::LocalVariable(var_id), Default::default()); context.symbol_table.add( name, TypedExpression { handle: expr_id, is_reference: true, }, ); if let Init::Variable(value) = init { Some(crate::Statement::Store { pointer: expr_id, value, }) } else { None } } "return" => { let _ = lexer.next(); let value = if lexer.peek().0 != Token::Separator(';') { emitter.start(context.expressions); let handle = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; block.extend(emitter.finish(context.expressions)); Some(handle) } else { None }; lexer.expect(Token::Separator(';'))?; Some(crate::Statement::Return { value }) } "if" => { let _ = lexer.next(); emitter.start(context.expressions); let condition = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; block.extend(emitter.finish(context.expressions)); let accept = self.parse_block(lexer, context.reborrow(), false)?; let mut elsif_stack = Vec::new(); let mut elseif_span_start = lexer.start_byte_offset(); let mut reject = loop { if !lexer.skip(Token::Word("else")) { break crate::Block::new(); } if !lexer.skip(Token::Word("if")) { // ... else { ... } break self.parse_block(lexer, context.reborrow(), false)?; } // ... else if (...) { ... } let mut sub_emitter = super::Emitter::default(); sub_emitter.start(context.expressions); let other_condition = self.parse_general_expression( lexer, context.as_expression(block, &mut sub_emitter), )?; let other_emit = sub_emitter.finish(context.expressions); let other_block = self.parse_block(lexer, context.reborrow(), false)?; elsif_stack.push(( elseif_span_start, other_condition, other_emit, other_block, )); elseif_span_start = lexer.start_byte_offset(); }; let span_end = lexer.end_byte_offset(); // reverse-fold the else-if blocks //Note: we may consider uplifting this to the IR for (other_span_start, other_cond, other_emit, other_block) in elsif_stack.into_iter().rev() { let sub_stmt = crate::Statement::If { condition: other_cond, accept: other_block, reject, }; reject = crate::Block::new(); reject.extend(other_emit); reject.push(sub_stmt, NagaSpan::from(other_span_start..span_end)) } Some(crate::Statement::If { condition, accept, reject, }) } "switch" => { let _ = lexer.next(); emitter.start(context.expressions); let selector = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; let uint = Some(crate::ScalarKind::Uint) == context .as_expression(block, &mut emitter) .resolve_type(selector)? .scalar_kind(); block.extend(emitter.finish(context.expressions)); lexer.expect(Token::Paren('{'))?; let mut cases = Vec::new(); loop { // cases + default match lexer.next() { (Token::Word("case"), _) => { // parse a list of values let value = loop { let value = Self::parse_switch_value(lexer, uint)?; if lexer.skip(Token::Separator(',')) { if lexer.skip(Token::Separator(':')) { break value; } } else { lexer.skip(Token::Separator(':')); break value; } cases.push(crate::SwitchCase { value: crate::SwitchValue::Integer(value), body: crate::Block::new(), fall_through: true, }); }; let (fall_through, body) = self.parse_switch_case_body(lexer, context.reborrow())?; cases.push(crate::SwitchCase { value: crate::SwitchValue::Integer(value), body, fall_through, }); } (Token::Word("default"), _) => { lexer.skip(Token::Separator(':')); let (fall_through, body) = self.parse_switch_case_body(lexer, context.reborrow())?; cases.push(crate::SwitchCase { value: crate::SwitchValue::Default, body, fall_through, }); } (Token::Paren('}'), _) => break, other => { return Err(Error::Unexpected( other.1, ExpectedToken::SwitchItem, )) } } } Some(crate::Statement::Switch { selector, cases }) } "loop" => Some(self.parse_loop(lexer, context.reborrow(), &mut emitter)?), "while" => { let _ = lexer.next(); let mut body = crate::Block::new(); let (condition, span) = lexer.capture_span(|lexer| { emitter.start(context.expressions); let condition = self.parse_general_expression( lexer, context.as_expression(&mut body, &mut emitter), )?; lexer.expect(Token::Paren('{'))?; body.extend(emitter.finish(context.expressions)); Ok(condition) })?; let mut reject = crate::Block::new(); reject.push(crate::Statement::Break, NagaSpan::default()); body.push( crate::Statement::If { condition, accept: crate::Block::new(), reject, }, NagaSpan::from(span), ); // Push a lexical scope for the while loop body context.symbol_table.push_scope(); while !lexer.skip(Token::Paren('}')) { self.parse_statement(lexer, context.reborrow(), &mut body, false)?; } // Pop the while loop body lexical scope context.symbol_table.pop_scope(); Some(crate::Statement::Loop { body, continuing: crate::Block::new(), break_if: None, }) } "for" => { let _ = lexer.next(); lexer.expect(Token::Paren('('))?; // Push a lexical scope for the for loop context.symbol_table.push_scope(); if !lexer.skip(Token::Separator(';')) { let num_statements = block.len(); let (_, span) = lexer.capture_span(|lexer| { self.parse_statement( lexer, context.reborrow(), block, is_uniform_control_flow, ) })?; if block.len() != num_statements { match *block.last().unwrap() { crate::Statement::Store { .. } | crate::Statement::Call { .. } => {} _ => return Err(Error::InvalidForInitializer(span)), } } }; let mut body = crate::Block::new(); if !lexer.skip(Token::Separator(';')) { let (condition, span) = lexer.capture_span(|lexer| { emitter.start(context.expressions); let condition = self.parse_general_expression( lexer, context.as_expression(&mut body, &mut emitter), )?; lexer.expect(Token::Separator(';'))?; body.extend(emitter.finish(context.expressions)); Ok(condition) })?; let mut reject = crate::Block::new(); reject.push(crate::Statement::Break, NagaSpan::default()); body.push( crate::Statement::If { condition, accept: crate::Block::new(), reject, }, NagaSpan::from(span), ); }; let mut continuing = crate::Block::new(); if !lexer.skip(Token::Paren(')')) { match lexer.peek().0 { Token::Word(ident) if context.symbol_table.lookup(ident).is_none() => { self.parse_function_statement( lexer, ident, context.as_expression(&mut continuing, &mut emitter), )? } _ => self.parse_assignment_statement( lexer, context.reborrow(), &mut continuing, &mut emitter, )?, } lexer.expect(Token::Paren(')'))?; } lexer.expect(Token::Paren('{'))?; while !lexer.skip(Token::Paren('}')) { self.parse_statement(lexer, context.reborrow(), &mut body, false)?; } // Pop the for loop lexical scope context.symbol_table.pop_scope(); Some(crate::Statement::Loop { body, continuing, break_if: None, }) } "break" => { let (_, mut span) = lexer.next(); // Check if the next token is an `if`, this indicates // that the user tried to type out a `break if` which // is illegal in this position. let (peeked_token, peeked_span) = lexer.peek(); if let Token::Word("if") = peeked_token { span.end = peeked_span.end; return Err(Error::InvalidBreakIf(span)); } Some(crate::Statement::Break) } "continue" => { let _ = lexer.next(); Some(crate::Statement::Continue) } "discard" => { let _ = lexer.next(); Some(crate::Statement::Kill) } "storageBarrier" => { let _ = lexer.next(); lexer.expect(Token::Paren('('))?; lexer.expect(Token::Paren(')'))?; Some(crate::Statement::Barrier(crate::Barrier::STORAGE)) } "workgroupBarrier" => { let _ = lexer.next(); lexer.expect(Token::Paren('('))?; lexer.expect(Token::Paren(')'))?; Some(crate::Statement::Barrier(crate::Barrier::WORK_GROUP)) } "atomicStore" => { let _ = lexer.next(); emitter.start(context.expressions); lexer.open_arguments()?; let mut expression_ctx = context.as_expression(block, &mut emitter); let pointer = self.parse_atomic_pointer(lexer, expression_ctx.reborrow())?; lexer.expect(Token::Separator(','))?; let value = self.parse_general_expression(lexer, expression_ctx)?; lexer.close_arguments()?; block.extend(emitter.finish(context.expressions)); Some(crate::Statement::Store { pointer, value }) } "textureStore" => { let _ = lexer.next(); emitter.start(context.expressions); lexer.open_arguments()?; let mut expr_context = context.as_expression(block, &mut emitter); let (image, image_span) = self .parse_general_expression_with_span(lexer, expr_context.reborrow())?; lexer.expect(Token::Separator(','))?; let arrayed = match *expr_context.resolve_type(image)? { crate::TypeInner::Image { arrayed, .. } => arrayed, _ => return Err(Error::BadTexture(image_span)), }; let coordinate = self.parse_general_expression(lexer, expr_context)?; let array_index = if arrayed { lexer.expect(Token::Separator(','))?; Some(self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?) } else { None }; lexer.expect(Token::Separator(','))?; let value = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; lexer.close_arguments()?; block.extend(emitter.finish(context.expressions)); Some(crate::Statement::ImageStore { image, coordinate, array_index, value, }) } // assignment or a function call ident => { match context.symbol_table.lookup(ident) { Some(_) => self.parse_assignment_statement( lexer, context, block, &mut emitter, )?, None => self.parse_function_statement( lexer, ident, context.as_expression(block, &mut emitter), )?, } lexer.expect(Token::Separator(';'))?; None } }; let span = NagaSpan::from(self.pop_rule_span(lexer)); if let Some(statement) = statement { block.push(statement, span); } } _ => { let mut emitter = super::Emitter::default(); self.parse_assignment_statement(lexer, context, block, &mut emitter)?; self.pop_rule_span(lexer); } } Ok(()) } fn parse_loop<'a>( &mut self, lexer: &mut Lexer<'a>, mut context: StatementContext<'a, '_, '_>, emitter: &mut super::Emitter, ) -> Result> { let _ = lexer.next(); let mut body = crate::Block::new(); let mut continuing = crate::Block::new(); let mut break_if = None; // Push a lexical scope for the loop body context.symbol_table.push_scope(); lexer.expect(Token::Paren('{'))?; loop { if lexer.skip(Token::Word("continuing")) { // Branch for the `continuing` block, this must be // the last thing in the loop body // Expect a opening brace to start the continuing block lexer.expect(Token::Paren('{'))?; loop { if lexer.skip(Token::Word("break")) { // Branch for the `break if` statement, this statement // has the form `break if ;` and must be the last // statement in a continuing block // The break must be followed by an `if` to form // the break if lexer.expect(Token::Word("if"))?; // Start the emitter to begin parsing an expression emitter.start(context.expressions); let condition = self.parse_general_expression( lexer, context.as_expression(&mut body, emitter), )?; // Add all emits to the continuing body continuing.extend(emitter.finish(context.expressions)); // Set the condition of the break if to the newly parsed // expression break_if = Some(condition); // Expext a semicolon to close the statement lexer.expect(Token::Separator(';'))?; // Expect a closing brace to close the continuing block, // since the break if must be the last statement lexer.expect(Token::Paren('}'))?; // Stop parsing the continuing block break; } else if lexer.skip(Token::Paren('}')) { // If we encounter a closing brace it means we have reached // the end of the continuing block and should stop processing break; } else { // Otherwise try to parse a statement self.parse_statement(lexer, context.reborrow(), &mut continuing, false)?; } } // Since the continuing block must be the last part of the loop body, // we expect to see a closing brace to end the loop body lexer.expect(Token::Paren('}'))?; break; } if lexer.skip(Token::Paren('}')) { // If we encounter a closing brace it means we have reached // the end of the loop body and should stop processing break; } // Otherwise try to parse a statement self.parse_statement(lexer, context.reborrow(), &mut body, false)?; } // Pop the loop body lexical scope context.symbol_table.pop_scope(); Ok(crate::Statement::Loop { body, continuing, break_if, }) } fn parse_block<'a>( &mut self, lexer: &mut Lexer<'a>, mut context: StatementContext<'a, '_, '_>, is_uniform_control_flow: bool, ) -> Result> { self.push_rule_span(Rule::Block, lexer); // Push a lexical scope for the block context.symbol_table.push_scope(); lexer.expect(Token::Paren('{'))?; let mut block = crate::Block::new(); while !lexer.skip(Token::Paren('}')) { self.parse_statement( lexer, context.reborrow(), &mut block, is_uniform_control_flow, )?; } //Pop the block lexical scope context.symbol_table.pop_scope(); self.pop_rule_span(lexer); Ok(block) } fn parse_varying_binding<'a>( &mut self, lexer: &mut Lexer<'a>, ) -> Result, Error<'a>> { let mut bind_parser = BindingParser::default(); self.push_rule_span(Rule::Attribute, lexer); while lexer.skip(Token::Attribute) { let (word, span) = lexer.next_ident_with_span()?; bind_parser.parse(lexer, word, span)?; } let span = self.pop_rule_span(lexer); bind_parser.finish(span) } fn parse_function_decl<'a>( &mut self, lexer: &mut Lexer<'a>, module: &mut crate::Module, lookup_global_expression: &FastHashMap<&'a str, crate::Expression>, ) -> Result<(crate::Function, &'a str), Error<'a>> { self.push_rule_span(Rule::FunctionDecl, lexer); // read function name let mut symbol_table = super::SymbolTable::default(); let (fun_name, span) = lexer.next_ident_with_span()?; if crate::keywords::wgsl::RESERVED.contains(&fun_name) { return Err(Error::ReservedKeyword(span)); } if let Some(entry) = self .module_scope_identifiers .insert(String::from(fun_name), span.clone()) { return Err(Error::Redefinition { previous: entry, current: span, }); } // populate initial expressions let mut expressions = Arena::new(); for (&name, expression) in lookup_global_expression.iter() { let (span, is_reference) = match *expression { crate::Expression::GlobalVariable(handle) => ( module.global_variables.get_span(handle), module.global_variables[handle].space != crate::AddressSpace::Handle, ), crate::Expression::Constant(handle) => (module.constants.get_span(handle), false), _ => unreachable!(), }; let expression = expressions.append(expression.clone(), span); symbol_table.add( name, TypedExpression { handle: expression, is_reference, }, ); } // read parameter list let mut arguments = Vec::new(); lexer.expect(Token::Paren('('))?; let mut ready = true; while !lexer.skip(Token::Paren(')')) { if !ready { return Err(Error::Unexpected( lexer.next().1, ExpectedToken::Token(Token::Separator(',')), )); } let mut binding = self.parse_varying_binding(lexer)?; let (param_name, param_name_span, param_type) = self.parse_variable_ident_decl(lexer, &mut module.types, &mut module.constants)?; if crate::keywords::wgsl::RESERVED.contains(¶m_name) { return Err(Error::ReservedKeyword(param_name_span)); } let param_index = arguments.len() as u32; let expression = expressions.append( crate::Expression::FunctionArgument(param_index), NagaSpan::from(param_name_span), ); symbol_table.add( param_name, TypedExpression { handle: expression, is_reference: false, }, ); if let Some(ref mut binding) = binding { binding.apply_default_interpolation(&module.types[param_type].inner); } arguments.push(crate::FunctionArgument { name: Some(param_name.to_string()), ty: param_type, binding, }); ready = lexer.skip(Token::Separator(',')); } // read return type let result = if lexer.skip(Token::Arrow) && !lexer.skip(Token::Word("void")) { let mut binding = self.parse_varying_binding(lexer)?; let ty = self.parse_type_decl(lexer, None, &mut module.types, &mut module.constants)?; if let Some(ref mut binding) = binding { binding.apply_default_interpolation(&module.types[ty].inner); } Some(crate::FunctionResult { ty, binding }) } else { None }; let mut fun = crate::Function { name: Some(fun_name.to_string()), arguments, result, local_variables: Arena::new(), expressions, named_expressions: crate::NamedExpressions::default(), body: crate::Block::new(), }; // read body let mut typifier = super::Typifier::new(); let mut named_expressions = crate::FastHashMap::default(); fun.body = self.parse_block( lexer, StatementContext { symbol_table: &mut symbol_table, typifier: &mut typifier, variables: &mut fun.local_variables, expressions: &mut fun.expressions, named_expressions: &mut named_expressions, types: &mut module.types, constants: &mut module.constants, global_vars: &module.global_variables, functions: &module.functions, arguments: &fun.arguments, }, true, )?; // fixup the IR ensure_block_returns(&mut fun.body); // done self.pop_rule_span(lexer); // Set named expressions after block parsing ends fun.named_expressions = named_expressions; Ok((fun, fun_name)) } fn parse_global_decl<'a>( &mut self, lexer: &mut Lexer<'a>, module: &mut crate::Module, lookup_global_expression: &mut FastHashMap<&'a str, crate::Expression>, ) -> Result> { // read attributes let mut binding = None; let mut stage = None; let mut workgroup_size = [0u32; 3]; let mut early_depth_test = None; let (mut bind_index, mut bind_group) = (None, None); self.push_rule_span(Rule::Attribute, lexer); while lexer.skip(Token::Attribute) { match lexer.next_ident_with_span()? { ("binding", _) => { lexer.expect(Token::Paren('('))?; bind_index = Some(Self::parse_non_negative_i32_literal(lexer)?); lexer.expect(Token::Paren(')'))?; } ("group", _) => { lexer.expect(Token::Paren('('))?; bind_group = Some(Self::parse_non_negative_i32_literal(lexer)?); lexer.expect(Token::Paren(')'))?; } ("vertex", _) => { stage = Some(crate::ShaderStage::Vertex); } ("fragment", _) => { stage = Some(crate::ShaderStage::Fragment); } ("compute", _) => { stage = Some(crate::ShaderStage::Compute); } ("workgroup_size", _) => { lexer.expect(Token::Paren('('))?; workgroup_size = [1u32; 3]; for (i, size) in workgroup_size.iter_mut().enumerate() { *size = Self::parse_generic_non_negative_int_literal(lexer)?; match lexer.next() { (Token::Paren(')'), _) => break, (Token::Separator(','), _) if i != 2 => (), other => { return Err(Error::Unexpected( other.1, ExpectedToken::WorkgroupSizeSeparator, )) } } } } ("early_depth_test", _) => { let conservative = if lexer.skip(Token::Paren('(')) { let (ident, ident_span) = lexer.next_ident_with_span()?; let value = conv::map_conservative_depth(ident, ident_span)?; lexer.expect(Token::Paren(')'))?; Some(value) } else { None }; early_depth_test = Some(crate::EarlyDepthTest { conservative }); } (_, word_span) => return Err(Error::UnknownAttribute(word_span)), } } let attrib_span = self.pop_rule_span(lexer); match (bind_group, bind_index) { (Some(group), Some(index)) => { binding = Some(crate::ResourceBinding { group, binding: index, }); } (Some(_), None) => return Err(Error::MissingAttribute("binding", attrib_span)), (None, Some(_)) => return Err(Error::MissingAttribute("group", attrib_span)), (None, None) => {} } // read items let start = lexer.start_byte_offset(); match lexer.next() { (Token::Separator(';'), _) => {} (Token::Word("struct"), _) => { let (name, span) = lexer.next_ident_with_span()?; if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(span)); } let (members, span) = self.parse_struct_body(lexer, &mut module.types, &mut module.constants)?; let type_span = NagaSpan::from(lexer.span_from(start)); let ty = module.types.insert( crate::Type { name: Some(name.to_string()), inner: crate::TypeInner::Struct { members, span }, }, type_span, ); self.lookup_type.insert(name.to_owned(), ty); } (Token::Word("type"), _) => { let name = lexer.next_ident()?; lexer.expect(Token::Operation('='))?; let ty = self.parse_type_decl( lexer, Some(name), &mut module.types, &mut module.constants, )?; self.lookup_type.insert(name.to_owned(), ty); lexer.expect(Token::Separator(';'))?; } (Token::Word("let"), _) => { let (name, name_span) = lexer.next_ident_with_span()?; if crate::keywords::wgsl::RESERVED.contains(&name) { return Err(Error::ReservedKeyword(name_span)); } if let Some(entry) = self .module_scope_identifiers .insert(String::from(name), name_span.clone()) { return Err(Error::Redefinition { previous: entry, current: name_span, }); } let given_ty = if lexer.skip(Token::Separator(':')) { let ty = self.parse_type_decl( lexer, None, &mut module.types, &mut module.constants, )?; Some(ty) } else { None }; lexer.expect(Token::Operation('='))?; let first_token_span = lexer.next(); let const_handle = self.parse_const_expression_impl( first_token_span, lexer, Some(name), &mut module.types, &mut module.constants, )?; if let Some(explicit_ty) = given_ty { let con = &module.constants[const_handle]; let type_match = match con.inner { crate::ConstantInner::Scalar { width, value } => { module.types[explicit_ty].inner == crate::TypeInner::Scalar { kind: value.scalar_kind(), width, } } crate::ConstantInner::Composite { ty, components: _ } => ty == explicit_ty, }; if !type_match { let expected_inner_str = match con.inner { crate::ConstantInner::Scalar { width, value } => { crate::TypeInner::Scalar { kind: value.scalar_kind(), width, } .to_wgsl(&module.types, &module.constants) } crate::ConstantInner::Composite { .. } => module.types[explicit_ty] .inner .to_wgsl(&module.types, &module.constants), }; return Err(Error::InitializationTypeMismatch( name_span, expected_inner_str, )); } } lexer.expect(Token::Separator(';'))?; lookup_global_expression.insert(name, crate::Expression::Constant(const_handle)); } (Token::Word("var"), _) => { let pvar = self.parse_variable_decl(lexer, &mut module.types, &mut module.constants)?; if crate::keywords::wgsl::RESERVED.contains(&pvar.name) { return Err(Error::ReservedKeyword(pvar.name_span)); } if let Some(entry) = self .module_scope_identifiers .insert(String::from(pvar.name), pvar.name_span.clone()) { return Err(Error::Redefinition { previous: entry, current: pvar.name_span, }); } let var_handle = module.global_variables.append( crate::GlobalVariable { name: Some(pvar.name.to_owned()), space: pvar.space.unwrap_or(crate::AddressSpace::Handle), binding: binding.take(), ty: pvar.ty, init: pvar.init, }, NagaSpan::from(pvar.name_span), ); lookup_global_expression .insert(pvar.name, crate::Expression::GlobalVariable(var_handle)); } (Token::Word("fn"), _) => { let (function, name) = self.parse_function_decl(lexer, module, lookup_global_expression)?; match stage { Some(stage) => module.entry_points.push(crate::EntryPoint { name: name.to_string(), stage, early_depth_test, workgroup_size, function, }), None => { module .functions .append(function, NagaSpan::from(lexer.span_from(start))); } } } (Token::End, _) => return Ok(false), other => return Err(Error::Unexpected(other.1, ExpectedToken::GlobalItem)), } match binding { None => Ok(true), // we had the attribute but no var? Some(_) => Err(Error::Other), } } pub fn parse(&mut self, source: &str) -> Result { self.reset(); let mut module = crate::Module::default(); let mut lexer = Lexer::new(source); let mut lookup_global_expression = FastHashMap::default(); loop { match self.parse_global_decl(&mut lexer, &mut module, &mut lookup_global_expression) { Err(error) => return Err(error.as_parse_error(lexer.source)), Ok(true) => {} Ok(false) => { if !self.rules.is_empty() { log::error!("Reached the end of file, but rule stack is not empty"); return Err(Error::Other.as_parse_error(lexer.source)); }; return Ok(module); } } } } } pub fn parse_str(source: &str) -> Result { Parser::new().parse(source) } ================================================ FILE: lib/naga/src/front/wgsl/number.rs ================================================ use std::borrow::Cow; use super::{NumberError, Token}; /// When using this type assume no Abstract Int/Float for now #[derive(Copy, Clone, Debug, PartialEq)] pub enum Number { /// Abstract Int (-2^63 ≤ i < 2^63) AbstractInt(i64), /// Abstract Float (IEEE-754 binary64) AbstractFloat(f64), /// Concrete i32 I32(i32), /// Concrete u32 U32(u32), /// Concrete f32 F32(f32), } impl Number { /// Convert abstract numbers to a plausible concrete counterpart. /// /// Return concrete numbers unchanged. If the conversion would be /// lossy, return an error. fn abstract_to_concrete(self) -> Result { match self { Number::AbstractInt(num) => { use std::convert::TryFrom; i32::try_from(num) .map(Number::I32) .map_err(|_| NumberError::NotRepresentable) } Number::AbstractFloat(num) => { let num = num as f32; if num.is_finite() { Ok(Number::F32(num)) } else { Err(NumberError::NotRepresentable) } } num => Ok(num), } } } // TODO: when implementing Creation-Time Expressions, remove the ability to match the minus sign pub(super) fn consume_number(input: &str) -> (Token<'_>, &str) { let (result, rest) = parse(input); ( Token::Number(result.and_then(Number::abstract_to_concrete)), rest, ) } enum Kind { Int(IntKind), Float(FloatKind), } enum IntKind { I32, U32, } enum FloatKind { F32, F16, } // The following regexes (from the WGSL spec) will be matched: // int_literal: // | / 0 [iu]? / // | / [1-9][0-9]* [iu]? / // | / 0[xX][0-9a-fA-F]+ [iu]? / // decimal_float_literal: // | / 0 [fh] / // | / [1-9][0-9]* [fh] / // | / [0-9]* \.[0-9]+ ([eE][+-]?[0-9]+)? [fh]? / // | / [0-9]+ \.[0-9]* ([eE][+-]?[0-9]+)? [fh]? / // | / [0-9]+ [eE][+-]?[0-9]+ [fh]? / // hex_float_literal: // | / 0[xX][0-9a-fA-F]* \.[0-9a-fA-F]+ ([pP][+-]?[0-9]+ [fh]?)? / // | / 0[xX][0-9a-fA-F]+ \.[0-9a-fA-F]* ([pP][+-]?[0-9]+ [fh]?)? / // | / 0[xX][0-9a-fA-F]+ [pP][+-]?[0-9]+ [fh]? / // You could visualize the regex below via https://debuggex.com to get a rough idea what `parse` is doing // -?(?:0[xX](?:([0-9a-fA-F]+\.[0-9a-fA-F]*|[0-9a-fA-F]*\.[0-9a-fA-F]+)(?:([pP][+-]?[0-9]+)([fh]?))?|([0-9a-fA-F]+)([pP][+-]?[0-9]+)([fh]?)|([0-9a-fA-F]+)([iu]?))|((?:[0-9]+[eE][+-]?[0-9]+|(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?))([fh]?)|((?:[0-9]|[1-9][0-9]+))([iufh]?)) fn parse(input: &str) -> (Result, &str) { /// returns `true` and consumes `X` bytes from the given byte buffer /// if the given `X` nr of patterns are found at the start of the buffer macro_rules! consume { ($bytes:ident, $($($pattern:pat)|*),*) => { match $bytes { &[$($($pattern)|*),*, ref rest @ ..] => { $bytes = rest; true }, _ => false, } }; } /// consumes one byte from the given byte buffer /// if one of the given patterns are found at the start of the buffer /// returning the corresponding expr for the matched pattern macro_rules! consume_map { ($bytes:ident, [$($($pattern:pat)|* => $to:expr),*]) => { match $bytes { $( &[$($pattern)|*, ref rest @ ..] => { $bytes = rest; Some($to) }, )* _ => None, } }; } /// consumes all consecutive bytes matched by the `0-9` pattern from the given byte buffer /// returning the number of consumed bytes macro_rules! consume_dec_digits { ($bytes:ident) => {{ let start_len = $bytes.len(); while let &[b'0'..=b'9', ref rest @ ..] = $bytes { $bytes = rest; } start_len - $bytes.len() }}; } /// consumes all consecutive bytes matched by the `0-9 | a-f | A-F` pattern from the given byte buffer /// returning the number of consumed bytes macro_rules! consume_hex_digits { ($bytes:ident) => {{ let start_len = $bytes.len(); while let &[b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F', ref rest @ ..] = $bytes { $bytes = rest; } start_len - $bytes.len() }}; } /// maps the given `&[u8]` (tail of the initial `input: &str`) to a `&str` macro_rules! rest_to_str { ($bytes:ident) => { &input[input.len() - $bytes.len()..] }; } struct ExtractSubStr<'a>(&'a str); impl<'a> ExtractSubStr<'a> { /// given an `input` and a `start` (tail of the `input`) /// creates a new [ExtractSubStr] fn start(input: &'a str, start: &'a [u8]) -> Self { let start = input.len() - start.len(); Self(&input[start..]) } /// given an `end` (tail of the initial `input`) /// returns a substring of `input` fn end(&self, end: &'a [u8]) -> &'a str { let end = self.0.len() - end.len(); &self.0[..end] } } let mut bytes = input.as_bytes(); let general_extract = ExtractSubStr::start(input, bytes); let is_negative = consume!(bytes, b'-'); if consume!(bytes, b'0', b'x' | b'X') { let digits_extract = ExtractSubStr::start(input, bytes); let consumed = consume_hex_digits!(bytes); if consume!(bytes, b'.') { let consumed_after_period = consume_hex_digits!(bytes); if consumed + consumed_after_period == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let significand = general_extract.end(bytes); if consume!(bytes, b'p' | b'P') { consume!(bytes, b'+' | b'-'); let consumed = consume_dec_digits!(bytes); if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let number = general_extract.end(bytes); let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]); (parse_hex_float(number, kind), rest_to_str!(bytes)) } else { ( parse_hex_float_missing_exponent(significand, None), rest_to_str!(bytes), ) } } else { if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let significand = general_extract.end(bytes); let digits = digits_extract.end(bytes); let exp_extract = ExtractSubStr::start(input, bytes); if consume!(bytes, b'p' | b'P') { consume!(bytes, b'+' | b'-'); let consumed = consume_dec_digits!(bytes); if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let exponent = exp_extract.end(bytes); let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]); ( parse_hex_float_missing_period(significand, exponent, kind), rest_to_str!(bytes), ) } else { let kind = consume_map!(bytes, [b'i' => IntKind::I32, b'u' => IntKind::U32]); ( parse_hex_int(is_negative, digits, kind), rest_to_str!(bytes), ) } } } else { let is_first_zero = bytes.first() == Some(&b'0'); let consumed = consume_dec_digits!(bytes); if consume!(bytes, b'.') { let consumed_after_period = consume_dec_digits!(bytes); if consumed + consumed_after_period == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } if consume!(bytes, b'e' | b'E') { consume!(bytes, b'+' | b'-'); let consumed = consume_dec_digits!(bytes); if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } } let number = general_extract.end(bytes); let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]); (parse_dec_float(number, kind), rest_to_str!(bytes)) } else { if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } if consume!(bytes, b'e' | b'E') { consume!(bytes, b'+' | b'-'); let consumed = consume_dec_digits!(bytes); if consumed == 0 { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let number = general_extract.end(bytes); let kind = consume_map!(bytes, [b'f' => FloatKind::F32, b'h' => FloatKind::F16]); (parse_dec_float(number, kind), rest_to_str!(bytes)) } else { // make sure the multi-digit numbers don't start with zero if consumed > 1 && is_first_zero { return (Err(NumberError::Invalid), rest_to_str!(bytes)); } let digits_with_sign = general_extract.end(bytes); let kind = consume_map!(bytes, [ b'i' => Kind::Int(IntKind::I32), b'u' => Kind::Int(IntKind::U32), b'f' => Kind::Float(FloatKind::F32), b'h' => Kind::Float(FloatKind::F16) ]); ( parse_dec(is_negative, digits_with_sign, kind), rest_to_str!(bytes), ) } } } } fn parse_hex_float_missing_exponent( // format: -?0[xX] ( [0-9a-fA-F]+\.[0-9a-fA-F]* | [0-9a-fA-F]*\.[0-9a-fA-F]+ ) significand: &str, kind: Option, ) -> Result { let hexf_input = format!("{}{}", significand, "p0"); parse_hex_float(&hexf_input, kind) } fn parse_hex_float_missing_period( // format: -?0[xX] [0-9a-fA-F]+ significand: &str, // format: [pP][+-]?[0-9]+ exponent: &str, kind: Option, ) -> Result { let hexf_input = format!("{}.{}", significand, exponent); parse_hex_float(&hexf_input, kind) } fn parse_hex_int( is_negative: bool, // format: [0-9a-fA-F]+ digits: &str, kind: Option, ) -> Result { let digits_with_sign = if is_negative { Cow::Owned(format!("-{}", digits)) } else { Cow::Borrowed(digits) }; parse_int(&digits_with_sign, kind, 16, is_negative) } fn parse_dec( is_negative: bool, // format: -? ( [0-9] | [1-9][0-9]+ ) digits_with_sign: &str, kind: Option, ) -> Result { match kind { None => parse_int(digits_with_sign, None, 10, is_negative), Some(Kind::Int(kind)) => parse_int(digits_with_sign, Some(kind), 10, is_negative), Some(Kind::Float(kind)) => parse_dec_float(digits_with_sign, Some(kind)), } } // Float parsing notes // The following chapters of IEEE 754-2019 are relevant: // // 7.4 Overflow (largest finite number is exceeded by what would have been // the rounded floating-point result were the exponent range unbounded) // // 7.5 Underflow (tiny non-zero result is detected; // for decimal formats tininess is detected before rounding when a non-zero result // computed as though both the exponent range and the precision were unbounded // would lie strictly between 2^−126) // // 7.6 Inexact (rounded result differs from what would have been computed // were both exponent range and precision unbounded) // The WGSL spec requires us to error: // on overflow for decimal floating point literals // on overflow and inexact for hexadecimal floating point literals // (underflow is not mentioned) // hexf_parse errors on overflow, underflow, inexact // rust std lib float from str handles overflow, underflow, inexact transparently (rounds and will not error) // Therefore we only check for overflow manually for decimal floating point literals // input format: -?0[xX] ( [0-9a-fA-F]+\.[0-9a-fA-F]* | [0-9a-fA-F]*\.[0-9a-fA-F]+ ) [pP][+-]?[0-9]+ fn parse_hex_float(input: &str, kind: Option) -> Result { match kind { None => match hexf_parse::parse_hexf64(input, false) { Ok(num) => Ok(Number::AbstractFloat(num)), // can only be ParseHexfErrorKind::Inexact but we can't check since it's private _ => Err(NumberError::NotRepresentable), }, Some(FloatKind::F32) => match hexf_parse::parse_hexf32(input, false) { Ok(num) => Ok(Number::F32(num)), // can only be ParseHexfErrorKind::Inexact but we can't check since it's private _ => Err(NumberError::NotRepresentable), }, Some(FloatKind::F16) => Err(NumberError::UnimplementedF16), } } // input format: -? ( [0-9]+\.[0-9]* | [0-9]*\.[0-9]+ ) ([eE][+-]?[0-9]+)? // | -? [0-9]+ [eE][+-]?[0-9]+ fn parse_dec_float(input: &str, kind: Option) -> Result { match kind { None => { let num = input.parse::().unwrap(); // will never fail num.is_finite() .then(|| Number::AbstractFloat(num)) .ok_or(NumberError::NotRepresentable) } Some(FloatKind::F32) => { let num = input.parse::().unwrap(); // will never fail num.is_finite() .then(|| Number::F32(num)) .ok_or(NumberError::NotRepresentable) } Some(FloatKind::F16) => Err(NumberError::UnimplementedF16), } } fn parse_int( input: &str, kind: Option, radix: u32, is_negative: bool, ) -> Result { fn map_err(e: core::num::ParseIntError) -> NumberError { match *e.kind() { core::num::IntErrorKind::PosOverflow | core::num::IntErrorKind::NegOverflow => { NumberError::NotRepresentable } _ => unreachable!(), } } match kind { None => match i64::from_str_radix(input, radix) { Ok(num) => Ok(Number::AbstractInt(num)), Err(e) => Err(map_err(e)), }, Some(IntKind::I32) => match i32::from_str_radix(input, radix) { Ok(num) => Ok(Number::I32(num)), Err(e) => Err(map_err(e)), }, Some(IntKind::U32) if is_negative => Err(NumberError::NotRepresentable), Some(IntKind::U32) => match u32::from_str_radix(input, radix) { Ok(num) => Ok(Number::U32(num)), Err(e) => Err(map_err(e)), }, } } ================================================ FILE: lib/naga/src/front/wgsl/tests.rs ================================================ use super::parse_str; #[test] fn parse_comment() { parse_str( "// //// ///////////////////////////////////////////////////////// asda //////////////////// dad ////////// / ///////////////////////////////////////////////////////////////////////////////////////////////////// // ", ) .unwrap(); } #[test] fn parse_types() { parse_str("let a : i32 = 2;").unwrap(); assert!(parse_str("let a : x32 = 2;").is_err()); parse_str("var t: texture_2d;").unwrap(); parse_str("var t: texture_cube_array;").unwrap(); parse_str("var t: texture_multisampled_2d;").unwrap(); parse_str("var t: texture_storage_1d;").unwrap(); parse_str("var t: texture_storage_3d;").unwrap(); } #[test] fn parse_type_inference() { parse_str( " fn foo() { let a = 2u; let b: u32 = a; var x = 3.; var y = vec2(1, 2); }", ) .unwrap(); assert!(parse_str( " fn foo() { let c : i32 = 2.0; }", ) .is_err()); } #[test] fn parse_type_cast() { parse_str( " let a : i32 = 2; fn main() { var x: f32 = f32(a); x = f32(i32(a + 1) / 2); } ", ) .unwrap(); parse_str( " fn main() { let x: vec2 = vec2(1.0, 2.0); let y: vec2 = vec2(x); } ", ) .unwrap(); parse_str( " fn main() { let x: vec2 = vec2(0.0); } ", ) .unwrap(); assert!(parse_str( " fn main() { let x: vec2 = vec2(0); } ", ) .is_err()); } #[test] fn parse_struct() { parse_str( " struct Foo { x: i32 } struct Bar { @size(16) x: vec2, @align(16) y: f32, @size(32) @align(128) z: vec3, }; struct Empty {} var s: Foo; ", ) .unwrap(); } #[test] fn parse_standard_fun() { parse_str( " fn main() { var x: i32 = min(max(1, 2), 3); } ", ) .unwrap(); } #[test] fn parse_statement() { parse_str( " fn main() { ; {} {;} } ", ) .unwrap(); parse_str( " fn foo() {} fn bar() { foo(); } ", ) .unwrap(); } #[test] fn parse_if() { parse_str( " fn main() { if true { discard; } else {} if 0 != 1 {} if false { return; } else if true { return; } else {} } ", ) .unwrap(); } #[test] fn parse_parentheses_if() { parse_str( " fn main() { if (true) { discard; } else {} if (0 != 1) {} if (false) { return; } else if (true) { return; } else {} } ", ) .unwrap(); } #[test] fn parse_loop() { parse_str( " fn main() { var i: i32 = 0; loop { if i == 1 { break; } continuing { i = 1; } } loop { if i == 0 { continue; } break; } } ", ) .unwrap(); parse_str( " fn main() { var found: bool = false; var i: i32 = 0; while !found { if i == 10 { found = true; } i = i + 1; } } ", ) .unwrap(); parse_str( " fn main() { while true { break; } } ", ) .unwrap(); parse_str( " fn main() { var a: i32 = 0; for(var i: i32 = 0; i < 4; i = i + 1) { a = a + 2; } } ", ) .unwrap(); parse_str( " fn main() { for(;;) { break; } } ", ) .unwrap(); } #[test] fn parse_switch() { parse_str( " fn main() { var pos: f32; switch (3) { case 0, 1: { pos = 0.0; } case 2: { pos = 1.0; fallthrough; } case 3: {} default: { pos = 3.0; } } } ", ) .unwrap(); } #[test] fn parse_switch_optional_colon_in_case() { parse_str( " fn main() { var pos: f32; switch (3) { case 0, 1 { pos = 0.0; } case 2 { pos = 1.0; fallthrough; } case 3 {} default { pos = 3.0; } } } ", ) .unwrap(); } #[test] fn parse_parentheses_switch() { parse_str( " fn main() { var pos: f32; switch pos > 1.0 { default: { pos = 3.0; } } } ", ) .unwrap(); } #[test] fn parse_texture_load() { parse_str( " var t: texture_3d; fn foo() { let r: vec4 = textureLoad(t, vec3(0.0, 1.0, 2.0), 1); } ", ) .unwrap(); parse_str( " var t: texture_multisampled_2d_array; fn foo() { let r: vec4 = textureLoad(t, vec2(10, 20), 2, 3); } ", ) .unwrap(); parse_str( " var t: texture_storage_1d_array; fn foo() { let r: vec4 = textureLoad(t, 10, 2); } ", ) .unwrap(); } #[test] fn parse_texture_store() { parse_str( " var t: texture_storage_2d; fn foo() { textureStore(t, vec2(10, 20), vec4(0.0, 1.0, 2.0, 3.0)); } ", ) .unwrap(); } #[test] fn parse_texture_query() { parse_str( " var t: texture_multisampled_2d_array; fn foo() { var dim: vec2 = textureDimensions(t); dim = textureDimensions(t, 0); let layers: i32 = textureNumLayers(t); let samples: i32 = textureNumSamples(t); } ", ) .unwrap(); } #[test] fn parse_postfix() { parse_str( "fn foo() { let x: f32 = vec4(1.0, 2.0, 3.0, 4.0).xyz.rgbr.aaaa.wz.g; let y: f32 = fract(vec2(0.5, x)).x; }", ) .unwrap(); } #[test] fn parse_expressions() { parse_str("fn foo() { let x: f32 = select(0.0, 1.0, true); let y: vec2 = select(vec2(1.0, 1.0), vec2(x, x), vec2(x < 0.5, x > 0.5)); let z: bool = !(0.0 == 1.0); }").unwrap(); } #[test] fn parse_pointers() { parse_str( "fn foo() { var x: f32 = 1.0; let px = &x; let py = frexp(0.5, px); }", ) .unwrap(); } #[test] fn parse_struct_instantiation() { parse_str( " struct Foo { a: f32, b: vec3, } @fragment fn fs_main() { var foo: Foo = Foo(0.0, vec3(0.0, 1.0, 42.0)); } ", ) .unwrap(); } #[test] fn parse_array_length() { parse_str( " struct Foo { data: array } // this is used as both input and output for convenience @group(0) @binding(0) var foo: Foo; @group(0) @binding(1) var bar: array; fn baz() { var x: u32 = arrayLength(foo.data); var y: u32 = arrayLength(bar); } ", ) .unwrap(); } #[test] fn parse_storage_buffers() { parse_str( " @group(0) @binding(0) var foo: array; ", ) .unwrap(); parse_str( " @group(0) @binding(0) var foo: array; ", ) .unwrap(); parse_str( " @group(0) @binding(0) var foo: array; ", ) .unwrap(); parse_str( " @group(0) @binding(0) var foo: array; ", ) .unwrap(); } ================================================ FILE: lib/naga/src/keywords/mod.rs ================================================ /*! Lists of reserved keywords for each shading language with a [frontend][crate::front] or [backend][crate::back]. */ #[cfg(any(feature = "wgsl-in", feature = "wgsl-out"))] pub mod wgsl; ================================================ FILE: lib/naga/src/keywords/wgsl.rs ================================================ /*! Keywords for [WGSL][wgsl] (WebGPU Shading Language). [wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html */ // https://gpuweb.github.io/gpuweb/wgsl/#keyword-summary pub const RESERVED: &[&str] = &[ // type-defining "array", "atomic", "bool", "f32", "f16", "i32", "mat2x2", "mat2x3", "mat2x4", "mat3x2", "mat3x3", "mat3x4", "mat4x2", "mat4x3", "mat4x4", "override", "ptr", "sampler", "sampler_comparison", "struct", "texture_1d", "texture_2d", "texture_2d_array", "texture_3d", "texture_cube", "texture_cube_array", "texture_multisampled_2d", "texture_storage_1d", "texture_storage_2d", "texture_storage_2d_array", "texture_storage_3d", "texture_depth_2d", "texture_depth_2d_array", "texture_depth_cube", "texture_depth_cube_array", "texture_depth_multisampled_2d", "u32", "vec2", "vec3", "vec4", // other "bitcast", "break", "case", "const", "continue", "continuing", "default", "discard", "else", "enable", "fallthrough", "false", "fn", "for", "function", "if", "let", "loop", "private", "return", "storage", "switch", "true", "type", "uniform", "var", "while", "workgroup", // reserved "AppendStructuredBuffer", "BlendState", "Buffer", "ByteAddressBuffer", "CompileShader", "ComputeShader", "ConsumeStructuredBuffer", "DepthStencilState", "DepthStencilView", "DomainShader", "GeometryShader", "Hullshader", "InputPatch", "LineStream", "NULL", "OutputPatch", "PixelShader", "PointStream", "RWBuffer", "RWByteAddressBuffer", "RWStructuredBuffer", "RWTexture1D", "RWTexture1DArray", "RWTexture2D", "RWTexture2DArray", "RWTexture3D", "RasterizerState", "RenderTargetView", "SamplerComparisonState", "SamplerState", "Self", "StructuredBuffer", "Texture1D", "Texture1DArray", "Texture2D", "Texture2DArray", "Texture2DMS", "Texture2DMSArray", "Texture3D", "TextureCube", "TextureCubeArray", "TriangleStream", "VertexShader", "abstract", "active", "alignas", "alignof", "as", "asm", "asm_fragment", "async", "atomic_uint", "attribute", "auto", "await", "become", "bf16", "binding_array", "cast", "catch", "cbuffer", "char", "class", "co_await", "co_return", "co_yield", "coherent", "column_major", "common", "compile", "compile_fragment", "concept", "const_cast", "consteval", "constexpr", "constinit", "crate", "debugger", "decltype", "delete", "demote", "demote_to_helper", "do", "dword", "dynamic_cast", "enum", "explicit", "export", "extends", "extern", "external", "f64", "filter", "final", "finally", "fixed", "friend", "from", "fvec2", "fvec3", "fvec4", "fxgroup", "get", "goto", "groupshared", "handle", "highp", "hvec2", "hvec3", "hvec4", "i16", "i64", "i8", "iimage1D", "iimage1DArray", "iimage2D", "iimage2DArray", "iimage2DMS", "iimage2DMSArray", "iimage2DRect", "iimage3D", "iimageBuffer", "iimageCube", "iimageCubeArray", "image1D", "image1DArray", "image2D", "image2DArray", "image2DMS", "image2DMSArray", "image2DRect", "image3D", "imageBuffer", "imageCube", "imageCubeArray", "impl", "implements", "import", "inline", "inout", "instanceof", "interface", "invariant", "isampler1D", "isampler1DArray", "isampler2D", "isampler2DArray", "isampler2DMS", "isampler2DMSArray", "isampler2DRect", "isampler3D", "isamplerBuffer", "isamplerCube", "isamplerCubeArray", "isubpassInput", "isubpassInputMS", "itexture1D", "itexture1DArray", "itexture2D", "itexture2DArray", "itexture2DMS", "itexture2DMSArray", "itexture2DRect", "itexture3D", "itextureBuffer", "itextureCube", "itextureCubeArray", "layout", "line", "lineadj", "lowp", "macro", "macro_rules", "mat", "match", "matrix", "mediump", "meta", "mod", "module", "move", "mut", "mutable", "namespace", "new", "nil", "noexcept", "noinline", "nointerpolation", "noperspective", "null", "nullptr", "of", "operator", "package", "packoffset", "partition", "pass", "patch", "pixelfragment", "point", "precise", "precision", "premerge", "priv", "protected", "pub", "public", "readonly", "ref", "regardless", "register", "reinterpret_cast", "requires", "resource", "restrict", "row_major", "samper", "sampler1D", "sampler1DArray", "sampler1DArrayShadow", "sampler1DShadow", "sampler2D", "sampler2DArray", "sampler2DArrayShadow", "sampler2DMS", "sampler2DMSArray", "sampler2DRect", "sampler2DRectShadow", "sampler2DShadow", "sampler3D", "sampler3DRect", "samplerBuffer", "samplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "samplerCubeShadow", "samplerShadow", "self", "set", "shared", "signed", "sizeof", "smooth", "snorm", "stateblock", "stateblock_state", "static", "static_assert", "static_cast", "std", "string", "subpassInput", "subpassInputMS", "subroutine", "super", "superp", "target", "tbuffer", "technique", "technique10", "technique11", "template", "texture1D", "texture1DArray", "texture2D", "texture2DArray", "texture2DMS", "texture2DMSArray", "texture2DRect", "texture3D", "textureBuffer", "textureCube", "textureCubeArray", "this", "thread_local", "throw", "trait", "triangle", "triangleadj", "try", "typedef", "typeid", "typename", "typeof", "u16", "u64", "u8", "uimage1D", "uimage1DArray", "uimage2D", "uimage2DArray", "uimage2DMS", "uimage2DMSArray", "uimage2DRect", "uimage3D", "uimageBuffer", "uimageCube", "uimageCubeArray", "union", "unless", "unorm", "unsafe", "unsigned", "unsized", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", "usampler2DMS", "usampler2DMSArray", "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "use", "using", "usubpassInput", "usubpassInputMS", "utexture1D", "utexture1DArray", "utexture2D", "utexture2DArray", "utexture2DMS", "utexture2DMSArray", "utexture2DRect", "utexture3D", "utextureBuffer", "utextureCube", "utextureCubeArray", "varying", "vec", "vector", "vertexfragment", "virtual", "void", "volatile", "wchar_t", "wgsl", "where", "with", "writeonly", "yield", ]; ================================================ FILE: lib/naga/src/lib.rs ================================================ /*! Universal shader translator. The central structure of the crate is [`Module`]. A `Module` contains: - [`Function`]s, which have arguments, a return type, local variables, and a body, - [`EntryPoint`]s, which are specialized functions that can serve as the entry point for pipeline stages like vertex shading or fragment shading, - [`Constant`]s and [`GlobalVariable`]s used by `EntryPoint`s and `Function`s, and - [`Type`]s used by the above. The body of an `EntryPoint` or `Function` is represented using two types: - An [`Expression`] produces a value, but has no side effects or control flow. `Expressions` include variable references, unary and binary operators, and so on. - A [`Statement`] can have side effects and structured control flow. `Statement`s do not produce a value, other than by storing one in some designated place. `Statements` include blocks, conditionals, and loops, but also operations that have side effects, like stores and function calls. `Statement`s form a tree, with pointers into the DAG of `Expression`s. Restricting side effects to statements simplifies analysis and code generation. A Naga backend can generate code to evaluate an `Expression` however and whenever it pleases, as long as it is certain to observe the side effects of all previously executed `Statement`s. Many `Statement` variants use the [`Block`] type, which is `Vec`, with optional span info, representing a series of statements executed in order. The body of an `EntryPoint`s or `Function` is a `Block`, and `Statement` has a [`Block`][Statement::Block] variant. If the `clone` feature is enabled, [`Arena`], [`UniqueArena`], [`Type`], [`TypeInner`], [`Constant`], [`Function`], [`EntryPoint`] and [`Module`] can be cloned. ## Arenas To improve translator performance and reduce memory usage, most structures are stored in an [`Arena`]. An `Arena` stores a series of `T` values, indexed by [`Handle`](Handle) values, which are just wrappers around integer indexes. For example, a `Function`'s expressions are stored in an `Arena`, and compound expressions refer to their sub-expressions via `Handle` values. (When examining the serialized form of a `Module`, note that the first element of an `Arena` has an index of 1, not 0.) A [`UniqueArena`] is just like an `Arena`, except that it stores only a single instance of each value. The value type must implement `Eq` and `Hash`. Like an `Arena`, inserting a value into a `UniqueArena` returns a `Handle` which can be used to efficiently access the value, without a hash lookup. Inserting a value multiple times returns the same `Handle`. If the `span` feature is enabled, both `Arena` and `UniqueArena` can associate a source code span with each element. ## Function Calls Naga's representation of function calls is unusual. Most languages treat function calls as expressions, but because calls may have side effects, Naga represents them as a kind of statement, [`Statement::Call`]. If the function returns a value, a call statement designates a particular [`Expression::CallResult`] expression to represent its return value, for use by subsequent statements and expressions. ## `Expression` evaluation time It is essential to know when an [`Expression`] should be evaluated, because its value may depend on previous [`Statement`]s' effects. But whereas the order of execution for a tree of `Statement`s is apparent from its structure, it is not so clear for `Expressions`, since an expression may be referred to by any number of `Statement`s and other `Expression`s. Naga's rules for when `Expression`s are evaluated are as follows: - [`Constant`](Expression::Constant) expressions are considered to be implicitly evaluated before execution begins. - [`FunctionArgument`] and [`LocalVariable`] expressions are considered implicitly evaluated upon entry to the function to which they belong. Function arguments cannot be assigned to, and `LocalVariable` expressions produce a *pointer to* the variable's value (for use with [`Load`] and [`Store`]). Neither varies while the function executes, so it suffices to consider these expressions evaluated once on entry. - Similarly, [`GlobalVariable`] expressions are considered implicitly evaluated before execution begins, since their value does not change while code executes, for one of two reasons: - Most `GlobalVariable` expressions produce a pointer to the variable's value, for use with [`Load`] and [`Store`], as `LocalVariable` expressions do. Although the variable's value may change, its address does not. - A `GlobalVariable` expression referring to a global in the [`AddressSpace::Handle`] address space produces the value directly, not a pointer. Such global variables hold opaque types like shaders or images, and cannot be assigned to. - A [`CallResult`] expression that is the `result` of a [`Statement::Call`], representing the call's return value, is evaluated when the `Call` statement is executed. - Similarly, an [`AtomicResult`] expression that is the `result` of an [`Atomic`] statement, representing the result of the atomic operation, is evaluated when the `Atomic` statement is executed. - All other expressions are evaluated when the (unique) [`Statement::Emit`] statement that covers them is executed. The [`Expression::needs_pre_emit`] method returns `true` if the given expression is one of those variants that does *not* need to be covered by an `Emit` statement. Now, strictly speaking, not all `Expression` variants actually care when they're evaluated. For example, you can evaluate a [`BinaryOperator::Add`] expression any time you like, as long as you give it the right operands. It's really only a very small set of expressions that are affected by timing: - [`Load`], [`ImageSample`], and [`ImageLoad`] expressions are influenced by stores to the variables or images they access, and must execute at the proper time relative to them. - [`Derivative`] expressions are sensitive to control flow uniformity: they must not be moved out of an area of uniform control flow into a non-uniform area. - More generally, any expression that's used by more than one other expression or statement should probably be evaluated only once, and then stored in a variable to be cited at each point of use. Naga tries to help back ends handle all these cases correctly in a somewhat circuitous way. The [`ModuleInfo`] structure returned by [`Validator::validate`] provides a reference count for each expression in each function in the module. Naturally, any expression with a reference count of two or more deserves to be evaluated and stored in a temporary variable at the point that the `Emit` statement covering it is executed. But if we selectively lower the reference count threshold to _one_ for the sensitive expression types listed above, so that we _always_ generate a temporary variable and save their value, then the same code that manages multiply referenced expressions will take care of introducing temporaries for time-sensitive expressions as well. The `Expression::bake_ref_count` method (private to the back ends) is meant to help with this. ## `Expression` scope Each `Expression` has a *scope*, which is the region of the function within which it can be used by `Statement`s and other `Expression`s. It is a validation error to use an `Expression` outside its scope. An expression's scope is defined as follows: - The scope of a [`Constant`], [`GlobalVariable`], [`FunctionArgument`] or [`LocalVariable`] expression covers the entire `Function` in which it occurs. - The scope of an expression evaluated by an [`Emit`] statement covers the subsequent expressions in that `Emit`, the subsequent statements in the `Block` to which that `Emit` belongs (if any) and their sub-statements (if any). - The `result` expression of a [`Call`] or [`Atomic`] statement has a scope covering the subsequent statements in the `Block` in which the statement occurs (if any) and their sub-statements (if any). For example, this implies that an expression evaluated by some statement in a nested `Block` is not available in the `Block`'s parents. Such a value would need to be stored in a local variable to be carried upwards in the statement tree. [`AtomicResult`]: Expression::AtomicResult [`CallResult`]: Expression::CallResult [`Constant`]: Expression::Constant [`Derivative`]: Expression::Derivative [`FunctionArgument`]: Expression::FunctionArgument [`GlobalVariable`]: Expression::GlobalVariable [`ImageLoad`]: Expression::ImageLoad [`ImageSample`]: Expression::ImageSample [`Load`]: Expression::Load [`LocalVariable`]: Expression::LocalVariable [`Atomic`]: Statement::Atomic [`Call`]: Statement::Call [`Emit`]: Statement::Emit [`Store`]: Statement::Store [`Validator::validate`]: valid::Validator::validate [`ModuleInfo`]: valid::ModuleInfo */ #![allow( clippy::new_without_default, clippy::unneeded_field_pattern, clippy::match_like_matches_macro, clippy::if_same_then_else, clippy::derive_partial_eq_without_eq )] #![warn( trivial_casts, trivial_numeric_casts, unused_extern_crates, unused_qualifications, clippy::pattern_type_mismatch, clippy::missing_const_for_fn )] #![deny(clippy::panic)] mod arena; pub mod back; mod block; pub mod front; pub mod keywords; pub mod proc; mod span; pub mod valid; pub use crate::arena::{Arena, Handle, Range, UniqueArena}; pub use crate::span::{SourceLocation, Span, SpanContext, WithSpan}; #[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; #[cfg(feature = "deserialize")] use serde::Deserialize; #[cfg(feature = "serialize")] use serde::Serialize; /// Width of a boolean type, in bytes. pub const BOOL_WIDTH: Bytes = 1; /// Hash map that is faster but not resilient to DoS attacks. pub type FastHashMap = rustc_hash::FxHashMap; /// Hash set that is faster but not resilient to DoS attacks. pub type FastHashSet = rustc_hash::FxHashSet; /// Map of expressions that have associated variable names pub(crate) type NamedExpressions = FastHashMap, String>; /// Early fragment tests. /// /// In a standard situation, if a driver determines that it is possible to switch on early depth test, it will. /// /// Typical situations when early depth test is switched off: /// - Calling `discard` in a shader. /// - Writing to the depth buffer, unless ConservativeDepth is enabled. /// /// To use in a shader: /// - GLSL: `layout(early_fragment_tests) in;` /// - HLSL: `Attribute earlydepthstencil` /// - SPIR-V: `ExecutionMode EarlyFragmentTests` /// /// For more, see: /// - /// - /// - #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct EarlyDepthTest { conservative: Option, } /// Enables adjusting depth without disabling early Z. /// /// To use in a shader: /// - GLSL: `layout (depth_) out float gl_FragDepth;` /// - `depth_any` option behaves as if the layout qualifier was not present. /// - HLSL: `SV_DepthGreaterEqual`/`SV_DepthLessEqual`/`SV_Depth` /// - SPIR-V: `ExecutionMode Depth` /// /// For more, see: /// - /// - /// - #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ConservativeDepth { /// Shader may rewrite depth only with a value greater than calculated. GreaterEqual, /// Shader may rewrite depth smaller than one that would have been written without the modification. LessEqual, /// Shader may not rewrite depth value. Unchanged, } /// Stage of the programmable pipeline. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[allow(missing_docs)] // The names are self evident pub enum ShaderStage { Vertex, Fragment, Compute, } /// Addressing space of variables. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum AddressSpace { /// Function locals. Function, /// Private data, per invocation, mutable. Private, /// Workgroup shared data, mutable. WorkGroup, /// Uniform buffer data. Uniform, /// Storage buffer data, potentially mutable. Storage { access: StorageAccess }, /// Opaque handles, such as samplers and images. Handle, /// Push constants. PushConstant, } /// Built-in inputs and outputs. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum BuiltIn { Position { invariant: bool }, ViewIndex, // vertex BaseInstance, BaseVertex, ClipDistance, CullDistance, InstanceIndex, PointSize, VertexIndex, // fragment FragDepth, FrontFacing, PrimitiveIndex, SampleIndex, SampleMask, // compute GlobalInvocationId, LocalInvocationId, LocalInvocationIndex, WorkGroupId, WorkGroupSize, NumWorkGroups, } /// Number of bytes per scalar. pub type Bytes = u8; /// Number of components in a vector. #[repr(u8)] #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum VectorSize { /// 2D vector Bi = 2, /// 3D vector Tri = 3, /// 4D vector Quad = 4, } /// Primitive type for a scalar. #[repr(u8)] #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ScalarKind { /// Signed integer type. Sint, /// Unsigned integer type. Uint, /// Floating point type. Float, /// Boolean type. Bool, } /// Size of an array. #[repr(u8)] #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ArraySize { /// The array size is constant. Constant(Handle), /// The array size can change at runtime. Dynamic, } /// The interpolation qualifier of a binding or struct field. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum Interpolation { /// The value will be interpolated in a perspective-correct fashion. /// Also known as "smooth" in glsl. Perspective, /// Indicates that linear, non-perspective, correct /// interpolation must be used. /// Also known as "no_perspective" in glsl. Linear, /// Indicates that no interpolation will be performed. Flat, } /// The sampling qualifiers of a binding or struct field. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum Sampling { /// Interpolate the value at the center of the pixel. Center, /// Interpolate the value at a point that lies within all samples covered by /// the fragment within the current primitive. In multisampling, use a /// single value for all samples in the primitive. Centroid, /// Interpolate the value at each sample location. In multisampling, invoke /// the fragment shader once per sample. Sample, } /// Member of a user-defined structure. // Clone is used only for error reporting and is not intended for end users #[derive(Clone, Debug, Eq, Hash, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct StructMember { pub name: Option, /// Type of the field. pub ty: Handle, /// For I/O structs, defines the binding. pub binding: Option, /// Offset from the beginning from the struct. pub offset: u32, } /// The number of dimensions an image has. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ImageDimension { /// 1D image D1, /// 2D image D2, /// 3D image D3, /// Cube map Cube, } bitflags::bitflags! { /// Flags describing an image. #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Default)] pub struct StorageAccess: u32 { /// Storage can be used as a source for load ops. const LOAD = 0x1; /// Storage can be used as a target for store ops. const STORE = 0x2; } } /// Image storage format. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum StorageFormat { // 8-bit formats R8Unorm, R8Snorm, R8Uint, R8Sint, // 16-bit formats R16Uint, R16Sint, R16Float, Rg8Unorm, Rg8Snorm, Rg8Uint, Rg8Sint, // 32-bit formats R32Uint, R32Sint, R32Float, Rg16Uint, Rg16Sint, Rg16Float, Rgba8Unorm, Rgba8Snorm, Rgba8Uint, Rgba8Sint, // Packed 32-bit formats Rgb10a2Unorm, Rg11b10Float, // 64-bit formats Rg32Uint, Rg32Sint, Rg32Float, Rgba16Uint, Rgba16Sint, Rgba16Float, // 128-bit formats Rgba32Uint, Rgba32Sint, Rgba32Float, } /// Sub-class of the image type. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ImageClass { /// Regular sampled image. Sampled { /// Kind of values to sample. kind: ScalarKind, /// Multi-sampled image. /// /// A multi-sampled image holds several samples per texel. Multi-sampled /// images cannot have mipmaps. multi: bool, }, /// Depth comparison image. Depth { /// Multi-sampled depth image. multi: bool, }, /// Storage image. Storage { format: StorageFormat, access: StorageAccess, }, } /// A data type declared in the module. #[derive(Debug, Eq, Hash, PartialEq)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct Type { /// The name of the type, if any. pub name: Option, /// Inner structure that depends on the kind of the type. pub inner: TypeInner, } /// Enum with additional information, depending on the kind of type. #[derive(Debug, Eq, Hash, PartialEq)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum TypeInner { /// Number of integral or floating-point kind. Scalar { kind: ScalarKind, width: Bytes }, /// Vector of numbers. Vector { size: VectorSize, kind: ScalarKind, width: Bytes, }, /// Matrix of floats. Matrix { columns: VectorSize, rows: VectorSize, width: Bytes, }, /// Atomic scalar. Atomic { kind: ScalarKind, width: Bytes }, /// Pointer to another type. /// /// Pointers to scalars and vectors should be treated as equivalent to /// [`ValuePointer`] types. Use the [`TypeInner::equivalent`] method to /// compare types in a way that treats pointers correctly. /// /// ## Pointers to non-`SIZED` types /// /// The `base` type of a pointer may be a non-[`SIZED`] type like a /// dynamically-sized [`Array`], or a [`Struct`] whose last member is a /// dynamically sized array. Such pointers occur as the types of /// [`GlobalVariable`] or [`AccessIndex`] expressions referring to /// dynamically-sized arrays. /// /// However, among pointers to non-`SIZED` types, only pointers to `Struct`s /// are [`DATA`]. Pointers to dynamically sized `Array`s cannot be passed as /// arguments, stored in variables, or held in arrays or structures. Their /// only use is as the types of `AccessIndex` expressions. /// /// [`SIZED`]: valid::TypeFlags::SIZED /// [`DATA`]: valid::TypeFlags::DATA /// [`Array`]: TypeInner::Array /// [`Struct`]: TypeInner::Struct /// [`ValuePointer`]: TypeInner::ValuePointer /// [`GlobalVariable`]: Expression::GlobalVariable /// [`AccessIndex`]: Expression::AccessIndex Pointer { base: Handle, space: AddressSpace, }, /// Pointer to a scalar or vector. /// /// A `ValuePointer` type is equivalent to a `Pointer` whose `base` is a /// `Scalar` or `Vector` type. This is for use in [`TypeResolution::Value`] /// variants; see the documentation for [`TypeResolution`] for details. /// /// Use the [`TypeInner::equivalent`] method to compare types that could be /// pointers, to ensure that `Pointer` and `ValuePointer` types are /// recognized as equivalent. /// /// [`TypeResolution`]: proc::TypeResolution /// [`TypeResolution::Value`]: proc::TypeResolution::Value ValuePointer { size: Option, kind: ScalarKind, width: Bytes, space: AddressSpace, }, /// Homogenous list of elements. /// /// The `base` type must be a [`SIZED`], [`DATA`] type. /// /// ## Dynamically sized arrays /// /// An `Array` is [`SIZED`] unless its `size` is [`Dynamic`]. /// Dynamically-sized arrays may only appear in a few situations: /// /// - They may appear as the type of a [`GlobalVariable`], or as the last /// member of a [`Struct`]. /// /// - They may appear as the base type of a [`Pointer`]. An /// [`AccessIndex`] expression referring to a struct's final /// unsized array member would have such a pointer type. However, such /// pointer types may only appear as the types of such intermediate /// expressions. They are not [`DATA`], and cannot be stored in /// variables, held in arrays or structs, or passed as parameters. /// /// [`SIZED`]: crate::valid::TypeFlags::SIZED /// [`DATA`]: crate::valid::TypeFlags::DATA /// [`Dynamic`]: ArraySize::Dynamic /// [`Struct`]: TypeInner::Struct /// [`Pointer`]: TypeInner::Pointer /// [`AccessIndex`]: Expression::AccessIndex Array { base: Handle, size: ArraySize, stride: u32, }, /// User-defined structure. /// /// There must always be at least one member. /// /// A `Struct` type is [`DATA`], and the types of its members must be /// `DATA` as well. /// /// Member types must be [`SIZED`], except for the final member of a /// struct, which may be a dynamically sized [`Array`]. The /// `Struct` type itself is `SIZED` when all its members are `SIZED`. /// /// [`DATA`]: crate::valid::TypeFlags::DATA /// [`SIZED`]: crate::valid::TypeFlags::SIZED /// [`Array`]: TypeInner::Array Struct { members: Vec, //TODO: should this be unaligned? span: u32, }, /// Possibly multidimensional array of texels. Image { dim: ImageDimension, arrayed: bool, //TODO: consider moving `multisampled: bool` out class: ImageClass, }, /// Can be used to sample values from images. Sampler { comparison: bool }, /// Array of bindings. /// /// A `BindingArray` represents an array where each element draws its value /// from a separate bound resource. The array's element type `base` may be /// [`Image`], [`Sampler`], or any type that would be permitted for a global /// in the [`Uniform`] or [`Storage`] address spaces. Only global variables /// may be binding arrays; on the host side, their values are provided by /// [`TextureViewArray`], [`SamplerArray`], or [`BufferArray`] /// bindings. /// /// Since each element comes from a distinct resource, a binding array of /// images could have images of varying sizes (but not varying dimensions; /// they must all have the same `Image` type). Or, a binding array of /// buffers could have elements that are dynamically sized arrays, each with /// a different length. /// /// Binding arrays are not [`DATA`]. This means that all binding array /// globals must be placed in the [`Handle`] address space. Referring to /// such a global produces a `BindingArray` value directly; there are never /// pointers to binding arrays. The only operation permitted on /// `BindingArray` values is indexing, which yields the element by value, /// not a pointer to the element. (This means that buffer array contents /// cannot be stored to; [naga#1864] covers lifting this restriction.) /// /// Unlike textures and samplers, binding arrays are not [`ARGUMENT`], so /// they cannot be passed as arguments to functions. /// /// Naga's WGSL front end supports binding arrays with the type syntax /// `binding_array`. /// /// [`Image`]: TypeInner::Image /// [`Sampler`]: TypeInner::Sampler /// [`Uniform`]: AddressSpace::Uniform /// [`Storage`]: AddressSpace::Storage /// [`TextureViewArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.TextureViewArray /// [`SamplerArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.SamplerArray /// [`BufferArray`]: https://docs.rs/wgpu/latest/wgpu/enum.BindingResource.html#variant.BufferArray /// [`DATA`]: crate::valid::TypeFlags::DATA /// [`Handle`]: AddressSpace::Handle /// [`ARGUMENT`]: crate::valid::TypeFlags::ARGUMENT /// [naga#1864]: https://github.com/gfx-rs/naga/issues/1864 BindingArray { base: Handle, size: ArraySize }, } /// Constant value. #[derive(Debug, PartialEq)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct Constant { pub name: Option, pub specialization: Option, pub inner: ConstantInner, } /// A literal scalar value, used in constants. #[derive(Debug, Clone, Copy, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ScalarValue { Sint(i64), Uint(u64), Float(f64), Bool(bool), } /// Additional information, dependent on the kind of constant. #[derive(Clone, Debug, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ConstantInner { Scalar { width: Bytes, value: ScalarValue, }, Composite { ty: Handle, components: Vec>, }, } /// Describes how an input/output variable is to be bound. #[derive(Clone, Debug, Eq, PartialEq, Hash)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum Binding { /// Built-in shader variable. BuiltIn(BuiltIn), /// Indexed location. /// /// Values passed from the [`Vertex`] stage to the [`Fragment`] stage must /// have their `interpolation` defaulted (i.e. not `None`) by the front end /// as appropriate for that language. /// /// For other stages, we permit interpolations even though they're ignored. /// When a front end is parsing a struct type, it usually doesn't know what /// stages will be using it for IO, so it's easiest if it can apply the /// defaults to anything with a `Location` binding, just in case. /// /// For anything other than floating-point scalars and vectors, the /// interpolation must be `Flat`. /// /// [`Vertex`]: crate::ShaderStage::Vertex /// [`Fragment`]: crate::ShaderStage::Fragment Location { location: u32, interpolation: Option, sampling: Option, }, } /// Pipeline binding information for global resources. #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct ResourceBinding { /// The bind group index. pub group: u32, /// Binding number within the group. pub binding: u32, } /// Variable defined at module level. #[derive(Clone, Debug, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct GlobalVariable { /// Name of the variable, if any. pub name: Option, /// How this variable is to be stored. pub space: AddressSpace, /// For resources, defines the binding point. pub binding: Option, /// The type of this variable. pub ty: Handle, /// Initial value for this variable. pub init: Option>, } /// Variable defined at function level. #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct LocalVariable { /// Name of the variable, if any. pub name: Option, /// The type of this variable. pub ty: Handle, /// Initial value for this variable. pub init: Option>, } /// Operation that can be applied on a single value. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum UnaryOperator { Negate, Not, } /// Operation that can be applied on two values. /// /// ## Arithmetic type rules /// /// The arithmetic operations `Add`, `Subtract`, `Multiply`, `Divide`, and /// `Modulo` can all be applied to [`Scalar`] types other than [`Bool`], or /// [`Vector`]s thereof. Both operands must have the same type. /// /// `Add` and `Subtract` can also be applied to [`Matrix`] values. Both operands /// must have the same type. /// /// `Multiply` supports additional cases: /// /// - A [`Matrix`] or [`Vector`] can be multiplied by a scalar [`Float`], /// either on the left or the right. /// /// - A [`Matrix`] on the left can be multiplied by a [`Vector`] on the right /// if the matrix has as many columns as the vector has components (`matCxR /// * VecC`). /// /// - A [`Vector`] on the left can be multiplied by a [`Matrix`] on the right /// if the matrix has as many rows as the vector has components (`VecR * /// matCxR`). /// /// - Two matrices can be multiplied if the left operand has as many columns /// as the right operand has rows (`matNxR * matCxN`). /// /// In all the above `Multiply` cases, the byte widths of the underlying scalar /// types of both operands must be the same. /// /// Note that `Multiply` supports mixed vector and scalar operations directly, /// whereas the other arithmetic operations require an explicit [`Splat`] for /// mixed-type use. /// /// [`Scalar`]: TypeInner::Scalar /// [`Vector`]: TypeInner::Vector /// [`Matrix`]: TypeInner::Matrix /// [`Float`]: ScalarKind::Float /// [`Bool`]: ScalarKind::Bool /// [`Splat`]: Expression::Splat #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum BinaryOperator { Add, Subtract, Multiply, Divide, /// Equivalent of the WGSL's `%` operator or SPIR-V's `OpFRem` Modulo, Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual, And, ExclusiveOr, InclusiveOr, LogicalAnd, LogicalOr, ShiftLeft, /// Right shift carries the sign of signed integers only. ShiftRight, } /// Function on an atomic value. /// /// Note: these do not include load/store, which use the existing /// [`Expression::Load`] and [`Statement::Store`]. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum AtomicFunction { Add, Subtract, And, ExclusiveOr, InclusiveOr, Min, Max, Exchange { compare: Option> }, } /// Axis on which to compute a derivative. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum DerivativeAxis { X, Y, Width, } /// Built-in shader function for testing relation between values. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum RelationalFunction { All, Any, IsNan, IsInf, IsFinite, IsNormal, } /// Built-in shader function for math. #[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum MathFunction { // comparison Abs, Min, Max, Clamp, Saturate, // trigonometry Cos, Cosh, Sin, Sinh, Tan, Tanh, Acos, Asin, Atan, Atan2, Asinh, Acosh, Atanh, Radians, Degrees, // decomposition Ceil, Floor, Round, Fract, Trunc, Modf, Frexp, Ldexp, // exponent Exp, Exp2, Log, Log2, Pow, // geometry Dot, Outer, Cross, Distance, Length, Normalize, FaceForward, Reflect, Refract, // computational Sign, Fma, Mix, Step, SmoothStep, Sqrt, InverseSqrt, Inverse, Transpose, Determinant, // bits CountOneBits, ReverseBits, ExtractBits, InsertBits, FindLsb, FindMsb, // data packing Pack4x8snorm, Pack4x8unorm, Pack2x16snorm, Pack2x16unorm, Pack2x16float, // data unpacking Unpack4x8snorm, Unpack4x8unorm, Unpack2x16snorm, Unpack2x16unorm, Unpack2x16float, } /// Sampling modifier to control the level of detail. #[derive(Clone, Copy, Debug, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum SampleLevel { Auto, Zero, Exact(Handle), Bias(Handle), Gradient { x: Handle, y: Handle, }, } /// Type of an image query. #[derive(Clone, Copy, Debug, PartialEq)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum ImageQuery { /// Get the size at the specified level. Size { /// If `None`, the base level is considered. level: Option>, }, /// Get the number of mipmap levels. NumLevels, /// Get the number of array layers. NumLayers, /// Get the number of samples. NumSamples, } /// Component selection for a vector swizzle. #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum SwizzleComponent { /// X = 0, /// Y = 1, /// Z = 2, /// W = 3, } bitflags::bitflags! { /// Memory barrier flags. #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[derive(Default)] pub struct Barrier: u32 { /// Barrier affects all `AddressSpace::Storage` accesses. const STORAGE = 0x1; /// Barrier affects all `AddressSpace::WorkGroup` accesses. const WORK_GROUP = 0x2; } } /// An expression that can be evaluated to obtain a value. /// /// This is a Single Static Assignment (SSA) scheme similar to SPIR-V. #[derive(Clone, Debug)] #[cfg_attr(test, derive(PartialEq))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum Expression { /// Array access with a computed index. /// /// ## Typing rules /// /// The `base` operand must be some composite type: [`Vector`], [`Matrix`], /// [`Array`], a [`Pointer`] to one of those, or a [`ValuePointer`] with a /// `size`. /// /// The `index` operand must be an integer, signed or unsigned. /// /// Indexing a [`Vector`] or [`Array`] produces a value of its element type. /// Indexing a [`Matrix`] produces a [`Vector`]. /// /// Indexing a [`Pointer`] to any of the above produces a pointer to the /// element/component type, in the same [`space`]. In the case of [`Array`], /// the result is an actual [`Pointer`], but for vectors and matrices, there /// may not be any type in the arena representing the component's type, so /// those produce [`ValuePointer`] types equivalent to the appropriate /// [`Pointer`]. /// /// ## Dynamic indexing restrictions /// /// To accommodate restrictions in some of the shader languages that Naga /// targets, it is not permitted to subscript a matrix or array with a /// dynamically computed index unless that matrix or array appears behind a /// pointer. In other words, if the inner type of `base` is [`Array`] or /// [`Matrix`], then `index` must be a constant. But if the type of `base` /// is a [`Pointer`] to an array or matrix or a [`ValuePointer`] with a /// `size`, then the index may be any expression of integer type. /// /// You can use the [`Expression::is_dynamic_index`] method to determine /// whether a given index expression requires matrix or array base operands /// to be behind a pointer. /// /// (It would be simpler to always require the use of `AccessIndex` when /// subscripting arrays and matrices that are not behind pointers, but to /// accommodate existing front ends, Naga also permits `Access`, with a /// restricted `index`.) /// /// [`Vector`]: TypeInner::Vector /// [`Matrix`]: TypeInner::Matrix /// [`Array`]: TypeInner::Array /// [`Pointer`]: TypeInner::Pointer /// [`space`]: TypeInner::Pointer::space /// [`ValuePointer`]: TypeInner::ValuePointer /// [`Float`]: ScalarKind::Float Access { base: Handle, index: Handle, }, /// Access the same types as [`Access`], plus [`Struct`] with a known index. /// /// [`Access`]: Expression::Access /// [`Struct`]: TypeInner::Struct AccessIndex { base: Handle, index: u32, }, /// Constant value. Constant(Handle), /// Splat scalar into a vector. Splat { size: VectorSize, value: Handle, }, /// Vector swizzle. Swizzle { size: VectorSize, vector: Handle, pattern: [SwizzleComponent; 4], }, /// Composite expression. Compose { ty: Handle, components: Vec>, }, /// Reference a function parameter, by its index. /// /// A `FunctionArgument` expression evaluates to a pointer to the argument's /// value. You must use a [`Load`] expression to retrieve its value, or a /// [`Store`] statement to assign it a new value. /// /// [`Load`]: Expression::Load /// [`Store`]: Statement::Store FunctionArgument(u32), /// Reference a global variable. /// /// If the given `GlobalVariable`'s [`space`] is [`AddressSpace::Handle`], /// then the variable stores some opaque type like a sampler or an image, /// and a `GlobalVariable` expression referring to it produces the /// variable's value directly. /// /// For any other address space, a `GlobalVariable` expression produces a /// pointer to the variable's value. You must use a [`Load`] expression to /// retrieve its value, or a [`Store`] statement to assign it a new value. /// /// [`space`]: GlobalVariable::space /// [`Load`]: Expression::Load /// [`Store`]: Statement::Store GlobalVariable(Handle), /// Reference a local variable. /// /// A `LocalVariable` expression evaluates to a pointer to the variable's value. /// You must use a [`Load`](Expression::Load) expression to retrieve its value, /// or a [`Store`](Statement::Store) statement to assign it a new value. LocalVariable(Handle), /// Load a value indirectly. /// /// For [`TypeInner::Atomic`] the result is a corresponding scalar. /// For other types behind the pointer, the result is T. Load { pointer: Handle }, /// Sample a point from a sampled or a depth image. ImageSample { image: Handle, sampler: Handle, /// If Some(), this operation is a gather operation /// on the selected component. gather: Option, coordinate: Handle, array_index: Option>, offset: Option>, level: SampleLevel, depth_ref: Option>, }, /// Load a texel from an image. /// /// For most images, this returns a four-element vector of the same /// [`ScalarKind`] as the image. If the format of the image does not have /// four components, default values are provided: the first three components /// (typically R, G, and B) default to zero, and the final component /// (typically alpha) defaults to one. /// /// However, if the image's [`class`] is [`Depth`], then this returns a /// [`Float`] scalar value. /// /// [`ScalarKind`]: ScalarKind /// [`class`]: TypeInner::Image::class /// [`Depth`]: ImageClass::Depth /// [`Float`]: ScalarKind::Float ImageLoad { /// The image to load a texel from. This must have type [`Image`]. (This /// will necessarily be a [`GlobalVariable`] or [`FunctionArgument`] /// expression, since no other expressions are allowed to have that /// type.) /// /// [`Image`]: TypeInner::Image /// [`GlobalVariable`]: Expression::GlobalVariable /// [`FunctionArgument`]: Expression::FunctionArgument image: Handle, /// The coordinate of the texel we wish to load. This must be a scalar /// for [`D1`] images, a [`Bi`] vector for [`D2`] images, and a [`Tri`] /// vector for [`D3`] images. (Array indices, sample indices, and /// explicit level-of-detail values are supplied separately.) Its /// component type must be [`Sint`]. /// /// [`D1`]: ImageDimension::D1 /// [`D2`]: ImageDimension::D2 /// [`D3`]: ImageDimension::D3 /// [`Bi`]: VectorSize::Bi /// [`Tri`]: VectorSize::Tri /// [`Sint`]: ScalarKind::Sint coordinate: Handle, /// The index into an arrayed image. If the [`arrayed`] flag in /// `image`'s type is `true`, then this must be `Some(expr)`, where /// `expr` is a [`Sint`] scalar. Otherwise, it must be `None`. /// /// [`arrayed`]: TypeInner::Image::arrayed /// [`Sint`]: ScalarKind::Sint array_index: Option>, /// A sample index, for multisampled [`Sampled`] and [`Depth`] images. /// /// [`Sampled`]: ImageClass::Sampled /// [`Depth`]: ImageClass::Depth sample: Option>, /// A level of detail, for mipmapped images. /// /// This must be present when accessing non-multisampled /// [`Sampled`] and [`Depth`] images, even if only the /// full-resolution level is present (in which case the only /// valid level is zero). /// /// [`Sampled`]: ImageClass::Sampled /// [`Depth`]: ImageClass::Depth level: Option>, }, /// Query information from an image. ImageQuery { image: Handle, query: ImageQuery, }, /// Apply an unary operator. Unary { op: UnaryOperator, expr: Handle, }, /// Apply a binary operator. Binary { op: BinaryOperator, left: Handle, right: Handle, }, /// Select between two values based on a condition. /// /// Note that, because expressions have no side effects, it is unobservable /// whether the non-selected branch is evaluated. Select { /// Boolean expression condition: Handle, accept: Handle, reject: Handle, }, /// Compute the derivative on an axis. Derivative { axis: DerivativeAxis, //modifier, expr: Handle, }, /// Call a relational function. Relational { fun: RelationalFunction, argument: Handle, }, /// Call a math function Math { fun: MathFunction, arg: Handle, arg1: Option>, arg2: Option>, arg3: Option>, }, /// Cast a simple type to another kind. As { /// Source expression, which can only be a scalar or a vector. expr: Handle, /// Target scalar kind. kind: ScalarKind, /// If provided, converts to the specified byte width. /// Otherwise, bitcast. convert: Option, }, /// Result of calling another function. CallResult(Handle), /// Result of an atomic operation. AtomicResult { kind: ScalarKind, width: Bytes, comparison: bool, }, /// Get the length of an array. /// The expression must resolve to a pointer to an array with a dynamic size. /// /// This doesn't match the semantics of spirv's `OpArrayLength`, which must be passed /// a pointer to a structure containing a runtime array in its' last field. ArrayLength(Handle), } pub use block::Block; /// The value of the switch case. // Clone is used only for error reporting and is not intended for end users #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum SwitchValue { Integer(i32), Default, } /// A case for a switch statement. // Clone is used only for error reporting and is not intended for end users #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct SwitchCase { /// Value, upon which the case is considered true. pub value: SwitchValue, /// Body of the case. pub body: Block, /// If true, the control flow continues to the next case in the list, /// or default. pub fall_through: bool, } //TODO: consider removing `Clone`. It's not valid to clone `Statement::Emit` anyway. /// Instructions which make up an executable block. // Clone is used only for error reporting and is not intended for end users #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub enum Statement { /// Emit a range of expressions, visible to all statements that follow in this block. /// /// See the [module-level documentation][emit] for details. /// /// [emit]: index.html#expression-evaluation-time Emit(Range), /// A block containing more statements, to be executed sequentially. Block(Block), /// Conditionally executes one of two blocks, based on the value of the condition. If { condition: Handle, //bool accept: Block, reject: Block, }, /// Conditionally executes one of multiple blocks, based on the value of the selector. Switch { selector: Handle, //int cases: Vec, }, /// Executes a block repeatedly. /// /// Each iteration of the loop executes the `body` block, followed by the /// `continuing` block. /// /// Executing a [`Break`], [`Return`] or [`Kill`] statement exits the loop. /// /// A [`Continue`] statement in `body` jumps to the `continuing` block. The /// `continuing` block is meant to be used to represent structures like the /// third expression of a C-style `for` loop head, to which `continue` /// statements in the loop's body jump. /// /// The `continuing` block and its substatements must not contain `Return` /// or `Kill` statements, or any `Break` or `Continue` statements targeting /// this loop. (It may have `Break` and `Continue` statements targeting /// loops or switches nested within the `continuing` block.) /// /// If present, `break_if` is an expression which is evaluated after the /// continuing block. If its value is true, control continues after the /// `Loop` statement, rather than branching back to the top of body as /// usual. The `break_if` expression corresponds to a "break if" statement /// in WGSL, or a loop whose back edge is an `OpBranchConditional` /// instruction in SPIR-V. /// /// [`Break`]: Statement::Break /// [`Continue`]: Statement::Continue /// [`Kill`]: Statement::Kill /// [`Return`]: Statement::Return /// [`break if`]: Self::Loop::break_if Loop { body: Block, continuing: Block, break_if: Option>, }, /// Exits the innermost enclosing [`Loop`] or [`Switch`]. /// /// A `Break` statement may only appear within a [`Loop`] or [`Switch`] /// statement. It may not break out of a [`Loop`] from within the loop's /// `continuing` block. /// /// [`Loop`]: Statement::Loop /// [`Switch`]: Statement::Switch Break, /// Skips to the `continuing` block of the innermost enclosing [`Loop`]. /// /// A `Continue` statement may only appear within the `body` block of the /// innermost enclosing [`Loop`] statement. It must not appear within that /// loop's `continuing` block. /// /// [`Loop`]: Statement::Loop Continue, /// Returns from the function (possibly with a value). /// /// `Return` statements are forbidden within the `continuing` block of a /// [`Loop`] statement. /// /// [`Loop`]: Statement::Loop Return { value: Option> }, /// Aborts the current shader execution. /// /// `Kill` statements are forbidden within the `continuing` block of a /// [`Loop`] statement. /// /// [`Loop`]: Statement::Loop Kill, /// Synchronize invocations within the work group. /// The `Barrier` flags control which memory accesses should be synchronized. /// If empty, this becomes purely an execution barrier. Barrier(Barrier), /// Stores a value at an address. /// /// For [`TypeInner::Atomic`] type behind the pointer, the value /// has to be a corresponding scalar. /// For other types behind the pointer, the value is T. /// /// This statement is a barrier for any operations on the /// `Expression::LocalVariable` or `Expression::GlobalVariable` /// that is the destination of an access chain, started /// from the `pointer`. Store { pointer: Handle, value: Handle, }, /// Stores a texel value to an image. /// /// The `image`, `coordinate`, and `array_index` fields have the same /// meanings as the corresponding operands of an [`ImageLoad`] expression; /// see that documentation for details. Storing into multisampled images or /// images with mipmaps is not supported, so there are no `level` or /// `sample` operands. /// /// This statement is a barrier for any operations on the corresponding /// [`Expression::GlobalVariable`] for this image. /// /// [`ImageLoad`]: Expression::ImageLoad ImageStore { image: Handle, coordinate: Handle, array_index: Option>, value: Handle, }, /// Atomic function. Atomic { /// Pointer to an atomic value. pointer: Handle, /// Function to run on the atomic. fun: AtomicFunction, /// Value to use in the function. value: Handle, /// [`AtomicResult`] expression representing this function's result. /// /// [`AtomicResult`]: crate::Expression::AtomicResult result: Handle, }, /// Calls a function. /// /// If the `result` is `Some`, the corresponding expression has to be /// `Expression::CallResult`, and this statement serves as a barrier for any /// operations on that expression. Call { function: Handle, arguments: Vec>, result: Option>, }, } /// A function argument. #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct FunctionArgument { /// Name of the argument, if any. pub name: Option, /// Type of the argument. pub ty: Handle, /// For entry points, an argument has to have a binding /// unless it's a structure. pub binding: Option, } /// A function result. #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct FunctionResult { /// Type of the result. pub ty: Handle, /// For entry points, the result has to have a binding /// unless it's a structure. pub binding: Option, } /// A function defined in the module. #[derive(Debug, Default)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct Function { /// Name of the function, if any. pub name: Option, /// Information about function argument. pub arguments: Vec, /// The result of this function, if any. pub result: Option, /// Local variables defined and used in the function. pub local_variables: Arena, /// Expressions used inside this function. /// /// An `Expression` must occur before all other `Expression`s that use its /// value. pub expressions: Arena, /// Map of expressions that have associated variable names pub named_expressions: NamedExpressions, /// Block of instructions comprising the body of the function. pub body: Block, } /// The main function for a pipeline stage. /// /// An [`EntryPoint`] is a [`Function`] that serves as the main function for a /// graphics or compute pipeline stage. For example, an `EntryPoint` whose /// [`stage`] is [`ShaderStage::Vertex`] can serve as a graphics pipeline's /// vertex shader. /// /// Since an entry point is called directly by the graphics or compute pipeline, /// not by other WGSL functions, you must specify what the pipeline should pass /// as the entry point's arguments, and what values it will return. For example, /// a vertex shader needs a vertex's attributes as its arguments, but if it's /// used for instanced draw calls, it will also want to know the instance id. /// The vertex shader's return value will usually include an output vertex /// position, and possibly other attributes to be interpolated and passed along /// to a fragment shader. /// /// To specify this, the arguments and result of an `EntryPoint`'s [`function`] /// must each have a [`Binding`], or be structs whose members all have /// `Binding`s. This associates every value passed to or returned from the entry /// point with either a [`BuiltIn`] or a [`Location`]: /// /// - A [`BuiltIn`] has special semantics, usually specific to its pipeline /// stage. For example, the result of a vertex shader can include a /// [`BuiltIn::Position`] value, which determines the position of a vertex /// of a rendered primitive. Or, a compute shader might take an argument /// whose binding is [`BuiltIn::WorkGroupSize`], through which the compute /// pipeline would pass the number of invocations in your workgroup. /// /// - A [`Location`] indicates user-defined IO to be passed from one pipeline /// stage to the next. For example, a vertex shader might also produce a /// `uv` texture location as a user-defined IO value. /// /// In other words, the pipeline stage's input and output interface are /// determined by the bindings of the arguments and result of the `EntryPoint`'s /// [`function`]. /// /// [`Function`]: crate::Function /// [`Location`]: Binding::Location /// [`function`]: EntryPoint::function /// [`stage`]: EntryPoint::stage #[derive(Debug)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct EntryPoint { /// Name of this entry point, visible externally. /// /// Entry point names for a given `stage` must be distinct within a module. pub name: String, /// Shader stage. pub stage: ShaderStage, /// Early depth test for fragment stages. pub early_depth_test: Option, /// Workgroup size for compute stages pub workgroup_size: [u32; 3], /// The entrance function. pub function: Function, } /// Shader module. /// /// A module is a set of constants, global variables and functions, as well as /// the types required to define them. /// /// Some functions are marked as entry points, to be used in a certain shader stage. /// /// To create a new module, use the `Default` implementation. /// Alternatively, you can load an existing shader using one of the [available front ends][front]. /// /// When finished, you can export modules using one of the [available backends][back]. #[derive(Debug, Default)] #[cfg_attr(feature = "clone", derive(Clone))] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] pub struct Module { /// Arena for the types defined in this module. pub types: UniqueArena, /// Arena for the constants defined in this module. pub constants: Arena, /// Arena for the global variables defined in this module. pub global_variables: Arena, /// Arena for the functions defined in this module. /// /// Each function must appear in this arena strictly before all its callers. /// Recursion is not supported. pub functions: Arena, /// Entry points. pub entry_points: Vec, } ================================================ FILE: lib/naga/src/proc/index.rs ================================================ /*! Definitions for index bounds checking. */ use crate::{valid, Handle, UniqueArena}; use bit_set::BitSet; /// How should code generated by Naga do bounds checks? /// /// When a vector, matrix, or array index is out of bounds—either negative, or /// greater than or equal to the number of elements in the type—WGSL requires /// that some other index of the implementation's choice that is in bounds is /// used instead. (There are no types with zero elements.) /// /// Similarly, when out-of-bounds coordinates, array indices, or sample indices /// are presented to the WGSL `textureLoad` and `textureStore` operations, the /// operation is redirected to do something safe. /// /// Different users of Naga will prefer different defaults: /// /// - When used as part of a WebGPU implementation, the WGSL specification /// requires the `Restrict` behavior for array, vector, and matrix accesses, /// and either the `Restrict` or `ReadZeroSkipWrite` behaviors for texture /// accesses. /// /// - When used by the `wgpu` crate for native development, `wgpu` selects /// `ReadZeroSkipWrite` as its default. /// /// - Naga's own default is `Unchecked`, so that shader translations /// are as faithful to the original as possible. /// /// Sometimes the underlying hardware and drivers can perform bounds checks /// themselves, in a way that performs better than the checks Naga would inject. /// If you're using native checks like this, then having Naga inject its own /// checks as well would be redundant, and the `Unchecked` policy is /// appropriate. #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum BoundsCheckPolicy { /// Replace out-of-bounds indexes with some arbitrary in-bounds index. /// /// (This does not necessarily mean clamping. For example, interpreting the /// index as unsigned and taking the minimum with the largest valid index /// would also be a valid implementation. That would map negative indices to /// the last element, not the first.) Restrict, /// Out-of-bounds reads return zero, and writes have no effect. /// /// When applied to a chain of accesses, like `a[i][j].b[k]`, all index /// expressions are evaluated, regardless of whether prior or later index /// expressions were in bounds. But all the accesses per se are skipped /// if any index is out of bounds. ReadZeroSkipWrite, /// Naga adds no checks to indexing operations. Generate the fastest code /// possible. This is the default for Naga, as a translator, but consumers /// should consider defaulting to a safer behavior. Unchecked, } /// Policies for injecting bounds checks during code generation. #[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct BoundsCheckPolicies { /// How should the generated code handle array, vector, or matrix indices /// that are out of range? #[cfg_attr(feature = "deserialize", serde(default))] pub index: BoundsCheckPolicy, /// How should the generated code handle array, vector, or matrix indices /// that are out of range, when those values live in a [`GlobalVariable`] in /// the [`Storage`] or [`Uniform`] address spaces? /// /// Some graphics hardware provides "robust buffer access", a feature that /// ensures that using a pointer cannot access memory outside the 'buffer' /// that it was derived from. In Naga terms, this means that the hardware /// ensures that pointers computed by applying [`Access`] and /// [`AccessIndex`] expressions to a [`GlobalVariable`] whose [`space`] is /// [`Storage`] or [`Uniform`] will never read or write memory outside that /// global variable. /// /// When hardware offers such a feature, it is probably undesirable to have /// Naga inject bounds checking code for such accesses, since the hardware /// can probably provide the same protection more efficiently. However, /// bounds checks are still needed on accesses to indexable values that do /// not live in buffers, like local variables. /// /// So, this option provides a separate policy that applies only to accesses /// to storage and uniform globals. When depending on hardware bounds /// checking, this policy can be `Unchecked` to avoid unnecessary overhead. /// /// When special hardware support is not available, this should probably be /// the same as `index_bounds_check_policy`. /// /// [`GlobalVariable`]: crate::GlobalVariable /// [`space`]: crate::GlobalVariable::space /// [`Restrict`]: crate::back::BoundsCheckPolicy::Restrict /// [`ReadZeroSkipWrite`]: crate::back::BoundsCheckPolicy::ReadZeroSkipWrite /// [`Access`]: crate::Expression::Access /// [`AccessIndex`]: crate::Expression::AccessIndex /// [`Storage`]: crate::AddressSpace::Storage /// [`Uniform`]: crate::AddressSpace::Uniform #[cfg_attr(feature = "deserialize", serde(default))] pub buffer: BoundsCheckPolicy, /// How should the generated code handle image texel references that are out /// of range? /// /// This controls the behavior of [`ImageLoad`] expressions and /// [`ImageStore`] statements when a coordinate, texture array index, level /// of detail, or multisampled sample number is out of range. /// /// [`ImageLoad`]: crate::Expression::ImageLoad /// [`ImageStore`]: crate::Statement::ImageStore #[cfg_attr(feature = "deserialize", serde(default))] pub image: BoundsCheckPolicy, /// How should the generated code handle binding array indexes that are out of bounds. #[cfg_attr(feature = "deserialize", serde(default))] pub binding_array: BoundsCheckPolicy, } /// The default `BoundsCheckPolicy` is `Unchecked`. impl Default for BoundsCheckPolicy { fn default() -> Self { BoundsCheckPolicy::Unchecked } } impl BoundsCheckPolicies { /// Determine which policy applies to `base`. /// /// `base` is the "base" expression (the expression being indexed) of a `Access` /// and `AccessIndex` expression. This is either a pointer, a value, being directly /// indexed, or a binding array. /// /// See the documentation for [`BoundsCheckPolicy`] for details about /// when each policy applies. pub fn choose_policy( &self, base: Handle, types: &UniqueArena, info: &valid::FunctionInfo, ) -> BoundsCheckPolicy { let ty = info[base].ty.inner_with(types); if let crate::TypeInner::BindingArray { .. } = *ty { return self.binding_array; } match ty.pointer_space() { Some(crate::AddressSpace::Storage { access: _ } | crate::AddressSpace::Uniform) => { self.buffer } // This covers other address spaces, but also accessing vectors and // matrices by value, where no pointer is involved. _ => self.index, } } /// Return `true` if any of `self`'s policies are `policy`. pub fn contains(&self, policy: BoundsCheckPolicy) -> bool { self.index == policy || self.buffer == policy || self.image == policy } } /// An index that may be statically known, or may need to be computed at runtime. /// /// This enum lets us handle both [`Access`] and [`AccessIndex`] expressions /// with the same code. /// /// [`Access`]: crate::Expression::Access /// [`AccessIndex`]: crate::Expression::AccessIndex #[derive(Clone, Copy, Debug)] pub enum GuardedIndex { Known(u32), Expression(Handle), } /// Build a set of expressions used as indices, to cache in temporary variables when /// emitted. /// /// Given the bounds-check policies `policies`, construct a `BitSet` containing the handle /// indices of all the expressions in `function` that are ever used as guarded indices /// under the [`ReadZeroSkipWrite`] policy. The `module` argument must be the module to /// which `function` belongs, and `info` should be that function's analysis results. /// /// Such index expressions will be used twice in the generated code: first for the /// comparison to see if the index is in bounds, and then for the access itself, should /// the comparison succeed. To avoid computing the expressions twice, the generated code /// should cache them in temporary variables. /// /// Why do we need to build such a set in advance, instead of just processing access /// expressions as we encounter them? Whether an expression needs to be cached depends on /// whether it appears as something like the [`index`] operand of an [`Access`] expression /// or the [`level`] operand of an [`ImageLoad`] expression, and on the index bounds check /// policies that apply to those accesses. But [`Emit`] statements just identify a range /// of expressions by index; there's no good way to tell what an expression is used /// for. The only way to do it is to just iterate over all the expressions looking for /// relevant `Access` expressions --- which is what this function does. /// /// Simple expressions like variable loads and constants don't make sense to cache: it's /// no better than just re-evaluating them. But constants are not covered by `Emit` /// statements, and `Load`s are always cached to ensure they occur at the right time, so /// we don't bother filtering them out from this set. /// /// Fortunately, we don't need to deal with [`ImageStore`] statements here. When we emit /// code for a statement, the writer isn't in the middle of an expression, so we can just /// emit declarations for temporaries, initialized appropriately. /// /// None of these concerns apply for SPIR-V output, since it's easy to just reuse an /// instruction ID in two places; that has the same semantics as a temporary variable, and /// it's inherent in the design of SPIR-V. This function is more useful for text-based /// back ends. /// /// [`ReadZeroSkipWrite`]: BoundsCheckPolicy::ReadZeroSkipWrite /// [`index`]: crate::Expression::Access::index /// [`Access`]: crate::Expression::Access /// [`level`]: crate::Expression::ImageLoad::level /// [`ImageLoad`]: crate::Expression::ImageLoad /// [`Emit`]: crate::Statement::Emit /// [`ImageStore`]: crate::Statement::ImageStore pub fn find_checked_indexes( module: &crate::Module, function: &crate::Function, info: &crate::valid::FunctionInfo, policies: BoundsCheckPolicies, ) -> BitSet { use crate::Expression as Ex; let mut guarded_indices = BitSet::new(); // Don't bother scanning if we never need `ReadZeroSkipWrite`. if policies.contains(BoundsCheckPolicy::ReadZeroSkipWrite) { for (_handle, expr) in function.expressions.iter() { // There's no need to handle `AccessIndex` expressions, as their // indices never need to be cached. match *expr { Ex::Access { base, index } => { if policies.choose_policy(base, &module.types, info) == BoundsCheckPolicy::ReadZeroSkipWrite && access_needs_check( base, GuardedIndex::Expression(index), module, function, info, ) .is_some() { guarded_indices.insert(index.index()); } } Ex::ImageLoad { coordinate, array_index, sample, level, .. } => { if policies.image == BoundsCheckPolicy::ReadZeroSkipWrite { guarded_indices.insert(coordinate.index()); if let Some(array_index) = array_index { guarded_indices.insert(array_index.index()); } if let Some(sample) = sample { guarded_indices.insert(sample.index()); } if let Some(level) = level { guarded_indices.insert(level.index()); } } } _ => {} } } } guarded_indices } /// Determine whether `index` is statically known to be in bounds for `base`. /// /// If we can't be sure that the index is in bounds, return the limit within /// which valid indices must fall. /// /// The return value is one of the following: /// /// - `Some(Known(n))` indicates that `n` is the largest valid index. /// /// - `Some(Computed(global))` indicates that the largest valid index is one /// less than the length of the array that is the last member of the /// struct held in `global`. /// /// - `None` indicates that the index need not be checked, either because it /// is statically known to be in bounds, or because the applicable policy /// is `Unchecked`. /// /// This function only handles subscriptable types: arrays, vectors, and /// matrices. It does not handle struct member indices; those never require /// run-time checks, so it's best to deal with them further up the call /// chain. pub fn access_needs_check( base: Handle, mut index: GuardedIndex, module: &crate::Module, function: &crate::Function, info: &crate::valid::FunctionInfo, ) -> Option { let base_inner = info[base].ty.inner_with(&module.types); // Unwrap safety: `Err` here indicates unindexable base types and invalid // length constants, but `access_needs_check` is only used by back ends, so // validation should have caught those problems. let length = base_inner.indexable_length(module).unwrap(); index.try_resolve_to_constant(function, module); if let (&GuardedIndex::Known(index), &IndexableLength::Known(length)) = (&index, &length) { if index < length { // Index is statically known to be in bounds, no check needed. return None; } }; Some(length) } impl GuardedIndex { /// Make A `GuardedIndex::Known` from a `GuardedIndex::Expression` if possible. /// /// If the expression is a [`Constant`] whose value is a non-specialized, scalar /// integer constant that can be converted to a `u32`, do so and return a /// `GuardedIndex::Known`. Otherwise, return the `GuardedIndex::Expression` /// unchanged. /// /// Return values that are already `Known` unchanged. /// /// [`Constant`]: crate::Expression::Constant fn try_resolve_to_constant(&mut self, function: &crate::Function, module: &crate::Module) { if let GuardedIndex::Expression(expr) = *self { if let crate::Expression::Constant(handle) = function.expressions[expr] { if let Some(value) = module.constants[handle].to_array_length() { *self = GuardedIndex::Known(value); } } } } } #[derive(Clone, Copy, Debug, thiserror::Error, PartialEq)] pub enum IndexableLengthError { #[error("Type is not indexable, and has no length (validation error)")] TypeNotIndexable, #[error("Array length constant {0:?} is invalid")] InvalidArrayLength(Handle), } impl crate::TypeInner { /// Return the length of a subscriptable type. /// /// The `self` parameter should be a handle to a vector, matrix, or array /// type, a pointer to one of those, or a value pointer. Arrays may be /// fixed-size, dynamically sized, or sized by a specializable constant. /// This function does not handle struct member references, as with /// `AccessIndex`. /// /// The value returned is appropriate for bounds checks on subscripting. /// /// Return an error if `self` does not describe a subscriptable type at all. pub fn indexable_length( &self, module: &crate::Module, ) -> Result { use crate::TypeInner as Ti; let known_length = match *self { Ti::Vector { size, .. } => size as _, Ti::Matrix { columns, .. } => columns as _, Ti::Array { size, .. } | Ti::BindingArray { size, .. } => { return size.to_indexable_length(module); } Ti::ValuePointer { size: Some(size), .. } => size as _, Ti::Pointer { base, .. } => { // When assigning types to expressions, ResolveContext::Resolve // does a separate sub-match here instead of a full recursion, // so we'll do the same. let base_inner = &module.types[base].inner; match *base_inner { Ti::Vector { size, .. } => size as _, Ti::Matrix { columns, .. } => columns as _, Ti::Array { size, .. } => return size.to_indexable_length(module), _ => return Err(IndexableLengthError::TypeNotIndexable), } } _ => return Err(IndexableLengthError::TypeNotIndexable), }; Ok(IndexableLength::Known(known_length)) } } /// The number of elements in an indexable type. /// /// This summarizes the length of vectors, matrices, and arrays in a way that is /// convenient for indexing and bounds-checking code. #[derive(Debug)] pub enum IndexableLength { /// Values of this type always have the given number of elements. Known(u32), /// The number of elements is determined at runtime. Dynamic, } impl crate::ArraySize { pub fn to_indexable_length( self, module: &crate::Module, ) -> Result { Ok(match self { Self::Constant(k) => { let constant = &module.constants[k]; if constant.specialization.is_some() { // Specializable constants are not supported as array lengths. // See valid::TypeError::UnsupportedSpecializedArrayLength. return Err(IndexableLengthError::InvalidArrayLength(k)); } let length = constant .to_array_length() .ok_or(IndexableLengthError::InvalidArrayLength(k))?; IndexableLength::Known(length) } Self::Dynamic => IndexableLength::Dynamic, }) } } ================================================ FILE: lib/naga/src/proc/layouter.rs ================================================ use crate::arena::{Arena, BadHandle, Handle, UniqueArena}; use std::{fmt::Display, num::NonZeroU32, ops}; /// A newtype struct where its only valid values are powers of 2 #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Alignment(NonZeroU32); impl Alignment { pub const ONE: Self = Self(unsafe { NonZeroU32::new_unchecked(1) }); pub const TWO: Self = Self(unsafe { NonZeroU32::new_unchecked(2) }); pub const FOUR: Self = Self(unsafe { NonZeroU32::new_unchecked(4) }); pub const EIGHT: Self = Self(unsafe { NonZeroU32::new_unchecked(8) }); pub const SIXTEEN: Self = Self(unsafe { NonZeroU32::new_unchecked(16) }); pub const MIN_UNIFORM: Self = Self::SIXTEEN; pub const fn new(n: u32) -> Option { if n.is_power_of_two() { // SAFETY: value can't be 0 since we just checked if it's a power of 2 Some(Self(unsafe { NonZeroU32::new_unchecked(n) })) } else { None } } /// # Panics /// If `width` is not a power of 2 pub fn from_width(width: u8) -> Self { Self::new(width as u32).unwrap() } /// Returns whether or not `n` is a multiple of this alignment. pub const fn is_aligned(&self, n: u32) -> bool { // equivalent to: `n % self.0.get() == 0` but much faster n & (self.0.get() - 1) == 0 } /// Round `n` up to the nearest alignment boundary. pub const fn round_up(&self, n: u32) -> u32 { // equivalent to: // match n % self.0.get() { // 0 => n, // rem => n + (self.0.get() - rem), // } let mask = self.0.get() - 1; (n + mask) & !mask } } impl Display for Alignment { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.get().fmt(f) } } impl ops::Mul for Alignment { type Output = u32; fn mul(self, rhs: u32) -> Self::Output { self.0.get() * rhs } } impl ops::Mul for Alignment { type Output = Alignment; fn mul(self, rhs: Alignment) -> Self::Output { // SAFETY: both lhs and rhs are powers of 2, the result will be a power of 2 Self(unsafe { NonZeroU32::new_unchecked(self.0.get() * rhs.0.get()) }) } } impl From for Alignment { fn from(size: crate::VectorSize) -> Self { match size { crate::VectorSize::Bi => Alignment::TWO, crate::VectorSize::Tri => Alignment::FOUR, crate::VectorSize::Quad => Alignment::FOUR, } } } /// Size and alignment information for a type. #[derive(Clone, Copy, Debug, Hash, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct TypeLayout { pub size: u32, pub alignment: Alignment, } impl TypeLayout { /// Produce the stride as if this type is a base of an array. pub const fn to_stride(&self) -> u32 { self.alignment.round_up(self.size) } } /// Helper processor that derives the sizes of all types. /// /// `Layouter` uses the default layout algorithm/table, described in /// [WGSL §4.3.7, "Memory Layout"] /// /// A `Layouter` may be indexed by `Handle` values: `layouter[handle]` is the /// layout of the type whose handle is `handle`. /// /// [WGSL §4.3.7, "Memory Layout"](https://gpuweb.github.io/gpuweb/wgsl/#memory-layouts) #[derive(Debug, Default)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Layouter { /// Layouts for types in an arena, indexed by `Handle` index. layouts: Vec, } impl ops::Index> for Layouter { type Output = TypeLayout; fn index(&self, handle: Handle) -> &TypeLayout { &self.layouts[handle.index()] } } #[derive(Clone, Copy, Debug, PartialEq, thiserror::Error)] pub enum LayoutErrorInner { #[error("Array element type {0:?} doesn't exist")] InvalidArrayElementType(Handle), #[error("Struct member[{0}] type {1:?} doesn't exist")] InvalidStructMemberType(u32, Handle), #[error("Type width must be a power of two")] NonPowerOfTwoWidth, #[error("Array size is a bad handle")] BadHandle(#[from] BadHandle), } #[derive(Clone, Copy, Debug, PartialEq, thiserror::Error)] #[error("Error laying out type {ty:?}: {inner}")] pub struct LayoutError { pub ty: Handle, pub inner: LayoutErrorInner, } impl LayoutErrorInner { const fn with(self, ty: Handle) -> LayoutError { LayoutError { ty, inner: self } } } impl Layouter { /// Remove all entries from this `Layouter`, retaining storage. pub fn clear(&mut self) { self.layouts.clear(); } /// Extend this `Layouter` with layouts for any new entries in `types`. /// /// Ensure that every type in `types` has a corresponding [TypeLayout] in /// [`self.layouts`]. /// /// Some front ends need to be able to compute layouts for existing types /// while module construction is still in progress and new types are still /// being added. This function assumes that the `TypeLayout` values already /// present in `self.layouts` cover their corresponding entries in `types`, /// and extends `self.layouts` as needed to cover the rest. Thus, a front /// end can call this function at any time, passing its current type and /// constant arenas, and then assume that layouts are available for all /// types. #[allow(clippy::or_fun_call)] pub fn update( &mut self, types: &UniqueArena, constants: &Arena, ) -> Result<(), LayoutError> { use crate::TypeInner as Ti; for (ty_handle, ty) in types.iter().skip(self.layouts.len()) { let size = ty .inner .try_size(constants) .map_err(|error| LayoutErrorInner::BadHandle(error).with(ty_handle))?; let layout = match ty.inner { Ti::Scalar { width, .. } | Ti::Atomic { width, .. } => { let alignment = Alignment::new(width as u32) .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?; TypeLayout { size, alignment } } Ti::Vector { size: vec_size, width, .. } => { let alignment = Alignment::new(width as u32) .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?; TypeLayout { size, alignment: Alignment::from(vec_size) * alignment, } } Ti::Matrix { columns: _, rows, width, } => { let alignment = Alignment::new(width as u32) .ok_or(LayoutErrorInner::NonPowerOfTwoWidth.with(ty_handle))?; TypeLayout { size, alignment: Alignment::from(rows) * alignment, } } Ti::Pointer { .. } | Ti::ValuePointer { .. } => TypeLayout { size, alignment: Alignment::ONE, }, Ti::Array { base, stride: _, size: _, } => TypeLayout { size, alignment: if base < ty_handle { self[base].alignment } else { return Err(LayoutErrorInner::InvalidArrayElementType(base).with(ty_handle)); }, }, Ti::Struct { span, ref members } => { let mut alignment = Alignment::ONE; for (index, member) in members.iter().enumerate() { alignment = if member.ty < ty_handle { alignment.max(self[member.ty].alignment) } else { return Err(LayoutErrorInner::InvalidStructMemberType( index as u32, member.ty, ) .with(ty_handle)); }; } TypeLayout { size: span, alignment, } } Ti::Image { .. } | Ti::Sampler { .. } | Ti::BindingArray { .. } => TypeLayout { size, alignment: Alignment::ONE, }, }; debug_assert!(size <= layout.size); self.layouts.push(layout); } Ok(()) } } ================================================ FILE: lib/naga/src/proc/mod.rs ================================================ /*! [`Module`](super::Module) processing functionality. */ pub mod index; mod layouter; mod namer; mod terminator; mod typifier; use std::cmp::PartialEq; pub use index::{BoundsCheckPolicies, BoundsCheckPolicy, IndexableLength, IndexableLengthError}; pub use layouter::{Alignment, LayoutError, LayoutErrorInner, Layouter, TypeLayout}; pub use namer::{EntryPointIndex, NameKey, Namer}; pub use terminator::ensure_block_returns; pub use typifier::{ResolveContext, ResolveError, TypeResolution}; impl From for super::ScalarKind { fn from(format: super::StorageFormat) -> Self { use super::{ScalarKind as Sk, StorageFormat as Sf}; match format { Sf::R8Unorm => Sk::Float, Sf::R8Snorm => Sk::Float, Sf::R8Uint => Sk::Uint, Sf::R8Sint => Sk::Sint, Sf::R16Uint => Sk::Uint, Sf::R16Sint => Sk::Sint, Sf::R16Float => Sk::Float, Sf::Rg8Unorm => Sk::Float, Sf::Rg8Snorm => Sk::Float, Sf::Rg8Uint => Sk::Uint, Sf::Rg8Sint => Sk::Sint, Sf::R32Uint => Sk::Uint, Sf::R32Sint => Sk::Sint, Sf::R32Float => Sk::Float, Sf::Rg16Uint => Sk::Uint, Sf::Rg16Sint => Sk::Sint, Sf::Rg16Float => Sk::Float, Sf::Rgba8Unorm => Sk::Float, Sf::Rgba8Snorm => Sk::Float, Sf::Rgba8Uint => Sk::Uint, Sf::Rgba8Sint => Sk::Sint, Sf::Rgb10a2Unorm => Sk::Float, Sf::Rg11b10Float => Sk::Float, Sf::Rg32Uint => Sk::Uint, Sf::Rg32Sint => Sk::Sint, Sf::Rg32Float => Sk::Float, Sf::Rgba16Uint => Sk::Uint, Sf::Rgba16Sint => Sk::Sint, Sf::Rgba16Float => Sk::Float, Sf::Rgba32Uint => Sk::Uint, Sf::Rgba32Sint => Sk::Sint, Sf::Rgba32Float => Sk::Float, } } } impl super::ScalarValue { pub const fn scalar_kind(&self) -> super::ScalarKind { match *self { Self::Uint(_) => super::ScalarKind::Uint, Self::Sint(_) => super::ScalarKind::Sint, Self::Float(_) => super::ScalarKind::Float, Self::Bool(_) => super::ScalarKind::Bool, } } } impl super::ScalarKind { pub const fn is_numeric(self) -> bool { match self { crate::ScalarKind::Sint | crate::ScalarKind::Uint | crate::ScalarKind::Float => true, crate::ScalarKind::Bool => false, } } } pub const POINTER_SPAN: u32 = 4; impl super::TypeInner { pub const fn scalar_kind(&self) -> Option { match *self { super::TypeInner::Scalar { kind, .. } | super::TypeInner::Vector { kind, .. } => { Some(kind) } super::TypeInner::Matrix { .. } => Some(super::ScalarKind::Float), _ => None, } } pub const fn pointer_space(&self) -> Option { match *self { Self::Pointer { space, .. } => Some(space), Self::ValuePointer { space, .. } => Some(space), _ => None, } } pub fn try_size( &self, constants: &super::Arena, ) -> Result { Ok(match *self { Self::Scalar { kind: _, width } | Self::Atomic { kind: _, width } => width as u32, Self::Vector { size, kind: _, width, } => size as u32 * width as u32, // matrices are treated as arrays of aligned columns Self::Matrix { columns, rows, width, } => Alignment::from(rows) * width as u32 * columns as u32, Self::Pointer { .. } | Self::ValuePointer { .. } => POINTER_SPAN, Self::Array { base: _, size, stride, } => { let count = match size { super::ArraySize::Constant(handle) => { let constant = constants.try_get(handle)?; constant.to_array_length().unwrap_or(1) } // A dynamically-sized array has to have at least one element super::ArraySize::Dynamic => 1, }; count * stride } Self::Struct { span, .. } => span, Self::Image { .. } | Self::Sampler { .. } | Self::BindingArray { .. } => 0, }) } /// Get the size of this type. Panics if the `constants` doesn't contain /// a referenced handle. This may not happen in a properly validated IR module. pub fn size(&self, constants: &super::Arena) -> u32 { self.try_size(constants).unwrap() } /// Return the canonical form of `self`, or `None` if it's already in /// canonical form. /// /// Certain types have multiple representations in `TypeInner`. This /// function converts all forms of equivalent types to a single /// representative of their class, so that simply applying `Eq` to the /// result indicates whether the types are equivalent, as far as Naga IR is /// concerned. pub fn canonical_form( &self, types: &crate::UniqueArena, ) -> Option { use crate::TypeInner as Ti; match *self { Ti::Pointer { base, space } => match types[base].inner { Ti::Scalar { kind, width } => Some(Ti::ValuePointer { size: None, kind, width, space, }), Ti::Vector { size, kind, width } => Some(Ti::ValuePointer { size: Some(size), kind, width, space, }), _ => None, }, _ => None, } } /// Compare `self` and `rhs` as types. /// /// This is mostly the same as `::eq`, but it treats /// `ValuePointer` and `Pointer` types as equivalent. /// /// When you know that one side of the comparison is never a pointer, it's /// fine to not bother with canonicalization, and just compare `TypeInner` /// values with `==`. pub fn equivalent( &self, rhs: &crate::TypeInner, types: &crate::UniqueArena, ) -> bool { let left = self.canonical_form(types); let right = rhs.canonical_form(types); left.as_ref().unwrap_or(self) == right.as_ref().unwrap_or(rhs) } pub fn is_dynamically_sized(&self, types: &crate::UniqueArena) -> bool { use crate::TypeInner as Ti; match *self { Ti::Array { size, .. } => size == crate::ArraySize::Dynamic, Ti::Struct { ref members, .. } => members .last() .map(|last| types[last.ty].inner.is_dynamically_sized(types)) .unwrap_or(false), _ => false, } } } impl super::AddressSpace { pub fn access(self) -> crate::StorageAccess { use crate::StorageAccess as Sa; match self { crate::AddressSpace::Function | crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => Sa::LOAD | Sa::STORE, crate::AddressSpace::Uniform => Sa::LOAD, crate::AddressSpace::Storage { access } => access, crate::AddressSpace::Handle => Sa::LOAD, crate::AddressSpace::PushConstant => Sa::LOAD, } } } impl super::MathFunction { pub const fn argument_count(&self) -> usize { match *self { // comparison Self::Abs => 1, Self::Min => 2, Self::Max => 2, Self::Clamp => 3, Self::Saturate => 1, // trigonometry Self::Cos => 1, Self::Cosh => 1, Self::Sin => 1, Self::Sinh => 1, Self::Tan => 1, Self::Tanh => 1, Self::Acos => 1, Self::Asin => 1, Self::Atan => 1, Self::Atan2 => 2, Self::Asinh => 1, Self::Acosh => 1, Self::Atanh => 1, Self::Radians => 1, Self::Degrees => 1, // decomposition Self::Ceil => 1, Self::Floor => 1, Self::Round => 1, Self::Fract => 1, Self::Trunc => 1, Self::Modf => 2, Self::Frexp => 2, Self::Ldexp => 2, // exponent Self::Exp => 1, Self::Exp2 => 1, Self::Log => 1, Self::Log2 => 1, Self::Pow => 2, // geometry Self::Dot => 2, Self::Outer => 2, Self::Cross => 2, Self::Distance => 2, Self::Length => 1, Self::Normalize => 1, Self::FaceForward => 3, Self::Reflect => 2, Self::Refract => 3, // computational Self::Sign => 1, Self::Fma => 3, Self::Mix => 3, Self::Step => 2, Self::SmoothStep => 3, Self::Sqrt => 1, Self::InverseSqrt => 1, Self::Inverse => 1, Self::Transpose => 1, Self::Determinant => 1, // bits Self::CountOneBits => 1, Self::ReverseBits => 1, Self::ExtractBits => 3, Self::InsertBits => 4, Self::FindLsb => 1, Self::FindMsb => 1, // data packing Self::Pack4x8snorm => 1, Self::Pack4x8unorm => 1, Self::Pack2x16snorm => 1, Self::Pack2x16unorm => 1, Self::Pack2x16float => 1, // data unpacking Self::Unpack4x8snorm => 1, Self::Unpack4x8unorm => 1, Self::Unpack2x16snorm => 1, Self::Unpack2x16unorm => 1, Self::Unpack2x16float => 1, } } } impl crate::Expression { /// Returns true if the expression is considered emitted at the start of a function. pub const fn needs_pre_emit(&self) -> bool { match *self { Self::Constant(_) | Self::FunctionArgument(_) | Self::GlobalVariable(_) | Self::LocalVariable(_) => true, _ => false, } } /// Return true if this expression is a dynamic array index, for [`Access`]. /// /// This method returns true if this expression is a dynamically computed /// index, and as such can only be used to index matrices and arrays when /// they appear behind a pointer. See the documentation for [`Access`] for /// details. /// /// Note, this does not check the _type_ of the given expression. It's up to /// the caller to establish that the `Access` expression is well-typed /// through other means, like [`ResolveContext`]. /// /// [`Access`]: crate::Expression::Access /// [`ResolveContext`]: crate::proc::ResolveContext pub fn is_dynamic_index(&self, module: &crate::Module) -> bool { if let Self::Constant(handle) = *self { let constant = &module.constants[handle]; constant.specialization.is_some() } else { true } } } impl crate::Function { /// Return the global variable being accessed by the expression `pointer`. /// /// Assuming that `pointer` is a series of `Access` and `AccessIndex` /// expressions that ultimately access some part of a `GlobalVariable`, /// return a handle for that global. /// /// If the expression does not ultimately access a global variable, return /// `None`. pub fn originating_global( &self, mut pointer: crate::Handle, ) -> Option> { loop { pointer = match self.expressions[pointer] { crate::Expression::Access { base, .. } => base, crate::Expression::AccessIndex { base, .. } => base, crate::Expression::GlobalVariable(handle) => return Some(handle), crate::Expression::LocalVariable(_) => return None, crate::Expression::FunctionArgument(_) => return None, // There are no other expressions that produce pointer values. _ => unreachable!(), } } } } impl crate::SampleLevel { pub const fn implicit_derivatives(&self) -> bool { match *self { Self::Auto | Self::Bias(_) => true, Self::Zero | Self::Exact(_) | Self::Gradient { .. } => false, } } } impl crate::Constant { /// Interpret this constant as an array length, and return it as a `u32`. /// /// Ignore any specialization available for this constant; return its /// unspecialized value. /// /// If the constant has an inappropriate kind (non-scalar or non-integer) or /// value (negative, out of range for u32), return `None`. This usually /// indicates an error, but only the caller has enough information to report /// the error helpfully: in back ends, it's a validation error, but in front /// ends, it may indicate ill-formed input (for example, a SPIR-V /// `OpArrayType` referring to an inappropriate `OpConstant`). So we return /// `Option` and let the caller sort things out. pub(crate) fn to_array_length(&self) -> Option { use std::convert::TryInto; match self.inner { crate::ConstantInner::Scalar { value, width: _ } => match value { crate::ScalarValue::Uint(value) => value.try_into().ok(), // Accept a signed integer size to avoid // requiring an explicit uint // literal. Type inference should make // this unnecessary. crate::ScalarValue::Sint(value) => value.try_into().ok(), _ => None, }, // caught by type validation crate::ConstantInner::Composite { .. } => None, } } } impl crate::Binding { pub const fn to_built_in(&self) -> Option { match *self { crate::Binding::BuiltIn(built_in) => Some(built_in), Self::Location { .. } => None, } } } //TODO: should we use an existing crate for hashable floats? impl PartialEq for crate::ScalarValue { fn eq(&self, other: &Self) -> bool { match (*self, *other) { (Self::Uint(a), Self::Uint(b)) => a == b, (Self::Sint(a), Self::Sint(b)) => a == b, (Self::Float(a), Self::Float(b)) => a.to_bits() == b.to_bits(), (Self::Bool(a), Self::Bool(b)) => a == b, _ => false, } } } impl Eq for crate::ScalarValue {} impl std::hash::Hash for crate::ScalarValue { fn hash(&self, hasher: &mut H) { match *self { Self::Sint(v) => v.hash(hasher), Self::Uint(v) => v.hash(hasher), Self::Float(v) => v.to_bits().hash(hasher), Self::Bool(v) => v.hash(hasher), } } } impl super::SwizzleComponent { pub const XYZW: [Self; 4] = [Self::X, Self::Y, Self::Z, Self::W]; pub const fn index(&self) -> u32 { match *self { Self::X => 0, Self::Y => 1, Self::Z => 2, Self::W => 3, } } pub const fn from_index(idx: u32) -> Self { match idx { 0 => Self::X, 1 => Self::Y, 2 => Self::Z, _ => Self::W, } } } impl super::ImageClass { pub const fn is_multisampled(self) -> bool { match self { crate::ImageClass::Sampled { multi, .. } | crate::ImageClass::Depth { multi } => multi, crate::ImageClass::Storage { .. } => false, } } pub const fn is_mipmapped(self) -> bool { match self { crate::ImageClass::Sampled { multi, .. } | crate::ImageClass::Depth { multi } => !multi, crate::ImageClass::Storage { .. } => false, } } } #[test] fn test_matrix_size() { let constants = crate::Arena::new(); assert_eq!( crate::TypeInner::Matrix { columns: crate::VectorSize::Tri, rows: crate::VectorSize::Tri, width: 4 } .size(&constants), 48, ); } ================================================ FILE: lib/naga/src/proc/namer.rs ================================================ use crate::{arena::Handle, FastHashMap, FastHashSet}; use std::borrow::Cow; pub type EntryPointIndex = u16; const SEPARATOR: char = '_'; #[derive(Debug, Eq, Hash, PartialEq)] pub enum NameKey { Constant(Handle), GlobalVariable(Handle), Type(Handle), StructMember(Handle, u32), Function(Handle), FunctionArgument(Handle, u32), FunctionLocal(Handle, Handle), EntryPoint(EntryPointIndex), EntryPointLocal(EntryPointIndex, Handle), EntryPointArgument(EntryPointIndex, u32), } /// This processor assigns names to all the things in a module /// that may need identifiers in a textual backend. #[derive(Default)] pub struct Namer { /// The last numeric suffix used for each base name. Zero means "no suffix". unique: FastHashMap, keywords: FastHashSet, reserved_prefixes: Vec, } impl Namer { /// Return a form of `string` suitable for use as the base of an identifier. /// /// - Drop leading digits. /// - Retain only alphanumeric and `_` characters. /// - Avoid prefixes in [`Namer::reserved_prefixes`]. /// /// The return value is a valid identifier prefix in all of Naga's output languages, /// and it never ends with a `SEPARATOR` character. /// It is used as a key into the unique table. fn sanitize<'s>(&self, string: &'s str) -> Cow<'s, str> { let string = string .trim_start_matches(|c: char| c.is_numeric()) .trim_end_matches(SEPARATOR); let base = if !string.is_empty() && string .chars() .all(|c: char| c.is_ascii_alphanumeric() || c == '_') { Cow::Borrowed(string) } else { let mut filtered = string .chars() .filter(|&c| c.is_ascii_alphanumeric() || c == '_') .collect::(); let stripped_len = filtered.trim_end_matches(SEPARATOR).len(); filtered.truncate(stripped_len); if filtered.is_empty() { filtered.push_str("unnamed"); } Cow::Owned(filtered) }; for prefix in &self.reserved_prefixes { if base.starts_with(prefix) { return format!("gen_{}", base).into(); } } base } /// Return a new identifier based on `label_raw`. /// /// The result: /// - is a valid identifier even if `label_raw` is not /// - conflicts with no keywords listed in `Namer::keywords`, and /// - is different from any identifier previously constructed by this /// `Namer`. /// /// Guarantee uniqueness by applying a numeric suffix when necessary. If `label_raw` /// itself ends with digits, separate them from the suffix with an underscore. pub fn call(&mut self, label_raw: &str) -> String { use std::fmt::Write as _; // for write!-ing to Strings let base = self.sanitize(label_raw); debug_assert!(!base.is_empty() && !base.ends_with(SEPARATOR)); // This would seem to be a natural place to use `HashMap::entry`. However, `entry` // requires an owned key, and we'd like to avoid heap-allocating strings we're // just going to throw away. The approach below double-hashes only when we create // a new entry, in which case the heap allocation of the owned key was more // expensive anyway. match self.unique.get_mut(base.as_ref()) { Some(count) => { *count += 1; // Add the suffix. This may fit in base's existing allocation. let mut suffixed = base.into_owned(); write!(suffixed, "{}{}", SEPARATOR, *count).unwrap(); suffixed } None => { let mut suffixed = base.to_string(); if base.ends_with(char::is_numeric) || self.keywords.contains(base.as_ref()) { suffixed.push(SEPARATOR); } debug_assert!(!self.keywords.contains(&suffixed)); // `self.unique` wants to own its keys. This allocates only if we haven't // already done so earlier. self.unique.insert(base.into_owned(), 0); suffixed } } } pub fn call_or(&mut self, label: &Option, fallback: &str) -> String { self.call(match *label { Some(ref name) => name, None => fallback, }) } /// Enter a local namespace for things like structs. /// /// Struct member names only need to be unique amongst themselves, not /// globally. This function temporarily establishes a fresh, empty naming /// context for the duration of the call to `body`. fn namespace(&mut self, capacity: usize, body: impl FnOnce(&mut Self)) { let fresh = FastHashMap::with_capacity_and_hasher(capacity, Default::default()); let outer = std::mem::replace(&mut self.unique, fresh); body(self); self.unique = outer; } pub fn reset( &mut self, module: &crate::Module, reserved_keywords: &[&str], reserved_prefixes: &[&str], output: &mut FastHashMap, ) { self.reserved_prefixes.clear(); self.reserved_prefixes .extend(reserved_prefixes.iter().map(|string| string.to_string())); self.unique.clear(); self.keywords.clear(); self.keywords .extend(reserved_keywords.iter().map(|string| (string.to_string()))); let mut temp = String::new(); for (ty_handle, ty) in module.types.iter() { let ty_name = self.call_or(&ty.name, "type"); output.insert(NameKey::Type(ty_handle), ty_name); if let crate::TypeInner::Struct { ref members, .. } = ty.inner { // struct members have their own namespace, because access is always prefixed self.namespace(members.len(), |namer| { for (index, member) in members.iter().enumerate() { let name = namer.call_or(&member.name, "member"); output.insert(NameKey::StructMember(ty_handle, index as u32), name); } }) } } for (ep_index, ep) in module.entry_points.iter().enumerate() { let ep_name = self.call(&ep.name); output.insert(NameKey::EntryPoint(ep_index as _), ep_name); for (index, arg) in ep.function.arguments.iter().enumerate() { let name = self.call_or(&arg.name, "param"); output.insert( NameKey::EntryPointArgument(ep_index as _, index as u32), name, ); } for (handle, var) in ep.function.local_variables.iter() { let name = self.call_or(&var.name, "local"); output.insert(NameKey::EntryPointLocal(ep_index as _, handle), name); } } for (fun_handle, fun) in module.functions.iter() { let fun_name = self.call_or(&fun.name, "function"); output.insert(NameKey::Function(fun_handle), fun_name); for (index, arg) in fun.arguments.iter().enumerate() { let name = self.call_or(&arg.name, "param"); output.insert(NameKey::FunctionArgument(fun_handle, index as u32), name); } for (handle, var) in fun.local_variables.iter() { let name = self.call_or(&var.name, "local"); output.insert(NameKey::FunctionLocal(fun_handle, handle), name); } } for (handle, var) in module.global_variables.iter() { let name = self.call_or(&var.name, "global"); output.insert(NameKey::GlobalVariable(handle), name); } for (handle, constant) in module.constants.iter() { let label = match constant.name { Some(ref name) => name, None => { use std::fmt::Write; // Try to be more descriptive about the constant values temp.clear(); match constant.inner { crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Sint(v), } => write!(temp, "const_{}i", v), crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Uint(v), } => write!(temp, "const_{}u", v), crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Float(v), } => { let abs = v.abs(); write!( temp, "const_{}{}", if v < 0.0 { "n" } else { "" }, abs.trunc(), ) .unwrap(); let fract = abs.fract(); if fract == 0.0 { write!(temp, "f") } else { write!(temp, "_{:02}f", (fract * 100.0) as i8) } } crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Bool(v), } => write!(temp, "const_{}", v), crate::ConstantInner::Composite { ty, components: _ } => { write!(temp, "const_{}", output[&NameKey::Type(ty)]) } } .unwrap(); &temp } }; let name = self.call(label); output.insert(NameKey::Constant(handle), name); } } } #[test] fn test() { let mut namer = Namer::default(); assert_eq!(namer.call("x"), "x"); assert_eq!(namer.call("x"), "x_1"); assert_eq!(namer.call("x1"), "x1_"); } ================================================ FILE: lib/naga/src/proc/terminator.rs ================================================ /// Ensure that the given block has return statements /// at the end of its control flow. /// /// Note: we don't want to blindly append a return statement /// to the end, because it may be either redundant or invalid, /// e.g. when the user already has returns in if/else branches. pub fn ensure_block_returns(block: &mut crate::Block) { use crate::Statement as S; match block.last_mut() { Some(&mut S::Block(ref mut b)) => { ensure_block_returns(b); } Some(&mut S::If { condition: _, ref mut accept, ref mut reject, }) => { ensure_block_returns(accept); ensure_block_returns(reject); } Some(&mut S::Switch { selector: _, ref mut cases, }) => { for case in cases.iter_mut() { if !case.fall_through { ensure_block_returns(&mut case.body); } } } Some(&mut (S::Emit(_) | S::Break | S::Continue | S::Return { .. } | S::Kill)) => (), Some( &mut (S::Loop { .. } | S::Store { .. } | S::ImageStore { .. } | S::Call { .. } | S::Atomic { .. } | S::Barrier(_)), ) | None => block.push(S::Return { value: None }, Default::default()), } } ================================================ FILE: lib/naga/src/proc/typifier.rs ================================================ use crate::arena::{Arena, BadHandle, Handle, UniqueArena}; use thiserror::Error; /// The result of computing an expression's type. /// /// This is the (Rust) type returned by [`ResolveContext::resolve`] to represent /// the (Naga) type it ascribes to some expression. /// /// You might expect such a function to simply return a `Handle`. However, /// we want type resolution to be a read-only process, and that would limit the /// possible results to types already present in the expression's associated /// `UniqueArena`. Naga IR does have certain expressions whose types are /// not certain to be present. /// /// So instead, type resolution returns a `TypeResolution` enum: either a /// [`Handle`], referencing some type in the arena, or a [`Value`], holding a /// free-floating [`TypeInner`]. This extends the range to cover anything that /// can be represented with a `TypeInner` referring to the existing arena. /// /// What sorts of expressions can have types not available in the arena? /// /// - An [`Access`] or [`AccessIndex`] expression applied to a [`Vector`] or /// [`Matrix`] must have a [`Scalar`] or [`Vector`] type. But since `Vector` /// and `Matrix` represent their element and column types implicitly, not /// via a handle, there may not be a suitable type in the expression's /// associated arena. Instead, resolving such an expression returns a /// `TypeResolution::Value(TypeInner::X { ... })`, where `X` is `Scalar` or /// `Vector`. /// /// - Similarly, the type of an [`Access`] or [`AccessIndex`] expression /// applied to a *pointer to* a vector or matrix must produce a *pointer to* /// a scalar or vector type. These cannot be represented with a /// [`TypeInner::Pointer`], since the `Pointer`'s `base` must point into the /// arena, and as before, we cannot assume that a suitable scalar or vector /// type is there. So we take things one step further and provide /// [`TypeInner::ValuePointer`], specifically for the case of pointers to /// scalars or vectors. This type fits in a `TypeInner` and is exactly /// equivalent to a `Pointer` to a `Vector` or `Scalar`. /// /// So, for example, the type of an `Access` expression applied to a value of type: /// /// ```ignore /// TypeInner::Matrix { columns, rows, width } /// ``` /// /// might be: /// /// ```ignore /// TypeResolution::Value(TypeInner::Vector { /// size: rows, /// kind: ScalarKind::Float, /// width, /// }) /// ``` /// /// and the type of an access to a pointer of address space `space` to such a /// matrix might be: /// /// ```ignore /// TypeResolution::Value(TypeInner::ValuePointer { /// size: Some(rows), /// kind: ScalarKind::Float, /// width, /// space, /// }) /// ``` /// /// [`Handle`]: TypeResolution::Handle /// [`Value`]: TypeResolution::Value /// /// [`Access`]: crate::Expression::Access /// [`AccessIndex`]: crate::Expression::AccessIndex /// /// [`TypeInner`]: crate::TypeInner /// [`Matrix`]: crate::TypeInner::Matrix /// [`Pointer`]: crate::TypeInner::Pointer /// [`Scalar`]: crate::TypeInner::Scalar /// [`ValuePointer`]: crate::TypeInner::ValuePointer /// [`Vector`]: crate::TypeInner::Vector /// /// [`TypeInner::Pointer`]: crate::TypeInner::Pointer /// [`TypeInner::ValuePointer`]: crate::TypeInner::ValuePointer #[derive(Debug, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum TypeResolution { /// A type stored in the associated arena. Handle(Handle), /// A free-floating [`TypeInner`], representing a type that may not be /// available in the associated arena. However, the `TypeInner` itself may /// contain `Handle` values referring to types from the arena. /// /// [`TypeInner`]: crate::TypeInner Value(crate::TypeInner), } impl TypeResolution { pub const fn handle(&self) -> Option> { match *self { Self::Handle(handle) => Some(handle), Self::Value(_) => None, } } pub fn inner_with<'a>(&'a self, arena: &'a UniqueArena) -> &'a crate::TypeInner { match *self { Self::Handle(handle) => &arena[handle].inner, Self::Value(ref inner) => inner, } } } // Clone is only implemented for numeric variants of `TypeInner`. impl Clone for TypeResolution { fn clone(&self) -> Self { use crate::TypeInner as Ti; match *self { Self::Handle(handle) => Self::Handle(handle), Self::Value(ref v) => Self::Value(match *v { Ti::Scalar { kind, width } => Ti::Scalar { kind, width }, Ti::Vector { size, kind, width } => Ti::Vector { size, kind, width }, Ti::Matrix { rows, columns, width, } => Ti::Matrix { rows, columns, width, }, Ti::Pointer { base, space } => Ti::Pointer { base, space }, Ti::ValuePointer { size, kind, width, space, } => Ti::ValuePointer { size, kind, width, space, }, _ => unreachable!("Unexpected clone type: {:?}", v), }), } } } impl crate::ConstantInner { pub const fn resolve_type(&self) -> TypeResolution { match *self { Self::Scalar { width, ref value } => TypeResolution::Value(crate::TypeInner::Scalar { kind: value.scalar_kind(), width, }), Self::Composite { ty, components: _ } => TypeResolution::Handle(ty), } } } #[derive(Clone, Debug, Error, PartialEq)] pub enum ResolveError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("Index {index} is out of bounds for expression {expr:?}")] OutOfBoundsIndex { expr: Handle, index: u32, }, #[error("Invalid access into expression {expr:?}, indexed: {indexed}")] InvalidAccess { expr: Handle, indexed: bool, }, #[error("Invalid sub-access into type {ty:?}, indexed: {indexed}")] InvalidSubAccess { ty: Handle, indexed: bool, }, #[error("Invalid scalar {0:?}")] InvalidScalar(Handle), #[error("Invalid vector {0:?}")] InvalidVector(Handle), #[error("Invalid pointer {0:?}")] InvalidPointer(Handle), #[error("Invalid image {0:?}")] InvalidImage(Handle), #[error("Function {name} not defined")] FunctionNotDefined { name: String }, #[error("Function without return type")] FunctionReturnsVoid, #[error("Incompatible operands: {0}")] IncompatibleOperands(String), #[error("Function argument {0} doesn't exist")] FunctionArgumentNotFound(u32), #[error("Expression {0:?} depends on expressions that follow")] ExpressionForwardDependency(Handle), } pub struct ResolveContext<'a> { pub constants: &'a Arena, pub types: &'a UniqueArena, pub global_vars: &'a Arena, pub local_vars: &'a Arena, pub functions: &'a Arena, pub arguments: &'a [crate::FunctionArgument], } impl<'a> ResolveContext<'a> { /// Determine the type of `expr`. /// /// The `past` argument must be a closure that can resolve the types of any /// expressions that `expr` refers to. These can be gathered by caching the /// results of prior calls to `resolve`, perhaps as done by the /// [`front::Typifier`] utility type. /// /// Type resolution is a read-only process: this method takes `self` by /// shared reference. However, this means that we cannot add anything to /// `self.types` that we might need to describe `expr`. To work around this, /// this method returns a [`TypeResolution`], rather than simply returning a /// `Handle`; see the documentation for [`TypeResolution`] for /// details. /// /// [`front::Typifier`]: crate::front::Typifier pub fn resolve( &self, expr: &crate::Expression, past: impl Fn(Handle) -> Result<&'a TypeResolution, ResolveError>, ) -> Result { use crate::TypeInner as Ti; let types = self.types; Ok(match *expr { crate::Expression::Access { base, .. } => match *past(base)?.inner_with(types) { // Arrays and matrices can only be indexed dynamically behind a // pointer, but that's a validation error, not a type error, so // go ahead provide a type here. Ti::Array { base, .. } => TypeResolution::Handle(base), Ti::Matrix { rows, width, .. } => TypeResolution::Value(Ti::Vector { size: rows, kind: crate::ScalarKind::Float, width, }), Ti::Vector { size: _, kind, width, } => TypeResolution::Value(Ti::Scalar { kind, width }), Ti::ValuePointer { size: Some(_), kind, width, space, } => TypeResolution::Value(Ti::ValuePointer { size: None, kind, width, space, }), Ti::Pointer { base, space } => { TypeResolution::Value(match types[base].inner { Ti::Array { base, .. } => Ti::Pointer { base, space }, Ti::Vector { size: _, kind, width, } => Ti::ValuePointer { size: None, kind, width, space, }, // Matrices are only dynamically indexed behind a pointer Ti::Matrix { columns: _, rows, width, } => Ti::ValuePointer { kind: crate::ScalarKind::Float, size: Some(rows), width, space, }, ref other => { log::error!("Access sub-type {:?}", other); return Err(ResolveError::InvalidSubAccess { ty: base, indexed: false, }); } }) } Ti::BindingArray { base, .. } => TypeResolution::Handle(base), ref other => { log::error!("Access type {:?}", other); return Err(ResolveError::InvalidAccess { expr: base, indexed: false, }); } }, crate::Expression::AccessIndex { base, index } => { match *past(base)?.inner_with(types) { Ti::Vector { size, kind, width } => { if index >= size as u32 { return Err(ResolveError::OutOfBoundsIndex { expr: base, index }); } TypeResolution::Value(Ti::Scalar { kind, width }) } Ti::Matrix { columns, rows, width, } => { if index >= columns as u32 { return Err(ResolveError::OutOfBoundsIndex { expr: base, index }); } TypeResolution::Value(crate::TypeInner::Vector { size: rows, kind: crate::ScalarKind::Float, width, }) } Ti::Array { base, .. } => TypeResolution::Handle(base), Ti::Struct { ref members, .. } => { let member = members .get(index as usize) .ok_or(ResolveError::OutOfBoundsIndex { expr: base, index })?; TypeResolution::Handle(member.ty) } Ti::ValuePointer { size: Some(size), kind, width, space, } => { if index >= size as u32 { return Err(ResolveError::OutOfBoundsIndex { expr: base, index }); } TypeResolution::Value(Ti::ValuePointer { size: None, kind, width, space, }) } Ti::Pointer { base: ty_base, space, } => TypeResolution::Value(match types[ty_base].inner { Ti::Array { base, .. } => Ti::Pointer { base, space }, Ti::Vector { size, kind, width } => { if index >= size as u32 { return Err(ResolveError::OutOfBoundsIndex { expr: base, index }); } Ti::ValuePointer { size: None, kind, width, space, } } Ti::Matrix { rows, columns, width, } => { if index >= columns as u32 { return Err(ResolveError::OutOfBoundsIndex { expr: base, index }); } Ti::ValuePointer { size: Some(rows), kind: crate::ScalarKind::Float, width, space, } } Ti::Struct { ref members, .. } => { let member = members .get(index as usize) .ok_or(ResolveError::OutOfBoundsIndex { expr: base, index })?; Ti::Pointer { base: member.ty, space, } } ref other => { log::error!("Access index sub-type {:?}", other); return Err(ResolveError::InvalidSubAccess { ty: ty_base, indexed: true, }); } }), Ti::BindingArray { base, .. } => TypeResolution::Handle(base), ref other => { log::error!("Access index type {:?}", other); return Err(ResolveError::InvalidAccess { expr: base, indexed: true, }); } } } crate::Expression::Constant(h) => { let constant = self.constants.try_get(h)?; match constant.inner { crate::ConstantInner::Scalar { width, ref value } => { TypeResolution::Value(Ti::Scalar { kind: value.scalar_kind(), width, }) } crate::ConstantInner::Composite { ty, components: _ } => { TypeResolution::Handle(ty) } } } crate::Expression::Splat { size, value } => match *past(value)?.inner_with(types) { Ti::Scalar { kind, width } => { TypeResolution::Value(Ti::Vector { size, kind, width }) } ref other => { log::error!("Scalar type {:?}", other); return Err(ResolveError::InvalidScalar(value)); } }, crate::Expression::Swizzle { size, vector, pattern: _, } => match *past(vector)?.inner_with(types) { Ti::Vector { size: _, kind, width, } => TypeResolution::Value(Ti::Vector { size, kind, width }), ref other => { log::error!("Vector type {:?}", other); return Err(ResolveError::InvalidVector(vector)); } }, crate::Expression::Compose { ty, .. } => TypeResolution::Handle(ty), crate::Expression::FunctionArgument(index) => { let arg = self .arguments .get(index as usize) .ok_or(ResolveError::FunctionArgumentNotFound(index))?; TypeResolution::Handle(arg.ty) } crate::Expression::GlobalVariable(h) => { let var = self.global_vars.try_get(h)?; if var.space == crate::AddressSpace::Handle { TypeResolution::Handle(var.ty) } else { TypeResolution::Value(Ti::Pointer { base: var.ty, space: var.space, }) } } crate::Expression::LocalVariable(h) => { let var = self.local_vars.try_get(h)?; TypeResolution::Value(Ti::Pointer { base: var.ty, space: crate::AddressSpace::Function, }) } crate::Expression::Load { pointer } => match *past(pointer)?.inner_with(types) { Ti::Pointer { base, space: _ } => { if let Ti::Atomic { kind, width } = types[base].inner { TypeResolution::Value(Ti::Scalar { kind, width }) } else { TypeResolution::Handle(base) } } Ti::ValuePointer { size, kind, width, space: _, } => TypeResolution::Value(match size { Some(size) => Ti::Vector { size, kind, width }, None => Ti::Scalar { kind, width }, }), ref other => { log::error!("Pointer type {:?}", other); return Err(ResolveError::InvalidPointer(pointer)); } }, crate::Expression::ImageSample { image, gather: Some(_), .. } => match *past(image)?.inner_with(types) { Ti::Image { class, .. } => TypeResolution::Value(Ti::Vector { kind: match class { crate::ImageClass::Sampled { kind, multi: _ } => kind, _ => crate::ScalarKind::Float, }, width: 4, size: crate::VectorSize::Quad, }), ref other => { log::error!("Image type {:?}", other); return Err(ResolveError::InvalidImage(image)); } }, crate::Expression::ImageSample { image, .. } | crate::Expression::ImageLoad { image, .. } => match *past(image)?.inner_with(types) { Ti::Image { class, .. } => TypeResolution::Value(match class { crate::ImageClass::Depth { multi: _ } => Ti::Scalar { kind: crate::ScalarKind::Float, width: 4, }, crate::ImageClass::Sampled { kind, multi: _ } => Ti::Vector { kind, width: 4, size: crate::VectorSize::Quad, }, crate::ImageClass::Storage { format, .. } => Ti::Vector { kind: format.into(), width: 4, size: crate::VectorSize::Quad, }, }), ref other => { log::error!("Image type {:?}", other); return Err(ResolveError::InvalidImage(image)); } }, crate::Expression::ImageQuery { image, query } => TypeResolution::Value(match query { crate::ImageQuery::Size { level: _ } => match *past(image)?.inner_with(types) { Ti::Image { dim, .. } => match dim { crate::ImageDimension::D1 => Ti::Scalar { kind: crate::ScalarKind::Sint, width: 4, }, crate::ImageDimension::D2 | crate::ImageDimension::Cube => Ti::Vector { size: crate::VectorSize::Bi, kind: crate::ScalarKind::Sint, width: 4, }, crate::ImageDimension::D3 => Ti::Vector { size: crate::VectorSize::Tri, kind: crate::ScalarKind::Sint, width: 4, }, }, ref other => { log::error!("Image type {:?}", other); return Err(ResolveError::InvalidImage(image)); } }, crate::ImageQuery::NumLevels | crate::ImageQuery::NumLayers | crate::ImageQuery::NumSamples => Ti::Scalar { kind: crate::ScalarKind::Sint, width: 4, }, }), crate::Expression::Unary { expr, .. } => past(expr)?.clone(), crate::Expression::Binary { op, left, right } => match op { crate::BinaryOperator::Add | crate::BinaryOperator::Subtract | crate::BinaryOperator::Divide | crate::BinaryOperator::Modulo => past(left)?.clone(), crate::BinaryOperator::Multiply => { let (res_left, res_right) = (past(left)?, past(right)?); match (res_left.inner_with(types), res_right.inner_with(types)) { ( &Ti::Matrix { columns: _, rows, width, }, &Ti::Matrix { columns, .. }, ) => TypeResolution::Value(Ti::Matrix { columns, rows, width, }), ( &Ti::Matrix { columns: _, rows, width, }, &Ti::Vector { .. }, ) => TypeResolution::Value(Ti::Vector { size: rows, kind: crate::ScalarKind::Float, width, }), ( &Ti::Vector { .. }, &Ti::Matrix { columns, rows: _, width, }, ) => TypeResolution::Value(Ti::Vector { size: columns, kind: crate::ScalarKind::Float, width, }), (&Ti::Scalar { .. }, _) => res_right.clone(), (_, &Ti::Scalar { .. }) => res_left.clone(), (&Ti::Vector { .. }, &Ti::Vector { .. }) => res_left.clone(), (tl, tr) => { return Err(ResolveError::IncompatibleOperands(format!( "{:?} * {:?}", tl, tr ))) } } } crate::BinaryOperator::Equal | crate::BinaryOperator::NotEqual | crate::BinaryOperator::Less | crate::BinaryOperator::LessEqual | crate::BinaryOperator::Greater | crate::BinaryOperator::GreaterEqual | crate::BinaryOperator::LogicalAnd | crate::BinaryOperator::LogicalOr => { let kind = crate::ScalarKind::Bool; let width = crate::BOOL_WIDTH; let inner = match *past(left)?.inner_with(types) { Ti::Scalar { .. } => Ti::Scalar { kind, width }, Ti::Vector { size, .. } => Ti::Vector { size, kind, width }, ref other => { return Err(ResolveError::IncompatibleOperands(format!( "{:?}({:?}, _)", op, other ))) } }; TypeResolution::Value(inner) } crate::BinaryOperator::And | crate::BinaryOperator::ExclusiveOr | crate::BinaryOperator::InclusiveOr | crate::BinaryOperator::ShiftLeft | crate::BinaryOperator::ShiftRight => past(left)?.clone(), }, crate::Expression::AtomicResult { kind, width, .. } => { TypeResolution::Value(Ti::Scalar { kind, width }) } crate::Expression::Select { accept, .. } => past(accept)?.clone(), crate::Expression::Derivative { axis: _, expr } => past(expr)?.clone(), crate::Expression::Relational { fun, argument } => match fun { crate::RelationalFunction::All | crate::RelationalFunction::Any => { TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Bool, width: crate::BOOL_WIDTH, }) } crate::RelationalFunction::IsNan | crate::RelationalFunction::IsInf | crate::RelationalFunction::IsFinite | crate::RelationalFunction::IsNormal => match *past(argument)?.inner_with(types) { Ti::Scalar { .. } => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Bool, width: crate::BOOL_WIDTH, }), Ti::Vector { size, .. } => TypeResolution::Value(Ti::Vector { kind: crate::ScalarKind::Bool, width: crate::BOOL_WIDTH, size, }), ref other => { return Err(ResolveError::IncompatibleOperands(format!( "{:?}({:?})", fun, other ))) } }, }, crate::Expression::Math { fun, arg, arg1, arg2: _, arg3: _, } => { use crate::MathFunction as Mf; let res_arg = past(arg)?; match fun { // comparison Mf::Abs | Mf::Min | Mf::Max | Mf::Clamp | Mf::Saturate | // trigonometry Mf::Cos | Mf::Cosh | Mf::Sin | Mf::Sinh | Mf::Tan | Mf::Tanh | Mf::Acos | Mf::Asin | Mf::Atan | Mf::Atan2 | Mf::Asinh | Mf::Acosh | Mf::Atanh | Mf::Radians | Mf::Degrees | // decomposition Mf::Ceil | Mf::Floor | Mf::Round | Mf::Fract | Mf::Trunc | Mf::Modf | Mf::Frexp | Mf::Ldexp | // exponent Mf::Exp | Mf::Exp2 | Mf::Log | Mf::Log2 | Mf::Pow => res_arg.clone(), // geometry Mf::Dot => match *res_arg.inner_with(types) { Ti::Vector { kind, size: _, width, } => TypeResolution::Value(Ti::Scalar { kind, width }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?}, _)", fun, other) )), }, Mf::Outer => { let arg1 = arg1.ok_or_else(|| ResolveError::IncompatibleOperands( format!("{:?}(_, None)", fun) ))?; match (res_arg.inner_with(types), past(arg1)?.inner_with(types)) { (&Ti::Vector {kind: _, size: columns,width}, &Ti::Vector{ size: rows, .. }) => TypeResolution::Value(Ti::Matrix { columns, rows, width }), (left, right) => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?}, {:?})", fun, left, right) )), } }, Mf::Cross => res_arg.clone(), Mf::Distance | Mf::Length => match *res_arg.inner_with(types) { Ti::Scalar {width,kind} | Ti::Vector {width,kind,size:_} => TypeResolution::Value(Ti::Scalar { kind, width }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?})", fun, other) )), }, Mf::Normalize | Mf::FaceForward | Mf::Reflect | Mf::Refract => res_arg.clone(), // computational Mf::Sign | Mf::Fma | Mf::Mix | Mf::Step | Mf::SmoothStep | Mf::Sqrt | Mf::InverseSqrt => res_arg.clone(), Mf::Transpose => match *res_arg.inner_with(types) { Ti::Matrix { columns, rows, width, } => TypeResolution::Value(Ti::Matrix { columns: rows, rows: columns, width, }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?})", fun, other) )), }, Mf::Inverse => match *res_arg.inner_with(types) { Ti::Matrix { columns, rows, width, } if columns == rows => TypeResolution::Value(Ti::Matrix { columns, rows, width, }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?})", fun, other) )), }, Mf::Determinant => match *res_arg.inner_with(types) { Ti::Matrix { width, .. } => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Float, width }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?})", fun, other) )), }, // bits Mf::CountOneBits | Mf::ReverseBits | Mf::ExtractBits | Mf::InsertBits | Mf::FindLsb | Mf::FindMsb => match *res_arg.inner_with(types) { Ti::Scalar { kind: kind @ (crate::ScalarKind::Sint | crate::ScalarKind::Uint), width } => TypeResolution::Value(Ti::Scalar { kind, width }), Ti::Vector { size, kind: kind @ (crate::ScalarKind::Sint | crate::ScalarKind::Uint), width } => TypeResolution::Value(Ti::Vector { size, kind, width }), ref other => return Err(ResolveError::IncompatibleOperands( format!("{:?}({:?})", fun, other) )), }, // data packing Mf::Pack4x8snorm | Mf::Pack4x8unorm | Mf::Pack2x16snorm | Mf::Pack2x16unorm | Mf::Pack2x16float => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Uint, width: 4 }), // data unpacking Mf::Unpack4x8snorm | Mf::Unpack4x8unorm => TypeResolution::Value(Ti::Vector { size: crate::VectorSize::Quad, kind: crate::ScalarKind::Float, width: 4 }), Mf::Unpack2x16snorm | Mf::Unpack2x16unorm | Mf::Unpack2x16float => TypeResolution::Value(Ti::Vector { size: crate::VectorSize::Bi, kind: crate::ScalarKind::Float, width: 4 }), } } crate::Expression::As { expr, kind, convert, } => match *past(expr)?.inner_with(types) { Ti::Scalar { kind: _, width } => TypeResolution::Value(Ti::Scalar { kind, width: convert.unwrap_or(width), }), Ti::Vector { kind: _, size, width, } => TypeResolution::Value(Ti::Vector { kind, size, width: convert.unwrap_or(width), }), Ti::Matrix { columns, rows, width, } => TypeResolution::Value(Ti::Matrix { columns, rows, width: convert.unwrap_or(width), }), ref other => { return Err(ResolveError::IncompatibleOperands(format!( "{:?} as {:?}", other, kind ))) } }, crate::Expression::CallResult(function) => { let result = self.functions[function] .result .as_ref() .ok_or(ResolveError::FunctionReturnsVoid)?; TypeResolution::Handle(result.ty) } crate::Expression::ArrayLength(_) => TypeResolution::Value(Ti::Scalar { kind: crate::ScalarKind::Uint, width: 4, }), }) } } #[test] fn test_error_size() { use std::mem::size_of; assert_eq!(size_of::(), 32); } ================================================ FILE: lib/naga/src/span.rs ================================================ use crate::{Arena, Handle, UniqueArena}; use std::{error::Error, fmt, ops::Range}; /// A source code span, used for error reporting. #[derive(Clone, Copy, Debug, PartialEq, Default)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Span { start: u32, end: u32, } impl Span { pub const UNDEFINED: Self = Self { start: 0, end: 0 }; /// Creates a new `Span` from a range of byte indices /// /// Note: end is exclusive, it doesn't belong to the `Span` pub const fn new(start: u32, end: u32) -> Self { Span { start, end } } /// Modifies `self` to contain the smallest `Span` possible that /// contains both `self` and `other` pub fn subsume(&mut self, other: Self) { *self = if !self.is_defined() { // self isn't defined so use other other } else if !other.is_defined() { // other isn't defined so don't try to subsume *self } else { // Both self and other are defined so calculate the span that contains them both Span { start: self.start.min(other.start), end: self.end.max(other.end), } } } /// Returns the smallest `Span` possible that contains all the `Span`s /// defined in the `from` iterator pub fn total_span>(from: T) -> Self { let mut span: Self = Default::default(); for other in from { span.subsume(other); } span } /// Converts `self` to a range if the span is not unknown pub fn to_range(self) -> Option> { if self.is_defined() { Some(self.start as usize..self.end as usize) } else { None } } /// Check whether `self` was defined or is a default/unknown span pub fn is_defined(&self) -> bool { *self != Self::default() } /// Return a [`SourceLocation`] for this span in the provided source. pub fn location(&self, source: &str) -> SourceLocation { let prefix = &source[..self.start as usize]; let line_number = prefix.matches('\n').count() as u32 + 1; let line_start = prefix.rfind('\n').map(|pos| pos + 1).unwrap_or(0); let line_position = source[line_start..self.start as usize].chars().count() as u32 + 1; SourceLocation { line_number, line_position, offset: self.start, length: self.end - self.start, } } } impl From> for Span { fn from(range: Range) -> Self { Span { start: range.start as u32, end: range.end as u32, } } } /// A human-readable representation for a span, tailored for text source. /// /// Corresponds to the positional members of [`GPUCompilationMessage`][gcm] from /// the WebGPU specification, except that `offset` and `length` are in bytes /// (UTF-8 code units), instead of UTF-16 code units. /// /// [gcm]: https://www.w3.org/TR/webgpu/#gpucompilationmessage #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct SourceLocation { /// 1-based line number. pub line_number: u32, /// 1-based column of the start of this span pub line_position: u32, /// 0-based Offset in code units (in bytes) of the start of the span. pub offset: u32, /// Length in code units (in bytes) of the span. pub length: u32, } /// A source code span together with "context", a user-readable description of what part of the error it refers to. pub type SpanContext = (Span, String); /// Wrapper class for [`Error`], augmenting it with a list of [`SpanContext`]s. #[derive(Debug, Clone)] pub struct WithSpan { inner: E, #[cfg(feature = "span")] spans: Vec, } impl fmt::Display for WithSpan where E: fmt::Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { self.inner.fmt(f) } } #[cfg(test)] impl PartialEq for WithSpan where E: PartialEq, { fn eq(&self, other: &Self) -> bool { self.inner.eq(&other.inner) } } impl Error for WithSpan where E: Error, { fn source(&self) -> Option<&(dyn Error + 'static)> { self.inner.source() } } impl WithSpan { /// Create a new [`WithSpan`] from an [`Error`], containing no spans. pub const fn new(inner: E) -> Self { Self { inner, #[cfg(feature = "span")] spans: Vec::new(), } } /// Reverse of [`Self::new`], discards span information and returns an inner error. #[allow(clippy::missing_const_for_fn)] // ignore due to requirement of #![feature(const_precise_live_drops)] pub fn into_inner(self) -> E { self.inner } pub const fn as_inner(&self) -> &E { &self.inner } /// Iterator over stored [`SpanContext`]s. pub fn spans(&self) -> impl Iterator + ExactSizeIterator { #[cfg(feature = "span")] return self.spans.iter(); #[cfg(not(feature = "span"))] return std::iter::empty(); } /// Add a new span with description. #[cfg_attr(not(feature = "span"), allow(unused_variables, unused_mut))] pub fn with_span(mut self, span: Span, description: S) -> Self where S: ToString, { #[cfg(feature = "span")] if span.is_defined() { self.spans.push((span, description.to_string())); } self } /// Add a [`SpanContext`]. pub fn with_context(self, span_context: SpanContext) -> Self { let (span, description) = span_context; self.with_span(span, description) } /// Add a [`Handle`] from either [`Arena`] or [`UniqueArena`], borrowing its span information from there /// and annotating with a type and the handle representation. pub(crate) fn with_handle>(self, handle: Handle, arena: &A) -> Self { self.with_context(arena.get_span_context(handle)) } /// Convert inner error using [`From`]. pub fn into_other(self) -> WithSpan where E2: From, { WithSpan { inner: self.inner.into(), #[cfg(feature = "span")] spans: self.spans, } } /// Convert inner error into another type. Joins span information contained in `self` /// with what is returned from `func`. pub fn and_then(self, func: F) -> WithSpan where F: FnOnce(E) -> WithSpan, { #[cfg_attr(not(feature = "span"), allow(unused_mut))] let mut res = func(self.inner); #[cfg(feature = "span")] res.spans.extend(self.spans); res } #[cfg(feature = "span")] /// Return a [`SourceLocation`] for our first span, if we have one. pub fn location(&self, source: &str) -> Option { if self.spans.is_empty() { return None; } Some(self.spans[0].0.location(source)) } #[cfg(not(feature = "span"))] /// Return a [`SourceLocation`] for our first span, if we have one. pub fn location(&self, _source: &str) -> Option { None } #[cfg(feature = "span")] fn diagnostic(&self) -> codespan_reporting::diagnostic::Diagnostic<()> where E: Error, { use codespan_reporting::diagnostic::{Diagnostic, Label}; let diagnostic = Diagnostic::error() .with_message(self.inner.to_string()) .with_labels( self.spans() .map(|&(span, ref desc)| { Label::primary((), span.to_range().unwrap()).with_message(desc.to_owned()) }) .collect(), ) .with_notes({ let mut notes = Vec::new(); let mut source: &dyn Error = &self.inner; while let Some(next) = Error::source(source) { notes.push(next.to_string()); source = next; } notes }); diagnostic } /// Emits a summary of the error to standard error stream. #[cfg(feature = "span")] pub fn emit_to_stderr(&self, source: &str) where E: Error, { self.emit_to_stderr_with_path(source, "wgsl") } /// Emits a summary of the error to standard error stream. #[cfg(feature = "span")] pub fn emit_to_stderr_with_path(&self, source: &str, path: &str) where E: Error, { use codespan_reporting::{files, term}; use term::termcolor::{ColorChoice, StandardStream}; let files = files::SimpleFile::new(path, source); let config = term::Config::default(); let writer = StandardStream::stderr(ColorChoice::Auto); term::emit(&mut writer.lock(), &config, &files, &self.diagnostic()) .expect("cannot write error"); } /// Emits a summary of the error to a string. #[cfg(feature = "span")] pub fn emit_to_string(&self, source: &str) -> String where E: Error, { self.emit_to_string_with_path(source, "wgsl") } /// Emits a summary of the error to a string. #[cfg(feature = "span")] pub fn emit_to_string_with_path(&self, source: &str, path: &str) -> String where E: Error, { use codespan_reporting::{files, term}; use term::termcolor::NoColor; let files = files::SimpleFile::new(path, source); let config = codespan_reporting::term::Config::default(); let mut writer = NoColor::new(Vec::new()); term::emit(&mut writer, &config, &files, &self.diagnostic()).expect("cannot write error"); String::from_utf8(writer.into_inner()).unwrap() } } /// Convenience trait for [`Error`] to be able to apply spans to anything. pub(crate) trait AddSpan: Sized { type Output; /// See [`WithSpan::new`]. fn with_span(self) -> Self::Output; /// See [`WithSpan::with_span`]. fn with_span_static(self, span: Span, description: &'static str) -> Self::Output; /// See [`WithSpan::with_context`]. fn with_span_context(self, span_context: SpanContext) -> Self::Output; /// See [`WithSpan::with_handle`]. fn with_span_handle>(self, handle: Handle, arena: &A) -> Self::Output; } /// Trait abstracting over getting a span from an [`Arena`] or a [`UniqueArena`]. pub(crate) trait SpanProvider { fn get_span(&self, handle: Handle) -> Span; fn get_span_context(&self, handle: Handle) -> SpanContext { match self.get_span(handle) { x if !x.is_defined() => (Default::default(), "".to_string()), known => ( known, format!("{} {:?}", std::any::type_name::(), handle), ), } } } impl SpanProvider for Arena { fn get_span(&self, handle: Handle) -> Span { self.get_span(handle) } } impl SpanProvider for UniqueArena { fn get_span(&self, handle: Handle) -> Span { self.get_span(handle) } } impl AddSpan for E where E: Error, { type Output = WithSpan; fn with_span(self) -> WithSpan { WithSpan::new(self) } fn with_span_static(self, span: Span, description: &'static str) -> WithSpan { WithSpan::new(self).with_span(span, description) } fn with_span_context(self, span_context: SpanContext) -> WithSpan { WithSpan::new(self).with_context(span_context) } fn with_span_handle>( self, handle: Handle, arena: &A, ) -> WithSpan { WithSpan::new(self).with_handle(handle, arena) } } /// Convenience trait for [`Result`], adding a [`MapErrWithSpan::map_err_inner`] /// mapping to [`WithSpan::and_then`]. pub trait MapErrWithSpan: Sized { type Output: Sized; fn map_err_inner(self, func: F) -> Self::Output where F: FnOnce(E) -> WithSpan, E2: From; } impl MapErrWithSpan for Result> { type Output = Result>; fn map_err_inner(self, func: F) -> Result> where F: FnOnce(E) -> WithSpan, E2: From, { self.map_err(|e| e.and_then(func).into_other::()) } } #[test] fn span_location() { let source = "12\n45\n\n89\n"; assert_eq!( Span { start: 0, end: 1 }.location(source), SourceLocation { line_number: 1, line_position: 1, offset: 0, length: 1 } ); assert_eq!( Span { start: 1, end: 2 }.location(source), SourceLocation { line_number: 1, line_position: 2, offset: 1, length: 1 } ); assert_eq!( Span { start: 2, end: 3 }.location(source), SourceLocation { line_number: 1, line_position: 3, offset: 2, length: 1 } ); assert_eq!( Span { start: 3, end: 5 }.location(source), SourceLocation { line_number: 2, line_position: 1, offset: 3, length: 2 } ); assert_eq!( Span { start: 4, end: 6 }.location(source), SourceLocation { line_number: 2, line_position: 2, offset: 4, length: 2 } ); assert_eq!( Span { start: 5, end: 6 }.location(source), SourceLocation { line_number: 2, line_position: 3, offset: 5, length: 1 } ); assert_eq!( Span { start: 6, end: 7 }.location(source), SourceLocation { line_number: 3, line_position: 1, offset: 6, length: 1 } ); assert_eq!( Span { start: 7, end: 8 }.location(source), SourceLocation { line_number: 4, line_position: 1, offset: 7, length: 1 } ); assert_eq!( Span { start: 8, end: 9 }.location(source), SourceLocation { line_number: 4, line_position: 2, offset: 8, length: 1 } ); assert_eq!( Span { start: 9, end: 10 }.location(source), SourceLocation { line_number: 4, line_position: 3, offset: 9, length: 1 } ); assert_eq!( Span { start: 10, end: 11 }.location(source), SourceLocation { line_number: 5, line_position: 1, offset: 10, length: 1 } ); } ================================================ FILE: lib/naga/src/valid/analyzer.rs ================================================ /*! Module analyzer. Figures out the following properties: - control flow uniformity - texture/sampler pairs - expression reference counts !*/ use super::{CallError, ExpressionError, FunctionError, ModuleInfo, ShaderStages, ValidationFlags}; use crate::span::{AddSpan as _, WithSpan}; use crate::{ arena::{Arena, Handle}, proc::{ResolveContext, ResolveError, TypeResolution}, }; use std::ops; pub type NonUniformResult = Option>; bitflags::bitflags! { /// Kinds of expressions that require uniform control flow. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct UniformityRequirements: u8 { const WORK_GROUP_BARRIER = 0x1; const DERIVATIVE = 0x2; const IMPLICIT_LEVEL = 0x4; } } /// Uniform control flow characteristics. #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr(test, derive(PartialEq))] pub struct Uniformity { /// A child expression with non-uniform result. /// /// This means, when the relevant invocations are scheduled on a compute unit, /// they have to use vector registers to store an individual value /// per invocation. /// /// Whenever the control flow is conditioned on such value, /// the hardware needs to keep track of the mask of invocations, /// and process all branches of the control flow. /// /// Any operations that depend on non-uniform results also produce non-uniform. pub non_uniform_result: NonUniformResult, /// If this expression requires uniform control flow, store the reason here. pub requirements: UniformityRequirements, } impl Uniformity { const fn new() -> Self { Uniformity { non_uniform_result: None, requirements: UniformityRequirements::empty(), } } } bitflags::bitflags! { struct ExitFlags: u8 { /// Control flow may return from the function, which makes all the /// subsequent statements within the current function (only!) /// to be executed in a non-uniform control flow. const MAY_RETURN = 0x1; /// Control flow may be killed. Anything after `Statement::Kill` is /// considered inside non-uniform context. const MAY_KILL = 0x2; } } /// Uniformity characteristics of a function. #[cfg_attr(test, derive(Debug, PartialEq))] struct FunctionUniformity { result: Uniformity, exit: ExitFlags, } impl ops::BitOr for FunctionUniformity { type Output = Self; fn bitor(self, other: Self) -> Self { FunctionUniformity { result: Uniformity { non_uniform_result: self .result .non_uniform_result .or(other.result.non_uniform_result), requirements: self.result.requirements | other.result.requirements, }, exit: self.exit | other.exit, } } } impl FunctionUniformity { const fn new() -> Self { FunctionUniformity { result: Uniformity::new(), exit: ExitFlags::empty(), } } /// Returns a disruptor based on the stored exit flags, if any. const fn exit_disruptor(&self) -> Option { if self.exit.contains(ExitFlags::MAY_RETURN) { Some(UniformityDisruptor::Return) } else if self.exit.contains(ExitFlags::MAY_KILL) { Some(UniformityDisruptor::Discard) } else { None } } } bitflags::bitflags! { /// Indicates how a global variable is used. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct GlobalUse: u8 { /// Data will be read from the variable. const READ = 0x1; /// Data will be written to the variable. const WRITE = 0x2; /// The information about the data is queried. const QUERY = 0x4; } } #[derive(Clone, Debug, Eq, Hash, PartialEq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct SamplingKey { pub image: Handle, pub sampler: Handle, } #[derive(Clone, Debug)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct ExpressionInfo { pub uniformity: Uniformity, pub ref_count: usize, assignable_global: Option>, pub ty: TypeResolution, } impl ExpressionInfo { const fn new() -> Self { ExpressionInfo { uniformity: Uniformity::new(), ref_count: 0, assignable_global: None, // this doesn't matter at this point, will be overwritten ty: TypeResolution::Value(crate::TypeInner::Scalar { kind: crate::ScalarKind::Bool, width: 0, }), } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] enum GlobalOrArgument { Global(Handle), Argument(u32), } impl GlobalOrArgument { fn from_expression( expression_arena: &Arena, expression: Handle, ) -> Result { Ok(match expression_arena[expression] { crate::Expression::GlobalVariable(var) => GlobalOrArgument::Global(var), crate::Expression::FunctionArgument(i) => GlobalOrArgument::Argument(i), crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => match expression_arena[base] { crate::Expression::GlobalVariable(var) => GlobalOrArgument::Global(var), _ => return Err(ExpressionError::ExpectedGlobalOrArgument), }, _ => return Err(ExpressionError::ExpectedGlobalOrArgument), }) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] struct Sampling { image: GlobalOrArgument, sampler: GlobalOrArgument, } #[derive(Debug)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct FunctionInfo { /// Validation flags. #[allow(dead_code)] flags: ValidationFlags, /// Set of shader stages where calling this function is valid. pub available_stages: ShaderStages, /// Uniformity characteristics. pub uniformity: Uniformity, /// Function may kill the invocation. pub may_kill: bool, /// All pairs of (texture, sampler) globals that may be used together in /// sampling operations by this function and its callees. This includes /// pairings that arise when this function passes textures and samplers as /// arguments to its callees. /// /// This table does not include uses of textures and samplers passed as /// arguments to this function itself, since we do not know which globals /// those will be. However, this table *is* exhaustive when computed for an /// entry point function: entry points never receive textures or samplers as /// arguments, so all an entry point's sampling can be reported in terms of /// globals. /// /// The GLSL back end uses this table to construct reflection info that /// clients need to construct texture-combined sampler values. pub sampling_set: crate::FastHashSet, /// How this function and its callees use this module's globals. /// /// This is indexed by `Handle` indices. However, /// `FunctionInfo` implements `std::ops::Index>`, /// so you can simply index this struct with a global handle to retrieve /// its usage information. global_uses: Box<[GlobalUse]>, /// Information about each expression in this function's body. /// /// This is indexed by `Handle` indices. However, `FunctionInfo` /// implements `std::ops::Index>`, so you can simply /// index this struct with an expression handle to retrieve its /// `ExpressionInfo`. expressions: Box<[ExpressionInfo]>, /// All (texture, sampler) pairs that may be used together in sampling /// operations by this function and its callees, whether they are accessed /// as globals or passed as arguments. /// /// Participants are represented by [`GlobalVariable`] handles whenever /// possible, and otherwise by indices of this function's arguments. /// /// When analyzing a function call, we combine this data about the callee /// with the actual arguments being passed to produce the callers' own /// `sampling_set` and `sampling` tables. /// /// [`GlobalVariable`]: crate::GlobalVariable sampling: crate::FastHashSet, } impl FunctionInfo { pub const fn global_variable_count(&self) -> usize { self.global_uses.len() } pub const fn expression_count(&self) -> usize { self.expressions.len() } pub fn dominates_global_use(&self, other: &Self) -> bool { for (self_global_uses, other_global_uses) in self.global_uses.iter().zip(other.global_uses.iter()) { if !self_global_uses.contains(*other_global_uses) { return false; } } true } } impl ops::Index> for FunctionInfo { type Output = GlobalUse; fn index(&self, handle: Handle) -> &GlobalUse { &self.global_uses[handle.index()] } } impl ops::Index> for FunctionInfo { type Output = ExpressionInfo; fn index(&self, handle: Handle) -> &ExpressionInfo { &self.expressions[handle.index()] } } /// Disruptor of the uniform control flow. #[derive(Clone, Copy, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum UniformityDisruptor { #[error("Expression {0:?} produced non-uniform result, and control flow depends on it")] Expression(Handle), #[error("There is a Return earlier in the control flow of the function")] Return, #[error("There is a Discard earlier in the entry point across all called functions")] Discard, } impl FunctionInfo { /// Adds a value-type reference to an expression. #[must_use] fn add_ref_impl( &mut self, handle: Handle, global_use: GlobalUse, ) -> NonUniformResult { //Note: if the expression doesn't exist, this function // will return `None`, but the later validation of // expressions should detect this and error properly. let info = self.expressions.get_mut(handle.index())?; info.ref_count += 1; // mark the used global as read if let Some(global) = info.assignable_global { self.global_uses[global.index()] |= global_use; } info.uniformity.non_uniform_result } /// Adds a value-type reference to an expression. #[must_use] fn add_ref(&mut self, handle: Handle) -> NonUniformResult { self.add_ref_impl(handle, GlobalUse::READ) } /// Adds a potentially assignable reference to an expression. /// These are destinations for `Store` and `ImageStore` statements, /// which can transit through `Access` and `AccessIndex`. #[must_use] fn add_assignable_ref( &mut self, handle: Handle, assignable_global: &mut Option>, ) -> NonUniformResult { //Note: similarly to `add_ref_impl`, this ignores invalid expressions. let info = self.expressions.get_mut(handle.index())?; info.ref_count += 1; // propagate the assignable global up the chain, till it either hits // a value-type expression, or the assignment statement. if let Some(global) = info.assignable_global { if let Some(_old) = assignable_global.replace(global) { unreachable!() } } info.uniformity.non_uniform_result } /// Inherit information from a called function. fn process_call( &mut self, callee: &Self, arguments: &[Handle], expression_arena: &Arena, ) -> Result> { self.sampling_set .extend(callee.sampling_set.iter().cloned()); for sampling in callee.sampling.iter() { // If the callee was passed the texture or sampler as an argument, // we may now be able to determine which globals those referred to. let image_storage = match sampling.image { GlobalOrArgument::Global(var) => GlobalOrArgument::Global(var), GlobalOrArgument::Argument(i) => { let handle = arguments[i as usize]; GlobalOrArgument::from_expression(expression_arena, handle).map_err( |error| { FunctionError::Expression { handle, error } .with_span_handle(handle, expression_arena) }, )? } }; let sampler_storage = match sampling.sampler { GlobalOrArgument::Global(var) => GlobalOrArgument::Global(var), GlobalOrArgument::Argument(i) => { let handle = arguments[i as usize]; GlobalOrArgument::from_expression(expression_arena, handle).map_err( |error| { FunctionError::Expression { handle, error } .with_span_handle(handle, expression_arena) }, )? } }; // If we've managed to pin both the image and sampler down to // specific globals, record that in our `sampling_set`. Otherwise, // record as much as we do know in our own `sampling` table, for our // callers to sort out. match (image_storage, sampler_storage) { (GlobalOrArgument::Global(image), GlobalOrArgument::Global(sampler)) => { self.sampling_set.insert(SamplingKey { image, sampler }); } (image, sampler) => { self.sampling.insert(Sampling { image, sampler }); } } } // Inherit global use from our callees. for (mine, other) in self.global_uses.iter_mut().zip(callee.global_uses.iter()) { *mine |= *other; } Ok(FunctionUniformity { result: callee.uniformity.clone(), exit: if callee.may_kill { ExitFlags::MAY_KILL } else { ExitFlags::empty() }, }) } /// Computes the expression info and stores it in `self.expressions`. /// Also, bumps the reference counts on dependent expressions. #[allow(clippy::or_fun_call)] fn process_expression( &mut self, handle: Handle, expression: &crate::Expression, expression_arena: &Arena, other_functions: &[FunctionInfo], resolve_context: &ResolveContext, capabilities: super::Capabilities, ) -> Result<(), ExpressionError> { use crate::{Expression as E, SampleLevel as Sl}; let mut assignable_global = None; let uniformity = match *expression { E::Access { base, index } => { let base_ty = self[base].ty.inner_with(resolve_context.types); // build up the caps needed if this is indexed non-uniformly let mut needed_caps = super::Capabilities::empty(); let is_binding_array = match *base_ty { crate::TypeInner::BindingArray { base: array_element_ty_handle, .. } => { // these are nasty aliases, but these idents are too long and break rustfmt let ub_st = super::Capabilities::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING; let st_sb = super::Capabilities::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING; let sampler = super::Capabilities::SAMPLER_NON_UNIFORM_INDEXING; // We're a binding array, so lets use the type of _what_ we are array of to determine if we can non-uniformly index it. let array_element_ty = &resolve_context.types[array_element_ty_handle].inner; needed_caps |= match *array_element_ty { // If we're an image, use the appropriate limit. crate::TypeInner::Image { class, .. } => match class { crate::ImageClass::Storage { .. } => ub_st, _ => st_sb, }, crate::TypeInner::Sampler { .. } => sampler, // If we're anything but an image, assume we're a buffer and use the address space. _ => { if let E::GlobalVariable(global_handle) = expression_arena[base] { let global = &resolve_context.global_vars[global_handle]; match global.space { crate::AddressSpace::Uniform => ub_st, crate::AddressSpace::Storage { .. } => st_sb, _ => unreachable!(), } } else { unreachable!() } } }; true } _ => false, }; if self[index].uniformity.non_uniform_result.is_some() && !capabilities.contains(needed_caps) && is_binding_array { return Err(ExpressionError::MissingCapabilities(needed_caps)); } Uniformity { non_uniform_result: self .add_assignable_ref(base, &mut assignable_global) .or(self.add_ref(index)), requirements: UniformityRequirements::empty(), } } E::AccessIndex { base, .. } => Uniformity { non_uniform_result: self.add_assignable_ref(base, &mut assignable_global), requirements: UniformityRequirements::empty(), }, // always uniform E::Constant(_) => Uniformity::new(), E::Splat { size: _, value } => Uniformity { non_uniform_result: self.add_ref(value), requirements: UniformityRequirements::empty(), }, E::Swizzle { vector, .. } => Uniformity { non_uniform_result: self.add_ref(vector), requirements: UniformityRequirements::empty(), }, E::Compose { ref components, .. } => { let non_uniform_result = components .iter() .fold(None, |nur, &comp| nur.or(self.add_ref(comp))); Uniformity { non_uniform_result, requirements: UniformityRequirements::empty(), } } // depends on the builtin or interpolation E::FunctionArgument(index) => { let arg = &resolve_context.arguments[index as usize]; let uniform = match arg.binding { Some(crate::Binding::BuiltIn(built_in)) => match built_in { // per-polygon built-ins are uniform crate::BuiltIn::FrontFacing // per-work-group built-ins are uniform | crate::BuiltIn::WorkGroupId | crate::BuiltIn::WorkGroupSize | crate::BuiltIn::NumWorkGroups => true, _ => false, }, // only flat inputs are uniform Some(crate::Binding::Location { interpolation: Some(crate::Interpolation::Flat), .. }) => true, _ => false, }; Uniformity { non_uniform_result: if uniform { None } else { Some(handle) }, requirements: UniformityRequirements::empty(), } } // depends on the address space E::GlobalVariable(gh) => { use crate::AddressSpace as As; assignable_global = Some(gh); let var = &resolve_context.global_vars[gh]; let uniform = match var.space { // local data is non-uniform As::Function | As::Private => false, // workgroup memory is exclusively accessed by the group As::WorkGroup => true, // uniform data As::Uniform | As::PushConstant => true, // storage data is only uniform when read-only As::Storage { access } => !access.contains(crate::StorageAccess::STORE), As::Handle => false, }; Uniformity { non_uniform_result: if uniform { None } else { Some(handle) }, requirements: UniformityRequirements::empty(), } } E::LocalVariable(_) => Uniformity { non_uniform_result: Some(handle), requirements: UniformityRequirements::empty(), }, E::Load { pointer } => Uniformity { non_uniform_result: self.add_ref(pointer), requirements: UniformityRequirements::empty(), }, E::ImageSample { image, sampler, gather: _, coordinate, array_index, offset: _, level, depth_ref, } => { let image_storage = GlobalOrArgument::from_expression(expression_arena, image)?; let sampler_storage = GlobalOrArgument::from_expression(expression_arena, sampler)?; match (image_storage, sampler_storage) { (GlobalOrArgument::Global(image), GlobalOrArgument::Global(sampler)) => { self.sampling_set.insert(SamplingKey { image, sampler }); } _ => { self.sampling.insert(Sampling { image: image_storage, sampler: sampler_storage, }); } } // "nur" == "Non-Uniform Result" let array_nur = array_index.and_then(|h| self.add_ref(h)); let level_nur = match level { Sl::Auto | Sl::Zero => None, Sl::Exact(h) | Sl::Bias(h) => self.add_ref(h), Sl::Gradient { x, y } => self.add_ref(x).or(self.add_ref(y)), }; let dref_nur = depth_ref.and_then(|h| self.add_ref(h)); Uniformity { non_uniform_result: self .add_ref(image) .or(self.add_ref(sampler)) .or(self.add_ref(coordinate)) .or(array_nur) .or(level_nur) .or(dref_nur), requirements: if level.implicit_derivatives() { UniformityRequirements::IMPLICIT_LEVEL } else { UniformityRequirements::empty() }, } } E::ImageLoad { image, coordinate, array_index, sample, level, } => { let array_nur = array_index.and_then(|h| self.add_ref(h)); let sample_nur = sample.and_then(|h| self.add_ref(h)); let level_nur = level.and_then(|h| self.add_ref(h)); Uniformity { non_uniform_result: self .add_ref(image) .or(self.add_ref(coordinate)) .or(array_nur) .or(sample_nur) .or(level_nur), requirements: UniformityRequirements::empty(), } } E::ImageQuery { image, query } => { let query_nur = match query { crate::ImageQuery::Size { level: Some(h) } => self.add_ref(h), _ => None, }; Uniformity { non_uniform_result: self.add_ref_impl(image, GlobalUse::QUERY).or(query_nur), requirements: UniformityRequirements::empty(), } } E::Unary { expr, .. } => Uniformity { non_uniform_result: self.add_ref(expr), requirements: UniformityRequirements::empty(), }, E::Binary { left, right, .. } => Uniformity { non_uniform_result: self.add_ref(left).or(self.add_ref(right)), requirements: UniformityRequirements::empty(), }, E::Select { condition, accept, reject, } => Uniformity { non_uniform_result: self .add_ref(condition) .or(self.add_ref(accept)) .or(self.add_ref(reject)), requirements: UniformityRequirements::empty(), }, // explicit derivatives require uniform E::Derivative { expr, .. } => Uniformity { //Note: taking a derivative of a uniform doesn't make it non-uniform non_uniform_result: self.add_ref(expr), requirements: UniformityRequirements::DERIVATIVE, }, E::Relational { argument, .. } => Uniformity { non_uniform_result: self.add_ref(argument), requirements: UniformityRequirements::empty(), }, E::Math { arg, arg1, arg2, .. } => { let arg1_nur = arg1.and_then(|h| self.add_ref(h)); let arg2_nur = arg2.and_then(|h| self.add_ref(h)); Uniformity { non_uniform_result: self.add_ref(arg).or(arg1_nur).or(arg2_nur), requirements: UniformityRequirements::empty(), } } E::As { expr, .. } => Uniformity { non_uniform_result: self.add_ref(expr), requirements: UniformityRequirements::empty(), }, E::CallResult(function) => { let info = other_functions .get(function.index()) .ok_or(ExpressionError::CallToUndeclaredFunction(function))?; info.uniformity.clone() } E::AtomicResult { .. } => Uniformity { non_uniform_result: Some(handle), requirements: UniformityRequirements::empty(), }, E::ArrayLength(expr) => Uniformity { non_uniform_result: self.add_ref_impl(expr, GlobalUse::QUERY), requirements: UniformityRequirements::empty(), }, }; let ty = resolve_context.resolve(expression, |h| { self.expressions .get(h.index()) .map(|ei| &ei.ty) .ok_or(ResolveError::ExpressionForwardDependency(h)) })?; self.expressions[handle.index()] = ExpressionInfo { uniformity, ref_count: 0, assignable_global, ty, }; Ok(()) } /// Analyzes the uniformity requirements of a block (as a sequence of statements). /// Returns the uniformity characteristics at the *function* level, i.e. /// whether or not the function requires to be called in uniform control flow, /// and whether the produced result is not disrupting the control flow. /// /// The parent control flow is uniform if `disruptor.is_none()`. /// /// Returns a `NonUniformControlFlow` error if any of the expressions in the block /// require uniformity, but the current flow is non-uniform. #[allow(clippy::or_fun_call)] fn process_block( &mut self, statements: &crate::Block, other_functions: &[FunctionInfo], mut disruptor: Option, expression_arena: &Arena, ) -> Result> { use crate::Statement as S; let mut combined_uniformity = FunctionUniformity::new(); for (statement, &span) in statements.span_iter() { let uniformity = match *statement { S::Emit(ref range) => { let mut requirements = UniformityRequirements::empty(); for expr in range.clone() { let req = match self.expressions.get(expr.index()) { Some(expr) => expr.uniformity.requirements, None => UniformityRequirements::empty(), }; #[cfg(feature = "validate")] if self .flags .contains(super::ValidationFlags::CONTROL_FLOW_UNIFORMITY) && !req.is_empty() { if let Some(cause) = disruptor { return Err(FunctionError::NonUniformControlFlow(req, expr, cause) .with_span_handle(expr, expression_arena)); } } requirements |= req; } FunctionUniformity { result: Uniformity { non_uniform_result: None, requirements, }, exit: ExitFlags::empty(), } } S::Break | S::Continue => FunctionUniformity::new(), S::Kill => FunctionUniformity { result: Uniformity::new(), exit: if disruptor.is_some() { ExitFlags::MAY_KILL } else { ExitFlags::empty() }, }, S::Barrier(_) => FunctionUniformity { result: Uniformity { non_uniform_result: None, requirements: UniformityRequirements::WORK_GROUP_BARRIER, }, exit: ExitFlags::empty(), }, S::Block(ref b) => { self.process_block(b, other_functions, disruptor, expression_arena)? } S::If { condition, ref accept, ref reject, } => { let condition_nur = self.add_ref(condition); let branch_disruptor = disruptor.or(condition_nur.map(UniformityDisruptor::Expression)); let accept_uniformity = self.process_block( accept, other_functions, branch_disruptor, expression_arena, )?; let reject_uniformity = self.process_block( reject, other_functions, branch_disruptor, expression_arena, )?; accept_uniformity | reject_uniformity } S::Switch { selector, ref cases, } => { let selector_nur = self.add_ref(selector); let branch_disruptor = disruptor.or(selector_nur.map(UniformityDisruptor::Expression)); let mut uniformity = FunctionUniformity::new(); let mut case_disruptor = branch_disruptor; for case in cases.iter() { let case_uniformity = self.process_block( &case.body, other_functions, case_disruptor, expression_arena, )?; case_disruptor = if case.fall_through { case_disruptor.or(case_uniformity.exit_disruptor()) } else { branch_disruptor }; uniformity = uniformity | case_uniformity; } uniformity } S::Loop { ref body, ref continuing, break_if: _, } => { let body_uniformity = self.process_block(body, other_functions, disruptor, expression_arena)?; let continuing_disruptor = disruptor.or(body_uniformity.exit_disruptor()); let continuing_uniformity = self.process_block( continuing, other_functions, continuing_disruptor, expression_arena, )?; body_uniformity | continuing_uniformity } S::Return { value } => FunctionUniformity { result: Uniformity { non_uniform_result: value.and_then(|expr| self.add_ref(expr)), requirements: UniformityRequirements::empty(), }, exit: if disruptor.is_some() { ExitFlags::MAY_RETURN } else { ExitFlags::empty() }, }, // Here and below, the used expressions are already emitted, // and their results do not affect the function return value, // so we can ignore their non-uniformity. S::Store { pointer, value } => { let _ = self.add_ref_impl(pointer, GlobalUse::WRITE); let _ = self.add_ref(value); FunctionUniformity::new() } S::ImageStore { image, coordinate, array_index, value, } => { let _ = self.add_ref_impl(image, GlobalUse::WRITE); if let Some(expr) = array_index { let _ = self.add_ref(expr); } let _ = self.add_ref(coordinate); let _ = self.add_ref(value); FunctionUniformity::new() } S::Call { function, ref arguments, result: _, } => { for &argument in arguments { let _ = self.add_ref(argument); } let info = other_functions.get(function.index()).ok_or( FunctionError::InvalidCall { function, error: CallError::ForwardDeclaredFunction, } .with_span_static(span, "forward call"), )?; //Note: the result is validated by the Validator, not here self.process_call(info, arguments, expression_arena)? } S::Atomic { pointer, ref fun, value, result: _, } => { let _ = self.add_ref_impl(pointer, GlobalUse::WRITE); let _ = self.add_ref(value); if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun { let _ = self.add_ref(cmp); } FunctionUniformity::new() } }; disruptor = disruptor.or(uniformity.exit_disruptor()); combined_uniformity = combined_uniformity | uniformity; } Ok(combined_uniformity) } } impl ModuleInfo { /// Builds the `FunctionInfo` based on the function, and validates the /// uniform control flow if required by the expressions of this function. pub(super) fn process_function( &self, fun: &crate::Function, module: &crate::Module, flags: ValidationFlags, capabilities: super::Capabilities, ) -> Result> { let mut info = FunctionInfo { flags, available_stages: ShaderStages::all(), uniformity: Uniformity::new(), may_kill: false, sampling_set: crate::FastHashSet::default(), global_uses: vec![GlobalUse::empty(); module.global_variables.len()].into_boxed_slice(), expressions: vec![ExpressionInfo::new(); fun.expressions.len()].into_boxed_slice(), sampling: crate::FastHashSet::default(), }; let resolve_context = ResolveContext { constants: &module.constants, types: &module.types, global_vars: &module.global_variables, local_vars: &fun.local_variables, functions: &module.functions, arguments: &fun.arguments, }; for (handle, expr) in fun.expressions.iter() { if let Err(error) = info.process_expression( handle, expr, &fun.expressions, &self.functions, &resolve_context, capabilities, ) { return Err(FunctionError::Expression { handle, error } .with_span_handle(handle, &fun.expressions)); } } let uniformity = info.process_block(&fun.body, &self.functions, None, &fun.expressions)?; info.uniformity = uniformity.result; info.may_kill = uniformity.exit.contains(ExitFlags::MAY_KILL); Ok(info) } pub fn get_entry_point(&self, index: usize) -> &FunctionInfo { &self.entry_points[index] } } #[test] #[cfg(feature = "validate")] fn uniform_control_flow() { use crate::{Expression as E, Statement as S}; let mut constant_arena = Arena::new(); let constant = constant_arena.append( crate::Constant { name: None, specialization: None, inner: crate::ConstantInner::Scalar { width: 4, value: crate::ScalarValue::Uint(0), }, }, Default::default(), ); let mut type_arena = crate::UniqueArena::new(); let ty = type_arena.insert( crate::Type { name: None, inner: crate::TypeInner::Vector { size: crate::VectorSize::Bi, kind: crate::ScalarKind::Float, width: 4, }, }, Default::default(), ); let mut global_var_arena = Arena::new(); let non_uniform_global = global_var_arena.append( crate::GlobalVariable { name: None, init: None, ty, space: crate::AddressSpace::Handle, binding: None, }, Default::default(), ); let uniform_global = global_var_arena.append( crate::GlobalVariable { name: None, init: None, ty, binding: None, space: crate::AddressSpace::Uniform, }, Default::default(), ); let mut expressions = Arena::new(); // checks the uniform control flow let constant_expr = expressions.append(E::Constant(constant), Default::default()); // checks the non-uniform control flow let derivative_expr = expressions.append( E::Derivative { axis: crate::DerivativeAxis::X, expr: constant_expr, }, Default::default(), ); let emit_range_constant_derivative = expressions.range_from(0); let non_uniform_global_expr = expressions.append(E::GlobalVariable(non_uniform_global), Default::default()); let uniform_global_expr = expressions.append(E::GlobalVariable(uniform_global), Default::default()); let emit_range_globals = expressions.range_from(2); // checks the QUERY flag let query_expr = expressions.append(E::ArrayLength(uniform_global_expr), Default::default()); // checks the transitive WRITE flag let access_expr = expressions.append( E::AccessIndex { base: non_uniform_global_expr, index: 1, }, Default::default(), ); let emit_range_query_access_globals = expressions.range_from(2); let mut info = FunctionInfo { flags: ValidationFlags::all(), available_stages: ShaderStages::all(), uniformity: Uniformity::new(), may_kill: false, sampling_set: crate::FastHashSet::default(), global_uses: vec![GlobalUse::empty(); global_var_arena.len()].into_boxed_slice(), expressions: vec![ExpressionInfo::new(); expressions.len()].into_boxed_slice(), sampling: crate::FastHashSet::default(), }; let resolve_context = ResolveContext { constants: &constant_arena, types: &type_arena, global_vars: &global_var_arena, local_vars: &Arena::new(), functions: &Arena::new(), arguments: &[], }; for (handle, expression) in expressions.iter() { info.process_expression( handle, expression, &expressions, &[], &resolve_context, super::Capabilities::empty(), ) .unwrap(); } assert_eq!(info[non_uniform_global_expr].ref_count, 1); assert_eq!(info[uniform_global_expr].ref_count, 1); assert_eq!(info[query_expr].ref_count, 0); assert_eq!(info[access_expr].ref_count, 0); assert_eq!(info[non_uniform_global], GlobalUse::empty()); assert_eq!(info[uniform_global], GlobalUse::QUERY); let stmt_emit1 = S::Emit(emit_range_globals.clone()); let stmt_if_uniform = S::If { condition: uniform_global_expr, accept: crate::Block::new(), reject: vec![ S::Emit(emit_range_constant_derivative.clone()), S::Store { pointer: constant_expr, value: derivative_expr, }, ] .into(), }; assert_eq!( info.process_block( &vec![stmt_emit1, stmt_if_uniform].into(), &[], None, &expressions ), Ok(FunctionUniformity { result: Uniformity { non_uniform_result: None, requirements: UniformityRequirements::DERIVATIVE, }, exit: ExitFlags::empty(), }), ); assert_eq!(info[constant_expr].ref_count, 2); assert_eq!(info[uniform_global], GlobalUse::READ | GlobalUse::QUERY); let stmt_emit2 = S::Emit(emit_range_globals.clone()); let stmt_if_non_uniform = S::If { condition: non_uniform_global_expr, accept: vec![ S::Emit(emit_range_constant_derivative), S::Store { pointer: constant_expr, value: derivative_expr, }, ] .into(), reject: crate::Block::new(), }; assert_eq!( info.process_block( &vec![stmt_emit2, stmt_if_non_uniform].into(), &[], None, &expressions ), Err(FunctionError::NonUniformControlFlow( UniformityRequirements::DERIVATIVE, derivative_expr, UniformityDisruptor::Expression(non_uniform_global_expr) ) .with_span()), ); assert_eq!(info[derivative_expr].ref_count, 1); assert_eq!(info[non_uniform_global], GlobalUse::READ); let stmt_emit3 = S::Emit(emit_range_globals); let stmt_return_non_uniform = S::Return { value: Some(non_uniform_global_expr), }; assert_eq!( info.process_block( &vec![stmt_emit3, stmt_return_non_uniform].into(), &[], Some(UniformityDisruptor::Return), &expressions ), Ok(FunctionUniformity { result: Uniformity { non_uniform_result: Some(non_uniform_global_expr), requirements: UniformityRequirements::empty(), }, exit: ExitFlags::MAY_RETURN, }), ); assert_eq!(info[non_uniform_global_expr].ref_count, 3); // Check that uniformity requirements reach through a pointer let stmt_emit4 = S::Emit(emit_range_query_access_globals); let stmt_assign = S::Store { pointer: access_expr, value: query_expr, }; let stmt_return_pointer = S::Return { value: Some(access_expr), }; let stmt_kill = S::Kill; assert_eq!( info.process_block( &vec![stmt_emit4, stmt_assign, stmt_kill, stmt_return_pointer].into(), &[], Some(UniformityDisruptor::Discard), &expressions ), Ok(FunctionUniformity { result: Uniformity { non_uniform_result: Some(non_uniform_global_expr), requirements: UniformityRequirements::empty(), }, exit: ExitFlags::all(), }), ); assert_eq!(info[non_uniform_global], GlobalUse::READ | GlobalUse::WRITE); } ================================================ FILE: lib/naga/src/valid/compose.rs ================================================ #[cfg(feature = "validate")] use crate::{ arena::{Arena, UniqueArena}, proc::TypeResolution, }; use crate::arena::{BadHandle, Handle}; #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum ComposeError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("Composing of type {0:?} can't be done")] Type(Handle), #[error("Composing expects {expected} components but {given} were given")] ComponentCount { given: u32, expected: u32 }, #[error("Composing {index}'s component type is not expected")] ComponentType { index: u32 }, } #[cfg(feature = "validate")] pub fn validate_compose( self_ty_handle: Handle, constant_arena: &Arena, type_arena: &UniqueArena, component_resolutions: impl ExactSizeIterator, ) -> Result<(), ComposeError> { use crate::TypeInner as Ti; let self_ty = type_arena.get_handle(self_ty_handle)?; match self_ty.inner { // vectors are composed from scalars or other vectors Ti::Vector { size, kind, width } => { let mut total = 0; for (index, comp_res) in component_resolutions.enumerate() { total += match *comp_res.inner_with(type_arena) { Ti::Scalar { kind: comp_kind, width: comp_width, } if comp_kind == kind && comp_width == width => 1, Ti::Vector { size: comp_size, kind: comp_kind, width: comp_width, } if comp_kind == kind && comp_width == width => comp_size as u32, ref other => { log::error!("Vector component[{}] type {:?}", index, other); return Err(ComposeError::ComponentType { index: index as u32, }); } }; } if size as u32 != total { return Err(ComposeError::ComponentCount { expected: size as u32, given: total, }); } } // matrix are composed from column vectors Ti::Matrix { columns, rows, width, } => { let inner = Ti::Vector { size: rows, kind: crate::ScalarKind::Float, width, }; if columns as usize != component_resolutions.len() { return Err(ComposeError::ComponentCount { expected: columns as u32, given: component_resolutions.len() as u32, }); } for (index, comp_res) in component_resolutions.enumerate() { if comp_res.inner_with(type_arena) != &inner { log::error!("Matrix component[{}] type {:?}", index, comp_res); return Err(ComposeError::ComponentType { index: index as u32, }); } } } Ti::Array { base, size: crate::ArraySize::Constant(handle), stride: _, } => { let count = constant_arena[handle].to_array_length().unwrap(); if count as usize != component_resolutions.len() { return Err(ComposeError::ComponentCount { expected: count, given: component_resolutions.len() as u32, }); } for (index, comp_res) in component_resolutions.enumerate() { let base_inner = &type_arena[base].inner; let comp_res_inner = comp_res.inner_with(type_arena); // We don't support arrays of pointers, but it seems best not to // embed that assumption here, so use `TypeInner::equivalent`. if !base_inner.equivalent(comp_res_inner, type_arena) { log::error!("Array component[{}] type {:?}", index, comp_res); return Err(ComposeError::ComponentType { index: index as u32, }); } } } Ti::Struct { ref members, .. } => { if members.len() != component_resolutions.len() { return Err(ComposeError::ComponentCount { given: component_resolutions.len() as u32, expected: members.len() as u32, }); } for (index, (member, comp_res)) in members.iter().zip(component_resolutions).enumerate() { let member_inner = &type_arena[member.ty].inner; let comp_res_inner = comp_res.inner_with(type_arena); // We don't support pointers in structs, but it seems best not to embed // that assumption here, so use `TypeInner::equivalent`. if !comp_res_inner.equivalent(member_inner, type_arena) { log::error!("Struct component[{}] type {:?}", index, comp_res); return Err(ComposeError::ComponentType { index: index as u32, }); } } } ref other => { log::error!("Composing of {:?}", other); return Err(ComposeError::Type(self_ty_handle)); } } Ok(()) } ================================================ FILE: lib/naga/src/valid/expression.rs ================================================ #[cfg(feature = "validate")] use super::{compose::validate_compose, FunctionInfo, ShaderStages, TypeFlags}; #[cfg(feature = "validate")] use crate::arena::UniqueArena; use crate::{ arena::{BadHandle, Handle}, proc::{IndexableLengthError, ResolveError}, }; #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum ExpressionError { #[error("Doesn't exist")] DoesntExist, #[error("Used by a statement before it was introduced into the scope by any of the dominating blocks")] NotInScope, #[error("Depends on {0:?}, which has not been processed yet")] ForwardDependency(Handle), #[error(transparent)] BadDependency(#[from] BadHandle), #[error("Base type {0:?} is not compatible with this expression")] InvalidBaseType(Handle), #[error("Accessing with index {0:?} can't be done")] InvalidIndexType(Handle), #[error("Accessing index {1:?} is out of {0:?} bounds")] IndexOutOfBounds(Handle, crate::ScalarValue), #[error("The expression {0:?} may only be indexed by a constant")] IndexMustBeConstant(Handle), #[error("Function argument {0:?} doesn't exist")] FunctionArgumentDoesntExist(u32), #[error("Loading of {0:?} can't be done")] InvalidPointerType(Handle), #[error("Array length of {0:?} can't be done")] InvalidArrayType(Handle), #[error("Splatting {0:?} can't be done")] InvalidSplatType(Handle), #[error("Swizzling {0:?} can't be done")] InvalidVectorType(Handle), #[error("Swizzle component {0:?} is outside of vector size {1:?}")] InvalidSwizzleComponent(crate::SwizzleComponent, crate::VectorSize), #[error(transparent)] Compose(#[from] super::ComposeError), #[error(transparent)] IndexableLength(#[from] IndexableLengthError), #[error("Operation {0:?} can't work with {1:?}")] InvalidUnaryOperandType(crate::UnaryOperator, Handle), #[error("Operation {0:?} can't work with {1:?} and {2:?}")] InvalidBinaryOperandTypes( crate::BinaryOperator, Handle, Handle, ), #[error("Selecting is not possible")] InvalidSelectTypes, #[error("Relational argument {0:?} is not a boolean vector")] InvalidBooleanVector(Handle), #[error("Relational argument {0:?} is not a float")] InvalidFloatArgument(Handle), #[error("Type resolution failed")] Type(#[from] ResolveError), #[error("Not a global variable")] ExpectedGlobalVariable, #[error("Not a global variable or a function argument")] ExpectedGlobalOrArgument, #[error("Calling an undeclared function {0:?}")] CallToUndeclaredFunction(Handle), #[error("Needs to be an binding array instead of {0:?}")] ExpectedBindingArrayType(Handle), #[error("Needs to be an image instead of {0:?}")] ExpectedImageType(Handle), #[error("Needs to be an image instead of {0:?}")] ExpectedSamplerType(Handle), #[error("Unable to operate on image class {0:?}")] InvalidImageClass(crate::ImageClass), #[error("Derivatives can only be taken from scalar and vector floats")] InvalidDerivative, #[error("Image array index parameter is misplaced")] InvalidImageArrayIndex, #[error("Inappropriate sample or level-of-detail index for texel access")] InvalidImageOtherIndex, #[error("Image array index type of {0:?} is not an integer scalar")] InvalidImageArrayIndexType(Handle), #[error("Image sample or level-of-detail index's type of {0:?} is not an integer scalar")] InvalidImageOtherIndexType(Handle), #[error("Image coordinate type of {1:?} does not match dimension {0:?}")] InvalidImageCoordinateType(crate::ImageDimension, Handle), #[error("Comparison sampling mismatch: image has class {image:?}, but the sampler is comparison={sampler}, and the reference was provided={has_ref}")] ComparisonSamplingMismatch { image: crate::ImageClass, sampler: bool, has_ref: bool, }, #[error("Sample offset constant {1:?} doesn't match the image dimension {0:?}")] InvalidSampleOffset(crate::ImageDimension, Handle), #[error("Depth reference {0:?} is not a scalar float")] InvalidDepthReference(Handle), #[error("Depth sample level can only be Auto or Zero")] InvalidDepthSampleLevel, #[error("Gather level can only be Zero")] InvalidGatherLevel, #[error("Gather component {0:?} doesn't exist in the image")] InvalidGatherComponent(crate::SwizzleComponent), #[error("Gather can't be done for image dimension {0:?}")] InvalidGatherDimension(crate::ImageDimension), #[error("Sample level (exact) type {0:?} is not a scalar float")] InvalidSampleLevelExactType(Handle), #[error("Sample level (bias) type {0:?} is not a scalar float")] InvalidSampleLevelBiasType(Handle), #[error("Sample level (gradient) of {1:?} doesn't match the image dimension {0:?}")] InvalidSampleLevelGradientType(crate::ImageDimension, Handle), #[error("Unable to cast")] InvalidCastArgument, #[error("Invalid argument count for {0:?}")] WrongArgumentCount(crate::MathFunction), #[error("Argument [{1}] to {0:?} as expression {2:?} has an invalid type.")] InvalidArgumentType(crate::MathFunction, u32, Handle), #[error("Atomic result type can't be {0:?} of {1} bytes")] InvalidAtomicResultType(crate::ScalarKind, crate::Bytes), #[error("Shader requires capability {0:?}")] MissingCapabilities(super::Capabilities), } #[cfg(feature = "validate")] struct ExpressionTypeResolver<'a> { root: Handle, types: &'a UniqueArena, info: &'a FunctionInfo, } #[cfg(feature = "validate")] impl<'a> ExpressionTypeResolver<'a> { fn resolve( &self, handle: Handle, ) -> Result<&'a crate::TypeInner, ExpressionError> { if handle < self.root { Ok(self.info[handle].ty.inner_with(self.types)) } else { Err(ExpressionError::ForwardDependency(handle)) } } } #[cfg(feature = "validate")] impl super::Validator { pub(super) fn validate_expression( &self, root: Handle, expression: &crate::Expression, function: &crate::Function, module: &crate::Module, info: &FunctionInfo, other_infos: &[FunctionInfo], ) -> Result { use crate::{Expression as E, ScalarKind as Sk, TypeInner as Ti}; let resolver = ExpressionTypeResolver { root, types: &module.types, info, }; let stages = match *expression { E::Access { base, index } => { let base_type = resolver.resolve(base)?; // See the documentation for `Expression::Access`. let dynamic_indexing_restricted = match *base_type { Ti::Vector { .. } => false, Ti::Matrix { .. } | Ti::Array { .. } => true, Ti::Pointer { .. } | Ti::ValuePointer { size: Some(_), .. } | Ti::BindingArray { .. } => false, ref other => { log::error!("Indexing of {:?}", other); return Err(ExpressionError::InvalidBaseType(base)); } }; match *resolver.resolve(index)? { //TODO: only allow one of these Ti::Scalar { kind: Sk::Sint | Sk::Uint, width: _, } => {} ref other => { log::error!("Indexing by {:?}", other); return Err(ExpressionError::InvalidIndexType(index)); } } if dynamic_indexing_restricted && function.expressions[index].is_dynamic_index(module) { return Err(ExpressionError::IndexMustBeConstant(base)); } // If we know both the length and the index, we can do the // bounds check now. if let crate::proc::IndexableLength::Known(known_length) = base_type.indexable_length(module)? { if let E::Constant(k) = function.expressions[index] { if let crate::Constant { // We must treat specializable constants as unknown. specialization: None, // Non-scalar indices should have been caught above. inner: crate::ConstantInner::Scalar { value, .. }, .. } = module.constants[k] { match value { crate::ScalarValue::Uint(u) if u >= known_length as u64 => { return Err(ExpressionError::IndexOutOfBounds(base, value)); } crate::ScalarValue::Sint(s) if s < 0 || s >= known_length as i64 => { return Err(ExpressionError::IndexOutOfBounds(base, value)); } _ => (), } } } } ShaderStages::all() } E::AccessIndex { base, index } => { fn resolve_index_limit( module: &crate::Module, top: Handle, ty: &crate::TypeInner, top_level: bool, ) -> Result { let limit = match *ty { Ti::Vector { size, .. } | Ti::ValuePointer { size: Some(size), .. } => size as u32, Ti::Matrix { columns, .. } => columns as u32, Ti::Array { size: crate::ArraySize::Constant(handle), .. } => module.constants[handle].to_array_length().unwrap(), Ti::Array { .. } | Ti::BindingArray { .. } => u32::MAX, // can't statically know, but need run-time checks Ti::Pointer { base, .. } if top_level => { resolve_index_limit(module, top, &module.types[base].inner, false)? } Ti::Struct { ref members, .. } => members.len() as u32, ref other => { log::error!("Indexing of {:?}", other); return Err(ExpressionError::InvalidBaseType(top)); } }; Ok(limit) } let limit = resolve_index_limit(module, base, resolver.resolve(base)?, true)?; if index >= limit { return Err(ExpressionError::IndexOutOfBounds( base, crate::ScalarValue::Uint(limit as _), )); } ShaderStages::all() } E::Constant(handle) => { let _ = module.constants.try_get(handle)?; ShaderStages::all() } E::Splat { size: _, value } => match *resolver.resolve(value)? { Ti::Scalar { .. } => ShaderStages::all(), ref other => { log::error!("Splat scalar type {:?}", other); return Err(ExpressionError::InvalidSplatType(value)); } }, E::Swizzle { size, vector, pattern, } => { let vec_size = match *resolver.resolve(vector)? { Ti::Vector { size: vec_size, .. } => vec_size, ref other => { log::error!("Swizzle vector type {:?}", other); return Err(ExpressionError::InvalidVectorType(vector)); } }; for &sc in pattern[..size as usize].iter() { if sc as u8 >= vec_size as u8 { return Err(ExpressionError::InvalidSwizzleComponent(sc, vec_size)); } } ShaderStages::all() } E::Compose { ref components, ty } => { for &handle in components { if handle >= root { return Err(ExpressionError::ForwardDependency(handle)); } } validate_compose( ty, &module.constants, &module.types, components.iter().map(|&handle| info[handle].ty.clone()), )?; ShaderStages::all() } E::FunctionArgument(index) => { if index >= function.arguments.len() as u32 { return Err(ExpressionError::FunctionArgumentDoesntExist(index)); } ShaderStages::all() } E::GlobalVariable(handle) => { let _ = module.global_variables.try_get(handle)?; ShaderStages::all() } E::LocalVariable(handle) => { let _ = function.local_variables.try_get(handle)?; ShaderStages::all() } E::Load { pointer } => { match *resolver.resolve(pointer)? { Ti::Pointer { base, .. } if self.types[base.index()] .flags .contains(TypeFlags::SIZED | TypeFlags::DATA) => {} Ti::ValuePointer { .. } => {} ref other => { log::error!("Loading {:?}", other); return Err(ExpressionError::InvalidPointerType(pointer)); } } ShaderStages::all() } E::ImageSample { image, sampler, gather, coordinate, array_index, offset, level, depth_ref, } => { // check the validity of expressions let image_ty = match function.expressions[image] { crate::Expression::GlobalVariable(var_handle) => { module.global_variables[var_handle].ty } crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty, crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { match function.expressions[base] { crate::Expression::GlobalVariable(var_handle) => { let array_ty = module.global_variables[var_handle].ty; match module.types[array_ty].inner { Ti::BindingArray { base, .. } => base, _ => { return Err(ExpressionError::ExpectedBindingArrayType( array_ty, )) } } } _ => return Err(ExpressionError::ExpectedGlobalVariable), } } _ => return Err(ExpressionError::ExpectedGlobalVariable), }; let sampler_ty = match function.expressions[sampler] { crate::Expression::GlobalVariable(var_handle) => { module.global_variables[var_handle].ty } crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty, crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { match function.expressions[base] { crate::Expression::GlobalVariable(var_handle) => { let array_ty = module.global_variables[var_handle].ty; match module.types[array_ty].inner { Ti::BindingArray { base, .. } => base, _ => { return Err(ExpressionError::ExpectedBindingArrayType( array_ty, )) } } } _ => return Err(ExpressionError::ExpectedGlobalVariable), } } _ => return Err(ExpressionError::ExpectedGlobalVariable), }; let comparison = match module.types[sampler_ty].inner { Ti::Sampler { comparison } => comparison, _ => return Err(ExpressionError::ExpectedSamplerType(sampler_ty)), }; let (class, dim) = match module.types[image_ty].inner { Ti::Image { class, arrayed, dim, } => { // check the array property if arrayed != array_index.is_some() { return Err(ExpressionError::InvalidImageArrayIndex); } if let Some(expr) = array_index { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Sint, width: _, } => {} _ => return Err(ExpressionError::InvalidImageArrayIndexType(expr)), } } (class, dim) } _ => return Err(ExpressionError::ExpectedImageType(image_ty)), }; // check sampling and comparison properties let image_depth = match class { crate::ImageClass::Sampled { kind: crate::ScalarKind::Float, multi: false, } => false, crate::ImageClass::Depth { multi: false } => true, _ => return Err(ExpressionError::InvalidImageClass(class)), }; if comparison != depth_ref.is_some() || (comparison && !image_depth) { return Err(ExpressionError::ComparisonSamplingMismatch { image: class, sampler: comparison, has_ref: depth_ref.is_some(), }); } // check texture coordinates type let num_components = match dim { crate::ImageDimension::D1 => 1, crate::ImageDimension::D2 => 2, crate::ImageDimension::D3 | crate::ImageDimension::Cube => 3, }; match *resolver.resolve(coordinate)? { Ti::Scalar { kind: Sk::Float, .. } if num_components == 1 => {} Ti::Vector { size, kind: Sk::Float, .. } if size as u32 == num_components => {} _ => return Err(ExpressionError::InvalidImageCoordinateType(dim, coordinate)), } // check constant offset if let Some(const_handle) = offset { let good = match module.constants[const_handle].inner { crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Sint(_), } => num_components == 1, crate::ConstantInner::Scalar { .. } => false, crate::ConstantInner::Composite { ty, .. } => { match module.types[ty].inner { Ti::Vector { size, kind: Sk::Sint, .. } => size as u32 == num_components, _ => false, } } }; if !good { return Err(ExpressionError::InvalidSampleOffset(dim, const_handle)); } } // check depth reference type if let Some(expr) = depth_ref { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidDepthReference(expr)), } match level { crate::SampleLevel::Auto | crate::SampleLevel::Zero => {} _ => return Err(ExpressionError::InvalidDepthSampleLevel), } } if let Some(component) = gather { match dim { crate::ImageDimension::D2 | crate::ImageDimension::Cube => {} crate::ImageDimension::D1 | crate::ImageDimension::D3 => { return Err(ExpressionError::InvalidGatherDimension(dim)) } }; let max_component = match class { crate::ImageClass::Depth { .. } => crate::SwizzleComponent::X, _ => crate::SwizzleComponent::W, }; if component > max_component { return Err(ExpressionError::InvalidGatherComponent(component)); } match level { crate::SampleLevel::Zero => {} _ => return Err(ExpressionError::InvalidGatherLevel), } } // check level properties match level { crate::SampleLevel::Auto => ShaderStages::FRAGMENT, crate::SampleLevel::Zero => ShaderStages::all(), crate::SampleLevel::Exact(expr) => { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidSampleLevelExactType(expr)), } ShaderStages::all() } crate::SampleLevel::Bias(expr) => { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidSampleLevelBiasType(expr)), } ShaderStages::all() } crate::SampleLevel::Gradient { x, y } => { match *resolver.resolve(x)? { Ti::Scalar { kind: Sk::Float, .. } if num_components == 1 => {} Ti::Vector { size, kind: Sk::Float, .. } if size as u32 == num_components => {} _ => { return Err(ExpressionError::InvalidSampleLevelGradientType(dim, x)) } } match *resolver.resolve(y)? { Ti::Scalar { kind: Sk::Float, .. } if num_components == 1 => {} Ti::Vector { size, kind: Sk::Float, .. } if size as u32 == num_components => {} _ => { return Err(ExpressionError::InvalidSampleLevelGradientType(dim, y)) } } ShaderStages::all() } } } E::ImageLoad { image, coordinate, array_index, sample, level, } => { let ty = match function.expressions[image] { crate::Expression::GlobalVariable(var_handle) => { module.global_variables[var_handle].ty } crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty, crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { match function.expressions[base] { crate::Expression::GlobalVariable(var_handle) => { let array_ty = module.global_variables[var_handle].ty; match module.types[array_ty].inner { Ti::BindingArray { base, .. } => base, _ => { return Err(ExpressionError::ExpectedBindingArrayType( array_ty, )) } } } _ => return Err(ExpressionError::ExpectedGlobalVariable), } } _ => return Err(ExpressionError::ExpectedGlobalVariable), }; match module.types[ty].inner { Ti::Image { class, arrayed, dim, } => { match resolver.resolve(coordinate)?.image_storage_coordinates() { Some(coord_dim) if coord_dim == dim => {} _ => { return Err(ExpressionError::InvalidImageCoordinateType( dim, coordinate, )) } }; if arrayed != array_index.is_some() { return Err(ExpressionError::InvalidImageArrayIndex); } if let Some(expr) = array_index { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Sint, width: _, } => {} _ => return Err(ExpressionError::InvalidImageArrayIndexType(expr)), } } match (sample, class.is_multisampled()) { (None, false) => {} (Some(sample), true) => { if resolver.resolve(sample)?.scalar_kind() != Some(Sk::Sint) { return Err(ExpressionError::InvalidImageOtherIndexType( sample, )); } } _ => { return Err(ExpressionError::InvalidImageOtherIndex); } } match (level, class.is_mipmapped()) { (None, false) => {} (Some(level), true) => { if resolver.resolve(level)?.scalar_kind() != Some(Sk::Sint) { return Err(ExpressionError::InvalidImageOtherIndexType(level)); } } _ => { return Err(ExpressionError::InvalidImageOtherIndex); } } } _ => return Err(ExpressionError::ExpectedImageType(ty)), } ShaderStages::all() } E::ImageQuery { image, query } => { let ty = match function.expressions[image] { crate::Expression::GlobalVariable(var_handle) => { module.global_variables[var_handle].ty } crate::Expression::FunctionArgument(i) => function.arguments[i as usize].ty, crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { match function.expressions[base] { crate::Expression::GlobalVariable(var_handle) => { let array_ty = module.global_variables[var_handle].ty; match module.types[array_ty].inner { Ti::BindingArray { base, .. } => base, _ => { return Err(ExpressionError::ExpectedBindingArrayType( array_ty, )) } } } _ => return Err(ExpressionError::ExpectedGlobalVariable), } } _ => return Err(ExpressionError::ExpectedGlobalVariable), }; match module.types[ty].inner { Ti::Image { class, arrayed, .. } => { let good = match query { crate::ImageQuery::NumLayers => arrayed, crate::ImageQuery::Size { level: None } => true, crate::ImageQuery::Size { level: Some(_) } | crate::ImageQuery::NumLevels => class.is_mipmapped(), crate::ImageQuery::NumSamples => class.is_multisampled(), }; if !good { return Err(ExpressionError::InvalidImageClass(class)); } } _ => return Err(ExpressionError::ExpectedImageType(ty)), } ShaderStages::all() } E::Unary { op, expr } => { use crate::UnaryOperator as Uo; let inner = resolver.resolve(expr)?; match (op, inner.scalar_kind()) { (_, Some(Sk::Sint | Sk::Bool)) //TODO: restrict Negate for bools? | (Uo::Negate, Some(Sk::Float)) | (Uo::Not, Some(Sk::Uint)) => {} other => { log::error!("Op {:?} kind {:?}", op, other); return Err(ExpressionError::InvalidUnaryOperandType(op, expr)); } } ShaderStages::all() } E::Binary { op, left, right } => { use crate::BinaryOperator as Bo; let left_inner = resolver.resolve(left)?; let right_inner = resolver.resolve(right)?; let good = match op { Bo::Add | Bo::Subtract => match *left_inner { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind { Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner, Sk::Bool => false, }, Ti::Matrix { .. } => left_inner == right_inner, _ => false, }, Bo::Divide | Bo::Modulo => match *left_inner { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind { Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner, Sk::Bool => false, }, _ => false, }, Bo::Multiply => { let kind_allowed = match left_inner.scalar_kind() { Some(Sk::Uint | Sk::Sint | Sk::Float) => true, Some(Sk::Bool) | None => false, }; let types_match = match (left_inner, right_inner) { // Straight scalar and mixed scalar/vector. (&Ti::Scalar { kind: kind1, .. }, &Ti::Scalar { kind: kind2, .. }) | (&Ti::Vector { kind: kind1, .. }, &Ti::Scalar { kind: kind2, .. }) | (&Ti::Scalar { kind: kind1, .. }, &Ti::Vector { kind: kind2, .. }) => { kind1 == kind2 } // Scalar/matrix. ( &Ti::Scalar { kind: Sk::Float, .. }, &Ti::Matrix { .. }, ) | ( &Ti::Matrix { .. }, &Ti::Scalar { kind: Sk::Float, .. }, ) => true, // Vector/vector. ( &Ti::Vector { kind: kind1, size: size1, .. }, &Ti::Vector { kind: kind2, size: size2, .. }, ) => kind1 == kind2 && size1 == size2, // Matrix * vector. ( &Ti::Matrix { columns, .. }, &Ti::Vector { kind: Sk::Float, size, .. }, ) => columns == size, // Vector * matrix. ( &Ti::Vector { kind: Sk::Float, size, .. }, &Ti::Matrix { rows, .. }, ) => size == rows, (&Ti::Matrix { columns, .. }, &Ti::Matrix { rows, .. }) => { columns == rows } _ => false, }; let left_width = match *left_inner { Ti::Scalar { width, .. } | Ti::Vector { width, .. } | Ti::Matrix { width, .. } => width, _ => 0, }; let right_width = match *right_inner { Ti::Scalar { width, .. } | Ti::Vector { width, .. } | Ti::Matrix { width, .. } => width, _ => 0, }; kind_allowed && types_match && left_width == right_width } Bo::Equal | Bo::NotEqual => left_inner.is_sized() && left_inner == right_inner, Bo::Less | Bo::LessEqual | Bo::Greater | Bo::GreaterEqual => { match *left_inner { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind { Sk::Uint | Sk::Sint | Sk::Float => left_inner == right_inner, Sk::Bool => false, }, ref other => { log::error!("Op {:?} left type {:?}", op, other); false } } } Bo::LogicalAnd | Bo::LogicalOr => match *left_inner { Ti::Scalar { kind: Sk::Bool, .. } | Ti::Vector { kind: Sk::Bool, .. } => { left_inner == right_inner } ref other => { log::error!("Op {:?} left type {:?}", op, other); false } }, Bo::And | Bo::InclusiveOr => match *left_inner { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind { Sk::Bool | Sk::Sint | Sk::Uint => left_inner == right_inner, Sk::Float => false, }, ref other => { log::error!("Op {:?} left type {:?}", op, other); false } }, Bo::ExclusiveOr => match *left_inner { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => match kind { Sk::Sint | Sk::Uint => left_inner == right_inner, Sk::Bool | Sk::Float => false, }, ref other => { log::error!("Op {:?} left type {:?}", op, other); false } }, Bo::ShiftLeft | Bo::ShiftRight => { let (base_size, base_kind) = match *left_inner { Ti::Scalar { kind, .. } => (Ok(None), kind), Ti::Vector { size, kind, .. } => (Ok(Some(size)), kind), ref other => { log::error!("Op {:?} base type {:?}", op, other); (Err(()), Sk::Bool) } }; let shift_size = match *right_inner { Ti::Scalar { kind: Sk::Uint, .. } => Ok(None), Ti::Vector { size, kind: Sk::Uint, .. } => Ok(Some(size)), ref other => { log::error!("Op {:?} shift type {:?}", op, other); Err(()) } }; match base_kind { Sk::Sint | Sk::Uint => base_size.is_ok() && base_size == shift_size, Sk::Float | Sk::Bool => false, } } }; if !good { log::error!( "Left: {:?} of type {:?}", function.expressions[left], left_inner ); log::error!( "Right: {:?} of type {:?}", function.expressions[right], right_inner ); return Err(ExpressionError::InvalidBinaryOperandTypes(op, left, right)); } ShaderStages::all() } E::Select { condition, accept, reject, } => { let accept_inner = resolver.resolve(accept)?; let reject_inner = resolver.resolve(reject)?; let condition_good = match *resolver.resolve(condition)? { Ti::Scalar { kind: Sk::Bool, width: _, } => { // When `condition` is a single boolean, `accept` and // `reject` can be vectors or scalars. match *accept_inner { Ti::Scalar { .. } | Ti::Vector { .. } => true, _ => false, } } Ti::Vector { size, kind: Sk::Bool, width: _, } => match *accept_inner { Ti::Vector { size: other_size, .. } => size == other_size, _ => false, }, _ => false, }; if !condition_good || accept_inner != reject_inner { return Err(ExpressionError::InvalidSelectTypes); } ShaderStages::all() } E::Derivative { axis: _, expr } => { match *resolver.resolve(expr)? { Ti::Scalar { kind: Sk::Float, .. } | Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidDerivative), } ShaderStages::FRAGMENT } E::Relational { fun, argument } => { use crate::RelationalFunction as Rf; let argument_inner = resolver.resolve(argument)?; match fun { Rf::All | Rf::Any => match *argument_inner { Ti::Vector { kind: Sk::Bool, .. } => {} ref other => { log::error!("All/Any of type {:?}", other); return Err(ExpressionError::InvalidBooleanVector(argument)); } }, Rf::IsNan | Rf::IsInf | Rf::IsFinite | Rf::IsNormal => match *argument_inner { Ti::Scalar { kind: Sk::Float, .. } | Ti::Vector { kind: Sk::Float, .. } => {} ref other => { log::error!("Float test of type {:?}", other); return Err(ExpressionError::InvalidFloatArgument(argument)); } }, } ShaderStages::all() } E::Math { fun, arg, arg1, arg2, arg3, } => { use crate::MathFunction as Mf; let arg_ty = resolver.resolve(arg)?; let arg1_ty = arg1.map(|expr| resolver.resolve(expr)).transpose()?; let arg2_ty = arg2.map(|expr| resolver.resolve(expr)).transpose()?; let arg3_ty = arg3.map(|expr| resolver.resolve(expr)).transpose()?; match fun { Mf::Abs => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } let good = match *arg_ty { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool, _ => false, }; if !good { return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)); } } Mf::Min | Mf::Max => { let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), None, None) => ty1, _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; let good = match *arg_ty { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool, _ => false, }; if !good { return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)); } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } } Mf::Clamp => { let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), None) => (ty1, ty2), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; let good = match *arg_ty { Ti::Scalar { kind, .. } | Ti::Vector { kind, .. } => kind != Sk::Bool, _ => false, }; if !good { return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)); } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } if arg2_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )); } } Mf::Saturate | Mf::Cos | Mf::Cosh | Mf::Sin | Mf::Sinh | Mf::Tan | Mf::Tanh | Mf::Acos | Mf::Asin | Mf::Atan | Mf::Asinh | Mf::Acosh | Mf::Atanh | Mf::Radians | Mf::Degrees | Mf::Ceil | Mf::Floor | Mf::Round | Mf::Fract | Mf::Trunc | Mf::Exp | Mf::Exp2 | Mf::Log | Mf::Log2 | Mf::Length | Mf::Sign | Mf::Sqrt | Mf::InverseSqrt => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Scalar { kind: Sk::Float, .. } | Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::Atan2 | Mf::Pow | Mf::Distance | Mf::Step => { let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), None, None) => ty1, _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Scalar { kind: Sk::Float, .. } | Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } } Mf::Modf | Mf::Frexp | Mf::Ldexp => { let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), None, None) => ty1, _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; let (size0, width0) = match *arg_ty { Ti::Scalar { kind: Sk::Float, width, } => (None, width), Ti::Vector { kind: Sk::Float, size, width, } => (Some(size), width), _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), }; let good = match *arg1_ty { Ti::Pointer { base, space: _ } => module.types[base].inner == *arg_ty, Ti::ValuePointer { size, kind: Sk::Float, width, space: _, } => size == size0 && width == width0, _ => false, }; if !good { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } } Mf::Dot => { let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), None, None) => ty1, _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Vector { kind: Sk::Float | Sk::Sint | Sk::Uint, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } } Mf::Outer | Mf::Cross | Mf::Reflect => { let arg1_ty = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), None, None) => ty1, _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } } Mf::Refract => { let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), None) => (ty1, ty2), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } match (arg_ty, arg2_ty) { ( &Ti::Vector { width: vector_width, .. }, &Ti::Scalar { width: scalar_width, kind: Sk::Float, }, ) if vector_width == scalar_width => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )) } } } Mf::Normalize => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::FaceForward | Mf::Fma | Mf::SmoothStep => { let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), None) => (ty1, ty2), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Scalar { kind: Sk::Float, .. } | Ti::Vector { kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } if arg2_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )); } } Mf::Mix => { let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), None) => (ty1, ty2), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; let arg_width = match *arg_ty { Ti::Scalar { kind: Sk::Float, width, } | Ti::Vector { kind: Sk::Float, width, .. } => width, _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), }; if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } // the last argument can always be a scalar match *arg2_ty { Ti::Scalar { kind: Sk::Float, width, } if width == arg_width => {} _ if arg2_ty == arg_ty => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )); } } } Mf::Inverse | Mf::Determinant => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } let good = match *arg_ty { Ti::Matrix { columns, rows, .. } => columns == rows, _ => false, }; if !good { return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)); } } Mf::Transpose => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Matrix { .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::CountOneBits | Mf::ReverseBits | Mf::FindLsb | Mf::FindMsb => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Scalar { kind: Sk::Sint | Sk::Uint, .. } | Ti::Vector { kind: Sk::Sint | Sk::Uint, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::InsertBits => { let (arg1_ty, arg2_ty, arg3_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), Some(ty3)) => (ty1, ty2, ty3), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Scalar { kind: Sk::Sint | Sk::Uint, .. } | Ti::Vector { kind: Sk::Sint | Sk::Uint, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } if arg1_ty != arg_ty { return Err(ExpressionError::InvalidArgumentType( fun, 1, arg1.unwrap(), )); } match *arg2_ty { Ti::Scalar { kind: Sk::Uint, .. } => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )) } } match *arg3_ty { Ti::Scalar { kind: Sk::Uint, .. } => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg3.unwrap(), )) } } } Mf::ExtractBits => { let (arg1_ty, arg2_ty) = match (arg1_ty, arg2_ty, arg3_ty) { (Some(ty1), Some(ty2), None) => (ty1, ty2), _ => return Err(ExpressionError::WrongArgumentCount(fun)), }; match *arg_ty { Ti::Scalar { kind: Sk::Sint | Sk::Uint, .. } | Ti::Vector { kind: Sk::Sint | Sk::Uint, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } match *arg1_ty { Ti::Scalar { kind: Sk::Uint, .. } => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg1.unwrap(), )) } } match *arg2_ty { Ti::Scalar { kind: Sk::Uint, .. } => {} _ => { return Err(ExpressionError::InvalidArgumentType( fun, 2, arg2.unwrap(), )) } } } Mf::Pack2x16unorm | Mf::Pack2x16snorm | Mf::Pack2x16float => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Vector { size: crate::VectorSize::Bi, kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::Pack4x8snorm | Mf::Pack4x8unorm => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Vector { size: crate::VectorSize::Quad, kind: Sk::Float, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } Mf::Unpack2x16float | Mf::Unpack2x16snorm | Mf::Unpack2x16unorm | Mf::Unpack4x8snorm | Mf::Unpack4x8unorm => { if arg1_ty.is_some() | arg2_ty.is_some() | arg3_ty.is_some() { return Err(ExpressionError::WrongArgumentCount(fun)); } match *arg_ty { Ti::Scalar { kind: Sk::Uint, .. } => {} _ => return Err(ExpressionError::InvalidArgumentType(fun, 0, arg)), } } } ShaderStages::all() } E::As { expr, kind, convert, } => { let base_width = match *resolver.resolve(expr)? { crate::TypeInner::Scalar { width, .. } | crate::TypeInner::Vector { width, .. } | crate::TypeInner::Matrix { width, .. } => width, _ => return Err(ExpressionError::InvalidCastArgument), }; let width = convert.unwrap_or(base_width); if !self.check_width(kind, width) { return Err(ExpressionError::InvalidCastArgument); } ShaderStages::all() } E::CallResult(function) => other_infos[function.index()].available_stages, E::AtomicResult { kind, width, comparison: _, } => { let good = match kind { crate::ScalarKind::Uint | crate::ScalarKind::Sint => { self.check_width(kind, width) } _ => false, }; if !good { return Err(ExpressionError::InvalidAtomicResultType(kind, width)); } ShaderStages::all() } E::ArrayLength(expr) => match *resolver.resolve(expr)? { Ti::Pointer { base, .. } => { let base_ty = resolver.types.get_handle(base)?; if let Ti::Array { size: crate::ArraySize::Dynamic, .. } = base_ty.inner { ShaderStages::all() } else { return Err(ExpressionError::InvalidArrayType(expr)); } } ref other => { log::error!("Array length of {:?}", other); return Err(ExpressionError::InvalidArrayType(expr)); } }, }; Ok(stages) } } ================================================ FILE: lib/naga/src/valid/function.rs ================================================ #[cfg(feature = "validate")] use crate::arena::{Arena, UniqueArena}; use crate::arena::{BadHandle, Handle}; use super::{ analyzer::{UniformityDisruptor, UniformityRequirements}, ExpressionError, FunctionInfo, ModuleInfo, }; use crate::span::WithSpan; #[cfg(feature = "validate")] use crate::span::{AddSpan as _, MapErrWithSpan as _}; #[cfg(feature = "validate")] use bit_set::BitSet; #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum CallError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("The callee is declared after the caller")] ForwardDeclaredFunction, #[error("Argument {index} expression is invalid")] Argument { index: usize, #[source] error: ExpressionError, }, #[error("Result expression {0:?} has already been introduced earlier")] ResultAlreadyInScope(Handle), #[error("Result value is invalid")] ResultValue(#[source] ExpressionError), #[error("Requires {required} arguments, but {seen} are provided")] ArgumentCount { required: usize, seen: usize }, #[error("Argument {index} value {seen_expression:?} doesn't match the type {required:?}")] ArgumentType { index: usize, required: Handle, seen_expression: Handle, }, #[error("The emitted expression doesn't match the call")] ExpressionMismatch(Option>), } #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum AtomicError { #[error("Pointer {0:?} to atomic is invalid.")] InvalidPointer(Handle), #[error("Operand {0:?} has invalid type.")] InvalidOperand(Handle), #[error("Result expression {0:?} has already been introduced earlier")] ResultAlreadyInScope(Handle), #[error("Result type for {0:?} doesn't match the statement")] ResultTypeMismatch(Handle), } #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum LocalVariableError { #[error("Local variable has a type {0:?} that can't be stored in a local variable.")] InvalidType(Handle), #[error("Initializer doesn't match the variable type")] InitializerType, } #[derive(Clone, Debug, thiserror::Error)] #[cfg_attr(test, derive(PartialEq))] pub enum FunctionError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("Expression {handle:?} is invalid")] Expression { handle: Handle, #[source] error: ExpressionError, }, #[error("Expression {0:?} can't be introduced - it's already in scope")] ExpressionAlreadyInScope(Handle), #[error("Local variable {handle:?} '{name}' is invalid")] LocalVariable { handle: Handle, name: String, #[source] error: LocalVariableError, }, #[error("Argument '{name}' at index {index} has a type that can't be passed into functions.")] InvalidArgumentType { index: usize, name: String }, #[error("The function's given return type cannot be returned from functions")] NonConstructibleReturnType, #[error("Argument '{name}' at index {index} is a pointer of space {space:?}, which can't be passed into functions.")] InvalidArgumentPointerSpace { index: usize, name: String, space: crate::AddressSpace, }, #[error("There are instructions after `return`/`break`/`continue`")] InstructionsAfterReturn, #[error("The `break` is used outside of a `loop` or `switch` context")] BreakOutsideOfLoopOrSwitch, #[error("The `continue` is used outside of a `loop` context")] ContinueOutsideOfLoop, #[error("The `return` is called within a `continuing` block")] InvalidReturnSpot, #[error("The `return` value {0:?} does not match the function return value")] InvalidReturnType(Option>), #[error("The `if` condition {0:?} is not a boolean scalar")] InvalidIfType(Handle), #[error("The `switch` value {0:?} is not an integer scalar")] InvalidSwitchType(Handle), #[error("Multiple `switch` cases for {0:?} are present")] ConflictingSwitchCase(i32), #[error("The `switch` is missing a `default` case")] MissingDefaultCase, #[error("Multiple `default` cases are present")] MultipleDefaultCases, #[error("The last `switch` case contains a `falltrough`")] LastCaseFallTrough, #[error("The pointer {0:?} doesn't relate to a valid destination for a store")] InvalidStorePointer(Handle), #[error("The value {0:?} can not be stored")] InvalidStoreValue(Handle), #[error("Store of {value:?} into {pointer:?} doesn't have matching types")] InvalidStoreTypes { pointer: Handle, value: Handle, }, #[error("Image store parameters are invalid")] InvalidImageStore(#[source] ExpressionError), #[error("Call to {function:?} is invalid")] InvalidCall { function: Handle, #[source] error: CallError, }, #[error("Atomic operation is invalid")] InvalidAtomic(#[from] AtomicError), #[error( "Required uniformity of control flow for {0:?} in {1:?} is not fulfilled because of {2:?}" )] NonUniformControlFlow( UniformityRequirements, Handle, UniformityDisruptor, ), #[error("Functions that are not entry points cannot have `@location` or `@builtin` attributes on their arguments: \"{name}\" has attributes")] PipelineInputRegularFunction { name: String }, #[error("Functions that are not entry points cannot have `@location` or `@builtin` attributes on their return value types")] PipelineOutputRegularFunction, } bitflags::bitflags! { #[repr(transparent)] struct ControlFlowAbility: u8 { /// The control can return out of this block. const RETURN = 0x1; /// The control can break. const BREAK = 0x2; /// The control can continue. const CONTINUE = 0x4; } } #[cfg(feature = "validate")] struct BlockInfo { stages: super::ShaderStages, finished: bool, } #[cfg(feature = "validate")] struct BlockContext<'a> { abilities: ControlFlowAbility, info: &'a FunctionInfo, expressions: &'a Arena, types: &'a UniqueArena, global_vars: &'a Arena, functions: &'a Arena, prev_infos: &'a [FunctionInfo], return_type: Option>, } #[cfg(feature = "validate")] impl<'a> BlockContext<'a> { fn new( fun: &'a crate::Function, module: &'a crate::Module, info: &'a FunctionInfo, prev_infos: &'a [FunctionInfo], ) -> Self { Self { abilities: ControlFlowAbility::RETURN, info, expressions: &fun.expressions, types: &module.types, global_vars: &module.global_variables, functions: &module.functions, prev_infos, return_type: fun.result.as_ref().map(|fr| fr.ty), } } const fn with_abilities(&self, abilities: ControlFlowAbility) -> Self { BlockContext { abilities, ..*self } } fn get_expression( &self, handle: Handle, ) -> Result<&'a crate::Expression, FunctionError> { Ok(self.expressions.try_get(handle)?) } fn resolve_type_impl( &self, handle: Handle, valid_expressions: &BitSet, ) -> Result<&crate::TypeInner, WithSpan> { if handle.index() >= self.expressions.len() { Err(ExpressionError::DoesntExist.with_span()) } else if !valid_expressions.contains(handle.index()) { Err(ExpressionError::NotInScope.with_span_handle(handle, self.expressions)) } else { Ok(self.info[handle].ty.inner_with(self.types)) } } fn resolve_type( &self, handle: Handle, valid_expressions: &BitSet, ) -> Result<&crate::TypeInner, WithSpan> { self.resolve_type_impl(handle, valid_expressions) .map_err_inner(|error| FunctionError::Expression { handle, error }.with_span()) } fn resolve_pointer_type( &self, handle: Handle, ) -> Result<&crate::TypeInner, FunctionError> { if handle.index() >= self.expressions.len() { Err(FunctionError::Expression { handle, error: ExpressionError::DoesntExist, }) } else { Ok(self.info[handle].ty.inner_with(self.types)) } } } impl super::Validator { #[cfg(feature = "validate")] fn validate_call( &mut self, function: Handle, arguments: &[Handle], result: Option>, context: &BlockContext, ) -> Result> { let fun = context .functions .try_get(function) .map_err(CallError::BadHandle) .map_err(WithSpan::new)?; if fun.arguments.len() != arguments.len() { return Err(CallError::ArgumentCount { required: fun.arguments.len(), seen: arguments.len(), } .with_span()); } for (index, (arg, &expr)) in fun.arguments.iter().zip(arguments).enumerate() { let ty = context .resolve_type_impl(expr, &self.valid_expression_set) .map_err_inner(|error| { CallError::Argument { index, error }.with_span_handle(expr, context.expressions) })?; let arg_inner = &context.types[arg.ty].inner; if !ty.equivalent(arg_inner, context.types) { return Err(CallError::ArgumentType { index, required: arg.ty, seen_expression: expr, } .with_span_handle(expr, context.expressions)); } } if let Some(expr) = result { if self.valid_expression_set.insert(expr.index()) { self.valid_expression_list.push(expr); } else { return Err(CallError::ResultAlreadyInScope(expr) .with_span_handle(expr, context.expressions)); } match context.expressions[expr] { crate::Expression::CallResult(callee) if fun.result.is_some() && callee == function => {} _ => { return Err(CallError::ExpressionMismatch(result) .with_span_handle(expr, context.expressions)) } } } else if fun.result.is_some() { return Err(CallError::ExpressionMismatch(result).with_span()); } let callee_info = &context.prev_infos[function.index()]; Ok(callee_info.available_stages) } #[cfg(feature = "validate")] fn validate_atomic( &mut self, pointer: Handle, fun: &crate::AtomicFunction, value: Handle, result: Handle, context: &BlockContext, ) -> Result<(), WithSpan> { let pointer_inner = context.resolve_type(pointer, &self.valid_expression_set)?; let (ptr_kind, ptr_width) = match *pointer_inner { crate::TypeInner::Pointer { base, .. } => match context.types[base].inner { crate::TypeInner::Atomic { kind, width } => (kind, width), ref other => { log::error!("Atomic pointer to type {:?}", other); return Err(AtomicError::InvalidPointer(pointer) .with_span_handle(pointer, context.expressions) .into_other()); } }, ref other => { log::error!("Atomic on type {:?}", other); return Err(AtomicError::InvalidPointer(pointer) .with_span_handle(pointer, context.expressions) .into_other()); } }; let value_inner = context.resolve_type(value, &self.valid_expression_set)?; match *value_inner { crate::TypeInner::Scalar { width, kind } if kind == ptr_kind && width == ptr_width => {} ref other => { log::error!("Atomic operand type {:?}", other); return Err(AtomicError::InvalidOperand(value) .with_span_handle(value, context.expressions) .into_other()); } } if let crate::AtomicFunction::Exchange { compare: Some(cmp) } = *fun { if context.resolve_type(cmp, &self.valid_expression_set)? != value_inner { log::error!("Atomic exchange comparison has a different type from the value"); return Err(AtomicError::InvalidOperand(cmp) .with_span_handle(cmp, context.expressions) .into_other()); } } if self.valid_expression_set.insert(result.index()) { self.valid_expression_list.push(result); } else { return Err(AtomicError::ResultAlreadyInScope(result) .with_span_handle(result, context.expressions) .into_other()); } match context.expressions[result] { //TODO: support atomic result with comparison crate::Expression::AtomicResult { kind, width, // comparison: false, .. } if kind == ptr_kind && width == ptr_width => {} _ => { return Err(AtomicError::ResultTypeMismatch(result) .with_span_handle(result, context.expressions) .into_other()) } } Ok(()) } #[cfg(feature = "validate")] fn validate_block_impl( &mut self, statements: &crate::Block, context: &BlockContext, ) -> Result> { use crate::{Statement as S, TypeInner as Ti}; let mut finished = false; let mut stages = super::ShaderStages::all(); for (statement, &span) in statements.span_iter() { if finished { return Err(FunctionError::InstructionsAfterReturn .with_span_static(span, "instructions after return")); } match *statement { S::Emit(ref range) => { for handle in range.clone() { if self.valid_expression_set.insert(handle.index()) { self.valid_expression_list.push(handle); } else { return Err(FunctionError::ExpressionAlreadyInScope(handle) .with_span_handle(handle, context.expressions)); } } } S::Block(ref block) => { let info = self.validate_block(block, context)?; stages &= info.stages; finished = info.finished; } S::If { condition, ref accept, ref reject, } => { match *context.resolve_type(condition, &self.valid_expression_set)? { Ti::Scalar { kind: crate::ScalarKind::Bool, width: _, } => {} _ => { return Err(FunctionError::InvalidIfType(condition) .with_span_handle(condition, context.expressions)) } } stages &= self.validate_block(accept, context)?.stages; stages &= self.validate_block(reject, context)?.stages; } S::Switch { selector, ref cases, } => { match *context.resolve_type(selector, &self.valid_expression_set)? { Ti::Scalar { kind: crate::ScalarKind::Uint, width: _, } => {} Ti::Scalar { kind: crate::ScalarKind::Sint, width: _, } => {} _ => { return Err(FunctionError::InvalidSwitchType(selector) .with_span_handle(selector, context.expressions)) } } self.select_cases.clear(); let mut default = false; for case in cases { match case.value { crate::SwitchValue::Integer(value) => { if !self.select_cases.insert(value) { return Err(FunctionError::ConflictingSwitchCase(value) .with_span_static( case.body .span_iter() .next() .map_or(Default::default(), |(_, s)| *s), "conflicting switch arm here", )); } } crate::SwitchValue::Default => { if default { return Err(FunctionError::MultipleDefaultCases .with_span_static( case.body .span_iter() .next() .map_or(Default::default(), |(_, s)| *s), "duplicated switch arm here", )); } default = true } } } if !default { return Err(FunctionError::MissingDefaultCase .with_span_static(span, "missing default case")); } if let Some(case) = cases.last() { if case.fall_through { return Err(FunctionError::LastCaseFallTrough.with_span_static( case.body .span_iter() .next() .map_or(Default::default(), |(_, s)| *s), "bad switch arm here", )); } } let pass_through_abilities = context.abilities & (ControlFlowAbility::RETURN | ControlFlowAbility::CONTINUE); let sub_context = context.with_abilities(pass_through_abilities | ControlFlowAbility::BREAK); for case in cases { stages &= self.validate_block(&case.body, &sub_context)?.stages; } } S::Loop { ref body, ref continuing, break_if, } => { // special handling for block scoping is needed here, // because the continuing{} block inherits the scope let base_expression_count = self.valid_expression_list.len(); let pass_through_abilities = context.abilities & ControlFlowAbility::RETURN; stages &= self .validate_block_impl( body, &context.with_abilities( pass_through_abilities | ControlFlowAbility::BREAK | ControlFlowAbility::CONTINUE, ), )? .stages; stages &= self .validate_block_impl( continuing, &context.with_abilities(ControlFlowAbility::empty()), )? .stages; if let Some(condition) = break_if { match *context.resolve_type(condition, &self.valid_expression_set)? { Ti::Scalar { kind: crate::ScalarKind::Bool, width: _, } => {} _ => { return Err(FunctionError::InvalidIfType(condition) .with_span_handle(condition, context.expressions)) } } } for handle in self.valid_expression_list.drain(base_expression_count..) { self.valid_expression_set.remove(handle.index()); } } S::Break => { if !context.abilities.contains(ControlFlowAbility::BREAK) { return Err(FunctionError::BreakOutsideOfLoopOrSwitch .with_span_static(span, "invalid break")); } finished = true; } S::Continue => { if !context.abilities.contains(ControlFlowAbility::CONTINUE) { return Err(FunctionError::ContinueOutsideOfLoop .with_span_static(span, "invalid continue")); } finished = true; } S::Return { value } => { if !context.abilities.contains(ControlFlowAbility::RETURN) { return Err(FunctionError::InvalidReturnSpot .with_span_static(span, "invalid return")); } let value_ty = value .map(|expr| context.resolve_type(expr, &self.valid_expression_set)) .transpose()?; let expected_ty = context.return_type.map(|ty| &context.types[ty].inner); // We can't return pointers, but it seems best not to embed that // assumption here, so use `TypeInner::equivalent` for comparison. let okay = match (value_ty, expected_ty) { (None, None) => true, (Some(value_inner), Some(expected_inner)) => { value_inner.equivalent(expected_inner, context.types) } (_, _) => false, }; if !okay { log::error!( "Returning {:?} where {:?} is expected", value_ty, expected_ty ); if let Some(handle) = value { return Err(FunctionError::InvalidReturnType(value) .with_span_handle(handle, context.expressions)); } else { return Err(FunctionError::InvalidReturnType(value) .with_span_static(span, "invalid return")); } } finished = true; } S::Kill => { finished = true; } S::Barrier(_) => { stages &= super::ShaderStages::COMPUTE; } S::Store { pointer, value } => { let mut current = pointer; loop { let _ = context .resolve_pointer_type(current) .map_err(|e| e.with_span())?; match context.expressions[current] { crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => current = base, crate::Expression::LocalVariable(_) | crate::Expression::GlobalVariable(_) | crate::Expression::FunctionArgument(_) => break, _ => { return Err(FunctionError::InvalidStorePointer(current) .with_span_handle(pointer, context.expressions)) } } } let value_ty = context.resolve_type(value, &self.valid_expression_set)?; match *value_ty { Ti::Image { .. } | Ti::Sampler { .. } => { return Err(FunctionError::InvalidStoreValue(value) .with_span_handle(value, context.expressions)); } _ => {} } let pointer_ty = context .resolve_pointer_type(pointer) .map_err(|e| e.with_span())?; let good = match *pointer_ty { Ti::Pointer { base, space: _ } => match context.types[base].inner { Ti::Atomic { kind, width } => *value_ty == Ti::Scalar { kind, width }, ref other => value_ty == other, }, Ti::ValuePointer { size: Some(size), kind, width, space: _, } => *value_ty == Ti::Vector { size, kind, width }, Ti::ValuePointer { size: None, kind, width, space: _, } => *value_ty == Ti::Scalar { kind, width }, _ => false, }; if !good { if let Ti::Pointer { base, .. } = *pointer_ty { println!("{:?}", context.types[base].inner); println!("{:?}", value_ty); } return Err(FunctionError::InvalidStoreTypes { pointer, value } .with_span() .with_handle(pointer, context.expressions) .with_handle(value, context.expressions)); } if let Some(space) = pointer_ty.pointer_space() { if !space.access().contains(crate::StorageAccess::STORE) { return Err(FunctionError::InvalidStorePointer(pointer) .with_span_static( context.expressions.get_span(pointer), "writing to this location is not permitted", )); } } } S::ImageStore { image, coordinate, array_index, value, } => { //Note: this code uses a lot of `FunctionError::InvalidImageStore`, // and could probably be refactored. let var = match *context.get_expression(image).map_err(|e| e.with_span())? { crate::Expression::GlobalVariable(var_handle) => { &context.global_vars[var_handle] } // We're looking at a binding index situation, so punch through the index and look at the global behind it. crate::Expression::Access { base, .. } | crate::Expression::AccessIndex { base, .. } => { match *context.get_expression(base).map_err(|e| e.with_span())? { crate::Expression::GlobalVariable(var_handle) => { &context.global_vars[var_handle] } _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::ExpectedGlobalVariable, ) .with_span_handle(image, context.expressions)) } } } _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::ExpectedGlobalVariable, ) .with_span_handle(image, context.expressions)) } }; // Punch through a binding array to get the underlying type let global_ty = match context.types[var.ty].inner { Ti::BindingArray { base, .. } => &context.types[base].inner, ref inner => inner, }; let value_ty = match *global_ty { Ti::Image { class, arrayed, dim, } => { match context .resolve_type(coordinate, &self.valid_expression_set)? .image_storage_coordinates() { Some(coord_dim) if coord_dim == dim => {} _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::InvalidImageCoordinateType( dim, coordinate, ), ) .with_span_handle(coordinate, context.expressions)); } }; if arrayed != array_index.is_some() { return Err(FunctionError::InvalidImageStore( ExpressionError::InvalidImageArrayIndex, ) .with_span_handle(coordinate, context.expressions)); } if let Some(expr) = array_index { match *context.resolve_type(expr, &self.valid_expression_set)? { Ti::Scalar { kind: crate::ScalarKind::Sint, width: _, } => {} _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::InvalidImageArrayIndexType(expr), ) .with_span_handle(expr, context.expressions)); } } } match class { crate::ImageClass::Storage { format, .. } => { crate::TypeInner::Vector { kind: format.into(), size: crate::VectorSize::Quad, width: 4, } } _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::InvalidImageClass(class), ) .with_span_handle(image, context.expressions)); } } } _ => { return Err(FunctionError::InvalidImageStore( ExpressionError::ExpectedImageType(var.ty), ) .with_span() .with_handle(var.ty, context.types) .with_handle(image, context.expressions)) } }; if *context.resolve_type(value, &self.valid_expression_set)? != value_ty { return Err(FunctionError::InvalidStoreValue(value) .with_span_handle(value, context.expressions)); } } S::Call { function, ref arguments, result, } => match self.validate_call(function, arguments, result, context) { Ok(callee_stages) => stages &= callee_stages, Err(error) => { return Err(error.and_then(|error| { FunctionError::InvalidCall { function, error } .with_span_static(span, "invalid function call") })) } }, S::Atomic { pointer, ref fun, value, result, } => { self.validate_atomic(pointer, fun, value, result, context)?; } } } Ok(BlockInfo { stages, finished }) } #[cfg(feature = "validate")] fn validate_block( &mut self, statements: &crate::Block, context: &BlockContext, ) -> Result> { let base_expression_count = self.valid_expression_list.len(); let info = self.validate_block_impl(statements, context)?; for handle in self.valid_expression_list.drain(base_expression_count..) { self.valid_expression_set.remove(handle.index()); } Ok(info) } #[cfg(feature = "validate")] fn validate_local_var( &self, var: &crate::LocalVariable, types: &UniqueArena, constants: &Arena, ) -> Result<(), LocalVariableError> { log::debug!("var {:?}", var); let type_info = self .types .get(var.ty.index()) .ok_or(LocalVariableError::InvalidType(var.ty))?; if !type_info .flags .contains(super::TypeFlags::DATA | super::TypeFlags::SIZED) { return Err(LocalVariableError::InvalidType(var.ty)); } if let Some(const_handle) = var.init { match constants[const_handle].inner { crate::ConstantInner::Scalar { width, ref value } => { let ty_inner = crate::TypeInner::Scalar { width, kind: value.scalar_kind(), }; if types[var.ty].inner != ty_inner { return Err(LocalVariableError::InitializerType); } } crate::ConstantInner::Composite { ty, components: _ } => { if ty != var.ty { return Err(LocalVariableError::InitializerType); } } } } Ok(()) } pub(super) fn validate_function( &mut self, fun: &crate::Function, module: &crate::Module, mod_info: &ModuleInfo, #[cfg_attr(not(feature = "validate"), allow(unused))] entry_point: bool, ) -> Result> { #[cfg_attr(not(feature = "validate"), allow(unused_mut))] let mut info = mod_info.process_function(fun, module, self.flags, self.capabilities)?; #[cfg(feature = "validate")] for (var_handle, var) in fun.local_variables.iter() { self.validate_local_var(var, &module.types, &module.constants) .map_err(|error| { FunctionError::LocalVariable { handle: var_handle, name: var.name.clone().unwrap_or_default(), error, } .with_span_handle(var.ty, &module.types) .with_handle(var_handle, &fun.local_variables) })?; } #[cfg(feature = "validate")] for (index, argument) in fun.arguments.iter().enumerate() { let ty = module.types.get_handle(argument.ty).map_err(|err| { FunctionError::from(err).with_span_handle(argument.ty, &module.types) })?; match ty.inner.pointer_space() { Some( crate::AddressSpace::Private | crate::AddressSpace::Function | crate::AddressSpace::WorkGroup, ) | None => {} Some(other) => { return Err(FunctionError::InvalidArgumentPointerSpace { index, name: argument.name.clone().unwrap_or_default(), space: other, } .with_span_handle(argument.ty, &module.types)) } } // Check for the least informative error last. if !self.types[argument.ty.index()] .flags .contains(super::TypeFlags::ARGUMENT) { return Err(FunctionError::InvalidArgumentType { index, name: argument.name.clone().unwrap_or_default(), } .with_span_handle(argument.ty, &module.types)); } if !entry_point && argument.binding.is_some() { return Err(FunctionError::PipelineInputRegularFunction { name: argument.name.clone().unwrap_or_default(), } .with_span_handle(argument.ty, &module.types)); } } #[cfg(feature = "validate")] if let Some(ref result) = fun.result { if !self.types[result.ty.index()] .flags .contains(super::TypeFlags::CONSTRUCTIBLE) { return Err(FunctionError::NonConstructibleReturnType .with_span_handle(result.ty, &module.types)); } if !entry_point && result.binding.is_some() { return Err(FunctionError::PipelineOutputRegularFunction .with_span_handle(result.ty, &module.types)); } } self.valid_expression_set.clear(); self.valid_expression_list.clear(); for (handle, expr) in fun.expressions.iter() { if expr.needs_pre_emit() { self.valid_expression_set.insert(handle.index()); } #[cfg(feature = "validate")] if self.flags.contains(super::ValidationFlags::EXPRESSIONS) { match self.validate_expression( handle, expr, fun, module, &info, &mod_info.functions, ) { Ok(stages) => info.available_stages &= stages, Err(error) => { return Err(FunctionError::Expression { handle, error } .with_span_handle(handle, &fun.expressions)) } } } } #[cfg(feature = "validate")] if self.flags.contains(super::ValidationFlags::BLOCKS) { let stages = self .validate_block( &fun.body, &BlockContext::new(fun, module, &info, &mod_info.functions), )? .stages; info.available_stages &= stages; } Ok(info) } } ================================================ FILE: lib/naga/src/valid/interface.rs ================================================ use super::{ analyzer::{FunctionInfo, GlobalUse}, Capabilities, Disalignment, FunctionError, ModuleInfo, }; use crate::arena::{BadHandle, Handle, UniqueArena}; use crate::span::{AddSpan as _, MapErrWithSpan as _, SpanProvider as _, WithSpan}; use bit_set::BitSet; #[cfg(feature = "validate")] const MAX_WORKGROUP_SIZE: u32 = 0x4000; #[derive(Clone, Debug, thiserror::Error)] pub enum GlobalVariableError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("Usage isn't compatible with address space {0:?}")] InvalidUsage(crate::AddressSpace), #[error("Type isn't compatible with address space {0:?}")] InvalidType(crate::AddressSpace), #[error("Type flags {seen:?} do not meet the required {required:?}")] MissingTypeFlags { required: super::TypeFlags, seen: super::TypeFlags, }, #[error("Capability {0:?} is not supported")] UnsupportedCapability(Capabilities), #[error("Binding decoration is missing or not applicable")] InvalidBinding, #[error("Alignment requirements for address space {0:?} are not met by {1:?}")] Alignment( crate::AddressSpace, Handle, #[source] Disalignment, ), } #[derive(Clone, Debug, thiserror::Error)] pub enum VaryingError { #[error("The type {0:?} does not match the varying")] InvalidType(Handle), #[error("The type {0:?} cannot be used for user-defined entry point inputs or outputs")] NotIOShareableType(Handle), #[error("Interpolation is not valid")] InvalidInterpolation, #[error("Interpolation must be specified on vertex shader outputs and fragment shader inputs")] MissingInterpolation, #[error("Built-in {0:?} is not available at this stage")] InvalidBuiltInStage(crate::BuiltIn), #[error("Built-in type for {0:?} is invalid")] InvalidBuiltInType(crate::BuiltIn), #[error("Entry point arguments and return values must all have bindings")] MissingBinding, #[error("Struct member {0} is missing a binding")] MemberMissingBinding(u32), #[error("Multiple bindings at location {location} are present")] BindingCollision { location: u32 }, #[error("Built-in {0:?} is present more than once")] DuplicateBuiltIn(crate::BuiltIn), #[error("Capability {0:?} is not supported")] UnsupportedCapability(Capabilities), } #[derive(Clone, Debug, thiserror::Error)] pub enum EntryPointError { #[error("Multiple conflicting entry points")] Conflict, #[error("Early depth test is not applicable")] UnexpectedEarlyDepthTest, #[error("Workgroup size is not applicable")] UnexpectedWorkgroupSize, #[error("Workgroup size is out of range")] OutOfRangeWorkgroupSize, #[error("Uses operations forbidden at this stage")] ForbiddenStageOperations, #[error("Global variable {0:?} is used incorrectly as {1:?}")] InvalidGlobalUsage(Handle, GlobalUse), #[error("Bindings for {0:?} conflict with other resource")] BindingCollision(Handle), #[error("Argument {0} varying error")] Argument(u32, #[source] VaryingError), #[error(transparent)] Result(#[from] VaryingError), #[error("Location {location} interpolation of an integer has to be flat")] InvalidIntegerInterpolation { location: u32 }, #[error(transparent)] Function(#[from] FunctionError), } #[cfg(feature = "validate")] fn storage_usage(access: crate::StorageAccess) -> GlobalUse { let mut storage_usage = GlobalUse::QUERY; if access.contains(crate::StorageAccess::LOAD) { storage_usage |= GlobalUse::READ; } if access.contains(crate::StorageAccess::STORE) { storage_usage |= GlobalUse::WRITE; } storage_usage } struct VaryingContext<'a> { stage: crate::ShaderStage, output: bool, types: &'a UniqueArena, type_info: &'a Vec, location_mask: &'a mut BitSet, built_ins: &'a mut crate::FastHashSet, capabilities: Capabilities, } impl VaryingContext<'_> { fn validate_impl( &mut self, ty: Handle, binding: &crate::Binding, ) -> Result<(), VaryingError> { use crate::{ BuiltIn as Bi, ScalarKind as Sk, ShaderStage as St, TypeInner as Ti, VectorSize as Vs, }; let ty_inner = &self.types[ty].inner; match *binding { crate::Binding::BuiltIn(built_in) => { // Ignore the `invariant` field for the sake of duplicate checks, // but use the original in error messages. let canonical = if let crate::BuiltIn::Position { .. } = built_in { crate::BuiltIn::Position { invariant: false } } else { built_in }; if self.built_ins.contains(&canonical) { return Err(VaryingError::DuplicateBuiltIn(built_in)); } self.built_ins.insert(canonical); let required = match built_in { Bi::ClipDistance => Capabilities::CLIP_DISTANCE, Bi::CullDistance => Capabilities::CULL_DISTANCE, Bi::PrimitiveIndex => Capabilities::PRIMITIVE_INDEX, _ => Capabilities::empty(), }; if !self.capabilities.contains(required) { return Err(VaryingError::UnsupportedCapability(required)); } let width = 4; let (visible, type_good) = match built_in { Bi::BaseInstance | Bi::BaseVertex | Bi::InstanceIndex | Bi::VertexIndex => ( self.stage == St::Vertex && !self.output, *ty_inner == Ti::Scalar { kind: Sk::Uint, width, }, ), Bi::ClipDistance | Bi::CullDistance => ( self.stage == St::Vertex && self.output, match *ty_inner { Ti::Array { base, .. } => { self.types[base].inner == Ti::Scalar { kind: Sk::Float, width, } } _ => false, }, ), Bi::PointSize => ( self.stage == St::Vertex && self.output, *ty_inner == Ti::Scalar { kind: Sk::Float, width, }, ), Bi::Position { .. } => ( match self.stage { St::Vertex => self.output, St::Fragment => !self.output, St::Compute => false, }, *ty_inner == Ti::Vector { size: Vs::Quad, kind: Sk::Float, width, }, ), Bi::ViewIndex => ( match self.stage { St::Vertex | St::Fragment => !self.output, St::Compute => false, }, *ty_inner == Ti::Scalar { kind: Sk::Sint, width, }, ), Bi::FragDepth => ( self.stage == St::Fragment && self.output, *ty_inner == Ti::Scalar { kind: Sk::Float, width, }, ), Bi::FrontFacing => ( self.stage == St::Fragment && !self.output, *ty_inner == Ti::Scalar { kind: Sk::Bool, width: crate::BOOL_WIDTH, }, ), Bi::PrimitiveIndex => ( self.stage == St::Fragment && !self.output, *ty_inner == Ti::Scalar { kind: Sk::Uint, width, }, ), Bi::SampleIndex => ( self.stage == St::Fragment && !self.output, *ty_inner == Ti::Scalar { kind: Sk::Uint, width, }, ), Bi::SampleMask => ( self.stage == St::Fragment, *ty_inner == Ti::Scalar { kind: Sk::Uint, width, }, ), Bi::LocalInvocationIndex => ( self.stage == St::Compute && !self.output, *ty_inner == Ti::Scalar { kind: Sk::Uint, width, }, ), Bi::GlobalInvocationId | Bi::LocalInvocationId | Bi::WorkGroupId | Bi::WorkGroupSize | Bi::NumWorkGroups => ( self.stage == St::Compute && !self.output, *ty_inner == Ti::Vector { size: Vs::Tri, kind: Sk::Uint, width, }, ), }; if !visible { return Err(VaryingError::InvalidBuiltInStage(built_in)); } if !type_good { log::warn!("Wrong builtin type: {:?}", ty_inner); return Err(VaryingError::InvalidBuiltInType(built_in)); } } crate::Binding::Location { location, interpolation, sampling, } => { // Only IO-shareable types may be stored in locations. if !self.type_info[ty.index()] .flags .contains(super::TypeFlags::IO_SHAREABLE) { return Err(VaryingError::NotIOShareableType(ty)); } if !self.location_mask.insert(location as usize) { return Err(VaryingError::BindingCollision { location }); } let needs_interpolation = match self.stage { crate::ShaderStage::Vertex => self.output, crate::ShaderStage::Fragment => !self.output, _ => false, }; // It doesn't make sense to specify a sampling when `interpolation` is `Flat`, but // SPIR-V and GLSL both explicitly tolerate such combinations of decorators / // qualifiers, so we won't complain about that here. let _ = sampling; match ty_inner.scalar_kind() { Some(crate::ScalarKind::Float) => { if needs_interpolation && interpolation.is_none() { return Err(VaryingError::MissingInterpolation); } } Some(_) => { if needs_interpolation && interpolation != Some(crate::Interpolation::Flat) { return Err(VaryingError::InvalidInterpolation); } } None => return Err(VaryingError::InvalidType(ty)), } } } Ok(()) } fn validate( &mut self, ty: Handle, binding: Option<&crate::Binding>, ) -> Result<(), WithSpan> { let span_context = self.types.get_span_context(ty); match binding { Some(binding) => self .validate_impl(ty, binding) .map_err(|e| e.with_span_context(span_context)), None => { match self.types[ty].inner { //TODO: check the member types crate::TypeInner::Struct { ref members, .. } => { for (index, member) in members.iter().enumerate() { let span_context = self.types.get_span_context(ty); match member.binding { None => { return Err(VaryingError::MemberMissingBinding(index as u32) .with_span_context(span_context)) } // TODO: shouldn't this be validate? Some(ref binding) => self .validate_impl(member.ty, binding) .map_err(|e| e.with_span_context(span_context))?, } } } _ => return Err(VaryingError::MissingBinding.with_span()), } Ok(()) } } } } impl super::Validator { #[cfg(feature = "validate")] pub(super) fn validate_global_var( &self, var: &crate::GlobalVariable, types: &UniqueArena, ) -> Result<(), GlobalVariableError> { use super::TypeFlags; log::debug!("var {:?}", var); let type_info = self.types.get(var.ty.index()).ok_or_else(|| BadHandle { kind: "type", index: var.ty.index(), })?; let (required_type_flags, is_resource) = match var.space { crate::AddressSpace::Function => { return Err(GlobalVariableError::InvalidUsage(var.space)) } crate::AddressSpace::Storage { .. } => { if let Err((ty_handle, disalignment)) = type_info.storage_layout { if self.flags.contains(super::ValidationFlags::STRUCT_LAYOUTS) { return Err(GlobalVariableError::Alignment( var.space, ty_handle, disalignment, )); } } (TypeFlags::DATA | TypeFlags::HOST_SHAREABLE, true) } crate::AddressSpace::Uniform => { if let Err((ty_handle, disalignment)) = type_info.uniform_layout { if self.flags.contains(super::ValidationFlags::STRUCT_LAYOUTS) { return Err(GlobalVariableError::Alignment( var.space, ty_handle, disalignment, )); } } ( TypeFlags::DATA | TypeFlags::COPY | TypeFlags::SIZED | TypeFlags::HOST_SHAREABLE, true, ) } crate::AddressSpace::Handle => { match types[var.ty].inner { crate::TypeInner::Image { .. } | crate::TypeInner::Sampler { .. } | crate::TypeInner::BindingArray { .. } => {} _ => { return Err(GlobalVariableError::InvalidType(var.space)); } }; (TypeFlags::empty(), true) } crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => { (TypeFlags::DATA | TypeFlags::SIZED, false) } crate::AddressSpace::PushConstant => { if !self.capabilities.contains(Capabilities::PUSH_CONSTANT) { return Err(GlobalVariableError::UnsupportedCapability( Capabilities::PUSH_CONSTANT, )); } ( TypeFlags::DATA | TypeFlags::COPY | TypeFlags::HOST_SHAREABLE | TypeFlags::SIZED, false, ) } }; if !type_info.flags.contains(required_type_flags) { return Err(GlobalVariableError::MissingTypeFlags { seen: type_info.flags, required: required_type_flags, }); } if is_resource != var.binding.is_some() { return Err(GlobalVariableError::InvalidBinding); } Ok(()) } pub(super) fn validate_entry_point( &mut self, ep: &crate::EntryPoint, module: &crate::Module, mod_info: &ModuleInfo, ) -> Result> { #[cfg(feature = "validate")] if ep.early_depth_test.is_some() && ep.stage != crate::ShaderStage::Fragment { return Err(EntryPointError::UnexpectedEarlyDepthTest.with_span()); } #[cfg(feature = "validate")] if ep.stage == crate::ShaderStage::Compute { if ep .workgroup_size .iter() .any(|&s| s == 0 || s > MAX_WORKGROUP_SIZE) { return Err(EntryPointError::OutOfRangeWorkgroupSize.with_span()); } } else if ep.workgroup_size != [0; 3] { return Err(EntryPointError::UnexpectedWorkgroupSize.with_span()); } let info = self .validate_function(&ep.function, module, mod_info, true) .map_err(WithSpan::into_other)?; #[cfg(feature = "validate")] { use super::ShaderStages; let stage_bit = match ep.stage { crate::ShaderStage::Vertex => ShaderStages::VERTEX, crate::ShaderStage::Fragment => ShaderStages::FRAGMENT, crate::ShaderStage::Compute => ShaderStages::COMPUTE, }; if !info.available_stages.contains(stage_bit) { return Err(EntryPointError::ForbiddenStageOperations.with_span()); } } self.location_mask.clear(); let mut argument_built_ins = crate::FastHashSet::default(); // TODO: add span info to function arguments for (index, fa) in ep.function.arguments.iter().enumerate() { let mut ctx = VaryingContext { stage: ep.stage, output: false, types: &module.types, type_info: &self.types, location_mask: &mut self.location_mask, built_ins: &mut argument_built_ins, capabilities: self.capabilities, }; ctx.validate(fa.ty, fa.binding.as_ref()) .map_err_inner(|e| EntryPointError::Argument(index as u32, e).with_span())?; } self.location_mask.clear(); if let Some(ref fr) = ep.function.result { let mut result_built_ins = crate::FastHashSet::default(); let mut ctx = VaryingContext { stage: ep.stage, output: true, types: &module.types, type_info: &self.types, location_mask: &mut self.location_mask, built_ins: &mut result_built_ins, capabilities: self.capabilities, }; ctx.validate(fr.ty, fr.binding.as_ref()) .map_err_inner(|e| EntryPointError::Result(e).with_span())?; } for bg in self.bind_group_masks.iter_mut() { bg.clear(); } #[cfg(feature = "validate")] for (var_handle, var) in module.global_variables.iter() { let usage = info[var_handle]; if usage.is_empty() { continue; } let allowed_usage = match var.space { crate::AddressSpace::Function => unreachable!(), crate::AddressSpace::Uniform => GlobalUse::READ | GlobalUse::QUERY, crate::AddressSpace::Storage { access } => storage_usage(access), crate::AddressSpace::Handle => match module.types[var.ty].inner { crate::TypeInner::BindingArray { base, .. } => match module.types[base].inner { crate::TypeInner::Image { class: crate::ImageClass::Storage { access, .. }, .. } => storage_usage(access), _ => GlobalUse::READ | GlobalUse::QUERY, }, crate::TypeInner::Image { class: crate::ImageClass::Storage { access, .. }, .. } => storage_usage(access), _ => GlobalUse::READ | GlobalUse::QUERY, }, crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => GlobalUse::all(), crate::AddressSpace::PushConstant => GlobalUse::READ, }; if !allowed_usage.contains(usage) { log::warn!("\tUsage error for: {:?}", var); log::warn!( "\tAllowed usage: {:?}, requested: {:?}", allowed_usage, usage ); return Err(EntryPointError::InvalidGlobalUsage(var_handle, usage) .with_span_handle(var_handle, &module.global_variables)); } if let Some(ref bind) = var.binding { while self.bind_group_masks.len() <= bind.group as usize { self.bind_group_masks.push(BitSet::new()); } if !self.bind_group_masks[bind.group as usize].insert(bind.binding as usize) { return Err(EntryPointError::BindingCollision(var_handle) .with_span_handle(var_handle, &module.global_variables)); } } } Ok(info) } } ================================================ FILE: lib/naga/src/valid/mod.rs ================================================ /*! Shader validator. */ mod analyzer; mod compose; mod expression; mod function; mod interface; mod r#type; #[cfg(feature = "validate")] use crate::arena::{Arena, UniqueArena}; use crate::{ arena::{BadHandle, Handle}, proc::{LayoutError, Layouter}, FastHashSet, }; use bit_set::BitSet; use std::ops; //TODO: analyze the model at the same time as we validate it, // merge the corresponding matches over expressions and statements. use crate::span::{AddSpan as _, WithSpan}; pub use analyzer::{ExpressionInfo, FunctionInfo, GlobalUse, Uniformity, UniformityRequirements}; pub use compose::ComposeError; pub use expression::ExpressionError; pub use function::{CallError, FunctionError, LocalVariableError}; pub use interface::{EntryPointError, GlobalVariableError, VaryingError}; pub use r#type::{Disalignment, TypeError, TypeFlags}; bitflags::bitflags! { /// Validation flags. /// /// If you are working with trusted shaders, then you may be able /// to save some time by skipping validation. /// /// If you do not perform full validation, invalid shaders may /// cause Naga to panic. If you do perform full validation and /// [`Validator::validate`] returns `Ok`, then Naga promises that /// code generation will either succeed or return an error; it /// should never panic. /// /// The default value for `ValidationFlags` is /// `ValidationFlags::all()`. If Naga's `"validate"` feature is /// enabled, this requests full validation; otherwise, this /// requests no validation. (The `"validate"` feature is disabled /// by default.) #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct ValidationFlags: u8 { /// Expressions. #[cfg(feature = "validate")] const EXPRESSIONS = 0x1; /// Statements and blocks of them. #[cfg(feature = "validate")] const BLOCKS = 0x2; /// Uniformity of control flow for operations that require it. #[cfg(feature = "validate")] const CONTROL_FLOW_UNIFORMITY = 0x4; /// Host-shareable structure layouts. #[cfg(feature = "validate")] const STRUCT_LAYOUTS = 0x8; /// Constants. #[cfg(feature = "validate")] const CONSTANTS = 0x10; } } impl Default for ValidationFlags { fn default() -> Self { Self::all() } } bitflags::bitflags! { /// Allowed IR capabilities. #[must_use] #[derive(Default)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct Capabilities: u8 { /// Support for [`AddressSpace:PushConstant`]. const PUSH_CONSTANT = 0x1; /// Float values with width = 8. const FLOAT64 = 0x2; /// Support for [`Builtin:PrimitiveIndex`]. const PRIMITIVE_INDEX = 0x4; /// Support for non-uniform indexing of sampled textures and storage buffer arrays. const SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING = 0x8; /// Support for non-uniform indexing of uniform buffers and storage texture arrays. const UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING = 0x10; /// Support for non-uniform indexing of samplers. const SAMPLER_NON_UNIFORM_INDEXING = 0x20; /// Support for [`Builtin::ClipDistance`]. const CLIP_DISTANCE = 0x40; /// Support for [`Builtin::CullDistance`]. const CULL_DISTANCE = 0x80; } } bitflags::bitflags! { /// Validation flags. #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct ShaderStages: u8 { const VERTEX = 0x1; const FRAGMENT = 0x2; const COMPUTE = 0x4; } } #[derive(Debug)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub struct ModuleInfo { functions: Vec, entry_points: Vec, } impl ops::Index> for ModuleInfo { type Output = FunctionInfo; fn index(&self, handle: Handle) -> &Self::Output { &self.functions[handle.index()] } } #[derive(Debug)] pub struct Validator { flags: ValidationFlags, capabilities: Capabilities, types: Vec, layouter: Layouter, location_mask: BitSet, bind_group_masks: Vec, #[allow(dead_code)] select_cases: FastHashSet, valid_expression_list: Vec>, valid_expression_set: BitSet, } #[derive(Clone, Debug, thiserror::Error)] pub enum ConstantError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("The type doesn't match the constant")] InvalidType, #[error("The component handle {0:?} can not be resolved")] UnresolvedComponent(Handle), #[error("The array size handle {0:?} can not be resolved")] UnresolvedSize(Handle), #[error(transparent)] Compose(#[from] ComposeError), } #[derive(Clone, Debug, thiserror::Error)] pub enum ValidationError { #[error(transparent)] Layouter(#[from] LayoutError), #[error("Type {handle:?} '{name}' is invalid")] Type { handle: Handle, name: String, #[source] error: TypeError, }, #[error("Constant {handle:?} '{name}' is invalid")] Constant { handle: Handle, name: String, #[source] error: ConstantError, }, #[error("Global variable {handle:?} '{name}' is invalid")] GlobalVariable { handle: Handle, name: String, #[source] error: GlobalVariableError, }, #[error("Function {handle:?} '{name}' is invalid")] Function { handle: Handle, name: String, #[source] error: FunctionError, }, #[error("Entry point {name} at {stage:?} is invalid")] EntryPoint { stage: crate::ShaderStage, name: String, #[source] error: EntryPointError, }, #[error("Module is corrupted")] Corrupted, } impl crate::TypeInner { #[cfg(feature = "validate")] const fn is_sized(&self) -> bool { match *self { Self::Scalar { .. } | Self::Vector { .. } | Self::Matrix { .. } | Self::Array { size: crate::ArraySize::Constant(_), .. } | Self::Atomic { .. } | Self::Pointer { .. } | Self::ValuePointer { .. } | Self::Struct { .. } => true, Self::Array { .. } | Self::Image { .. } | Self::Sampler { .. } | Self::BindingArray { .. } => false, } } /// Return the `ImageDimension` for which `self` is an appropriate coordinate. #[cfg(feature = "validate")] const fn image_storage_coordinates(&self) -> Option { match *self { Self::Scalar { kind: crate::ScalarKind::Sint, .. } => Some(crate::ImageDimension::D1), Self::Vector { size: crate::VectorSize::Bi, kind: crate::ScalarKind::Sint, .. } => Some(crate::ImageDimension::D2), Self::Vector { size: crate::VectorSize::Tri, kind: crate::ScalarKind::Sint, .. } => Some(crate::ImageDimension::D3), _ => None, } } } impl Validator { /// Construct a new validator instance. pub fn new(flags: ValidationFlags, capabilities: Capabilities) -> Self { Validator { flags, capabilities, types: Vec::new(), layouter: Layouter::default(), location_mask: BitSet::new(), bind_group_masks: Vec::new(), select_cases: FastHashSet::default(), valid_expression_list: Vec::new(), valid_expression_set: BitSet::new(), } } /// Reset the validator internals pub fn reset(&mut self) { self.types.clear(); self.layouter.clear(); self.location_mask.clear(); self.bind_group_masks.clear(); self.select_cases.clear(); self.valid_expression_list.clear(); self.valid_expression_set.clear(); } #[cfg(feature = "validate")] fn validate_constant( &self, handle: Handle, constants: &Arena, types: &UniqueArena, ) -> Result<(), ConstantError> { let con = &constants[handle]; match con.inner { crate::ConstantInner::Scalar { width, ref value } => { if !self.check_width(value.scalar_kind(), width) { return Err(ConstantError::InvalidType); } } crate::ConstantInner::Composite { ty, ref components } => { match types.get_handle(ty)?.inner { crate::TypeInner::Array { size: crate::ArraySize::Constant(size_handle), .. } if handle <= size_handle => { return Err(ConstantError::UnresolvedSize(size_handle)); } _ => {} } if let Some(&comp) = components.iter().find(|&&comp| handle <= comp) { return Err(ConstantError::UnresolvedComponent(comp)); } compose::validate_compose( ty, constants, types, components .iter() .map(|&component| constants[component].inner.resolve_type()), )?; } } Ok(()) } /// Check the given module to be valid. pub fn validate( &mut self, module: &crate::Module, ) -> Result> { self.reset(); self.reset_types(module.types.len()); self.layouter .update(&module.types, &module.constants) .map_err(|e| { let handle = e.ty; ValidationError::from(e).with_span_handle(handle, &module.types) })?; #[cfg(feature = "validate")] if self.flags.contains(ValidationFlags::CONSTANTS) { for (handle, constant) in module.constants.iter() { self.validate_constant(handle, &module.constants, &module.types) .map_err(|error| { ValidationError::Constant { handle, name: constant.name.clone().unwrap_or_default(), error, } .with_span_handle(handle, &module.constants) })? } } for (handle, ty) in module.types.iter() { let ty_info = self .validate_type(handle, &module.types, &module.constants) .map_err(|error| { ValidationError::Type { handle, name: ty.name.clone().unwrap_or_default(), error, } .with_span_handle(handle, &module.types) })?; self.types[handle.index()] = ty_info; } #[cfg(feature = "validate")] for (var_handle, var) in module.global_variables.iter() { self.validate_global_var(var, &module.types) .map_err(|error| { ValidationError::GlobalVariable { handle: var_handle, name: var.name.clone().unwrap_or_default(), error, } .with_span_handle(var_handle, &module.global_variables) })?; } let mut mod_info = ModuleInfo { functions: Vec::with_capacity(module.functions.len()), entry_points: Vec::with_capacity(module.entry_points.len()), }; for (handle, fun) in module.functions.iter() { match self.validate_function(fun, module, &mod_info, false) { Ok(info) => mod_info.functions.push(info), Err(error) => { return Err(error.and_then(|error| { ValidationError::Function { handle, name: fun.name.clone().unwrap_or_default(), error, } .with_span_handle(handle, &module.functions) })) } } } let mut ep_map = FastHashSet::default(); for ep in module.entry_points.iter() { if !ep_map.insert((ep.stage, &ep.name)) { return Err(ValidationError::EntryPoint { stage: ep.stage, name: ep.name.clone(), error: EntryPointError::Conflict, } .with_span()); // TODO: keep some EP span information? } match self.validate_entry_point(ep, module, &mod_info) { Ok(info) => mod_info.entry_points.push(info), Err(error) => { return Err(error.and_then(|inner| { ValidationError::EntryPoint { stage: ep.stage, name: ep.name.clone(), error: inner, } .with_span() })) } } } Ok(mod_info) } } ================================================ FILE: lib/naga/src/valid/type.rs ================================================ use super::Capabilities; use crate::{ arena::{Arena, BadHandle, Handle, UniqueArena}, proc::Alignment, }; bitflags::bitflags! { /// Flags associated with [`Type`]s by [`Validator`]. /// /// [`Type`]: crate::Type /// [`Validator`]: crate::valid::Validator #[repr(transparent)] pub struct TypeFlags: u8 { /// Can be used for data variables. /// /// This flag is required on types of local variables, function /// arguments, array elements, and struct members. /// /// This includes all types except `Image`, `Sampler`, /// and some `Pointer` types. const DATA = 0x1; /// The data type has a size known by pipeline creation time. /// /// Unsized types are quite restricted. The only unsized types permitted /// by Naga, other than the non-[`DATA`] types like [`Image`] and /// [`Sampler`], are dynamically-sized [`Array`s], and [`Struct`s] whose /// last members are such arrays. See the documentation for those types /// for details. /// /// [`DATA`]: TypeFlags::DATA /// [`Image`]: crate::Type::Image /// [`Sampler`]: crate::Type::Sampler /// [`Array`]: crate::Type::Array /// [`Struct`]: crate::Type::struct const SIZED = 0x2; /// The data can be copied around. const COPY = 0x4; /// Can be be used for user-defined IO between pipeline stages. /// /// This covers anything that can be in [`Location`] binding: /// non-bool scalars and vectors, matrices, and structs and /// arrays containing only interface types. const IO_SHAREABLE = 0x8; /// Can be used for host-shareable structures. const HOST_SHAREABLE = 0x10; /// This type can be passed as a function argument. const ARGUMENT = 0x40; /// A WGSL [constructible] type. /// /// The constructible types are scalars, vectors, matrices, fixed-size /// arrays of constructible types, and structs whose members are all /// constructible. /// /// [constructible]: https://gpuweb.github.io/gpuweb/wgsl/#constructible const CONSTRUCTIBLE = 0x80; } } #[derive(Clone, Copy, Debug, thiserror::Error)] pub enum Disalignment { #[error("The array stride {stride} is not a multiple of the required alignment {alignment}")] ArrayStride { stride: u32, alignment: Alignment }, #[error("The struct span {span}, is not a multiple of the required alignment {alignment}")] StructSpan { span: u32, alignment: Alignment }, #[error("The struct member[{index}] offset {offset} is not a multiple of the required alignment {alignment}")] MemberOffset { index: u32, offset: u32, alignment: Alignment, }, #[error("The struct member[{index}] offset {offset} must be at least {expected}")] MemberOffsetAfterStruct { index: u32, offset: u32, expected: u32, }, #[error("The struct member[{index}] is not statically sized")] UnsizedMember { index: u32 }, #[error("The type is not host-shareable")] NonHostShareable, } #[derive(Clone, Debug, thiserror::Error)] pub enum TypeError { #[error(transparent)] BadHandle(#[from] BadHandle), #[error("The {0:?} scalar width {1} is not supported")] InvalidWidth(crate::ScalarKind, crate::Bytes), #[error("The {0:?} scalar width {1} is not supported for an atomic")] InvalidAtomicWidth(crate::ScalarKind, crate::Bytes), #[error("The base handle {0:?} can not be resolved")] UnresolvedBase(Handle), #[error("Invalid type for pointer target {0:?}")] InvalidPointerBase(Handle), #[error("Unsized types like {base:?} must be in the `Storage` address space, not `{space:?}`")] InvalidPointerToUnsized { base: Handle, space: crate::AddressSpace, }, #[error("Expected data type, found {0:?}")] InvalidData(Handle), #[error("Base type {0:?} for the array is invalid")] InvalidArrayBaseType(Handle), #[error("The constant {0:?} can not be used for an array size")] InvalidArraySizeConstant(Handle), #[error("The constant {0:?} is specialized, and cannot be used as an array size")] UnsupportedSpecializedArrayLength(Handle), #[error("Array type {0:?} must have a length of one or more")] NonPositiveArrayLength(Handle), #[error("Array stride {stride} does not match the expected {expected}")] InvalidArrayStride { stride: u32, expected: u32 }, #[error("Field '{0}' can't be dynamically-sized, has type {1:?}")] InvalidDynamicArray(String, Handle), #[error("Structure member[{index}] at {offset} overlaps the previous member")] MemberOverlap { index: u32, offset: u32 }, #[error( "Structure member[{index}] at {offset} and size {size} crosses the structure boundary of size {span}" )] MemberOutOfBounds { index: u32, offset: u32, size: u32, span: u32, }, #[error("Structure types must have at least one member")] EmptyStruct, } // Only makes sense if `flags.contains(HOST_SHAREABLE)` type LayoutCompatibility = Result, Disalignment)>; fn check_member_layout( accum: &mut LayoutCompatibility, member: &crate::StructMember, member_index: u32, member_layout: LayoutCompatibility, parent_handle: Handle, ) { *accum = match (*accum, member_layout) { (Ok(cur_alignment), Ok(alignment)) => { if alignment.is_aligned(member.offset) { Ok(cur_alignment.max(alignment)) } else { Err(( parent_handle, Disalignment::MemberOffset { index: member_index, offset: member.offset, alignment, }, )) } } (Err(e), _) | (_, Err(e)) => Err(e), }; } /// Determine whether a pointer in `space` can be passed as an argument. /// /// If a pointer in `space` is permitted to be passed as an argument to a /// user-defined function, return `TypeFlags::ARGUMENT`. Otherwise, return /// `TypeFlags::empty()`. /// /// Pointers passed as arguments to user-defined functions must be in the /// `Function`, `Private`, or `Workgroup` storage space. const fn ptr_space_argument_flag(space: crate::AddressSpace) -> TypeFlags { use crate::AddressSpace as As; match space { As::Function | As::Private | As::WorkGroup => TypeFlags::ARGUMENT, As::Uniform | As::Storage { .. } | As::Handle | As::PushConstant => TypeFlags::empty(), } } #[derive(Clone, Debug)] pub(super) struct TypeInfo { pub flags: TypeFlags, pub uniform_layout: LayoutCompatibility, pub storage_layout: LayoutCompatibility, } impl TypeInfo { const fn dummy() -> Self { TypeInfo { flags: TypeFlags::empty(), uniform_layout: Ok(Alignment::ONE), storage_layout: Ok(Alignment::ONE), } } const fn new(flags: TypeFlags, alignment: Alignment) -> Self { TypeInfo { flags, uniform_layout: Ok(alignment), storage_layout: Ok(alignment), } } } impl super::Validator { pub(super) const fn check_width(&self, kind: crate::ScalarKind, width: crate::Bytes) -> bool { match kind { crate::ScalarKind::Bool => width == crate::BOOL_WIDTH, crate::ScalarKind::Float => { width == 4 || (width == 8 && self.capabilities.contains(Capabilities::FLOAT64)) } crate::ScalarKind::Sint | crate::ScalarKind::Uint => width == 4, } } pub(super) fn reset_types(&mut self, size: usize) { self.types.clear(); self.types.resize(size, TypeInfo::dummy()); self.layouter.clear(); } pub(super) fn validate_type( &self, handle: Handle, types: &UniqueArena, constants: &Arena, ) -> Result { use crate::TypeInner as Ti; Ok(match types[handle].inner { Ti::Scalar { kind, width } => { if !self.check_width(kind, width) { return Err(TypeError::InvalidWidth(kind, width)); } let shareable = if kind.is_numeric() { TypeFlags::IO_SHAREABLE | TypeFlags::HOST_SHAREABLE } else { TypeFlags::empty() }; TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::COPY | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE | shareable, Alignment::from_width(width), ) } Ti::Vector { size, kind, width } => { if !self.check_width(kind, width) { return Err(TypeError::InvalidWidth(kind, width)); } let shareable = if kind.is_numeric() { TypeFlags::IO_SHAREABLE | TypeFlags::HOST_SHAREABLE } else { TypeFlags::empty() }; TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::COPY | TypeFlags::HOST_SHAREABLE | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE | shareable, Alignment::from(size) * Alignment::from_width(width), ) } Ti::Matrix { columns: _, rows, width, } => { if !self.check_width(crate::ScalarKind::Float, width) { return Err(TypeError::InvalidWidth(crate::ScalarKind::Float, width)); } TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::COPY | TypeFlags::HOST_SHAREABLE | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE, Alignment::from(rows) * Alignment::from_width(width), ) } Ti::Atomic { kind, width } => { let good = match kind { crate::ScalarKind::Bool | crate::ScalarKind::Float => false, crate::ScalarKind::Sint | crate::ScalarKind::Uint => width == 4, }; if !good { return Err(TypeError::InvalidAtomicWidth(kind, width)); } TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::HOST_SHAREABLE, Alignment::from_width(width), ) } Ti::Pointer { base, space } => { use crate::AddressSpace as As; if base >= handle { return Err(TypeError::UnresolvedBase(base)); } let base_info = &self.types[base.index()]; if !base_info.flags.contains(TypeFlags::DATA) { return Err(TypeError::InvalidPointerBase(base)); } // Runtime-sized values can only live in the `Storage` storage // space, so it's useless to have a pointer to such a type in // any other space. // // Detecting this problem here prevents the definition of // functions like: // // fn f(p: ptr) -> ... { ... } // // which would otherwise be permitted, but uncallable. (They // may also present difficulties in code generation). if !base_info.flags.contains(TypeFlags::SIZED) { match space { As::Storage { .. } => {} _ => { return Err(TypeError::InvalidPointerToUnsized { base, space }); } } } // `Validator::validate_function` actually checks the storage // space of pointer arguments explicitly before checking the // `ARGUMENT` flag, to give better error messages. But it seems // best to set `ARGUMENT` accurately anyway. let argument_flag = ptr_space_argument_flag(space); // Pointers cannot be stored in variables, structure members, or // array elements, so we do not mark them as `DATA`. TypeInfo::new( argument_flag | TypeFlags::SIZED | TypeFlags::COPY, Alignment::ONE, ) } Ti::ValuePointer { size: _, kind, width, space, } => { // ValuePointer should be treated the same way as the equivalent // Pointer / Scalar / Vector combination, so each step in those // variants' match arms should have a counterpart here. // // However, some cases are trivial: All our implicit base types // are DATA and SIZED, so we can never return // `InvalidPointerBase` or `InvalidPointerToUnsized`. if !self.check_width(kind, width) { return Err(TypeError::InvalidWidth(kind, width)); } // `Validator::validate_function` actually checks the storage // space of pointer arguments explicitly before checking the // `ARGUMENT` flag, to give better error messages. But it seems // best to set `ARGUMENT` accurately anyway. let argument_flag = ptr_space_argument_flag(space); // Pointers cannot be stored in variables, structure members, or // array elements, so we do not mark them as `DATA`. TypeInfo::new( argument_flag | TypeFlags::SIZED | TypeFlags::COPY, Alignment::ONE, ) } Ti::Array { base, size, stride } => { if base >= handle { return Err(TypeError::UnresolvedBase(base)); } let base_info = &self.types[base.index()]; if !base_info.flags.contains(TypeFlags::DATA | TypeFlags::SIZED) { return Err(TypeError::InvalidArrayBaseType(base)); } let base_layout = self.layouter[base]; let expected_stride = base_layout.to_stride(); if stride != expected_stride { return Err(TypeError::InvalidArrayStride { stride, expected: expected_stride, }); } let general_alignment = base_layout.alignment; let uniform_layout = match base_info.uniform_layout { Ok(base_alignment) => { let alignment = base_alignment .max(general_alignment) .max(Alignment::MIN_UNIFORM); if alignment.is_aligned(stride) { Ok(alignment) } else { Err((handle, Disalignment::ArrayStride { stride, alignment })) } } Err(e) => Err(e), }; let storage_layout = match base_info.storage_layout { Ok(base_alignment) => { let alignment = base_alignment.max(general_alignment); if alignment.is_aligned(stride) { Ok(alignment) } else { Err((handle, Disalignment::ArrayStride { stride, alignment })) } } Err(e) => Err(e), }; let sized_flag = match size { crate::ArraySize::Constant(const_handle) => { let constant = constants.try_get(const_handle)?; let length_is_positive = match *constant { crate::Constant { specialization: Some(_), .. } => { // Many of our back ends don't seem to support // specializable array lengths. If you want to try to make // this work, be sure to address all uses of // `Constant::to_array_length`, which ignores // specialization. return Err(TypeError::UnsupportedSpecializedArrayLength( const_handle, )); } crate::Constant { inner: crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Uint(length), }, .. } => length > 0, // Accept a signed integer size to avoid // requiring an explicit uint // literal. Type inference should make // this unnecessary. crate::Constant { inner: crate::ConstantInner::Scalar { width: _, value: crate::ScalarValue::Sint(length), }, .. } => length > 0, _ => { log::warn!("Array size {:?}", constant); return Err(TypeError::InvalidArraySizeConstant(const_handle)); } }; if !length_is_positive { return Err(TypeError::NonPositiveArrayLength(const_handle)); } TypeFlags::SIZED | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE } crate::ArraySize::Dynamic => { // Non-SIZED types may only appear as the last element of a structure. // This is enforced by checks for SIZED-ness for all compound types, // and a special case for structs. TypeFlags::empty() } }; let base_mask = TypeFlags::COPY | TypeFlags::HOST_SHAREABLE; TypeInfo { flags: TypeFlags::DATA | (base_info.flags & base_mask) | sized_flag, uniform_layout, storage_layout, } } Ti::Struct { ref members, span } => { if members.is_empty() { return Err(TypeError::EmptyStruct); } let mut ti = TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED | TypeFlags::COPY | TypeFlags::HOST_SHAREABLE | TypeFlags::IO_SHAREABLE | TypeFlags::ARGUMENT | TypeFlags::CONSTRUCTIBLE, Alignment::ONE, ); ti.uniform_layout = Ok(Alignment::MIN_UNIFORM); let mut min_offset = 0; let mut prev_struct_data: Option<(u32, u32)> = None; for (i, member) in members.iter().enumerate() { if member.ty >= handle { return Err(TypeError::UnresolvedBase(member.ty)); } let base_info = &self.types[member.ty.index()]; if !base_info.flags.contains(TypeFlags::DATA) { return Err(TypeError::InvalidData(member.ty)); } if !base_info.flags.contains(TypeFlags::HOST_SHAREABLE) { if ti.uniform_layout.is_ok() { ti.uniform_layout = Err((member.ty, Disalignment::NonHostShareable)); } if ti.storage_layout.is_ok() { ti.storage_layout = Err((member.ty, Disalignment::NonHostShareable)); } } ti.flags &= base_info.flags; if member.offset < min_offset { // HACK: this could be nicer. We want to allow some structures // to not bother with offsets/alignments if they are never // used for host sharing. if member.offset == 0 { ti.flags.set(TypeFlags::HOST_SHAREABLE, false); } else { return Err(TypeError::MemberOverlap { index: i as u32, offset: member.offset, }); } } let base_size = types[member.ty].inner.size(constants); min_offset = member.offset + base_size; if min_offset > span { return Err(TypeError::MemberOutOfBounds { index: i as u32, offset: member.offset, size: base_size, span, }); } check_member_layout( &mut ti.uniform_layout, member, i as u32, base_info.uniform_layout, handle, ); check_member_layout( &mut ti.storage_layout, member, i as u32, base_info.storage_layout, handle, ); // Validate rule: If a structure member itself has a structure type S, // then the number of bytes between the start of that member and // the start of any following member must be at least roundUp(16, SizeOf(S)). if let Some((span, offset)) = prev_struct_data { let diff = member.offset - offset; let min = Alignment::MIN_UNIFORM.round_up(span); if diff < min { ti.uniform_layout = Err(( handle, Disalignment::MemberOffsetAfterStruct { index: i as u32, offset: member.offset, expected: offset + min, }, )); } }; prev_struct_data = match types[member.ty].inner { crate::TypeInner::Struct { span, .. } => Some((span, member.offset)), _ => None, }; // The last field may be an unsized array. if !base_info.flags.contains(TypeFlags::SIZED) { let is_array = match types[member.ty].inner { crate::TypeInner::Array { .. } => true, _ => false, }; if !is_array || i + 1 != members.len() { let name = member.name.clone().unwrap_or_default(); return Err(TypeError::InvalidDynamicArray(name, member.ty)); } if ti.uniform_layout.is_ok() { ti.uniform_layout = Err((handle, Disalignment::UnsizedMember { index: i as u32 })); } } } let alignment = self.layouter[handle].alignment; if !alignment.is_aligned(span) { ti.uniform_layout = Err((handle, Disalignment::StructSpan { span, alignment })); ti.storage_layout = Err((handle, Disalignment::StructSpan { span, alignment })); } ti } Ti::Image { .. } | Ti::Sampler { .. } => { TypeInfo::new(TypeFlags::ARGUMENT, Alignment::ONE) } Ti::BindingArray { .. } => TypeInfo::new(TypeFlags::empty(), Alignment::ONE), }) } } ================================================ FILE: lib/naga/tests/in/access.param.ron ================================================ ( spv: ( version: (1, 1), debug: true, adjust_coordinate_space: false, ), msl: ( lang_version: (2, 0), per_stage_map: ( vs: ( resources: { (group: 0, binding: 0): (buffer: Some(0), mutable: false), (group: 0, binding: 1): (buffer: Some(1), mutable: false), (group: 0, binding: 2): (buffer: Some(2), mutable: false), (group: 0, binding: 3): (buffer: Some(3), mutable: false), }, sizes_buffer: Some(24), ), fs: ( resources: { (group: 0, binding: 0): (buffer: Some(0), mutable: true), (group: 0, binding: 2): (buffer: Some(2), mutable: true), }, sizes_buffer: Some(24), ), cs: ( resources: { (group: 0, binding: 0): (buffer: Some(0), mutable: true), }, sizes_buffer: Some(24), ), ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/access.wgsl ================================================ // This snapshot tests accessing various containers, dereferencing pointers. struct GlobalConst { a: u32, b: vec3, c: i32, } // tests msl padding insertion for global constants var global_const: GlobalConst = GlobalConst(0u, vec3(0u, 0u, 0u), 0); struct AlignedWrapper { @align(8) value: i32 } struct Bar { _matrix: mat4x3, matrix_array: array, 2>, atom: atomic, arr: array, 2>, data: array, } @group(0) @binding(0) var bar: Bar; struct Baz { m: mat3x2, } @group(0) @binding(1) var baz: Baz; @group(0) @binding(2) var qux: vec2; fn test_matrix_within_struct_accesses() { var idx = 1; idx--; // loads _ = baz.m; _ = baz.m[0]; _ = baz.m[idx]; _ = baz.m[0][1]; _ = baz.m[0][idx]; _ = baz.m[idx][1]; _ = baz.m[idx][idx]; var t = Baz(mat3x2(vec2(1.0), vec2(2.0), vec2(3.0))); idx++; // stores t.m = mat3x2(vec2(6.0), vec2(5.0), vec2(4.0)); t.m[0] = vec2(9.0); t.m[idx] = vec2(90.0); t.m[0][1] = 10.0; t.m[0][idx] = 20.0; t.m[idx][1] = 30.0; t.m[idx][idx] = 40.0; } struct MatCx2InArray { am: array, 2>, } @group(0) @binding(3) var nested_mat_cx2: MatCx2InArray; fn test_matrix_within_array_within_struct_accesses() { var idx = 1; idx--; // loads _ = nested_mat_cx2.am; _ = nested_mat_cx2.am[0]; _ = nested_mat_cx2.am[0][0]; _ = nested_mat_cx2.am[0][idx]; _ = nested_mat_cx2.am[0][0][1]; _ = nested_mat_cx2.am[0][0][idx]; _ = nested_mat_cx2.am[0][idx][1]; _ = nested_mat_cx2.am[0][idx][idx]; var t = MatCx2InArray(array, 2>()); idx++; // stores t.am = array, 2>(); t.am[0] = mat4x2(vec2(8.0), vec2(7.0), vec2(6.0), vec2(5.0)); t.am[0][0] = vec2(9.0); t.am[0][idx] = vec2(90.0); t.am[0][0][1] = 10.0; t.am[0][0][idx] = 20.0; t.am[0][idx][1] = 30.0; t.am[0][idx][idx] = 40.0; } fn read_from_private(foo: ptr) -> f32 { return *foo; } fn test_arr_as_arg(a: array, 5>) -> f32 { return a[4][9]; } @vertex fn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4 { var foo: f32 = 0.0; // We should check that backed doesn't skip this expression let baz: f32 = foo; foo = 1.0; test_matrix_within_struct_accesses(); test_matrix_within_array_within_struct_accesses(); // test storage loads let _matrix = bar._matrix; let arr = bar.arr; let index = 3u; let b = bar._matrix[index].x; let a = bar.data[arrayLength(&bar.data) - 2u].value; let c = qux; // test pointer types let data_pointer: ptr = &bar.data[0].value; let foo_value = read_from_private(&foo); // test array indexing var c = array(a, i32(b), 3, 4, 5); c[vi + 1u] = 42; let value = c[vi]; _ = test_arr_as_arg(array, 5>()); return vec4(_matrix * vec4(vec4(value)), 2.0); } @fragment fn foo_frag() -> @location(0) vec4 { // test storage stores bar._matrix[1].z = 1.0; bar._matrix = mat4x3(vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0)); bar.arr = array, 2>(vec2(0u), vec2(1u)); bar.data[1].value = 1; qux = vec2(); return vec4(0.0); } @compute @workgroup_size(1) fn atomics() { var tmp: i32; let value = atomicLoad(&bar.atom); tmp = atomicAdd(&bar.atom, 5); tmp = atomicSub(&bar.atom, 5); tmp = atomicAnd(&bar.atom, 5); tmp = atomicOr(&bar.atom, 5); tmp = atomicXor(&bar.atom, 5); tmp = atomicMin(&bar.atom, 5); tmp = atomicMax(&bar.atom, 5); tmp = atomicExchange(&bar.atom, 5); // https://github.com/gpuweb/gpuweb/issues/2021 // tmp = atomicCompareExchangeWeak(&bar.atom, 5, 5); atomicStore(&bar.atom, value); } var val: u32; fn assign_through_ptr_fn(p: ptr) { *p = 42u; } @compute @workgroup_size(1) fn assign_through_ptr() { assign_through_ptr_fn(&val); } ================================================ FILE: lib/naga/tests/in/binding-arrays.param.ron ================================================ ( god_mode: true, hlsl: ( shader_model: V5_1, binding_map: { (group: 0, binding: 0): (space: 0, register: 0, binding_array_size: Some(10)), (group: 0, binding: 1): (space: 1, register: 0), (group: 0, binding: 2): (space: 2, register: 0), (group: 0, binding: 3): (space: 3, register: 0), (group: 0, binding: 4): (space: 4, register: 0), (group: 0, binding: 5): (space: 5, register: 0), (group: 0, binding: 6): (space: 6, register: 0), (group: 0, binding: 7): (space: 7, register: 0), (group: 0, binding: 8): (space: 8, register: 0), }, fake_missing_bindings: true, special_constants_binding: None, ), msl: ( lang_version: (2, 0), per_stage_map: ( fs: ( resources: { (group: 0, binding: 0): (texture: Some(0), binding_array_size: Some(10), mutable: false), }, sizes_buffer: None, ) ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: true, ), spv: ( version: (1, 1), binding_map: { (group: 0, binding: 0): (binding_array_size: Some(10)), }, ), bounds_check_policies: ( index: ReadZeroSkipWrite, buffer: ReadZeroSkipWrite, image: ReadZeroSkipWrite, ) ) ================================================ FILE: lib/naga/tests/in/binding-arrays.wgsl ================================================ struct UniformIndex { index: u32 }; @group(0) @binding(0) var texture_array_unbounded: binding_array>; @group(0) @binding(1) var texture_array_bounded: binding_array, 5>; @group(0) @binding(2) var texture_array_2darray: binding_array, 5>; @group(0) @binding(3) var texture_array_multisampled: binding_array, 5>; @group(0) @binding(4) var texture_array_depth: binding_array; @group(0) @binding(5) var texture_array_storage: binding_array, 5>; @group(0) @binding(6) var samp: binding_array; @group(0) @binding(7) var samp_comp: binding_array; @group(0) @binding(8) var uni: UniformIndex; struct FragmentIn { @location(0) index: u32, }; @fragment fn main(fragment_in: FragmentIn) -> @location(0) vec4 { let uniform_index = uni.index; let non_uniform_index = fragment_in.index; var i1 = 0; var i2 = vec2(0); var v1 = 0.0; var v4 = vec4(0.0); // This example is arranged in the order of the texture definitions in the wgsl spec // // The first function uses texture_array_unbounded, the rest use texture_array_bounded to make sure // they both show up in the output. Functions that need depth use texture_array_2darray. // // We only test 2D f32 textures here as the machinery for binding indexing doesn't care about // texture format or texture dimension. let uv = vec2(0.0); let pix = vec2(0); i2 += textureDimensions(texture_array_unbounded[0]); i2 += textureDimensions(texture_array_unbounded[uniform_index]); i2 += textureDimensions(texture_array_unbounded[non_uniform_index]); v4 += textureGather(0, texture_array_bounded[0], samp[0], uv); v4 += textureGather(0, texture_array_bounded[uniform_index], samp[uniform_index], uv); v4 += textureGather(0, texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv); v4 += textureGatherCompare(texture_array_depth[0], samp_comp[0], uv, 0.0); v4 += textureGatherCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v4 += textureGatherCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v4 += textureLoad(texture_array_unbounded[0], pix, 0); v4 += textureLoad(texture_array_unbounded[uniform_index], pix, 0); v4 += textureLoad(texture_array_unbounded[non_uniform_index], pix, 0); i1 += textureNumLayers(texture_array_2darray[0]); i1 += textureNumLayers(texture_array_2darray[uniform_index]); i1 += textureNumLayers(texture_array_2darray[non_uniform_index]); i1 += textureNumLevels(texture_array_bounded[0]); i1 += textureNumLevels(texture_array_bounded[uniform_index]); i1 += textureNumLevels(texture_array_bounded[non_uniform_index]); i1 += textureNumSamples(texture_array_multisampled[0]); i1 += textureNumSamples(texture_array_multisampled[uniform_index]); i1 += textureNumSamples(texture_array_multisampled[non_uniform_index]); v4 += textureSample(texture_array_bounded[0], samp[0], uv); v4 += textureSample(texture_array_bounded[uniform_index], samp[uniform_index], uv); v4 += textureSample(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv); v4 += textureSampleBias(texture_array_bounded[0], samp[0], uv, 0.0); v4 += textureSampleBias(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0); v4 += textureSampleBias(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0); v1 += textureSampleCompare(texture_array_depth[0], samp_comp[0], uv, 0.0); v1 += textureSampleCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v1 += textureSampleCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v1 += textureSampleCompareLevel(texture_array_depth[0], samp_comp[0], uv, 0.0); v1 += textureSampleCompareLevel(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v1 += textureSampleCompareLevel(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v4 += textureSampleGrad(texture_array_bounded[0], samp[0], uv, uv, uv); v4 += textureSampleGrad(texture_array_bounded[uniform_index], samp[uniform_index], uv, uv, uv); v4 += textureSampleGrad(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, uv, uv); v4 += textureSampleLevel(texture_array_bounded[0], samp[0], uv, 0.0); v4 += textureSampleLevel(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0); v4 += textureSampleLevel(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0); textureStore(texture_array_storage[0], pix, v4); textureStore(texture_array_storage[uniform_index], pix, v4); textureStore(texture_array_storage[non_uniform_index], pix, v4); let v2 = vec2(i2 + vec2(i1)); return v4 + vec4(v2.x, v2.y, v2.x, v2.y) + v1; } ================================================ FILE: lib/naga/tests/in/bitcast.params.ron ================================================ ( msl: ( lang_version: (1, 2), per_stage_map: ( cs: ( resources: { }, sizes_buffer: Some(0), ) ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/bitcast.wgsl ================================================ @compute @workgroup_size(1) fn main() { var i2 = vec2(0); var i3 = vec3(0); var i4 = vec4(0); var u2 = vec2(0u); var u3 = vec3(0u); var u4 = vec4(0u); var f2 = vec2(0.0); var f3 = vec3(0.0); var f4 = vec4(0.0); u2 = bitcast>(i2); u3 = bitcast>(i3); u4 = bitcast>(i4); i2 = bitcast>(u2); i3 = bitcast>(u3); i4 = bitcast>(u4); f2 = bitcast>(i2); f3 = bitcast>(i3); f4 = bitcast>(i4); } ================================================ FILE: lib/naga/tests/in/bits.param.ron ================================================ ( msl: ( lang_version: (1, 2), per_stage_map: ( cs: ( resources: { }, sizes_buffer: Some(0), ) ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/bits.wgsl ================================================ @compute @workgroup_size(1) fn main() { var i = 0; var i2 = vec2(0); var i3 = vec3(0); var i4 = vec4(0); var u = 0u; var u2 = vec2(0u); var u3 = vec3(0u); var u4 = vec4(0u); var f2 = vec2(0.0); var f4 = vec4(0.0); u = pack4x8snorm(f4); u = pack4x8unorm(f4); u = pack2x16snorm(f2); u = pack2x16unorm(f2); u = pack2x16float(f2); f4 = unpack4x8snorm(u); f4 = unpack4x8unorm(u); f2 = unpack2x16snorm(u); f2 = unpack2x16unorm(u); f2 = unpack2x16float(u); i = insertBits(i, i, 5u, 10u); i2 = insertBits(i2, i2, 5u, 10u); i3 = insertBits(i3, i3, 5u, 10u); i4 = insertBits(i4, i4, 5u, 10u); u = insertBits(u, u, 5u, 10u); u2 = insertBits(u2, u2, 5u, 10u); u3 = insertBits(u3, u3, 5u, 10u); u4 = insertBits(u4, u4, 5u, 10u); i = extractBits(i, 5u, 10u); i2 = extractBits(i2, 5u, 10u); i3 = extractBits(i3, 5u, 10u); i4 = extractBits(i4, 5u, 10u); u = extractBits(u, 5u, 10u); u2 = extractBits(u2, 5u, 10u); u3 = extractBits(u3, 5u, 10u); u4 = extractBits(u4, 5u, 10u); i = firstTrailingBit(i); u2 = firstTrailingBit(u2); i3 = firstLeadingBit(i3); u = firstLeadingBit(u); i = countOneBits(i); i2 = countOneBits(i2); i3 = countOneBits(i3); i4 = countOneBits(i4); u = countOneBits(u); u2 = countOneBits(u2); u3 = countOneBits(u3); u4 = countOneBits(u4); i = reverseBits(i); i2 = reverseBits(i2); i3 = reverseBits(i3); i4 = reverseBits(i4); u = reverseBits(u); u2 = reverseBits(u2); u3 = reverseBits(u3); u4 = reverseBits(u4); } ================================================ FILE: lib/naga/tests/in/boids.param.ron ================================================ ( spv: ( version: (1, 0), debug: true, adjust_coordinate_space: false, ), msl: ( lang_version: (2, 0), per_stage_map: ( cs: ( resources: { (group: 0, binding: 0): (buffer: Some(0), mutable: false), (group: 0, binding: 1): (buffer: Some(1), mutable: true), (group: 0, binding: 2): (buffer: Some(2), mutable: true), }, sizes_buffer: Some(3), ) ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/boids.wgsl ================================================ let NUM_PARTICLES: u32 = 1500u; struct Particle { pos : vec2, vel : vec2, } struct SimParams { deltaT : f32, rule1Distance : f32, rule2Distance : f32, rule3Distance : f32, rule1Scale : f32, rule2Scale : f32, rule3Scale : f32, } struct Particles { particles : array } @group(0) @binding(0) var params : SimParams; @group(0) @binding(1) var particlesSrc : Particles; @group(0) @binding(2) var particlesDst : Particles; // https://github.com/austinEng/Project6-Vulkan-Flocking/blob/master/data/shaders/computeparticles/particle.comp @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) global_invocation_id : vec3) { let index : u32 = global_invocation_id.x; if index >= NUM_PARTICLES { return; } var vPos = particlesSrc.particles[index].pos; var vVel = particlesSrc.particles[index].vel; var cMass = vec2(0.0, 0.0); var cVel = vec2(0.0, 0.0); var colVel = vec2(0.0, 0.0); var cMassCount : i32 = 0; var cVelCount : i32 = 0; var pos : vec2; var vel : vec2; var i : u32 = 0u; loop { if i >= NUM_PARTICLES { break; } if i == index { continue; } pos = particlesSrc.particles[i].pos; vel = particlesSrc.particles[i].vel; if distance(pos, vPos) < params.rule1Distance { cMass = cMass + pos; cMassCount = cMassCount + 1; } if distance(pos, vPos) < params.rule2Distance { colVel = colVel - (pos - vPos); } if distance(pos, vPos) < params.rule3Distance { cVel = cVel + vel; cVelCount = cVelCount + 1; } continuing { i = i + 1u; } } if cMassCount > 0 { cMass = cMass / f32(cMassCount) - vPos; } if cVelCount > 0 { cVel = cVel / f32(cVelCount); } vVel = vVel + (cMass * params.rule1Scale) + (colVel * params.rule2Scale) + (cVel * params.rule3Scale); // clamp velocity for a more pleasing simulation vVel = normalize(vVel) * clamp(length(vVel), 0.0, 0.1); // kinematic update vPos = vPos + (vVel * params.deltaT); // Wrap around boundary if vPos.x < -1.0 { vPos.x = 1.0; } if vPos.x > 1.0 { vPos.x = -1.0; } if vPos.y < -1.0 { vPos.y = 1.0; } if vPos.y > 1.0 { vPos.y = -1.0; } // Write back particlesDst.particles[index].pos = vPos; particlesDst.particles[index].vel = vVel; } ================================================ FILE: lib/naga/tests/in/bounds-check-image-restrict.param.ron ================================================ ( bounds_check_policies: ( image: Restrict, ), spv: ( version: (1, 1), debug: true, ), glsl: ( version: Desktop(430), writer_flags: (bits: 0), binding_map: { }, ), ) ================================================ FILE: lib/naga/tests/in/bounds-check-image-restrict.wgsl ================================================ @group(0) @binding(0) var image_1d: texture_1d; fn test_textureLoad_1d(coords: i32, level: i32) -> vec4 { return textureLoad(image_1d, coords, level); } @group(0) @binding(1) var image_2d: texture_2d; fn test_textureLoad_2d(coords: vec2, level: i32) -> vec4 { return textureLoad(image_2d, coords, level); } @group(0) @binding(2) var image_2d_array: texture_2d_array; fn test_textureLoad_2d_array(coords: vec2, index: i32, level: i32) -> vec4 { return textureLoad(image_2d_array, coords, index, level); } @group(0) @binding(3) var image_3d: texture_3d; fn test_textureLoad_3d(coords: vec3, level: i32) -> vec4 { return textureLoad(image_3d, coords, level); } @group(0) @binding(4) var image_multisampled_2d: texture_multisampled_2d; fn test_textureLoad_multisampled_2d(coords: vec2, _sample: i32) -> vec4 { return textureLoad(image_multisampled_2d, coords, _sample); } @group(0) @binding(5) var image_depth_2d: texture_depth_2d; fn test_textureLoad_depth_2d(coords: vec2, level: i32) -> f32 { return textureLoad(image_depth_2d, coords, level); } @group(0) @binding(6) var image_depth_2d_array: texture_depth_2d_array; fn test_textureLoad_depth_2d_array(coords: vec2, index: i32, level: i32) -> f32 { return textureLoad(image_depth_2d_array, coords, index, level); } @group(0) @binding(7) var image_depth_multisampled_2d: texture_depth_multisampled_2d; fn test_textureLoad_depth_multisampled_2d(coords: vec2, _sample: i32) -> f32 { return textureLoad(image_depth_multisampled_2d, coords, _sample); } @group(0) @binding(8) var image_storage_1d: texture_storage_1d; fn test_textureStore_1d(coords: i32, value: vec4) { textureStore(image_storage_1d, coords, value); } @group(0) @binding(9) var image_storage_2d: texture_storage_2d; fn test_textureStore_2d(coords: vec2, value: vec4) { textureStore(image_storage_2d, coords, value); } @group(0) @binding(10) var image_storage_2d_array: texture_storage_2d_array; fn test_textureStore_2d_array(coords: vec2, array_index: i32, value: vec4) { textureStore(image_storage_2d_array, coords, array_index, value); } @group(0) @binding(11) var image_storage_3d: texture_storage_3d; fn test_textureStore_3d(coords: vec3, value: vec4) { textureStore(image_storage_3d, coords, value); } // GLSL output requires that we identify an entry point, so // that it can tell what "in" and "out" globals to write. @fragment fn fragment_shader() -> @location(0) vec4 { test_textureLoad_1d(0, 0); test_textureLoad_2d(vec2(), 0); test_textureLoad_2d_array(vec2(), 0, 0); test_textureLoad_3d(vec3(), 0); test_textureLoad_multisampled_2d(vec2(), 0); // Not yet implemented for GLSL: // test_textureLoad_depth_2d(vec2(), 0); // test_textureLoad_depth_2d_array(vec2(), 0, 0); // test_textureLoad_depth_multisampled_2d(vec2(), 0); test_textureStore_1d(0, vec4()); test_textureStore_2d(vec2(), vec4()); test_textureStore_2d_array(vec2(), 0, vec4()); test_textureStore_3d(vec3(), vec4()); return vec4(0.,0.,0.,0.); } ================================================ FILE: lib/naga/tests/in/bounds-check-image-rzsw.param.ron ================================================ ( bounds_check_policies: ( image: ReadZeroSkipWrite, ), spv: ( version: (1, 1), debug: true, ), glsl: ( version: Desktop(430), writer_flags: (bits: 0), binding_map: { }, ), ) ================================================ FILE: lib/naga/tests/in/bounds-check-image-rzsw.wgsl ================================================ @group(0) @binding(0) var image_1d: texture_1d; fn test_textureLoad_1d(coords: i32, level: i32) -> vec4 { return textureLoad(image_1d, coords, level); } @group(0) @binding(1) var image_2d: texture_2d; fn test_textureLoad_2d(coords: vec2, level: i32) -> vec4 { return textureLoad(image_2d, coords, level); } @group(0) @binding(2) var image_2d_array: texture_2d_array; fn test_textureLoad_2d_array(coords: vec2, index: i32, level: i32) -> vec4 { return textureLoad(image_2d_array, coords, index, level); } @group(0) @binding(3) var image_3d: texture_3d; fn test_textureLoad_3d(coords: vec3, level: i32) -> vec4 { return textureLoad(image_3d, coords, level); } @group(0) @binding(4) var image_multisampled_2d: texture_multisampled_2d; fn test_textureLoad_multisampled_2d(coords: vec2, _sample: i32) -> vec4 { return textureLoad(image_multisampled_2d, coords, _sample); } @group(0) @binding(5) var image_depth_2d: texture_depth_2d; fn test_textureLoad_depth_2d(coords: vec2, level: i32) -> f32 { return textureLoad(image_depth_2d, coords, level); } @group(0) @binding(6) var image_depth_2d_array: texture_depth_2d_array; fn test_textureLoad_depth_2d_array(coords: vec2, index: i32, level: i32) -> f32 { return textureLoad(image_depth_2d_array, coords, index, level); } @group(0) @binding(7) var image_depth_multisampled_2d: texture_depth_multisampled_2d; fn test_textureLoad_depth_multisampled_2d(coords: vec2, _sample: i32) -> f32 { return textureLoad(image_depth_multisampled_2d, coords, _sample); } @group(0) @binding(8) var image_storage_1d: texture_storage_1d; fn test_textureStore_1d(coords: i32, value: vec4) { textureStore(image_storage_1d, coords, value); } @group(0) @binding(9) var image_storage_2d: texture_storage_2d; fn test_textureStore_2d(coords: vec2, value: vec4) { textureStore(image_storage_2d, coords, value); } @group(0) @binding(10) var image_storage_2d_array: texture_storage_2d_array; fn test_textureStore_2d_array(coords: vec2, array_index: i32, value: vec4) { textureStore(image_storage_2d_array, coords, array_index, value); } @group(0) @binding(11) var image_storage_3d: texture_storage_3d; fn test_textureStore_3d(coords: vec3, value: vec4) { textureStore(image_storage_3d, coords, value); } // GLSL output requires that we identify an entry point, so // that it can tell what "in" and "out" globals to write. @fragment fn fragment_shader() -> @location(0) vec4 { test_textureLoad_1d(0, 0); test_textureLoad_2d(vec2(), 0); test_textureLoad_2d_array(vec2(), 0, 0); test_textureLoad_3d(vec3(), 0); test_textureLoad_multisampled_2d(vec2(), 0); // Not yet implemented for GLSL: // test_textureLoad_depth_2d(vec2(), 0); // test_textureLoad_depth_2d_array(vec2(), 0, 0); // test_textureLoad_depth_multisampled_2d(vec2(), 0); test_textureStore_1d(0, vec4()); test_textureStore_2d(vec2(), vec4()); test_textureStore_2d_array(vec2(), 0, vec4()); test_textureStore_3d(vec3(), vec4()); return vec4(0.,0.,0.,0.); } ================================================ FILE: lib/naga/tests/in/bounds-check-restrict.param.ron ================================================ ( bounds_check_policies: ( index: Restrict, buffer: Restrict, ), ) ================================================ FILE: lib/naga/tests/in/bounds-check-restrict.wgsl ================================================ // Tests for `naga::back::BoundsCheckPolicy::Restrict`. struct Globals { a: array, v: vec4, m: mat3x4, d: array, } @group(0) @binding(0) var globals: Globals; fn index_array(i: i32) -> f32 { return globals.a[i]; } fn index_dynamic_array(i: i32) -> f32 { return globals.d[i]; } fn index_vector(i: i32) -> f32 { return globals.v[i]; } fn index_vector_by_value(v: vec4, i: i32) -> f32 { return v[i]; } fn index_matrix(i: i32) -> vec4 { return globals.m[i]; } fn index_twice(i: i32, j: i32) -> f32 { return globals.m[i][j]; } fn index_expensive(i: i32) -> f32 { return globals.a[i32(sin(f32(i) / 100.0) * 100.0)]; } fn index_in_bounds() -> f32 { return globals.a[9] + globals.v[3] + globals.m[2][3]; } fn set_array(i: i32, v: f32) { globals.a[i] = v; } fn set_dynamic_array(i: i32, v: f32) { globals.d[i] = v; } fn set_vector(i: i32, v: f32) { globals.v[i] = v; } fn set_matrix(i: i32, v: vec4) { globals.m[i] = v; } fn set_index_twice(i: i32, j: i32, v: f32) { globals.m[i][j] = v; } fn set_expensive(i: i32, v: f32) { globals.a[i32(sin(f32(i) / 100.0) * 100.0)] = v; } fn set_in_bounds(v: f32) { globals.a[9] = v; globals.v[3] = v; globals.m[2][3] = v; } ================================================ FILE: lib/naga/tests/in/bounds-check-zero-atomic.param.ron ================================================ ( bounds_check_policies: ( index: ReadZeroSkipWrite, buffer: ReadZeroSkipWrite, ), ) ================================================ FILE: lib/naga/tests/in/bounds-check-zero-atomic.wgsl ================================================ // Tests for `naga::back::BoundsCheckPolicy::ReadZeroSkipWrite` for atomic types. // These are separate from `bounds-check-zero.wgsl because SPIR-V does not yet // support `ReadZeroSkipWrite` for atomics. Once it does, the test files could // be combined. struct Globals { a: atomic, b: array, 10>, c: array>, } @group(0) @binding(0) var globals: Globals; fn fetch_add_atomic() -> u32 { return atomicAdd(&globals.a, 1u); } fn fetch_add_atomic_static_sized_array(i: i32) -> u32 { return atomicAdd(&globals.b[i], 1u); } fn fetch_add_atomic_dynamic_sized_array(i: i32) -> u32 { return atomicAdd(&globals.c[i], 1u); } ================================================ FILE: lib/naga/tests/in/bounds-check-zero.param.ron ================================================ ( bounds_check_policies: ( index: ReadZeroSkipWrite, buffer: ReadZeroSkipWrite, ), ) ================================================ FILE: lib/naga/tests/in/bounds-check-zero.wgsl ================================================ // Tests for `naga::back::BoundsCheckPolicy::ReadZeroSkipWrite`. struct Globals { a: array, v: vec4, m: mat3x4, d: array, } @group(0) @binding(0) var globals: Globals; fn index_array(i: i32) -> f32 { return globals.a[i]; } fn index_dynamic_array(i: i32) -> f32 { return globals.d[i]; } fn index_vector(i: i32) -> f32 { return globals.v[i]; } fn index_vector_by_value(v: vec4, i: i32) -> f32 { return v[i]; } fn index_matrix(i: i32) -> vec4 { return globals.m[i]; } fn index_twice(i: i32, j: i32) -> f32 { return globals.m[i][j]; } fn index_expensive(i: i32) -> f32 { return globals.a[i32(sin(f32(i) / 100.0) * 100.0)]; } fn index_in_bounds() -> f32 { return globals.a[9] + globals.v[3] + globals.m[2][3]; } fn set_array(i: i32, v: f32) { globals.a[i] = v; } fn set_dynamic_array(i: i32, v: f32) { globals.d[i] = v; } fn set_vector(i: i32, v: f32) { globals.v[i] = v; } fn set_matrix(i: i32, v: vec4) { globals.m[i] = v; } fn set_index_twice(i: i32, j: i32, v: f32) { globals.m[i][j] = v; } fn set_expensive(i: i32, v: f32) { globals.a[i32(sin(f32(i) / 100.0) * 100.0)] = v; } fn set_in_bounds(v: f32) { globals.a[9] = v; globals.v[3] = v; globals.m[2][3] = v; } ================================================ FILE: lib/naga/tests/in/break-if.wgsl ================================================ @compute @workgroup_size(1) fn main() {} fn breakIfEmpty() { loop { continuing { break if true; } } } fn breakIfEmptyBody(a: bool) { loop { continuing { var b = a; var c = a != b; break if a == c; } } } fn breakIf(a: bool) { loop { var d = a; var e = a != d; continuing { break if a == e; } } } ================================================ FILE: lib/naga/tests/in/collatz.param.ron ================================================ ( spv: ( version: (1, 0), debug: true, ), ) ================================================ FILE: lib/naga/tests/in/collatz.wgsl ================================================ struct PrimeIndices { data: array } // this is used as both input and output for convenience @group(0) @binding(0) var v_indices: PrimeIndices; // The Collatz Conjecture states that for any integer n: // If n is even, n = n/2 // If n is odd, n = 3n+1 // And repeat this process for each new n, you will always eventually reach 1. // Though the conjecture has not been proven, no counterexample has ever been found. // This function returns how many times this recurrence needs to be applied to reach 1. fn collatz_iterations(n_base: u32) -> u32 { var n = n_base; var i: u32 = 0u; while n > 1u { if n % 2u == 0u { n = n / 2u; } else { n = 3u * n + 1u; } i = i + 1u; } return i; } @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3) { v_indices.data[global_id.x] = collatz_iterations(v_indices.data[global_id.x]); } ================================================ FILE: lib/naga/tests/in/control-flow.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/control-flow.wgsl ================================================ @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3) { //TODO: execution-only barrier? storageBarrier(); workgroupBarrier(); var pos: i32; // switch without cases switch 1 { default: { pos = 1; } } // non-empty switch *not* in last-statement-in-function position // (return statements might be inserted into the switch cases otherwise) switch pos { case 1: { pos = 0; break; } case 2: { pos = 1; } case 3: { pos = 2; fallthrough; } case 4: { pos = 3; fallthrough; } default: { pos = 4; } } // switch with unsigned integer selectors switch(0u) { case 0u: { } default: { } } // non-empty switch in last-statement-in-function position switch pos { case 1: { pos = 0; break; } case 2: { pos = 1; } case 3: { pos = 2; fallthrough; } case 4: {} default: { pos = 3; } } } fn switch_default_break(i: i32) { switch i { default: { break; } } } fn switch_case_break() { switch(0) { case 0: { break; } default: {} } return; } fn loop_switch_continue(x: i32) { loop { switch x { case 1: { continue; } default: {} } } } ================================================ FILE: lib/naga/tests/in/cubeArrayShadow.wgsl ================================================ @group(0) @binding(4) var point_shadow_textures: texture_depth_cube_array; @group(0) @binding(5) var point_shadow_textures_sampler: sampler_comparison; @fragment fn fragment() -> @location(0) vec4 { let frag_ls = vec4(1., 1., 2., 1.).xyz; let a = textureSampleCompare(point_shadow_textures, point_shadow_textures_sampler, frag_ls, i32(1), 1.); return vec4(a, 1., 1., 1.); } ================================================ FILE: lib/naga/tests/in/empty.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/empty.wgsl ================================================ @compute @workgroup_size(1) fn main() {} ================================================ FILE: lib/naga/tests/in/extra.param.ron ================================================ ( god_mode: true, spv: ( version: (1, 2), ), msl: ( lang_version: (2, 2), per_stage_map: ( fs: ( push_constant_buffer: Some(1), ), ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/extra.wgsl ================================================ struct PushConstants { index: u32, double: vec2, } var pc: PushConstants; struct FragmentIn { @location(0) color: vec4, @builtin(primitive_index) primitive_index: u32, } @fragment fn main(in: FragmentIn) -> @location(0) vec4 { if in.primitive_index == pc.index { return in.color; } else { return vec4(vec3(1.0) - in.color.rgb, in.color.a); } } ================================================ FILE: lib/naga/tests/in/functions-webgl.param.ron ================================================ ( glsl: ( version: Embedded( version: 300, is_webgl: false ), writer_flags: (bits: 0), binding_map: {}, ), ) ================================================ FILE: lib/naga/tests/in/functions-webgl.wgsl ================================================ fn test_fma() -> vec2 { let a = vec2(2.0, 2.0); let b = vec2(0.5, 0.5); let c = vec2(0.5, 0.5); return fma(a, b, c); } @vertex fn main() { let a = test_fma(); } ================================================ FILE: lib/naga/tests/in/functions.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/functions.wgsl ================================================ fn test_fma() -> vec2 { let a = vec2(2.0, 2.0); let b = vec2(0.5, 0.5); let c = vec2(0.5, 0.5); // Hazard: HLSL needs a different intrinsic function for f32 and f64 // See: https://github.com/gfx-rs/naga/issues/1579 return fma(a, b, c); } fn test_integer_dot_product() -> i32 { let a_2 = vec2(1); let b_2 = vec2(1); let c_2: i32 = dot(a_2, b_2); let a_3 = vec3(1u); let b_3 = vec3(1u); let c_3: u32 = dot(a_3, b_3); // test baking of arguments let c_4: i32 = dot(vec4(4), vec4(2)); return c_4; } @compute @workgroup_size(1) fn main() { let a = test_fma(); let b = test_integer_dot_product(); } ================================================ FILE: lib/naga/tests/in/globals.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/globals.wgsl ================================================ // Global variable & constant declarations let Foo: bool = true; var wg : array; var at: atomic; struct Foo { v3: vec3, // test packed vec3 v1: f32, } @group(0) @binding(1) var alignment: Foo; @group(0) @binding(2) var dummy: array>; @group(0) @binding(3) var float_vecs: array, 20>; @group(0) @binding(4) var global_vec: vec3; @group(0) @binding(5) var global_mat: mat3x2; @group(0) @binding(6) var global_nested_arrays_of_matrices_2x4: array, 2>, 2>; @group(0) @binding(7) var global_nested_arrays_of_matrices_4x2: array, 2>, 2>; fn test_msl_packed_vec3_as_arg(arg: vec3) {} fn test_msl_packed_vec3() { // stores alignment.v3 = vec3(1.0); var idx = 1; alignment.v3.x = 1.0; alignment.v3[0] = 2.0; alignment.v3[idx] = 3.0; // force load to happen here let data = alignment; // loads _ = data.v3; _ = data.v3.zx; test_msl_packed_vec3_as_arg(data.v3); // matrix vector multiplication _ = data.v3 * mat3x3(); _ = mat3x3() * data.v3; // scalar vector multiplication _ = data.v3 * 2.0; _ = 2.0 * data.v3; } @compute @workgroup_size(1) fn main() { test_msl_packed_vec3(); wg[7] = (global_nested_arrays_of_matrices_4x2[0][0] * global_nested_arrays_of_matrices_2x4[0][0][0]).x; wg[6] = (global_mat * global_vec).x; wg[5] = dummy[1].y; wg[4] = float_vecs[0].w; wg[3] = alignment.v1; wg[2] = alignment.v3.x; alignment.v1 = 4.0; wg[1] = f32(arrayLength(&dummy)); atomicStore(&at, 2u); // Valid, Foo and at is in function scope var Foo: f32 = 1.0; var at: bool = true; } ================================================ FILE: lib/naga/tests/in/glsl/210-bevy-2d-shader.frag ================================================ // AUTHOR: mrk-its // ISSUE: #210 // FIX: #898 #version 450 layout(location = 0) in vec2 v_Uv; layout(location = 0) out vec4 o_Target; layout(set = 1, binding = 0) uniform ColorMaterial_color { vec4 Color; }; # ifdef COLORMATERIAL_TEXTURE layout(set = 1, binding = 1) uniform texture2D ColorMaterial_texture; layout(set = 1, binding = 2) uniform sampler ColorMaterial_texture_sampler; # endif void main() { vec4 color = Color; # ifdef COLORMATERIAL_TEXTURE color *= texture( sampler2D(ColorMaterial_texture, ColorMaterial_texture_sampler), v_Uv); # endif o_Target = color; } ================================================ FILE: lib/naga/tests/in/glsl/210-bevy-2d-shader.vert ================================================ // AUTHOR: mrk-its // ISSUE: #210 // FIX: #898 #version 450 layout(location = 0) in vec3 Vertex_Position; layout(location = 1) in vec3 Vertex_Normal; layout(location = 2) in vec2 Vertex_Uv; layout(location = 0) out vec2 v_Uv; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; }; layout(set = 2, binding = 0) uniform Transform { mat4 Model; }; layout(set = 2, binding = 1) uniform Sprite_size { vec2 size; }; void main() { v_Uv = Vertex_Uv; vec3 position = Vertex_Position * vec3(size, 1.0); gl_Position = ViewProj * Model * vec4(position, 1.0); } ================================================ FILE: lib/naga/tests/in/glsl/210-bevy-shader.vert ================================================ // AUTHOR: enfipy // ISSUE: #210 // FIX: #898 #version 450 layout(location = 0) in vec3 Vertex_Position; layout(location = 1) in vec3 Vertex_Normal; layout(location = 2) in vec2 Vertex_Uv; layout(location = 0) out vec3 v_Position; layout(location = 1) out vec3 v_Normal; layout(location = 2) out vec2 v_Uv; layout(set = 0, binding = 0) uniform Camera { mat4 ViewProj; }; layout(set = 2, binding = 0) uniform Transform { mat4 Model; }; void main() { v_Normal = (Model * vec4(Vertex_Normal, 1.0)).xyz; v_Normal = mat3(Model) * Vertex_Normal; v_Position = (Model * vec4(Vertex_Position, 1.0)).xyz; v_Uv = Vertex_Uv; gl_Position = ViewProj * vec4(v_Position, 1.0); } ================================================ FILE: lib/naga/tests/in/glsl/246-collatz.comp ================================================ // AUTHOR: Unknown // ISSUE: #246 // NOTE: Taken from the wgpu repo #version 450 layout(local_size_x = 1) in; layout(set = 0, binding = 0) buffer PrimeIndices { uint[] indices; }; // this is used as both input and output for convenience // The Collatz Conjecture states that for any integer n: // If n is even, n = n/2 // If n is odd, n = 3n+1 // And repeat this process for each new n, you will always eventually reach 1. // Though the conjecture has not been proven, no counterexample has ever been found. // This function returns how many times this recurrence needs to be applied to reach 1. uint collatz_iterations(uint n) { uint i = 0; while(n != 1) { if (mod(n, 2) == 0) { n = n / 2; } else { n = (3 * n) + 1; } i++; } return i; } void main() { uint index = gl_GlobalInvocationID.x; indices[index] = collatz_iterations(indices[index]); } ================================================ FILE: lib/naga/tests/in/glsl/277-casting.vert ================================================ // AUTHOR: Napokue // ISSUE: #277 // FIX: #278 #version 450 void main() { float a = float(1); } ================================================ FILE: lib/naga/tests/in/glsl/280-matrix-cast.vert ================================================ // AUTHOR: pjoe // ISSUE: #280 // FIX: #898 #version 450 void main() { mat4 a = mat4(1); } ================================================ FILE: lib/naga/tests/in/glsl/484-preprocessor-if.vert ================================================ // AUTHOR: fintelia // ISSUE: #484 // FIX: https://github.com/Kangz/glslpp-rs/pull/30 // NOTE: Shader altered to use correct syntax #version 450 core #if 0 #endif void main() { } ================================================ FILE: lib/naga/tests/in/glsl/800-out-of-bounds-panic.vert ================================================ // AUTHOR: Herschel // ISSUE: #800 // FIX: #901 #version 450 // Set 0: globals layout(set = 0, binding = 0) uniform Globals { mat4 view_matrix; }; // Push constants: matrix + color layout(push_constant) uniform VertexPushConstants { mat4 world_matrix; }; layout(location = 0) in vec2 position; layout(location = 1) in vec4 color; layout(location = 0) out vec4 frag_color; void main() { frag_color = color; gl_Position = view_matrix * world_matrix * vec4(position, 0.0, 1.0); gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0; } ================================================ FILE: lib/naga/tests/in/glsl/896-push-constant.vert ================================================ // AUTHOR: Foltik // ISSUE: #896 // FIX: #897 #version 450 layout(push_constant) uniform PushConstants { float example; } c; void main() {} ================================================ FILE: lib/naga/tests/in/glsl/900-implicit-conversions.vert ================================================ // ISSUE: #900 #version 450 // Signature match call the second overload void exact(float a) {} void exact(int a) {} // No signature match but one overload satisfies the cast rules void implicit(float a) {} void implicit(int a) {} // All satisfy the kind condition but they have different dimensions void implicit_dims(float v) { } void implicit_dims(vec2 v) { } void implicit_dims(vec3 v) { } void implicit_dims(vec4 v) { } void main() { exact(1); implicit(1u); implicit_dims(ivec3(1)); } ================================================ FILE: lib/naga/tests/in/glsl/901-lhs-field-select.vert ================================================ // AUTHOR: JCapucho // ISSUE: #901 // FIX: #948 #version 450 void main() { vec4 a = vec4(1.0); a.x = 2.0; } ================================================ FILE: lib/naga/tests/in/glsl/931-constant-emitting.vert ================================================ // AUTHOR: jakobhellermann // ISSUE: #931 // FIX: #933 #version 450 const int constant = 10; float function() { return 0.0; } void main() {} ================================================ FILE: lib/naga/tests/in/glsl/932-for-loop-if.vert ================================================ // AUTHOR: jakobhellermann // ISSUE: #932 // FIX: #935 #version 450 void main() { for (int i = 0; i < 1; i += 1) {} } ================================================ FILE: lib/naga/tests/in/glsl/bevy-pbr.frag ================================================ // MIT License // // Copyright (c) 2020 Carter Anderson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // // NOTE: Taken from the bevy repo #version 450 const int MAX_POINT_LIGHTS = 10; const int MAX_DIRECTIONAL_LIGHTS = 1; struct PointLight { vec4 pos; vec4 color; vec4 lightParams; }; struct DirectionalLight { vec4 direction; vec4 color; }; layout(location = 0) in vec3 v_WorldPosition; layout(location = 1) in vec3 v_WorldNormal; layout(location = 2) in vec2 v_Uv; layout(location = 3) in vec4 v_WorldTangent; layout(location = 0) out vec4 o_Target; layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; }; layout(std140, set = 0, binding = 1) uniform CameraPosition { vec4 CameraPos; }; layout(std140, set = 1, binding = 0) uniform Lights { vec4 AmbientColor; uvec4 NumLights; // x = point lights, y = directional lights PointLight PointLights[MAX_POINT_LIGHTS]; DirectionalLight DirectionalLights[MAX_DIRECTIONAL_LIGHTS]; }; layout(set = 3, binding = 0) uniform StandardMaterial_base_color { vec4 base_color; }; layout(set = 3, binding = 1) uniform texture2D StandardMaterial_base_color_texture; layout(set = 3, binding = 2) uniform sampler StandardMaterial_base_color_texture_sampler; layout(set = 3, binding = 3) uniform StandardMaterial_roughness { float perceptual_roughness; }; layout(set = 3, binding = 4) uniform StandardMaterial_metallic { float metallic; }; layout(set = 3, binding = 5) uniform texture2D StandardMaterial_metallic_roughness_texture; layout(set = 3, binding = 6) uniform sampler StandardMaterial_metallic_roughness_texture_sampler; layout(set = 3, binding = 7) uniform StandardMaterial_reflectance { float reflectance; }; layout(set = 3, binding = 8) uniform texture2D StandardMaterial_normal_map; layout(set = 3, binding = 9) uniform sampler StandardMaterial_normal_map_sampler; layout(set = 3, binding = 10) uniform texture2D StandardMaterial_occlusion_texture; layout(set = 3, binding = 11) uniform sampler StandardMaterial_occlusion_texture_sampler; layout(set = 3, binding = 12) uniform StandardMaterial_emissive { vec4 emissive; }; layout(set = 3, binding = 13) uniform texture2D StandardMaterial_emissive_texture; layout(set = 3, binding = 14) uniform sampler StandardMaterial_emissive_texture_sampler; # define saturate(x) clamp(x, 0.0, 1.0) const float PI = 3.141592653589793; float pow5(float x) { float x2 = x * x; return x2 * x2 * x; } // distanceAttenuation is simply the square falloff of light intensity // combined with a smooth attenuation at the edge of the light radius // // light radius is a non-physical construct for efficiency purposes, // because otherwise every light affects every fragment in the scene float getDistanceAttenuation(float distanceSquare, float inverseRangeSquared) { float factor = distanceSquare * inverseRangeSquared; float smoothFactor = saturate(1.0 - factor * factor); float attenuation = smoothFactor * smoothFactor; return attenuation * 1.0 / max(distanceSquare, 1e-3); } // Normal distribution function (specular D) // Based on https://google.github.io/filament/Filament.html#citation-walter07 // D_GGX(h,α) = α^2 / { π ((n⋅h)^2 (α2−1) + 1)^2 } // Simple implementation, has precision problems when using fp16 instead of fp32 // see https://google.github.io/filament/Filament.html#listing_speculardfp16 float D_GGX(float roughness, float NoH, const vec3 h) { float oneMinusNoHSquared = 1.0 - NoH * NoH; float a = NoH * roughness; float k = roughness / (oneMinusNoHSquared + a * a); float d = k * k * (1.0 / PI); return d; } // Visibility function (Specular G) // V(v,l,a) = G(v,l,α) / { 4 (n⋅v) (n⋅l) } // such that f_r becomes // f_r(v,l) = D(h,α) V(v,l,α) F(v,h,f0) // where // V(v,l,α) = 0.5 / { n⋅l sqrt((n⋅v)^2 (1−α2) + α2) + n⋅v sqrt((n⋅l)^2 (1−α2) + α2) } // Note the two sqrt's, that may be slow on mobile, see https://google.github.io/filament/Filament.html#listing_approximatedspecularv float V_SmithGGXCorrelated(float roughness, float NoV, float NoL) { float a2 = roughness * roughness; float lambdaV = NoL * sqrt((NoV - a2 * NoV) * NoV + a2); float lambdaL = NoV * sqrt((NoL - a2 * NoL) * NoL + a2); float v = 0.5 / (lambdaV + lambdaL); return v; } // Fresnel function // see https://google.github.io/filament/Filament.html#citation-schlick94 // F_Schlick(v,h,f_0,f_90) = f_0 + (f_90 − f_0) (1 − v⋅h)^5 vec3 F_Schlick(const vec3 f0, float f90, float VoH) { // not using mix to keep the vec3 and float versions identical return f0 + (vec3(f90) - f0) * pow5(1.0 - VoH); } float F_Schlick(float f0, float f90, float VoH) { // not using mix to keep the vec3 and float versions identical return f0 + (f90 - f0) * pow5(1.0 - VoH); } vec3 fresnel(vec3 f0, float LoH) { // f_90 suitable for ambient occlusion // see https://google.github.io/filament/Filament.html#lighting/occlusion float f90 = saturate(dot(f0, vec3(50.0 * 0.33))); return F_Schlick(f0, f90, LoH); } // Specular BRDF // https://google.github.io/filament/Filament.html#materialsystem/specularbrdf // Cook-Torrance approximation of the microfacet model integration using Fresnel law F to model f_m // f_r(v,l) = { D(h,α) G(v,l,α) F(v,h,f0) } / { 4 (n⋅v) (n⋅l) } vec3 specular(vec3 f0, float roughness, const vec3 h, float NoV, float NoL, float NoH, float LoH, float specularIntensity) { float D = D_GGX(roughness, NoH, h); float V = V_SmithGGXCorrelated(roughness, NoV, NoL); vec3 F = fresnel(f0, LoH); return (specularIntensity * D * V) * F; } // Diffuse BRDF // https://google.github.io/filament/Filament.html#materialsystem/diffusebrdf // fd(v,l) = σ/π * 1 / { |n⋅v||n⋅l| } ∫Ω D(m,α) G(v,l,m) (v⋅m) (l⋅m) dm // simplest approximation // float Fd_Lambert() { // return 1.0 / PI; // } // // vec3 Fd = diffuseColor * Fd_Lambert(); // Disney approximation // See https://google.github.io/filament/Filament.html#citation-burley12 // minimal quality difference float Fd_Burley(float roughness, float NoV, float NoL, float LoH) { float f90 = 0.5 + 2.0 * roughness * LoH * LoH; float lightScatter = F_Schlick(1.0, f90, NoL); float viewScatter = F_Schlick(1.0, f90, NoV); return lightScatter * viewScatter * (1.0 / PI); } // From https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile vec3 EnvBRDFApprox(vec3 f0, float perceptual_roughness, float NoV) { const vec4 c0 = { -1.0, -0.0275, -0.572, 0.022 }; const vec4 c1 = { 1.0, 0.0425, 1.04, -0.04 }; vec4 r = vec4(perceptual_roughness) * c0 + c1; float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y; vec2 AB = vec2(-1.04, 1.04) * vec2(a004) + r.zw; return f0 * vec3(AB.x) + vec3(AB.y); } float perceptualRoughnessToRoughness(float perceptualRoughness) { // clamp perceptual roughness to prevent precision problems // According to Filament design 0.089 is recommended for mobile // Filament uses 0.045 for non-mobile float clampedPerceptualRoughness = clamp(perceptualRoughness, 0.089, 1.0); return clampedPerceptualRoughness * clampedPerceptualRoughness; } // from https://64.github.io/tonemapping/ // reinhard on RGB oversaturates colors vec3 reinhard(vec3 color) { return color / (vec3(1.0) + color); } vec3 reinhard_extended(vec3 color, float max_white) { vec3 numerator = color * (vec3(1.0) + (color / vec3(max_white * max_white))); return numerator / (vec3(1.0) + color); } // luminance coefficients from Rec. 709. // https://en.wikipedia.org/wiki/Rec._709 float luminance(vec3 v) { return dot(v, vec3(0.2126, 0.7152, 0.0722)); } vec3 change_luminance(vec3 c_in, float l_out) { float l_in = luminance(c_in); return c_in * (l_out / l_in); } vec3 reinhard_luminance(vec3 color) { float l_old = luminance(color); float l_new = l_old / (1.0f + l_old); return change_luminance(color, l_new); } vec3 reinhard_extended_luminance(vec3 color, float max_white_l) { float l_old = luminance(color); float numerator = l_old * (1.0f + (l_old / (max_white_l * max_white_l))); float l_new = numerator / (1.0f + l_old); return change_luminance(color, l_new); } vec3 point_light(PointLight light, float roughness, float NdotV, vec3 N, vec3 V, vec3 R, vec3 F0, vec3 diffuseColor) { vec3 light_to_frag = light.pos.xyz - v_WorldPosition.xyz; float distance_square = dot(light_to_frag, light_to_frag); float rangeAttenuation = getDistanceAttenuation(distance_square, light.lightParams.r); // Specular. // Representative Point Area Lights. // see http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf p14-16 float a = roughness; float radius = light.lightParams.g; vec3 centerToRay = dot(light_to_frag, R) * R - light_to_frag; vec3 closestPoint = light_to_frag + centerToRay * saturate(radius * inversesqrt(dot(centerToRay, centerToRay))); float LspecLengthInverse = inversesqrt(dot(closestPoint, closestPoint)); float normalizationFactor = a / saturate(a + (radius * 0.5 * LspecLengthInverse)); float specularIntensity = normalizationFactor * normalizationFactor; vec3 L = closestPoint * LspecLengthInverse; // normalize() equivalent? vec3 H = normalize(L + V); float NoL = saturate(dot(N, L)); float NoH = saturate(dot(N, H)); float LoH = saturate(dot(L, H)); vec3 specular = specular(F0, roughness, H, NdotV, NoL, NoH, LoH, specularIntensity); // Diffuse. // Comes after specular since its NoL is used in the lighting equation. L = normalize(light_to_frag); H = normalize(L + V); NoL = saturate(dot(N, L)); NoH = saturate(dot(N, H)); LoH = saturate(dot(L, H)); vec3 diffuse = diffuseColor * Fd_Burley(roughness, NdotV, NoL, LoH); // Lout = f(v,l) Φ / { 4 π d^2 }⟨n⋅l⟩ // where // f(v,l) = (f_d(v,l) + f_r(v,l)) * light_color // Φ is light intensity // our rangeAttentuation = 1 / d^2 multiplied with an attenuation factor for smoothing at the edge of the non-physical maximum light radius // It's not 100% clear where the 1/4π goes in the derivation, but we follow the filament shader and leave it out // See https://google.github.io/filament/Filament.html#mjx-eqn-pointLightLuminanceEquation // TODO compensate for energy loss https://google.github.io/filament/Filament.html#materialsystem/improvingthebrdfs/energylossinspecularreflectance // light.color.rgb is premultiplied with light.intensity on the CPU return ((diffuse + specular) * light.color.rgb) * (rangeAttenuation * NoL); } vec3 dir_light(DirectionalLight light, float roughness, float NdotV, vec3 normal, vec3 view, vec3 R, vec3 F0, vec3 diffuseColor) { vec3 incident_light = light.direction.xyz; vec3 half_vector = normalize(incident_light + view); float NoL = saturate(dot(normal, incident_light)); float NoH = saturate(dot(normal, half_vector)); float LoH = saturate(dot(incident_light, half_vector)); vec3 diffuse = diffuseColor * Fd_Burley(roughness, NdotV, NoL, LoH); float specularIntensity = 1.0; vec3 specular = specular(F0, roughness, half_vector, NdotV, NoL, NoH, LoH, specularIntensity); return (specular + diffuse) * light.color.rgb * NoL; } void main() { vec4 output_color = base_color; output_color *= texture(sampler2D(StandardMaterial_base_color_texture, StandardMaterial_base_color_texture_sampler), v_Uv); // calculate non-linear roughness from linear perceptualRoughness vec4 metallic_roughness = texture(sampler2D(StandardMaterial_metallic_roughness_texture, StandardMaterial_metallic_roughness_texture_sampler), v_Uv); // Sampling from GLTF standard channels for now float metallic = metallic * metallic_roughness.b; float perceptual_roughness = perceptual_roughness * metallic_roughness.g; float roughness = perceptualRoughnessToRoughness(perceptual_roughness); vec3 N = normalize(v_WorldNormal); vec3 T = normalize(v_WorldTangent.xyz); vec3 B = cross(N, T) * v_WorldTangent.w; N = gl_FrontFacing ? N : -N; T = gl_FrontFacing ? T : -T; B = gl_FrontFacing ? B : -B; mat3 TBN = mat3(T, B, N); N = TBN * normalize(texture(sampler2D(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler), v_Uv).rgb * 2.0 - vec3(1.0)); float occlusion = texture(sampler2D(StandardMaterial_occlusion_texture, StandardMaterial_occlusion_texture_sampler), v_Uv).r; vec4 emissive = emissive; // TODO use .a for exposure compensation in HDR emissive.rgb *= texture(sampler2D(StandardMaterial_emissive_texture, StandardMaterial_emissive_texture_sampler), v_Uv).rgb; vec3 V = normalize(CameraPos.xyz - v_WorldPosition.xyz); // Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886" float NdotV = max(dot(N, V), 1e-3); // Remapping [0,1] reflectance to F0 // See https://google.github.io/filament/Filament.html#materialsystem/parameterization/remapping vec3 F0 = vec3(0.16 * reflectance * reflectance * (1.0 - metallic)) + output_color.rgb * vec3(metallic); // Diffuse strength inversely related to metallicity vec3 diffuseColor = output_color.rgb * vec3(1.0 - metallic); vec3 R = reflect(-V, N); // accumulate color vec3 light_accum = vec3(0.0); for (int i = 0; i < int(NumLights.x) && i < MAX_POINT_LIGHTS; ++i) { light_accum += point_light(PointLights[i], roughness, NdotV, N, V, R, F0, diffuseColor); } for (int i = 0; i < int(NumLights.y) && i < MAX_DIRECTIONAL_LIGHTS; ++i) { light_accum += dir_light(DirectionalLights[i], roughness, NdotV, N, V, R, F0, diffuseColor); } vec3 diffuse_ambient = EnvBRDFApprox(diffuseColor, 1.0, NdotV); vec3 specular_ambient = EnvBRDFApprox(F0, perceptual_roughness, NdotV); output_color.rgb = light_accum; output_color.rgb += (diffuse_ambient + specular_ambient) * AmbientColor.xyz * occlusion; output_color.rgb += emissive.rgb * output_color.a; // tone_mapping output_color.rgb = reinhard_luminance(output_color.rgb); // Gamma correction. // Not needed with sRGB buffer // output_color.rgb = pow(output_color.rgb, vec3(1.0 / 2.2)); o_Target = output_color; } ================================================ FILE: lib/naga/tests/in/glsl/bevy-pbr.vert ================================================ // MIT License // // Copyright (c) 2020 Carter Anderson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // // NOTE: Taken from the bevy repo #version 450 layout(location = 0) in vec3 Vertex_Position; layout(location = 1) in vec3 Vertex_Normal; layout(location = 2) in vec2 Vertex_Uv; layout(location = 3) in vec4 Vertex_Tangent; layout(location = 0) out vec3 v_WorldPosition; layout(location = 1) out vec3 v_WorldNormal; layout(location = 2) out vec2 v_Uv; layout(set = 0, binding = 0) uniform CameraViewProj { mat4 ViewProj; }; layout(location = 3) out vec4 v_WorldTangent; layout(set = 2, binding = 0) uniform Transform { mat4 Model; }; void main() { vec4 world_position = Model * vec4(Vertex_Position, 1.0); v_WorldPosition = world_position.xyz; v_WorldNormal = mat3(Model) * Vertex_Normal; v_Uv = Vertex_Uv; v_WorldTangent = vec4(mat3(Model) * Vertex_Tangent.xyz, Vertex_Tangent.w); gl_Position = ViewProj * world_position; } ================================================ FILE: lib/naga/tests/in/glsl/bits_glsl.frag ================================================ #version 450 void main() { int i = 0; ivec2 i2 = ivec2(0); ivec3 i3 = ivec3(0); ivec4 i4 = ivec4(0); uint u = 0; uvec2 u2 = uvec2(0); uvec3 u3 = uvec3(0); uvec4 u4 = uvec4(0); vec2 f2 = vec2(0.0); vec4 f4 = vec4(0.0); u = packSnorm4x8(f4); u = packUnorm4x8(f4); u = packSnorm2x16(f2); u = packUnorm2x16(f2); u = packHalf2x16(f2); f4 = unpackSnorm4x8(u); f4 = unpackUnorm4x8(u); f2 = unpackSnorm2x16(u); f2 = unpackUnorm2x16(u); f2 = unpackHalf2x16(u); i = bitfieldInsert(i, i, 5, 10); i2 = bitfieldInsert(i2, i2, 5, 10); i3 = bitfieldInsert(i3, i3, 5, 10); i4 = bitfieldInsert(i4, i4, 5, 10); u = bitfieldInsert(u, u, 5, 10); u2 = bitfieldInsert(u2, u2, 5, 10); u3 = bitfieldInsert(u3, u3, 5, 10); u4 = bitfieldInsert(u4, u4, 5, 10); i = bitfieldExtract(i, 5, 10); i2 = bitfieldExtract(i2, 5, 10); i3 = bitfieldExtract(i3, 5, 10); i4 = bitfieldExtract(i4, 5, 10); u = bitfieldExtract(u, 5, 10); u2 = bitfieldExtract(u2, 5, 10); u3 = bitfieldExtract(u3, 5, 10); u4 = bitfieldExtract(u4, 5, 10); i = findLSB(i); i2 = findLSB(i2); i3 = findLSB(i3); i4 = findLSB(i4); i = findLSB(u); i2 = findLSB(u2); i3 = findLSB(u3); i4 = findLSB(u4); i = findMSB(i); i2 = findMSB(i2); i3 = findMSB(i3); i4 = findMSB(i4); i = findMSB(u); i2 = findMSB(u2); i3 = findMSB(u3); i4 = findMSB(u4); } ================================================ FILE: lib/naga/tests/in/glsl/bool-select.frag ================================================ #version 440 core precision highp float; layout(location = 0) out vec4 o_color; float TevPerCompGT(float a, float b) { return float(a > b); } vec3 TevPerCompGT(vec3 a, vec3 b) { return vec3(greaterThan(a, b)); } void main() { o_color.rgb = TevPerCompGT(vec3(3.0), vec3(5.0)); o_color.a = TevPerCompGT(3.0, 5.0); } ================================================ FILE: lib/naga/tests/in/glsl/buffer.frag ================================================ #version 450 layout(set = 0, binding = 0) buffer testBufferBlock { uint[] data; } testBuffer; layout(set = 0, binding = 1) writeonly buffer testBufferWriteOnlyBlock { uint[] data; } testBufferWriteOnly; layout(set = 0, binding = 2) readonly buffer testBufferReadOnlyBlock { uint[] data; } testBufferReadOnly; void main() { uint a = testBuffer.data[0]; testBuffer.data[1] = 2; testBufferWriteOnly.data[1] = 2; uint b = testBufferReadOnly.data[0]; } ================================================ FILE: lib/naga/tests/in/glsl/clamp-splat.vert ================================================ #version 450 layout(location = 0) in vec2 a_pos; void main() { gl_Position = vec4(clamp(a_pos, 0.0, 1.0), 0.0, 1.0); } ================================================ FILE: lib/naga/tests/in/glsl/constant-array-size.vert ================================================ #version 450 const int NUM_VECS = 42; layout(std140, set = 1, binding = 0) uniform Data { vec4 vecs[NUM_VECS]; }; vec4 function() { vec4 sum = vec4(0); for (int i = 0; i < NUM_VECS; i++) { sum += vecs[i]; } return sum; } void main() {} ================================================ FILE: lib/naga/tests/in/glsl/declarations.vert ================================================ #version 450 layout(location = 0) in VertexData { vec2 position; vec2 a; } vert; layout(location = 0) out FragmentData { vec2 position; vec2 a; } frag; layout(location = 2) in vec4 in_array[2]; layout(location = 2) out vec4 out_array[2]; struct TestStruct { float a; float b; }; float array_2d[2][2]; float array_toomanyd[2][2][2][2][2][2][2]; void main() { const vec3 positions[2] = vec3[2]( vec3(-1.0, 1.0, 0.0), vec3(-1.0, -1.0, 0.0) ); const TestStruct strct = TestStruct( 1, 2 ); const vec4 from_input_array = in_array[1]; const float a = array_2d[0][0]; const float b = array_toomanyd[0][0][0][0][0][0][0]; out_array[0] = vec4(2.0); } ================================================ FILE: lib/naga/tests/in/glsl/expressions.frag ================================================ #version 440 core void testBinOpVecFloat(vec4 a, float b) { vec4 v; v = a * 2.0; v = a / 2.0; v = a + 2.0; v = a - 2.0; } void testBinOpFloatVec(vec4 a, float b) { vec4 v; v = a * b; v = a / b; v = a + b; v = a - b; } void testBinOpIVecInt(ivec4 a, int b) { ivec4 v; v = a * b; v = a / b; v = a + b; v = a - b; v = a & b; v = a | b; v = a ^ b; v = a >> b; v = a << b; } void testBinOpIntIVec(int a, ivec4 b) { ivec4 v; v = a * b; v = a + b; v = a - b; v = a & b; v = a | b; v = a ^ b; } void testBinOpUVecUint(uvec4 a, uint b) { uvec4 v; v = a * b; v = a / b; v = a + b; v = a - b; v = a & b; v = a | b; v = a ^ b; v = a >> b; v = a << b; } void testBinOpUintUVec(uint a, uvec4 b) { uvec4 v; v = a * b; v = a + b; v = a - b; v = a & b; v = a | b; v = a ^ b; } void testBinOpMatMat(mat3 a, mat3 b) { mat3 v; bool c; v = a / b; v = a * b; v = a + b; v = a - b; c = a == b; c = a != b; } void testBinOpMatFloat(float a, mat3 b) { mat3 v; v = a / b; v = a * b; v = a + b; v = a - b; v = b / a; v = b * a; v = b + a; v = b - a; } void testUnaryOpMat(mat3 a) { mat3 v; v = -a; v = --a; v = a--; } void testStructConstructor() { struct BST { int data; }; BST tree = BST(1); } void testNonScalarToScalarConstructor() { float f = float(mat2(1.0)); } void testArrayConstructor() { float tree[1] = float[1](0.0); } void testFreestandingConstructor() { vec4(1.0); } void testNonImplicitCastVectorCast() { uint a = 1; ivec4 b = ivec4(a); } float global; void privatePointer(inout float a) {} void ternary(bool a) { uint b = a ? 0 : 1u; uint c = a ? 0u : 1; uint nested = a ? (a ? (a ? 2u : 3) : 4u) : 5; } void testMatrixMultiplication(mat4x3 a, mat4x4 b) { mat4x3 c = a * b; } layout(std430, binding = 0) buffer a_buf { float a[]; }; void testLength() { int len = a.length(); } void testConstantLength(float a[4u]) { int len = a.length(); } out vec4 o_color; void main() { privatePointer(global); o_color.rgba = vec4(1.0); } ================================================ FILE: lib/naga/tests/in/glsl/fma.frag ================================================ #version 440 core struct Mat4x3 { vec4 mx; vec4 my; vec4 mz; }; void Fma(inout Mat4x3 d, Mat4x3 m, float s) { d.mx += m.mx * s; d.my += m.my * s; d.mz += m.mz * s; } out vec4 o_color; void main() { o_color.rgba = vec4(1.0); } ================================================ FILE: lib/naga/tests/in/glsl/global-constant-array.vert ================================================ #version 450 core uint i; const float[2] array = { 1.0, 2.0 }; void main() { array[i]; } ================================================ FILE: lib/naga/tests/in/glsl/images.frag ================================================ #version 460 core layout(rgba8, binding = 0) uniform image1D img1D; layout(rgba8, binding = 1) uniform image2D img2D; layout(rgba8, binding = 2) uniform image3D img3D; // layout(rgba8, binding = 3) uniform imageCube imgCube; layout(rgba8, binding = 4) uniform image1DArray img1DArray; layout(rgba8, binding = 5) uniform image2DArray img2DArray; // layout(rgba8, binding = 6) uniform imageCubeArray imgCubeArray; layout(rgba8, binding = 7) readonly uniform image2D imgReadOnly; layout(rgba8, binding = 8) writeonly uniform image2D imgWriteOnly; layout(rgba8, binding = 9) writeonly readonly uniform image2D imgWriteReadOnly; void testImg1D(in int coord) { int size = imageSize(img1D); imageStore(img1D, coord, vec4(2)); vec4 c = imageLoad(img1D, coord); } void testImg1DArray(in ivec2 coord) { vec2 size = imageSize(img1DArray); vec4 c = imageLoad(img1DArray, coord); imageStore(img1DArray, coord, vec4(2)); } void testImg2D(in ivec2 coord) { vec2 size = imageSize(img2D); vec4 c = imageLoad(img2D, coord); imageStore(img2D, coord, vec4(2)); } void testImg2DArray(in ivec3 coord) { vec3 size = imageSize(img2DArray); vec4 c = imageLoad(img2DArray, coord); imageStore(img2DArray, coord, vec4(2)); } void testImg3D(in ivec3 coord) { vec3 size = imageSize(img3D); vec4 c = imageLoad(img3D, coord); imageStore(img3D, coord, vec4(2)); } // Naga doesn't support cube images and it's usefulness // is questionable, so they won't be supported for now // void testImgCube(in ivec3 coord) { // vec2 size = imageSize(imgCube); // vec4 c = imageLoad(imgCube, coord); // imageStore(imgCube, coord, vec4(2)); // } // // void testImgCubeArray(in ivec3 coord) { // vec3 size = imageSize(imgCubeArray); // vec4 c = imageLoad(imgCubeArray, coord); // imageStore(imgCubeArray, coord, vec4(2)); // } void testImgReadOnly(in ivec2 coord) { vec2 size = imageSize(img2D); vec4 c = imageLoad(imgReadOnly, coord); } void testImgWriteOnly(in ivec2 coord) { vec2 size = imageSize(img2D); imageStore(imgWriteOnly, coord, vec4(2)); } void testImgWriteReadOnly(in ivec2 coord) { vec2 size = imageSize(imgWriteReadOnly); } void main() {} ================================================ FILE: lib/naga/tests/in/glsl/long-form-matrix.vert ================================================ // ISSUE: #1064 #version 450 void main() { // Sane ways to build a matrix mat2 splat = mat2(1); mat2 normal = mat2(vec2(1), vec2(2)); mat2x4 from_matrix = mat2x4(mat3(1.0)); // This is a little bit weirder but still makes some sense // Since this matrix has 2 rows we take two numbers to make a column // and we do this twice because we 2 columns. // Final result in wgsl should be: // mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)) mat2 a = mat2(1, 2, 3, 4); // ??? // Glsl has decided that for it's matrix constructor arguments it doesn't // take them as is but instead flattens them so the `b` matrix is // equivalent to the `a` matrix but in value and semantics mat2 b = mat2(1, vec2(2, 3), 4); mat3 c = mat3(1, 2, 3, vec3(1), vec3(1)); mat3 d = mat3(vec2(2), 1, vec3(1), vec3(1)); mat4 e = mat4(vec2(2), vec4(1), vec2(2), vec4(1), vec4(1)); } ================================================ FILE: lib/naga/tests/in/glsl/math-functions.vert ================================================ #version 450 void main() { vec4 a = vec4(1.0); vec4 b = vec4(2.0); mat4 m = mat4(a, b, a, b); int i = 5; vec4 ceilOut = ceil(a); vec4 roundOut = round(a); vec4 floorOut = floor(a); vec4 fractOut = fract(a); vec4 truncOut = trunc(a); vec4 sinOut = sin(a); vec4 absOut = abs(a); vec4 sqrtOut = sqrt(a); vec4 inversesqrtOut = inversesqrt(a); vec4 expOut = exp(a); vec4 exp2Out = exp2(a); vec4 signOut = sign(a); mat4 transposeOut = transpose(m); // TODO: support inverse function in wgsl output // mat4 inverseOut = inverse(m); vec4 normalizeOut = normalize(a); vec4 sinhOut = sinh(a); vec4 cosOut = cos(a); vec4 coshOut = cosh(a); vec4 tanOut = tan(a); vec4 tanhOut = tanh(a); vec4 acosOut = acos(a); vec4 asinOut = asin(a); vec4 logOut = log(a); vec4 log2Out = log2(a); float lengthOut = length(a); float determinantOut = determinant(m); int bitCountOut = bitCount(i); int bitfieldReverseOut = bitfieldReverse(i); float atanOut = atan(a.x); float atan2Out = atan(a.x, a.y); float modOut = mod(a.x, b.x); vec4 powOut = pow(a, b); float dotOut = dot(a, b); vec4 maxOut = max(a, b); vec4 minOut = min(a, b); vec4 reflectOut = reflect(a, b); vec3 crossOut = cross(a.xyz, b.xyz); mat4 outerProductOut = outerProduct(a, b); float distanceOut = distance(a, b); vec4 stepOut = step(a, b); // TODO: support out params in wgsl output // vec4 modfOut = modf(a, b); // vec4 frexpOut = frexp(a, b); // float ldexpOut = ldexp(a.x, i); vec4 rad = radians(a); float deg = degrees(a.x); float smoothStepScalar = smoothstep(0.0, 1.0, 0.5); vec4 smoothStepVector = smoothstep(vec4(0.0), vec4(1.0), vec4(0.5)); vec4 smoothStepMixed = smoothstep(0.0, 1.0, vec4(0.5)); } ================================================ FILE: lib/naga/tests/in/glsl/prepostfix.frag ================================================ #version 450 core void main() { int scalar_target; int scalar = 1; scalar_target = scalar++; scalar_target = --scalar; uvec2 vec_target; uvec2 vec = uvec2(1); vec_target = vec--; vec_target = ++vec; mat4x3 mat_target; mat4x3 mat = mat4x3(1); mat_target = mat++; mat_target = --mat; } ================================================ FILE: lib/naga/tests/in/glsl/quad_glsl.frag ================================================ #version 450 layout(location = 0) in vec2 v_uv; #ifdef TEXTURE layout(set = 0, binding = 0) uniform texture2D u_texture; layout(set = 0, binding = 1) uniform sampler u_sampler; #endif layout(location = 0) out vec4 o_color; void main() { #ifdef TEXTURE o_color = texture(sampler2D(u_texture, u_sampler), v_uv); #else o_color = vec4(1.0, 1.0, 1.0, 1.0); #endif } ================================================ FILE: lib/naga/tests/in/glsl/quad_glsl.vert ================================================ #version 450 const float c_scale = 1.2; layout(location = 0) in vec2 a_pos; layout(location = 1) in vec2 a_uv; layout(location = 0) out vec2 v_uv; void main() { v_uv = a_uv; gl_Position = vec4(c_scale * a_pos, 0.0, 1.0); } ================================================ FILE: lib/naga/tests/in/glsl/sampler-functions.frag ================================================ #version 440 precision mediump float; float CalcShadowPCF1(texture2D T_P_t_TextureDepth, samplerShadow S_P_t_TextureDepth, in vec3 t_ProjCoord) { float t_Res = 0.0f; t_Res += texture(sampler2DShadow(T_P_t_TextureDepth, S_P_t_TextureDepth), t_ProjCoord.xyz) * (1.0 / 5.0); return t_Res; } float CalcShadowPCF(texture2D T_P_t_TextureDepth, samplerShadow S_P_t_TextureDepth, in vec3 t_ProjCoord, in float t_Bias) { t_ProjCoord.z += t_Bias; return CalcShadowPCF1(T_P_t_TextureDepth, S_P_t_TextureDepth, t_ProjCoord.xyz); } void main() { } ================================================ FILE: lib/naga/tests/in/glsl/samplers.frag ================================================ #version 440 core precision mediump float; layout(set = 1, binding = 0) uniform texture1D tex1D; layout(set = 1, binding = 1) uniform texture1DArray tex1DArray; layout(set = 1, binding = 2) uniform texture2D tex2D; layout(set = 1, binding = 3) uniform texture2DArray tex2DArray; layout(set = 1, binding = 4) uniform textureCube texCube; layout(set = 1, binding = 5) uniform textureCubeArray texCubeArray; layout(set = 1, binding = 6) uniform texture3D tex3D; layout(set = 1, binding = 7) uniform sampler samp; // WGSL doesn't have 1D depth samplers. #define HAS_1D_DEPTH_TEXTURES 0 #if HAS_1D_DEPTH_TEXTURES layout(set = 1, binding = 10) uniform texture1D tex1DShadow; layout(set = 1, binding = 11) uniform texture1DArray tex1DArrayShadow; #endif layout(set = 1, binding = 12) uniform texture2D tex2DShadow; layout(set = 1, binding = 13) uniform texture2DArray tex2DArrayShadow; layout(set = 1, binding = 14) uniform textureCube texCubeShadow; layout(set = 1, binding = 15) uniform textureCubeArray texCubeArrayShadow; layout(set = 1, binding = 16) uniform texture3D tex3DShadow; layout(set = 1, binding = 17) uniform samplerShadow sampShadow; layout(binding = 18) uniform texture2DMS tex2DMS; layout(binding = 19) uniform texture2DMSArray tex2DMSArray; // Conventions for readability: // 1.0 = Shadow Ref // 2.0 = LOD Bias // 3.0 = Explicit LOD // 4.0 = Grad Derivatives // 5 = Offset // 6.0 = Proj W void testTex1D(in float coord) { int size1D = textureSize(sampler1D(tex1D, samp), 0); vec4 c; c = texture(sampler1D(tex1D, samp), coord); c = texture(sampler1D(tex1D, samp), coord, 2.0); c = textureGrad(sampler1D(tex1D, samp), coord, 4.0, 4.0); c = textureGradOffset(sampler1D(tex1D, samp), coord, 4.0, 4.0, 5); c = textureLod(sampler1D(tex1D, samp), coord, 3.0); c = textureLodOffset(sampler1D(tex1D, samp), coord, 3.0, 5); c = textureOffset(sampler1D(tex1D, samp), coord, 5); c = textureOffset(sampler1D(tex1D, samp), coord, 5, 2.0); c = textureProj(sampler1D(tex1D, samp), vec2(coord, 6.0)); c = textureProj(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0)); c = textureProj(sampler1D(tex1D, samp), vec2(coord, 6.0), 2.0); c = textureProj(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 2.0); c = textureProjGrad(sampler1D(tex1D, samp), vec2(coord, 6.0), 4.0, 4.0); c = textureProjGrad(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 4.0, 4.0); c = textureProjGradOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 4.0, 4.0, 5); c = textureProjGradOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 4.0, 4.0, 5); c = textureProjLod(sampler1D(tex1D, samp), vec2(coord, 6.0), 3.0); c = textureProjLod(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 3.0); c = textureProjLodOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 3.0, 5); c = textureProjLodOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 3.0, 5); c = textureProjOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 5); c = textureProjOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 5); c = textureProjOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 5, 2.0); c = textureProjOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 5, 2.0); c = texelFetch(sampler1D(tex1D, samp), int(coord), 3); c = texelFetchOffset(sampler1D(tex1D, samp), int(coord), 3, 5); } #if HAS_1D_DEPTH_TEXTURES void testTex1DShadow(float coord) { int size1DShadow = textureSize(sampler1DShadow(tex1DShadow, sampShadow), 0); float d; d = texture(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0)); // d = texture(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 2.0); d = textureGrad(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 4.0, 4.0); d = textureGradOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 4.0, 4.0, 5); d = textureLod(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 3.0); d = textureLodOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 3.0, 5); d = textureOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 5); // d = textureOffset(sampler1DShadow(tex1DShadow, sampShadow), vec3(coord, 1.0, 1.0), 5, 2.0); d = textureProj(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0)); // d = textureProj(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 2.0); d = textureProjGrad(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 4.0, 4.0); d = textureProjGradOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 4.0, 4.0, 5); d = textureProjLod(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 3.0); d = textureProjLodOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 3.0, 5); d = textureProjOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 5); // d = textureProjOffset(sampler1DShadow(tex1DShadow, sampShadow), vec4(coord, 0.0, 1.0, 6.0), 5, 2.0); } #endif void testTex1DArray(in vec2 coord) { ivec2 size1DArray = textureSize(sampler1DArray(tex1DArray, samp), 0); vec4 c; c = texture(sampler1DArray(tex1DArray, samp), coord); c = texture(sampler1DArray(tex1DArray, samp), coord, 2.0); c = textureGrad(sampler1DArray(tex1DArray, samp), coord, 4.0, 4.0); c = textureGradOffset(sampler1DArray(tex1DArray, samp), coord, 4.0, 4.0, 5); c = textureLod(sampler1DArray(tex1DArray, samp), coord, 3.0); c = textureLodOffset(sampler1DArray(tex1DArray, samp), coord, 3.0, 5); c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5); c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5, 2.0); c = texelFetch(sampler1DArray(tex1DArray, samp), ivec2(coord), 3); c = texelFetchOffset(sampler1DArray(tex1DArray, samp), ivec2(coord), 3, 5); } #if HAS_1D_DEPTH_TEXTURES void testTex1DArrayShadow(in vec2 coord) { ivec2 size1DArrayShadow = textureSize(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), 0); float d; d = texture(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0)); d = textureGrad(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 4.0, 4.0); d = textureGradOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 4.0, 4.0, 5); d = textureLod(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 3.0); d = textureLodOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 3.0, 5); d = textureOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 5); // d = textureOffset(sampler1DArrayShadow(tex1DArrayShadow, sampShadow), vec3(coord, 1.0), 5, 2.0); } #endif void testTex2D(in vec2 coord) { ivec2 size2D = textureSize(sampler2D(tex2D, samp), 0); vec4 c; c = texture(sampler2D(tex2D, samp), coord); c = texture(sampler2D(tex2D, samp), coord, 2.0); c = textureGrad(sampler2D(tex2D, samp), coord, vec2(4.0), vec2(4.0)); c = textureGradOffset(sampler2D(tex2D, samp), coord, vec2(4.0), vec2(4.0), ivec2(5)); c = textureLod(sampler2D(tex2D, samp), coord, 3.0); c = textureLodOffset(sampler2D(tex2D, samp), coord, 3.0, ivec2(5)); c = textureOffset(sampler2D(tex2D, samp), coord, ivec2(5)); c = textureOffset(sampler2D(tex2D, samp), coord, ivec2(5), 2.0); c = textureProj(sampler2D(tex2D, samp), vec3(coord, 6.0)); c = textureProj(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0)); c = textureProj(sampler2D(tex2D, samp), vec3(coord, 6.0), 2.0); c = textureProj(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 2.0); c = textureProjGrad(sampler2D(tex2D, samp), vec3(coord, 6.0), vec2(4.0), vec2(4.0)); c = textureProjGrad(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), vec2(4.0), vec2(4.0)); c = textureProjGradOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), vec2(4.0), vec2(4.0), ivec2(5)); c = textureProjGradOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), vec2(4.0), vec2(4.0), ivec2(5)); c = textureProjLod(sampler2D(tex2D, samp), vec3(coord, 6.0), 3.0); c = textureProjLod(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 3.0); c = textureProjLodOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), 3.0, ivec2(5)); c = textureProjLodOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), 3.0, ivec2(5)); c = textureProjOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), ivec2(5)); c = textureProjOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), ivec2(5)); c = textureProjOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), ivec2(5), 2.0); c = textureProjOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), ivec2(5), 2.0); c = texelFetch(sampler2D(tex2D, samp), ivec2(coord), 3); c = texelFetchOffset(sampler2D(tex2D, samp), ivec2(coord), 3, ivec2(5)); } void testTex2DShadow(vec2 coord) { ivec2 size2DShadow = textureSize(sampler2DShadow(tex2DShadow, sampShadow), 0); float d; d = texture(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0)); // d = texture(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 2.0); d = textureGrad(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), vec2(4.0), vec2(4.0)); d = textureGradOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), vec2(4.0), vec2(4.0), ivec2(5)); d = textureLod(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 3.0); d = textureLodOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), 3.0, ivec2(5)); d = textureOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), ivec2(5)); // d = textureOffset(sampler2DShadow(tex2DShadow, sampShadow), vec3(coord, 1.0), ivec2(5), 2.0); d = textureProj(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0)); // d = textureProj(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 2.0); d = textureProjGrad(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), vec2(4.0), vec2(4.0)); d = textureProjGradOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), vec2(4.0), vec2(4.0), ivec2(5)); d = textureProjLod(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 3.0); d = textureProjLodOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), 3.0, ivec2(5)); d = textureProjOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), ivec2(5)); // d = textureProjOffset(sampler2DShadow(tex2DShadow, sampShadow), vec4(coord, 1.0, 6.0), ivec2(5), 2.0); } void testTex2DArray(in vec3 coord) { ivec3 size2DArray = textureSize(sampler2DArray(tex2DArray, samp), 0); vec4 c; c = texture(sampler2DArray(tex2DArray, samp), coord); c = texture(sampler2DArray(tex2DArray, samp), coord, 2.0); c = textureGrad(sampler2DArray(tex2DArray, samp), coord, vec2(4.0), vec2(4.0)); c = textureGradOffset(sampler2DArray(tex2DArray, samp), coord, vec2(4.0), vec2(4.0), ivec2(5)); c = textureLod(sampler2DArray(tex2DArray, samp), coord, 3.0); c = textureLodOffset(sampler2DArray(tex2DArray, samp), coord, 3.0, ivec2(5)); c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5)); c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5), 2.0); c = texelFetch(sampler2DArray(tex2DArray, samp), ivec3(coord), 3); c = texelFetchOffset(sampler2DArray(tex2DArray, samp), ivec3(coord), 3, ivec2(5)); } void testTex2DArrayShadow(in vec3 coord) { ivec3 size2DArrayShadow = textureSize(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), 0); float d; d = texture(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0)); d = textureGrad(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), vec2(4.0), vec2(4.0)); d = textureGradOffset(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), vec2(4.0), vec2(4.0), ivec2(5)); d = textureOffset(sampler2DArrayShadow(tex2DArrayShadow, sampShadow), vec4(coord, 1.0), ivec2(5)); } void testTexCube(in vec3 coord) { ivec2 sizeCube = textureSize(samplerCube(texCube, samp), 0); vec4 c; c = texture(samplerCube(texCube, samp), coord); c = texture(samplerCube(texCube, samp), coord, 2.0); c = textureGrad(samplerCube(texCube, samp), coord, vec3(4.0), vec3(4.0)); c = textureLod(samplerCube(texCube, samp), coord, 3.0); } void testTexCubeShadow(in vec3 coord) { ivec2 sizeCubeShadow = textureSize(samplerCubeShadow(texCubeShadow, sampShadow), 0); float d; d = texture(samplerCubeShadow(texCubeShadow, sampShadow), vec4(coord, 1.0)); d = textureGrad(samplerCubeShadow(texCubeShadow, sampShadow), vec4(coord, 1.0), vec3(4.0), vec3(4.0)); } void testTexCubeArray(in vec4 coord) { ivec3 sizeCubeArray = textureSize(samplerCubeArray(texCubeArray, samp), 0); vec4 c; c = texture(samplerCubeArray(texCubeArray, samp), coord); c = texture(samplerCubeArray(texCubeArray, samp), coord, 2.0); c = textureGrad(samplerCubeArray(texCubeArray, samp), coord, vec3(4.0), vec3(4.0)); c = textureLod(samplerCubeArray(texCubeArray, samp), coord, 3.0); } void testTexCubeArrayShadow(in vec4 coord) { ivec3 sizeCubeArrayShadow = textureSize(samplerCubeArrayShadow(texCubeArrayShadow, sampShadow), 0); float d; d = texture(samplerCubeArrayShadow(texCubeArrayShadow, sampShadow), coord, 1.0); // The rest of the variants aren't defined by GLSL. } void testTex3D(in vec3 coord) { ivec3 size3D = textureSize(sampler3D(tex3D, samp), 0); vec4 c; c = texture(sampler3D(tex3D, samp), coord); c = texture(sampler3D(tex3D, samp), coord, 2.0); c = textureProj(sampler3D(tex3D, samp), vec4(coord, 6.0)); c = textureProj(sampler3D(tex3D, samp), vec4(coord, 6.0), 2.0); c = textureProjOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), ivec3(5)); c = textureProjOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), ivec3(5), 2.0); c = textureProjLod(sampler3D(tex3D, samp), vec4(coord, 6.0), 3.0); c = textureProjLodOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), 3.0, ivec3(5)); c = textureProjGrad(sampler3D(tex3D, samp), vec4(coord, 6.0), vec3(4.0), vec3(4.0)); c = textureProjGradOffset(sampler3D(tex3D, samp), vec4(coord, 6.0), vec3(4.0), vec3(4.0), ivec3(5)); c = textureGrad(sampler3D(tex3D, samp), coord, vec3(4.0), vec3(4.0)); c = textureGradOffset(sampler3D(tex3D, samp), coord, vec3(4.0), vec3(4.0), ivec3(5)); c = textureLod(sampler3D(tex3D, samp), coord, 3.0); c = textureLodOffset(sampler3D(tex3D, samp), coord, 3.0, ivec3(5)); c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5)); c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5), 2.0); c = texelFetch(sampler3D(tex3D, samp), ivec3(coord), 3); c = texelFetchOffset(sampler3D(tex3D, samp), ivec3(coord), 3, ivec3(5)); } void testTex2DMS(in vec2 coord) { ivec2 size2DMS = textureSize(sampler2DMS(tex2DMS, samp)); vec4 c; c = texelFetch(sampler2DMS(tex2DMS, samp), ivec2(coord), 3); } void testTex2DMSArray(in vec3 coord) { ivec3 size2DMSArray = textureSize(sampler2DMSArray(tex2DMSArray, samp)); vec4 c; c = texelFetch(sampler2DMSArray(tex2DMSArray, samp), ivec3(coord), 3); } void main() {} ================================================ FILE: lib/naga/tests/in/glsl/statements.frag ================================================ #version 460 core void switchEmpty(int a) { switch (a) {} return; } void switchNoDefault(int a) { switch (a) { case 0: break; } return; } void switchNoLastBreak(int a) { switch (a) { default: int b = a; } return; } void main() {} ================================================ FILE: lib/naga/tests/in/glsl/swizzle_write.frag ================================================ #version 450 void foo(inout vec2 p) {} void main() { vec3 x = vec3(2.0); x.zxy.xy = vec2(3.0, 4.0); x.rg *= 5.0; x.zy++; foo(x.xz); } ================================================ FILE: lib/naga/tests/in/image.param.ron ================================================ ( spv: ( version: (1, 1), debug: true, ), glsl_exclude_list: ["depth_load", "depth_no_comparison", "levels_queries"] ) ================================================ FILE: lib/naga/tests/in/image.wgsl ================================================ @group(0) @binding(0) var image_mipmapped_src: texture_2d; @group(0) @binding(3) var image_multisampled_src: texture_multisampled_2d; @group(0) @binding(4) var image_depth_multisampled_src: texture_depth_multisampled_2d; @group(0) @binding(1) var image_storage_src: texture_storage_2d; @group(0) @binding(5) var image_array_src: texture_2d_array; @group(0) @binding(6) var image_dup_src: texture_storage_1d; // for #1307 @group(0) @binding(7) var image_1d_src: texture_1d; @group(0) @binding(2) var image_dst: texture_storage_1d; @compute @workgroup_size(16) fn main( @builtin(local_invocation_id) local_id: vec3, //TODO: https://github.com/gpuweb/gpuweb/issues/1590 //@builtin(workgroup_size) wg_size: vec3 ) { let dim = textureDimensions(image_storage_src); let itc = dim * vec2(local_id.xy) % vec2(10, 20); let value1 = textureLoad(image_mipmapped_src, itc, i32(local_id.z)); let value2 = textureLoad(image_multisampled_src, itc, i32(local_id.z)); let value4 = textureLoad(image_storage_src, itc); let value5 = textureLoad(image_array_src, itc, i32(local_id.z), i32(local_id.z) + 1); let value6 = textureLoad(image_1d_src, i32(local_id.x), i32(local_id.z)); textureStore(image_dst, itc.x, value1 + value2 + value4 + value5 + value6); } @compute @workgroup_size(16, 1, 1) fn depth_load(@builtin(local_invocation_id) local_id: vec3) { let dim: vec2 = textureDimensions(image_storage_src); let itc: vec2 = ((dim * vec2(local_id.xy)) % vec2(10, 20)); let val: f32 = textureLoad(image_depth_multisampled_src, itc, i32(local_id.z)); textureStore(image_dst, itc.x, vec4(u32(val))); return; } @group(0) @binding(0) var image_1d: texture_1d; @group(0) @binding(1) var image_2d: texture_2d; @group(0) @binding(2) var image_2d_array: texture_2d_array; @group(0) @binding(3) var image_cube: texture_cube; @group(0) @binding(4) var image_cube_array: texture_cube_array; @group(0) @binding(5) var image_3d: texture_3d; @group(0) @binding(6) var image_aa: texture_multisampled_2d; @vertex fn queries() -> @builtin(position) vec4 { let dim_1d = textureDimensions(image_1d); let dim_1d_lod = textureDimensions(image_1d, i32(dim_1d)); let dim_2d = textureDimensions(image_2d); let dim_2d_lod = textureDimensions(image_2d, 1); let dim_2d_array = textureDimensions(image_2d_array); let dim_2d_array_lod = textureDimensions(image_2d_array, 1); let dim_cube = textureDimensions(image_cube); let dim_cube_lod = textureDimensions(image_cube, 1); let dim_cube_array = textureDimensions(image_cube_array); let dim_cube_array_lod = textureDimensions(image_cube_array, 1); let dim_3d = textureDimensions(image_3d); let dim_3d_lod = textureDimensions(image_3d, 1); let dim_2s_ms = textureDimensions(image_aa); let sum = dim_1d + dim_2d.y + dim_2d_lod.y + dim_2d_array.y + dim_2d_array_lod.y + dim_cube.y + dim_cube_lod.y + dim_cube_array.y + dim_cube_array_lod.y + dim_3d.z + dim_3d_lod.z; return vec4(f32(sum)); } @vertex fn levels_queries() -> @builtin(position) vec4 { let num_levels_2d = textureNumLevels(image_2d); let num_levels_2d_array = textureNumLevels(image_2d_array); let num_layers_2d = textureNumLayers(image_2d_array); let num_levels_cube = textureNumLevels(image_cube); let num_levels_cube_array = textureNumLevels(image_cube_array); let num_layers_cube = textureNumLayers(image_cube_array); let num_levels_3d = textureNumLevels(image_3d); let num_samples_aa = textureNumSamples(image_aa); let sum = num_layers_2d + num_layers_cube + num_samples_aa + num_levels_2d + num_levels_2d_array + num_levels_3d + num_levels_cube + num_levels_cube_array; return vec4(f32(sum)); } @group(1) @binding(0) var sampler_reg: sampler; @fragment fn texture_sample() -> @location(0) vec4 { let tc = vec2(0.5); let level = 2.3; let s1d = textureSample(image_1d, sampler_reg, tc.x); let s2d = textureSample(image_2d, sampler_reg, tc); let s2d_offset = textureSample(image_2d, sampler_reg, tc, vec2(3, 1)); let s2d_level = textureSampleLevel(image_2d, sampler_reg, tc, level); let s2d_level_offset = textureSampleLevel(image_2d, sampler_reg, tc, level, vec2(3, 1)); let s2d_bias_offset = textureSampleBias(image_2d, sampler_reg, tc, 2.0, vec2(3, 1)); return s1d + s2d + s2d_offset + s2d_level + s2d_level_offset; } @group(1) @binding(1) var sampler_cmp: sampler_comparison; @group(1) @binding(2) var image_2d_depth: texture_depth_2d; @group(1) @binding(3) var image_cube_depth: texture_depth_cube; @fragment fn texture_sample_comparison() -> @location(0) f32 { let tc = vec2(0.5); let dref = 0.5; let s2d_depth = textureSampleCompare(image_2d_depth, sampler_cmp, tc, dref); let s2d_depth_level = textureSampleCompareLevel(image_2d_depth, sampler_cmp, tc, dref); let scube_depth_level = textureSampleCompareLevel(image_cube_depth, sampler_cmp, vec3(0.5), dref); return s2d_depth + s2d_depth_level; } @fragment fn gather() -> @location(0) vec4 { let tc = vec2(0.5); let dref = 0.5; let s2d = textureGather(1, image_2d, sampler_reg, tc); let s2d_offset = textureGather(3, image_2d, sampler_reg, tc, vec2(3, 1)); let s2d_depth = textureGatherCompare(image_2d_depth, sampler_cmp, tc, dref); let s2d_depth_offset = textureGatherCompare(image_2d_depth, sampler_cmp, tc, dref, vec2(3, 1)); return s2d + s2d_offset + s2d_depth + s2d_depth_offset; } @fragment fn depth_no_comparison() -> @location(0) vec4 { let tc = vec2(0.5); let s2d = textureSample(image_2d_depth, sampler_reg, tc); let s2d_gather = textureGather(image_2d_depth, sampler_reg, tc); return s2d + s2d_gather; } ================================================ FILE: lib/naga/tests/in/interface.param.ron ================================================ ( spv: ( version: (1, 0), capabilities: [ Shader, SampleRateShading ], adjust_coordinate_space: false, force_point_size: true, clamp_frag_depth: true, separate_entry_points: true, ), hlsl: ( shader_model: V5_1, binding_map: {}, fake_missing_bindings: false, special_constants_binding: Some((space: 1, register: 0)), ), wgsl: ( explicit_types: true, ), msl: ( lang_version: (2, 1), per_stage_map: (), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), msl_pipeline: ( allow_point_size: true, ), ) ================================================ FILE: lib/naga/tests/in/interface.wgsl ================================================ // Testing various parts of the pipeline interface: locations, built-ins, and entry points struct VertexOutput { @builtin(position) @invariant position: vec4, @location(1) _varying: f32, } @vertex fn vertex( @builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, @location(10) color: u32, ) -> VertexOutput { let tmp = vertex_index + instance_index + color; return VertexOutput(vec4(1.0), f32(tmp)); } struct FragmentOutput { @builtin(frag_depth) depth: f32, @builtin(sample_mask) sample_mask: u32, @location(0) color: f32, } @fragment fn fragment( in: VertexOutput, @builtin(front_facing) front_facing: bool, @builtin(sample_index) sample_index: u32, @builtin(sample_mask) sample_mask: u32, ) -> FragmentOutput { let mask = sample_mask & (1u << sample_index); let color = select(0.0, 1.0, front_facing); return FragmentOutput(in._varying, mask, color); } var output: array; @compute @workgroup_size(1) fn compute( @builtin(global_invocation_id) global_id: vec3, @builtin(local_invocation_id) local_id: vec3, @builtin(local_invocation_index) local_index: u32, @builtin(workgroup_id) wg_id: vec3, @builtin(num_workgroups) num_wgs: vec3, ) { output[0] = global_id.x + local_id.x + local_index + wg_id.x + num_wgs.x; } struct Input1 { @builtin(vertex_index) index: u32, } struct Input2 { @builtin(instance_index) index: u32, } @vertex fn vertex_two_structs(in1: Input1, in2: Input2) -> @builtin(position) @invariant vec4 { var index = 2u; return vec4(f32(in1.index), f32(in2.index), f32(index), 0.0); } ================================================ FILE: lib/naga/tests/in/interpolate.param.ron ================================================ ( spv: ( version: (1, 0), capabilities: [ Shader, SampleRateShading ], debug: true, force_point_size: true, adjust_coordinate_space: true, ), glsl: ( version: Desktop(400), writer_flags: (bits: 0), binding_map: {}, ), ) ================================================ FILE: lib/naga/tests/in/interpolate.wgsl ================================================ //TODO: merge with "interface"? struct FragmentInput { @builtin(position) position: vec4, @location(0) @interpolate(flat) _flat : u32, @location(1) @interpolate(linear) _linear : f32, @location(2) @interpolate(linear, centroid) linear_centroid : vec2, @location(3) @interpolate(linear, sample) linear_sample : vec3, @location(4) @interpolate(perspective) perspective : vec4, @location(5) @interpolate(perspective, centroid) perspective_centroid : f32, @location(6) @interpolate(perspective, sample) perspective_sample : f32, } @vertex fn vert_main() -> FragmentInput { var out: FragmentInput; out.position = vec4(2.0, 4.0, 5.0, 6.0); out._flat = 8u; out._linear = 27.0; out.linear_centroid = vec2(64.0, 125.0); out.linear_sample = vec3(216.0, 343.0, 512.0); out.perspective = vec4(729.0, 1000.0, 1331.0, 1728.0); out.perspective_centroid = 2197.0; out.perspective_sample = 2744.0; return out; } @fragment fn frag_main(val : FragmentInput) { } ================================================ FILE: lib/naga/tests/in/lexical-scopes.wgsl ================================================ fn blockLexicalScope(a: bool) { let a = 1.0; { let a = 2; { let a = true; } let test = a == 3; } let test = a == 2.0; } fn ifLexicalScope(a: bool) { let a = 1.0; if (a == 1.0) { let a = true; } let test = a == 2.0; } fn loopLexicalScope(a: bool) { let a = 1.0; loop { let a = true; } let test = a == 2.0; } fn forLexicalScope(a: f32) { let a = false; for (var a = 0; a < 1; a++) { let a = 3.0; } let test = a == true; } fn whileLexicalScope(a: i32) { while (a > 2) { let a = false; } let test = a == 1; } fn switchLexicalScope(a: i32) { switch (a) { case 0 { let a = false; } case 1 { let a = 2.0; } default { let a = true; } } let test = a == 2; } ================================================ FILE: lib/naga/tests/in/math-functions.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/math-functions.wgsl ================================================ @vertex fn main() { let f = 1.0; let v = vec4(0.0); let a = degrees(f); let b = radians(f); let c = degrees(v); let d = radians(v); let e = saturate(v); let const_dot = dot(vec2(), vec2()); let first_leading_bit_abs = firstLeadingBit(abs(0u)); } ================================================ FILE: lib/naga/tests/in/multiview.param.ron ================================================ ( glsl_multiview: Some(2), ) ================================================ FILE: lib/naga/tests/in/multiview.wgsl ================================================ @vertex fn main(@builtin(view_index) view_index: i32) {} ================================================ FILE: lib/naga/tests/in/multiview_webgl.param.ron ================================================ ( glsl: ( version: Embedded ( version: 300, is_webgl: true ), writer_flags: (bits: 0), binding_map: {}, ), glsl_multiview: Some(2), ) ================================================ FILE: lib/naga/tests/in/multiview_webgl.wgsl ================================================ @vertex fn main(@builtin(view_index) view_index: i32) {} ================================================ FILE: lib/naga/tests/in/operators.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/operators.wgsl ================================================ //TODO: support splatting constructors for globals? let v_f32_one = vec4(1.0, 1.0, 1.0, 1.0); let v_f32_zero = vec4(0.0, 0.0, 0.0, 0.0); let v_f32_half = vec4(0.5, 0.5, 0.5, 0.5); let v_i32_one = vec4(1, 1, 1, 1); fn builtins() -> vec4 { // select() let condition = true; let s1 = select(0, 1, condition); let s2 = select(v_f32_zero, v_f32_one, condition); let s3 = select(v_f32_one, v_f32_zero, vec4(false, false, false, false)); // mix() let m1 = mix(v_f32_zero, v_f32_one, v_f32_half); let m2 = mix(v_f32_zero, v_f32_one, 0.1); // bitcast() let b1 = bitcast(v_i32_one.x); let b2 = bitcast>(v_i32_one); // convert let v_i32_zero = vec4(v_f32_zero); // done return vec4(vec4(s1) + v_i32_zero) + s2 + m1 + m2 + b1 + b2; } fn splat() -> vec4 { let a = (1.0 + vec2(2.0) - 3.0) / 4.0; let b = vec4(5) % 2; return a.xyxy + vec4(b); } fn splat_assignment() -> vec2 { var a = vec2(2.0); a += 1.0; a -= 3.0; a /= 4.0; return a; } fn bool_cast(x: vec3) -> vec3 { let y = vec3(x); return vec3(y); } struct Foo { a: vec4, b: i32, } fn constructors() -> f32 { var foo: Foo; foo = Foo(vec4(1.0), 1); let mat2comp = mat2x2( 1.0, 0.0, 0.0, 1.0, ); let mat4comp = mat4x4( 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, ); // zero value constructors _ = bool(); _ = i32(); _ = u32(); _ = f32(); _ = vec2(); _ = mat2x2(); _ = array(); _ = Foo(); // constructors that infer their type from their parameters _ = vec2(0u); _ = mat2x2(vec2(0.), vec2(0.)); _ = array(0, 1, 2, 3); // identity constructors _ = bool(bool()); _ = i32(i32()); _ = u32(u32()); _ = f32(f32()); _ = vec2(vec2()); _ = mat2x3(mat2x3()); _ = vec2(vec2()); _ = mat2x3(mat2x3()); return foo.a.x; } fn logical() { // unary _ = !true; _ = !vec2(true); // binary _ = true || false; _ = true && false; _ = true | false; _ = vec3(true) | vec3(false); _ = true & false; _ = vec4(true) & vec4(false); } fn arithmetic() { // unary // TODO: uncomment when we get the changes from https://github.com/gfx-rs/rspirv/pull/231 // _ = -1; _ = -1.0; _ = -vec2(1); _ = -vec2(1.0); // binary // Addition _ = 2 + 1; _ = 2u + 1u; _ = 2.0 + 1.0; _ = vec2(2) + vec2(1); _ = vec3(2u) + vec3(1u); _ = vec4(2.0) + vec4(1.0); // Subtraction _ = 2 - 1; _ = 2u - 1u; _ = 2.0 - 1.0; _ = vec2(2) - vec2(1); _ = vec3(2u) - vec3(1u); _ = vec4(2.0) - vec4(1.0); // Multiplication _ = 2 * 1; _ = 2u * 1u; _ = 2.0 * 1.0; _ = vec2(2) * vec2(1); _ = vec3(2u) * vec3(1u); _ = vec4(2.0) * vec4(1.0); // Division _ = 2 / 1; _ = 2u / 1u; _ = 2.0 / 1.0; _ = vec2(2) / vec2(1); _ = vec3(2u) / vec3(1u); _ = vec4(2.0) / vec4(1.0); // Remainder _ = 2 % 1; _ = 2u % 1u; _ = 2.0 % 1.0; _ = vec2(2) % vec2(1); _ = vec3(2u) % vec3(1u); _ = vec4(2.0) % vec4(1.0); // Binary arithmetic expressions with mixed scalar and vector operands _ = vec2(2) + 1; _ = 2 + vec2(1); _ = vec2(2u) + 1u; _ = 2u + vec2(1u); _ = vec2(2.0) + 1.0; _ = 2.0 + vec2(1.0); _ = vec2(2) - 1; _ = 2 - vec2(1); _ = vec2(2u) - 1u; _ = 2u - vec2(1u); _ = vec2(2.0) - 1.0; _ = 2.0 - vec2(1.0); _ = vec2(2) * 1; _ = 2 * vec2(1); _ = vec2(2u) * 1u; _ = 2u * vec2(1u); _ = vec2(2.0) * 1.0; _ = 2.0 * vec2(1.0); _ = vec2(2) / 1; _ = 2 / vec2(1); _ = vec2(2u) / 1u; _ = 2u / vec2(1u); _ = vec2(2.0) / 1.0; _ = 2.0 / vec2(1.0); _ = vec2(2) % 1; _ = 2 % vec2(1); _ = vec2(2u) % 1u; _ = 2u % vec2(1u); _ = vec2(2.0) % 1.0; _ = 2.0 % vec2(1.0); // Matrix arithmetic _ = mat3x3() + mat3x3(); _ = mat3x3() - mat3x3(); _ = mat3x3() * 1.0; _ = 2.0 * mat3x3(); _ = mat4x3() * vec4(1.0); _ = vec3(2.0) * mat4x3(); _ = mat4x3() * mat3x4(); } fn bit() { // unary _ = ~1; _ = ~1u; _ = ~vec2(1); _ = ~vec3(1u); // binary _ = 2 | 1; _ = 2u | 1u; _ = vec2(2) | vec2(1); _ = vec3(2u) | vec3(1u); _ = 2 & 1; _ = 2u & 1u; _ = vec2(2) & vec2(1); _ = vec3(2u) & vec3(1u); _ = 2 ^ 1; _ = 2u ^ 1u; _ = vec2(2) ^ vec2(1); _ = vec3(2u) ^ vec3(1u); _ = 2 << 1u; _ = 2u << 1u; _ = vec2(2) << vec2(1u); _ = vec3(2u) << vec3(1u); _ = 2 >> 1u; _ = 2u >> 1u; _ = vec2(2) >> vec2(1u); _ = vec3(2u) >> vec3(1u); } fn comparison() { _ = 2 == 1; _ = 2u == 1u; _ = 2.0 == 1.0; _ = vec2(2) == vec2(1); _ = vec3(2u) == vec3(1u); _ = vec4(2.0) == vec4(1.0); _ = 2 != 1; _ = 2u != 1u; _ = 2.0 != 1.0; _ = vec2(2) != vec2(1); _ = vec3(2u) != vec3(1u); _ = vec4(2.0) != vec4(1.0); _ = 2 < 1; _ = 2u < 1u; _ = 2.0 < 1.0; _ = vec2(2) < vec2(1); _ = vec3(2u) < vec3(1u); _ = vec4(2.0) < vec4(1.0); _ = 2 <= 1; _ = 2u <= 1u; _ = 2.0 <= 1.0; _ = vec2(2) <= vec2(1); _ = vec3(2u) <= vec3(1u); _ = vec4(2.0) <= vec4(1.0); _ = 2 > 1; _ = 2u > 1u; _ = 2.0 > 1.0; _ = vec2(2) > vec2(1); _ = vec3(2u) > vec3(1u); _ = vec4(2.0) > vec4(1.0); _ = 2 >= 1; _ = 2u >= 1u; _ = 2.0 >= 1.0; _ = vec2(2) >= vec2(1); _ = vec3(2u) >= vec3(1u); _ = vec4(2.0) >= vec4(1.0); } fn assignment() { var a = 1; a += 1; a -= 1; a *= a; a /= a; a %= 1; a &= 0; a |= 0; a ^= 0; a <<= 2u; a >>= 1u; a++; a--; var vec0: vec3 = vec3(); vec0[1]++; vec0[1]--; } @compute @workgroup_size(1) fn main() { _ = builtins(); _ = splat(); _ = bool_cast(v_f32_one.xyz); _ = constructors(); logical(); arithmetic(); bit(); comparison(); assignment(); } ================================================ FILE: lib/naga/tests/in/padding.param.ron ================================================ ( spv: ( version: (1, 1), debug: true, adjust_coordinate_space: false, ), msl: ( lang_version: (2, 0), per_stage_map: ( vs: ( resources: { (group: 0, binding: 0): (buffer: Some(0), mutable: false), (group: 0, binding: 1): (buffer: Some(1), mutable: false), (group: 0, binding: 2): (buffer: Some(2), mutable: false), }, ), ), inline_samplers: [], spirv_cross_compatibility: false, fake_missing_bindings: false, ), ) ================================================ FILE: lib/naga/tests/in/padding.wgsl ================================================ struct S { a: vec3, } struct Test { a: S, b: f32, // offset: 16 } struct Test2 { a: array, 2>, b: f32, // offset: 32 } struct Test3 { a: mat4x3, b: f32, // offset: 64 } @group(0) @binding(0) var input1: Test; @group(0) @binding(1) var input2: Test2; @group(0) @binding(2) var input3: Test3; @vertex fn vertex() -> @builtin(position) vec4 { return vec4(1.0) * input1.b * input2.b * input3.b; } ================================================ FILE: lib/naga/tests/in/pointers.param.ron ================================================ ( bounds_check_policies: ( image: ReadZeroSkipWrite, ), spv: ( version: (1, 2), debug: true, adjust_coordinate_space: false, ), ) ================================================ FILE: lib/naga/tests/in/pointers.wgsl ================================================ fn f() { var v: vec2; let px = &v.x; *px = 10; } struct DynamicArray { arr: array } @group(0) @binding(0) var dynamic_array: DynamicArray; fn index_unsized(i: i32, v: u32) { let p: ptr = &dynamic_array; let val = (*p).arr[i]; (*p).arr[i] = val + v; } fn index_dynamic_array(i: i32, v: u32) { let p: ptr, read_write> = &dynamic_array.arr; let val = (*p)[i]; (*p)[i] = val + v; } ================================================ FILE: lib/naga/tests/in/policy-mix.param.ron ================================================ ( bounds_check_policies: ( index: Restrict, buffer: Unchecked, image: ReadZeroSkipWrite, ), spv: ( version: (1, 1), debug: true, ), ) ================================================ FILE: lib/naga/tests/in/policy-mix.wgsl ================================================ // Tests that the index, buffer, and texture bounds checks policies are // implemented separately. // Storage and Uniform storage classes struct InStorage { a: array, 10> } @group(0) @binding(0) var in_storage: InStorage; struct InUniform { a: array, 20> } @group(0) @binding(1) var in_uniform: InUniform; // Textures automatically land in the `handle` storage class. @group(0) @binding(2) var image_2d_array: texture_2d_array; // None of the above. var in_workgroup: array; var in_private: array; fn mock_function(c: vec2, i: i32, l: i32) -> vec4 { var in_function: array, 2> = array, 2>(vec4(0.707, 0.0, 0.0, 1.0), vec4(0.0, 0.707, 0.0, 1.0)); return (in_storage.a[i] + in_uniform.a[i] + textureLoad(image_2d_array, c, i, l) + in_workgroup[i] + in_private[i] + in_function[i]); } ================================================ FILE: lib/naga/tests/in/push-constants.param.ron ================================================ ( god_mode: true, glsl: ( version: Embedded( version: 320, is_webgl: false ), writer_flags: (bits: 0), binding_map: {}, ), hlsl: ( shader_model: V5_1, binding_map: {}, fake_missing_bindings: true, special_constants_binding: Some((space: 1, register: 0)), push_constants_target: Some((space: 0, register: 0)), ), ) ================================================ FILE: lib/naga/tests/in/push-constants.wgsl ================================================ struct PushConstants { multiplier: f32 } var pc: PushConstants; struct FragmentIn { @location(0) color: vec4 } @vertex fn vert_main( @location(0) pos : vec2, @builtin(vertex_index) vi: u32, ) -> @builtin(position) vec4 { return vec4(f32(vi) * pc.multiplier * pos, 0.0, 1.0); } @fragment fn main(in: FragmentIn) -> @location(0) vec4 { return in.color * pc.multiplier; } ================================================ FILE: lib/naga/tests/in/quad.param.ron ================================================ ( spv: ( version: (1, 0), debug: true, adjust_coordinate_space: true, ), glsl: ( version: Embedded( version: 300, is_webgl: false ), writer_flags: (bits: 0), binding_map: {}, ), ) ================================================ FILE: lib/naga/tests/in/quad.wgsl ================================================ // vertex let c_scale: f32 = 1.2; struct VertexOutput { @location(0) uv : vec2, @builtin(position) position : vec4, } @vertex fn vert_main( @location(0) pos : vec2, @location(1) uv : vec2, ) -> VertexOutput { return VertexOutput(uv, vec4(c_scale * pos, 0.0, 1.0)); } // fragment @group(0) @binding(0) var u_texture : texture_2d; @group(0) @binding(1) var u_sampler : sampler; @fragment fn frag_main(@location(0) uv : vec2) -> @location(0) vec4 { let color = textureSample(u_texture, u_sampler, uv); if color.a == 0.0 { discard; } // forcing the expression here to be emitted in order to check the // uniformity of the control flow a bit more strongly. let premultiplied = color.a * color; return premultiplied; } // We need to make sure that backends are successfully handling multiple entry points for the same shader stage. @fragment fn fs_extra() -> @location(0) vec4 { return vec4(0.0, 0.5, 0.0, 0.5); } ================================================ FILE: lib/naga/tests/in/shadow.param.ron ================================================ ( spv: ( version: (1, 2), debug: true, adjust_coordinate_space: true, ), ) ================================================ FILE: lib/naga/tests/in/shadow.wgsl ================================================ struct Globals { view_proj: mat4x4, num_lights: vec4, } @group(0) @binding(0) var u_globals: Globals; struct Entity { world: mat4x4, color: vec4, } @group(1) @binding(0) var u_entity: Entity; /* Not useful for testing @vertex fn vs_bake(@location(0) position: vec4) -> @builtin(position) vec4 { return u_globals.view_proj * u_entity.world * vec4(position); } */ struct VertexOutput { @builtin(position) proj_position: vec4, @location(0) world_normal: vec3, @location(1) world_position: vec4, } @vertex fn vs_main( @location(0) position: vec4, @location(1) normal: vec4, ) -> VertexOutput { let w = u_entity.world; let world_pos = u_entity.world * vec4(position); var out: VertexOutput; out.world_normal = mat3x3(w.x.xyz, w.y.xyz, w.z.xyz) * vec3(normal.xyz); out.world_position = world_pos; out.proj_position = u_globals.view_proj * world_pos; return out; } // fragment shader struct Light { proj: mat4x4, pos: vec4, color: vec4, } @group(0) @binding(1) var s_lights: array; @group(0) @binding(1) var u_lights: array; // Used when storage types are not supported @group(0) @binding(2) var t_shadow: texture_depth_2d_array; @group(0) @binding(3) var sampler_shadow: sampler_comparison; fn fetch_shadow(light_id: u32, homogeneous_coords: vec4) -> f32 { if (homogeneous_coords.w <= 0.0) { return 1.0; } // compensate for the Y-flip difference between the NDC and texture coordinates let flip_correction = vec2(0.5, -0.5); // compute texture coordinates for shadow lookup let proj_correction = 1.0 / homogeneous_coords.w; let light_local = homogeneous_coords.xy * flip_correction * proj_correction + vec2(0.5, 0.5); // do the lookup, using HW PCF and comparison return textureSampleCompareLevel(t_shadow, sampler_shadow, light_local, i32(light_id), homogeneous_coords.z * proj_correction); } let c_ambient: vec3 = vec3(0.05, 0.05, 0.05); let c_max_lights: u32 = 10u; @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { let normal = normalize(in.world_normal); // accumulate color var color: vec3 = c_ambient; for(var i = 0u; i < min(u_globals.num_lights.x, c_max_lights); i++) { let light = s_lights[i]; // project into the light space let shadow = fetch_shadow(i, light.proj * in.world_position); // compute Lambertian diffuse term let light_dir = normalize(light.pos.xyz - in.world_position.xyz); let diffuse = max(0.0, dot(normal, light_dir)); // add light contribution color += shadow * diffuse * light.color.xyz; } // multiply the light by material color return vec4(color, 1.0) * u_entity.color; } // The fragment entrypoint used when storage buffers are not available for the lights @fragment fn fs_main_without_storage(in: VertexOutput) -> @location(0) vec4 { let normal = normalize(in.world_normal); var color: vec3 = c_ambient; for(var i = 0u; i < min(u_globals.num_lights.x, c_max_lights); i++) { // This line is the only difference from the entrypoint above. It uses the lights // uniform instead of the lights storage buffer let light = u_lights[i]; let shadow = fetch_shadow(i, light.proj * in.world_position); let light_dir = normalize(light.pos.xyz - in.world_position.xyz); let diffuse = max(0.0, dot(normal, light_dir)); color += shadow * diffuse * light.color.xyz; } return vec4(color, 1.0) * u_entity.color; } ================================================ FILE: lib/naga/tests/in/skybox.param.ron ================================================ ( spv_flow_dump_prefix: "", spv: ( version: (1, 0), debug: false, adjust_coordinate_space: false, ), msl: ( lang_version: (2, 1), per_stage_map: ( vs: ( resources: { (group: 0, binding: 0): (buffer: Some(0)), }, ), fs: ( resources: { (group: 0, binding: 1): (texture: Some(0)), (group: 0, binding: 2): (sampler: Some(Inline(0))), }, ), ), inline_samplers: [ ( coord: Normalized, address: (ClampToEdge, ClampToEdge, ClampToEdge), mag_filter: Linear, min_filter: Linear, mip_filter: None, border_color: TransparentBlack, compare_func: Never, lod_clamp: Some((start: 0.5, end: 10.0)), max_anisotropy: Some(8), ), ], spirv_cross_compatibility: false, fake_missing_bindings: false, ), glsl: ( version: Embedded( version: 320, is_webgl: false ), writer_flags: (bits: 0), binding_map: { (group: 0, binding: 0): 0, (group: 0, binding: 1): 0, }, ), hlsl: ( shader_model: V5_1, binding_map: { (group: 0, binding: 0): (space: 0, register: 0), (group: 0, binding: 1): (space: 0, register: 0), (group: 0, binding: 2): (space: 1, register: 0), }, fake_missing_bindings: false, special_constants_binding: Some((space: 0, register: 1)), ), ) ================================================ FILE: lib/naga/tests/in/skybox.wgsl ================================================ struct VertexOutput { @builtin(position) position: vec4, @location(0) uv: vec3, } struct Data { proj_inv: mat4x4, view: mat4x4, } @group(0) @binding(0) var r_data: Data; @vertex fn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput { // hacky way to draw a large triangle var tmp1 = i32(vertex_index) / 2; var tmp2 = i32(vertex_index) & 1; let pos = vec4( f32(tmp1) * 4.0 - 1.0, f32(tmp2) * 4.0 - 1.0, 0.0, 1.0, ); let inv_model_view = transpose(mat3x3(r_data.view.x.xyz, r_data.view.y.xyz, r_data.view.z.xyz)); let unprojected = r_data.proj_inv * pos; return VertexOutput(pos, inv_model_view * unprojected.xyz); } @group(0) @binding(1) var r_texture: texture_cube; @group(0) @binding(2) var r_sampler: sampler; @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { return textureSample(r_texture, r_sampler, in.uv); } ================================================ FILE: lib/naga/tests/in/spv/empty-global-name.spvasm ================================================ ;; Make sure we handle globals whose assigned name is "". ;; ;; In MSL, the anonymous global sometimes ends up looking like ;; ;; struct Blah { int member; } ; ;; ;; where the null name just becomes an empty string before that last semicolon. ;; This is, unfortunately, valid MSL, simply declaring the type Blah, so it will ;; pass validation. However, an attempt to *use* the global will generate a ;; garbage expression like ".member", so we include a function that returns the ;; member's value. OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %main "main" %global OpExecutionMode %main LocalSize 1 1 1 OpName %global "" OpDecorate %block Block OpMemberDecorate %block 0 Offset 0 OpDecorate %global DescriptorSet 0 OpDecorate %global Binding 0 %void = OpTypeVoid %int = OpTypeInt 32 1 %block = OpTypeStruct %int %ptr_int = OpTypePointer StorageBuffer %int %ptr_block = OpTypePointer StorageBuffer %block %fn_void = OpTypeFunction %void %fn_int = OpTypeFunction %int %zero = OpConstant %int 0 %one = OpConstant %int 1 ;; This global is said to have a name of "". %global = OpVariable %ptr_block StorageBuffer %main = OpFunction %void None %fn_void %main_prelude = OpLabel %member_ptr = OpAccessChain %ptr_int %global %zero %member_val = OpLoad %int %member_ptr %plus_one = OpIAdd %int %member_val %one OpStore %member_ptr %plus_one OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/in/standard.param.ron ================================================ ( ) ================================================ FILE: lib/naga/tests/in/standard.wgsl ================================================ // Standard functions. @fragment fn derivatives(@builtin(position) foo: vec4) -> @location(0) vec4 { let x = dpdx(foo); let y = dpdy(foo); let z = fwidth(foo); return (x + y) * z; } ================================================ FILE: lib/naga/tests/in/texture-arg.param.ron ================================================ ( spv: ( version: (1, 0), debug: true, adjust_coordinate_space: true, ), ) ================================================ FILE: lib/naga/tests/in/texture-arg.wgsl ================================================ @group(0) @binding(0) var Texture: texture_2d; @group(0) @binding(1) var Sampler: sampler; fn test(Passed_Texture: texture_2d, Passed_Sampler: sampler) -> vec4 { return textureSample(Passed_Texture, Passed_Sampler, vec2(0.0, 0.0)); } @fragment fn main() -> @location(0) vec4 { return test(Texture, Sampler); } ================================================ FILE: lib/naga/tests/in/variations.glsl ================================================ #version 460 core layout(set = 0, binding = 0) uniform textureCube texCube; layout(set = 0, binding = 1) uniform sampler samp; void main() { ivec2 sizeCube = textureSize(samplerCube(texCube, samp), 0); float a = ceil(1.0); } ================================================ FILE: lib/naga/tests/out/analysis/collatz.info.ron ================================================ ( functions: [ ( flags: ( bits: 31, ), available_stages: ( bits: 7, ), uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), may_kill: false, sampling_set: [], global_uses: [ ( bits: 0, ), ], expressions: [ ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(1), ty: Value(Pointer( base: 3, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 7, assignable_global: None, ty: Value(Pointer( base: 1, space: Function, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 3, assignable_global: None, ty: Value(Pointer( base: 1, space: Function, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Bool, width: 1, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Bool, width: 1, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ], sampling: [], ), ], entry_points: [ ( flags: ( bits: 31, ), available_stages: ( bits: 7, ), uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), may_kill: false, sampling_set: [], global_uses: [ ( bits: 3, ), ], expressions: [ ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 2, assignable_global: Some(1), ty: Value(Pointer( base: 3, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 2, assignable_global: None, ty: Handle(4), ), ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(1), ty: Value(Pointer( base: 2, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(1), ty: Value(Pointer( base: 1, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(1), ty: Value(Pointer( base: 2, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(1), ty: Value(Pointer( base: 1, space: Storage( access: ( bits: 3, ), ), )), ), ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ], sampling: [], ), ], ) ================================================ FILE: lib/naga/tests/out/analysis/shadow.info.ron ================================================ ( functions: [ ( flags: ( bits: 31, ), available_stages: ( bits: 7, ), uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), may_kill: false, sampling_set: [ ( image: 1, sampler: 2, ), ], global_uses: [ ( bits: 1, ), ( bits: 1, ), ( bits: 0, ), ( bits: 0, ), ( bits: 0, ), ( bits: 0, ), ( bits: 0, ), ], expressions: [ ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(3), ty: Value(Pointer( base: 13, space: Uniform, )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(6), ty: Value(Pointer( base: 2, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(5), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(1), ty: Handle(30), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(2), ty: Handle(31), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(4), ty: Value(Pointer( base: 20, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(7), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(7), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 2, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 3, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 6, assignable_global: None, ty: Handle(4), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Bool, width: 1, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Vector( size: Bi, kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 2, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 3, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(6), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ], sampling: [], ), ( flags: ( bits: 31, ), available_stages: ( bits: 7, ), uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), may_kill: false, sampling_set: [ ( image: 1, sampler: 2, ), ], global_uses: [ ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 2, ), ], expressions: [ ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(3), ty: Value(Pointer( base: 13, space: Uniform, )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(6), ty: Value(Pointer( base: 2, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 4, assignable_global: Some(5), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(1), ty: Handle(30), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: Some(2), ty: Handle(31), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 7, assignable_global: Some(4), ty: Value(Pointer( base: 20, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(7), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(7), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Value(Scalar( kind: Sint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 0, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 3, assignable_global: None, ty: Value(Pointer( base: 2, space: Function, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 11, assignable_global: None, ty: Value(Pointer( base: 3, space: Function, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(3), ty: Value(Pointer( base: 12, space: Uniform, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(3), ty: Value(ValuePointer( size: None, kind: Uint, width: 4, space: Uniform, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Uint, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Bool, width: 1, )), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 17, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(17), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(4), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Vector( size: Quad, kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(1), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(5), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(5), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(5), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: None, requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 19, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 18, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(Pointer( base: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(4), ty: Value(ValuePointer( size: None, kind: Float, width: 4, space: Storage( access: ( bits: 1, ), ), )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Value(Scalar( kind: Float, width: 4, )), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(48), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(3), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(47), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(4), ), ], sampling: [], ), ], entry_points: [ ( flags: ( bits: 31, ), available_stages: ( bits: 7, ), uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), may_kill: false, sampling_set: [ ( image: 1, sampler: 2, ), ], global_uses: [ ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 1, ), ( bits: 3, ), ( bits: 3, ), ( bits: 3, ), ], expressions: [ ( uniformity: ( non_uniform_result: Some(1), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(2), ), ( uniformity: ( non_uniform_result: Some(2), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(6), ty: Value(Pointer( base: 2, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(3), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(4), ), ( uniformity: ( non_uniform_result: Some(4), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(5), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: Some(7), ty: Value(Pointer( base: 4, space: Private, )), ), ( uniformity: ( non_uniform_result: Some(5), requirements: ( bits: 0, ), ), ref_count: 1, assignable_global: None, ty: Handle(4), ), ], sampling: [], ), ], ) ================================================ FILE: lib/naga/tests/out/dot/quad.dot ================================================ digraph Module { subgraph cluster_globals { label="Globals" g0 [ shape=hexagon label="[1] Handle/'u_texture'" ] g1 [ shape=hexagon label="[2] Handle/'u_sampler'" ] } subgraph cluster_ep0 { label="Vertex/'vert_main'" node [ style=filled ] ep0_e0 [ fillcolor="#ffffb3" label="[1] Constant" ] ep0_e1 [ color="#8dd3c7" label="[2] Argument[0]" ] ep0_e2 [ color="#8dd3c7" label="[3] Argument[1]" ] ep0_e3 [ color="#fdb462" label="[4] Multiply" ] ep0_e1 -> ep0_e3 [ label="right" ] ep0_e0 -> ep0_e3 [ label="left" ] ep0_e4 [ fillcolor="#ffffb3" label="[5] Constant" ] ep0_e5 [ fillcolor="#ffffb3" label="[6] Constant" ] ep0_e6 [ color="#bebada" label="[7] Compose" ] { ep0_e3 ep0_e4 ep0_e5 } -> ep0_e6 ep0_e7 [ color="#bebada" label="[8] Compose" ] { ep0_e2 ep0_e6 } -> ep0_e7 ep0_s0 [ shape=square label="Root" ] ep0_s1 [ shape=square label="Emit" ] ep0_s2 [ shape=square label="Emit" ] ep0_s3 [ shape=square label="Return" ] ep0_s0 -> ep0_s1 [ arrowhead=tee label="" ] ep0_s1 -> ep0_s2 [ arrowhead=tee label="" ] ep0_s2 -> ep0_s3 [ arrowhead=tee label="" ] ep0_e7 -> ep0_s3 [ label="value" ] ep0_s1 -> ep0_e3 [ style=dotted ] ep0_s2 -> ep0_e6 [ style=dotted ] ep0_s2 -> ep0_e7 [ style=dotted ] } subgraph cluster_ep1 { label="Fragment/'frag_main'" node [ style=filled ] ep1_e0 [ fillcolor="#ffffb3" label="[1] Constant" ] ep1_e1 [ color="#ffffb3" label="[2] Global" ] g1 -> ep1_e1 [fillcolor=gray] ep1_e2 [ color="#ffffb3" label="[3] Global" ] g0 -> ep1_e2 [fillcolor=gray] ep1_e3 [ color="#8dd3c7" label="[4] Argument[0]" ] ep1_e4 [ color="#80b1d3" label="[5] ImageSample" ] ep1_e1 -> ep1_e4 [ label="sampler" ] ep1_e2 -> ep1_e4 [ label="image" ] ep1_e3 -> ep1_e4 [ label="coordinate" ] ep1_e5 [ color="#8dd3c7" label="[6] AccessIndex[3]" ] ep1_e4 -> ep1_e5 [ label="base" ] ep1_e6 [ fillcolor="#ffffb3" label="[7] Constant" ] ep1_e7 [ color="#fdb462" label="[8] Equal" ] ep1_e6 -> ep1_e7 [ label="right" ] ep1_e5 -> ep1_e7 [ label="left" ] ep1_e8 [ color="#8dd3c7" label="[9] AccessIndex[3]" ] ep1_e4 -> ep1_e8 [ label="base" ] ep1_e9 [ color="#fdb462" label="[10] Multiply" ] ep1_e4 -> ep1_e9 [ label="right" ] ep1_e8 -> ep1_e9 [ label="left" ] ep1_s0 [ shape=square label="Root" ] ep1_s1 [ shape=square label="Emit" ] ep1_s2 [ shape=square label="Emit" ] ep1_s3 [ shape=square label="Emit" ] ep1_s4 [ shape=square label="If" ] ep1_s5 [ shape=square label="Node" ] ep1_s6 [ shape=square label="Kill" ] ep1_s7 [ shape=square label="Node" ] ep1_s8 [ shape=square label="Merge" ] ep1_s9 [ shape=square label="Emit" ] ep1_s10 [ shape=square label="Return" ] ep1_s0 -> ep1_s1 [ arrowhead=tee label="" ] ep1_s1 -> ep1_s2 [ arrowhead=tee label="" ] ep1_s2 -> ep1_s3 [ arrowhead=tee label="" ] ep1_s3 -> ep1_s4 [ arrowhead=tee label="" ] ep1_s5 -> ep1_s6 [ arrowhead=tee label="" ] ep1_s4 -> ep1_s5 [ arrowhead=tee label="accept" ] ep1_s4 -> ep1_s7 [ arrowhead=tee label="reject" ] ep1_s6 -> ep1_s8 [ arrowhead=tee label="" ] ep1_s7 -> ep1_s8 [ arrowhead=tee label="" ] ep1_s8 -> ep1_s9 [ arrowhead=tee label="" ] ep1_s9 -> ep1_s10 [ arrowhead=tee label="" ] ep1_e7 -> ep1_s4 [ label="condition" ] ep1_e9 -> ep1_s10 [ label="value" ] ep1_s1 -> ep1_e4 [ style=dotted ] ep1_s2 -> ep1_e5 [ style=dotted ] ep1_s3 -> ep1_e7 [ style=dotted ] ep1_s9 -> ep1_e8 [ style=dotted ] ep1_s9 -> ep1_e9 [ style=dotted ] } subgraph cluster_ep2 { label="Fragment/'fs_extra'" node [ style=filled ] ep2_e0 [ fillcolor="#ffffb3" label="[1] Constant" ] ep2_e1 [ color="#ffffb3" label="[2] Global" ] g1 -> ep2_e1 [fillcolor=gray] ep2_e2 [ color="#ffffb3" label="[3] Global" ] g0 -> ep2_e2 [fillcolor=gray] ep2_e3 [ fillcolor="#ffffb3" label="[4] Constant" ] ep2_e4 [ fillcolor="#ffffb3" label="[5] Constant" ] ep2_e5 [ fillcolor="#ffffb3" label="[6] Constant" ] ep2_e6 [ fillcolor="#ffffb3" label="[7] Constant" ] ep2_e7 [ fillcolor="#bebada" label="[8] Compose" ] { ep2_e3 ep2_e4 ep2_e5 ep2_e6 } -> ep2_e7 ep2_s0 [ shape=square label="Root" ] ep2_s1 [ shape=square label="Emit" ] ep2_s2 [ shape=square label="Return" ] ep2_s0 -> ep2_s1 [ arrowhead=tee label="" ] ep2_s1 -> ep2_s2 [ arrowhead=tee label="" ] ep2_e7 -> ep2_s2 [ label="value" ] ep2_s1 -> ep2_e7 [ style=dotted ] } } ================================================ FILE: lib/naga/tests/out/glsl/access.assign_through_ptr.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; struct GlobalConst { uint a; uvec3 b; int c; }; struct AlignedWrapper { int value; }; struct Baz { mat3x2 m; }; struct MatCx2InArray { mat4x2 am[2]; }; shared uint val; float read_from_private(inout float foo_1) { float _e6 = foo_1; return _e6; } float test_arr_as_arg(float a[5][10]) { return a[4][9]; } void assign_through_ptr_fn(inout uint p) { p = 42u; return; } void main() { assign_through_ptr_fn(val); return; } ================================================ FILE: lib/naga/tests/out/glsl/access.atomics.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; struct GlobalConst { uint a; uvec3 b; int c; }; struct AlignedWrapper { int value; }; struct Baz { mat3x2 m; }; struct MatCx2InArray { mat4x2 am[2]; }; layout(std430) buffer Bar_block_0Compute { mat4x3 _matrix; mat2x2 matrix_array[2]; int atom; uvec2 arr[2]; AlignedWrapper data[]; } _group_0_binding_0_cs; float read_from_private(inout float foo_1) { float _e6 = foo_1; return _e6; } float test_arr_as_arg(float a[5][10]) { return a[4][9]; } void assign_through_ptr_fn(inout uint p) { p = 42u; return; } void main() { int tmp = 0; int value = _group_0_binding_0_cs.atom; int _e10 = atomicAdd(_group_0_binding_0_cs.atom, 5); tmp = _e10; int _e13 = atomicAdd(_group_0_binding_0_cs.atom, -5); tmp = _e13; int _e16 = atomicAnd(_group_0_binding_0_cs.atom, 5); tmp = _e16; int _e19 = atomicOr(_group_0_binding_0_cs.atom, 5); tmp = _e19; int _e22 = atomicXor(_group_0_binding_0_cs.atom, 5); tmp = _e22; int _e25 = atomicMin(_group_0_binding_0_cs.atom, 5); tmp = _e25; int _e28 = atomicMax(_group_0_binding_0_cs.atom, 5); tmp = _e28; int _e31 = atomicExchange(_group_0_binding_0_cs.atom, 5); tmp = _e31; _group_0_binding_0_cs.atom = value; return; } ================================================ FILE: lib/naga/tests/out/glsl/access.foo_frag.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; struct GlobalConst { uint a; uvec3 b; int c; }; struct AlignedWrapper { int value; }; struct Baz { mat3x2 m; }; struct MatCx2InArray { mat4x2 am[2]; }; layout(std430) buffer Bar_block_0Fragment { mat4x3 _matrix; mat2x2 matrix_array[2]; int atom; uvec2 arr[2]; AlignedWrapper data[]; } _group_0_binding_0_fs; layout(std430) buffer type_11_block_1Fragment { ivec2 _group_0_binding_2_fs; }; layout(location = 0) out vec4 _fs2p_location0; float read_from_private(inout float foo_1) { float _e6 = foo_1; return _e6; } float test_arr_as_arg(float a[5][10]) { return a[4][9]; } void assign_through_ptr_fn(inout uint p) { p = 42u; return; } void main() { _group_0_binding_0_fs._matrix[1][2] = 1.0; _group_0_binding_0_fs._matrix = mat4x3(vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0)); _group_0_binding_0_fs.arr = uvec2[2](uvec2(0u), uvec2(1u)); _group_0_binding_0_fs.data[1].value = 1; _group_0_binding_2_fs = ivec2(0, 0); _fs2p_location0 = vec4(0.0); return; } ================================================ FILE: lib/naga/tests/out/glsl/access.foo_vert.Vertex.glsl ================================================ #version 310 es precision highp float; precision highp int; struct GlobalConst { uint a; uvec3 b; int c; }; struct AlignedWrapper { int value; }; struct Baz { mat3x2 m; }; struct MatCx2InArray { mat4x2 am[2]; }; layout(std430) buffer Bar_block_0Vertex { mat4x3 _matrix; mat2x2 matrix_array[2]; int atom; uvec2 arr[2]; AlignedWrapper data[]; } _group_0_binding_0_vs; uniform Baz_block_1Vertex { Baz _group_0_binding_1_vs; }; layout(std430) buffer type_11_block_2Vertex { ivec2 _group_0_binding_2_vs; }; uniform MatCx2InArray_block_3Vertex { MatCx2InArray _group_0_binding_3_vs; }; void test_matrix_within_struct_accesses() { int idx = 1; Baz t = Baz(mat3x2(0.0)); int _e6 = idx; idx = (_e6 - 1); mat3x2 unnamed = _group_0_binding_1_vs.m; vec2 unnamed_1 = _group_0_binding_1_vs.m[0]; int _e16 = idx; vec2 unnamed_2 = _group_0_binding_1_vs.m[_e16]; float unnamed_3 = _group_0_binding_1_vs.m[0][1]; int _e28 = idx; float unnamed_4 = _group_0_binding_1_vs.m[0][_e28]; int _e32 = idx; float unnamed_5 = _group_0_binding_1_vs.m[_e32][1]; int _e38 = idx; int _e40 = idx; float unnamed_6 = _group_0_binding_1_vs.m[_e38][_e40]; t = Baz(mat3x2(vec2(1.0), vec2(2.0), vec2(3.0))); int _e52 = idx; idx = (_e52 + 1); t.m = mat3x2(vec2(6.0), vec2(5.0), vec2(4.0)); t.m[0] = vec2(9.0); int _e69 = idx; t.m[_e69] = vec2(90.0); t.m[0][1] = 10.0; int _e82 = idx; t.m[0][_e82] = 20.0; int _e86 = idx; t.m[_e86][1] = 30.0; int _e92 = idx; int _e94 = idx; t.m[_e92][_e94] = 40.0; return; } void test_matrix_within_array_within_struct_accesses() { int idx_1 = 1; MatCx2InArray t_1 = MatCx2InArray(mat4x2[2](mat4x2(0.0), mat4x2(0.0))); int _e7 = idx_1; idx_1 = (_e7 - 1); mat4x2 unnamed_7[2] = _group_0_binding_3_vs.am; mat4x2 unnamed_8 = _group_0_binding_3_vs.am[0]; vec2 unnamed_9 = _group_0_binding_3_vs.am[0][0]; int _e25 = idx_1; vec2 unnamed_10 = _group_0_binding_3_vs.am[0][_e25]; float unnamed_11 = _group_0_binding_3_vs.am[0][0][1]; int _e41 = idx_1; float unnamed_12 = _group_0_binding_3_vs.am[0][0][_e41]; int _e47 = idx_1; float unnamed_13 = _group_0_binding_3_vs.am[0][_e47][1]; int _e55 = idx_1; int _e57 = idx_1; float unnamed_14 = _group_0_binding_3_vs.am[0][_e55][_e57]; t_1 = MatCx2InArray(mat4x2[2](mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)))); int _e63 = idx_1; idx_1 = (_e63 + 1); t_1.am = mat4x2[2](mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0))); t_1.am[0] = mat4x2(vec2(8.0), vec2(7.0), vec2(6.0), vec2(5.0)); t_1.am[0][0] = vec2(9.0); int _e90 = idx_1; t_1.am[0][_e90] = vec2(90.0); t_1.am[0][0][1] = 10.0; int _e107 = idx_1; t_1.am[0][0][_e107] = 20.0; int _e113 = idx_1; t_1.am[0][_e113][1] = 30.0; int _e121 = idx_1; int _e123 = idx_1; t_1.am[0][_e121][_e123] = 40.0; return; } float read_from_private(inout float foo_1) { float _e6 = foo_1; return _e6; } float test_arr_as_arg(float a[5][10]) { return a[4][9]; } void assign_through_ptr_fn(inout uint p) { p = 42u; return; } void main() { uint vi = uint(gl_VertexID); float foo = 0.0; int c[5] = int[5](0, 0, 0, 0, 0); float baz_1 = foo; foo = 1.0; test_matrix_within_struct_accesses(); test_matrix_within_array_within_struct_accesses(); mat4x3 _matrix = _group_0_binding_0_vs._matrix; uvec2 arr[2] = _group_0_binding_0_vs.arr; float b = _group_0_binding_0_vs._matrix[3][0]; int a_1 = _group_0_binding_0_vs.data[(uint(_group_0_binding_0_vs.data.length()) - 2u)].value; ivec2 c_1 = _group_0_binding_2_vs; float _e32 = read_from_private(foo); c = int[5](a_1, int(b), 3, 4, 5); c[(vi + 1u)] = 42; int value = c[vi]; float _e46 = test_arr_as_arg(float[5][10](float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), float[10](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))); gl_Position = vec4((_matrix * vec4(ivec4(value))), 2.0); gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/bitcast.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void main() { ivec2 i2_ = ivec2(0); ivec3 i3_ = ivec3(0); ivec4 i4_ = ivec4(0); uvec2 u2_ = uvec2(0u); uvec3 u3_ = uvec3(0u); uvec4 u4_ = uvec4(0u); vec2 f2_ = vec2(0.0); vec3 f3_ = vec3(0.0); vec4 f4_ = vec4(0.0); i2_ = ivec2(0); i3_ = ivec3(0); i4_ = ivec4(0); u2_ = uvec2(0u); u3_ = uvec3(0u); u4_ = uvec4(0u); f2_ = vec2(0.0); f3_ = vec3(0.0); f4_ = vec4(0.0); ivec2 _e27 = i2_; u2_ = uvec2(_e27); ivec3 _e29 = i3_; u3_ = uvec3(_e29); ivec4 _e31 = i4_; u4_ = uvec4(_e31); uvec2 _e33 = u2_; i2_ = ivec2(_e33); uvec3 _e35 = u3_; i3_ = ivec3(_e35); uvec4 _e37 = u4_; i4_ = ivec4(_e37); ivec2 _e39 = i2_; f2_ = intBitsToFloat(_e39); ivec3 _e41 = i3_; f3_ = intBitsToFloat(_e41); ivec4 _e43 = i4_; f4_ = intBitsToFloat(_e43); return; } ================================================ FILE: lib/naga/tests/out/glsl/bits.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void main() { int i = 0; ivec2 i2_ = ivec2(0); ivec3 i3_ = ivec3(0); ivec4 i4_ = ivec4(0); uint u = 0u; uvec2 u2_ = uvec2(0u); uvec3 u3_ = uvec3(0u); uvec4 u4_ = uvec4(0u); vec2 f2_ = vec2(0.0); vec4 f4_ = vec4(0.0); i2_ = ivec2(0); i3_ = ivec3(0); i4_ = ivec4(0); u2_ = uvec2(0u); u3_ = uvec3(0u); u4_ = uvec4(0u); f2_ = vec2(0.0); f4_ = vec4(0.0); vec4 _e28 = f4_; u = packSnorm4x8(_e28); vec4 _e30 = f4_; u = packUnorm4x8(_e30); vec2 _e32 = f2_; u = packSnorm2x16(_e32); vec2 _e34 = f2_; u = packUnorm2x16(_e34); vec2 _e36 = f2_; u = packHalf2x16(_e36); uint _e38 = u; f4_ = unpackSnorm4x8(_e38); uint _e40 = u; f4_ = unpackUnorm4x8(_e40); uint _e42 = u; f2_ = unpackSnorm2x16(_e42); uint _e44 = u; f2_ = unpackUnorm2x16(_e44); uint _e46 = u; f2_ = unpackHalf2x16(_e46); int _e48 = i; int _e49 = i; i = bitfieldInsert(_e48, _e49, int(5u), int(10u)); ivec2 _e53 = i2_; ivec2 _e54 = i2_; i2_ = bitfieldInsert(_e53, _e54, int(5u), int(10u)); ivec3 _e58 = i3_; ivec3 _e59 = i3_; i3_ = bitfieldInsert(_e58, _e59, int(5u), int(10u)); ivec4 _e63 = i4_; ivec4 _e64 = i4_; i4_ = bitfieldInsert(_e63, _e64, int(5u), int(10u)); uint _e68 = u; uint _e69 = u; u = bitfieldInsert(_e68, _e69, int(5u), int(10u)); uvec2 _e73 = u2_; uvec2 _e74 = u2_; u2_ = bitfieldInsert(_e73, _e74, int(5u), int(10u)); uvec3 _e78 = u3_; uvec3 _e79 = u3_; u3_ = bitfieldInsert(_e78, _e79, int(5u), int(10u)); uvec4 _e83 = u4_; uvec4 _e84 = u4_; u4_ = bitfieldInsert(_e83, _e84, int(5u), int(10u)); int _e88 = i; i = bitfieldExtract(_e88, int(5u), int(10u)); ivec2 _e92 = i2_; i2_ = bitfieldExtract(_e92, int(5u), int(10u)); ivec3 _e96 = i3_; i3_ = bitfieldExtract(_e96, int(5u), int(10u)); ivec4 _e100 = i4_; i4_ = bitfieldExtract(_e100, int(5u), int(10u)); uint _e104 = u; u = bitfieldExtract(_e104, int(5u), int(10u)); uvec2 _e108 = u2_; u2_ = bitfieldExtract(_e108, int(5u), int(10u)); uvec3 _e112 = u3_; u3_ = bitfieldExtract(_e112, int(5u), int(10u)); uvec4 _e116 = u4_; u4_ = bitfieldExtract(_e116, int(5u), int(10u)); int _e120 = i; i = findLSB(_e120); uvec2 _e122 = u2_; u2_ = uvec2(findLSB(_e122)); ivec3 _e124 = i3_; i3_ = findMSB(_e124); uint _e126 = u; u = uint(findMSB(_e126)); int _e128 = i; i = bitCount(_e128); ivec2 _e130 = i2_; i2_ = bitCount(_e130); ivec3 _e132 = i3_; i3_ = bitCount(_e132); ivec4 _e134 = i4_; i4_ = bitCount(_e134); uint _e136 = u; u = uint(bitCount(_e136)); uvec2 _e138 = u2_; u2_ = uvec2(bitCount(_e138)); uvec3 _e140 = u3_; u3_ = uvec3(bitCount(_e140)); uvec4 _e142 = u4_; u4_ = uvec4(bitCount(_e142)); int _e144 = i; i = bitfieldReverse(_e144); ivec2 _e146 = i2_; i2_ = bitfieldReverse(_e146); ivec3 _e148 = i3_; i3_ = bitfieldReverse(_e148); ivec4 _e150 = i4_; i4_ = bitfieldReverse(_e150); uint _e152 = u; u = bitfieldReverse(_e152); uvec2 _e154 = u2_; u2_ = bitfieldReverse(_e154); uvec3 _e156 = u3_; u3_ = bitfieldReverse(_e156); uvec4 _e158 = u4_; u4_ = bitfieldReverse(_e158); return; } ================================================ FILE: lib/naga/tests/out/glsl/boids.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in; struct Particle { vec2 pos; vec2 vel; }; struct SimParams { float deltaT; float rule1Distance; float rule2Distance; float rule3Distance; float rule1Scale; float rule2Scale; float rule3Scale; }; uniform SimParams_block_0Compute { SimParams _group_0_binding_0_cs; }; layout(std430) readonly buffer Particles_block_1Compute { Particle particles[]; } _group_0_binding_1_cs; layout(std430) buffer Particles_block_2Compute { Particle particles[]; } _group_0_binding_2_cs; void main() { uvec3 global_invocation_id = gl_GlobalInvocationID; vec2 vPos = vec2(0.0); vec2 vVel = vec2(0.0); vec2 cMass = vec2(0.0); vec2 cVel = vec2(0.0); vec2 colVel = vec2(0.0); int cMassCount = 0; int cVelCount = 0; vec2 pos = vec2(0.0); vec2 vel = vec2(0.0); uint i = 0u; uint index = global_invocation_id.x; if ((index >= 1500u)) { return; } vec2 _e10 = _group_0_binding_1_cs.particles[index].pos; vPos = _e10; vec2 _e15 = _group_0_binding_1_cs.particles[index].vel; vVel = _e15; cMass = vec2(0.0, 0.0); cVel = vec2(0.0, 0.0); colVel = vec2(0.0, 0.0); bool loop_init = true; while(true) { if (!loop_init) { uint _e86 = i; i = (_e86 + 1u); } loop_init = false; uint _e37 = i; if ((_e37 >= 1500u)) { break; } uint _e39 = i; if ((_e39 == index)) { continue; } uint _e42 = i; vec2 _e45 = _group_0_binding_1_cs.particles[_e42].pos; pos = _e45; uint _e47 = i; vec2 _e50 = _group_0_binding_1_cs.particles[_e47].vel; vel = _e50; vec2 _e51 = pos; vec2 _e52 = vPos; float _e55 = _group_0_binding_0_cs.rule1Distance; if ((distance(_e51, _e52) < _e55)) { vec2 _e57 = cMass; vec2 _e58 = pos; cMass = (_e57 + _e58); int _e60 = cMassCount; cMassCount = (_e60 + 1); } vec2 _e63 = pos; vec2 _e64 = vPos; float _e67 = _group_0_binding_0_cs.rule2Distance; if ((distance(_e63, _e64) < _e67)) { vec2 _e69 = colVel; vec2 _e70 = pos; vec2 _e71 = vPos; colVel = (_e69 - (_e70 - _e71)); } vec2 _e74 = pos; vec2 _e75 = vPos; float _e78 = _group_0_binding_0_cs.rule3Distance; if ((distance(_e74, _e75) < _e78)) { vec2 _e80 = cVel; vec2 _e81 = vel; cVel = (_e80 + _e81); int _e83 = cVelCount; cVelCount = (_e83 + 1); } } int _e89 = cMassCount; if ((_e89 > 0)) { vec2 _e92 = cMass; int _e93 = cMassCount; vec2 _e97 = vPos; cMass = ((_e92 / vec2(float(_e93))) - _e97); } int _e99 = cVelCount; if ((_e99 > 0)) { vec2 _e102 = cVel; int _e103 = cVelCount; cVel = (_e102 / vec2(float(_e103))); } vec2 _e107 = vVel; vec2 _e108 = cMass; float _e110 = _group_0_binding_0_cs.rule1Scale; vec2 _e113 = colVel; float _e115 = _group_0_binding_0_cs.rule2Scale; vec2 _e118 = cVel; float _e120 = _group_0_binding_0_cs.rule3Scale; vVel = (((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120)); vec2 _e123 = vVel; vec2 _e125 = vVel; vVel = (normalize(_e123) * clamp(length(_e125), 0.0, 0.10000000149011612)); vec2 _e131 = vPos; vec2 _e132 = vVel; float _e134 = _group_0_binding_0_cs.deltaT; vPos = (_e131 + (_e132 * _e134)); float _e138 = vPos.x; if ((_e138 < -1.0)) { vPos.x = 1.0; } float _e144 = vPos.x; if ((_e144 > 1.0)) { vPos.x = -1.0; } float _e150 = vPos.y; if ((_e150 < -1.0)) { vPos.y = 1.0; } float _e156 = vPos.y; if ((_e156 > 1.0)) { vPos.y = -1.0; } vec2 _e164 = vPos; _group_0_binding_2_cs.particles[index].pos = _e164; vec2 _e168 = vVel; _group_0_binding_2_cs.particles[index].vel = _e168; return; } ================================================ FILE: lib/naga/tests/out/glsl/bounds-check-image-restrict.fragment_shader.Fragment.glsl ================================================ #version 430 core #extension GL_ARB_shader_texture_image_samples : require uniform highp sampler1D _group_0_binding_0_fs; uniform highp sampler2D _group_0_binding_1_fs; uniform highp sampler2DArray _group_0_binding_2_fs; uniform highp sampler3D _group_0_binding_3_fs; uniform highp sampler2DMS _group_0_binding_4_fs; layout(rgba8) writeonly uniform highp image1D _group_0_binding_8_fs; layout(rgba8) writeonly uniform highp image2D _group_0_binding_9_fs; layout(rgba8) writeonly uniform highp image2DArray _group_0_binding_10_fs; layout(rgba8) writeonly uniform highp image3D _group_0_binding_11_fs; layout(location = 0) out vec4 _fs2p_location0; vec4 test_textureLoad_1d(int coords, int level) { int _e3_clamped_lod = clamp(level, 0, textureQueryLevels(_group_0_binding_0_fs) - 1); vec4 _e3 = texelFetch(_group_0_binding_0_fs, clamp(coords, 0, textureSize(_group_0_binding_0_fs, _e3_clamped_lod) - 1), _e3_clamped_lod); return _e3; } vec4 test_textureLoad_2d(ivec2 coords_1, int level_1) { int _e4_clamped_lod = clamp(level_1, 0, textureQueryLevels(_group_0_binding_1_fs) - 1); vec4 _e4 = texelFetch(_group_0_binding_1_fs, clamp(coords_1, ivec2(0), textureSize(_group_0_binding_1_fs, _e4_clamped_lod) - ivec2(1)), _e4_clamped_lod); return _e4; } vec4 test_textureLoad_2d_array(ivec2 coords_2, int index, int level_2) { int _e6_clamped_lod = clamp(level_2, 0, textureQueryLevels(_group_0_binding_2_fs) - 1); vec4 _e6 = texelFetch(_group_0_binding_2_fs, clamp(ivec3(coords_2, index), ivec3(0), textureSize(_group_0_binding_2_fs, _e6_clamped_lod) - ivec3(1)), _e6_clamped_lod); return _e6; } vec4 test_textureLoad_3d(ivec3 coords_3, int level_3) { int _e6_clamped_lod = clamp(level_3, 0, textureQueryLevels(_group_0_binding_3_fs) - 1); vec4 _e6 = texelFetch(_group_0_binding_3_fs, clamp(coords_3, ivec3(0), textureSize(_group_0_binding_3_fs, _e6_clamped_lod) - ivec3(1)), _e6_clamped_lod); return _e6; } vec4 test_textureLoad_multisampled_2d(ivec2 coords_4, int _sample) { vec4 _e7 = texelFetch(_group_0_binding_4_fs, clamp(coords_4, ivec2(0), textureSize(_group_0_binding_4_fs) - ivec2(1)), clamp(_sample, 0, textureSamples(_group_0_binding_4_fs) - 1) ); return _e7; } void test_textureStore_1d(int coords_8, vec4 value) { imageStore(_group_0_binding_8_fs, coords_8, value); return; } void test_textureStore_2d(ivec2 coords_9, vec4 value_1) { imageStore(_group_0_binding_9_fs, coords_9, value_1); return; } void test_textureStore_2d_array(ivec2 coords_10, int array_index, vec4 value_2) { imageStore(_group_0_binding_10_fs, ivec3(coords_10, array_index), value_2); return; } void test_textureStore_3d(ivec3 coords_11, vec4 value_3) { imageStore(_group_0_binding_11_fs, coords_11, value_3); return; } void main() { vec4 _e14 = test_textureLoad_1d(0, 0); vec4 _e17 = test_textureLoad_2d(ivec2(0, 0), 0); vec4 _e21 = test_textureLoad_2d_array(ivec2(0, 0), 0, 0); vec4 _e24 = test_textureLoad_3d(ivec3(0, 0, 0), 0); vec4 _e27 = test_textureLoad_multisampled_2d(ivec2(0, 0), 0); test_textureStore_1d(0, vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_2d(ivec2(0, 0), vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_2d_array(ivec2(0, 0), 0, vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_3d(ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 0.0)); _fs2p_location0 = vec4(0.0, 0.0, 0.0, 0.0); return; } ================================================ FILE: lib/naga/tests/out/glsl/bounds-check-image-rzsw.fragment_shader.Fragment.glsl ================================================ #version 430 core #extension GL_ARB_shader_texture_image_samples : require uniform highp sampler1D _group_0_binding_0_fs; uniform highp sampler2D _group_0_binding_1_fs; uniform highp sampler2DArray _group_0_binding_2_fs; uniform highp sampler3D _group_0_binding_3_fs; uniform highp sampler2DMS _group_0_binding_4_fs; layout(rgba8) writeonly uniform highp image1D _group_0_binding_8_fs; layout(rgba8) writeonly uniform highp image2D _group_0_binding_9_fs; layout(rgba8) writeonly uniform highp image2DArray _group_0_binding_10_fs; layout(rgba8) writeonly uniform highp image3D _group_0_binding_11_fs; layout(location = 0) out vec4 _fs2p_location0; vec4 test_textureLoad_1d(int coords, int level) { vec4 _e3 = (level < textureQueryLevels(_group_0_binding_0_fs) && coords < textureSize(_group_0_binding_0_fs, level) ? texelFetch(_group_0_binding_0_fs, coords, level) : vec4(0.0)); return _e3; } vec4 test_textureLoad_2d(ivec2 coords_1, int level_1) { vec4 _e4 = (level_1 < textureQueryLevels(_group_0_binding_1_fs) && all(lessThan(coords_1, textureSize(_group_0_binding_1_fs, level_1))) ? texelFetch(_group_0_binding_1_fs, coords_1, level_1) : vec4(0.0)); return _e4; } vec4 test_textureLoad_2d_array(ivec2 coords_2, int index, int level_2) { vec4 _e6 = (level_2 < textureQueryLevels(_group_0_binding_2_fs) && all(lessThan(ivec3(coords_2, index), textureSize(_group_0_binding_2_fs, level_2))) ? texelFetch(_group_0_binding_2_fs, ivec3(coords_2, index), level_2) : vec4(0.0)); return _e6; } vec4 test_textureLoad_3d(ivec3 coords_3, int level_3) { vec4 _e6 = (level_3 < textureQueryLevels(_group_0_binding_3_fs) && all(lessThan(coords_3, textureSize(_group_0_binding_3_fs, level_3))) ? texelFetch(_group_0_binding_3_fs, coords_3, level_3) : vec4(0.0)); return _e6; } vec4 test_textureLoad_multisampled_2d(ivec2 coords_4, int _sample) { vec4 _e7 = (_sample < textureSamples(_group_0_binding_4_fs) && all(lessThan(coords_4, textureSize(_group_0_binding_4_fs))) ? texelFetch(_group_0_binding_4_fs, coords_4, _sample) : vec4(0.0)); return _e7; } void test_textureStore_1d(int coords_8, vec4 value) { imageStore(_group_0_binding_8_fs, coords_8, value); return; } void test_textureStore_2d(ivec2 coords_9, vec4 value_1) { imageStore(_group_0_binding_9_fs, coords_9, value_1); return; } void test_textureStore_2d_array(ivec2 coords_10, int array_index, vec4 value_2) { imageStore(_group_0_binding_10_fs, ivec3(coords_10, array_index), value_2); return; } void test_textureStore_3d(ivec3 coords_11, vec4 value_3) { imageStore(_group_0_binding_11_fs, coords_11, value_3); return; } void main() { vec4 _e14 = test_textureLoad_1d(0, 0); vec4 _e17 = test_textureLoad_2d(ivec2(0, 0), 0); vec4 _e21 = test_textureLoad_2d_array(ivec2(0, 0), 0, 0); vec4 _e24 = test_textureLoad_3d(ivec3(0, 0, 0), 0); vec4 _e27 = test_textureLoad_multisampled_2d(ivec2(0, 0), 0); test_textureStore_1d(0, vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_2d(ivec2(0, 0), vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_2d_array(ivec2(0, 0), 0, vec4(0.0, 0.0, 0.0, 0.0)); test_textureStore_3d(ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 0.0)); _fs2p_location0 = vec4(0.0, 0.0, 0.0, 0.0); return; } ================================================ FILE: lib/naga/tests/out/glsl/break-if.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void breakIfEmpty() { bool loop_init = true; while(true) { if (!loop_init) { if (true) { break; } } loop_init = false; } return; } void breakIfEmptyBody(bool a) { bool b = false; bool c = false; bool loop_init_1 = true; while(true) { if (!loop_init_1) { b = a; bool _e2 = b; c = (a != _e2); bool _e5 = c; bool unnamed = (a == _e5); if (unnamed) { break; } } loop_init_1 = false; } return; } void breakIf(bool a_1) { bool d = false; bool e = false; bool loop_init_2 = true; while(true) { if (!loop_init_2) { bool _e5 = e; bool unnamed_1 = (a_1 == _e5); if (unnamed_1) { break; } } loop_init_2 = false; d = a_1; bool _e2 = d; e = (a_1 != _e2); } return; } void main() { return; } ================================================ FILE: lib/naga/tests/out/glsl/control-flow.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void switch_default_break(int i) { switch(i) { default: break; } } void switch_case_break() { switch(0) { case 0: break; default: break; } return; } void loop_switch_continue(int x) { while(true) { switch(x) { case 1: continue; default: break; } } return; } void main() { uvec3 global_id = gl_GlobalInvocationID; int pos = 0; memoryBarrierBuffer(); barrier(); memoryBarrierShared(); barrier(); switch(1) { default: pos = 1; break; } int _e4 = pos; switch(_e4) { case 1: pos = 0; break; case 2: pos = 1; break; case 3: pos = 2; /* fallthrough */ case 4: pos = 3; /* fallthrough */ default: pos = 4; break; } switch(0u) { case 0u: break; default: break; } int _e11 = pos; switch(_e11) { case 1: pos = 0; break; case 2: pos = 1; return; case 3: pos = 2; /* fallthrough */ case 4: return; default: pos = 3; return; } } ================================================ FILE: lib/naga/tests/out/glsl/cubeArrayShadow.fragment.Fragment.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; uniform highp samplerCubeArrayShadow _group_0_binding_4_fs; layout(location = 0) out vec4 _fs2p_location0; void main() { vec3 frag_ls = vec4(1.0, 1.0, 2.0, 1.0).xyz; float a = texture(_group_0_binding_4_fs, vec4(frag_ls, int(1)), 1.0); _fs2p_location0 = vec4(a, 1.0, 1.0, 1.0); return; } ================================================ FILE: lib/naga/tests/out/glsl/empty.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void main() { return; } ================================================ FILE: lib/naga/tests/out/glsl/functions-webgl.main.Vertex.glsl ================================================ #version 300 es precision highp float; precision highp int; vec2 test_fma() { vec2 a = vec2(2.0, 2.0); vec2 b = vec2(0.5, 0.5); vec2 c = vec2(0.5, 0.5); return (a * b + c); } void main() { vec2 _e0 = test_fma(); return; } ================================================ FILE: lib/naga/tests/out/glsl/functions.main.Compute.glsl ================================================ #version 310 es #extension GL_EXT_gpu_shader5 : require precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; vec2 test_fma() { vec2 a = vec2(2.0, 2.0); vec2 b = vec2(0.5, 0.5); vec2 c = vec2(0.5, 0.5); return fma(a, b, c); } int test_integer_dot_product() { ivec2 a_2_ = ivec2(1); ivec2 b_2_ = ivec2(1); int c_2_ = ( + a_2_.x * b_2_.x + a_2_.y * b_2_.y); uvec3 a_3_ = uvec3(1u); uvec3 b_3_ = uvec3(1u); uint c_3_ = ( + a_3_.x * b_3_.x + a_3_.y * b_3_.y + a_3_.z * b_3_.z); ivec4 _e11 = ivec4(4); ivec4 _e13 = ivec4(2); int c_4_ = ( + _e11.x * _e13.x + _e11.y * _e13.y + _e11.z * _e13.z + _e11.w * _e13.w); return c_4_; } void main() { vec2 _e0 = test_fma(); int _e1 = test_integer_dot_product(); return; } ================================================ FILE: lib/naga/tests/out/glsl/globals.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; struct Foo { vec3 v3_; float v1_; }; shared float wg[10]; shared uint at_1; layout(std430) buffer Foo_block_0Compute { Foo _group_0_binding_1_cs; }; layout(std430) readonly buffer type_6_block_1Compute { vec2 _group_0_binding_2_cs[]; }; uniform type_8_block_2Compute { vec4 _group_0_binding_3_cs[20]; }; uniform type_4_block_3Compute { vec3 _group_0_binding_4_cs; }; uniform type_9_block_4Compute { mat3x2 _group_0_binding_5_cs; }; uniform type_12_block_5Compute { mat2x4 _group_0_binding_6_cs[2][2]; }; uniform type_15_block_6Compute { mat4x2 _group_0_binding_7_cs[2][2]; }; void test_msl_packed_vec3_as_arg(vec3 arg) { return; } void test_msl_packed_vec3_() { int idx = 1; _group_0_binding_1_cs.v3_ = vec3(1.0); _group_0_binding_1_cs.v3_.x = 1.0; _group_0_binding_1_cs.v3_.x = 2.0; int _e23 = idx; _group_0_binding_1_cs.v3_[_e23] = 3.0; Foo data = _group_0_binding_1_cs; vec3 unnamed = data.v3_; vec2 unnamed_1 = data.v3_.zx; test_msl_packed_vec3_as_arg(data.v3_); vec3 unnamed_2 = (data.v3_ * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); vec3 unnamed_3 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * data.v3_); vec3 unnamed_4 = (data.v3_ * 2.0); vec3 unnamed_5 = (2.0 * data.v3_); } void main() { float Foo_1 = 1.0; bool at = true; test_msl_packed_vec3_(); mat4x2 _e16 = _group_0_binding_7_cs[0][0]; vec4 _e23 = _group_0_binding_6_cs[0][0][0]; wg[7] = (_e16 * _e23).x; mat3x2 _e28 = _group_0_binding_5_cs; vec3 _e29 = _group_0_binding_4_cs; wg[6] = (_e28 * _e29).x; float _e37 = _group_0_binding_2_cs[1].y; wg[5] = _e37; float _e43 = _group_0_binding_3_cs[0].w; wg[4] = _e43; float _e47 = _group_0_binding_1_cs.v1_; wg[3] = _e47; float _e52 = _group_0_binding_1_cs.v3_.x; wg[2] = _e52; _group_0_binding_1_cs.v1_ = 4.0; wg[1] = float(uint(_group_0_binding_2_cs.length())); at_1 = 2u; return; } ================================================ FILE: lib/naga/tests/out/glsl/image.gather.Fragment.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; uniform highp sampler2D _group_0_binding_1_fs; uniform highp sampler2DShadow _group_1_binding_2_fs; layout(location = 0) out vec4 _fs2p_location0; void main() { vec2 tc = vec2(0.5); vec4 s2d = textureGather(_group_0_binding_1_fs, vec2(tc), 1); vec4 s2d_offset = textureGatherOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1), 3); vec4 s2d_depth = textureGather(_group_1_binding_2_fs, vec2(tc), 0.5); vec4 s2d_depth_offset = textureGatherOffset(_group_1_binding_2_fs, vec2(tc), 0.5, ivec2(3, 1)); _fs2p_location0 = (((s2d + s2d_offset) + s2d_depth) + s2d_depth_offset); return; } ================================================ FILE: lib/naga/tests/out/glsl/image.main.Compute.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; layout(local_size_x = 16, local_size_y = 1, local_size_z = 1) in; uniform highp usampler2D _group_0_binding_0_cs; uniform highp usampler2DMS _group_0_binding_3_cs; layout(rgba8ui) readonly uniform highp uimage2D _group_0_binding_1_cs; uniform highp usampler2DArray _group_0_binding_5_cs; uniform highp usampler2D _group_0_binding_7_cs; layout(r32ui) writeonly uniform highp uimage2D _group_0_binding_2_cs; void main() { uvec3 local_id = gl_LocalInvocationID; ivec2 dim = imageSize(_group_0_binding_1_cs).xy; ivec2 itc = ((dim * ivec2(local_id.xy)) % ivec2(10, 20)); uvec4 value1_ = texelFetch(_group_0_binding_0_cs, itc, int(local_id.z)); uvec4 value2_ = texelFetch(_group_0_binding_3_cs, itc, int(local_id.z)); uvec4 value4_ = imageLoad(_group_0_binding_1_cs, itc); uvec4 value5_ = texelFetch(_group_0_binding_5_cs, ivec3(itc, int(local_id.z)), (int(local_id.z) + 1)); uvec4 value6_ = texelFetch(_group_0_binding_7_cs, ivec2(int(local_id.x), 0), int(local_id.z)); imageStore(_group_0_binding_2_cs, ivec2(itc.x, 0), ((((value1_ + value2_) + value4_) + value5_) + value6_)); return; } ================================================ FILE: lib/naga/tests/out/glsl/image.queries.Vertex.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; uniform highp sampler2D _group_0_binding_0_vs; uniform highp sampler2D _group_0_binding_1_vs; uniform highp sampler2DArray _group_0_binding_2_vs; uniform highp samplerCube _group_0_binding_3_vs; uniform highp samplerCubeArray _group_0_binding_4_vs; uniform highp sampler3D _group_0_binding_5_vs; uniform highp sampler2DMS _group_0_binding_6_vs; void main() { int dim_1d = textureSize(_group_0_binding_0_vs, 0).x; int dim_1d_lod = textureSize(_group_0_binding_0_vs, int(dim_1d)).x; ivec2 dim_2d = textureSize(_group_0_binding_1_vs, 0).xy; ivec2 dim_2d_lod = textureSize(_group_0_binding_1_vs, 1).xy; ivec2 dim_2d_array = textureSize(_group_0_binding_2_vs, 0).xy; ivec2 dim_2d_array_lod = textureSize(_group_0_binding_2_vs, 1).xy; ivec2 dim_cube = textureSize(_group_0_binding_3_vs, 0).xy; ivec2 dim_cube_lod = textureSize(_group_0_binding_3_vs, 1).xy; ivec2 dim_cube_array = textureSize(_group_0_binding_4_vs, 0).xy; ivec2 dim_cube_array_lod = textureSize(_group_0_binding_4_vs, 1).xy; ivec3 dim_3d = textureSize(_group_0_binding_5_vs, 0).xyz; ivec3 dim_3d_lod = textureSize(_group_0_binding_5_vs, 1).xyz; ivec2 dim_2s_ms = textureSize(_group_0_binding_6_vs).xy; int sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z); gl_Position = vec4(float(sum)); gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/image.texture_sample.Fragment.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; uniform highp sampler2D _group_0_binding_0_fs; uniform highp sampler2D _group_0_binding_1_fs; layout(location = 0) out vec4 _fs2p_location0; void main() { vec2 tc = vec2(0.5); vec4 s1d = texture(_group_0_binding_0_fs, vec2(tc.x, 0.0)); vec4 s2d = texture(_group_0_binding_1_fs, vec2(tc)); vec4 s2d_offset = textureOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1)); vec4 s2d_level = textureLod(_group_0_binding_1_fs, vec2(tc), 2.299999952316284); vec4 s2d_level_offset = textureLodOffset(_group_0_binding_1_fs, vec2(tc), 2.299999952316284, ivec2(3, 1)); vec4 s2d_bias_offset = textureOffset(_group_0_binding_1_fs, vec2(tc), ivec2(3, 1), 2.0); _fs2p_location0 = ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset); return; } ================================================ FILE: lib/naga/tests/out/glsl/image.texture_sample_comparison.Fragment.glsl ================================================ #version 310 es #extension GL_EXT_texture_cube_map_array : require precision highp float; precision highp int; uniform highp sampler2DShadow _group_1_binding_2_fs; uniform highp samplerCubeShadow _group_1_binding_3_fs; layout(location = 0) out float _fs2p_location0; void main() { vec2 tc = vec2(0.5); float s2d_depth = texture(_group_1_binding_2_fs, vec3(tc, 0.5)); float s2d_depth_level = textureLod(_group_1_binding_2_fs, vec3(tc, 0.5), 0.0); float scube_depth_level = textureGrad(_group_1_binding_3_fs, vec4(vec3(0.5), 0.5), vec3(0.0), vec3(0.0)); _fs2p_location0 = (s2d_depth + s2d_depth_level); return; } ================================================ FILE: lib/naga/tests/out/glsl/interpolate.frag_main.Fragment.glsl ================================================ #version 400 core struct FragmentInput { vec4 position; uint _flat; float _linear; vec2 linear_centroid; vec3 linear_sample; vec4 perspective; float perspective_centroid; float perspective_sample; }; flat in uint _vs2fs_location0; noperspective in float _vs2fs_location1; noperspective centroid in vec2 _vs2fs_location2; noperspective sample in vec3 _vs2fs_location3; smooth in vec4 _vs2fs_location4; smooth centroid in float _vs2fs_location5; smooth sample in float _vs2fs_location6; void main() { FragmentInput val = FragmentInput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1, _vs2fs_location2, _vs2fs_location3, _vs2fs_location4, _vs2fs_location5, _vs2fs_location6); return; } ================================================ FILE: lib/naga/tests/out/glsl/interpolate.vert_main.Vertex.glsl ================================================ #version 400 core struct FragmentInput { vec4 position; uint _flat; float _linear; vec2 linear_centroid; vec3 linear_sample; vec4 perspective; float perspective_centroid; float perspective_sample; }; flat out uint _vs2fs_location0; noperspective out float _vs2fs_location1; noperspective centroid out vec2 _vs2fs_location2; noperspective sample out vec3 _vs2fs_location3; smooth out vec4 _vs2fs_location4; smooth centroid out float _vs2fs_location5; smooth sample out float _vs2fs_location6; void main() { FragmentInput out_ = FragmentInput(vec4(0.0), 0u, 0.0, vec2(0.0), vec3(0.0), vec4(0.0), 0.0, 0.0); out_.position = vec4(2.0, 4.0, 5.0, 6.0); out_._flat = 8u; out_._linear = 27.0; out_.linear_centroid = vec2(64.0, 125.0); out_.linear_sample = vec3(216.0, 343.0, 512.0); out_.perspective = vec4(729.0, 1000.0, 1331.0, 1728.0); out_.perspective_centroid = 2197.0; out_.perspective_sample = 2744.0; FragmentInput _e30 = out_; gl_Position = _e30.position; _vs2fs_location0 = _e30._flat; _vs2fs_location1 = _e30._linear; _vs2fs_location2 = _e30.linear_centroid; _vs2fs_location3 = _e30.linear_sample; _vs2fs_location4 = _e30.perspective; _vs2fs_location5 = _e30.perspective_centroid; _vs2fs_location6 = _e30.perspective_sample; return; } ================================================ FILE: lib/naga/tests/out/glsl/math-functions.main.Vertex.glsl ================================================ #version 310 es precision highp float; precision highp int; void main() { vec4 v = vec4(0.0); float a = degrees(1.0); float b = radians(1.0); vec4 c = degrees(v); vec4 d = radians(v); vec4 e = clamp(v, vec4(0.0), vec4(1.0)); int const_dot = ( + ivec2(0, 0).x * ivec2(0, 0).x + ivec2(0, 0).y * ivec2(0, 0).y); uint first_leading_bit_abs = uint(findMSB(uint(abs(int(0u))))); } ================================================ FILE: lib/naga/tests/out/glsl/multiview.main.Vertex.glsl ================================================ #version 310 es #extension GL_EXT_multiview : require precision highp float; precision highp int; void main() { int view_index = gl_ViewIndex; gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/multiview_webgl.main.Vertex.glsl ================================================ #version 300 es #extension GL_OVR_multiview2 : require precision highp float; precision highp int; layout(num_views = 2) in; void main() { int view_index = int(gl_ViewID_OVR); return; } ================================================ FILE: lib/naga/tests/out/glsl/operators.main.Compute.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; struct Foo { vec4 a; int b; }; vec4 builtins() { int s1_ = (true ? 1 : 0); vec4 s2_ = (true ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 0.0)); vec4 s3_ = mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 0.0), bvec4(false, false, false, false)); vec4 m1_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), vec4(0.5, 0.5, 0.5, 0.5)); vec4 m2_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), 0.10000000149011612); float b1_ = intBitsToFloat(ivec4(1, 1, 1, 1).x); vec4 b2_ = intBitsToFloat(ivec4(1, 1, 1, 1)); ivec4 v_i32_zero = ivec4(vec4(0.0, 0.0, 0.0, 0.0)); return (((((vec4((ivec4(s1_) + v_i32_zero)) + s2_) + m1_) + m2_) + vec4(b1_)) + b2_); } vec4 splat() { vec2 a_2 = (((vec2(1.0) + vec2(2.0)) - vec2(3.0)) / vec2(4.0)); ivec4 b = (ivec4(5) % ivec4(2)); return (a_2.xyxy + vec4(b)); } vec2 splat_assignment() { vec2 a = vec2(0.0); a = vec2(2.0); vec2 _e7 = a; a = (_e7 + vec2(1.0)); vec2 _e11 = a; a = (_e11 - vec2(3.0)); vec2 _e15 = a; a = (_e15 / vec2(4.0)); vec2 _e19 = a; return _e19; } vec3 bool_cast(vec3 x) { bvec3 y = bvec3(x); return vec3(y); } float constructors() { Foo foo = Foo(vec4(0.0), 0); foo = Foo(vec4(1.0), 1); mat2x2 mat2comp = mat2x2(vec2(1.0, 0.0), vec2(0.0, 1.0)); mat4x4 mat4comp = mat4x4(vec4(1.0, 0.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); uvec2 unnamed = uvec2(0u); mat2x2 unnamed_1 = mat2x2(vec2(0.0), vec2(0.0)); int unnamed_2[4] = int[4](0, 1, 2, 3); bool unnamed_3 = bool(false); int unnamed_4 = int(0); uint unnamed_5 = uint(0u); float unnamed_6 = float(0.0); uvec2 unnamed_7 = uvec2(uvec2(0u, 0u)); mat2x3 unnamed_8 = mat2x3(mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); uvec2 unnamed_9 = uvec2(0u, 0u); mat2x3 unnamed_10 = mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)); float _e75 = foo.a.x; return _e75; } void logical() { bool unnamed_11 = (!true); bvec2 unnamed_12 = not(bvec2(true)); bool unnamed_13 = (true || false); bool unnamed_14 = (true && false); bool unnamed_15 = (true || false); bvec3 unnamed_16 = bvec3(bvec3(true).x || bvec3(false).x, bvec3(true).y || bvec3(false).y, bvec3(true).z || bvec3(false).z); bool unnamed_17 = (true && false); bvec4 unnamed_18 = bvec4(bvec4(true).x && bvec4(false).x, bvec4(true).y && bvec4(false).y, bvec4(true).z && bvec4(false).z, bvec4(true).w && bvec4(false).w); } void arithmetic() { ivec2 unnamed_19 = (-ivec2(1)); vec2 unnamed_20 = (-vec2(1.0)); int unnamed_21 = (2 + 1); uint unnamed_22 = (2u + 1u); float unnamed_23 = (2.0 + 1.0); ivec2 unnamed_24 = (ivec2(2) + ivec2(1)); uvec3 unnamed_25 = (uvec3(2u) + uvec3(1u)); vec4 unnamed_26 = (vec4(2.0) + vec4(1.0)); int unnamed_27 = (2 - 1); uint unnamed_28 = (2u - 1u); float unnamed_29 = (2.0 - 1.0); ivec2 unnamed_30 = (ivec2(2) - ivec2(1)); uvec3 unnamed_31 = (uvec3(2u) - uvec3(1u)); vec4 unnamed_32 = (vec4(2.0) - vec4(1.0)); int unnamed_33 = (2 * 1); uint unnamed_34 = (2u * 1u); float unnamed_35 = (2.0 * 1.0); ivec2 unnamed_36 = (ivec2(2) * ivec2(1)); uvec3 unnamed_37 = (uvec3(2u) * uvec3(1u)); vec4 unnamed_38 = (vec4(2.0) * vec4(1.0)); int unnamed_39 = (2 / 1); uint unnamed_40 = (2u / 1u); float unnamed_41 = (2.0 / 1.0); ivec2 unnamed_42 = (ivec2(2) / ivec2(1)); uvec3 unnamed_43 = (uvec3(2u) / uvec3(1u)); vec4 unnamed_44 = (vec4(2.0) / vec4(1.0)); int unnamed_45 = (2 % 1); uint unnamed_46 = (2u % 1u); float unnamed_47 = (2.0 - 1.0 * trunc(2.0 / 1.0)); ivec2 unnamed_48 = (ivec2(2) % ivec2(1)); uvec3 unnamed_49 = (uvec3(2u) % uvec3(1u)); vec4 unnamed_50 = (vec4(2.0) - vec4(1.0) * trunc(vec4(2.0) / vec4(1.0))); ivec2 unnamed_51 = (ivec2(2) + ivec2(1)); ivec2 unnamed_52 = (ivec2(2) + ivec2(1)); uvec2 unnamed_53 = (uvec2(2u) + uvec2(1u)); uvec2 unnamed_54 = (uvec2(2u) + uvec2(1u)); vec2 unnamed_55 = (vec2(2.0) + vec2(1.0)); vec2 unnamed_56 = (vec2(2.0) + vec2(1.0)); ivec2 unnamed_57 = (ivec2(2) - ivec2(1)); ivec2 unnamed_58 = (ivec2(2) - ivec2(1)); uvec2 unnamed_59 = (uvec2(2u) - uvec2(1u)); uvec2 unnamed_60 = (uvec2(2u) - uvec2(1u)); vec2 unnamed_61 = (vec2(2.0) - vec2(1.0)); vec2 unnamed_62 = (vec2(2.0) - vec2(1.0)); ivec2 unnamed_63 = (ivec2(2) * 1); ivec2 unnamed_64 = (2 * ivec2(1)); uvec2 unnamed_65 = (uvec2(2u) * 1u); uvec2 unnamed_66 = (2u * uvec2(1u)); vec2 unnamed_67 = (vec2(2.0) * 1.0); vec2 unnamed_68 = (2.0 * vec2(1.0)); ivec2 unnamed_69 = (ivec2(2) / ivec2(1)); ivec2 unnamed_70 = (ivec2(2) / ivec2(1)); uvec2 unnamed_71 = (uvec2(2u) / uvec2(1u)); uvec2 unnamed_72 = (uvec2(2u) / uvec2(1u)); vec2 unnamed_73 = (vec2(2.0) / vec2(1.0)); vec2 unnamed_74 = (vec2(2.0) / vec2(1.0)); ivec2 unnamed_75 = (ivec2(2) % ivec2(1)); ivec2 unnamed_76 = (ivec2(2) % ivec2(1)); uvec2 unnamed_77 = (uvec2(2u) % uvec2(1u)); uvec2 unnamed_78 = (uvec2(2u) % uvec2(1u)); vec2 unnamed_79 = (vec2(2.0) - vec2(1.0) * trunc(vec2(2.0) / vec2(1.0))); vec2 unnamed_80 = (vec2(2.0) - vec2(1.0) * trunc(vec2(2.0) / vec2(1.0))); mat3x3 unnamed_81 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) + mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); mat3x3 unnamed_82 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) - mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); mat3x3 unnamed_83 = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * 1.0); mat3x3 unnamed_84 = (2.0 * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); vec3 unnamed_85 = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * vec4(1.0)); vec4 unnamed_86 = (vec3(2.0) * mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); mat3x3 unnamed_87 = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * mat3x4(vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0))); } void bit() { int unnamed_88 = (~1); uint unnamed_89 = (~1u); ivec2 unnamed_90 = (~ivec2(1)); uvec3 unnamed_91 = (~uvec3(1u)); int unnamed_92 = (2 | 1); uint unnamed_93 = (2u | 1u); ivec2 unnamed_94 = (ivec2(2) | ivec2(1)); uvec3 unnamed_95 = (uvec3(2u) | uvec3(1u)); int unnamed_96 = (2 & 1); uint unnamed_97 = (2u & 1u); ivec2 unnamed_98 = (ivec2(2) & ivec2(1)); uvec3 unnamed_99 = (uvec3(2u) & uvec3(1u)); int unnamed_100 = (2 ^ 1); uint unnamed_101 = (2u ^ 1u); ivec2 unnamed_102 = (ivec2(2) ^ ivec2(1)); uvec3 unnamed_103 = (uvec3(2u) ^ uvec3(1u)); int unnamed_104 = (2 << 1u); uint unnamed_105 = (2u << 1u); ivec2 unnamed_106 = (ivec2(2) << uvec2(1u)); uvec3 unnamed_107 = (uvec3(2u) << uvec3(1u)); int unnamed_108 = (2 >> 1u); uint unnamed_109 = (2u >> 1u); ivec2 unnamed_110 = (ivec2(2) >> uvec2(1u)); uvec3 unnamed_111 = (uvec3(2u) >> uvec3(1u)); } void comparison() { bool unnamed_112 = (2 == 1); bool unnamed_113 = (2u == 1u); bool unnamed_114 = (2.0 == 1.0); bvec2 unnamed_115 = equal(ivec2(2), ivec2(1)); bvec3 unnamed_116 = equal(uvec3(2u), uvec3(1u)); bvec4 unnamed_117 = equal(vec4(2.0), vec4(1.0)); bool unnamed_118 = (2 != 1); bool unnamed_119 = (2u != 1u); bool unnamed_120 = (2.0 != 1.0); bvec2 unnamed_121 = notEqual(ivec2(2), ivec2(1)); bvec3 unnamed_122 = notEqual(uvec3(2u), uvec3(1u)); bvec4 unnamed_123 = notEqual(vec4(2.0), vec4(1.0)); bool unnamed_124 = (2 < 1); bool unnamed_125 = (2u < 1u); bool unnamed_126 = (2.0 < 1.0); bvec2 unnamed_127 = lessThan(ivec2(2), ivec2(1)); bvec3 unnamed_128 = lessThan(uvec3(2u), uvec3(1u)); bvec4 unnamed_129 = lessThan(vec4(2.0), vec4(1.0)); bool unnamed_130 = (2 <= 1); bool unnamed_131 = (2u <= 1u); bool unnamed_132 = (2.0 <= 1.0); bvec2 unnamed_133 = lessThanEqual(ivec2(2), ivec2(1)); bvec3 unnamed_134 = lessThanEqual(uvec3(2u), uvec3(1u)); bvec4 unnamed_135 = lessThanEqual(vec4(2.0), vec4(1.0)); bool unnamed_136 = (2 > 1); bool unnamed_137 = (2u > 1u); bool unnamed_138 = (2.0 > 1.0); bvec2 unnamed_139 = greaterThan(ivec2(2), ivec2(1)); bvec3 unnamed_140 = greaterThan(uvec3(2u), uvec3(1u)); bvec4 unnamed_141 = greaterThan(vec4(2.0), vec4(1.0)); bool unnamed_142 = (2 >= 1); bool unnamed_143 = (2u >= 1u); bool unnamed_144 = (2.0 >= 1.0); bvec2 unnamed_145 = greaterThanEqual(ivec2(2), ivec2(1)); bvec3 unnamed_146 = greaterThanEqual(uvec3(2u), uvec3(1u)); bvec4 unnamed_147 = greaterThanEqual(vec4(2.0), vec4(1.0)); } void assignment() { int a_1 = 1; ivec3 vec0_ = ivec3(0, 0, 0); int _e6 = a_1; a_1 = (_e6 + 1); int _e9 = a_1; a_1 = (_e9 - 1); int _e12 = a_1; int _e13 = a_1; a_1 = (_e12 * _e13); int _e15 = a_1; int _e16 = a_1; a_1 = (_e15 / _e16); int _e18 = a_1; a_1 = (_e18 % 1); int _e21 = a_1; a_1 = (_e21 & 0); int _e24 = a_1; a_1 = (_e24 | 0); int _e27 = a_1; a_1 = (_e27 ^ 0); int _e30 = a_1; a_1 = (_e30 << 2u); int _e33 = a_1; a_1 = (_e33 >> 1u); int _e36 = a_1; a_1 = (_e36 + 1); int _e39 = a_1; a_1 = (_e39 - 1); int _e46 = vec0_.y; vec0_.y = (_e46 + 1); int _e51 = vec0_.y; vec0_.y = (_e51 - 1); return; } void main() { vec4 _e4 = builtins(); vec4 _e5 = splat(); vec3 _e7 = bool_cast(vec4(1.0, 1.0, 1.0, 1.0).xyz); float _e8 = constructors(); logical(); arithmetic(); bit(); comparison(); assignment(); return; } ================================================ FILE: lib/naga/tests/out/glsl/padding.vertex.Vertex.glsl ================================================ #version 310 es precision highp float; precision highp int; struct S { vec3 a; }; struct Test { S a; float b; }; struct Test2_ { vec3 a[2]; float b; }; struct Test3_ { mat4x3 a; float b; }; uniform Test_block_0Vertex { Test _group_0_binding_0_vs; }; uniform Test2__block_1Vertex { Test2_ _group_0_binding_1_vs; }; uniform Test3__block_2Vertex { Test3_ _group_0_binding_2_vs; }; void main() { float _e6 = _group_0_binding_0_vs.b; float _e9 = _group_0_binding_1_vs.b; float _e12 = _group_0_binding_2_vs.b; gl_Position = (((vec4(1.0) * _e6) * _e9) * _e12); gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/push-constants.main.Fragment.glsl ================================================ #version 320 es precision highp float; precision highp int; struct PushConstants { float multiplier; }; struct FragmentIn { vec4 color; }; uniform PushConstants pc; layout(location = 0) smooth in vec4 _vs2fs_location0; layout(location = 0) out vec4 _fs2p_location0; void main() { FragmentIn in_ = FragmentIn(_vs2fs_location0); float _e4 = pc.multiplier; _fs2p_location0 = (in_.color * _e4); return; } ================================================ FILE: lib/naga/tests/out/glsl/push-constants.vert_main.Vertex.glsl ================================================ #version 320 es precision highp float; precision highp int; struct PushConstants { float multiplier; }; struct FragmentIn { vec4 color; }; uniform PushConstants pc; layout(location = 0) in vec2 _p2vs_location0; void main() { vec2 pos = _p2vs_location0; uint vi = uint(gl_VertexID); float _e5 = pc.multiplier; gl_Position = vec4(((float(vi) * _e5) * pos), 0.0, 1.0); return; } ================================================ FILE: lib/naga/tests/out/glsl/quad-vert.main.Vertex.glsl ================================================ #version 310 es precision highp float; precision highp int; struct gen_gl_PerVertex { vec4 gen_gl_Position; float gen_gl_PointSize; float gen_gl_ClipDistance[1]; float gen_gl_CullDistance[1]; }; struct type_9 { vec2 member; vec4 gen_gl_Position; }; vec2 v_uv = vec2(0.0); vec2 a_uv_1 = vec2(0.0); gen_gl_PerVertex perVertexStruct = gen_gl_PerVertex(vec4(0.0, 0.0, 0.0, 1.0), 1.0, float[1](0.0), float[1](0.0)); vec2 a_pos_1 = vec2(0.0); layout(location = 1) in vec2 _p2vs_location1; layout(location = 0) in vec2 _p2vs_location0; layout(location = 0) smooth out vec2 _vs2fs_location0; void main_1() { vec2 _e12 = a_uv_1; v_uv = _e12; vec2 _e13 = a_pos_1; perVertexStruct.gen_gl_Position = vec4(_e13.x, _e13.y, 0.0, 1.0); return; } void main() { vec2 a_uv = _p2vs_location1; vec2 a_pos = _p2vs_location0; a_uv_1 = a_uv; a_pos_1 = a_pos; main_1(); vec2 _e7 = v_uv; vec4 _e8 = perVertexStruct.gen_gl_Position; type_9 _tmp_return = type_9(_e7, _e8); _vs2fs_location0 = _tmp_return.member; gl_Position = _tmp_return.gen_gl_Position; gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/quad.frag_main.Fragment.glsl ================================================ #version 300 es precision highp float; precision highp int; struct VertexOutput { vec2 uv; vec4 position; }; uniform highp sampler2D _group_0_binding_0_fs; smooth in vec2 _vs2fs_location0; layout(location = 0) out vec4 _fs2p_location0; void main() { vec2 uv_1 = _vs2fs_location0; vec4 color = texture(_group_0_binding_0_fs, vec2(uv_1)); if ((color.w == 0.0)) { discard; } vec4 premultiplied = (color.w * color); _fs2p_location0 = premultiplied; return; } ================================================ FILE: lib/naga/tests/out/glsl/quad.fs_extra.Fragment.glsl ================================================ #version 300 es precision highp float; precision highp int; struct VertexOutput { vec2 uv; vec4 position; }; layout(location = 0) out vec4 _fs2p_location0; void main() { _fs2p_location0 = vec4(0.0, 0.5, 0.0, 0.5); return; } ================================================ FILE: lib/naga/tests/out/glsl/quad.main.Fragment.glsl ================================================ #version 300 es precision highp float; precision highp int; struct VertexOutput { vec2 uv; vec4 position; }; uniform highp sampler2D _group_0_binding_0; smooth in vec2 _vs2fs_location0; layout(location = 0) out vec4 _fs2p_location0; void main() { vec2 uv_1 = _vs2fs_location0; vec4 color = texture(_group_0_binding_0, vec2(uv_1)); if ((color.w == 0.0)) { discard; } vec4 premultiplied = (color.w * color); _fs2p_location0 = premultiplied; return; } ================================================ FILE: lib/naga/tests/out/glsl/quad.main.Vertex.glsl ================================================ #version 300 es precision highp float; precision highp int; struct VertexOutput { vec2 uv; vec4 position; }; layout(location = 0) in vec2 _p2vs_location0; layout(location = 1) in vec2 _p2vs_location1; smooth out vec2 _vs2fs_location0; void main() { vec2 pos = _p2vs_location0; vec2 uv = _p2vs_location1; VertexOutput _tmp_return = VertexOutput(uv, vec4((1.2000000476837158 * pos), 0.0, 1.0)); _vs2fs_location0 = _tmp_return.uv; gl_Position = _tmp_return.position; return; } ================================================ FILE: lib/naga/tests/out/glsl/quad.vert_main.Vertex.glsl ================================================ #version 300 es precision highp float; precision highp int; struct VertexOutput { vec2 uv; vec4 position; }; layout(location = 0) in vec2 _p2vs_location0; layout(location = 1) in vec2 _p2vs_location1; smooth out vec2 _vs2fs_location0; void main() { vec2 pos = _p2vs_location0; vec2 uv = _p2vs_location1; VertexOutput _tmp_return = VertexOutput(uv, vec4((1.2000000476837158 * pos), 0.0, 1.0)); _vs2fs_location0 = _tmp_return.uv; gl_Position = _tmp_return.position; return; } ================================================ FILE: lib/naga/tests/out/glsl/shadow.fs_main.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; struct Globals { mat4x4 view_proj; uvec4 num_lights; }; struct Entity { mat4x4 world; vec4 color; }; struct VertexOutput { vec4 proj_position; vec3 world_normal; vec4 world_position; }; struct Light { mat4x4 proj; vec4 pos; vec4 color; }; uniform Globals_block_0Fragment { Globals _group_0_binding_0_fs; }; uniform Entity_block_1Fragment { Entity _group_1_binding_0_fs; }; layout(std430) readonly buffer type_6_block_2Fragment { Light _group_0_binding_1_fs[]; }; uniform highp sampler2DArrayShadow _group_0_binding_2_fs; layout(location = 0) smooth in vec3 _vs2fs_location0; layout(location = 1) smooth in vec4 _vs2fs_location1; layout(location = 0) out vec4 _fs2p_location0; float fetch_shadow(uint light_id, vec4 homogeneous_coords) { if ((homogeneous_coords.w <= 0.0)) { return 1.0; } vec2 flip_correction = vec2(0.5, -0.5); float proj_correction = (1.0 / homogeneous_coords.w); vec2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2(0.5, 0.5)); float _e28 = textureGrad(_group_0_binding_2_fs, vec4(light_local, int(light_id), (homogeneous_coords.z * proj_correction)), vec2(0.0), vec2(0.0)); return _e28; } void main() { VertexOutput in_ = VertexOutput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1); vec3 color = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); uint i = 0u; vec3 normal_1 = normalize(in_.world_normal); bool loop_init = true; while(true) { if (!loop_init) { uint _e20 = i; i = (_e20 + 1u); } loop_init = false; uint _e14 = i; uint _e17 = _group_0_binding_0_fs.num_lights.x; if ((_e14 < min(_e17, 10u))) { } else { break; } uint _e23 = i; Light light = _group_0_binding_1_fs[_e23]; uint _e26 = i; float _e30 = fetch_shadow(_e26, (light.proj * in_.world_position)); vec3 light_dir = normalize((light.pos.xyz - in_.world_position.xyz)); float diffuse = max(0.0, dot(normal_1, light_dir)); vec3 _e40 = color; color = (_e40 + ((_e30 * diffuse) * light.color.xyz)); } vec3 _e46 = color; vec4 _e50 = _group_1_binding_0_fs.color; _fs2p_location0 = (vec4(_e46, 1.0) * _e50); return; } ================================================ FILE: lib/naga/tests/out/glsl/shadow.fs_main_without_storage.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; struct Globals { mat4x4 view_proj; uvec4 num_lights; }; struct Entity { mat4x4 world; vec4 color; }; struct VertexOutput { vec4 proj_position; vec3 world_normal; vec4 world_position; }; struct Light { mat4x4 proj; vec4 pos; vec4 color; }; uniform Globals_block_0Fragment { Globals _group_0_binding_0_fs; }; uniform Entity_block_1Fragment { Entity _group_1_binding_0_fs; }; uniform type_7_block_2Fragment { Light _group_0_binding_1_fs[10]; }; uniform highp sampler2DArrayShadow _group_0_binding_2_fs; layout(location = 0) smooth in vec3 _vs2fs_location0; layout(location = 1) smooth in vec4 _vs2fs_location1; layout(location = 0) out vec4 _fs2p_location0; float fetch_shadow(uint light_id, vec4 homogeneous_coords) { if ((homogeneous_coords.w <= 0.0)) { return 1.0; } vec2 flip_correction = vec2(0.5, -0.5); float proj_correction = (1.0 / homogeneous_coords.w); vec2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2(0.5, 0.5)); float _e28 = textureGrad(_group_0_binding_2_fs, vec4(light_local, int(light_id), (homogeneous_coords.z * proj_correction)), vec2(0.0), vec2(0.0)); return _e28; } void main() { VertexOutput in_1 = VertexOutput(gl_FragCoord, _vs2fs_location0, _vs2fs_location1); vec3 color_1 = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); uint i_1 = 0u; vec3 normal_1 = normalize(in_1.world_normal); bool loop_init = true; while(true) { if (!loop_init) { uint _e20 = i_1; i_1 = (_e20 + 1u); } loop_init = false; uint _e14 = i_1; uint _e17 = _group_0_binding_0_fs.num_lights.x; if ((_e14 < min(_e17, 10u))) { } else { break; } uint _e23 = i_1; Light light = _group_0_binding_1_fs[_e23]; uint _e26 = i_1; float _e30 = fetch_shadow(_e26, (light.proj * in_1.world_position)); vec3 light_dir = normalize((light.pos.xyz - in_1.world_position.xyz)); float diffuse = max(0.0, dot(normal_1, light_dir)); vec3 _e40 = color_1; color_1 = (_e40 + ((_e30 * diffuse) * light.color.xyz)); } vec3 _e46 = color_1; vec4 _e50 = _group_1_binding_0_fs.color; _fs2p_location0 = (vec4(_e46, 1.0) * _e50); return; } ================================================ FILE: lib/naga/tests/out/glsl/shadow.vs_main.Vertex.glsl ================================================ #version 310 es precision highp float; precision highp int; struct Globals { mat4x4 view_proj; uvec4 num_lights; }; struct Entity { mat4x4 world; vec4 color; }; struct VertexOutput { vec4 proj_position; vec3 world_normal; vec4 world_position; }; struct Light { mat4x4 proj; vec4 pos; vec4 color; }; uniform Globals_block_0Vertex { Globals _group_0_binding_0_vs; }; uniform Entity_block_1Vertex { Entity _group_1_binding_0_vs; }; layout(location = 0) in ivec4 _p2vs_location0; layout(location = 1) in ivec4 _p2vs_location1; layout(location = 0) smooth out vec3 _vs2fs_location0; layout(location = 1) smooth out vec4 _vs2fs_location1; void main() { ivec4 position = _p2vs_location0; ivec4 normal = _p2vs_location1; VertexOutput out_ = VertexOutput(vec4(0.0), vec3(0.0), vec4(0.0)); mat4x4 w = _group_1_binding_0_vs.world; mat4x4 _e7 = _group_1_binding_0_vs.world; vec4 world_pos = (_e7 * vec4(position)); out_.world_normal = (mat3x3(w[0].xyz, w[1].xyz, w[2].xyz) * vec3(normal.xyz)); out_.world_position = world_pos; mat4x4 _e25 = _group_0_binding_0_vs.view_proj; out_.proj_position = (_e25 * world_pos); VertexOutput _e27 = out_; gl_Position = _e27.proj_position; _vs2fs_location0 = _e27.world_normal; _vs2fs_location1 = _e27.world_position; gl_Position.yz = vec2(-gl_Position.y, gl_Position.z * 2.0 - gl_Position.w); return; } ================================================ FILE: lib/naga/tests/out/glsl/skybox.fs_main.Fragment.glsl ================================================ #version 320 es precision highp float; precision highp int; struct VertexOutput { vec4 position; vec3 uv; }; struct Data { mat4x4 proj_inv; mat4x4 view; }; layout(binding = 0) uniform highp samplerCube _group_0_binding_1_fs; layout(location = 0) smooth in vec3 _vs2fs_location0; layout(location = 0) out vec4 _fs2p_location0; void main() { VertexOutput in_ = VertexOutput(gl_FragCoord, _vs2fs_location0); vec4 _e5 = texture(_group_0_binding_1_fs, vec3(in_.uv)); _fs2p_location0 = _e5; return; } ================================================ FILE: lib/naga/tests/out/glsl/skybox.vs_main.Vertex.glsl ================================================ #version 320 es precision highp float; precision highp int; struct VertexOutput { vec4 position; vec3 uv; }; struct Data { mat4x4 proj_inv; mat4x4 view; }; layout(std140, binding = 0) uniform Data_block_0Vertex { Data _group_0_binding_0_vs; }; layout(location = 0) smooth out vec3 _vs2fs_location0; void main() { uint vertex_index = uint(gl_VertexID); int tmp1_ = 0; int tmp2_ = 0; tmp1_ = (int(vertex_index) / 2); tmp2_ = (int(vertex_index) & 1); int _e10 = tmp1_; int _e16 = tmp2_; vec4 pos = vec4(((float(_e10) * 4.0) - 1.0), ((float(_e16) * 4.0) - 1.0), 0.0, 1.0); vec4 _e27 = _group_0_binding_0_vs.view[0]; vec4 _e31 = _group_0_binding_0_vs.view[1]; vec4 _e35 = _group_0_binding_0_vs.view[2]; mat3x3 inv_model_view = transpose(mat3x3(_e27.xyz, _e31.xyz, _e35.xyz)); mat4x4 _e40 = _group_0_binding_0_vs.proj_inv; vec4 unprojected = (_e40 * pos); VertexOutput _tmp_return = VertexOutput(pos, (inv_model_view * unprojected.xyz)); gl_Position = _tmp_return.position; _vs2fs_location0 = _tmp_return.uv; return; } ================================================ FILE: lib/naga/tests/out/glsl/standard.derivatives.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; layout(location = 0) out vec4 _fs2p_location0; void main() { vec4 foo = gl_FragCoord; vec4 x = dFdx(foo); vec4 y = dFdy(foo); vec4 z = fwidth(foo); _fs2p_location0 = ((x + y) * z); return; } ================================================ FILE: lib/naga/tests/out/glsl/texture-arg.main.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; uniform highp sampler2D _group_0_binding_0_fs; layout(location = 0) out vec4 _fs2p_location0; vec4 test(highp sampler2D Passed_Texture) { vec4 _e7 = texture(Passed_Texture, vec2(vec2(0.0, 0.0))); return _e7; } void main() { vec4 _e2 = test(_group_0_binding_0_fs); _fs2p_location0 = _e2; return; } ================================================ FILE: lib/naga/tests/out/glsl/variations-glsl.main.Fragment.glsl ================================================ #version 310 es precision highp float; precision highp int; uniform highp samplerCube _group_0_binding_0_fs; void main_1() { ivec2 sizeCube = ivec2(0); float a = 0.0; sizeCube = textureSize(_group_0_binding_0_fs, 0).xy; a = ceil(1.0); return; } void main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/hlsl/access.hlsl ================================================ typedef struct { float2 _0; float2 _1; } __mat2x2; float2 __get_col_of_mat2x2(__mat2x2 mat, uint idx) { switch(idx) { case 0: { return mat._0; } case 1: { return mat._1; } default: { return (float2)0; } } } void __set_col_of_mat2x2(__mat2x2 mat, uint idx, float2 value) { switch(idx) { case 0: { mat._0 = value; break; } case 1: { mat._1 = value; break; } } } void __set_el_of_mat2x2(__mat2x2 mat, uint idx, uint vec_idx, float value) { switch(idx) { case 0: { mat._0[vec_idx] = value; break; } case 1: { mat._1[vec_idx] = value; break; } } } typedef struct { float2 _0; float2 _1; float2 _2; float2 _3; } __mat4x2; float2 __get_col_of_mat4x2(__mat4x2 mat, uint idx) { switch(idx) { case 0: { return mat._0; } case 1: { return mat._1; } case 2: { return mat._2; } case 3: { return mat._3; } default: { return (float2)0; } } } void __set_col_of_mat4x2(__mat4x2 mat, uint idx, float2 value) { switch(idx) { case 0: { mat._0 = value; break; } case 1: { mat._1 = value; break; } case 2: { mat._2 = value; break; } case 3: { mat._3 = value; break; } } } void __set_el_of_mat4x2(__mat4x2 mat, uint idx, uint vec_idx, float value) { switch(idx) { case 0: { mat._0[vec_idx] = value; break; } case 1: { mat._1[vec_idx] = value; break; } case 2: { mat._2[vec_idx] = value; break; } case 3: { mat._3[vec_idx] = value; break; } } } struct GlobalConst { uint a; int _pad1_0; int _pad1_1; int _pad1_2; uint3 b; int c; }; struct AlignedWrapper { int value; int _end_pad_0; }; struct Baz { float2 m_0; float2 m_1; float2 m_2; }; struct MatCx2InArray { __mat4x2 am[2]; }; GlobalConst ConstructGlobalConst(uint arg0, uint3 arg1, int arg2) { GlobalConst ret = (GlobalConst)0; ret.a = arg0; ret.b = arg1; ret.c = arg2; return ret; } typedef float4x2 ret_Constructarray2_float4x2_[2]; ret_Constructarray2_float4x2_ Constructarray2_float4x2_(float4x2 arg0, float4x2 arg1) { float4x2 ret[2] = { arg0, arg1 }; return ret; } typedef float ret_Constructarray10_float_[10]; ret_Constructarray10_float_ Constructarray10_float_(float arg0, float arg1, float arg2, float arg3, float arg4, float arg5, float arg6, float arg7, float arg8, float arg9) { float ret[10] = { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 }; return ret; } typedef float ret_Constructarray5_array10_float__[5][10]; ret_Constructarray5_array10_float__ Constructarray5_array10_float__(float arg0[10], float arg1[10], float arg2[10], float arg3[10], float arg4[10]) { float ret[5][10] = { arg0, arg1, arg2, arg3, arg4 }; return ret; } static GlobalConst global_const = ConstructGlobalConst(0u, uint3(0u, 0u, 0u), 0); RWByteAddressBuffer bar : register(u0); cbuffer baz : register(b1) { Baz baz; } RWByteAddressBuffer qux : register(u2); cbuffer nested_mat_cx2_ : register(b3) { MatCx2InArray nested_mat_cx2_; } groupshared uint val; float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); } void SetMatmOnBaz(Baz obj, float3x2 mat) { obj.m_0 = mat[0]; obj.m_1 = mat[1]; obj.m_2 = mat[2]; } void SetMatVecmOnBaz(Baz obj, float2 vec, uint mat_idx) { switch(mat_idx) { case 0: { obj.m_0 = vec; break; } case 1: { obj.m_1 = vec; break; } case 2: { obj.m_2 = vec; break; } } } void SetMatScalarmOnBaz(Baz obj, float scalar, uint mat_idx, uint vec_idx) { switch(mat_idx) { case 0: { obj.m_0[vec_idx] = scalar; break; } case 1: { obj.m_1[vec_idx] = scalar; break; } case 2: { obj.m_2[vec_idx] = scalar; break; } } } Baz ConstructBaz(float3x2 arg0) { Baz ret = (Baz)0; ret.m_0 = arg0[0]; ret.m_1 = arg0[1]; ret.m_2 = arg0[2]; return ret; } void test_matrix_within_struct_accesses() { int idx = 1; Baz t = (Baz)0; int _expr6 = idx; idx = (_expr6 - 1); float3x2 unnamed = GetMatmOnBaz(baz); float2 unnamed_1 = GetMatmOnBaz(baz)[0]; int _expr16 = idx; float2 unnamed_2 = GetMatmOnBaz(baz)[_expr16]; float unnamed_3 = GetMatmOnBaz(baz)[0][1]; int _expr28 = idx; float unnamed_4 = GetMatmOnBaz(baz)[0][_expr28]; int _expr32 = idx; float unnamed_5 = GetMatmOnBaz(baz)[_expr32][1]; int _expr38 = idx; int _expr40 = idx; float unnamed_6 = GetMatmOnBaz(baz)[_expr38][_expr40]; t = ConstructBaz(float3x2((1.0).xx, (2.0).xx, (3.0).xx)); int _expr52 = idx; idx = (_expr52 + 1); SetMatmOnBaz(t, float3x2((6.0).xx, (5.0).xx, (4.0).xx)); t.m_0 = (9.0).xx; int _expr69 = idx; SetMatVecmOnBaz(t, (90.0).xx, _expr69); t.m_0[1] = 10.0; int _expr82 = idx; t.m_0[_expr82] = 20.0; int _expr86 = idx; SetMatScalarmOnBaz(t, 30.0, _expr86, 1); int _expr92 = idx; int _expr94 = idx; SetMatScalarmOnBaz(t, 40.0, _expr92, _expr94); return; } MatCx2InArray ConstructMatCx2InArray(float4x2 arg0[2]) { MatCx2InArray ret = (MatCx2InArray)0; ret.am = (__mat4x2[2])arg0; return ret; } void test_matrix_within_array_within_struct_accesses() { int idx_1 = 1; MatCx2InArray t_1 = (MatCx2InArray)0; int _expr7 = idx_1; idx_1 = (_expr7 - 1); float4x2 unnamed_7[2] = ((float4x2[2])nested_mat_cx2_.am); float4x2 unnamed_8 = ((float4x2)nested_mat_cx2_.am[0]); float2 unnamed_9 = nested_mat_cx2_.am[0]._0; int _expr25 = idx_1; float2 unnamed_10 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr25); float unnamed_11 = nested_mat_cx2_.am[0]._0[1]; int _expr41 = idx_1; float unnamed_12 = nested_mat_cx2_.am[0]._0[_expr41]; int _expr47 = idx_1; float unnamed_13 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr47)[1]; int _expr55 = idx_1; int _expr57 = idx_1; float unnamed_14 = __get_col_of_mat4x2(nested_mat_cx2_.am[0], _expr55)[_expr57]; t_1 = ConstructMatCx2InArray(Constructarray2_float4x2_(float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)), float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)))); int _expr63 = idx_1; idx_1 = (_expr63 + 1); t_1.am = (__mat4x2[2])Constructarray2_float4x2_(float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0)), float4x2(float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0), float2(0.0, 0.0))); t_1.am[0] = (__mat4x2)float4x2((8.0).xx, (7.0).xx, (6.0).xx, (5.0).xx); t_1.am[0]._0 = (9.0).xx; int _expr90 = idx_1; __set_col_of_mat4x2(t_1.am[0], _expr90, (90.0).xx); t_1.am[0]._0[1] = 10.0; int _expr107 = idx_1; t_1.am[0]._0[_expr107] = 20.0; int _expr113 = idx_1; __set_el_of_mat4x2(t_1.am[0], _expr113, 1, 30.0); int _expr121 = idx_1; int _expr123 = idx_1; __set_el_of_mat4x2(t_1.am[0], _expr121, _expr123, 40.0); return; } float read_from_private(inout float foo_1) { float _expr6 = foo_1; return _expr6; } float test_arr_as_arg(float a[5][10]) { return a[4][9]; } void assign_through_ptr_fn(inout uint p) { p = 42u; return; } uint NagaBufferLengthRW(RWByteAddressBuffer buffer) { uint ret; buffer.GetDimensions(ret); return ret; } typedef int ret_Constructarray5_int_[5]; ret_Constructarray5_int_ Constructarray5_int_(int arg0, int arg1, int arg2, int arg3, int arg4) { int ret[5] = { arg0, arg1, arg2, arg3, arg4 }; return ret; } float4 foo_vert(uint vi : SV_VertexID) : SV_Position { float foo = 0.0; int c[5] = {(int)0,(int)0,(int)0,(int)0,(int)0}; float baz_1 = foo; foo = 1.0; test_matrix_within_struct_accesses(); test_matrix_within_array_within_struct_accesses(); float4x3 _matrix = float4x3(asfloat(bar.Load3(0+0)), asfloat(bar.Load3(0+16)), asfloat(bar.Load3(0+32)), asfloat(bar.Load3(0+48))); uint2 arr[2] = {asuint(bar.Load2(104+0)), asuint(bar.Load2(104+8))}; float b = asfloat(bar.Load(0+48+0)); int a_1 = asint(bar.Load(0+(((NagaBufferLengthRW(bar) - 120) / 8) - 2u)*8+120)); int2 c_1 = asint(qux.Load2(0)); const float _e32 = read_from_private(foo); c = Constructarray5_int_(a_1, int(b), 3, 4, 5); c[(vi + 1u)] = 42; int value = c[vi]; const float _e46 = test_arr_as_arg(Constructarray5_array10_float__(Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), Constructarray10_float_(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))); return float4(mul(float4((value).xxxx), _matrix), 2.0); } typedef uint2 ret_Constructarray2_uint2_[2]; ret_Constructarray2_uint2_ Constructarray2_uint2_(uint2 arg0, uint2 arg1) { uint2 ret[2] = { arg0, arg1 }; return ret; } float4 foo_frag() : SV_Target0 { bar.Store(8+16+0, asuint(1.0)); { float4x3 _value2 = float4x3((0.0).xxx, (1.0).xxx, (2.0).xxx, (3.0).xxx); bar.Store3(0+0, asuint(_value2[0])); bar.Store3(0+16, asuint(_value2[1])); bar.Store3(0+32, asuint(_value2[2])); bar.Store3(0+48, asuint(_value2[3])); } { uint2 _value2[2] = Constructarray2_uint2_((0u).xx, (1u).xx); bar.Store2(104+0, asuint(_value2[0])); bar.Store2(104+8, asuint(_value2[1])); } bar.Store(0+8+120, asuint(1)); qux.Store2(0, asuint(int2(0, 0))); return (0.0).xxxx; } [numthreads(1, 1, 1)] void atomics() { int tmp = (int)0; int value_1 = asint(bar.Load(96)); int _e10; bar.InterlockedAdd(96, 5, _e10); tmp = _e10; int _e13; bar.InterlockedAdd(96, -5, _e13); tmp = _e13; int _e16; bar.InterlockedAnd(96, 5, _e16); tmp = _e16; int _e19; bar.InterlockedOr(96, 5, _e19); tmp = _e19; int _e22; bar.InterlockedXor(96, 5, _e22); tmp = _e22; int _e25; bar.InterlockedMin(96, 5, _e25); tmp = _e25; int _e28; bar.InterlockedMax(96, 5, _e28); tmp = _e28; int _e31; bar.InterlockedExchange(96, 5, _e31); tmp = _e31; bar.Store(96, asuint(value_1)); return; } [numthreads(1, 1, 1)] void assign_through_ptr() { assign_through_ptr_fn(val); return; } ================================================ FILE: lib/naga/tests/out/hlsl/access.hlsl.config ================================================ vertex=(foo_vert:vs_5_1 ) fragment=(foo_frag:ps_5_1 ) compute=(atomics:cs_5_1 assign_through_ptr:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/binding-arrays.hlsl ================================================ struct UniformIndex { uint index; }; struct FragmentIn { nointerpolation uint index : LOC0; }; Texture2D texture_array_unbounded[10] : register(t0); Texture2D texture_array_bounded[5] : register(t0, space1); Texture2DArray texture_array_2darray[5] : register(t0, space2); Texture2DMS texture_array_multisampled[5] : register(t0, space3); Texture2D texture_array_depth[5] : register(t0, space4); RWTexture2D texture_array_storage[5] : register(u0, space5); SamplerState samp[5] : register(s0, space6); SamplerComparisonState samp_comp[5] : register(s0, space7); cbuffer uni : register(b0, space8) { UniformIndex uni; } struct FragmentInput_main { nointerpolation uint index : LOC0; }; int2 NagaDimensions2D(Texture2D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.xy; } int NagaNumLayers2DArray(Texture2DArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaNumLevels2D(Texture2D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.z; } int NagaMSNumSamples2D(Texture2DMS tex) { uint4 ret; tex.GetDimensions(ret.x, ret.y, ret.z); return ret.z; } float4 main(FragmentInput_main fragmentinput_main) : SV_Target0 { FragmentIn fragment_in = { fragmentinput_main.index }; int i1_ = 0; int2 i2_ = (int2)0; float v1_ = 0.0; float4 v4_ = (float4)0; uint uniform_index = uni.index; uint non_uniform_index = fragment_in.index; i2_ = (0).xx; v4_ = (0.0).xxxx; float2 uv = (0.0).xx; int2 pix = (0).xx; int2 _expr27 = i2_; i2_ = (_expr27 + NagaDimensions2D(texture_array_unbounded[0])); int2 _expr32 = i2_; i2_ = (_expr32 + NagaDimensions2D(texture_array_unbounded[uniform_index])); int2 _expr36 = i2_; i2_ = (_expr36 + NagaDimensions2D(texture_array_unbounded[NonUniformResourceIndex(non_uniform_index)])); float4 _expr40 = v4_; float4 _expr45 = texture_array_bounded[0].Gather(samp[0], uv); v4_ = (_expr40 + _expr45); float4 _expr47 = v4_; float4 _expr50 = texture_array_bounded[uniform_index].Gather(samp[uniform_index], uv); v4_ = (_expr47 + _expr50); float4 _expr52 = v4_; float4 _expr55 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].Gather(samp[NonUniformResourceIndex(non_uniform_index)], uv); v4_ = (_expr52 + _expr55); float4 _expr57 = v4_; float4 _expr63 = texture_array_depth[0].GatherCmp(samp_comp[0], uv, 0.0); v4_ = (_expr57 + _expr63); float4 _expr65 = v4_; float4 _expr69 = texture_array_depth[uniform_index].GatherCmp(samp_comp[uniform_index], uv, 0.0); v4_ = (_expr65 + _expr69); float4 _expr71 = v4_; float4 _expr75 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].GatherCmp(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0); v4_ = (_expr71 + _expr75); float4 _expr77 = v4_; float4 _expr81 = texture_array_unbounded[0].Load(int3(pix, 0)); v4_ = (_expr77 + _expr81); float4 _expr83 = v4_; float4 _expr86 = texture_array_unbounded[uniform_index].Load(int3(pix, 0)); v4_ = (_expr83 + _expr86); float4 _expr88 = v4_; float4 _expr91 = texture_array_unbounded[NonUniformResourceIndex(non_uniform_index)].Load(int3(pix, 0)); v4_ = (_expr88 + _expr91); int _expr93 = i1_; i1_ = (_expr93 + NagaNumLayers2DArray(texture_array_2darray[0])); int _expr98 = i1_; i1_ = (_expr98 + NagaNumLayers2DArray(texture_array_2darray[uniform_index])); int _expr102 = i1_; i1_ = (_expr102 + NagaNumLayers2DArray(texture_array_2darray[NonUniformResourceIndex(non_uniform_index)])); int _expr106 = i1_; i1_ = (_expr106 + NagaNumLevels2D(texture_array_bounded[0])); int _expr111 = i1_; i1_ = (_expr111 + NagaNumLevels2D(texture_array_bounded[uniform_index])); int _expr115 = i1_; i1_ = (_expr115 + NagaNumLevels2D(texture_array_bounded[NonUniformResourceIndex(non_uniform_index)])); int _expr119 = i1_; i1_ = (_expr119 + NagaMSNumSamples2D(texture_array_multisampled[0])); int _expr124 = i1_; i1_ = (_expr124 + NagaMSNumSamples2D(texture_array_multisampled[uniform_index])); int _expr128 = i1_; i1_ = (_expr128 + NagaMSNumSamples2D(texture_array_multisampled[NonUniformResourceIndex(non_uniform_index)])); float4 _expr132 = v4_; float4 _expr137 = texture_array_bounded[0].Sample(samp[0], uv); v4_ = (_expr132 + _expr137); float4 _expr139 = v4_; float4 _expr142 = texture_array_bounded[uniform_index].Sample(samp[uniform_index], uv); v4_ = (_expr139 + _expr142); float4 _expr144 = v4_; float4 _expr147 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].Sample(samp[NonUniformResourceIndex(non_uniform_index)], uv); v4_ = (_expr144 + _expr147); float4 _expr149 = v4_; float4 _expr155 = texture_array_bounded[0].SampleBias(samp[0], uv, 0.0); v4_ = (_expr149 + _expr155); float4 _expr157 = v4_; float4 _expr161 = texture_array_bounded[uniform_index].SampleBias(samp[uniform_index], uv, 0.0); v4_ = (_expr157 + _expr161); float4 _expr163 = v4_; float4 _expr167 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleBias(samp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0); v4_ = (_expr163 + _expr167); float _expr169 = v1_; float _expr175 = texture_array_depth[0].SampleCmp(samp_comp[0], uv, 0.0); v1_ = (_expr169 + _expr175); float _expr177 = v1_; float _expr181 = texture_array_depth[uniform_index].SampleCmp(samp_comp[uniform_index], uv, 0.0); v1_ = (_expr177 + _expr181); float _expr183 = v1_; float _expr187 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].SampleCmp(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0); v1_ = (_expr183 + _expr187); float _expr189 = v1_; float _expr195 = texture_array_depth[0].SampleCmpLevelZero(samp_comp[0], uv, 0.0); v1_ = (_expr189 + _expr195); float _expr197 = v1_; float _expr201 = texture_array_depth[uniform_index].SampleCmpLevelZero(samp_comp[uniform_index], uv, 0.0); v1_ = (_expr197 + _expr201); float _expr203 = v1_; float _expr207 = texture_array_depth[NonUniformResourceIndex(non_uniform_index)].SampleCmpLevelZero(samp_comp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0); v1_ = (_expr203 + _expr207); float4 _expr209 = v4_; float4 _expr214 = texture_array_bounded[0].SampleGrad(samp[0], uv, uv, uv); v4_ = (_expr209 + _expr214); float4 _expr216 = v4_; float4 _expr219 = texture_array_bounded[uniform_index].SampleGrad(samp[uniform_index], uv, uv, uv); v4_ = (_expr216 + _expr219); float4 _expr221 = v4_; float4 _expr224 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleGrad(samp[NonUniformResourceIndex(non_uniform_index)], uv, uv, uv); v4_ = (_expr221 + _expr224); float4 _expr226 = v4_; float4 _expr232 = texture_array_bounded[0].SampleLevel(samp[0], uv, 0.0); v4_ = (_expr226 + _expr232); float4 _expr234 = v4_; float4 _expr238 = texture_array_bounded[uniform_index].SampleLevel(samp[uniform_index], uv, 0.0); v4_ = (_expr234 + _expr238); float4 _expr240 = v4_; float4 _expr244 = texture_array_bounded[NonUniformResourceIndex(non_uniform_index)].SampleLevel(samp[NonUniformResourceIndex(non_uniform_index)], uv, 0.0); v4_ = (_expr240 + _expr244); float4 _expr248 = v4_; texture_array_storage[0][pix] = _expr248; float4 _expr250 = v4_; texture_array_storage[uniform_index][pix] = _expr250; float4 _expr252 = v4_; texture_array_storage[NonUniformResourceIndex(non_uniform_index)][pix] = _expr252; int2 _expr253 = i2_; int _expr254 = i1_; float2 v2_ = float2((_expr253 + (_expr254).xx)); float4 _expr258 = v4_; float _expr265 = v1_; return ((_expr258 + float4(v2_.x, v2_.y, v2_.x, v2_.y)) + (_expr265).xxxx); } ================================================ FILE: lib/naga/tests/out/hlsl/binding-arrays.hlsl.config ================================================ vertex=() fragment=(main:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/boids.hlsl ================================================ static const uint NUM_PARTICLES = 1500; struct Particle { float2 pos; float2 vel; }; struct SimParams { float deltaT; float rule1Distance; float rule2Distance; float rule3Distance; float rule1Scale; float rule2Scale; float rule3Scale; }; cbuffer params : register(b0) { SimParams params; } ByteAddressBuffer particlesSrc : register(t1); RWByteAddressBuffer particlesDst : register(u2); [numthreads(64, 1, 1)] void main(uint3 global_invocation_id : SV_DispatchThreadID) { float2 vPos = (float2)0; float2 vVel = (float2)0; float2 cMass = (float2)0; float2 cVel = (float2)0; float2 colVel = (float2)0; int cMassCount = 0; int cVelCount = 0; float2 pos = (float2)0; float2 vel = (float2)0; uint i = 0u; uint index = global_invocation_id.x; if ((index >= NUM_PARTICLES)) { return; } float2 _expr10 = asfloat(particlesSrc.Load2(0+index*16+0)); vPos = _expr10; float2 _expr15 = asfloat(particlesSrc.Load2(8+index*16+0)); vVel = _expr15; cMass = float2(0.0, 0.0); cVel = float2(0.0, 0.0); colVel = float2(0.0, 0.0); bool loop_init = true; while(true) { if (!loop_init) { uint _expr86 = i; i = (_expr86 + 1u); } loop_init = false; uint _expr37 = i; if ((_expr37 >= NUM_PARTICLES)) { break; } uint _expr39 = i; if ((_expr39 == index)) { continue; } uint _expr42 = i; float2 _expr45 = asfloat(particlesSrc.Load2(0+_expr42*16+0)); pos = _expr45; uint _expr47 = i; float2 _expr50 = asfloat(particlesSrc.Load2(8+_expr47*16+0)); vel = _expr50; float2 _expr51 = pos; float2 _expr52 = vPos; float _expr55 = params.rule1Distance; if ((distance(_expr51, _expr52) < _expr55)) { float2 _expr57 = cMass; float2 _expr58 = pos; cMass = (_expr57 + _expr58); int _expr60 = cMassCount; cMassCount = (_expr60 + 1); } float2 _expr63 = pos; float2 _expr64 = vPos; float _expr67 = params.rule2Distance; if ((distance(_expr63, _expr64) < _expr67)) { float2 _expr69 = colVel; float2 _expr70 = pos; float2 _expr71 = vPos; colVel = (_expr69 - (_expr70 - _expr71)); } float2 _expr74 = pos; float2 _expr75 = vPos; float _expr78 = params.rule3Distance; if ((distance(_expr74, _expr75) < _expr78)) { float2 _expr80 = cVel; float2 _expr81 = vel; cVel = (_expr80 + _expr81); int _expr83 = cVelCount; cVelCount = (_expr83 + 1); } } int _expr89 = cMassCount; if ((_expr89 > 0)) { float2 _expr92 = cMass; int _expr93 = cMassCount; float2 _expr97 = vPos; cMass = ((_expr92 / (float(_expr93)).xx) - _expr97); } int _expr99 = cVelCount; if ((_expr99 > 0)) { float2 _expr102 = cVel; int _expr103 = cVelCount; cVel = (_expr102 / (float(_expr103)).xx); } float2 _expr107 = vVel; float2 _expr108 = cMass; float _expr110 = params.rule1Scale; float2 _expr113 = colVel; float _expr115 = params.rule2Scale; float2 _expr118 = cVel; float _expr120 = params.rule3Scale; vVel = (((_expr107 + (_expr108 * _expr110)) + (_expr113 * _expr115)) + (_expr118 * _expr120)); float2 _expr123 = vVel; float2 _expr125 = vVel; vVel = (normalize(_expr123) * clamp(length(_expr125), 0.0, 0.10000000149011612)); float2 _expr131 = vPos; float2 _expr132 = vVel; float _expr134 = params.deltaT; vPos = (_expr131 + (_expr132 * _expr134)); float _expr138 = vPos.x; if ((_expr138 < -1.0)) { vPos.x = 1.0; } float _expr144 = vPos.x; if ((_expr144 > 1.0)) { vPos.x = -1.0; } float _expr150 = vPos.y; if ((_expr150 < -1.0)) { vPos.y = 1.0; } float _expr156 = vPos.y; if ((_expr156 > 1.0)) { vPos.y = -1.0; } float2 _expr164 = vPos; particlesDst.Store2(0+index*16+0, asuint(_expr164)); float2 _expr168 = vVel; particlesDst.Store2(8+index*16+0, asuint(_expr168)); return; } ================================================ FILE: lib/naga/tests/out/hlsl/boids.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/break-if.hlsl ================================================ void breakIfEmpty() { bool loop_init = true; while(true) { if (!loop_init) { if (true) { break; } } loop_init = false; } return; } void breakIfEmptyBody(bool a) { bool b = (bool)0; bool c = (bool)0; bool loop_init_1 = true; while(true) { if (!loop_init_1) { b = a; bool _expr2 = b; c = (a != _expr2); bool _expr5 = c; bool unnamed = (a == _expr5); if (unnamed) { break; } } loop_init_1 = false; } return; } void breakIf(bool a_1) { bool d = (bool)0; bool e = (bool)0; bool loop_init_2 = true; while(true) { if (!loop_init_2) { bool _expr5 = e; bool unnamed_1 = (a_1 == _expr5); if (unnamed_1) { break; } } loop_init_2 = false; d = a_1; bool _expr2 = d; e = (a_1 != _expr2); } return; } [numthreads(1, 1, 1)] void main() { return; } ================================================ FILE: lib/naga/tests/out/hlsl/break-if.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/collatz.hlsl ================================================ RWByteAddressBuffer v_indices : register(u0); uint collatz_iterations(uint n_base) { uint n = (uint)0; uint i = 0u; n = n_base; while(true) { uint _expr5 = n; if ((_expr5 > 1u)) { } else { break; } uint _expr8 = n; if (((_expr8 % 2u) == 0u)) { uint _expr13 = n; n = (_expr13 / 2u); } else { uint _expr17 = n; n = ((3u * _expr17) + 1u); } uint _expr21 = i; i = (_expr21 + 1u); } uint _expr24 = i; return _expr24; } [numthreads(1, 1, 1)] void main(uint3 global_id : SV_DispatchThreadID) { uint _expr8 = asuint(v_indices.Load(global_id.x*4+0)); const uint _e9 = collatz_iterations(_expr8); v_indices.Store(global_id.x*4+0, asuint(_e9)); return; } ================================================ FILE: lib/naga/tests/out/hlsl/collatz.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/control-flow.hlsl ================================================ void switch_default_break(int i) { switch(i) { default: { break; } } } void switch_case_break() { switch(0) { case 0: { break; } default: { break; } } return; } void loop_switch_continue(int x) { while(true) { switch(x) { case 1: { continue; } default: { break; } } } return; } [numthreads(1, 1, 1)] void main(uint3 global_id : SV_DispatchThreadID) { int pos = (int)0; DeviceMemoryBarrierWithGroupSync(); GroupMemoryBarrierWithGroupSync(); switch(1) { default: { pos = 1; break; } } int _expr4 = pos; switch(_expr4) { case 1: { pos = 0; break; } case 2: { pos = 1; break; } case 3: { { pos = 2; } { pos = 3; } { pos = 4; } break; } case 4: { { pos = 3; } { pos = 4; } break; } default: { pos = 4; break; } } switch(0u) { case 0u: { break; } default: { break; } } int _expr11 = pos; switch(_expr11) { case 1: { pos = 0; break; } case 2: { pos = 1; return; } case 3: { { pos = 2; } { return; } } case 4: { return; } default: { pos = 3; return; } } } ================================================ FILE: lib/naga/tests/out/hlsl/control-flow.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/empty-global-name.hlsl ================================================ struct type_1 { int member; }; RWByteAddressBuffer unnamed : register(u0); void function() { int _expr8 = asint(unnamed.Load(0)); unnamed.Store(0, asuint((_expr8 + 1))); return; } [numthreads(1, 1, 1)] void main() { function(); } ================================================ FILE: lib/naga/tests/out/hlsl/empty-global-name.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/empty.hlsl ================================================ [numthreads(1, 1, 1)] void main() { return; } ================================================ FILE: lib/naga/tests/out/hlsl/empty.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/functions.hlsl ================================================ float2 test_fma() { float2 a = float2(2.0, 2.0); float2 b = float2(0.5, 0.5); float2 c = float2(0.5, 0.5); return mad(a, b, c); } int test_integer_dot_product() { int2 a_2_ = (1).xx; int2 b_2_ = (1).xx; int c_2_ = dot(a_2_, b_2_); uint3 a_3_ = (1u).xxx; uint3 b_3_ = (1u).xxx; uint c_3_ = dot(a_3_, b_3_); int c_4_ = dot((4).xxxx, (2).xxxx); return c_4_; } [numthreads(1, 1, 1)] void main() { const float2 _e0 = test_fma(); const int _e1 = test_integer_dot_product(); return; } ================================================ FILE: lib/naga/tests/out/hlsl/functions.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/globals.hlsl ================================================ static const bool Foo_2 = true; typedef struct { float2 _0; float2 _1; float2 _2; } __mat3x2; float2 __get_col_of_mat3x2(__mat3x2 mat, uint idx) { switch(idx) { case 0: { return mat._0; } case 1: { return mat._1; } case 2: { return mat._2; } default: { return (float2)0; } } } void __set_col_of_mat3x2(__mat3x2 mat, uint idx, float2 value) { switch(idx) { case 0: { mat._0 = value; break; } case 1: { mat._1 = value; break; } case 2: { mat._2 = value; break; } } } void __set_el_of_mat3x2(__mat3x2 mat, uint idx, uint vec_idx, float value) { switch(idx) { case 0: { mat._0[vec_idx] = value; break; } case 1: { mat._1[vec_idx] = value; break; } case 2: { mat._2[vec_idx] = value; break; } } } typedef struct { float2 _0; float2 _1; float2 _2; float2 _3; } __mat4x2; float2 __get_col_of_mat4x2(__mat4x2 mat, uint idx) { switch(idx) { case 0: { return mat._0; } case 1: { return mat._1; } case 2: { return mat._2; } case 3: { return mat._3; } default: { return (float2)0; } } } void __set_col_of_mat4x2(__mat4x2 mat, uint idx, float2 value) { switch(idx) { case 0: { mat._0 = value; break; } case 1: { mat._1 = value; break; } case 2: { mat._2 = value; break; } case 3: { mat._3 = value; break; } } } void __set_el_of_mat4x2(__mat4x2 mat, uint idx, uint vec_idx, float value) { switch(idx) { case 0: { mat._0[vec_idx] = value; break; } case 1: { mat._1[vec_idx] = value; break; } case 2: { mat._2[vec_idx] = value; break; } case 3: { mat._3[vec_idx] = value; break; } } } struct Foo { float3 v3_; float v1_; }; groupshared float wg[10]; groupshared uint at_1; RWByteAddressBuffer alignment : register(u1); ByteAddressBuffer dummy : register(t2); cbuffer float_vecs : register(b3) { float4 float_vecs[20]; } cbuffer global_vec : register(b4) { float3 global_vec; } cbuffer global_mat : register(b5) { __mat3x2 global_mat; } cbuffer global_nested_arrays_of_matrices_2x4_ : register(b6) { row_major float2x4 global_nested_arrays_of_matrices_2x4_[2][2]; } cbuffer global_nested_arrays_of_matrices_4x2_ : register(b7) { __mat4x2 global_nested_arrays_of_matrices_4x2_[2][2]; } void test_msl_packed_vec3_as_arg(float3 arg) { return; } Foo ConstructFoo(float3 arg0, float arg1) { Foo ret = (Foo)0; ret.v3_ = arg0; ret.v1_ = arg1; return ret; } void test_msl_packed_vec3_() { int idx = 1; alignment.Store3(0, asuint((1.0).xxx)); alignment.Store(0+0, asuint(1.0)); alignment.Store(0+0, asuint(2.0)); int _expr23 = idx; alignment.Store(_expr23*4+0, asuint(3.0)); Foo data = ConstructFoo(asfloat(alignment.Load3(0)), asfloat(alignment.Load(12))); float3 unnamed = data.v3_; float2 unnamed_1 = data.v3_.zx; test_msl_packed_vec3_as_arg(data.v3_); float3 unnamed_2 = mul(float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), data.v3_); float3 unnamed_3 = mul(data.v3_, float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float3 unnamed_4 = (data.v3_ * 2.0); float3 unnamed_5 = (2.0 * data.v3_); } uint NagaBufferLength(ByteAddressBuffer buffer) { uint ret; buffer.GetDimensions(ret); return ret; } [numthreads(1, 1, 1)] void main() { float Foo_1 = 1.0; bool at = true; test_msl_packed_vec3_(); float4x2 _expr16 = ((float4x2)global_nested_arrays_of_matrices_4x2_[0][0]); float4 _expr23 = global_nested_arrays_of_matrices_2x4_[0][0][0]; wg[7] = mul(_expr23, _expr16).x; float3x2 _expr28 = ((float3x2)global_mat); float3 _expr29 = global_vec; wg[6] = mul(_expr29, _expr28).x; float _expr37 = asfloat(dummy.Load(4+8)); wg[5] = _expr37; float _expr43 = float_vecs[0].w; wg[4] = _expr43; float _expr47 = asfloat(alignment.Load(12)); wg[3] = _expr47; float _expr52 = asfloat(alignment.Load(0+0)); wg[2] = _expr52; alignment.Store(12, asuint(4.0)); wg[1] = float(((NagaBufferLength(dummy) - 0) / 8)); at_1 = 2u; return; } ================================================ FILE: lib/naga/tests/out/hlsl/globals.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/image.hlsl ================================================ Texture2D image_mipmapped_src : register(t0); Texture2DMS image_multisampled_src : register(t3); Texture2DMS image_depth_multisampled_src : register(t4); RWTexture2D image_storage_src : register(u1); Texture2DArray image_array_src : register(t5); RWTexture1D image_dup_src : register(u6); Texture1D image_1d_src : register(t7); RWTexture1D image_dst : register(u2); Texture1D image_1d : register(t0); Texture2D image_2d : register(t1); Texture2DArray image_2d_array : register(t2); TextureCube image_cube : register(t3); TextureCubeArray image_cube_array : register(t4); Texture3D image_3d : register(t5); Texture2DMS image_aa : register(t6); SamplerState sampler_reg : register(s0, space1); SamplerComparisonState sampler_cmp : register(s1, space1); Texture2D image_2d_depth : register(t2, space1); TextureCube image_cube_depth : register(t3, space1); int2 NagaRWDimensions2D(RWTexture2D tex) { uint4 ret; tex.GetDimensions(ret.x, ret.y); return ret.xy; } [numthreads(16, 1, 1)] void main(uint3 local_id : SV_GroupThreadID) { int2 dim = NagaRWDimensions2D(image_storage_src); int2 itc = ((dim * int2(local_id.xy)) % int2(10, 20)); uint4 value1_ = image_mipmapped_src.Load(int3(itc, int(local_id.z))); uint4 value2_ = image_multisampled_src.Load(itc, int(local_id.z)); uint4 value4_ = image_storage_src.Load(itc); uint4 value5_ = image_array_src.Load(int4(itc, int(local_id.z), (int(local_id.z) + 1))); uint4 value6_ = image_1d_src.Load(int2(int(local_id.x), int(local_id.z))); image_dst[itc.x] = ((((value1_ + value2_) + value4_) + value5_) + value6_); return; } [numthreads(16, 1, 1)] void depth_load(uint3 local_id_1 : SV_GroupThreadID) { int2 dim_1 = NagaRWDimensions2D(image_storage_src); int2 itc_1 = ((dim_1 * int2(local_id_1.xy)) % int2(10, 20)); float val = image_depth_multisampled_src.Load(itc_1, int(local_id_1.z)).x; image_dst[itc_1.x] = (uint(val)).xxxx; return; } int NagaDimensions1D(Texture1D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y); return ret.x; } int NagaMipDimensions1D(Texture1D tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y); return ret.x; } int2 NagaDimensions2D(Texture2D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.xy; } int2 NagaMipDimensions2D(Texture2D tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y, ret.z); return ret.xy; } int2 NagaDimensions2DArray(Texture2DArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.xy; } int2 NagaMipDimensions2DArray(Texture2DArray tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w); return ret.xy; } int2 NagaDimensionsCube(TextureCube tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.xy; } int2 NagaMipDimensionsCube(TextureCube tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y, ret.z); return ret.xy; } int2 NagaDimensionsCubeArray(TextureCubeArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.xy; } int2 NagaMipDimensionsCubeArray(TextureCubeArray tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w); return ret.xy; } int3 NagaDimensions3D(Texture3D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.xyz; } int3 NagaMipDimensions3D(Texture3D tex, uint mip_level) { uint4 ret; tex.GetDimensions(mip_level, ret.x, ret.y, ret.z, ret.w); return ret.xyz; } int2 NagaMSDimensions2D(Texture2DMS tex) { uint4 ret; tex.GetDimensions(ret.x, ret.y, ret.z); return ret.xy; } float4 queries() : SV_Position { int dim_1d = NagaDimensions1D(image_1d); int dim_1d_lod = NagaMipDimensions1D(image_1d, int(dim_1d)); int2 dim_2d = NagaDimensions2D(image_2d); int2 dim_2d_lod = NagaMipDimensions2D(image_2d, 1); int2 dim_2d_array = NagaDimensions2DArray(image_2d_array); int2 dim_2d_array_lod = NagaMipDimensions2DArray(image_2d_array, 1); int2 dim_cube = NagaDimensionsCube(image_cube); int2 dim_cube_lod = NagaMipDimensionsCube(image_cube, 1); int2 dim_cube_array = NagaDimensionsCubeArray(image_cube_array); int2 dim_cube_array_lod = NagaMipDimensionsCubeArray(image_cube_array, 1); int3 dim_3d = NagaDimensions3D(image_3d); int3 dim_3d_lod = NagaMipDimensions3D(image_3d, 1); int2 dim_2s_ms = NagaMSDimensions2D(image_aa); int sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z); return (float(sum)).xxxx; } int NagaNumLevels2D(Texture2D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.z; } int NagaNumLevels2DArray(Texture2DArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaNumLayers2DArray(Texture2DArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaNumLevelsCube(TextureCube tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z); return ret.z; } int NagaNumLevelsCubeArray(TextureCubeArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaNumLayersCubeArray(TextureCubeArray tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaNumLevels3D(Texture3D tex) { uint4 ret; tex.GetDimensions(0, ret.x, ret.y, ret.z, ret.w); return ret.w; } int NagaMSNumSamples2D(Texture2DMS tex) { uint4 ret; tex.GetDimensions(ret.x, ret.y, ret.z); return ret.z; } float4 levels_queries() : SV_Position { int num_levels_2d = NagaNumLevels2D(image_2d); int num_levels_2d_array = NagaNumLevels2DArray(image_2d_array); int num_layers_2d = NagaNumLayers2DArray(image_2d_array); int num_levels_cube = NagaNumLevelsCube(image_cube); int num_levels_cube_array = NagaNumLevelsCubeArray(image_cube_array); int num_layers_cube = NagaNumLayersCubeArray(image_cube_array); int num_levels_3d = NagaNumLevels3D(image_3d); int num_samples_aa = NagaMSNumSamples2D(image_aa); int sum_1 = (((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array); return (float(sum_1)).xxxx; } float4 texture_sample() : SV_Target0 { float2 tc = (0.5).xx; float4 s1d = image_1d.Sample(sampler_reg, tc.x); float4 s2d = image_2d.Sample(sampler_reg, tc); float4 s2d_offset = image_2d.Sample(sampler_reg, tc, int2(3, 1)); float4 s2d_level = image_2d.SampleLevel(sampler_reg, tc, 2.299999952316284); float4 s2d_level_offset = image_2d.SampleLevel(sampler_reg, tc, 2.299999952316284, int2(3, 1)); float4 s2d_bias_offset = image_2d.SampleBias(sampler_reg, tc, 2.0, int2(3, 1)); return ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset); } float texture_sample_comparison() : SV_Target0 { float2 tc_1 = (0.5).xx; float s2d_depth = image_2d_depth.SampleCmp(sampler_cmp, tc_1, 0.5); float s2d_depth_level = image_2d_depth.SampleCmpLevelZero(sampler_cmp, tc_1, 0.5); float scube_depth_level = image_cube_depth.SampleCmpLevelZero(sampler_cmp, (0.5).xxx, 0.5); return (s2d_depth + s2d_depth_level); } float4 gather() : SV_Target0 { float2 tc_2 = (0.5).xx; float4 s2d_1 = image_2d.GatherGreen(sampler_reg, tc_2); float4 s2d_offset_1 = image_2d.GatherAlpha(sampler_reg, tc_2, int2(3, 1)); float4 s2d_depth_1 = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5); float4 s2d_depth_offset = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5, int2(3, 1)); return (((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset); } float4 depth_no_comparison() : SV_Target0 { float2 tc_3 = (0.5).xx; float s2d_2 = image_2d_depth.Sample(sampler_reg, tc_3); float4 s2d_gather = image_2d_depth.Gather(sampler_reg, tc_3); return ((s2d_2).xxxx + s2d_gather); } ================================================ FILE: lib/naga/tests/out/hlsl/image.hlsl.config ================================================ vertex=(queries:vs_5_1 levels_queries:vs_5_1 ) fragment=(texture_sample:ps_5_1 texture_sample_comparison:ps_5_1 gather:ps_5_1 depth_no_comparison:ps_5_1 ) compute=(main:cs_5_1 depth_load:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/interface.hlsl ================================================ struct NagaConstants { int base_vertex; int base_instance; uint other; }; ConstantBuffer _NagaConstants: register(b0, space1); struct VertexOutput { precise float4 position : SV_Position; float _varying : LOC1; }; struct FragmentOutput { float depth : SV_Depth; uint sample_mask : SV_Coverage; float color : SV_Target0; }; struct Input1_ { uint index : SV_VertexID; }; struct Input2_ { uint index : SV_InstanceID; }; groupshared uint output[1]; struct VertexOutput_vertex { float _varying : LOC1; precise float4 position : SV_Position; }; struct FragmentInput_fragment { float _varying_1 : LOC1; precise float4 position_1 : SV_Position; bool front_facing_1 : SV_IsFrontFace; uint sample_index_1 : SV_SampleIndex; uint sample_mask_1 : SV_Coverage; }; VertexOutput ConstructVertexOutput(float4 arg0, float arg1) { VertexOutput ret = (VertexOutput)0; ret.position = arg0; ret._varying = arg1; return ret; } VertexOutput_vertex vertex(uint vertex_index : SV_VertexID, uint instance_index : SV_InstanceID, uint color : LOC10) { uint tmp = (((_NagaConstants.base_vertex + vertex_index) + (_NagaConstants.base_instance + instance_index)) + color); const VertexOutput vertexoutput = ConstructVertexOutput((1.0).xxxx, float(tmp)); const VertexOutput_vertex vertexoutput_1 = { vertexoutput._varying, vertexoutput.position }; return vertexoutput_1; } FragmentOutput ConstructFragmentOutput(float arg0, uint arg1, float arg2) { FragmentOutput ret = (FragmentOutput)0; ret.depth = arg0; ret.sample_mask = arg1; ret.color = arg2; return ret; } FragmentOutput fragment(FragmentInput_fragment fragmentinput_fragment) { VertexOutput in_ = { fragmentinput_fragment.position_1, fragmentinput_fragment._varying_1 }; bool front_facing = fragmentinput_fragment.front_facing_1; uint sample_index = fragmentinput_fragment.sample_index_1; uint sample_mask = fragmentinput_fragment.sample_mask_1; uint mask = (sample_mask & (1u << sample_index)); float color_1 = (front_facing ? 1.0 : 0.0); const FragmentOutput fragmentoutput = ConstructFragmentOutput(in_._varying, mask, color_1); return fragmentoutput; } [numthreads(1, 1, 1)] void compute(uint3 global_id : SV_DispatchThreadID, uint3 local_id : SV_GroupThreadID, uint local_index : SV_GroupIndex, uint3 wg_id : SV_GroupID, uint3 num_wgs : SV_GroupID) { output[0] = ((((global_id.x + local_id.x) + local_index) + wg_id.x) + uint3(_NagaConstants.base_vertex, _NagaConstants.base_instance, _NagaConstants.other).x); return; } precise float4 vertex_two_structs(Input1_ in1_, Input2_ in2_) : SV_Position { uint index = 2u; uint _expr9 = index; return float4(float((_NagaConstants.base_vertex + in1_.index)), float((_NagaConstants.base_instance + in2_.index)), float(_expr9), 0.0); } ================================================ FILE: lib/naga/tests/out/hlsl/interface.hlsl.config ================================================ vertex=(vertex:vs_5_1 vertex_two_structs:vs_5_1 ) fragment=(fragment:ps_5_1 ) compute=(compute:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/interpolate.hlsl ================================================ struct FragmentInput { float4 position : SV_Position; nointerpolation uint _flat : LOC0; noperspective float _linear : LOC1; noperspective centroid float2 linear_centroid : LOC2; noperspective sample float3 linear_sample : LOC3; float4 perspective : LOC4; centroid float perspective_centroid : LOC5; sample float perspective_sample : LOC6; }; struct VertexOutput_vert_main { nointerpolation uint _flat : LOC0; noperspective float _linear : LOC1; noperspective centroid float2 linear_centroid : LOC2; noperspective sample float3 linear_sample : LOC3; float4 perspective : LOC4; centroid float perspective_centroid : LOC5; sample float perspective_sample : LOC6; float4 position : SV_Position; }; struct FragmentInput_frag_main { nointerpolation uint _flat_1 : LOC0; noperspective float _linear_1 : LOC1; noperspective centroid float2 linear_centroid_1 : LOC2; noperspective sample float3 linear_sample_1 : LOC3; float4 perspective_1 : LOC4; centroid float perspective_centroid_1 : LOC5; sample float perspective_sample_1 : LOC6; float4 position_1 : SV_Position; }; VertexOutput_vert_main vert_main() { FragmentInput out_ = (FragmentInput)0; out_.position = float4(2.0, 4.0, 5.0, 6.0); out_._flat = 8u; out_._linear = 27.0; out_.linear_centroid = float2(64.0, 125.0); out_.linear_sample = float3(216.0, 343.0, 512.0); out_.perspective = float4(729.0, 1000.0, 1331.0, 1728.0); out_.perspective_centroid = 2197.0; out_.perspective_sample = 2744.0; FragmentInput _expr30 = out_; const FragmentInput fragmentinput = _expr30; const VertexOutput_vert_main fragmentinput_1 = { fragmentinput._flat, fragmentinput._linear, fragmentinput.linear_centroid, fragmentinput.linear_sample, fragmentinput.perspective, fragmentinput.perspective_centroid, fragmentinput.perspective_sample, fragmentinput.position }; return fragmentinput_1; } void frag_main(FragmentInput_frag_main fragmentinput_frag_main) { FragmentInput val = { fragmentinput_frag_main.position_1, fragmentinput_frag_main._flat_1, fragmentinput_frag_main._linear_1, fragmentinput_frag_main.linear_centroid_1, fragmentinput_frag_main.linear_sample_1, fragmentinput_frag_main.perspective_1, fragmentinput_frag_main.perspective_centroid_1, fragmentinput_frag_main.perspective_sample_1 }; return; } ================================================ FILE: lib/naga/tests/out/hlsl/interpolate.hlsl.config ================================================ vertex=(vert_main:vs_5_1 ) fragment=(frag_main:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/inv-hyperbolic-trig-functions.hlsl ================================================ static float a = (float)0; void main_1() { float b = (float)0; float c = (float)0; float d = (float)0; float _expr8 = a; b = log(_expr8 + sqrt(_expr8 * _expr8 + 1.0)); float _expr10 = a; c = log(_expr10 + sqrt(_expr10 * _expr10 - 1.0)); float _expr12 = a; d = 0.5 * log((1.0 + _expr12) / (1.0 - _expr12)); return; } void main() { main_1(); } ================================================ FILE: lib/naga/tests/out/hlsl/inv-hyperbolic-trig-functions.hlsl.config ================================================ vertex=(main:vs_5_1 ) fragment=() compute=() ================================================ FILE: lib/naga/tests/out/hlsl/math-functions.hlsl ================================================ void main() { float4 v = (0.0).xxxx; float a = degrees(1.0); float b = radians(1.0); float4 c = degrees(v); float4 d = radians(v); float4 e = saturate(v); int const_dot = dot(int2(0, 0), int2(0, 0)); uint first_leading_bit_abs = firstbithigh(abs(0u)); } ================================================ FILE: lib/naga/tests/out/hlsl/math-functions.hlsl.config ================================================ vertex=(main:vs_5_1 ) fragment=() compute=() ================================================ FILE: lib/naga/tests/out/hlsl/operators.hlsl ================================================ static const float4 v_f32_one = float4(1.0, 1.0, 1.0, 1.0); static const float4 v_f32_zero = float4(0.0, 0.0, 0.0, 0.0); static const float4 v_f32_half = float4(0.5, 0.5, 0.5, 0.5); static const int4 v_i32_one = int4(1, 1, 1, 1); struct Foo { float4 a; int b; int _end_pad_0; int _end_pad_1; int _end_pad_2; }; Foo ConstructFoo(float4 arg0, int arg1) { Foo ret = (Foo)0; ret.a = arg0; ret.b = arg1; return ret; } typedef Foo ret_Constructarray3_Foo_[3]; ret_Constructarray3_Foo_ Constructarray3_Foo_(Foo arg0, Foo arg1, Foo arg2) { Foo ret[3] = { arg0, arg1, arg2 }; return ret; } float4 builtins() { int s1_ = (true ? 1 : 0); float4 s2_ = (true ? float4(1.0, 1.0, 1.0, 1.0) : float4(0.0, 0.0, 0.0, 0.0)); float4 s3_ = (bool4(false, false, false, false) ? float4(0.0, 0.0, 0.0, 0.0) : float4(1.0, 1.0, 1.0, 1.0)); float4 m1_ = lerp(float4(0.0, 0.0, 0.0, 0.0), float4(1.0, 1.0, 1.0, 1.0), float4(0.5, 0.5, 0.5, 0.5)); float4 m2_ = lerp(float4(0.0, 0.0, 0.0, 0.0), float4(1.0, 1.0, 1.0, 1.0), 0.10000000149011612); float b1_ = float(int4(1, 1, 1, 1).x); float4 b2_ = float4(int4(1, 1, 1, 1)); int4 v_i32_zero = int4(float4(0.0, 0.0, 0.0, 0.0)); return (((((float4(((s1_).xxxx + v_i32_zero)) + s2_) + m1_) + m2_) + (b1_).xxxx) + b2_); } float4 splat() { float2 a_2 = ((((1.0).xx + (2.0).xx) - (3.0).xx) / (4.0).xx); int4 b = ((5).xxxx % (2).xxxx); return (a_2.xyxy + float4(b)); } float2 splat_assignment() { float2 a = (float2)0; a = (2.0).xx; float2 _expr7 = a; a = (_expr7 + (1.0).xx); float2 _expr11 = a; a = (_expr11 - (3.0).xx); float2 _expr15 = a; a = (_expr15 / (4.0).xx); float2 _expr19 = a; return _expr19; } float3 bool_cast(float3 x) { bool3 y = bool3(x); return float3(y); } typedef int ret_Constructarray4_int_[4]; ret_Constructarray4_int_ Constructarray4_int_(int arg0, int arg1, int arg2, int arg3) { int ret[4] = { arg0, arg1, arg2, arg3 }; return ret; } float constructors() { Foo foo = (Foo)0; foo = ConstructFoo((1.0).xxxx, 1); float2x2 mat2comp = float2x2(float2(1.0, 0.0), float2(0.0, 1.0)); float4x4 mat4comp = float4x4(float4(1.0, 0.0, 0.0, 0.0), float4(0.0, 1.0, 0.0, 0.0), float4(0.0, 0.0, 1.0, 0.0), float4(0.0, 0.0, 0.0, 1.0)); uint2 unnamed = (0u).xx; float2x2 unnamed_1 = float2x2((0.0).xx, (0.0).xx); int unnamed_2[4] = Constructarray4_int_(0, 1, 2, 3); bool unnamed_3 = bool(false); int unnamed_4 = int(0); uint unnamed_5 = uint(0u); float unnamed_6 = float(0.0); uint2 unnamed_7 = uint2(uint2(0u, 0u)); float2x3 unnamed_8 = float2x3(float2x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); uint2 unnamed_9 = uint2(uint2(0u, 0u)); float2x3 unnamed_10 = float2x3(float2x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float _expr75 = foo.a.x; return _expr75; } void logical() { bool unnamed_11 = !true; bool2 unnamed_12 = !(true).xx; bool unnamed_13 = (true || false); bool unnamed_14 = (true && false); bool unnamed_15 = (true | false); bool3 unnamed_16 = ((true).xxx | (false).xxx); bool unnamed_17 = (true & false); bool4 unnamed_18 = ((true).xxxx & (false).xxxx); } void arithmetic() { int2 unnamed_19 = -(1).xx; float2 unnamed_20 = -(1.0).xx; int unnamed_21 = (2 + 1); uint unnamed_22 = (2u + 1u); float unnamed_23 = (2.0 + 1.0); int2 unnamed_24 = ((2).xx + (1).xx); uint3 unnamed_25 = ((2u).xxx + (1u).xxx); float4 unnamed_26 = ((2.0).xxxx + (1.0).xxxx); int unnamed_27 = (2 - 1); uint unnamed_28 = (2u - 1u); float unnamed_29 = (2.0 - 1.0); int2 unnamed_30 = ((2).xx - (1).xx); uint3 unnamed_31 = ((2u).xxx - (1u).xxx); float4 unnamed_32 = ((2.0).xxxx - (1.0).xxxx); int unnamed_33 = (2 * 1); uint unnamed_34 = (2u * 1u); float unnamed_35 = (2.0 * 1.0); int2 unnamed_36 = ((2).xx * (1).xx); uint3 unnamed_37 = ((2u).xxx * (1u).xxx); float4 unnamed_38 = ((2.0).xxxx * (1.0).xxxx); int unnamed_39 = (2 / 1); uint unnamed_40 = (2u / 1u); float unnamed_41 = (2.0 / 1.0); int2 unnamed_42 = ((2).xx / (1).xx); uint3 unnamed_43 = ((2u).xxx / (1u).xxx); float4 unnamed_44 = ((2.0).xxxx / (1.0).xxxx); int unnamed_45 = (2 % 1); uint unnamed_46 = (2u % 1u); float unnamed_47 = fmod(2.0, 1.0); int2 unnamed_48 = ((2).xx % (1).xx); uint3 unnamed_49 = ((2u).xxx % (1u).xxx); float4 unnamed_50 = fmod((2.0).xxxx, (1.0).xxxx); int2 unnamed_51 = ((2).xx + (1).xx); int2 unnamed_52 = ((2).xx + (1).xx); uint2 unnamed_53 = ((2u).xx + (1u).xx); uint2 unnamed_54 = ((2u).xx + (1u).xx); float2 unnamed_55 = ((2.0).xx + (1.0).xx); float2 unnamed_56 = ((2.0).xx + (1.0).xx); int2 unnamed_57 = ((2).xx - (1).xx); int2 unnamed_58 = ((2).xx - (1).xx); uint2 unnamed_59 = ((2u).xx - (1u).xx); uint2 unnamed_60 = ((2u).xx - (1u).xx); float2 unnamed_61 = ((2.0).xx - (1.0).xx); float2 unnamed_62 = ((2.0).xx - (1.0).xx); int2 unnamed_63 = ((2).xx * 1); int2 unnamed_64 = (2 * (1).xx); uint2 unnamed_65 = ((2u).xx * 1u); uint2 unnamed_66 = (2u * (1u).xx); float2 unnamed_67 = ((2.0).xx * 1.0); float2 unnamed_68 = (2.0 * (1.0).xx); int2 unnamed_69 = ((2).xx / (1).xx); int2 unnamed_70 = ((2).xx / (1).xx); uint2 unnamed_71 = ((2u).xx / (1u).xx); uint2 unnamed_72 = ((2u).xx / (1u).xx); float2 unnamed_73 = ((2.0).xx / (1.0).xx); float2 unnamed_74 = ((2.0).xx / (1.0).xx); int2 unnamed_75 = ((2).xx % (1).xx); int2 unnamed_76 = ((2).xx % (1).xx); uint2 unnamed_77 = ((2u).xx % (1u).xx); uint2 unnamed_78 = ((2u).xx % (1u).xx); float2 unnamed_79 = fmod((2.0).xx, (1.0).xx); float2 unnamed_80 = fmod((2.0).xx, (1.0).xx); float3x3 unnamed_81 = (float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)) + float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float3x3 unnamed_82 = (float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)) - float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float3x3 unnamed_83 = mul(1.0, float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float3x3 unnamed_84 = mul(float3x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), 2.0); float3 unnamed_85 = mul((1.0).xxxx, float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); float4 unnamed_86 = mul(float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0)), (2.0).xxx); float3x3 unnamed_87 = mul(float3x4(float4(0.0, 0.0, 0.0, 0.0), float4(0.0, 0.0, 0.0, 0.0), float4(0.0, 0.0, 0.0, 0.0)), float4x3(float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0), float3(0.0, 0.0, 0.0))); } void bit() { int unnamed_88 = ~1; uint unnamed_89 = ~1u; int2 unnamed_90 = ~(1).xx; uint3 unnamed_91 = ~(1u).xxx; int unnamed_92 = (2 | 1); uint unnamed_93 = (2u | 1u); int2 unnamed_94 = ((2).xx | (1).xx); uint3 unnamed_95 = ((2u).xxx | (1u).xxx); int unnamed_96 = (2 & 1); uint unnamed_97 = (2u & 1u); int2 unnamed_98 = ((2).xx & (1).xx); uint3 unnamed_99 = ((2u).xxx & (1u).xxx); int unnamed_100 = (2 ^ 1); uint unnamed_101 = (2u ^ 1u); int2 unnamed_102 = ((2).xx ^ (1).xx); uint3 unnamed_103 = ((2u).xxx ^ (1u).xxx); int unnamed_104 = (2 << 1u); uint unnamed_105 = (2u << 1u); int2 unnamed_106 = ((2).xx << (1u).xx); uint3 unnamed_107 = ((2u).xxx << (1u).xxx); int unnamed_108 = (2 >> 1u); uint unnamed_109 = (2u >> 1u); int2 unnamed_110 = ((2).xx >> (1u).xx); uint3 unnamed_111 = ((2u).xxx >> (1u).xxx); } void comparison() { bool unnamed_112 = (2 == 1); bool unnamed_113 = (2u == 1u); bool unnamed_114 = (2.0 == 1.0); bool2 unnamed_115 = ((2).xx == (1).xx); bool3 unnamed_116 = ((2u).xxx == (1u).xxx); bool4 unnamed_117 = ((2.0).xxxx == (1.0).xxxx); bool unnamed_118 = (2 != 1); bool unnamed_119 = (2u != 1u); bool unnamed_120 = (2.0 != 1.0); bool2 unnamed_121 = ((2).xx != (1).xx); bool3 unnamed_122 = ((2u).xxx != (1u).xxx); bool4 unnamed_123 = ((2.0).xxxx != (1.0).xxxx); bool unnamed_124 = (2 < 1); bool unnamed_125 = (2u < 1u); bool unnamed_126 = (2.0 < 1.0); bool2 unnamed_127 = ((2).xx < (1).xx); bool3 unnamed_128 = ((2u).xxx < (1u).xxx); bool4 unnamed_129 = ((2.0).xxxx < (1.0).xxxx); bool unnamed_130 = (2 <= 1); bool unnamed_131 = (2u <= 1u); bool unnamed_132 = (2.0 <= 1.0); bool2 unnamed_133 = ((2).xx <= (1).xx); bool3 unnamed_134 = ((2u).xxx <= (1u).xxx); bool4 unnamed_135 = ((2.0).xxxx <= (1.0).xxxx); bool unnamed_136 = (2 > 1); bool unnamed_137 = (2u > 1u); bool unnamed_138 = (2.0 > 1.0); bool2 unnamed_139 = ((2).xx > (1).xx); bool3 unnamed_140 = ((2u).xxx > (1u).xxx); bool4 unnamed_141 = ((2.0).xxxx > (1.0).xxxx); bool unnamed_142 = (2 >= 1); bool unnamed_143 = (2u >= 1u); bool unnamed_144 = (2.0 >= 1.0); bool2 unnamed_145 = ((2).xx >= (1).xx); bool3 unnamed_146 = ((2u).xxx >= (1u).xxx); bool4 unnamed_147 = ((2.0).xxxx >= (1.0).xxxx); } void assignment() { int a_1 = 1; int3 vec0_ = int3(0, 0, 0); int _expr6 = a_1; a_1 = (_expr6 + 1); int _expr9 = a_1; a_1 = (_expr9 - 1); int _expr12 = a_1; int _expr13 = a_1; a_1 = (_expr12 * _expr13); int _expr15 = a_1; int _expr16 = a_1; a_1 = (_expr15 / _expr16); int _expr18 = a_1; a_1 = (_expr18 % 1); int _expr21 = a_1; a_1 = (_expr21 & 0); int _expr24 = a_1; a_1 = (_expr24 | 0); int _expr27 = a_1; a_1 = (_expr27 ^ 0); int _expr30 = a_1; a_1 = (_expr30 << 2u); int _expr33 = a_1; a_1 = (_expr33 >> 1u); int _expr36 = a_1; a_1 = (_expr36 + 1); int _expr39 = a_1; a_1 = (_expr39 - 1); int _expr46 = vec0_.y; vec0_.y = (_expr46 + 1); int _expr51 = vec0_.y; vec0_.y = (_expr51 - 1); return; } [numthreads(1, 1, 1)] void main() { const float4 _e4 = builtins(); const float4 _e5 = splat(); const float3 _e7 = bool_cast(float4(1.0, 1.0, 1.0, 1.0).xyz); const float _e8 = constructors(); logical(); arithmetic(); bit(); comparison(); assignment(); return; } ================================================ FILE: lib/naga/tests/out/hlsl/operators.hlsl.config ================================================ vertex=() fragment=() compute=(main:cs_5_1 ) ================================================ FILE: lib/naga/tests/out/hlsl/padding.hlsl ================================================ struct S { float3 a; int _end_pad_0; }; struct Test { S a; float b; int _end_pad_0; int _end_pad_1; int _end_pad_2; }; struct Test2_ { float3 a[2]; int _pad1_0; float b; int _end_pad_0; int _end_pad_1; int _end_pad_2; }; struct Test3_ { row_major float4x3 a; int _pad1_0; float b; int _end_pad_0; int _end_pad_1; int _end_pad_2; }; cbuffer input1_ : register(b0) { Test input1_; } cbuffer input2_ : register(b1) { Test2_ input2_; } cbuffer input3_ : register(b2) { Test3_ input3_; } float4 vertex() : SV_Position { float _expr6 = input1_.b; float _expr9 = input2_.b; float _expr12 = input3_.b; return ((((1.0).xxxx * _expr6) * _expr9) * _expr12); } ================================================ FILE: lib/naga/tests/out/hlsl/padding.hlsl.config ================================================ vertex=(vertex:vs_5_1 ) fragment=() compute=() ================================================ FILE: lib/naga/tests/out/hlsl/push-constants.hlsl ================================================ struct NagaConstants { int base_vertex; int base_instance; uint other; }; ConstantBuffer _NagaConstants: register(b0, space1); struct PushConstants { float multiplier; }; struct FragmentIn { float4 color : LOC0; }; ConstantBuffer pc: register(b0); struct FragmentInput_main { float4 color : LOC0; }; float4 vert_main(float2 pos : LOC0, uint vi : SV_VertexID) : SV_Position { float _expr5 = pc.multiplier; return float4(((float((_NagaConstants.base_vertex + vi)) * _expr5) * pos), 0.0, 1.0); } float4 main(FragmentInput_main fragmentinput_main) : SV_Target0 { FragmentIn in_ = { fragmentinput_main.color }; float _expr4 = pc.multiplier; return (in_.color * _expr4); } ================================================ FILE: lib/naga/tests/out/hlsl/push-constants.hlsl.config ================================================ vertex=(vert_main:vs_5_1 ) fragment=(main:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/quad-vert.hlsl ================================================ struct gl_PerVertex { float4 gl_Position : SV_Position; float gl_PointSize : PSIZE; float gl_ClipDistance[1] : SV_ClipDistance; float gl_CullDistance[1] : SV_CullDistance; }; struct type_9 { float2 member : LOC0; float4 gl_Position : SV_Position; }; typedef float ret_Constructarray1_float_[1]; ret_Constructarray1_float_ Constructarray1_float_(float arg0) { float ret[1] = { arg0 }; return ret; } gl_PerVertex Constructgl_PerVertex(float4 arg0, float arg1, float arg2[1], float arg3[1]) { gl_PerVertex ret = (gl_PerVertex)0; ret.gl_Position = arg0; ret.gl_PointSize = arg1; ret.gl_ClipDistance = arg2; ret.gl_CullDistance = arg3; return ret; } static float2 v_uv = (float2)0; static float2 a_uv_1 = (float2)0; static gl_PerVertex perVertexStruct = Constructgl_PerVertex(float4(0.0, 0.0, 0.0, 1.0), 1.0, Constructarray1_float_(0.0), Constructarray1_float_(0.0)); static float2 a_pos_1 = (float2)0; struct VertexOutput_main { float2 member : LOC0; float4 gl_Position : SV_Position; }; void main_1() { float2 _expr12 = a_uv_1; v_uv = _expr12; float2 _expr13 = a_pos_1; perVertexStruct.gl_Position = float4(_expr13.x, _expr13.y, 0.0, 1.0); return; } type_9 Constructtype_9(float2 arg0, float4 arg1) { type_9 ret = (type_9)0; ret.member = arg0; ret.gl_Position = arg1; return ret; } VertexOutput_main main(float2 a_uv : LOC1, float2 a_pos : LOC0) { a_uv_1 = a_uv; a_pos_1 = a_pos; main_1(); float2 _expr7 = v_uv; float4 _expr8 = perVertexStruct.gl_Position; const type_9 type_9_ = Constructtype_9(_expr7, _expr8); const VertexOutput_main type_9_1 = { type_9_.member, type_9_.gl_Position }; return type_9_1; } ================================================ FILE: lib/naga/tests/out/hlsl/quad-vert.hlsl.config ================================================ vertex=(main:vs_5_1 ) fragment=() compute=() ================================================ FILE: lib/naga/tests/out/hlsl/quad.hlsl ================================================ static const float c_scale = 1.2000000476837158; struct VertexOutput { float2 uv : LOC0; float4 position : SV_Position; }; Texture2D u_texture : register(t0); SamplerState u_sampler : register(s1); struct VertexOutput_vert_main { float2 uv_2 : LOC0; float4 position : SV_Position; }; struct FragmentInput_frag_main { float2 uv_3 : LOC0; }; VertexOutput ConstructVertexOutput(float2 arg0, float4 arg1) { VertexOutput ret = (VertexOutput)0; ret.uv = arg0; ret.position = arg1; return ret; } VertexOutput_vert_main vert_main(float2 pos : LOC0, float2 uv : LOC1) { const VertexOutput vertexoutput = ConstructVertexOutput(uv, float4((c_scale * pos), 0.0, 1.0)); const VertexOutput_vert_main vertexoutput_1 = { vertexoutput.uv, vertexoutput.position }; return vertexoutput_1; } float4 frag_main(FragmentInput_frag_main fragmentinput_frag_main) : SV_Target0 { float2 uv_1 = fragmentinput_frag_main.uv_3; float4 color = u_texture.Sample(u_sampler, uv_1); if ((color.w == 0.0)) { discard; } float4 premultiplied = (color.w * color); return premultiplied; } float4 fs_extra() : SV_Target0 { return float4(0.0, 0.5, 0.0, 0.5); } ================================================ FILE: lib/naga/tests/out/hlsl/quad.hlsl.config ================================================ vertex=(vert_main:vs_5_1 ) fragment=(frag_main:ps_5_1 fs_extra:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/shadow.hlsl ================================================ static const float3 c_ambient = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); static const uint c_max_lights = 10; struct Globals { row_major float4x4 view_proj; uint4 num_lights; }; struct Entity { row_major float4x4 world; float4 color; }; struct VertexOutput { float4 proj_position : SV_Position; float3 world_normal : LOC0; float4 world_position : LOC1; }; struct Light { row_major float4x4 proj; float4 pos; float4 color; }; cbuffer u_globals : register(b0) { Globals u_globals; } cbuffer u_entity : register(b0, space1) { Entity u_entity; } ByteAddressBuffer s_lights : register(t1); cbuffer u_lights : register(b1) { Light u_lights[10]; } Texture2DArray t_shadow : register(t2); SamplerComparisonState sampler_shadow : register(s3); struct VertexOutput_vs_main { float3 world_normal : LOC0; float4 world_position : LOC1; float4 proj_position : SV_Position; }; struct FragmentInput_fs_main { float3 world_normal_1 : LOC0; float4 world_position_1 : LOC1; float4 proj_position_1 : SV_Position; }; struct FragmentInput_fs_main_without_storage { float3 world_normal_2 : LOC0; float4 world_position_2 : LOC1; float4 proj_position_2 : SV_Position; }; float fetch_shadow(uint light_id, float4 homogeneous_coords) { if ((homogeneous_coords.w <= 0.0)) { return 1.0; } float2 flip_correction = float2(0.5, -0.5); float proj_correction = (1.0 / homogeneous_coords.w); float2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + float2(0.5, 0.5)); float _expr28 = t_shadow.SampleCmpLevelZero(sampler_shadow, float3(light_local, int(light_id)), (homogeneous_coords.z * proj_correction)); return _expr28; } VertexOutput_vs_main vs_main(int4 position : LOC0, int4 normal : LOC1) { VertexOutput out_ = (VertexOutput)0; float4x4 w = u_entity.world; float4x4 _expr7 = u_entity.world; float4 world_pos = mul(float4(position), _expr7); out_.world_normal = mul(float3(normal.xyz), float3x3(w[0].xyz, w[1].xyz, w[2].xyz)); out_.world_position = world_pos; float4x4 _expr25 = u_globals.view_proj; out_.proj_position = mul(world_pos, _expr25); VertexOutput _expr27 = out_; const VertexOutput vertexoutput = _expr27; const VertexOutput_vs_main vertexoutput_1 = { vertexoutput.world_normal, vertexoutput.world_position, vertexoutput.proj_position }; return vertexoutput_1; } Light ConstructLight(float4x4 arg0, float4 arg1, float4 arg2) { Light ret = (Light)0; ret.proj = arg0; ret.pos = arg1; ret.color = arg2; return ret; } float4 fs_main(FragmentInput_fs_main fragmentinput_fs_main) : SV_Target0 { VertexOutput in_ = { fragmentinput_fs_main.proj_position_1, fragmentinput_fs_main.world_normal_1, fragmentinput_fs_main.world_position_1 }; float3 color = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); uint i = 0u; float3 normal_1 = normalize(in_.world_normal); bool loop_init = true; while(true) { if (!loop_init) { uint _expr20 = i; i = (_expr20 + 1u); } loop_init = false; uint _expr14 = i; uint _expr17 = u_globals.num_lights.x; if ((_expr14 < min(_expr17, c_max_lights))) { } else { break; } uint _expr23 = i; Light light = ConstructLight(float4x4(asfloat(s_lights.Load4(_expr23*96+0+0)), asfloat(s_lights.Load4(_expr23*96+0+16)), asfloat(s_lights.Load4(_expr23*96+0+32)), asfloat(s_lights.Load4(_expr23*96+0+48))), asfloat(s_lights.Load4(_expr23*96+64)), asfloat(s_lights.Load4(_expr23*96+80))); uint _expr26 = i; const float _e30 = fetch_shadow(_expr26, mul(in_.world_position, light.proj)); float3 light_dir = normalize((light.pos.xyz - in_.world_position.xyz)); float diffuse = max(0.0, dot(normal_1, light_dir)); float3 _expr40 = color; color = (_expr40 + ((_e30 * diffuse) * light.color.xyz)); } float3 _expr46 = color; float4 _expr50 = u_entity.color; return (float4(_expr46, 1.0) * _expr50); } float4 fs_main_without_storage(FragmentInput_fs_main_without_storage fragmentinput_fs_main_without_storage) : SV_Target0 { VertexOutput in_1 = { fragmentinput_fs_main_without_storage.proj_position_2, fragmentinput_fs_main_without_storage.world_normal_2, fragmentinput_fs_main_without_storage.world_position_2 }; float3 color_1 = float3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); uint i_1 = 0u; float3 normal_2 = normalize(in_1.world_normal); bool loop_init_1 = true; while(true) { if (!loop_init_1) { uint _expr20 = i_1; i_1 = (_expr20 + 1u); } loop_init_1 = false; uint _expr14 = i_1; uint _expr17 = u_globals.num_lights.x; if ((_expr14 < min(_expr17, c_max_lights))) { } else { break; } uint _expr23 = i_1; Light light_1 = u_lights[_expr23]; uint _expr26 = i_1; const float _e30 = fetch_shadow(_expr26, mul(in_1.world_position, light_1.proj)); float3 light_dir_1 = normalize((light_1.pos.xyz - in_1.world_position.xyz)); float diffuse_1 = max(0.0, dot(normal_2, light_dir_1)); float3 _expr40 = color_1; color_1 = (_expr40 + ((_e30 * diffuse_1) * light_1.color.xyz)); } float3 _expr46 = color_1; float4 _expr50 = u_entity.color; return (float4(_expr46, 1.0) * _expr50); } ================================================ FILE: lib/naga/tests/out/hlsl/shadow.hlsl.config ================================================ vertex=(vs_main:vs_5_1 ) fragment=(fs_main:ps_5_1 fs_main_without_storage:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/skybox.hlsl ================================================ struct NagaConstants { int base_vertex; int base_instance; uint other; }; ConstantBuffer _NagaConstants: register(b1); struct VertexOutput { float4 position : SV_Position; float3 uv : LOC0; }; struct Data { row_major float4x4 proj_inv; row_major float4x4 view; }; cbuffer r_data : register(b0) { Data r_data; } TextureCube r_texture : register(t0); SamplerState r_sampler : register(s0, space1); struct VertexOutput_vs_main { float3 uv : LOC0; float4 position : SV_Position; }; struct FragmentInput_fs_main { float3 uv_1 : LOC0; float4 position_1 : SV_Position; }; VertexOutput ConstructVertexOutput(float4 arg0, float3 arg1) { VertexOutput ret = (VertexOutput)0; ret.position = arg0; ret.uv = arg1; return ret; } VertexOutput_vs_main vs_main(uint vertex_index : SV_VertexID) { int tmp1_ = (int)0; int tmp2_ = (int)0; tmp1_ = (int((_NagaConstants.base_vertex + vertex_index)) / 2); tmp2_ = (int((_NagaConstants.base_vertex + vertex_index)) & 1); int _expr10 = tmp1_; int _expr16 = tmp2_; float4 pos = float4(((float(_expr10) * 4.0) - 1.0), ((float(_expr16) * 4.0) - 1.0), 0.0, 1.0); float4 _expr27 = r_data.view[0]; float4 _expr31 = r_data.view[1]; float4 _expr35 = r_data.view[2]; float3x3 inv_model_view = transpose(float3x3(_expr27.xyz, _expr31.xyz, _expr35.xyz)); float4x4 _expr40 = r_data.proj_inv; float4 unprojected = mul(pos, _expr40); const VertexOutput vertexoutput = ConstructVertexOutput(pos, mul(unprojected.xyz, inv_model_view)); const VertexOutput_vs_main vertexoutput_1 = { vertexoutput.uv, vertexoutput.position }; return vertexoutput_1; } float4 fs_main(FragmentInput_fs_main fragmentinput_fs_main) : SV_Target0 { VertexOutput in_ = { fragmentinput_fs_main.position_1, fragmentinput_fs_main.uv_1 }; float4 _expr5 = r_texture.Sample(r_sampler, in_.uv); return _expr5; } ================================================ FILE: lib/naga/tests/out/hlsl/skybox.hlsl.config ================================================ vertex=(vs_main:vs_5_1 ) fragment=(fs_main:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/standard.hlsl ================================================ struct FragmentInput_derivatives { float4 foo_1 : SV_Position; }; float4 derivatives(FragmentInput_derivatives fragmentinput_derivatives) : SV_Target0 { float4 foo = fragmentinput_derivatives.foo_1; float4 x = ddx(foo); float4 y = ddy(foo); float4 z = fwidth(foo); return ((x + y) * z); } ================================================ FILE: lib/naga/tests/out/hlsl/standard.hlsl.config ================================================ vertex=() fragment=(derivatives:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/hlsl/texture-arg.hlsl ================================================ Texture2D Texture : register(t0); SamplerState Sampler : register(s1); float4 test(Texture2D Passed_Texture, SamplerState Passed_Sampler) { float4 _expr7 = Passed_Texture.Sample(Passed_Sampler, float2(0.0, 0.0)); return _expr7; } float4 main() : SV_Target0 { const float4 _e2 = test(Texture, Sampler); return _e2; } ================================================ FILE: lib/naga/tests/out/hlsl/texture-arg.hlsl.config ================================================ vertex=() fragment=(main:ps_5_1 ) compute=() ================================================ FILE: lib/naga/tests/out/ir/collatz.ron ================================================ ( types: [ ( name: None, inner: Scalar( kind: Uint, width: 4, ), ), ( name: None, inner: Array( base: 1, size: Dynamic, stride: 4, ), ), ( name: Some("PrimeIndices"), inner: Struct( members: [ ( name: Some("data"), ty: 2, binding: None, offset: 0, ), ], span: 4, ), ), ( name: None, inner: Vector( size: Tri, kind: Uint, width: 4, ), ), ], constants: [ ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(3), ), ), ], global_variables: [ ( name: Some("v_indices"), space: Storage( access: ( bits: 3, ), ), binding: Some(( group: 0, binding: 0, )), ty: 3, init: None, ), ], functions: [ ( name: Some("collatz_iterations"), arguments: [ ( name: Some("n_base"), ty: 1, binding: None, ), ], result: Some(( ty: 1, binding: None, )), local_variables: [ ( name: Some("n"), ty: 1, init: None, ), ( name: Some("i"), ty: 1, init: Some(1), ), ], expressions: [ GlobalVariable(1), FunctionArgument(0), LocalVariable(1), Constant(1), LocalVariable(2), Load( pointer: 3, ), Constant(2), Binary( op: Greater, left: 6, right: 7, ), Load( pointer: 3, ), Constant(3), Binary( op: Modulo, left: 9, right: 10, ), Constant(1), Binary( op: Equal, left: 11, right: 12, ), Load( pointer: 3, ), Constant(3), Binary( op: Divide, left: 14, right: 15, ), Constant(4), Load( pointer: 3, ), Binary( op: Multiply, left: 17, right: 18, ), Constant(2), Binary( op: Add, left: 19, right: 20, ), Load( pointer: 5, ), Constant(2), Binary( op: Add, left: 22, right: 23, ), Load( pointer: 5, ), ], named_expressions: {}, body: [ Store( pointer: 3, value: 2, ), Loop( body: [ Emit(( start: 5, end: 6, )), Emit(( start: 7, end: 8, )), If( condition: 8, accept: [], reject: [ Break, ], ), Emit(( start: 8, end: 9, )), Emit(( start: 10, end: 11, )), Emit(( start: 12, end: 13, )), If( condition: 13, accept: [ Emit(( start: 13, end: 14, )), Emit(( start: 15, end: 16, )), Store( pointer: 3, value: 16, ), ], reject: [ Emit(( start: 17, end: 19, )), Emit(( start: 20, end: 21, )), Store( pointer: 3, value: 21, ), ], ), Emit(( start: 21, end: 22, )), Emit(( start: 23, end: 24, )), Store( pointer: 5, value: 24, ), ], continuing: [], break_if: None, ), Emit(( start: 24, end: 25, )), Return( value: Some(25), ), ], ), ], entry_points: [ ( name: "main", stage: Compute, early_depth_test: None, workgroup_size: (1, 1, 1), function: ( name: Some("main"), arguments: [ ( name: Some("global_id"), ty: 4, binding: Some(BuiltIn(GlobalInvocationId)), ), ], result: None, local_variables: [], expressions: [ GlobalVariable(1), FunctionArgument(0), AccessIndex( base: 1, index: 0, ), AccessIndex( base: 2, index: 0, ), Access( base: 3, index: 4, ), AccessIndex( base: 1, index: 0, ), AccessIndex( base: 2, index: 0, ), Access( base: 6, index: 7, ), Load( pointer: 8, ), CallResult(1), ], named_expressions: {}, body: [ Emit(( start: 2, end: 9, )), Call( function: 1, arguments: [ 9, ], result: Some(10), ), Store( pointer: 5, value: 10, ), Return( value: None, ), ], ), ), ], ) ================================================ FILE: lib/naga/tests/out/ir/shadow.ron ================================================ ( types: [ ( name: None, inner: Scalar( kind: Float, width: 4, ), ), ( name: None, inner: Vector( size: Tri, kind: Float, width: 4, ), ), ( name: None, inner: Scalar( kind: Uint, width: 4, ), ), ( name: None, inner: Vector( size: Quad, kind: Float, width: 4, ), ), ( name: None, inner: Scalar( kind: Bool, width: 1, ), ), ( name: None, inner: Vector( size: Bi, kind: Float, width: 4, ), ), ( name: None, inner: Image( dim: D2, arrayed: true, class: Sampled( kind: Float, multi: false, ), ), ), ( name: None, inner: Sampler( comparison: false, ), ), ( name: None, inner: Scalar( kind: Sint, width: 4, ), ), ( name: None, inner: Pointer( base: 2, space: Function, ), ), ( name: None, inner: Pointer( base: 3, space: Function, ), ), ( name: None, inner: Vector( size: Quad, kind: Uint, width: 4, ), ), ( name: Some("Globals"), inner: Struct( members: [ ( name: Some("num_lights"), ty: 12, binding: None, offset: 0, ), ], span: 16, ), ), ( name: None, inner: Pointer( base: 13, space: Uniform, ), ), ( name: None, inner: Pointer( base: 12, space: Uniform, ), ), ( name: None, inner: Pointer( base: 3, space: Uniform, ), ), ( name: None, inner: Matrix( columns: Quad, rows: Quad, width: 4, ), ), ( name: Some("Light"), inner: Struct( members: [ ( name: Some("proj"), ty: 17, binding: None, offset: 0, ), ( name: Some("pos"), ty: 4, binding: None, offset: 64, ), ( name: Some("color"), ty: 4, binding: None, offset: 80, ), ], span: 96, ), ), ( name: None, inner: Array( base: 18, size: Dynamic, stride: 96, ), ), ( name: Some("Lights"), inner: Struct( members: [ ( name: Some("data"), ty: 19, binding: None, offset: 0, ), ], span: 96, ), ), ( name: None, inner: Pointer( base: 20, space: Storage( access: ( bits: 0, ), ), ), ), ( name: None, inner: Pointer( base: 19, space: Storage( access: ( bits: 3, ), ), ), ), ( name: None, inner: Pointer( base: 18, space: Storage( access: ( bits: 3, ), ), ), ), ( name: None, inner: Pointer( base: 17, space: Storage( access: ( bits: 3, ), ), ), ), ( name: None, inner: Pointer( base: 4, space: Private, ), ), ( name: None, inner: Pointer( base: 2, space: Private, ), ), ( name: None, inner: Pointer( base: 4, space: Storage( access: ( bits: 3, ), ), ), ), ( name: None, inner: Pointer( base: 1, space: Storage( access: ( bits: 3, ), ), ), ), ( name: None, inner: Pointer( base: 1, space: Private, ), ), ( name: None, inner: Image( dim: D2, arrayed: true, class: Depth( multi: false, ), ), ), ( name: None, inner: Sampler( comparison: true, ), ), ], constants: [ ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(3), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(0.0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(1.0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(0.5), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(-0.5), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(0.05000000074505806), ), ), ( name: None, specialization: None, inner: Composite( ty: 2, components: [ 9, 9, 9, ], ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(10), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Uint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Float(0.0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(1), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(0), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ( name: None, specialization: None, inner: Scalar( width: 4, value: Sint(2), ), ), ], global_variables: [ ( name: Some("t_shadow"), space: Handle, binding: Some(( group: 0, binding: 2, )), ty: 30, init: None, ), ( name: Some("sampler_shadow"), space: Handle, binding: Some(( group: 0, binding: 3, )), ty: 31, init: None, ), ( name: Some("u_globals"), space: Uniform, binding: Some(( group: 0, binding: 0, )), ty: 13, init: None, ), ( name: Some("s_lights"), space: Storage( access: ( bits: 1, ), ), binding: Some(( group: 0, binding: 1, )), ty: 20, init: None, ), ( name: Some("in_position_fs"), space: Private, binding: None, ty: 4, init: None, ), ( name: Some("in_normal_fs"), space: Private, binding: None, ty: 2, init: None, ), ( name: Some("out_color_fs"), space: Private, binding: None, ty: 4, init: None, ), ], functions: [ ( name: None, arguments: [ ( name: None, ty: 3, binding: None, ), ( name: None, ty: 4, binding: None, ), ], result: Some(( ty: 1, binding: None, )), local_variables: [], expressions: [ GlobalVariable(3), GlobalVariable(6), GlobalVariable(5), GlobalVariable(1), GlobalVariable(2), GlobalVariable(4), GlobalVariable(7), Constant(1), Constant(2), Constant(3), Constant(4), Constant(20), Constant(7), Constant(33), Constant(31), Constant(29), Constant(27), Constant(25), Constant(15), Constant(12), Constant(23), Constant(8), Constant(36), Constant(34), Constant(14), Constant(32), Constant(30), Constant(17), Constant(26), Constant(39), Constant(13), Constant(11), Constant(9), Constant(6), Constant(21), Constant(35), Constant(19), Constant(37), Constant(18), Constant(28), Constant(16), Constant(24), Constant(38), Constant(22), Constant(10), Constant(5), FunctionArgument(0), FunctionArgument(1), AccessIndex( base: 48, index: 3, ), Binary( op: LessEqual, left: 49, right: 46, ), AccessIndex( base: 48, index: 0, ), AccessIndex( base: 48, index: 1, ), Compose( ty: 6, components: [ 51, 52, ], ), Compose( ty: 6, components: [ 13, 22, ], ), Binary( op: Multiply, left: 53, right: 54, ), AccessIndex( base: 48, index: 3, ), Binary( op: Divide, left: 34, right: 56, ), Binary( op: Multiply, left: 55, right: 57, ), Splat( size: Bi, value: 13, ), Binary( op: Add, left: 58, right: 59, ), AccessIndex( base: 60, index: 0, ), AccessIndex( base: 60, index: 1, ), As( expr: 47, kind: Sint, convert: None, ), As( expr: 63, kind: Float, convert: Some(4), ), Compose( ty: 2, components: [ 61, 62, 64, ], ), AccessIndex( base: 48, index: 2, ), AccessIndex( base: 48, index: 3, ), Binary( op: Divide, left: 34, right: 67, ), Binary( op: Multiply, left: 66, right: 68, ), AccessIndex( base: 65, index: 0, ), AccessIndex( base: 65, index: 1, ), Compose( ty: 6, components: [ 70, 71, ], ), AccessIndex( base: 65, index: 2, ), As( expr: 73, kind: Sint, convert: Some(4), ), ImageSample( image: 4, sampler: 5, gather: None, coordinate: 72, array_index: Some(74), offset: None, level: Zero, depth_ref: Some(69), ), ], named_expressions: {}, body: [ Emit(( start: 48, end: 50, )), If( condition: 50, accept: [ Return( value: Some(34), ), ], reject: [], ), Emit(( start: 50, end: 75, )), Return( value: Some(75), ), ], ), ( name: Some("fs_main"), arguments: [], result: None, local_variables: [ ( name: Some("color"), ty: 2, init: Some(10), ), ( name: Some("i"), ty: 3, init: Some(12), ), ], expressions: [ GlobalVariable(3), GlobalVariable(6), GlobalVariable(5), GlobalVariable(1), GlobalVariable(2), GlobalVariable(4), GlobalVariable(7), Constant(1), Constant(2), Constant(3), Constant(4), Constant(20), Constant(7), Constant(33), Constant(31), Constant(29), Constant(27), Constant(25), Constant(15), Constant(12), Constant(23), Constant(8), Constant(36), Constant(34), Constant(14), Constant(32), Constant(30), Constant(17), Constant(26), Constant(39), Constant(13), Constant(11), Constant(9), Constant(6), Constant(21), Constant(35), Constant(19), Constant(37), Constant(18), Constant(28), Constant(16), Constant(24), Constant(38), Constant(22), Constant(10), Constant(5), LocalVariable(1), LocalVariable(2), Load( pointer: 48, ), AccessIndex( base: 1, index: 0, ), Access( base: 50, index: 41, ), Load( pointer: 51, ), Math( fun: Min, arg: 52, arg1: Some(32), arg2: None, arg3: None, ), Binary( op: GreaterEqual, left: 49, right: 53, ), Load( pointer: 47, ), Load( pointer: 48, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 57, index: 58, ), AccessIndex( base: 59, index: 0, ), Load( pointer: 60, ), Load( pointer: 3, ), Binary( op: Multiply, left: 61, right: 62, ), CallResult(1), Load( pointer: 2, ), Math( fun: Normalize, arg: 65, arg1: None, arg2: None, arg3: None, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 67, index: 68, ), AccessIndex( base: 69, index: 1, ), Access( base: 70, index: 35, ), Load( pointer: 71, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 73, index: 74, ), AccessIndex( base: 75, index: 1, ), Access( base: 76, index: 42, ), Load( pointer: 77, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 79, index: 80, ), AccessIndex( base: 81, index: 1, ), Access( base: 82, index: 17, ), Load( pointer: 83, ), Compose( ty: 2, components: [ 72, 78, 84, ], ), Access( base: 3, index: 40, ), Load( pointer: 86, ), Access( base: 3, index: 16, ), Load( pointer: 88, ), Access( base: 3, index: 27, ), Load( pointer: 90, ), Compose( ty: 2, components: [ 87, 89, 91, ], ), Binary( op: Subtract, left: 85, right: 92, ), Math( fun: Normalize, arg: 93, arg1: None, arg2: None, arg3: None, ), Math( fun: Dot, arg: 66, arg1: Some(94), arg2: None, arg3: None, ), Math( fun: Max, arg: 46, arg1: Some(95), arg2: None, arg3: None, ), Binary( op: Multiply, left: 64, right: 96, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 98, index: 99, ), AccessIndex( base: 100, index: 2, ), Access( base: 101, index: 14, ), Load( pointer: 102, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 104, index: 105, ), AccessIndex( base: 106, index: 2, ), Access( base: 107, index: 23, ), Load( pointer: 108, ), AccessIndex( base: 6, index: 0, ), Load( pointer: 48, ), Access( base: 110, index: 111, ), AccessIndex( base: 112, index: 2, ), Access( base: 113, index: 30, ), Load( pointer: 114, ), Compose( ty: 2, components: [ 103, 109, 115, ], ), Binary( op: Multiply, left: 116, right: 97, ), Binary( op: Add, left: 55, right: 117, ), Load( pointer: 48, ), Binary( op: Add, left: 119, right: 31, ), Load( pointer: 47, ), Compose( ty: 4, components: [ 121, 34, ], ), ], named_expressions: {}, body: [ Loop( body: [ Emit(( start: 48, end: 54, )), If( condition: 54, accept: [ Break, ], reject: [], ), Emit(( start: 54, end: 63, )), Call( function: 1, arguments: [ 56, 63, ], result: Some(64), ), Emit(( start: 64, end: 118, )), Store( pointer: 47, value: 118, ), Continue, ], continuing: [ Emit(( start: 118, end: 120, )), Store( pointer: 48, value: 120, ), ], break_if: None, ), Emit(( start: 120, end: 122, )), Store( pointer: 7, value: 122, ), Return( value: None, ), ], ), ], entry_points: [ ( name: "fs_main", stage: Fragment, early_depth_test: None, workgroup_size: (0, 0, 0), function: ( name: Some("fs_main_wrap"), arguments: [ ( name: Some("in_normal_fs"), ty: 2, binding: Some(Location( location: 0, interpolation: Some(Perspective), sampling: Some(Center), )), ), ( name: Some("in_position_fs"), ty: 4, binding: Some(Location( location: 1, interpolation: Some(Perspective), sampling: Some(Center), )), ), ], result: Some(( ty: 4, binding: Some(Location( location: 0, interpolation: Some(Perspective), sampling: Some(Center), )), )), local_variables: [], expressions: [ FunctionArgument(0), GlobalVariable(6), FunctionArgument(1), GlobalVariable(5), GlobalVariable(7), Load( pointer: 5, ), ], named_expressions: {}, body: [ Store( pointer: 2, value: 1, ), Store( pointer: 4, value: 3, ), Call( function: 2, arguments: [], result: None, ), Emit(( start: 5, end: 6, )), Return( value: Some(6), ), ], ), ), ], ) ================================================ FILE: lib/naga/tests/out/msl/access.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size1; }; struct GlobalConst { uint a; char _pad1[12]; metal::packed_uint3 b; int c; }; struct AlignedWrapper { int value; }; struct type_5 { metal::float2x2 inner[2]; }; struct type_8 { metal::uint2 inner[2]; }; typedef AlignedWrapper type_9[1]; struct Bar { metal::float4x3 _matrix; type_5 matrix_array; metal::atomic_int atom; char _pad3[4]; type_8 arr; type_9 data; }; struct Baz { metal::float3x2 m; }; struct type_13 { metal::float4x2 inner[2]; }; struct MatCx2InArray { type_13 am; }; struct type_17 { float inner[10]; }; struct type_18 { type_17 inner[5]; }; struct type_21 { int inner[5]; }; constant metal::uint3 const_type_1_ = {0u, 0u, 0u}; constant GlobalConst const_GlobalConst = {0u, {}, const_type_1_, 0}; constant metal::float2 const_type_14_ = {0.0, 0.0}; constant metal::float4x2 const_type_12_ = {const_type_14_, const_type_14_, const_type_14_, const_type_14_}; constant type_13 const_type_13_ = {const_type_12_, const_type_12_}; constant type_17 const_type_17_ = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; constant type_18 const_type_18_ = {const_type_17_, const_type_17_, const_type_17_, const_type_17_, const_type_17_}; constant metal::int2 const_type_11_ = {0, 0}; void test_matrix_within_struct_accesses( constant Baz& baz ) { int idx = 1; Baz t = {}; int _e6 = idx; idx = _e6 - 1; metal::float3x2 unnamed = baz.m; metal::float2 unnamed_1 = baz.m[0]; int _e16 = idx; metal::float2 unnamed_2 = baz.m[_e16]; float unnamed_3 = baz.m[0].y; int _e28 = idx; float unnamed_4 = baz.m[0][_e28]; int _e32 = idx; float unnamed_5 = baz.m[_e32].y; int _e38 = idx; int _e40 = idx; float unnamed_6 = baz.m[_e38][_e40]; t = Baz {metal::float3x2(metal::float2(1.0), metal::float2(2.0), metal::float2(3.0))}; int _e52 = idx; idx = _e52 + 1; t.m = metal::float3x2(metal::float2(6.0), metal::float2(5.0), metal::float2(4.0)); t.m[0] = metal::float2(9.0); int _e69 = idx; t.m[_e69] = metal::float2(90.0); t.m[0].y = 10.0; int _e82 = idx; t.m[0][_e82] = 20.0; int _e86 = idx; t.m[_e86].y = 30.0; int _e92 = idx; int _e94 = idx; t.m[_e92][_e94] = 40.0; return; } void test_matrix_within_array_within_struct_accesses( constant MatCx2InArray& nested_mat_cx2_ ) { int idx_1 = 1; MatCx2InArray t_1 = {}; int _e7 = idx_1; idx_1 = _e7 - 1; type_13 unnamed_7 = nested_mat_cx2_.am; metal::float4x2 unnamed_8 = nested_mat_cx2_.am.inner[0]; metal::float2 unnamed_9 = nested_mat_cx2_.am.inner[0][0]; int _e25 = idx_1; metal::float2 unnamed_10 = nested_mat_cx2_.am.inner[0][_e25]; float unnamed_11 = nested_mat_cx2_.am.inner[0][0].y; int _e41 = idx_1; float unnamed_12 = nested_mat_cx2_.am.inner[0][0][_e41]; int _e47 = idx_1; float unnamed_13 = nested_mat_cx2_.am.inner[0][_e47].y; int _e55 = idx_1; int _e57 = idx_1; float unnamed_14 = nested_mat_cx2_.am.inner[0][_e55][_e57]; t_1 = MatCx2InArray {const_type_13_}; int _e63 = idx_1; idx_1 = _e63 + 1; for(int _i=0; _i<2; ++_i) t_1.am.inner[_i] = const_type_13_.inner[_i]; t_1.am.inner[0] = metal::float4x2(metal::float2(8.0), metal::float2(7.0), metal::float2(6.0), metal::float2(5.0)); t_1.am.inner[0][0] = metal::float2(9.0); int _e90 = idx_1; t_1.am.inner[0][_e90] = metal::float2(90.0); t_1.am.inner[0][0].y = 10.0; int _e107 = idx_1; t_1.am.inner[0][0][_e107] = 20.0; int _e113 = idx_1; t_1.am.inner[0][_e113].y = 30.0; int _e121 = idx_1; int _e123 = idx_1; t_1.am.inner[0][_e121][_e123] = 40.0; return; } float read_from_private( thread float& foo_1 ) { float _e6 = foo_1; return _e6; } float test_arr_as_arg( type_18 a ) { return a.inner[4].inner[9]; } void assign_through_ptr_fn( threadgroup uint& p ) { p = 42u; return; } struct foo_vertInput { }; struct foo_vertOutput { metal::float4 member [[position]]; }; vertex foo_vertOutput foo_vert( uint vi [[vertex_id]] , device Bar const& bar [[buffer(0)]] , constant Baz& baz [[buffer(1)]] , device metal::int2 const& qux [[buffer(2)]] , constant MatCx2InArray& nested_mat_cx2_ [[buffer(3)]] , constant _mslBufferSizes& _buffer_sizes [[buffer(24)]] ) { float foo = 0.0; type_21 c = {}; float baz_1 = foo; foo = 1.0; test_matrix_within_struct_accesses(baz); test_matrix_within_array_within_struct_accesses(nested_mat_cx2_); metal::float4x3 _matrix = bar._matrix; type_8 arr = bar.arr; float b = bar._matrix[3].x; int a_1 = bar.data[(1 + (_buffer_sizes.size1 - 120 - 8) / 8) - 2u].value; metal::int2 c_1 = qux; float _e32 = read_from_private(foo); for(int _i=0; _i<5; ++_i) c.inner[_i] = type_21 {a_1, static_cast(b), 3, 4, 5}.inner[_i]; c.inner[vi + 1u] = 42; int value = c.inner[vi]; float _e46 = test_arr_as_arg(const_type_18_); return foo_vertOutput { metal::float4(_matrix * static_cast(metal::int4(value)), 2.0) }; } struct foo_fragOutput { metal::float4 member_1 [[color(0)]]; }; fragment foo_fragOutput foo_frag( device Bar& bar [[buffer(0)]] , device metal::int2& qux [[buffer(2)]] , constant _mslBufferSizes& _buffer_sizes [[buffer(24)]] ) { bar._matrix[1].z = 1.0; bar._matrix = metal::float4x3(metal::float3(0.0), metal::float3(1.0), metal::float3(2.0), metal::float3(3.0)); for(int _i=0; _i<2; ++_i) bar.arr.inner[_i] = type_8 {metal::uint2(0u), metal::uint2(1u)}.inner[_i]; bar.data[1].value = 1; qux = const_type_11_; return foo_fragOutput { metal::float4(0.0) }; } kernel void atomics( device Bar& bar [[buffer(0)]] , constant _mslBufferSizes& _buffer_sizes [[buffer(24)]] ) { int tmp = {}; int value_1 = metal::atomic_load_explicit(&bar.atom, metal::memory_order_relaxed); int _e10 = metal::atomic_fetch_add_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e10; int _e13 = metal::atomic_fetch_sub_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e13; int _e16 = metal::atomic_fetch_and_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e16; int _e19 = metal::atomic_fetch_or_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e19; int _e22 = metal::atomic_fetch_xor_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e22; int _e25 = metal::atomic_fetch_min_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e25; int _e28 = metal::atomic_fetch_max_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e28; int _e31 = metal::atomic_exchange_explicit(&bar.atom, 5, metal::memory_order_relaxed); tmp = _e31; metal::atomic_store_explicit(&bar.atom, value_1, metal::memory_order_relaxed); return; } kernel void assign_through_ptr( threadgroup uint& val ) { assign_through_ptr_fn(val); return; } ================================================ FILE: lib/naga/tests/out/msl/binding-arrays.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct DefaultConstructible { template operator T() && { return T {}; } }; struct UniformIndex { uint index; }; struct FragmentIn { uint index; }; struct main_Input { uint index [[user(loc0), flat]]; }; struct main_Output { metal::float4 member [[color(0)]]; }; fragment main_Output main_( main_Input varyings [[stage_in]] , metal::array, 10> texture_array_unbounded [[texture(0)]] , metal::array, 5> texture_array_bounded [[user(fake0)]] , metal::array, 5> texture_array_2darray [[user(fake0)]] , metal::array, 5> texture_array_multisampled [[user(fake0)]] , metal::array, 5> texture_array_depth [[user(fake0)]] , metal::array, 5> texture_array_storage [[user(fake0)]] , metal::array samp [[user(fake0)]] , metal::array samp_comp [[user(fake0)]] , constant UniformIndex& uni [[user(fake0)]] ) { const FragmentIn fragment_in = { varyings.index }; int i1_ = 0; metal::int2 i2_ = {}; float v1_ = 0.0; metal::float4 v4_ = {}; uint uniform_index = uni.index; uint non_uniform_index = fragment_in.index; i2_ = metal::int2(0); v4_ = metal::float4(0.0); metal::float2 uv = metal::float2(0.0); metal::int2 pix = metal::int2(0); metal::int2 _e27 = i2_; i2_ = _e27 + metal::int2(texture_array_unbounded[0].get_width(), texture_array_unbounded[0].get_height()); metal::int2 _e32 = i2_; i2_ = _e32 + metal::int2(texture_array_unbounded[uniform_index].get_width(), texture_array_unbounded[uniform_index].get_height()); metal::int2 _e36 = i2_; i2_ = _e36 + metal::int2(texture_array_unbounded[non_uniform_index].get_width(), texture_array_unbounded[non_uniform_index].get_height()); metal::float4 _e40 = v4_; metal::float4 _e45 = texture_array_bounded[0].gather(samp[0], uv); v4_ = _e40 + _e45; metal::float4 _e47 = v4_; metal::float4 _e50 = texture_array_bounded[uniform_index].gather(samp[uniform_index], uv); v4_ = _e47 + _e50; metal::float4 _e52 = v4_; metal::float4 _e55 = texture_array_bounded[non_uniform_index].gather(samp[non_uniform_index], uv); v4_ = _e52 + _e55; metal::float4 _e57 = v4_; metal::float4 _e63 = texture_array_depth[0].gather_compare(samp_comp[0], uv, 0.0); v4_ = _e57 + _e63; metal::float4 _e65 = v4_; metal::float4 _e69 = texture_array_depth[uniform_index].gather_compare(samp_comp[uniform_index], uv, 0.0); v4_ = _e65 + _e69; metal::float4 _e71 = v4_; metal::float4 _e75 = texture_array_depth[non_uniform_index].gather_compare(samp_comp[non_uniform_index], uv, 0.0); v4_ = _e71 + _e75; metal::float4 _e77 = v4_; metal::float4 _e81 = (uint(0) < texture_array_unbounded[0].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[0].get_width(0), texture_array_unbounded[0].get_height(0))) ? texture_array_unbounded[0].read(metal::uint2(pix), 0): DefaultConstructible()); v4_ = _e77 + _e81; metal::float4 _e83 = v4_; metal::float4 _e86 = (uint(0) < texture_array_unbounded[uniform_index].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[uniform_index].get_width(0), texture_array_unbounded[uniform_index].get_height(0))) ? texture_array_unbounded[uniform_index].read(metal::uint2(pix), 0): DefaultConstructible()); v4_ = _e83 + _e86; metal::float4 _e88 = v4_; metal::float4 _e91 = (uint(0) < texture_array_unbounded[non_uniform_index].get_num_mip_levels() && metal::all(metal::uint2(pix) < metal::uint2(texture_array_unbounded[non_uniform_index].get_width(0), texture_array_unbounded[non_uniform_index].get_height(0))) ? texture_array_unbounded[non_uniform_index].read(metal::uint2(pix), 0): DefaultConstructible()); v4_ = _e88 + _e91; int _e93 = i1_; i1_ = _e93 + int(texture_array_2darray[0].get_array_size()); int _e98 = i1_; i1_ = _e98 + int(texture_array_2darray[uniform_index].get_array_size()); int _e102 = i1_; i1_ = _e102 + int(texture_array_2darray[non_uniform_index].get_array_size()); int _e106 = i1_; i1_ = _e106 + int(texture_array_bounded[0].get_num_mip_levels()); int _e111 = i1_; i1_ = _e111 + int(texture_array_bounded[uniform_index].get_num_mip_levels()); int _e115 = i1_; i1_ = _e115 + int(texture_array_bounded[non_uniform_index].get_num_mip_levels()); int _e119 = i1_; i1_ = _e119 + int(texture_array_multisampled[0].get_num_samples()); int _e124 = i1_; i1_ = _e124 + int(texture_array_multisampled[uniform_index].get_num_samples()); int _e128 = i1_; i1_ = _e128 + int(texture_array_multisampled[non_uniform_index].get_num_samples()); metal::float4 _e132 = v4_; metal::float4 _e137 = texture_array_bounded[0].sample(samp[0], uv); v4_ = _e132 + _e137; metal::float4 _e139 = v4_; metal::float4 _e142 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv); v4_ = _e139 + _e142; metal::float4 _e144 = v4_; metal::float4 _e147 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv); v4_ = _e144 + _e147; metal::float4 _e149 = v4_; metal::float4 _e155 = texture_array_bounded[0].sample(samp[0], uv, metal::bias(0.0)); v4_ = _e149 + _e155; metal::float4 _e157 = v4_; metal::float4 _e161 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::bias(0.0)); v4_ = _e157 + _e161; metal::float4 _e163 = v4_; metal::float4 _e167 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::bias(0.0)); v4_ = _e163 + _e167; float _e169 = v1_; float _e175 = texture_array_depth[0].sample_compare(samp_comp[0], uv, 0.0); v1_ = _e169 + _e175; float _e177 = v1_; float _e181 = texture_array_depth[uniform_index].sample_compare(samp_comp[uniform_index], uv, 0.0); v1_ = _e177 + _e181; float _e183 = v1_; float _e187 = texture_array_depth[non_uniform_index].sample_compare(samp_comp[non_uniform_index], uv, 0.0); v1_ = _e183 + _e187; float _e189 = v1_; float _e195 = texture_array_depth[0].sample_compare(samp_comp[0], uv, 0.0); v1_ = _e189 + _e195; float _e197 = v1_; float _e201 = texture_array_depth[uniform_index].sample_compare(samp_comp[uniform_index], uv, 0.0); v1_ = _e197 + _e201; float _e203 = v1_; float _e207 = texture_array_depth[non_uniform_index].sample_compare(samp_comp[non_uniform_index], uv, 0.0); v1_ = _e203 + _e207; metal::float4 _e209 = v4_; metal::float4 _e214 = texture_array_bounded[0].sample(samp[0], uv, metal::gradient2d(uv, uv)); v4_ = _e209 + _e214; metal::float4 _e216 = v4_; metal::float4 _e219 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::gradient2d(uv, uv)); v4_ = _e216 + _e219; metal::float4 _e221 = v4_; metal::float4 _e224 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::gradient2d(uv, uv)); v4_ = _e221 + _e224; metal::float4 _e226 = v4_; metal::float4 _e232 = texture_array_bounded[0].sample(samp[0], uv, metal::level(0.0)); v4_ = _e226 + _e232; metal::float4 _e234 = v4_; metal::float4 _e238 = texture_array_bounded[uniform_index].sample(samp[uniform_index], uv, metal::level(0.0)); v4_ = _e234 + _e238; metal::float4 _e240 = v4_; metal::float4 _e244 = texture_array_bounded[non_uniform_index].sample(samp[non_uniform_index], uv, metal::level(0.0)); v4_ = _e240 + _e244; metal::float4 _e248 = v4_; if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[0].get_width(), texture_array_storage[0].get_height()))) { texture_array_storage[0].write(_e248, metal::uint2(pix)); } metal::float4 _e250 = v4_; if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[uniform_index].get_width(), texture_array_storage[uniform_index].get_height()))) { texture_array_storage[uniform_index].write(_e250, metal::uint2(pix)); } metal::float4 _e252 = v4_; if (metal::all(metal::uint2(pix) < metal::uint2(texture_array_storage[non_uniform_index].get_width(), texture_array_storage[non_uniform_index].get_height()))) { texture_array_storage[non_uniform_index].write(_e252, metal::uint2(pix)); } metal::int2 _e253 = i2_; int _e254 = i1_; metal::float2 v2_ = static_cast(_e253 + metal::int2(_e254)); metal::float4 _e258 = v4_; float _e265 = v1_; return main_Output { (_e258 + metal::float4(v2_.x, v2_.y, v2_.x, v2_.y)) + metal::float4(_e265) }; } ================================================ FILE: lib/naga/tests/out/msl/bitcast.msl ================================================ // language: metal2.0 #include #include using metal::uint; kernel void main_( ) { metal::int2 i2_ = {}; metal::int3 i3_ = {}; metal::int4 i4_ = {}; metal::uint2 u2_ = {}; metal::uint3 u3_ = {}; metal::uint4 u4_ = {}; metal::float2 f2_ = {}; metal::float3 f3_ = {}; metal::float4 f4_ = {}; i2_ = metal::int2(0); i3_ = metal::int3(0); i4_ = metal::int4(0); u2_ = metal::uint2(0u); u3_ = metal::uint3(0u); u4_ = metal::uint4(0u); f2_ = metal::float2(0.0); f3_ = metal::float3(0.0); f4_ = metal::float4(0.0); metal::int2 _e27 = i2_; u2_ = as_type(_e27); metal::int3 _e29 = i3_; u3_ = as_type(_e29); metal::int4 _e31 = i4_; u4_ = as_type(_e31); metal::uint2 _e33 = u2_; i2_ = as_type(_e33); metal::uint3 _e35 = u3_; i3_ = as_type(_e35); metal::uint4 _e37 = u4_; i4_ = as_type(_e37); metal::int2 _e39 = i2_; f2_ = as_type(_e39); metal::int3 _e41 = i3_; f3_ = as_type(_e41); metal::int4 _e43 = i4_; f4_ = as_type(_e43); return; } ================================================ FILE: lib/naga/tests/out/msl/bits.msl ================================================ // language: metal1.2 #include #include using metal::uint; kernel void main_( ) { int i = 0; metal::int2 i2_ = {}; metal::int3 i3_ = {}; metal::int4 i4_ = {}; uint u = 0u; metal::uint2 u2_ = {}; metal::uint3 u3_ = {}; metal::uint4 u4_ = {}; metal::float2 f2_ = {}; metal::float4 f4_ = {}; i2_ = metal::int2(0); i3_ = metal::int3(0); i4_ = metal::int4(0); u2_ = metal::uint2(0u); u3_ = metal::uint3(0u); u4_ = metal::uint4(0u); f2_ = metal::float2(0.0); f4_ = metal::float4(0.0); metal::float4 _e28 = f4_; u = metal::pack_float_to_snorm4x8(_e28); metal::float4 _e30 = f4_; u = metal::pack_float_to_unorm4x8(_e30); metal::float2 _e32 = f2_; u = metal::pack_float_to_snorm2x16(_e32); metal::float2 _e34 = f2_; u = metal::pack_float_to_unorm2x16(_e34); metal::float2 _e36 = f2_; u = as_type(half2(_e36)); uint _e38 = u; f4_ = metal::unpack_snorm4x8_to_float(_e38); uint _e40 = u; f4_ = metal::unpack_unorm4x8_to_float(_e40); uint _e42 = u; f2_ = metal::unpack_snorm2x16_to_float(_e42); uint _e44 = u; f2_ = metal::unpack_unorm2x16_to_float(_e44); uint _e46 = u; f2_ = float2(as_type(_e46)); int _e48 = i; int _e49 = i; i = metal::insert_bits(_e48, _e49, 5u, 10u); metal::int2 _e53 = i2_; metal::int2 _e54 = i2_; i2_ = metal::insert_bits(_e53, _e54, 5u, 10u); metal::int3 _e58 = i3_; metal::int3 _e59 = i3_; i3_ = metal::insert_bits(_e58, _e59, 5u, 10u); metal::int4 _e63 = i4_; metal::int4 _e64 = i4_; i4_ = metal::insert_bits(_e63, _e64, 5u, 10u); uint _e68 = u; uint _e69 = u; u = metal::insert_bits(_e68, _e69, 5u, 10u); metal::uint2 _e73 = u2_; metal::uint2 _e74 = u2_; u2_ = metal::insert_bits(_e73, _e74, 5u, 10u); metal::uint3 _e78 = u3_; metal::uint3 _e79 = u3_; u3_ = metal::insert_bits(_e78, _e79, 5u, 10u); metal::uint4 _e83 = u4_; metal::uint4 _e84 = u4_; u4_ = metal::insert_bits(_e83, _e84, 5u, 10u); int _e88 = i; i = metal::extract_bits(_e88, 5u, 10u); metal::int2 _e92 = i2_; i2_ = metal::extract_bits(_e92, 5u, 10u); metal::int3 _e96 = i3_; i3_ = metal::extract_bits(_e96, 5u, 10u); metal::int4 _e100 = i4_; i4_ = metal::extract_bits(_e100, 5u, 10u); uint _e104 = u; u = metal::extract_bits(_e104, 5u, 10u); metal::uint2 _e108 = u2_; u2_ = metal::extract_bits(_e108, 5u, 10u); metal::uint3 _e112 = u3_; u3_ = metal::extract_bits(_e112, 5u, 10u); metal::uint4 _e116 = u4_; u4_ = metal::extract_bits(_e116, 5u, 10u); int _e120 = i; i = (((metal::ctz(_e120) + 1) % 33) - 1); metal::uint2 _e122 = u2_; u2_ = (((metal::ctz(_e122) + 1) % 33) - 1); metal::int3 _e124 = i3_; i3_ = (((metal::clz(_e124) + 1) % 33) - 1); uint _e126 = u; u = (((metal::clz(_e126) + 1) % 33) - 1); int _e128 = i; i = metal::popcount(_e128); metal::int2 _e130 = i2_; i2_ = metal::popcount(_e130); metal::int3 _e132 = i3_; i3_ = metal::popcount(_e132); metal::int4 _e134 = i4_; i4_ = metal::popcount(_e134); uint _e136 = u; u = metal::popcount(_e136); metal::uint2 _e138 = u2_; u2_ = metal::popcount(_e138); metal::uint3 _e140 = u3_; u3_ = metal::popcount(_e140); metal::uint4 _e142 = u4_; u4_ = metal::popcount(_e142); int _e144 = i; i = metal::reverse_bits(_e144); metal::int2 _e146 = i2_; i2_ = metal::reverse_bits(_e146); metal::int3 _e148 = i3_; i3_ = metal::reverse_bits(_e148); metal::int4 _e150 = i4_; i4_ = metal::reverse_bits(_e150); uint _e152 = u; u = metal::reverse_bits(_e152); metal::uint2 _e154 = u2_; u2_ = metal::reverse_bits(_e154); metal::uint3 _e156 = u3_; u3_ = metal::reverse_bits(_e156); metal::uint4 _e158 = u4_; u4_ = metal::reverse_bits(_e158); return; } ================================================ FILE: lib/naga/tests/out/msl/boids.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size1; uint size2; }; constexpr constant unsigned NUM_PARTICLES = 1500u; struct Particle { metal::float2 pos; metal::float2 vel; }; struct SimParams { float deltaT; float rule1Distance; float rule2Distance; float rule3Distance; float rule1Scale; float rule2Scale; float rule3Scale; }; typedef Particle type_3[1]; struct Particles { type_3 particles; }; struct main_Input { }; kernel void main_( metal::uint3 global_invocation_id [[thread_position_in_grid]] , constant SimParams& params [[buffer(0)]] , device Particles const& particlesSrc [[buffer(1)]] , device Particles& particlesDst [[buffer(2)]] , constant _mslBufferSizes& _buffer_sizes [[buffer(3)]] ) { metal::float2 vPos = {}; metal::float2 vVel = {}; metal::float2 cMass = {}; metal::float2 cVel = {}; metal::float2 colVel = {}; int cMassCount = 0; int cVelCount = 0; metal::float2 pos = {}; metal::float2 vel = {}; uint i = 0u; uint index = global_invocation_id.x; if (index >= NUM_PARTICLES) { return; } metal::float2 _e10 = particlesSrc.particles[index].pos; vPos = _e10; metal::float2 _e15 = particlesSrc.particles[index].vel; vVel = _e15; cMass = metal::float2(0.0, 0.0); cVel = metal::float2(0.0, 0.0); colVel = metal::float2(0.0, 0.0); bool loop_init = true; while(true) { if (!loop_init) { uint _e86 = i; i = _e86 + 1u; } loop_init = false; uint _e37 = i; if (_e37 >= NUM_PARTICLES) { break; } uint _e39 = i; if (_e39 == index) { continue; } uint _e42 = i; metal::float2 _e45 = particlesSrc.particles[_e42].pos; pos = _e45; uint _e47 = i; metal::float2 _e50 = particlesSrc.particles[_e47].vel; vel = _e50; metal::float2 _e51 = pos; metal::float2 _e52 = vPos; float _e55 = params.rule1Distance; if (metal::distance(_e51, _e52) < _e55) { metal::float2 _e57 = cMass; metal::float2 _e58 = pos; cMass = _e57 + _e58; int _e60 = cMassCount; cMassCount = _e60 + 1; } metal::float2 _e63 = pos; metal::float2 _e64 = vPos; float _e67 = params.rule2Distance; if (metal::distance(_e63, _e64) < _e67) { metal::float2 _e69 = colVel; metal::float2 _e70 = pos; metal::float2 _e71 = vPos; colVel = _e69 - (_e70 - _e71); } metal::float2 _e74 = pos; metal::float2 _e75 = vPos; float _e78 = params.rule3Distance; if (metal::distance(_e74, _e75) < _e78) { metal::float2 _e80 = cVel; metal::float2 _e81 = vel; cVel = _e80 + _e81; int _e83 = cVelCount; cVelCount = _e83 + 1; } } int _e89 = cMassCount; if (_e89 > 0) { metal::float2 _e92 = cMass; int _e93 = cMassCount; metal::float2 _e97 = vPos; cMass = (_e92 / metal::float2(static_cast(_e93))) - _e97; } int _e99 = cVelCount; if (_e99 > 0) { metal::float2 _e102 = cVel; int _e103 = cVelCount; cVel = _e102 / metal::float2(static_cast(_e103)); } metal::float2 _e107 = vVel; metal::float2 _e108 = cMass; float _e110 = params.rule1Scale; metal::float2 _e113 = colVel; float _e115 = params.rule2Scale; metal::float2 _e118 = cVel; float _e120 = params.rule3Scale; vVel = ((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120); metal::float2 _e123 = vVel; metal::float2 _e125 = vVel; vVel = metal::normalize(_e123) * metal::clamp(metal::length(_e125), 0.0, 0.10000000149011612); metal::float2 _e131 = vPos; metal::float2 _e132 = vVel; float _e134 = params.deltaT; vPos = _e131 + (_e132 * _e134); float _e138 = vPos.x; if (_e138 < -1.0) { vPos.x = 1.0; } float _e144 = vPos.x; if (_e144 > 1.0) { vPos.x = -1.0; } float _e150 = vPos.y; if (_e150 < -1.0) { vPos.y = 1.0; } float _e156 = vPos.y; if (_e156 > 1.0) { vPos.y = -1.0; } metal::float2 _e164 = vPos; particlesDst.particles[index].pos = _e164; metal::float2 _e168 = vVel; particlesDst.particles[index].vel = _e168; return; } ================================================ FILE: lib/naga/tests/out/msl/bounds-check-image-restrict.msl ================================================ // language: metal2.0 #include #include using metal::uint; constant metal::int2 const_type_4_ = {0, 0}; constant metal::int3 const_type_7_ = {0, 0, 0}; constant metal::float4 const_type_2_ = {0.0, 0.0, 0.0, 0.0}; metal::float4 test_textureLoad_1d( int coords, int level, metal::texture1d image_1d ) { metal::float4 _e3 = image_1d.read(metal::min(uint(coords), image_1d.get_width() - 1)); return _e3; } metal::float4 test_textureLoad_2d( metal::int2 coords_1, int level_1, metal::texture2d image_2d ) { uint clamped_lod_e4 = metal::min(uint(level_1), image_2d.get_num_mip_levels() - 1); metal::float4 _e4 = image_2d.read(metal::min(metal::uint2(coords_1), metal::uint2(image_2d.get_width(clamped_lod_e4), image_2d.get_height(clamped_lod_e4)) - 1), clamped_lod_e4); return _e4; } metal::float4 test_textureLoad_2d_array( metal::int2 coords_2, int index, int level_2, metal::texture2d_array image_2d_array ) { uint clamped_lod_e6 = metal::min(uint(level_2), image_2d_array.get_num_mip_levels() - 1); metal::float4 _e6 = image_2d_array.read(metal::min(metal::uint2(coords_2), metal::uint2(image_2d_array.get_width(clamped_lod_e6), image_2d_array.get_height(clamped_lod_e6)) - 1), metal::min(uint(index), image_2d_array.get_array_size() - 1), clamped_lod_e6); return _e6; } metal::float4 test_textureLoad_3d( metal::int3 coords_3, int level_3, metal::texture3d image_3d ) { uint clamped_lod_e6 = metal::min(uint(level_3), image_3d.get_num_mip_levels() - 1); metal::float4 _e6 = image_3d.read(metal::min(metal::uint3(coords_3), metal::uint3(image_3d.get_width(clamped_lod_e6), image_3d.get_height(clamped_lod_e6), image_3d.get_depth(clamped_lod_e6)) - 1), clamped_lod_e6); return _e6; } metal::float4 test_textureLoad_multisampled_2d( metal::int2 coords_4, int _sample, metal::texture2d_ms image_multisampled_2d ) { metal::float4 _e7 = image_multisampled_2d.read(metal::min(metal::uint2(coords_4), metal::uint2(image_multisampled_2d.get_width(), image_multisampled_2d.get_height()) - 1), metal::min(uint(_sample), image_multisampled_2d.get_num_samples() - 1)); return _e7; } float test_textureLoad_depth_2d( metal::int2 coords_5, int level_4, metal::depth2d image_depth_2d ) { uint clamped_lod_e8 = metal::min(uint(level_4), image_depth_2d.get_num_mip_levels() - 1); float _e8 = image_depth_2d.read(metal::min(metal::uint2(coords_5), metal::uint2(image_depth_2d.get_width(clamped_lod_e8), image_depth_2d.get_height(clamped_lod_e8)) - 1), clamped_lod_e8); return _e8; } float test_textureLoad_depth_2d_array( metal::int2 coords_6, int index_1, int level_5, metal::depth2d_array image_depth_2d_array ) { uint clamped_lod_e10 = metal::min(uint(level_5), image_depth_2d_array.get_num_mip_levels() - 1); float _e10 = image_depth_2d_array.read(metal::min(metal::uint2(coords_6), metal::uint2(image_depth_2d_array.get_width(clamped_lod_e10), image_depth_2d_array.get_height(clamped_lod_e10)) - 1), metal::min(uint(index_1), image_depth_2d_array.get_array_size() - 1), clamped_lod_e10); return _e10; } float test_textureLoad_depth_multisampled_2d( metal::int2 coords_7, int _sample_1, metal::depth2d_ms image_depth_multisampled_2d ) { float _e10 = image_depth_multisampled_2d.read(metal::min(metal::uint2(coords_7), metal::uint2(image_depth_multisampled_2d.get_width(), image_depth_multisampled_2d.get_height()) - 1), metal::min(uint(_sample_1), image_depth_multisampled_2d.get_num_samples() - 1)); return _e10; } void test_textureStore_1d( int coords_8, metal::float4 value, metal::texture1d image_storage_1d ) { image_storage_1d.write(value, metal::min(uint(coords_8), image_storage_1d.get_width() - 1)); return; } void test_textureStore_2d( metal::int2 coords_9, metal::float4 value_1, metal::texture2d image_storage_2d ) { image_storage_2d.write(value_1, metal::min(metal::uint2(coords_9), metal::uint2(image_storage_2d.get_width(), image_storage_2d.get_height()) - 1)); return; } void test_textureStore_2d_array( metal::int2 coords_10, int array_index, metal::float4 value_2, metal::texture2d_array image_storage_2d_array ) { image_storage_2d_array.write(value_2, metal::min(metal::uint2(coords_10), metal::uint2(image_storage_2d_array.get_width(), image_storage_2d_array.get_height()) - 1), metal::min(uint(array_index), image_storage_2d_array.get_array_size() - 1)); return; } void test_textureStore_3d( metal::int3 coords_11, metal::float4 value_3, metal::texture3d image_storage_3d ) { image_storage_3d.write(value_3, metal::min(metal::uint3(coords_11), metal::uint3(image_storage_3d.get_width(), image_storage_3d.get_height(), image_storage_3d.get_depth()) - 1)); return; } struct fragment_shaderOutput { metal::float4 member [[color(0)]]; }; fragment fragment_shaderOutput fragment_shader( metal::texture1d image_1d [[user(fake0)]] , metal::texture2d image_2d [[user(fake0)]] , metal::texture2d_array image_2d_array [[user(fake0)]] , metal::texture3d image_3d [[user(fake0)]] , metal::texture2d_ms image_multisampled_2d [[user(fake0)]] , metal::texture1d image_storage_1d [[user(fake0)]] , metal::texture2d image_storage_2d [[user(fake0)]] , metal::texture2d_array image_storage_2d_array [[user(fake0)]] , metal::texture3d image_storage_3d [[user(fake0)]] ) { metal::float4 _e14 = test_textureLoad_1d(0, 0, image_1d); metal::float4 _e17 = test_textureLoad_2d(const_type_4_, 0, image_2d); metal::float4 _e21 = test_textureLoad_2d_array(const_type_4_, 0, 0, image_2d_array); metal::float4 _e24 = test_textureLoad_3d(const_type_7_, 0, image_3d); metal::float4 _e27 = test_textureLoad_multisampled_2d(const_type_4_, 0, image_multisampled_2d); test_textureStore_1d(0, const_type_2_, image_storage_1d); test_textureStore_2d(const_type_4_, const_type_2_, image_storage_2d); test_textureStore_2d_array(const_type_4_, 0, const_type_2_, image_storage_2d_array); test_textureStore_3d(const_type_7_, const_type_2_, image_storage_3d); return fragment_shaderOutput { metal::float4(0.0, 0.0, 0.0, 0.0) }; } ================================================ FILE: lib/naga/tests/out/msl/bounds-check-image-rzsw.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct DefaultConstructible { template operator T() && { return T {}; } }; constant metal::int2 const_type_4_ = {0, 0}; constant metal::int3 const_type_7_ = {0, 0, 0}; constant metal::float4 const_type_2_ = {0.0, 0.0, 0.0, 0.0}; metal::float4 test_textureLoad_1d( int coords, int level, metal::texture1d image_1d ) { metal::float4 _e3 = (uint(level) < image_1d.get_num_mip_levels() && uint(coords) < image_1d.get_width() ? image_1d.read(uint(coords)): DefaultConstructible()); return _e3; } metal::float4 test_textureLoad_2d( metal::int2 coords_1, int level_1, metal::texture2d image_2d ) { metal::float4 _e4 = (uint(level_1) < image_2d.get_num_mip_levels() && metal::all(metal::uint2(coords_1) < metal::uint2(image_2d.get_width(level_1), image_2d.get_height(level_1))) ? image_2d.read(metal::uint2(coords_1), level_1): DefaultConstructible()); return _e4; } metal::float4 test_textureLoad_2d_array( metal::int2 coords_2, int index, int level_2, metal::texture2d_array image_2d_array ) { metal::float4 _e6 = (uint(level_2) < image_2d_array.get_num_mip_levels() && uint(index) < image_2d_array.get_array_size() && metal::all(metal::uint2(coords_2) < metal::uint2(image_2d_array.get_width(level_2), image_2d_array.get_height(level_2))) ? image_2d_array.read(metal::uint2(coords_2), index, level_2): DefaultConstructible()); return _e6; } metal::float4 test_textureLoad_3d( metal::int3 coords_3, int level_3, metal::texture3d image_3d ) { metal::float4 _e6 = (uint(level_3) < image_3d.get_num_mip_levels() && metal::all(metal::uint3(coords_3) < metal::uint3(image_3d.get_width(level_3), image_3d.get_height(level_3), image_3d.get_depth(level_3))) ? image_3d.read(metal::uint3(coords_3), level_3): DefaultConstructible()); return _e6; } metal::float4 test_textureLoad_multisampled_2d( metal::int2 coords_4, int _sample, metal::texture2d_ms image_multisampled_2d ) { metal::float4 _e7 = (uint(_sample) < image_multisampled_2d.get_num_samples() && metal::all(metal::uint2(coords_4) < metal::uint2(image_multisampled_2d.get_width(), image_multisampled_2d.get_height())) ? image_multisampled_2d.read(metal::uint2(coords_4), _sample): DefaultConstructible()); return _e7; } float test_textureLoad_depth_2d( metal::int2 coords_5, int level_4, metal::depth2d image_depth_2d ) { float _e8 = (uint(level_4) < image_depth_2d.get_num_mip_levels() && metal::all(metal::uint2(coords_5) < metal::uint2(image_depth_2d.get_width(level_4), image_depth_2d.get_height(level_4))) ? image_depth_2d.read(metal::uint2(coords_5), level_4): DefaultConstructible()); return _e8; } float test_textureLoad_depth_2d_array( metal::int2 coords_6, int index_1, int level_5, metal::depth2d_array image_depth_2d_array ) { float _e10 = (uint(level_5) < image_depth_2d_array.get_num_mip_levels() && uint(index_1) < image_depth_2d_array.get_array_size() && metal::all(metal::uint2(coords_6) < metal::uint2(image_depth_2d_array.get_width(level_5), image_depth_2d_array.get_height(level_5))) ? image_depth_2d_array.read(metal::uint2(coords_6), index_1, level_5): DefaultConstructible()); return _e10; } float test_textureLoad_depth_multisampled_2d( metal::int2 coords_7, int _sample_1, metal::depth2d_ms image_depth_multisampled_2d ) { float _e10 = (uint(_sample_1) < image_depth_multisampled_2d.get_num_samples() && metal::all(metal::uint2(coords_7) < metal::uint2(image_depth_multisampled_2d.get_width(), image_depth_multisampled_2d.get_height())) ? image_depth_multisampled_2d.read(metal::uint2(coords_7), _sample_1): DefaultConstructible()); return _e10; } void test_textureStore_1d( int coords_8, metal::float4 value, metal::texture1d image_storage_1d ) { if (uint(coords_8) < image_storage_1d.get_width()) { image_storage_1d.write(value, uint(coords_8)); } return; } void test_textureStore_2d( metal::int2 coords_9, metal::float4 value_1, metal::texture2d image_storage_2d ) { if (metal::all(metal::uint2(coords_9) < metal::uint2(image_storage_2d.get_width(), image_storage_2d.get_height()))) { image_storage_2d.write(value_1, metal::uint2(coords_9)); } return; } void test_textureStore_2d_array( metal::int2 coords_10, int array_index, metal::float4 value_2, metal::texture2d_array image_storage_2d_array ) { if (uint(array_index) < image_storage_2d_array.get_array_size() && metal::all(metal::uint2(coords_10) < metal::uint2(image_storage_2d_array.get_width(), image_storage_2d_array.get_height()))) { image_storage_2d_array.write(value_2, metal::uint2(coords_10), array_index); } return; } void test_textureStore_3d( metal::int3 coords_11, metal::float4 value_3, metal::texture3d image_storage_3d ) { if (metal::all(metal::uint3(coords_11) < metal::uint3(image_storage_3d.get_width(), image_storage_3d.get_height(), image_storage_3d.get_depth()))) { image_storage_3d.write(value_3, metal::uint3(coords_11)); } return; } struct fragment_shaderOutput { metal::float4 member [[color(0)]]; }; fragment fragment_shaderOutput fragment_shader( metal::texture1d image_1d [[user(fake0)]] , metal::texture2d image_2d [[user(fake0)]] , metal::texture2d_array image_2d_array [[user(fake0)]] , metal::texture3d image_3d [[user(fake0)]] , metal::texture2d_ms image_multisampled_2d [[user(fake0)]] , metal::texture1d image_storage_1d [[user(fake0)]] , metal::texture2d image_storage_2d [[user(fake0)]] , metal::texture2d_array image_storage_2d_array [[user(fake0)]] , metal::texture3d image_storage_3d [[user(fake0)]] ) { metal::float4 _e14 = test_textureLoad_1d(0, 0, image_1d); metal::float4 _e17 = test_textureLoad_2d(const_type_4_, 0, image_2d); metal::float4 _e21 = test_textureLoad_2d_array(const_type_4_, 0, 0, image_2d_array); metal::float4 _e24 = test_textureLoad_3d(const_type_7_, 0, image_3d); metal::float4 _e27 = test_textureLoad_multisampled_2d(const_type_4_, 0, image_multisampled_2d); test_textureStore_1d(0, const_type_2_, image_storage_1d); test_textureStore_2d(const_type_4_, const_type_2_, image_storage_2d); test_textureStore_2d_array(const_type_4_, 0, const_type_2_, image_storage_2d_array); test_textureStore_3d(const_type_7_, const_type_2_, image_storage_3d); return fragment_shaderOutput { metal::float4(0.0, 0.0, 0.0, 0.0) }; } ================================================ FILE: lib/naga/tests/out/msl/bounds-check-restrict.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size0; }; struct type_1 { float inner[10]; }; typedef float type_4[1]; struct Globals { type_1 a; char _pad1[8]; metal::float4 v; metal::float3x4 m; type_4 d; }; float index_array( int i, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = globals.a.inner[metal::min(unsigned(i), 9u)]; return _e4; } float index_dynamic_array( int i_1, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = globals.d[metal::min(unsigned(i_1), (_buffer_sizes.size0 - 112 - 4) / 4)]; return _e4; } float index_vector( int i_2, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = globals.v[metal::min(unsigned(i_2), 3u)]; return _e4; } float index_vector_by_value( metal::float4 v, int i_3 ) { return v[metal::min(unsigned(i_3), 3u)]; } metal::float4 index_matrix( int i_4, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { metal::float4 _e4 = globals.m[metal::min(unsigned(i_4), 2u)]; return _e4; } float index_twice( int i_5, int j, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e6 = globals.m[metal::min(unsigned(i_5), 2u)][metal::min(unsigned(j), 3u)]; return _e6; } float index_expensive( int i_6, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e11 = globals.a.inner[metal::min(unsigned(static_cast(metal::sin(static_cast(i_6) / 100.0) * 100.0)), 9u)]; return _e11; } float index_in_bounds( device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = globals.a.inner[9]; float _e8 = globals.v.w; float _e15 = globals.m[2].w; return (_e4 + _e8) + _e15; } void set_array( int i_7, float v_1, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.a.inner[metal::min(unsigned(i_7), 9u)] = v_1; return; } void set_dynamic_array( int i_8, float v_2, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.d[metal::min(unsigned(i_8), (_buffer_sizes.size0 - 112 - 4) / 4)] = v_2; return; } void set_vector( int i_9, float v_3, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.v[metal::min(unsigned(i_9), 3u)] = v_3; return; } void set_matrix( int i_10, metal::float4 v_4, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.m[metal::min(unsigned(i_10), 2u)] = v_4; return; } void set_index_twice( int i_11, int j_1, float v_5, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.m[metal::min(unsigned(i_11), 2u)][metal::min(unsigned(j_1), 3u)] = v_5; return; } void set_expensive( int i_12, float v_6, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.a.inner[metal::min(unsigned(static_cast(metal::sin(static_cast(i_12) / 100.0) * 100.0)), 9u)] = v_6; return; } void set_in_bounds( float v_7, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.a.inner[9] = v_7; globals.v.w = v_7; globals.m[2].w = v_7; return; } ================================================ FILE: lib/naga/tests/out/msl/bounds-check-zero-atomic.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct DefaultConstructible { template operator T() && { return T {}; } }; struct _mslBufferSizes { uint size0; }; struct type_1 { metal::atomic_uint inner[10]; }; typedef metal::atomic_uint type_2[1]; struct Globals { metal::atomic_uint a; type_1 b; type_2 c; }; uint fetch_add_atomic( device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { uint _e3 = metal::atomic_fetch_add_explicit(&globals.a, 1u, metal::memory_order_relaxed); return _e3; } uint fetch_add_atomic_static_sized_array( int i, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { uint _e5 = uint(i) < 10 ? metal::atomic_fetch_add_explicit(&globals.b.inner[i], 1u, metal::memory_order_relaxed) : DefaultConstructible(); return _e5; } uint fetch_add_atomic_dynamic_sized_array( int i_1, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { uint _e5 = uint(i_1) < 1 + (_buffer_sizes.size0 - 44 - 4) / 4 ? metal::atomic_fetch_add_explicit(&globals.c[i_1], 1u, metal::memory_order_relaxed) : DefaultConstructible(); return _e5; } ================================================ FILE: lib/naga/tests/out/msl/bounds-check-zero.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct DefaultConstructible { template operator T() && { return T {}; } }; struct _mslBufferSizes { uint size0; }; struct type_1 { float inner[10]; }; typedef float type_4[1]; struct Globals { type_1 a; char _pad1[8]; metal::float4 v; metal::float3x4 m; type_4 d; }; float index_array( int i, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = uint(i) < 10 ? globals.a.inner[i] : DefaultConstructible(); return _e4; } float index_dynamic_array( int i_1, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = uint(i_1) < 1 + (_buffer_sizes.size0 - 112 - 4) / 4 ? globals.d[i_1] : DefaultConstructible(); return _e4; } float index_vector( int i_2, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = uint(i_2) < 4 ? globals.v[i_2] : DefaultConstructible(); return _e4; } float index_vector_by_value( metal::float4 v, int i_3 ) { return uint(i_3) < 4 ? v[i_3] : DefaultConstructible(); } metal::float4 index_matrix( int i_4, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { metal::float4 _e4 = uint(i_4) < 3 ? globals.m[i_4] : DefaultConstructible(); return _e4; } float index_twice( int i_5, int j, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e6 = uint(j) < 4 && uint(i_5) < 3 ? globals.m[i_5][j] : DefaultConstructible(); return _e6; } float index_expensive( int i_6, device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { int _e9 = static_cast(metal::sin(static_cast(i_6) / 100.0) * 100.0); float _e11 = uint(_e9) < 10 ? globals.a.inner[_e9] : DefaultConstructible(); return _e11; } float index_in_bounds( device Globals const& globals, constant _mslBufferSizes& _buffer_sizes ) { float _e4 = globals.a.inner[9]; float _e8 = globals.v.w; float _e15 = globals.m[2].w; return (_e4 + _e8) + _e15; } void set_array( int i_7, float v_1, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { if (uint(i_7) < 10) { globals.a.inner[i_7] = v_1; } return; } void set_dynamic_array( int i_8, float v_2, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { if (uint(i_8) < 1 + (_buffer_sizes.size0 - 112 - 4) / 4) { globals.d[i_8] = v_2; } return; } void set_vector( int i_9, float v_3, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { if (uint(i_9) < 4) { globals.v[i_9] = v_3; } return; } void set_matrix( int i_10, metal::float4 v_4, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { if (uint(i_10) < 3) { globals.m[i_10] = v_4; } return; } void set_index_twice( int i_11, int j_1, float v_5, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { if (uint(j_1) < 4 && uint(i_11) < 3) { globals.m[i_11][j_1] = v_5; } return; } void set_expensive( int i_12, float v_6, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { int _e10 = static_cast(metal::sin(static_cast(i_12) / 100.0) * 100.0); if (uint(_e10) < 10) { globals.a.inner[_e10] = v_6; } return; } void set_in_bounds( float v_7, device Globals& globals, constant _mslBufferSizes& _buffer_sizes ) { globals.a.inner[9] = v_7; globals.v.w = v_7; globals.m[2].w = v_7; return; } ================================================ FILE: lib/naga/tests/out/msl/break-if.msl ================================================ // language: metal2.0 #include #include using metal::uint; void breakIfEmpty( ) { bool loop_init = true; while(true) { if (!loop_init) { if (true) { break; } } loop_init = false; } return; } void breakIfEmptyBody( bool a ) { bool b = {}; bool c = {}; bool loop_init_1 = true; while(true) { if (!loop_init_1) { b = a; bool _e2 = b; c = a != _e2; bool _e5 = c; bool unnamed = a == _e5; if (a == c) { break; } } loop_init_1 = false; } return; } void breakIf( bool a_1 ) { bool d = {}; bool e = {}; bool loop_init_2 = true; while(true) { if (!loop_init_2) { bool _e5 = e; bool unnamed_1 = a_1 == _e5; if (a_1 == e) { break; } } loop_init_2 = false; d = a_1; bool _e2 = d; e = a_1 != _e2; } return; } kernel void main_( ) { return; } ================================================ FILE: lib/naga/tests/out/msl/collatz.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size0; }; typedef uint type_1[1]; struct PrimeIndices { type_1 data; }; uint collatz_iterations( uint n_base ) { uint n = {}; uint i = 0u; n = n_base; while(true) { uint _e5 = n; if (_e5 > 1u) { } else { break; } uint _e8 = n; if ((_e8 % 2u) == 0u) { uint _e13 = n; n = _e13 / 2u; } else { uint _e17 = n; n = (3u * _e17) + 1u; } uint _e21 = i; i = _e21 + 1u; } uint _e24 = i; return _e24; } struct main_Input { }; kernel void main_( metal::uint3 global_id [[thread_position_in_grid]] , device PrimeIndices& v_indices [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { uint _e8 = v_indices.data[global_id.x]; uint _e9 = collatz_iterations(_e8); v_indices.data[global_id.x] = _e9; return; } ================================================ FILE: lib/naga/tests/out/msl/control-flow.msl ================================================ // language: metal2.0 #include #include using metal::uint; void switch_default_break( int i ) { switch(i) { default: { break; } } } void switch_case_break( ) { switch(0) { case 0: { break; } default: { break; } } return; } void loop_switch_continue( int x ) { while(true) { switch(x) { case 1: { continue; } default: { break; } } } return; } struct main_Input { }; kernel void main_( metal::uint3 global_id [[thread_position_in_grid]] ) { int pos = {}; metal::threadgroup_barrier(metal::mem_flags::mem_device); metal::threadgroup_barrier(metal::mem_flags::mem_threadgroup); switch(1) { default: { pos = 1; break; } } int _e4 = pos; switch(_e4) { case 1: { pos = 0; break; } case 2: { pos = 1; break; } case 3: { pos = 2; } case 4: { pos = 3; } default: { pos = 4; break; } } switch(0u) { case 0u: { break; } default: { break; } } int _e11 = pos; switch(_e11) { case 1: { pos = 0; break; } case 2: { pos = 1; return; } case 3: { pos = 2; } case 4: { return; } default: { pos = 3; return; } } } ================================================ FILE: lib/naga/tests/out/msl/empty-global-name.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct type_1 { int member; }; void function( device type_1& unnamed ) { int _e8 = unnamed.member; unnamed.member = _e8 + 1; return; } kernel void main_( device type_1& unnamed [[user(fake0)]] ) { function(unnamed); } ================================================ FILE: lib/naga/tests/out/msl/empty.msl ================================================ // language: metal2.0 #include #include using metal::uint; kernel void main_( ) { return; } ================================================ FILE: lib/naga/tests/out/msl/extra.msl ================================================ // language: metal2.2 #include #include using metal::uint; struct PushConstants { uint index; char _pad1[12]; metal::float2 double_; }; struct FragmentIn { metal::float4 color; uint primitive_index; }; struct main_Input { metal::float4 color [[user(loc0), center_perspective]]; }; struct main_Output { metal::float4 member [[color(0)]]; }; fragment main_Output main_( main_Input varyings [[stage_in]] , uint primitive_index [[primitive_id]] , constant PushConstants& pc [[buffer(1)]] ) { const FragmentIn in = { varyings.color, primitive_index }; uint _e4 = pc.index; if (in.primitive_index == _e4) { return main_Output { in.color }; } else { return main_Output { metal::float4(metal::float3(1.0) - in.color.xyz, in.color.w) }; } } ================================================ FILE: lib/naga/tests/out/msl/functions.msl ================================================ // language: metal2.0 #include #include using metal::uint; metal::float2 test_fma( ) { metal::float2 a = metal::float2(2.0, 2.0); metal::float2 b = metal::float2(0.5, 0.5); metal::float2 c = metal::float2(0.5, 0.5); return metal::fma(a, b, c); } int test_integer_dot_product( ) { metal::int2 a_2_ = metal::int2(1); metal::int2 b_2_ = metal::int2(1); int c_2_ = ( + a_2_.x * b_2_.x + a_2_.y * b_2_.y); metal::uint3 a_3_ = metal::uint3(1u); metal::uint3 b_3_ = metal::uint3(1u); uint c_3_ = ( + a_3_.x * b_3_.x + a_3_.y * b_3_.y + a_3_.z * b_3_.z); metal::int4 _e11 = metal::int4(4); metal::int4 _e13 = metal::int4(2); int c_4_ = ( + _e11.x * _e13.x + _e11.y * _e13.y + _e11.z * _e13.z + _e11.w * _e13.w); return c_4_; } kernel void main_( ) { metal::float2 _e0 = test_fma(); int _e1 = test_integer_dot_product(); return; } ================================================ FILE: lib/naga/tests/out/msl/globals.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size3; }; constexpr constant bool Foo_2 = true; struct type_2 { float inner[10u]; }; struct Foo { metal::packed_float3 v3_; float v1_; }; typedef metal::float2 type_6[1]; struct type_8 { metal::float4 inner[20]; }; struct type_11 { metal::float2x4 inner[2]; }; struct type_12 { type_11 inner[2]; }; struct type_14 { metal::float4x2 inner[2]; }; struct type_15 { type_14 inner[2]; }; constant metal::float3 const_type_4_ = {0.0, 0.0, 0.0}; constant metal::float3x3 const_type_17_ = {const_type_4_, const_type_4_, const_type_4_}; void test_msl_packed_vec3_as_arg( metal::float3 arg ) { return; } void test_msl_packed_vec3_( device Foo& alignment ) { int idx = 1; alignment.v3_ = metal::float3(1.0); alignment.v3_[0] = 1.0; alignment.v3_[0] = 2.0; int _e23 = idx; alignment.v3_[_e23] = 3.0; Foo data = alignment; metal::float3 unnamed = data.v3_; metal::float2 unnamed_1 = metal::float3(data.v3_).zx; test_msl_packed_vec3_as_arg(data.v3_); metal::float3 unnamed_2 = metal::float3(data.v3_) * const_type_17_; metal::float3 unnamed_3 = const_type_17_ * metal::float3(data.v3_); metal::float3 unnamed_4 = data.v3_ * 2.0; metal::float3 unnamed_5 = 2.0 * data.v3_; } kernel void main_( threadgroup type_2& wg , threadgroup metal::atomic_uint& at_1 , device Foo& alignment [[user(fake0)]] , device type_6 const& dummy [[user(fake0)]] , constant type_8& float_vecs [[user(fake0)]] , constant metal::float3& global_vec [[user(fake0)]] , constant metal::float3x2& global_mat [[user(fake0)]] , constant type_12& global_nested_arrays_of_matrices_2x4_ [[user(fake0)]] , constant type_15& global_nested_arrays_of_matrices_4x2_ [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { float Foo_1 = 1.0; bool at = true; test_msl_packed_vec3_(alignment); metal::float4x2 _e16 = global_nested_arrays_of_matrices_4x2_.inner[0].inner[0]; metal::float4 _e23 = global_nested_arrays_of_matrices_2x4_.inner[0].inner[0][0]; wg.inner[7] = (_e16 * _e23).x; metal::float3x2 _e28 = global_mat; metal::float3 _e29 = global_vec; wg.inner[6] = (_e28 * _e29).x; float _e37 = dummy[1].y; wg.inner[5] = _e37; float _e43 = float_vecs.inner[0].w; wg.inner[4] = _e43; float _e47 = alignment.v1_; wg.inner[3] = _e47; float _e52 = alignment.v3_[0]; wg.inner[2] = _e52; alignment.v1_ = 4.0; wg.inner[1] = static_cast(1 + (_buffer_sizes.size3 - 0 - 8) / 8); metal::atomic_store_explicit(&at_1, 2u, metal::memory_order_relaxed); return; } ================================================ FILE: lib/naga/tests/out/msl/image.msl ================================================ // language: metal2.0 #include #include using metal::uint; constant metal::int2 const_type_9_ = {3, 1}; struct main_Input { }; kernel void main_( metal::uint3 local_id [[thread_position_in_threadgroup]] , metal::texture2d image_mipmapped_src [[user(fake0)]] , metal::texture2d_ms image_multisampled_src [[user(fake0)]] , metal::texture2d image_storage_src [[user(fake0)]] , metal::texture2d_array image_array_src [[user(fake0)]] , metal::texture1d image_1d_src [[user(fake0)]] , metal::texture1d image_dst [[user(fake0)]] ) { metal::int2 dim = metal::int2(image_storage_src.get_width(), image_storage_src.get_height()); metal::int2 itc = (dim * static_cast(local_id.xy)) % metal::int2(10, 20); metal::uint4 value1_ = image_mipmapped_src.read(metal::uint2(itc), static_cast(local_id.z)); metal::uint4 value2_ = image_multisampled_src.read(metal::uint2(itc), static_cast(local_id.z)); metal::uint4 value4_ = image_storage_src.read(metal::uint2(itc)); metal::uint4 value5_ = image_array_src.read(metal::uint2(itc), static_cast(local_id.z), static_cast(local_id.z) + 1); metal::uint4 value6_ = image_1d_src.read(uint(static_cast(local_id.x))); image_dst.write((((value1_ + value2_) + value4_) + value5_) + value6_, uint(itc.x)); return; } struct depth_loadInput { }; kernel void depth_load( metal::uint3 local_id_1 [[thread_position_in_threadgroup]] , metal::depth2d_ms image_depth_multisampled_src [[user(fake0)]] , metal::texture2d image_storage_src [[user(fake0)]] , metal::texture1d image_dst [[user(fake0)]] ) { metal::int2 dim_1 = metal::int2(image_storage_src.get_width(), image_storage_src.get_height()); metal::int2 itc_1 = (dim_1 * static_cast(local_id_1.xy)) % metal::int2(10, 20); float val = image_depth_multisampled_src.read(metal::uint2(itc_1), static_cast(local_id_1.z)); image_dst.write(metal::uint4(static_cast(val)), uint(itc_1.x)); return; } struct queriesOutput { metal::float4 member_2 [[position]]; }; vertex queriesOutput queries( metal::texture1d image_1d [[user(fake0)]] , metal::texture2d image_2d [[user(fake0)]] , metal::texture2d_array image_2d_array [[user(fake0)]] , metal::texturecube image_cube [[user(fake0)]] , metal::texturecube_array image_cube_array [[user(fake0)]] , metal::texture3d image_3d [[user(fake0)]] , metal::texture2d_ms image_aa [[user(fake0)]] ) { int dim_1d = int(image_1d.get_width()); int dim_1d_lod = int(image_1d.get_width()); metal::int2 dim_2d = metal::int2(image_2d.get_width(), image_2d.get_height()); metal::int2 dim_2d_lod = metal::int2(image_2d.get_width(1), image_2d.get_height(1)); metal::int2 dim_2d_array = metal::int2(image_2d_array.get_width(), image_2d_array.get_height()); metal::int2 dim_2d_array_lod = metal::int2(image_2d_array.get_width(1), image_2d_array.get_height(1)); metal::int2 dim_cube = metal::int2(image_cube.get_width()); metal::int2 dim_cube_lod = metal::int2(image_cube.get_width(1)); metal::int2 dim_cube_array = metal::int2(image_cube_array.get_width()); metal::int2 dim_cube_array_lod = metal::int2(image_cube_array.get_width(1)); metal::int3 dim_3d = metal::int3(image_3d.get_width(), image_3d.get_height(), image_3d.get_depth()); metal::int3 dim_3d_lod = metal::int3(image_3d.get_width(1), image_3d.get_height(1), image_3d.get_depth(1)); metal::int2 dim_2s_ms = metal::int2(image_aa.get_width(), image_aa.get_height()); int sum = (((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z; return queriesOutput { metal::float4(static_cast(sum)) }; } struct levels_queriesOutput { metal::float4 member_3 [[position]]; }; vertex levels_queriesOutput levels_queries( metal::texture2d image_2d [[user(fake0)]] , metal::texture2d_array image_2d_array [[user(fake0)]] , metal::texturecube image_cube [[user(fake0)]] , metal::texturecube_array image_cube_array [[user(fake0)]] , metal::texture3d image_3d [[user(fake0)]] , metal::texture2d_ms image_aa [[user(fake0)]] ) { int num_levels_2d = int(image_2d.get_num_mip_levels()); int num_levels_2d_array = int(image_2d_array.get_num_mip_levels()); int num_layers_2d = int(image_2d_array.get_array_size()); int num_levels_cube = int(image_cube.get_num_mip_levels()); int num_levels_cube_array = int(image_cube_array.get_num_mip_levels()); int num_layers_cube = int(image_cube_array.get_array_size()); int num_levels_3d = int(image_3d.get_num_mip_levels()); int num_samples_aa = int(image_aa.get_num_samples()); int sum_1 = ((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array; return levels_queriesOutput { metal::float4(static_cast(sum_1)) }; } struct texture_sampleOutput { metal::float4 member_4 [[color(0)]]; }; fragment texture_sampleOutput texture_sample( metal::texture1d image_1d [[user(fake0)]] , metal::texture2d image_2d [[user(fake0)]] , metal::sampler sampler_reg [[user(fake0)]] ) { metal::float2 tc = metal::float2(0.5); metal::float4 s1d = image_1d.sample(sampler_reg, tc.x); metal::float4 s2d = image_2d.sample(sampler_reg, tc); metal::float4 s2d_offset = image_2d.sample(sampler_reg, tc, const_type_9_); metal::float4 s2d_level = image_2d.sample(sampler_reg, tc, metal::level(2.299999952316284)); metal::float4 s2d_level_offset = image_2d.sample(sampler_reg, tc, metal::level(2.299999952316284), const_type_9_); metal::float4 s2d_bias_offset = image_2d.sample(sampler_reg, tc, metal::bias(2.0), const_type_9_); return texture_sampleOutput { (((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset }; } struct texture_sample_comparisonOutput { float member_5 [[color(0)]]; }; fragment texture_sample_comparisonOutput texture_sample_comparison( metal::sampler sampler_cmp [[user(fake0)]] , metal::depth2d image_2d_depth [[user(fake0)]] , metal::depthcube image_cube_depth [[user(fake0)]] ) { metal::float2 tc_1 = metal::float2(0.5); float s2d_depth = image_2d_depth.sample_compare(sampler_cmp, tc_1, 0.5); float s2d_depth_level = image_2d_depth.sample_compare(sampler_cmp, tc_1, 0.5); float scube_depth_level = image_cube_depth.sample_compare(sampler_cmp, metal::float3(0.5), 0.5); return texture_sample_comparisonOutput { s2d_depth + s2d_depth_level }; } struct gatherOutput { metal::float4 member_6 [[color(0)]]; }; fragment gatherOutput gather( metal::texture2d image_2d [[user(fake0)]] , metal::sampler sampler_reg [[user(fake0)]] , metal::sampler sampler_cmp [[user(fake0)]] , metal::depth2d image_2d_depth [[user(fake0)]] ) { metal::float2 tc_2 = metal::float2(0.5); metal::float4 s2d_1 = image_2d.gather(sampler_reg, tc_2, int2(0), metal::component::y); metal::float4 s2d_offset_1 = image_2d.gather(sampler_reg, tc_2, const_type_9_, metal::component::w); metal::float4 s2d_depth_1 = image_2d_depth.gather_compare(sampler_cmp, tc_2, 0.5); metal::float4 s2d_depth_offset = image_2d_depth.gather_compare(sampler_cmp, tc_2, 0.5, const_type_9_); return gatherOutput { ((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset }; } struct depth_no_comparisonOutput { metal::float4 member_7 [[color(0)]]; }; fragment depth_no_comparisonOutput depth_no_comparison( metal::sampler sampler_reg [[user(fake0)]] , metal::depth2d image_2d_depth [[user(fake0)]] ) { metal::float2 tc_3 = metal::float2(0.5); float s2d_2 = image_2d_depth.sample(sampler_reg, tc_3); metal::float4 s2d_gather = image_2d_depth.gather(sampler_reg, tc_3); return depth_no_comparisonOutput { metal::float4(s2d_2) + s2d_gather }; } ================================================ FILE: lib/naga/tests/out/msl/interface.msl ================================================ // language: metal2.1 #include #include using metal::uint; struct VertexOutput { metal::float4 position; float _varying; }; struct FragmentOutput { float depth; uint sample_mask; float color; }; struct type_4 { uint inner[1]; }; struct Input1_ { uint index; }; struct Input2_ { uint index; }; struct vertex_Input { uint color [[attribute(10)]]; }; struct vertex_Output { metal::float4 position [[position, invariant]]; float _varying [[user(loc1), center_perspective]]; float _point_size [[point_size]]; }; vertex vertex_Output vertex_( vertex_Input varyings [[stage_in]] , uint vertex_index [[vertex_id]] , uint instance_index [[instance_id]] ) { const auto color = varyings.color; uint tmp = (vertex_index + instance_index) + color; const auto _tmp = VertexOutput {metal::float4(1.0), static_cast(tmp)}; return vertex_Output { _tmp.position, _tmp._varying, 1.0 }; } struct fragment_Input { float _varying [[user(loc1), center_perspective]]; }; struct fragment_Output { float depth [[depth(any)]]; uint sample_mask [[sample_mask]]; float color [[color(0)]]; }; fragment fragment_Output fragment_( fragment_Input varyings_1 [[stage_in]] , metal::float4 position [[position]] , bool front_facing [[front_facing]] , uint sample_index [[sample_id]] , uint sample_mask [[sample_mask]] ) { const VertexOutput in = { position, varyings_1._varying }; uint mask = sample_mask & (1u << sample_index); float color_1 = front_facing ? 1.0 : 0.0; const auto _tmp = FragmentOutput {in._varying, mask, color_1}; return fragment_Output { _tmp.depth, _tmp.sample_mask, _tmp.color }; } struct compute_Input { }; kernel void compute_( metal::uint3 global_id [[thread_position_in_grid]] , metal::uint3 local_id [[thread_position_in_threadgroup]] , uint local_index [[thread_index_in_threadgroup]] , metal::uint3 wg_id [[threadgroup_position_in_grid]] , metal::uint3 num_wgs [[threadgroups_per_grid]] , threadgroup type_4& output ) { output.inner[0] = (((global_id.x + local_id.x) + local_index) + wg_id.x) + num_wgs.x; return; } struct vertex_two_structsInput { }; struct vertex_two_structsOutput { metal::float4 member_3 [[position, invariant]]; float _point_size [[point_size]]; }; vertex vertex_two_structsOutput vertex_two_structs( uint index_1 [[vertex_id]] , uint index_2 [[instance_id]] ) { const Input1_ in1_ = { index_1 }; const Input2_ in2_ = { index_2 }; uint index = 2u; uint _e9 = index; return vertex_two_structsOutput { metal::float4(static_cast(in1_.index), static_cast(in2_.index), static_cast(_e9), 0.0), 1.0 }; } ================================================ FILE: lib/naga/tests/out/msl/interpolate.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct FragmentInput { metal::float4 position; uint _flat; float _linear; metal::float2 linear_centroid; metal::float3 linear_sample; metal::float4 perspective; float perspective_centroid; float perspective_sample; }; struct vert_mainOutput { metal::float4 position [[position]]; uint _flat [[user(loc0), flat]]; float _linear [[user(loc1), center_no_perspective]]; metal::float2 linear_centroid [[user(loc2), centroid_no_perspective]]; metal::float3 linear_sample [[user(loc3), sample_no_perspective]]; metal::float4 perspective [[user(loc4), center_perspective]]; float perspective_centroid [[user(loc5), centroid_perspective]]; float perspective_sample [[user(loc6), sample_perspective]]; }; vertex vert_mainOutput vert_main( ) { FragmentInput out = {}; out.position = metal::float4(2.0, 4.0, 5.0, 6.0); out._flat = 8u; out._linear = 27.0; out.linear_centroid = metal::float2(64.0, 125.0); out.linear_sample = metal::float3(216.0, 343.0, 512.0); out.perspective = metal::float4(729.0, 1000.0, 1331.0, 1728.0); out.perspective_centroid = 2197.0; out.perspective_sample = 2744.0; FragmentInput _e30 = out; const auto _tmp = _e30; return vert_mainOutput { _tmp.position, _tmp._flat, _tmp._linear, _tmp.linear_centroid, _tmp.linear_sample, _tmp.perspective, _tmp.perspective_centroid, _tmp.perspective_sample }; } struct frag_mainInput { uint _flat [[user(loc0), flat]]; float _linear [[user(loc1), center_no_perspective]]; metal::float2 linear_centroid [[user(loc2), centroid_no_perspective]]; metal::float3 linear_sample [[user(loc3), sample_no_perspective]]; metal::float4 perspective [[user(loc4), center_perspective]]; float perspective_centroid [[user(loc5), centroid_perspective]]; float perspective_sample [[user(loc6), sample_perspective]]; }; fragment void frag_main( frag_mainInput varyings_1 [[stage_in]] , metal::float4 position [[position]] ) { const FragmentInput val = { position, varyings_1._flat, varyings_1._linear, varyings_1.linear_centroid, varyings_1.linear_sample, varyings_1.perspective, varyings_1.perspective_centroid, varyings_1.perspective_sample }; return; } ================================================ FILE: lib/naga/tests/out/msl/math-functions.msl ================================================ // language: metal2.0 #include #include using metal::uint; constant metal::int2 const_type = {0, 0}; vertex void main_( ) { metal::float4 v = metal::float4(0.0); float a = ((1.0) * 57.295779513082322865); float b = ((1.0) * 0.017453292519943295474); metal::float4 c = ((v) * 57.295779513082322865); metal::float4 d = ((v) * 0.017453292519943295474); metal::float4 e = metal::saturate(v); int const_dot = ( + const_type.x * const_type.x + const_type.y * const_type.y); uint first_leading_bit_abs = (((metal::clz(metal::abs(0u)) + 1) % 33) - 1); } ================================================ FILE: lib/naga/tests/out/msl/operators.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct Foo { metal::float4 a; int b; }; struct type_12 { Foo inner[3]; }; struct type_13 { int inner[4u]; }; constant metal::float4 v_f32_one = {1.0, 1.0, 1.0, 1.0}; constant metal::float4 v_f32_zero = {0.0, 0.0, 0.0, 0.0}; constant metal::float4 v_f32_half = {0.5, 0.5, 0.5, 0.5}; constant metal::int4 v_i32_one = {1, 1, 1, 1}; constant metal::uint2 const_type_11_ = {0u, 0u}; constant metal::float2 const_type_4_ = {0.0, 0.0}; constant metal::float2x2 const_type_7_ = {const_type_4_, const_type_4_}; constant metal::float4 const_type = {0.0, 0.0, 0.0, 0.0}; constant Foo const_Foo = {const_type, 0}; constant type_12 const_type_12_ = {const_Foo, const_Foo, const_Foo}; constant metal::float3 const_type_5_ = {0.0, 0.0, 0.0}; constant metal::float2x3 const_type_14_ = {const_type_5_, const_type_5_}; constant metal::float3x3 const_type_15_ = {const_type_5_, const_type_5_, const_type_5_}; constant metal::float4x3 const_type_16_ = {const_type_5_, const_type_5_, const_type_5_, const_type_5_}; constant metal::float3x4 const_type_17_ = {const_type, const_type, const_type}; constant metal::int3 const_type_18_ = {0, 0, 0}; metal::float4 builtins( ) { int s1_ = true ? 1 : 0; metal::float4 s2_ = true ? v_f32_one : v_f32_zero; metal::float4 s3_ = metal::select(v_f32_one, v_f32_zero, metal::bool4(false, false, false, false)); metal::float4 m1_ = metal::mix(v_f32_zero, v_f32_one, v_f32_half); metal::float4 m2_ = metal::mix(v_f32_zero, v_f32_one, 0.10000000149011612); float b1_ = as_type(v_i32_one.x); metal::float4 b2_ = as_type(v_i32_one); metal::int4 v_i32_zero = static_cast(v_f32_zero); return ((((static_cast(metal::int4(s1_) + v_i32_zero) + s2_) + m1_) + m2_) + metal::float4(b1_)) + b2_; } metal::float4 splat( ) { metal::float2 a_2 = ((metal::float2(1.0) + metal::float2(2.0)) - metal::float2(3.0)) / metal::float2(4.0); metal::int4 b = metal::int4(5) % metal::int4(2); return a_2.xyxy + static_cast(b); } metal::float2 splat_assignment( ) { metal::float2 a = {}; a = metal::float2(2.0); metal::float2 _e7 = a; a = _e7 + metal::float2(1.0); metal::float2 _e11 = a; a = _e11 - metal::float2(3.0); metal::float2 _e15 = a; a = _e15 / metal::float2(4.0); metal::float2 _e19 = a; return _e19; } metal::float3 bool_cast( metal::float3 x ) { metal::bool3 y = static_cast(x); return static_cast(y); } float constructors( ) { Foo foo = {}; foo = Foo {metal::float4(1.0), 1}; metal::float2x2 mat2comp = metal::float2x2(metal::float2(1.0, 0.0), metal::float2(0.0, 1.0)); metal::float4x4 mat4comp = metal::float4x4(metal::float4(1.0, 0.0, 0.0, 0.0), metal::float4(0.0, 1.0, 0.0, 0.0), metal::float4(0.0, 0.0, 1.0, 0.0), metal::float4(0.0, 0.0, 0.0, 1.0)); metal::uint2 unnamed = metal::uint2(0u); metal::float2x2 unnamed_1 = metal::float2x2(metal::float2(0.0), metal::float2(0.0)); type_13 unnamed_2 = type_13 {0, 1, 2, 3}; bool unnamed_3 = static_cast(false); int unnamed_4 = static_cast(0); uint unnamed_5 = static_cast(0u); float unnamed_6 = static_cast(0.0); metal::uint2 unnamed_7 = static_cast(const_type_11_); metal::float2x3 unnamed_8 = metal::float2x3(const_type_14_); metal::uint2 unnamed_9 = as_type(const_type_11_); metal::float2x3 unnamed_10 = metal::float2x3(const_type_14_); float _e75 = foo.a.x; return _e75; } void logical( ) { bool unnamed_11 = !true; metal::bool2 unnamed_12 = !metal::bool2(true); bool unnamed_13 = true || false; bool unnamed_14 = true && false; bool unnamed_15 = true | false; metal::bool3 unnamed_16 = metal::bool3(true) | metal::bool3(false); bool unnamed_17 = true & false; metal::bool4 unnamed_18 = metal::bool4(true) & metal::bool4(false); } void arithmetic( ) { metal::int2 unnamed_19 = -metal::int2(1); metal::float2 unnamed_20 = -metal::float2(1.0); int unnamed_21 = 2 + 1; uint unnamed_22 = 2u + 1u; float unnamed_23 = 2.0 + 1.0; metal::int2 unnamed_24 = metal::int2(2) + metal::int2(1); metal::uint3 unnamed_25 = metal::uint3(2u) + metal::uint3(1u); metal::float4 unnamed_26 = metal::float4(2.0) + metal::float4(1.0); int unnamed_27 = 2 - 1; uint unnamed_28 = 2u - 1u; float unnamed_29 = 2.0 - 1.0; metal::int2 unnamed_30 = metal::int2(2) - metal::int2(1); metal::uint3 unnamed_31 = metal::uint3(2u) - metal::uint3(1u); metal::float4 unnamed_32 = metal::float4(2.0) - metal::float4(1.0); int unnamed_33 = 2 * 1; uint unnamed_34 = 2u * 1u; float unnamed_35 = 2.0 * 1.0; metal::int2 unnamed_36 = metal::int2(2) * metal::int2(1); metal::uint3 unnamed_37 = metal::uint3(2u) * metal::uint3(1u); metal::float4 unnamed_38 = metal::float4(2.0) * metal::float4(1.0); int unnamed_39 = 2 / 1; uint unnamed_40 = 2u / 1u; float unnamed_41 = 2.0 / 1.0; metal::int2 unnamed_42 = metal::int2(2) / metal::int2(1); metal::uint3 unnamed_43 = metal::uint3(2u) / metal::uint3(1u); metal::float4 unnamed_44 = metal::float4(2.0) / metal::float4(1.0); int unnamed_45 = 2 % 1; uint unnamed_46 = 2u % 1u; float unnamed_47 = metal::fmod(2.0, 1.0); metal::int2 unnamed_48 = metal::int2(2) % metal::int2(1); metal::uint3 unnamed_49 = metal::uint3(2u) % metal::uint3(1u); metal::float4 unnamed_50 = metal::fmod(metal::float4(2.0), metal::float4(1.0)); metal::int2 unnamed_51 = metal::int2(2) + metal::int2(1); metal::int2 unnamed_52 = metal::int2(2) + metal::int2(1); metal::uint2 unnamed_53 = metal::uint2(2u) + metal::uint2(1u); metal::uint2 unnamed_54 = metal::uint2(2u) + metal::uint2(1u); metal::float2 unnamed_55 = metal::float2(2.0) + metal::float2(1.0); metal::float2 unnamed_56 = metal::float2(2.0) + metal::float2(1.0); metal::int2 unnamed_57 = metal::int2(2) - metal::int2(1); metal::int2 unnamed_58 = metal::int2(2) - metal::int2(1); metal::uint2 unnamed_59 = metal::uint2(2u) - metal::uint2(1u); metal::uint2 unnamed_60 = metal::uint2(2u) - metal::uint2(1u); metal::float2 unnamed_61 = metal::float2(2.0) - metal::float2(1.0); metal::float2 unnamed_62 = metal::float2(2.0) - metal::float2(1.0); metal::int2 unnamed_63 = metal::int2(2) * 1; metal::int2 unnamed_64 = 2 * metal::int2(1); metal::uint2 unnamed_65 = metal::uint2(2u) * 1u; metal::uint2 unnamed_66 = 2u * metal::uint2(1u); metal::float2 unnamed_67 = metal::float2(2.0) * 1.0; metal::float2 unnamed_68 = 2.0 * metal::float2(1.0); metal::int2 unnamed_69 = metal::int2(2) / metal::int2(1); metal::int2 unnamed_70 = metal::int2(2) / metal::int2(1); metal::uint2 unnamed_71 = metal::uint2(2u) / metal::uint2(1u); metal::uint2 unnamed_72 = metal::uint2(2u) / metal::uint2(1u); metal::float2 unnamed_73 = metal::float2(2.0) / metal::float2(1.0); metal::float2 unnamed_74 = metal::float2(2.0) / metal::float2(1.0); metal::int2 unnamed_75 = metal::int2(2) % metal::int2(1); metal::int2 unnamed_76 = metal::int2(2) % metal::int2(1); metal::uint2 unnamed_77 = metal::uint2(2u) % metal::uint2(1u); metal::uint2 unnamed_78 = metal::uint2(2u) % metal::uint2(1u); metal::float2 unnamed_79 = metal::fmod(metal::float2(2.0), metal::float2(1.0)); metal::float2 unnamed_80 = metal::fmod(metal::float2(2.0), metal::float2(1.0)); metal::float3x3 unnamed_81 = const_type_15_ + const_type_15_; metal::float3x3 unnamed_82 = const_type_15_ - const_type_15_; metal::float3x3 unnamed_83 = const_type_15_ * 1.0; metal::float3x3 unnamed_84 = 2.0 * const_type_15_; metal::float3 unnamed_85 = const_type_16_ * metal::float4(1.0); metal::float4 unnamed_86 = metal::float3(2.0) * const_type_16_; metal::float3x3 unnamed_87 = const_type_16_ * const_type_17_; } void bit( ) { int unnamed_88 = ~1; uint unnamed_89 = ~1u; metal::int2 unnamed_90 = ~metal::int2(1); metal::uint3 unnamed_91 = ~metal::uint3(1u); int unnamed_92 = 2 | 1; uint unnamed_93 = 2u | 1u; metal::int2 unnamed_94 = metal::int2(2) | metal::int2(1); metal::uint3 unnamed_95 = metal::uint3(2u) | metal::uint3(1u); int unnamed_96 = 2 & 1; uint unnamed_97 = 2u & 1u; metal::int2 unnamed_98 = metal::int2(2) & metal::int2(1); metal::uint3 unnamed_99 = metal::uint3(2u) & metal::uint3(1u); int unnamed_100 = 2 ^ 1; uint unnamed_101 = 2u ^ 1u; metal::int2 unnamed_102 = metal::int2(2) ^ metal::int2(1); metal::uint3 unnamed_103 = metal::uint3(2u) ^ metal::uint3(1u); int unnamed_104 = 2 << 1u; uint unnamed_105 = 2u << 1u; metal::int2 unnamed_106 = metal::int2(2) << metal::uint2(1u); metal::uint3 unnamed_107 = metal::uint3(2u) << metal::uint3(1u); int unnamed_108 = 2 >> 1u; uint unnamed_109 = 2u >> 1u; metal::int2 unnamed_110 = metal::int2(2) >> metal::uint2(1u); metal::uint3 unnamed_111 = metal::uint3(2u) >> metal::uint3(1u); } void comparison( ) { bool unnamed_112 = 2 == 1; bool unnamed_113 = 2u == 1u; bool unnamed_114 = 2.0 == 1.0; metal::bool2 unnamed_115 = metal::int2(2) == metal::int2(1); metal::bool3 unnamed_116 = metal::uint3(2u) == metal::uint3(1u); metal::bool4 unnamed_117 = metal::float4(2.0) == metal::float4(1.0); bool unnamed_118 = 2 != 1; bool unnamed_119 = 2u != 1u; bool unnamed_120 = 2.0 != 1.0; metal::bool2 unnamed_121 = metal::int2(2) != metal::int2(1); metal::bool3 unnamed_122 = metal::uint3(2u) != metal::uint3(1u); metal::bool4 unnamed_123 = metal::float4(2.0) != metal::float4(1.0); bool unnamed_124 = 2 < 1; bool unnamed_125 = 2u < 1u; bool unnamed_126 = 2.0 < 1.0; metal::bool2 unnamed_127 = metal::int2(2) < metal::int2(1); metal::bool3 unnamed_128 = metal::uint3(2u) < metal::uint3(1u); metal::bool4 unnamed_129 = metal::float4(2.0) < metal::float4(1.0); bool unnamed_130 = 2 <= 1; bool unnamed_131 = 2u <= 1u; bool unnamed_132 = 2.0 <= 1.0; metal::bool2 unnamed_133 = metal::int2(2) <= metal::int2(1); metal::bool3 unnamed_134 = metal::uint3(2u) <= metal::uint3(1u); metal::bool4 unnamed_135 = metal::float4(2.0) <= metal::float4(1.0); bool unnamed_136 = 2 > 1; bool unnamed_137 = 2u > 1u; bool unnamed_138 = 2.0 > 1.0; metal::bool2 unnamed_139 = metal::int2(2) > metal::int2(1); metal::bool3 unnamed_140 = metal::uint3(2u) > metal::uint3(1u); metal::bool4 unnamed_141 = metal::float4(2.0) > metal::float4(1.0); bool unnamed_142 = 2 >= 1; bool unnamed_143 = 2u >= 1u; bool unnamed_144 = 2.0 >= 1.0; metal::bool2 unnamed_145 = metal::int2(2) >= metal::int2(1); metal::bool3 unnamed_146 = metal::uint3(2u) >= metal::uint3(1u); metal::bool4 unnamed_147 = metal::float4(2.0) >= metal::float4(1.0); } void assignment( ) { int a_1 = 1; metal::int3 vec0_ = const_type_18_; int _e6 = a_1; a_1 = _e6 + 1; int _e9 = a_1; a_1 = _e9 - 1; int _e12 = a_1; int _e13 = a_1; a_1 = _e12 * _e13; int _e15 = a_1; int _e16 = a_1; a_1 = _e15 / _e16; int _e18 = a_1; a_1 = _e18 % 1; int _e21 = a_1; a_1 = _e21 & 0; int _e24 = a_1; a_1 = _e24 | 0; int _e27 = a_1; a_1 = _e27 ^ 0; int _e30 = a_1; a_1 = _e30 << 2u; int _e33 = a_1; a_1 = _e33 >> 1u; int _e36 = a_1; a_1 = _e36 + 1; int _e39 = a_1; a_1 = _e39 - 1; int _e46 = vec0_.y; vec0_.y = _e46 + 1; int _e51 = vec0_.y; vec0_.y = _e51 - 1; return; } kernel void main_( ) { metal::float4 _e4 = builtins(); metal::float4 _e5 = splat(); metal::float3 _e7 = bool_cast(v_f32_one.xyz); float _e8 = constructors(); logical(); arithmetic(); bit(); comparison(); assignment(); return; } ================================================ FILE: lib/naga/tests/out/msl/padding.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct S { metal::float3 a; }; struct Test { S a; float b; }; struct type_2 { metal::float3 inner[2]; }; struct Test2_ { type_2 a; float b; }; struct Test3_ { metal::float4x3 a; float b; }; struct vertex_Output { metal::float4 member [[position]]; }; vertex vertex_Output vertex_( constant Test& input1_ [[buffer(0)]] , constant Test2_& input2_ [[buffer(1)]] , constant Test3_& input3_ [[buffer(2)]] ) { float _e6 = input1_.b; float _e9 = input2_.b; float _e12 = input3_.b; return vertex_Output { ((metal::float4(1.0) * _e6) * _e9) * _e12 }; } ================================================ FILE: lib/naga/tests/out/msl/policy-mix.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct DefaultConstructible { template operator T() && { return T {}; } }; struct type_1 { metal::float4 inner[10]; }; struct InStorage { type_1 a; }; struct type_2 { metal::float4 inner[20]; }; struct InUniform { type_2 a; }; struct type_5 { float inner[30]; }; struct type_6 { float inner[40]; }; struct type_9 { metal::float4 inner[2]; }; metal::float4 mock_function( metal::int2 c, int i, int l, device InStorage const& in_storage, constant InUniform& in_uniform, metal::texture2d_array image_2d_array, threadgroup type_5& in_workgroup, thread type_6& in_private ) { type_9 in_function = {}; for(int _i=0; _i<2; ++_i) in_function.inner[_i] = type_9 {metal::float4(0.7070000171661377, 0.0, 0.0, 1.0), metal::float4(0.0, 0.7070000171661377, 0.0, 1.0)}.inner[_i]; metal::float4 _e22 = in_storage.a.inner[i]; metal::float4 _e25 = in_uniform.a.inner[i]; metal::float4 _e27 = (uint(l) < image_2d_array.get_num_mip_levels() && uint(i) < image_2d_array.get_array_size() && metal::all(metal::uint2(c) < metal::uint2(image_2d_array.get_width(l), image_2d_array.get_height(l))) ? image_2d_array.read(metal::uint2(c), i, l): DefaultConstructible()); float _e30 = in_workgroup.inner[metal::min(unsigned(i), 29u)]; float _e34 = in_private.inner[metal::min(unsigned(i), 39u)]; metal::float4 _e38 = in_function.inner[metal::min(unsigned(i), 1u)]; return ((((_e22 + _e25) + _e27) + metal::float4(_e30)) + metal::float4(_e34)) + _e38; } ================================================ FILE: lib/naga/tests/out/msl/quad-vert.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct type_5 { float inner[1u]; }; struct gl_PerVertex { metal::float4 gl_Position; float gl_PointSize; type_5 gl_ClipDistance; type_5 gl_CullDistance; }; struct type_9 { metal::float2 member; metal::float4 gl_Position; }; constant metal::float4 const_type_3_ = {0.0, 0.0, 0.0, 1.0}; constant type_5 const_type_5_ = {0.0}; constant gl_PerVertex const_gl_PerVertex = {const_type_3_, 1.0, const_type_5_, const_type_5_}; void main_1( thread metal::float2& v_uv, thread metal::float2& a_uv_1, thread gl_PerVertex& perVertexStruct, thread metal::float2& a_pos_1 ) { metal::float2 _e12 = a_uv_1; v_uv = _e12; metal::float2 _e13 = a_pos_1; perVertexStruct.gl_Position = metal::float4(_e13.x, _e13.y, 0.0, 1.0); return; } struct main_Input { metal::float2 a_uv [[attribute(1)]]; metal::float2 a_pos [[attribute(0)]]; }; struct main_Output { metal::float2 member [[user(loc0), center_perspective]]; metal::float4 gl_Position [[position]]; }; vertex main_Output main_( main_Input varyings [[stage_in]] ) { metal::float2 v_uv = {}; metal::float2 a_uv_1 = {}; gl_PerVertex perVertexStruct = const_gl_PerVertex; metal::float2 a_pos_1 = {}; const auto a_uv = varyings.a_uv; const auto a_pos = varyings.a_pos; a_uv_1 = a_uv; a_pos_1 = a_pos; main_1(v_uv, a_uv_1, perVertexStruct, a_pos_1); metal::float2 _e7 = v_uv; metal::float4 _e8 = perVertexStruct.gl_Position; const auto _tmp = type_9 {_e7, _e8}; return main_Output { _tmp.member, _tmp.gl_Position }; } ================================================ FILE: lib/naga/tests/out/msl/quad.msl ================================================ // language: metal2.0 #include #include using metal::uint; constexpr constant float c_scale = 1.2000000476837158; struct VertexOutput { metal::float2 uv; metal::float4 position; }; struct vert_mainInput { metal::float2 pos [[attribute(0)]]; metal::float2 uv [[attribute(1)]]; }; struct vert_mainOutput { metal::float2 uv [[user(loc0), center_perspective]]; metal::float4 position [[position]]; }; vertex vert_mainOutput vert_main( vert_mainInput varyings [[stage_in]] ) { const auto pos = varyings.pos; const auto uv = varyings.uv; const auto _tmp = VertexOutput {uv, metal::float4(c_scale * pos, 0.0, 1.0)}; return vert_mainOutput { _tmp.uv, _tmp.position }; } struct frag_mainInput { metal::float2 uv_1 [[user(loc0), center_perspective]]; }; struct frag_mainOutput { metal::float4 member_1 [[color(0)]]; }; fragment frag_mainOutput frag_main( frag_mainInput varyings_1 [[stage_in]] , metal::texture2d u_texture [[user(fake0)]] , metal::sampler u_sampler [[user(fake0)]] ) { const auto uv_1 = varyings_1.uv_1; metal::float4 color = u_texture.sample(u_sampler, uv_1); if (color.w == 0.0) { metal::discard_fragment(); } metal::float4 premultiplied = color.w * color; return frag_mainOutput { premultiplied }; } struct fs_extraOutput { metal::float4 member_2 [[color(0)]]; }; fragment fs_extraOutput fs_extra( ) { return fs_extraOutput { metal::float4(0.0, 0.5, 0.0, 0.5) }; } ================================================ FILE: lib/naga/tests/out/msl/shadow.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct _mslBufferSizes { uint size2; }; constexpr constant unsigned c_max_lights = 10u; struct Globals { metal::float4x4 view_proj; metal::uint4 num_lights; }; struct Entity { metal::float4x4 world; metal::float4 color; }; struct VertexOutput { metal::float4 proj_position; metal::float3 world_normal; metal::float4 world_position; }; struct Light { metal::float4x4 proj; metal::float4 pos; metal::float4 color; }; typedef Light type_6[1]; struct type_7 { Light inner[10]; }; constant metal::float3 c_ambient = {0.05000000074505806, 0.05000000074505806, 0.05000000074505806}; float fetch_shadow( uint light_id, metal::float4 homogeneous_coords, metal::depth2d_array t_shadow, metal::sampler sampler_shadow ) { if (homogeneous_coords.w <= 0.0) { return 1.0; } metal::float2 flip_correction = metal::float2(0.5, -0.5); float proj_correction = 1.0 / homogeneous_coords.w; metal::float2 light_local = ((homogeneous_coords.xy * flip_correction) * proj_correction) + metal::float2(0.5, 0.5); float _e28 = t_shadow.sample_compare(sampler_shadow, light_local, static_cast(light_id), homogeneous_coords.z * proj_correction); return _e28; } struct vs_mainInput { metal::int4 position [[attribute(0)]]; metal::int4 normal [[attribute(1)]]; }; struct vs_mainOutput { metal::float4 proj_position [[position]]; metal::float3 world_normal [[user(loc0), center_perspective]]; metal::float4 world_position [[user(loc1), center_perspective]]; }; vertex vs_mainOutput vs_main( vs_mainInput varyings [[stage_in]] , constant Globals& u_globals [[user(fake0)]] , constant Entity& u_entity [[user(fake0)]] ) { const auto position = varyings.position; const auto normal = varyings.normal; VertexOutput out = {}; metal::float4x4 w = u_entity.world; metal::float4x4 _e7 = u_entity.world; metal::float4 world_pos = _e7 * static_cast(position); out.world_normal = metal::float3x3(w[0].xyz, w[1].xyz, w[2].xyz) * static_cast(normal.xyz); out.world_position = world_pos; metal::float4x4 _e25 = u_globals.view_proj; out.proj_position = _e25 * world_pos; VertexOutput _e27 = out; const auto _tmp = _e27; return vs_mainOutput { _tmp.proj_position, _tmp.world_normal, _tmp.world_position }; } struct fs_mainInput { metal::float3 world_normal [[user(loc0), center_perspective]]; metal::float4 world_position [[user(loc1), center_perspective]]; }; struct fs_mainOutput { metal::float4 member_1 [[color(0)]]; }; fragment fs_mainOutput fs_main( fs_mainInput varyings_1 [[stage_in]] , metal::float4 proj_position [[position]] , constant Globals& u_globals [[user(fake0)]] , constant Entity& u_entity [[user(fake0)]] , device type_6 const& s_lights [[user(fake0)]] , metal::depth2d_array t_shadow [[user(fake0)]] , metal::sampler sampler_shadow [[user(fake0)]] , constant _mslBufferSizes& _buffer_sizes [[user(fake0)]] ) { const VertexOutput in = { proj_position, varyings_1.world_normal, varyings_1.world_position }; metal::float3 color = c_ambient; uint i = 0u; metal::float3 normal_1 = metal::normalize(in.world_normal); bool loop_init = true; while(true) { if (!loop_init) { uint _e20 = i; i = _e20 + 1u; } loop_init = false; uint _e14 = i; uint _e17 = u_globals.num_lights.x; if (_e14 < metal::min(_e17, c_max_lights)) { } else { break; } uint _e23 = i; Light light = s_lights[_e23]; uint _e26 = i; float _e30 = fetch_shadow(_e26, light.proj * in.world_position, t_shadow, sampler_shadow); metal::float3 light_dir = metal::normalize(light.pos.xyz - in.world_position.xyz); float diffuse = metal::max(0.0, metal::dot(normal_1, light_dir)); metal::float3 _e40 = color; color = _e40 + ((_e30 * diffuse) * light.color.xyz); } metal::float3 _e46 = color; metal::float4 _e50 = u_entity.color; return fs_mainOutput { metal::float4(_e46, 1.0) * _e50 }; } struct fs_main_without_storageInput { metal::float3 world_normal [[user(loc0), center_perspective]]; metal::float4 world_position [[user(loc1), center_perspective]]; }; struct fs_main_without_storageOutput { metal::float4 member_2 [[color(0)]]; }; fragment fs_main_without_storageOutput fs_main_without_storage( fs_main_without_storageInput varyings_2 [[stage_in]] , metal::float4 proj_position_1 [[position]] , constant Globals& u_globals [[user(fake0)]] , constant Entity& u_entity [[user(fake0)]] , constant type_7& u_lights [[user(fake0)]] , metal::depth2d_array t_shadow [[user(fake0)]] , metal::sampler sampler_shadow [[user(fake0)]] ) { const VertexOutput in_1 = { proj_position_1, varyings_2.world_normal, varyings_2.world_position }; metal::float3 color_1 = c_ambient; uint i_1 = 0u; metal::float3 normal_2 = metal::normalize(in_1.world_normal); bool loop_init_1 = true; while(true) { if (!loop_init_1) { uint _e20 = i_1; i_1 = _e20 + 1u; } loop_init_1 = false; uint _e14 = i_1; uint _e17 = u_globals.num_lights.x; if (_e14 < metal::min(_e17, c_max_lights)) { } else { break; } uint _e23 = i_1; Light light_1 = u_lights.inner[_e23]; uint _e26 = i_1; float _e30 = fetch_shadow(_e26, light_1.proj * in_1.world_position, t_shadow, sampler_shadow); metal::float3 light_dir_1 = metal::normalize(light_1.pos.xyz - in_1.world_position.xyz); float diffuse_1 = metal::max(0.0, metal::dot(normal_2, light_dir_1)); metal::float3 _e40 = color_1; color_1 = _e40 + ((_e30 * diffuse_1) * light_1.color.xyz); } metal::float3 _e46 = color_1; metal::float4 _e50 = u_entity.color; return fs_main_without_storageOutput { metal::float4(_e46, 1.0) * _e50 }; } ================================================ FILE: lib/naga/tests/out/msl/skybox.msl ================================================ // language: metal2.1 #include #include using metal::uint; struct VertexOutput { metal::float4 position; metal::float3 uv; }; struct Data { metal::float4x4 proj_inv; metal::float4x4 view; }; struct vs_mainInput { }; struct vs_mainOutput { metal::float4 position [[position]]; metal::float3 uv [[user(loc0), center_perspective]]; }; vertex vs_mainOutput vs_main( uint vertex_index [[vertex_id]] , constant Data& r_data [[buffer(0)]] ) { int tmp1_ = {}; int tmp2_ = {}; tmp1_ = static_cast(vertex_index) / 2; tmp2_ = static_cast(vertex_index) & 1; int _e10 = tmp1_; int _e16 = tmp2_; metal::float4 pos = metal::float4((static_cast(_e10) * 4.0) - 1.0, (static_cast(_e16) * 4.0) - 1.0, 0.0, 1.0); metal::float4 _e27 = r_data.view[0]; metal::float4 _e31 = r_data.view[1]; metal::float4 _e35 = r_data.view[2]; metal::float3x3 inv_model_view = metal::transpose(metal::float3x3(_e27.xyz, _e31.xyz, _e35.xyz)); metal::float4x4 _e40 = r_data.proj_inv; metal::float4 unprojected = _e40 * pos; const auto _tmp = VertexOutput {pos, inv_model_view * unprojected.xyz}; return vs_mainOutput { _tmp.position, _tmp.uv }; } struct fs_mainInput { metal::float3 uv [[user(loc0), center_perspective]]; }; struct fs_mainOutput { metal::float4 member_1 [[color(0)]]; }; fragment fs_mainOutput fs_main( fs_mainInput varyings_1 [[stage_in]] , metal::float4 position [[position]] , metal::texturecube r_texture [[texture(0)]] ) { constexpr metal::sampler r_sampler( metal::s_address::clamp_to_edge, metal::t_address::clamp_to_edge, metal::r_address::clamp_to_edge, metal::mag_filter::linear, metal::min_filter::linear, metal::coord::normalized ); const VertexOutput in = { position, varyings_1.uv }; metal::float4 _e5 = r_texture.sample(r_sampler, in.uv); return fs_mainOutput { _e5 }; } ================================================ FILE: lib/naga/tests/out/msl/standard.msl ================================================ // language: metal2.0 #include #include using metal::uint; struct derivativesInput { }; struct derivativesOutput { metal::float4 member [[color(0)]]; }; fragment derivativesOutput derivatives( metal::float4 foo [[position]] ) { metal::float4 x = metal::dfdx(foo); metal::float4 y = metal::dfdy(foo); metal::float4 z = metal::fwidth(foo); return derivativesOutput { (x + y) * z }; } ================================================ FILE: lib/naga/tests/out/msl/texture-arg.msl ================================================ // language: metal2.0 #include #include using metal::uint; metal::float4 test( metal::texture2d Passed_Texture, metal::sampler Passed_Sampler ) { metal::float4 _e7 = Passed_Texture.sample(Passed_Sampler, metal::float2(0.0, 0.0)); return _e7; } struct main_Output { metal::float4 member [[color(0)]]; }; fragment main_Output main_( metal::texture2d Texture [[user(fake0)]] , metal::sampler Sampler [[user(fake0)]] ) { metal::float4 _e2 = test(Texture, Sampler); return main_Output { _e2 }; } ================================================ FILE: lib/naga/tests/out/spv/access.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 320 OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %233 "foo_vert" %228 %231 OpEntryPoint Fragment %274 "foo_frag" %273 OpEntryPoint GLCompute %293 "atomics" OpEntryPoint GLCompute %317 "assign_through_ptr" OpExecutionMode %274 OriginUpperLeft OpExecutionMode %293 LocalSize 1 1 1 OpExecutionMode %317 LocalSize 1 1 1 OpSource GLSL 450 OpMemberName %36 0 "a" OpMemberName %36 1 "b" OpMemberName %36 2 "c" OpName %36 "GlobalConst" OpMemberName %37 0 "value" OpName %37 "AlignedWrapper" OpMemberName %46 0 "_matrix" OpMemberName %46 1 "matrix_array" OpMemberName %46 2 "atom" OpMemberName %46 3 "arr" OpMemberName %46 4 "data" OpName %46 "Bar" OpMemberName %48 0 "m" OpName %48 "Baz" OpMemberName %52 0 "am" OpName %52 "MatCx2InArray" OpName %68 "global_const" OpName %70 "bar" OpName %72 "baz" OpName %75 "qux" OpName %78 "nested_mat_cx2" OpName %81 "val" OpName %82 "idx" OpName %84 "t" OpName %88 "test_matrix_within_struct_accesses" OpName %146 "idx" OpName %147 "t" OpName %151 "test_matrix_within_array_within_struct_accesses" OpName %206 "foo" OpName %207 "read_from_private" OpName %212 "a" OpName %213 "test_arr_as_arg" OpName %219 "p" OpName %220 "assign_through_ptr_fn" OpName %223 "foo" OpName %224 "c" OpName %228 "vi" OpName %233 "foo_vert" OpName %274 "foo_frag" OpName %290 "tmp" OpName %293 "atomics" OpName %317 "assign_through_ptr" OpMemberDecorate %36 0 Offset 0 OpMemberDecorate %36 1 Offset 16 OpMemberDecorate %36 2 Offset 28 OpMemberDecorate %37 0 Offset 0 OpDecorate %42 ArrayStride 16 OpDecorate %44 ArrayStride 8 OpDecorate %45 ArrayStride 8 OpMemberDecorate %46 0 Offset 0 OpMemberDecorate %46 0 ColMajor OpMemberDecorate %46 0 MatrixStride 16 OpMemberDecorate %46 1 Offset 64 OpMemberDecorate %46 1 ColMajor OpMemberDecorate %46 1 MatrixStride 8 OpMemberDecorate %46 2 Offset 96 OpMemberDecorate %46 3 Offset 104 OpMemberDecorate %46 4 Offset 120 OpMemberDecorate %48 0 Offset 0 OpMemberDecorate %48 0 ColMajor OpMemberDecorate %48 0 MatrixStride 8 OpDecorate %51 ArrayStride 32 OpMemberDecorate %52 0 Offset 0 OpMemberDecorate %52 0 ColMajor OpMemberDecorate %52 0 MatrixStride 8 OpDecorate %54 ArrayStride 4 OpDecorate %55 ArrayStride 40 OpDecorate %58 ArrayStride 4 OpDecorate %70 DescriptorSet 0 OpDecorate %70 Binding 0 OpDecorate %46 Block OpDecorate %72 DescriptorSet 0 OpDecorate %72 Binding 1 OpDecorate %73 Block OpMemberDecorate %73 0 Offset 0 OpDecorate %75 DescriptorSet 0 OpDecorate %75 Binding 2 OpDecorate %76 Block OpMemberDecorate %76 0 Offset 0 OpDecorate %78 DescriptorSet 0 OpDecorate %78 Binding 3 OpDecorate %79 Block OpMemberDecorate %79 0 Offset 0 OpDecorate %228 BuiltIn VertexIndex OpDecorate %231 BuiltIn Position OpDecorate %273 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 0 %3 = OpConstant %4 0 %6 = OpTypeInt 32 1 %5 = OpConstant %6 0 %7 = OpConstant %6 2 %8 = OpConstant %6 1 %10 = OpTypeFloat 32 %9 = OpConstant %10 1.0 %11 = OpConstant %10 2.0 %12 = OpConstant %10 3.0 %13 = OpConstant %10 6.0 %14 = OpConstant %10 5.0 %15 = OpConstant %10 4.0 %16 = OpConstant %10 9.0 %17 = OpConstant %10 90.0 %18 = OpConstant %10 10.0 %19 = OpConstant %10 20.0 %20 = OpConstant %10 30.0 %21 = OpConstant %10 40.0 %22 = OpConstant %10 0.0 %23 = OpConstant %10 8.0 %24 = OpConstant %10 7.0 %25 = OpConstant %6 10 %26 = OpConstant %6 5 %27 = OpConstant %6 4 %28 = OpConstant %6 9 %29 = OpConstant %4 3 %30 = OpConstant %4 2 %31 = OpConstant %6 3 %32 = OpConstant %4 1 %33 = OpConstant %6 42 %34 = OpConstant %4 42 %35 = OpTypeVector %4 3 %36 = OpTypeStruct %4 %35 %6 %37 = OpTypeStruct %6 %39 = OpTypeVector %10 3 %38 = OpTypeMatrix %39 4 %41 = OpTypeVector %10 2 %40 = OpTypeMatrix %41 2 %42 = OpTypeArray %40 %7 %43 = OpTypeVector %4 2 %44 = OpTypeArray %43 %7 %45 = OpTypeRuntimeArray %37 %46 = OpTypeStruct %38 %42 %6 %44 %45 %47 = OpTypeMatrix %41 3 %48 = OpTypeStruct %47 %49 = OpTypeVector %6 2 %50 = OpTypeMatrix %41 4 %51 = OpTypeArray %50 %7 %52 = OpTypeStruct %51 %53 = OpTypePointer Function %10 %54 = OpTypeArray %10 %25 %55 = OpTypeArray %54 %26 %56 = OpTypeVector %10 4 %57 = OpTypePointer StorageBuffer %6 %58 = OpTypeArray %6 %26 %59 = OpTypePointer Workgroup %4 %60 = OpConstantComposite %35 %3 %3 %3 %61 = OpConstantComposite %36 %3 %60 %5 %62 = OpConstantComposite %41 %22 %22 %63 = OpConstantComposite %50 %62 %62 %62 %62 %64 = OpConstantComposite %51 %63 %63 %65 = OpConstantComposite %54 %22 %22 %22 %22 %22 %22 %22 %22 %22 %22 %66 = OpConstantComposite %55 %65 %65 %65 %65 %65 %67 = OpConstantComposite %49 %5 %5 %69 = OpTypePointer Private %36 %68 = OpVariable %69 Private %61 %71 = OpTypePointer StorageBuffer %46 %70 = OpVariable %71 StorageBuffer %73 = OpTypeStruct %48 %74 = OpTypePointer Uniform %73 %72 = OpVariable %74 Uniform %76 = OpTypeStruct %49 %77 = OpTypePointer StorageBuffer %76 %75 = OpVariable %77 StorageBuffer %79 = OpTypeStruct %52 %80 = OpTypePointer Uniform %79 %78 = OpVariable %80 Uniform %81 = OpVariable %59 Workgroup %83 = OpTypePointer Function %6 %85 = OpTypePointer Function %48 %86 = OpConstantNull %48 %89 = OpTypeFunction %2 %90 = OpTypePointer Uniform %48 %92 = OpTypePointer StorageBuffer %49 %96 = OpTypePointer Uniform %47 %99 = OpTypePointer Uniform %41 %105 = OpTypePointer Uniform %10 %125 = OpTypePointer Function %47 %131 = OpTypePointer Function %41 %137 = OpTypePointer Function %10 %148 = OpTypePointer Function %52 %149 = OpConstantNull %52 %152 = OpTypePointer Uniform %52 %157 = OpTypePointer Uniform %51 %160 = OpTypePointer Uniform %50 %183 = OpTypePointer Function %51 %185 = OpTypePointer Function %50 %208 = OpTypeFunction %10 %53 %214 = OpTypeFunction %10 %55 %221 = OpTypeFunction %2 %59 %225 = OpTypePointer Function %58 %226 = OpConstantNull %58 %229 = OpTypePointer Input %4 %228 = OpVariable %229 Input %232 = OpTypePointer Output %56 %231 = OpVariable %232 Output %241 = OpTypePointer StorageBuffer %38 %244 = OpTypePointer StorageBuffer %44 %247 = OpTypePointer StorageBuffer %39 %248 = OpTypePointer StorageBuffer %10 %251 = OpTypePointer StorageBuffer %45 %254 = OpTypePointer StorageBuffer %37 %255 = OpConstant %4 4 %267 = OpTypeVector %6 4 %273 = OpVariable %232 Output %291 = OpConstantNull %6 %295 = OpTypePointer StorageBuffer %6 %298 = OpConstant %4 64 %88 = OpFunction %2 None %89 %87 = OpLabel %82 = OpVariable %83 Function %8 %84 = OpVariable %85 Function %86 %91 = OpAccessChain %90 %72 %3 OpBranch %93 %93 = OpLabel %94 = OpLoad %6 %82 %95 = OpISub %6 %94 %8 OpStore %82 %95 %97 = OpAccessChain %96 %91 %3 %98 = OpLoad %47 %97 %100 = OpAccessChain %99 %91 %3 %3 %101 = OpLoad %41 %100 %102 = OpLoad %6 %82 %103 = OpAccessChain %99 %91 %3 %102 %104 = OpLoad %41 %103 %106 = OpAccessChain %105 %91 %3 %3 %32 %107 = OpLoad %10 %106 %108 = OpLoad %6 %82 %109 = OpAccessChain %105 %91 %3 %3 %108 %110 = OpLoad %10 %109 %111 = OpLoad %6 %82 %112 = OpAccessChain %105 %91 %3 %111 %32 %113 = OpLoad %10 %112 %114 = OpLoad %6 %82 %115 = OpLoad %6 %82 %116 = OpAccessChain %105 %91 %3 %114 %115 %117 = OpLoad %10 %116 %118 = OpCompositeConstruct %41 %9 %9 %119 = OpCompositeConstruct %41 %11 %11 %120 = OpCompositeConstruct %41 %12 %12 %121 = OpCompositeConstruct %47 %118 %119 %120 %122 = OpCompositeConstruct %48 %121 OpStore %84 %122 %123 = OpLoad %6 %82 %124 = OpIAdd %6 %123 %8 OpStore %82 %124 %126 = OpCompositeConstruct %41 %13 %13 %127 = OpCompositeConstruct %41 %14 %14 %128 = OpCompositeConstruct %41 %15 %15 %129 = OpCompositeConstruct %47 %126 %127 %128 %130 = OpAccessChain %125 %84 %3 OpStore %130 %129 %132 = OpCompositeConstruct %41 %16 %16 %133 = OpAccessChain %131 %84 %3 %3 OpStore %133 %132 %134 = OpLoad %6 %82 %135 = OpCompositeConstruct %41 %17 %17 %136 = OpAccessChain %131 %84 %3 %134 OpStore %136 %135 %138 = OpAccessChain %137 %84 %3 %3 %32 OpStore %138 %18 %139 = OpLoad %6 %82 %140 = OpAccessChain %137 %84 %3 %3 %139 OpStore %140 %19 %141 = OpLoad %6 %82 %142 = OpAccessChain %137 %84 %3 %141 %32 OpStore %142 %20 %143 = OpLoad %6 %82 %144 = OpLoad %6 %82 %145 = OpAccessChain %137 %84 %3 %143 %144 OpStore %145 %21 OpReturn OpFunctionEnd %151 = OpFunction %2 None %89 %150 = OpLabel %146 = OpVariable %83 Function %8 %147 = OpVariable %148 Function %149 %153 = OpAccessChain %152 %78 %3 OpBranch %154 %154 = OpLabel %155 = OpLoad %6 %146 %156 = OpISub %6 %155 %8 OpStore %146 %156 %158 = OpAccessChain %157 %153 %3 %159 = OpLoad %51 %158 %161 = OpAccessChain %160 %153 %3 %3 %162 = OpLoad %50 %161 %163 = OpAccessChain %99 %153 %3 %3 %3 %164 = OpLoad %41 %163 %165 = OpLoad %6 %146 %166 = OpAccessChain %99 %153 %3 %3 %165 %167 = OpLoad %41 %166 %168 = OpAccessChain %105 %153 %3 %3 %3 %32 %169 = OpLoad %10 %168 %170 = OpLoad %6 %146 %171 = OpAccessChain %105 %153 %3 %3 %3 %170 %172 = OpLoad %10 %171 %173 = OpLoad %6 %146 %174 = OpAccessChain %105 %153 %3 %3 %173 %32 %175 = OpLoad %10 %174 %176 = OpLoad %6 %146 %177 = OpLoad %6 %146 %178 = OpAccessChain %105 %153 %3 %3 %176 %177 %179 = OpLoad %10 %178 %180 = OpCompositeConstruct %52 %64 OpStore %147 %180 %181 = OpLoad %6 %146 %182 = OpIAdd %6 %181 %8 OpStore %146 %182 %184 = OpAccessChain %183 %147 %3 OpStore %184 %64 %186 = OpCompositeConstruct %41 %23 %23 %187 = OpCompositeConstruct %41 %24 %24 %188 = OpCompositeConstruct %41 %13 %13 %189 = OpCompositeConstruct %41 %14 %14 %190 = OpCompositeConstruct %50 %186 %187 %188 %189 %191 = OpAccessChain %185 %147 %3 %3 OpStore %191 %190 %192 = OpCompositeConstruct %41 %16 %16 %193 = OpAccessChain %131 %147 %3 %3 %3 OpStore %193 %192 %194 = OpLoad %6 %146 %195 = OpCompositeConstruct %41 %17 %17 %196 = OpAccessChain %131 %147 %3 %3 %194 OpStore %196 %195 %197 = OpAccessChain %137 %147 %3 %3 %3 %32 OpStore %197 %18 %198 = OpLoad %6 %146 %199 = OpAccessChain %137 %147 %3 %3 %3 %198 OpStore %199 %19 %200 = OpLoad %6 %146 %201 = OpAccessChain %137 %147 %3 %3 %200 %32 OpStore %201 %20 %202 = OpLoad %6 %146 %203 = OpLoad %6 %146 %204 = OpAccessChain %137 %147 %3 %3 %202 %203 OpStore %204 %21 OpReturn OpFunctionEnd %207 = OpFunction %10 None %208 %206 = OpFunctionParameter %53 %205 = OpLabel OpBranch %209 %209 = OpLabel %210 = OpLoad %10 %206 OpReturnValue %210 OpFunctionEnd %213 = OpFunction %10 None %214 %212 = OpFunctionParameter %55 %211 = OpLabel OpBranch %215 %215 = OpLabel %216 = OpCompositeExtract %54 %212 4 %217 = OpCompositeExtract %10 %216 9 OpReturnValue %217 OpFunctionEnd %220 = OpFunction %2 None %221 %219 = OpFunctionParameter %59 %218 = OpLabel OpBranch %222 %222 = OpLabel OpStore %219 %34 OpReturn OpFunctionEnd %233 = OpFunction %2 None %89 %227 = OpLabel %223 = OpVariable %53 Function %22 %224 = OpVariable %225 Function %226 %230 = OpLoad %4 %228 %234 = OpAccessChain %90 %72 %3 %235 = OpAccessChain %92 %75 %3 %236 = OpAccessChain %152 %78 %3 OpBranch %237 %237 = OpLabel %238 = OpLoad %10 %223 OpStore %223 %9 %239 = OpFunctionCall %2 %88 %240 = OpFunctionCall %2 %151 %242 = OpAccessChain %241 %70 %3 %243 = OpLoad %38 %242 %245 = OpAccessChain %244 %70 %29 %246 = OpLoad %44 %245 %249 = OpAccessChain %248 %70 %3 %29 %3 %250 = OpLoad %10 %249 %252 = OpArrayLength %4 %70 4 %253 = OpISub %4 %252 %30 %256 = OpAccessChain %57 %70 %255 %253 %3 %257 = OpLoad %6 %256 %258 = OpLoad %49 %235 %259 = OpFunctionCall %10 %207 %223 %260 = OpConvertFToS %6 %250 %261 = OpCompositeConstruct %58 %257 %260 %31 %27 %26 OpStore %224 %261 %262 = OpIAdd %4 %230 %32 %263 = OpAccessChain %83 %224 %262 OpStore %263 %33 %264 = OpAccessChain %83 %224 %230 %265 = OpLoad %6 %264 %266 = OpFunctionCall %10 %213 %66 %268 = OpCompositeConstruct %267 %265 %265 %265 %265 %269 = OpConvertSToF %56 %268 %270 = OpMatrixTimesVector %39 %243 %269 %271 = OpCompositeConstruct %56 %270 %11 OpStore %231 %271 OpReturn OpFunctionEnd %274 = OpFunction %2 None %89 %272 = OpLabel %275 = OpAccessChain %92 %75 %3 OpBranch %276 %276 = OpLabel %277 = OpAccessChain %248 %70 %3 %32 %30 OpStore %277 %9 %278 = OpCompositeConstruct %39 %22 %22 %22 %279 = OpCompositeConstruct %39 %9 %9 %9 %280 = OpCompositeConstruct %39 %11 %11 %11 %281 = OpCompositeConstruct %39 %12 %12 %12 %282 = OpCompositeConstruct %38 %278 %279 %280 %281 %283 = OpAccessChain %241 %70 %3 OpStore %283 %282 %284 = OpCompositeConstruct %43 %3 %3 %285 = OpCompositeConstruct %43 %32 %32 %286 = OpCompositeConstruct %44 %284 %285 %287 = OpAccessChain %244 %70 %29 OpStore %287 %286 %288 = OpAccessChain %57 %70 %255 %32 %3 OpStore %288 %8 OpStore %275 %67 %289 = OpCompositeConstruct %56 %22 %22 %22 %22 OpStore %273 %289 OpReturn OpFunctionEnd %293 = OpFunction %2 None %89 %292 = OpLabel %290 = OpVariable %83 Function %291 OpBranch %294 %294 = OpLabel %296 = OpAccessChain %295 %70 %30 %297 = OpAtomicLoad %6 %296 %8 %298 %300 = OpAccessChain %295 %70 %30 %299 = OpAtomicIAdd %6 %300 %8 %298 %26 OpStore %290 %299 %302 = OpAccessChain %295 %70 %30 %301 = OpAtomicISub %6 %302 %8 %298 %26 OpStore %290 %301 %304 = OpAccessChain %295 %70 %30 %303 = OpAtomicAnd %6 %304 %8 %298 %26 OpStore %290 %303 %306 = OpAccessChain %295 %70 %30 %305 = OpAtomicOr %6 %306 %8 %298 %26 OpStore %290 %305 %308 = OpAccessChain %295 %70 %30 %307 = OpAtomicXor %6 %308 %8 %298 %26 OpStore %290 %307 %310 = OpAccessChain %295 %70 %30 %309 = OpAtomicSMin %6 %310 %8 %298 %26 OpStore %290 %309 %312 = OpAccessChain %295 %70 %30 %311 = OpAtomicSMax %6 %312 %8 %298 %26 OpStore %290 %311 %314 = OpAccessChain %295 %70 %30 %313 = OpAtomicExchange %6 %314 %8 %298 %26 OpStore %290 %313 %315 = OpAccessChain %295 %70 %30 OpAtomicStore %315 %8 %298 %297 OpReturn OpFunctionEnd %317 = OpFunction %2 None %89 %316 = OpLabel OpBranch %318 %318 = OpLabel %319 = OpFunctionCall %2 %220 %81 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/binding-arrays.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 431 OpCapability Shader OpCapability ImageQuery OpCapability ShaderNonUniform OpExtension "SPV_EXT_descriptor_indexing" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %65 "main" %60 %63 OpExecutionMode %65 OriginUpperLeft OpMemberDecorate %9 0 Offset 0 OpMemberDecorate %24 0 Offset 0 OpDecorate %27 DescriptorSet 0 OpDecorate %27 Binding 0 OpDecorate %31 DescriptorSet 0 OpDecorate %31 Binding 1 OpDecorate %33 DescriptorSet 0 OpDecorate %33 Binding 2 OpDecorate %35 DescriptorSet 0 OpDecorate %35 Binding 3 OpDecorate %37 DescriptorSet 0 OpDecorate %37 Binding 4 OpDecorate %39 DescriptorSet 0 OpDecorate %39 Binding 5 OpDecorate %41 DescriptorSet 0 OpDecorate %41 Binding 6 OpDecorate %43 DescriptorSet 0 OpDecorate %43 Binding 7 OpDecorate %45 DescriptorSet 0 OpDecorate %45 Binding 8 OpDecorate %46 Block OpMemberDecorate %46 0 Offset 0 OpDecorate %60 Location 0 OpDecorate %60 Flat OpDecorate %63 Location 0 OpDecorate %93 NonUniform OpDecorate %116 NonUniform OpDecorate %118 NonUniform OpDecorate %143 NonUniform OpDecorate %145 NonUniform OpDecorate %183 NonUniform OpDecorate %212 NonUniform OpDecorate %228 NonUniform OpDecorate %244 NonUniform OpDecorate %265 NonUniform OpDecorate %267 NonUniform OpDecorate %289 NonUniform OpDecorate %291 NonUniform OpDecorate %313 NonUniform OpDecorate %315 NonUniform OpDecorate %337 NonUniform OpDecorate %339 NonUniform OpDecorate %361 NonUniform OpDecorate %363 NonUniform OpDecorate %385 NonUniform OpDecorate %387 NonUniform OpDecorate %409 NonUniform %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 5 %5 = OpConstant %4 0 %7 = OpTypeFloat 32 %6 = OpConstant %7 0.0 %8 = OpTypeInt 32 0 %9 = OpTypeStruct %8 %10 = OpTypeImage %7 2D 0 0 0 1 Unknown %11 = OpTypeRuntimeArray %10 %12 = OpTypeArray %10 %3 %13 = OpTypeImage %7 2D 0 1 0 1 Unknown %14 = OpTypeArray %13 %3 %15 = OpTypeImage %7 2D 0 0 1 1 Unknown %16 = OpTypeArray %15 %3 %17 = OpTypeImage %7 2D 1 0 0 1 Unknown %18 = OpTypeArray %17 %3 %19 = OpTypeImage %7 2D 0 0 0 2 Rgba32f %20 = OpTypeArray %19 %3 %21 = OpTypeSampler %22 = OpTypeArray %21 %3 %23 = OpTypeArray %21 %3 %24 = OpTypeStruct %8 %25 = OpTypeVector %7 4 %26 = OpTypeVector %4 2 %30 = OpConstant %8 10 %29 = OpTypeArray %10 %30 %28 = OpTypePointer UniformConstant %29 %27 = OpVariable %28 UniformConstant %32 = OpTypePointer UniformConstant %12 %31 = OpVariable %32 UniformConstant %34 = OpTypePointer UniformConstant %14 %33 = OpVariable %34 UniformConstant %36 = OpTypePointer UniformConstant %16 %35 = OpVariable %36 UniformConstant %38 = OpTypePointer UniformConstant %18 %37 = OpVariable %38 UniformConstant %40 = OpTypePointer UniformConstant %20 %39 = OpVariable %40 UniformConstant %42 = OpTypePointer UniformConstant %22 %41 = OpVariable %42 UniformConstant %44 = OpTypePointer UniformConstant %23 %43 = OpVariable %44 UniformConstant %46 = OpTypeStruct %9 %47 = OpTypePointer Uniform %46 %45 = OpVariable %47 Uniform %49 = OpTypePointer Function %4 %51 = OpTypePointer Function %26 %52 = OpConstantNull %26 %54 = OpTypePointer Function %7 %56 = OpTypePointer Function %25 %57 = OpConstantNull %25 %61 = OpTypePointer Input %8 %60 = OpVariable %61 Input %64 = OpTypePointer Output %25 %63 = OpVariable %64 Output %66 = OpTypeFunction %2 %67 = OpTypePointer Uniform %9 %68 = OpConstant %8 0 %71 = OpTypePointer Uniform %8 %77 = OpTypeVector %7 2 %81 = OpTypePointer UniformConstant %10 %99 = OpTypePointer UniformConstant %21 %102 = OpTypeSampledImage %10 %123 = OpTypePointer UniformConstant %17 %126 = OpTypePointer UniformConstant %21 %129 = OpTypeSampledImage %17 %152 = OpTypeBool %153 = OpConstantNull %25 %159 = OpTypeVector %152 2 %169 = OpConstantNull %25 %184 = OpConstantNull %25 %197 = OpTypePointer UniformConstant %13 %200 = OpTypeVector %4 3 %232 = OpTypePointer UniformConstant %15 %391 = OpTypePointer UniformConstant %19 %65 = OpFunction %2 None %66 %58 = OpLabel %50 = OpVariable %51 Function %52 %55 = OpVariable %56 Function %57 %48 = OpVariable %49 Function %5 %53 = OpVariable %54 Function %6 %62 = OpLoad %8 %60 %59 = OpCompositeConstruct %24 %62 %69 = OpAccessChain %67 %45 %68 OpBranch %70 %70 = OpLabel %72 = OpAccessChain %71 %69 %68 %73 = OpLoad %8 %72 %74 = OpCompositeExtract %8 %59 0 %75 = OpCompositeConstruct %26 %5 %5 OpStore %50 %75 %76 = OpCompositeConstruct %25 %6 %6 %6 %6 OpStore %55 %76 %78 = OpCompositeConstruct %77 %6 %6 %79 = OpCompositeConstruct %26 %5 %5 %80 = OpLoad %26 %50 %82 = OpAccessChain %81 %27 %68 %83 = OpLoad %10 %82 %84 = OpImageQuerySizeLod %26 %83 %68 %85 = OpIAdd %26 %80 %84 OpStore %50 %85 %86 = OpLoad %26 %50 %87 = OpAccessChain %81 %27 %73 %88 = OpLoad %10 %87 %89 = OpImageQuerySizeLod %26 %88 %68 %90 = OpIAdd %26 %86 %89 OpStore %50 %90 %91 = OpLoad %26 %50 %92 = OpAccessChain %81 %27 %74 %93 = OpLoad %10 %92 %94 = OpImageQuerySizeLod %26 %93 %68 %95 = OpIAdd %26 %91 %94 OpStore %50 %95 %96 = OpLoad %25 %55 %97 = OpAccessChain %81 %31 %68 %98 = OpLoad %10 %97 %100 = OpAccessChain %99 %41 %68 %101 = OpLoad %21 %100 %103 = OpSampledImage %102 %98 %101 %104 = OpImageGather %25 %103 %78 %68 %105 = OpFAdd %25 %96 %104 OpStore %55 %105 %106 = OpLoad %25 %55 %107 = OpAccessChain %81 %31 %73 %108 = OpLoad %10 %107 %109 = OpAccessChain %99 %41 %73 %110 = OpLoad %21 %109 %111 = OpSampledImage %102 %108 %110 %112 = OpImageGather %25 %111 %78 %68 %113 = OpFAdd %25 %106 %112 OpStore %55 %113 %114 = OpLoad %25 %55 %115 = OpAccessChain %81 %31 %74 %116 = OpLoad %10 %115 %117 = OpAccessChain %99 %41 %74 %118 = OpLoad %21 %117 %119 = OpSampledImage %102 %116 %118 %120 = OpImageGather %25 %119 %78 %68 %121 = OpFAdd %25 %114 %120 OpStore %55 %121 %122 = OpLoad %25 %55 %124 = OpAccessChain %123 %37 %68 %125 = OpLoad %17 %124 %127 = OpAccessChain %126 %43 %68 %128 = OpLoad %21 %127 %130 = OpSampledImage %129 %125 %128 %131 = OpImageDrefGather %25 %130 %78 %6 %132 = OpFAdd %25 %122 %131 OpStore %55 %132 %133 = OpLoad %25 %55 %134 = OpAccessChain %123 %37 %73 %135 = OpLoad %17 %134 %136 = OpAccessChain %126 %43 %73 %137 = OpLoad %21 %136 %138 = OpSampledImage %129 %135 %137 %139 = OpImageDrefGather %25 %138 %78 %6 %140 = OpFAdd %25 %133 %139 OpStore %55 %140 %141 = OpLoad %25 %55 %142 = OpAccessChain %123 %37 %74 %143 = OpLoad %17 %142 %144 = OpAccessChain %126 %43 %74 %145 = OpLoad %21 %144 %146 = OpSampledImage %129 %143 %145 %147 = OpImageDrefGather %25 %146 %78 %6 %148 = OpFAdd %25 %141 %147 OpStore %55 %148 %149 = OpLoad %25 %55 %150 = OpAccessChain %81 %27 %68 %151 = OpLoad %10 %150 %154 = OpImageQueryLevels %4 %151 %155 = OpULessThan %152 %5 %154 OpSelectionMerge %156 None OpBranchConditional %155 %157 %156 %157 = OpLabel %158 = OpImageQuerySizeLod %26 %151 %5 %160 = OpULessThan %159 %79 %158 %161 = OpAll %152 %160 OpBranchConditional %161 %162 %156 %162 = OpLabel %163 = OpImageFetch %25 %151 %79 Lod %5 OpBranch %156 %156 = OpLabel %164 = OpPhi %25 %153 %70 %153 %157 %163 %162 %165 = OpFAdd %25 %149 %164 OpStore %55 %165 %166 = OpLoad %25 %55 %167 = OpAccessChain %81 %27 %73 %168 = OpLoad %10 %167 %170 = OpImageQueryLevels %4 %168 %171 = OpULessThan %152 %5 %170 OpSelectionMerge %172 None OpBranchConditional %171 %173 %172 %173 = OpLabel %174 = OpImageQuerySizeLod %26 %168 %5 %175 = OpULessThan %159 %79 %174 %176 = OpAll %152 %175 OpBranchConditional %176 %177 %172 %177 = OpLabel %178 = OpImageFetch %25 %168 %79 Lod %5 OpBranch %172 %172 = OpLabel %179 = OpPhi %25 %169 %156 %169 %173 %178 %177 %180 = OpFAdd %25 %166 %179 OpStore %55 %180 %181 = OpLoad %25 %55 %182 = OpAccessChain %81 %27 %74 %183 = OpLoad %10 %182 %185 = OpImageQueryLevels %4 %183 %186 = OpULessThan %152 %5 %185 OpSelectionMerge %187 None OpBranchConditional %186 %188 %187 %188 = OpLabel %189 = OpImageQuerySizeLod %26 %183 %5 %190 = OpULessThan %159 %79 %189 %191 = OpAll %152 %190 OpBranchConditional %191 %192 %187 %192 = OpLabel %193 = OpImageFetch %25 %183 %79 Lod %5 OpBranch %187 %187 = OpLabel %194 = OpPhi %25 %184 %172 %184 %188 %193 %192 %195 = OpFAdd %25 %181 %194 OpStore %55 %195 %196 = OpLoad %4 %48 %198 = OpAccessChain %197 %33 %68 %199 = OpLoad %13 %198 %201 = OpImageQuerySizeLod %200 %199 %68 %202 = OpCompositeExtract %4 %201 2 %203 = OpIAdd %4 %196 %202 OpStore %48 %203 %204 = OpLoad %4 %48 %205 = OpAccessChain %197 %33 %73 %206 = OpLoad %13 %205 %207 = OpImageQuerySizeLod %200 %206 %68 %208 = OpCompositeExtract %4 %207 2 %209 = OpIAdd %4 %204 %208 OpStore %48 %209 %210 = OpLoad %4 %48 %211 = OpAccessChain %197 %33 %74 %212 = OpLoad %13 %211 %213 = OpImageQuerySizeLod %200 %212 %68 %214 = OpCompositeExtract %4 %213 2 %215 = OpIAdd %4 %210 %214 OpStore %48 %215 %216 = OpLoad %4 %48 %217 = OpAccessChain %81 %31 %68 %218 = OpLoad %10 %217 %219 = OpImageQueryLevels %4 %218 %220 = OpIAdd %4 %216 %219 OpStore %48 %220 %221 = OpLoad %4 %48 %222 = OpAccessChain %81 %31 %73 %223 = OpLoad %10 %222 %224 = OpImageQueryLevels %4 %223 %225 = OpIAdd %4 %221 %224 OpStore %48 %225 %226 = OpLoad %4 %48 %227 = OpAccessChain %81 %31 %74 %228 = OpLoad %10 %227 %229 = OpImageQueryLevels %4 %228 %230 = OpIAdd %4 %226 %229 OpStore %48 %230 %231 = OpLoad %4 %48 %233 = OpAccessChain %232 %35 %68 %234 = OpLoad %15 %233 %235 = OpImageQuerySamples %4 %234 %236 = OpIAdd %4 %231 %235 OpStore %48 %236 %237 = OpLoad %4 %48 %238 = OpAccessChain %232 %35 %73 %239 = OpLoad %15 %238 %240 = OpImageQuerySamples %4 %239 %241 = OpIAdd %4 %237 %240 OpStore %48 %241 %242 = OpLoad %4 %48 %243 = OpAccessChain %232 %35 %74 %244 = OpLoad %15 %243 %245 = OpImageQuerySamples %4 %244 %246 = OpIAdd %4 %242 %245 OpStore %48 %246 %247 = OpLoad %25 %55 %248 = OpAccessChain %81 %31 %68 %249 = OpLoad %10 %248 %250 = OpAccessChain %99 %41 %68 %251 = OpLoad %21 %250 %252 = OpSampledImage %102 %249 %251 %253 = OpImageSampleImplicitLod %25 %252 %78 %254 = OpFAdd %25 %247 %253 OpStore %55 %254 %255 = OpLoad %25 %55 %256 = OpAccessChain %81 %31 %73 %257 = OpLoad %10 %256 %258 = OpAccessChain %99 %41 %73 %259 = OpLoad %21 %258 %260 = OpSampledImage %102 %257 %259 %261 = OpImageSampleImplicitLod %25 %260 %78 %262 = OpFAdd %25 %255 %261 OpStore %55 %262 %263 = OpLoad %25 %55 %264 = OpAccessChain %81 %31 %74 %265 = OpLoad %10 %264 %266 = OpAccessChain %99 %41 %74 %267 = OpLoad %21 %266 %268 = OpSampledImage %102 %265 %267 %269 = OpImageSampleImplicitLod %25 %268 %78 %270 = OpFAdd %25 %263 %269 OpStore %55 %270 %271 = OpLoad %25 %55 %272 = OpAccessChain %81 %31 %68 %273 = OpLoad %10 %272 %274 = OpAccessChain %99 %41 %68 %275 = OpLoad %21 %274 %276 = OpSampledImage %102 %273 %275 %277 = OpImageSampleImplicitLod %25 %276 %78 Bias %6 %278 = OpFAdd %25 %271 %277 OpStore %55 %278 %279 = OpLoad %25 %55 %280 = OpAccessChain %81 %31 %73 %281 = OpLoad %10 %280 %282 = OpAccessChain %99 %41 %73 %283 = OpLoad %21 %282 %284 = OpSampledImage %102 %281 %283 %285 = OpImageSampleImplicitLod %25 %284 %78 Bias %6 %286 = OpFAdd %25 %279 %285 OpStore %55 %286 %287 = OpLoad %25 %55 %288 = OpAccessChain %81 %31 %74 %289 = OpLoad %10 %288 %290 = OpAccessChain %99 %41 %74 %291 = OpLoad %21 %290 %292 = OpSampledImage %102 %289 %291 %293 = OpImageSampleImplicitLod %25 %292 %78 Bias %6 %294 = OpFAdd %25 %287 %293 OpStore %55 %294 %295 = OpLoad %7 %53 %296 = OpAccessChain %123 %37 %68 %297 = OpLoad %17 %296 %298 = OpAccessChain %126 %43 %68 %299 = OpLoad %21 %298 %300 = OpSampledImage %129 %297 %299 %301 = OpImageSampleDrefImplicitLod %7 %300 %78 %6 %302 = OpFAdd %7 %295 %301 OpStore %53 %302 %303 = OpLoad %7 %53 %304 = OpAccessChain %123 %37 %73 %305 = OpLoad %17 %304 %306 = OpAccessChain %126 %43 %73 %307 = OpLoad %21 %306 %308 = OpSampledImage %129 %305 %307 %309 = OpImageSampleDrefImplicitLod %7 %308 %78 %6 %310 = OpFAdd %7 %303 %309 OpStore %53 %310 %311 = OpLoad %7 %53 %312 = OpAccessChain %123 %37 %74 %313 = OpLoad %17 %312 %314 = OpAccessChain %126 %43 %74 %315 = OpLoad %21 %314 %316 = OpSampledImage %129 %313 %315 %317 = OpImageSampleDrefImplicitLod %7 %316 %78 %6 %318 = OpFAdd %7 %311 %317 OpStore %53 %318 %319 = OpLoad %7 %53 %320 = OpAccessChain %123 %37 %68 %321 = OpLoad %17 %320 %322 = OpAccessChain %126 %43 %68 %323 = OpLoad %21 %322 %324 = OpSampledImage %129 %321 %323 %325 = OpImageSampleDrefExplicitLod %7 %324 %78 %6 Lod %6 %326 = OpFAdd %7 %319 %325 OpStore %53 %326 %327 = OpLoad %7 %53 %328 = OpAccessChain %123 %37 %73 %329 = OpLoad %17 %328 %330 = OpAccessChain %126 %43 %73 %331 = OpLoad %21 %330 %332 = OpSampledImage %129 %329 %331 %333 = OpImageSampleDrefExplicitLod %7 %332 %78 %6 Lod %6 %334 = OpFAdd %7 %327 %333 OpStore %53 %334 %335 = OpLoad %7 %53 %336 = OpAccessChain %123 %37 %74 %337 = OpLoad %17 %336 %338 = OpAccessChain %126 %43 %74 %339 = OpLoad %21 %338 %340 = OpSampledImage %129 %337 %339 %341 = OpImageSampleDrefExplicitLod %7 %340 %78 %6 Lod %6 %342 = OpFAdd %7 %335 %341 OpStore %53 %342 %343 = OpLoad %25 %55 %344 = OpAccessChain %81 %31 %68 %345 = OpLoad %10 %344 %346 = OpAccessChain %99 %41 %68 %347 = OpLoad %21 %346 %348 = OpSampledImage %102 %345 %347 %349 = OpImageSampleExplicitLod %25 %348 %78 Grad %78 %78 %350 = OpFAdd %25 %343 %349 OpStore %55 %350 %351 = OpLoad %25 %55 %352 = OpAccessChain %81 %31 %73 %353 = OpLoad %10 %352 %354 = OpAccessChain %99 %41 %73 %355 = OpLoad %21 %354 %356 = OpSampledImage %102 %353 %355 %357 = OpImageSampleExplicitLod %25 %356 %78 Grad %78 %78 %358 = OpFAdd %25 %351 %357 OpStore %55 %358 %359 = OpLoad %25 %55 %360 = OpAccessChain %81 %31 %74 %361 = OpLoad %10 %360 %362 = OpAccessChain %99 %41 %74 %363 = OpLoad %21 %362 %364 = OpSampledImage %102 %361 %363 %365 = OpImageSampleExplicitLod %25 %364 %78 Grad %78 %78 %366 = OpFAdd %25 %359 %365 OpStore %55 %366 %367 = OpLoad %25 %55 %368 = OpAccessChain %81 %31 %68 %369 = OpLoad %10 %368 %370 = OpAccessChain %99 %41 %68 %371 = OpLoad %21 %370 %372 = OpSampledImage %102 %369 %371 %373 = OpImageSampleExplicitLod %25 %372 %78 Lod %6 %374 = OpFAdd %25 %367 %373 OpStore %55 %374 %375 = OpLoad %25 %55 %376 = OpAccessChain %81 %31 %73 %377 = OpLoad %10 %376 %378 = OpAccessChain %99 %41 %73 %379 = OpLoad %21 %378 %380 = OpSampledImage %102 %377 %379 %381 = OpImageSampleExplicitLod %25 %380 %78 Lod %6 %382 = OpFAdd %25 %375 %381 OpStore %55 %382 %383 = OpLoad %25 %55 %384 = OpAccessChain %81 %31 %74 %385 = OpLoad %10 %384 %386 = OpAccessChain %99 %41 %74 %387 = OpLoad %21 %386 %388 = OpSampledImage %102 %385 %387 %389 = OpImageSampleExplicitLod %25 %388 %78 Lod %6 %390 = OpFAdd %25 %383 %389 OpStore %55 %390 %392 = OpAccessChain %391 %39 %68 %393 = OpLoad %19 %392 %394 = OpLoad %25 %55 %395 = OpImageQuerySize %26 %393 %396 = OpULessThan %159 %79 %395 %397 = OpAll %152 %396 OpSelectionMerge %398 None OpBranchConditional %397 %399 %398 %399 = OpLabel OpImageWrite %393 %79 %394 OpBranch %398 %398 = OpLabel %400 = OpAccessChain %391 %39 %73 %401 = OpLoad %19 %400 %402 = OpLoad %25 %55 %403 = OpImageQuerySize %26 %401 %404 = OpULessThan %159 %79 %403 %405 = OpAll %152 %404 OpSelectionMerge %406 None OpBranchConditional %405 %407 %406 %407 = OpLabel OpImageWrite %401 %79 %402 OpBranch %406 %406 = OpLabel %408 = OpAccessChain %391 %39 %74 %409 = OpLoad %19 %408 %410 = OpLoad %25 %55 %411 = OpImageQuerySize %26 %409 %412 = OpULessThan %159 %79 %411 %413 = OpAll %152 %412 OpSelectionMerge %414 None OpBranchConditional %413 %415 %414 %415 = OpLabel OpImageWrite %409 %79 %410 OpBranch %414 %414 = OpLabel %416 = OpLoad %26 %50 %417 = OpLoad %4 %48 %418 = OpCompositeConstruct %26 %417 %417 %419 = OpIAdd %26 %416 %418 %420 = OpConvertSToF %77 %419 %421 = OpLoad %25 %55 %422 = OpCompositeExtract %7 %420 0 %423 = OpCompositeExtract %7 %420 1 %424 = OpCompositeExtract %7 %420 0 %425 = OpCompositeExtract %7 %420 1 %426 = OpCompositeConstruct %25 %422 %423 %424 %425 %427 = OpFAdd %25 %421 %426 %428 = OpLoad %7 %53 %429 = OpCompositeConstruct %25 %428 %428 %428 %428 %430 = OpFAdd %25 %427 %429 OpStore %63 %430 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bitcast.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 76 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %46 "main" OpExecutionMode %46 LocalSize 1 1 1 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 0 %8 = OpTypeFloat 32 %7 = OpConstant %8 0.0 %9 = OpTypeVector %4 2 %10 = OpTypeVector %4 3 %11 = OpTypeVector %4 4 %12 = OpTypeVector %6 2 %13 = OpTypeVector %6 3 %14 = OpTypeVector %6 4 %15 = OpTypeVector %8 2 %16 = OpTypeVector %8 3 %17 = OpTypeVector %8 4 %19 = OpTypePointer Function %9 %20 = OpConstantNull %9 %22 = OpTypePointer Function %10 %23 = OpConstantNull %10 %25 = OpTypePointer Function %11 %26 = OpConstantNull %11 %28 = OpTypePointer Function %12 %29 = OpConstantNull %12 %31 = OpTypePointer Function %13 %32 = OpConstantNull %13 %34 = OpTypePointer Function %14 %35 = OpConstantNull %14 %37 = OpTypePointer Function %15 %38 = OpConstantNull %15 %40 = OpTypePointer Function %16 %41 = OpConstantNull %16 %43 = OpTypePointer Function %17 %44 = OpConstantNull %17 %47 = OpTypeFunction %2 %46 = OpFunction %2 None %47 %45 = OpLabel %36 = OpVariable %37 Function %38 %27 = OpVariable %28 Function %29 %18 = OpVariable %19 Function %20 %39 = OpVariable %40 Function %41 %30 = OpVariable %31 Function %32 %21 = OpVariable %22 Function %23 %42 = OpVariable %43 Function %44 %33 = OpVariable %34 Function %35 %24 = OpVariable %25 Function %26 OpBranch %48 %48 = OpLabel %49 = OpCompositeConstruct %9 %3 %3 OpStore %18 %49 %50 = OpCompositeConstruct %10 %3 %3 %3 OpStore %21 %50 %51 = OpCompositeConstruct %11 %3 %3 %3 %3 OpStore %24 %51 %52 = OpCompositeConstruct %12 %5 %5 OpStore %27 %52 %53 = OpCompositeConstruct %13 %5 %5 %5 OpStore %30 %53 %54 = OpCompositeConstruct %14 %5 %5 %5 %5 OpStore %33 %54 %55 = OpCompositeConstruct %15 %7 %7 OpStore %36 %55 %56 = OpCompositeConstruct %16 %7 %7 %7 OpStore %39 %56 %57 = OpCompositeConstruct %17 %7 %7 %7 %7 OpStore %42 %57 %58 = OpLoad %9 %18 %59 = OpBitcast %12 %58 OpStore %27 %59 %60 = OpLoad %10 %21 %61 = OpBitcast %13 %60 OpStore %30 %61 %62 = OpLoad %11 %24 %63 = OpBitcast %14 %62 OpStore %33 %63 %64 = OpLoad %12 %27 %65 = OpBitcast %9 %64 OpStore %18 %65 %66 = OpLoad %13 %30 %67 = OpBitcast %10 %66 OpStore %21 %67 %68 = OpLoad %14 %33 %69 = OpBitcast %11 %68 OpStore %24 %69 %70 = OpLoad %9 %18 %71 = OpBitcast %15 %70 OpStore %36 %71 %72 = OpLoad %10 %21 %73 = OpBitcast %16 %72 OpStore %39 %73 %74 = OpLoad %11 %24 %75 = OpBitcast %17 %74 OpStore %42 %75 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bits.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 159 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %48 "main" OpExecutionMode %48 LocalSize 1 1 1 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 0 %8 = OpTypeFloat 32 %7 = OpConstant %8 0.0 %9 = OpConstant %6 5 %10 = OpConstant %6 10 %11 = OpTypeVector %4 2 %12 = OpTypeVector %4 3 %13 = OpTypeVector %4 4 %14 = OpTypeVector %6 2 %15 = OpTypeVector %6 3 %16 = OpTypeVector %6 4 %17 = OpTypeVector %8 2 %18 = OpTypeVector %8 4 %20 = OpTypePointer Function %4 %22 = OpTypePointer Function %11 %23 = OpConstantNull %11 %25 = OpTypePointer Function %12 %26 = OpConstantNull %12 %28 = OpTypePointer Function %13 %29 = OpConstantNull %13 %31 = OpTypePointer Function %6 %33 = OpTypePointer Function %14 %34 = OpConstantNull %14 %36 = OpTypePointer Function %15 %37 = OpConstantNull %15 %39 = OpTypePointer Function %16 %40 = OpConstantNull %16 %42 = OpTypePointer Function %17 %43 = OpConstantNull %17 %45 = OpTypePointer Function %18 %46 = OpConstantNull %18 %49 = OpTypeFunction %2 %48 = OpFunction %2 None %49 %47 = OpLabel %44 = OpVariable %45 Function %46 %35 = OpVariable %36 Function %37 %27 = OpVariable %28 Function %29 %19 = OpVariable %20 Function %3 %38 = OpVariable %39 Function %40 %30 = OpVariable %31 Function %5 %21 = OpVariable %22 Function %23 %41 = OpVariable %42 Function %43 %32 = OpVariable %33 Function %34 %24 = OpVariable %25 Function %26 OpBranch %50 %50 = OpLabel %51 = OpCompositeConstruct %11 %3 %3 OpStore %21 %51 %52 = OpCompositeConstruct %12 %3 %3 %3 OpStore %24 %52 %53 = OpCompositeConstruct %13 %3 %3 %3 %3 OpStore %27 %53 %54 = OpCompositeConstruct %14 %5 %5 OpStore %32 %54 %55 = OpCompositeConstruct %15 %5 %5 %5 OpStore %35 %55 %56 = OpCompositeConstruct %16 %5 %5 %5 %5 OpStore %38 %56 %57 = OpCompositeConstruct %17 %7 %7 OpStore %41 %57 %58 = OpCompositeConstruct %18 %7 %7 %7 %7 OpStore %44 %58 %59 = OpLoad %18 %44 %60 = OpExtInst %6 %1 PackSnorm4x8 %59 OpStore %30 %60 %61 = OpLoad %18 %44 %62 = OpExtInst %6 %1 PackUnorm4x8 %61 OpStore %30 %62 %63 = OpLoad %17 %41 %64 = OpExtInst %6 %1 PackSnorm2x16 %63 OpStore %30 %64 %65 = OpLoad %17 %41 %66 = OpExtInst %6 %1 PackUnorm2x16 %65 OpStore %30 %66 %67 = OpLoad %17 %41 %68 = OpExtInst %6 %1 PackHalf2x16 %67 OpStore %30 %68 %69 = OpLoad %6 %30 %70 = OpExtInst %18 %1 UnpackSnorm4x8 %69 OpStore %44 %70 %71 = OpLoad %6 %30 %72 = OpExtInst %18 %1 UnpackUnorm4x8 %71 OpStore %44 %72 %73 = OpLoad %6 %30 %74 = OpExtInst %17 %1 UnpackSnorm2x16 %73 OpStore %41 %74 %75 = OpLoad %6 %30 %76 = OpExtInst %17 %1 UnpackUnorm2x16 %75 OpStore %41 %76 %77 = OpLoad %6 %30 %78 = OpExtInst %17 %1 UnpackHalf2x16 %77 OpStore %41 %78 %79 = OpLoad %4 %19 %80 = OpLoad %4 %19 %81 = OpBitFieldInsert %4 %79 %80 %9 %10 OpStore %19 %81 %82 = OpLoad %11 %21 %83 = OpLoad %11 %21 %84 = OpBitFieldInsert %11 %82 %83 %9 %10 OpStore %21 %84 %85 = OpLoad %12 %24 %86 = OpLoad %12 %24 %87 = OpBitFieldInsert %12 %85 %86 %9 %10 OpStore %24 %87 %88 = OpLoad %13 %27 %89 = OpLoad %13 %27 %90 = OpBitFieldInsert %13 %88 %89 %9 %10 OpStore %27 %90 %91 = OpLoad %6 %30 %92 = OpLoad %6 %30 %93 = OpBitFieldInsert %6 %91 %92 %9 %10 OpStore %30 %93 %94 = OpLoad %14 %32 %95 = OpLoad %14 %32 %96 = OpBitFieldInsert %14 %94 %95 %9 %10 OpStore %32 %96 %97 = OpLoad %15 %35 %98 = OpLoad %15 %35 %99 = OpBitFieldInsert %15 %97 %98 %9 %10 OpStore %35 %99 %100 = OpLoad %16 %38 %101 = OpLoad %16 %38 %102 = OpBitFieldInsert %16 %100 %101 %9 %10 OpStore %38 %102 %103 = OpLoad %4 %19 %104 = OpBitFieldSExtract %4 %103 %9 %10 OpStore %19 %104 %105 = OpLoad %11 %21 %106 = OpBitFieldSExtract %11 %105 %9 %10 OpStore %21 %106 %107 = OpLoad %12 %24 %108 = OpBitFieldSExtract %12 %107 %9 %10 OpStore %24 %108 %109 = OpLoad %13 %27 %110 = OpBitFieldSExtract %13 %109 %9 %10 OpStore %27 %110 %111 = OpLoad %6 %30 %112 = OpBitFieldUExtract %6 %111 %9 %10 OpStore %30 %112 %113 = OpLoad %14 %32 %114 = OpBitFieldUExtract %14 %113 %9 %10 OpStore %32 %114 %115 = OpLoad %15 %35 %116 = OpBitFieldUExtract %15 %115 %9 %10 OpStore %35 %116 %117 = OpLoad %16 %38 %118 = OpBitFieldUExtract %16 %117 %9 %10 OpStore %38 %118 %119 = OpLoad %4 %19 %120 = OpExtInst %4 %1 FindILsb %119 OpStore %19 %120 %121 = OpLoad %14 %32 %122 = OpExtInst %14 %1 FindILsb %121 OpStore %32 %122 %123 = OpLoad %12 %24 %124 = OpExtInst %12 %1 FindSMsb %123 OpStore %24 %124 %125 = OpLoad %6 %30 %126 = OpExtInst %6 %1 FindUMsb %125 OpStore %30 %126 %127 = OpLoad %4 %19 %128 = OpBitCount %4 %127 OpStore %19 %128 %129 = OpLoad %11 %21 %130 = OpBitCount %11 %129 OpStore %21 %130 %131 = OpLoad %12 %24 %132 = OpBitCount %12 %131 OpStore %24 %132 %133 = OpLoad %13 %27 %134 = OpBitCount %13 %133 OpStore %27 %134 %135 = OpLoad %6 %30 %136 = OpBitCount %6 %135 OpStore %30 %136 %137 = OpLoad %14 %32 %138 = OpBitCount %14 %137 OpStore %32 %138 %139 = OpLoad %15 %35 %140 = OpBitCount %15 %139 OpStore %35 %140 %141 = OpLoad %16 %38 %142 = OpBitCount %16 %141 OpStore %38 %142 %143 = OpLoad %4 %19 %144 = OpBitReverse %4 %143 OpStore %19 %144 %145 = OpLoad %11 %21 %146 = OpBitReverse %11 %145 OpStore %21 %146 %147 = OpLoad %12 %24 %148 = OpBitReverse %12 %147 OpStore %24 %148 %149 = OpLoad %13 %27 %150 = OpBitReverse %13 %149 OpStore %27 %150 %151 = OpLoad %6 %30 %152 = OpBitReverse %6 %151 OpStore %30 %152 %153 = OpLoad %14 %32 %154 = OpBitReverse %14 %153 OpStore %32 %154 %155 = OpLoad %15 %35 %156 = OpBitReverse %15 %155 OpStore %35 %156 %157 = OpLoad %16 %38 %158 = OpBitReverse %16 %157 OpStore %38 %158 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/boids.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 213 OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %51 "main" %48 OpExecutionMode %51 LocalSize 64 1 1 OpSource GLSL 450 OpName %3 "NUM_PARTICLES" OpMemberName %16 0 "pos" OpMemberName %16 1 "vel" OpName %16 "Particle" OpMemberName %17 0 "deltaT" OpMemberName %17 1 "rule1Distance" OpMemberName %17 2 "rule2Distance" OpMemberName %17 3 "rule3Distance" OpMemberName %17 4 "rule1Scale" OpMemberName %17 5 "rule2Scale" OpMemberName %17 6 "rule3Scale" OpName %17 "SimParams" OpMemberName %19 0 "particles" OpName %19 "Particles" OpName %21 "params" OpName %24 "particlesSrc" OpName %26 "particlesDst" OpName %27 "vPos" OpName %30 "vVel" OpName %32 "cMass" OpName %34 "cVel" OpName %36 "colVel" OpName %38 "cMassCount" OpName %40 "cVelCount" OpName %41 "pos" OpName %43 "vel" OpName %45 "i" OpName %48 "global_invocation_id" OpName %51 "main" OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 Offset 8 OpMemberDecorate %17 0 Offset 0 OpMemberDecorate %17 1 Offset 4 OpMemberDecorate %17 2 Offset 8 OpMemberDecorate %17 3 Offset 12 OpMemberDecorate %17 4 Offset 16 OpMemberDecorate %17 5 Offset 20 OpMemberDecorate %17 6 Offset 24 OpDecorate %18 ArrayStride 16 OpMemberDecorate %19 0 Offset 0 OpDecorate %21 DescriptorSet 0 OpDecorate %21 Binding 0 OpDecorate %22 Block OpMemberDecorate %22 0 Offset 0 OpDecorate %24 NonWritable OpDecorate %24 DescriptorSet 0 OpDecorate %24 Binding 1 OpDecorate %19 Block OpDecorate %26 DescriptorSet 0 OpDecorate %26 Binding 2 OpDecorate %19 Block OpDecorate %48 BuiltIn GlobalInvocationId %2 = OpTypeVoid %4 = OpTypeInt 32 0 %3 = OpConstant %4 1500 %6 = OpTypeFloat 32 %5 = OpConstant %6 0.0 %8 = OpTypeInt 32 1 %7 = OpConstant %8 0 %9 = OpConstant %4 0 %10 = OpConstant %8 1 %11 = OpConstant %4 1 %12 = OpConstant %6 0.1 %13 = OpConstant %6 -1.0 %14 = OpConstant %6 1.0 %15 = OpTypeVector %6 2 %16 = OpTypeStruct %15 %15 %17 = OpTypeStruct %6 %6 %6 %6 %6 %6 %6 %18 = OpTypeRuntimeArray %16 %19 = OpTypeStruct %18 %20 = OpTypeVector %4 3 %22 = OpTypeStruct %17 %23 = OpTypePointer Uniform %22 %21 = OpVariable %23 Uniform %25 = OpTypePointer StorageBuffer %19 %24 = OpVariable %25 StorageBuffer %26 = OpVariable %25 StorageBuffer %28 = OpTypePointer Function %15 %29 = OpConstantNull %15 %31 = OpConstantNull %15 %33 = OpConstantNull %15 %35 = OpConstantNull %15 %37 = OpConstantNull %15 %39 = OpTypePointer Function %8 %42 = OpConstantNull %15 %44 = OpConstantNull %15 %46 = OpTypePointer Function %4 %49 = OpTypePointer Input %20 %48 = OpVariable %49 Input %52 = OpTypeFunction %2 %53 = OpTypePointer Uniform %17 %57 = OpTypeBool %61 = OpTypePointer StorageBuffer %18 %62 = OpTypePointer StorageBuffer %16 %63 = OpTypePointer StorageBuffer %15 %92 = OpTypePointer Uniform %6 %106 = OpConstant %4 2 %120 = OpConstant %4 3 %155 = OpConstant %4 4 %161 = OpConstant %4 5 %167 = OpConstant %4 6 %184 = OpTypePointer Function %6 %51 = OpFunction %2 None %52 %47 = OpLabel %45 = OpVariable %46 Function %9 %40 = OpVariable %39 Function %7 %34 = OpVariable %28 Function %35 %27 = OpVariable %28 Function %29 %41 = OpVariable %28 Function %42 %36 = OpVariable %28 Function %37 %30 = OpVariable %28 Function %31 %43 = OpVariable %28 Function %44 %38 = OpVariable %39 Function %7 %32 = OpVariable %28 Function %33 %50 = OpLoad %20 %48 %54 = OpAccessChain %53 %21 %9 OpBranch %55 %55 = OpLabel %56 = OpCompositeExtract %4 %50 0 %58 = OpUGreaterThanEqual %57 %56 %3 OpSelectionMerge %59 None OpBranchConditional %58 %60 %59 %60 = OpLabel OpReturn %59 = OpLabel %64 = OpAccessChain %63 %24 %9 %56 %9 %65 = OpLoad %15 %64 OpStore %27 %65 %66 = OpAccessChain %63 %24 %9 %56 %11 %67 = OpLoad %15 %66 OpStore %30 %67 %68 = OpCompositeConstruct %15 %5 %5 OpStore %32 %68 %69 = OpCompositeConstruct %15 %5 %5 OpStore %34 %69 %70 = OpCompositeConstruct %15 %5 %5 OpStore %36 %70 OpBranch %71 %71 = OpLabel OpLoopMerge %72 %74 None OpBranch %73 %73 = OpLabel %75 = OpLoad %4 %45 %76 = OpUGreaterThanEqual %57 %75 %3 OpSelectionMerge %77 None OpBranchConditional %76 %78 %77 %78 = OpLabel OpBranch %72 %77 = OpLabel %79 = OpLoad %4 %45 %80 = OpIEqual %57 %79 %56 OpSelectionMerge %81 None OpBranchConditional %80 %82 %81 %82 = OpLabel OpBranch %74 %81 = OpLabel %83 = OpLoad %4 %45 %84 = OpAccessChain %63 %24 %9 %83 %9 %85 = OpLoad %15 %84 OpStore %41 %85 %86 = OpLoad %4 %45 %87 = OpAccessChain %63 %24 %9 %86 %11 %88 = OpLoad %15 %87 OpStore %43 %88 %89 = OpLoad %15 %41 %90 = OpLoad %15 %27 %91 = OpExtInst %6 %1 Distance %89 %90 %93 = OpAccessChain %92 %54 %11 %94 = OpLoad %6 %93 %95 = OpFOrdLessThan %57 %91 %94 OpSelectionMerge %96 None OpBranchConditional %95 %97 %96 %97 = OpLabel %98 = OpLoad %15 %32 %99 = OpLoad %15 %41 %100 = OpFAdd %15 %98 %99 OpStore %32 %100 %101 = OpLoad %8 %38 %102 = OpIAdd %8 %101 %10 OpStore %38 %102 OpBranch %96 %96 = OpLabel %103 = OpLoad %15 %41 %104 = OpLoad %15 %27 %105 = OpExtInst %6 %1 Distance %103 %104 %107 = OpAccessChain %92 %54 %106 %108 = OpLoad %6 %107 %109 = OpFOrdLessThan %57 %105 %108 OpSelectionMerge %110 None OpBranchConditional %109 %111 %110 %111 = OpLabel %112 = OpLoad %15 %36 %113 = OpLoad %15 %41 %114 = OpLoad %15 %27 %115 = OpFSub %15 %113 %114 %116 = OpFSub %15 %112 %115 OpStore %36 %116 OpBranch %110 %110 = OpLabel %117 = OpLoad %15 %41 %118 = OpLoad %15 %27 %119 = OpExtInst %6 %1 Distance %117 %118 %121 = OpAccessChain %92 %54 %120 %122 = OpLoad %6 %121 %123 = OpFOrdLessThan %57 %119 %122 OpSelectionMerge %124 None OpBranchConditional %123 %125 %124 %125 = OpLabel %126 = OpLoad %15 %34 %127 = OpLoad %15 %43 %128 = OpFAdd %15 %126 %127 OpStore %34 %128 %129 = OpLoad %8 %40 %130 = OpIAdd %8 %129 %10 OpStore %40 %130 OpBranch %124 %124 = OpLabel OpBranch %74 %74 = OpLabel %131 = OpLoad %4 %45 %132 = OpIAdd %4 %131 %11 OpStore %45 %132 OpBranch %71 %72 = OpLabel %133 = OpLoad %8 %38 %134 = OpSGreaterThan %57 %133 %7 OpSelectionMerge %135 None OpBranchConditional %134 %136 %135 %136 = OpLabel %137 = OpLoad %15 %32 %138 = OpLoad %8 %38 %139 = OpConvertSToF %6 %138 %140 = OpCompositeConstruct %15 %139 %139 %141 = OpFDiv %15 %137 %140 %142 = OpLoad %15 %27 %143 = OpFSub %15 %141 %142 OpStore %32 %143 OpBranch %135 %135 = OpLabel %144 = OpLoad %8 %40 %145 = OpSGreaterThan %57 %144 %7 OpSelectionMerge %146 None OpBranchConditional %145 %147 %146 %147 = OpLabel %148 = OpLoad %15 %34 %149 = OpLoad %8 %40 %150 = OpConvertSToF %6 %149 %151 = OpCompositeConstruct %15 %150 %150 %152 = OpFDiv %15 %148 %151 OpStore %34 %152 OpBranch %146 %146 = OpLabel %153 = OpLoad %15 %30 %154 = OpLoad %15 %32 %156 = OpAccessChain %92 %54 %155 %157 = OpLoad %6 %156 %158 = OpVectorTimesScalar %15 %154 %157 %159 = OpFAdd %15 %153 %158 %160 = OpLoad %15 %36 %162 = OpAccessChain %92 %54 %161 %163 = OpLoad %6 %162 %164 = OpVectorTimesScalar %15 %160 %163 %165 = OpFAdd %15 %159 %164 %166 = OpLoad %15 %34 %168 = OpAccessChain %92 %54 %167 %169 = OpLoad %6 %168 %170 = OpVectorTimesScalar %15 %166 %169 %171 = OpFAdd %15 %165 %170 OpStore %30 %171 %172 = OpLoad %15 %30 %173 = OpExtInst %15 %1 Normalize %172 %174 = OpLoad %15 %30 %175 = OpExtInst %6 %1 Length %174 %176 = OpExtInst %6 %1 FClamp %175 %5 %12 %177 = OpVectorTimesScalar %15 %173 %176 OpStore %30 %177 %178 = OpLoad %15 %27 %179 = OpLoad %15 %30 %180 = OpAccessChain %92 %54 %9 %181 = OpLoad %6 %180 %182 = OpVectorTimesScalar %15 %179 %181 %183 = OpFAdd %15 %178 %182 OpStore %27 %183 %185 = OpAccessChain %184 %27 %9 %186 = OpLoad %6 %185 %187 = OpFOrdLessThan %57 %186 %13 OpSelectionMerge %188 None OpBranchConditional %187 %189 %188 %189 = OpLabel %190 = OpAccessChain %184 %27 %9 OpStore %190 %14 OpBranch %188 %188 = OpLabel %191 = OpAccessChain %184 %27 %9 %192 = OpLoad %6 %191 %193 = OpFOrdGreaterThan %57 %192 %14 OpSelectionMerge %194 None OpBranchConditional %193 %195 %194 %195 = OpLabel %196 = OpAccessChain %184 %27 %9 OpStore %196 %13 OpBranch %194 %194 = OpLabel %197 = OpAccessChain %184 %27 %11 %198 = OpLoad %6 %197 %199 = OpFOrdLessThan %57 %198 %13 OpSelectionMerge %200 None OpBranchConditional %199 %201 %200 %201 = OpLabel %202 = OpAccessChain %184 %27 %11 OpStore %202 %14 OpBranch %200 %200 = OpLabel %203 = OpAccessChain %184 %27 %11 %204 = OpLoad %6 %203 %205 = OpFOrdGreaterThan %57 %204 %14 OpSelectionMerge %206 None OpBranchConditional %205 %207 %206 %207 = OpLabel %208 = OpAccessChain %184 %27 %11 OpStore %208 %13 OpBranch %206 %206 = OpLabel %209 = OpLoad %15 %27 %210 = OpAccessChain %63 %26 %9 %56 %9 OpStore %210 %209 %211 = OpLoad %15 %30 %212 = OpAccessChain %63 %26 %9 %56 %11 OpStore %212 %211 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bounds-check-image-restrict.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 244 OpCapability ImageQuery OpCapability Image1D OpCapability Shader OpCapability Sampled1D %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %222 "fragment_shader" %220 OpExecutionMode %222 OriginUpperLeft OpSource GLSL 450 OpName %25 "image_1d" OpName %27 "image_2d" OpName %29 "image_2d_array" OpName %31 "image_3d" OpName %33 "image_multisampled_2d" OpName %35 "image_depth_2d" OpName %37 "image_depth_2d_array" OpName %39 "image_depth_multisampled_2d" OpName %41 "image_storage_1d" OpName %43 "image_storage_2d" OpName %45 "image_storage_2d_array" OpName %47 "image_storage_3d" OpName %50 "coords" OpName %51 "level" OpName %52 "test_textureLoad_1d" OpName %65 "coords" OpName %66 "level" OpName %67 "test_textureLoad_2d" OpName %80 "coords" OpName %81 "index" OpName %82 "level" OpName %83 "test_textureLoad_2d_array" OpName %97 "coords" OpName %98 "level" OpName %99 "test_textureLoad_3d" OpName %112 "coords" OpName %113 "_sample" OpName %114 "test_textureLoad_multisampled_2d" OpName %126 "coords" OpName %127 "level" OpName %128 "test_textureLoad_depth_2d" OpName %142 "coords" OpName %143 "index" OpName %144 "level" OpName %145 "test_textureLoad_depth_2d_array" OpName %160 "coords" OpName %161 "_sample" OpName %162 "test_textureLoad_depth_multisampled_2d" OpName %175 "coords" OpName %176 "value" OpName %177 "test_textureStore_1d" OpName %185 "coords" OpName %186 "value" OpName %187 "test_textureStore_2d" OpName %196 "coords" OpName %197 "array_index" OpName %198 "value" OpName %199 "test_textureStore_2d_array" OpName %209 "coords" OpName %210 "value" OpName %211 "test_textureStore_3d" OpName %222 "fragment_shader" OpDecorate %25 DescriptorSet 0 OpDecorate %25 Binding 0 OpDecorate %27 DescriptorSet 0 OpDecorate %27 Binding 1 OpDecorate %29 DescriptorSet 0 OpDecorate %29 Binding 2 OpDecorate %31 DescriptorSet 0 OpDecorate %31 Binding 3 OpDecorate %33 DescriptorSet 0 OpDecorate %33 Binding 4 OpDecorate %35 DescriptorSet 0 OpDecorate %35 Binding 5 OpDecorate %37 DescriptorSet 0 OpDecorate %37 Binding 6 OpDecorate %39 DescriptorSet 0 OpDecorate %39 Binding 7 OpDecorate %41 NonReadable OpDecorate %41 DescriptorSet 0 OpDecorate %41 Binding 8 OpDecorate %43 NonReadable OpDecorate %43 DescriptorSet 0 OpDecorate %43 Binding 9 OpDecorate %45 NonReadable OpDecorate %45 DescriptorSet 0 OpDecorate %45 Binding 10 OpDecorate %47 NonReadable OpDecorate %47 DescriptorSet 0 OpDecorate %47 Binding 11 OpDecorate %220 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 0 %6 = OpTypeFloat 32 %5 = OpConstant %6 0.0 %7 = OpTypeImage %6 1D 0 0 0 1 Unknown %8 = OpTypeVector %6 4 %9 = OpTypeImage %6 2D 0 0 0 1 Unknown %10 = OpTypeVector %4 2 %11 = OpTypeImage %6 2D 0 1 0 1 Unknown %12 = OpTypeImage %6 3D 0 0 0 1 Unknown %13 = OpTypeVector %4 3 %14 = OpTypeImage %6 2D 0 0 1 1 Unknown %15 = OpTypeImage %6 2D 1 0 0 1 Unknown %16 = OpTypeImage %6 2D 1 1 0 1 Unknown %17 = OpTypeImage %6 2D 1 0 1 1 Unknown %18 = OpTypeImage %6 1D 0 0 0 2 Rgba8 %19 = OpTypeImage %6 2D 0 0 0 2 Rgba8 %20 = OpTypeImage %6 2D 0 1 0 2 Rgba8 %21 = OpTypeImage %6 3D 0 0 0 2 Rgba8 %22 = OpConstantComposite %10 %3 %3 %23 = OpConstantComposite %13 %3 %3 %3 %24 = OpConstantComposite %8 %5 %5 %5 %5 %26 = OpTypePointer UniformConstant %7 %25 = OpVariable %26 UniformConstant %28 = OpTypePointer UniformConstant %9 %27 = OpVariable %28 UniformConstant %30 = OpTypePointer UniformConstant %11 %29 = OpVariable %30 UniformConstant %32 = OpTypePointer UniformConstant %12 %31 = OpVariable %32 UniformConstant %34 = OpTypePointer UniformConstant %14 %33 = OpVariable %34 UniformConstant %36 = OpTypePointer UniformConstant %15 %35 = OpVariable %36 UniformConstant %38 = OpTypePointer UniformConstant %16 %37 = OpVariable %38 UniformConstant %40 = OpTypePointer UniformConstant %17 %39 = OpVariable %40 UniformConstant %42 = OpTypePointer UniformConstant %18 %41 = OpVariable %42 UniformConstant %44 = OpTypePointer UniformConstant %19 %43 = OpVariable %44 UniformConstant %46 = OpTypePointer UniformConstant %20 %45 = OpVariable %46 UniformConstant %48 = OpTypePointer UniformConstant %21 %47 = OpVariable %48 UniformConstant %53 = OpTypeFunction %8 %4 %4 %57 = OpConstant %4 1 %68 = OpTypeFunction %8 %10 %4 %75 = OpConstantComposite %10 %57 %57 %84 = OpTypeFunction %8 %10 %4 %4 %92 = OpConstantComposite %13 %57 %57 %57 %100 = OpTypeFunction %8 %13 %4 %107 = OpConstantComposite %13 %57 %57 %57 %121 = OpConstantComposite %10 %57 %57 %129 = OpTypeFunction %6 %10 %4 %136 = OpConstantComposite %10 %57 %57 %146 = OpTypeFunction %6 %10 %4 %4 %154 = OpConstantComposite %13 %57 %57 %57 %169 = OpConstantComposite %10 %57 %57 %178 = OpTypeFunction %2 %4 %8 %188 = OpTypeFunction %2 %10 %8 %192 = OpConstantComposite %10 %57 %57 %200 = OpTypeFunction %2 %10 %4 %8 %205 = OpConstantComposite %13 %57 %57 %57 %212 = OpTypeFunction %2 %13 %8 %216 = OpConstantComposite %13 %57 %57 %57 %221 = OpTypePointer Output %8 %220 = OpVariable %221 Output %223 = OpTypeFunction %2 %52 = OpFunction %8 None %53 %50 = OpFunctionParameter %4 %51 = OpFunctionParameter %4 %49 = OpLabel %54 = OpLoad %7 %25 OpBranch %55 %55 = OpLabel %56 = OpImageQueryLevels %4 %54 %58 = OpISub %4 %56 %57 %59 = OpExtInst %4 %1 UMin %51 %58 %60 = OpImageQuerySizeLod %4 %54 %59 %61 = OpISub %4 %60 %57 %62 = OpExtInst %4 %1 UMin %50 %61 %63 = OpImageFetch %8 %54 %62 Lod %59 OpReturnValue %63 OpFunctionEnd %67 = OpFunction %8 None %68 %65 = OpFunctionParameter %10 %66 = OpFunctionParameter %4 %64 = OpLabel %69 = OpLoad %9 %27 OpBranch %70 %70 = OpLabel %71 = OpImageQueryLevels %4 %69 %72 = OpISub %4 %71 %57 %73 = OpExtInst %4 %1 UMin %66 %72 %74 = OpImageQuerySizeLod %10 %69 %73 %76 = OpISub %10 %74 %75 %77 = OpExtInst %10 %1 UMin %65 %76 %78 = OpImageFetch %8 %69 %77 Lod %73 OpReturnValue %78 OpFunctionEnd %83 = OpFunction %8 None %84 %80 = OpFunctionParameter %10 %81 = OpFunctionParameter %4 %82 = OpFunctionParameter %4 %79 = OpLabel %85 = OpLoad %11 %29 OpBranch %86 %86 = OpLabel %87 = OpCompositeConstruct %13 %80 %81 %88 = OpImageQueryLevels %4 %85 %89 = OpISub %4 %88 %57 %90 = OpExtInst %4 %1 UMin %82 %89 %91 = OpImageQuerySizeLod %13 %85 %90 %93 = OpISub %13 %91 %92 %94 = OpExtInst %13 %1 UMin %87 %93 %95 = OpImageFetch %8 %85 %94 Lod %90 OpReturnValue %95 OpFunctionEnd %99 = OpFunction %8 None %100 %97 = OpFunctionParameter %13 %98 = OpFunctionParameter %4 %96 = OpLabel %101 = OpLoad %12 %31 OpBranch %102 %102 = OpLabel %103 = OpImageQueryLevels %4 %101 %104 = OpISub %4 %103 %57 %105 = OpExtInst %4 %1 UMin %98 %104 %106 = OpImageQuerySizeLod %13 %101 %105 %108 = OpISub %13 %106 %107 %109 = OpExtInst %13 %1 UMin %97 %108 %110 = OpImageFetch %8 %101 %109 Lod %105 OpReturnValue %110 OpFunctionEnd %114 = OpFunction %8 None %68 %112 = OpFunctionParameter %10 %113 = OpFunctionParameter %4 %111 = OpLabel %115 = OpLoad %14 %33 OpBranch %116 %116 = OpLabel %117 = OpImageQuerySamples %4 %115 %118 = OpISub %4 %117 %57 %119 = OpExtInst %4 %1 UMin %113 %118 %120 = OpImageQuerySize %10 %115 %122 = OpISub %10 %120 %121 %123 = OpExtInst %10 %1 UMin %112 %122 %124 = OpImageFetch %8 %115 %123 Sample %119 OpReturnValue %124 OpFunctionEnd %128 = OpFunction %6 None %129 %126 = OpFunctionParameter %10 %127 = OpFunctionParameter %4 %125 = OpLabel %130 = OpLoad %15 %35 OpBranch %131 %131 = OpLabel %132 = OpImageQueryLevels %4 %130 %133 = OpISub %4 %132 %57 %134 = OpExtInst %4 %1 UMin %127 %133 %135 = OpImageQuerySizeLod %10 %130 %134 %137 = OpISub %10 %135 %136 %138 = OpExtInst %10 %1 UMin %126 %137 %139 = OpImageFetch %8 %130 %138 Lod %134 %140 = OpCompositeExtract %6 %139 0 OpReturnValue %140 OpFunctionEnd %145 = OpFunction %6 None %146 %142 = OpFunctionParameter %10 %143 = OpFunctionParameter %4 %144 = OpFunctionParameter %4 %141 = OpLabel %147 = OpLoad %16 %37 OpBranch %148 %148 = OpLabel %149 = OpCompositeConstruct %13 %142 %143 %150 = OpImageQueryLevels %4 %147 %151 = OpISub %4 %150 %57 %152 = OpExtInst %4 %1 UMin %144 %151 %153 = OpImageQuerySizeLod %13 %147 %152 %155 = OpISub %13 %153 %154 %156 = OpExtInst %13 %1 UMin %149 %155 %157 = OpImageFetch %8 %147 %156 Lod %152 %158 = OpCompositeExtract %6 %157 0 OpReturnValue %158 OpFunctionEnd %162 = OpFunction %6 None %129 %160 = OpFunctionParameter %10 %161 = OpFunctionParameter %4 %159 = OpLabel %163 = OpLoad %17 %39 OpBranch %164 %164 = OpLabel %165 = OpImageQuerySamples %4 %163 %166 = OpISub %4 %165 %57 %167 = OpExtInst %4 %1 UMin %161 %166 %168 = OpImageQuerySize %10 %163 %170 = OpISub %10 %168 %169 %171 = OpExtInst %10 %1 UMin %160 %170 %172 = OpImageFetch %8 %163 %171 Sample %167 %173 = OpCompositeExtract %6 %172 0 OpReturnValue %173 OpFunctionEnd %177 = OpFunction %2 None %178 %175 = OpFunctionParameter %4 %176 = OpFunctionParameter %8 %174 = OpLabel %179 = OpLoad %18 %41 OpBranch %180 %180 = OpLabel %181 = OpImageQuerySize %4 %179 %182 = OpISub %4 %181 %57 %183 = OpExtInst %4 %1 UMin %175 %182 OpImageWrite %179 %183 %176 OpReturn OpFunctionEnd %187 = OpFunction %2 None %188 %185 = OpFunctionParameter %10 %186 = OpFunctionParameter %8 %184 = OpLabel %189 = OpLoad %19 %43 OpBranch %190 %190 = OpLabel %191 = OpImageQuerySize %10 %189 %193 = OpISub %10 %191 %192 %194 = OpExtInst %10 %1 UMin %185 %193 OpImageWrite %189 %194 %186 OpReturn OpFunctionEnd %199 = OpFunction %2 None %200 %196 = OpFunctionParameter %10 %197 = OpFunctionParameter %4 %198 = OpFunctionParameter %8 %195 = OpLabel %201 = OpLoad %20 %45 OpBranch %202 %202 = OpLabel %203 = OpCompositeConstruct %13 %196 %197 %204 = OpImageQuerySize %13 %201 %206 = OpISub %13 %204 %205 %207 = OpExtInst %13 %1 UMin %203 %206 OpImageWrite %201 %207 %198 OpReturn OpFunctionEnd %211 = OpFunction %2 None %212 %209 = OpFunctionParameter %13 %210 = OpFunctionParameter %8 %208 = OpLabel %213 = OpLoad %21 %47 OpBranch %214 %214 = OpLabel %215 = OpImageQuerySize %13 %213 %217 = OpISub %13 %215 %216 %218 = OpExtInst %13 %1 UMin %209 %217 OpImageWrite %213 %218 %210 OpReturn OpFunctionEnd %222 = OpFunction %2 None %223 %219 = OpLabel %224 = OpLoad %7 %25 %225 = OpLoad %9 %27 %226 = OpLoad %11 %29 %227 = OpLoad %12 %31 %228 = OpLoad %14 %33 %229 = OpLoad %18 %41 %230 = OpLoad %19 %43 %231 = OpLoad %20 %45 %232 = OpLoad %21 %47 OpBranch %233 %233 = OpLabel %234 = OpFunctionCall %8 %52 %3 %3 %235 = OpFunctionCall %8 %67 %22 %3 %236 = OpFunctionCall %8 %83 %22 %3 %3 %237 = OpFunctionCall %8 %99 %23 %3 %238 = OpFunctionCall %8 %114 %22 %3 %239 = OpFunctionCall %2 %177 %3 %24 %240 = OpFunctionCall %2 %187 %22 %24 %241 = OpFunctionCall %2 %199 %22 %3 %24 %242 = OpFunctionCall %2 %211 %23 %24 %243 = OpCompositeConstruct %8 %5 %5 %5 %5 OpStore %220 %243 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bounds-check-image-rzsw.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 274 OpCapability ImageQuery OpCapability Image1D OpCapability Shader OpCapability Sampled1D %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %252 "fragment_shader" %250 OpExecutionMode %252 OriginUpperLeft OpSource GLSL 450 OpName %25 "image_1d" OpName %27 "image_2d" OpName %29 "image_2d_array" OpName %31 "image_3d" OpName %33 "image_multisampled_2d" OpName %35 "image_depth_2d" OpName %37 "image_depth_2d_array" OpName %39 "image_depth_multisampled_2d" OpName %41 "image_storage_1d" OpName %43 "image_storage_2d" OpName %45 "image_storage_2d_array" OpName %47 "image_storage_3d" OpName %50 "coords" OpName %51 "level" OpName %52 "test_textureLoad_1d" OpName %68 "coords" OpName %69 "level" OpName %70 "test_textureLoad_2d" OpName %87 "coords" OpName %88 "index" OpName %89 "level" OpName %90 "test_textureLoad_2d_array" OpName %108 "coords" OpName %109 "level" OpName %110 "test_textureLoad_3d" OpName %126 "coords" OpName %127 "_sample" OpName %128 "test_textureLoad_multisampled_2d" OpName %143 "coords" OpName %144 "level" OpName %145 "test_textureLoad_depth_2d" OpName %162 "coords" OpName %163 "index" OpName %164 "level" OpName %165 "test_textureLoad_depth_2d_array" OpName %183 "coords" OpName %184 "_sample" OpName %185 "test_textureLoad_depth_multisampled_2d" OpName %201 "coords" OpName %202 "value" OpName %203 "test_textureStore_1d" OpName %212 "coords" OpName %213 "value" OpName %214 "test_textureStore_2d" OpName %224 "coords" OpName %225 "array_index" OpName %226 "value" OpName %227 "test_textureStore_2d_array" OpName %238 "coords" OpName %239 "value" OpName %240 "test_textureStore_3d" OpName %252 "fragment_shader" OpDecorate %25 DescriptorSet 0 OpDecorate %25 Binding 0 OpDecorate %27 DescriptorSet 0 OpDecorate %27 Binding 1 OpDecorate %29 DescriptorSet 0 OpDecorate %29 Binding 2 OpDecorate %31 DescriptorSet 0 OpDecorate %31 Binding 3 OpDecorate %33 DescriptorSet 0 OpDecorate %33 Binding 4 OpDecorate %35 DescriptorSet 0 OpDecorate %35 Binding 5 OpDecorate %37 DescriptorSet 0 OpDecorate %37 Binding 6 OpDecorate %39 DescriptorSet 0 OpDecorate %39 Binding 7 OpDecorate %41 NonReadable OpDecorate %41 DescriptorSet 0 OpDecorate %41 Binding 8 OpDecorate %43 NonReadable OpDecorate %43 DescriptorSet 0 OpDecorate %43 Binding 9 OpDecorate %45 NonReadable OpDecorate %45 DescriptorSet 0 OpDecorate %45 Binding 10 OpDecorate %47 NonReadable OpDecorate %47 DescriptorSet 0 OpDecorate %47 Binding 11 OpDecorate %250 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 0 %6 = OpTypeFloat 32 %5 = OpConstant %6 0.0 %7 = OpTypeImage %6 1D 0 0 0 1 Unknown %8 = OpTypeVector %6 4 %9 = OpTypeImage %6 2D 0 0 0 1 Unknown %10 = OpTypeVector %4 2 %11 = OpTypeImage %6 2D 0 1 0 1 Unknown %12 = OpTypeImage %6 3D 0 0 0 1 Unknown %13 = OpTypeVector %4 3 %14 = OpTypeImage %6 2D 0 0 1 1 Unknown %15 = OpTypeImage %6 2D 1 0 0 1 Unknown %16 = OpTypeImage %6 2D 1 1 0 1 Unknown %17 = OpTypeImage %6 2D 1 0 1 1 Unknown %18 = OpTypeImage %6 1D 0 0 0 2 Rgba8 %19 = OpTypeImage %6 2D 0 0 0 2 Rgba8 %20 = OpTypeImage %6 2D 0 1 0 2 Rgba8 %21 = OpTypeImage %6 3D 0 0 0 2 Rgba8 %22 = OpConstantComposite %10 %3 %3 %23 = OpConstantComposite %13 %3 %3 %3 %24 = OpConstantComposite %8 %5 %5 %5 %5 %26 = OpTypePointer UniformConstant %7 %25 = OpVariable %26 UniformConstant %28 = OpTypePointer UniformConstant %9 %27 = OpVariable %28 UniformConstant %30 = OpTypePointer UniformConstant %11 %29 = OpVariable %30 UniformConstant %32 = OpTypePointer UniformConstant %12 %31 = OpVariable %32 UniformConstant %34 = OpTypePointer UniformConstant %14 %33 = OpVariable %34 UniformConstant %36 = OpTypePointer UniformConstant %15 %35 = OpVariable %36 UniformConstant %38 = OpTypePointer UniformConstant %16 %37 = OpVariable %38 UniformConstant %40 = OpTypePointer UniformConstant %17 %39 = OpVariable %40 UniformConstant %42 = OpTypePointer UniformConstant %18 %41 = OpVariable %42 UniformConstant %44 = OpTypePointer UniformConstant %19 %43 = OpVariable %44 UniformConstant %46 = OpTypePointer UniformConstant %20 %45 = OpVariable %46 UniformConstant %48 = OpTypePointer UniformConstant %21 %47 = OpVariable %48 UniformConstant %53 = OpTypeFunction %8 %4 %4 %56 = OpTypeBool %57 = OpConstantNull %8 %71 = OpTypeFunction %8 %10 %4 %74 = OpConstantNull %8 %80 = OpTypeVector %56 2 %91 = OpTypeFunction %8 %10 %4 %4 %95 = OpConstantNull %8 %101 = OpTypeVector %56 3 %111 = OpTypeFunction %8 %13 %4 %114 = OpConstantNull %8 %131 = OpConstantNull %8 %146 = OpTypeFunction %6 %10 %4 %149 = OpConstantNull %8 %166 = OpTypeFunction %6 %10 %4 %4 %170 = OpConstantNull %8 %188 = OpConstantNull %8 %204 = OpTypeFunction %2 %4 %8 %215 = OpTypeFunction %2 %10 %8 %228 = OpTypeFunction %2 %10 %4 %8 %241 = OpTypeFunction %2 %13 %8 %251 = OpTypePointer Output %8 %250 = OpVariable %251 Output %253 = OpTypeFunction %2 %52 = OpFunction %8 None %53 %50 = OpFunctionParameter %4 %51 = OpFunctionParameter %4 %49 = OpLabel %54 = OpLoad %7 %25 OpBranch %55 %55 = OpLabel %58 = OpImageQueryLevels %4 %54 %59 = OpULessThan %56 %51 %58 OpSelectionMerge %60 None OpBranchConditional %59 %61 %60 %61 = OpLabel %62 = OpImageQuerySizeLod %4 %54 %51 %63 = OpULessThan %56 %50 %62 OpBranchConditional %63 %64 %60 %64 = OpLabel %65 = OpImageFetch %8 %54 %50 Lod %51 OpBranch %60 %60 = OpLabel %66 = OpPhi %8 %57 %55 %57 %61 %65 %64 OpReturnValue %66 OpFunctionEnd %70 = OpFunction %8 None %71 %68 = OpFunctionParameter %10 %69 = OpFunctionParameter %4 %67 = OpLabel %72 = OpLoad %9 %27 OpBranch %73 %73 = OpLabel %75 = OpImageQueryLevels %4 %72 %76 = OpULessThan %56 %69 %75 OpSelectionMerge %77 None OpBranchConditional %76 %78 %77 %78 = OpLabel %79 = OpImageQuerySizeLod %10 %72 %69 %81 = OpULessThan %80 %68 %79 %82 = OpAll %56 %81 OpBranchConditional %82 %83 %77 %83 = OpLabel %84 = OpImageFetch %8 %72 %68 Lod %69 OpBranch %77 %77 = OpLabel %85 = OpPhi %8 %74 %73 %74 %78 %84 %83 OpReturnValue %85 OpFunctionEnd %90 = OpFunction %8 None %91 %87 = OpFunctionParameter %10 %88 = OpFunctionParameter %4 %89 = OpFunctionParameter %4 %86 = OpLabel %92 = OpLoad %11 %29 OpBranch %93 %93 = OpLabel %94 = OpCompositeConstruct %13 %87 %88 %96 = OpImageQueryLevels %4 %92 %97 = OpULessThan %56 %89 %96 OpSelectionMerge %98 None OpBranchConditional %97 %99 %98 %99 = OpLabel %100 = OpImageQuerySizeLod %13 %92 %89 %102 = OpULessThan %101 %94 %100 %103 = OpAll %56 %102 OpBranchConditional %103 %104 %98 %104 = OpLabel %105 = OpImageFetch %8 %92 %94 Lod %89 OpBranch %98 %98 = OpLabel %106 = OpPhi %8 %95 %93 %95 %99 %105 %104 OpReturnValue %106 OpFunctionEnd %110 = OpFunction %8 None %111 %108 = OpFunctionParameter %13 %109 = OpFunctionParameter %4 %107 = OpLabel %112 = OpLoad %12 %31 OpBranch %113 %113 = OpLabel %115 = OpImageQueryLevels %4 %112 %116 = OpULessThan %56 %109 %115 OpSelectionMerge %117 None OpBranchConditional %116 %118 %117 %118 = OpLabel %119 = OpImageQuerySizeLod %13 %112 %109 %120 = OpULessThan %101 %108 %119 %121 = OpAll %56 %120 OpBranchConditional %121 %122 %117 %122 = OpLabel %123 = OpImageFetch %8 %112 %108 Lod %109 OpBranch %117 %117 = OpLabel %124 = OpPhi %8 %114 %113 %114 %118 %123 %122 OpReturnValue %124 OpFunctionEnd %128 = OpFunction %8 None %71 %126 = OpFunctionParameter %10 %127 = OpFunctionParameter %4 %125 = OpLabel %129 = OpLoad %14 %33 OpBranch %130 %130 = OpLabel %132 = OpImageQuerySamples %4 %129 %133 = OpULessThan %56 %127 %132 OpSelectionMerge %134 None OpBranchConditional %133 %135 %134 %135 = OpLabel %136 = OpImageQuerySize %10 %129 %137 = OpULessThan %80 %126 %136 %138 = OpAll %56 %137 OpBranchConditional %138 %139 %134 %139 = OpLabel %140 = OpImageFetch %8 %129 %126 Sample %127 OpBranch %134 %134 = OpLabel %141 = OpPhi %8 %131 %130 %131 %135 %140 %139 OpReturnValue %141 OpFunctionEnd %145 = OpFunction %6 None %146 %143 = OpFunctionParameter %10 %144 = OpFunctionParameter %4 %142 = OpLabel %147 = OpLoad %15 %35 OpBranch %148 %148 = OpLabel %150 = OpImageQueryLevels %4 %147 %151 = OpULessThan %56 %144 %150 OpSelectionMerge %152 None OpBranchConditional %151 %153 %152 %153 = OpLabel %154 = OpImageQuerySizeLod %10 %147 %144 %155 = OpULessThan %80 %143 %154 %156 = OpAll %56 %155 OpBranchConditional %156 %157 %152 %157 = OpLabel %158 = OpImageFetch %8 %147 %143 Lod %144 OpBranch %152 %152 = OpLabel %159 = OpPhi %8 %149 %148 %149 %153 %158 %157 %160 = OpCompositeExtract %6 %159 0 OpReturnValue %160 OpFunctionEnd %165 = OpFunction %6 None %166 %162 = OpFunctionParameter %10 %163 = OpFunctionParameter %4 %164 = OpFunctionParameter %4 %161 = OpLabel %167 = OpLoad %16 %37 OpBranch %168 %168 = OpLabel %169 = OpCompositeConstruct %13 %162 %163 %171 = OpImageQueryLevels %4 %167 %172 = OpULessThan %56 %164 %171 OpSelectionMerge %173 None OpBranchConditional %172 %174 %173 %174 = OpLabel %175 = OpImageQuerySizeLod %13 %167 %164 %176 = OpULessThan %101 %169 %175 %177 = OpAll %56 %176 OpBranchConditional %177 %178 %173 %178 = OpLabel %179 = OpImageFetch %8 %167 %169 Lod %164 OpBranch %173 %173 = OpLabel %180 = OpPhi %8 %170 %168 %170 %174 %179 %178 %181 = OpCompositeExtract %6 %180 0 OpReturnValue %181 OpFunctionEnd %185 = OpFunction %6 None %146 %183 = OpFunctionParameter %10 %184 = OpFunctionParameter %4 %182 = OpLabel %186 = OpLoad %17 %39 OpBranch %187 %187 = OpLabel %189 = OpImageQuerySamples %4 %186 %190 = OpULessThan %56 %184 %189 OpSelectionMerge %191 None OpBranchConditional %190 %192 %191 %192 = OpLabel %193 = OpImageQuerySize %10 %186 %194 = OpULessThan %80 %183 %193 %195 = OpAll %56 %194 OpBranchConditional %195 %196 %191 %196 = OpLabel %197 = OpImageFetch %8 %186 %183 Sample %184 OpBranch %191 %191 = OpLabel %198 = OpPhi %8 %188 %187 %188 %192 %197 %196 %199 = OpCompositeExtract %6 %198 0 OpReturnValue %199 OpFunctionEnd %203 = OpFunction %2 None %204 %201 = OpFunctionParameter %4 %202 = OpFunctionParameter %8 %200 = OpLabel %205 = OpLoad %18 %41 OpBranch %206 %206 = OpLabel %207 = OpImageQuerySize %4 %205 %208 = OpULessThan %56 %201 %207 OpSelectionMerge %209 None OpBranchConditional %208 %210 %209 %210 = OpLabel OpImageWrite %205 %201 %202 OpBranch %209 %209 = OpLabel OpReturn OpFunctionEnd %214 = OpFunction %2 None %215 %212 = OpFunctionParameter %10 %213 = OpFunctionParameter %8 %211 = OpLabel %216 = OpLoad %19 %43 OpBranch %217 %217 = OpLabel %218 = OpImageQuerySize %10 %216 %219 = OpULessThan %80 %212 %218 %220 = OpAll %56 %219 OpSelectionMerge %221 None OpBranchConditional %220 %222 %221 %222 = OpLabel OpImageWrite %216 %212 %213 OpBranch %221 %221 = OpLabel OpReturn OpFunctionEnd %227 = OpFunction %2 None %228 %224 = OpFunctionParameter %10 %225 = OpFunctionParameter %4 %226 = OpFunctionParameter %8 %223 = OpLabel %229 = OpLoad %20 %45 OpBranch %230 %230 = OpLabel %231 = OpCompositeConstruct %13 %224 %225 %232 = OpImageQuerySize %13 %229 %233 = OpULessThan %101 %231 %232 %234 = OpAll %56 %233 OpSelectionMerge %235 None OpBranchConditional %234 %236 %235 %236 = OpLabel OpImageWrite %229 %231 %226 OpBranch %235 %235 = OpLabel OpReturn OpFunctionEnd %240 = OpFunction %2 None %241 %238 = OpFunctionParameter %13 %239 = OpFunctionParameter %8 %237 = OpLabel %242 = OpLoad %21 %47 OpBranch %243 %243 = OpLabel %244 = OpImageQuerySize %13 %242 %245 = OpULessThan %101 %238 %244 %246 = OpAll %56 %245 OpSelectionMerge %247 None OpBranchConditional %246 %248 %247 %248 = OpLabel OpImageWrite %242 %238 %239 OpBranch %247 %247 = OpLabel OpReturn OpFunctionEnd %252 = OpFunction %2 None %253 %249 = OpLabel %254 = OpLoad %7 %25 %255 = OpLoad %9 %27 %256 = OpLoad %11 %29 %257 = OpLoad %12 %31 %258 = OpLoad %14 %33 %259 = OpLoad %18 %41 %260 = OpLoad %19 %43 %261 = OpLoad %20 %45 %262 = OpLoad %21 %47 OpBranch %263 %263 = OpLabel %264 = OpFunctionCall %8 %52 %3 %3 %265 = OpFunctionCall %8 %70 %22 %3 %266 = OpFunctionCall %8 %90 %22 %3 %3 %267 = OpFunctionCall %8 %110 %23 %3 %268 = OpFunctionCall %8 %128 %22 %3 %269 = OpFunctionCall %2 %203 %3 %24 %270 = OpFunctionCall %2 %214 %22 %24 %271 = OpFunctionCall %2 %227 %22 %3 %24 %272 = OpFunctionCall %2 %240 %23 %24 %273 = OpCompositeConstruct %8 %5 %5 %5 %5 OpStore %250 %273 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bounds-check-restrict.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 166 OpCapability Shader OpCapability Linkage OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpDecorate %10 ArrayStride 4 OpDecorate %13 ArrayStride 4 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 48 OpMemberDecorate %14 2 Offset 64 OpMemberDecorate %14 2 ColMajor OpMemberDecorate %14 2 MatrixStride 16 OpMemberDecorate %14 3 Offset 112 OpDecorate %15 DescriptorSet 0 OpDecorate %15 Binding 0 OpDecorate %14 Block %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %6 = OpTypeFloat 32 %5 = OpConstant %6 100.0 %7 = OpConstant %4 9 %8 = OpConstant %4 3 %9 = OpConstant %4 2 %10 = OpTypeArray %6 %3 %11 = OpTypeVector %6 4 %12 = OpTypeMatrix %11 3 %13 = OpTypeRuntimeArray %6 %14 = OpTypeStruct %10 %11 %12 %13 %16 = OpTypePointer StorageBuffer %14 %15 = OpVariable %16 StorageBuffer %20 = OpTypeFunction %6 %4 %22 = OpTypePointer StorageBuffer %10 %23 = OpTypePointer StorageBuffer %6 %25 = OpTypeInt 32 0 %24 = OpConstant %25 9 %27 = OpConstant %25 0 %34 = OpTypePointer StorageBuffer %13 %36 = OpConstant %25 1 %39 = OpConstant %25 3 %46 = OpTypePointer StorageBuffer %11 %47 = OpTypePointer StorageBuffer %6 %55 = OpTypeFunction %6 %11 %4 %62 = OpTypeFunction %11 %4 %64 = OpTypePointer StorageBuffer %12 %65 = OpTypePointer StorageBuffer %11 %66 = OpConstant %25 2 %74 = OpTypeFunction %6 %4 %4 %94 = OpTypeFunction %6 %108 = OpTypeFunction %2 %4 %6 %132 = OpTypeFunction %2 %4 %11 %141 = OpTypeFunction %2 %4 %4 %6 %161 = OpTypeFunction %2 %6 %19 = OpFunction %6 None %20 %18 = OpFunctionParameter %4 %17 = OpLabel OpBranch %21 %21 = OpLabel %26 = OpExtInst %25 %1 UMin %18 %24 %28 = OpAccessChain %23 %15 %27 %26 %29 = OpLoad %6 %28 OpReturnValue %29 OpFunctionEnd %32 = OpFunction %6 None %20 %31 = OpFunctionParameter %4 %30 = OpLabel OpBranch %33 %33 = OpLabel %35 = OpArrayLength %25 %15 3 %37 = OpISub %25 %35 %36 %38 = OpExtInst %25 %1 UMin %31 %37 %40 = OpAccessChain %23 %15 %39 %38 %41 = OpLoad %6 %40 OpReturnValue %41 OpFunctionEnd %44 = OpFunction %6 None %20 %43 = OpFunctionParameter %4 %42 = OpLabel OpBranch %45 %45 = OpLabel %48 = OpExtInst %25 %1 UMin %43 %39 %49 = OpAccessChain %47 %15 %36 %48 %50 = OpLoad %6 %49 OpReturnValue %50 OpFunctionEnd %54 = OpFunction %6 None %55 %52 = OpFunctionParameter %11 %53 = OpFunctionParameter %4 %51 = OpLabel OpBranch %56 %56 = OpLabel %57 = OpExtInst %25 %1 UMin %53 %39 %58 = OpVectorExtractDynamic %6 %52 %57 OpReturnValue %58 OpFunctionEnd %61 = OpFunction %11 None %62 %60 = OpFunctionParameter %4 %59 = OpLabel OpBranch %63 %63 = OpLabel %67 = OpExtInst %25 %1 UMin %60 %66 %68 = OpAccessChain %65 %15 %66 %67 %69 = OpLoad %11 %68 OpReturnValue %69 OpFunctionEnd %73 = OpFunction %6 None %74 %71 = OpFunctionParameter %4 %72 = OpFunctionParameter %4 %70 = OpLabel OpBranch %75 %75 = OpLabel %76 = OpExtInst %25 %1 UMin %72 %39 %77 = OpExtInst %25 %1 UMin %71 %66 %78 = OpAccessChain %47 %15 %66 %77 %76 %79 = OpLoad %6 %78 OpReturnValue %79 OpFunctionEnd %82 = OpFunction %6 None %20 %81 = OpFunctionParameter %4 %80 = OpLabel OpBranch %83 %83 = OpLabel %84 = OpConvertSToF %6 %81 %85 = OpFDiv %6 %84 %5 %86 = OpExtInst %6 %1 Sin %85 %87 = OpFMul %6 %86 %5 %88 = OpConvertFToS %4 %87 %89 = OpExtInst %25 %1 UMin %88 %24 %90 = OpAccessChain %23 %15 %27 %89 %91 = OpLoad %6 %90 OpReturnValue %91 OpFunctionEnd %93 = OpFunction %6 None %94 %92 = OpLabel OpBranch %95 %95 = OpLabel %96 = OpAccessChain %23 %15 %27 %24 %97 = OpLoad %6 %96 %98 = OpAccessChain %47 %15 %36 %39 %99 = OpLoad %6 %98 %100 = OpFAdd %6 %97 %99 %101 = OpAccessChain %47 %15 %66 %66 %39 %102 = OpLoad %6 %101 %103 = OpFAdd %6 %100 %102 OpReturnValue %103 OpFunctionEnd %107 = OpFunction %2 None %108 %105 = OpFunctionParameter %4 %106 = OpFunctionParameter %6 %104 = OpLabel OpBranch %109 %109 = OpLabel %110 = OpExtInst %25 %1 UMin %105 %24 %111 = OpAccessChain %23 %15 %27 %110 OpStore %111 %106 OpReturn OpFunctionEnd %115 = OpFunction %2 None %108 %113 = OpFunctionParameter %4 %114 = OpFunctionParameter %6 %112 = OpLabel OpBranch %116 %116 = OpLabel %117 = OpArrayLength %25 %15 3 %118 = OpISub %25 %117 %36 %119 = OpExtInst %25 %1 UMin %113 %118 %120 = OpAccessChain %23 %15 %39 %119 OpStore %120 %114 OpReturn OpFunctionEnd %124 = OpFunction %2 None %108 %122 = OpFunctionParameter %4 %123 = OpFunctionParameter %6 %121 = OpLabel OpBranch %125 %125 = OpLabel %126 = OpExtInst %25 %1 UMin %122 %39 %127 = OpAccessChain %47 %15 %36 %126 OpStore %127 %123 OpReturn OpFunctionEnd %131 = OpFunction %2 None %132 %129 = OpFunctionParameter %4 %130 = OpFunctionParameter %11 %128 = OpLabel OpBranch %133 %133 = OpLabel %134 = OpExtInst %25 %1 UMin %129 %66 %135 = OpAccessChain %65 %15 %66 %134 OpStore %135 %130 OpReturn OpFunctionEnd %140 = OpFunction %2 None %141 %137 = OpFunctionParameter %4 %138 = OpFunctionParameter %4 %139 = OpFunctionParameter %6 %136 = OpLabel OpBranch %142 %142 = OpLabel %143 = OpExtInst %25 %1 UMin %138 %39 %144 = OpExtInst %25 %1 UMin %137 %66 %145 = OpAccessChain %47 %15 %66 %144 %143 OpStore %145 %139 OpReturn OpFunctionEnd %149 = OpFunction %2 None %108 %147 = OpFunctionParameter %4 %148 = OpFunctionParameter %6 %146 = OpLabel OpBranch %150 %150 = OpLabel %151 = OpConvertSToF %6 %147 %152 = OpFDiv %6 %151 %5 %153 = OpExtInst %6 %1 Sin %152 %154 = OpFMul %6 %153 %5 %155 = OpConvertFToS %4 %154 %156 = OpExtInst %25 %1 UMin %155 %24 %157 = OpAccessChain %23 %15 %27 %156 OpStore %157 %148 OpReturn OpFunctionEnd %160 = OpFunction %2 None %161 %159 = OpFunctionParameter %6 %158 = OpLabel OpBranch %162 %162 = OpLabel %163 = OpAccessChain %23 %15 %27 %24 OpStore %163 %159 %164 = OpAccessChain %47 %15 %36 %39 OpStore %164 %159 %165 = OpAccessChain %47 %15 %66 %66 %39 OpStore %165 %159 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/bounds-check-zero.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 209 OpCapability Shader OpCapability Linkage OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpDecorate %10 ArrayStride 4 OpDecorate %13 ArrayStride 4 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 48 OpMemberDecorate %14 2 Offset 64 OpMemberDecorate %14 2 ColMajor OpMemberDecorate %14 2 MatrixStride 16 OpMemberDecorate %14 3 Offset 112 OpDecorate %15 DescriptorSet 0 OpDecorate %15 Binding 0 OpDecorate %14 Block %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %6 = OpTypeFloat 32 %5 = OpConstant %6 100.0 %7 = OpConstant %4 9 %8 = OpConstant %4 3 %9 = OpConstant %4 2 %10 = OpTypeArray %6 %3 %11 = OpTypeVector %6 4 %12 = OpTypeMatrix %11 3 %13 = OpTypeRuntimeArray %6 %14 = OpTypeStruct %10 %11 %12 %13 %16 = OpTypePointer StorageBuffer %14 %15 = OpVariable %16 StorageBuffer %20 = OpTypeFunction %6 %4 %22 = OpTypePointer StorageBuffer %10 %23 = OpTypePointer StorageBuffer %6 %25 = OpTypeInt 32 0 %24 = OpConstant %25 10 %27 = OpTypeBool %28 = OpConstant %25 0 %30 = OpConstantNull %6 %39 = OpTypePointer StorageBuffer %13 %42 = OpConstant %25 3 %44 = OpConstantNull %6 %53 = OpTypePointer StorageBuffer %11 %54 = OpTypePointer StorageBuffer %6 %55 = OpConstant %25 4 %57 = OpConstant %25 1 %59 = OpConstantNull %6 %68 = OpTypeFunction %6 %11 %4 %71 = OpConstantNull %6 %79 = OpTypeFunction %11 %4 %81 = OpTypePointer StorageBuffer %12 %82 = OpTypePointer StorageBuffer %11 %84 = OpConstant %25 2 %86 = OpConstantNull %11 %95 = OpTypeFunction %6 %4 %4 %101 = OpConstantNull %6 %117 = OpConstantNull %6 %124 = OpTypeFunction %6 %126 = OpConstant %25 9 %139 = OpTypeFunction %2 %4 %6 %168 = OpTypeFunction %2 %4 %11 %179 = OpTypeFunction %2 %4 %4 %6 %204 = OpTypeFunction %2 %6 %19 = OpFunction %6 None %20 %18 = OpFunctionParameter %4 %17 = OpLabel OpBranch %21 %21 = OpLabel %26 = OpULessThan %27 %18 %24 OpSelectionMerge %31 None OpBranchConditional %26 %32 %31 %32 = OpLabel %29 = OpAccessChain %23 %15 %28 %18 %33 = OpLoad %6 %29 OpBranch %31 %31 = OpLabel %34 = OpPhi %6 %30 %21 %33 %32 OpReturnValue %34 OpFunctionEnd %37 = OpFunction %6 None %20 %36 = OpFunctionParameter %4 %35 = OpLabel OpBranch %38 %38 = OpLabel %40 = OpArrayLength %25 %15 3 %41 = OpULessThan %27 %36 %40 OpSelectionMerge %45 None OpBranchConditional %41 %46 %45 %46 = OpLabel %43 = OpAccessChain %23 %15 %42 %36 %47 = OpLoad %6 %43 OpBranch %45 %45 = OpLabel %48 = OpPhi %6 %44 %38 %47 %46 OpReturnValue %48 OpFunctionEnd %51 = OpFunction %6 None %20 %50 = OpFunctionParameter %4 %49 = OpLabel OpBranch %52 %52 = OpLabel %56 = OpULessThan %27 %50 %55 OpSelectionMerge %60 None OpBranchConditional %56 %61 %60 %61 = OpLabel %58 = OpAccessChain %54 %15 %57 %50 %62 = OpLoad %6 %58 OpBranch %60 %60 = OpLabel %63 = OpPhi %6 %59 %52 %62 %61 OpReturnValue %63 OpFunctionEnd %67 = OpFunction %6 None %68 %65 = OpFunctionParameter %11 %66 = OpFunctionParameter %4 %64 = OpLabel OpBranch %69 %69 = OpLabel %70 = OpULessThan %27 %66 %55 OpSelectionMerge %72 None OpBranchConditional %70 %73 %72 %73 = OpLabel %74 = OpVectorExtractDynamic %6 %65 %66 OpBranch %72 %72 = OpLabel %75 = OpPhi %6 %71 %69 %74 %73 OpReturnValue %75 OpFunctionEnd %78 = OpFunction %11 None %79 %77 = OpFunctionParameter %4 %76 = OpLabel OpBranch %80 %80 = OpLabel %83 = OpULessThan %27 %77 %42 OpSelectionMerge %87 None OpBranchConditional %83 %88 %87 %88 = OpLabel %85 = OpAccessChain %82 %15 %84 %77 %89 = OpLoad %11 %85 OpBranch %87 %87 = OpLabel %90 = OpPhi %11 %86 %80 %89 %88 OpReturnValue %90 OpFunctionEnd %94 = OpFunction %6 None %95 %92 = OpFunctionParameter %4 %93 = OpFunctionParameter %4 %91 = OpLabel OpBranch %96 %96 = OpLabel %97 = OpULessThan %27 %93 %55 %98 = OpULessThan %27 %92 %42 %99 = OpLogicalAnd %27 %97 %98 OpSelectionMerge %102 None OpBranchConditional %99 %103 %102 %103 = OpLabel %100 = OpAccessChain %54 %15 %84 %92 %93 %104 = OpLoad %6 %100 OpBranch %102 %102 = OpLabel %105 = OpPhi %6 %101 %96 %104 %103 OpReturnValue %105 OpFunctionEnd %108 = OpFunction %6 None %20 %107 = OpFunctionParameter %4 %106 = OpLabel OpBranch %109 %109 = OpLabel %110 = OpConvertSToF %6 %107 %111 = OpFDiv %6 %110 %5 %112 = OpExtInst %6 %1 Sin %111 %113 = OpFMul %6 %112 %5 %114 = OpConvertFToS %4 %113 %115 = OpULessThan %27 %114 %24 OpSelectionMerge %118 None OpBranchConditional %115 %119 %118 %119 = OpLabel %116 = OpAccessChain %23 %15 %28 %114 %120 = OpLoad %6 %116 OpBranch %118 %118 = OpLabel %121 = OpPhi %6 %117 %109 %120 %119 OpReturnValue %121 OpFunctionEnd %123 = OpFunction %6 None %124 %122 = OpLabel OpBranch %125 %125 = OpLabel %127 = OpAccessChain %23 %15 %28 %126 %128 = OpLoad %6 %127 %129 = OpAccessChain %54 %15 %57 %42 %130 = OpLoad %6 %129 %131 = OpFAdd %6 %128 %130 %132 = OpAccessChain %54 %15 %84 %84 %42 %133 = OpLoad %6 %132 %134 = OpFAdd %6 %131 %133 OpReturnValue %134 OpFunctionEnd %138 = OpFunction %2 None %139 %136 = OpFunctionParameter %4 %137 = OpFunctionParameter %6 %135 = OpLabel OpBranch %140 %140 = OpLabel %141 = OpULessThan %27 %136 %24 OpSelectionMerge %143 None OpBranchConditional %141 %144 %143 %144 = OpLabel %142 = OpAccessChain %23 %15 %28 %136 OpStore %142 %137 OpBranch %143 %143 = OpLabel OpReturn OpFunctionEnd %148 = OpFunction %2 None %139 %146 = OpFunctionParameter %4 %147 = OpFunctionParameter %6 %145 = OpLabel OpBranch %149 %149 = OpLabel %150 = OpArrayLength %25 %15 3 %151 = OpULessThan %27 %146 %150 OpSelectionMerge %153 None OpBranchConditional %151 %154 %153 %154 = OpLabel %152 = OpAccessChain %23 %15 %42 %146 OpStore %152 %147 OpBranch %153 %153 = OpLabel OpReturn OpFunctionEnd %158 = OpFunction %2 None %139 %156 = OpFunctionParameter %4 %157 = OpFunctionParameter %6 %155 = OpLabel OpBranch %159 %159 = OpLabel %160 = OpULessThan %27 %156 %55 OpSelectionMerge %162 None OpBranchConditional %160 %163 %162 %163 = OpLabel %161 = OpAccessChain %54 %15 %57 %156 OpStore %161 %157 OpBranch %162 %162 = OpLabel OpReturn OpFunctionEnd %167 = OpFunction %2 None %168 %165 = OpFunctionParameter %4 %166 = OpFunctionParameter %11 %164 = OpLabel OpBranch %169 %169 = OpLabel %170 = OpULessThan %27 %165 %42 OpSelectionMerge %172 None OpBranchConditional %170 %173 %172 %173 = OpLabel %171 = OpAccessChain %82 %15 %84 %165 OpStore %171 %166 OpBranch %172 %172 = OpLabel OpReturn OpFunctionEnd %178 = OpFunction %2 None %179 %175 = OpFunctionParameter %4 %176 = OpFunctionParameter %4 %177 = OpFunctionParameter %6 %174 = OpLabel OpBranch %180 %180 = OpLabel %181 = OpULessThan %27 %176 %55 %182 = OpULessThan %27 %175 %42 %183 = OpLogicalAnd %27 %181 %182 OpSelectionMerge %185 None OpBranchConditional %183 %186 %185 %186 = OpLabel %184 = OpAccessChain %54 %15 %84 %175 %176 OpStore %184 %177 OpBranch %185 %185 = OpLabel OpReturn OpFunctionEnd %190 = OpFunction %2 None %139 %188 = OpFunctionParameter %4 %189 = OpFunctionParameter %6 %187 = OpLabel OpBranch %191 %191 = OpLabel %192 = OpConvertSToF %6 %188 %193 = OpFDiv %6 %192 %5 %194 = OpExtInst %6 %1 Sin %193 %195 = OpFMul %6 %194 %5 %196 = OpConvertFToS %4 %195 %197 = OpULessThan %27 %196 %24 OpSelectionMerge %199 None OpBranchConditional %197 %200 %199 %200 = OpLabel %198 = OpAccessChain %23 %15 %28 %196 OpStore %198 %189 OpBranch %199 %199 = OpLabel OpReturn OpFunctionEnd %203 = OpFunction %2 None %204 %202 = OpFunctionParameter %6 %201 = OpLabel OpBranch %205 %205 = OpLabel %206 = OpAccessChain %23 %15 %28 %126 OpStore %206 %202 %207 = OpAccessChain %54 %15 %57 %42 OpStore %207 %202 %208 = OpAccessChain %54 %15 %84 %84 %42 OpStore %208 %202 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/break-if.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 50 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %48 "main" OpExecutionMode %48 LocalSize 1 1 1 %2 = OpTypeVoid %4 = OpTypeBool %3 = OpConstantTrue %4 %7 = OpTypeFunction %2 %14 = OpTypePointer Function %4 %15 = OpConstantNull %4 %17 = OpConstantNull %4 %21 = OpTypeFunction %2 %4 %32 = OpConstantNull %4 %34 = OpConstantNull %4 %6 = OpFunction %2 None %7 %5 = OpLabel OpBranch %8 %8 = OpLabel OpBranch %9 %9 = OpLabel OpLoopMerge %10 %12 None OpBranch %11 %11 = OpLabel OpBranch %12 %12 = OpLabel OpBranchConditional %3 %10 %9 %10 = OpLabel OpReturn OpFunctionEnd %20 = OpFunction %2 None %21 %19 = OpFunctionParameter %4 %18 = OpLabel %13 = OpVariable %14 Function %15 %16 = OpVariable %14 Function %17 OpBranch %22 %22 = OpLabel OpBranch %23 %23 = OpLabel OpLoopMerge %24 %26 None OpBranch %25 %25 = OpLabel OpBranch %26 %26 = OpLabel OpStore %13 %19 %27 = OpLoad %4 %13 %28 = OpLogicalNotEqual %4 %19 %27 OpStore %16 %28 %29 = OpLoad %4 %16 %30 = OpLogicalEqual %4 %19 %29 OpBranchConditional %30 %24 %23 %24 = OpLabel OpReturn OpFunctionEnd %37 = OpFunction %2 None %21 %36 = OpFunctionParameter %4 %35 = OpLabel %31 = OpVariable %14 Function %32 %33 = OpVariable %14 Function %34 OpBranch %38 %38 = OpLabel OpBranch %39 %39 = OpLabel OpLoopMerge %40 %42 None OpBranch %41 %41 = OpLabel OpStore %31 %36 %43 = OpLoad %4 %31 %44 = OpLogicalNotEqual %4 %36 %43 OpStore %33 %44 OpBranch %42 %42 = OpLabel %45 = OpLoad %4 %33 %46 = OpLogicalEqual %4 %36 %45 OpBranchConditional %46 %40 %39 %40 = OpLabel OpReturn OpFunctionEnd %48 = OpFunction %2 None %7 %47 = OpLabel OpBranch %49 %49 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/collatz.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 60 OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %49 "main" %46 OpExecutionMode %49 LocalSize 1 1 1 OpSource GLSL 450 OpMemberName %9 0 "data" OpName %9 "PrimeIndices" OpName %11 "v_indices" OpName %13 "n" OpName %16 "i" OpName %18 "n_base" OpName %19 "collatz_iterations" OpName %46 "global_id" OpName %49 "main" OpDecorate %8 ArrayStride 4 OpMemberDecorate %9 0 Offset 0 OpDecorate %11 DescriptorSet 0 OpDecorate %11 Binding 0 OpDecorate %9 Block OpDecorate %46 BuiltIn GlobalInvocationId %2 = OpTypeVoid %4 = OpTypeInt 32 0 %3 = OpConstant %4 0 %5 = OpConstant %4 1 %6 = OpConstant %4 2 %7 = OpConstant %4 3 %8 = OpTypeRuntimeArray %4 %9 = OpTypeStruct %8 %10 = OpTypeVector %4 3 %12 = OpTypePointer StorageBuffer %9 %11 = OpVariable %12 StorageBuffer %14 = OpTypePointer Function %4 %15 = OpConstantNull %4 %20 = OpTypeFunction %4 %4 %27 = OpTypeBool %47 = OpTypePointer Input %10 %46 = OpVariable %47 Input %50 = OpTypeFunction %2 %52 = OpTypePointer StorageBuffer %8 %54 = OpTypePointer StorageBuffer %4 %19 = OpFunction %4 None %20 %18 = OpFunctionParameter %4 %17 = OpLabel %13 = OpVariable %14 Function %15 %16 = OpVariable %14 Function %3 OpBranch %21 %21 = OpLabel OpStore %13 %18 OpBranch %22 %22 = OpLabel OpLoopMerge %23 %25 None OpBranch %24 %24 = OpLabel %26 = OpLoad %4 %13 %28 = OpUGreaterThan %27 %26 %5 OpSelectionMerge %29 None OpBranchConditional %28 %29 %30 %30 = OpLabel OpBranch %23 %29 = OpLabel %31 = OpLoad %4 %13 %32 = OpUMod %4 %31 %6 %33 = OpIEqual %27 %32 %3 OpSelectionMerge %34 None OpBranchConditional %33 %35 %36 %35 = OpLabel %37 = OpLoad %4 %13 %38 = OpUDiv %4 %37 %6 OpStore %13 %38 OpBranch %34 %36 = OpLabel %39 = OpLoad %4 %13 %40 = OpIMul %4 %7 %39 %41 = OpIAdd %4 %40 %5 OpStore %13 %41 OpBranch %34 %34 = OpLabel %42 = OpLoad %4 %16 %43 = OpIAdd %4 %42 %5 OpStore %16 %43 OpBranch %25 %25 = OpLabel OpBranch %22 %23 = OpLabel %44 = OpLoad %4 %16 OpReturnValue %44 OpFunctionEnd %49 = OpFunction %2 None %50 %45 = OpLabel %48 = OpLoad %10 %46 OpBranch %51 %51 = OpLabel %53 = OpCompositeExtract %4 %48 0 %55 = OpCompositeExtract %4 %48 0 %56 = OpAccessChain %54 %11 %3 %55 %57 = OpLoad %4 %56 %58 = OpFunctionCall %4 %19 %57 %59 = OpAccessChain %54 %11 %3 %53 OpStore %59 %58 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/control-flow.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 69 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %44 "main" %41 OpExecutionMode %44 LocalSize 1 1 1 OpDecorate %41 BuiltIn GlobalInvocationId %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 1 %5 = OpConstant %4 0 %6 = OpConstant %4 2 %7 = OpConstant %4 3 %8 = OpConstant %4 4 %10 = OpTypeInt 32 0 %9 = OpConstant %10 0 %11 = OpTypeVector %10 3 %15 = OpTypeFunction %2 %4 %21 = OpTypeFunction %2 %38 = OpTypePointer Function %4 %39 = OpConstantNull %4 %42 = OpTypePointer Input %11 %41 = OpVariable %42 Input %46 = OpConstant %10 2 %47 = OpConstant %10 1 %48 = OpConstant %10 72 %49 = OpConstant %10 264 %14 = OpFunction %2 None %15 %13 = OpFunctionParameter %4 %12 = OpLabel OpBranch %16 %16 = OpLabel OpSelectionMerge %17 None OpSwitch %13 %18 %18 = OpLabel OpBranch %17 %17 = OpLabel OpReturn OpFunctionEnd %20 = OpFunction %2 None %21 %19 = OpLabel OpBranch %22 %22 = OpLabel OpSelectionMerge %23 None OpSwitch %5 %24 0 %25 %25 = OpLabel OpBranch %23 %24 = OpLabel OpBranch %23 %23 = OpLabel OpReturn OpFunctionEnd %28 = OpFunction %2 None %15 %27 = OpFunctionParameter %4 %26 = OpLabel OpBranch %29 %29 = OpLabel OpBranch %30 %30 = OpLabel OpLoopMerge %31 %33 None OpBranch %32 %32 = OpLabel OpSelectionMerge %34 None OpSwitch %27 %35 1 %36 %36 = OpLabel OpBranch %33 %35 = OpLabel OpBranch %34 %34 = OpLabel OpBranch %33 %33 = OpLabel OpBranch %30 %31 = OpLabel OpReturn OpFunctionEnd %44 = OpFunction %2 None %21 %40 = OpLabel %37 = OpVariable %38 Function %39 %43 = OpLoad %11 %41 OpBranch %45 %45 = OpLabel OpControlBarrier %46 %47 %48 OpControlBarrier %46 %46 %49 OpSelectionMerge %50 None OpSwitch %3 %51 %51 = OpLabel OpStore %37 %3 OpBranch %50 %50 = OpLabel %52 = OpLoad %4 %37 OpSelectionMerge %53 None OpSwitch %52 %54 1 %55 2 %56 3 %57 4 %58 %55 = OpLabel OpStore %37 %5 OpBranch %53 %56 = OpLabel OpStore %37 %3 OpBranch %53 %57 = OpLabel OpStore %37 %6 OpBranch %58 %58 = OpLabel OpStore %37 %7 OpBranch %54 %54 = OpLabel OpStore %37 %8 OpBranch %53 %53 = OpLabel OpSelectionMerge %59 None OpSwitch %9 %60 0 %61 %61 = OpLabel OpBranch %59 %60 = OpLabel OpBranch %59 %59 = OpLabel %62 = OpLoad %4 %37 OpSelectionMerge %63 None OpSwitch %62 %64 1 %65 2 %66 3 %67 4 %68 %65 = OpLabel OpStore %37 %5 OpBranch %63 %66 = OpLabel OpStore %37 %3 OpReturn %67 = OpLabel OpStore %37 %6 OpBranch %68 %68 = OpLabel OpReturn %64 = OpLabel OpStore %37 %7 OpReturn %63 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/empty.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 7 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %4 "main" OpExecutionMode %4 LocalSize 1 1 1 %2 = OpTypeVoid %5 = OpTypeFunction %2 %4 = OpFunction %2 None %5 %3 = OpLabel OpBranch %6 %6 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/extra.spvasm ================================================ ; SPIR-V ; Version: 1.2 ; Generator: rspirv ; Bound: 48 OpCapability Shader OpCapability Float64 OpCapability Geometry %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %24 "main" %16 %19 %22 OpExecutionMode %24 OriginUpperLeft OpMemberDecorate %8 0 Offset 0 OpMemberDecorate %8 1 Offset 16 OpMemberDecorate %10 0 Offset 0 OpMemberDecorate %10 1 Offset 16 OpDecorate %12 Block OpMemberDecorate %12 0 Offset 0 OpDecorate %16 Location 0 OpDecorate %19 BuiltIn PrimitiveId OpDecorate %19 Flat OpDecorate %22 Location 0 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %5 = OpTypeInt 32 0 %7 = OpTypeFloat 64 %6 = OpTypeVector %7 2 %8 = OpTypeStruct %5 %6 %9 = OpTypeVector %4 4 %10 = OpTypeStruct %9 %5 %12 = OpTypeStruct %8 %13 = OpTypePointer PushConstant %12 %11 = OpVariable %13 PushConstant %17 = OpTypePointer Input %9 %16 = OpVariable %17 Input %20 = OpTypePointer Input %5 %19 = OpVariable %20 Input %23 = OpTypePointer Output %9 %22 = OpVariable %23 Output %25 = OpTypeFunction %2 %26 = OpTypePointer PushConstant %8 %27 = OpConstant %5 0 %31 = OpTypePointer PushConstant %5 %34 = OpTypeBool %40 = OpTypeVector %4 3 %24 = OpFunction %2 None %25 %14 = OpLabel %18 = OpLoad %9 %16 %21 = OpLoad %5 %19 %15 = OpCompositeConstruct %10 %18 %21 %28 = OpAccessChain %26 %11 %27 OpBranch %29 %29 = OpLabel %30 = OpCompositeExtract %5 %15 1 %32 = OpAccessChain %31 %28 %27 %33 = OpLoad %5 %32 %35 = OpIEqual %34 %30 %33 OpSelectionMerge %36 None OpBranchConditional %35 %37 %38 %37 = OpLabel %39 = OpCompositeExtract %9 %15 0 OpStore %22 %39 OpReturn %38 = OpLabel %41 = OpCompositeConstruct %40 %3 %3 %3 %42 = OpCompositeExtract %9 %15 0 %43 = OpVectorShuffle %40 %42 %42 0 1 2 %44 = OpFSub %40 %41 %43 %45 = OpCompositeExtract %9 %15 0 %46 = OpCompositeExtract %4 %45 3 %47 = OpCompositeConstruct %9 %44 %46 OpStore %22 %47 OpReturn %36 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/functions.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 79 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %74 "main" OpExecutionMode %74 LocalSize 1 1 1 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 2.0 %5 = OpConstant %4 0.5 %7 = OpTypeInt 32 1 %6 = OpConstant %7 1 %9 = OpTypeInt 32 0 %8 = OpConstant %9 1 %10 = OpConstant %7 4 %11 = OpConstant %7 2 %12 = OpTypeVector %4 2 %15 = OpTypeFunction %12 %23 = OpTypeFunction %7 %25 = OpTypeVector %7 2 %37 = OpTypeVector %9 3 %53 = OpTypeVector %7 4 %75 = OpTypeFunction %2 %29 = OpConstantNull %7 %41 = OpConstantNull %9 %57 = OpConstantNull %7 %14 = OpFunction %12 None %15 %13 = OpLabel OpBranch %16 %16 = OpLabel %17 = OpCompositeConstruct %12 %3 %3 %18 = OpCompositeConstruct %12 %5 %5 %19 = OpCompositeConstruct %12 %5 %5 %20 = OpExtInst %12 %1 Fma %17 %18 %19 OpReturnValue %20 OpFunctionEnd %22 = OpFunction %7 None %23 %21 = OpLabel OpBranch %24 %24 = OpLabel %26 = OpCompositeConstruct %25 %6 %6 %27 = OpCompositeConstruct %25 %6 %6 %30 = OpCompositeExtract %7 %26 0 %31 = OpCompositeExtract %7 %27 0 %32 = OpIMul %7 %30 %31 %33 = OpIAdd %7 %29 %32 %34 = OpCompositeExtract %7 %26 1 %35 = OpCompositeExtract %7 %27 1 %36 = OpIMul %7 %34 %35 %28 = OpIAdd %7 %33 %36 %38 = OpCompositeConstruct %37 %8 %8 %8 %39 = OpCompositeConstruct %37 %8 %8 %8 %42 = OpCompositeExtract %9 %38 0 %43 = OpCompositeExtract %9 %39 0 %44 = OpIMul %9 %42 %43 %45 = OpIAdd %9 %41 %44 %46 = OpCompositeExtract %9 %38 1 %47 = OpCompositeExtract %9 %39 1 %48 = OpIMul %9 %46 %47 %49 = OpIAdd %9 %45 %48 %50 = OpCompositeExtract %9 %38 2 %51 = OpCompositeExtract %9 %39 2 %52 = OpIMul %9 %50 %51 %40 = OpIAdd %9 %49 %52 %54 = OpCompositeConstruct %53 %10 %10 %10 %10 %55 = OpCompositeConstruct %53 %11 %11 %11 %11 %58 = OpCompositeExtract %7 %54 0 %59 = OpCompositeExtract %7 %55 0 %60 = OpIMul %7 %58 %59 %61 = OpIAdd %7 %57 %60 %62 = OpCompositeExtract %7 %54 1 %63 = OpCompositeExtract %7 %55 1 %64 = OpIMul %7 %62 %63 %65 = OpIAdd %7 %61 %64 %66 = OpCompositeExtract %7 %54 2 %67 = OpCompositeExtract %7 %55 2 %68 = OpIMul %7 %66 %67 %69 = OpIAdd %7 %65 %68 %70 = OpCompositeExtract %7 %54 3 %71 = OpCompositeExtract %7 %55 3 %72 = OpIMul %7 %70 %71 %56 = OpIAdd %7 %69 %72 OpReturnValue %56 OpFunctionEnd %74 = OpFunction %2 None %75 %73 = OpLabel OpBranch %76 %76 = OpLabel %77 = OpFunctionCall %12 %14 %78 = OpFunctionCall %7 %22 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/globals.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 169 OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %114 "main" OpExecutionMode %114 LocalSize 1 1 1 OpDecorate %25 ArrayStride 4 OpMemberDecorate %27 0 Offset 0 OpMemberDecorate %27 1 Offset 12 OpDecorate %29 ArrayStride 8 OpDecorate %31 ArrayStride 16 OpDecorate %34 ArrayStride 32 OpDecorate %35 ArrayStride 64 OpDecorate %37 ArrayStride 32 OpDecorate %38 ArrayStride 64 OpDecorate %46 DescriptorSet 0 OpDecorate %46 Binding 1 OpDecorate %47 Block OpMemberDecorate %47 0 Offset 0 OpDecorate %49 NonWritable OpDecorate %49 DescriptorSet 0 OpDecorate %49 Binding 2 OpDecorate %50 Block OpMemberDecorate %50 0 Offset 0 OpDecorate %52 DescriptorSet 0 OpDecorate %52 Binding 3 OpDecorate %53 Block OpMemberDecorate %53 0 Offset 0 OpDecorate %55 DescriptorSet 0 OpDecorate %55 Binding 4 OpDecorate %56 Block OpMemberDecorate %56 0 Offset 0 OpDecorate %58 DescriptorSet 0 OpDecorate %58 Binding 5 OpDecorate %59 Block OpMemberDecorate %59 0 Offset 0 OpMemberDecorate %59 0 ColMajor OpMemberDecorate %59 0 MatrixStride 8 OpDecorate %61 DescriptorSet 0 OpDecorate %61 Binding 6 OpDecorate %62 Block OpMemberDecorate %62 0 Offset 0 OpDecorate %64 DescriptorSet 0 OpDecorate %64 Binding 7 OpDecorate %65 Block OpMemberDecorate %65 0 Offset 0 %2 = OpTypeVoid %4 = OpTypeBool %3 = OpConstantTrue %4 %6 = OpTypeInt 32 0 %5 = OpConstant %6 10 %8 = OpTypeInt 32 1 %7 = OpConstant %8 20 %9 = OpConstant %8 2 %11 = OpTypeFloat 32 %10 = OpConstant %11 1.0 %12 = OpConstant %8 1 %13 = OpConstant %8 0 %14 = OpConstant %11 2.0 %15 = OpConstant %11 3.0 %16 = OpConstant %11 0.0 %17 = OpConstant %8 7 %18 = OpConstant %8 6 %19 = OpConstant %8 5 %20 = OpConstant %8 4 %21 = OpConstant %8 3 %22 = OpConstant %11 4.0 %23 = OpConstant %6 2 %24 = OpConstantTrue %4 %25 = OpTypeArray %11 %5 %26 = OpTypeVector %11 3 %27 = OpTypeStruct %26 %11 %28 = OpTypeVector %11 2 %29 = OpTypeRuntimeArray %28 %30 = OpTypeVector %11 4 %31 = OpTypeArray %30 %7 %32 = OpTypeMatrix %28 3 %33 = OpTypeMatrix %30 2 %34 = OpTypeArray %33 %9 %35 = OpTypeArray %34 %9 %36 = OpTypeMatrix %28 4 %37 = OpTypeArray %36 %9 %38 = OpTypeArray %37 %9 %39 = OpTypeMatrix %26 3 %40 = OpConstantComposite %26 %16 %16 %16 %41 = OpConstantComposite %39 %40 %40 %40 %43 = OpTypePointer Workgroup %25 %42 = OpVariable %43 Workgroup %45 = OpTypePointer Workgroup %6 %44 = OpVariable %45 Workgroup %47 = OpTypeStruct %27 %48 = OpTypePointer StorageBuffer %47 %46 = OpVariable %48 StorageBuffer %50 = OpTypeStruct %29 %51 = OpTypePointer StorageBuffer %50 %49 = OpVariable %51 StorageBuffer %53 = OpTypeStruct %31 %54 = OpTypePointer Uniform %53 %52 = OpVariable %54 Uniform %56 = OpTypeStruct %26 %57 = OpTypePointer Uniform %56 %55 = OpVariable %57 Uniform %59 = OpTypeStruct %32 %60 = OpTypePointer Uniform %59 %58 = OpVariable %60 Uniform %62 = OpTypeStruct %35 %63 = OpTypePointer Uniform %62 %61 = OpVariable %63 Uniform %65 = OpTypeStruct %38 %66 = OpTypePointer Uniform %65 %64 = OpVariable %66 Uniform %70 = OpTypeFunction %2 %26 %71 = OpTypePointer StorageBuffer %29 %72 = OpTypePointer Uniform %26 %73 = OpTypePointer StorageBuffer %27 %74 = OpTypePointer Uniform %35 %75 = OpTypePointer Uniform %31 %76 = OpTypePointer Uniform %38 %77 = OpTypePointer Uniform %32 %80 = OpTypePointer Function %8 %83 = OpTypeFunction %2 %84 = OpConstant %6 0 %87 = OpTypePointer StorageBuffer %26 %90 = OpTypePointer StorageBuffer %11 %110 = OpTypePointer Function %11 %112 = OpTypePointer Function %4 %124 = OpTypePointer Workgroup %11 %125 = OpTypePointer Uniform %37 %126 = OpTypePointer Uniform %36 %129 = OpTypePointer Uniform %34 %130 = OpTypePointer Uniform %33 %131 = OpTypePointer Uniform %30 %136 = OpConstant %6 7 %142 = OpConstant %6 6 %144 = OpTypePointer StorageBuffer %28 %145 = OpConstant %6 1 %148 = OpConstant %6 5 %150 = OpTypePointer Uniform %30 %151 = OpTypePointer Uniform %11 %152 = OpConstant %6 3 %155 = OpConstant %6 4 %157 = OpTypePointer StorageBuffer %11 %168 = OpConstant %6 256 %69 = OpFunction %2 None %70 %68 = OpFunctionParameter %26 %67 = OpLabel OpBranch %78 %78 = OpLabel OpReturn OpFunctionEnd %82 = OpFunction %2 None %83 %81 = OpLabel %79 = OpVariable %80 Function %12 %85 = OpAccessChain %73 %46 %84 OpBranch %86 %86 = OpLabel %88 = OpCompositeConstruct %26 %10 %10 %10 %89 = OpAccessChain %87 %85 %84 OpStore %89 %88 %91 = OpAccessChain %90 %85 %84 %84 OpStore %91 %10 %92 = OpAccessChain %90 %85 %84 %84 OpStore %92 %14 %93 = OpLoad %8 %79 %94 = OpAccessChain %90 %85 %84 %93 OpStore %94 %15 %95 = OpLoad %27 %85 %96 = OpCompositeExtract %26 %95 0 %97 = OpCompositeExtract %26 %95 0 %98 = OpVectorShuffle %28 %97 %97 2 0 %99 = OpCompositeExtract %26 %95 0 %100 = OpFunctionCall %2 %69 %99 %101 = OpCompositeExtract %26 %95 0 %102 = OpVectorTimesMatrix %26 %101 %41 %103 = OpCompositeExtract %26 %95 0 %104 = OpMatrixTimesVector %26 %41 %103 %105 = OpCompositeExtract %26 %95 0 %106 = OpVectorTimesScalar %26 %105 %14 %107 = OpCompositeExtract %26 %95 0 %108 = OpVectorTimesScalar %26 %107 %14 OpReturn OpFunctionEnd %114 = OpFunction %2 None %83 %113 = OpLabel %109 = OpVariable %110 Function %10 %111 = OpVariable %112 Function %24 %115 = OpAccessChain %73 %46 %84 %116 = OpAccessChain %71 %49 %84 %117 = OpAccessChain %75 %52 %84 %118 = OpAccessChain %72 %55 %84 %119 = OpAccessChain %77 %58 %84 %120 = OpAccessChain %74 %61 %84 %121 = OpAccessChain %76 %64 %84 OpBranch %122 %122 = OpLabel %123 = OpFunctionCall %2 %82 %127 = OpAccessChain %126 %121 %84 %84 %128 = OpLoad %36 %127 %132 = OpAccessChain %131 %120 %84 %84 %84 %133 = OpLoad %30 %132 %134 = OpMatrixTimesVector %28 %128 %133 %135 = OpCompositeExtract %11 %134 0 %137 = OpAccessChain %124 %42 %136 OpStore %137 %135 %138 = OpLoad %32 %119 %139 = OpLoad %26 %118 %140 = OpMatrixTimesVector %28 %138 %139 %141 = OpCompositeExtract %11 %140 0 %143 = OpAccessChain %124 %42 %142 OpStore %143 %141 %146 = OpAccessChain %90 %116 %145 %145 %147 = OpLoad %11 %146 %149 = OpAccessChain %124 %42 %148 OpStore %149 %147 %153 = OpAccessChain %151 %117 %84 %152 %154 = OpLoad %11 %153 %156 = OpAccessChain %124 %42 %155 OpStore %156 %154 %158 = OpAccessChain %157 %115 %145 %159 = OpLoad %11 %158 %160 = OpAccessChain %124 %42 %152 OpStore %160 %159 %161 = OpAccessChain %90 %115 %84 %84 %162 = OpLoad %11 %161 %163 = OpAccessChain %124 %42 %23 OpStore %163 %162 %164 = OpAccessChain %157 %115 %145 OpStore %164 %22 %165 = OpArrayLength %6 %49 0 %166 = OpConvertUToF %11 %165 %167 = OpAccessChain %124 %42 %145 OpStore %167 %166 OpAtomicStore %44 %9 %168 %23 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/image.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 306 OpCapability SampledCubeArray OpCapability ImageQuery OpCapability Image1D OpCapability Shader OpCapability Sampled1D %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %76 "main" %73 OpEntryPoint GLCompute %121 "depth_load" %119 OpEntryPoint Vertex %142 "queries" %140 OpEntryPoint Vertex %194 "levels_queries" %193 OpEntryPoint Fragment %223 "texture_sample" %222 OpEntryPoint Fragment %252 "texture_sample_comparison" %250 OpEntryPoint Fragment %272 "gather" %271 OpEntryPoint Fragment %294 "depth_no_comparison" %293 OpExecutionMode %76 LocalSize 16 1 1 OpExecutionMode %121 LocalSize 16 1 1 OpExecutionMode %223 OriginUpperLeft OpExecutionMode %252 OriginUpperLeft OpExecutionMode %272 OriginUpperLeft OpExecutionMode %294 OriginUpperLeft OpSource GLSL 450 OpName %34 "image_mipmapped_src" OpName %36 "image_multisampled_src" OpName %38 "image_depth_multisampled_src" OpName %40 "image_storage_src" OpName %42 "image_array_src" OpName %44 "image_dup_src" OpName %46 "image_1d_src" OpName %48 "image_dst" OpName %50 "image_1d" OpName %52 "image_2d" OpName %54 "image_2d_array" OpName %56 "image_cube" OpName %58 "image_cube_array" OpName %60 "image_3d" OpName %62 "image_aa" OpName %64 "sampler_reg" OpName %66 "sampler_cmp" OpName %68 "image_2d_depth" OpName %70 "image_cube_depth" OpName %73 "local_id" OpName %76 "main" OpName %119 "local_id" OpName %121 "depth_load" OpName %142 "queries" OpName %194 "levels_queries" OpName %223 "texture_sample" OpName %252 "texture_sample_comparison" OpName %272 "gather" OpName %294 "depth_no_comparison" OpDecorate %34 DescriptorSet 0 OpDecorate %34 Binding 0 OpDecorate %36 DescriptorSet 0 OpDecorate %36 Binding 3 OpDecorate %38 DescriptorSet 0 OpDecorate %38 Binding 4 OpDecorate %40 NonWritable OpDecorate %40 DescriptorSet 0 OpDecorate %40 Binding 1 OpDecorate %42 DescriptorSet 0 OpDecorate %42 Binding 5 OpDecorate %44 NonWritable OpDecorate %44 DescriptorSet 0 OpDecorate %44 Binding 6 OpDecorate %46 DescriptorSet 0 OpDecorate %46 Binding 7 OpDecorate %48 NonReadable OpDecorate %48 DescriptorSet 0 OpDecorate %48 Binding 2 OpDecorate %50 DescriptorSet 0 OpDecorate %50 Binding 0 OpDecorate %52 DescriptorSet 0 OpDecorate %52 Binding 1 OpDecorate %54 DescriptorSet 0 OpDecorate %54 Binding 2 OpDecorate %56 DescriptorSet 0 OpDecorate %56 Binding 3 OpDecorate %58 DescriptorSet 0 OpDecorate %58 Binding 4 OpDecorate %60 DescriptorSet 0 OpDecorate %60 Binding 5 OpDecorate %62 DescriptorSet 0 OpDecorate %62 Binding 6 OpDecorate %64 DescriptorSet 1 OpDecorate %64 Binding 0 OpDecorate %66 DescriptorSet 1 OpDecorate %66 Binding 1 OpDecorate %68 DescriptorSet 1 OpDecorate %68 Binding 2 OpDecorate %70 DescriptorSet 1 OpDecorate %70 Binding 3 OpDecorate %73 BuiltIn LocalInvocationId OpDecorate %119 BuiltIn LocalInvocationId OpDecorate %140 BuiltIn Position OpDecorate %193 BuiltIn Position OpDecorate %222 Location 0 OpDecorate %250 Location 0 OpDecorate %271 Location 0 OpDecorate %293 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %5 = OpConstant %4 20 %6 = OpConstant %4 1 %8 = OpTypeFloat 32 %7 = OpConstant %8 0.5 %9 = OpConstant %8 2.3 %10 = OpConstant %4 3 %11 = OpConstant %8 2.0 %13 = OpTypeInt 32 0 %12 = OpTypeImage %13 2D 0 0 0 1 Unknown %14 = OpTypeImage %13 2D 0 0 1 1 Unknown %15 = OpTypeImage %8 2D 1 0 1 1 Unknown %16 = OpTypeImage %13 2D 0 0 0 2 Rgba8ui %17 = OpTypeImage %13 2D 0 1 0 1 Unknown %18 = OpTypeImage %13 1D 0 0 0 2 R32ui %19 = OpTypeImage %13 1D 0 0 0 1 Unknown %20 = OpTypeVector %13 3 %21 = OpTypeVector %4 2 %22 = OpTypeImage %8 1D 0 0 0 1 Unknown %23 = OpTypeImage %8 2D 0 0 0 1 Unknown %24 = OpTypeImage %8 2D 0 1 0 1 Unknown %25 = OpTypeImage %8 Cube 0 0 0 1 Unknown %26 = OpTypeImage %8 Cube 0 1 0 1 Unknown %27 = OpTypeImage %8 3D 0 0 0 1 Unknown %28 = OpTypeImage %8 2D 0 0 1 1 Unknown %29 = OpTypeVector %8 4 %30 = OpTypeSampler %31 = OpTypeImage %8 2D 1 0 0 1 Unknown %32 = OpTypeImage %8 Cube 1 0 0 1 Unknown %33 = OpConstantComposite %21 %10 %6 %35 = OpTypePointer UniformConstant %12 %34 = OpVariable %35 UniformConstant %37 = OpTypePointer UniformConstant %14 %36 = OpVariable %37 UniformConstant %39 = OpTypePointer UniformConstant %15 %38 = OpVariable %39 UniformConstant %41 = OpTypePointer UniformConstant %16 %40 = OpVariable %41 UniformConstant %43 = OpTypePointer UniformConstant %17 %42 = OpVariable %43 UniformConstant %45 = OpTypePointer UniformConstant %18 %44 = OpVariable %45 UniformConstant %47 = OpTypePointer UniformConstant %19 %46 = OpVariable %47 UniformConstant %49 = OpTypePointer UniformConstant %18 %48 = OpVariable %49 UniformConstant %51 = OpTypePointer UniformConstant %22 %50 = OpVariable %51 UniformConstant %53 = OpTypePointer UniformConstant %23 %52 = OpVariable %53 UniformConstant %55 = OpTypePointer UniformConstant %24 %54 = OpVariable %55 UniformConstant %57 = OpTypePointer UniformConstant %25 %56 = OpVariable %57 UniformConstant %59 = OpTypePointer UniformConstant %26 %58 = OpVariable %59 UniformConstant %61 = OpTypePointer UniformConstant %27 %60 = OpVariable %61 UniformConstant %63 = OpTypePointer UniformConstant %28 %62 = OpVariable %63 UniformConstant %65 = OpTypePointer UniformConstant %30 %64 = OpVariable %65 UniformConstant %67 = OpTypePointer UniformConstant %30 %66 = OpVariable %67 UniformConstant %69 = OpTypePointer UniformConstant %31 %68 = OpVariable %69 UniformConstant %71 = OpTypePointer UniformConstant %32 %70 = OpVariable %71 UniformConstant %74 = OpTypePointer Input %20 %73 = OpVariable %74 Input %77 = OpTypeFunction %2 %86 = OpTypeVector %13 2 %94 = OpTypeVector %13 4 %105 = OpTypeVector %4 3 %119 = OpVariable %74 Input %141 = OpTypePointer Output %29 %140 = OpVariable %141 Output %151 = OpConstant %13 0 %193 = OpVariable %141 Output %222 = OpVariable %141 Output %228 = OpTypeVector %8 2 %231 = OpTypeSampledImage %22 %234 = OpTypeSampledImage %23 %251 = OpTypePointer Output %8 %250 = OpVariable %251 Output %258 = OpTypeSampledImage %31 %263 = OpConstant %8 0.0 %264 = OpTypeVector %8 3 %266 = OpTypeSampledImage %32 %271 = OpVariable %141 Output %281 = OpConstant %13 1 %284 = OpConstant %13 3 %293 = OpVariable %141 Output %76 = OpFunction %2 None %77 %72 = OpLabel %75 = OpLoad %20 %73 %78 = OpLoad %12 %34 %79 = OpLoad %14 %36 %80 = OpLoad %16 %40 %81 = OpLoad %17 %42 %82 = OpLoad %19 %46 %83 = OpLoad %18 %48 OpBranch %84 %84 = OpLabel %85 = OpImageQuerySize %21 %80 %87 = OpVectorShuffle %86 %75 %75 0 1 %88 = OpBitcast %21 %87 %89 = OpIMul %21 %85 %88 %90 = OpCompositeConstruct %21 %3 %5 %91 = OpSRem %21 %89 %90 %92 = OpCompositeExtract %13 %75 2 %93 = OpBitcast %4 %92 %95 = OpImageFetch %94 %78 %91 Lod %93 %96 = OpCompositeExtract %13 %75 2 %97 = OpBitcast %4 %96 %98 = OpImageFetch %94 %79 %91 Sample %97 %99 = OpImageRead %94 %80 %91 %100 = OpCompositeExtract %13 %75 2 %101 = OpBitcast %4 %100 %102 = OpCompositeExtract %13 %75 2 %103 = OpBitcast %4 %102 %104 = OpIAdd %4 %103 %6 %106 = OpCompositeConstruct %105 %91 %101 %107 = OpImageFetch %94 %81 %106 Lod %104 %108 = OpCompositeExtract %13 %75 0 %109 = OpBitcast %4 %108 %110 = OpCompositeExtract %13 %75 2 %111 = OpBitcast %4 %110 %112 = OpImageFetch %94 %82 %109 Lod %111 %113 = OpCompositeExtract %4 %91 0 %114 = OpIAdd %94 %95 %98 %115 = OpIAdd %94 %114 %99 %116 = OpIAdd %94 %115 %107 %117 = OpIAdd %94 %116 %112 OpImageWrite %83 %113 %117 OpReturn OpFunctionEnd %121 = OpFunction %2 None %77 %118 = OpLabel %120 = OpLoad %20 %119 %122 = OpLoad %15 %38 %123 = OpLoad %16 %40 %124 = OpLoad %18 %48 OpBranch %125 %125 = OpLabel %126 = OpImageQuerySize %21 %123 %127 = OpVectorShuffle %86 %120 %120 0 1 %128 = OpBitcast %21 %127 %129 = OpIMul %21 %126 %128 %130 = OpCompositeConstruct %21 %3 %5 %131 = OpSRem %21 %129 %130 %132 = OpCompositeExtract %13 %120 2 %133 = OpBitcast %4 %132 %134 = OpImageFetch %29 %122 %131 Sample %133 %135 = OpCompositeExtract %8 %134 0 %136 = OpCompositeExtract %4 %131 0 %137 = OpConvertFToU %13 %135 %138 = OpCompositeConstruct %94 %137 %137 %137 %137 OpImageWrite %124 %136 %138 OpReturn OpFunctionEnd %142 = OpFunction %2 None %77 %139 = OpLabel %143 = OpLoad %22 %50 %144 = OpLoad %23 %52 %145 = OpLoad %24 %54 %146 = OpLoad %25 %56 %147 = OpLoad %26 %58 %148 = OpLoad %27 %60 %149 = OpLoad %28 %62 OpBranch %150 %150 = OpLabel %152 = OpImageQuerySizeLod %4 %143 %151 %154 = OpImageQuerySizeLod %4 %143 %152 %155 = OpImageQuerySizeLod %21 %144 %151 %156 = OpImageQuerySizeLod %21 %144 %6 %157 = OpImageQuerySizeLod %105 %145 %151 %158 = OpVectorShuffle %21 %157 %157 0 1 %159 = OpImageQuerySizeLod %105 %145 %6 %160 = OpVectorShuffle %21 %159 %159 0 1 %161 = OpImageQuerySizeLod %21 %146 %151 %162 = OpImageQuerySizeLod %21 %146 %6 %163 = OpImageQuerySizeLod %105 %147 %151 %164 = OpVectorShuffle %21 %163 %163 0 0 %165 = OpImageQuerySizeLod %105 %147 %6 %166 = OpVectorShuffle %21 %165 %165 0 0 %167 = OpImageQuerySizeLod %105 %148 %151 %168 = OpImageQuerySizeLod %105 %148 %6 %169 = OpImageQuerySize %21 %149 %170 = OpCompositeExtract %4 %155 1 %171 = OpIAdd %4 %152 %170 %172 = OpCompositeExtract %4 %156 1 %173 = OpIAdd %4 %171 %172 %174 = OpCompositeExtract %4 %158 1 %175 = OpIAdd %4 %173 %174 %176 = OpCompositeExtract %4 %160 1 %177 = OpIAdd %4 %175 %176 %178 = OpCompositeExtract %4 %161 1 %179 = OpIAdd %4 %177 %178 %180 = OpCompositeExtract %4 %162 1 %181 = OpIAdd %4 %179 %180 %182 = OpCompositeExtract %4 %164 1 %183 = OpIAdd %4 %181 %182 %184 = OpCompositeExtract %4 %166 1 %185 = OpIAdd %4 %183 %184 %186 = OpCompositeExtract %4 %167 2 %187 = OpIAdd %4 %185 %186 %188 = OpCompositeExtract %4 %168 2 %189 = OpIAdd %4 %187 %188 %190 = OpConvertSToF %8 %189 %191 = OpCompositeConstruct %29 %190 %190 %190 %190 OpStore %140 %191 OpReturn OpFunctionEnd %194 = OpFunction %2 None %77 %192 = OpLabel %195 = OpLoad %23 %52 %196 = OpLoad %24 %54 %197 = OpLoad %25 %56 %198 = OpLoad %26 %58 %199 = OpLoad %27 %60 %200 = OpLoad %28 %62 OpBranch %201 %201 = OpLabel %202 = OpImageQueryLevels %4 %195 %203 = OpImageQueryLevels %4 %196 %204 = OpImageQuerySizeLod %105 %196 %151 %205 = OpCompositeExtract %4 %204 2 %206 = OpImageQueryLevels %4 %197 %207 = OpImageQueryLevels %4 %198 %208 = OpImageQuerySizeLod %105 %198 %151 %209 = OpCompositeExtract %4 %208 2 %210 = OpImageQueryLevels %4 %199 %211 = OpImageQuerySamples %4 %200 %212 = OpIAdd %4 %205 %209 %213 = OpIAdd %4 %212 %211 %214 = OpIAdd %4 %213 %202 %215 = OpIAdd %4 %214 %203 %216 = OpIAdd %4 %215 %210 %217 = OpIAdd %4 %216 %206 %218 = OpIAdd %4 %217 %207 %219 = OpConvertSToF %8 %218 %220 = OpCompositeConstruct %29 %219 %219 %219 %219 OpStore %193 %220 OpReturn OpFunctionEnd %223 = OpFunction %2 None %77 %221 = OpLabel %224 = OpLoad %22 %50 %225 = OpLoad %23 %52 %226 = OpLoad %30 %64 OpBranch %227 %227 = OpLabel %229 = OpCompositeConstruct %228 %7 %7 %230 = OpCompositeExtract %8 %229 0 %232 = OpSampledImage %231 %224 %226 %233 = OpImageSampleImplicitLod %29 %232 %230 %235 = OpSampledImage %234 %225 %226 %236 = OpImageSampleImplicitLod %29 %235 %229 %237 = OpSampledImage %234 %225 %226 %238 = OpImageSampleImplicitLod %29 %237 %229 ConstOffset %33 %239 = OpSampledImage %234 %225 %226 %240 = OpImageSampleExplicitLod %29 %239 %229 Lod %9 %241 = OpSampledImage %234 %225 %226 %242 = OpImageSampleExplicitLod %29 %241 %229 Lod|ConstOffset %9 %33 %243 = OpSampledImage %234 %225 %226 %244 = OpImageSampleImplicitLod %29 %243 %229 Bias|ConstOffset %11 %33 %245 = OpFAdd %29 %233 %236 %246 = OpFAdd %29 %245 %238 %247 = OpFAdd %29 %246 %240 %248 = OpFAdd %29 %247 %242 OpStore %222 %248 OpReturn OpFunctionEnd %252 = OpFunction %2 None %77 %249 = OpLabel %253 = OpLoad %30 %66 %254 = OpLoad %31 %68 %255 = OpLoad %32 %70 OpBranch %256 %256 = OpLabel %257 = OpCompositeConstruct %228 %7 %7 %259 = OpSampledImage %258 %254 %253 %260 = OpImageSampleDrefImplicitLod %8 %259 %257 %7 %261 = OpSampledImage %258 %254 %253 %262 = OpImageSampleDrefExplicitLod %8 %261 %257 %7 Lod %263 %265 = OpCompositeConstruct %264 %7 %7 %7 %267 = OpSampledImage %266 %255 %253 %268 = OpImageSampleDrefExplicitLod %8 %267 %265 %7 Lod %263 %269 = OpFAdd %8 %260 %262 OpStore %250 %269 OpReturn OpFunctionEnd %272 = OpFunction %2 None %77 %270 = OpLabel %273 = OpLoad %23 %52 %274 = OpLoad %30 %64 %275 = OpLoad %30 %66 %276 = OpLoad %31 %68 OpBranch %277 %277 = OpLabel %278 = OpCompositeConstruct %228 %7 %7 %279 = OpSampledImage %234 %273 %274 %280 = OpImageGather %29 %279 %278 %281 %282 = OpSampledImage %234 %273 %274 %283 = OpImageGather %29 %282 %278 %284 ConstOffset %33 %285 = OpSampledImage %258 %276 %275 %286 = OpImageDrefGather %29 %285 %278 %7 %287 = OpSampledImage %258 %276 %275 %288 = OpImageDrefGather %29 %287 %278 %7 ConstOffset %33 %289 = OpFAdd %29 %280 %283 %290 = OpFAdd %29 %289 %286 %291 = OpFAdd %29 %290 %288 OpStore %271 %291 OpReturn OpFunctionEnd %294 = OpFunction %2 None %77 %292 = OpLabel %295 = OpLoad %30 %64 %296 = OpLoad %31 %68 OpBranch %297 %297 = OpLabel %298 = OpCompositeConstruct %228 %7 %7 %299 = OpSampledImage %258 %296 %295 %300 = OpImageSampleImplicitLod %29 %299 %298 %301 = OpCompositeExtract %8 %300 0 %302 = OpSampledImage %258 %296 %295 %303 = OpImageGather %29 %302 %298 %151 %304 = OpCompositeConstruct %29 %301 %301 %301 %301 %305 = OpFAdd %29 %304 %303 OpStore %293 %305 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/interface.compute.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 49 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %35 "compute" %23 %26 %28 %31 %33 OpExecutionMode %35 LocalSize 1 1 1 OpMemberDecorate %13 0 Offset 0 OpMemberDecorate %13 1 Offset 16 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 4 OpMemberDecorate %14 2 Offset 8 OpDecorate %16 ArrayStride 4 OpMemberDecorate %18 0 Offset 0 OpMemberDecorate %19 0 Offset 0 OpDecorate %23 BuiltIn GlobalInvocationId OpDecorate %26 BuiltIn LocalInvocationId OpDecorate %28 BuiltIn LocalInvocationIndex OpDecorate %31 BuiltIn WorkgroupId OpDecorate %33 BuiltIn NumWorkgroups %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 1 %7 = OpConstant %4 0.0 %9 = OpTypeInt 32 1 %8 = OpConstant %9 1 %10 = OpConstant %9 0 %11 = OpConstant %6 2 %12 = OpTypeVector %4 4 %13 = OpTypeStruct %12 %4 %14 = OpTypeStruct %4 %6 %4 %15 = OpTypeBool %16 = OpTypeArray %6 %8 %17 = OpTypeVector %6 3 %18 = OpTypeStruct %6 %19 = OpTypeStruct %6 %21 = OpTypePointer Workgroup %16 %20 = OpVariable %21 Workgroup %24 = OpTypePointer Input %17 %23 = OpVariable %24 Input %26 = OpVariable %24 Input %29 = OpTypePointer Input %6 %28 = OpVariable %29 Input %31 = OpVariable %24 Input %33 = OpVariable %24 Input %36 = OpTypeFunction %2 %38 = OpTypePointer Workgroup %6 %47 = OpConstant %6 0 %35 = OpFunction %2 None %36 %22 = OpLabel %25 = OpLoad %17 %23 %27 = OpLoad %17 %26 %30 = OpLoad %6 %28 %32 = OpLoad %17 %31 %34 = OpLoad %17 %33 OpBranch %37 %37 = OpLabel %39 = OpCompositeExtract %6 %25 0 %40 = OpCompositeExtract %6 %27 0 %41 = OpIAdd %6 %39 %40 %42 = OpIAdd %6 %41 %30 %43 = OpCompositeExtract %6 %32 0 %44 = OpIAdd %6 %42 %43 %45 = OpCompositeExtract %6 %34 0 %46 = OpIAdd %6 %44 %45 %48 = OpAccessChain %38 %20 %47 OpStore %48 %46 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/interface.fragment.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 54 OpCapability Shader OpCapability SampleRateShading %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %41 "fragment" %22 %25 %28 %31 %34 %36 %38 %40 OpExecutionMode %41 OriginUpperLeft OpExecutionMode %41 DepthReplacing OpMemberDecorate %13 0 Offset 0 OpMemberDecorate %13 1 Offset 16 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 4 OpMemberDecorate %14 2 Offset 8 OpDecorate %16 ArrayStride 4 OpMemberDecorate %18 0 Offset 0 OpMemberDecorate %19 0 Offset 0 OpDecorate %22 Invariant OpDecorate %22 BuiltIn FragCoord OpDecorate %25 Location 1 OpDecorate %28 BuiltIn FrontFacing OpDecorate %28 Flat OpDecorate %31 BuiltIn SampleId OpDecorate %31 Flat OpDecorate %34 BuiltIn SampleMask OpDecorate %34 Flat OpDecorate %36 BuiltIn FragDepth OpDecorate %38 BuiltIn SampleMask OpDecorate %40 Location 0 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 1 %7 = OpConstant %4 0.0 %9 = OpTypeInt 32 1 %8 = OpConstant %9 1 %10 = OpConstant %9 0 %11 = OpConstant %6 2 %12 = OpTypeVector %4 4 %13 = OpTypeStruct %12 %4 %14 = OpTypeStruct %4 %6 %4 %15 = OpTypeBool %16 = OpTypeArray %6 %8 %17 = OpTypeVector %6 3 %18 = OpTypeStruct %6 %19 = OpTypeStruct %6 %23 = OpTypePointer Input %12 %22 = OpVariable %23 Input %26 = OpTypePointer Input %4 %25 = OpVariable %26 Input %29 = OpTypePointer Input %15 %28 = OpVariable %29 Input %32 = OpTypePointer Input %6 %31 = OpVariable %32 Input %34 = OpVariable %32 Input %37 = OpTypePointer Output %4 %36 = OpVariable %37 Output %39 = OpTypePointer Output %6 %38 = OpVariable %39 Output %40 = OpVariable %37 Output %42 = OpTypeFunction %2 %41 = OpFunction %2 None %42 %20 = OpLabel %24 = OpLoad %12 %22 %27 = OpLoad %4 %25 %21 = OpCompositeConstruct %13 %24 %27 %30 = OpLoad %15 %28 %33 = OpLoad %6 %31 %35 = OpLoad %6 %34 OpBranch %43 %43 = OpLabel %44 = OpShiftLeftLogical %6 %5 %33 %45 = OpBitwiseAnd %6 %35 %44 %46 = OpSelect %4 %30 %3 %7 %47 = OpCompositeExtract %4 %21 1 %48 = OpCompositeConstruct %14 %47 %45 %46 %49 = OpCompositeExtract %4 %48 0 OpStore %36 %49 %50 = OpLoad %4 %36 %51 = OpExtInst %4 %1 FClamp %50 %7 %3 OpStore %36 %51 %52 = OpCompositeExtract %6 %48 1 OpStore %38 %52 %53 = OpCompositeExtract %4 %48 2 OpStore %40 %53 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/interface.vertex.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 44 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %34 "vertex" %21 %24 %26 %28 %30 %32 OpMemberDecorate %13 0 Offset 0 OpMemberDecorate %13 1 Offset 16 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 4 OpMemberDecorate %14 2 Offset 8 OpDecorate %16 ArrayStride 4 OpMemberDecorate %18 0 Offset 0 OpMemberDecorate %19 0 Offset 0 OpDecorate %21 BuiltIn VertexIndex OpDecorate %24 BuiltIn InstanceIndex OpDecorate %26 Location 10 OpDecorate %28 Invariant OpDecorate %28 BuiltIn Position OpDecorate %30 Location 1 OpDecorate %32 BuiltIn PointSize %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 1 %7 = OpConstant %4 0.0 %9 = OpTypeInt 32 1 %8 = OpConstant %9 1 %10 = OpConstant %9 0 %11 = OpConstant %6 2 %12 = OpTypeVector %4 4 %13 = OpTypeStruct %12 %4 %14 = OpTypeStruct %4 %6 %4 %15 = OpTypeBool %16 = OpTypeArray %6 %8 %17 = OpTypeVector %6 3 %18 = OpTypeStruct %6 %19 = OpTypeStruct %6 %22 = OpTypePointer Input %6 %21 = OpVariable %22 Input %24 = OpVariable %22 Input %26 = OpVariable %22 Input %29 = OpTypePointer Output %12 %28 = OpVariable %29 Output %31 = OpTypePointer Output %4 %30 = OpVariable %31 Output %33 = OpTypePointer Output %4 %32 = OpVariable %33 Output %35 = OpTypeFunction %2 %34 = OpFunction %2 None %35 %20 = OpLabel %23 = OpLoad %6 %21 %25 = OpLoad %6 %24 %27 = OpLoad %6 %26 OpStore %32 %3 OpBranch %36 %36 = OpLabel %37 = OpIAdd %6 %23 %25 %38 = OpIAdd %6 %37 %27 %39 = OpCompositeConstruct %12 %3 %3 %3 %3 %40 = OpConvertUToF %4 %38 %41 = OpCompositeConstruct %13 %39 %40 %42 = OpCompositeExtract %12 %41 0 OpStore %28 %42 %43 = OpCompositeExtract %4 %41 1 OpStore %30 %43 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/interface.vertex_two_structs.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 45 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %34 "vertex_two_structs" %24 %28 %30 %32 OpMemberDecorate %13 0 Offset 0 OpMemberDecorate %13 1 Offset 16 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 1 Offset 4 OpMemberDecorate %14 2 Offset 8 OpDecorate %16 ArrayStride 4 OpMemberDecorate %18 0 Offset 0 OpMemberDecorate %19 0 Offset 0 OpDecorate %24 BuiltIn VertexIndex OpDecorate %28 BuiltIn InstanceIndex OpDecorate %30 Invariant OpDecorate %30 BuiltIn Position OpDecorate %32 BuiltIn PointSize %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %6 = OpTypeInt 32 0 %5 = OpConstant %6 1 %7 = OpConstant %4 0.0 %9 = OpTypeInt 32 1 %8 = OpConstant %9 1 %10 = OpConstant %9 0 %11 = OpConstant %6 2 %12 = OpTypeVector %4 4 %13 = OpTypeStruct %12 %4 %14 = OpTypeStruct %4 %6 %4 %15 = OpTypeBool %16 = OpTypeArray %6 %8 %17 = OpTypeVector %6 3 %18 = OpTypeStruct %6 %19 = OpTypeStruct %6 %21 = OpTypePointer Function %6 %25 = OpTypePointer Input %6 %24 = OpVariable %25 Input %28 = OpVariable %25 Input %31 = OpTypePointer Output %12 %30 = OpVariable %31 Output %33 = OpTypePointer Output %4 %32 = OpVariable %33 Output %35 = OpTypeFunction %2 %36 = OpTypePointer Workgroup %16 %34 = OpFunction %2 None %35 %22 = OpLabel %20 = OpVariable %21 Function %11 %26 = OpLoad %6 %24 %23 = OpCompositeConstruct %18 %26 %29 = OpLoad %6 %28 %27 = OpCompositeConstruct %19 %29 OpStore %32 %3 OpBranch %37 %37 = OpLabel %38 = OpCompositeExtract %6 %23 0 %39 = OpConvertUToF %4 %38 %40 = OpCompositeExtract %6 %27 0 %41 = OpConvertUToF %4 %40 %42 = OpLoad %6 %20 %43 = OpConvertUToF %4 %42 %44 = OpCompositeConstruct %12 %39 %41 %43 %7 OpStore %30 %44 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/interpolate.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 111 OpCapability Shader OpCapability SampleRateShading %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %46 "vert_main" %30 %32 %34 %36 %38 %40 %41 %42 %43 OpEntryPoint Fragment %109 "frag_main" %88 %91 %94 %97 %100 %103 %105 %107 OpExecutionMode %109 OriginUpperLeft OpSource GLSL 450 OpMemberName %25 0 "position" OpMemberName %25 1 "_flat" OpMemberName %25 2 "_linear" OpMemberName %25 3 "linear_centroid" OpMemberName %25 4 "linear_sample" OpMemberName %25 5 "perspective" OpMemberName %25 6 "perspective_centroid" OpMemberName %25 7 "perspective_sample" OpName %25 "FragmentInput" OpName %26 "out" OpName %30 "position" OpName %32 "_flat" OpName %34 "_linear" OpName %36 "linear_centroid" OpName %38 "linear_sample" OpName %40 "perspective" OpName %41 "perspective_centroid" OpName %42 "perspective_sample" OpName %46 "vert_main" OpName %88 "position" OpName %91 "_flat" OpName %94 "_linear" OpName %97 "linear_centroid" OpName %100 "linear_sample" OpName %103 "perspective" OpName %105 "perspective_centroid" OpName %107 "perspective_sample" OpName %109 "frag_main" OpMemberDecorate %25 0 Offset 0 OpMemberDecorate %25 1 Offset 16 OpMemberDecorate %25 2 Offset 20 OpMemberDecorate %25 3 Offset 24 OpMemberDecorate %25 4 Offset 32 OpMemberDecorate %25 5 Offset 48 OpMemberDecorate %25 6 Offset 64 OpMemberDecorate %25 7 Offset 68 OpDecorate %30 BuiltIn Position OpDecorate %32 Location 0 OpDecorate %32 Flat OpDecorate %34 Location 1 OpDecorate %34 NoPerspective OpDecorate %36 Location 2 OpDecorate %36 NoPerspective OpDecorate %36 Centroid OpDecorate %38 Location 3 OpDecorate %38 NoPerspective OpDecorate %38 Sample OpDecorate %40 Location 4 OpDecorate %41 Location 5 OpDecorate %41 Centroid OpDecorate %42 Location 6 OpDecorate %42 Sample OpDecorate %43 BuiltIn PointSize OpDecorate %88 BuiltIn FragCoord OpDecorate %91 Location 0 OpDecorate %91 Flat OpDecorate %94 Location 1 OpDecorate %94 NoPerspective OpDecorate %97 Location 2 OpDecorate %97 NoPerspective OpDecorate %97 Centroid OpDecorate %100 Location 3 OpDecorate %100 NoPerspective OpDecorate %100 Sample OpDecorate %103 Location 4 OpDecorate %105 Location 5 OpDecorate %105 Centroid OpDecorate %107 Location 6 OpDecorate %107 Sample %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 2.0 %5 = OpConstant %4 4.0 %6 = OpConstant %4 5.0 %7 = OpConstant %4 6.0 %9 = OpTypeInt 32 0 %8 = OpConstant %9 8 %10 = OpConstant %4 27.0 %11 = OpConstant %4 64.0 %12 = OpConstant %4 125.0 %13 = OpConstant %4 216.0 %14 = OpConstant %4 343.0 %15 = OpConstant %4 512.0 %16 = OpConstant %4 729.0 %17 = OpConstant %4 1000.0 %18 = OpConstant %4 1331.0 %19 = OpConstant %4 1728.0 %20 = OpConstant %4 2197.0 %21 = OpConstant %4 2744.0 %22 = OpTypeVector %4 4 %23 = OpTypeVector %4 2 %24 = OpTypeVector %4 3 %25 = OpTypeStruct %22 %9 %4 %23 %24 %22 %4 %4 %27 = OpTypePointer Function %25 %28 = OpConstantNull %25 %31 = OpTypePointer Output %22 %30 = OpVariable %31 Output %33 = OpTypePointer Output %9 %32 = OpVariable %33 Output %35 = OpTypePointer Output %4 %34 = OpVariable %35 Output %37 = OpTypePointer Output %23 %36 = OpVariable %37 Output %39 = OpTypePointer Output %24 %38 = OpVariable %39 Output %40 = OpVariable %31 Output %41 = OpVariable %35 Output %42 = OpVariable %35 Output %44 = OpTypePointer Output %4 %43 = OpVariable %44 Output %45 = OpConstant %4 1.0 %47 = OpTypeFunction %2 %49 = OpTypePointer Function %22 %51 = OpConstant %9 0 %53 = OpTypePointer Function %9 %54 = OpConstant %9 1 %56 = OpTypePointer Function %4 %57 = OpConstant %9 2 %59 = OpTypePointer Function %23 %61 = OpConstant %9 3 %63 = OpTypePointer Function %24 %65 = OpConstant %9 4 %68 = OpConstant %9 5 %70 = OpConstant %9 6 %72 = OpConstant %9 7 %89 = OpTypePointer Input %22 %88 = OpVariable %89 Input %92 = OpTypePointer Input %9 %91 = OpVariable %92 Input %95 = OpTypePointer Input %4 %94 = OpVariable %95 Input %98 = OpTypePointer Input %23 %97 = OpVariable %98 Input %101 = OpTypePointer Input %24 %100 = OpVariable %101 Input %103 = OpVariable %89 Input %105 = OpVariable %95 Input %107 = OpVariable %95 Input %46 = OpFunction %2 None %47 %29 = OpLabel %26 = OpVariable %27 Function %28 OpStore %43 %45 OpBranch %48 %48 = OpLabel %50 = OpCompositeConstruct %22 %3 %5 %6 %7 %52 = OpAccessChain %49 %26 %51 OpStore %52 %50 %55 = OpAccessChain %53 %26 %54 OpStore %55 %8 %58 = OpAccessChain %56 %26 %57 OpStore %58 %10 %60 = OpCompositeConstruct %23 %11 %12 %62 = OpAccessChain %59 %26 %61 OpStore %62 %60 %64 = OpCompositeConstruct %24 %13 %14 %15 %66 = OpAccessChain %63 %26 %65 OpStore %66 %64 %67 = OpCompositeConstruct %22 %16 %17 %18 %19 %69 = OpAccessChain %49 %26 %68 OpStore %69 %67 %71 = OpAccessChain %56 %26 %70 OpStore %71 %20 %73 = OpAccessChain %56 %26 %72 OpStore %73 %21 %74 = OpLoad %25 %26 %75 = OpCompositeExtract %22 %74 0 OpStore %30 %75 %76 = OpAccessChain %44 %30 %54 %77 = OpLoad %4 %76 %78 = OpFNegate %4 %77 OpStore %76 %78 %79 = OpCompositeExtract %9 %74 1 OpStore %32 %79 %80 = OpCompositeExtract %4 %74 2 OpStore %34 %80 %81 = OpCompositeExtract %23 %74 3 OpStore %36 %81 %82 = OpCompositeExtract %24 %74 4 OpStore %38 %82 %83 = OpCompositeExtract %22 %74 5 OpStore %40 %83 %84 = OpCompositeExtract %4 %74 6 OpStore %41 %84 %85 = OpCompositeExtract %4 %74 7 OpStore %42 %85 OpReturn OpFunctionEnd %109 = OpFunction %2 None %47 %86 = OpLabel %90 = OpLoad %22 %88 %93 = OpLoad %9 %91 %96 = OpLoad %4 %94 %99 = OpLoad %23 %97 %102 = OpLoad %24 %100 %104 = OpLoad %22 %103 %106 = OpLoad %4 %105 %108 = OpLoad %4 %107 %87 = OpCompositeConstruct %25 %90 %93 %96 %99 %102 %104 %106 %108 OpBranch %110 %110 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/math-functions.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 36 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %13 "main" %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %5 = OpConstant %4 0.0 %7 = OpTypeInt 32 1 %6 = OpConstant %7 0 %9 = OpTypeInt 32 0 %8 = OpConstant %9 0 %10 = OpTypeVector %7 2 %11 = OpConstantComposite %10 %6 %6 %14 = OpTypeFunction %2 %16 = OpTypeVector %4 4 %26 = OpConstantNull %7 %13 = OpFunction %2 None %14 %12 = OpLabel OpBranch %15 %15 = OpLabel %17 = OpCompositeConstruct %16 %5 %5 %5 %5 %18 = OpExtInst %4 %1 Degrees %3 %19 = OpExtInst %4 %1 Radians %3 %20 = OpExtInst %16 %1 Degrees %17 %21 = OpExtInst %16 %1 Radians %17 %23 = OpCompositeConstruct %16 %5 %5 %5 %5 %24 = OpCompositeConstruct %16 %3 %3 %3 %3 %22 = OpExtInst %16 %1 FClamp %17 %23 %24 %27 = OpCompositeExtract %7 %11 0 %28 = OpCompositeExtract %7 %11 0 %29 = OpIMul %7 %27 %28 %30 = OpIAdd %7 %26 %29 %31 = OpCompositeExtract %7 %11 1 %32 = OpCompositeExtract %7 %11 1 %33 = OpIMul %7 %31 %32 %25 = OpIAdd %7 %30 %33 %34 = OpCopyObject %9 %8 %35 = OpExtInst %9 %1 FindUMsb %34 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/multiview.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 11 OpCapability Shader OpCapability MultiView OpExtension "SPV_KHR_multiview" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %8 "main" %5 OpDecorate %5 BuiltIn ViewIndex %2 = OpTypeVoid %3 = OpTypeInt 32 1 %6 = OpTypePointer Input %3 %5 = OpVariable %6 Input %9 = OpTypeFunction %2 %8 = OpFunction %2 None %9 %4 = OpLabel %7 = OpLoad %3 %5 OpBranch %10 %10 = OpLabel OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/operators.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 543 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %531 "main" OpExecutionMode %531 LocalSize 1 1 1 OpMemberDecorate %31 0 Offset 0 OpMemberDecorate %31 1 Offset 16 OpDecorate %35 ArrayStride 32 OpDecorate %36 ArrayStride 4 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 %5 = OpConstant %4 0.0 %6 = OpConstant %4 0.5 %8 = OpTypeInt 32 1 %7 = OpConstant %8 1 %10 = OpTypeBool %9 = OpConstantTrue %10 %11 = OpConstant %8 0 %12 = OpConstantFalse %10 %13 = OpConstant %4 0.1 %14 = OpConstant %4 2.0 %15 = OpConstant %4 3.0 %16 = OpConstant %4 4.0 %17 = OpConstant %8 5 %18 = OpConstant %8 2 %20 = OpTypeInt 32 0 %19 = OpConstant %20 0 %21 = OpConstant %8 3 %22 = OpConstant %20 4 %23 = OpConstant %4 -1.0 %24 = OpConstant %20 2 %25 = OpConstant %20 1 %26 = OpTypeVector %4 4 %27 = OpTypeVector %8 4 %28 = OpTypeVector %10 4 %29 = OpTypeVector %4 2 %30 = OpTypeVector %4 3 %31 = OpTypeStruct %26 %8 %32 = OpTypeMatrix %29 2 %33 = OpTypeMatrix %26 4 %34 = OpTypeVector %20 2 %35 = OpTypeArray %31 %21 %36 = OpTypeArray %8 %22 %37 = OpTypeMatrix %30 2 %38 = OpTypeMatrix %30 3 %39 = OpTypeMatrix %30 4 %40 = OpTypeMatrix %26 3 %41 = OpTypeVector %8 3 %42 = OpConstantComposite %26 %3 %3 %3 %3 %43 = OpConstantComposite %26 %5 %5 %5 %5 %44 = OpConstantComposite %26 %6 %6 %6 %6 %45 = OpConstantComposite %27 %7 %7 %7 %7 %46 = OpConstantComposite %34 %19 %19 %47 = OpConstantComposite %29 %5 %5 %48 = OpConstantComposite %32 %47 %47 %49 = OpConstantComposite %26 %5 %5 %5 %5 %50 = OpConstantComposite %31 %49 %11 %51 = OpConstantComposite %35 %50 %50 %50 %52 = OpConstantComposite %30 %5 %5 %5 %53 = OpConstantComposite %37 %52 %52 %54 = OpConstantComposite %38 %52 %52 %52 %55 = OpConstantComposite %39 %52 %52 %52 %52 %56 = OpConstantComposite %40 %49 %49 %49 %57 = OpConstantComposite %41 %11 %11 %11 %60 = OpTypeFunction %26 %100 = OpTypePointer Function %29 %101 = OpConstantNull %29 %104 = OpTypeFunction %29 %120 = OpTypeFunction %30 %30 %122 = OpTypeVector %10 3 %129 = OpTypePointer Function %31 %130 = OpConstantNull %31 %133 = OpTypeFunction %4 %158 = OpTypePointer Function %26 %159 = OpTypePointer Function %4 %164 = OpTypeFunction %2 %167 = OpTypeVector %10 2 %183 = OpTypeVector %8 2 %194 = OpTypeVector %20 3 %489 = OpTypePointer Function %8 %491 = OpTypePointer Function %41 %521 = OpTypePointer Function %8 %59 = OpFunction %26 None %60 %58 = OpLabel OpBranch %61 %61 = OpLabel %62 = OpSelect %8 %9 %7 %11 %64 = OpCompositeConstruct %28 %9 %9 %9 %9 %63 = OpSelect %26 %64 %42 %43 %65 = OpCompositeConstruct %28 %12 %12 %12 %12 %66 = OpSelect %26 %65 %43 %42 %67 = OpExtInst %26 %1 FMix %43 %42 %44 %69 = OpCompositeConstruct %26 %13 %13 %13 %13 %68 = OpExtInst %26 %1 FMix %43 %42 %69 %70 = OpCompositeExtract %8 %45 0 %71 = OpBitcast %4 %70 %72 = OpBitcast %26 %45 %73 = OpConvertFToS %27 %43 %74 = OpCompositeConstruct %27 %62 %62 %62 %62 %75 = OpIAdd %27 %74 %73 %76 = OpConvertSToF %26 %75 %77 = OpFAdd %26 %76 %63 %78 = OpFAdd %26 %77 %67 %79 = OpFAdd %26 %78 %68 %80 = OpCompositeConstruct %26 %71 %71 %71 %71 %81 = OpFAdd %26 %79 %80 %82 = OpFAdd %26 %81 %72 OpReturnValue %82 OpFunctionEnd %84 = OpFunction %26 None %60 %83 = OpLabel OpBranch %85 %85 = OpLabel %86 = OpCompositeConstruct %29 %14 %14 %87 = OpCompositeConstruct %29 %3 %3 %88 = OpFAdd %29 %87 %86 %89 = OpCompositeConstruct %29 %15 %15 %90 = OpFSub %29 %88 %89 %91 = OpCompositeConstruct %29 %16 %16 %92 = OpFDiv %29 %90 %91 %93 = OpCompositeConstruct %27 %17 %17 %17 %17 %94 = OpCompositeConstruct %27 %18 %18 %18 %18 %95 = OpSRem %27 %93 %94 %96 = OpVectorShuffle %26 %92 %92 0 1 0 1 %97 = OpConvertSToF %26 %95 %98 = OpFAdd %26 %96 %97 OpReturnValue %98 OpFunctionEnd %103 = OpFunction %29 None %104 %102 = OpLabel %99 = OpVariable %100 Function %101 OpBranch %105 %105 = OpLabel %106 = OpCompositeConstruct %29 %14 %14 OpStore %99 %106 %107 = OpLoad %29 %99 %108 = OpCompositeConstruct %29 %3 %3 %109 = OpFAdd %29 %107 %108 OpStore %99 %109 %110 = OpLoad %29 %99 %111 = OpCompositeConstruct %29 %15 %15 %112 = OpFSub %29 %110 %111 OpStore %99 %112 %113 = OpLoad %29 %99 %114 = OpCompositeConstruct %29 %16 %16 %115 = OpFDiv %29 %113 %114 OpStore %99 %115 %116 = OpLoad %29 %99 OpReturnValue %116 OpFunctionEnd %119 = OpFunction %30 None %120 %118 = OpFunctionParameter %30 %117 = OpLabel OpBranch %121 %121 = OpLabel %123 = OpCompositeConstruct %30 %5 %5 %5 %124 = OpFUnordNotEqual %122 %118 %123 %125 = OpCompositeConstruct %30 %5 %5 %5 %126 = OpCompositeConstruct %30 %3 %3 %3 %127 = OpSelect %30 %124 %126 %125 OpReturnValue %127 OpFunctionEnd %132 = OpFunction %4 None %133 %131 = OpLabel %128 = OpVariable %129 Function %130 OpBranch %134 %134 = OpLabel %135 = OpCompositeConstruct %26 %3 %3 %3 %3 %136 = OpCompositeConstruct %31 %135 %7 OpStore %128 %136 %137 = OpCompositeConstruct %29 %3 %5 %138 = OpCompositeConstruct %29 %5 %3 %139 = OpCompositeConstruct %32 %137 %138 %140 = OpCompositeConstruct %26 %3 %5 %5 %5 %141 = OpCompositeConstruct %26 %5 %3 %5 %5 %142 = OpCompositeConstruct %26 %5 %5 %3 %5 %143 = OpCompositeConstruct %26 %5 %5 %5 %3 %144 = OpCompositeConstruct %33 %140 %141 %142 %143 %145 = OpCompositeConstruct %34 %19 %19 %146 = OpCompositeConstruct %29 %5 %5 %147 = OpCompositeConstruct %29 %5 %5 %148 = OpCompositeConstruct %32 %146 %147 %149 = OpCompositeConstruct %36 %11 %7 %18 %21 %155 = OpCopyObject %37 %53 %157 = OpCopyObject %37 %53 %160 = OpAccessChain %159 %128 %19 %19 %161 = OpLoad %4 %160 OpReturnValue %161 OpFunctionEnd %163 = OpFunction %2 None %164 %162 = OpLabel OpBranch %165 %165 = OpLabel %166 = OpLogicalNot %10 %9 %168 = OpCompositeConstruct %167 %9 %9 %169 = OpLogicalNot %167 %168 %170 = OpLogicalOr %10 %9 %12 %171 = OpLogicalAnd %10 %9 %12 %172 = OpLogicalOr %10 %9 %12 %173 = OpCompositeConstruct %122 %9 %9 %9 %174 = OpCompositeConstruct %122 %12 %12 %12 %175 = OpLogicalOr %122 %173 %174 %176 = OpLogicalAnd %10 %9 %12 %177 = OpCompositeConstruct %28 %9 %9 %9 %9 %178 = OpCompositeConstruct %28 %12 %12 %12 %12 %179 = OpLogicalAnd %28 %177 %178 OpReturn OpFunctionEnd %181 = OpFunction %2 None %164 %180 = OpLabel OpBranch %182 %182 = OpLabel %184 = OpCompositeConstruct %183 %7 %7 %185 = OpSNegate %183 %184 %186 = OpCompositeConstruct %29 %3 %3 %187 = OpFNegate %29 %186 %188 = OpIAdd %8 %18 %7 %189 = OpIAdd %20 %24 %25 %190 = OpFAdd %4 %14 %3 %191 = OpCompositeConstruct %183 %18 %18 %192 = OpCompositeConstruct %183 %7 %7 %193 = OpIAdd %183 %191 %192 %195 = OpCompositeConstruct %194 %24 %24 %24 %196 = OpCompositeConstruct %194 %25 %25 %25 %197 = OpIAdd %194 %195 %196 %198 = OpCompositeConstruct %26 %14 %14 %14 %14 %199 = OpCompositeConstruct %26 %3 %3 %3 %3 %200 = OpFAdd %26 %198 %199 %201 = OpISub %8 %18 %7 %202 = OpISub %20 %24 %25 %203 = OpFSub %4 %14 %3 %204 = OpCompositeConstruct %183 %18 %18 %205 = OpCompositeConstruct %183 %7 %7 %206 = OpISub %183 %204 %205 %207 = OpCompositeConstruct %194 %24 %24 %24 %208 = OpCompositeConstruct %194 %25 %25 %25 %209 = OpISub %194 %207 %208 %210 = OpCompositeConstruct %26 %14 %14 %14 %14 %211 = OpCompositeConstruct %26 %3 %3 %3 %3 %212 = OpFSub %26 %210 %211 %213 = OpIMul %8 %18 %7 %214 = OpIMul %20 %24 %25 %215 = OpFMul %4 %14 %3 %216 = OpCompositeConstruct %183 %18 %18 %217 = OpCompositeConstruct %183 %7 %7 %218 = OpIMul %183 %216 %217 %219 = OpCompositeConstruct %194 %24 %24 %24 %220 = OpCompositeConstruct %194 %25 %25 %25 %221 = OpIMul %194 %219 %220 %222 = OpCompositeConstruct %26 %14 %14 %14 %14 %223 = OpCompositeConstruct %26 %3 %3 %3 %3 %224 = OpFMul %26 %222 %223 %225 = OpSDiv %8 %18 %7 %226 = OpUDiv %20 %24 %25 %227 = OpFDiv %4 %14 %3 %228 = OpCompositeConstruct %183 %18 %18 %229 = OpCompositeConstruct %183 %7 %7 %230 = OpSDiv %183 %228 %229 %231 = OpCompositeConstruct %194 %24 %24 %24 %232 = OpCompositeConstruct %194 %25 %25 %25 %233 = OpUDiv %194 %231 %232 %234 = OpCompositeConstruct %26 %14 %14 %14 %14 %235 = OpCompositeConstruct %26 %3 %3 %3 %3 %236 = OpFDiv %26 %234 %235 %237 = OpSRem %8 %18 %7 %238 = OpUMod %20 %24 %25 %239 = OpFRem %4 %14 %3 %240 = OpCompositeConstruct %183 %18 %18 %241 = OpCompositeConstruct %183 %7 %7 %242 = OpSRem %183 %240 %241 %243 = OpCompositeConstruct %194 %24 %24 %24 %244 = OpCompositeConstruct %194 %25 %25 %25 %245 = OpUMod %194 %243 %244 %246 = OpCompositeConstruct %26 %14 %14 %14 %14 %247 = OpCompositeConstruct %26 %3 %3 %3 %3 %248 = OpFRem %26 %246 %247 %249 = OpCompositeConstruct %183 %18 %18 %250 = OpCompositeConstruct %183 %7 %7 %251 = OpIAdd %183 %249 %250 %252 = OpCompositeConstruct %183 %7 %7 %253 = OpCompositeConstruct %183 %18 %18 %254 = OpIAdd %183 %253 %252 %255 = OpCompositeConstruct %34 %24 %24 %256 = OpCompositeConstruct %34 %25 %25 %257 = OpIAdd %34 %255 %256 %258 = OpCompositeConstruct %34 %25 %25 %259 = OpCompositeConstruct %34 %24 %24 %260 = OpIAdd %34 %259 %258 %261 = OpCompositeConstruct %29 %14 %14 %262 = OpCompositeConstruct %29 %3 %3 %263 = OpFAdd %29 %261 %262 %264 = OpCompositeConstruct %29 %3 %3 %265 = OpCompositeConstruct %29 %14 %14 %266 = OpFAdd %29 %265 %264 %267 = OpCompositeConstruct %183 %18 %18 %268 = OpCompositeConstruct %183 %7 %7 %269 = OpISub %183 %267 %268 %270 = OpCompositeConstruct %183 %7 %7 %271 = OpCompositeConstruct %183 %18 %18 %272 = OpISub %183 %271 %270 %273 = OpCompositeConstruct %34 %24 %24 %274 = OpCompositeConstruct %34 %25 %25 %275 = OpISub %34 %273 %274 %276 = OpCompositeConstruct %34 %25 %25 %277 = OpCompositeConstruct %34 %24 %24 %278 = OpISub %34 %277 %276 %279 = OpCompositeConstruct %29 %14 %14 %280 = OpCompositeConstruct %29 %3 %3 %281 = OpFSub %29 %279 %280 %282 = OpCompositeConstruct %29 %3 %3 %283 = OpCompositeConstruct %29 %14 %14 %284 = OpFSub %29 %283 %282 %285 = OpCompositeConstruct %183 %18 %18 %287 = OpCompositeConstruct %183 %7 %7 %286 = OpIMul %183 %285 %287 %288 = OpCompositeConstruct %183 %7 %7 %290 = OpCompositeConstruct %183 %18 %18 %289 = OpIMul %183 %288 %290 %291 = OpCompositeConstruct %34 %24 %24 %293 = OpCompositeConstruct %34 %25 %25 %292 = OpIMul %34 %291 %293 %294 = OpCompositeConstruct %34 %25 %25 %296 = OpCompositeConstruct %34 %24 %24 %295 = OpIMul %34 %294 %296 %297 = OpCompositeConstruct %29 %14 %14 %298 = OpVectorTimesScalar %29 %297 %3 %299 = OpCompositeConstruct %29 %3 %3 %300 = OpVectorTimesScalar %29 %299 %14 %301 = OpCompositeConstruct %183 %18 %18 %302 = OpCompositeConstruct %183 %7 %7 %303 = OpSDiv %183 %301 %302 %304 = OpCompositeConstruct %183 %7 %7 %305 = OpCompositeConstruct %183 %18 %18 %306 = OpSDiv %183 %305 %304 %307 = OpCompositeConstruct %34 %24 %24 %308 = OpCompositeConstruct %34 %25 %25 %309 = OpUDiv %34 %307 %308 %310 = OpCompositeConstruct %34 %25 %25 %311 = OpCompositeConstruct %34 %24 %24 %312 = OpUDiv %34 %311 %310 %313 = OpCompositeConstruct %29 %14 %14 %314 = OpCompositeConstruct %29 %3 %3 %315 = OpFDiv %29 %313 %314 %316 = OpCompositeConstruct %29 %3 %3 %317 = OpCompositeConstruct %29 %14 %14 %318 = OpFDiv %29 %317 %316 %319 = OpCompositeConstruct %183 %18 %18 %320 = OpCompositeConstruct %183 %7 %7 %321 = OpSRem %183 %319 %320 %322 = OpCompositeConstruct %183 %7 %7 %323 = OpCompositeConstruct %183 %18 %18 %324 = OpSRem %183 %323 %322 %325 = OpCompositeConstruct %34 %24 %24 %326 = OpCompositeConstruct %34 %25 %25 %327 = OpUMod %34 %325 %326 %328 = OpCompositeConstruct %34 %25 %25 %329 = OpCompositeConstruct %34 %24 %24 %330 = OpUMod %34 %329 %328 %331 = OpCompositeConstruct %29 %14 %14 %332 = OpCompositeConstruct %29 %3 %3 %333 = OpFRem %29 %331 %332 %334 = OpCompositeConstruct %29 %3 %3 %335 = OpCompositeConstruct %29 %14 %14 %336 = OpFRem %29 %335 %334 %338 = OpCompositeExtract %30 %54 0 %339 = OpCompositeExtract %30 %54 0 %340 = OpFAdd %30 %338 %339 %341 = OpCompositeExtract %30 %54 1 %342 = OpCompositeExtract %30 %54 1 %343 = OpFAdd %30 %341 %342 %344 = OpCompositeExtract %30 %54 2 %345 = OpCompositeExtract %30 %54 2 %346 = OpFAdd %30 %344 %345 %337 = OpCompositeConstruct %38 %340 %343 %346 %348 = OpCompositeExtract %30 %54 0 %349 = OpCompositeExtract %30 %54 0 %350 = OpFSub %30 %348 %349 %351 = OpCompositeExtract %30 %54 1 %352 = OpCompositeExtract %30 %54 1 %353 = OpFSub %30 %351 %352 %354 = OpCompositeExtract %30 %54 2 %355 = OpCompositeExtract %30 %54 2 %356 = OpFSub %30 %354 %355 %347 = OpCompositeConstruct %38 %350 %353 %356 %357 = OpMatrixTimesScalar %38 %54 %3 %358 = OpMatrixTimesScalar %38 %54 %14 %359 = OpCompositeConstruct %26 %3 %3 %3 %3 %360 = OpMatrixTimesVector %30 %55 %359 %361 = OpCompositeConstruct %30 %14 %14 %14 %362 = OpVectorTimesMatrix %26 %361 %55 %363 = OpMatrixTimesMatrix %38 %55 %56 OpReturn OpFunctionEnd %365 = OpFunction %2 None %164 %364 = OpLabel OpBranch %366 %366 = OpLabel %367 = OpNot %8 %7 %368 = OpNot %20 %25 %369 = OpCompositeConstruct %183 %7 %7 %370 = OpNot %183 %369 %371 = OpCompositeConstruct %194 %25 %25 %25 %372 = OpNot %194 %371 %373 = OpBitwiseOr %8 %18 %7 %374 = OpBitwiseOr %20 %24 %25 %375 = OpCompositeConstruct %183 %18 %18 %376 = OpCompositeConstruct %183 %7 %7 %377 = OpBitwiseOr %183 %375 %376 %378 = OpCompositeConstruct %194 %24 %24 %24 %379 = OpCompositeConstruct %194 %25 %25 %25 %380 = OpBitwiseOr %194 %378 %379 %381 = OpBitwiseAnd %8 %18 %7 %382 = OpBitwiseAnd %20 %24 %25 %383 = OpCompositeConstruct %183 %18 %18 %384 = OpCompositeConstruct %183 %7 %7 %385 = OpBitwiseAnd %183 %383 %384 %386 = OpCompositeConstruct %194 %24 %24 %24 %387 = OpCompositeConstruct %194 %25 %25 %25 %388 = OpBitwiseAnd %194 %386 %387 %389 = OpBitwiseXor %8 %18 %7 %390 = OpBitwiseXor %20 %24 %25 %391 = OpCompositeConstruct %183 %18 %18 %392 = OpCompositeConstruct %183 %7 %7 %393 = OpBitwiseXor %183 %391 %392 %394 = OpCompositeConstruct %194 %24 %24 %24 %395 = OpCompositeConstruct %194 %25 %25 %25 %396 = OpBitwiseXor %194 %394 %395 %397 = OpShiftLeftLogical %8 %18 %25 %398 = OpShiftLeftLogical %20 %24 %25 %399 = OpCompositeConstruct %183 %18 %18 %400 = OpCompositeConstruct %34 %25 %25 %401 = OpShiftLeftLogical %183 %399 %400 %402 = OpCompositeConstruct %194 %24 %24 %24 %403 = OpCompositeConstruct %194 %25 %25 %25 %404 = OpShiftLeftLogical %194 %402 %403 %405 = OpShiftRightArithmetic %8 %18 %25 %406 = OpShiftRightLogical %20 %24 %25 %407 = OpCompositeConstruct %183 %18 %18 %408 = OpCompositeConstruct %34 %25 %25 %409 = OpShiftRightArithmetic %183 %407 %408 %410 = OpCompositeConstruct %194 %24 %24 %24 %411 = OpCompositeConstruct %194 %25 %25 %25 %412 = OpShiftRightLogical %194 %410 %411 OpReturn OpFunctionEnd %414 = OpFunction %2 None %164 %413 = OpLabel OpBranch %415 %415 = OpLabel %416 = OpIEqual %10 %18 %7 %417 = OpIEqual %10 %24 %25 %418 = OpFOrdEqual %10 %14 %3 %419 = OpCompositeConstruct %183 %18 %18 %420 = OpCompositeConstruct %183 %7 %7 %421 = OpIEqual %167 %419 %420 %422 = OpCompositeConstruct %194 %24 %24 %24 %423 = OpCompositeConstruct %194 %25 %25 %25 %424 = OpIEqual %122 %422 %423 %425 = OpCompositeConstruct %26 %14 %14 %14 %14 %426 = OpCompositeConstruct %26 %3 %3 %3 %3 %427 = OpFOrdEqual %28 %425 %426 %428 = OpINotEqual %10 %18 %7 %429 = OpINotEqual %10 %24 %25 %430 = OpFOrdNotEqual %10 %14 %3 %431 = OpCompositeConstruct %183 %18 %18 %432 = OpCompositeConstruct %183 %7 %7 %433 = OpINotEqual %167 %431 %432 %434 = OpCompositeConstruct %194 %24 %24 %24 %435 = OpCompositeConstruct %194 %25 %25 %25 %436 = OpINotEqual %122 %434 %435 %437 = OpCompositeConstruct %26 %14 %14 %14 %14 %438 = OpCompositeConstruct %26 %3 %3 %3 %3 %439 = OpFOrdNotEqual %28 %437 %438 %440 = OpSLessThan %10 %18 %7 %441 = OpULessThan %10 %24 %25 %442 = OpFOrdLessThan %10 %14 %3 %443 = OpCompositeConstruct %183 %18 %18 %444 = OpCompositeConstruct %183 %7 %7 %445 = OpSLessThan %167 %443 %444 %446 = OpCompositeConstruct %194 %24 %24 %24 %447 = OpCompositeConstruct %194 %25 %25 %25 %448 = OpULessThan %122 %446 %447 %449 = OpCompositeConstruct %26 %14 %14 %14 %14 %450 = OpCompositeConstruct %26 %3 %3 %3 %3 %451 = OpFOrdLessThan %28 %449 %450 %452 = OpSLessThanEqual %10 %18 %7 %453 = OpULessThanEqual %10 %24 %25 %454 = OpFOrdLessThanEqual %10 %14 %3 %455 = OpCompositeConstruct %183 %18 %18 %456 = OpCompositeConstruct %183 %7 %7 %457 = OpSLessThanEqual %167 %455 %456 %458 = OpCompositeConstruct %194 %24 %24 %24 %459 = OpCompositeConstruct %194 %25 %25 %25 %460 = OpULessThanEqual %122 %458 %459 %461 = OpCompositeConstruct %26 %14 %14 %14 %14 %462 = OpCompositeConstruct %26 %3 %3 %3 %3 %463 = OpFOrdLessThanEqual %28 %461 %462 %464 = OpSGreaterThan %10 %18 %7 %465 = OpUGreaterThan %10 %24 %25 %466 = OpFOrdGreaterThan %10 %14 %3 %467 = OpCompositeConstruct %183 %18 %18 %468 = OpCompositeConstruct %183 %7 %7 %469 = OpSGreaterThan %167 %467 %468 %470 = OpCompositeConstruct %194 %24 %24 %24 %471 = OpCompositeConstruct %194 %25 %25 %25 %472 = OpUGreaterThan %122 %470 %471 %473 = OpCompositeConstruct %26 %14 %14 %14 %14 %474 = OpCompositeConstruct %26 %3 %3 %3 %3 %475 = OpFOrdGreaterThan %28 %473 %474 %476 = OpSGreaterThanEqual %10 %18 %7 %477 = OpUGreaterThanEqual %10 %24 %25 %478 = OpFOrdGreaterThanEqual %10 %14 %3 %479 = OpCompositeConstruct %183 %18 %18 %480 = OpCompositeConstruct %183 %7 %7 %481 = OpSGreaterThanEqual %167 %479 %480 %482 = OpCompositeConstruct %194 %24 %24 %24 %483 = OpCompositeConstruct %194 %25 %25 %25 %484 = OpUGreaterThanEqual %122 %482 %483 %485 = OpCompositeConstruct %26 %14 %14 %14 %14 %486 = OpCompositeConstruct %26 %3 %3 %3 %3 %487 = OpFOrdGreaterThanEqual %28 %485 %486 OpReturn OpFunctionEnd %493 = OpFunction %2 None %164 %492 = OpLabel %488 = OpVariable %489 Function %7 %490 = OpVariable %491 Function %57 OpBranch %494 %494 = OpLabel %495 = OpLoad %8 %488 %496 = OpIAdd %8 %495 %7 OpStore %488 %496 %497 = OpLoad %8 %488 %498 = OpISub %8 %497 %7 OpStore %488 %498 %499 = OpLoad %8 %488 %500 = OpLoad %8 %488 %501 = OpIMul %8 %499 %500 OpStore %488 %501 %502 = OpLoad %8 %488 %503 = OpLoad %8 %488 %504 = OpSDiv %8 %502 %503 OpStore %488 %504 %505 = OpLoad %8 %488 %506 = OpSRem %8 %505 %7 OpStore %488 %506 %507 = OpLoad %8 %488 %508 = OpBitwiseAnd %8 %507 %11 OpStore %488 %508 %509 = OpLoad %8 %488 %510 = OpBitwiseOr %8 %509 %11 OpStore %488 %510 %511 = OpLoad %8 %488 %512 = OpBitwiseXor %8 %511 %11 OpStore %488 %512 %513 = OpLoad %8 %488 %514 = OpShiftLeftLogical %8 %513 %24 OpStore %488 %514 %515 = OpLoad %8 %488 %516 = OpShiftRightArithmetic %8 %515 %25 OpStore %488 %516 %517 = OpLoad %8 %488 %518 = OpIAdd %8 %517 %7 OpStore %488 %518 %519 = OpLoad %8 %488 %520 = OpISub %8 %519 %7 OpStore %488 %520 %522 = OpAccessChain %521 %490 %25 %523 = OpLoad %8 %522 %524 = OpIAdd %8 %523 %7 %525 = OpAccessChain %521 %490 %25 OpStore %525 %524 %526 = OpAccessChain %521 %490 %25 %527 = OpLoad %8 %526 %528 = OpISub %8 %527 %7 %529 = OpAccessChain %521 %490 %25 OpStore %529 %528 OpReturn OpFunctionEnd %531 = OpFunction %2 None %164 %530 = OpLabel OpBranch %532 %532 = OpLabel %533 = OpFunctionCall %26 %59 %534 = OpFunctionCall %26 %84 %535 = OpVectorShuffle %30 %42 %42 0 1 2 %536 = OpFunctionCall %30 %119 %535 %537 = OpFunctionCall %4 %132 %538 = OpFunctionCall %2 %163 %539 = OpFunctionCall %2 %181 %540 = OpFunctionCall %2 %365 %541 = OpFunctionCall %2 %414 %542 = OpFunctionCall %2 %493 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/padding.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 50 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %27 "vertex" %25 OpSource GLSL 450 OpMemberName %8 0 "a" OpName %8 "S" OpMemberName %9 0 "a" OpMemberName %9 1 "b" OpName %9 "Test" OpMemberName %11 0 "a" OpMemberName %11 1 "b" OpName %11 "Test2" OpMemberName %13 0 "a" OpMemberName %13 1 "b" OpName %13 "Test3" OpName %15 "input1" OpName %18 "input2" OpName %21 "input3" OpName %27 "vertex" OpMemberDecorate %8 0 Offset 0 OpMemberDecorate %9 0 Offset 0 OpMemberDecorate %9 1 Offset 16 OpDecorate %10 ArrayStride 16 OpMemberDecorate %11 0 Offset 0 OpMemberDecorate %11 1 Offset 32 OpMemberDecorate %13 0 Offset 0 OpMemberDecorate %13 0 ColMajor OpMemberDecorate %13 0 MatrixStride 16 OpMemberDecorate %13 1 Offset 64 OpDecorate %15 DescriptorSet 0 OpDecorate %15 Binding 0 OpDecorate %16 Block OpMemberDecorate %16 0 Offset 0 OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 1 OpDecorate %19 Block OpMemberDecorate %19 0 Offset 0 OpDecorate %21 DescriptorSet 0 OpDecorate %21 Binding 2 OpDecorate %22 Block OpMemberDecorate %22 0 Offset 0 OpDecorate %25 BuiltIn Position %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 2 %6 = OpTypeFloat 32 %5 = OpConstant %6 1.0 %7 = OpTypeVector %6 3 %8 = OpTypeStruct %7 %9 = OpTypeStruct %8 %6 %10 = OpTypeArray %7 %3 %11 = OpTypeStruct %10 %6 %12 = OpTypeMatrix %7 4 %13 = OpTypeStruct %12 %6 %14 = OpTypeVector %6 4 %16 = OpTypeStruct %9 %17 = OpTypePointer Uniform %16 %15 = OpVariable %17 Uniform %19 = OpTypeStruct %11 %20 = OpTypePointer Uniform %19 %18 = OpVariable %20 Uniform %22 = OpTypeStruct %13 %23 = OpTypePointer Uniform %22 %21 = OpVariable %23 Uniform %26 = OpTypePointer Output %14 %25 = OpVariable %26 Output %28 = OpTypeFunction %2 %29 = OpTypePointer Uniform %9 %31 = OpTypeInt 32 0 %30 = OpConstant %31 0 %33 = OpTypePointer Uniform %11 %35 = OpTypePointer Uniform %13 %39 = OpTypePointer Uniform %6 %40 = OpConstant %31 1 %27 = OpFunction %2 None %28 %24 = OpLabel %32 = OpAccessChain %29 %15 %30 %34 = OpAccessChain %33 %18 %30 %36 = OpAccessChain %35 %21 %30 OpBranch %37 %37 = OpLabel %38 = OpCompositeConstruct %14 %5 %5 %5 %5 %41 = OpAccessChain %39 %32 %40 %42 = OpLoad %6 %41 %43 = OpVectorTimesScalar %14 %38 %42 %44 = OpAccessChain %39 %34 %40 %45 = OpLoad %6 %44 %46 = OpVectorTimesScalar %14 %43 %45 %47 = OpAccessChain %39 %36 %40 %48 = OpLoad %6 %47 %49 = OpVectorTimesScalar %14 %46 %48 OpStore %25 %49 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/pointer-access.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 35 OpCapability Shader OpCapability Linkage OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpSource GLSL 450 OpDecorate %12 ArrayStride 4 OpDecorate %14 ArrayStride 4 OpDecorate %15 Block OpMemberDecorate %15 0 Offset 0 OpDecorate %17 DescriptorSet 0 OpDecorate %17 Binding 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 0 %5 = OpConstant %4 1 %6 = OpConstant %4 2 %7 = OpConstant %4 3 %9 = OpTypeInt 32 0 %8 = OpConstant %9 0 %10 = OpConstant %9 7 %11 = OpTypePointer StorageBuffer %9 %12 = OpTypeArray %9 %10 %13 = OpTypePointer StorageBuffer %12 %14 = OpTypeRuntimeArray %9 %15 = OpTypeStruct %14 %16 = OpTypePointer StorageBuffer %15 %17 = OpVariable %16 StorageBuffer %22 = OpTypeFunction %9 %13 %9 %30 = OpTypeFunction %9 %16 %9 %32 = OpTypePointer StorageBuffer %14 %21 = OpFunction %9 None %22 %19 = OpFunctionParameter %13 %20 = OpFunctionParameter %9 %18 = OpLabel OpBranch %23 %23 = OpLabel %24 = OpAccessChain %11 %19 %20 %25 = OpLoad %9 %24 OpReturnValue %25 OpFunctionEnd %29 = OpFunction %9 None %30 %27 = OpFunctionParameter %16 %28 = OpFunctionParameter %9 %26 = OpLabel OpBranch %31 %31 = OpLabel %33 = OpAccessChain %11 %27 %8 %28 %34 = OpLoad %9 %33 OpReturnValue %34 OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/pointers.spvasm ================================================ ; SPIR-V ; Version: 1.2 ; Generator: rspirv ; Bound: 42 OpCapability Shader OpCapability Linkage OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpSource GLSL 450 OpMemberName %8 0 "arr" OpName %8 "DynamicArray" OpName %11 "dynamic_array" OpName %12 "v" OpName %16 "f" OpName %23 "i" OpName %24 "v" OpName %25 "index_unsized" OpName %34 "i" OpName %35 "v" OpName %36 "index_dynamic_array" OpDecorate %7 ArrayStride 4 OpMemberDecorate %8 0 Offset 0 OpDecorate %11 DescriptorSet 0 OpDecorate %11 Binding 0 OpDecorate %8 Block %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %5 = OpTypeVector %4 2 %6 = OpTypeInt 32 0 %7 = OpTypeRuntimeArray %6 %8 = OpTypeStruct %7 %9 = OpTypePointer StorageBuffer %8 %10 = OpTypePointer StorageBuffer %7 %11 = OpVariable %9 StorageBuffer %13 = OpTypePointer Function %5 %14 = OpConstantNull %5 %17 = OpTypeFunction %2 %19 = OpTypePointer Function %4 %20 = OpConstant %6 0 %26 = OpTypeFunction %2 %4 %6 %28 = OpTypePointer StorageBuffer %6 %16 = OpFunction %2 None %17 %15 = OpLabel %12 = OpVariable %13 Function %14 OpBranch %18 %18 = OpLabel %21 = OpAccessChain %19 %12 %20 OpStore %21 %3 OpReturn OpFunctionEnd %25 = OpFunction %2 None %26 %23 = OpFunctionParameter %4 %24 = OpFunctionParameter %6 %22 = OpLabel OpBranch %27 %27 = OpLabel %29 = OpAccessChain %28 %11 %20 %23 %30 = OpLoad %6 %29 %31 = OpIAdd %6 %30 %24 %32 = OpAccessChain %28 %11 %20 %23 OpStore %32 %31 OpReturn OpFunctionEnd %36 = OpFunction %2 None %26 %34 = OpFunctionParameter %4 %35 = OpFunctionParameter %6 %33 = OpLabel OpBranch %37 %37 = OpLabel %38 = OpAccessChain %28 %11 %20 %34 %39 = OpLoad %6 %38 %40 = OpIAdd %6 %39 %35 %41 = OpAccessChain %28 %11 %20 %34 OpStore %41 %40 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/policy-mix.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 101 OpCapability Shader OpCapability ImageQuery OpCapability Linkage OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpSource GLSL 450 OpMemberName %15 0 "a" OpName %15 "InStorage" OpMemberName %17 0 "a" OpName %17 "InUniform" OpName %23 "in_storage" OpName %26 "in_uniform" OpName %29 "image_2d_array" OpName %31 "in_workgroup" OpName %33 "in_private" OpName %36 "in_function" OpName %40 "c" OpName %41 "i" OpName %42 "l" OpName %43 "mock_function" OpDecorate %14 ArrayStride 16 OpMemberDecorate %15 0 Offset 0 OpDecorate %16 ArrayStride 16 OpMemberDecorate %17 0 Offset 0 OpDecorate %19 ArrayStride 4 OpDecorate %20 ArrayStride 4 OpDecorate %22 ArrayStride 16 OpDecorate %23 NonWritable OpDecorate %23 DescriptorSet 0 OpDecorate %23 Binding 0 OpDecorate %24 Block OpMemberDecorate %24 0 Offset 0 OpDecorate %26 DescriptorSet 0 OpDecorate %26 Binding 1 OpDecorate %27 Block OpMemberDecorate %27 0 Offset 0 OpDecorate %29 DescriptorSet 0 OpDecorate %29 Binding 2 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %5 = OpConstant %4 20 %6 = OpConstant %4 30 %7 = OpConstant %4 40 %8 = OpConstant %4 2 %10 = OpTypeFloat 32 %9 = OpConstant %10 0.707 %11 = OpConstant %10 0.0 %12 = OpConstant %10 1.0 %13 = OpTypeVector %10 4 %14 = OpTypeArray %13 %3 %15 = OpTypeStruct %14 %16 = OpTypeArray %13 %5 %17 = OpTypeStruct %16 %18 = OpTypeImage %10 2D 0 1 0 1 Unknown %19 = OpTypeArray %10 %6 %20 = OpTypeArray %10 %7 %21 = OpTypeVector %4 2 %22 = OpTypeArray %13 %8 %24 = OpTypeStruct %15 %25 = OpTypePointer StorageBuffer %24 %23 = OpVariable %25 StorageBuffer %27 = OpTypeStruct %17 %28 = OpTypePointer Uniform %27 %26 = OpVariable %28 Uniform %30 = OpTypePointer UniformConstant %18 %29 = OpVariable %30 UniformConstant %32 = OpTypePointer Workgroup %19 %31 = OpVariable %32 Workgroup %34 = OpTypePointer Private %20 %35 = OpConstantNull %20 %33 = OpVariable %34 Private %35 %37 = OpTypePointer Function %22 %38 = OpConstantNull %22 %44 = OpTypeFunction %13 %21 %4 %4 %45 = OpTypePointer StorageBuffer %15 %47 = OpTypeInt 32 0 %46 = OpConstant %47 0 %49 = OpTypePointer Uniform %17 %56 = OpTypePointer StorageBuffer %14 %57 = OpTypePointer StorageBuffer %13 %60 = OpTypePointer Uniform %16 %61 = OpTypePointer Uniform %13 %65 = OpTypeVector %4 3 %67 = OpTypeBool %68 = OpConstantNull %13 %74 = OpTypeVector %67 3 %81 = OpTypePointer Workgroup %10 %82 = OpConstant %47 29 %88 = OpTypePointer Private %10 %89 = OpConstant %47 39 %95 = OpTypePointer Function %13 %96 = OpConstant %47 1 %43 = OpFunction %13 None %44 %40 = OpFunctionParameter %21 %41 = OpFunctionParameter %4 %42 = OpFunctionParameter %4 %39 = OpLabel %36 = OpVariable %37 Function %38 %48 = OpAccessChain %45 %23 %46 %50 = OpAccessChain %49 %26 %46 %51 = OpLoad %18 %29 OpBranch %52 %52 = OpLabel %53 = OpCompositeConstruct %13 %9 %11 %11 %12 %54 = OpCompositeConstruct %13 %11 %9 %11 %12 %55 = OpCompositeConstruct %22 %53 %54 OpStore %36 %55 %58 = OpAccessChain %57 %48 %46 %41 %59 = OpLoad %13 %58 %62 = OpAccessChain %61 %50 %46 %41 %63 = OpLoad %13 %62 %64 = OpFAdd %13 %59 %63 %66 = OpCompositeConstruct %65 %40 %41 %69 = OpImageQueryLevels %4 %51 %70 = OpULessThan %67 %42 %69 OpSelectionMerge %71 None OpBranchConditional %70 %72 %71 %72 = OpLabel %73 = OpImageQuerySizeLod %65 %51 %42 %75 = OpULessThan %74 %66 %73 %76 = OpAll %67 %75 OpBranchConditional %76 %77 %71 %77 = OpLabel %78 = OpImageFetch %13 %51 %66 Lod %42 OpBranch %71 %71 = OpLabel %79 = OpPhi %13 %68 %52 %68 %72 %78 %77 %80 = OpFAdd %13 %64 %79 %83 = OpExtInst %47 %1 UMin %41 %82 %84 = OpAccessChain %81 %31 %83 %85 = OpLoad %10 %84 %86 = OpCompositeConstruct %13 %85 %85 %85 %85 %87 = OpFAdd %13 %80 %86 %90 = OpExtInst %47 %1 UMin %41 %89 %91 = OpAccessChain %88 %33 %90 %92 = OpLoad %10 %91 %93 = OpCompositeConstruct %13 %92 %92 %92 %92 %94 = OpFAdd %13 %87 %93 %97 = OpExtInst %47 %1 UMin %41 %96 %98 = OpAccessChain %95 %36 %97 %99 = OpLoad %13 %98 %100 = OpFAdd %13 %94 %99 OpReturnValue %100 OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/quad.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 64 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %27 "vert_main" %18 %21 %23 %25 OpEntryPoint Fragment %45 "frag_main" %42 %44 OpEntryPoint Fragment %61 "fs_extra" %60 OpExecutionMode %45 OriginUpperLeft OpExecutionMode %61 OriginUpperLeft OpSource GLSL 450 OpName %3 "c_scale" OpMemberName %10 0 "uv" OpMemberName %10 1 "position" OpName %10 "VertexOutput" OpName %13 "u_texture" OpName %15 "u_sampler" OpName %18 "pos" OpName %21 "uv" OpName %23 "uv" OpName %25 "position" OpName %27 "vert_main" OpName %42 "uv" OpName %45 "frag_main" OpName %61 "fs_extra" OpMemberDecorate %10 0 Offset 0 OpMemberDecorate %10 1 Offset 16 OpDecorate %13 DescriptorSet 0 OpDecorate %13 Binding 0 OpDecorate %15 DescriptorSet 0 OpDecorate %15 Binding 1 OpDecorate %18 Location 0 OpDecorate %21 Location 1 OpDecorate %23 Location 0 OpDecorate %25 BuiltIn Position OpDecorate %42 Location 0 OpDecorate %44 Location 0 OpDecorate %60 Location 0 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.2 %5 = OpConstant %4 0.0 %6 = OpConstant %4 1.0 %7 = OpConstant %4 0.5 %8 = OpTypeVector %4 2 %9 = OpTypeVector %4 4 %10 = OpTypeStruct %8 %9 %11 = OpTypeImage %4 2D 0 0 0 1 Unknown %12 = OpTypeSampler %14 = OpTypePointer UniformConstant %11 %13 = OpVariable %14 UniformConstant %16 = OpTypePointer UniformConstant %12 %15 = OpVariable %16 UniformConstant %19 = OpTypePointer Input %8 %18 = OpVariable %19 Input %21 = OpVariable %19 Input %24 = OpTypePointer Output %8 %23 = OpVariable %24 Output %26 = OpTypePointer Output %9 %25 = OpVariable %26 Output %28 = OpTypeFunction %2 %35 = OpTypePointer Output %4 %37 = OpTypeInt 32 0 %36 = OpConstant %37 1 %42 = OpVariable %19 Input %44 = OpVariable %26 Output %49 = OpTypeSampledImage %11 %53 = OpTypeBool %60 = OpVariable %26 Output %27 = OpFunction %2 None %28 %17 = OpLabel %20 = OpLoad %8 %18 %22 = OpLoad %8 %21 OpBranch %29 %29 = OpLabel %30 = OpVectorTimesScalar %8 %20 %3 %31 = OpCompositeConstruct %9 %30 %5 %6 %32 = OpCompositeConstruct %10 %22 %31 %33 = OpCompositeExtract %8 %32 0 OpStore %23 %33 %34 = OpCompositeExtract %9 %32 1 OpStore %25 %34 %38 = OpAccessChain %35 %25 %36 %39 = OpLoad %4 %38 %40 = OpFNegate %4 %39 OpStore %38 %40 OpReturn OpFunctionEnd %45 = OpFunction %2 None %28 %41 = OpLabel %43 = OpLoad %8 %42 %46 = OpLoad %11 %13 %47 = OpLoad %12 %15 OpBranch %48 %48 = OpLabel %50 = OpSampledImage %49 %46 %47 %51 = OpImageSampleImplicitLod %9 %50 %43 %52 = OpCompositeExtract %4 %51 3 %54 = OpFOrdEqual %53 %52 %5 OpSelectionMerge %55 None OpBranchConditional %54 %56 %55 %56 = OpLabel OpKill %55 = OpLabel %57 = OpCompositeExtract %4 %51 3 %58 = OpVectorTimesScalar %9 %51 %57 OpStore %44 %58 OpReturn OpFunctionEnd %61 = OpFunction %2 None %28 %59 = OpLabel OpBranch %62 %62 = OpLabel %63 = OpCompositeConstruct %9 %5 %7 %5 %7 OpStore %60 %63 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/shadow.spvasm ================================================ ; SPIR-V ; Version: 1.2 ; Generator: rspirv ; Bound: 262 OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %94 "vs_main" %84 %87 %89 %91 %93 OpEntryPoint Fragment %148 "fs_main" %139 %142 %145 %147 OpEntryPoint Fragment %212 "fs_main_without_storage" %205 %207 %209 %211 OpExecutionMode %148 OriginUpperLeft OpExecutionMode %212 OriginUpperLeft OpSource GLSL 450 OpName %11 "c_max_lights" OpMemberName %18 0 "view_proj" OpMemberName %18 1 "num_lights" OpName %18 "Globals" OpMemberName %19 0 "world" OpMemberName %19 1 "color" OpName %19 "Entity" OpMemberName %21 0 "proj_position" OpMemberName %21 1 "world_normal" OpMemberName %21 2 "world_position" OpName %21 "VertexOutput" OpMemberName %24 0 "proj" OpMemberName %24 1 "pos" OpMemberName %24 2 "color" OpName %24 "Light" OpName %30 "c_ambient" OpName %31 "u_globals" OpName %34 "u_entity" OpName %37 "s_lights" OpName %40 "u_lights" OpName %43 "t_shadow" OpName %45 "sampler_shadow" OpName %48 "light_id" OpName %49 "homogeneous_coords" OpName %50 "fetch_shadow" OpName %80 "out" OpName %84 "position" OpName %87 "normal" OpName %89 "proj_position" OpName %91 "world_normal" OpName %93 "world_position" OpName %94 "vs_main" OpName %134 "color" OpName %135 "i" OpName %139 "proj_position" OpName %142 "world_normal" OpName %145 "world_position" OpName %148 "fs_main" OpName %201 "color" OpName %202 "i" OpName %205 "proj_position" OpName %207 "world_normal" OpName %209 "world_position" OpName %212 "fs_main_without_storage" OpMemberDecorate %18 0 Offset 0 OpMemberDecorate %18 0 ColMajor OpMemberDecorate %18 0 MatrixStride 16 OpMemberDecorate %18 1 Offset 64 OpMemberDecorate %19 0 Offset 0 OpMemberDecorate %19 0 ColMajor OpMemberDecorate %19 0 MatrixStride 16 OpMemberDecorate %19 1 Offset 64 OpMemberDecorate %21 0 Offset 0 OpMemberDecorate %21 1 Offset 16 OpMemberDecorate %21 2 Offset 32 OpMemberDecorate %24 0 Offset 0 OpMemberDecorate %24 0 ColMajor OpMemberDecorate %24 0 MatrixStride 16 OpMemberDecorate %24 1 Offset 64 OpMemberDecorate %24 2 Offset 80 OpDecorate %25 ArrayStride 96 OpDecorate %26 ArrayStride 96 OpDecorate %31 DescriptorSet 0 OpDecorate %31 Binding 0 OpDecorate %32 Block OpMemberDecorate %32 0 Offset 0 OpDecorate %34 DescriptorSet 1 OpDecorate %34 Binding 0 OpDecorate %35 Block OpMemberDecorate %35 0 Offset 0 OpDecorate %37 NonWritable OpDecorate %37 DescriptorSet 0 OpDecorate %37 Binding 1 OpDecorate %38 Block OpMemberDecorate %38 0 Offset 0 OpDecorate %40 DescriptorSet 0 OpDecorate %40 Binding 1 OpDecorate %41 Block OpMemberDecorate %41 0 Offset 0 OpDecorate %43 DescriptorSet 0 OpDecorate %43 Binding 2 OpDecorate %45 DescriptorSet 0 OpDecorate %45 Binding 3 OpDecorate %84 Location 0 OpDecorate %87 Location 1 OpDecorate %89 BuiltIn Position OpDecorate %91 Location 0 OpDecorate %93 Location 1 OpDecorate %139 BuiltIn FragCoord OpDecorate %142 Location 0 OpDecorate %145 Location 1 OpDecorate %147 Location 0 OpDecorate %205 BuiltIn FragCoord OpDecorate %207 Location 0 OpDecorate %209 Location 1 OpDecorate %211 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 10 %6 = OpTypeFloat 32 %5 = OpConstant %6 0.0 %7 = OpConstant %6 1.0 %8 = OpConstant %6 0.5 %9 = OpConstant %6 -0.5 %10 = OpConstant %6 0.05 %12 = OpTypeInt 32 0 %11 = OpConstant %12 10 %13 = OpConstant %12 0 %14 = OpConstant %12 1 %16 = OpTypeVector %6 4 %15 = OpTypeMatrix %16 4 %17 = OpTypeVector %12 4 %18 = OpTypeStruct %15 %17 %19 = OpTypeStruct %15 %16 %20 = OpTypeVector %6 3 %21 = OpTypeStruct %16 %20 %16 %22 = OpTypeVector %4 4 %23 = OpTypeMatrix %20 3 %24 = OpTypeStruct %15 %16 %16 %25 = OpTypeRuntimeArray %24 %26 = OpTypeArray %24 %3 %27 = OpTypeImage %6 2D 1 1 0 1 Unknown %28 = OpTypeSampler %29 = OpTypeVector %6 2 %30 = OpConstantComposite %20 %10 %10 %10 %32 = OpTypeStruct %18 %33 = OpTypePointer Uniform %32 %31 = OpVariable %33 Uniform %35 = OpTypeStruct %19 %36 = OpTypePointer Uniform %35 %34 = OpVariable %36 Uniform %38 = OpTypeStruct %25 %39 = OpTypePointer StorageBuffer %38 %37 = OpVariable %39 StorageBuffer %41 = OpTypeStruct %26 %42 = OpTypePointer Uniform %41 %40 = OpVariable %42 Uniform %44 = OpTypePointer UniformConstant %27 %43 = OpVariable %44 UniformConstant %46 = OpTypePointer UniformConstant %28 %45 = OpVariable %46 UniformConstant %51 = OpTypeFunction %6 %12 %16 %54 = OpTypePointer Uniform %19 %55 = OpTypePointer Uniform %18 %56 = OpTypePointer Uniform %26 %57 = OpTypePointer StorageBuffer %25 %60 = OpTypeBool %75 = OpTypeSampledImage %27 %81 = OpTypePointer Function %21 %82 = OpConstantNull %21 %85 = OpTypePointer Input %22 %84 = OpVariable %85 Input %87 = OpVariable %85 Input %90 = OpTypePointer Output %16 %89 = OpVariable %90 Output %92 = OpTypePointer Output %20 %91 = OpVariable %92 Output %93 = OpVariable %90 Output %95 = OpTypeFunction %2 %99 = OpTypePointer Uniform %15 %106 = OpTypePointer Function %20 %114 = OpTypeVector %4 3 %119 = OpTypePointer Function %16 %120 = OpConstant %12 2 %128 = OpTypePointer Output %6 %136 = OpTypePointer Function %12 %140 = OpTypePointer Input %16 %139 = OpVariable %140 Input %143 = OpTypePointer Input %20 %142 = OpVariable %143 Input %145 = OpVariable %140 Input %147 = OpVariable %90 Output %162 = OpTypePointer Uniform %17 %163 = OpTypePointer Uniform %12 %171 = OpTypePointer StorageBuffer %24 %197 = OpTypePointer Uniform %16 %205 = OpVariable %140 Input %207 = OpVariable %143 Input %209 = OpVariable %140 Input %211 = OpVariable %90 Output %233 = OpTypePointer Uniform %24 %50 = OpFunction %6 None %51 %48 = OpFunctionParameter %12 %49 = OpFunctionParameter %16 %47 = OpLabel %52 = OpLoad %27 %43 %53 = OpLoad %28 %45 OpBranch %58 %58 = OpLabel %59 = OpCompositeExtract %6 %49 3 %61 = OpFOrdLessThanEqual %60 %59 %5 OpSelectionMerge %62 None OpBranchConditional %61 %63 %62 %63 = OpLabel OpReturnValue %7 %62 = OpLabel %64 = OpCompositeConstruct %29 %8 %9 %65 = OpCompositeExtract %6 %49 3 %66 = OpFDiv %6 %7 %65 %67 = OpVectorShuffle %29 %49 %49 0 1 %68 = OpFMul %29 %67 %64 %69 = OpVectorTimesScalar %29 %68 %66 %70 = OpCompositeConstruct %29 %8 %8 %71 = OpFAdd %29 %69 %70 %72 = OpBitcast %4 %48 %73 = OpCompositeExtract %6 %49 2 %74 = OpFMul %6 %73 %66 %76 = OpConvertUToF %6 %72 %77 = OpCompositeConstruct %20 %71 %76 %78 = OpSampledImage %75 %52 %53 %79 = OpImageSampleDrefExplicitLod %6 %78 %77 %74 Lod %5 OpReturnValue %79 OpFunctionEnd %94 = OpFunction %2 None %95 %83 = OpLabel %80 = OpVariable %81 Function %82 %86 = OpLoad %22 %84 %88 = OpLoad %22 %87 %96 = OpAccessChain %55 %31 %13 %97 = OpAccessChain %54 %34 %13 OpBranch %98 %98 = OpLabel %100 = OpAccessChain %99 %97 %13 %101 = OpLoad %15 %100 %102 = OpAccessChain %99 %97 %13 %103 = OpLoad %15 %102 %104 = OpConvertSToF %16 %86 %105 = OpMatrixTimesVector %16 %103 %104 %107 = OpCompositeExtract %16 %101 0 %108 = OpVectorShuffle %20 %107 %107 0 1 2 %109 = OpCompositeExtract %16 %101 1 %110 = OpVectorShuffle %20 %109 %109 0 1 2 %111 = OpCompositeExtract %16 %101 2 %112 = OpVectorShuffle %20 %111 %111 0 1 2 %113 = OpCompositeConstruct %23 %108 %110 %112 %115 = OpVectorShuffle %114 %88 %88 0 1 2 %116 = OpConvertSToF %20 %115 %117 = OpMatrixTimesVector %20 %113 %116 %118 = OpAccessChain %106 %80 %14 OpStore %118 %117 %121 = OpAccessChain %119 %80 %120 OpStore %121 %105 %122 = OpAccessChain %99 %96 %13 %123 = OpLoad %15 %122 %124 = OpMatrixTimesVector %16 %123 %105 %125 = OpAccessChain %119 %80 %13 OpStore %125 %124 %126 = OpLoad %21 %80 %127 = OpCompositeExtract %16 %126 0 OpStore %89 %127 %129 = OpAccessChain %128 %89 %14 %130 = OpLoad %6 %129 %131 = OpFNegate %6 %130 OpStore %129 %131 %132 = OpCompositeExtract %20 %126 1 OpStore %91 %132 %133 = OpCompositeExtract %16 %126 2 OpStore %93 %133 OpReturn OpFunctionEnd %148 = OpFunction %2 None %95 %137 = OpLabel %134 = OpVariable %106 Function %30 %135 = OpVariable %136 Function %13 %141 = OpLoad %16 %139 %144 = OpLoad %20 %142 %146 = OpLoad %16 %145 %138 = OpCompositeConstruct %21 %141 %144 %146 %149 = OpAccessChain %55 %31 %13 %150 = OpAccessChain %54 %34 %13 %151 = OpAccessChain %57 %37 %13 %152 = OpLoad %27 %43 %153 = OpLoad %28 %45 OpBranch %154 %154 = OpLabel %155 = OpCompositeExtract %20 %138 1 %156 = OpExtInst %20 %1 Normalize %155 OpBranch %157 %157 = OpLabel OpLoopMerge %158 %160 None OpBranch %159 %159 = OpLabel %161 = OpLoad %12 %135 %164 = OpAccessChain %163 %149 %14 %13 %165 = OpLoad %12 %164 %166 = OpExtInst %12 %1 UMin %165 %11 %167 = OpULessThan %60 %161 %166 OpSelectionMerge %168 None OpBranchConditional %167 %168 %169 %169 = OpLabel OpBranch %158 %168 = OpLabel %170 = OpLoad %12 %135 %172 = OpAccessChain %171 %151 %170 %173 = OpLoad %24 %172 %174 = OpLoad %12 %135 %175 = OpCompositeExtract %15 %173 0 %176 = OpCompositeExtract %16 %138 2 %177 = OpMatrixTimesVector %16 %175 %176 %178 = OpFunctionCall %6 %50 %174 %177 %179 = OpCompositeExtract %16 %173 1 %180 = OpVectorShuffle %20 %179 %179 0 1 2 %181 = OpCompositeExtract %16 %138 2 %182 = OpVectorShuffle %20 %181 %181 0 1 2 %183 = OpFSub %20 %180 %182 %184 = OpExtInst %20 %1 Normalize %183 %185 = OpDot %6 %156 %184 %186 = OpExtInst %6 %1 FMax %5 %185 %187 = OpLoad %20 %134 %188 = OpFMul %6 %178 %186 %189 = OpCompositeExtract %16 %173 2 %190 = OpVectorShuffle %20 %189 %189 0 1 2 %191 = OpVectorTimesScalar %20 %190 %188 %192 = OpFAdd %20 %187 %191 OpStore %134 %192 OpBranch %160 %160 = OpLabel %193 = OpLoad %12 %135 %194 = OpIAdd %12 %193 %14 OpStore %135 %194 OpBranch %157 %158 = OpLabel %195 = OpLoad %20 %134 %196 = OpCompositeConstruct %16 %195 %7 %198 = OpAccessChain %197 %150 %14 %199 = OpLoad %16 %198 %200 = OpFMul %16 %196 %199 OpStore %147 %200 OpReturn OpFunctionEnd %212 = OpFunction %2 None %95 %203 = OpLabel %201 = OpVariable %106 Function %30 %202 = OpVariable %136 Function %13 %206 = OpLoad %16 %205 %208 = OpLoad %20 %207 %210 = OpLoad %16 %209 %204 = OpCompositeConstruct %21 %206 %208 %210 %213 = OpAccessChain %55 %31 %13 %214 = OpAccessChain %54 %34 %13 %215 = OpAccessChain %56 %40 %13 %216 = OpLoad %27 %43 %217 = OpLoad %28 %45 OpBranch %218 %218 = OpLabel %219 = OpCompositeExtract %20 %204 1 %220 = OpExtInst %20 %1 Normalize %219 OpBranch %221 %221 = OpLabel OpLoopMerge %222 %224 None OpBranch %223 %223 = OpLabel %225 = OpLoad %12 %202 %226 = OpAccessChain %163 %213 %14 %13 %227 = OpLoad %12 %226 %228 = OpExtInst %12 %1 UMin %227 %11 %229 = OpULessThan %60 %225 %228 OpSelectionMerge %230 None OpBranchConditional %229 %230 %231 %231 = OpLabel OpBranch %222 %230 = OpLabel %232 = OpLoad %12 %202 %234 = OpAccessChain %233 %215 %232 %235 = OpLoad %24 %234 %236 = OpLoad %12 %202 %237 = OpCompositeExtract %15 %235 0 %238 = OpCompositeExtract %16 %204 2 %239 = OpMatrixTimesVector %16 %237 %238 %240 = OpFunctionCall %6 %50 %236 %239 %241 = OpCompositeExtract %16 %235 1 %242 = OpVectorShuffle %20 %241 %241 0 1 2 %243 = OpCompositeExtract %16 %204 2 %244 = OpVectorShuffle %20 %243 %243 0 1 2 %245 = OpFSub %20 %242 %244 %246 = OpExtInst %20 %1 Normalize %245 %247 = OpDot %6 %220 %246 %248 = OpExtInst %6 %1 FMax %5 %247 %249 = OpLoad %20 %201 %250 = OpFMul %6 %240 %248 %251 = OpCompositeExtract %16 %235 2 %252 = OpVectorShuffle %20 %251 %251 0 1 2 %253 = OpVectorTimesScalar %20 %252 %250 %254 = OpFAdd %20 %249 %253 OpStore %201 %254 OpBranch %224 %224 = OpLabel %255 = OpLoad %12 %202 %256 = OpIAdd %12 %255 %14 OpStore %202 %256 OpBranch %221 %222 = OpLabel %257 = OpLoad %20 %201 %258 = OpCompositeConstruct %16 %257 %7 %259 = OpAccessChain %197 %214 %14 %260 = OpLoad %16 %259 %261 = OpFMul %16 %258 %260 OpStore %211 %261 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/skybox.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 98 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %39 "vs_main" %32 %35 %37 OpEntryPoint Fragment %90 "fs_main" %83 %86 %89 OpExecutionMode %90 OriginUpperLeft OpMemberDecorate %12 0 Offset 0 OpMemberDecorate %12 1 Offset 16 OpMemberDecorate %14 0 Offset 0 OpMemberDecorate %14 0 ColMajor OpMemberDecorate %14 0 MatrixStride 16 OpMemberDecorate %14 1 Offset 64 OpMemberDecorate %14 1 ColMajor OpMemberDecorate %14 1 MatrixStride 16 OpDecorate %19 DescriptorSet 0 OpDecorate %19 Binding 0 OpDecorate %20 Block OpMemberDecorate %20 0 Offset 0 OpDecorate %22 DescriptorSet 0 OpDecorate %22 Binding 1 OpDecorate %24 DescriptorSet 0 OpDecorate %24 Binding 2 OpDecorate %32 BuiltIn VertexIndex OpDecorate %35 BuiltIn Position OpDecorate %37 Location 0 OpDecorate %83 BuiltIn FragCoord OpDecorate %86 Location 0 OpDecorate %89 Location 0 %2 = OpTypeVoid %4 = OpTypeInt 32 1 %3 = OpConstant %4 2 %5 = OpConstant %4 1 %7 = OpTypeFloat 32 %6 = OpConstant %7 4.0 %8 = OpConstant %7 1.0 %9 = OpConstant %7 0.0 %10 = OpTypeVector %7 4 %11 = OpTypeVector %7 3 %12 = OpTypeStruct %10 %11 %13 = OpTypeMatrix %10 4 %14 = OpTypeStruct %13 %13 %15 = OpTypeInt 32 0 %16 = OpTypeMatrix %11 3 %17 = OpTypeImage %7 Cube 0 0 0 1 Unknown %18 = OpTypeSampler %20 = OpTypeStruct %14 %21 = OpTypePointer Uniform %20 %19 = OpVariable %21 Uniform %23 = OpTypePointer UniformConstant %17 %22 = OpVariable %23 UniformConstant %25 = OpTypePointer UniformConstant %18 %24 = OpVariable %25 UniformConstant %27 = OpTypePointer Function %4 %28 = OpConstantNull %4 %30 = OpConstantNull %4 %33 = OpTypePointer Input %15 %32 = OpVariable %33 Input %36 = OpTypePointer Output %10 %35 = OpVariable %36 Output %38 = OpTypePointer Output %11 %37 = OpVariable %38 Output %40 = OpTypeFunction %2 %41 = OpTypePointer Uniform %14 %42 = OpConstant %15 0 %58 = OpTypePointer Uniform %13 %59 = OpTypePointer Uniform %10 %60 = OpConstant %15 1 %67 = OpConstant %15 2 %84 = OpTypePointer Input %10 %83 = OpVariable %84 Input %87 = OpTypePointer Input %11 %86 = OpVariable %87 Input %89 = OpVariable %36 Output %95 = OpTypeSampledImage %17 %39 = OpFunction %2 None %40 %31 = OpLabel %26 = OpVariable %27 Function %28 %29 = OpVariable %27 Function %30 %34 = OpLoad %15 %32 %43 = OpAccessChain %41 %19 %42 OpBranch %44 %44 = OpLabel %45 = OpBitcast %4 %34 %46 = OpSDiv %4 %45 %3 OpStore %26 %46 %47 = OpBitcast %4 %34 %48 = OpBitwiseAnd %4 %47 %5 OpStore %29 %48 %49 = OpLoad %4 %26 %50 = OpConvertSToF %7 %49 %51 = OpFMul %7 %50 %6 %52 = OpFSub %7 %51 %8 %53 = OpLoad %4 %29 %54 = OpConvertSToF %7 %53 %55 = OpFMul %7 %54 %6 %56 = OpFSub %7 %55 %8 %57 = OpCompositeConstruct %10 %52 %56 %9 %8 %61 = OpAccessChain %59 %43 %60 %42 %62 = OpLoad %10 %61 %63 = OpVectorShuffle %11 %62 %62 0 1 2 %64 = OpAccessChain %59 %43 %60 %60 %65 = OpLoad %10 %64 %66 = OpVectorShuffle %11 %65 %65 0 1 2 %68 = OpAccessChain %59 %43 %60 %67 %69 = OpLoad %10 %68 %70 = OpVectorShuffle %11 %69 %69 0 1 2 %71 = OpCompositeConstruct %16 %63 %66 %70 %72 = OpTranspose %16 %71 %73 = OpAccessChain %58 %43 %42 %74 = OpLoad %13 %73 %75 = OpMatrixTimesVector %10 %74 %57 %76 = OpVectorShuffle %11 %75 %75 0 1 2 %77 = OpMatrixTimesVector %11 %72 %76 %78 = OpCompositeConstruct %12 %57 %77 %79 = OpCompositeExtract %10 %78 0 OpStore %35 %79 %80 = OpCompositeExtract %11 %78 1 OpStore %37 %80 OpReturn OpFunctionEnd %90 = OpFunction %2 None %40 %81 = OpLabel %85 = OpLoad %10 %83 %88 = OpLoad %11 %86 %82 = OpCompositeConstruct %12 %85 %88 %91 = OpLoad %17 %22 %92 = OpLoad %18 %24 OpBranch %93 %93 = OpLabel %94 = OpCompositeExtract %11 %82 1 %96 = OpSampledImage %95 %91 %92 %97 = OpImageSampleImplicitLod %10 %96 %94 OpStore %89 %97 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/standard.spvasm ================================================ ; SPIR-V ; Version: 1.1 ; Generator: rspirv ; Bound: 19 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %11 "derivatives" %6 %9 OpExecutionMode %11 OriginUpperLeft OpDecorate %6 BuiltIn FragCoord OpDecorate %9 Location 0 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpTypeVector %4 4 %7 = OpTypePointer Input %3 %6 = OpVariable %7 Input %10 = OpTypePointer Output %3 %9 = OpVariable %10 Output %12 = OpTypeFunction %2 %11 = OpFunction %2 None %12 %5 = OpLabel %8 = OpLoad %3 %6 OpBranch %13 %13 = OpLabel %14 = OpDPdx %3 %8 %15 = OpDPdy %3 %8 %16 = OpFwidth %3 %8 %17 = OpFAdd %3 %14 %15 %18 = OpFMul %3 %17 %16 OpStore %9 %18 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/spv/texture-arg.spvasm ================================================ ; SPIR-V ; Version: 1.0 ; Generator: rspirv ; Bound: 34 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %28 "main" %26 OpExecutionMode %28 OriginUpperLeft OpSource GLSL 450 OpName %9 "Texture" OpName %11 "Sampler" OpName %14 "Passed_Texture" OpName %16 "Passed_Sampler" OpName %18 "test" OpName %28 "main" OpDecorate %9 DescriptorSet 0 OpDecorate %9 Binding 0 OpDecorate %11 DescriptorSet 0 OpDecorate %11 Binding 1 OpDecorate %26 Location 0 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 0.0 %5 = OpTypeImage %4 2D 0 0 0 1 Unknown %6 = OpTypeSampler %7 = OpTypeVector %4 4 %8 = OpTypeVector %4 2 %10 = OpTypePointer UniformConstant %5 %9 = OpVariable %10 UniformConstant %12 = OpTypePointer UniformConstant %6 %11 = OpVariable %12 UniformConstant %19 = OpTypeFunction %7 %10 %12 %22 = OpTypeSampledImage %5 %27 = OpTypePointer Output %7 %26 = OpVariable %27 Output %29 = OpTypeFunction %2 %18 = OpFunction %7 None %19 %14 = OpFunctionParameter %10 %16 = OpFunctionParameter %12 %13 = OpLabel %15 = OpLoad %5 %14 %17 = OpLoad %6 %16 OpBranch %20 %20 = OpLabel %21 = OpCompositeConstruct %8 %3 %3 %23 = OpSampledImage %22 %15 %17 %24 = OpImageSampleImplicitLod %7 %23 %21 OpReturnValue %24 OpFunctionEnd %28 = OpFunction %2 None %29 %25 = OpLabel %30 = OpLoad %5 %9 %31 = OpLoad %6 %11 OpBranch %32 %32 = OpLabel %33 = OpFunctionCall %7 %18 %9 %11 OpStore %26 %33 OpReturn OpFunctionEnd ================================================ FILE: lib/naga/tests/out/wgsl/210-bevy-2d-shader-frag.wgsl ================================================ struct ColorMaterial_color { Color: vec4, } struct FragmentOutput { @location(0) o_Target: vec4, } var v_Uv_1: vec2; var o_Target: vec4; @group(1) @binding(0) var global: ColorMaterial_color; fn main_1() { var color: vec4; let _e4 = global.Color; color = _e4; let _e6 = color; o_Target = _e6; return; } @fragment fn main(@location(0) v_Uv: vec2) -> FragmentOutput { v_Uv_1 = v_Uv; main_1(); let _e9 = o_Target; return FragmentOutput(_e9); } ================================================ FILE: lib/naga/tests/out/wgsl/210-bevy-2d-shader-vert.wgsl ================================================ struct Camera { ViewProj: mat4x4, } struct Transform { Model: mat4x4, } struct Sprite_size { size: vec2, } struct VertexOutput { @location(0) v_Uv: vec2, @builtin(position) member: vec4, } var Vertex_Position_1: vec3; var Vertex_Normal_1: vec3; var Vertex_Uv_1: vec2; var v_Uv: vec2; @group(0) @binding(0) var global: Camera; @group(2) @binding(0) var global_1: Transform; @group(2) @binding(1) var global_2: Sprite_size; var gl_Position: vec4; fn main_1() { var position: vec3; let _e10 = Vertex_Uv_1; v_Uv = _e10; let _e11 = Vertex_Position_1; let _e12 = global_2.size; position = (_e11 * vec3(_e12.x, _e12.y, 1.0)); let _e20 = global.ViewProj; let _e21 = global_1.Model; let _e23 = position; gl_Position = ((_e20 * _e21) * vec4(_e23.x, _e23.y, _e23.z, 1.0)); return; } @vertex fn main(@location(0) Vertex_Position: vec3, @location(1) Vertex_Normal: vec3, @location(2) Vertex_Uv: vec2) -> VertexOutput { Vertex_Position_1 = Vertex_Position; Vertex_Normal_1 = Vertex_Normal; Vertex_Uv_1 = Vertex_Uv; _ = (&global.ViewProj); _ = (&global_1.Model); main_1(); let _e21 = v_Uv; let _e23 = gl_Position; return VertexOutput(_e21, _e23); } ================================================ FILE: lib/naga/tests/out/wgsl/210-bevy-shader-vert.wgsl ================================================ struct Camera { ViewProj: mat4x4, } struct Transform { Model: mat4x4, } struct VertexOutput { @location(0) v_Position: vec3, @location(1) v_Normal: vec3, @location(2) v_Uv: vec2, @builtin(position) member: vec4, } var Vertex_Position_1: vec3; var Vertex_Normal_1: vec3; var Vertex_Uv_1: vec2; var v_Position: vec3; var v_Normal: vec3; var v_Uv: vec2; @group(0) @binding(0) var global: Camera; @group(2) @binding(0) var global_1: Transform; var gl_Position: vec4; fn main_1() { let _e10 = global_1.Model; let _e11 = Vertex_Normal_1; v_Normal = (_e10 * vec4(_e11.x, _e11.y, _e11.z, 1.0)).xyz; let _e19 = global_1.Model; let _e29 = Vertex_Normal_1; v_Normal = (mat3x3(_e19[0].xyz, _e19[1].xyz, _e19[2].xyz) * _e29); let _e31 = global_1.Model; let _e32 = Vertex_Position_1; v_Position = (_e31 * vec4(_e32.x, _e32.y, _e32.z, 1.0)).xyz; let _e40 = Vertex_Uv_1; v_Uv = _e40; let _e42 = global.ViewProj; let _e43 = v_Position; gl_Position = (_e42 * vec4(_e43.x, _e43.y, _e43.z, 1.0)); return; } @vertex fn main(@location(0) Vertex_Position: vec3, @location(1) Vertex_Normal: vec3, @location(2) Vertex_Uv: vec2) -> VertexOutput { Vertex_Position_1 = Vertex_Position; Vertex_Normal_1 = Vertex_Normal; Vertex_Uv_1 = Vertex_Uv; _ = (&global.ViewProj); main_1(); let _e23 = v_Position; let _e25 = v_Normal; let _e27 = v_Uv; let _e29 = gl_Position; return VertexOutput(_e23, _e25, _e27, _e29); } ================================================ FILE: lib/naga/tests/out/wgsl/246-collatz-comp.wgsl ================================================ struct PrimeIndices { indices: array, } @group(0) @binding(0) var global: PrimeIndices; var gl_GlobalInvocationID: vec3; fn collatz_iterations(n: u32) -> u32 { var n_1: u32; var i: u32; _ = (&global.indices); n_1 = n; i = u32(0); loop { let _e7 = n_1; if !((_e7 != u32(1))) { break; } { _ = n_1; let _e14 = n_1; let _e15 = f32(_e14); let _e17 = f32(2); if ((_e15 - (floor((_e15 / _e17)) * _e17)) == f32(0)) { { let _e25 = n_1; n_1 = (_e25 / u32(2)); } } else { { let _e30 = n_1; n_1 = ((u32(3) * _e30) + u32(1)); } } let _e36 = i; i = (_e36 + 1u); } } let _e39 = i; return _e39; } fn main_1() { var index: u32; let _e3 = gl_GlobalInvocationID; index = _e3.x; let _e6 = index; let _e8 = index; _ = global.indices[_e8]; let _e11 = index; let _e13 = global.indices[_e11]; let _e14 = collatz_iterations(_e13); global.indices[_e6] = _e14; return; } @compute @workgroup_size(1, 1, 1) fn main(@builtin(global_invocation_id) param: vec3) { gl_GlobalInvocationID = param; main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/277-casting-vert.wgsl ================================================ fn main_1() { var a: f32; a = f32(1); return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/280-matrix-cast-vert.wgsl ================================================ fn main_1() { var a: mat4x4; let _e1 = f32(1); a = mat4x4(vec4(_e1, 0.0, 0.0, 0.0), vec4(0.0, _e1, 0.0, 0.0), vec4(0.0, 0.0, _e1, 0.0), vec4(0.0, 0.0, 0.0, _e1)); return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/484-preprocessor-if-vert.wgsl ================================================ fn main_1() { return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/800-out-of-bounds-panic-vert.wgsl ================================================ struct Globals { view_matrix: mat4x4, } struct VertexPushConstants { world_matrix: mat4x4, } struct VertexOutput { @location(0) frag_color: vec4, @builtin(position) member: vec4, } @group(0) @binding(0) var global: Globals; var global_1: VertexPushConstants; var position_1: vec2; var color_1: vec4; var frag_color: vec4; var gl_Position: vec4; fn main_1() { let _e7 = color_1; frag_color = _e7; let _e9 = global.view_matrix; let _e10 = global_1.world_matrix; let _e12 = position_1; gl_Position = ((_e9 * _e10) * vec4(_e12.x, _e12.y, 0.0, 1.0)); let _e20 = gl_Position; let _e22 = gl_Position; gl_Position.z = ((_e20.z + _e22.w) / 2.0); return; } @vertex fn main(@location(0) position: vec2, @location(1) color: vec4) -> VertexOutput { position_1 = position; color_1 = color; _ = (&global.view_matrix); _ = (&global_1.world_matrix); main_1(); let _e15 = frag_color; let _e17 = gl_Position; return VertexOutput(_e15, _e17); } ================================================ FILE: lib/naga/tests/out/wgsl/896-push-constant-vert.wgsl ================================================ struct PushConstants { example: f32, } var c: PushConstants; fn main_1() { return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/900-implicit-conversions-vert.wgsl ================================================ fn exact(a: f32) { var a_1: f32; a_1 = a; return; } fn exact_1(a_2: i32) { var a_3: i32; a_3 = a_2; return; } fn implicit(a_4: f32) { var a_5: f32; a_5 = a_4; return; } fn implicit_1(a_6: i32) { var a_7: i32; a_7 = a_6; return; } fn implicit_dims(v: f32) { var v_1: f32; v_1 = v; return; } fn implicit_dims_1(v_2: vec2) { var v_3: vec2; v_3 = v_2; return; } fn implicit_dims_2(v_4: vec3) { var v_5: vec3; v_5 = v_4; return; } fn implicit_dims_3(v_6: vec4) { var v_7: vec4; v_7 = v_6; return; } fn main_1() { exact_1(1); implicit(f32(1u)); _ = vec3(1); implicit_dims_2(vec3(vec3(1))); return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/901-lhs-field-select-vert.wgsl ================================================ fn main_1() { var a: vec4; a = vec4(1.0); a.x = 2.0; return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/931-constant-emitting-vert.wgsl ================================================ fn function_() -> f32 { return 0.0; } fn main_1() { return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/932-for-loop-if-vert.wgsl ================================================ fn main_1() { var i: i32; i = 0; loop { let _e2 = i; if !((_e2 < 1)) { break; } { } continuing { let _e6 = i; i = (_e6 + 1); } } return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/access.wgsl ================================================ struct GlobalConst { a: u32, b: vec3, c: i32, } struct AlignedWrapper { value: i32, } struct Bar { _matrix: mat4x3, matrix_array: array,2>, atom: atomic, arr: array,2>, data: array, } struct Baz { m: mat3x2, } struct MatCx2InArray { am: array,2>, } var global_const: GlobalConst = GlobalConst(0u, vec3(0u, 0u, 0u), 0); @group(0) @binding(0) var bar: Bar; @group(0) @binding(1) var baz: Baz; @group(0) @binding(2) var qux: vec2; @group(0) @binding(3) var nested_mat_cx2_: MatCx2InArray; var val: u32; fn test_matrix_within_struct_accesses() { var idx: i32 = 1; var t: Baz; let _e6 = idx; idx = (_e6 - 1); _ = baz.m; _ = baz.m[0]; let _e16 = idx; _ = baz.m[_e16]; _ = baz.m[0][1]; let _e28 = idx; _ = baz.m[0][_e28]; let _e32 = idx; _ = baz.m[_e32][1]; let _e38 = idx; let _e40 = idx; _ = baz.m[_e38][_e40]; t = Baz(mat3x2(vec2(1.0), vec2(2.0), vec2(3.0))); let _e52 = idx; idx = (_e52 + 1); t.m = mat3x2(vec2(6.0), vec2(5.0), vec2(4.0)); t.m[0] = vec2(9.0); let _e69 = idx; t.m[_e69] = vec2(90.0); t.m[0][1] = 10.0; let _e82 = idx; t.m[0][_e82] = 20.0; let _e86 = idx; t.m[_e86][1] = 30.0; let _e92 = idx; let _e94 = idx; t.m[_e92][_e94] = 40.0; return; } fn test_matrix_within_array_within_struct_accesses() { var idx_1: i32 = 1; var t_1: MatCx2InArray; let _e7 = idx_1; idx_1 = (_e7 - 1); _ = nested_mat_cx2_.am; _ = nested_mat_cx2_.am[0]; _ = nested_mat_cx2_.am[0][0]; let _e25 = idx_1; _ = nested_mat_cx2_.am[0][_e25]; _ = nested_mat_cx2_.am[0][0][1]; let _e41 = idx_1; _ = nested_mat_cx2_.am[0][0][_e41]; let _e47 = idx_1; _ = nested_mat_cx2_.am[0][_e47][1]; let _e55 = idx_1; let _e57 = idx_1; _ = nested_mat_cx2_.am[0][_e55][_e57]; t_1 = MatCx2InArray(array,2>(mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)))); let _e63 = idx_1; idx_1 = (_e63 + 1); t_1.am = array,2>(mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0)), mat4x2(vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0), vec2(0.0, 0.0))); t_1.am[0] = mat4x2(vec2(8.0), vec2(7.0), vec2(6.0), vec2(5.0)); t_1.am[0][0] = vec2(9.0); let _e90 = idx_1; t_1.am[0][_e90] = vec2(90.0); t_1.am[0][0][1] = 10.0; let _e107 = idx_1; t_1.am[0][0][_e107] = 20.0; let _e113 = idx_1; t_1.am[0][_e113][1] = 30.0; let _e121 = idx_1; let _e123 = idx_1; t_1.am[0][_e121][_e123] = 40.0; return; } fn read_from_private(foo_1: ptr) -> f32 { let _e6 = (*foo_1); return _e6; } fn test_arr_as_arg(a: array,5>) -> f32 { return a[4][9]; } fn assign_through_ptr_fn(p: ptr) { (*p) = 42u; return; } @vertex fn foo_vert(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4 { var foo: f32 = 0.0; var c: array; let baz_1 = foo; foo = 1.0; test_matrix_within_struct_accesses(); test_matrix_within_array_within_struct_accesses(); let _matrix = bar._matrix; let arr = bar.arr; let b = bar._matrix[3][0]; let a_1 = bar.data[(arrayLength((&bar.data)) - 2u)].value; let c_1 = qux; let data_pointer = (&bar.data[0].value); let _e32 = read_from_private((&foo)); c = array(a_1, i32(b), 3, 4, 5); c[(vi + 1u)] = 42; let value = c[vi]; let _e46 = test_arr_as_arg(array,5>(array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))); return vec4((_matrix * vec4(vec4(value))), 2.0); } @fragment fn foo_frag() -> @location(0) vec4 { bar._matrix[1][2] = 1.0; bar._matrix = mat4x3(vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0)); bar.arr = array,2>(vec2(0u), vec2(1u)); bar.data[1].value = 1; qux = vec2(0, 0); return vec4(0.0); } @compute @workgroup_size(1, 1, 1) fn atomics() { var tmp: i32; let value_1 = atomicLoad((&bar.atom)); let _e10 = atomicAdd((&bar.atom), 5); tmp = _e10; let _e13 = atomicSub((&bar.atom), 5); tmp = _e13; let _e16 = atomicAnd((&bar.atom), 5); tmp = _e16; let _e19 = atomicOr((&bar.atom), 5); tmp = _e19; let _e22 = atomicXor((&bar.atom), 5); tmp = _e22; let _e25 = atomicMin((&bar.atom), 5); tmp = _e25; let _e28 = atomicMax((&bar.atom), 5); tmp = _e28; let _e31 = atomicExchange((&bar.atom), 5); tmp = _e31; atomicStore((&bar.atom), value_1); return; } @compute @workgroup_size(1, 1, 1) fn assign_through_ptr() { assign_through_ptr_fn((&val)); return; } ================================================ FILE: lib/naga/tests/out/wgsl/bevy-pbr-frag.wgsl ================================================ struct PointLight { pos: vec4, color: vec4, lightParams: vec4, } struct DirectionalLight { direction: vec4, color: vec4, } struct CameraViewProj { ViewProj: mat4x4, } struct CameraPosition { CameraPos: vec4, } struct Lights { AmbientColor: vec4, NumLights: vec4, PointLights: array, DirectionalLights: array, } struct StandardMaterial_base_color { base_color: vec4, } struct StandardMaterial_roughness { perceptual_roughness: f32, } struct StandardMaterial_metallic { metallic: f32, } struct StandardMaterial_reflectance { reflectance: f32, } struct StandardMaterial_emissive { emissive: vec4, } struct FragmentOutput { @location(0) o_Target: vec4, } var v_WorldPosition_1: vec3; var v_WorldNormal_1: vec3; var v_Uv_1: vec2; var v_WorldTangent_1: vec4; var o_Target: vec4; @group(0) @binding(0) var global: CameraViewProj; @group(0) @binding(1) var global_1: CameraPosition; @group(1) @binding(0) var global_2: Lights; @group(3) @binding(0) var global_3: StandardMaterial_base_color; @group(3) @binding(1) var StandardMaterial_base_color_texture: texture_2d; @group(3) @binding(2) var StandardMaterial_base_color_texture_sampler: sampler; @group(3) @binding(3) var global_4: StandardMaterial_roughness; @group(3) @binding(4) var global_5: StandardMaterial_metallic; @group(3) @binding(5) var StandardMaterial_metallic_roughness_texture: texture_2d; @group(3) @binding(6) var StandardMaterial_metallic_roughness_texture_sampler: sampler; @group(3) @binding(7) var global_6: StandardMaterial_reflectance; @group(3) @binding(8) var StandardMaterial_normal_map: texture_2d; @group(3) @binding(9) var StandardMaterial_normal_map_sampler: sampler; @group(3) @binding(10) var StandardMaterial_occlusion_texture: texture_2d; @group(3) @binding(11) var StandardMaterial_occlusion_texture_sampler: sampler; @group(3) @binding(12) var global_7: StandardMaterial_emissive; @group(3) @binding(13) var StandardMaterial_emissive_texture: texture_2d; @group(3) @binding(14) var StandardMaterial_emissive_texture_sampler: sampler; var gl_FrontFacing: bool; fn pow5_(x: f32) -> f32 { var x_1: f32; var x2_: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); x_1 = x; let _e42 = x_1; let _e43 = x_1; x2_ = (_e42 * _e43); let _e46 = x2_; let _e47 = x2_; let _e49 = x_1; return ((_e46 * _e47) * _e49); } fn getDistanceAttenuation(distanceSquare: f32, inverseRangeSquared: f32) -> f32 { var distanceSquare_1: f32; var inverseRangeSquared_1: f32; var factor: f32; var smoothFactor: f32; var attenuation: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); distanceSquare_1 = distanceSquare; inverseRangeSquared_1 = inverseRangeSquared; let _e44 = distanceSquare_1; let _e45 = inverseRangeSquared_1; factor = (_e44 * _e45); let _e49 = factor; let _e50 = factor; _ = (1.0 - (_e49 * _e50)); let _e56 = factor; let _e57 = factor; smoothFactor = clamp((1.0 - (_e56 * _e57)), 0.0, 1.0); let _e64 = smoothFactor; let _e65 = smoothFactor; attenuation = (_e64 * _e65); let _e68 = attenuation; _ = distanceSquare_1; let _e73 = distanceSquare_1; return ((_e68 * 1.0) / max(_e73, 0.0010000000474974513)); } fn D_GGX(roughness: f32, NoH: f32, h: vec3) -> f32 { var roughness_1: f32; var NoH_1: f32; var oneMinusNoHSquared: f32; var a: f32; var k: f32; var d: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); roughness_1 = roughness; NoH_1 = NoH; let _e46 = NoH_1; let _e47 = NoH_1; oneMinusNoHSquared = (1.0 - (_e46 * _e47)); let _e51 = NoH_1; let _e52 = roughness_1; a = (_e51 * _e52); let _e55 = roughness_1; let _e56 = oneMinusNoHSquared; let _e57 = a; let _e58 = a; k = (_e55 / (_e56 + (_e57 * _e58))); let _e63 = k; let _e64 = k; d = ((_e63 * _e64) * (1.0 / 3.1415927410125732)); let _e70 = d; return _e70; } fn V_SmithGGXCorrelated(roughness_2: f32, NoV: f32, NoL: f32) -> f32 { var roughness_3: f32; var NoV_1: f32; var NoL_1: f32; var a2_: f32; var lambdaV: f32; var lambdaL: f32; var v: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); roughness_3 = roughness_2; NoV_1 = NoV; NoL_1 = NoL; let _e46 = roughness_3; let _e47 = roughness_3; a2_ = (_e46 * _e47); let _e50 = NoL_1; let _e51 = NoV_1; let _e52 = a2_; let _e53 = NoV_1; let _e56 = NoV_1; let _e58 = a2_; _ = (((_e51 - (_e52 * _e53)) * _e56) + _e58); let _e60 = NoV_1; let _e61 = a2_; let _e62 = NoV_1; let _e65 = NoV_1; let _e67 = a2_; lambdaV = (_e50 * sqrt((((_e60 - (_e61 * _e62)) * _e65) + _e67))); let _e72 = NoV_1; let _e73 = NoL_1; let _e74 = a2_; let _e75 = NoL_1; let _e78 = NoL_1; let _e80 = a2_; _ = (((_e73 - (_e74 * _e75)) * _e78) + _e80); let _e82 = NoL_1; let _e83 = a2_; let _e84 = NoL_1; let _e87 = NoL_1; let _e89 = a2_; lambdaL = (_e72 * sqrt((((_e82 - (_e83 * _e84)) * _e87) + _e89))); let _e95 = lambdaV; let _e96 = lambdaL; v = (0.5 / (_e95 + _e96)); let _e100 = v; return _e100; } fn F_Schlick(f0_: vec3, f90_: f32, VoH: f32) -> vec3 { var f90_1: f32; var VoH_1: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); f90_1 = f90_; VoH_1 = VoH; let _e45 = f90_1; let _e49 = VoH_1; _ = (1.0 - _e49); let _e52 = VoH_1; let _e54 = pow5_((1.0 - _e52)); return (f0_ + ((vec3(_e45) - f0_) * _e54)); } fn F_Schlick_1(f0_1: f32, f90_2: f32, VoH_2: f32) -> f32 { var f0_2: f32; var f90_3: f32; var VoH_3: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); f0_2 = f0_1; f90_3 = f90_2; VoH_3 = VoH_2; let _e46 = f0_2; let _e47 = f90_3; let _e48 = f0_2; let _e51 = VoH_3; _ = (1.0 - _e51); let _e54 = VoH_3; let _e56 = pow5_((1.0 - _e54)); return (_e46 + ((_e47 - _e48) * _e56)); } fn fresnel(f0_3: vec3, LoH: f32) -> vec3 { var f0_4: vec3; var LoH_1: f32; var f90_4: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); f0_4 = f0_3; LoH_1 = LoH; _ = f0_4; _ = vec3((50.0 * 0.33000001311302185)); let _e49 = f0_4; _ = dot(_e49, vec3((50.0 * 0.33000001311302185))); _ = f0_4; _ = vec3((50.0 * 0.33000001311302185)); let _e62 = f0_4; f90_4 = clamp(dot(_e62, vec3((50.0 * 0.33000001311302185))), 0.0, 1.0); _ = f0_4; _ = f90_4; _ = LoH_1; let _e75 = f0_4; let _e76 = f90_4; let _e77 = LoH_1; let _e78 = F_Schlick(_e75, _e76, _e77); return _e78; } fn specular(f0_5: vec3, roughness_4: f32, h_1: vec3, NoV_2: f32, NoL_2: f32, NoH_2: f32, LoH_2: f32, specularIntensity: f32) -> vec3 { var f0_6: vec3; var roughness_5: f32; var NoV_3: f32; var NoL_3: f32; var NoH_3: f32; var LoH_3: f32; var specularIntensity_1: f32; var D: f32; var V: f32; var F: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); f0_6 = f0_5; roughness_5 = roughness_4; NoV_3 = NoV_2; NoL_3 = NoL_2; NoH_3 = NoH_2; LoH_3 = LoH_2; specularIntensity_1 = specularIntensity; _ = roughness_5; _ = NoH_3; let _e57 = roughness_5; let _e58 = NoH_3; let _e59 = D_GGX(_e57, _e58, h_1); D = _e59; _ = roughness_5; _ = NoV_3; _ = NoL_3; let _e64 = roughness_5; let _e65 = NoV_3; let _e66 = NoL_3; let _e67 = V_SmithGGXCorrelated(_e64, _e65, _e66); V = _e67; _ = f0_6; _ = LoH_3; let _e71 = f0_6; let _e72 = LoH_3; let _e73 = fresnel(_e71, _e72); F = _e73; let _e75 = specularIntensity_1; let _e76 = D; let _e78 = V; let _e80 = F; return (((_e75 * _e76) * _e78) * _e80); } fn Fd_Burley(roughness_6: f32, NoV_4: f32, NoL_4: f32, LoH_4: f32) -> f32 { var roughness_7: f32; var NoV_5: f32; var NoL_5: f32; var LoH_5: f32; var f90_5: f32; var lightScatter: f32; var viewScatter: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); roughness_7 = roughness_6; NoV_5 = NoV_4; NoL_5 = NoL_4; LoH_5 = LoH_4; let _e50 = roughness_7; let _e52 = LoH_5; let _e54 = LoH_5; f90_5 = (0.5 + (((2.0 * _e50) * _e52) * _e54)); _ = f90_5; _ = NoL_5; let _e62 = f90_5; let _e63 = NoL_5; let _e64 = F_Schlick_1(1.0, _e62, _e63); lightScatter = _e64; _ = f90_5; _ = NoV_5; let _e70 = f90_5; let _e71 = NoV_5; let _e72 = F_Schlick_1(1.0, _e70, _e71); viewScatter = _e72; let _e74 = lightScatter; let _e75 = viewScatter; return ((_e74 * _e75) * (1.0 / 3.1415927410125732)); } fn EnvBRDFApprox(f0_7: vec3, perceptual_roughness: f32, NoV_6: f32) -> vec3 { var f0_8: vec3; var perceptual_roughness_1: f32; var NoV_7: f32; var c0_: vec4; var c1_: vec4; var r: vec4; var a004_: f32; var AB: vec2; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); f0_8 = f0_7; perceptual_roughness_1 = perceptual_roughness; NoV_7 = NoV_6; c0_ = vec4(-(1.0), -(0.027499999850988388), -(0.5720000267028809), 0.02199999988079071); c1_ = vec4(1.0, 0.042500000447034836, 1.0399999618530273, -(0.03999999910593033)); let _e62 = perceptual_roughness_1; let _e64 = c0_; let _e66 = c1_; r = ((vec4(_e62) * _e64) + _e66); let _e69 = r; let _e71 = r; _ = (_e69.x * _e71.x); let _e76 = NoV_7; _ = (-(9.279999732971191) * _e76); let _e80 = NoV_7; _ = exp2((-(9.279999732971191) * _e80)); let _e83 = r; let _e85 = r; let _e90 = NoV_7; _ = (-(9.279999732971191) * _e90); let _e94 = NoV_7; let _e98 = r; let _e101 = r; a004_ = ((min((_e83.x * _e85.x), exp2((-(9.279999732971191) * _e94))) * _e98.x) + _e101.y); let _e109 = a004_; let _e112 = r; AB = ((vec2(-(1.0399999618530273), 1.0399999618530273) * vec2(_e109)) + _e112.zw); let _e116 = f0_8; let _e117 = AB; let _e121 = AB; return ((_e116 * vec3(_e117.x)) + vec3(_e121.y)); } fn perceptualRoughnessToRoughness(perceptualRoughness: f32) -> f32 { var perceptualRoughness_1: f32; var clampedPerceptualRoughness: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); perceptualRoughness_1 = perceptualRoughness; _ = perceptualRoughness_1; let _e45 = perceptualRoughness_1; clampedPerceptualRoughness = clamp(_e45, 0.08900000154972076, 1.0); let _e50 = clampedPerceptualRoughness; let _e51 = clampedPerceptualRoughness; return (_e50 * _e51); } fn reinhard(color: vec3) -> vec3 { var color_1: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); color_1 = color; let _e42 = color_1; let _e45 = color_1; return (_e42 / (vec3(1.0) + _e45)); } fn reinhard_extended(color_2: vec3, max_white: f32) -> vec3 { var color_3: vec3; var max_white_1: f32; var numerator: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); color_3 = color_2; max_white_1 = max_white; let _e44 = color_3; let _e47 = color_3; let _e48 = max_white_1; let _e49 = max_white_1; numerator = (_e44 * (vec3(1.0) + (_e47 / vec3((_e48 * _e49))))); let _e56 = numerator; let _e59 = color_3; return (_e56 / (vec3(1.0) + _e59)); } fn luminance(v_1: vec3) -> f32 { var v_2: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); v_2 = v_1; _ = v_2; _ = vec3(0.2125999927520752, 0.7152000069618225, 0.0722000002861023); let _e47 = v_2; return dot(_e47, vec3(0.2125999927520752, 0.7152000069618225, 0.0722000002861023)); } fn change_luminance(c_in: vec3, l_out: f32) -> vec3 { var c_in_1: vec3; var l_out_1: f32; var l_in: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); c_in_1 = c_in; l_out_1 = l_out; _ = c_in_1; let _e45 = c_in_1; let _e46 = luminance(_e45); l_in = _e46; let _e48 = c_in_1; let _e49 = l_out_1; let _e50 = l_in; return (_e48 * (_e49 / _e50)); } fn reinhard_luminance(color_4: vec3) -> vec3 { var color_5: vec3; var l_old: f32; var l_new: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); color_5 = color_4; _ = color_5; let _e43 = color_5; let _e44 = luminance(_e43); l_old = _e44; let _e46 = l_old; let _e48 = l_old; l_new = (_e46 / (1.0 + _e48)); _ = color_5; _ = l_new; let _e54 = color_5; let _e55 = l_new; let _e56 = change_luminance(_e54, _e55); return _e56; } fn reinhard_extended_luminance(color_6: vec3, max_white_l: f32) -> vec3 { var color_7: vec3; var max_white_l_1: f32; var l_old_1: f32; var numerator_1: f32; var l_new_1: f32; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); color_7 = color_6; max_white_l_1 = max_white_l; _ = color_7; let _e45 = color_7; let _e46 = luminance(_e45); l_old_1 = _e46; let _e48 = l_old_1; let _e50 = l_old_1; let _e51 = max_white_l_1; let _e52 = max_white_l_1; numerator_1 = (_e48 * (1.0 + (_e50 / (_e51 * _e52)))); let _e58 = numerator_1; let _e60 = l_old_1; l_new_1 = (_e58 / (1.0 + _e60)); _ = color_7; _ = l_new_1; let _e66 = color_7; let _e67 = l_new_1; let _e68 = change_luminance(_e66, _e67); return _e68; } fn point_light(light: PointLight, roughness_8: f32, NdotV: f32, N: vec3, V_1: vec3, R: vec3, F0_: vec3, diffuseColor: vec3) -> vec3 { var light_1: PointLight; var roughness_9: f32; var NdotV_1: f32; var N_1: vec3; var V_2: vec3; var R_1: vec3; var F0_1: vec3; var diffuseColor_1: vec3; var light_to_frag: vec3; var distance_square: f32; var rangeAttenuation: f32; var a_1: f32; var radius: f32; var centerToRay: vec3; var closestPoint: vec3; var LspecLengthInverse: f32; var normalizationFactor: f32; var specularIntensity_2: f32; var L: vec3; var H: vec3; var NoL_6: f32; var NoH_4: f32; var LoH_6: f32; var specular_1: vec3; var diffuse: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); light_1 = light; roughness_9 = roughness_8; NdotV_1 = NdotV; N_1 = N; V_2 = V_1; R_1 = R; F0_1 = F0_; diffuseColor_1 = diffuseColor; let _e57 = light_1.pos; let _e59 = v_WorldPosition_1; light_to_frag = (_e57.xyz - _e59.xyz); _ = light_to_frag; _ = light_to_frag; let _e65 = light_to_frag; let _e66 = light_to_frag; distance_square = dot(_e65, _e66); _ = distance_square; let _e71 = light_1.lightParams; _ = _e71.x; let _e73 = distance_square; let _e75 = light_1.lightParams; let _e77 = getDistanceAttenuation(_e73, _e75.x); rangeAttenuation = _e77; let _e79 = roughness_9; a_1 = _e79; let _e82 = light_1.lightParams; radius = _e82.y; _ = light_to_frag; _ = R_1; let _e87 = light_to_frag; let _e88 = R_1; let _e90 = R_1; let _e92 = light_to_frag; centerToRay = ((dot(_e87, _e88) * _e90) - _e92); let _e95 = light_to_frag; let _e96 = centerToRay; let _e97 = radius; _ = centerToRay; _ = centerToRay; let _e100 = centerToRay; let _e101 = centerToRay; _ = dot(_e100, _e101); _ = centerToRay; _ = centerToRay; let _e105 = centerToRay; let _e106 = centerToRay; _ = (_e97 * inverseSqrt(dot(_e105, _e106))); let _e112 = radius; _ = centerToRay; _ = centerToRay; let _e115 = centerToRay; let _e116 = centerToRay; _ = dot(_e115, _e116); _ = centerToRay; _ = centerToRay; let _e120 = centerToRay; let _e121 = centerToRay; closestPoint = (_e95 + (_e96 * clamp((_e112 * inverseSqrt(dot(_e120, _e121))), 0.0, 1.0))); _ = closestPoint; _ = closestPoint; let _e133 = closestPoint; let _e134 = closestPoint; _ = dot(_e133, _e134); _ = closestPoint; _ = closestPoint; let _e138 = closestPoint; let _e139 = closestPoint; LspecLengthInverse = inverseSqrt(dot(_e138, _e139)); let _e143 = a_1; let _e144 = a_1; let _e145 = radius; let _e148 = LspecLengthInverse; _ = (_e144 + ((_e145 * 0.5) * _e148)); let _e153 = a_1; let _e154 = radius; let _e157 = LspecLengthInverse; normalizationFactor = (_e143 / clamp((_e153 + ((_e154 * 0.5) * _e157)), 0.0, 1.0)); let _e165 = normalizationFactor; let _e166 = normalizationFactor; specularIntensity_2 = (_e165 * _e166); let _e169 = closestPoint; let _e170 = LspecLengthInverse; L = (_e169 * _e170); let _e173 = L; let _e174 = V_2; _ = (_e173 + _e174); let _e176 = L; let _e177 = V_2; H = normalize((_e176 + _e177)); _ = N_1; _ = L; let _e183 = N_1; let _e184 = L; _ = dot(_e183, _e184); _ = N_1; _ = L; let _e190 = N_1; let _e191 = L; NoL_6 = clamp(dot(_e190, _e191), 0.0, 1.0); _ = N_1; _ = H; let _e199 = N_1; let _e200 = H; _ = dot(_e199, _e200); _ = N_1; _ = H; let _e206 = N_1; let _e207 = H; NoH_4 = clamp(dot(_e206, _e207), 0.0, 1.0); _ = L; _ = H; let _e215 = L; let _e216 = H; _ = dot(_e215, _e216); _ = L; _ = H; let _e222 = L; let _e223 = H; LoH_6 = clamp(dot(_e222, _e223), 0.0, 1.0); _ = F0_1; _ = roughness_9; _ = H; _ = NdotV_1; _ = NoL_6; _ = NoH_4; _ = LoH_6; _ = specularIntensity_2; let _e237 = F0_1; let _e238 = roughness_9; let _e239 = H; let _e240 = NdotV_1; let _e241 = NoL_6; let _e242 = NoH_4; let _e243 = LoH_6; let _e244 = specularIntensity_2; let _e245 = specular(_e237, _e238, _e239, _e240, _e241, _e242, _e243, _e244); specular_1 = _e245; _ = light_to_frag; let _e248 = light_to_frag; L = normalize(_e248); let _e250 = L; let _e251 = V_2; _ = (_e250 + _e251); let _e253 = L; let _e254 = V_2; H = normalize((_e253 + _e254)); _ = N_1; _ = L; let _e259 = N_1; let _e260 = L; _ = dot(_e259, _e260); _ = N_1; _ = L; let _e266 = N_1; let _e267 = L; NoL_6 = clamp(dot(_e266, _e267), 0.0, 1.0); _ = N_1; _ = H; let _e274 = N_1; let _e275 = H; _ = dot(_e274, _e275); _ = N_1; _ = H; let _e281 = N_1; let _e282 = H; NoH_4 = clamp(dot(_e281, _e282), 0.0, 1.0); _ = L; _ = H; let _e289 = L; let _e290 = H; _ = dot(_e289, _e290); _ = L; _ = H; let _e296 = L; let _e297 = H; LoH_6 = clamp(dot(_e296, _e297), 0.0, 1.0); let _e302 = diffuseColor_1; _ = roughness_9; _ = NdotV_1; _ = NoL_6; _ = LoH_6; let _e307 = roughness_9; let _e308 = NdotV_1; let _e309 = NoL_6; let _e310 = LoH_6; let _e311 = Fd_Burley(_e307, _e308, _e309, _e310); diffuse = (_e302 * _e311); let _e314 = diffuse; let _e315 = specular_1; let _e318 = light_1.color; let _e321 = rangeAttenuation; let _e322 = NoL_6; return (((_e314 + _e315) * _e318.xyz) * (_e321 * _e322)); } fn dir_light(light_2: DirectionalLight, roughness_10: f32, NdotV_2: f32, normal: vec3, view: vec3, R_2: vec3, F0_2: vec3, diffuseColor_2: vec3) -> vec3 { var light_3: DirectionalLight; var roughness_11: f32; var NdotV_3: f32; var normal_1: vec3; var view_1: vec3; var R_3: vec3; var F0_3: vec3; var diffuseColor_3: vec3; var incident_light: vec3; var half_vector: vec3; var NoL_7: f32; var NoH_5: f32; var LoH_7: f32; var diffuse_1: vec3; var specularIntensity_3: f32; var specular_2: vec3; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); light_3 = light_2; roughness_11 = roughness_10; NdotV_3 = NdotV_2; normal_1 = normal; view_1 = view; R_3 = R_2; F0_3 = F0_2; diffuseColor_3 = diffuseColor_2; let _e57 = light_3.direction; incident_light = _e57.xyz; let _e60 = incident_light; let _e61 = view_1; _ = (_e60 + _e61); let _e63 = incident_light; let _e64 = view_1; half_vector = normalize((_e63 + _e64)); _ = normal_1; _ = incident_light; let _e70 = normal_1; let _e71 = incident_light; _ = dot(_e70, _e71); _ = normal_1; _ = incident_light; let _e77 = normal_1; let _e78 = incident_light; NoL_7 = clamp(dot(_e77, _e78), 0.0, 1.0); _ = normal_1; _ = half_vector; let _e86 = normal_1; let _e87 = half_vector; _ = dot(_e86, _e87); _ = normal_1; _ = half_vector; let _e93 = normal_1; let _e94 = half_vector; NoH_5 = clamp(dot(_e93, _e94), 0.0, 1.0); _ = incident_light; _ = half_vector; let _e102 = incident_light; let _e103 = half_vector; _ = dot(_e102, _e103); _ = incident_light; _ = half_vector; let _e109 = incident_light; let _e110 = half_vector; LoH_7 = clamp(dot(_e109, _e110), 0.0, 1.0); let _e116 = diffuseColor_3; _ = roughness_11; _ = NdotV_3; _ = NoL_7; _ = LoH_7; let _e121 = roughness_11; let _e122 = NdotV_3; let _e123 = NoL_7; let _e124 = LoH_7; let _e125 = Fd_Burley(_e121, _e122, _e123, _e124); diffuse_1 = (_e116 * _e125); specularIntensity_3 = 1.0; _ = F0_3; _ = roughness_11; _ = half_vector; _ = NdotV_3; _ = NoL_7; _ = NoH_5; _ = LoH_7; _ = specularIntensity_3; let _e138 = F0_3; let _e139 = roughness_11; let _e140 = half_vector; let _e141 = NdotV_3; let _e142 = NoL_7; let _e143 = NoH_5; let _e144 = LoH_7; let _e145 = specularIntensity_3; let _e146 = specular(_e138, _e139, _e140, _e141, _e142, _e143, _e144, _e145); specular_2 = _e146; let _e148 = specular_2; let _e149 = diffuse_1; let _e152 = light_3.color; let _e155 = NoL_7; return (((_e148 + _e149) * _e152.xyz) * _e155); } fn main_1() { var output_color: vec4; var metallic_roughness: vec4; var metallic: f32; var perceptual_roughness_2: f32; var roughness_12: f32; var N_2: vec3; var T: vec3; var B: vec3; var local: vec3; var local_1: vec3; var local_2: vec3; var TBN: mat3x3; var occlusion: f32; var emissive: vec4; var V_3: vec3; var NdotV_4: f32; var F0_4: vec3; var diffuseColor_4: vec3; var R_4: vec3; var light_accum: vec3; var i: i32; var i_1: i32; var diffuse_ambient: vec3; var specular_ambient: vec3; _ = (&global.ViewProj); let _e40 = global_3.base_color; output_color = _e40; let _e42 = output_color; _ = v_Uv_1; let _e44 = v_Uv_1; let _e45 = textureSample(StandardMaterial_base_color_texture, StandardMaterial_base_color_texture_sampler, _e44); output_color = (_e42 * _e45); _ = v_Uv_1; let _e48 = v_Uv_1; let _e49 = textureSample(StandardMaterial_metallic_roughness_texture, StandardMaterial_metallic_roughness_texture_sampler, _e48); metallic_roughness = _e49; let _e51 = global_5.metallic; let _e52 = metallic_roughness; metallic = (_e51 * _e52.z); let _e56 = global_4.perceptual_roughness; let _e57 = metallic_roughness; perceptual_roughness_2 = (_e56 * _e57.y); _ = perceptual_roughness_2; let _e62 = perceptual_roughness_2; let _e63 = perceptualRoughnessToRoughness(_e62); roughness_12 = _e63; _ = v_WorldNormal_1; let _e66 = v_WorldNormal_1; N_2 = normalize(_e66); let _e69 = v_WorldTangent_1; _ = _e69.xyz; let _e71 = v_WorldTangent_1; T = normalize(_e71.xyz); _ = N_2; _ = T; let _e77 = N_2; let _e78 = T; let _e80 = v_WorldTangent_1; B = (cross(_e77, _e78) * _e80.w); let _e85 = gl_FrontFacing; if _e85 { let _e86 = N_2; local = _e86; } else { let _e87 = N_2; local = -(_e87); } let _e90 = local; N_2 = _e90; let _e91 = gl_FrontFacing; if _e91 { let _e92 = T; local_1 = _e92; } else { let _e93 = T; local_1 = -(_e93); } let _e96 = local_1; T = _e96; let _e97 = gl_FrontFacing; if _e97 { let _e98 = B; local_2 = _e98; } else { let _e99 = B; local_2 = -(_e99); } let _e102 = local_2; B = _e102; let _e103 = T; let _e104 = B; let _e105 = N_2; TBN = mat3x3(vec3(_e103.x, _e103.y, _e103.z), vec3(_e104.x, _e104.y, _e104.z), vec3(_e105.x, _e105.y, _e105.z)); let _e120 = TBN; _ = v_Uv_1; let _e122 = v_Uv_1; let _e123 = textureSample(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler, _e122); _ = ((_e123.xyz * 2.0) - vec3(1.0)); _ = v_Uv_1; let _e131 = v_Uv_1; let _e132 = textureSample(StandardMaterial_normal_map, StandardMaterial_normal_map_sampler, _e131); N_2 = (_e120 * normalize(((_e132.xyz * 2.0) - vec3(1.0)))); _ = v_Uv_1; let _e142 = v_Uv_1; let _e143 = textureSample(StandardMaterial_occlusion_texture, StandardMaterial_occlusion_texture_sampler, _e142); occlusion = _e143.x; let _e146 = global_7.emissive; emissive = _e146; let _e148 = emissive; _ = _e148.xyz; let _e150 = emissive; _ = v_Uv_1; let _e153 = v_Uv_1; let _e154 = textureSample(StandardMaterial_emissive_texture, StandardMaterial_emissive_texture_sampler, _e153); let _e156 = (_e150.xyz * _e154.xyz); emissive.x = _e156.x; emissive.y = _e156.y; emissive.z = _e156.z; let _e163 = global_1.CameraPos; let _e165 = v_WorldPosition_1; _ = (_e163.xyz - _e165.xyz); let _e168 = global_1.CameraPos; let _e170 = v_WorldPosition_1; V_3 = normalize((_e168.xyz - _e170.xyz)); _ = N_2; _ = V_3; let _e177 = N_2; let _e178 = V_3; _ = dot(_e177, _e178); _ = N_2; _ = V_3; let _e183 = N_2; let _e184 = V_3; NdotV_4 = max(dot(_e183, _e184), 0.0010000000474974513); let _e190 = global_6.reflectance; let _e192 = global_6.reflectance; let _e195 = metallic; let _e199 = output_color; let _e201 = metallic; F0_4 = (vec3((((0.1599999964237213 * _e190) * _e192) * (1.0 - _e195))) + (_e199.xyz * vec3(_e201))); let _e206 = output_color; let _e209 = metallic; diffuseColor_4 = (_e206.xyz * vec3((1.0 - _e209))); let _e214 = V_3; _ = -(_e214); _ = N_2; let _e217 = V_3; let _e219 = N_2; R_4 = reflect(-(_e217), _e219); light_accum = vec3(0.0); i = 0; loop { let _e227 = i; let _e228 = global_2.NumLights; let _e232 = i; if !(((_e227 < i32(_e228.x)) && (_e232 < 10))) { break; } { let _e239 = light_accum; let _e240 = i; _ = global_2.PointLights[_e240]; _ = roughness_12; _ = NdotV_4; _ = N_2; _ = V_3; _ = R_4; _ = F0_4; _ = diffuseColor_4; let _e250 = i; let _e252 = global_2.PointLights[_e250]; let _e253 = roughness_12; let _e254 = NdotV_4; let _e255 = N_2; let _e256 = V_3; let _e257 = R_4; let _e258 = F0_4; let _e259 = diffuseColor_4; let _e260 = point_light(_e252, _e253, _e254, _e255, _e256, _e257, _e258, _e259); light_accum = (_e239 + _e260); } continuing { let _e236 = i; i = (_e236 + 1); } } i_1 = 0; loop { let _e264 = i_1; let _e265 = global_2.NumLights; let _e269 = i_1; if !(((_e264 < i32(_e265.y)) && (_e269 < 1))) { break; } { let _e276 = light_accum; let _e277 = i_1; _ = global_2.DirectionalLights[_e277]; _ = roughness_12; _ = NdotV_4; _ = N_2; _ = V_3; _ = R_4; _ = F0_4; _ = diffuseColor_4; let _e287 = i_1; let _e289 = global_2.DirectionalLights[_e287]; let _e290 = roughness_12; let _e291 = NdotV_4; let _e292 = N_2; let _e293 = V_3; let _e294 = R_4; let _e295 = F0_4; let _e296 = diffuseColor_4; let _e297 = dir_light(_e289, _e290, _e291, _e292, _e293, _e294, _e295, _e296); light_accum = (_e276 + _e297); } continuing { let _e273 = i_1; i_1 = (_e273 + 1); } } _ = diffuseColor_4; _ = NdotV_4; let _e302 = diffuseColor_4; let _e304 = NdotV_4; let _e305 = EnvBRDFApprox(_e302, 1.0, _e304); diffuse_ambient = _e305; _ = F0_4; _ = perceptual_roughness_2; _ = NdotV_4; let _e310 = F0_4; let _e311 = perceptual_roughness_2; let _e312 = NdotV_4; let _e313 = EnvBRDFApprox(_e310, _e311, _e312); specular_ambient = _e313; let _e315 = output_color; _ = _e315.xyz; let _e317 = light_accum; output_color.x = _e317.x; output_color.y = _e317.y; output_color.z = _e317.z; let _e324 = output_color; _ = _e324.xyz; let _e326 = output_color; let _e328 = diffuse_ambient; let _e329 = specular_ambient; let _e331 = global_2.AmbientColor; let _e334 = occlusion; let _e336 = (_e326.xyz + (((_e328 + _e329) * _e331.xyz) * _e334)); output_color.x = _e336.x; output_color.y = _e336.y; output_color.z = _e336.z; let _e343 = output_color; _ = _e343.xyz; let _e345 = output_color; let _e347 = emissive; let _e349 = output_color; let _e352 = (_e345.xyz + (_e347.xyz * _e349.w)); output_color.x = _e352.x; output_color.y = _e352.y; output_color.z = _e352.z; let _e359 = output_color; _ = _e359.xyz; let _e361 = output_color; _ = _e361.xyz; let _e363 = output_color; let _e365 = reinhard_luminance(_e363.xyz); output_color.x = _e365.x; output_color.y = _e365.y; output_color.z = _e365.z; let _e372 = output_color; o_Target = _e372; return; } @fragment fn main(@location(0) v_WorldPosition: vec3, @location(1) v_WorldNormal: vec3, @location(2) v_Uv: vec2, @location(3) v_WorldTangent: vec4, @builtin(front_facing) param: bool) -> FragmentOutput { v_WorldPosition_1 = v_WorldPosition; v_WorldNormal_1 = v_WorldNormal; v_Uv_1 = v_Uv; v_WorldTangent_1 = v_WorldTangent; gl_FrontFacing = param; _ = (&global.ViewProj); _ = (&global_1.CameraPos); _ = (&global_2.AmbientColor); _ = (&global_2.NumLights); _ = (&global_2.PointLights); _ = (&global_2.DirectionalLights); _ = (&global_3.base_color); _ = (&global_4.perceptual_roughness); _ = (&global_5.metallic); _ = (&global_6.reflectance); _ = (&global_7.emissive); main_1(); let _e72 = o_Target; return FragmentOutput(_e72); } ================================================ FILE: lib/naga/tests/out/wgsl/bevy-pbr-vert.wgsl ================================================ struct CameraViewProj { ViewProj: mat4x4, } struct Transform { Model: mat4x4, } struct VertexOutput { @location(0) v_WorldPosition: vec3, @location(1) v_WorldNormal: vec3, @location(2) v_Uv: vec2, @location(3) v_WorldTangent: vec4, @builtin(position) member: vec4, } var Vertex_Position_1: vec3; var Vertex_Normal_1: vec3; var Vertex_Uv_1: vec2; var Vertex_Tangent_1: vec4; var v_WorldPosition: vec3; var v_WorldNormal: vec3; var v_Uv: vec2; @group(0) @binding(0) var global: CameraViewProj; var v_WorldTangent: vec4; @group(2) @binding(0) var global_1: Transform; var gl_Position: vec4; fn main_1() { var world_position: vec4; let _e12 = global_1.Model; let _e13 = Vertex_Position_1; world_position = (_e12 * vec4(_e13.x, _e13.y, _e13.z, 1.0)); let _e21 = world_position; v_WorldPosition = _e21.xyz; let _e23 = global_1.Model; let _e33 = Vertex_Normal_1; v_WorldNormal = (mat3x3(_e23[0].xyz, _e23[1].xyz, _e23[2].xyz) * _e33); let _e35 = Vertex_Uv_1; v_Uv = _e35; let _e36 = global_1.Model; let _e46 = Vertex_Tangent_1; let _e48 = (mat3x3(_e36[0].xyz, _e36[1].xyz, _e36[2].xyz) * _e46.xyz); let _e49 = Vertex_Tangent_1; v_WorldTangent = vec4(_e48.x, _e48.y, _e48.z, _e49.w); let _e56 = global.ViewProj; let _e57 = world_position; gl_Position = (_e56 * _e57); return; } @vertex fn main(@location(0) Vertex_Position: vec3, @location(1) Vertex_Normal: vec3, @location(2) Vertex_Uv: vec2, @location(3) Vertex_Tangent: vec4) -> VertexOutput { Vertex_Position_1 = Vertex_Position; Vertex_Normal_1 = Vertex_Normal; Vertex_Uv_1 = Vertex_Uv; Vertex_Tangent_1 = Vertex_Tangent; _ = (&global.ViewProj); main_1(); let _e29 = v_WorldPosition; let _e31 = v_WorldNormal; let _e33 = v_Uv; let _e35 = v_WorldTangent; let _e37 = gl_Position; return VertexOutput(_e29, _e31, _e33, _e35, _e37); } ================================================ FILE: lib/naga/tests/out/wgsl/binding-arrays.wgsl ================================================ struct UniformIndex { index: u32, } struct FragmentIn { @location(0) index: u32, } @group(0) @binding(0) var texture_array_unbounded: binding_array>; @group(0) @binding(1) var texture_array_bounded: binding_array,5>; @group(0) @binding(2) var texture_array_2darray: binding_array,5>; @group(0) @binding(3) var texture_array_multisampled: binding_array,5>; @group(0) @binding(4) var texture_array_depth: binding_array; @group(0) @binding(5) var texture_array_storage: binding_array,5>; @group(0) @binding(6) var samp: binding_array; @group(0) @binding(7) var samp_comp: binding_array; @group(0) @binding(8) var uni: UniformIndex; @fragment fn main(fragment_in: FragmentIn) -> @location(0) vec4 { var i1_: i32 = 0; var i2_: vec2; var v1_: f32 = 0.0; var v4_: vec4; let uniform_index = uni.index; let non_uniform_index = fragment_in.index; i2_ = vec2(0); v4_ = vec4(0.0); let uv = vec2(0.0); let pix = vec2(0); let _e27 = i2_; let _e30 = textureDimensions(texture_array_unbounded[0]); i2_ = (_e27 + _e30); let _e32 = i2_; let _e34 = textureDimensions(texture_array_unbounded[uniform_index]); i2_ = (_e32 + _e34); let _e36 = i2_; let _e38 = textureDimensions(texture_array_unbounded[non_uniform_index]); i2_ = (_e36 + _e38); let _e40 = v4_; let _e45 = textureGather(0, texture_array_bounded[0], samp[0], uv); v4_ = (_e40 + _e45); let _e47 = v4_; let _e50 = textureGather(0, texture_array_bounded[uniform_index], samp[uniform_index], uv); v4_ = (_e47 + _e50); let _e52 = v4_; let _e55 = textureGather(0, texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv); v4_ = (_e52 + _e55); let _e57 = v4_; let _e63 = textureGatherCompare(texture_array_depth[0], samp_comp[0], uv, 0.0); v4_ = (_e57 + _e63); let _e65 = v4_; let _e69 = textureGatherCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v4_ = (_e65 + _e69); let _e71 = v4_; let _e75 = textureGatherCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v4_ = (_e71 + _e75); let _e77 = v4_; let _e81 = textureLoad(texture_array_unbounded[0], pix, 0); v4_ = (_e77 + _e81); let _e83 = v4_; let _e86 = textureLoad(texture_array_unbounded[uniform_index], pix, 0); v4_ = (_e83 + _e86); let _e88 = v4_; let _e91 = textureLoad(texture_array_unbounded[non_uniform_index], pix, 0); v4_ = (_e88 + _e91); let _e93 = i1_; let _e96 = textureNumLayers(texture_array_2darray[0]); i1_ = (_e93 + _e96); let _e98 = i1_; let _e100 = textureNumLayers(texture_array_2darray[uniform_index]); i1_ = (_e98 + _e100); let _e102 = i1_; let _e104 = textureNumLayers(texture_array_2darray[non_uniform_index]); i1_ = (_e102 + _e104); let _e106 = i1_; let _e109 = textureNumLevels(texture_array_bounded[0]); i1_ = (_e106 + _e109); let _e111 = i1_; let _e113 = textureNumLevels(texture_array_bounded[uniform_index]); i1_ = (_e111 + _e113); let _e115 = i1_; let _e117 = textureNumLevels(texture_array_bounded[non_uniform_index]); i1_ = (_e115 + _e117); let _e119 = i1_; let _e122 = textureNumSamples(texture_array_multisampled[0]); i1_ = (_e119 + _e122); let _e124 = i1_; let _e126 = textureNumSamples(texture_array_multisampled[uniform_index]); i1_ = (_e124 + _e126); let _e128 = i1_; let _e130 = textureNumSamples(texture_array_multisampled[non_uniform_index]); i1_ = (_e128 + _e130); let _e132 = v4_; let _e137 = textureSample(texture_array_bounded[0], samp[0], uv); v4_ = (_e132 + _e137); let _e139 = v4_; let _e142 = textureSample(texture_array_bounded[uniform_index], samp[uniform_index], uv); v4_ = (_e139 + _e142); let _e144 = v4_; let _e147 = textureSample(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv); v4_ = (_e144 + _e147); let _e149 = v4_; let _e155 = textureSampleBias(texture_array_bounded[0], samp[0], uv, 0.0); v4_ = (_e149 + _e155); let _e157 = v4_; let _e161 = textureSampleBias(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0); v4_ = (_e157 + _e161); let _e163 = v4_; let _e167 = textureSampleBias(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0); v4_ = (_e163 + _e167); let _e169 = v1_; let _e175 = textureSampleCompare(texture_array_depth[0], samp_comp[0], uv, 0.0); v1_ = (_e169 + _e175); let _e177 = v1_; let _e181 = textureSampleCompare(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v1_ = (_e177 + _e181); let _e183 = v1_; let _e187 = textureSampleCompare(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v1_ = (_e183 + _e187); let _e189 = v1_; let _e195 = textureSampleCompareLevel(texture_array_depth[0], samp_comp[0], uv, 0.0); v1_ = (_e189 + _e195); let _e197 = v1_; let _e201 = textureSampleCompareLevel(texture_array_depth[uniform_index], samp_comp[uniform_index], uv, 0.0); v1_ = (_e197 + _e201); let _e203 = v1_; let _e207 = textureSampleCompareLevel(texture_array_depth[non_uniform_index], samp_comp[non_uniform_index], uv, 0.0); v1_ = (_e203 + _e207); let _e209 = v4_; let _e214 = textureSampleGrad(texture_array_bounded[0], samp[0], uv, uv, uv); v4_ = (_e209 + _e214); let _e216 = v4_; let _e219 = textureSampleGrad(texture_array_bounded[uniform_index], samp[uniform_index], uv, uv, uv); v4_ = (_e216 + _e219); let _e221 = v4_; let _e224 = textureSampleGrad(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, uv, uv); v4_ = (_e221 + _e224); let _e226 = v4_; let _e232 = textureSampleLevel(texture_array_bounded[0], samp[0], uv, 0.0); v4_ = (_e226 + _e232); let _e234 = v4_; let _e238 = textureSampleLevel(texture_array_bounded[uniform_index], samp[uniform_index], uv, 0.0); v4_ = (_e234 + _e238); let _e240 = v4_; let _e244 = textureSampleLevel(texture_array_bounded[non_uniform_index], samp[non_uniform_index], uv, 0.0); v4_ = (_e240 + _e244); let _e248 = v4_; textureStore(texture_array_storage[0], pix, _e248); let _e250 = v4_; textureStore(texture_array_storage[uniform_index], pix, _e250); let _e252 = v4_; textureStore(texture_array_storage[non_uniform_index], pix, _e252); let _e253 = i2_; let _e254 = i1_; let v2_ = vec2((_e253 + vec2(_e254))); let _e258 = v4_; let _e265 = v1_; return ((_e258 + vec4(v2_.x, v2_.y, v2_.x, v2_.y)) + vec4(_e265)); } ================================================ FILE: lib/naga/tests/out/wgsl/binop-frag.wgsl ================================================ var o_color: vec4; fn testBinOpVecFloat(a: vec4, b: f32) { var a1: vec4; var b1: f32; var v: vec4; a1 = a; b1 = b; let e5: vec4 = a1; v = (e5 * 2.0); let e8: vec4 = a1; v = (e8 / vec4(2.0)); let e12: vec4 = a1; v = (e12 + vec4(2.0)); let e16: vec4 = a1; v = (e16 - vec4(2.0)); return; } fn testBinOpFloatVec(a2: vec4, b2: f32) { var a3: vec4; var b3: f32; var v1: vec4; a3 = a2; b3 = b2; let e5: vec4 = a3; let e6: f32 = b3; v1 = (e5 * e6); let e8: vec4 = a3; let e9: f32 = b3; v1 = (e8 / vec4(e9)); let e12: vec4 = a3; let e13: f32 = b3; v1 = (e12 + vec4(e13)); let e16: vec4 = a3; let e17: f32 = b3; v1 = (e16 - vec4(e17)); return; } fn testBinOpIVecInt(a4: vec4, b4: i32) { var a5: vec4; var b5: i32; var v2: vec4; a5 = a4; b5 = b4; let e5: vec4 = a5; let e6: i32 = b5; v2 = (e5 * e6); let e8: vec4 = a5; let e9: i32 = b5; v2 = (e8 / vec4(e9)); let e12: vec4 = a5; let e13: i32 = b5; v2 = (e12 + vec4(e13)); let e16: vec4 = a5; let e17: i32 = b5; v2 = (e16 - vec4(e17)); let e20: vec4 = a5; let e21: i32 = b5; v2 = (e20 & vec4(e21)); let e24: vec4 = a5; let e25: i32 = b5; v2 = (e24 | vec4(e25)); let e28: vec4 = a5; let e29: i32 = b5; v2 = (e28 ^ vec4(e29)); let e32: vec4 = a5; let e33: i32 = b5; v2 = (e32 >> vec4(u32(e33))); let e37: vec4 = a5; let e38: i32 = b5; v2 = (e37 << vec4(u32(e38))); return; } fn testBinOpIntIVec(a6: i32, b6: vec4) { var a7: i32; var b7: vec4; var v3: vec4; a7 = a6; b7 = b6; let e5: i32 = a7; let e6: vec4 = b7; v3 = (e5 * e6); let e8: i32 = a7; let e9: vec4 = b7; v3 = (vec4(e8) + e9); let e12: i32 = a7; let e13: vec4 = b7; v3 = (vec4(e12) - e13); let e16: i32 = a7; let e17: vec4 = b7; v3 = (vec4(e16) & e17); let e20: i32 = a7; let e21: vec4 = b7; v3 = (vec4(e20) | e21); let e24: i32 = a7; let e25: vec4 = b7; v3 = (vec4(e24) ^ e25); return; } fn testBinOpUVecUint(a8: vec4, b8: u32) { var a9: vec4; var b9: u32; var v4: vec4; a9 = a8; b9 = b8; let e5: vec4 = a9; let e6: u32 = b9; v4 = (e5 * e6); let e8: vec4 = a9; let e9: u32 = b9; v4 = (e8 / vec4(e9)); let e12: vec4 = a9; let e13: u32 = b9; v4 = (e12 + vec4(e13)); let e16: vec4 = a9; let e17: u32 = b9; v4 = (e16 - vec4(e17)); let e20: vec4 = a9; let e21: u32 = b9; v4 = (e20 & vec4(e21)); let e24: vec4 = a9; let e25: u32 = b9; v4 = (e24 | vec4(e25)); let e28: vec4 = a9; let e29: u32 = b9; v4 = (e28 ^ vec4(e29)); let e32: vec4 = a9; let e33: u32 = b9; v4 = (e32 >> vec4(e33)); let e36: vec4 = a9; let e37: u32 = b9; v4 = (e36 << vec4(e37)); return; } fn testBinOpUintUVec(a10: u32, b10: vec4) { var a11: u32; var b11: vec4; var v5: vec4; a11 = a10; b11 = b10; let e5: u32 = a11; let e6: vec4 = b11; v5 = (e5 * e6); let e8: u32 = a11; let e9: vec4 = b11; v5 = (vec4(e8) + e9); let e12: u32 = a11; let e13: vec4 = b11; v5 = (vec4(e12) - e13); let e16: u32 = a11; let e17: vec4 = b11; v5 = (vec4(e16) & e17); let e20: u32 = a11; let e21: vec4 = b11; v5 = (vec4(e20) | e21); let e24: u32 = a11; let e25: vec4 = b11; v5 = (vec4(e24) ^ e25); return; } fn main1() { let e1: vec4 = o_color; let e4: vec4 = vec4(1.0); o_color.x = e4.x; o_color.y = e4.y; o_color.z = e4.z; o_color.w = e4.w; return; } @fragment fn main() { main1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/bitcast.wgsl ================================================ @compute @workgroup_size(1, 1, 1) fn main() { var i2_: vec2; var i3_: vec3; var i4_: vec4; var u2_: vec2; var u3_: vec3; var u4_: vec4; var f2_: vec2; var f3_: vec3; var f4_: vec4; i2_ = vec2(0); i3_ = vec3(0); i4_ = vec4(0); u2_ = vec2(0u); u3_ = vec3(0u); u4_ = vec4(0u); f2_ = vec2(0.0); f3_ = vec3(0.0); f4_ = vec4(0.0); let _e27 = i2_; u2_ = bitcast>(_e27); let _e29 = i3_; u3_ = bitcast>(_e29); let _e31 = i4_; u4_ = bitcast>(_e31); let _e33 = u2_; i2_ = bitcast>(_e33); let _e35 = u3_; i3_ = bitcast>(_e35); let _e37 = u4_; i4_ = bitcast>(_e37); let _e39 = i2_; f2_ = bitcast>(_e39); let _e41 = i3_; f3_ = bitcast>(_e41); let _e43 = i4_; f4_ = bitcast>(_e43); return; } ================================================ FILE: lib/naga/tests/out/wgsl/bits.wgsl ================================================ @compute @workgroup_size(1, 1, 1) fn main() { var i: i32 = 0; var i2_: vec2; var i3_: vec3; var i4_: vec4; var u: u32 = 0u; var u2_: vec2; var u3_: vec3; var u4_: vec4; var f2_: vec2; var f4_: vec4; i2_ = vec2(0); i3_ = vec3(0); i4_ = vec4(0); u2_ = vec2(0u); u3_ = vec3(0u); u4_ = vec4(0u); f2_ = vec2(0.0); f4_ = vec4(0.0); let _e28 = f4_; u = pack4x8snorm(_e28); let _e30 = f4_; u = pack4x8unorm(_e30); let _e32 = f2_; u = pack2x16snorm(_e32); let _e34 = f2_; u = pack2x16unorm(_e34); let _e36 = f2_; u = pack2x16float(_e36); let _e38 = u; f4_ = unpack4x8snorm(_e38); let _e40 = u; f4_ = unpack4x8unorm(_e40); let _e42 = u; f2_ = unpack2x16snorm(_e42); let _e44 = u; f2_ = unpack2x16unorm(_e44); let _e46 = u; f2_ = unpack2x16float(_e46); let _e48 = i; let _e49 = i; i = insertBits(_e48, _e49, 5u, 10u); let _e53 = i2_; let _e54 = i2_; i2_ = insertBits(_e53, _e54, 5u, 10u); let _e58 = i3_; let _e59 = i3_; i3_ = insertBits(_e58, _e59, 5u, 10u); let _e63 = i4_; let _e64 = i4_; i4_ = insertBits(_e63, _e64, 5u, 10u); let _e68 = u; let _e69 = u; u = insertBits(_e68, _e69, 5u, 10u); let _e73 = u2_; let _e74 = u2_; u2_ = insertBits(_e73, _e74, 5u, 10u); let _e78 = u3_; let _e79 = u3_; u3_ = insertBits(_e78, _e79, 5u, 10u); let _e83 = u4_; let _e84 = u4_; u4_ = insertBits(_e83, _e84, 5u, 10u); let _e88 = i; i = extractBits(_e88, 5u, 10u); let _e92 = i2_; i2_ = extractBits(_e92, 5u, 10u); let _e96 = i3_; i3_ = extractBits(_e96, 5u, 10u); let _e100 = i4_; i4_ = extractBits(_e100, 5u, 10u); let _e104 = u; u = extractBits(_e104, 5u, 10u); let _e108 = u2_; u2_ = extractBits(_e108, 5u, 10u); let _e112 = u3_; u3_ = extractBits(_e112, 5u, 10u); let _e116 = u4_; u4_ = extractBits(_e116, 5u, 10u); let _e120 = i; i = firstTrailingBit(_e120); let _e122 = u2_; u2_ = firstTrailingBit(_e122); let _e124 = i3_; i3_ = firstLeadingBit(_e124); let _e126 = u; u = firstLeadingBit(_e126); let _e128 = i; i = countOneBits(_e128); let _e130 = i2_; i2_ = countOneBits(_e130); let _e132 = i3_; i3_ = countOneBits(_e132); let _e134 = i4_; i4_ = countOneBits(_e134); let _e136 = u; u = countOneBits(_e136); let _e138 = u2_; u2_ = countOneBits(_e138); let _e140 = u3_; u3_ = countOneBits(_e140); let _e142 = u4_; u4_ = countOneBits(_e142); let _e144 = i; i = reverseBits(_e144); let _e146 = i2_; i2_ = reverseBits(_e146); let _e148 = i3_; i3_ = reverseBits(_e148); let _e150 = i4_; i4_ = reverseBits(_e150); let _e152 = u; u = reverseBits(_e152); let _e154 = u2_; u2_ = reverseBits(_e154); let _e156 = u3_; u3_ = reverseBits(_e156); let _e158 = u4_; u4_ = reverseBits(_e158); return; } ================================================ FILE: lib/naga/tests/out/wgsl/bits_glsl-frag.wgsl ================================================ fn main_1() { var i: i32; var i2_: vec2; var i3_: vec3; var i4_: vec4; var u: u32; var u2_: vec2; var u3_: vec3; var u4_: vec4; var f2_: vec2; var f4_: vec4; i = 0; i2_ = vec2(0); i3_ = vec3(0); i4_ = vec4(0); u = u32(0); u2_ = vec2(u32(0)); u3_ = vec3(u32(0)); u4_ = vec4(u32(0)); f2_ = vec2(0.0); f4_ = vec4(0.0); _ = f4_; let _e33 = f4_; u = pack4x8snorm(_e33); _ = f4_; let _e36 = f4_; u = pack4x8unorm(_e36); _ = f2_; let _e39 = f2_; u = pack2x16unorm(_e39); _ = f2_; let _e42 = f2_; u = pack2x16snorm(_e42); _ = f2_; let _e45 = f2_; u = pack2x16float(_e45); _ = u; let _e48 = u; f4_ = unpack4x8snorm(_e48); _ = u; let _e51 = u; f4_ = unpack4x8unorm(_e51); _ = u; let _e54 = u; f2_ = unpack2x16snorm(_e54); _ = u; let _e57 = u; f2_ = unpack2x16unorm(_e57); _ = u; let _e60 = u; f2_ = unpack2x16float(_e60); _ = i; _ = i; let _e66 = i; let _e67 = i; _ = u32(10); i = insertBits(_e66, _e67, u32(5), u32(10)); _ = i2_; _ = i2_; let _e77 = i2_; let _e78 = i2_; _ = u32(10); i2_ = insertBits(_e77, _e78, u32(5), u32(10)); _ = i3_; _ = i3_; let _e88 = i3_; let _e89 = i3_; _ = u32(10); i3_ = insertBits(_e88, _e89, u32(5), u32(10)); _ = i4_; _ = i4_; let _e99 = i4_; let _e100 = i4_; _ = u32(10); i4_ = insertBits(_e99, _e100, u32(5), u32(10)); _ = u; _ = u; let _e110 = u; let _e111 = u; _ = u32(10); u = insertBits(_e110, _e111, u32(5), u32(10)); _ = u2_; _ = u2_; let _e121 = u2_; let _e122 = u2_; _ = u32(10); u2_ = insertBits(_e121, _e122, u32(5), u32(10)); _ = u3_; _ = u3_; let _e132 = u3_; let _e133 = u3_; _ = u32(10); u3_ = insertBits(_e132, _e133, u32(5), u32(10)); _ = u4_; _ = u4_; let _e143 = u4_; let _e144 = u4_; _ = u32(10); u4_ = insertBits(_e143, _e144, u32(5), u32(10)); _ = i; let _e153 = i; i = extractBits(_e153, u32(5), u32(10)); _ = i2_; let _e162 = i2_; i2_ = extractBits(_e162, u32(5), u32(10)); _ = i3_; let _e171 = i3_; i3_ = extractBits(_e171, u32(5), u32(10)); _ = i4_; let _e180 = i4_; i4_ = extractBits(_e180, u32(5), u32(10)); _ = u; let _e189 = u; u = extractBits(_e189, u32(5), u32(10)); _ = u2_; let _e198 = u2_; u2_ = extractBits(_e198, u32(5), u32(10)); _ = u3_; let _e207 = u3_; u3_ = extractBits(_e207, u32(5), u32(10)); _ = u4_; let _e216 = u4_; u4_ = extractBits(_e216, u32(5), u32(10)); _ = i; let _e223 = i; i = firstTrailingBit(_e223); _ = i2_; let _e226 = i2_; i2_ = firstTrailingBit(_e226); _ = i3_; let _e229 = i3_; i3_ = firstTrailingBit(_e229); _ = i4_; let _e232 = i4_; i4_ = firstTrailingBit(_e232); _ = u; let _e235 = u; i = i32(firstTrailingBit(_e235)); _ = u2_; let _e239 = u2_; i2_ = vec2(firstTrailingBit(_e239)); _ = u3_; let _e243 = u3_; i3_ = vec3(firstTrailingBit(_e243)); _ = u4_; let _e247 = u4_; i4_ = vec4(firstTrailingBit(_e247)); _ = i; let _e251 = i; i = firstLeadingBit(_e251); _ = i2_; let _e254 = i2_; i2_ = firstLeadingBit(_e254); _ = i3_; let _e257 = i3_; i3_ = firstLeadingBit(_e257); _ = i4_; let _e260 = i4_; i4_ = firstLeadingBit(_e260); _ = u; let _e263 = u; i = i32(firstLeadingBit(_e263)); _ = u2_; let _e267 = u2_; i2_ = vec2(firstLeadingBit(_e267)); _ = u3_; let _e271 = u3_; i3_ = vec3(firstLeadingBit(_e271)); _ = u4_; let _e275 = u4_; i4_ = vec4(firstLeadingBit(_e275)); return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/boids.wgsl ================================================ struct Particle { pos: vec2, vel: vec2, } struct SimParams { deltaT: f32, rule1Distance: f32, rule2Distance: f32, rule3Distance: f32, rule1Scale: f32, rule2Scale: f32, rule3Scale: f32, } struct Particles { particles: array, } let NUM_PARTICLES: u32 = 1500u; @group(0) @binding(0) var params: SimParams; @group(0) @binding(1) var particlesSrc: Particles; @group(0) @binding(2) var particlesDst: Particles; @compute @workgroup_size(64, 1, 1) fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { var vPos: vec2; var vVel: vec2; var cMass: vec2; var cVel: vec2; var colVel: vec2; var cMassCount: i32 = 0; var cVelCount: i32 = 0; var pos: vec2; var vel: vec2; var i: u32 = 0u; let index = global_invocation_id.x; if (index >= NUM_PARTICLES) { return; } let _e10 = particlesSrc.particles[index].pos; vPos = _e10; let _e15 = particlesSrc.particles[index].vel; vVel = _e15; cMass = vec2(0.0, 0.0); cVel = vec2(0.0, 0.0); colVel = vec2(0.0, 0.0); loop { let _e37 = i; if (_e37 >= NUM_PARTICLES) { break; } let _e39 = i; if (_e39 == index) { continue; } let _e42 = i; let _e45 = particlesSrc.particles[_e42].pos; pos = _e45; let _e47 = i; let _e50 = particlesSrc.particles[_e47].vel; vel = _e50; let _e51 = pos; let _e52 = vPos; let _e55 = params.rule1Distance; if (distance(_e51, _e52) < _e55) { let _e57 = cMass; let _e58 = pos; cMass = (_e57 + _e58); let _e60 = cMassCount; cMassCount = (_e60 + 1); } let _e63 = pos; let _e64 = vPos; let _e67 = params.rule2Distance; if (distance(_e63, _e64) < _e67) { let _e69 = colVel; let _e70 = pos; let _e71 = vPos; colVel = (_e69 - (_e70 - _e71)); } let _e74 = pos; let _e75 = vPos; let _e78 = params.rule3Distance; if (distance(_e74, _e75) < _e78) { let _e80 = cVel; let _e81 = vel; cVel = (_e80 + _e81); let _e83 = cVelCount; cVelCount = (_e83 + 1); } continuing { let _e86 = i; i = (_e86 + 1u); } } let _e89 = cMassCount; if (_e89 > 0) { let _e92 = cMass; let _e93 = cMassCount; let _e97 = vPos; cMass = ((_e92 / vec2(f32(_e93))) - _e97); } let _e99 = cVelCount; if (_e99 > 0) { let _e102 = cVel; let _e103 = cVelCount; cVel = (_e102 / vec2(f32(_e103))); } let _e107 = vVel; let _e108 = cMass; let _e110 = params.rule1Scale; let _e113 = colVel; let _e115 = params.rule2Scale; let _e118 = cVel; let _e120 = params.rule3Scale; vVel = (((_e107 + (_e108 * _e110)) + (_e113 * _e115)) + (_e118 * _e120)); let _e123 = vVel; let _e125 = vVel; vVel = (normalize(_e123) * clamp(length(_e125), 0.0, 0.10000000149011612)); let _e131 = vPos; let _e132 = vVel; let _e134 = params.deltaT; vPos = (_e131 + (_e132 * _e134)); let _e138 = vPos.x; if (_e138 < -1.0) { vPos.x = 1.0; } let _e144 = vPos.x; if (_e144 > 1.0) { vPos.x = -1.0; } let _e150 = vPos.y; if (_e150 < -1.0) { vPos.y = 1.0; } let _e156 = vPos.y; if (_e156 > 1.0) { vPos.y = -1.0; } let _e164 = vPos; particlesDst.particles[index].pos = _e164; let _e168 = vVel; particlesDst.particles[index].vel = _e168; return; } ================================================ FILE: lib/naga/tests/out/wgsl/bool-select-frag.wgsl ================================================ struct FragmentOutput { @location(0) o_color: vec4, } var o_color: vec4; fn TevPerCompGT(a: f32, b: f32) -> f32 { var a_1: f32; var b_1: f32; a_1 = a; b_1 = b; let _e5 = a_1; let _e6 = b_1; return select(0.0, 1.0, (_e5 > _e6)); } fn TevPerCompGT_1(a_2: vec3, b_2: vec3) -> vec3 { var a_3: vec3; var b_3: vec3; a_3 = a_2; b_3 = b_2; _ = a_3; _ = b_3; let _e7 = a_3; let _e8 = b_3; return select(vec3(0.0), vec3(1.0), (_e7 > _e8)); } fn main_1() { let _e1 = o_color; _ = _e1.xyz; _ = vec3(3.0); _ = vec3(5.0); let _e11 = TevPerCompGT_1(vec3(3.0), vec3(5.0)); o_color.x = _e11.x; o_color.y = _e11.y; o_color.z = _e11.z; let _e23 = TevPerCompGT(3.0, 5.0); o_color.w = _e23; return; } @fragment fn main() -> FragmentOutput { main_1(); let _e3 = o_color; return FragmentOutput(_e3); } ================================================ FILE: lib/naga/tests/out/wgsl/break-if.wgsl ================================================ fn breakIfEmpty() { loop { continuing { break if true; } } return; } fn breakIfEmptyBody(a: bool) { var b: bool; var c: bool; loop { continuing { b = a; let _e2 = b; c = (a != _e2); let _e5 = c; _ = (a == _e5); break if (a == _e5); } } return; } fn breakIf(a_1: bool) { var d: bool; var e: bool; loop { d = a_1; let _e2 = d; e = (a_1 != _e2); continuing { let _e5 = e; _ = (a_1 == _e5); break if (a_1 == _e5); } } return; } @compute @workgroup_size(1, 1, 1) fn main() { return; } ================================================ FILE: lib/naga/tests/out/wgsl/buffer-frag.wgsl ================================================ struct testBufferBlock { data: array, } struct testBufferWriteOnlyBlock { data: array, } struct testBufferReadOnlyBlock { data: array, } @group(0) @binding(0) var testBuffer: testBufferBlock; @group(0) @binding(1) var testBufferWriteOnly: testBufferWriteOnlyBlock; @group(0) @binding(2) var testBufferReadOnly: testBufferReadOnlyBlock; fn main_1() { var a: u32; var b: u32; _ = (&testBuffer.data); _ = (&testBufferWriteOnly.data); _ = (&testBufferReadOnly.data); let _e12 = testBuffer.data[0]; a = _e12; testBuffer.data[1] = u32(2); testBufferWriteOnly.data[1] = u32(2); let _e27 = testBufferReadOnly.data[0]; b = _e27; return; } @fragment fn main() { _ = (&testBuffer.data); _ = (&testBufferWriteOnly.data); main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/clamp-splat-vert.wgsl ================================================ struct VertexOutput { @builtin(position) member: vec4, } var a_pos_1: vec2; var gl_Position: vec4; fn main_1() { _ = a_pos_1; let _e5 = a_pos_1; let _e10 = clamp(_e5, vec2(0.0), vec2(1.0)); gl_Position = vec4(_e10.x, _e10.y, 0.0, 1.0); return; } @vertex fn main(@location(0) a_pos: vec2) -> VertexOutput { a_pos_1 = a_pos; main_1(); let _e5 = gl_Position; return VertexOutput(_e5); } ================================================ FILE: lib/naga/tests/out/wgsl/collatz.wgsl ================================================ struct PrimeIndices { data: array, } @group(0) @binding(0) var v_indices: PrimeIndices; fn collatz_iterations(n_base: u32) -> u32 { var n: u32; var i: u32 = 0u; n = n_base; loop { let _e5 = n; if (_e5 > 1u) { } else { break; } let _e8 = n; if ((_e8 % 2u) == 0u) { let _e13 = n; n = (_e13 / 2u); } else { let _e17 = n; n = ((3u * _e17) + 1u); } let _e21 = i; i = (_e21 + 1u); } let _e24 = i; return _e24; } @compute @workgroup_size(1, 1, 1) fn main(@builtin(global_invocation_id) global_id: vec3) { let _e8 = v_indices.data[global_id.x]; let _e9 = collatz_iterations(_e8); v_indices.data[global_id.x] = _e9; return; } ================================================ FILE: lib/naga/tests/out/wgsl/constant-array-size-vert.wgsl ================================================ struct Data { vecs: array,42u>, } @group(1) @binding(0) var global: Data; fn function_() -> vec4 { var sum: vec4; var i: i32; sum = vec4(f32(0)); i = 0; loop { let _e9 = i; if !((_e9 < 42)) { break; } { let _e15 = sum; let _e16 = i; let _e18 = global.vecs[_e16]; sum = (_e15 + _e18); } continuing { let _e12 = i; i = (_e12 + 1); } } let _e20 = sum; return _e20; } fn main_1() { return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/control-flow.wgsl ================================================ fn switch_default_break(i: i32) { switch i { default: { break; } } } fn switch_case_break() { switch 0 { case 0: { break; } default: { } } return; } fn loop_switch_continue(x: i32) { loop { switch x { case 1: { continue; } default: { } } } return; } @compute @workgroup_size(1, 1, 1) fn main(@builtin(global_invocation_id) global_id: vec3) { var pos: i32; storageBarrier(); workgroupBarrier(); switch 1 { default: { pos = 1; } } let _e4 = pos; switch _e4 { case 1: { pos = 0; break; } case 2: { pos = 1; } case 3: { pos = 2; fallthrough; } case 4: { pos = 3; fallthrough; } default: { pos = 4; } } switch 0u { case 0u: { } default: { } } let _e11 = pos; switch _e11 { case 1: { pos = 0; break; } case 2: { pos = 1; return; } case 3: { pos = 2; fallthrough; } case 4: { return; } default: { pos = 3; return; } } } ================================================ FILE: lib/naga/tests/out/wgsl/declarations-vert.wgsl ================================================ struct VertexData { position: vec2, a: vec2, } struct FragmentData { position: vec2, a: vec2, } struct TestStruct { a: f32, b: f32, } struct VertexOutput { @location(0) position: vec2, @location(1) a: vec2, @location(2) out_array: vec4, @location(3) out_array_1: vec4, } var vert: VertexData; var frag: FragmentData; var in_array_2: array,2u>; var out_array: array,2u>; var array_2d: array,2u>; var array_toomanyd: array,2u>,2u>,2u>,2u>,2u>,2u>; fn main_1() { var positions: array,2u>; var strct: TestStruct; var from_input_array: vec4; var a_1: f32; var b: f32; _ = (&vert.position); _ = (&vert.a); _ = (&frag.position); _ = (&frag.a); positions = array,2u>(vec3(-(1.0), 1.0, 0.0), vec3(-(1.0), -(1.0), 0.0)); strct = TestStruct(f32(1), f32(2)); let _e35 = in_array_2[1]; from_input_array = _e35; let _e41 = array_2d[0][0]; a_1 = _e41; let _e57 = array_toomanyd[0][0][0][0][0][0][0]; b = _e57; out_array[0] = vec4(2.0); return; } @vertex fn main(@location(0) position: vec2, @location(1) a: vec2, @location(2) in_array: vec4, @location(3) in_array_1: vec4) -> VertexOutput { vert.position = position; vert.a = a; in_array_2[0] = in_array; in_array_2[1] = in_array_1; _ = (&vert.position); _ = (&vert.a); _ = (&frag.position); _ = (&frag.a); main_1(); let _e30 = frag.position; let _e32 = frag.a; let _e35 = out_array[0]; let _e37 = out_array[1]; return VertexOutput(_e30, _e32, _e35, _e37); } ================================================ FILE: lib/naga/tests/out/wgsl/empty-global-name.wgsl ================================================ struct type_1 { member: i32, } @group(0) @binding(0) var unnamed: type_1; fn function_() { let _e8 = unnamed.member; unnamed.member = (_e8 + 1); return; } @compute @workgroup_size(1, 1, 1) fn main() { function_(); } ================================================ FILE: lib/naga/tests/out/wgsl/empty.wgsl ================================================ @compute @workgroup_size(1, 1, 1) fn main() { return; } ================================================ FILE: lib/naga/tests/out/wgsl/expressions-frag.wgsl ================================================ struct BST { data: i32, } struct a_buf { a: array, } struct FragmentOutput { @location(0) o_color: vec4, } var global: f32; @group(0) @binding(0) var global_1: a_buf; var o_color: vec4; fn testBinOpVecFloat(a: vec4, b: f32) { var a_1: vec4; var b_1: f32; var v: vec4; a_1 = a; b_1 = b; let _e5 = a_1; v = (_e5 * 2.0); let _e8 = a_1; v = (_e8 / vec4(2.0)); let _e12 = a_1; v = (_e12 + vec4(2.0)); let _e16 = a_1; v = (_e16 - vec4(2.0)); return; } fn testBinOpFloatVec(a_2: vec4, b_2: f32) { var a_3: vec4; var b_3: f32; var v_1: vec4; a_3 = a_2; b_3 = b_2; let _e5 = a_3; let _e6 = b_3; v_1 = (_e5 * _e6); let _e8 = a_3; let _e9 = b_3; v_1 = (_e8 / vec4(_e9)); let _e12 = a_3; let _e13 = b_3; v_1 = (_e12 + vec4(_e13)); let _e16 = a_3; let _e17 = b_3; v_1 = (_e16 - vec4(_e17)); return; } fn testBinOpIVecInt(a_4: vec4, b_4: i32) { var a_5: vec4; var b_5: i32; var v_2: vec4; a_5 = a_4; b_5 = b_4; let _e5 = a_5; let _e6 = b_5; v_2 = (_e5 * _e6); let _e8 = a_5; let _e9 = b_5; v_2 = (_e8 / vec4(_e9)); let _e12 = a_5; let _e13 = b_5; v_2 = (_e12 + vec4(_e13)); let _e16 = a_5; let _e17 = b_5; v_2 = (_e16 - vec4(_e17)); let _e20 = a_5; let _e21 = b_5; v_2 = (_e20 & vec4(_e21)); let _e24 = a_5; let _e25 = b_5; v_2 = (_e24 | vec4(_e25)); let _e28 = a_5; let _e29 = b_5; v_2 = (_e28 ^ vec4(_e29)); let _e32 = a_5; let _e33 = b_5; v_2 = (_e32 >> vec4(u32(_e33))); let _e37 = a_5; let _e38 = b_5; v_2 = (_e37 << vec4(u32(_e38))); return; } fn testBinOpIntIVec(a_6: i32, b_6: vec4) { var a_7: i32; var b_7: vec4; var v_3: vec4; a_7 = a_6; b_7 = b_6; let _e5 = a_7; let _e6 = b_7; v_3 = (_e5 * _e6); let _e8 = a_7; let _e9 = b_7; v_3 = (vec4(_e8) + _e9); let _e12 = a_7; let _e13 = b_7; v_3 = (vec4(_e12) - _e13); let _e16 = a_7; let _e17 = b_7; v_3 = (vec4(_e16) & _e17); let _e20 = a_7; let _e21 = b_7; v_3 = (vec4(_e20) | _e21); let _e24 = a_7; let _e25 = b_7; v_3 = (vec4(_e24) ^ _e25); return; } fn testBinOpUVecUint(a_8: vec4, b_8: u32) { var a_9: vec4; var b_9: u32; var v_4: vec4; a_9 = a_8; b_9 = b_8; let _e5 = a_9; let _e6 = b_9; v_4 = (_e5 * _e6); let _e8 = a_9; let _e9 = b_9; v_4 = (_e8 / vec4(_e9)); let _e12 = a_9; let _e13 = b_9; v_4 = (_e12 + vec4(_e13)); let _e16 = a_9; let _e17 = b_9; v_4 = (_e16 - vec4(_e17)); let _e20 = a_9; let _e21 = b_9; v_4 = (_e20 & vec4(_e21)); let _e24 = a_9; let _e25 = b_9; v_4 = (_e24 | vec4(_e25)); let _e28 = a_9; let _e29 = b_9; v_4 = (_e28 ^ vec4(_e29)); let _e32 = a_9; let _e33 = b_9; v_4 = (_e32 >> vec4(_e33)); let _e36 = a_9; let _e37 = b_9; v_4 = (_e36 << vec4(_e37)); return; } fn testBinOpUintUVec(a_10: u32, b_10: vec4) { var a_11: u32; var b_11: vec4; var v_5: vec4; a_11 = a_10; b_11 = b_10; let _e5 = a_11; let _e6 = b_11; v_5 = (_e5 * _e6); let _e8 = a_11; let _e9 = b_11; v_5 = (vec4(_e8) + _e9); let _e12 = a_11; let _e13 = b_11; v_5 = (vec4(_e12) - _e13); let _e16 = a_11; let _e17 = b_11; v_5 = (vec4(_e16) & _e17); let _e20 = a_11; let _e21 = b_11; v_5 = (vec4(_e20) | _e21); let _e24 = a_11; let _e25 = b_11; v_5 = (vec4(_e24) ^ _e25); return; } fn testBinOpMatMat(a_12: mat3x3, b_12: mat3x3) { var a_13: mat3x3; var b_13: mat3x3; var v_6: mat3x3; var c: bool; a_13 = a_12; b_13 = b_12; let _e6 = a_13; let _e7 = b_13; v_6 = mat3x3((_e6[0] / _e7[0]), (_e6[1] / _e7[1]), (_e6[2] / _e7[2])); let _e18 = a_13; let _e19 = b_13; v_6 = (_e18 * _e19); let _e21 = a_13; let _e22 = b_13; v_6 = (_e21 + _e22); let _e24 = a_13; let _e25 = b_13; v_6 = (_e24 - _e25); let _e27 = a_13; let _e28 = b_13; c = (all((_e27[2] == _e28[2])) && (all((_e27[1] == _e28[1])) && all((_e27[0] == _e28[0])))); let _e43 = a_13; let _e44 = b_13; c = (any((_e43[2] != _e44[2])) || (any((_e43[1] != _e44[1])) || any((_e43[0] != _e44[0])))); return; } fn testBinOpMatFloat(a_14: f32, b_14: mat3x3) { var a_15: f32; var b_15: mat3x3; var v_7: mat3x3; a_15 = a_14; b_15 = b_14; let _e5 = a_15; let _e6 = b_15; let _e7 = vec3(_e5); v_7 = mat3x3((_e7 / _e6[0]), (_e7 / _e6[1]), (_e7 / _e6[2])); let _e15 = a_15; let _e16 = b_15; v_7 = (_e15 * _e16); let _e18 = a_15; let _e19 = b_15; let _e20 = vec3(_e18); v_7 = mat3x3((_e20 + _e19[0]), (_e20 + _e19[1]), (_e20 + _e19[2])); let _e28 = a_15; let _e29 = b_15; let _e30 = vec3(_e28); v_7 = mat3x3((_e30 - _e29[0]), (_e30 - _e29[1]), (_e30 - _e29[2])); let _e38 = b_15; let _e39 = a_15; let _e40 = vec3(_e39); v_7 = mat3x3((_e38[0] / _e40), (_e38[1] / _e40), (_e38[2] / _e40)); let _e48 = b_15; let _e49 = a_15; v_7 = (_e48 * _e49); let _e51 = b_15; let _e52 = a_15; let _e53 = vec3(_e52); v_7 = mat3x3((_e51[0] + _e53), (_e51[1] + _e53), (_e51[2] + _e53)); let _e61 = b_15; let _e62 = a_15; let _e63 = vec3(_e62); v_7 = mat3x3((_e61[0] - _e63), (_e61[1] - _e63), (_e61[2] - _e63)); return; } fn testUnaryOpMat(a_16: mat3x3) { var a_17: mat3x3; var v_8: mat3x3; a_17 = a_16; let _e3 = a_17; v_8 = -(_e3); let _e5 = a_17; let _e7 = vec3(1.0); let _e9 = (_e5 - mat3x3(_e7, _e7, _e7)); a_17 = _e9; v_8 = _e9; let _e10 = a_17; let _e12 = vec3(1.0); a_17 = (_e10 - mat3x3(_e12, _e12, _e12)); v_8 = _e10; return; } fn testStructConstructor() { var tree: BST; tree = BST(1); return; } fn testNonScalarToScalarConstructor() { var f: f32; f = f32(mat2x2(vec2(1.0, 0.0), vec2(0.0, 1.0))[0].x); return; } fn testArrayConstructor() { var tree_1: array; tree_1 = array(0.0); return; } fn testFreestandingConstructor() { return; } fn testNonImplicitCastVectorCast() { var a_18: u32; var b_16: vec4; a_18 = u32(1); let _e3 = a_18; b_16 = vec4(i32(_e3)); return; } fn privatePointer(a_19: ptr) { return; } fn ternary(a_20: bool) { var a_21: bool; var local: u32; var b_17: u32; var local_1: u32; var c_1: u32; var local_2: u32; var local_3: u32; var local_4: u32; var nested: u32; a_21 = a_20; let _e3 = a_21; if _e3 { local = u32(0); } else { local = 1u; } let _e8 = local; b_17 = _e8; let _e10 = a_21; if _e10 { local_1 = 0u; } else { local_1 = u32(1); } let _e15 = local_1; c_1 = _e15; let _e17 = a_21; if _e17 { let _e18 = a_21; if _e18 { let _e19 = a_21; if _e19 { local_2 = 2u; } else { local_2 = u32(3); } let _e24 = local_2; local_3 = _e24; } else { local_3 = 4u; } let _e27 = local_3; local_4 = _e27; } else { local_4 = u32(5); } let _e31 = local_4; nested = _e31; return; } fn testMatrixMultiplication(a_22: mat4x3, b_18: mat4x4) { var a_23: mat4x3; var b_19: mat4x4; var c_2: mat4x3; a_23 = a_22; b_19 = b_18; let _e5 = a_23; let _e6 = b_19; c_2 = (_e5 * _e6); return; } fn testLength() { var len: i32; len = i32(arrayLength((&global_1.a))); return; } fn testConstantLength(a_24: array) { var a_25: array; var len_1: i32; _ = (&global_1.a); a_25 = a_24; _ = a_25; len_1 = i32(4u); return; } fn main_1() { var local_5: f32; _ = (&global_1.a); _ = global; let _e5 = global; local_5 = _e5; privatePointer((&local_5)); let _e7 = local_5; global = _e7; let _e8 = o_color; _ = _e8.xyzw; let _e11 = vec4(1.0); o_color.x = _e11.x; o_color.y = _e11.y; o_color.z = _e11.z; o_color.w = _e11.w; return; } @fragment fn main() -> FragmentOutput { _ = (&global_1.a); main_1(); let _e7 = o_color; return FragmentOutput(_e7); } ================================================ FILE: lib/naga/tests/out/wgsl/extra.wgsl ================================================ struct PushConstants { index: u32, double: vec2, } struct FragmentIn { @location(0) color: vec4, @builtin(primitive_index) primitive_index: u32, } var pc: PushConstants; @fragment fn main(in: FragmentIn) -> @location(0) vec4 { let _e4 = pc.index; if (in.primitive_index == _e4) { return in.color; } else { return vec4((vec3(1.0) - in.color.xyz), in.color.w); } } ================================================ FILE: lib/naga/tests/out/wgsl/fma-frag.wgsl ================================================ struct Mat4x3_ { mx: vec4, my: vec4, mz: vec4, } struct FragmentOutput { @location(0) o_color: vec4, } var o_color: vec4; fn Fma(d: ptr, m: Mat4x3_, s: f32) { var m_1: Mat4x3_; var s_1: f32; m_1 = m; s_1 = s; let _e7 = (*d).mx; let _e9 = m_1.mx; let _e10 = s_1; (*d).mx = (_e7 + (_e9 * _e10)); let _e15 = (*d).my; let _e17 = m_1.my; let _e18 = s_1; (*d).my = (_e15 + (_e17 * _e18)); let _e23 = (*d).mz; let _e25 = m_1.mz; let _e26 = s_1; (*d).mz = (_e23 + (_e25 * _e26)); return; } fn main_1() { let _e1 = o_color; _ = _e1.xyzw; let _e4 = vec4(1.0); o_color.x = _e4.x; o_color.y = _e4.y; o_color.z = _e4.z; o_color.w = _e4.w; return; } @fragment fn main() -> FragmentOutput { main_1(); let _e3 = o_color; return FragmentOutput(_e3); } ================================================ FILE: lib/naga/tests/out/wgsl/functions.wgsl ================================================ fn test_fma() -> vec2 { let a = vec2(2.0, 2.0); let b = vec2(0.5, 0.5); let c = vec2(0.5, 0.5); return fma(a, b, c); } fn test_integer_dot_product() -> i32 { let a_2_ = vec2(1); let b_2_ = vec2(1); let c_2_ = dot(a_2_, b_2_); let a_3_ = vec3(1u); let b_3_ = vec3(1u); let c_3_ = dot(a_3_, b_3_); let c_4_ = dot(vec4(4), vec4(2)); return c_4_; } @compute @workgroup_size(1, 1, 1) fn main() { let _e0 = test_fma(); let _e1 = test_integer_dot_product(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/global-constant-array-vert.wgsl ================================================ var i: u32; fn main_1() { var local: array = array(1.0, 2.0); let _e2 = i; } @vertex fn main() { _ = array(1.0, 2.0); main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/globals.wgsl ================================================ struct Foo { v3_: vec3, v1_: f32, } let Foo_2: bool = true; var wg: array; var at_1: atomic; @group(0) @binding(1) var alignment: Foo; @group(0) @binding(2) var dummy: array>; @group(0) @binding(3) var float_vecs: array,20>; @group(0) @binding(4) var global_vec: vec3; @group(0) @binding(5) var global_mat: mat3x2; @group(0) @binding(6) var global_nested_arrays_of_matrices_2x4_: array,2>,2>; @group(0) @binding(7) var global_nested_arrays_of_matrices_4x2_: array,2>,2>; fn test_msl_packed_vec3_as_arg(arg: vec3) { return; } fn test_msl_packed_vec3_() { var idx: i32 = 1; alignment.v3_ = vec3(1.0); alignment.v3_.x = 1.0; alignment.v3_.x = 2.0; let _e23 = idx; alignment.v3_[_e23] = 3.0; let data = alignment; _ = data.v3_; _ = data.v3_.zx; test_msl_packed_vec3_as_arg(data.v3_); _ = (data.v3_ * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * data.v3_); _ = (data.v3_ * 2.0); _ = (2.0 * data.v3_); } @compute @workgroup_size(1, 1, 1) fn main() { var Foo_1: f32 = 1.0; var at: bool = true; test_msl_packed_vec3_(); let _e16 = global_nested_arrays_of_matrices_4x2_[0][0]; let _e23 = global_nested_arrays_of_matrices_2x4_[0][0][0]; wg[7] = (_e16 * _e23).x; let _e28 = global_mat; let _e29 = global_vec; wg[6] = (_e28 * _e29).x; let _e37 = dummy[1].y; wg[5] = _e37; let _e43 = float_vecs[0].w; wg[4] = _e43; let _e47 = alignment.v1_; wg[3] = _e47; let _e52 = alignment.v3_.x; wg[2] = _e52; alignment.v1_ = 4.0; wg[1] = f32(arrayLength((&dummy))); atomicStore((&at_1), 2u); return; } ================================================ FILE: lib/naga/tests/out/wgsl/image.wgsl ================================================ @group(0) @binding(0) var image_mipmapped_src: texture_2d; @group(0) @binding(3) var image_multisampled_src: texture_multisampled_2d; @group(0) @binding(4) var image_depth_multisampled_src: texture_depth_multisampled_2d; @group(0) @binding(1) var image_storage_src: texture_storage_2d; @group(0) @binding(5) var image_array_src: texture_2d_array; @group(0) @binding(6) var image_dup_src: texture_storage_1d; @group(0) @binding(7) var image_1d_src: texture_1d; @group(0) @binding(2) var image_dst: texture_storage_1d; @group(0) @binding(0) var image_1d: texture_1d; @group(0) @binding(1) var image_2d: texture_2d; @group(0) @binding(2) var image_2d_array: texture_2d_array; @group(0) @binding(3) var image_cube: texture_cube; @group(0) @binding(4) var image_cube_array: texture_cube_array; @group(0) @binding(5) var image_3d: texture_3d; @group(0) @binding(6) var image_aa: texture_multisampled_2d; @group(1) @binding(0) var sampler_reg: sampler; @group(1) @binding(1) var sampler_cmp: sampler_comparison; @group(1) @binding(2) var image_2d_depth: texture_depth_2d; @group(1) @binding(3) var image_cube_depth: texture_depth_cube; @compute @workgroup_size(16, 1, 1) fn main(@builtin(local_invocation_id) local_id: vec3) { let dim = textureDimensions(image_storage_src); let itc = ((dim * vec2(local_id.xy)) % vec2(10, 20)); let value1_ = textureLoad(image_mipmapped_src, itc, i32(local_id.z)); let value2_ = textureLoad(image_multisampled_src, itc, i32(local_id.z)); let value4_ = textureLoad(image_storage_src, itc); let value5_ = textureLoad(image_array_src, itc, i32(local_id.z), (i32(local_id.z) + 1)); let value6_ = textureLoad(image_1d_src, i32(local_id.x), i32(local_id.z)); textureStore(image_dst, itc.x, ((((value1_ + value2_) + value4_) + value5_) + value6_)); return; } @compute @workgroup_size(16, 1, 1) fn depth_load(@builtin(local_invocation_id) local_id_1: vec3) { let dim_1 = textureDimensions(image_storage_src); let itc_1 = ((dim_1 * vec2(local_id_1.xy)) % vec2(10, 20)); let val = textureLoad(image_depth_multisampled_src, itc_1, i32(local_id_1.z)); textureStore(image_dst, itc_1.x, vec4(u32(val))); return; } @vertex fn queries() -> @builtin(position) vec4 { let dim_1d = textureDimensions(image_1d); let dim_1d_lod = textureDimensions(image_1d, i32(dim_1d)); let dim_2d = textureDimensions(image_2d); let dim_2d_lod = textureDimensions(image_2d, 1); let dim_2d_array = textureDimensions(image_2d_array); let dim_2d_array_lod = textureDimensions(image_2d_array, 1); let dim_cube = textureDimensions(image_cube); let dim_cube_lod = textureDimensions(image_cube, 1); let dim_cube_array = textureDimensions(image_cube_array); let dim_cube_array_lod = textureDimensions(image_cube_array, 1); let dim_3d = textureDimensions(image_3d); let dim_3d_lod = textureDimensions(image_3d, 1); let dim_2s_ms = textureDimensions(image_aa); let sum = ((((((((((dim_1d + dim_2d.y) + dim_2d_lod.y) + dim_2d_array.y) + dim_2d_array_lod.y) + dim_cube.y) + dim_cube_lod.y) + dim_cube_array.y) + dim_cube_array_lod.y) + dim_3d.z) + dim_3d_lod.z); return vec4(f32(sum)); } @vertex fn levels_queries() -> @builtin(position) vec4 { let num_levels_2d = textureNumLevels(image_2d); let num_levels_2d_array = textureNumLevels(image_2d_array); let num_layers_2d = textureNumLayers(image_2d_array); let num_levels_cube = textureNumLevels(image_cube); let num_levels_cube_array = textureNumLevels(image_cube_array); let num_layers_cube = textureNumLayers(image_cube_array); let num_levels_3d = textureNumLevels(image_3d); let num_samples_aa = textureNumSamples(image_aa); let sum_1 = (((((((num_layers_2d + num_layers_cube) + num_samples_aa) + num_levels_2d) + num_levels_2d_array) + num_levels_3d) + num_levels_cube) + num_levels_cube_array); return vec4(f32(sum_1)); } @fragment fn texture_sample() -> @location(0) vec4 { let tc = vec2(0.5); let s1d = textureSample(image_1d, sampler_reg, tc.x); let s2d = textureSample(image_2d, sampler_reg, tc); let s2d_offset = textureSample(image_2d, sampler_reg, tc, vec2(3, 1)); let s2d_level = textureSampleLevel(image_2d, sampler_reg, tc, 2.299999952316284); let s2d_level_offset = textureSampleLevel(image_2d, sampler_reg, tc, 2.299999952316284, vec2(3, 1)); let s2d_bias_offset = textureSampleBias(image_2d, sampler_reg, tc, 2.0, vec2(3, 1)); return ((((s1d + s2d) + s2d_offset) + s2d_level) + s2d_level_offset); } @fragment fn texture_sample_comparison() -> @location(0) f32 { let tc_1 = vec2(0.5); let s2d_depth = textureSampleCompare(image_2d_depth, sampler_cmp, tc_1, 0.5); let s2d_depth_level = textureSampleCompareLevel(image_2d_depth, sampler_cmp, tc_1, 0.5); let scube_depth_level = textureSampleCompareLevel(image_cube_depth, sampler_cmp, vec3(0.5), 0.5); return (s2d_depth + s2d_depth_level); } @fragment fn gather() -> @location(0) vec4 { let tc_2 = vec2(0.5); let s2d_1 = textureGather(1, image_2d, sampler_reg, tc_2); let s2d_offset_1 = textureGather(3, image_2d, sampler_reg, tc_2, vec2(3, 1)); let s2d_depth_1 = textureGatherCompare(image_2d_depth, sampler_cmp, tc_2, 0.5); let s2d_depth_offset = textureGatherCompare(image_2d_depth, sampler_cmp, tc_2, 0.5, vec2(3, 1)); return (((s2d_1 + s2d_offset_1) + s2d_depth_1) + s2d_depth_offset); } @fragment fn depth_no_comparison() -> @location(0) vec4 { let tc_3 = vec2(0.5); let s2d_2 = textureSample(image_2d_depth, sampler_reg, tc_3); let s2d_gather = textureGather(image_2d_depth, sampler_reg, tc_3); return (vec4(s2d_2) + s2d_gather); } ================================================ FILE: lib/naga/tests/out/wgsl/images-frag.wgsl ================================================ @group(0) @binding(0) var img1D: texture_storage_1d; @group(0) @binding(1) var img2D: texture_storage_2d; @group(0) @binding(2) var img3D: texture_storage_3d; @group(0) @binding(4) var img1DArray: texture_storage_1d_array; @group(0) @binding(5) var img2DArray: texture_storage_2d_array; @group(0) @binding(7) var imgReadOnly: texture_storage_2d; @group(0) @binding(8) var imgWriteOnly: texture_storage_2d; @group(0) @binding(9) var imgWriteReadOnly: texture_storage_2d; fn testImg1D(coord: i32) { var coord_1: i32; var size: i32; var c: vec4; coord_1 = coord; let _e10 = textureDimensions(img1D); size = _e10; _ = coord_1; _ = vec4(f32(2)); let _e16 = coord_1; textureStore(img1D, _e16, vec4(f32(2))); _ = coord_1; let _e21 = coord_1; let _e22 = textureLoad(img1D, _e21); c = _e22; return; } fn testImg1DArray(coord_2: vec2) { var coord_3: vec2; var size_1: vec2; var c_1: vec4; coord_3 = coord_2; let _e10 = textureDimensions(img1DArray); let _e11 = textureNumLayers(img1DArray); size_1 = vec2(vec2(_e10, _e11)); _ = coord_3; let _e16 = coord_3; let _e19 = textureLoad(img1DArray, _e16.x, _e16.y); c_1 = _e19; _ = coord_3; _ = vec4(f32(2)); let _e25 = coord_3; textureStore(img1DArray, _e25.x, _e25.y, vec4(f32(2))); return; } fn testImg2D(coord_4: vec2) { var coord_5: vec2; var size_2: vec2; var c_2: vec4; coord_5 = coord_4; let _e10 = textureDimensions(img2D); size_2 = vec2(_e10); _ = coord_5; let _e14 = coord_5; let _e15 = textureLoad(img2D, _e14); c_2 = _e15; _ = coord_5; _ = vec4(f32(2)); let _e21 = coord_5; textureStore(img2D, _e21, vec4(f32(2))); return; } fn testImg2DArray(coord_6: vec3) { var coord_7: vec3; var size_3: vec3; var c_3: vec4; coord_7 = coord_6; let _e10 = textureDimensions(img2DArray); let _e13 = textureNumLayers(img2DArray); size_3 = vec3(vec3(_e10.x, _e10.y, _e13)); _ = coord_7; let _e18 = coord_7; let _e21 = textureLoad(img2DArray, _e18.xy, _e18.z); c_3 = _e21; _ = coord_7; _ = vec4(f32(2)); let _e27 = coord_7; textureStore(img2DArray, _e27.xy, _e27.z, vec4(f32(2))); return; } fn testImg3D(coord_8: vec3) { var coord_9: vec3; var size_4: vec3; var c_4: vec4; coord_9 = coord_8; let _e10 = textureDimensions(img3D); size_4 = vec3(_e10); _ = coord_9; let _e14 = coord_9; let _e15 = textureLoad(img3D, _e14); c_4 = _e15; _ = coord_9; _ = vec4(f32(2)); let _e21 = coord_9; textureStore(img3D, _e21, vec4(f32(2))); return; } fn testImgReadOnly(coord_10: vec2) { var coord_11: vec2; var size_5: vec2; var c_5: vec4; coord_11 = coord_10; let _e10 = textureDimensions(img2D); size_5 = vec2(_e10); _ = coord_11; let _e14 = coord_11; let _e15 = textureLoad(imgReadOnly, _e14); c_5 = _e15; return; } fn testImgWriteOnly(coord_12: vec2) { var coord_13: vec2; var size_6: vec2; coord_13 = coord_12; let _e10 = textureDimensions(img2D); size_6 = vec2(_e10); _ = coord_13; _ = vec4(f32(2)); let _e17 = coord_13; textureStore(imgWriteOnly, _e17, vec4(f32(2))); return; } fn testImgWriteReadOnly(coord_14: vec2) { var coord_15: vec2; var size_7: vec2; coord_15 = coord_14; let _e10 = textureDimensions(imgWriteReadOnly); size_7 = vec2(_e10); return; } fn main_1() { return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/interface.wgsl ================================================ struct VertexOutput { @builtin(position) @invariant position: vec4, @location(1) _varying: f32, } struct FragmentOutput { @builtin(frag_depth) depth: f32, @builtin(sample_mask) sample_mask: u32, @location(0) color: f32, } struct Input1_ { @builtin(vertex_index) index: u32, } struct Input2_ { @builtin(instance_index) index: u32, } var output: array; @vertex fn vertex(@builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, @location(10) color: u32) -> VertexOutput { let tmp: u32 = ((vertex_index + instance_index) + color); return VertexOutput(vec4(1.0), f32(tmp)); } @fragment fn fragment(in: VertexOutput, @builtin(front_facing) front_facing: bool, @builtin(sample_index) sample_index: u32, @builtin(sample_mask) sample_mask: u32) -> FragmentOutput { let mask: u32 = (sample_mask & (1u << sample_index)); let color_1: f32 = select(0.0, 1.0, front_facing); return FragmentOutput(in._varying, mask, color_1); } @compute @workgroup_size(1, 1, 1) fn compute(@builtin(global_invocation_id) global_id: vec3, @builtin(local_invocation_id) local_id: vec3, @builtin(local_invocation_index) local_index: u32, @builtin(workgroup_id) wg_id: vec3, @builtin(num_workgroups) num_wgs: vec3) { output[0] = ((((global_id.x + local_id.x) + local_index) + wg_id.x) + num_wgs.x); return; } @vertex fn vertex_two_structs(in1_: Input1_, in2_: Input2_) -> @builtin(position) @invariant vec4 { var index: u32 = 2u; let _e9: u32 = index; return vec4(f32(in1_.index), f32(in2_.index), f32(_e9), 0.0); } ================================================ FILE: lib/naga/tests/out/wgsl/interpolate.wgsl ================================================ struct FragmentInput { @builtin(position) position: vec4, @location(0) _flat: u32, @location(1) @interpolate(linear) _linear: f32, @location(2) @interpolate(linear, centroid) linear_centroid: vec2, @location(3) @interpolate(linear, sample) linear_sample: vec3, @location(4) perspective: vec4, @location(5) @interpolate(perspective, centroid) perspective_centroid: f32, @location(6) @interpolate(perspective, sample) perspective_sample: f32, } @vertex fn vert_main() -> FragmentInput { var out: FragmentInput; out.position = vec4(2.0, 4.0, 5.0, 6.0); out._flat = 8u; out._linear = 27.0; out.linear_centroid = vec2(64.0, 125.0); out.linear_sample = vec3(216.0, 343.0, 512.0); out.perspective = vec4(729.0, 1000.0, 1331.0, 1728.0); out.perspective_centroid = 2197.0; out.perspective_sample = 2744.0; let _e30 = out; return _e30; } @fragment fn frag_main(val: FragmentInput) { return; } ================================================ FILE: lib/naga/tests/out/wgsl/inv-hyperbolic-trig-functions.wgsl ================================================ var a: f32; fn main_1() { var b: f32; var c: f32; var d: f32; let _e8 = a; b = log(_e8 + sqrt(_e8 * _e8 + 1.0)); let _e10 = a; c = log(_e10 + sqrt(_e10 * _e10 - 1.0)); let _e12 = a; d = 0.5 * log((1.0 + _e12) / (1.0 - _e12)); return; } @vertex fn main() { main_1(); } ================================================ FILE: lib/naga/tests/out/wgsl/lexical-scopes.wgsl ================================================ fn blockLexicalScope(a: bool) { { { } let test = (2 == 3); } let test_1 = (1.0 == 2.0); } fn ifLexicalScope(a_1: bool) { if (1.0 == 1.0) { } let test_2 = (1.0 == 2.0); } fn loopLexicalScope(a_2: bool) { loop { } let test_3 = (1.0 == 2.0); } fn forLexicalScope(a_3: f32) { var a_4: i32 = 0; loop { let _e4 = a_4; if (_e4 < 1) { } else { break; } continuing { let _e7 = a_4; a_4 = (_e7 + 1); } } let test_4 = (false == true); } fn whileLexicalScope(a_5: i32) { loop { if (a_5 > 2) { } else { break; } } let test_5 = (a_5 == 1); } fn switchLexicalScope(a_6: i32) { switch a_6 { case 0: { } case 1: { } default: { } } let test_6 = (a_6 == 2); } ================================================ FILE: lib/naga/tests/out/wgsl/long-form-matrix-vert.wgsl ================================================ fn main_1() { var splat: mat2x2; var normal: mat2x2; var from_matrix: mat2x4; var a: mat2x2; var b: mat2x2; var c: mat3x3; var d: mat3x3; var e: mat4x4; let _e1 = f32(1); splat = mat2x2(vec2(_e1, 0.0), vec2(0.0, _e1)); let _e9 = vec2(f32(1)); let _e12 = vec2(f32(2)); normal = mat2x2(vec2(_e9.x, _e9.y), vec2(_e12.x, _e12.y)); let _e26 = mat3x3(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0)); from_matrix = mat2x4(vec4(_e26[0].x, _e26[0].y, _e26[0].z, 0.0), vec4(_e26[1].x, _e26[1].y, _e26[1].z, 0.0)); a = mat2x2(vec2(f32(1), f32(2)), vec2(f32(3), f32(4))); let _e58 = vec2(f32(2), f32(3)); b = mat2x2(vec2(f32(1), _e58.x), vec2(_e58.y, f32(4))); let _e73 = vec3(f32(1)); let _e76 = vec3(f32(1)); c = mat3x3(vec3(f32(1), f32(2), f32(3)), vec3(_e73.x, _e73.y, _e73.z), vec3(_e76.x, _e76.y, _e76.z)); let _e93 = vec2(f32(2)); let _e97 = vec3(f32(1)); let _e100 = vec3(f32(1)); d = mat3x3(vec3(_e93.x, _e93.y, f32(1)), vec3(_e97.x, _e97.y, _e97.z), vec3(_e100.x, _e100.y, _e100.z)); let _e117 = vec2(f32(2)); let _e120 = vec4(f32(1)); let _e123 = vec2(f32(2)); let _e126 = vec4(f32(1)); let _e129 = vec4(f32(1)); e = mat4x4(vec4(_e117.x, _e117.y, _e120.x, _e120.y), vec4(_e120.z, _e120.w, _e123.x, _e123.y), vec4(_e126.x, _e126.y, _e126.z, _e126.w), vec4(_e129.x, _e129.y, _e129.z, _e129.w)); return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/math-functions-vert.wgsl ================================================ fn main_1() { var a: vec4; var b: vec4; var m: mat4x4; var i: i32; var ceilOut: vec4; var roundOut: vec4; var floorOut: vec4; var fractOut: vec4; var truncOut: vec4; var sinOut: vec4; var absOut: vec4; var sqrtOut: vec4; var inversesqrtOut: vec4; var expOut: vec4; var exp2Out: vec4; var signOut: vec4; var transposeOut: mat4x4; var normalizeOut: vec4; var sinhOut: vec4; var cosOut: vec4; var coshOut: vec4; var tanOut: vec4; var tanhOut: vec4; var acosOut: vec4; var asinOut: vec4; var logOut: vec4; var log2Out: vec4; var lengthOut: f32; var determinantOut: f32; var bitCountOut: i32; var bitfieldReverseOut: i32; var atanOut: f32; var atan2Out: f32; var modOut: f32; var powOut: vec4; var dotOut: f32; var maxOut: vec4; var minOut: vec4; var reflectOut: vec4; var crossOut: vec3; var outerProductOut: mat4x4; var distanceOut: f32; var stepOut: vec4; var rad: vec4; var deg: f32; var smoothStepScalar: f32; var smoothStepVector: vec4; var smoothStepMixed: vec4; a = vec4(1.0); b = vec4(2.0); let _e6 = a; let _e7 = b; let _e8 = a; let _e9 = b; m = mat4x4(vec4(_e6.x, _e6.y, _e6.z, _e6.w), vec4(_e7.x, _e7.y, _e7.z, _e7.w), vec4(_e8.x, _e8.y, _e8.z, _e8.w), vec4(_e9.x, _e9.y, _e9.z, _e9.w)); i = 5; _ = a; let _e35 = a; ceilOut = ceil(_e35); _ = a; let _e39 = a; roundOut = round(_e39); _ = a; let _e43 = a; floorOut = floor(_e43); _ = a; let _e47 = a; fractOut = fract(_e47); _ = a; let _e51 = a; truncOut = trunc(_e51); _ = a; let _e55 = a; sinOut = sin(_e55); _ = a; let _e59 = a; absOut = abs(_e59); _ = a; let _e63 = a; sqrtOut = sqrt(_e63); _ = a; let _e67 = a; inversesqrtOut = inverseSqrt(_e67); _ = a; let _e71 = a; expOut = exp(_e71); _ = a; let _e75 = a; exp2Out = exp2(_e75); _ = a; let _e79 = a; signOut = sign(_e79); _ = m; let _e83 = m; transposeOut = transpose(_e83); _ = a; let _e87 = a; normalizeOut = normalize(_e87); _ = a; let _e91 = a; sinhOut = sinh(_e91); _ = a; let _e95 = a; cosOut = cos(_e95); _ = a; let _e99 = a; coshOut = cosh(_e99); _ = a; let _e103 = a; tanOut = tan(_e103); _ = a; let _e107 = a; tanhOut = tanh(_e107); _ = a; let _e111 = a; acosOut = acos(_e111); _ = a; let _e115 = a; asinOut = asin(_e115); _ = a; let _e119 = a; logOut = log(_e119); _ = a; let _e123 = a; log2Out = log2(_e123); _ = a; let _e127 = a; lengthOut = length(_e127); _ = m; let _e131 = m; determinantOut = determinant(_e131); _ = i; let _e135 = i; bitCountOut = countOneBits(_e135); _ = i; let _e139 = i; bitfieldReverseOut = reverseBits(_e139); let _e142 = a; _ = _e142.x; let _e144 = a; atanOut = atan(_e144.x); let _e148 = a; _ = _e148.x; let _e150 = a; _ = _e150.y; let _e152 = a; let _e154 = a; atan2Out = atan2(_e152.x, _e154.y); let _e158 = a; _ = _e158.x; let _e160 = b; _ = _e160.x; let _e162 = a; let _e164 = b; modOut = (_e162.x - (floor((_e162.x / _e164.x)) * _e164.x)); _ = a; _ = b; let _e173 = a; let _e174 = b; powOut = pow(_e173, _e174); _ = a; _ = b; let _e179 = a; let _e180 = b; dotOut = dot(_e179, _e180); _ = a; _ = b; let _e185 = a; let _e186 = b; maxOut = max(_e185, _e186); _ = a; _ = b; let _e191 = a; let _e192 = b; minOut = min(_e191, _e192); _ = a; _ = b; let _e197 = a; let _e198 = b; reflectOut = reflect(_e197, _e198); let _e201 = a; _ = _e201.xyz; let _e203 = b; _ = _e203.xyz; let _e205 = a; let _e207 = b; crossOut = cross(_e205.xyz, _e207.xyz); _ = a; _ = b; let _e213 = a; let _e214 = b; outerProductOut = outerProduct(_e213, _e214); _ = a; _ = b; let _e219 = a; let _e220 = b; distanceOut = distance(_e219, _e220); _ = a; _ = b; let _e225 = a; let _e226 = b; stepOut = step(_e225, _e226); _ = a; let _e230 = a; rad = radians(_e230); let _e233 = a; _ = _e233.x; let _e235 = a; deg = degrees(_e235.x); smoothStepScalar = smoothstep(0.0, 1.0, 0.5); _ = vec4(0.0); _ = vec4(1.0); _ = vec4(0.5); smoothStepVector = smoothstep(vec4(0.0), vec4(1.0), vec4(0.5)); _ = vec4(0.5); smoothStepMixed = smoothstep(vec4(0.0), vec4(1.0), vec4(0.5)); return; } @vertex fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/math-functions.wgsl ================================================ @vertex fn main() { let v = vec4(0.0); let a = degrees(1.0); let b = radians(1.0); let c = degrees(v); let d = radians(v); let e = saturate(v); let const_dot = dot(vec2(0, 0), vec2(0, 0)); let first_leading_bit_abs = firstLeadingBit(abs(0u)); } ================================================ FILE: lib/naga/tests/out/wgsl/multiview.wgsl ================================================ @vertex fn main(@builtin(view_index) view_index: i32) { return; } ================================================ FILE: lib/naga/tests/out/wgsl/operators.wgsl ================================================ struct Foo { a: vec4, b: i32, } let v_f32_one: vec4 = vec4(1.0, 1.0, 1.0, 1.0); let v_f32_zero: vec4 = vec4(0.0, 0.0, 0.0, 0.0); let v_f32_half: vec4 = vec4(0.5, 0.5, 0.5, 0.5); let v_i32_one: vec4 = vec4(1, 1, 1, 1); fn builtins() -> vec4 { let s1_ = select(0, 1, true); let s2_ = select(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), true); let s3_ = select(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(false, false, false, false)); let m1_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), vec4(0.5, 0.5, 0.5, 0.5)); let m2_ = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), 0.10000000149011612); let b1_ = bitcast(vec4(1, 1, 1, 1).x); let b2_ = bitcast>(vec4(1, 1, 1, 1)); let v_i32_zero = vec4(vec4(0.0, 0.0, 0.0, 0.0)); return (((((vec4((vec4(s1_) + v_i32_zero)) + s2_) + m1_) + m2_) + vec4(b1_)) + b2_); } fn splat() -> vec4 { let a_2 = (((vec2(1.0) + vec2(2.0)) - vec2(3.0)) / vec2(4.0)); let b = (vec4(5) % vec4(2)); return (a_2.xyxy + vec4(b)); } fn splat_assignment() -> vec2 { var a: vec2; a = vec2(2.0); let _e7 = a; a = (_e7 + vec2(1.0)); let _e11 = a; a = (_e11 - vec2(3.0)); let _e15 = a; a = (_e15 / vec2(4.0)); let _e19 = a; return _e19; } fn bool_cast(x: vec3) -> vec3 { let y = vec3(x); return vec3(y); } fn constructors() -> f32 { var foo: Foo; foo = Foo(vec4(1.0), 1); let mat2comp = mat2x2(vec2(1.0, 0.0), vec2(0.0, 1.0)); let mat4comp = mat4x4(vec4(1.0, 0.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); _ = vec2(0u); _ = mat2x2(vec2(0.0), vec2(0.0)); _ = array(0, 1, 2, 3); _ = bool(false); _ = i32(0); _ = u32(0u); _ = f32(0.0); _ = vec2(vec2(0u, 0u)); _ = mat2x3(mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = bitcast>(vec2(0u, 0u)); _ = mat2x3(mat2x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); let _e75 = foo.a.x; return _e75; } fn logical() { _ = !(true); _ = !(vec2(true)); _ = (true || false); _ = (true && false); _ = (true | false); _ = (vec3(true) | vec3(false)); _ = (true & false); _ = (vec4(true) & vec4(false)); } fn arithmetic() { _ = -(vec2(1)); _ = -(vec2(1.0)); _ = (2 + 1); _ = (2u + 1u); _ = (2.0 + 1.0); _ = (vec2(2) + vec2(1)); _ = (vec3(2u) + vec3(1u)); _ = (vec4(2.0) + vec4(1.0)); _ = (2 - 1); _ = (2u - 1u); _ = (2.0 - 1.0); _ = (vec2(2) - vec2(1)); _ = (vec3(2u) - vec3(1u)); _ = (vec4(2.0) - vec4(1.0)); _ = (2 * 1); _ = (2u * 1u); _ = (2.0 * 1.0); _ = (vec2(2) * vec2(1)); _ = (vec3(2u) * vec3(1u)); _ = (vec4(2.0) * vec4(1.0)); _ = (2 / 1); _ = (2u / 1u); _ = (2.0 / 1.0); _ = (vec2(2) / vec2(1)); _ = (vec3(2u) / vec3(1u)); _ = (vec4(2.0) / vec4(1.0)); _ = (2 % 1); _ = (2u % 1u); _ = (2.0 % 1.0); _ = (vec2(2) % vec2(1)); _ = (vec3(2u) % vec3(1u)); _ = (vec4(2.0) % vec4(1.0)); _ = (vec2(2) + vec2(1)); _ = (vec2(2) + vec2(1)); _ = (vec2(2u) + vec2(1u)); _ = (vec2(2u) + vec2(1u)); _ = (vec2(2.0) + vec2(1.0)); _ = (vec2(2.0) + vec2(1.0)); _ = (vec2(2) - vec2(1)); _ = (vec2(2) - vec2(1)); _ = (vec2(2u) - vec2(1u)); _ = (vec2(2u) - vec2(1u)); _ = (vec2(2.0) - vec2(1.0)); _ = (vec2(2.0) - vec2(1.0)); _ = (vec2(2) * 1); _ = (2 * vec2(1)); _ = (vec2(2u) * 1u); _ = (2u * vec2(1u)); _ = (vec2(2.0) * 1.0); _ = (2.0 * vec2(1.0)); _ = (vec2(2) / vec2(1)); _ = (vec2(2) / vec2(1)); _ = (vec2(2u) / vec2(1u)); _ = (vec2(2u) / vec2(1u)); _ = (vec2(2.0) / vec2(1.0)); _ = (vec2(2.0) / vec2(1.0)); _ = (vec2(2) % vec2(1)); _ = (vec2(2) % vec2(1)); _ = (vec2(2u) % vec2(1u)); _ = (vec2(2u) % vec2(1u)); _ = (vec2(2.0) % vec2(1.0)); _ = (vec2(2.0) % vec2(1.0)); _ = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) + mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) - mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = (mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * 1.0); _ = (2.0 * mat3x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * vec4(1.0)); _ = (vec3(2.0) * mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0))); _ = (mat4x3(vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0)) * mat3x4(vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0))); } fn bit() { _ = ~(1); _ = ~(1u); _ = !(vec2(1)); _ = !(vec3(1u)); _ = (2 | 1); _ = (2u | 1u); _ = (vec2(2) | vec2(1)); _ = (vec3(2u) | vec3(1u)); _ = (2 & 1); _ = (2u & 1u); _ = (vec2(2) & vec2(1)); _ = (vec3(2u) & vec3(1u)); _ = (2 ^ 1); _ = (2u ^ 1u); _ = (vec2(2) ^ vec2(1)); _ = (vec3(2u) ^ vec3(1u)); _ = (2 << 1u); _ = (2u << 1u); _ = (vec2(2) << vec2(1u)); _ = (vec3(2u) << vec3(1u)); _ = (2 >> 1u); _ = (2u >> 1u); _ = (vec2(2) >> vec2(1u)); _ = (vec3(2u) >> vec3(1u)); } fn comparison() { _ = (2 == 1); _ = (2u == 1u); _ = (2.0 == 1.0); _ = (vec2(2) == vec2(1)); _ = (vec3(2u) == vec3(1u)); _ = (vec4(2.0) == vec4(1.0)); _ = (2 != 1); _ = (2u != 1u); _ = (2.0 != 1.0); _ = (vec2(2) != vec2(1)); _ = (vec3(2u) != vec3(1u)); _ = (vec4(2.0) != vec4(1.0)); _ = (2 < 1); _ = (2u < 1u); _ = (2.0 < 1.0); _ = (vec2(2) < vec2(1)); _ = (vec3(2u) < vec3(1u)); _ = (vec4(2.0) < vec4(1.0)); _ = (2 <= 1); _ = (2u <= 1u); _ = (2.0 <= 1.0); _ = (vec2(2) <= vec2(1)); _ = (vec3(2u) <= vec3(1u)); _ = (vec4(2.0) <= vec4(1.0)); _ = (2 > 1); _ = (2u > 1u); _ = (2.0 > 1.0); _ = (vec2(2) > vec2(1)); _ = (vec3(2u) > vec3(1u)); _ = (vec4(2.0) > vec4(1.0)); _ = (2 >= 1); _ = (2u >= 1u); _ = (2.0 >= 1.0); _ = (vec2(2) >= vec2(1)); _ = (vec3(2u) >= vec3(1u)); _ = (vec4(2.0) >= vec4(1.0)); } fn assignment() { var a_1: i32 = 1; var vec0_: vec3 = vec3(0, 0, 0); let _e6 = a_1; a_1 = (_e6 + 1); let _e9 = a_1; a_1 = (_e9 - 1); let _e12 = a_1; let _e13 = a_1; a_1 = (_e12 * _e13); let _e15 = a_1; let _e16 = a_1; a_1 = (_e15 / _e16); let _e18 = a_1; a_1 = (_e18 % 1); let _e21 = a_1; a_1 = (_e21 & 0); let _e24 = a_1; a_1 = (_e24 | 0); let _e27 = a_1; a_1 = (_e27 ^ 0); let _e30 = a_1; a_1 = (_e30 << 2u); let _e33 = a_1; a_1 = (_e33 >> 1u); let _e36 = a_1; a_1 = (_e36 + 1); let _e39 = a_1; a_1 = (_e39 - 1); let _e46 = vec0_.y; vec0_.y = (_e46 + 1); let _e51 = vec0_.y; vec0_.y = (_e51 - 1); return; } @compute @workgroup_size(1, 1, 1) fn main() { let _e4 = builtins(); let _e5 = splat(); let _e7 = bool_cast(vec4(1.0, 1.0, 1.0, 1.0).xyz); let _e8 = constructors(); logical(); arithmetic(); bit(); comparison(); assignment(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/padding.wgsl ================================================ struct S { a: vec3, } struct Test { a: S, b: f32, } struct Test2_ { a: array,2>, b: f32, } struct Test3_ { a: mat4x3, b: f32, } @group(0) @binding(0) var input1_: Test; @group(0) @binding(1) var input2_: Test2_; @group(0) @binding(2) var input3_: Test3_; @vertex fn vertex() -> @builtin(position) vec4 { let _e6 = input1_.b; let _e9 = input2_.b; let _e12 = input3_.b; return (((vec4(1.0) * _e6) * _e9) * _e12); } ================================================ FILE: lib/naga/tests/out/wgsl/pointers.wgsl ================================================ struct DynamicArray { arr: array, } @group(0) @binding(0) var dynamic_array: DynamicArray; fn f() { var v: vec2; let px = (&v.x); (*px) = 10; return; } fn index_unsized(i: i32, v_1: u32) { let val = dynamic_array.arr[i]; dynamic_array.arr[i] = (val + v_1); return; } fn index_dynamic_array(i_1: i32, v_2: u32) { let p = (&dynamic_array.arr); let val_1 = (*p)[i_1]; (*p)[i_1] = (val_1 + v_2); return; } ================================================ FILE: lib/naga/tests/out/wgsl/prepostfix-frag.wgsl ================================================ fn main_1() { var scalar_target: i32; var scalar: i32; var vec_target: vec2; var vec_: vec2; var mat_target: mat4x3; var mat_: mat4x3; scalar = 1; let _e3 = scalar; scalar = (_e3 + 1); scalar_target = _e3; let _e6 = scalar; let _e8 = (_e6 - 1); scalar = _e8; scalar_target = _e8; vec_ = vec2(u32(1)); let _e14 = vec_; vec_ = (_e14 - vec2(1u)); vec_target = _e14; let _e18 = vec_; let _e21 = (_e18 + vec2(1u)); vec_ = _e21; vec_target = _e21; let _e24 = f32(1); mat_ = mat4x3(vec3(_e24, 0.0, 0.0), vec3(0.0, _e24, 0.0), vec3(0.0, 0.0, _e24), vec3(0.0, 0.0, 0.0)); let _e32 = mat_; let _e34 = vec3(1.0); mat_ = (_e32 + mat4x3(_e34, _e34, _e34, _e34)); mat_target = _e32; let _e37 = mat_; let _e39 = vec3(1.0); let _e41 = (_e37 - mat4x3(_e39, _e39, _e39, _e39)); mat_ = _e41; mat_target = _e41; return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/quad-vert.wgsl ================================================ struct gl_PerVertex { @builtin(position) gl_Position: vec4, } struct VertexOutput { @location(0) member: vec2, @builtin(position) gl_Position: vec4, } var v_uv: vec2; var a_uv_1: vec2; var perVertexStruct: gl_PerVertex = gl_PerVertex(vec4(0.0, 0.0, 0.0, 1.0), ); var a_pos_1: vec2; fn main_1() { let _e12 = a_uv_1; v_uv = _e12; let _e13 = a_pos_1; perVertexStruct.gl_Position = vec4(_e13.x, _e13.y, 0.0, 1.0); return; } @vertex fn main(@location(1) a_uv: vec2, @location(0) a_pos: vec2) -> VertexOutput { a_uv_1 = a_uv; a_pos_1 = a_pos; main_1(); let _e7 = v_uv; let _e8 = perVertexStruct.gl_Position; return VertexOutput(_e7, _e8); } ================================================ FILE: lib/naga/tests/out/wgsl/quad.wgsl ================================================ struct VertexOutput { @location(0) uv: vec2, @builtin(position) position: vec4, } let c_scale: f32 = 1.2000000476837158; @group(0) @binding(0) var u_texture: texture_2d; @group(0) @binding(1) var u_sampler: sampler; @vertex fn vert_main(@location(0) pos: vec2, @location(1) uv: vec2) -> VertexOutput { return VertexOutput(uv, vec4((c_scale * pos), 0.0, 1.0)); } @fragment fn frag_main(@location(0) uv_1: vec2) -> @location(0) vec4 { let color = textureSample(u_texture, u_sampler, uv_1); if (color.w == 0.0) { discard; } let premultiplied = (color.w * color); return premultiplied; } @fragment fn fs_extra() -> @location(0) vec4 { return vec4(0.0, 0.5, 0.0, 0.5); } ================================================ FILE: lib/naga/tests/out/wgsl/quad_glsl-frag.wgsl ================================================ struct FragmentOutput { @location(0) o_color: vec4, } var v_uv_1: vec2; var o_color: vec4; fn main_1() { o_color = vec4(1.0, 1.0, 1.0, 1.0); return; } @fragment fn main(@location(0) v_uv: vec2) -> FragmentOutput { v_uv_1 = v_uv; main_1(); let _e7 = o_color; return FragmentOutput(_e7); } ================================================ FILE: lib/naga/tests/out/wgsl/quad_glsl-vert.wgsl ================================================ struct VertexOutput { @location(0) v_uv: vec2, @builtin(position) member: vec4, } var a_pos_1: vec2; var a_uv_1: vec2; var v_uv: vec2; var gl_Position: vec4; fn main_1() { let _e4 = a_uv_1; v_uv = _e4; let _e6 = a_pos_1; let _e7 = (1.2000000476837158 * _e6); gl_Position = vec4(_e7.x, _e7.y, 0.0, 1.0); return; } @vertex fn main(@location(0) a_pos: vec2, @location(1) a_uv: vec2) -> VertexOutput { a_pos_1 = a_pos; a_uv_1 = a_uv; main_1(); let _e14 = v_uv; let _e16 = gl_Position; return VertexOutput(_e14, _e16); } ================================================ FILE: lib/naga/tests/out/wgsl/sampler-functions-frag.wgsl ================================================ fn CalcShadowPCF1_(T_P_t_TextureDepth: texture_depth_2d, S_P_t_TextureDepth: sampler_comparison, t_ProjCoord: vec3) -> f32 { var t_ProjCoord_1: vec3; var t_Res: f32; t_ProjCoord_1 = t_ProjCoord; t_Res = 0.0; let _e6 = t_Res; let _e7 = t_ProjCoord_1; _ = _e7.xyz; let _e9 = t_ProjCoord_1; let _e10 = _e9.xyz; let _e13 = textureSampleCompare(T_P_t_TextureDepth, S_P_t_TextureDepth, _e10.xy, _e10.z); t_Res = (_e6 + (_e13 * (1.0 / 5.0))); let _e19 = t_Res; return _e19; } fn CalcShadowPCF(T_P_t_TextureDepth_1: texture_depth_2d, S_P_t_TextureDepth_1: sampler_comparison, t_ProjCoord_2: vec3, t_Bias: f32) -> f32 { var t_ProjCoord_3: vec3; var t_Bias_1: f32; t_ProjCoord_3 = t_ProjCoord_2; t_Bias_1 = t_Bias; let _e7 = t_ProjCoord_3; let _e9 = t_Bias_1; t_ProjCoord_3.z = (_e7.z + _e9); let _e11 = t_ProjCoord_3; _ = _e11.xyz; let _e13 = t_ProjCoord_3; let _e15 = CalcShadowPCF1_(T_P_t_TextureDepth_1, S_P_t_TextureDepth_1, _e13.xyz); return _e15; } fn main_1() { return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/samplers-frag.wgsl ================================================ @group(1) @binding(0) var tex1D: texture_1d; @group(1) @binding(1) var tex1DArray: texture_1d_array; @group(1) @binding(2) var tex2D: texture_2d; @group(1) @binding(3) var tex2DArray: texture_2d_array; @group(1) @binding(4) var texCube: texture_cube; @group(1) @binding(5) var texCubeArray: texture_cube_array; @group(1) @binding(6) var tex3D: texture_3d; @group(1) @binding(7) var samp: sampler; @group(1) @binding(12) var tex2DShadow: texture_depth_2d; @group(1) @binding(13) var tex2DArrayShadow: texture_depth_2d_array; @group(1) @binding(14) var texCubeShadow: texture_depth_cube; @group(1) @binding(15) var texCubeArrayShadow: texture_depth_cube_array; @group(1) @binding(16) var tex3DShadow: texture_3d; @group(1) @binding(17) var sampShadow: sampler_comparison; @group(0) @binding(18) var tex2DMS: texture_multisampled_2d; @group(0) @binding(19) var tex2DMSArray: texture_multisampled_2d_array; fn testTex1D(coord: f32) { var coord_1: f32; var size1D: i32; var c: vec4; coord_1 = coord; let _e20 = textureDimensions(tex1D, 0); size1D = _e20; _ = coord_1; let _e24 = coord_1; let _e25 = textureSample(tex1D, samp, _e24); c = _e25; _ = coord_1; let _e28 = coord_1; let _e30 = textureSampleBias(tex1D, samp, _e28, 2.0); c = _e30; _ = coord_1; let _e34 = coord_1; let _e37 = textureSampleGrad(tex1D, samp, _e34, 4.0, 4.0); c = _e37; _ = coord_1; let _e42 = coord_1; let _e46 = textureSampleGrad(tex1D, samp, _e42, 4.0, 4.0, 5); c = _e46; _ = coord_1; let _e49 = coord_1; let _e51 = textureSampleLevel(tex1D, samp, _e49, 3.0); c = _e51; _ = coord_1; let _e55 = coord_1; let _e58 = textureSampleLevel(tex1D, samp, _e55, 3.0, 5); c = _e58; _ = coord_1; let _e61 = coord_1; let _e63 = textureSample(tex1D, samp, _e61, 5); c = _e63; _ = coord_1; let _e67 = coord_1; let _e70 = textureSampleBias(tex1D, samp, _e67, 2.0, 5); c = _e70; let _e71 = coord_1; _ = vec2(_e71, 6.0); let _e74 = coord_1; let _e76 = vec2(_e74, 6.0); let _e80 = textureSample(tex1D, samp, (_e76.x / _e76.y)); c = _e80; let _e81 = coord_1; _ = vec4(_e81, 0.0, 0.0, 6.0); let _e86 = coord_1; let _e90 = vec4(_e86, 0.0, 0.0, 6.0); let _e96 = textureSample(tex1D, samp, (_e90.xyz / vec3(_e90.w)).x); c = _e96; let _e97 = coord_1; _ = vec2(_e97, 6.0); let _e101 = coord_1; let _e103 = vec2(_e101, 6.0); let _e108 = textureSampleBias(tex1D, samp, (_e103.x / _e103.y), 2.0); c = _e108; let _e109 = coord_1; _ = vec4(_e109, 0.0, 0.0, 6.0); let _e115 = coord_1; let _e119 = vec4(_e115, 0.0, 0.0, 6.0); let _e126 = textureSampleBias(tex1D, samp, (_e119.xyz / vec3(_e119.w)).x, 2.0); c = _e126; let _e127 = coord_1; _ = vec2(_e127, 6.0); let _e132 = coord_1; let _e134 = vec2(_e132, 6.0); let _e140 = textureSampleGrad(tex1D, samp, (_e134.x / _e134.y), 4.0, 4.0); c = _e140; let _e141 = coord_1; _ = vec4(_e141, 0.0, 0.0, 6.0); let _e148 = coord_1; let _e152 = vec4(_e148, 0.0, 0.0, 6.0); let _e160 = textureSampleGrad(tex1D, samp, (_e152.xyz / vec3(_e152.w)).x, 4.0, 4.0); c = _e160; let _e161 = coord_1; _ = vec2(_e161, 6.0); let _e167 = coord_1; let _e169 = vec2(_e167, 6.0); let _e176 = textureSampleGrad(tex1D, samp, (_e169.x / _e169.y), 4.0, 4.0, 5); c = _e176; let _e177 = coord_1; _ = vec4(_e177, 0.0, 0.0, 6.0); let _e185 = coord_1; let _e189 = vec4(_e185, 0.0, 0.0, 6.0); let _e198 = textureSampleGrad(tex1D, samp, (_e189.xyz / vec3(_e189.w)).x, 4.0, 4.0, 5); c = _e198; let _e199 = coord_1; _ = vec2(_e199, 6.0); let _e203 = coord_1; let _e205 = vec2(_e203, 6.0); let _e210 = textureSampleLevel(tex1D, samp, (_e205.x / _e205.y), 3.0); c = _e210; let _e211 = coord_1; _ = vec4(_e211, 0.0, 0.0, 6.0); let _e217 = coord_1; let _e221 = vec4(_e217, 0.0, 0.0, 6.0); let _e228 = textureSampleLevel(tex1D, samp, (_e221.xyz / vec3(_e221.w)).x, 3.0); c = _e228; let _e229 = coord_1; _ = vec2(_e229, 6.0); let _e234 = coord_1; let _e236 = vec2(_e234, 6.0); let _e242 = textureSampleLevel(tex1D, samp, (_e236.x / _e236.y), 3.0, 5); c = _e242; let _e243 = coord_1; _ = vec4(_e243, 0.0, 0.0, 6.0); let _e250 = coord_1; let _e254 = vec4(_e250, 0.0, 0.0, 6.0); let _e262 = textureSampleLevel(tex1D, samp, (_e254.xyz / vec3(_e254.w)).x, 3.0, 5); c = _e262; let _e263 = coord_1; _ = vec2(_e263, 6.0); let _e267 = coord_1; let _e269 = vec2(_e267, 6.0); let _e274 = textureSample(tex1D, samp, (_e269.x / _e269.y), 5); c = _e274; let _e275 = coord_1; _ = vec4(_e275, 0.0, 0.0, 6.0); let _e281 = coord_1; let _e285 = vec4(_e281, 0.0, 0.0, 6.0); let _e292 = textureSample(tex1D, samp, (_e285.xyz / vec3(_e285.w)).x, 5); c = _e292; let _e293 = coord_1; _ = vec2(_e293, 6.0); let _e298 = coord_1; let _e300 = vec2(_e298, 6.0); let _e306 = textureSampleBias(tex1D, samp, (_e300.x / _e300.y), 2.0, 5); c = _e306; let _e307 = coord_1; _ = vec4(_e307, 0.0, 0.0, 6.0); let _e314 = coord_1; let _e318 = vec4(_e314, 0.0, 0.0, 6.0); let _e326 = textureSampleBias(tex1D, samp, (_e318.xyz / vec3(_e318.w)).x, 2.0, 5); c = _e326; let _e327 = coord_1; _ = i32(_e327); let _e330 = coord_1; let _e333 = textureLoad(tex1D, i32(_e330), 3); c = _e333; let _e334 = coord_1; _ = i32(_e334); let _e338 = coord_1; let _e342 = textureLoad(tex1D, i32(_e338), 3); c = _e342; return; } fn testTex1DArray(coord_2: vec2) { var coord_3: vec2; var size1DArray: vec2; var c_1: vec4; coord_3 = coord_2; let _e20 = textureDimensions(tex1DArray, 0); let _e21 = textureNumLayers(tex1DArray); size1DArray = vec2(_e20, _e21); _ = coord_3; let _e26 = coord_3; let _e30 = textureSample(tex1DArray, samp, _e26.x, i32(_e26.y)); c_1 = _e30; _ = coord_3; let _e33 = coord_3; let _e38 = textureSampleBias(tex1DArray, samp, _e33.x, i32(_e33.y), 2.0); c_1 = _e38; _ = coord_3; let _e42 = coord_3; let _e48 = textureSampleGrad(tex1DArray, samp, _e42.x, i32(_e42.y), 4.0, 4.0); c_1 = _e48; _ = coord_3; let _e53 = coord_3; let _e60 = textureSampleGrad(tex1DArray, samp, _e53.x, i32(_e53.y), 4.0, 4.0, 5); c_1 = _e60; _ = coord_3; let _e63 = coord_3; let _e68 = textureSampleLevel(tex1DArray, samp, _e63.x, i32(_e63.y), 3.0); c_1 = _e68; _ = coord_3; let _e72 = coord_3; let _e78 = textureSampleLevel(tex1DArray, samp, _e72.x, i32(_e72.y), 3.0, 5); c_1 = _e78; _ = coord_3; let _e81 = coord_3; let _e86 = textureSample(tex1DArray, samp, _e81.x, i32(_e81.y), 5); c_1 = _e86; _ = coord_3; let _e90 = coord_3; let _e96 = textureSampleBias(tex1DArray, samp, _e90.x, i32(_e90.y), 2.0, 5); c_1 = _e96; let _e97 = coord_3; _ = vec2(_e97); let _e100 = coord_3; let _e101 = vec2(_e100); let _e105 = textureLoad(tex1DArray, _e101.x, _e101.y, 3); c_1 = _e105; let _e106 = coord_3; _ = vec2(_e106); let _e110 = coord_3; let _e111 = vec2(_e110); let _e116 = textureLoad(tex1DArray, _e111.x, _e111.y, 3); c_1 = _e116; return; } fn testTex2D(coord_4: vec2) { var coord_5: vec2; var size2D: vec2; var c_2: vec4; coord_5 = coord_4; let _e20 = textureDimensions(tex2D, 0); size2D = _e20; _ = coord_5; let _e24 = coord_5; let _e25 = textureSample(tex2D, samp, _e24); c_2 = _e25; _ = coord_5; let _e28 = coord_5; let _e30 = textureSampleBias(tex2D, samp, _e28, 2.0); c_2 = _e30; _ = coord_5; _ = vec2(4.0); _ = vec2(4.0); let _e36 = coord_5; let _e41 = textureSampleGrad(tex2D, samp, _e36, vec2(4.0), vec2(4.0)); c_2 = _e41; _ = coord_5; _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e49 = coord_5; _ = vec2(5); let _e56 = textureSampleGrad(tex2D, samp, _e49, vec2(4.0), vec2(4.0), vec2(5, 5)); c_2 = _e56; _ = coord_5; let _e59 = coord_5; let _e61 = textureSampleLevel(tex2D, samp, _e59, 3.0); c_2 = _e61; _ = coord_5; _ = vec2(5); let _e66 = coord_5; _ = vec2(5); let _e70 = textureSampleLevel(tex2D, samp, _e66, 3.0, vec2(5, 5)); c_2 = _e70; _ = coord_5; _ = vec2(5); let _e74 = coord_5; _ = vec2(5); let _e77 = textureSample(tex2D, samp, _e74, vec2(5, 5)); c_2 = _e77; _ = coord_5; _ = vec2(5); let _e82 = coord_5; _ = vec2(5); let _e86 = textureSampleBias(tex2D, samp, _e82, 2.0, vec2(5, 5)); c_2 = _e86; let _e87 = coord_5; _ = vec3(_e87.x, _e87.y, 6.0); let _e92 = coord_5; let _e96 = vec3(_e92.x, _e92.y, 6.0); let _e101 = textureSample(tex2D, samp, (_e96.xy / vec2(_e96.z))); c_2 = _e101; let _e102 = coord_5; _ = vec4(_e102.x, _e102.y, 0.0, 6.0); let _e108 = coord_5; let _e113 = vec4(_e108.x, _e108.y, 0.0, 6.0); let _e119 = textureSample(tex2D, samp, (_e113.xyz / vec3(_e113.w)).xy); c_2 = _e119; let _e120 = coord_5; _ = vec3(_e120.x, _e120.y, 6.0); let _e126 = coord_5; let _e130 = vec3(_e126.x, _e126.y, 6.0); let _e136 = textureSampleBias(tex2D, samp, (_e130.xy / vec2(_e130.z)), 2.0); c_2 = _e136; let _e137 = coord_5; _ = vec4(_e137.x, _e137.y, 0.0, 6.0); let _e144 = coord_5; let _e149 = vec4(_e144.x, _e144.y, 0.0, 6.0); let _e156 = textureSampleBias(tex2D, samp, (_e149.xyz / vec3(_e149.w)).xy, 2.0); c_2 = _e156; let _e157 = coord_5; _ = vec3(_e157.x, _e157.y, 6.0); _ = vec2(4.0); _ = vec2(4.0); let _e166 = coord_5; let _e170 = vec3(_e166.x, _e166.y, 6.0); let _e179 = textureSampleGrad(tex2D, samp, (_e170.xy / vec2(_e170.z)), vec2(4.0), vec2(4.0)); c_2 = _e179; let _e180 = coord_5; _ = vec4(_e180.x, _e180.y, 0.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); let _e190 = coord_5; let _e195 = vec4(_e190.x, _e190.y, 0.0, 6.0); let _e205 = textureSampleGrad(tex2D, samp, (_e195.xyz / vec3(_e195.w)).xy, vec2(4.0), vec2(4.0)); c_2 = _e205; let _e206 = coord_5; _ = vec3(_e206.x, _e206.y, 6.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e217 = coord_5; let _e221 = vec3(_e217.x, _e217.y, 6.0); _ = vec2(5); let _e232 = textureSampleGrad(tex2D, samp, (_e221.xy / vec2(_e221.z)), vec2(4.0), vec2(4.0), vec2(5, 5)); c_2 = _e232; let _e233 = coord_5; _ = vec4(_e233.x, _e233.y, 0.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e245 = coord_5; let _e250 = vec4(_e245.x, _e245.y, 0.0, 6.0); _ = vec2(5); let _e262 = textureSampleGrad(tex2D, samp, (_e250.xyz / vec3(_e250.w)).xy, vec2(4.0), vec2(4.0), vec2(5, 5)); c_2 = _e262; let _e263 = coord_5; _ = vec3(_e263.x, _e263.y, 6.0); let _e269 = coord_5; let _e273 = vec3(_e269.x, _e269.y, 6.0); let _e279 = textureSampleLevel(tex2D, samp, (_e273.xy / vec2(_e273.z)), 3.0); c_2 = _e279; let _e280 = coord_5; _ = vec4(_e280.x, _e280.y, 0.0, 6.0); let _e287 = coord_5; let _e292 = vec4(_e287.x, _e287.y, 0.0, 6.0); let _e299 = textureSampleLevel(tex2D, samp, (_e292.xyz / vec3(_e292.w)).xy, 3.0); c_2 = _e299; let _e300 = coord_5; _ = vec3(_e300.x, _e300.y, 6.0); _ = vec2(5); let _e308 = coord_5; let _e312 = vec3(_e308.x, _e308.y, 6.0); _ = vec2(5); let _e320 = textureSampleLevel(tex2D, samp, (_e312.xy / vec2(_e312.z)), 3.0, vec2(5, 5)); c_2 = _e320; let _e321 = coord_5; _ = vec4(_e321.x, _e321.y, 0.0, 6.0); _ = vec2(5); let _e330 = coord_5; let _e335 = vec4(_e330.x, _e330.y, 0.0, 6.0); _ = vec2(5); let _e344 = textureSampleLevel(tex2D, samp, (_e335.xyz / vec3(_e335.w)).xy, 3.0, vec2(5, 5)); c_2 = _e344; let _e345 = coord_5; _ = vec3(_e345.x, _e345.y, 6.0); _ = vec2(5); let _e352 = coord_5; let _e356 = vec3(_e352.x, _e352.y, 6.0); _ = vec2(5); let _e363 = textureSample(tex2D, samp, (_e356.xy / vec2(_e356.z)), vec2(5, 5)); c_2 = _e363; let _e364 = coord_5; _ = vec4(_e364.x, _e364.y, 0.0, 6.0); _ = vec2(5); let _e372 = coord_5; let _e377 = vec4(_e372.x, _e372.y, 0.0, 6.0); _ = vec2(5); let _e385 = textureSample(tex2D, samp, (_e377.xyz / vec3(_e377.w)).xy, vec2(5, 5)); c_2 = _e385; let _e386 = coord_5; _ = vec3(_e386.x, _e386.y, 6.0); _ = vec2(5); let _e394 = coord_5; let _e398 = vec3(_e394.x, _e394.y, 6.0); _ = vec2(5); let _e406 = textureSampleBias(tex2D, samp, (_e398.xy / vec2(_e398.z)), 2.0, vec2(5, 5)); c_2 = _e406; let _e407 = coord_5; _ = vec4(_e407.x, _e407.y, 0.0, 6.0); _ = vec2(5); let _e416 = coord_5; let _e421 = vec4(_e416.x, _e416.y, 0.0, 6.0); _ = vec2(5); let _e430 = textureSampleBias(tex2D, samp, (_e421.xyz / vec3(_e421.w)).xy, 2.0, vec2(5, 5)); c_2 = _e430; let _e431 = coord_5; _ = vec2(_e431); let _e434 = coord_5; let _e437 = textureLoad(tex2D, vec2(_e434), 3); c_2 = _e437; let _e438 = coord_5; _ = vec2(_e438); _ = vec2(5); let _e443 = coord_5; _ = vec2(5); let _e448 = textureLoad(tex2D, vec2(_e443), 3); c_2 = _e448; return; } fn testTex2DShadow(coord_6: vec2) { var coord_7: vec2; var size2DShadow: vec2; var d: f32; coord_7 = coord_6; let _e20 = textureDimensions(tex2DShadow, 0); size2DShadow = _e20; let _e23 = coord_7; _ = vec3(_e23.x, _e23.y, 1.0); let _e28 = coord_7; let _e32 = vec3(_e28.x, _e28.y, 1.0); let _e35 = textureSampleCompare(tex2DShadow, sampShadow, _e32.xy, _e32.z); d = _e35; let _e36 = coord_7; _ = vec3(_e36.x, _e36.y, 1.0); _ = vec2(4.0); _ = vec2(4.0); let _e45 = coord_7; let _e49 = vec3(_e45.x, _e45.y, 1.0); _ = vec2(4.0); _ = vec2(4.0); let _e56 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e49.xy, _e49.z); d = _e56; let _e57 = coord_7; _ = vec3(_e57.x, _e57.y, 1.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e68 = coord_7; let _e72 = vec3(_e68.x, _e68.y, 1.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e81 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e72.xy, _e72.z, vec2(5, 5)); d = _e81; let _e82 = coord_7; _ = vec3(_e82.x, _e82.y, 1.0); let _e88 = coord_7; let _e92 = vec3(_e88.x, _e88.y, 1.0); let _e96 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e92.xy, _e92.z); d = _e96; let _e97 = coord_7; _ = vec3(_e97.x, _e97.y, 1.0); _ = vec2(5); let _e105 = coord_7; let _e109 = vec3(_e105.x, _e105.y, 1.0); _ = vec2(5); let _e115 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e109.xy, _e109.z, vec2(5, 5)); d = _e115; let _e116 = coord_7; _ = vec3(_e116.x, _e116.y, 1.0); _ = vec2(5); let _e123 = coord_7; let _e127 = vec3(_e123.x, _e123.y, 1.0); _ = vec2(5); let _e132 = textureSampleCompare(tex2DShadow, sampShadow, _e127.xy, _e127.z, vec2(5, 5)); d = _e132; let _e133 = coord_7; _ = vec4(_e133.x, _e133.y, 1.0, 6.0); let _e139 = coord_7; let _e144 = vec4(_e139.x, _e139.y, 1.0, 6.0); let _e148 = (_e144.xyz / vec3(_e144.w)); let _e151 = textureSampleCompare(tex2DShadow, sampShadow, _e148.xy, _e148.z); d = _e151; let _e152 = coord_7; _ = vec4(_e152.x, _e152.y, 1.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); let _e162 = coord_7; let _e167 = vec4(_e162.x, _e162.y, 1.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); let _e175 = (_e167.xyz / vec3(_e167.w)); let _e178 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e175.xy, _e175.z); d = _e178; let _e179 = coord_7; _ = vec4(_e179.x, _e179.y, 1.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e191 = coord_7; let _e196 = vec4(_e191.x, _e191.y, 1.0, 6.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e206 = (_e196.xyz / vec3(_e196.w)); let _e209 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e206.xy, _e206.z, vec2(5, 5)); d = _e209; let _e210 = coord_7; _ = vec4(_e210.x, _e210.y, 1.0, 6.0); let _e217 = coord_7; let _e222 = vec4(_e217.x, _e217.y, 1.0, 6.0); let _e227 = (_e222.xyz / vec3(_e222.w)); let _e230 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e227.xy, _e227.z); d = _e230; let _e231 = coord_7; _ = vec4(_e231.x, _e231.y, 1.0, 6.0); _ = vec2(5); let _e240 = coord_7; let _e245 = vec4(_e240.x, _e240.y, 1.0, 6.0); _ = vec2(5); let _e252 = (_e245.xyz / vec3(_e245.w)); let _e255 = textureSampleCompareLevel(tex2DShadow, sampShadow, _e252.xy, _e252.z, vec2(5, 5)); d = _e255; let _e256 = coord_7; _ = vec4(_e256.x, _e256.y, 1.0, 6.0); _ = vec2(5); let _e264 = coord_7; let _e269 = vec4(_e264.x, _e264.y, 1.0, 6.0); _ = vec2(5); let _e275 = (_e269.xyz / vec3(_e269.w)); let _e278 = textureSampleCompare(tex2DShadow, sampShadow, _e275.xy, _e275.z, vec2(5, 5)); d = _e278; return; } fn testTex2DArray(coord_8: vec3) { var coord_9: vec3; var size2DArray: vec3; var c_3: vec4; coord_9 = coord_8; let _e20 = textureDimensions(tex2DArray, 0); let _e23 = textureNumLayers(tex2DArray); size2DArray = vec3(_e20.x, _e20.y, _e23); _ = coord_9; let _e28 = coord_9; let _e32 = textureSample(tex2DArray, samp, _e28.xy, i32(_e28.z)); c_3 = _e32; _ = coord_9; let _e35 = coord_9; let _e40 = textureSampleBias(tex2DArray, samp, _e35.xy, i32(_e35.z), 2.0); c_3 = _e40; _ = coord_9; _ = vec2(4.0); _ = vec2(4.0); let _e46 = coord_9; let _e54 = textureSampleGrad(tex2DArray, samp, _e46.xy, i32(_e46.z), vec2(4.0), vec2(4.0)); c_3 = _e54; _ = coord_9; _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e62 = coord_9; _ = vec2(5); let _e72 = textureSampleGrad(tex2DArray, samp, _e62.xy, i32(_e62.z), vec2(4.0), vec2(4.0), vec2(5, 5)); c_3 = _e72; _ = coord_9; let _e75 = coord_9; let _e80 = textureSampleLevel(tex2DArray, samp, _e75.xy, i32(_e75.z), 3.0); c_3 = _e80; _ = coord_9; _ = vec2(5); let _e85 = coord_9; _ = vec2(5); let _e92 = textureSampleLevel(tex2DArray, samp, _e85.xy, i32(_e85.z), 3.0, vec2(5, 5)); c_3 = _e92; _ = coord_9; _ = vec2(5); let _e96 = coord_9; _ = vec2(5); let _e102 = textureSample(tex2DArray, samp, _e96.xy, i32(_e96.z), vec2(5, 5)); c_3 = _e102; _ = coord_9; _ = vec2(5); let _e107 = coord_9; _ = vec2(5); let _e114 = textureSampleBias(tex2DArray, samp, _e107.xy, i32(_e107.z), 2.0, vec2(5, 5)); c_3 = _e114; let _e115 = coord_9; _ = vec3(_e115); let _e118 = coord_9; let _e119 = vec3(_e118); let _e123 = textureLoad(tex2DArray, _e119.xy, _e119.z, 3); c_3 = _e123; let _e124 = coord_9; _ = vec3(_e124); _ = vec2(5); let _e129 = coord_9; let _e130 = vec3(_e129); _ = vec2(5); let _e136 = textureLoad(tex2DArray, _e130.xy, _e130.z, 3); c_3 = _e136; return; } fn testTex2DArrayShadow(coord_10: vec3) { var coord_11: vec3; var size2DArrayShadow: vec3; var d_1: f32; coord_11 = coord_10; let _e20 = textureDimensions(tex2DArrayShadow, 0); let _e23 = textureNumLayers(tex2DArrayShadow); size2DArrayShadow = vec3(_e20.x, _e20.y, _e23); let _e27 = coord_11; _ = vec4(_e27.x, _e27.y, _e27.z, 1.0); let _e33 = coord_11; let _e38 = vec4(_e33.x, _e33.y, _e33.z, 1.0); let _e43 = textureSampleCompare(tex2DArrayShadow, sampShadow, _e38.xy, i32(_e38.z), _e38.w); d_1 = _e43; let _e44 = coord_11; _ = vec4(_e44.x, _e44.y, _e44.z, 1.0); _ = vec2(4.0); _ = vec2(4.0); let _e54 = coord_11; let _e59 = vec4(_e54.x, _e54.y, _e54.z, 1.0); _ = vec2(4.0); _ = vec2(4.0); let _e68 = textureSampleCompareLevel(tex2DArrayShadow, sampShadow, _e59.xy, i32(_e59.z), _e59.w); d_1 = _e68; let _e69 = coord_11; _ = vec4(_e69.x, _e69.y, _e69.z, 1.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e81 = coord_11; let _e86 = vec4(_e81.x, _e81.y, _e81.z, 1.0); _ = vec2(4.0); _ = vec2(4.0); _ = vec2(5); let _e97 = textureSampleCompareLevel(tex2DArrayShadow, sampShadow, _e86.xy, i32(_e86.z), _e86.w, vec2(5, 5)); d_1 = _e97; let _e98 = coord_11; _ = vec4(_e98.x, _e98.y, _e98.z, 1.0); _ = vec2(5); let _e106 = coord_11; let _e111 = vec4(_e106.x, _e106.y, _e106.z, 1.0); _ = vec2(5); let _e118 = textureSampleCompare(tex2DArrayShadow, sampShadow, _e111.xy, i32(_e111.z), _e111.w, vec2(5, 5)); d_1 = _e118; return; } fn testTexCube(coord_12: vec3) { var coord_13: vec3; var sizeCube: vec2; var c_4: vec4; coord_13 = coord_12; let _e20 = textureDimensions(texCube, 0); sizeCube = _e20; _ = coord_13; let _e24 = coord_13; let _e25 = textureSample(texCube, samp, _e24); c_4 = _e25; _ = coord_13; let _e28 = coord_13; let _e30 = textureSampleBias(texCube, samp, _e28, 2.0); c_4 = _e30; _ = coord_13; _ = vec3(4.0); _ = vec3(4.0); let _e36 = coord_13; let _e41 = textureSampleGrad(texCube, samp, _e36, vec3(4.0), vec3(4.0)); c_4 = _e41; _ = coord_13; let _e44 = coord_13; let _e46 = textureSampleLevel(texCube, samp, _e44, 3.0); c_4 = _e46; return; } fn testTexCubeShadow(coord_14: vec3) { var coord_15: vec3; var sizeCubeShadow: vec2; var d_2: f32; coord_15 = coord_14; let _e20 = textureDimensions(texCubeShadow, 0); sizeCubeShadow = _e20; let _e23 = coord_15; _ = vec4(_e23.x, _e23.y, _e23.z, 1.0); let _e29 = coord_15; let _e34 = vec4(_e29.x, _e29.y, _e29.z, 1.0); let _e37 = textureSampleCompare(texCubeShadow, sampShadow, _e34.xyz, _e34.w); d_2 = _e37; let _e38 = coord_15; _ = vec4(_e38.x, _e38.y, _e38.z, 1.0); _ = vec3(4.0); _ = vec3(4.0); let _e48 = coord_15; let _e53 = vec4(_e48.x, _e48.y, _e48.z, 1.0); _ = vec3(4.0); _ = vec3(4.0); let _e60 = textureSampleCompareLevel(texCubeShadow, sampShadow, _e53.xyz, _e53.w); d_2 = _e60; return; } fn testTexCubeArray(coord_16: vec4) { var coord_17: vec4; var sizeCubeArray: vec3; var c_5: vec4; coord_17 = coord_16; let _e20 = textureDimensions(texCubeArray, 0); let _e23 = textureNumLayers(texCubeArray); sizeCubeArray = vec3(_e20.x, _e20.y, _e23); _ = coord_17; let _e28 = coord_17; let _e32 = textureSample(texCubeArray, samp, _e28.xyz, i32(_e28.w)); c_5 = _e32; _ = coord_17; let _e35 = coord_17; let _e40 = textureSampleBias(texCubeArray, samp, _e35.xyz, i32(_e35.w), 2.0); c_5 = _e40; _ = coord_17; _ = vec3(4.0); _ = vec3(4.0); let _e46 = coord_17; let _e54 = textureSampleGrad(texCubeArray, samp, _e46.xyz, i32(_e46.w), vec3(4.0), vec3(4.0)); c_5 = _e54; _ = coord_17; let _e57 = coord_17; let _e62 = textureSampleLevel(texCubeArray, samp, _e57.xyz, i32(_e57.w), 3.0); c_5 = _e62; return; } fn testTexCubeArrayShadow(coord_18: vec4) { var coord_19: vec4; var sizeCubeArrayShadow: vec3; var d_3: f32; coord_19 = coord_18; let _e20 = textureDimensions(texCubeArrayShadow, 0); let _e23 = textureNumLayers(texCubeArrayShadow); sizeCubeArrayShadow = vec3(_e20.x, _e20.y, _e23); _ = coord_19; let _e29 = coord_19; let _e34 = textureSampleCompare(texCubeArrayShadow, sampShadow, _e29.xyz, i32(_e29.w), 1.0); d_3 = _e34; return; } fn testTex3D(coord_20: vec3) { var coord_21: vec3; var size3D: vec3; var c_6: vec4; coord_21 = coord_20; let _e20 = textureDimensions(tex3D, 0); size3D = _e20; _ = coord_21; let _e24 = coord_21; let _e25 = textureSample(tex3D, samp, _e24); c_6 = _e25; _ = coord_21; let _e28 = coord_21; let _e30 = textureSampleBias(tex3D, samp, _e28, 2.0); c_6 = _e30; let _e31 = coord_21; _ = vec4(_e31.x, _e31.y, _e31.z, 6.0); let _e37 = coord_21; let _e42 = vec4(_e37.x, _e37.y, _e37.z, 6.0); let _e47 = textureSample(tex3D, samp, (_e42.xyz / vec3(_e42.w))); c_6 = _e47; let _e48 = coord_21; _ = vec4(_e48.x, _e48.y, _e48.z, 6.0); let _e55 = coord_21; let _e60 = vec4(_e55.x, _e55.y, _e55.z, 6.0); let _e66 = textureSampleBias(tex3D, samp, (_e60.xyz / vec3(_e60.w)), 2.0); c_6 = _e66; let _e67 = coord_21; _ = vec4(_e67.x, _e67.y, _e67.z, 6.0); _ = vec3(5); let _e75 = coord_21; let _e80 = vec4(_e75.x, _e75.y, _e75.z, 6.0); _ = vec3(5); let _e87 = textureSample(tex3D, samp, (_e80.xyz / vec3(_e80.w)), vec3(5, 5, 5)); c_6 = _e87; let _e88 = coord_21; _ = vec4(_e88.x, _e88.y, _e88.z, 6.0); _ = vec3(5); let _e97 = coord_21; let _e102 = vec4(_e97.x, _e97.y, _e97.z, 6.0); _ = vec3(5); let _e110 = textureSampleBias(tex3D, samp, (_e102.xyz / vec3(_e102.w)), 2.0, vec3(5, 5, 5)); c_6 = _e110; let _e111 = coord_21; _ = vec4(_e111.x, _e111.y, _e111.z, 6.0); let _e118 = coord_21; let _e123 = vec4(_e118.x, _e118.y, _e118.z, 6.0); let _e129 = textureSampleLevel(tex3D, samp, (_e123.xyz / vec3(_e123.w)), 3.0); c_6 = _e129; let _e130 = coord_21; _ = vec4(_e130.x, _e130.y, _e130.z, 6.0); _ = vec3(5); let _e139 = coord_21; let _e144 = vec4(_e139.x, _e139.y, _e139.z, 6.0); _ = vec3(5); let _e152 = textureSampleLevel(tex3D, samp, (_e144.xyz / vec3(_e144.w)), 3.0, vec3(5, 5, 5)); c_6 = _e152; let _e153 = coord_21; _ = vec4(_e153.x, _e153.y, _e153.z, 6.0); _ = vec3(4.0); _ = vec3(4.0); let _e163 = coord_21; let _e168 = vec4(_e163.x, _e163.y, _e163.z, 6.0); let _e177 = textureSampleGrad(tex3D, samp, (_e168.xyz / vec3(_e168.w)), vec3(4.0), vec3(4.0)); c_6 = _e177; let _e178 = coord_21; _ = vec4(_e178.x, _e178.y, _e178.z, 6.0); _ = vec3(4.0); _ = vec3(4.0); _ = vec3(5); let _e190 = coord_21; let _e195 = vec4(_e190.x, _e190.y, _e190.z, 6.0); _ = vec3(5); let _e206 = textureSampleGrad(tex3D, samp, (_e195.xyz / vec3(_e195.w)), vec3(4.0), vec3(4.0), vec3(5, 5, 5)); c_6 = _e206; _ = coord_21; _ = vec3(4.0); _ = vec3(4.0); let _e212 = coord_21; let _e217 = textureSampleGrad(tex3D, samp, _e212, vec3(4.0), vec3(4.0)); c_6 = _e217; _ = coord_21; _ = vec3(4.0); _ = vec3(4.0); _ = vec3(5); let _e225 = coord_21; _ = vec3(5); let _e232 = textureSampleGrad(tex3D, samp, _e225, vec3(4.0), vec3(4.0), vec3(5, 5, 5)); c_6 = _e232; _ = coord_21; let _e235 = coord_21; let _e237 = textureSampleLevel(tex3D, samp, _e235, 3.0); c_6 = _e237; _ = coord_21; _ = vec3(5); let _e242 = coord_21; _ = vec3(5); let _e246 = textureSampleLevel(tex3D, samp, _e242, 3.0, vec3(5, 5, 5)); c_6 = _e246; _ = coord_21; _ = vec3(5); let _e250 = coord_21; _ = vec3(5); let _e253 = textureSample(tex3D, samp, _e250, vec3(5, 5, 5)); c_6 = _e253; _ = coord_21; _ = vec3(5); let _e258 = coord_21; _ = vec3(5); let _e262 = textureSampleBias(tex3D, samp, _e258, 2.0, vec3(5, 5, 5)); c_6 = _e262; let _e263 = coord_21; _ = vec3(_e263); let _e266 = coord_21; let _e269 = textureLoad(tex3D, vec3(_e266), 3); c_6 = _e269; let _e270 = coord_21; _ = vec3(_e270); _ = vec3(5); let _e275 = coord_21; _ = vec3(5); let _e280 = textureLoad(tex3D, vec3(_e275), 3); c_6 = _e280; return; } fn testTex2DMS(coord_22: vec2) { var coord_23: vec2; var size2DMS: vec2; var c_7: vec4; coord_23 = coord_22; let _e18 = textureDimensions(tex2DMS); size2DMS = _e18; let _e21 = coord_23; _ = vec2(_e21); let _e24 = coord_23; let _e27 = textureLoad(tex2DMS, vec2(_e24), 3); c_7 = _e27; return; } fn testTex2DMSArray(coord_24: vec3) { var coord_25: vec3; var size2DMSArray: vec3; var c_8: vec4; coord_25 = coord_24; let _e18 = textureDimensions(tex2DMSArray); let _e21 = textureNumLayers(tex2DMSArray); size2DMSArray = vec3(_e18.x, _e18.y, _e21); let _e25 = coord_25; _ = vec3(_e25); let _e28 = coord_25; let _e29 = vec3(_e28); let _e33 = textureLoad(tex2DMSArray, _e29.xy, _e29.z, 3); c_8 = _e33; return; } fn main_1() { return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/shadow.wgsl ================================================ struct Globals { view_proj: mat4x4, num_lights: vec4, } struct Entity { world: mat4x4, color: vec4, } struct VertexOutput { @builtin(position) proj_position: vec4, @location(0) world_normal: vec3, @location(1) world_position: vec4, } struct Light { proj: mat4x4, pos: vec4, color: vec4, } let c_ambient: vec3 = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); let c_max_lights: u32 = 10u; @group(0) @binding(0) var u_globals: Globals; @group(1) @binding(0) var u_entity: Entity; @group(0) @binding(1) var s_lights: array; @group(0) @binding(1) var u_lights: array; @group(0) @binding(2) var t_shadow: texture_depth_2d_array; @group(0) @binding(3) var sampler_shadow: sampler_comparison; fn fetch_shadow(light_id: u32, homogeneous_coords: vec4) -> f32 { if (homogeneous_coords.w <= 0.0) { return 1.0; } let flip_correction = vec2(0.5, -0.5); let proj_correction = (1.0 / homogeneous_coords.w); let light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + vec2(0.5, 0.5)); let _e28 = textureSampleCompareLevel(t_shadow, sampler_shadow, light_local, i32(light_id), (homogeneous_coords.z * proj_correction)); return _e28; } @vertex fn vs_main(@location(0) position: vec4, @location(1) normal: vec4) -> VertexOutput { var out: VertexOutput; let w = u_entity.world; let _e7 = u_entity.world; let world_pos = (_e7 * vec4(position)); out.world_normal = (mat3x3(w[0].xyz, w[1].xyz, w[2].xyz) * vec3(normal.xyz)); out.world_position = world_pos; let _e25 = u_globals.view_proj; out.proj_position = (_e25 * world_pos); let _e27 = out; return _e27; } @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { var color: vec3 = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); var i: u32 = 0u; let normal_1 = normalize(in.world_normal); loop { let _e14 = i; let _e17 = u_globals.num_lights.x; if (_e14 < min(_e17, c_max_lights)) { } else { break; } let _e23 = i; let light = s_lights[_e23]; let _e26 = i; let _e30 = fetch_shadow(_e26, (light.proj * in.world_position)); let light_dir = normalize((light.pos.xyz - in.world_position.xyz)); let diffuse = max(0.0, dot(normal_1, light_dir)); let _e40 = color; color = (_e40 + ((_e30 * diffuse) * light.color.xyz)); continuing { let _e20 = i; i = (_e20 + 1u); } } let _e46 = color; let _e50 = u_entity.color; return (vec4(_e46, 1.0) * _e50); } @fragment fn fs_main_without_storage(in_1: VertexOutput) -> @location(0) vec4 { var color_1: vec3 = vec3(0.05000000074505806, 0.05000000074505806, 0.05000000074505806); var i_1: u32 = 0u; let normal_2 = normalize(in_1.world_normal); loop { let _e14 = i_1; let _e17 = u_globals.num_lights.x; if (_e14 < min(_e17, c_max_lights)) { } else { break; } let _e23 = i_1; let light_1 = u_lights[_e23]; let _e26 = i_1; let _e30 = fetch_shadow(_e26, (light_1.proj * in_1.world_position)); let light_dir_1 = normalize((light_1.pos.xyz - in_1.world_position.xyz)); let diffuse_1 = max(0.0, dot(normal_2, light_dir_1)); let _e40 = color_1; color_1 = (_e40 + ((_e30 * diffuse_1) * light_1.color.xyz)); continuing { let _e20 = i_1; i_1 = (_e20 + 1u); } } let _e46 = color_1; let _e50 = u_entity.color; return (vec4(_e46, 1.0) * _e50); } ================================================ FILE: lib/naga/tests/out/wgsl/skybox.wgsl ================================================ struct VertexOutput { @builtin(position) position: vec4, @location(0) uv: vec3, } struct Data { proj_inv: mat4x4, view: mat4x4, } @group(0) @binding(0) var r_data: Data; @group(0) @binding(1) var r_texture: texture_cube; @group(0) @binding(2) var r_sampler: sampler; @vertex fn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput { var tmp1_: i32; var tmp2_: i32; tmp1_ = (i32(vertex_index) / 2); tmp2_ = (i32(vertex_index) & 1); let _e10 = tmp1_; let _e16 = tmp2_; let pos = vec4(((f32(_e10) * 4.0) - 1.0), ((f32(_e16) * 4.0) - 1.0), 0.0, 1.0); let _e27 = r_data.view[0]; let _e31 = r_data.view[1]; let _e35 = r_data.view[2]; let inv_model_view = transpose(mat3x3(_e27.xyz, _e31.xyz, _e35.xyz)); let _e40 = r_data.proj_inv; let unprojected = (_e40 * pos); return VertexOutput(pos, (inv_model_view * unprojected.xyz)); } @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { let _e5 = textureSample(r_texture, r_sampler, in.uv); return _e5; } ================================================ FILE: lib/naga/tests/out/wgsl/standard.wgsl ================================================ @fragment fn derivatives(@builtin(position) foo: vec4) -> @location(0) vec4 { let x = dpdx(foo); let y = dpdy(foo); let z = fwidth(foo); return ((x + y) * z); } ================================================ FILE: lib/naga/tests/out/wgsl/statements-frag.wgsl ================================================ fn switchEmpty(a: i32) { var a_1: i32; a_1 = a; let _e2 = a_1; switch _e2 { default: { } } return; } fn switchNoDefault(a_2: i32) { var a_3: i32; a_3 = a_2; let _e2 = a_3; switch _e2 { case 0: { } default: { } } return; } fn switchNoLastBreak(a_4: i32) { var a_5: i32; var b: i32; a_5 = a_4; let _e2 = a_5; switch _e2 { default: { let _e3 = a_5; b = _e3; } } return; } fn main_1() { return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/swizzle_write-frag.wgsl ================================================ fn foo(p: ptr>) { return; } fn main_1() { var x: vec3; var local: vec2; x = vec3(2.0); let _e3 = x; _ = _e3.zxy; _ = _e3.zx; let _e8 = vec2(3.0, 4.0); x.z = _e8.x; x.x = _e8.y; let _e13 = x; _ = _e13.xy; let _e15 = x; let _e18 = (_e15.xy * 5.0); x.x = _e18.x; x.y = _e18.y; let _e23 = x; let _e27 = (_e23.zy + vec2(1.0)); x.z = _e27.x; x.y = _e27.y; let _e32 = x; _ = _e32.xz; let _e34 = x; local = _e34.xz; foo((&local)); let _e41 = local.x; x.x = _e41; let _e42 = local.y; x.z = _e42; return; } @fragment fn main() { main_1(); return; } ================================================ FILE: lib/naga/tests/out/wgsl/texture-arg.wgsl ================================================ @group(0) @binding(0) var Texture: texture_2d; @group(0) @binding(1) var Sampler: sampler; fn test(Passed_Texture: texture_2d, Passed_Sampler: sampler) -> vec4 { let _e7 = textureSample(Passed_Texture, Passed_Sampler, vec2(0.0, 0.0)); return _e7; } @fragment fn main() -> @location(0) vec4 { let _e2 = test(Texture, Sampler); return _e2; } ================================================ FILE: lib/naga/tests/snapshots.rs ================================================ // A lot of the code can be unused based on configuration flags, // the corresponding warnings aren't helpful. #![allow(dead_code)] use std::{fs, path::PathBuf}; const BASE_DIR_IN: &str = "tests/in"; const BASE_DIR_OUT: &str = "tests/out"; bitflags::bitflags! { struct Targets: u32 { const IR = 0x1; const ANALYSIS = 0x2; const SPIRV = 0x4; const METAL = 0x8; const GLSL = 0x10; const DOT = 0x20; const HLSL = 0x40; const WGSL = 0x80; } } #[derive(serde::Deserialize)] struct SpvOutVersion(u8, u8); impl Default for SpvOutVersion { fn default() -> Self { SpvOutVersion(1, 1) } } #[derive(Default, serde::Deserialize)] struct SpirvOutParameters { version: SpvOutVersion, #[serde(default)] capabilities: naga::FastHashSet, #[serde(default)] debug: bool, #[serde(default)] adjust_coordinate_space: bool, #[serde(default)] force_point_size: bool, #[serde(default)] clamp_frag_depth: bool, #[serde(default)] separate_entry_points: bool, #[serde(default)] #[cfg(all(feature = "deserialize", feature = "spv-out"))] binding_map: naga::back::spv::BindingMap, } #[derive(Default, serde::Deserialize)] struct WgslOutParameters { #[serde(default)] explicit_types: bool, } #[derive(Default, serde::Deserialize)] struct Parameters { #[serde(default)] god_mode: bool, #[cfg(feature = "deserialize")] #[serde(default)] bounds_check_policies: naga::proc::BoundsCheckPolicies, #[serde(default)] spv: SpirvOutParameters, #[cfg(all(feature = "deserialize", feature = "msl-out"))] #[serde(default)] msl: naga::back::msl::Options, #[cfg(all(feature = "deserialize", feature = "msl-out"))] #[serde(default)] msl_pipeline: naga::back::msl::PipelineOptions, #[cfg(all(feature = "deserialize", feature = "glsl-out"))] #[serde(default)] glsl: naga::back::glsl::Options, #[serde(default)] glsl_exclude_list: naga::FastHashSet, #[cfg(all(feature = "deserialize", feature = "hlsl-out"))] #[serde(default)] hlsl: naga::back::hlsl::Options, #[serde(default)] wgsl: WgslOutParameters, #[cfg(all(feature = "deserialize", feature = "glsl-out"))] #[serde(default)] glsl_multiview: Option, } #[allow(unused_variables)] fn check_targets(module: &naga::Module, name: &str, targets: Targets) { let root = env!("CARGO_MANIFEST_DIR"); let params = match fs::read_to_string(format!("{}/{}/{}.param.ron", root, BASE_DIR_IN, name)) { Ok(string) => ron::de::from_str(&string).expect("Couldn't parse param file"), Err(_) => Parameters::default(), }; let capabilities = if params.god_mode { naga::valid::Capabilities::all() } else { naga::valid::Capabilities::empty() }; let dest = PathBuf::from(root).join(BASE_DIR_OUT); #[cfg(feature = "serialize")] { if targets.contains(Targets::IR) { let config = ron::ser::PrettyConfig::default().new_line("\n".to_string()); let string = ron::ser::to_string_pretty(module, config).unwrap(); fs::write(dest.join(format!("ir/{}.ron", name)), string).unwrap(); } } let info = naga::valid::Validator::new(naga::valid::ValidationFlags::all(), capabilities) .validate(module) .expect("Naga module validation failed"); #[cfg(feature = "serialize")] { if targets.contains(Targets::ANALYSIS) { let config = ron::ser::PrettyConfig::default().new_line("\n".to_string()); let string = ron::ser::to_string_pretty(&info, config).unwrap(); fs::write(dest.join(format!("analysis/{}.info.ron", name)), string).unwrap(); } } #[cfg(all(feature = "deserialize", feature = "spv-out"))] { if targets.contains(Targets::SPIRV) { write_output_spv( module, &info, &dest, name, ¶ms.spv, params.bounds_check_policies, ); } } #[cfg(all(feature = "deserialize", feature = "msl-out"))] { if targets.contains(Targets::METAL) { write_output_msl( module, &info, &dest, name, ¶ms.msl, ¶ms.msl_pipeline, params.bounds_check_policies, ); } } #[cfg(all(feature = "deserialize", feature = "glsl-out"))] { if targets.contains(Targets::GLSL) { for ep in module.entry_points.iter() { if params.glsl_exclude_list.contains(&ep.name) { continue; } write_output_glsl( module, &info, &dest, name, ep.stage, &ep.name, ¶ms.glsl, params.bounds_check_policies, params.glsl_multiview, ); } } } #[cfg(feature = "dot-out")] { if targets.contains(Targets::DOT) { let string = naga::back::dot::write(module, Some(&info), Default::default()).unwrap(); fs::write(dest.join(format!("dot/{}.dot", name)), string).unwrap(); } } #[cfg(all(feature = "deserialize", feature = "hlsl-out"))] { if targets.contains(Targets::HLSL) { write_output_hlsl(module, &info, &dest, name, ¶ms.hlsl); } } #[cfg(all(feature = "deserialize", feature = "wgsl-out"))] { if targets.contains(Targets::WGSL) { write_output_wgsl(module, &info, &dest, name, ¶ms.wgsl); } } } #[cfg(feature = "spv-out")] fn write_output_spv( module: &naga::Module, info: &naga::valid::ModuleInfo, destination: &PathBuf, file_name: &str, params: &SpirvOutParameters, bounds_check_policies: naga::proc::BoundsCheckPolicies, ) { use naga::back::spv; use rspirv::binary::Disassemble; println!("writing SPIR-V"); let mut flags = spv::WriterFlags::LABEL_VARYINGS; flags.set(spv::WriterFlags::DEBUG, params.debug); flags.set( spv::WriterFlags::ADJUST_COORDINATE_SPACE, params.adjust_coordinate_space, ); flags.set(spv::WriterFlags::FORCE_POINT_SIZE, params.force_point_size); flags.set(spv::WriterFlags::CLAMP_FRAG_DEPTH, params.clamp_frag_depth); let options = spv::Options { lang_version: (params.version.0, params.version.1), flags, capabilities: if params.capabilities.is_empty() { None } else { Some(params.capabilities.clone()) }, bounds_check_policies, binding_map: params.binding_map.clone(), ..spv::Options::default() }; if params.separate_entry_points { for ep in module.entry_points.iter() { let pipeline_options = spv::PipelineOptions { entry_point: ep.name.clone(), shader_stage: ep.stage, }; let spv = spv::write_vec(module, info, &options, Some(&pipeline_options)).unwrap(); let dis = rspirv::dr::load_words(spv) .expect("Produced invalid SPIR-V") .disassemble(); let path = format!("spv/{}.{}.spvasm", file_name, ep.name); fs::write(destination.join(path), dis).unwrap(); } } else { let spv = spv::write_vec(module, info, &options, None).unwrap(); let dis = rspirv::dr::load_words(spv) .expect("Produced invalid SPIR-V") .disassemble(); fs::write(destination.join(format!("spv/{}.spvasm", file_name)), dis).unwrap(); } } #[cfg(feature = "msl-out")] fn write_output_msl( module: &naga::Module, info: &naga::valid::ModuleInfo, destination: &PathBuf, file_name: &str, options: &naga::back::msl::Options, pipeline_options: &naga::back::msl::PipelineOptions, bounds_check_policies: naga::proc::BoundsCheckPolicies, ) { use naga::back::msl; println!("writing MSL"); let mut options = options.clone(); options.bounds_check_policies = bounds_check_policies; let (string, tr_info) = msl::write_string(module, info, &options, pipeline_options) .unwrap_or_else(|err| panic!("Metal write failed: {}", err)); for (ep, result) in module.entry_points.iter().zip(tr_info.entry_point_names) { if let Err(error) = result { panic!("Failed to translate '{}': {}", ep.name, error); } } fs::write(destination.join(format!("msl/{}.msl", file_name)), string).unwrap(); } #[cfg(feature = "glsl-out")] fn write_output_glsl( module: &naga::Module, info: &naga::valid::ModuleInfo, destination: &PathBuf, file_name: &str, stage: naga::ShaderStage, ep_name: &str, options: &naga::back::glsl::Options, bounds_check_policies: naga::proc::BoundsCheckPolicies, multiview: Option, ) { use naga::back::glsl; println!("writing GLSL"); let pipeline_options = glsl::PipelineOptions { shader_stage: stage, entry_point: ep_name.to_string(), multiview, }; let mut buffer = String::new(); let mut writer = glsl::Writer::new( &mut buffer, module, info, options, &pipeline_options, bounds_check_policies, ) .expect("GLSL init failed"); writer.write().expect("GLSL write failed"); fs::write( destination.join(format!("glsl/{}.{}.{:?}.glsl", file_name, ep_name, stage)), buffer, ) .unwrap(); } #[cfg(feature = "hlsl-out")] fn write_output_hlsl( module: &naga::Module, info: &naga::valid::ModuleInfo, destination: &PathBuf, file_name: &str, options: &naga::back::hlsl::Options, ) { use naga::back::hlsl; use std::fmt::Write as _; println!("writing HLSL"); let mut buffer = String::new(); let mut writer = hlsl::Writer::new(&mut buffer, options); let reflection_info = writer.write(module, info).expect("HLSL write failed"); fs::write(destination.join(format!("hlsl/{}.hlsl", file_name)), buffer).unwrap(); // We need a config file for validation script // This file contains an info about profiles (shader stages) contains inside generated shader // This info will be passed to dxc let mut config_str = String::new(); let mut vertex_str = String::from("vertex=("); let mut fragment_str = String::from("fragment=("); let mut compute_str = String::from("compute=("); for (index, ep) in module.entry_points.iter().enumerate() { let name = match reflection_info.entry_point_names[index] { Ok(ref name) => name, Err(_) => continue, }; match ep.stage { naga::ShaderStage::Vertex => { write!( vertex_str, "{}:{}_{} ", name, ep.stage.to_hlsl_str(), options.shader_model.to_str(), ) .unwrap(); } naga::ShaderStage::Fragment => { write!( fragment_str, "{}:{}_{} ", name, ep.stage.to_hlsl_str(), options.shader_model.to_str(), ) .unwrap(); } naga::ShaderStage::Compute => { write!( compute_str, "{}:{}_{} ", name, ep.stage.to_hlsl_str(), options.shader_model.to_str(), ) .unwrap(); } } } writeln!( config_str, "{})\n{})\n{})", vertex_str, fragment_str, compute_str ) .unwrap(); fs::write( destination.join(format!("hlsl/{}.hlsl.config", file_name)), config_str, ) .unwrap(); } #[cfg(feature = "wgsl-out")] fn write_output_wgsl( module: &naga::Module, info: &naga::valid::ModuleInfo, destination: &PathBuf, file_name: &str, params: &WgslOutParameters, ) { use naga::back::wgsl; println!("writing WGSL"); let mut flags = wgsl::WriterFlags::empty(); flags.set(wgsl::WriterFlags::EXPLICIT_TYPES, params.explicit_types); let string = wgsl::write_string(module, info, flags).expect("WGSL write failed"); fs::write(destination.join(format!("wgsl/{}.wgsl", file_name)), string).unwrap(); } #[cfg(feature = "wgsl-in")] #[test] fn convert_wgsl() { let _ = env_logger::try_init(); let root = env!("CARGO_MANIFEST_DIR"); let inputs = [ ( "empty", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "quad", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::DOT | Targets::HLSL | Targets::WGSL, ), ( "bits", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, ), ( "bitcast", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, ), ( "boids", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "skybox", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "collatz", Targets::SPIRV | Targets::METAL | Targets::IR | Targets::ANALYSIS | Targets::HLSL | Targets::WGSL, ), ( "shadow", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "image", Targets::SPIRV | Targets::METAL | Targets::HLSL | Targets::WGSL | Targets::GLSL, ), ("extra", Targets::SPIRV | Targets::METAL | Targets::WGSL), ("push-constants", Targets::GLSL | Targets::HLSL), ( "operators", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "functions", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ("functions-webgl", Targets::GLSL), ( "interpolate", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "access", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "padding", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ("pointers", Targets::SPIRV | Targets::WGSL), ( "control-flow", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( "standard", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), //TODO: GLSL https://github.com/gfx-rs/naga/issues/874 ( "interface", Targets::SPIRV | Targets::METAL | Targets::HLSL | Targets::WGSL, ), ( "globals", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ("bounds-check-zero", Targets::SPIRV | Targets::METAL), ("bounds-check-zero-atomic", Targets::METAL), ("bounds-check-restrict", Targets::SPIRV | Targets::METAL), ( "bounds-check-image-restrict", Targets::SPIRV | Targets::METAL | Targets::GLSL, ), ( "bounds-check-image-rzsw", Targets::SPIRV | Targets::METAL | Targets::GLSL, ), ("policy-mix", Targets::SPIRV | Targets::METAL), ( "texture-arg", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ("cubeArrayShadow", Targets::GLSL), ( "math-functions", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ("cubeArrayShadow", Targets::GLSL), ( "binding-arrays", Targets::WGSL | Targets::HLSL | Targets::METAL | Targets::SPIRV, ), ("multiview", Targets::SPIRV | Targets::GLSL | Targets::WGSL), ("multiview_webgl", Targets::GLSL), ( "break-if", Targets::WGSL | Targets::GLSL | Targets::SPIRV | Targets::HLSL | Targets::METAL, ), ("lexical-scopes", Targets::WGSL), ]; for &(name, targets) in inputs.iter() { println!("Processing '{}'", name); // WGSL shaders lives in root dir as a privileged. let file = fs::read_to_string(format!("{}/{}/{}.wgsl", root, BASE_DIR_IN, name)) .expect("Couldn't find wgsl file"); match naga::front::wgsl::parse_str(&file) { Ok(module) => check_targets(&module, name, targets), Err(e) => panic!("{}", e.emit_to_string(&file)), } } } #[cfg(feature = "spv-in")] fn convert_spv(name: &str, adjust_coordinate_space: bool, targets: Targets) { let _ = env_logger::try_init(); let root = env!("CARGO_MANIFEST_DIR"); let module = naga::front::spv::parse_u8_slice( &fs::read(format!("{}/{}/spv/{}.spv", root, BASE_DIR_IN, name)) .expect("Couldn't find spv file"), &naga::front::spv::Options { adjust_coordinate_space, strict_capabilities: false, block_ctx_dump_prefix: None, }, ) .unwrap(); check_targets(&module, name, targets); naga::valid::Validator::new( naga::valid::ValidationFlags::all(), naga::valid::Capabilities::empty(), ) .validate(&module) .unwrap(); } #[cfg(feature = "spv-in")] #[test] fn convert_spv_all() { convert_spv( "quad-vert", false, Targets::METAL | Targets::GLSL | Targets::HLSL | Targets::WGSL, ); convert_spv("shadow", true, Targets::IR | Targets::ANALYSIS); convert_spv( "inv-hyperbolic-trig-functions", true, Targets::HLSL | Targets::WGSL, ); convert_spv( "empty-global-name", true, Targets::HLSL | Targets::WGSL | Targets::METAL, ); convert_spv( "empty-global-name", true, Targets::HLSL | Targets::WGSL | Targets::METAL, ); convert_spv("degrees", false, Targets::empty()); } #[cfg(feature = "glsl-in")] #[test] fn convert_glsl_variations_check() { let root = env!("CARGO_MANIFEST_DIR"); let file = fs::read_to_string(format!("{}/{}/variations.glsl", root, BASE_DIR_IN)) .expect("Couldn't find glsl file"); let mut parser = naga::front::glsl::Parser::default(); let module = parser .parse( &naga::front::glsl::Options { stage: naga::ShaderStage::Fragment, defines: Default::default(), }, &file, ) .unwrap(); check_targets(&module, "variations-glsl", Targets::GLSL); } #[cfg(feature = "glsl-in")] #[allow(unused_variables)] #[test] fn convert_glsl_folder() { let _ = env_logger::try_init(); let root = env!("CARGO_MANIFEST_DIR"); for entry in std::fs::read_dir(format!("{}/{}/glsl", root, BASE_DIR_IN)).unwrap() { let entry = entry.unwrap(); let file_name = entry.file_name().into_string().unwrap(); if file_name.ends_with(".ron") { // No needed to validate ron files continue; } println!("Processing {}", file_name); let mut parser = naga::front::glsl::Parser::default(); let module = parser .parse( &naga::front::glsl::Options { stage: match entry.path().extension().and_then(|s| s.to_str()).unwrap() { "vert" => naga::ShaderStage::Vertex, "frag" => naga::ShaderStage::Fragment, "comp" => naga::ShaderStage::Compute, ext => panic!("Unknown extension for glsl file {}", ext), }, defines: Default::default(), }, &fs::read_to_string(entry.path()).expect("Couldn't find glsl file"), ) .unwrap(); let info = naga::valid::Validator::new( naga::valid::ValidationFlags::all(), naga::valid::Capabilities::all(), ) .validate(&module) .unwrap(); #[cfg(feature = "wgsl-out")] { let dest = PathBuf::from(root).join(BASE_DIR_OUT); write_output_wgsl( &module, &info, &dest, &file_name.replace(".", "-"), &WgslOutParameters::default(), ); } } } ================================================ FILE: lib/naga/tests/spirv-capabilities.rs ================================================ /*! Test SPIR-V backend capability checks. */ #![cfg(all(feature = "wgsl-in", feature = "spv-out"))] use spirv::Capability as Ca; fn capabilities_used(source: &str) -> naga::FastHashSet { use naga::back::spv; use naga::valid; let module = naga::front::wgsl::parse_str(source).unwrap_or_else(|e| { panic!( "expected WGSL to parse successfully:\n{}", e.emit_to_string(source) ); }); let info = valid::Validator::new(valid::ValidationFlags::all(), valid::Capabilities::all()) .validate(&module) .expect("validation failed"); let mut words = vec![]; let mut writer = spv::Writer::new(&spv::Options::default()).unwrap(); writer.write(&module, &info, None, &mut words).unwrap(); writer.get_capabilities_used().clone() } fn require(capabilities: &[Ca], source: &str) { require_and_forbid(capabilities, &[], source); } fn require_and_forbid(required: &[Ca], forbidden: &[Ca], source: &str) { let caps_used = capabilities_used(source); let missing_caps: Vec<_> = required .iter() .filter(|cap| !caps_used.contains(cap)) .cloned() .collect(); if !missing_caps.is_empty() { panic!( "shader code should have requested these caps: {:?}\n\n{}", missing_caps, source ); } let forbidden_caps: Vec<_> = forbidden .iter() .filter(|cap| caps_used.contains(cap)) .cloned() .collect(); if !forbidden_caps.is_empty() { panic!( "shader code should not have requested these caps: {:?}\n\n{}", forbidden_caps, source ); } } #[test] fn sampler1d() { require( &[Ca::Sampled1D], r#" @group(0) @binding(0) var image_1d: texture_1d; "#, ); } #[test] fn storage1d() { require( &[Ca::Image1D], r#" @group(0) @binding(0) var image_1d: texture_storage_1d; "#, ); } #[test] fn cube_array() { // ImageCubeArray is only for storage cube array images, which WGSL doesn't // support require_and_forbid( &[Ca::SampledCubeArray], &[Ca::ImageCubeArray], r#" @group(0) @binding(0) var image_cube: texture_cube_array; "#, ); } #[test] fn image_queries() { require( &[Ca::ImageQuery], r#" fn f(i: texture_2d) -> vec2 { return textureDimensions(i); } "#, ); require( &[Ca::ImageQuery], r#" fn f(i: texture_2d_array) -> i32 { return textureNumLayers(i); } "#, ); require( &[Ca::ImageQuery], r#" fn f(i: texture_2d) -> i32 { return textureNumLevels(i); } "#, ); require( &[Ca::ImageQuery], r#" fn f(i: texture_multisampled_2d) -> i32 { return textureNumSamples(i); } "#, ); } #[test] fn sample_rate_shading() { require( &[Ca::SampleRateShading], r#" @fragment fn f(@location(0) @interpolate(perspective, sample) x: f32) { } "#, ); require( &[Ca::SampleRateShading], r#" @fragment fn f(@builtin(sample_index) x: u32) { } "#, ); } #[test] fn geometry() { require( &[Ca::Geometry], r#" @fragment fn f(@builtin(primitive_index) x: u32) { } "#, ); } #[test] fn storage_image_formats() { require_and_forbid( &[Ca::Shader], &[Ca::StorageImageExtendedFormats], r#" @group(0) @binding(0) var image_rg32f: texture_storage_2d; "#, ); require( &[Ca::StorageImageExtendedFormats], r#" @group(0) @binding(0) var image_rg32f: texture_storage_2d; "#, ); } ================================================ FILE: lib/naga/tests/wgsl-errors.rs ================================================ /*! Tests for the WGSL front end. */ #![cfg(feature = "wgsl-in")] fn check(input: &str, snapshot: &str) { let output = naga::front::wgsl::parse_str(input) .expect_err("expected parser error") .emit_to_string(input); if output != snapshot { for diff in diff::lines(&output, snapshot) { match diff { diff::Result::Left(l) => println!("-{}", l), diff::Result::Both(l, _) => println!(" {}", l), diff::Result::Right(r) => println!("+{}", r), } } panic!("Error snapshot failed"); } } #[test] fn reserved_identifier_prefix() { check( "var __bad;", r###"error: Identifier starts with a reserved prefix: '__bad' ┌─ wgsl:1:5 │ 1 │ var __bad; │ ^^^^^ invalid identifier "###, ); } #[test] fn function_without_identifier() { check( "fn () {}", r###"error: expected identifier, found '(' ┌─ wgsl:1:4 │ 1 │ fn () {} │ ^ expected identifier "###, ); } #[test] fn invalid_integer() { check( "fn foo([location(1.)] x: i32) {}", r###"error: expected identifier, found '[' ┌─ wgsl:1:8 │ 1 │ fn foo([location(1.)] x: i32) {} │ ^ expected identifier "###, ); } #[test] fn invalid_float() { check( "let scale: f32 = 1.1.;", r###"error: expected ';', found '.' ┌─ wgsl:1:21 │ 1 │ let scale: f32 = 1.1.; │ ^ expected ';' "###, ); } #[test] fn invalid_texture_sample_type() { check( "let x: texture_2d;", r###"error: texture sample type must be one of f32, i32 or u32, but found f16 ┌─ wgsl:1:19 │ 1 │ let x: texture_2d; │ ^^^ must be one of f32, i32 or u32 "###, ); } #[test] fn unknown_identifier() { check( r###" fn f(x: f32) -> f32 { return x * schmoo; } "###, r###"error: no definition in scope for identifier: 'schmoo' ┌─ wgsl:3:30 │ 3 │ return x * schmoo; │ ^^^^^^ unknown identifier "###, ); } #[test] fn negative_index() { check( r#" fn main() -> f32 { let a = array(0., 1., 2.); return a[-1]; } "#, r#"error: expected unsigned integer constant expression, found `-1` ┌─ wgsl:4:26 │ 4 │ return a[-1]; │ ^^ expected unsigned integer "#, ); } #[test] fn bad_texture() { check( r#" @group(0) @binding(0) var sampler1 : sampler; @fragment fn main() -> @location(0) vec4 { let a = 3; return textureSample(a, sampler1, vec2(0.0)); } "#, r#"error: expected an image, but found 'a' which is not an image ┌─ wgsl:7:38 │ 7 │ return textureSample(a, sampler1, vec2(0.0)); │ ^ not an image "#, ); } #[test] fn bad_type_cast() { check( r#" fn x() -> i32 { return i32(vec2(0.0)); } "#, r#"error: cannot cast a vec2 to a i32 ┌─ wgsl:3:28 │ 3 │ return i32(vec2(0.0)); │ ^^^^^^^^^^^^^^ cannot cast a vec2 to a i32 "#, ); } #[test] fn type_not_constructible() { check( r#" fn x() { _ = atomic(0); } "#, r#"error: type `atomic` is not constructible ┌─ wgsl:3:21 │ 3 │ _ = atomic(0); │ ^^^^^^ type is not constructible "#, ); } #[test] fn type_not_inferrable() { check( r#" fn x() { _ = vec2(); } "#, r#"error: type can't be inferred ┌─ wgsl:3:21 │ 3 │ _ = vec2(); │ ^^^^ type can't be inferred "#, ); } #[test] fn unexpected_constructor_parameters() { check( r#" fn x() { _ = i32(0, 1); } "#, r#"error: unexpected components ┌─ wgsl:3:27 │ 3 │ _ = i32(0, 1); │ ^^ unexpected components "#, ); } #[test] fn constructor_parameter_type_mismatch() { check( r#" fn x() { _ = mat2x2(array(0, 1), vec2(2, 3)); } "#, r#"error: invalid type for constructor component at index [0] ┌─ wgsl:3:33 │ 3 │ _ = mat2x2(array(0, 1), vec2(2, 3)); │ ^^^^^^^^^^^ invalid component type "#, ); } #[test] fn bad_texture_sample_type() { check( r#" @group(0) @binding(0) var sampler1 : sampler; @group(0) @binding(1) var texture : texture_2d; @fragment fn main() -> @location(0) vec4 { return textureSample(texture, sampler1, vec2(0.0)); } "#, r#"error: texture sample type must be one of f32, i32 or u32, but found bool ┌─ wgsl:3:60 │ 3 │ @group(0) @binding(1) var texture : texture_2d; │ ^^^^ must be one of f32, i32 or u32 "#, ); } #[test] fn bad_for_initializer() { check( r#" fn x() { for ({};;) {} } "#, r#"error: for(;;) initializer is not an assignment or a function call: '{}' ┌─ wgsl:3:22 │ 3 │ for ({};;) {} │ ^^ not an assignment or function call "#, ); } #[test] fn unknown_storage_class() { check( r#" @group(0) @binding(0) var texture: texture_2d; "#, r#"error: unknown address space: 'bad' ┌─ wgsl:2:39 │ 2 │ @group(0) @binding(0) var texture: texture_2d; │ ^^^ unknown address space "#, ); } #[test] fn unknown_attribute() { check( r#" @a fn x() {} "#, r#"error: unknown attribute: 'a' ┌─ wgsl:2:14 │ 2 │ @a │ ^ unknown attribute "#, ); } #[test] fn unknown_built_in() { check( r#" fn x(@builtin(unknown_built_in) y: u32) {} "#, r#"error: unknown builtin: 'unknown_built_in' ┌─ wgsl:2:27 │ 2 │ fn x(@builtin(unknown_built_in) y: u32) {} │ ^^^^^^^^^^^^^^^^ unknown builtin "#, ); } #[test] fn unknown_access() { check( r#" var x: array; "#, r#"error: unknown access: 'unknown_access' ┌─ wgsl:2:25 │ 2 │ var x: array; │ ^^^^^^^^^^^^^^ unknown access "#, ); } #[test] fn unknown_ident() { check( r#" fn main() { let a = b; } "#, r#"error: no definition in scope for identifier: 'b' ┌─ wgsl:3:25 │ 3 │ let a = b; │ ^ unknown identifier "#, ); } #[test] fn unknown_scalar_type() { check( r#" let a: vec2; "#, r#"error: unknown scalar type: 'something' ┌─ wgsl:2:25 │ 2 │ let a: vec2; │ ^^^^^^^^^ unknown scalar type │ = note: Valid scalar types are f16, f32, f64, i8, i16, i32, i64, u8, u16, u32, u64, bool "#, ); } #[test] fn unknown_type() { check( r#" let a: Vec; "#, r#"error: unknown type: 'Vec' ┌─ wgsl:2:20 │ 2 │ let a: Vec; │ ^^^ unknown type "#, ); } #[test] fn unknown_storage_format() { check( r#" let storage1: texture_storage_1d; "#, r#"error: unknown storage format: 'rgba' ┌─ wgsl:2:46 │ 2 │ let storage1: texture_storage_1d; │ ^^^^ unknown storage format "#, ); } #[test] fn unknown_conservative_depth() { check( r#" @early_depth_test(abc) fn main() {} "#, r#"error: unknown conservative depth: 'abc' ┌─ wgsl:2:31 │ 2 │ @early_depth_test(abc) fn main() {} │ ^^^ unknown conservative depth "#, ); } #[test] fn struct_member_size_too_low() { check( r#" struct Bar { @size(0) data: array } "#, r#"error: struct member size must be at least 4 ┌─ wgsl:3:23 │ 3 │ @size(0) data: array │ ^ must be at least 4 "#, ); } #[test] fn struct_member_align_too_low() { check( r#" struct Bar { @align(8) data: vec3 } "#, r#"error: struct member alignment must be at least 16 ┌─ wgsl:3:24 │ 3 │ @align(8) data: vec3 │ ^ must be at least 16 "#, ); } #[test] fn struct_member_non_po2_align() { check( r#" struct Bar { @align(7) data: array } "#, r#"error: struct member alignment must be a power of 2 ┌─ wgsl:3:24 │ 3 │ @align(7) data: array │ ^ must be a power of 2 "#, ); } #[test] fn inconsistent_binding() { check( r#" fn foo(@builtin(vertex_index) @location(0) x: u32) {} "#, r#"error: input/output binding is not consistent ┌─ wgsl:2:16 │ 2 │ fn foo(@builtin(vertex_index) @location(0) x: u32) {} │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ input/output binding is not consistent "#, ); } #[test] fn unknown_local_function() { check( r#" fn x() { for (a();;) {} } "#, r#"error: unknown local function `a` ┌─ wgsl:3:22 │ 3 │ for (a();;) {} │ ^ unknown local function "#, ); } #[test] fn let_type_mismatch() { check( r#" let x: i32 = 1.0; "#, r#"error: the type of `x` is expected to be `f32` ┌─ wgsl:2:17 │ 2 │ let x: i32 = 1.0; │ ^ definition of `x` "#, ); check( r#" fn foo() { let x: f32 = true; } "#, r#"error: the type of `x` is expected to be `bool` ┌─ wgsl:3:21 │ 3 │ let x: f32 = true; │ ^ definition of `x` "#, ); } #[test] fn var_type_mismatch() { check( r#" let x: f32 = 1; "#, r#"error: the type of `x` is expected to be `i32` ┌─ wgsl:2:17 │ 2 │ let x: f32 = 1; │ ^ definition of `x` "#, ); check( r#" fn foo() { var x: f32 = 1u32; } "#, r#"error: the type of `x` is expected to be `u32` ┌─ wgsl:3:21 │ 3 │ var x: f32 = 1u32; │ ^ definition of `x` "#, ); } #[test] fn local_var_missing_type() { check( r#" fn foo() { var x; } "#, r#"error: variable `x` needs a type ┌─ wgsl:3:21 │ 3 │ var x; │ ^ definition of `x` "#, ); } #[test] fn postfix_pointers() { check( r#" fn main() { var v: vec4 = vec4(1.0, 1.0, 1.0, 1.0); let pv = &v; let a = *pv[3]; // Problematic line } "#, r#"error: the value indexed by a `[]` subscripting expression must not be a pointer ┌─ wgsl:5:26 │ 5 │ let a = *pv[3]; // Problematic line │ ^^ expression is a pointer "#, ); check( r#" struct S { m: i32 }; fn main() { var s: S = S(42); let ps = &s; let a = *ps.m; // Problematic line } "#, r#"error: the value accessed by a `.member` expression must not be a pointer ┌─ wgsl:6:26 │ 6 │ let a = *ps.m; // Problematic line │ ^^ expression is a pointer "#, ); } #[test] fn reserved_keyword() { // global var check( r#" var bool: bool = true; "#, r###"error: name `bool: bool = true;` is a reserved keyword ┌─ wgsl:2:17 │ 2 │ var bool: bool = true; │ ^^^^^^^^^^^^^^^^^^ definition of `bool: bool = true;` "###, ); // global constant check( r#" let break: bool = true; fn foo() { var foo = break; } "#, r###"error: name `break` is a reserved keyword ┌─ wgsl:2:17 │ 2 │ let break: bool = true; │ ^^^^^ definition of `break` "###, ); // local let check( r#" fn foo() { let atomic: f32 = 1.0; } "#, r###"error: name `atomic` is a reserved keyword ┌─ wgsl:3:21 │ 3 │ let atomic: f32 = 1.0; │ ^^^^^^ definition of `atomic` "###, ); // local var check( r#" fn foo() { var sampler: f32 = 1.0; } "#, r###"error: name `sampler` is a reserved keyword ┌─ wgsl:3:21 │ 3 │ var sampler: f32 = 1.0; │ ^^^^^^^ definition of `sampler` "###, ); // fn name check( r#" fn break() {} "#, r###"error: name `break` is a reserved keyword ┌─ wgsl:2:16 │ 2 │ fn break() {} │ ^^^^^ definition of `break` "###, ); // struct check( r#" struct array {} "#, r###"error: name `array` is a reserved keyword ┌─ wgsl:2:20 │ 2 │ struct array {} │ ^^^^^ definition of `array` "###, ); // struct member check( r#" struct Foo { sampler: f32 } "#, r###"error: name `sampler` is a reserved keyword ┌─ wgsl:2:26 │ 2 │ struct Foo { sampler: f32 } │ ^^^^^^^ definition of `sampler` "###, ); } #[test] fn module_scope_identifier_redefinition() { // let check( r#" let foo: bool = true; let foo: bool = true; "#, r###"error: redefinition of `foo` ┌─ wgsl:2:17 │ 2 │ let foo: bool = true; │ ^^^ previous definition of `foo` 3 │ let foo: bool = true; │ ^^^ redefinition of `foo` "###, ); // var check( r#" var foo: bool = true; var foo: bool = true; "#, r###"error: redefinition of `foo: bool = true;` ┌─ wgsl:2:17 │ 2 │ var foo: bool = true; │ ^^^^^^^^^^^^^^^^^ previous definition of `foo: bool = true;` 3 │ var foo: bool = true; │ ^^^^^^^^^^^^^^^^^ redefinition of `foo: bool = true;` "###, ); // let and var check( r#" var foo: bool = true; let foo: bool = true; "#, r###"error: redefinition of `foo` ┌─ wgsl:2:17 │ 2 │ var foo: bool = true; │ ^^^^^^^^^^^^^^^^^ previous definition of `foo: bool = true;` 3 │ let foo: bool = true; │ ^^^ redefinition of `foo` "###, ); // function check( r#"fn foo() {} fn bar() {} fn foo() {}"#, r###"error: redefinition of `foo` ┌─ wgsl:1:4 │ 1 │ fn foo() {} │ ^^^ previous definition of `foo` 2 │ fn bar() {} 3 │ fn foo() {} │ ^^^ redefinition of `foo` "###, ); // let and function check( r#" let foo: bool = true; fn foo() {} "#, r###"error: redefinition of `foo` ┌─ wgsl:2:17 │ 2 │ let foo: bool = true; │ ^^^ previous definition of `foo` 3 │ fn foo() {} │ ^^^ redefinition of `foo` "###, ); } #[test] fn matrix_with_bad_type() { check( r#" fn main() { let m = mat2x2(); } "#, r#"error: matrix scalar type must be floating-point, but found `i32` ┌─ wgsl:3:32 │ 3 │ let m = mat2x2(); │ ^^^ must be floating-point (e.g. `f32`) "#, ); check( r#" fn main() { let m: mat3x3; } "#, r#"error: matrix scalar type must be floating-point, but found `i32` ┌─ wgsl:3:31 │ 3 │ let m: mat3x3; │ ^^^ must be floating-point (e.g. `f32`) "#, ); } /// Check the result of validating a WGSL program against a pattern. /// /// Unless you are generating code programmatically, the /// `check_validation_error` macro will probably be more convenient to /// use. macro_rules! check_one_validation { ( $source:expr, $pattern:pat $( if $guard:expr )? ) => { let source = $source; let error = validation_error($source); if ! matches!(&error, $pattern $( if $guard )? ) { eprintln!("validation error does not match pattern:\n\ source code: {}\n\ \n\ actual result:\n\ {:#?}\n\ \n\ expected match for pattern:\n\ {}", &source, error, stringify!($pattern)); $( eprintln!("if {}", stringify!($guard)); )? panic!("validation error does not match pattern"); } } } macro_rules! check_validation { // We want to support an optional guard expression after the pattern, so // that we can check values we can't match against, like strings. // Unfortunately, we can't simply include `$( if $guard:expr )?` in the // pattern, because Rust treats `?` as a repetition operator, and its count // (0 or 1) will not necessarily match `$source`. ( $( $source:literal ),* : $pattern:pat ) => { $( check_one_validation!($source, $pattern); )* }; ( $( $source:literal ),* : $pattern:pat if $guard:expr ) => { $( check_one_validation!($source, $pattern if $guard); )* } } fn validation_error(source: &str) -> Result { let module = match naga::front::wgsl::parse_str(source) { Ok(module) => module, Err(err) => { eprintln!("WGSL parse failed:"); panic!("{}", err.emit_to_string(source)); } }; naga::valid::Validator::new( naga::valid::ValidationFlags::all(), naga::valid::Capabilities::empty(), ) .validate(&module) .map_err(|e| e.into_inner()) // TODO: Add tests for spans, too? } #[test] fn invalid_arrays() { check_validation! { "type Bad = array, 4>;", "type Bad = array;", "type Bad = array, 4>;": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::InvalidArrayBaseType(_), .. }) } check_validation! { "type Bad = array;", r#" let length: f32 = 2.718; type Bad = array; "#: Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::InvalidArraySizeConstant(_), .. }) } check_validation! { "type Bad = array;", "type Bad = array;": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::NonPositiveArrayLength(_), .. }) } } #[test] fn invalid_structs() { check_validation! { "struct Bad { data: sampler }", "struct Bad { data: texture_2d }": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::InvalidData(_), .. }) } check_validation! { "struct Bad { data: array, other: f32, }": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::InvalidDynamicArray(_, _), .. }) } check_validation! { "struct Empty {}": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::EmptyStruct, .. }) } } #[test] fn invalid_functions() { check_validation! { "fn unacceptable_unsized(arg: array) { }", " struct Unsized { data: array } fn unacceptable_unsized(arg: Unsized) { } ": Err(naga::valid::ValidationError::Function { name: function_name, error: naga::valid::FunctionError::InvalidArgumentType { index: 0, name: argument_name, }, .. }) if function_name == "unacceptable_unsized" && argument_name == "arg" } // Pointer's address space cannot hold unsized data. check_validation! { "fn unacceptable_unsized(arg: ptr>) { }", " struct Unsized { data: array } fn unacceptable_unsized(arg: ptr) { } ": Err(naga::valid::ValidationError::Type { error: naga::valid::TypeError::InvalidPointerToUnsized { base: _, space: naga::AddressSpace::WorkGroup { .. }, }, .. }) } // Pointers of these storage classes cannot be passed as arguments. check_validation! { "fn unacceptable_ptr_space(arg: ptr>) { }": Err(naga::valid::ValidationError::Function { name: function_name, error: naga::valid::FunctionError::InvalidArgumentPointerSpace { index: 0, name: argument_name, space: naga::AddressSpace::Storage { .. }, }, .. }) if function_name == "unacceptable_ptr_space" && argument_name == "arg" } check_validation! { "fn unacceptable_ptr_space(arg: ptr) { }": Err(naga::valid::ValidationError::Function { name: function_name, error: naga::valid::FunctionError::InvalidArgumentPointerSpace { index: 0, name: argument_name, space: naga::AddressSpace::Uniform, }, .. }) if function_name == "unacceptable_ptr_space" && argument_name == "arg" } check_validation! { " struct AFloat { said_float: f32 }; @group(0) @binding(0) var float: AFloat; fn return_pointer() -> ptr { return &float.said_float; } ": Err(naga::valid::ValidationError::Function { name: function_name, error: naga::valid::FunctionError::NonConstructibleReturnType, .. }) if function_name == "return_pointer" } check_validation! { " @group(0) @binding(0) var atom: atomic; fn return_atomic() -> atomic { return atom; } ": Err(naga::valid::ValidationError::Function { name: function_name, error: naga::valid::FunctionError::NonConstructibleReturnType, .. }) if function_name == "return_atomic" } } #[test] fn pointer_type_equivalence() { check_validation! { r#" fn f(pv: ptr>, pf: ptr) { } fn g() { var m: mat2x2; let pv: ptr> = &m.x; let pf: ptr = &m.x.x; f(pv, pf); } "#: Ok(_) } } #[test] fn missing_bindings() { check_validation! { " @vertex fn vertex(_input: vec4) -> @location(0) vec4 { return _input; } ": Err(naga::valid::ValidationError::EntryPoint { stage: naga::ShaderStage::Vertex, error: naga::valid::EntryPointError::Argument( 0, naga::valid::VaryingError::MissingBinding, ), .. }) } check_validation! { " @vertex fn vertex(@location(0) _input: vec4, more_input: f32) -> @location(0) vec4 { return _input + more_input; } ": Err(naga::valid::ValidationError::EntryPoint { stage: naga::ShaderStage::Vertex, error: naga::valid::EntryPointError::Argument( 1, naga::valid::VaryingError::MissingBinding, ), .. }) } check_validation! { " @vertex fn vertex(@location(0) _input: vec4) -> vec4 { return _input; } ": Err(naga::valid::ValidationError::EntryPoint { stage: naga::ShaderStage::Vertex, error: naga::valid::EntryPointError::Result( naga::valid::VaryingError::MissingBinding, ), .. }) } check_validation! { " struct VertexIn { @location(0) pos: vec4, uv: vec2 } @vertex fn vertex(_input: VertexIn) -> @location(0) vec4 { return _input.pos; } ": Err(naga::valid::ValidationError::EntryPoint { stage: naga::ShaderStage::Vertex, error: naga::valid::EntryPointError::Argument( 0, naga::valid::VaryingError::MemberMissingBinding(1), ), .. }) } } #[test] fn invalid_access() { check_validation! { " fn array_by_value(a: array, i: i32) -> i32 { return a[i]; } ", " fn matrix_by_value(m: mat4x4, i: i32) -> vec4 { return m[i]; } ": Err(naga::valid::ValidationError::Function { error: naga::valid::FunctionError::Expression { error: naga::valid::ExpressionError::IndexMustBeConstant(_), .. }, .. }) } check_validation! { r#" fn main() -> f32 { let a = array(0., 1., 2.); return a[3]; } "#: Err(naga::valid::ValidationError::Function { error: naga::valid::FunctionError::Expression { error: naga::valid::ExpressionError::IndexOutOfBounds(_, _), .. }, .. }) } } #[test] fn valid_access() { check_validation! { " fn vector_by_value(v: vec4, i: i32) -> i32 { return v[i]; } ", " fn matrix_dynamic(m: mat4x4, i: i32, j: i32) -> f32 { var temp: mat4x4 = m; // Dynamically indexing the column vector applies // `Access` to a `ValuePointer`. return temp[i][j]; } ", " fn main() { var v: vec4 = vec4(1.0, 1.0, 1.0, 1.0); let pv = &v; let a = (*pv)[3]; } ": Ok(_) } } #[test] fn invalid_local_vars() { check_validation! { " struct Unsized { data: array } fn local_ptr_dynamic_array(okay: ptr) { var not_okay: ptr> = &(*okay).data; } ": Err(naga::valid::ValidationError::Function { error: naga::valid::FunctionError::LocalVariable { name: local_var_name, error: naga::valid::LocalVariableError::InvalidType(_), .. }, .. }) if local_var_name == "not_okay" } } #[test] fn dead_code() { check_validation! { " fn dead_code_after_if(condition: bool) -> i32 { if (condition) { return 1; } else { return 2; } return 3; } ": Ok(_) } check_validation! { " fn dead_code_after_block() -> i32 { { return 1; } return 2; } ": Err(naga::valid::ValidationError::Function { error: naga::valid::FunctionError::InstructionsAfterReturn, .. }) } } #[test] fn invalid_runtime_sized_arrays() { // You can't have structs whose last member is an unsized struct. An unsized // array may only appear as the last member of a struct used directly as a // variable's store type. check_validation! { " struct Unsized { arr: array } struct Outer { legit: i32, _unsized: Unsized } @group(0) @binding(0) var outer: Outer; fn fetch(i: i32) -> f32 { return outer._unsized.arr[i]; } ": Err(naga::valid::ValidationError::Type { name: struct_name, error: naga::valid::TypeError::InvalidDynamicArray(member_name, _), .. }) if struct_name == "Outer" && member_name == "_unsized" } } #[test] fn select() { check_validation! { " fn select_pointers(which: bool) -> i32 { var x: i32 = 1; var y: i32 = 2; let p = select(&x, &y, which); return *p; } ", " fn select_arrays(which: bool) -> i32 { var x: array; var y: array; let s = select(x, y, which); return s[0]; } ", " struct S { member: i32 } fn select_structs(which: bool) -> S { var x: S = S(1); var y: S = S(2); let s = select(x, y, which); return s; } ": Err( naga::valid::ValidationError::Function { name, error: naga::valid::FunctionError::Expression { error: naga::valid::ExpressionError::InvalidSelectTypes, .. }, .. }, ) if name.starts_with("select_") } } #[test] fn last_case_falltrough() { check_validation! { " fn test_falltrough() { switch(0) { default: {} case 0: { fallthrough; } } } ": Err( naga::valid::ValidationError::Function { error: naga::valid::FunctionError::LastCaseFallTrough, .. }, ) } } #[test] fn missing_default_case() { check_validation! { " fn test_missing_default_case() { switch(0) { case 0: {} } } ": Err( naga::valid::ValidationError::Function { error: naga::valid::FunctionError::MissingDefaultCase, .. }, ) } } #[test] fn wrong_access_mode() { // The assignments to `global.i` should be forbidden, because they are in // variables whose access mode is `read`, not `read_write`. check_validation! { " struct Globals { i: i32 } @group(0) @binding(0) var globals: Globals; fn store(v: i32) { globals.i = v; } ", " struct Globals { i: i32 } @group(0) @binding(0) var globals: Globals; fn store(v: i32) { globals.i = v; } ": Err( naga::valid::ValidationError::Function { name, error: naga::valid::FunctionError::InvalidStorePointer(_), .. }, ) if name == "store" } } #[test] fn io_shareable_types() { for numeric in "i32 u32 f32".split_whitespace() { let types = format!( "{} vec2<{}> vec3<{}> vec4<{}>", numeric, numeric, numeric, numeric ); for ty in types.split_whitespace() { check_one_validation! { &format!("@vertex fn f(@location(0) arg: {}) -> @builtin(position) vec4 {{ return vec4(0.0); }}", ty), Ok(_module) } } } for ty in "bool vec2 vec3 vec4 array mat2x2 ptr" .split_whitespace() { check_one_validation! { &format!("@vertex fn f(@location(0) arg: {}) -> @builtin(position) vec4 {{ return vec4(0.0); }}", ty), Err( naga::valid::ValidationError::EntryPoint { stage: naga::ShaderStage::Vertex, name, error: naga::valid::EntryPointError::Argument( 0, naga::valid::VaryingError::NotIOShareableType( _, ), ), }, ) if name == "f" } } } #[test] fn host_shareable_types() { // Host-shareable, constructible types. let types = "i32 u32 f32 vec2 vec3 vec4 mat4x4 array,4> AStruct"; for ty in types.split_whitespace() { check_one_validation! { &format!("struct AStruct {{ member: array, 8> }}; @group(0) @binding(0) var ubuf: {}; @group(0) @binding(1) var sbuf: {};", ty, ty), Ok(_module) } } // Host-shareable but not constructible types. let types = "atomic atomic array,4> array AStruct"; for ty in types.split_whitespace() { check_one_validation! { &format!("struct AStruct {{ member: array, 8> }}; @group(0) @binding(1) var sbuf: {};", ty), Ok(_module) } } // Types that are neither host-shareable nor constructible. for ty in "bool ptr".split_whitespace() { check_one_validation! { &format!("@group(0) @binding(0) var sbuf: {};", ty), Err( naga::valid::ValidationError::GlobalVariable { name, handle: _, error: naga::valid::GlobalVariableError::MissingTypeFlags { .. }, }, ) if name == "sbuf" } check_one_validation! { &format!("@group(0) @binding(0) var ubuf: {};", ty), Err(naga::valid::ValidationError::GlobalVariable { name, handle: _, error: naga::valid::GlobalVariableError::MissingTypeFlags { .. }, }, ) if name == "ubuf" } } } #[test] fn misplaced_break_if() { check( " fn test_misplaced_break_if() { loop { break if true; } } ", r###"error: A break if is only allowed in a continuing block ┌─ wgsl:4:17 │ 4 │ break if true; │ ^^^^^^^^ not in a continuing block "###, ); } #[test] fn break_if_bad_condition() { check_validation! { " fn test_break_if_bad_condition() { loop { continuing { break if 1; } } } ": Err( naga::valid::ValidationError::Function { error: naga::valid::FunctionError::InvalidIfType(_), .. }, ) } } #[test] fn swizzle_assignment() { check( " fn f() { var v = vec2(0); v.xy = vec2(1); } ", r###"error: invalid left-hand side of assignment ┌─ wgsl:4:13 │ 4 │ v.xy = vec2(1); │ ^^^^ cannot assign to this expression │ = note: WGSL does not support assignments to swizzles = note: consider assigning each component individually "###, ); } #[test] fn binary_statement() { check( " fn f() { 3 + 5; } ", r###"error: expected assignment or increment/decrement, found '3 + 5' ┌─ wgsl:3:13 │ 3 │ 3 + 5; │ ^^^^^ expected assignment or increment/decrement "###, ); } #[test] fn assign_to_expr() { check( " fn f() { 3 + 5 = 10; } ", r###"error: invalid left-hand side of assignment ┌─ wgsl:3:13 │ 3 │ 3 + 5 = 10; │ ^^^^^ cannot assign to this expression "###, ); } #[test] fn assign_to_let() { check( " fn f() { let a = 10; a = 20; } ", r###"error: invalid left-hand side of assignment ┌─ wgsl:4:10 │ 4 │ a = 20; │ ^ cannot assign to this expression │ = note: 'a' is an immutable binding = note: consider declaring it with `var` instead of `let` "###, ); } ================================================ FILE: resources/Info.plist ================================================ LSMinimumSystemVersion 10.13 CFBundleExecutable GraphPU_Launcher CFBundleDisplayName GraphPU CFBundleGetInfoString 0.5.0 2023-03-03, Wlab CFBundleIconFile app.icns CFBundleIdentifier org.ioclab.graphpu CFBundleInfoDictionaryVersion 6.0 CFBundleName GraphPU CFBundlePackageType APPL CFBundleShortVersionString 0.5.0 CFBundleSignature ???? CFBundleVersion 0.5.0 2023-03-03 NSPrincipalClass NSApplication NSHighResolutionCapable LSApplicationCategoryType public.app-category.graphics-design ================================================ FILE: scripts/create-dmg-1.1.0/.editorconfig ================================================ # EditorConfig for create-dmg project # EditorConfig is awesome: https://EditorConfig.org root = true [*] end_of_line = lf insert_final_newline = true charset = utf-8 # We use tabs in our own code [{create-dmg,*.applescript,*.sh}] indent_style = tab indent_size = 2 # But the Python code we pull in from pyhacker uses spaces [*.py] indent_style = space indent_size = 4 ================================================ FILE: scripts/create-dmg-1.1.0/.gitignore ================================================ .svn .vscode *.dmg .DS_Store ================================================ FILE: scripts/create-dmg-1.1.0/.this-is-the-create-dmg-repo ================================================ This is just a dummy file so create-dmg can tell whether it's being run from inside the Git repo or from an installed location. ================================================ FILE: scripts/create-dmg-1.1.0/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2008-2014 Andrey Tarantsov Copyright (c) 2020 Andrew Janke Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: scripts/create-dmg-1.1.0/Makefile ================================================ # Makefile for Cowsay PACKAGE_TARNAME = create-dmg prefix = /usr/local exec_prefix = ${prefix} bindir = ${exec_prefix}/bin datarootdir = ${prefix}/share datadir = ${datarootdir} docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} sysconfdir = ${prefix}/etc mandir=${datarootdir}/man srcdir = . SHELL = /bin/sh INSTALL = install INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = ${INSTALL} -m 644 .PHONY: install uninstall install: create-dmg $(INSTALL) -d $(DESTDIR)$(prefix) $(INSTALL) -d $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) create-dmg $(DESTDIR)$(bindir)/create-dmg $(INSTALL) -d $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME) cp -R support $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME) cp -R examples $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME) cp -R tests $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME) uninstall: rm -f $(DESTDIR)$(bindir)/create-dmg rm -rf $(DESTDIR)$(datadir)/$(PACKAGE_TARNAME) ================================================ FILE: scripts/create-dmg-1.1.0/README.md ================================================ create-dmg ========== A shell script to build fancy DMGs. Status and contribution policy ------------------------------ Create-dmg is mostly maintained by [@aonez](https://github.com/aonez) and the contributors who send pull requests. The project home page is . We will merge any pull request that adds something useful and does not break existing things. If you're an active user and want to be a maintainer, or just want to chat, please ping us on Gitter at [gitter.im/create-dmg/Lobby](https://gitter.im/create-dmg/Lobby), or [email Andrew directly](floss@apjanke.net). Create-dmg was originally created by [Andrey Tarantsov](https://github.com/andreyvit). In May 2020 [Andrew Janke](https://github.com/apjanke) helped vastly with the project. Installation ------------ - You can install this script using [Homebrew](https://brew.sh): ```sh brew install create-dmg ``` - You can download the [latest release](https://github.com/create-dmg/create-dmg/releases/latest) and install it from there: ```sh make install ``` - You can also clone the entire repository and run it locally from there: ```sh git clone https://github.com/create-dmg/create-dmg.git ``` Usage ----- ```sh create-dmg [options ...] ``` All contents of source\_folder will be copied into the disk image. **Options:** - **--volname \:** set volume name (displayed in the Finder sidebar and window title) - **--volicon \:** set volume icon - **--background \:** set folder background image (provide png, gif, jpg) - **--window-pos \ \:** set position the folder window - **--window-size \ \:** set size of the folder window - **--text-size \:** set window text size (10-16) - **--icon-size \:** set window icons size (up to 128) - **--icon \ \ \:** set position of the file's icon - **--hide-extension \:** hide the extension of file - **--custom-icon \ \ \:** set position and -tom icon - **--app-drop-link \ \:** make a drop link to Applications, at location x, y - **--ql-drop-link \ \:** make a drop link to /Library/QuickLook, at location x, y - **--eula \:** attach a license file to the dmg - **--rez \:** specify custom path to Rez tool used to include license file - **--no-internet-enable:** disable automatic mount© - **--format:** specify the final image format (UDZO|UDBZ|ULFO|ULMO) (default is UDZO) - **--add-file \ \ \ \:** add additional file or folder (can be used multiple times) - **--disk-image-size \:** set the disk image size manually to x MB - **--hdiutil-verbose:** execute hdiutil in verbose mode - **--hdiutil-quiet:** execute hdiutil in quiet mode - **--bless:** bless the mount folder (deprecated, needs macOS 12.2.1 or older, [#127](https://github.com/create-dmg/create-dmg/pull/127)) - **--codesign \:** codesign the disk image with the specified signature - **--notarize \:** notarize the disk image (waits and staples) with the keychain stored credentials For more information check [Apple's documentation](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow) - **--skip-jenkins:** skip Finder-prettifying AppleScript, useful in Sandbox and non-GUI environments, [#72](https://github.com/create-dmg/create-dmg/pull/72) - **--sandbox-safe:** hdiutil with sandbox compatibility, do not bless and do not execute the cosmetic AppleScript - **--version:** show tool version number - **-h, --help:** display the help Example ------- ```sh #!/bin/sh test -f Application-Installer.dmg && rm Application-Installer.dmg create-dmg \ --volname "Application Installer" \ --volicon "application_icon.icns" \ --background "installer_background.png" \ --window-pos 200 120 \ --window-size 800 400 \ --icon-size 100 \ --icon "Application.app" 200 190 \ --hide-extension "Application.app" \ --app-drop-link 600 185 \ "Application-Installer.dmg" \ "source_folder/" ``` See the `examples` folder in the source tree for more examples. Requirements ------------ Nothing except a standard installation of macOS/OS X is required. We think this works in OS X 10.6 Snow Leopard and later. We'd like to keep it working in as many versions as possible, but unfortunately, we just don't have test boxes running old versions of OS X adequate to make this happen. Development and testing mostly happens in the last 3-5 years' worth of macOS releases; as of 2020, this means macOS 10.12 and later. But if you find a bug in an older version, go ahead and report it! We'll try to work with you to get it fixed. If you're running OS X 10.5 or later, you're SOL. That's just too hard to deal with in 2020. ;) Alternatives ------------ - [node-appdmg](https://github.com/LinusU/node-appdmg) - [dmgbuild](https://pypi.python.org/pypi/dmgbuild) - see the [StackOverflow question](http://stackoverflow.com/questions/96882/how-do-i-create-a-nice-looking-dmg-for-mac-os-x-using-command-line-tools) ================================================ FILE: scripts/create-dmg-1.1.0/builder/create-dmg.builder ================================================ SET app_name create-dmg VERSION create-dmg.cur create-dmg heads/master NEWDIR build.dir temp %-build - NEWFILE create-dmg.zip featured %.zip % COPYTO [build.dir] INTO create-dmg [create-dmg.cur]/create-dmg INTO sample [create-dmg.cur]/sample INTO support [create-dmg.cur]/support SUBSTVARS [build.dir]/create-dmg [[]] ZIP [create-dmg.zip] INTO [build-files-prefix] [build.dir] PUT megabox-builds create-dmg.zip PUT megabox-builds build.log PUT s3-builds create-dmg.zip PUT s3-builds build.log ================================================ FILE: scripts/create-dmg-1.1.0/create-dmg ================================================ #!/usr/bin/env bash # Create a read-only disk image of the contents of a folder # Bail out on any unhandled errors set -e; CDMG_VERSION='1.1.0' # The full path to the "support/" directory this script is using # (This will be set up by code later in the script.) CDMG_SUPPORT_DIR="" WINX=10 WINY=60 WINW=500 WINH=350 ICON_SIZE=128 TEXT_SIZE=16 FORMAT="UDZO" ADD_FILE_SOURCES=() ADD_FILE_TARGETS=() IMAGEKEY="" HDIUTIL_VERBOSITY="" SANDBOX_SAFE=0 BLESS=0 SKIP_JENKINS=0 MAXIMUM_UNMOUNTING_ATTEMPTS=3 SIGNATURE="" NOTARIZE="" function pure_version() { echo "$CDMG_VERSION" } function version() { echo "create-dmg $(pure_version)" } function usage() { version cat < All contents of will be copied into the disk image. Options: --volname set volume name (displayed in the Finder sidebar and window title) --volicon set volume icon --background set folder background image (provide png, gif, or jpg) --window-pos set position the folder window --window-size set size of the folder window --text-size set window text size (10-16) --icon-size set window icons size (up to 128) --icon file_name set position of the file's icon --hide-extension hide the extension of file --app-drop-link make a drop link to Applications, at location x,y --ql-drop-link make a drop link to user QuickLook install dir, at location x,y --eula attach a license file to the dmg (plain text or RTF) --no-internet-enable disable automatic mount & copy --format specify the final disk image format (UDZO|UDBZ|ULFO|ULMO) (default is UDZO) --add-file | add additional file or folder (can be used multiple times) --disk-image-size set the disk image size manually to x MB --hdiutil-verbose execute hdiutil in verbose mode --hdiutil-quiet execute hdiutil in quiet mode --bless bless the mount folder (deprecated, needs macOS 12.2.1 or older) --codesign codesign the disk image with the specified signature --notarize notarize the disk image (waits and staples) with the keychain stored credentials --sandbox-safe execute hdiutil with sandbox compatibility and do not bless --version show create-dmg version number -h, --help display this help screen EOHELP exit 0 } # Argument parsing while [[ "${1:0:1}" = "-" ]]; do case $1 in --volname) VOLUME_NAME="$2" shift; shift;; --volicon) VOLUME_ICON_FILE="$2" shift; shift;; --background) BACKGROUND_FILE="$2" BACKGROUND_FILE_NAME="$(basename "$BACKGROUND_FILE")" BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" REPOSITION_HIDDEN_FILES_CLAUSE="set position of every item to {theBottomRightX + 100, 100}" shift; shift;; --icon-size) ICON_SIZE="$2" shift; shift;; --text-size) TEXT_SIZE="$2" shift; shift;; --window-pos) WINX=$2; WINY=$3 shift; shift; shift;; --window-size) WINW=$2; WINH=$3 shift; shift; shift;; --icon) POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} " shift; shift; shift; shift;; --hide-extension) HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true " shift; shift;; -h | --help) usage;; --version) version; exit 0;; --pure-version) pure_version; exit 0;; --ql-drop-link) QL_LINK=$2 QL_CLAUSE="set position of item \"QuickLook\" to {$2, $3} " shift; shift; shift;; --app-drop-link) APPLICATION_LINK=$2 APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3} " shift; shift; shift;; --eula) EULA_RSRC=$2 shift; shift;; --no-internet-enable) NOINTERNET=1 shift;; --format) FORMAT="$2" shift; shift;; --add-file | --add-folder) ADD_FILE_TARGETS+=("$2") ADD_FILE_SOURCES+=("$3") POSITION_CLAUSE="${POSITION_CLAUSE} set position of item \"$2\" to {$4, $5} " shift; shift; shift; shift; shift;; --disk-image-size) DISK_IMAGE_SIZE="$2" shift; shift;; --hdiutil-verbose) HDIUTIL_VERBOSITY='-verbose' shift;; --hdiutil-quiet) HDIUTIL_VERBOSITY='-quiet' shift;; --codesign) SIGNATURE="$2" shift; shift;; --notarize) NOTARIZE="$2" shift; shift;; --sandbox-safe) SANDBOX_SAFE=1 shift;; --bless) BLESS=1 shift;; --rez) echo "REZ is no more directly used. You can remove the --rez argument." shift; shift;; --skip-jenkins) SKIP_JENKINS=1 shift;; -*) echo "Unknown option: $1. Run 'create-dmg --help' for help." exit 1;; esac case $FORMAT in UDZO) IMAGEKEY="-imagekey zlib-level=9";; UDBZ) IMAGEKEY="-imagekey bzip2-level=9";; ULFO) ;; ULMO) ;; *) echo >&2 "Unknown disk image format: $FORMAT" exit 1;; esac done if [[ -z "$2" ]]; then echo "Not enough arguments. Run 'create-dmg --help' for help." exit 1 fi DMG_PATH="$1" SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" # Argument validation checks if [[ "${DMG_PATH: -4}" != ".dmg" ]]; then echo "Output file name must end with a .dmg extension. Run 'create-dmg --help' for help." exit 1 fi # Main script logic SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DMG_DIRNAME="$(dirname "$DMG_PATH")" DMG_DIR="$(cd "$DMG_DIRNAME" > /dev/null; pwd)" DMG_NAME="$(basename "$DMG_PATH")" DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" # Detect where we're running from sentinel_file="$SCRIPT_DIR/.this-is-the-create-dmg-repo" if [[ -f "$sentinel_file" ]]; then # We're running from inside a repo CDMG_SUPPORT_DIR="$SCRIPT_DIR/support" else # We're running inside an installed location bin_dir="$SCRIPT_DIR" prefix_dir=$(dirname "$bin_dir") CDMG_SUPPORT_DIR="$prefix_dir/share/create-dmg/support" fi if [[ -z "$VOLUME_NAME" ]]; then VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" fi if [[ ! -d "$CDMG_SUPPORT_DIR" ]]; then echo >&2 "Cannot find support/ directory: expected at: $CDMG_SUPPORT_DIR" exit 1 fi if [[ -f "$SRC_FOLDER/.DS_Store" ]]; then echo "Deleting .DS_Store found in source folder" rm "$SRC_FOLDER/.DS_Store" fi # Create the image echo "Creating disk image..." if [[ -f "${DMG_TEMP_NAME}" ]]; then rm -f "${DMG_TEMP_NAME}" fi # Use Megabytes since hdiutil fails with very large byte numbers function blocks_to_megabytes() { # Add 1 extra MB, since there's no decimal retention here MB_SIZE=$((($1 * 512 / 1000 / 1000) + 1)) echo $MB_SIZE } function get_size() { # Get block size in disk bytes_size=$(du -s "$1" | sed -e 's/ .*//g') echo $(blocks_to_megabytes $bytes_size) } # Create the DMG with the specified size or the hdiutil estimation CUSTOM_SIZE='' if [[ -n "$DISK_IMAGE_SIZE" ]]; then CUSTOM_SIZE="-size ${DISK_IMAGE_SIZE}m" fi if [[ $SANDBOX_SAFE -eq 0 ]]; then hdiutil create ${HDIUTIL_VERBOSITY} -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" \ -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW ${CUSTOM_SIZE} "${DMG_TEMP_NAME}" else hdiutil makehybrid ${HDIUTIL_VERBOSITY} -default-volume-name "${VOLUME_NAME}" -hfs -o "${DMG_TEMP_NAME}" "$SRC_FOLDER" hdiutil convert -format UDRW -ov -o "${DMG_TEMP_NAME}" "${DMG_TEMP_NAME}" DISK_IMAGE_SIZE_CUSTOM=$DISK_IMAGE_SIZE fi # Get the created DMG actual size DISK_IMAGE_SIZE=$(get_size "${DMG_TEMP_NAME}") # Use the custom size if bigger if [[ $SANDBOX_SAFE -eq 1 ]] && [[ ! -z "$DISK_IMAGE_SIZE_CUSTOM" ]] && [[ $DISK_IMAGE_SIZE_CUSTOM -gt $DISK_IMAGE_SIZE ]]; then DISK_IMAGE_SIZE=$DISK_IMAGE_SIZE_CUSTOM fi # Estimate the additional sources size if [[ -n "$ADD_FILE_SOURCES" ]]; then for i in "${!ADD_FILE_SOURCES[@]}"; do SOURCE_SIZE=$(get_size "${ADD_FILE_SOURCES[$i]}") DISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + $SOURCE_SIZE) done fi # Add extra space for additional resources DISK_IMAGE_SIZE=$(expr $DISK_IMAGE_SIZE + 20) # Make sure target image size is within limits MIN_DISK_IMAGE_SIZE=$(hdiutil resize -limits "${DMG_TEMP_NAME}" | awk 'NR=1{print int($1/2048+1)}') if [ $MIN_DISK_IMAGE_SIZE -gt $DISK_IMAGE_SIZE ]; then DISK_IMAGE_SIZE=$MIN_DISK_IMAGE_SIZE fi # Resize the image for the extra stuff hdiutil resize ${HDIUTIL_VERBOSITY} -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}" # Mount the new DMG MOUNT_DIR="/Volumes/${VOLUME_NAME}" # Unmount leftover dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it) if [[ -d "${MOUNT_DIR}" ]]; then echo "Unmounting old disk image from $MOUNT_DIR..." DEV_NAME=$(hdiutil info | grep -E --color=never '^/dev/' | sed 1q | awk '{print $1}') hdiutil detach "${DEV_NAME}" fi echo "Mounting disk image..." echo "Mount directory: $MOUNT_DIR" DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | grep -E --color=never '^/dev/' | sed 1q | awk '{print $1}') echo "Device name: $DEV_NAME" if [[ -n "$BACKGROUND_FILE" ]]; then echo "Copying background file '$BACKGROUND_FILE'..." [[ -d "$MOUNT_DIR/.background" ]] || mkdir "$MOUNT_DIR/.background" cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" fi if [[ -n "$APPLICATION_LINK" ]]; then echo "Making link to Applications dir..." echo $MOUNT_DIR ln -s /Applications "$MOUNT_DIR/Applications" fi if [[ -n "$QL_LINK" ]]; then echo "Making link to QuickLook install dir..." echo $MOUNT_DIR ln -s "/Library/QuickLook" "$MOUNT_DIR/QuickLook" fi if [[ -n "$VOLUME_ICON_FILE" ]]; then echo "Copying volume icon file '$VOLUME_ICON_FILE'..." cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns" SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" fi if [[ -n "$ADD_FILE_SOURCES" ]]; then echo "Copying custom files..." for i in "${!ADD_FILE_SOURCES[@]}"; do echo "${ADD_FILE_SOURCES[$i]}" cp -a "${ADD_FILE_SOURCES[$i]}" "$MOUNT_DIR/${ADD_FILE_TARGETS[$i]}" done fi # Run AppleScript to do all the Finder cosmetic stuff APPLESCRIPT_FILE=$(mktemp -t createdmg.tmp.XXXXXXXXXX) if [[ $SANDBOX_SAFE -eq 1 ]]; then echo "Skipping Finder-prettifying AppleScript because we are in Sandbox..." else if [[ $SKIP_JENKINS -eq 0 ]]; then cat "$CDMG_SUPPORT_DIR/template.applescript" \ | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" \ -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" \ -e "s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g" \ -e "s/ICON_SIZE/$ICON_SIZE/g" -e "s/TEXT_SIZE/$TEXT_SIZE/g" \ | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" \ | perl -pe "s/QL_CLAUSE/$QL_CLAUSE/g" \ | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" \ | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" \ > "$APPLESCRIPT_FILE" sleep 2 # pause to workaround occasional "Can’t get disk" (-1728) issues echo "Running AppleScript to make Finder stuff pretty: /usr/bin/osascript \"${APPLESCRIPT_FILE}\" \"${VOLUME_NAME}\"" if /usr/bin/osascript "${APPLESCRIPT_FILE}" "${VOLUME_NAME}"; then # Okay, we're cool true else echo >&2 "Failed running AppleScript" hdiutil detach "${DEV_NAME}" exit 64 fi echo "Done running the AppleScript..." sleep 4 rm "$APPLESCRIPT_FILE" fi fi # Make sure it's not world writeable echo "Fixing permissions..." chmod -Rf go-w "${MOUNT_DIR}" &> /dev/null || true echo "Done fixing permissions" # Make the top window open itself on mount: if [[ $BLESS -eq 1 && $SANDBOX_SAFE -eq 0 ]]; then echo "Blessing started" bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}" echo "Blessing finished" else echo "Skipping blessing on sandbox" fi if [[ -n "$VOLUME_ICON_FILE" ]]; then # Tell the volume that it has a special file attribute SetFile -a C "$MOUNT_DIR" fi # Delete unnecessary file system events log if possible echo "Deleting .fseventsd" rm -rf "${MOUNT_DIR}/.fseventsd" || true # Unmount unmounting_attempts=0 until echo "Unmounting disk image..." (( unmounting_attempts++ )) hdiutil detach "${DEV_NAME}" exit_code=$? (( exit_code == 0 )) && break # nothing goes wrong (( exit_code != 16 )) && exit $exit_code # exit with the original exit code # The above statement returns 1 if test failed (exit_code == 16). # It can make the code in the {do... done} block to be executed do (( unmounting_attempts == MAXIMUM_UNMOUNTING_ATTEMPTS )) && exit 16 # patience exhausted, exit with code EBUSY echo "Wait a moment..." sleep $(( 1 * (2 ** unmounting_attempts) )) done unset unmounting_attempts # Compress image echo "Compressing disk image..." hdiutil convert ${HDIUTIL_VERBOSITY} "${DMG_TEMP_NAME}" -format ${FORMAT} ${IMAGEKEY} -o "${DMG_DIR}/${DMG_NAME}" rm -f "${DMG_TEMP_NAME}" # Adding EULA resources if [[ -n "${EULA_RSRC}" && "${EULA_RSRC}" != "-null-" ]]; then echo "Adding EULA resources..." # # Use udifrez instead flatten/rez/unflatten # https://github.com/create-dmg/create-dmg/issues/109 # # Based on a thread from dawn2dusk & peterguy # https://developer.apple.com/forums/thread/668084 # EULA_RESOURCES_FILE=$(mktemp -t createdmg.tmp.XXXXXXXXXX) EULA_FORMAT=$(file -b ${EULA_RSRC}) if [[ ${EULA_FORMAT} == 'Rich Text Format data'* ]] ; then EULA_FORMAT='RTF ' else EULA_FORMAT='TEXT' fi # Encode the EULA to base64 # Replace 'openssl base64' with 'base64' if Mac OS X 10.6 support is no more needed # EULA_DATA="$(base64 -b 52 "${EULA_RSRC}" | sed s$'/^\(.*\)$/\t\t\t\\1/')" EULA_DATA="$(openssl base64 -in "${EULA_RSRC}" | tr -d '\n' | awk '{gsub(/.{52}/,"&\n")}1' | sed s$'/^\(.*\)$/\t\t\t\\1/')" # Fill the template with the custom EULA contents eval "cat > \"${EULA_RESOURCES_FILE}\" </dev/null 2>/dev/null; then hdiutil internet-enable -yes "${DMG_DIR}/${DMG_NAME}" else echo "hdiutil does not support internet-enable. Note it was removed in macOS 10.15." fi fi if [[ -n "${SIGNATURE}" && "${SIGNATURE}" != "-null-" ]]; then echo "Codesign started" codesign -s "${SIGNATURE}" "${DMG_DIR}/${DMG_NAME}" dmgsignaturecheck="$(codesign --verify --deep --verbose=2 --strict "${DMG_DIR}/${DMG_NAME}" 2>&1 >/dev/null)" if [ $? -eq 0 ]; then echo "The disk image is now codesigned" else echo "The signature seems invalid${NC}" exit 1 fi fi if [[ -n "${NOTARIZE}" && "${NOTARIZE}" != "-null-" ]]; then echo "Notarization started" xcrun notarytool submit "${DMG_DIR}/${DMG_NAME}" --keychain-profile "${NOTARIZE}" --wait echo "Stapling the notarization ticket" staple="$(xcrun stapler staple "${DMG_DIR}/${DMG_NAME}")" if [ $? -eq 0 ]; then echo "The disk image is now notarized" else echo "$staple" echo "The notarization failed with error $?" exit 1 fi fi # All done! echo "Disk image done" exit 0 ================================================ FILE: scripts/create-dmg-1.1.0/doc-project/Developer Notes.md ================================================ # create-dmg Developer Notes ## Repo layout - `create-dmg` in the root of the repo is the main program - `support/` contains auxiliary scripts used by `create-dmg`; it must be at that relative position to `create-dmg` - `builder/` contains ???? - `examples/` contains user-facing examples - `tests/` contains regression tests for developers - `doc-project/` contains developer-facing documentation about this project ### tests/ The `tests/` folder contains regression tests for developers. Each test is in its own subfolder. Each subfolder name should start with a 3-digit number that is the number of the corresponding bug report in create-dmg's GitHub issue tracker. The tests are to be run manually, with the results examined manually. There's no automated script to run them as a suite and check their results. That might be nice to have. ### examples/ Each example is in its own subfolder. The subfolder prefix number is arbitrary; these numbers should roughly be in order of "advancedness" of examples, so it makes sense for users to go through them in order. ## Versioning As of May 2020, we're using SemVer versioning. The old version numbers were 4-parters, like "1.0.0.7". Now we use 3-part SemVer versions, like "1.0.8". This change happened after version 1.0.0.7; 1.0.8 is the next release after 1.0.0.7. The suffix "-SNAPSHOT" is used to denote a version that is still under development. ================================================ FILE: scripts/create-dmg-1.1.0/doc-project/Release Checklist.md ================================================ # Release Checklist - Update the version in `create-dmg`'s `pure_version` function - Remove the "-SNAPSHOT" suffix - Commit - Tag the release as `vX.X.X` - `git push --tags` - Create a release on the GitHub project page - Open development on the next release - Bump the version number and add a "-SNAPSHOT" suffix to it ================================================ FILE: scripts/create-dmg-1.1.0/examples/01-main-example/sample ================================================ #!/usr/bin/env bash if [[ -e ../../create-dmg ]]; then # We're running from the repo CREATE_DMG=../../create-dmg else # We're running from an installation under a prefix CREATE_DMG=../../../../bin/create-dmg fi # Since create-dmg does not clobber, be sure to delete previous DMG [[ -f Application-Installer.dmg ]] && rm Application-Installer.dmg # Create the DMG $CREATE_DMG \ --volname "Application Installer" \ --background "installer_background.png" \ --window-pos 200 120 \ --window-size 800 400 \ --icon-size 100 \ --icon "Application.app" 200 190 \ --hide-extension "Application.app" \ --app-drop-link 600 185 \ "Application-Installer.dmg" \ "source_folder/" ================================================ FILE: scripts/create-dmg-1.1.0/examples/01-main-example/source_folder/Application.app ================================================ ================================================ FILE: scripts/create-dmg-1.1.0/support/eula-resources-template.xml ================================================ LPic Attributes 0x0000 Data AAAAAgAAAAAAAAAAAAQAAA== ID 5000 Name STR# Attributes 0x0000 Data AAYNRW5nbGlzaCB0ZXN0MQVBZ3JlZQhEaXNhZ3JlZQVQcmludAdT YXZlLi4ueklmIHlvdSBhZ3JlZSB3aXRoIHRoZSB0ZXJtcyBvZiB0 aGlzIGxpY2Vuc2UsIGNsaWNrICJBZ3JlZSIgdG8gYWNjZXNzIHRo ZSBzb2Z0d2FyZS4gIElmIHlvdSBkbyBub3QgYWdyZWUsIHByZXNz ICJEaXNhZ3JlZS4i ID 5000 Name English buttons Attributes 0x0000 Data AAYHRW5nbGlzaAVBZ3JlZQhEaXNhZ3JlZQVQcmludAdTYXZlLi4u e0lmIHlvdSBhZ3JlZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIGxp Y2Vuc2UsIHByZXNzICJBZ3JlZSIgdG8gaW5zdGFsbCB0aGUgc29m dHdhcmUuICBJZiB5b3UgZG8gbm90IGFncmVlLCBwcmVzcyAiRGlz YWdyZWUiLg== ID 5002 Name English ${EULA_FORMAT} Attributes 0x0000 Data ${EULA_DATA} ID 5000 Name English TMPL Attributes 0x0000 Data E0RlZmF1bHQgTGFuZ3VhZ2UgSUREV1JEBUNvdW50T0NOVAQqKioq TFNUQwtzeXMgbGFuZyBJRERXUkQebG9jYWwgcmVzIElEIChvZmZz ZXQgZnJvbSA1MDAwRFdSRBAyLWJ5dGUgbGFuZ3VhZ2U/RFdSRAQq KioqTFNURQ== ID 128 Name LPic styl Attributes 0x0000 Data AAMAAAAAAAwACQAUAAAAAAAAAAAAAAAAACcADAAJABQBAAAAAAAA AAAAAAAAKgAMAAkAFAAAAAAAAAAAAAA= ID 5000 Name English ================================================ FILE: scripts/create-dmg-1.1.0/support/template.applescript ================================================ on run (volumeName) tell application "Finder" tell disk (volumeName as string) open set theXOrigin to WINX set theYOrigin to WINY set theWidth to WINW set theHeight to WINH set theBottomRightX to (theXOrigin + theWidth) set theBottomRightY to (theYOrigin + theHeight) set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" tell container window set current view to icon view set toolbar visible to false set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} set statusbar visible to false REPOSITION_HIDDEN_FILES_CLAUSE end tell set opts to the icon view options of container window tell opts set icon size to ICON_SIZE set text size to TEXT_SIZE set arrangement to not arranged end tell BACKGROUND_CLAUSE -- Positioning POSITION_CLAUSE -- Hiding HIDING_CLAUSE -- Application and QL Link Clauses APPLICATION_CLAUSE QL_CLAUSE close open -- Force saving of the size delay 1 tell container window set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} end tell end tell delay 1 tell disk (volumeName as string) tell container window set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} end tell end tell --give the finder some time to write the .DS_Store file delay 3 set waitTime to 0 set ejectMe to false repeat while ejectMe is false delay 1 set waitTime to waitTime + 1 if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true end repeat log "waited " & waitTime & " seconds for .DS_STORE to be created." end tell end run ================================================ FILE: scripts/create-dmg-1.1.0/tests/007-space-in-dir-name/my files/hello.txt ================================================ Hello world ================================================ FILE: scripts/create-dmg-1.1.0/tests/007-space-in-dir-name/run-test ================================================ #!/usr/bin/env bash # Test for https://github.com/create-dmg/create-dmg/issues/7 - spaces in folder names ../../create-dmg "my disk image.dmg" "my files" ================================================ FILE: scripts/macos_build.sh ================================================ #!/bin/bash set -e ARCH=x86_64-apple-darwin ARCH_NAME=x86_64 rustup target add x86_64-apple-darwin if [ $# -ne 0 ]; then echo "$1" if [ "$1" = "-a" ]; then echo "222" ARCH=aarch64-apple-darwin ARCH_NAME=arm64 rustup target add aarch64-apple-darwin fi fi MACOS_DMG_NAME=graphpu-0.5.0-macos-${ARCH_NAME} APP_NAME=graphpu MACOS_BIN_NAME=GraphPU MACOS_APP_NAME=GraphPU MACOS_APP_NAME_APP=$MACOS_APP_NAME.app MACOS_APP_DIR_PREFIX=app_${ARCH_NAME} MACOS_APP_DIR=${MACOS_APP_DIR_PREFIX}/${MACOS_APP_NAME_APP} cd ../ mkdir -p macos_build cd macos_build echo "Creating app directory structure" rm -rf $MACOS_APP_NAME rm -rf $MACOS_APP_DIR mkdir -p $MACOS_APP_DIR/Contents/MacOS cargo rustc \ --release \ --target=$ARCH \ --features exe # --verbose \ echo "Copying binary" MACOS_APP_BIN=$MACOS_APP_DIR/Contents/MacOS/$MACOS_BIN_NAME cp ../target/$ARCH/release/$APP_NAME $MACOS_APP_BIN chmod 777 $MACOS_APP_BIN echo "Copying resources directory" cp -r ../resources $MACOS_APP_DIR/Contents/MacOS echo "Copying launcher" cp ../scripts/macos_launch.sh $MACOS_APP_DIR/Contents/MacOS/${MACOS_APP_NAME}_Launcher chmod 777 $MACOS_APP_DIR/Contents/MacOS/${MACOS_APP_NAME}_Launcher echo "Copying Icon" mkdir -p $MACOS_APP_DIR/Contents/Resources cp ../resources/Info.plist $MACOS_APP_DIR/Contents/ cp ../resources/app.icns $MACOS_APP_DIR/Contents/Resources/ echo "Code Signing" codesign -s "5BW8DTZV3H" --deep -v -f -o runtime $MACOS_APP_DIR echo "Creating dmg" # mkdir -p $MACOS_APP_NAME # cp -r $MACOS_APP_DIR $MACOS_APP_NAME/ # rm -rf $MACOS_APP_NAME/.Trashes # FULL_NAME=$MACOS_APP_NAME # hdiutil create $FULL_NAME.dmg -srcfolder $MACOS_APP_NAME -ov # rm -rf $MACOS_APP_NAME # Since create-dmg does not clobber, be sure to delete previous DMG [[ -f $MACOS_DMG_NAME.dmg ]] && rm $MACOS_DMG_NAME.dmg # Create the DMG ../scripts/create-dmg-1.1.0/create-dmg \ --volname $MACOS_DMG_NAME \ --volicon "../resources/app.icns" \ --background "../scripts/installer_background.jpg" \ --window-pos 200 120 \ --window-size 540 375 \ --icon-size 120 \ --hide-extension $MACOS_APP_NAME_APP \ --text-size 12 \ --icon $MACOS_APP_NAME_APP 140 190 \ --hide-extension $MACOS_APP_NAME_APP \ --app-drop-link 400 190 \ $MACOS_DMG_NAME.dmg \ "./${MACOS_APP_DIR_PREFIX}" xcrun notarytool submit $MACOS_DMG_NAME.dmg \ --keychain-profile "nhciao" \ --wait xcrun stapler staple $MACOS_DMG_NAME.dmg cd ../ cd ./scripts/ ================================================ FILE: scripts/macos_build_entry.sh ================================================ #!/bin/bash . ./macos_build.sh . ./macos_build.sh -a ================================================ FILE: scripts/macos_cross_compile.sh ================================================ #!/bin/bash brew install mingw-w64 . ./windows_build.sh ================================================ FILE: scripts/macos_launch.sh ================================================ #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" BIN=GraphPU "${DIR}/${BIN}" ================================================ FILE: scripts/windows_build.sh ================================================ #!/bin/bash cd ../ BUILD_DIR=windows_build APP_BUNDLE_NAME=graphpu-0.5.0-windows-x86_64 APP_BUNDLE_DIR=${BUILD_DIR}/${APP_BUNDLE_NAME} ARCH=x86_64-pc-windows-msvc rm -rf ${APP_BUNDLE_DIR} rustup target add ${ARCH} cargo build --release --features exe --target ${ARCH} mkdir -p ${APP_BUNDLE_DIR}/ cp target/${ARCH}/release/graphpu.exe ${APP_BUNDLE_DIR}/GraphPU.exe cp -r resources ${APP_BUNDLE_DIR}/ #cd windows_build #rcedit "Graphpu.exe" --set-icon "resources\\app_icon.ico" ================================================ FILE: src/app.rs ================================================ use crate::components::detail_view::show_message; use crate::components::dock_view::DockView; use crate::components::drawer_view::DrawerView; use crate::components::shortcuts::Shortcut; use crate::constant::{FONT_SIZE_BODY, FONT_SIZE_HEADING}; use crate::models::app_model::DockStage; use crate::{ components::{ detail_view::DetailView, export_modal_view::ExportModal, graphics_view::GraphicsView, import_modal_view::ImportModal, inspector_view::InspectorView, menubar_view::MenuBarView, table_view::TableView, AppView, }, models::{ app_model::{AppModel, MainStage}, data_model::DataModel, graphics_model::GraphicsModel, Models, }, }; use egui::{Color32, TextStyle}; pub struct MainApp { pub models: Models, inspector_view: InspectorView, drawer_view: DrawerView, import_modal: ImportModal, export_modal: ExportModal, } impl MainApp { pub fn new(cc: &eframe::CreationContext<'_>) -> Self { let mut style = (*cc.egui_ctx.style()).clone(); style.visuals.widgets.active.fg_stroke.color = Color32::from_white_alpha(220); style.visuals.widgets.inactive.fg_stroke.color = Color32::from_white_alpha(190); style.visuals.widgets.noninteractive.fg_stroke.color = Color32::from_white_alpha(170); // style.visuals.widgets.noninteractive.bg_stroke.color = Color32::from_gray(0); style.visuals.selection.bg_fill = Color32::from_rgb(86, 89, 225); style.visuals.selection.stroke.color = Color32::from_white_alpha(240); style.visuals.widgets.hovered.bg_stroke.width = 0.0; style.visuals.widgets.hovered.expansion = 0.0; style.visuals.widgets.active.bg_stroke.width = 0.0; style.visuals.widgets.active.expansion = 0.0; // style.visuals.collapsing_header_frame = true; style.spacing.icon_width = 12.0; style.spacing.indent = 16.0; style.text_styles.get_mut(&TextStyle::Body).unwrap().size = FONT_SIZE_BODY; style.text_styles.get_mut(&TextStyle::Button).unwrap().size = FONT_SIZE_BODY; style.text_styles.get_mut(&TextStyle::Heading).unwrap().size = FONT_SIZE_HEADING; // style.text_styles = [ // (Heading, FontId::new(30.0, Proportional)), // (Name("Heading2".into()), FontId::new(25.0, Proportional)), // (Name("Context".into()), FontId::new(23.0, Proportional)), // (Body, FontId::new(18.0, Proportional)), // (Monospace, FontId::new(14.0, Proportional)), // (Button, FontId::new(14.0, Proportional)), // (Small, FontId::new(10.0, Proportional)), // ].into(); style.spacing.button_padding = egui::vec2(8.0, 1.0); cc.egui_ctx.set_style(style); let mut fonts = egui::FontDefinitions::default(); fonts.font_data.insert( "prop_font".to_owned(), egui::FontData::from_static(include_bytes!("./assets/fonts/droidsans.ttf")), ); fonts.font_data.insert( "mono_font".to_owned(), egui::FontData::from_static(include_bytes!("./assets/fonts/bmonofont-i18n.ttf")), ); // .ttf and .otf supported fonts .families .get_mut(&egui::FontFamily::Proportional) .unwrap() .insert(0, "prop_font".to_owned()); fonts .families .get_mut(&egui::FontFamily::Monospace) .unwrap() .insert(0, "mono_font".to_owned()); // .push("mono_font".to_owned()); cc.egui_ctx.set_fonts(fonts); // cc.egui_ctx.set_debug_on_hover(true); let mut main_app = MainApp { models: Models { graphics_model: GraphicsModel::init(cc), data_model: DataModel::default(), app_model: AppModel::default(), }, inspector_view: Default::default(), drawer_view: Default::default(), import_modal: ImportModal::default(), export_modal: ExportModal::default(), }; if let Some(pixels_per_point) = cc.integration_info.native_pixels_per_point { main_app.models.app_model.pixels_per_point = pixels_per_point; } main_app } } impl eframe::App for MainApp { fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { self.models.app_model.ui_frame_count += 1u32; egui::CentralPanel::default() .frame(egui::Frame::none()) .show(ctx, |ui| { ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0); // ui.set_enabled(false); Shortcut::default().apply(&mut self.models, ui, frame); if !self.models.app_model.is_fullscreen_graphics { MenuBarView::default().show(&mut self.models, ui, frame); DetailView::default().show(&mut self.models, ui, frame); self.inspector_view.show(&mut self.models, ui, frame); DockView::default().show(&mut self.models, ui, frame); if self.models.app_model.dock_stage != DockStage::None { self.drawer_view.show(&mut self.models, ui, frame); } match self.models.app_model.main_stage { MainStage::Graphics => { GraphicsView::default().show(&mut self.models, ui, frame) } MainStage::Table => TableView::default().show(&mut self.models, ui, frame), }; } else { GraphicsView::default().show(&mut self.models, ui, frame); show_message(&mut self.models, ui, frame, 2); } }); if self.models.app_model.is_import_visible { self.import_modal.show(ctx, &mut self.models); } if self.models.app_model.is_export_visible { self.export_modal.show(ctx, &mut self.models); } } } ================================================ FILE: src/assets/shaders/CS_graph_solver.wgsl ================================================ struct Node { position: vec3, _empty_1: i32, force: vec3, _empty_2: i32, prev_force: vec3, mass: atomic, }; struct Uniforms { frame_num: u32, node_count: u32, edge_count: u32, edge_sort_count: u32, tree_node_count: u32, bounding_count: u32, kernel_status_count: u32, }; struct Bound { bound_min: vec3, bound_max: vec3, } struct BHTree { max_depth: atomic, bottom: atomic, radius: f32, _empty: i32, } struct BHTreeNode { position: vec3, _empty: i32, mass: atomic, count: i32, start: atomic, sort: i32, } struct Kvp { sort_key: f32, index: u32, } struct KvpParam { dim: u32, block_count: u32, } struct Transform { view: mat4x4, projection: mat4x4, time: vec4, screen: vec4, camera: vec4, } struct NodeEdgeSortRange { min: atomic, max: atomic, } @group(0) @binding(0) var uniforms: Uniforms; @group(0) @binding(1) var node_src: array; @group(0) @binding(2) var edge_src: array>; @group(0) @binding(3) var spring_force_src: array>; @group(0) @binding(4) var bounding: array; @group(0) @binding(5) var bhTree: BHTree; @group(0) @binding(6) var tree_node_src: array; @group(0) @binding(7) var tree_child_src: array>; @group(0) @binding(8) var kvps: array; @group(0) @binding(9) var kvps_param: KvpParam; @group(0) @binding(10) var transform: Transform; @group(0) @binding(11) var kernel_status: array; @group(0) @binding(12) var edge_sort_node: array>; @group(0) @binding(13) var edge_sort_dir: array>; @group(0) @binding(14) var node_edge_sort_range: array; @group(0) @binding(15) var node_copy_src: array; fn hash(s: u32) -> u32 { var t : u32 = s; t ^= 2747636419u; t *= 2654435769u; t ^= t >> 16u; t *= 2654435769u; t ^= t >> 16u; t *= 2654435769u; return t; } fn random(seed: u32) -> f32 { return f32(hash(seed)) / 4294967295.0; // 2^32-1 } fn random_xy(seed_x: u32, seed_y: u32) -> f32 { return f32(hash(hash(seed_x) + seed_y)) / 4294967295.0; // 2^32-1 } @compute @workgroup_size(256) fn init_kernel_status(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.kernel_status_count; let index = global_invocation_id.x; if (index >= total) { return; } kernel_status[index] = 0; } @compute @workgroup_size(256) fn gen_node(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = node_src[index].position; vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0; // vPos.x = 0.0; // vPos.y = 0.0; // vPos.z = 0.0; // Write back node_src[index].position = vPos; node_src[index].force = vec3(0.0); node_src[index].prev_force = vec3(0.0); node_src[index].mass = 1u; spring_force_src[index] = vec3(0.0); atomicStore(&node_edge_sort_range[index].min, 0u); atomicStore(&node_edge_sort_range[index].max, 0u); } @compute @workgroup_size(256) fn cal_mass(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.edge_count; let index = global_invocation_id.x; if (index >= total) { return; } var edge = edge_src[index]; let source_node: u32 = edge[0]; let target_node: u32 = edge[1]; atomicAdd(&node_src[source_node].mass, 1u); atomicAdd(&node_src[target_node].mass, 1u); } @compute @workgroup_size(256) fn cal_gravity_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } // TODO: Global Param let strong_gravity = true; let k_gravity = 1.0; let pos = node_src[index].position; let mass = f32(atomicLoad(&node_src[index].mass)); var gravity_force: f32; if (strong_gravity) { gravity_force = k_gravity * mass; } else { if (pos.x != 0.0 || pos.y != 0.0 || pos.z != 0.0) { gravity_force = k_gravity * mass * inverseSqrt(dot(pos, pos)); } else { gravity_force = 0.0; } } // node_src[index].force += -pos * gravity_force; // node_src[index].force += -pos * min(gravity_force, 1.0); node_src[index].force += -pos * 0.5; } @compute @workgroup_size(256) fn prepare_edge_sort(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.edge_count; let index = global_invocation_id.x; if (index >= total) { return; } var edge = edge_src[index]; edge_sort_node[index * 2u] = edge; edge_sort_node[index * 2u + 1u] = vec2(edge[1], edge[0]); } @compute @workgroup_size(256) fn sort_edge(@builtin(global_invocation_id) global_invocation_id: vec3) { let i = global_invocation_id.x; var j = i ^ kvps_param.block_count; if (kvps_param.block_count == kvps_param.dim >> 1u) { j = i ^ (kvps_param.block_count * 2u - 1u); } let total = uniforms.edge_sort_count; if (j < i || i >= total || j >= total) { return; } let edge_i = edge_sort_node[i]; let edge_j = edge_sort_node[j]; if (edge_j[0] < edge_i[0]) { edge_sort_node[i] = edge_j; edge_sort_node[j] = edge_i; } } @compute @workgroup_size(256) fn compute_node_edge_sort_range(@builtin(global_invocation_id) global_invocation_id: vec3) { let i = global_invocation_id.x; let total = uniforms.edge_sort_count; if (i >= total) { return; } let node_index = edge_sort_node[i][0]; atomicStore(&node_edge_sort_range[node_index].min, i); atomicStore(&node_edge_sort_range[node_index].max, i + 1u); } @compute @workgroup_size(256) fn compute_node_edge_sort_range_2(@builtin(global_invocation_id) global_invocation_id: vec3) { let i = global_invocation_id.x; let total = uniforms.edge_sort_count; if (i >= total) { return; } let node_index = edge_sort_node[i][0]; atomicMin(&node_edge_sort_range[node_index].min, i); atomicMax(&node_edge_sort_range[node_index].max, i + 1u); } var local_sum: array, 256>; @compute @workgroup_size(256) fn spring_force_reduction( @builtin(local_invocation_index) local_index: u32, @builtin(global_invocation_id) global_id: vec3, @builtin(workgroup_id) group_id: vec3, ) { var skip = false; var index = global_id.x; let total = uniforms.edge_sort_count; if (index >= total) { index = total - 1u; } var edge = edge_sort_node[index]; let source_node: u32 = edge[0]; let target_node: u32 = edge[1]; var dir = node_src[target_node].position - node_src[source_node].position; local_sum[local_index] = dir; if (index >= total) { skip = true; local_sum[local_index] = vec3(0.0); } let range_min = atomicLoad(&node_edge_sort_range[source_node].min); let range_max = atomicLoad(&node_edge_sort_range[source_node].max); if (range_min >= range_max) { skip = true; } var node_relative_index: i32 = i32(index) - i32(range_min); let min_relative_index: i32 = i32(local_index) - node_relative_index; let max_relative_index: i32 = min_relative_index - i32(range_min) + i32(range_max); workgroupBarrier(); var start = u32(max(min_relative_index, 0)); var end = u32(min(max_relative_index, 256)); for (var s = 256u / 2u; s > 0u; s >>= 1u) { if (!skip && local_index < start + s) { let k = local_index + s; if (k < end) { local_sum[local_index] += local_sum[k]; } } workgroupBarrier(); } if (skip) { return; } if (local_index == start) { // node_src[source_node].position += vec3(0.005, 0.0, 0.0); // let dir_sum = local_sum[local_index]; // edge_sort_src[index].dir = dir_sum; } let dir_sum = local_sum[local_index]; edge_sort_dir[index] = dir_sum; } @compute @workgroup_size(256) fn spring_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } let range_min = atomicLoad(&node_edge_sort_range[index].min); let range_max = atomicLoad(&node_edge_sort_range[index].max); if (range_min >= range_max) { return; } spring_force_src[index] += edge_sort_dir[range_min]; for (var i = u32(range_min) - (u32(range_min) % 256u) + 256u; i < u32(range_max); i += 256u) { spring_force_src[index] += edge_sort_dir[i]; } } var smin: array, 256>; var smax: array, 256>; @compute @workgroup_size(256) fn reduction_bounding( @builtin(local_invocation_index) local_index: u32, @builtin(global_invocation_id) global_id: vec3, @builtin(workgroup_id) group_id: vec3, ) { var index = global_id.x; let total = uniforms.node_count; if (index >= total) { index = total - 1u; } smin[local_index] = node_src[index].position; smax[local_index] = node_src[index].position; workgroupBarrier(); for (var s = 256u / 2u; s > 0u; s >>= 1u) { if (local_index < s) { let k = local_index + s; smin[local_index] = min(smin[local_index], smin[k]); smax[local_index] = max(smax[local_index], smax[k]); } workgroupBarrier(); } if (local_index == 0u) { bounding[group_id.x].bound_min = smin[0]; bounding[group_id.x].bound_max = smax[0]; } } // 5 @compute @workgroup_size(256) fn reduction_bounding_2( @builtin(local_invocation_index) local_index: u32, @builtin(global_invocation_id) global_id: vec3, @builtin(workgroup_id) group_id: vec3, ) { var index = global_id.x; let total = uniforms.bounding_count; if (index >= total) { index = total - 1u; } smin[local_index] = bounding[index].bound_min; smax[local_index] = bounding[index].bound_max; workgroupBarrier(); for (var s = 256u / 2u; s > 0u; s >>= 1u) { if (local_index < s) { let k = local_index + s; smin[local_index] = min(smin[local_index], smin[k]); smax[local_index] = max(smax[local_index], smax[k]); } workgroupBarrier(); } if (local_index == 0u) { bounding[group_id.x].bound_min = smin[0]; bounding[group_id.x].bound_max = smax[0]; } } // 6 @compute @workgroup_size(1) fn bounding_box() { var bound_min_min = bounding[0].bound_min; var bound_max_max = bounding[0].bound_max; let box = bound_max_max - bound_min_min; let tree_node_count = uniforms.tree_node_count - 1u; bhTree.radius = max(max(box.x, box.y), box.z) * 0.5; atomicStore(&bhTree.bottom, tree_node_count); atomicStore(&bhTree.max_depth, 0u); atomicStore(&tree_node_src[tree_node_count].mass, -1); atomicStore(&tree_node_src[tree_node_count].start, 0); tree_node_src[tree_node_count].position = (bound_min_min + bound_max_max) * 0.5; tree_node_src[tree_node_count].count = -1; tree_node_src[tree_node_count].sort = -1; } // 7 @compute @workgroup_size(256) fn clear_1(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.tree_node_count; let index = global_invocation_id.x; if (index >= total) { return; } for (var i = 0u; i < 8u; i++) { atomicStore(&tree_child_src[index * 8u + i], -1); } } // 8 @compute @workgroup_size(256) fn tree_building(@builtin(global_invocation_id) global_invocation_id: vec3) { var index = global_invocation_id.x; let node_count = uniforms.node_count; let tree_node_count = uniforms.tree_node_count - 1u; let root_pos = tree_node_src[tree_node_count].position; let inc = min(node_count, 16384u); // should change var skip = 1; var pos: vec3; var dp: vec3; var rdp: vec3; var n = tree_node_count; var depth = 1u; var local_max_depth = 1u; var j = 0u; var root_r = bhTree.radius; var r = root_r * 0.5; var loop_limit_count = 1000; while (index < node_count) { if (loop_limit_count < 0) { kernel_status[1] = -101; break; } loop_limit_count--; if (skip != 0) { skip = 0; pos = node_src[index].position; n = tree_node_count; r = root_r * 0.5; depth = 1u; let compare = step(root_pos, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); // 八个象限 dp = -r + compare * (2.0 * r); rdp = root_pos + dp; // 所在象限的原点 } // atomicAdd(&tree_child_src[n * 8u + j], 0); // ... var ch = atomicLoad(&tree_child_src[n * 8u + j]); // 迭代至叶节点 while (ch >= i32(node_count)) { n = u32(ch); depth++; r *= 0.5; let compare = step(rdp, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); dp = -r + compare * (2.0 * r); rdp += dp; ch = atomicLoad(&tree_child_src[n * 8u + j]); } let locked = n * 8u + j; var locked_ch = -1; // 非 lock 状态 if (ch != -2) { if (ch == -1) { var v = -1; let origin = atomicCompareExchangeWeak(&tree_child_src[locked], v, i32(index)); if (origin == -1) { local_max_depth = max(depth, local_max_depth); index += inc; skip = 1; } else { skip = 0; } } else { // 格子已被占用,将其设置为 lock 状态 var v = ch; let origin = atomicCompareExchangeWeak(&tree_child_src[locked], v, -2); if (ch == origin) { // lock 成功,如果两个点的位置相同,做一点微小偏移就行了 if (all(node_src[ch].position == pos)) { node_src[index].position += vec3(random_xy(index, 0u + 3u * uniforms.frame_num), random_xy(index, 1u + 3u * uniforms.frame_num), random_xy(index, 2u + 3u * uniforms.frame_num)) * 0.2 - 0.1; skip = 0; atomicStore(&tree_child_src[locked], ch); kernel_status[0] = -3; break; } // 两个点位置不同,则开始分裂 locked_ch = -1; loop { // 1. create new cell let cell = atomicSub(&bhTree.bottom, 1u) - 1u; if (cell <= node_count) { return; } if (locked_ch != -1) { atomicStore(&tree_child_src[n * 8u + j], i32(cell)); } locked_ch = max(locked_ch, i32(cell)); // 2. make newly created cell current depth++; n = cell; r *= 0.5; // 3. insert old body into current quadrant let compare = step(rdp, node_src[ch].position); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); atomicStore(&tree_child_src[cell * 8u + j], ch); // 4. determin center + quadrant for cell of new body let compare = step(rdp, pos); j = (u32(compare.x) << 0u) | (u32(compare.y) << 1u) + (u32(compare.z) << 2u); dp = -r + compare * (2.0 * r); rdp += dp; // 5. visit this cell/chec if in use (possibly by old body) ch = atomicLoad(&tree_child_src[n * 8u + j]); if (ch < 0) { break; } }; atomicStore(&tree_child_src[n * 8u + j], i32(index)); local_max_depth = max(depth, local_max_depth); index += inc; skip = 2; } } } workgroupBarrier(); if (skip == 2) { atomicStore(&tree_child_src[locked], locked_ch); } } atomicMax(&bhTree.max_depth, local_max_depth); } // 9 @compute @workgroup_size(256) fn clear_2(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.tree_node_count - 1u; let index = global_invocation_id.x; if (index >= total) { return; } tree_node_src[index].position = vec3(0.0); tree_node_src[index].count = -1; tree_node_src[index].sort = -1; atomicStore(&tree_node_src[index].start, -1); atomicStore(&tree_node_src[index].mass, -1); } // 10 @compute @workgroup_size(256) fn summarization(@builtin(global_invocation_id) global_invocation_id: vec3) { let bottom = atomicLoad(&bhTree.bottom); let tree_node_count = uniforms.tree_node_count - 1u; let node_count = uniforms.node_count; let inc = min(node_count, 16384u); var index = u32((i32(bottom) & -32) + i32(global_invocation_id.x)); if (index < bottom) { index += inc; } // TODO: ch bounds check var schild: array; var smass: array; let restart = index; var loop_limit_count = 10000; for (var j = 0; j < 5; j++) { while (index <= tree_node_count) { if (loop_limit_count < 0) { kernel_status[2] = 500 + j; break; } loop_limit_count--; if (atomicLoad(&tree_node_src[index].mass) < 0) { var ch = 0u; var i = 0u; for (i = 0u; i < 8u; i++) { ch = u32(atomicLoad(&tree_child_src[index * 8u + i])); schild[i] = ch; // atomicAdd(&tree_node_src[ch].mass, 0); smass[i] = atomicLoad(&tree_node_src[ch].mass); if (ch >= node_count && smass[i] < 0) { break; } } if (i == 8u) { var cm = 0; var pos = vec3(0.0); var cnt = 0; for (i = 0u; i < 8u; i++) { ch = schild[i]; if (ch >= node_count) { let m = smass[i]; cnt += tree_node_src[ch].count; pos += tree_node_src[ch].position * f32(m); cm += m; } else { let m = i32(atomicLoad(&node_src[ch].mass)); cnt += 1; pos += node_src[ch].position * f32(m); cm += m; } } tree_node_src[index].count = cnt; tree_node_src[index].position = pos / f32(cm); // workgroupBarrier(); atomicStore(&tree_node_src[index].mass, cm); } } index += inc; } index = restart; } var j = 0; var flag = false; while (index <= tree_node_count) { if (loop_limit_count < 0) { kernel_status[2] = 101; break; } loop_limit_count--; var cm = 0; if (index < node_count) { index += inc; } else if (index >= node_count && atomicLoad(&tree_node_src[index].mass) >= 0) { index += inc; } else { if (j == 0) { j = 8; for (var i = 0u; i < 8u; i++) { let ch = u32(atomicLoad(&tree_child_src[index * 8u + i])); schild[i] = ch; smass[i] = atomicLoad(&tree_node_src[ch].mass); if (ch < node_count || smass[i] >= 0) { j--; } } } else { j = 8; for (var i = 0u; i < 8u; i++) { let ch = schild[i]; let old_mass = smass[i]; smass[i] = atomicLoad(&tree_node_src[ch].mass); if (ch < node_count || old_mass >= 0 || smass[i] >= 0) { j--; } } } if (j == 0) { cm = 0; var pos = vec3(0.0); var cnt = 0; for (var i = 0u; i < 8u; i++) { let ch = schild[i]; if (ch >= node_count) { let m = smass[i]; cnt += tree_node_src[ch].count; pos += tree_node_src[ch].position * f32(m); cm += m; } else { let m = i32(atomicLoad(&node_src[ch].mass)); cnt += 1; pos += node_src[ch].position * f32(m); cm += m; } } tree_node_src[index].count = cnt; tree_node_src[index].position = pos / f32(cm); flag = true; } } // workgroupBarrier(); if (flag) { if (index < node_count) { atomicStore(&node_src[index].mass, u32(cm)); } else { atomicStore(&tree_node_src[index].mass, cm); } index += inc; flag = false; } } } // 11 @compute @workgroup_size(256) fn sort(@builtin(global_invocation_id) global_invocation_id: vec3) { let tree_node_count = uniforms.tree_node_count - 1u; let bottom = atomicLoad(&bhTree.bottom); let node_count = uniforms.node_count; let inc = min(node_count, 16384u); var index = tree_node_count + 1u - inc + global_invocation_id.x; var loop_limit_count = 1000; while (index >= bottom) { if (loop_limit_count < 0) { kernel_status[3] = -101; break; } loop_limit_count--; workgroupBarrier(); var start = atomicLoad(&tree_node_src[index].start); if (start >= 0) { var j = 0u; for (var i = 0u; i < 8u; i++) { let ch = atomicLoad(&tree_child_src[index * 8u + i]); if (ch >= 0) { // 把子节点集中到开头 if (i != j) { atomicStore(&tree_child_src[index * 8u + i], -1); atomicStore(&tree_child_src[index * 8u + j], ch); } j++; if (ch >= i32(node_count)) { atomicStore(&tree_node_src[ch].start, start); start += tree_node_src[ch].count; } else { tree_node_src[start].sort = ch; start++; } } } if (index < inc) { break; } index -= inc; } // if (index < inc) { // break; // } // index -= inc; } } // 12 @compute @workgroup_size(256) fn electron_force(@builtin(global_invocation_id) global_invocation_id: vec3) { let tree_node_count = uniforms.tree_node_count - 1u; let node_count = uniforms.node_count; let inc = min(node_count, 16384u); // TODO: Global Param let scale = 0.0003; var spos: array; var snode: array; var sdq: array; let itolsq = 1.0; let epssq = 0.05 * 0.05; let diameter = bhTree.radius * 2.0; let max_depth = atomicLoad(&bhTree.max_depth); sdq[0] = diameter * diameter * itolsq; for (var j = 1u; j < max_depth; j++) { sdq[j] = sdq[j - 1u] * 0.25; sdq[j - 1u] += epssq; } sdq[max_depth - 1u] += epssq; var loop_limit_count = 5000 * i32(node_count / inc); if (max_depth < 48u) { for (var index = global_invocation_id.x; index < node_count; index += inc) { var order = tree_node_src[index].sort; if (order < 0) { continue; } let pos = node_src[order].position; var af = vec3(0.0); var depth = 0u; spos[0] = 0u; snode[0] = tree_node_count; loop { if (loop_limit_count < 0) { kernel_status[4] = 101; break; } loop_limit_count--; var pd = spos[depth]; var nd = snode[depth]; while (pd < 8u) { if (loop_limit_count < 0) { kernel_status[4] = 101; break; } loop_limit_count--; let n_i32 = atomicLoad(&tree_child_src[nd * 8u + pd]); pd++; if (n_i32 >= 0) { let n = u32(n_i32); var dp: vec3; if (n < node_count) { dp = pos - node_src[n].position; } else { dp = pos - tree_node_src[n].position; } let dist2 = dot(dp, dp); if (n < node_count) { if (dist2 > 0.0) { let factor = scale * f32(atomicLoad(&node_src[order].mass)) * f32(atomicLoad(&node_src[n].mass)) / dist2; af += dp * factor; } } else if (dist2 >= sdq[depth]) { if (dist2 > 0.0) { let factor = scale * f32(atomicLoad(&node_src[order].mass)) * f32(atomicLoad(&tree_node_src[n].mass)) / dist2; af += dp * factor; } } else { spos[depth] = pd; snode[depth] = nd; depth++; pd = 0u; nd = n; } } else { pd = 8u; } } if (depth == 0u) { break; } depth--; } node_src[order].force += af * 0.25; } } } // 13 @compute @workgroup_size(256) fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } let vPos: vec3 = node_src[index].position; let mass = f32(atomicLoad(&node_src[index].mass)); // TODO: Global Param let scaling_ratio = 0.0002; var spring_force = spring_force_src[index]; spring_force_src[index] = vec3(0.0); spring_force *= 100.0; node_src[index].force += spring_force; } // 14 @compute @workgroup_size(256) fn displacement(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } // TODO: Global Param let global_speed = 1.0; let d_force = node_src[index].force - node_src[index].prev_force; let swg = sqrt(dot(d_force, d_force)); let factor = global_speed / (1.0 + sqrt(global_speed * swg)) / f32(node_src[index].mass); let force = node_src[index].force; node_src[index].force = vec3(0.0); node_src[index].prev_force = force; // if (index == 0u) { // return; // } node_src[index].position += force * factor * 0.01; } // 15 @compute @workgroup_size(256) fn randomize(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = node_src[index].position; vPos.x = random_xy(index, 0u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.y = random_xy(index, 1u + 3u * uniforms.frame_num) * 2.0 - 1.0; vPos.z = random_xy(index, 2u + 3u * uniforms.frame_num) * 2.0 - 1.0; // Write back node_src[index].position = vPos; node_src[index].force = vec3(0.0); node_src[index].prev_force = vec3(0.0); } // 16 @compute @workgroup_size(256) fn copy(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = node_src[index].position; node_copy_src[3u * index ] = vPos.x; node_copy_src[3u * index + 1u] = vPos.y; node_copy_src[3u * index + 2u] = vPos.z; } // 17 @compute @workgroup_size(256) fn cal_depth(@builtin(global_invocation_id) global_invocation_id: vec3) { let total = uniforms.node_count; let index = global_invocation_id.x; if (index >= total) { return; } var vPos : vec3 = node_src[index].position; var clip_pos = transform.projection * transform.view * vec4(vPos, 1.0); kvps[index].index = index; kvps[index].sort_key = clip_pos.z; } // 18 @compute @workgroup_size(256) fn sort_by_depth(@builtin(global_invocation_id) global_invocation_id: vec3) { let i = global_invocation_id.x; var j = i ^ kvps_param.block_count; if (kvps_param.block_count == kvps_param.dim >> 1u) { j = i ^ (kvps_param.block_count * 2u - 1u); } let total = uniforms.node_count; if (j < i || i >= total || j >= total) { return; } let index_i= kvps[i].index; let index_j = kvps[j].index; let key_i = kvps[index_i].sort_key; let key_j = kvps[index_j].sort_key; var diff = key_j - key_i; if (diff > 0.0) { kvps[i].index = index_j; kvps[j].index = index_i; } } ================================================ FILE: src/assets/shaders/S_axis.wgsl ================================================ struct Input { @builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, } struct Varing { @builtin(position) position: vec4, @location(0) tex_coords: vec2, @location(1) color: vec3, }; struct Transform { view: mat4x4, projection: mat4x4, time: vec4, screen: vec4, camera: vec4, } @group(0) @binding(0) var transform: Transform; @vertex fn main_vs( @location(0) quad_pos: vec2, i: Input ) -> Varing { var v: Varing; var has_x = f32(i.instance_index); var has_z = 1.0 - f32(i.instance_index); var length = quad_pos.x * 10000000.0; v.position = vec4(vec3(length * has_x, 0.0, length * has_z), 1.0); v.position = transform.projection * transform.view * v.position; var dir = transform.projection * transform.view * vec4(0.01 * has_x, 0.0, 0.01 * has_z, 1.0); var center = transform.projection * transform.view * vec4(0.0, 0.0, 0.0, 1.0); var cast_position = center + (dir - center) / (dir.z - center.z) * (transform.camera.z * 0.001 - center.z); if v.position.w < transform.camera.z { v.position = cast_position; } var ratio = transform.camera.x; var dir_normal = normalize(vec2(dir.y / ratio / ratio, -dir.x)); v.position = v.position / abs(v.position.w); v.position += vec4(dir_normal * quad_pos.y * (1.5 / transform.screen.y), 0.0, 0.0); v.tex_coords = quad_pos; // Yellow / Blue var colors = array, 2>(vec3(.98, .47, .08), vec3(.272, .866, .855)); v.color = colors[i.instance_index]; return v; } @fragment fn main_fs(v: Varing) -> @location(0) vec4 { var color = v.color; var x = v.position.z * 0.5 + 0.5; var lerp = (1.0 - pow(x, 10000.0)) * 1.2; color *= lerp; let alpha = 1.0; return vec4(color, alpha); } ================================================ FILE: src/assets/shaders/S_bounding_box.wgsl ================================================ struct Input { @builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, } struct Varing { @builtin(position) position: vec4, }; struct Transform { view: mat4x4, projection: mat4x4, time: vec4, screen: vec4, camera: vec4, } struct Bound { bound_min: vec3, bound_max: vec3, } @group(0) @binding(0) var transform: Transform; @group(1) @binding(0) var boundSrc : array; @vertex fn main_vs( @location(0) bound_pos: vec3, i: Input ) -> Varing { var bound = boundSrc[0]; var bound_center = (bound.bound_min + bound.bound_max) / 2.0; var bound_radius = (bound.bound_max - bound.bound_min) / 2.0; var v: Varing; v.position = vec4(bound_center + bound_pos * bound_radius, 1.0); v.position = transform.projection * transform.view * v.position; return v; } @fragment fn main_fs(v: Varing) -> @location(0) vec4 { var out_color = vec4(1.0, 1.0, 1.0, 1.0); return out_color; } ================================================ FILE: src/assets/shaders/S_edge.wgsl ================================================ struct Input { @builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, } struct Varing { @location(0) tex_coords: vec2, @builtin(position) position: vec4, }; struct Node { position: vec3, force: vec3, prev_force: vec3, mass: u32, }; struct Transform { view: mat4x4, projection: mat4x4, time: vec4, screen: vec4, camera: vec4, } @group(0) @binding(0) var transform: Transform; @group(1) @binding(0) var node_src : array; @group(1) @binding(1) var edge_src : array>; fn vs_transform( node_pos_a: vec3, node_pos_b: vec3, node_pos: vec3, quad_pos: vec2 ) -> vec4 { let node_a = transform.projection * transform.view * vec4(node_pos_a, 1.0); let node_b = transform.projection * transform.view * vec4(node_pos_b, 1.0); var dir = node_a / node_a.w - node_b / node_b.w; dir.y = dir.y / transform.camera.x; let quad_dir = normalize(vec2(dir.y, -dir.x)); var position = vec4(node_pos, 1.0); position = transform.view * position; position += vec4(quad_pos.y * quad_dir * 0.01 * 0.03, 0.0, 0.0); position = transform.projection * position; var quad_pos_ratio = quad_pos.y * quad_dir; quad_pos_ratio.x /= transform.camera.x; position += vec4(quad_pos_ratio * (0.5 / transform.screen.y) * position.w, 0.0, 0.0); return position; } @vertex fn main_vs( @location(0) quad_pos: vec2, i: Input ) -> Varing { let edge = edge_src[i.instance_index]; var v: Varing; v.position = vs_transform( node_src[edge[0]].position, node_src[edge[1]].position, node_src[edge[i.vertex_index % 2u]].position, quad_pos ); v.tex_coords = vec2(0.0); return v; } @fragment fn main_fs(v: Varing) -> @location(0) vec4 { let out_color = vec4(1.0, 1.0, 1.0, 0.02); return out_color; } struct CastVaring { @builtin(position) position: vec4, @location(0) id: u32, @location(1) nodes: vec2, }; @vertex fn cast_vs( @location(0) quad_pos: vec2, i: Input ) -> CastVaring { let edge = edge_src[i.instance_index]; var v: CastVaring; v.position = vs_transform( node_src[edge[0]].position, node_src[edge[1]].position, node_src[edge[i.vertex_index % 2u]].position, quad_pos ); v.position /= abs(v.position.w); v.position.x = (v.position.x + 1.0) / 2.0 * transform.screen.x - transform.screen.z; v.position.y = (-v.position.y + 1.0) / 2.0 * transform.screen.y - transform.screen.w; v.id = i.instance_index; v.nodes = edge; return v; } @fragment fn cast_fs(v: CastVaring) -> @location(0) vec4 { var out_color = vec4(2u, v.id, v.nodes); return out_color; } ================================================ FILE: src/assets/shaders/S_node.wgsl ================================================ struct Input { @builtin(vertex_index) vertex_index: u32, @builtin(instance_index) instance_index: u32, } struct Varing { @location(0) tex_coords: vec2, @builtin(position) position: vec4, @location(1) color: vec3, }; struct Node { position: vec3, force: vec3, prev_force: vec3, mass: u32, }; struct Transform { view: mat4x4, projection: mat4x4, time: vec4, screen: vec4, camera: vec4, } struct Kvp { sort_key: f32, index: u32, } @group(0) @binding(0) var transform: Transform; @group(1) @binding(0) var node_src : array; @group(1) @binding(1) var kvps: array; fn vs_transform( node_position: vec3, quad_pos: vec2 ) -> vec4 { var position = vec4(node_position, 1.0); position = transform.view * position; position += vec4(quad_pos * 0.0025, 0.0, 0.0); position = transform.projection * position; var quad_pos_ratio = quad_pos; quad_pos_ratio.x /= transform.camera.x; position += vec4(quad_pos_ratio * (1.5 / transform.screen.y) * position.w, 0.0, 0.0); return position; } @vertex fn main_vs( @location(0) quad_pos: vec2, i: Input ) -> Varing { var node = node_src[kvps[i.instance_index].index]; var kvp = kvps[i.instance_index]; var v: Varing; v.position = vs_transform(node.position, quad_pos); v.tex_coords = quad_pos; v.color = mix(vec3(0.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0), f32(i.instance_index) / f32(arrayLength(&node_src))); if (kvp.index == 0u) { v.color = vec3(1.0); } return v; } @fragment fn main_fs(v: Varing) -> @location(0) vec4 { let sdf = dot(v.tex_coords, v.tex_coords); let clip = step(sdf, 1.0); var out_color = vec4(v.color, 1.0); if clip < 0.5 { discard; } return out_color; } struct CastVaring { @location(0) tex_coords: vec2, @builtin(position) position: vec4, @location(1) id: u32, }; @vertex fn cast_vs( @location(0) quad_pos: vec2, i: Input ) -> CastVaring { var node = node_src[kvps[i.instance_index].index]; var kvp = kvps[i.instance_index]; var v: CastVaring; v.position = vs_transform(node.position, quad_pos); v.position /= v.position.w; v.position.x = (v.position.x + 1.0) / 2.0 * transform.screen.x - transform.screen.z; v.position.y = (-v.position.y + 1.0) / 2.0 * transform.screen.y - transform.screen.w; v.tex_coords = quad_pos; v.id = kvp.index; return v; } @fragment fn cast_fs(v: CastVaring) -> @location(0) vec4 { let sdf = dot(v.tex_coords, v.tex_coords); let clip = step(sdf, 1.0); var out_color = vec4(1u, v.id, 0u, 0u); if clip < 0.5 { discard; } return out_color; } ================================================ FILE: src/bootstrap.rs ================================================ use eframe::AppCreator; use crate::{MainApp, APP_VERSION, utils::file::get_resource_path}; pub struct Config { native_options: eframe::NativeOptions, app_creator: AppCreator, app_name: String, } pub struct ConfigBuilder { native_options: eframe::NativeOptions, app_creator: AppCreator, app_name: String, } impl Default for ConfigBuilder { fn default() -> Self { let native_options = eframe::NativeOptions { initial_window_size: Some(egui::Vec2::new(1200.0, 720.0)), min_window_size: Some(egui::Vec2::new(960.0, 640.0)), drag_and_drop_support: true, renderer: eframe::Renderer::Wgpu, follow_system_theme: false, default_theme: eframe::Theme::Dark, icon_data: Some(load_icon("app_bar_icon.ico")), // #[cfg(target_os = "macos")] // fullsize_content: true, ..Default::default() }; Self { native_options, app_creator: Box::new(|cc| Box::new(MainApp::new(cc))), app_name: format!("GraphPU - Dev Demo - {}", APP_VERSION), } } } impl ConfigBuilder { pub fn native_options(mut self, native_options: eframe::NativeOptions) -> Self { self.native_options = native_options; self } pub fn app_creator(mut self, app_creator: AppCreator) -> Self { self.app_creator = app_creator; self } pub fn app_name(mut self, app_name: String) -> Self { self.app_name = app_name; self } pub fn build(self) -> Config { Config { native_options: self.native_options, app_creator: self.app_creator, app_name: self.app_name, } } } fn load_icon(path: &str) -> eframe::IconData { let path = get_resource_path(path); let (icon_rgba, icon_width, icon_height) = { let image = image::open(path).expect("Failed to open icon path").into_rgba8(); let (width, height) = image.dimensions(); let rgba = image.into_raw(); (rgba, width, height) }; eframe::IconData { rgba: icon_rgba, width: icon_width, height: icon_height, } } pub fn start_frame(config: Config) { eframe::run_native( &config.app_name, config.native_options, config.app_creator, ); } ================================================ FILE: src/components/detail_view.rs ================================================ use chrono::Utc; use egui::{Sense, Ui}; use crate::constant::FONT_SIZE_BODY; use crate::models::app_model::DockStage; use crate::models::Models; use crate::utils::message::messenger; use super::AppView; #[derive(Default)] pub struct DetailView; impl AppView for DetailView { fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { egui::TopBottomPanel::bottom("detail") .show_inside(ui, |ui| { ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.label( egui::RichText::new( format!( "Nodes: {} | Edges: {}", models.data_model.status.node_count, models.data_model.status.edge_count ) ).weak() ); ui.add_space(30.0); ui.allocate_ui_with_layout( ui.available_size(), egui::Layout::left_to_right(egui::Align::Center), |ui| { show_message(models, ui, _frame, -1); }, ); }); }); }); } } pub fn show_message(models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame, max_time: i32) { let messages = messenger(); if messages.len() > 0 { let message = &messages[messages.len() - 1]; if max_time > 0 && Utc::now().timestamp() - message.time > max_time.into() { return; }; let message = message.to_string(); let (rect, response) = if max_time > 0 { let rect = ui.available_rect_before_wrap(); (rect, None) } else { let (rect, response) = ui.allocate_exact_size(ui.available_size(), Sense::click()); (rect, Some(response)) }; ui.allocate_ui_at_rect(rect, |ui| { ui.vertical(|ui| { ui.add_space(3.0); let mut job = egui::text::LayoutJob::single_section(message.to_owned(), egui::TextFormat { font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()), color: egui::Color32::from_gray(120), ..Default::default() }); job.wrap = egui::epaint::text::TextWrapping { max_rows: 1, break_anywhere: true, overflow_character: Some('…'), ..Default::default() }; ui.label(job); }); // ui.label(egui::RichText::new(format!("{}", messages[0])).weak()) }); if let Some(response) = response { response.clicked().then(||{ models.app_model.dock_stage = DockStage::Messages }); } } } ================================================ FILE: src/components/dock_view.rs ================================================ use std::borrow::BorrowMut; use egui::{Ui, Vec2}; use crate::constant::FONT_SIZE_BODY; use crate::models::app_model::DockStage; use crate::models::Models; use crate::utils::message::messenger; use crate::widgets::frames::dock_frame; use super::AppView; #[derive(Default)] pub struct DockView; impl AppView for DockView { fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { egui::TopBottomPanel::bottom("dock") .frame(dock_frame(ui.style())) .default_height(0.0) .show_inside(ui, |ui| { ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::LeftToRight, egui::Align::Center), |ui| { ui.set_style(models.app_model.dock_style.clone()); ui.spacing_mut().item_spacing = Vec2::ZERO; ui.style_mut().text_styles.get_mut(&egui::TextStyle::Button).unwrap().size = FONT_SIZE_BODY; dock_button(ui, models, DockStage::Messages, format!("🕫 Messages({})", messenger().len())); dock_button(ui, models, DockStage::Timeline, "🕙 Timeline"); dock_button(ui, models, DockStage::Kernel, "✱ Kernels"); ui.allocate_ui_with_layout( ui.available_size(), egui::Layout::right_to_left(egui::Align::Center), |ui| { toggle_button(ui, &mut models.graphics_model.graphics_resources.render_options.is_showing_debug, "ℹ State"); }, ); }); }); } } fn dock_button(ui: &mut egui::Ui, models: &mut Models, current: DockStage, text: impl Into) { let checked = models.app_model.dock_stage == current; if ui.selectable_label(checked, text).clicked() { if checked { models.app_model.dock_stage = DockStage::None; } else { models.app_model.dock_stage = current; } } } fn toggle_button(ui: &mut egui::Ui, selected: &mut bool, text: impl Into) -> egui::Response { ui.toggle_value(selected.borrow_mut(), text) } ================================================ FILE: src/components/drawer_view.rs ================================================ use egui::{Response, Ui, Vec2}; use crate::components::drawers::{KernelView, MessageView}; use crate::constant::FONT_SIZE_TITLE; use crate::models::app_model::DockStage; use crate::models::Models; use crate::widgets::frames::{drawer_frame, drawer_title_frame}; use super::AppView; #[derive(Default)] pub struct DrawerView { kernel_view: KernelView, } impl AppView for DrawerView { fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame) { egui::TopBottomPanel::bottom("drawer") .resizable(true) .default_height(220.0) .height_range(100.0..=350.0) .frame(drawer_frame(ui.style())) .show_inside(ui, |ui| { drawer_title_frame(ui.style()).show(ui, |ui| { ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { let (egui_id, rect) = ui.allocate_space(Vec2::splat(15.0)); if close_button(ui, egui_id, rect).clicked() { models.app_model.dock_stage = DockStage::None; }; ui.allocate_ui_with_layout( ui.available_size(), egui::Layout::left_to_right(egui::Align::Center), |ui| { let title = match models.app_model.dock_stage { DockStage::None => "None", DockStage::Messages => "Messages", DockStage::Timeline => "Timeline", DockStage::Kernel => "Kernels", }; ui.style_mut().text_styles.get_mut(&egui::TextStyle::Body).unwrap().size = FONT_SIZE_TITLE; ui.label(egui::RichText::new(format!("{}", title)).strong()); }, ); }); }); }); ui.add( egui::Separator::default().spacing(0.0) ); match models.app_model.dock_stage { DockStage::Messages => { MessageView::default().show(models, ui, frame); }, DockStage::Kernel => { self.kernel_view.show(models, ui, frame); }, _ => { ui.centered_and_justified(|ui| { ui.set_min_height(100.0); ui.label(egui::RichText::new("Drawer View").weak()); }); } } }); } } fn close_button(ui: &mut Ui, id: egui::Id, rect: egui::Rect) -> Response { let response = ui.interact(rect, id, egui::Sense::click()); ui.expand_to_include_rect(response.rect); let visuals = ui.style().interact(&response); let rect = rect.shrink(2.0).expand(visuals.expansion); let stroke = visuals.fg_stroke; ui.painter() // paints \ .line_segment([rect.left_top(), rect.right_bottom()], stroke); ui.painter() // paints / .line_segment([rect.right_top(), rect.left_bottom()], stroke); response } ================================================ FILE: src/components/drawers/kernel_view.rs ================================================ use egui::{Color32, Ui}; use crate::components::AppView; use crate::constant::FONT_SIZE_BODY; use crate::models::graphics_model::KERNEL_NAMES; use crate::models::Models; use crate::widgets::frames::{drawer_kernel_content_frame}; #[derive(Default)] pub struct KernelView { pub selected_kernel: usize, } fn get_kernel_status_desc(code: i32) -> &'static str { match code { -1 => "Uninitialized", 0 => "Running", _ => "" } } impl AppView for KernelView { fn show(&mut self, _models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { drawer_kernel_content_frame(ui.style()).show(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); ui.horizontal_wrapped(|ui| { if let Some(graph_resources) = &mut _models.graphics_model.graphics_resources.graph_resources { for (index, &name) in KERNEL_NAMES.iter().enumerate() { kernel_label(ui, &mut self.selected_kernel ,index, name, graph_resources.kernel_status_codes[index]); } } }); ui.separator(); egui::ScrollArea::vertical() // .always_show_scroll(true) .auto_shrink([false; 2]) .id_source("kernel") .show(ui, |ui| { let mut code = 0; if let Some(graph_resources) = &mut _models.graphics_model.graphics_resources.graph_resources { code = graph_resources.kernel_status_codes[self.selected_kernel]; } inspector_grid("kernel_grid") .show(ui, |ui| { grid_label(ui, "Kernel ID"); grid_content(ui, format!("{}", self.selected_kernel).as_str()); ui.end_row(); grid_label(ui, "Kernel name"); grid_content(ui, KERNEL_NAMES[self.selected_kernel]); ui.end_row(); grid_label(ui, "Kernel status code"); grid_content(ui, format!("{}", code).as_str()); ui.end_row(); grid_label(ui, "Status code description"); grid_content(ui, get_kernel_status_desc(code)); }); }); // ui.centered_and_justified(|ui| { // ui.set_min_height(100.0); // ui.label(egui::RichText::new("Error 503")); // }); }); } } fn inspector_grid(id: &str) -> egui::Grid { egui::Grid::new(id) .num_columns(2) .spacing([10.0, 4.0]) .min_col_width(65.) .min_row_height(10.) } fn kernel_label(ui: &mut egui::Ui, selected_kernel: &mut usize, kernel_index: usize, kernel_name: &str, kernel_code: i32) { let size = egui::Vec2::new(150., 18.); let (rect, _response) = ui.allocate_exact_size(size, egui::Sense::hover()); ui.allocate_ui_at_rect(rect, |ui| { ui.set_min_width(150.); let mut job = egui::text::LayoutJob::single_section("✱ ".parse().unwrap(), egui::TextFormat { font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()), color: match kernel_code { x if x < 0 => Color32::from_rgb(255, 255, 0), 0 => Color32::from_rgb(0, 255, 0), x if x > 0 => Color32::from_rgb(255, 0, 0), _ => Color32::from_rgb(255, 0, 0) }, valign: egui::Align::Center, ..Default::default() }); job.append(&*format!("[{}] {} ", kernel_index, kernel_name), 0.0, egui::TextFormat { font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()), color: egui::Color32::from_gray(220), valign: egui::Align::Center, ..Default::default() }); ui.selectable_value(selected_kernel, kernel_index, job); }); // ui.painter() // .circle_filled(rect.center(), r, ui.visuals().text_color()); } fn grid_label(ui: &mut egui::Ui, title: &str) { let label = format!("{}: ", title); ui.set_width(250.); ui.add( egui::Label::new(egui::RichText::new(label)) ); } fn grid_content(ui: &mut egui::Ui, title: &str) { let label = format!("{}", title); ui.add( egui::Label::new(egui::RichText::new(label)).wrap(true) ); } ================================================ FILE: src/components/drawers/message_view.rs ================================================ use egui::{Color32, epaint, Ui, Vec2}; use crate::components::AppView; use crate::constant::FONT_SIZE_BODY; use crate::models::Models; use crate::utils::message::{MessageLevel, messenger}; use crate::widgets::frames::{drawer_message_content_frame}; #[derive(Default)] pub struct MessageView; impl AppView for MessageView { fn show(&mut self, _models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { drawer_message_content_frame(ui.style()).show(ui, |ui| { let messages = messenger(); let row_height = 52.0; let num_rows = messages.len(); ui.spacing_mut().interact_size = Vec2::new(4.0, 4.0); egui::ScrollArea::vertical().stick_to_bottom(true).auto_shrink([false; 2]).show_rows( ui, row_height, num_rows, |ui, row_range| { for row in row_range { let message = &messages[row]; let title_text = egui::RichText::new(&message.title); let time_text = egui::RichText::new(message.display_time()).weak(); let content_text = &message.content; ui.vertical(|ui| { ui.set_height(row_height); if row != 0 { ui.add( egui::Separator::default().spacing(0.0) ); } ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::LeftToRight, egui::Align::Min), |ui| { message_icon(ui, &message.level); ui.vertical(|ui| { ui.add_space(5.5); ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.add_space(6.0); ui.label(time_text); ui.allocate_ui_with_layout(ui.available_size(), egui::Layout::left_to_right(egui::Align::Center), |ui| { ui.label(title_text); }); }) }); let mut job = egui::text::LayoutJob::single_section(content_text.to_owned(), egui::TextFormat { font_id: egui::FontId::new(FONT_SIZE_BODY, Default::default()), color: egui::Color32::from_gray(120), ..Default::default() }); job.wrap = epaint::text::TextWrapping { max_rows: 2, break_anywhere: false, overflow_character: Some('…'), ..Default::default() }; ui.label(job); // ui.label(content_text); }); }); }); } }, ); }); } } fn message_icon(ui: &mut egui::Ui, icon_type: &MessageLevel) { let (label, color) = match icon_type { MessageLevel::Info => ("ℹ", Color32::GRAY), MessageLevel::Warning => ("⚠", Color32::YELLOW), MessageLevel::Error => ("!", Color32::RED), }; let job = egui::text::LayoutJob::single_section(label.to_owned(), egui::TextFormat { font_id: egui::FontId::new(24.0, Default::default()), color: color, ..Default::default() }); ui.vertical(|ui| { ui.set_width(30.); ui.add_space(5.0); ui.add( egui::Label::new(job) ) }); } ================================================ FILE: src/components/drawers/mod.rs ================================================ mod message_view; mod kernel_view; pub use { message_view::MessageView, kernel_view::KernelView }; ================================================ FILE: src/components/export_modal_view.rs ================================================ use std::{fs::File, io::Write}; use std::default::Default; use egui::{Context, Widget}; use rayon::prelude::*; use crate::{ models::Models, utils::file::{path_to_string, pick_folder}, widgets::{ frames::{inner_panel_frame, DEFAULT_BUTTON_PADDING}, modal::Modal, }, }; use crate::constant::ACCENT_COLOR; use crate::utils::message::message_info; pub struct ExportModal { directory_path: String, file_name: String, is_cast_to_float: bool, } const DEFAULT_FILE_NAME: &'static str = "graph"; impl Default for ExportModal { fn default() -> Self { Self { directory_path: "".to_string(), file_name: "".to_string(), is_cast_to_float: false, } } } impl ExportModal { pub fn show(&mut self, ctx: &Context, models: &mut Models) { Modal::new(String::from("export_modal_view")).show(ctx, |ui| { ui.set_width(400.0); ui.set_height(250.0); egui::CentralPanel::default() .frame(inner_panel_frame(ui.style())) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0); ui.heading("Export Data"); ui.horizontal(|ui| { ui.selectable_value(&mut 0, 0, "PCACHE"); ui.selectable_value(&mut 0, 1, "CSV"); }); ui.separator(); egui::Grid::new("my_grid") .num_columns(2) .spacing([20.0, 8.0]) .show(ui, |ui| { ui.add(egui::Label::new("Directory")); ui.horizontal(|ui| { ui.with_layout( egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; if ui.button("•••").clicked() { self.directory_path = path_to_string(&pick_folder()) .unwrap_or(self.directory_path.clone()); } ui.vertical_centered_justified(|ui| { ui.add( egui::TextEdit::singleline( &mut self.directory_path, ) .hint_text("") .desired_width(200.), ); }); }, ); }); ui.end_row(); ui.add(egui::Label::new("File name")); ui.horizontal(|ui| { let text = ui.add( egui::TextEdit::singleline( &mut self.file_name, ) .hint_text("graph") .desired_width(150.) ); let file_name = if self.file_name.len() != 0 { &self.file_name } else { DEFAULT_FILE_NAME }; text.on_hover_text(egui::RichText::new(format!("{0}_node.pcache \n{0}_edge.pcache", file_name)).weak()); }); ui.end_row(); ui.add(egui::Label::new("")); ui.checkbox(&mut self.is_cast_to_float, "Cast uint to float") .on_hover_text("For Unity VFX Graph"); }) }); egui::TopBottomPanel::bottom("v") .frame(inner_panel_frame(ui.style())) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.add_enabled_ui(self.directory_path.len() != 0, |ui| { if egui::Button::new(" Done ").fill(ACCENT_COLOR).ui(ui).clicked() { self.on_click_done(models).expect("TODO: panic message"); models.app_model.is_export_visible = false; } }); if ui.button(" Cancel ").clicked() { models.app_model.is_export_visible = false; } }); }) }); } fn on_click_done(&mut self, models: &mut Models) -> std::io::Result<()> { let file_name = if self.file_name.len() != 0 { &self.file_name } else { DEFAULT_FILE_NAME }; let path_prefix = self.directory_path.clone() + "/" + file_name; let node_path = path_prefix.clone() + "_node.pcache"; let edge_path = path_prefix + "_edge.pcache"; let graphics_resource = &mut models.graphics_model.graphics_resources; graphics_resource.debug(); if let Some(graph_resources) = &graphics_resource.graph_resources { let mut file = File::create(&node_path)?; file.write_all(b"pcache\n")?; file.write_all(b"comment Node PCACHE file Exported from GraphPU\n")?; file.write_all(b"format binary 1.0\n")?; file.write_fmt(format_args!("elements {}\n", graph_resources.status.node_count))?; file.write_fmt(format_args!("property {} {}\n", "float", "position.x"))?; file.write_fmt(format_args!("property {} {}\n", "float", "position.y"))?; file.write_fmt(format_args!("property {} {}\n", "float", "position.z"))?; file.write_all(b"end_header\n")?; file.write_all(bytemuck::cast_slice(graph_resources.buffer_bytes.as_ref().unwrap()))?; } if let Some(source_target_list) = &models.data_model.source_target_list { let result: Vec = if self.is_cast_to_float { let par_iter = source_target_list.par_iter().map(|x| *x as f32); let doubles: Vec = par_iter.collect(); bytemuck::cast_slice(&doubles).to_vec() } else { bytemuck::cast_slice(&source_target_list).to_vec() }; let mut file = File::create(&edge_path)?; file.write_all(b"pcache\n")?; file.write_all(b"comment Edge PCACHE file Exported from GraphPU\n")?; file.write_all(b"format binary 1.0\n")?; file.write_fmt(format_args!("elements {}\n", models.data_model.status.edge_count))?; let type_string = if self.is_cast_to_float { "float" } else { "uint" }; file.write_fmt(format_args!("property {} {}\n", type_string, "source"))?; file.write_fmt(format_args!("property {} {}\n", type_string, "target"))?; file.write_all(b"end_header\n")?; file.write_all(bytemuck::cast_slice(&result))?; } let text = format!( "Node file: {} \nEdge file: {}", node_path, edge_path ); message_info("Export PCACHE Data Succeeded", text.as_str()); Ok(()) } } ================================================ FILE: src/components/graphics_view.rs ================================================ use std::borrow::BorrowMut; use std::ops::Mul; use egui::{InnerResponse, PointerButton, Response, Ui, Vec2, Widget, WidgetText}; use crate::models::app_model::Tool; use crate::models::graphics_model::{CastType, GraphicsResources}; use crate::models::Models; use crate::widgets::frames::{button_group_style, DEFAULT_BUTTON_PADDING, graphics_frame, graphics_hover_frame, TOOL_BUTTON_PADDING, tool_item_group_style, toolbar_inner_frame, toolbar_inner_frame_bottom, toolbar_inner_frame_top}; use super::AppView; #[derive(Default)] pub struct GraphicsView; impl AppView for GraphicsView { fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { if let Some(graph_resources) = &mut models.graphics_model.graphics_resources.graph_resources { if graph_resources.is_kernel_error { models.graphics_model.set_computing(false); } } // 获取是否持续计算、下一帧是否 Dispatch let is_computing = models.graphics_model.is_computing; let is_dispatching = models.graphics_model.is_dispatching; // 无论当前帧是否 Dispatch,下一帧都停止 Dispatch models.graphics_model.set_dispatching(false); egui::CentralPanel::default() .frame(graphics_frame(ui.style(), true)) .show_inside(ui, |ui| { let max_rect = ui.max_rect(); // 新建一个空 Frame,用于存放 Image ui.allocate_ui_at_rect(max_rect, |ui| { graphics_frame(ui.style(), models.app_model.is_fullscreen_graphics) .show(ui, |ui| { // 如果 Compute Model 已经初始化,即数据导入完成,可以开始渲染 // 则获取 Compute Resource let compute_resources = &mut models.graphics_model.graphics_resources; // let graph_resources = compute_resources.graph_resources.as_mut().unwrap(); // if graph_resources.is_kernel_error { } // 如果正在持续计算,则计算一次 if is_computing { compute_resources.compute(); } // 如果当前帧需要 Dispatch,则 Dispatch 一次 if is_dispatching { compute_resources.randomize(); } // 更新 Viewport,用于处理窗口 resize // update_viewport 方法会判断传入的 Viewport 大小和之前的是否一致 // 若发生变化,则更新材质视图,注册 egui 材质 ID,并返回 true // 若无变化,不更新材质视图,返回 false // 其中,pixels_per_point 代表当前每点像素密度 compute_resources.update_viewport( max_rect.size().mul(Vec2::from([models.app_model.pixels_per_point; 2])) ); compute_resources.update_control(ui, models.graphics_model.is_hover_graphics_view, models.app_model.pixels_per_point); if compute_resources.control.pointer_pos.is_some() { if ui.input().pointer.button_double_clicked(PointerButton::Primary) { if !models.app_model.is_fullscreen_graphics { models.app_model.is_fullscreen_graphics = true; _frame.set_fullscreen(true); } else { models.app_model.is_fullscreen_graphics = false; if !models.app_model.is_fullscreen { _frame.set_fullscreen(false); } } } } // 若有任何变化,渲染并请求 egui UI 更新 if is_computing || is_dispatching || compute_resources.need_update { compute_resources.render(); compute_resources.need_update = false; ui.ctx().request_repaint(); } if models.app_model.current_tool == Tool::Select && compute_resources.control.is_pointer_update { compute_resources.render_cast(); compute_resources.control.is_pointer_update = false; } // 获取已经注册的 wgpu 材质的 egui 材质 ID let texture_id = compute_resources.viewport_texture_id; // 通过材质 ID 绘制 Image // ui.image(texture_id, max_rect.size()); ui.allocate_ui_at_rect(max_rect, |ui| { let response = egui::Image::new(texture_id, max_rect.size()) .sense(egui::Sense::click_and_drag()).ui(ui); models.graphics_model.is_hover_graphics_view = response.hovered(); }); }); }); let compute_resources = &mut models.graphics_model.graphics_resources; if models.app_model.current_tool == Tool::Select && models.graphics_model.is_hover_graphics_view { if let Some(cast_type) = &compute_resources.cast_type { let pos = if let Some(pos) = ui.input().pointer.interact_pos() { pos + egui::Vec2::new(0.0, 20.0) } else { egui::Pos2::ZERO }; ui.allocate_ui_at_rect(egui::Rect::from_min_size(pos, egui::Vec2::new(200.0, 200.0)), |ui| { graphics_hover_frame(ui.style()) .show(ui, |ui| { ui.horizontal(|ui| { ui.label( match cast_type { CastType::Node => "Node ", CastType::Edge => "Edge " } ); ui.label(egui::RichText::new(format!("{}", compute_resources.cast_value)).weak()); }); }); }); } }; if models.app_model.is_fullscreen_graphics { return; } ui.allocate_ui_at_rect(max_rect, |ui| { egui::SidePanel::left("toolbar-left-11") .frame(toolbar_inner_frame(ui.style())) .show_separator_line(false) .width_range(0.0..=0.0) .resizable(false) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); ui.spacing_mut().button_padding = TOOL_BUTTON_PADDING; tool_item_group_style(ui.style()).show(ui, |ui| { ui.vertical(|ui| { ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0); tool_item_box(ui, |ui| { let button = ui.selectable_label( models.app_model.current_tool == Tool::Select, egui::RichText::new("☉").size(24.0) ).on_hover_text("Select"); if button.clicked() { models.app_model.current_tool = Tool::Select; } }); tool_item_box(ui, |ui| { let button = ui.selectable_label( models.app_model.current_tool == Tool::Handle, egui::RichText::new("🕂").size(24.0) ).on_hover_text("Handle"); if button.clicked() { models.app_model.current_tool = Tool::Handle; } }); tool_item_box(ui, |ui| { let button = ui.selectable_label( models.app_model.current_tool == Tool::View, egui::RichText::new("🎥").size(24.0) ).on_hover_text("View"); if button.clicked() { models.app_model.current_tool = Tool::View; } }); }); }); }); egui::TopBottomPanel::top("toolbar-top") .frame(toolbar_inner_frame_top(ui.style())) .show_separator_line(false) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.horizontal(|ui| { let graphics_resources = &mut models.graphics_model.graphics_resources; let fullscreen_btn = ui.button("🗖"); // let fullscreen = _frame.info().window_info.fullscreen; fullscreen_btn.clicked().then(|| { models.app_model.is_fullscreen_graphics = true; _frame.set_fullscreen(true); }); toggle_button(ui, &mut graphics_resources.render_options.is_rendering_bounding_box, "⛶") .on_hover_text("Toggle Bounding Box") .clicked().then(|| { need_update(ui, graphics_resources) }); toggle_button(ui, &mut graphics_resources.render_options.is_rendering_axis, "×") .on_hover_text("Toggle Axes") .clicked().then(|| { need_update(ui, graphics_resources) }); toggle_button(ui, &mut graphics_resources.render_options.is_rendering_edge, "➖") .on_hover_text("Toggle Edges") .clicked().then(|| { need_update(ui, graphics_resources) }); toggle_button(ui, &mut graphics_resources.render_options.is_rendering_node, "⚫") .on_hover_text("Toggle Nodes") .clicked().then(|| { need_update(ui, graphics_resources) }); }); }); }); let graphics_resources = &mut models.graphics_model.graphics_resources; if !graphics_resources.render_options.is_showing_debug { ui.set_visible(false); } egui::TopBottomPanel::bottom("toolbar-top-2") .frame(toolbar_inner_frame_bottom(ui.style())) .show_separator_line(false) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 0.0); ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; ui.spacing_mut().interact_size = Vec2::new(4.0, 4.0); ui.with_layout(egui::Layout::from_main_dir_and_cross_align(egui::Direction::TopDown, egui::Align::Max), |ui| { ui.horizontal(|ui| { ui.label(format!("{:.1}", graphics_resources.frames_per_second)); ui.label(egui::RichText::new("FPS: ").weak()); }); ui.horizontal(|ui| { ui.label(format!("{:06}", graphics_resources.compute_frame_count)); ui.label(egui::RichText::new("Compute frames: ").weak()); }); ui.horizontal(|ui| { ui.label(format!("{:06}", graphics_resources.render_frame_count)); ui.label(egui::RichText::new("Render frames: ").weak()); }); ui.horizontal(|ui| { ui.label(format!("{:06}", models.app_model.ui_frame_count)); ui.label(egui::RichText::new("UI frames: ").weak()); }); }); }); }); }); } } fn toggle_button(ui: &mut egui::Ui, selected: &mut bool, text: impl Into) -> Response { button_group_style(ui.style()).show(ui, |ui| { ui.toggle_value(selected.borrow_mut(), text) // .clicked().then(||{ graphics_resources.need_update = true; ui.ctx().request_repaint(); }); }).inner } fn need_update(ui: &mut egui::Ui, graphics_resources: &mut GraphicsResources) { graphics_resources.need_update = true; ui.ctx().request_repaint() } fn tool_item_box( ui: &mut egui::Ui, add_contents: impl FnOnce(&mut Ui) -> R, ) -> InnerResponse { ui.allocate_ui(Vec2::splat(40.0), |ui| { button_group_style(ui.style()).show(ui, |ui| { ui.centered_and_justified(|ui| { add_contents(ui) }).inner }).inner }) } ================================================ FILE: src/components/import_modal_view/config_page.rs ================================================ use egui::Ui; use crate::models::Models; use super::ImportModal; pub fn show(parent: &mut ImportModal, models: &mut Models, ui: &mut Ui) { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0); ui.heading("Configuration"); ui.separator(); egui::Grid::new("my_grid") .num_columns(2) .spacing([20.0, 8.0]) .show(ui, |ui| { ui.add(egui::Label::new("Edge Source*")); ui.horizontal(|ui| { egui::ComboBox::from_id_source("Edge Source") .selected_text(&models.data_model.edge_data.headers_index_str[parent.edge_source]) .show_ui(ui, |ui| { for (i, s) in models.data_model.edge_data.headers_index_str.iter().enumerate() { ui.selectable_value(&mut parent.edge_source, i, s); } }); }); ui.end_row(); ui.add(egui::Label::new("Edge Target*")); ui.horizontal(|ui| { egui::ComboBox::from_id_source("Edge Target") .selected_text(&models.data_model.edge_data.headers_index_str[parent.edge_target]) .show_ui(ui, |ui| { for (i, s) in models.data_model.edge_data.headers_index_str.iter().enumerate() { ui.selectable_value(&mut parent.edge_target, i, s); } }); }); ui.end_row(); }); } ================================================ FILE: src/components/import_modal_view/file_picker_page.rs ================================================ use egui::Ui; use crate::models::{Models}; use crate::utils::file::{path_to_string, pick_csv}; use crate::widgets::frames::DEFAULT_BUTTON_PADDING; use super::ImportModal; pub fn show(parent: &mut ImportModal, _: &mut Models, ui: &mut Ui) { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0); ui.heading("Import Data"); ui.horizontal(|ui| { ui.selectable_value(&mut 0, 0, "CSV"); ui.selectable_value(&mut 0, 1, "GraphML"); ui.selectable_value(&mut 0, 2, "DOT"); }); ui.separator(); egui::Grid::new("my_grid") .num_columns(2) .spacing([20.0, 8.0]) .show(ui, |ui| { ui.add(egui::Label::new("Node File")); ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; if ui.button("•••").clicked() { parent.node_file_path = path_to_string(&pick_csv()).unwrap_or(parent.node_file_path.clone()); } ui.vertical_centered_justified(|ui| { ui.add( egui::TextEdit::singleline(&mut parent.node_file_path) .hint_text("") .desired_width(200.) ); }); }); }); ui.end_row(); ui.add(egui::Label::new("Edge File*")); ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; if ui.button("•••").clicked() { parent.edge_file_path = path_to_string(&pick_csv()).unwrap_or(parent.edge_file_path.clone()); } ui.vertical_centered_justified(|ui| { ui.add(egui::TextEdit::singleline(&mut parent.edge_file_path) .hint_text("") .desired_width(200.), ); }); }); }); ui.end_row(); }); } ================================================ FILE: src/components/import_modal_view.rs ================================================ mod config_page; mod file_picker_page; use std::path::PathBuf; use std::sync::mpsc::{self, Receiver}; use egui::{Context, Widget}; use tokio::task::JoinHandle; use crate::constant::ACCENT_COLOR; use crate::models::app_model::ImportState; use crate::models::data_model::ExternalData; use crate::models::{Models, ImportedData}; use crate::utils::csv_loader::{read_headers_from_csv, load_data}; use crate::widgets::frames::inner_panel_frame; use crate::widgets::modal::Modal; #[derive(Default, PartialEq)] enum Page { #[default] FilePicker, Config, } #[derive(Default)] pub struct ImportModal { page_index: Page, node_file_path: String, edge_file_path: String, edge_source: usize, edge_target: usize, import_promise: Option>>, import_join_handle: Option>, } impl ImportModal { pub fn show(&mut self, ctx: &Context, models: &mut Models) { Modal::new(String::from("import_modal_view")).show(ctx, |ui| { ui.set_width(400.0); ui.set_height(250.0); egui::CentralPanel::default() .frame(inner_panel_frame(ui.style())) .show_inside(ui, |ui| match self.page_index { Page::FilePicker => file_picker_page::show(self, models, ui), Page::Config => config_page::show(self, models, ui), }); egui::TopBottomPanel::bottom("v") .frame(inner_panel_frame(ui.style())) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(8.0, 8.0); ui.horizontal(|ui| { if let ImportState::Error(message) = &models.app_model.import_state { ui.label(message); } ui.allocate_ui_with_layout( ui.available_size(), egui::Layout::right_to_left(egui::Align::Center), |ui| match self.page_index { Page::FilePicker => { ui.add_enabled_ui(!self.edge_file_path.is_empty(), |ui| { if egui::Button::new(" Next ").fill(ACCENT_COLOR).ui(ui).clicked() { self.on_click_next(models); } }); if ui.button(" Cancel ").clicked() { models.app_model.is_import_visible = false; } } Page::Config => { if egui::Button::new(" Done ").fill(ACCENT_COLOR).ui(ui).clicked() { self.on_click_done(); } let reimport_data_button = ui.button(" Back "); if reimport_data_button.clicked() { self.reset_import_promise(); self.page_index = Page::FilePicker; } if self.check_import_done(models) { ui.spinner(); } } }, ); }); }); }); } fn on_click_next(&mut self, models: &mut Models) { match self.load_edge_headers(models) { Ok(_) => { let edge_data_headers = &models.data_model.edge_data.headers_index_str; self.edge_source = edge_data_headers.iter().position(|s| s == "source").unwrap_or(0); self.edge_target = edge_data_headers.iter().position(|s| s == "target").unwrap_or(1); self.page_index = Page::Config; models.app_model.import_state = ImportState::Initial; } Err(s) => { models.app_model.import_state = ImportState::Error(s); } } } #[allow(unused_must_use)] fn on_click_done(&mut self) { let node_file_path = self.node_file_path.clone(); let edge_file_path = self.edge_file_path.clone(); let edge_source = self.edge_source; let edge_target = self.edge_target; let (sender, recv) = mpsc::channel(); let join_handle = tokio::task::spawn(async move { sender.send(load_data(&node_file_path, &edge_file_path, edge_source, edge_target)); }); self.import_promise = Some(recv); self.import_join_handle = Some(join_handle); } fn check_import_done(&mut self, models: &mut Models) -> bool { if let Some(promise) = self.import_promise.take() { match promise.try_recv() { Ok(result) => { match result { Ok(data) => { models.setup_data(data); self.reset_import_promise(); self.page_index = Page::FilePicker; }, Err(s) => { models.data_model.node_data = ExternalData::default(); models.data_model.edge_data = ExternalData { headers_str_index: models.data_model.edge_data.headers_str_index.clone(), headers_index_str: models.data_model.edge_data.headers_index_str.clone(), data: Vec::default(), }; models.app_model.import_state = ImportState::Error(s); } } }, Err(_) => { self.import_promise = Some(promise); return true; } } } false } fn load_edge_headers(&mut self, models: &mut Models) -> Result<(), String> { let (headers_str_index, headers_index_str) = read_headers_from_csv(&Some(PathBuf::from(self.edge_file_path.clone())))?; models.data_model.edge_data.headers_str_index = headers_str_index; models.data_model.edge_data.headers_index_str = headers_index_str; // validate edge data if models.data_model.edge_data.headers_str_index.len() < 2 { Err("The edge file must contain source and target node IDs".to_owned()) } else { Ok(()) } } fn reset_import_promise(&mut self) { if let Some(join_handle) = &self.import_join_handle { join_handle.abort(); } self.import_promise = None; self.import_join_handle = None; } } ================================================ FILE: src/components/inspector_view.rs ================================================ use std::hash::Hash; use egui::{CollapsingHeader, CollapsingResponse, Color32, Ui}; use crate::models::Models; use crate::models::app_model::{ImportState, InspectorTab}; use crate::models::graphics_model::ComputeMethod; use crate::models::graphics_model::ComputeMethodType; use crate::models::data_model::{ColorType, ColorRamp, ColorPalette, SizeType}; use crate::utils::file::{path_to_string, pick_folder, system_open_directory}; use crate::widgets::frames::{button_group_style, DEFAULT_BUTTON_PADDING, inspector_frame, inspector_inner_frame}; use super::AppView; #[derive(Default)] pub struct InspectorView; impl AppView for InspectorView { fn show(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { egui::SidePanel::right("inspector_view") .frame(inspector_frame(ui.style())) .default_width(320.0) .width_range(150.0..=400.0) .resizable(false) .show_inside(ui, |ui| { // Render Section egui::TopBottomPanel::bottom("render") .frame(inspector_inner_frame(ui.style())) .show_separator_line(false) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; if models.app_model.import_state != ImportState::Success { ui.set_enabled(false); } ui.with_layout( egui::Layout::right_to_left(egui::Align::Center), |ui| { let folder_open = ui.button("🗁"); if folder_open.clicked() { Models::pick_output_folder_and_then(&mut models.app_model.output_folder, |folder| { system_open_directory(folder); }); } ui.vertical_centered_justified(|ui| { let render_button = ui.button("Render Image"); if render_button.clicked() { models.render_output(); } }); }, ); }); // Main Section egui::CentralPanel::default() .frame(inspector_inner_frame(ui.style())) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); // Import Section / File Section if matches!(models.app_model.import_state, ImportState::Success) { ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; let remove_data_button = ui.button("🗑"); if remove_data_button.clicked() { models.clear_data() } ui.with_layout( egui::Layout::top_down(egui::Align::LEFT).with_cross_align(egui::Align::Min), |ui| { let node_file_name = models.app_model.node_file_name().unwrap_or(""); let edge_file_name = models.app_model.edge_file_name().unwrap_or(""); ui.label(egui::RichText::new(format!("Node File: {}\nEdge File: {}", node_file_name, edge_file_name)).strong()); }, ); }); }); } else { ui.vertical_centered_justified(|ui| { let import_data_button = ui.button("Import Data"); if import_data_button.clicked() { models.app_model.is_import_visible = true; } }); } ui.separator(); if models.app_model.import_state != ImportState::Success { ui.set_enabled(false); } // Node Edge Inspector Switch button_group_style(ui.style()).show(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0); ui.columns(5, |columns| { columns[0].vertical_centered_justified(|ui| { ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Graph, "Graph"); }); columns[1].vertical_centered_justified(|ui| { ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Node, "Node"); }); columns[2].vertical_centered_justified(|ui| { ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Edge, "Edge"); }); columns[3].vertical_centered_justified(|ui| { ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Camera, "Camera"); }); columns[4].vertical_centered_justified(|ui| { ui.selectable_value(&mut models.app_model.inspector_tab, InspectorTab::Options, "Options"); }); }); }); ui.add_space(6.0); // Node Edge Inspector egui::ScrollArea::vertical() // .always_show_scroll(true) .auto_shrink([false, false]) .id_source("source") .show(ui, |ui| { match models.app_model.inspector_tab { InspectorTab::Graph => self.graph_inspector(models, ui), InspectorTab::Node => self.node_inspector(models, ui), InspectorTab::Edge => self.edge_inspector(models, ui), InspectorTab::Camera => self.camera_inspector(models, ui), InspectorTab::Options => self.options_inspector(models, ui), }; }); ui.separator(); }); }); } } impl InspectorView { fn graph_inspector(&mut self, models: &mut Models, ui: &mut Ui) { let node_settings = &mut models.data_model.node_settings; inspector_section(ui, true, "Transform", |ui| { grid_label(ui, ""); ui.end_row(); }); inspector_section(ui, true, "Layout", |ui| { grid_label(ui, "Method"); egui::ComboBox::from_id_source("Position Compute") .selected_text(node_settings.position_compute.0) .show_ui(ui, |ui| { ui.selectable_value(&mut node_settings.position_compute, ComputeMethod::FORCE_ATLAS2, ComputeMethod::FORCE_ATLAS2.0); ui.separator(); ui.selectable_value(&mut node_settings.position_compute, ComputeMethod::RANDOMIZE, ComputeMethod::RANDOMIZE.0); }); ui.end_row(); grid_label(ui, ""); if node_settings.position_compute.1 == ComputeMethodType::Continuous { let continuous_button = ui.button(if !models.graphics_model.is_computing { "Start Computing" } else { "Pause Computing" }); if continuous_button.clicked() { models.graphics_model.switch_computing(); } } else { models.graphics_model.set_computing(false); let one_step_button = ui.button("⏩ Dispatch"); if one_step_button.clicked() { models.graphics_model.set_dispatching(true); } } ui.end_row(); }); } fn node_inspector(&mut self, models: &mut Models, ui: &mut Ui) { let node_settings = &mut models.data_model.node_settings; inspector_section(ui, true, "Color", |ui| { grid_label(ui, "Type"); egui::ComboBox::from_id_source("Color Type") .selected_text(&node_settings.color_type.to_string()) .show_ui(ui, |ui| { ui.selectable_value(&mut node_settings.color_type, ColorType::Constant, "Constant"); ui.selectable_value(&mut node_settings.color_type, ColorType::Ramp, "Ramp"); ui.selectable_value(&mut node_settings.color_type, ColorType::Partition, "Partition"); }); ui.end_row(); match node_settings.color_type { ColorType::Constant => { grid_label(ui, "Value"); ui.color_edit_button_srgba(&mut node_settings.color_constant); ui.end_row(); }, ColorType::Ramp => { let (source, ramp) = &mut node_settings.color_ramp; source_combox("Source", &models.data_model.node_data.headers_index_str, source, ui); grid_label(ui, "Picker"); egui::ComboBox::from_id_source("Color Ramp") .selected_text(&ramp.to_string()) .show_ui(ui, |ui| { ui.selectable_value(ramp, ColorRamp::Ramp1, "Ramp1"); ui.selectable_value(ramp, ColorRamp::Ramp2, "Ramp2"); }); ui.end_row(); grid_label(ui, ""); let _ = ui.button("Set Color"); ui.end_row(); }, ColorType::Partition => { let (source, platte) = &mut node_settings.color_partition; source_combox("Color Partition Source", &models.data_model.node_data.headers_index_str, source, ui); grid_label(ui, "Platte"); egui::ComboBox::from_id_source("Color Partition") .selected_text(&platte.to_string()) .show_ui(ui, |ui| { ui.selectable_value(platte, ColorPalette::Palette1, "Palette1"); ui.selectable_value(platte, ColorPalette::Palette2, "Palette2"); }); ui.end_row(); grid_label(ui, ""); let _ = ui.button("Set Color"); ui.end_row(); }, } }); inspector_section(ui, true, "Size", |ui| { grid_label(ui, "Type"); egui::ComboBox::from_id_source("Size Type") .selected_text(&node_settings.size_type.to_string()) .show_ui(ui, |ui| { ui.selectable_value(&mut node_settings.size_type, SizeType::Constant, "Constant"); ui.selectable_value(&mut node_settings.size_type, SizeType::Ramp, "Ramp"); }); ui.end_row(); match node_settings.size_type { SizeType::Constant => { grid_label(ui, "Value"); ui.add(egui::Slider::new(&mut node_settings.size_constant, 0.1..=10.0)); ui.end_row(); }, SizeType::Ramp => { let (source, _) = &mut node_settings.size_ramp; source_combox("Source", &models.data_model.node_data.headers_index_str, source, ui); grid_label(ui, "Range"); ui.horizontal(|ui| { ui.add(egui::DragValue::new(&mut node_settings.size_ramp.1[0]).speed(0.1)); ui.label("—"); ui.add(egui::DragValue::new(&mut node_settings.size_ramp.1[1]).speed(0.1)); }); ui.end_row(); grid_label(ui, ""); let _ = ui.button("Set Size"); ui.end_row(); } } }); inspector_section(ui, false, "Position", |ui| { let (source, _) = &mut node_settings.size_ramp; source_combox("Source", &models.data_model.node_data.headers_index_str, source, ui); grid_label(ui, ""); let _ = ui.button("Set Position"); ui.end_row(); }); } fn edge_inspector(&mut self, _models: &mut Models, ui: &mut Ui) { inspector_section(ui, true, "Color", |ui| { grid_label(ui, "Value"); ui.color_edit_button_srgba(&mut Color32::from_rgb(255, 255, 255)); ui.end_row(); }); inspector_section(ui, true, "Width", |ui| { grid_label(ui, "Value"); ui.add(egui::Slider::new(&mut 1.0, 0.1..=10.0)); ui.end_row(); }); } fn camera_inspector(&mut self, _models: &mut Models, ui: &mut Ui) { let camera_settings = &mut _models.data_model.camera_settings; inspector_section(ui, true, "Transform", |ui| { grid_label(ui, "Look at"); ui.horizontal(|ui| { ui.add(egui::DragValue::new(&mut camera_settings.look_at.0).speed(0.1)); ui.add(egui::DragValue::new(&mut camera_settings.look_at.1).speed(0.1)); ui.add(egui::DragValue::new(&mut camera_settings.look_at.2).speed(0.1)); }); ui.end_row(); grid_label(ui, "Rotation"); ui.horizontal(|ui| { ui.add(egui::DragValue::new(&mut camera_settings.rotation.0).speed(0.1)); ui.add(egui::DragValue::new(&mut camera_settings.rotation.1).speed(0.1)); ui.add(egui::DragValue::new(&mut camera_settings.rotation.2).speed(0.1)); }); ui.end_row(); grid_label(ui, "Distance"); ui.horizontal(|ui| { ui.add(egui::DragValue::new(&mut camera_settings.distance).speed(0.1)); }); ui.end_row(); }); inspector_section(ui, true, "View", |ui| { ui.end_row(); }); inspector_section(ui, true, "Composite", |ui| { ui.end_row(); }); } fn options_inspector(&mut self, models: &mut Models, ui: &mut Ui) { inspector_section(ui, true, "Output", |ui| { grid_label(ui, "Folder"); ui.horizontal(|ui| { ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.spacing_mut().button_padding = DEFAULT_BUTTON_PADDING; if ui.button("•••").clicked() { models.app_model.output_folder = path_to_string(&pick_folder()).unwrap_or(models.app_model.output_folder.clone()); } ui.vertical_centered_justified(|ui| { ui.add( egui::TextEdit::singleline(&mut models.app_model.output_folder) // .hint_text("未识别的路径") .desired_width(200.) ); }); }); }); ui.end_row(); }); } } fn source_combox(id_source: impl Hash, data_hearders: &Vec, current_value: &mut String, ui: &mut Ui) { grid_label(ui, "Source"); egui::ComboBox::from_id_source(id_source) .selected_text(current_value.to_string()) .show_ui(ui, |ui| { ui.selectable_value(current_value, String::from("None"), String::from("None")); for value in data_hearders { ui.selectable_value(current_value, value.clone(), value); } }); ui.end_row(); } fn inspector_grid(id: &str) -> egui::Grid { egui::Grid::new(id) .num_columns(2) .spacing([10.0, 4.0]) .min_col_width(65.) .min_row_height(10.) } fn grid_label(ui: &mut egui::Ui, title: &str) { let label = format!("{}", title); ui.horizontal(|ui| { ui.set_width(100.); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.add( egui::Label::new(egui::RichText::new(label)).wrap(true) ) }); }); } fn inspector_section(ui: &mut Ui, default_open: bool, title: &str, add_contents: impl FnOnce(&mut Ui) -> R ) -> CollapsingResponse { CollapsingHeader::new(title) .default_open(default_open) .show(ui, |ui| { // ui.add_space(6.0); let r = inspector_grid(title) .show(ui, |ui| { add_contents(ui) }).inner; // ui.add_space(6.0); r }) } ================================================ FILE: src/components/menubar_view.rs ================================================ use egui::Ui; use crate::widgets::frames::menu_panel_style; use crate::{ models::{ app_model::{ImportState, MainStage}, Models, }, widgets::frames::button_group_style, }; use super::AppView; pub struct MenuBarView; impl Default for MenuBarView { fn default() -> Self { Self {} } } impl AppView for MenuBarView { fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame) { egui::TopBottomPanel::top("menubar_view") .frame(menu_panel_style( ui.style(), frame.info().window_info.fullscreen, )) .show_separator_line(false) .show_inside(ui, |ui| { ui.set_style(ui.ctx().style()); egui::menu::bar(ui, |ui| { spacing_ui(ui); ui.menu_button("File", |ui| { spacing_ui_start(ui); ui.add_enabled_ui(false, |ui| { let _ = ui.button("New"); let _ = ui.button("Open"); }); ui.separator(); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Close"); let _ = ui.button("Save"); }); ui.separator(); match models.app_model.import_state { ImportState::Initial => { if ui.button("Import Data").clicked() { models.app_model.is_import_visible = true; ui.close_menu(); } } ImportState::Success => { if ui.button("Reimport Data").clicked() { models.clear_data(); models.app_model.is_import_visible = true; ui.close_menu(); } } _ => {} } ui.add_enabled_ui( models.app_model.import_state == ImportState::Success, |ui| { if ui.button("Export Data").clicked() { models.app_model.is_export_visible = true; ui.close_menu(); } }, ); ui.separator(); if ui.button("Quit").clicked() { frame.close(); } spacing_ui_end(ui); }); ui.menu_button("Edit", |ui| { spacing_ui_start(ui); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Undo"); let _ = ui.button("Redo"); }); ui.separator(); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Preference"); }); spacing_ui_end(ui); }); ui.menu_button("Render", |ui| { spacing_ui_start(ui); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Render Image"); }); ui.separator(); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Show Result"); }); spacing_ui_end(ui); }); ui.menu_button("Window", |ui| { spacing_ui_start(ui); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Fullscreen"); }); ui.separator(); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Save Screenshot"); }); spacing_ui_end(ui); }); ui.menu_button("Help", |ui| { spacing_ui_start(ui); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Official Website"); let _ = ui.button("Manual"); let _ = ui.button("Tutorial"); }); ui.separator(); ui.add_enabled_ui(false, |ui| { let _ = ui.button("Report a Bug"); }); spacing_ui_end(ui); }); ui.add_space(12.0); button_group_style(ui.style()).show(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0); ui.selectable_value( &mut models.app_model.main_stage, MainStage::Graphics, " Graphics ", ); ui.selectable_value( &mut models.app_model.main_stage, MainStage::Table, " Table ", ); }); }); }); } } fn spacing_ui(ui: &mut Ui) { ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0); ui.spacing_mut().button_padding = egui::vec2(8.0, 1.0); } fn spacing_ui_start(ui: &mut Ui) { ui.spacing_mut().item_spacing = egui::vec2(0.0, 2.0); ui.spacing_mut().button_padding = egui::vec2(6.0, 0.0); ui.add_space(2.0); // ui.add_space(4.0); } fn spacing_ui_end(_ui: &mut Ui) { // ui.add_space(2.0); } ================================================ FILE: src/components/mod.rs ================================================ use egui::Ui; use crate::models::Models; pub mod detail_view; pub mod dock_view; pub mod drawer_view; pub mod drawers; pub mod export_modal_view; pub mod graphics_view; pub mod import_modal_view; pub mod inspector_view; pub mod menubar_view; pub mod shortcuts; pub mod table_view; pub trait AppView { fn show(&mut self, models: &mut Models, ui: &mut Ui, frame: &mut eframe::Frame); } ================================================ FILE: src/components/shortcuts.rs ================================================ use egui::{Modifiers, Ui}; use crate::models::graphics_model::ComputeMethodType; use crate::models::Models; #[derive(Default)] pub struct Shortcut; impl Shortcut { pub fn apply(&mut self, models: &mut Models, ui: &mut Ui, _frame: &mut eframe::Frame) { let organize_shortcut = egui::KeyboardShortcut::new(Modifiers::COMMAND, egui::Key::R); let organize_shortcut2 = egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::F2); let mut should_switch_compute = false; if ui.input_mut().consume_shortcut(&organize_shortcut) { should_switch_compute = true } if ui.input_mut().consume_shortcut(&organize_shortcut2) { should_switch_compute = true } if should_switch_compute { let node_settings = &mut models.data_model.node_settings; if node_settings.position_compute.1 == ComputeMethodType::Continuous { models.graphics_model.switch_computing(); } else { models.graphics_model.set_dispatching(true); } } let organize_shortcut = egui::KeyboardShortcut::new(Modifiers::COMMAND, egui::Key::S); if ui.input_mut().consume_shortcut(&organize_shortcut) { models.render_output(); } let organize_shortcut = egui::KeyboardShortcut::new(Modifiers::NONE, egui::Key::Escape); if ui.input_mut().consume_shortcut(&organize_shortcut) { models.app_model.is_fullscreen_graphics = false; if !models.app_model.is_fullscreen { _frame.set_fullscreen(false); } } } } ================================================ FILE: src/components/table_view.rs ================================================ use egui_extras::{TableBuilder, Column}; use crate::{ models::{app_model::TableTab, data_model::ExternalData, Models}, widgets::frames::button_group_style, }; use crate::models::app_model::ImportState; use crate::widgets::frames::central_panel_frame; use super::AppView; #[derive(Default)] pub struct TableView; impl AppView for TableView { fn show(&mut self, models: &mut Models, ui: &mut egui::Ui, _frame: &mut eframe::Frame) { let style = (*ui.style()).clone(); egui::CentralPanel::default() .frame(central_panel_frame(&style)) .show_inside(ui, |ui| { ui.spacing_mut().item_spacing = egui::vec2(4.0, 4.0); ui.horizontal_top(|ui| { button_group_style(ui.style()).show(ui, |ui| { ui.set_style(ui.ctx().style()); ui.spacing_mut().item_spacing = egui::vec2(0.0, 0.0); ui.selectable_value(&mut models.app_model.table_tab, TableTab::Node, " Node Data "); ui.selectable_value(&mut models.app_model.table_tab, TableTab::Edge, " Edge Data "); }); }); ui.separator(); let ExternalData { headers_index_str: data_headers, data, .. } = match models.app_model.table_tab { TableTab::Node => &models.data_model.node_data, TableTab::Edge => &models.data_model.edge_data, }; if models.app_model.import_state != ImportState::Success { ui.centered_and_justified(|ui| { let empty_hint_text = match models.app_model.table_tab { TableTab::Node => "Import node data to display.", TableTab::Edge => "Import edge data to display.", }; ui.label(egui::RichText::new(empty_hint_text).weak()); }); return; } let text_height = egui::TextStyle::Body.resolve(ui.style()).size + 2.0; egui::ScrollArea::horizontal() // .always_show_scroll(true) .auto_shrink([false, false]) .id_source("table_scroll") .show(ui, |ui| { TableBuilder::new(ui) .striped(true) .max_scroll_height(1600.0) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) .columns(Column::initial(100.0).at_least(60.0), if data_headers.len() > 0 { data_headers.len() } else { 0 }) .columns(Column::remainder().at_least(60.0), 1) .resizable(true) .header(20.0, |mut header| { header.col(|ui| { ui.label(egui::RichText::new("Index").weak()); }); for col in data_headers.iter() { header.col(|ui| { ui.label(egui::RichText::new(col).strong()); }); } }) .body(|body| { body.rows(text_height, models.data_model.status.node_count, |row_index, mut row| { row.col(|ui| { ui.label(egui::RichText::new(row_index.to_string()).weak()); }); if row_index >= data.len() { for _data_col in data_headers { row.col(|ui| { ui.label(egui::RichText::new("N/A").weak()); }); } } else { let data_row = &data[row_index]; for data_col in data_row { row.col(|ui| { ui.label(data_col); }); } } }) }); }); }); } } ================================================ FILE: src/lib.rs ================================================ #[macro_use] extern crate lazy_static; mod app; pub mod widgets; pub mod components; pub mod models; pub mod utils; pub mod bootstrap; pub use app::MainApp; pub const APP_VERSION: &str = env!("CARGO_PKG_VERSION"); pub use { utils::constant }; ================================================ FILE: src/main.rs ================================================ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] use graphpu::bootstrap::{start_frame, ConfigBuilder}; #[tokio::main] async fn main() { start_frame(ConfigBuilder::default().build()); } ================================================ FILE: src/models/app_model.rs ================================================ use crate::utils::file::desktop_dir_or_empty; use egui::style::{Selection, Spacing, WidgetVisuals, Widgets}; use egui::{Color32, Rounding, Stroke, Style, Vec2, Visuals}; use std::path::PathBuf; use std::sync::Arc; #[derive(Debug, Default, PartialEq)] pub enum ImportState { #[default] Initial, Error(String), Success, } #[derive(Default, PartialEq)] pub enum MainStage { #[default] Graphics, Table, } #[derive(Default, PartialEq)] pub enum DockStage { #[default] None, Messages, Timeline, Kernel, } #[derive(Default, PartialEq)] pub enum TableTab { #[default] Node, Edge, } #[derive(Default, PartialEq)] pub enum InspectorTab { #[default] Graph, Node, Edge, Camera, Options, } #[derive(Default, PartialEq)] pub enum Tool { Select, Handle, #[default] View, } pub struct AppModel { pub is_import_visible: bool, pub is_export_visible: bool, pub is_timeline_expand: bool, pub is_fullscreen: bool, pub is_fullscreen_graphics: bool, pub import_state: ImportState, pub node_file_path: Option, pub edge_file_path: Option, pub output_folder: String, pub main_stage: MainStage, pub dock_stage: DockStage, pub table_tab: TableTab, pub inspector_tab: InspectorTab, pub pixels_per_point: f32, pub current_tool: Tool, pub ui_frame_count: u32, pub dock_style: Arc