17e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
37e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri *
47e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Licensed under the Apache License, Version 2.0 (the "License");
57e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * you may not use this file except in compliance with the License.
67e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * You may obtain a copy of the License at
77e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri *
87e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri *      http://www.apache.org/licenses/LICENSE-2.0
97e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri *
107e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Unless required by applicable law or agreed to in writing, software
117e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * distributed under the License is distributed on an "AS IS" BASIS,
127e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * See the License for the specific language governing permissions and
147e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * limitations under the License.
157e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app;
177e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
18fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertEquals;
19fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertTrue;
20fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.fail;
217e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.ArgumentMatchers.eq;
227e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.ArgumentMatchers.same;
237e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.mock;
247e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.verify;
257e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.verifyNoMoreInteractions;
267e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
277e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.app.Activity;
287e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.app.PendingIntent;
297e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.content.Intent;
307e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.content.IntentSender;
317e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.support.test.InstrumentationRegistry;
32754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
33c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikasimport android.support.test.rule.ActivityTestRule;
347e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.support.test.runner.AndroidJUnit4;
35320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikas
36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.core.app.ActivityCompat;
37ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.fragment.app.test.FragmentResultActivity;
38ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.fragment.app.test.FragmentTestActivity;
39320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.fragment.test.R;
407e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
417e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.Before;
42c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikasimport org.junit.Rule;
437e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.Test;
447e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.runner.RunWith;
457e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
464285a0db794444695fd0752e7bbc2ad95082043cGeorge Mountimport java.util.concurrent.CountDownLatch;
474285a0db794444695fd0752e7bbc2ad95082043cGeorge Mountimport java.util.concurrent.TimeUnit;
484285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount
497e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri/**
507e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Tests for Fragment startActivityForResult and startIntentSenderForResult.
517e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri */
527e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri@RunWith(AndroidJUnit4.class)
53c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikaspublic class FragmentReceiveResultTest {
54c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    @Rule
55c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public ActivityTestRule<FragmentTestActivity> mActivityRule =
56c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas            new ActivityTestRule<FragmentTestActivity>(FragmentTestActivity.class);
57c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas
587e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    private FragmentTestActivity mActivity;
597e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    private TestFragment mFragment;
607e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
617e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
627e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @Before
63c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void setup() throws Throwable {
64c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivity = mActivityRule.getActivity();
657e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        mFragment = attachTestFragment();
667e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
677e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
687e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @Test
697e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @SmallTest
70c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testStartActivityForResultOk() throws Throwable {
717e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        startActivityForResult(10, Activity.RESULT_OK, "content 10");
727e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
737e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertTrue("Fragment should receive result", mFragment.mHasResult);
747e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(10, mFragment.mRequestCode);
757e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
767e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals("content 10", mFragment.mResultContent);
777e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
787e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
797e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @Test
807e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @SmallTest
81c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testStartActivityForResultCanceled() throws Throwable {
827e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        startActivityForResult(20, Activity.RESULT_CANCELED, "content 20");
837e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
847e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertTrue("Fragment should receive result", mFragment.mHasResult);
857e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(20, mFragment.mRequestCode);
867e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
877e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals("content 20", mFragment.mResultContent);
887e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
897e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
907e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @Test
917e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @SmallTest
92c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testStartIntentSenderForResultOk() throws Throwable {
937e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        startIntentSenderForResult(30, Activity.RESULT_OK, "content 30");
947e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
957e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertTrue("Fragment should receive result", mFragment.mHasResult);
967e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(30, mFragment.mRequestCode);
977e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
987e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals("content 30", mFragment.mResultContent);
997e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
1007e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1017e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @Test
1027e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    @SmallTest
103c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testStartIntentSenderForResultCanceled() throws Throwable {
1047e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        startIntentSenderForResult(40, Activity.RESULT_CANCELED, "content 40");
1057e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1067e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertTrue("Fragment should receive result", mFragment.mHasResult);
1077e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(40, mFragment.mRequestCode);
1087e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
1097e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        assertEquals("content 40", mFragment.mResultContent);
1107e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
1117e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1127e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li    @Test
1137e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li    @SmallTest
1147e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li    public void testActivityResult_withDelegate() {
1157e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        ActivityCompat.PermissionCompatDelegate
1167e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li                delegate = mock(ActivityCompat.PermissionCompatDelegate.class);
1177e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
1187e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        Intent data = new Intent();
1197e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        ActivityCompat.setPermissionCompatDelegate(delegate);
1207e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
1217e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        mActivityRule.getActivity().onActivityResult(42, 43, data);
1227e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
1237e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        verify(delegate).onActivityResult(same(mActivityRule.getActivity()), eq(42), eq(43),
1247e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li                same(data));
1257e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
1267e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        ActivityCompat.setPermissionCompatDelegate(null);
1277e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        mActivityRule.getActivity().onActivityResult(42, 43, data);
1287e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li        verifyNoMoreInteractions(delegate);
1297e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li    }
1307e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li
131c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    private TestFragment attachTestFragment() throws Throwable {
1327e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        final TestFragment fragment = new TestFragment();
133c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
1347e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            @Override
1357e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            public void run() {
1367e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                mActivity.getSupportFragmentManager().beginTransaction()
1377e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                        .add(R.id.content, fragment)
1387e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                        .addToBackStack(null)
1397e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                        .commitAllowingStateLoss();
1407e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                mActivity.getFragmentManager().executePendingTransactions();
1417e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            }
1427e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        });
1437e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
1447e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        return fragment;
1457e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
1467e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1477e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    private void startActivityForResult(final int requestCode, final int resultCode,
148c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas            final String content) throws Throwable {
149c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
1507e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            @Override
1517e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            public void run() {
1527e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
1537e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
1547e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
1557e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1567e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                mFragment.startActivityForResult(intent, requestCode);
1577e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            }
1587e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        });
1594285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount        assertTrue(mFragment.mResultReceiveLatch.await(1, TimeUnit.SECONDS));
1607e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
1617e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
1627e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1637e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    private void startIntentSenderForResult(final int requestCode, final int resultCode,
164c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas            final String content) throws Throwable {
165c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
1667e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            @Override
1677e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            public void run() {
1687e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
1697e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
1707e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
1717e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1727e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                PendingIntent pendingIntent = PendingIntent.getActivity(mActivity,
1737e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                        requestCode, intent, 0);
1747e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1757e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                try {
1767e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                    mFragment.startIntentSenderForResult(pendingIntent.getIntentSender(),
1777e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                            requestCode, null, 0, 0, 0, null);
1787e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                } catch (IntentSender.SendIntentException e) {
1797e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                    fail("IntentSender failed");
1807e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri                }
1817e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            }
1827e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        });
1834285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount        assertTrue(mFragment.mResultReceiveLatch.await(1, TimeUnit.SECONDS));
1847e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
1857e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
1867e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
187af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    public static class TestFragment extends Fragment {
1887e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        boolean mHasResult = false;
1897e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        int mRequestCode = -1;
1907e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        int mResultCode = 100;
1917e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        String mResultContent;
1924285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount        final CountDownLatch mResultReceiveLatch = new CountDownLatch(1);
1937e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri
1947e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        @Override
1957e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        public void onActivityResult(int requestCode, int resultCode, Intent data) {
1967e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            mHasResult = true;
1977e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            mRequestCode = requestCode;
1987e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            mResultCode = resultCode;
1997e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri            mResultContent = data.getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT);
2004285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount            mResultReceiveLatch.countDown();
2017e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri        }
2027e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri    }
2037e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri}
204