<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61085>61085</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MLIR]Crashed on convert linalg to affine loops pass
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
sweead
</td>
</tr>
</table>
<pre>
test on llvm 15
Reproduce step:
```
mlir-opt test.mlir -pass-pipeline="func.func(tosa-to-arith)" -linalg-bufferize -pass-pipeline="func.func(tosa-to-linalg)" -convert-linalg-to-affine-loops
```
IR:
```
#map = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>
module {
func.func @main(%17:tensor<1x1xi8>, %18:tensor<1x1xi8>) {
%19 = "tosa.bitwise_and"(%17, %18) : (tensor<1x1xi8>, tensor<1x1xi8>) -> tensor<1x1xi8>
%20 = "tosa.reshape"(%19) {new_shape = [1, 1, 1, 1]} : (tensor<1x1xi8>) -> tensor<1x1x1x1xi8>
%c0_i8 = arith.constant 0 : i8
%21 = tensor.pad %20 low[0, 1, 1, 0] high[0, 2, 1, 0] {
^bb0(%arg0: index, %arg1: index, %arg2: index, %arg3: index):
tensor.yield %c0_i8 : i8
} : tensor<1x1x1x1xi8> to tensor<1x4x3x1xi8>
%c0_i32 = arith.constant 0 : i32
%22 = linalg.init_tensor [1, 4, 1, 1] : tensor<1x4x1x1xi32>
%23 = linalg.fill ins(%c0_i32 : i32) outs(%22 : tensor<1x4x1x1xi32>) -> tensor<1x4x1x1xi32>
%24 = linalg.init_tensor [1, 2] : tensor<1x2xi32>
%25 = linalg.pooling_nhwc_sum {dilations = dense<1> : vector<2xi64>, strides = dense<[1, 2]> : vector<2xi64>} ins(%21, %24 : tensor<1x4x3x1xi8>, tensor<1x2xi32>) outs(%23 : tensor<1x4x1x1xi32>) -> tensor<1x4x1x1xi32>
return
}
}
```
crash:
```
llvm/mlir/mytest/crash_case/202303# mlir-opt reduce_raw_man.mlir -pass-pipeline="func.func(tosa-to-arith)" -linalg-bufferize -pass-pipeline="func.func(tosa-to-linalg)" -convert-linalg-to-affine-loops
mlir-opt: llvm/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp:209: FailureOr<mlir::linalg::LinalgLoops> linalgOpToLoopsImpl(mlir::PatternRewriter &, mlir::linalg::LinalgOp) [LoopTy = mlir::AffineForOp]: Assertion `linalgOp.hasBufferSemantics() && "expected linalg op with buffer semantics"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: mlir-opt reduce_raw_man.mlir -pass-pipeline=func.func(tosa-to-arith) -linalg-bufferize -pass-pipeline=func.func(tosa-to-linalg) -convert-linalg-to-affine-loops
#0 0x000000000047f3aa llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) llvm/llvm/lib/Support/Unix/Signals.inc:569:11
#1 0x000000000047f55b PrintStackTraceSignalHandler(void*) llvm/llvm/lib/Support/Unix/Signals.inc:636:1
#2 0x000000000047dbd6 llvm::sys::RunSignalHandlers() llvm/llvm/lib/Support/Signals.cpp:103:5
#3 0x000000000047fc85 SignalHandler(int) llvm/llvm/lib/Support/Unix/Signals.inc:407:1
#4 0x00007f49881d2980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
#5 0x00007f49870c2e87 raise /build/glibc-CVJwZb/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
#6 0x00007f49870c47f1 abort /build/glibc-CVJwZb/glibc-2.27/stdlib/abort.c:81:0
#7 0x00007f49870b43fa __assert_fail_base /build/glibc-CVJwZb/glibc-2.27/assert/assert.c:89:0
#8 0x00007f49870b4472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
#9 0x0000000000fa3f24 mlir::FailureOr<llvm::SmallVector<mlir::Operation*, 4u>> linalgOpToLoopsImpl<mlir::AffineForOp>(mlir::PatternRewriter&, mlir::linalg::LinalgOp) llvm/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp:211:47
#10 0x0000000000fa9e60 (anonymous namespace)::LinalgRewritePattern<mlir::AffineForOp>::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&) const llvm/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp:256:16
#11 0x000000000379260f mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<mlir::LogicalResult (mlir::Pattern const&)>) llvm/mlir/lib/Rewrite/PatternApplicator.cpp:201:25
#12 0x0000000002ac5a92 (anonymous namespace)::GreedyPatternRewriteDriver::simplify(llvm::MutableArrayRef<mlir::Region>) llvm/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp:270:19
#13 0x0000000002ac50c8 mlir::applyPatternsAndFoldGreedily(llvm::MutableArrayRef<mlir::Region>, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig) llvm/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp:404:8
#14 0x00000000006eb442 mlir::applyPatternsAndFoldGreedily(mlir::Operation*, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig) llvm/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h:71:10
#15 0x0000000000fa9782 void (anonymous namespace)::lowerLinalgToLoopsImpl<mlir::AffineForOp>(mlir::func::FuncOp) llvm/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp:310:9
#16 0x0000000000fa9512 (anonymous namespace)::LowerToAffineLoops::runOnOperation() llvm/mlir/lib/Dialect/Linalg/Transforms/Loops.cpp:320:3
#17 0x00000000029e4e1a mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) llvm/mlir/lib/Pass/Pass.cpp:471:21
#18 0x00000000029e5414 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) llvm/mlir/lib/Pass/Pass.cpp:534:16
#19 0x00000000029ea828 mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12::operator()(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&) const llvm/mlir/lib/Pass/Pass.cpp:754:36
#20 0x00000000029ea499 mlir::LogicalResult mlir::failableParallelForEach<__gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&>(mlir::MLIRContext*, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, __gnu_cxx::__normal_iterator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>>, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&) llvm/mlir/include/mlir/IR/Threading.h:46:18
#21 0x00000000029e66f3 mlir::LogicalResult mlir::failableParallelForEach<std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>&, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&>(mlir::MLIRContext*, std::vector<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo, std::allocator<mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo>>&, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::$_12&) llvm/mlir/include/mlir/IR/Threading.h:92:10
#22 0x00000000029e5fad mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool) llvm/mlir/lib/Pass/Pass.cpp:764:14
#23 0x00000000029e50c7 mlir::detail::OpToOpPassAdaptor::runOnOperation(bool) llvm/mlir/lib/Pass/Pass.cpp:655:5
#24 0x00000000029e4e0b mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) llvm/mlir/lib/Pass/Pass.cpp:468:5
#25 0x00000000029e5414 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) llvm/mlir/lib/Pass/Pass.cpp:534:16
#26 0x00000000029e6cdc mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) llvm/mlir/lib/Pass/Pass.cpp:837:10
#27 0x00000000029e6bfc mlir::PassManager::run(mlir::Operation*) llvm/mlir/lib/Pass/Pass.cpp:817:60
#28 0x00000000029de23c performActions(llvm::raw_ostream&, bool, bool, llvm::SourceMgr&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>) llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:84:17
#29 0x00000000029ddf63 processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, bool, bool, bool, bool, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, llvm::ThreadPool*) llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:124:12
#30 0x00000000029ddd6f mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:164:12
#31 0x00000000029ddc8d mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#32 0x0000000002b0acc9 llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#33 0x0000000002b0a2a5 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) llvm/mlir/lib/Support/ToolUtilities.cpp:28:12
#34 0x00000000029dcff9 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool) llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:169:10
#35 0x00000000029dd13a mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::PassPipelineCLParser const&, mlir::DialectRegistry&, bool, bool, bool, bool, bool) llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:187:10
#36 0x00000000029ddaa6 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:269:14
#37 0x0000000000411f4e main llvm/mlir/tools/mlir-opt/mlir-opt.cpp:247:7
#38 0x00007f49870a5c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#39 0x0000000000411dda _start (llvm/mlir/build/bin/mlir-opt+0x411dda)
Aborted (core dumped)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW91T47qS_2vEi4qULfnzgYcAk93ZgoICzn3YF5dsy4n2KJJXkiHcv35LshN_JIEcYHbmnjsUlTiW1B-_7la3ZJlozZaC0gsQXoLw-ow0ZiXVhX6hlJRnuSxfLwzVBkoBOX9eQz8E3jXw5u3nA62VLJuCQm1oDXB3G0Re9-9-rjlT57I20FKa2V_wvCZan9esppwJCvA1QKhqRDGzHwAlRmpybuQ5UcysAEoBQvCcM0H48jxvqooq9k96MpV24JZMIcUzVWZLznKpKiboOZey1gc1-P5wTDeA8JrUEOBr2FLJ1qQG-AqgpPQAuoKl7z6R-8QApfAc4G_weDvA3zrYZNlwCkF82f6GcKcbBIG3JkwAlAAU-jHAc0OFlgrgK3_jb1hiqaAraFuTI63pkDR0XVOnCEDIIjfLmXlhmmZElAChHa8dWUsBz60qh5kfZurUP9A0FAR5I0EU1StS016ItJNe0JfMNbXdw0sH5vAjvAbx9VtiHhLosFCFl7GktbT1ylkhhTZEGOg5-iwZq-C7ri3dWU3KTi8uX0B46Y3l9EB4DVdsudo2oXFTbygQfstzr4WBqKXnOIuSbjqzELX0D9xDB-7hwb10599biV8Z5eVQ7YmGHaqHcYNGDluCDT6KKEZvQIrRGNO2bxu4MyaYyVouO9MHI9NPJQxaCTHa8zc8JFwxziETukV5J2QrD0qhbEzXhtCbLA4413ERgvd0Qwc0QgdJhUNStZSciWUmVi9Fppu1daaScWKYFNp1LKnQ1JJzExOew2daGMcAbVgUdNGsjWIlHY8YinZ8cHzdo4n8zgGdvvNjXjKePdAA0AH4-EvAV9Q0SmzDK77u5vXdxXi-LxTRq2PJwGZIgBY2w9mvV5vvAFq4MVlBNAVogTyEPQwQhru0qKhNoZkiL9maiDZB_vIZciu9NcFYb85ygBbXjHBaWPVvOtqLJ0WErqRaa3vXkpoVta0akGfnH7ggjDeK3lljOVp4DvC8E81dt6TcUGvatumufpLu1vd1zQFK-qH3xBiqxAN9UcxQBQGKrGe9RfuudqklvLQUn16dt_f95w6GhVR3tfP4OZxrTZUNJQgibyvPbEX0pbPBI10TYVjRumzaShDZxEY3NS0MLTsloKzhCzMr2NoO6n4gAiiGFWGclrMW-_ubb_PHb1A3-ZoZSGDeLKGitVTGTrwrYyw8c4AWAC2WzKyafFZIa6HOUPbrvFbyf1oDMa0bam0CiSghEwVvSgrNikLnuTAnxZ9GkYJ27B8NKf6EZbPuKz5vBt3fvZJLRdaQqGWzpsJYOd529D0PfcvJT_HwN937NN-GAGEPehtv9xfEFSakdXTnCfpVdz6mmDAOkScLEUBJ38kqKrVRlKw712PCWCkGdtgFzGNTWwsCtPhDsI29wZaCcD1jogB4HkY2Rny_l9CfShiGOZyI09L4TyJKThVAybNkJUDzD8oQ4cjK0IuAJiKUeRkdAumhESNJtuHwtgxb5u0k4Xu2YAl75niqf5GEcKrwxwEPvHisbNDxi6sgTRK_RGniwSxTVBupaKYMdFp11DdJlEWBdbNmc74UTdtQm5WipJxpOfMAuvQ2vqVi590dm3DIJvYKRJMYKsI0hQAt8obx0oY1Z3lxfvWP_3r573z3E81QDNBCOz0AWsxm9terLmltw7tp1dSv-tlJIxr705GeORezlaPXSxJNJAniyockl07T0yQxZYuGG-WYJBMm8ZhJHuCKwCwjbl7N7LSX5eR03dtxu4uWZTpmmUxZBjE6wXaFtVrkrIa9IEYjq6UjZ6wIrlAwSBzD1NbHx-OacP6Pbb3U976rqXL1mQvVKxg0tmA5kvCGA4f5yZZAx3Phyanw07ndtwYP4t1y2fcmUKU08iz8REjxupaNhoKsqa7dbJoOJeqE71R5S3N3b01MsZqLshs2gmMK8dtApdCtTD4PRugm0KgHYzSJ4zhFkVftCzOva84K4vzkazW7GkzXNmnagZmiFcBXuZQcHvKhFowWmK5YP0rEJpxPE-kH38glKwh_oLrh5jS6h114h9xiD-JdUeo7i_W2GmU7RIqQpOg9x_0PRWn5Okb-WrFn2kmt2brmrHod1Q23jSE5p3OlyOvDBIEHurS2Pa7ZyPn-MIzb7-NibLWNPeuZaa8tnmrrFcnAmUhd8y1BPRflQvLScWH8Q8oMHXWh5D-pGEf7IzUD0w57t7p1va-kqNjya7EJvMBmkR6aYDSDRTQPAnQ6NKeE6g9AoKvr-xsjMN4AwS53Y99VYD0E4XQSjxMEt8H-VkBw-UJVO1N-IIu5ur5FqBHF12Qo7FvXH3h-NNUt9N-N8xur1pNsRe8WqG4J0Ig7MbBz8iUSIysx7iWOR7Ga0oD6ZOAfJTWE8a3PPcm7-p5oPS9JvcsoqhGT2VTrPa887q9zQfirZvqWCLK0qeUK2vRhvxvhnjCUk7XPSPmWm_vaxpzzOOT3OiYTHcPAD_6yjvfbdeI4DG3XnejRlys9TsJafxfaKLc-lupAlh52aDm3DZ3s90RRYb6LSm6ng_npuIY4mFQg6QRXkqDkL-M68PG5fhVFtxXTwtGFCEBB5qP2WrreVvvEbTolP4LhXX1_a2F6t4TbhykOLUy4hwl5U5iCNIXHCpPBhEUYt-nvnijCOeULqb6RYgXwVZYtRZMVm03bMcuEVGvCM1uakemK4EeAMm93dcv2_vP-MuRHMB1wJJzL4v9DU7d22isyvtyxUTTNVrc33x-upDB0Yzq4fxv9Zxj9N-p_v1B7v779_mBrKLffxsTSlbGBW373lTzyJ7N6FFX4U7P6v4-Rp3XST5lPf8P902MqReOlIULTQr0i5RcLfmoVF7liN-hlw1PZvCL-jGx_WaQoDPunGFaiYG_p5uX_4ku3KBmrGP5euf2IlRuKpsmrKIuJOFsFdygSrak-cRNqD6VTRU1wPJkTphsUUV69J-obQp4shzsZNziqhyabCCVFuIA1VZVU67nbctbvPMHd-sn2e_A0RzaqoLfLfUfcz1uf3eoeO_1bG91PUrpdzt15DbS45Uzd1eaWMLEFyrlW_4wGTTYFyrKKMKyVLKjuTja8A9MuTTaC_W9Ds9qMH33d0rVUr1tSg_4lrUjDTVZSTg09PmZXZk4NctxAXwf10Ljdxt0DXTJt1OveU5U2W947aY767klW8pEzE9qZCXtTM5XR8OnRgMQvY66fY473nGSvIPLay719qp8B1NRcb21lneZI0dSR_KkjFUl5dB30ERP-ErjtngwXhPOcFH9m1fgp8u-A-UzA2MUal2L5s_DZj5PxsZ9-NdPdmF8_AbR4fLpZdMgS_m1jFNHtZkE4CZLxwib3SFGkf4Ng-FeY4z5mQbcQGVoQTy2ISDgIBV1zZuaivJ8UOr92sP8S5nq3x97UcTB99WfybCL7wzDODKO74zNTe04Wz2VRVenv-ufj0_lnSop0vOTD4bSk8DH5xW0zxnm7ar-6uSdKU3Xk8MXPAjyZrLFxNAWckOgo4N3uRrEi7T7GZFX6aBQTywdana7rJ3RBrfP0-3Q4Hp_t9f0qoHBNmJgwMfvkt5db2oHFqV_aTk9_krBIYphlnOVFpg1RJnN8TjxvWuhme9C2vXSNjo47e4qDoD98atmnU83KksCWMdwGwk69rQS5tdlAyUtv047cnUGd51IZ6k7fFFJRdzqflrvm3YsqZ-UFLlOckjN64UdxHMWBF3pnqwuPpkFEaFikZRWFRYBIEsS4KgOcxqEXVmfson11xfN9hAPfm_k4iHDkUVKVKERhDgKPrgnjM6vDTKrlmXux4CLyvSQ84ySnXLvXTBES9AW6RoAQCK_P1IV7JSFvlhoEHmfa6J6KYYa791Nvb74_gPD6ShG9oiWU7qzfM1Vm-w6Fkd1LmNAd5oc10fqsUfzi469EOOH_LwAA__-uaDUu">